Mahlzeit..
Da ich nun schon seit ein paar Tagen immer wieder Thread sehe und lese wo es einige nicht ganz schaffen ein System zu basteln bei welchem man nach dem Disconnect wieder an der selben Stelle spawnt wo man sich ausgeloggt hat, habe ich mal schnell nen Code geschrieben um die Threads zu klären.
Es ist kein komplettes Filterscript, lediglich nur ein paar Code Ausschnitte.
Ich habe es absichtlich nicht in den Codeschnipsel Bereich gepostet da es dort vermutlich untergehen würde!
Ihr müsst nur die Variablen an eurem Script anpassen und ggf. auch die Lade-Funktion ändern.
In meinem Testscript welches ich dafür angefertigt habe, hat es einwandfrei funktioniert.
Viel Spaß damit.
In die Array vom Spieler:
Float:logPos[4],
SP_Change,
SP_Int
Spieler speichern:
//Am Anfang vom Speicherscript
new Float:p[4];
GetPlayerPos(playerid,p[0],p[1],p[2]);
GetPlayerFacingAngle(playerid,p[3]);
//Daten in die Tabelle schreiben (MySQL):
mysql_SetFloat("Accounts", "X", p[0], "Name", Spieler[playerid][Name]);
mysql_SetFloat("Accounts", "Y", p[1], "Name", Spieler[playerid][Name]);
mysql_SetFloat("Accounts", "Z", p[2], "Name", Spieler[playerid][Name]);
mysql_SetFloat("Accounts", "A", p[3], "Name", Spieler[playerid][Name]);
mysql_SetInt("Accounts", "SpawnChange", Spieler[playerid][SP_Change], "Name", Spieler[playerid][Name]);
mysql_SetInt("Accounts", "Interior", GetPlayerInterior(playerid), "Name", Spieler[playerid][Name]);
//Für die Dini-Nutzer
new Datei[128],name[24];
GetPlayerName(playerid,name,24);
format(Datei,sizeof(Datei),"PFAD_ZUM_ACCOUNT",name);
dini_FloatSet(Datei,"X", p[0]);
dini_FloatSet(Datei,"Y", p[1]);
dini_FloatSet(Datei,"Z", p[2]);
dini_FloatSet(Datei,"A", p[3]);
dini_IntSet(Datei,"SpawnChange", Spieler[playerid][SP_Change]);
dini_IntSet(Datei,"Interior", GetPlayerInterior(playerid));
Spieler laden:
(Ich denke mal das die meisten nach dem Tutorial von maddin o.ä gehen, daher habe ich es auch direkt diesem angepasst.)
//MySQL:
Spieler[playerid][logPos][0] = mysql_GetFloat("Accounts", "X", "Name", Spieler[playerid][Name]);
Spieler[playerid][logPos][1] = mysql_GetFloat("Accounts", "Y", "Name", Spieler[playerid][Name]);
Spieler[playerid][logPos][2] = mysql_GetFloat("Accounts", "Z", "Name", Spieler[playerid][Name]);
Spieler[playerid][logPos][3] = mysql_GetFloat("Accounts", "A", "Name", Spieler[playerid][Name]);
Spieler[playerid][SP_Change] = mysql_GetInt("Accounts", "SpawnChange", "Name", Spieler[playerid][Name]);
Spieler[playerid][SP_Int] = mysql_GetInt("Accounts", "Interior", "Name", Spieler[playerid][Name]);
Dini:
new Datei[128],name[24];
GetPlayerName(playerid,name,24);
format(Datei,sizeof(Datei),"PFAD_ZUM_ACCOUNT",name);
Spieler[playerid][logPos][0] = dini_Float(Datei, "X");
Spieler[playerid][logPos][1] = dini_Float(Datei, "Y");
Spieler[playerid][logPos][2] = dini_Float(Datei, "Z");
Spieler[playerid][logPos][3] = dini_Float(Datei, "A");
Spieler[playerid][SP_Change] = dini_Int(Datei, "SpawnChange");
Spieler[playerid][SP_Int] = dini_Int(Datei,"Interior");
Befehl um "SpawnChange" zu ändern:
ocmd:spawnchange(playerid,params[])
{
if(!IsPlayerConnected(playerid))return true;
if(Spieler[playerid][SP_Change] == 0){
Spieler[playerid][SP_Change] = 1;
SendClientMessage(playerid,0xFFFFFF,"Du wirst nun nach dem Login an Deinem letzten Standpunkt gespwant!");
}
else if(Spieler[playerid][SP_Change] == 1){
Spieler[playerid][SP_Change] = 0;
SendClientMessage(playerid,0xFFFFFF,"Du wirst nun nach dem Login an der gewohnten Position spawnen!");
}
return 1;
}
OnPlayerSpawn:
if(Spieler[playerid][SP_Change] == 0){
SetPlayerPos(playerid,Faction[0][fSpawnX],Faction[0][fSpawnY],Faction[0][fSpawnZ]);
SetPlayerPos(playerid,1742.7982,-1863.2788,13.5753);
SetPlayerInterior(playerid,0);
}
else if(Spieler[playerid][SP_Change] == 1){
SetPlayerPos(playerid,Spieler[playerid][logPos][0],Spieler[playerid][logPos][1],Spieler[playerid][logPos][2]);
SetPlayerFacingAngle(playerid,Spieler[playerid][logPos][3]);
SendClientMessage(playerid,0xFFFFFF,"SERVER: Du wurdest an Deinen letzten Standpunkt gespawnt!");
}
So, das sollte alles gewesen sein.
Ich hoffe ich konnte nun dem ein oder anderen mit den Codes helfen.
Viele Grüße
#else
#e 1: Kleinen Fehler (Zeichen) behoben.
#e 2: Dini Codes hinzugefügt.
(Falls Fehler bei den Dini Nutzern auftreten oder die Funktionen falsch geschrieben sind: Sorry, aberich arbeite seit langem nicht mehr mit dini