Beitrag von Dr. Frauenarzt ()
Dieser Beitrag wurde vom Autor aus folgendem Grund gelöscht: Erledigt ().
Kaliber: Das werde ich mal probieren und mich nachher zurueckmelden.
Ich will ja meinen Gamemode dahingehend dynamisch gestalten, so dass man alles von einer extra Datei aus steuern kann die einfach eingebunden wird, so dass man viele Sachen machen kann und das nicht so starr ist.
Nun habe ich eine Teamanzahl definiert, faelschlicherweise habe ich das jetzt hier TEAMSIZE genannt, mache ich nachher zu AMOUNT_OF_TEAMS der sowas.
Naja aufjedenfall will ich dass alles in Abhaengigkeit von TEAMSIZE angepasst wird.
TEAMSIZE soll einen gueltigen Wert haben von 2-6 mit #assert TEAMSIZE >= 2 && <= 6
Habe daher nun vor das ganze umzuschreiben.
Als Beispiel nehme ich folgende Funktion welche ich bisher 1:1 aus Grand Larceny uebernommen habe, welche von 3 Teams ausgeht
ClassSel_SetupCharSelection(playerid)
{
TextDrawHideForPlayer(playerid,Textcover);
if(gPlayerTeamSelection[playerid] == FIRST_TEAM) {
SetPlayerVirtualWorld(playerid,1);
SetPlayerPos(playerid,243.1261,1805.2798,8.3794);
SetPlayerFacingAngle(playerid,180.0);
SetPlayerCameraPos(playerid,243.2876,1802.5547,7.4141);
SetPlayerCameraLookAt(playerid,243.1261,1805.2798,8.3794);
SetPlayerColor(playerid,COLOR_TEAM_ONE);
}
else if(gPlayerTeamSelection[playerid] == SECOND_TEAM) {
SetPlayerVirtualWorld(playerid,1);
SetPlayerPos(playerid,243.1261,1805.2798,8.3794);
SetPlayerFacingAngle(playerid,180.0);
SetPlayerCameraPos(playerid,243.2876,1802.5547,7.4141);
SetPlayerCameraLookAt(playerid,243.1261,1805.2798,8.3794);
SetPlayerColor(playerid,COLOR_TEAM_TWO);
}
else if(gPlayerTeamSelection[playerid] == THIRD_TEAM) {
SetPlayerVirtualWorld(playerid,1);
SetPlayerPos(playerid,243.1261,1805.2798,8.3794);
SetPlayerFacingAngle(playerid,180.0);
SetPlayerCameraPos(playerid,243.2876,1802.5547,7.4141);
SetPlayerCameraLookAt(playerid,243.1261,1805.2798,8.3794);
SetPlayerColor(playerid,COLOR_TEAM_THREE);
}
}
Alles anzeigen
Habe ich, damit ich diese Wiederholungen von gleichem Code vermeide so geschrieben
ClassSel_SetupCharSelection(playerid)
{
TextDrawHideForPlayer(playerid,Textcover);
if(gPlayerTeamSelection[playerid] != 0)
{
SetPlayerVirtualWorld(playerid,1);
SetPlayerPos(playerid,243.1261,1805.2798,8.3794);
SetPlayerFacingAngle(playerid,180.0);
SetPlayerCameraPos(playerid,243.2876,1802.5547,7.4141);
SetPlayerCameraLookAt(playerid,243.1261,1805.2798,8.3794);
switch
if(gPlayerTeamSelection[playerid]== TEAM_ONE)
switch(TEAMSIZE)
{
case: >=2
{
switch(gPlayerTeamSelection[playerid])
{
case 1:
{
SetPlayerColor(playerid,COLOR_TEAM_ONE);
}
case 2:
{
SetPlayerColor(playerid,COLOR_TEAM_TWO);
}
}
}
case: >=3
{
switch(gPlayerTeamSelection[playerid])
{
case 3:
{
SetPlayerColor(playerid,COLOR_TEAM_THREE);
}
}
}
case: >=4
{
switch(gPlayerTeamSelection[playerid])
{
case 3:
{
SetPlayerColor(playerid,COLOR_TEAM_FOUR);
}
}
}
case: >=5
{
switch(gPlayerTeamSelection[playerid])
{
case 3:
{
SetPlayerColor(playerid,COLOR_TEAM_FIVE);
}
}
}
case: >=6
{
switch(gPlayerTeamSelection[playerid])
{
case 3:
{
SetPlayerColor(playerid,COLOR_TEAM_SIX);
}
}
}
}
}
Alles anzeigen
Ist das sinvoll bzw. funktionsfaehig? Oder gibt es eine einfachere Variante? Sind switch case strukturen guter Programmierstil?
Und warum ist das hier falsch?
#if defined TEAMSIZE
#if TEAMSIZE>=2
SetTimer("MONEY_TEAM_ONE", MoneyDropTimer, true);
SetTimer("MONEY_TEAM_TWO", MoneyDropTimer, true);
SetTimer("MONEY_MAIN", 1000, true);
#if TEAMSIZE>=3
SetTimer("MONEY_TEAM_THREE", MoneyDropTimer, true);
#if TEAMSIZE>=4
SetTimer("MONEY_TEAM_FOUR",MoneyDropTimer,true)
#else if TEAMSIZE>=5
SetTimer("MONEY_TEAM_FIVE",MoneyDropTimer,true)
#else if TEAMSIZE==6
SetTimer("MONEY_TEAM_SIX",MoneyDropTimer,true)
#endif
#endif
Alles anzeigen
Guten Mittag,
ich habe eine Include Frage, ich habe mit Hilfe eines Tutorial eine Include erstellt und zum Testen lasse ich es Printen.
Problem ist nur, das der Print in der Include mir Angezeigt wird, der Print aus dem Script leider nicht.
// So sieht meine Include aus:
public OnPlayerConnect(playerid)
{
print("Include geht");
return 1;
}
#if defined _OnPlayerConnect
forward _OnPlayerConnect(playerid);
#endif
#if defined _ALS_OnPlayerConnect
#undef OnPlayerConnect
#else
#define _ALS_OnPlayerConnect
#endif
#define OnPlayerConnect _OnPlayerConnect
// So sieht es im Script aus:
public OnPlayerConnect(playerid)
{
print("Script geht auch");
return 1;
}
Mit freundlichen Grüßen,
Aaron!
Im Callback selbst fehlt ein Teil, kann dir gerade kein Code schreiben weil ich am Handy bin, kannst dir aber solange meine Include anschauen und vergleichen wie es gemacht werden kann
https://github.com/JustMe77/El…lob/master/etextdraws.inc
Schau dir am Ende den OnPlayerConnect Callback an und ganz unten die Hook davon.
Ich möchte in einem Textdraw den Stand des Bankkontos anzeigen lassen. Wie kann ich wenn jemand beispielsweise 1.000.000 $ hat punkte nach jeder dritten Zahl machen?
also zurzeit steht es so
1000000
ich möchte es so:
1.000.000
Ich sehe leider gar nicht durch... und verstehe ehrlich gesagt nicht, was was bedeutet...
Wie kann ich wenn jemand beispielsweise 1.000.000 $ hat punkte nach jeder dritten Zahl machen?
new str[16], money = GetPlayerMoney(playerid);
format(str, sizeof(str), "$%d", money);
if(money >= 0)
{
for(new i = strlen(str)-3; i > 1; i-=3) strins(str, ".", i);
}
else
{
for(new i = strlen(str)-3; i > 2; i-=3) strins(str, ".", i);
}
PlayerTextDrawSetString(playerid, pMoneyText[playerid], str);
if(IsVehicleAFlugzeug(vehicleid))
{
if(Spieler[playerid][pJob] != 4)
{
SendClientMessage(playerid, COLOR_GREY, "Du bist kein Pilot!");
FreezePlayer(playerid);
RemovePlayerFromVehicle(playerid);
UnfreezePlayer(playerid);
return 1;
}
if(model == 553) // Nevada
{
if(Spieler[playerid][pPilotSkillEXP] < 90)
{
GameTextForPlayer(playerid, "~r~AB SKILL LEVEL 90.", 5000, 0);
FreezePlayer(playerid);
RemovePlayerFromVehicle(playerid);
UnfreezePlayer(playerid);
return 1;
}
else if(model == 577) // AT-400
{
if(Spieler[playerid][pPilotSkillEXP] < 180)
{
GameTextForPlayer(playerid, "~r~AB SKILL LEVEL 180.", 5000, 0);
FreezePlayer(playerid);
RemovePlayerFromVehicle(playerid);
UnfreezePlayer(playerid);
return 1;
}
}
}
}
Alles anzeigen
Hallo,
Ich habe das Problem beim Pilot job wen ich jetzt in Nevada einsteige werde ich rausgeworfen weil ich kein skill 90 habe.
Aber bei der AT nicht damit kann ich fliegen
CodeAlles anzeigenif(IsVehicleAFlugzeug(vehicleid)) { if(Spieler[playerid][pJob] != 4) { SendClientMessage(playerid, COLOR_GREY, "Du bist kein Pilot!"); FreezePlayer(playerid); RemovePlayerFromVehicle(playerid); UnfreezePlayer(playerid); return 1; } if(model == 553) // Nevada { if(Spieler[playerid][pPilotSkillEXP] < 90) { GameTextForPlayer(playerid, "~r~AB SKILL LEVEL 90.", 5000, 0); FreezePlayer(playerid); RemovePlayerFromVehicle(playerid); UnfreezePlayer(playerid); return 1; } else if(model == 577) // AT-400 { if(Spieler[playerid][pPilotSkillEXP] < 180) { GameTextForPlayer(playerid, "~r~AB SKILL LEVEL 180.", 5000, 0); FreezePlayer(playerid); RemovePlayerFromVehicle(playerid); UnfreezePlayer(playerid); return 1; } } } }
Hallo,
Ich habe das Problem beim Pilot job wen ich jetzt in Nevada einsteige werde ich rausgeworfen weil ich kein skill 90 habe.
Aber bei der AT nicht damit kann ich fliegen
Das "else if(model == 577)" wird erst abgefragt wenn man in der "if(model == 553" Schleife ist. Du musst das dort rausnehmen
if(IsVehicleAFlugzeug(vehicleid))
{
if(Spieler[playerid][pJob] != 4)
{
SendClientMessage(playerid, COLOR_GREY, "Du bist kein Pilot!");
FreezePlayer(playerid);
RemovePlayerFromVehicle(playerid);
UnfreezePlayer(playerid);
return 1;
}
if(model == 553) // Nevada
{
if(Spieler[playerid][pPilotSkillEXP] < 90)
{
GameTextForPlayer(playerid, "~r~AB SKILL LEVEL 90.", 5000, 0);
FreezePlayer(playerid);
RemovePlayerFromVehicle(playerid);
UnfreezePlayer(playerid);
return 1;
}
else if(model == 577) // AT-400
{
if(Spieler[playerid][pPilotSkillEXP] < 180)
{
GameTextForPlayer(playerid, "~r~AB SKILL LEVEL 180.", 5000, 0);
FreezePlayer(playerid);
RemovePlayerFromVehicle(playerid);
UnfreezePlayer(playerid);
return 1;
}
}
}
}
Kurze frage
wieso spamt der server denn Command bis er sich aufhängt
//Respawnallcars
command(respawnallcars, playerid, params[])
{
#pragma unused params
new string[128];
if(SpielerInfo[playerid][pAdminlevel] < 3)
return SendClientMessage(playerid,COLOR_RED,"Du bist kein Administrator oder dein Administratorenlevel ist zu niedrig!");
if(GetPVarInt(playerid, "Adminduty") < 1)
return SendClientMessage(playerid, COLOR_RED, "Du musst erst als Admin im Einsatz sein, um diesen Befehl nutzen zu können.");
for(new car=0;car<MAX_VEHICLES;car++)
{
if(IsValidVehicle(car))
printf("test1");
{
if(Abgeschlepptt[car] == 0 && spawncar_job[car] != 555)
printf("test2");
{
if((spawncar_job[car] >= 1 && spawncar_job[car] <= 11) || (spawncar_job[car] >= 201 && spawncar_job[car] >= 215))
printf("test3");
{
if(GetVehicleDriver(car) < 0 || GetVehicleDriver(car) > MAX_PLAYERS)
printf("test4");
{
SetVehicleToRespawn(car);
printf("test5");
SetVehicleHealth(car, 1000.0);
printf("test6");
}
}
}
}
return 1;
}
format(string, sizeof(string), "* %s %s[%d] hat alle unbenutzen Fahrzeuge respawned.", GetPlayerAdminRank(playerid),GetName(playerid),playerid);
SendClientMessageToAllEx(COLOR_LIGHTRED, string);
return 1;
}
er printet ganz oft diese Prints bis er sich einfach aufhängt
Eigentlich sollte sich dein Befehl nach dem ersten Schleifendurchgang beenden , da du am ende der for-schleife ein return hast.
Moin
Habe eine Funktion CreateGlobalActor welche einen Actor und ein Pickup vor ihm erstellt.
Ich generiere in OnGameModeInit Actors, abhaengig davon wie gross das Eingangsarray ist.
CreateGlobalActor(actorid,modelid,Float:ax,Float:ay,Float:az,Float:angle,Float:distance,pickupid)
for(new g=0;g<sizeof(GlobalActors);g++)
{
CreateGlobalActor(g+1,274,GlobalActors[g][0],GlobalActors[g][1],GlobalActors[g][2],GlobalActors[g][3],3.0,g+4000);
SetActorInvulnerable(g+1, true);
}
Ich habe jedoch das Problem damit.
Ich erwarte wenn ich hinten mit g+4000 eine Pickupid fuer das zu erstellende Pickup waehle, diese Beispielsweise bei 4000, 4001 usw. liegt.
Jedoch ist das leider nicht der Fall, nach dem Erstellen hat das Ding eine Pickupid von 1..2..3
Wie kann ich innerhalb einer for Schleife einzigartige Pickupids erstellen mit denen ich auch nachher was in OnPlayerPickUpPickup anstellen kann?
Sowas habe ich versucht, hat jedoch nicht geklappt.
Das Problem ist, wenn ich eine Pickupid zwischen 1-5 z.B. habe, nehmen scheinbar neu generierte Pickups auch einer dieser IDs an, so dass irgendwann nurnoch der else Teil zutrifft
public OnPlayerPickUpPickup(playerid, pickupid)
{
if(pickupid >= 4000 && pickupid <= 4095)
{
ShowMenuForPlayer(shopmenu,playerid);
TogglePlayerControllable(playerid,false);
}
else
{
maxmoney = maxmoney -1;
DestroyPickup(pickupid);
GivePlayerMoney(playerid, 1000);
printf("ID picked up: %d",maxmoney);
}
return 1;
}
Alles anzeigen
Habe mir eventuell ueberlegt ob enum helfen kann, aber ich finde keinen Ansatz
Bitte um Rat
Ist es ausserdem Moeglich, irgendwie aus einem Array immer die letzte Zeile im Array auszulesen?
Das mit den Pickups musst du leider z.B. so machen:
//global
new money[95],money_zähler;
//Wenn sie erstellt werden
//Musst natürlich beachten dass es nicht mehr sind als 95
money[money_zähler++] = CreatePickup(...);
//OnPlayerPickUpPickup
for(new i; i<sizeof(money); i++)
{
if(money[i] == pickupid)
{
DestroyPickup(money[i]);
money[i] = -1;
return 1;
}
}
Alles anzeigen
Ist es ausserdem Moeglich, irgendwie aus einem Array immer die letzte Zeile im Array auszulesen?
Das ist gar nicht so leicht.
Es geht mit invaliden Werten und wenn du immer das Array sortierst bzw keine leeren Felder drinnen hast.
Oh habe mir schon gedacht dass meine Vorhaben nicht so einfach zu realisieren sind
Aber kann man beim Array nicht eigentlich immer als Index fuer die letzte Zeile sizeof(array)-1 als Index nehmen?
Aber kann man beim Array nicht eigentlich immer als Index fuer die letzte Zeile sizeof(array)-1 als Index nehmen?
Das kannst du machen.
Ich weiß um ehrlich zu sein nicht was die Schleife da oben genau soll
Das kannst du machen.Ich weiß um ehrlich zu sein nicht was die Schleife da oben genau soll
Die von Kali oder von mir?
Ich weiß um ehrlich zu sein nicht was die Schleife da oben genau soll
Na..stellen wir uns mal folgendes vor, wir haben folgendes Array:
[1,2,3,-1,-1,-1,-1]
Dann ist der letzte Eintrag ja nicht -1, sondern 3...
Ich dachte, wir reden hier von einem Array welches nicht voll gefüllt ist, wenn natürlich das Element immer auf einem statischen Feld ist..ist das ja trivial und du kannst es natürlich mit array[sizeof(array)-1] lösen..
Mit der Pickup Array Sache habe ich irgendwie immernoch ein Problem: /
Hier weise ich dem Pickup die ID zu
for(new g=0;g<sizeof(GlobalActors);g++)
{
CreateGlobalActor(g+1,274,GlobalActors[g][0],GlobalActors[g][1],GlobalActors[g][2],GlobalActors[g][3],3.0,ActorPickups[g]);
SetActorInvulnerable(g+1, true);
}
Dazugehoerige Funktion
stock CreateGlobalActor(actorid,modelid,Float:ax,Float:ay,Float:az,Float:angle,Float:distance,pickupid)
{
actorid = CreateActor(modelid,ax,ay,az,angle);
new Float:x, Float:y, Float:z;
GetActorPos(actorid, x, y, z);
GetXYInFrontOfActor(actorid, x, y, distance);
pickupid = pickupid + 1000;
pickupid = CreatePickup(1210,2,x,y,z,-1);
SetActorInvulnerable(actorid, true);
printf("Actor created, pickupid %d",pickupid);
return pickupid;
}
Alles anzeigen
printf gibt immer aus dass die Pickupids 1, 2,3,4,5 sind, bei einer sizeof(GlobalActors) von 5, egal was ich als pickupid in die Funktion gebe
Daher war auch der Teil mit OnPlayerPickUpPickup irgendwie nicht funktionsfaehig
for(new i;i<sizeof(ActorPickups);i++)
{
if(pickupid == ActorPickups[i])
{
ShowMenuForPlayer(shopmenu,playerid);
TogglePlayerControllable(playerid,false);
}
}
Habe ich wieder einen Fehler drin?