for(new i = 0; i < sizeof(beds); i++)
Das hat mein Problem leider auch nicht behoben
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 Timer
Jeffrey: 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
new 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 Loesungsansaetze
Leider 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?
if(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;
}
Alles anzeigen
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...
if(!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;
}
Alles anzeigen
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.
@Kaliber
Da habe ich aber ein dickes Problem wo ich bisher keinen anderen Weg als goto wusste
else 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");
}
}
}
Alles anzeigen
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 probiert
Eine Funktion erstellt
SellPlayerWeapon();
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!");
}
}
Alles anzeigen
Welche die gewuenschten Sachen wie ueberpruefung des Geldes, und Fehlermessage direkt verbindet
Ich werde mal schauen ob das funktioniert
Kennt jemand ein Tool womit man komfortabel Zonen erstellen kann?
Ich kenne nur den Xtreme Vehicle Plotter, jedoch gibt es dafuer irgendwie keinen Download link mehr
Abend,
hat jemand eine Idee weshalb ich hier ein Error bekomme?
stock Float:GetItemWeight(itemid, menge)
{
new Float:weight = 0.0;
if(menge > 0)
if(itemid >= 1 && <= 46) {
weight = menge + (menge * Items[itemid][itemMunitionWeight]);
}
weight = menge * Items[itemid][itemWeight]; // error 010: invalid function or declaration
}
return weight;
}
Zeig mal wie du Items deklariert hast und wie das enum dazu aussieht ![]()