Beitrag von JustMe.77 ()
Dieser Beitrag wurde vom Autor gelöscht ().
Existiert immer nur eine Geschenk-Box, oder mehrere/alle gleichzeitig?
Ok. Textdokument = Dini?
Wenn ja, dann versuche doch mal, dich an diesem Tutorial ([jTuT] Fraktions-Fahrzeug-System mit Dini 1.6) entlang zu hangeln. Du musst nur Teile davon übernehmen (z.B. ein Timer um alles zu Speichern brauchst du ja nicht, oder einen /parken Befehl).
Was zu eigentlich erst mal brauchst:
Lade-Funktion bei OnGameModeInit
Erstellen Befehl
(gegebenenfalls Löschen Befehl)
Dinge wie Model und Fraktion kannst du alles weg lassen, du brauchst ja nur die Koordinaten.
Fange am besten so an, dass du eine Datei manuell erstellst, mit den Koordinaten des ersten Pakets, dann erstellst du die Lade-Funktion, und wenn die klappt, den Befehl zum Erstellen von Paketen. Danach dann den zum Löschen, falls gewünscht.
Versuche mal ob du damit klar kommst.
An sich war das schonmal gut was du gemacht hast.
Nur das mit der VehicleID hat dich anscheinend etwas verwirrt, das war nämlich das einzig wirkliche Problem, was sich durch den ganzen Code gezogen hat. Da wir das hier nicht brauchen, habe ich das einfach entfernt, und die Speicherung beim "Check" mit dem Index "i" gemacht.
Teste es so, das sollte dann alles klappen:
#include <a_samp>
#include <Dini>
#include <ocmd>
#include <streamer>
#define MaxGifts 10
enum fracVehEnum
{
Float:e_x,
Float:e_y,
Float:e_z,
Float:e_a,
e_oID
};
new GiftBox[MaxGifts][fracVehEnum];
public OnFilterScriptInit()
{
LoadGiftBoxs();
return 1;
}
LoadGiftBoxs()
{
new CreatedGiftBoxes, path[64];
//Schleife durch alle Dateien:
for(new i=0; i<MaxGifts; i++)
{
//Es wird geprüft, ob ein Fahrzeug mit der ID existiert, wenn nicht, wird diese ID übersprungen
format(path, sizeof(path), "/GiftBoxs/%d.ini", i);
if(!fexist(path)) continue;
//Fahrzeug existiert im GiftBoxs-Ordner, wir laden die Daten jetzt aus der Datei.
GiftBox[i][e_x] = floatstr(dini_Get(path, "x"));
GiftBox[i][e_y] = floatstr(dini_Get(path, "y"));
GiftBox[i][e_z] = floatstr(dini_Get(path, "z"));
GiftBox[i][e_a] = floatstr(dini_Get(path, "a"));
GiftBox[i][e_oID] = CreateDynamicObject(19054, GiftBox[i][e_x], GiftBox[i][e_y], GiftBox[i][e_z], 0.0, 0.0, GiftBox[i][e_a]);
CreatedGiftBoxes++;
if(CreatedGiftBoxes == MaxGifts) return print("Es können keine weiteren Geschenke geladen werden, Limit (MaxGifts) erreicht.");
}
return 1;
}
stock SaveFracVehCheck(i)
{
//Deklaration neuer temporärer Variablen:
new path[64];
if(i > -1 && i < sizeof(GiftBox))
{
//Es wird der Pfad gesetzt:
format(path, sizeof(path), "/GiftBoxs/%d.ini", i);
//Und wir speichern die Daten:
dini_FloatSet(path, "x", GiftBox[i][e_x]);
dini_FloatSet(path, "y", GiftBox[i][e_y]);
dini_FloatSet(path, "z", GiftBox[i][e_z]);
dini_FloatSet(path, "a", GiftBox[i][e_a]);
return 1; //Es gibt ja keine zwei gleichen Fahrzeuge
}
return 0; //Fahrzeug ist kein Fraktions-Fahrzeug
}
forward SaveAllFracVehs();
public SaveAllFracVehs()
{
//Deklaration neuer temporärer Variablen:
new path[64];
//Schleife durch alle Fraktions-Fahrzeuge:
for(new i=0; i<MaxGifts; i++)
{
//Es wird der Pfad gesetzt:
format(path, sizeof(path), "/GiftBoxs/%d.ini", i);
//Und wir speichern die Daten:
dini_FloatSet(path, "x", GiftBox[i][e_x]);
dini_FloatSet(path, "y", GiftBox[i][e_y]);
dini_FloatSet(path, "z", GiftBox[i][e_z]);
dini_FloatSet(path, "a", GiftBox[i][e_a]);
}
return 1;
}
ocmd:geschenk(playerid, params[])
{
for(new i=0; i<MaxGifts; i++)
{
if(GiftBox[i][e_x] == 0.0 && GiftBox[i][e_y] == 0.0 && GiftBox[i][e_z] == 0.0)
{
//Daten werden übergeben
new Float:x, Float:y, Float:z, Float:a;
GetPlayerPos(playerid, x, y, z);
GetPlayerFacingAngle(playerid, a);
GiftBox[i][e_x] = x;
GiftBox[i][e_y] = y;
GiftBox[i][e_z] = z - 0.4;
GiftBox[i][e_a] = a;
GiftBox[i][e_oID] = CreateDynamicObject(19054,x, y, z - 0.4, 0.0, 0.0,a);
//Zuletzt wird die Datei angelegt und das Fahrzeug gespeichert.
new path[64];
format(path, sizeof(path), "/GiftBoxs/%d.ini", i);
dini_Create(path);
SaveFracVehCheck(i);
return SendClientMessage(playerid, 0x00FF00FF, "Geschenke gespeichert.");
}
}
return SendClientMessage(playerid, 0xFF0000FF, "Error: Limit für Geschenke erreicht.");
}
//Stocks
stock strtok2(const string[], &index) //©Jeffry
{
new result[20], length = strlen(string), i = index;
while ((i < length) && (string[i] == ' ')) i++;
strmid(result,string,i,((index = strfind(string, " ", false, i)) == -1) ? (index = length) : (index) , 20);
index++;
return result;
}
stock IsNumeric(string[])
{
for (new i = 0, j = strlen(string); i < j; i++)
{
if ((string[i] > '9' || string[i] < '0')) return 0;
}
return 1;
}
Wenn du es mit dem System machen willst, dann wäre es am sinnvollsten, alles einheitlich zu machen, sprich du erstellst einfach 40 dieser Geschenke, geladen werden sie ja dann automatisch.
Dann würde auch die Chance bestehen, diese leicht zu ändern.
Du kannst es nach dem Objekt erstellen, ohne Mehraufwand:
GiftBox[i][e_label] = CreateDynamic3DTextLabel("/takegift\nTo get your gift.",0x10F441AA,GiftBox[i][e_x], GiftBox[i][e_y], GiftBox[i][e_z]+0.25,8.0);
Im enum ein "Text3D:" setzen, vor das e_label.
Du musst die Erstellung des Labels auch dort einfügen, wo die Geschenke geladen werden, beim Start des Servers.
Also unter alle CreateDynamicObject in dem System muss auch das CreateDynamic3DTextLabel hin.
Die ID ist das i das in den eckigen Klammern steht.
Wenn du da einen Befehl machst, dann kannst du das zum Beispiel mit sscanf eingeben, und die eingegebene Nummer dann in eine Variable speichern, die du zum Beispiel i nennst, und dann so wie sonst auch auf die Werte zugreifen.
SetPlayerPos(playerid, GiftBox[i][e_x], GiftBox[i][e_y], GiftBox[i][e_z]);
So:
SetPlayerPos(playerid, GiftBox[i][e_x], GiftBox[i][e_y], GiftBox[i][e_z]+2);
Da du ein 2 dimensionales Array hast, musste auch schon die 2. Dimension angeben
Also so schreiben:
DestroyDynamicObject( GiftBox[i][e_oID] );