Du musst das natürlich auch beim /fight Befehl so einbauen.
Beiträge von Jeffry
In 10 Minuten startet der nächtliche Backupvorgang! Es kann währenddessen (ca. 10 Minuten) zu Einschränkungen bei der Nutzung des Forums kommen
Weitere Infos findet ihr im Thema Backup des Forums
-
-
Dann müsstest du es so machen:
ocmd:deagle(playerid,params[])
{
if(Deagle[playerid] == 0 && Fight[playerid] == 0)
{
new rand = random(sizeof(DeagleSpawns));
SetPlayerPos(playerid,DeagleSpawns[rand][0],DeagleSpawns[rand][1],DeagleSpawns[rand][2]);
SetPlayerFacingAngle(playerid,DeagleSpawns[rand][3]);
new pName[MAX_PLAYER_NAME];
new string[128];
GetPlayerName(playerid, pName, sizeof(pName));
format(string, sizeof(string), "%s hat die Deagle Arena (/deagle) betreten.", pName);
SendClientMessageToAll(GRÜN, string);
Deagle[playerid] = 1;
ResetPlayerWeapons(playerid); // Spieler Waffen entnehmen
GivePlayerWeapon(playerid,24,500);
SetPlayerInterior(playerid,1);
}
else
{
SendClientMessage(playerid,ORANGE,"Du bist bereits in einer Arena Tippe /leave um sie zu verlassen");
}
return 1;
}
Sonst würde er ja nur die Deagle Arena prüfen, und man könnte die ganze Zeit hin und her springen. -
if(Deagle[playerid] == 1 || Fight[playerid] == 1) return SendClientMessage(playerid, 0xFF0000FF, "Error: Du bist bereits in einer Arena.");
-
Nach dem Tod oder direkt beim Eingeben des Befehls?
-
@Jeffry Wie kann es kommen das bei OnPlayerDeath ein Timer mehrfach aufgerufen wird?
Zum Teil kommt es vor, dass Callbacks doppelt aufgerufen werden, auf Grund von Funktionen die darin oder oder kurz danach aufgerufen werden. Ich könnte mir vorstellen, dass es hier mit dem SpawnPlayer irgendwie zusammenhängt, könnte aber auch an was anderem liegen, das ist schwer zu sagen, das müsste man ganz genau ausprobieren und mit prints debuggen.
Grade OnPlayerSpawn und OnPlayerDeath sind da ganz anfällig. -
Was ist denn überhaupt das Problem?
Du sagst, wenn du /deagle eingibst spawnst du woanders als wenn du /fight eingibst. Soweit ist das laut Code auch so.
Wie soll es denn deiner Vorstellung nach sein? Dass /deagle und /fight in die gleiche Arena gehen, wenn ja in welche der beiden? -
Ok, dann ändere folgendes mal ab:
Beide
KillTimer(MedicalTimerID[playerid]);
zu:
if(MedicalTimerID[playerid] != -1) KillTimer(MedicalTimerID[playerid]);
MedicalTimerID[playerid] = -1;Und:
MedicalTimerID[playerid] = SetTimerEx("MedicalTimer",2000,true,"i",playerid);
zu:
if(MedicalTimerID[playerid] != -1) KillTimer(MedicalTimerID[playerid]);
MedicalTimerID[playerid] = SetTimerEx("MedicalTimer",2000,true,"i",playerid);Meine Vermutung wäre, dass der Timer doppelt gestartet wird und somit einer davon nicht mehr beendet wird.
Falls das nichts hilft, woran erkennst du, dass der Timer weiterhin läuft, bzw. nicht beendet wird? -
(Nicht getestet)
Du hast einen Klammerfehler drin, und beim Besitzer würde das zweite Array fehlen (da String), wenn man es so macht.
Am besten ohne die Variablen nutzen, da man ja eh nur ein Fahrzeug ausgibt, und dann direkt den Befehl beenden:
ocmd:carinfo(playerid,params[])
{
if(!params[0]) return SendClientMessage(playerid, 0xFF0000FF, "Benutze: /carinfo [id]");
new carid = strval(params), string[145];
if(carid < 1 || carid >= MaxVeh)return SendClientMessage(playerid, 0xFF0000FF, "Ungültige ID.");
for(new i = 0; i < MAX_PLAYERS; i++)
{
for(new j = 0; j < MaxVeh; j++)
{
if(PlayerCar[i][j][CarId] == carid)
{
format(string,sizeof(string),"Besitzer: %s | Tankinhalt: %d",PlayerCar[i][j][CarOwner],PlayerCar[i][j][Benzin]);
return SendClientMessage(playerid,0xFFFFFFFF,string);
}
}
}
return SendClientMessage(playerid, 0xFF0000FF, "Error: Dieses Fahrzeug gehört keinem Spieler.");
} -
Wird der MedicalTimerID ausschließlich dort gestartet und dort beendet, wo du es gepostet hast?
-
Im enum:
pBanGrund,
zu:
pBanGrund[32],Das gleiche bei den anderen enum-Werten die einen Text enthalten (Admin, TimebanGrund, ...).
@Exod_Martinez
Bei Integers benötigt man die Anführungszeichen nicht zwangsläufig, die sind dort optional. Bei Strings hingegen benötigt man sie. -
Dann kannst du beim Erstellen der Pflanzen abfragen ob IsPlayerInRangeOfPflanzen(playerid) == -1 ist, und nur dann die Pflanze erstellen.
-
Hallo Jeffry, wenn du bei der Nutzung von sscanf nix angibst gibt sscanf 1 zurück und gibt daher die Meldung aus das der Nefehl ein bestimmtes Format braucht daher ist die länge abzuprüfen vom Grund nicht notwendig
Das weiß ich, meine Antwort war auch auf meinen zuvor geposteten Code bezogen, da er TE diesen ausprobiert hat (zitierter Text), da wird kein sscanf verwendet.

-
Klappt nicht ich kann nicht mal Grund eingeben
Was hast du denn als Grund eingegeben? Nichts?
Falls nichts, und er dann nichts ausgibt, anstatt die Nutzungsmeldung, dann ändere
if(!strlen(params))
zu:
if(!params[0])An sich sollte der Befehl aber klappen, wenn du einen Grund eingibst.
-
Was meinst du?
Dass er immer die nächste Pflanze ausgibt im Umkreis, oder wie? -
Wie speicherst du den Ban Grund (Ban Befehl?) und wie hast du pBanGrund im enum definiert?
-
Versuche es so:
ocmd:healall(playerid,params[])
{
if(sInfo[playerid][alevel] < 3)return SendClientMessage(playerid,GRAU,"Du bist nicht befugt!");
if(!strlen(params))return SendClientMessage(playerid,GRAU,"Verwendung: /healall [Grund]");
for(new i; i < MAX_PLAYERS; i ++)
{
if(IsPlayerConnected(i) && !IsPlayerNPC(i))
{
if(playerid != i)
{
SetPlayerHealth(i,100);
}
}
}
new string[145];
format(string,sizeof(string),"Alle Spieler wurden von %s gehealt, Grund: %s",GetName(playerid),params);
SendClientMessageToAll(BLAU,string);
return 1;
}ocmd:armourall(playerid,params[])
{
if(sInfo[playerid][alevel] < 3)return SendClientMessage(playerid,GRAU,"Du bist nicht befugt!");
if(!strlen(params))return SendClientMessage(playerid,GRAU,"Verwendung: /armourall [Grund]");
for(new i; i < MAX_PLAYERS; i ++)
{
if(IsPlayerConnected(i) && !IsPlayerNPC(i))
{
if(playerid != i)
{
SetPlayerArmour(i,100);
}
}
}
new string[145];
format(string,sizeof(string),"Alle Spieler haben von %s Armour erhalten, Grund: %s",GetName(playerid),params);
SendClientMessageToAll(BLAU,string);
return 1;
} -
Was meinst du? Kannst du den Code posten, den du erstellt hast?
-
Versuche es so:
stock IsPlayerInRangeOfPflanzen(playerid)
{
for(new i = 0; i < sizeof(Weizen); i++)
{
if(Weizen[i][w_Objekt] != -1)
{
printf("%d",Weizen[i][w_Objekt]);
if(IsPlayerInRangeOfPoint(playerid,4.0,Weizen[i][w_X],Weizen[i][w_Y],Weizen[i][w_Z]))
{
return i;
}
}
}
return -1;
} -
Ich kenne den Code nicht, daher kann ich dir das nicht genau sagen.
Prinzipiell musst du so vorgehen:Tor-Objekt dem Haus zuweisen (sprich im Haus-Enum einen Wert für die Objekt ID des Tors anlegen und das Tor dort zuweisen).
Dann abfragen, bei welchem Tor der Spieler ist, dann weißt du auch das Haus, und dann abfragen ob der Spieler dieses Haus besitzt.
-
Versuche es so:
if(strcmp(cmdtext, "/rampe", true) == 0)
{
new i, Float:x, Float:y, Float:z, Float:a;
//Hier wird ein freier Slot (i) gesucht:
for(i = 0; i < sizeof(RampeID); i++) if(RampeID[i] == -1) break;
//Wenn keiner mehr frei ist:
if(i == sizeof(RampeID)) return SendClientMessage(playerid, 0xFF0000FF, "Error: Es sind bereits alle Rampen-Slkots gefüllt, bitte lösche eine Rampe.");
for(new j = 0; j < sizeof(RampeID); j++)
{
if(RampeID[j] == -1) continue;
GetObjectPos(RampeID[j], x, y, z);
if(IsPlayerInRangeOfPoint(playerid, 6, x, y, z)) return SendClientMessage(playerid, 0xFF0000FF, "Error: Die Rampe ist zu nah an einer anderen Rampe!");
}
//Ansonsten erstelle das Objekt im Slot i.
GetPlayerPos(playerid, x, y, z);
GetPlayerFacingAngle(playerid, a);
RampeID[i] = CreateObject(modelid, x, y, z-1, 0.0, 0.0, a); // >>> Bei modelid die Model-ID der Rampe eintragen. <<<
RampeTime[i] = gettime() + 60 * 30; //30 Minuten
RampeautowegTime[i] = gettime() + 60 * 40; //40 Minuten
new str[32];
format(str, sizeof(str), "Rampe%d", i);
return SendClientMessage(playerid, 0xFFFFFFFF, str);
}