Theoretisch schon, kommt auf das System drauf an. Sollte aber machbar sein.
Beiträge von Jeffry
-
-
Wie sieht denn dein Befehl nach deinem Versuch aus?
-
Versuche es so:
Unter den Includes:
new rampeID[20] = {-1,...}; //Maximal 20 Rampen
new rampeTime[20];Unter OnGameModeInit:
SetTimer("CheckRampen", 10000, true);Dann der Befehl zum Erstellen:
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.");
//Ansonsten erstelle das Objekt im Slot i.
GetPlayerPos(playerid, x, y, z);
GetPlayerFacingAngle(playerid, a);
rampeID[i] = CreateObject(modelid, x, y, z, 0.0, 0.0, a); // >>> Bei modelid die Model-ID der Rampe eintragen. <<<
rampeTime[i] = gettime() + 60 * 10; //10 Minuten
new str[32];
format(str, sizeof(str), "Rampe %d erstellt.", i);
return SendClientMessage(playerid, 0xFFFFFFFF, str);
}Und den Befehl zum Löschen:
if(strcmp(cmdtext, "/rampeweg", true, 9) == 0)
{
if(strlen(cmdtext) == 9) return SendClientMessage(playerid, 0xFF0000FF, "Benutze: /rampeweg [Slot]");
else if(cmdtext[9] == ' ')
{
new i;
if(sscanf(cmdtext[10], "d", i)) return SendClientMessage(playerid, 0xFF0000FF, "Benutze: /rampeweg [Slot]");
if(i < 0 || i >= sizeof(rampeID)) return SendClientMessage(playerid, 0xFF0000FF, "Error: Dieser Slot existiert nicht.");
if(rampeID[i] == -1) return SendClientMessage(playerid, 0xFF0000FF, "Error: Dieser Slot ist nicht belegt.");
DestroyObject(rampeID[i]);
rampeID[i] = -1;
rampeTime[i] = 0;
new str[32];
format(str, sizeof(str), "Rampe %d gelöscht.", i);
return SendClientMessage(playerid, 0xFFFFFFFF, str);
}
}Und der Timer:
forward CheckRampen();
public CheckRampen()
{
for(new i = 0; i < sizeof(rampeID); i++)
{
if(rampeTime[i] != 0 && gettime() > rampeTime[i])
{
DestroyObject(rampeID[i]);
rampeID[i] = -1;
rampeTime[i] = 0;
}
}
return 1;
}Probiere das mit den Abständen bitte selbst zu realisieren, wenn ich dir das ganze System schreibe lernst du ja nichts dabei.
Versuche es mal selbst, falls du nicht weiter kommst, poste bitte den Stand des Befehls, bei dem du nicht weiter kommst.
Teste aber erst mal, ob es so funktioniert. -
if(strcmp(cmdtext, "/rampeweg", true) == 0)
Nutzt du für alle Befehle strcmp? Oder hast du sowas wie dcmd, ocmd, zcmd, ... ?
-
Genau. Das heißt, anstatt es in Arrays zu speichern, schreibst du es einfach in eine Variable "str" oder so, die du im public lokal definierst.
Die kannst du dann immer wieder überschreiben, mit jeder neuen Zeile. -
Kannst du den Befehl bitte mal posten?
-
Ok, dann kannst du ja den alten Thread löschen, um Verwirrungen zu vermeiden.
Zu deiner Frage, das kannst du dann ganz einfach so machen:
Unter den Includes:
new rampeID[20] = {-1,...}; //Maximal 20 RampenDann der Befehl zum Erstellen:
ocmd:rampe(playerid)
{
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.");
//Ansonsten erstelle das Objekt im Slot i.
GetPlayerPos(playerid, x, y, z);
GetPlayerFacingAngle(playerid, a);
rampeID[i] = CreateObject(modelid, x, y, z, 0.0, 0.0, a); // >>> Bei modelid die Model-ID der Rampe eintragen. <<<
new str[32];
format(str, sizeof(str), "Rampe %d erstellt.", i);
return SendClientMessage(playerid, 0xFFFFFFFF, str);
}Und den Befehl zum Löschen:
ocmd:rampeweg(playerid, params[])
{
new i;
if(sscanf(params, "d", i)) return SendClientMessage(playerid, 0xFF0000FF, "Benutze: /rampeweg [Slot]");
if(i < 0 || i >= sizeof(rampeID)) return SendClientMessage(playerid, 0xFF0000FF, "Error: Dieser Slot existiert nicht.");
if(rampeID[i] == -1) return SendClientMessage(playerid, 0xFF0000FF, "Error: Dieser Slot ist nicht belegt.");
DestroyObject(rampeID[i]);
rampeID[i] = -1;
new str[32];
format(str, sizeof(str), "Rampe %d gelöscht.", i);
return SendClientMessage(playerid, 0xFFFFFFFF, str);
} -
Auf Krampf komm raus funktioniert es nun.
Lass die Schleife weg und mache es lieber so, das ist besser, und du kannst das Array nicht sprengen:
if(obj2 >= 0 && obj2 < 3 && Objjs[playerid][slotti][obj2] != 0)
{
DestroyObject(Objjs[playerid][slotti][obj2]);
}Jedoch, wie muss ich den Public nun aufbauen ?
Mit einer Schleife durch den Cache.
Gleich wie hier beim Laden der Fahrzeuge: [jTuT] Fraktions-Fahrzeug-System mit MySQL R39-2
Versuche mal, ob du damit so klar kommst. -
Geht es um die gleiche Frage wie hier?
mit befehl einem objekt einem namen gebenSollen mit dem Befehl nur gleiche Objekte (zum Beispiel nur das Objekt 1337) erstellt werden, oder unterschiedliche Modelle?
-
Siehst du diese Nachricht noch?
SendClientMessage(playerid,ROT,"Du kannst jetze das Weizen ernten!");Wenn ja, dann füge danach das hier ein:
SetTimerEx("farmtimer",1500,false,"i",playerid);Es scheint mir nämlich so, dass da der Timer nicht mehr gestartet wird, wenn du mit dem sähen fertig bist.
-
Dann könnt ihr ja mal versuchen, wie angesprochen, Stück für Stück Teile aus OnPlayerDeath auszukommentieren, also nicht nur das ganze Callback, sondern Teile davon, so lange, bis ihr die Zeile(n) gefunden habt, die den Spieler so langsam sterben lässt/lassen.
Dass der Spieler nicht im Krankenhaus landet hat mit OnPlayerSpawn zu tun, da dürfte dort was nicht passen.
-
Es sind 785 Objekte geladen. Standardmäßig lädt der Streamer, soweit ich weiß, die nächsten 800 Objekte, sprich du bist da schon ziemlich nahe dran.
Das könnte erklären, warum die Objekte so spät angezeigt werden. -
DestroyObject(Objjs[playerid][slotti][obj2]);
So, und ohne die Schleife.Dann kannst du 0,1,2 eingeben.
-
Ja, das kannst du dann genau so machen.
Nochmal zur Erläuterung:
Objjs[playerid][slotti][i]
Heißt dann:
Objjs[playerid][slotti][0] hat den Wert 81.
Objjs[playerid][slotti][1] hat den Wert 82.
Objjs[playerid][slotti][2] hat den Wert 83.Willst du nun Slot 0 löschen, dann löschst du das Objekt: Objjs[playerid][slotti][0]
Damit wird Slot 0 gelöscht und das Objekt mit der ID 81 entfernt. -
Wenn du die Objekt IDs dieser Objekte nirgends mehr benötigst, ja.
-
Jetzt verwirsst du mich auch so langsam.
Du willst einen freien Slot (i) suchen?
Das wäre dann so:
for(new i = 0; i < 3; i++)
{
if(Objjs[playerid][slotti][i] == 0)
{
Objjs[playerid][slotti][i] = CreateObject(obj2, x, y, z,0.0,0.0,0.0,0.0);
break; //Um die Schleife zu stoppen.
}
}
Das kann aber sein, dass du das schon hast, ich weiß nicht wie du i definiert hast, ob das schon die Schleife ist, eben vor dem sscanf.
In dem Falle wäre das korrekt.Slot 0 (i) hat dann den Wert (Objekt ID) 81.
Besser wäre es allerdings, die drei Objjs[playerid][slotti][i] mit -1 zu instanziieren, bei OnGameModeInit, und in der Schleife auf -1 zu prüfen, da es eine Objekt ID 0 geben kann, die du dann nicht mehr löschen könntest, sofern sie mit diesem Befehl erstellt würde.
-
@YaBroo
Das hier gibt dir 81 aus?
Objjs[playerid][slotti][i]
Das wäre korrekt, da CreateObject dann die 81 zurück gegeben hat.
Den Wert von i kann ich diesem Code nicht entnehmen.@malE
Das heißt, dass du irgendwo versuchst einen Cache auszulesen, obwohl es keinen gibt.
Inwiefern das Probleme verursacht kann man nicht sagen, ohne zu wissen, welcher Code das verursacht. Als Beispiel könnte es sein, dass der Spieler beim Login kein Geld bekommt (Beispiel!). Du willst eben irgendwo was laden, wo nichts existiert.
Das wirst du nur durch suchen oder debuggen (prints) herausfinden können, wo das ist. -
CreateObject gibt die ID des Objektes zurück, das erstellt wurde. Das ist in deinem Fall die 80, somit hat die Variable den Wert 80.
-
Hast du LSPDM so deklariert?
new LSPDM[6];Wenn nicht, mache das so.
-
Kannst du bitte den Code dazu posten?