Wie sieht denn die ganze Schleife aus?
[SAMMELTHREAD] Kleine Scripting Fragen
- Rafelder
- Unerledigt
Dein Problem konnte durch einen User gelöst werden? Bedank dich bei ihm indem du seinen Beitrag als Hilfreich markierst sowie einen Daumen oben dalässt
Wichtiger Hinweis: Bitte ändert nicht manuell die Schriftfarbe auf schwarz sondern belasst es bei der Standardeinstellung. Somit tragt ihr dazu bei dass euer Text auch bei Verwendung unseren dunklen Forenstils noch lesbar ist!
Tipp: Ihr wollt längere Codeausschnitte oder Logfiles bereitstellen? Benutzt unseren eigenen PasteBin-Dienst Link
-
-
Hier mal der ganze Befehl
C
Alles anzeigenif(strcmp(cmdtext, "/blowbed", true)) { for(new i = 0; i < sizeof(beds[]); i++) { if(running !=1 && IsPlayerInRangeOfPoint(playerid,10.0,beds[i][0],beds[i][1],beds[i][2]))// In this script we deal with players only { running = 1; GetPlayerPos(playerid, x1, y1, z1); ApplyAnimation(playerid, "BOMBER", "BOM_Plant_Loop", 4.0, 1, 0, 0, 1, 1); for(new k = 0; k < MAX_PLAYERS; k++) { PlayerPlaySound(k,7416,x1,y1,z1); } SetTimer("BlowUpThisBed", bombtimer, false); CountDownTimer = SetTimer("CountDown", 1000, true); new Float:dist = GetDistance(beds[i][0],beds[i][1],beds[i][2],x1,y1,z1); printf("Distance to closest bed: %f",dist); return 1; } else { return 0; } } }
-
for(new i = 0; i < sizeof(beds); i++)
-
for(new i = 0; i < sizeof(beds); i++)
Das hat mein Problem leider auch nicht behoben
-
running = 1;
Für was wird das genutzt?
Du setzt die Variable direkt auf 1 und fragst gleichzeitig ab ob running !=1 && ....
Also running nicht auf 1 setzen und/oder running !=1 && aus der Abfrage entfernen. -
Entferne zusätzlich den else-Teil, der beendet die Schleife sonst immer nach dem ersten fehlgeschlagenen Durchlauf.
-
Für was wird das genutzt?Du setzt die Variable direkt auf 1 und fragst gleichzeitig ab ob running !=1 && ....
Also running nicht auf 1 setzen und/oder running !=1 && aus der Abfrage entfernen.Moin
Das nutze ich dafuer dass der Befehl nicht nochmal ausgefuehrt wird waehrend der am laufen ist.
Das wird dann nachher wieder auf 0 gesetzt im TimerJeffrey: Gibts noch ne andere Moeglichkeit 0 zu returnen oder nen Fehler auszugeben, und dabei nicht die Schleife abzubrechen?
Vielen Dank schonmal mit dem else, damit hats geklappt
-
Jeffrey: Gibts noch ne andere Moeglichkeit 0 zu returnen oder nen Fehler auszugeben, und dabei nicht die Schleife abzubrechen?
Ja, schreib das return 0 nach der Schleife (außerhalb) hin.
Das wird dann ja nur erreicht, wenn das return 1 nicht erreicht wird. -
Absolut Klasse! Das geht!
Habe nun ein kleines Gedankenproblem womit ich mich befasse.Ich will mit meinem Befehl ueberpruefen bei welcher der Koordinaten aus dem Array der Spieler sich befindet, aus dem Array hier
Cnew Float:beds[][3] = { {268.1000100,1881.5000000,-31.4000000},//Grey {417.6000100,2536.2000000,8.9000000},//Blue {-955.2665,1867.7350,5.6661},//Red {-391.0000000,2227.0000000,41.4000000}//Unspecified };
Ich weiss jetzt nicht wie ich feststellen kann ueber meinen Befehl ob der Spieler bei Grey ist, oder bei Blue etc. da faellt mir aktuell einfach nix zu ein
Habe eventuell gedacht irgendwas richtung if(beds[i] == beds[1] ) oder sowas zu machen, aber ich denke da gibt es eventuell effizientere LoesungsansaetzeLeider weiss ich nicht wie man Zeilen aus Arrays vergleichen kann
-
Du kannst den Index übergeben und Abfragen. Bspw:
printf("Distance to closest bed: %f, Index: %d", dist, i);
Wenn der Index, also die Variable i gleich 0 ist, dann ist er bei Grey, 1 wäre dann Blue etc.
Achte aber darauf, dass du die Reihenfolge des Arrays nicht willkürlich änderst. -
Absolut klasse das hat so geklappt.
Habe nun ein Problem mit einem Befehl.Wenn ich hier statt /soundvalid ID einfach nur /soundv eingebe erhalte ich schon die ClientMessage, obwohl /soundv ja nicht /soundvalid ist
Wo liegt das Problem?C
Alles anzeigenif(strcmp(cmd, "/soundvalid", true)) { new tmp[20], targetsoundid; tmp = strtok(cmdtext, idx); if(!strlen(tmp)) return SendClientMessage(playerid, COLOR_WHITE, "USAGE: /soundvalid [soundid]"); targetsoundid = strval(tmp); goto sound; new i=0; do { i++; PlayerPlaySound(i, targetsoundid, 0,0,0); sound: } while (i <MAX_PLAYERS); printf("Playing SoundID: %i",targetsoundid); return 1; }
-
if(strcmp(cmd, "/soundvalid", true))
Es muss: if(!strcmp(cmd,"/soundvalid",true)) heißen
Und wieso nutzt du goto und do-while?
Bitte goto nie verwenden...das ist ein sehr schlechter programmierstil...
C
Alles anzeigenif(!strcmp(cmd, "/soundvalid", true)) { new tmp[20], targetsoundid; tmp = strtok(cmdtext, idx); if(!tmp[0]) return SendClientMessage(playerid, COLOR_WHITE, "USAGE: /soundvalid [soundid]"); targetsoundid = strval(tmp); for(new i; i<MAX_PLAYERS; i++) { if(!IsPlayerConnected(i) || IsPlayerNPC(i)) continue; PlayerPlaySound(i, targetsoundid, 0,0,0); } printf("Playing SoundID: %i",targetsoundid); return 1; }
-
Ich habe mal im Script nachgeguckt und diese Zeile macht die Probleme.
Was soll das Query machen?
-
-
Du musst das Textdraw mit einem Timer aktualisieren und im Timer immer wieder
http://wiki.sa-mp.com/wiki/PlayerTextDrawTextSize
aufrufen, sowie eventuell direkt danach
http://wiki.sa-mp.com/wiki/PlayerTextDrawShow.Im Timer zählst du mit jedem Aufruf eine Spielervariable um X hoch, so lange, bis X den maximalen Wert der Ladebox erreicht hat.
-
Beitrag von NikBazinga! ()
Dieser Beitrag wurde vom Autor gelöscht (). -
@Kaliber Da habe ich aber ein dickes Problem wo ich bisher keinen anderen Weg als goto wusste
C
Alles anzeigenelse if(Current==pistols) { ShowMenuForPlayer(pistols,playerid); switch(row) { case 0: if(GetPlayerMoney(playerid) > 1500) { GivePlayerWeapon(playerid,22,50); } else { goto err; } case 1: if(GetPlayerMoney(playerid) > 2500) { GivePlayerWeapon(playerid,23,50); } else } goto err; { case 2: if(GetPlayerMoney(playerid) > 10000) { GivePlayerWeapon(playerid,24,50); } else { goto err; } case 3: { HideMenuForPlayer(pistols,playerid); ShowMenuForPlayer(ammunation,playerid); } default: { print("Fail"); } } }
Habe in meinem OnPlayerMenuSwitch oder aehnlich Teil ueber 20 solcher Menus, teils auch mit 20 cases.
Bei jedem der Menu will ich jedoch ueberpruefen ob der Spieler genug Geld hat um sich die Waffen zu kaufen, und wenn nicht nen Fehler ausgeben.
Das ist super umstaendlich hunderte male if-else zu machen, und ich habe daher keinen ressourcensparenderen Weg gefunden als jedes mal goto zur Fehlerausgabe zu machen anstatt jedes mal die gleiche Nachricht da zu verpacken.Hat jemand eventuell ne Idee wie ich das ganze geschickter gestalten kann anstatt imer if-else zu nutzen bei jedem case, und das mit der Fehlerausgabe besser machen kann wenn der Spieler nicht genug Geld hat?
-
-
ggf. so?
else if(Current==pistols)
{
ShowMenuForPlayer(pistols,playerid);
switch(row)
{
case 0:
{
if(GetPlayerMoney(playerid) < 1500)return SendClientMessage(playerid, -1, NO_MONEY_MSG);
GivePlayerWeapon(playerid,22,50);
. }
. case 1:
{
if(GetPlayerMoney(playerid) < 2500)return SendClientMessage(playerid, -1, NO_MONEY_MSG);
GivePlayerWeapon(playerid,23,50);
}
default:
{
print("Fail");
}
}
} -
Vielen Dank fuer eure Vorschlaege!
Ich werde das mal durchschauen, habe aber aktuell folgendes probiertEine Funktion erstellt
C
Alles anzeigenSellPlayerWeapon(); stock SellPlayerWeapon(playerid,cost,weaponid,ammo) { if(GetPlayerMoney(playerid) >= cost) { GivePlayerWeapon(playerid,weaponid,ammo); GivePlayerMoney(playerid,-cost); } else { SendClientMessage(playerid,COLOR_WHITE,"SERVER: Insufficient balance to buy this item!"); } }
Welche die gewuenschten Sachen wie ueberpruefung des Geldes, und Fehlermessage direkt verbindet
Ich werde mal schauen ob das funktioniert -