Nabend,
ich scripte derzeit an einem eigenen Funserver, auf dem ich ein Car-System machen möchte (ich arbeite mit Dini)... Dazu muss ich sagen, dass ich erst vor kurzem mit scripten angefangen habe... Ich hab das Grundgerüst so aufgebaut, dass ich mit einem Befehl ein Fahrzeug erstellen kann, welches als Datei gespeichert und beim starten des Servers geladen wird.
Das ist der Befehl:
ocmd:testveh(playerid,params[])
{
if(IsPlayerAnAdmin(playerid,4))
{
new carid, Float:x, Float:y, Float:z, Float:angle, color1, color2;
if(sscanf(params,"iii",carid,color1,color2)) return SendClientMessage(playerid,GRAU,"Benutze /testveh [ID]");
GetPlayerPos(playerid, x,y,z);
GetPlayerFacingAngle(playerid, angle);
new id = CreateVehicle(carid, x+2,y,z,angle+4,color1,color2,-1);
CarInfo[id][aID] = id;
CarInfo[id][aX] = x;
CarInfo[id][aY] = y;
CarInfo[id][aZ] = z;
CarInfo[id][aAngle] = angle;
CarInfo[id][aModel] = carid;
CarInfo[id][aColor1] = color1;
CarInfo[id][aColor2] = color2;
CarInfo[id][aVer] = 0;
SpeicherFahrzeug(id);
SendClientMessage(playerid, GELB, "Car gespawnt!");
}
else
{
return 0;
}
return 1;
}
public SpeicherFahrzeug(carid)
{
new str[25];
format(str, sizeof(str), "%d.car", carid);
if(carid <= 0)
{
return 1;
}
else
dini_Create(str);
{
dini_IntSet(str,"ID",CarInfo[carid][aID]);
dini_FloatSet(str,"aX", CarInfo[carid][aX]);
dini_FloatSet(str,"aY", CarInfo[carid][aY]);
dini_FloatSet(str,"aZ", CarInfo[carid][aZ]);
dini_FloatSet(str,"aAngle", CarInfo[carid][aAngle]);
dini_IntSet(str,"Model",CarInfo[carid][aModel]);
dini_IntSet(str,"Color1",CarInfo[carid][aColor1]);
dini_IntSet(str,"Color2",CarInfo[carid][aColor2]);
dini_IntSet(str,"Verkauft",CarInfo[carid][aVer]);
}
return 1;
}
Wenn ich ein Auto mit einem 2. Befehl verkaufe, wird die Variable "Verkauft" in der Datei von dem car auf "1" gesetzt und beim Laden aller Dateien werden alle cars, bei denen "Verkauft" auf 1 ist in eine andere Welt gesetzt (damit sich die ID's nicht verschieben).
Nun habe ich noch einen 3. Befehl (noch nicht ganz fertig, war nur ein Test) mit dem ich ein car "kaufen" möchte... Wenn ich den Befehl eingebe, sollte eigentlich eine for-Schleife alle Dateien durchsuchen und bei der 1. stoppen, in der "Verkauft" auf 1 ist. Das Auto der Datei soll dann gelöscht und ein neues Auto erstellt werden. Zusätzlich sollen die Werte in der Datei dem neuen Auto angepasst werden.
ocmd:testveh2(playerid,params[])
{
if(IsPlayerAnAdmin(playerid,4))
{
new carid, id, newid, Float:x, Float:y, Float:z, Float:angle, color1, color2;
if(sscanf(params,"iii",carid,color1,color2)) return SendClientMessage(playerid,GRAU,"Benutze /testveh [ID]");
GetPlayerPos(playerid, x,y,z);
GetPlayerFacingAngle(playerid, angle);
for(new i = 0; i < MAX_VEHICLES; i++)
{
new str[32];
format(str, sizeof(str), "%d.car", i);
if(dini_Int(str,"Verkauft") == 1)
{
i = id;
format(str, sizeof(str), "%d.car", id);
DestroyVehicle(id);
newid = CreateVehicle(carid, x+2,y,z,angle+4,color1,color2,-1);
CarInfo[newid][aX]=x;
CarInfo[newid][aY]=y;
CarInfo[newid][aZ]=z;
CarInfo[newid][aAngle]=angle;
CarInfo[newid][aModel]=carid;
CarInfo[newid][aColor1]= color1;
CarInfo[newid][aColor2]= color2;
CarInfo[newid][aVer]=0;
dini_FloatSet(str,"aX", CarInfo[newid][aX]);
dini_FloatSet(str,"aY", CarInfo[newid][aY]);
dini_FloatSet(str,"aZ", CarInfo[newid][aZ]);
dini_FloatSet(str,"aAngle", CarInfo[newid][aAngle]);
dini_IntSet(str,"Model",CarInfo[newid][aModel]);
dini_IntSet(str,"Color1",CarInfo[newid][aColor1]);
dini_IntSet(str,"Color2",CarInfo[newid][aColor2]);
dini_IntSet(str,"Verkauft",CarInfo[newid][aVer]);
break;
}
}
SendClientMessage(playerid, GELB, "Car gespawnt!");
}
else
{
return 0;
}
return 1;
}
Aus irgendeinen Grund wird die Datei dem neuen Auto aber nicht zugewiesen, und das Auto hat dann eine andere ID als es eigtl. haben sollte, da das vorherige car ja gelöscht wurde.
Ich hoffe, ihr versteht was ich meine O.o
Nun bin ich mir nicht sicher, ob es, so wie ich es gemacht habe, generell nicht geht, oder ob ich nur igendwo einen Fehler gemacht habe
Würde mich über hilfreiche Antworten freuen.