Ja, das hast du zuvor schon gepostet.
Poste bitte mal dein ganzes OnDialogResponse, so wie es ist, wenn er nicht mehr kompiliert.
^
Ja, das hast du zuvor schon gepostet.
Poste bitte mal dein ganzes OnDialogResponse, so wie es ist, wenn er nicht mehr kompiliert.
^
Ok, eins nach dem anderen.
Speichern und Laden noch nicht richtig
Was genau funktioniert da nicht?
Was hast du denn vor? Red_Romeo hat dir die Lösung doch schon gepostet.
Was hast du damit gemacht?
Dann setze dort wo du dich registrierst und dort wo du einen neuen Charakter erstellen willst den Wert auf -1:
dini_Set(Spieler,"Skin","-1");
Und dann:
new Spieler[64];
new Sname[MAX_PLAYER_NAME];
GetPlayerName(playerid,Sname,sizeof(Sname));
format(Spieler,sizeof(Spieler),"/Accounts/%s.txt",Sname);
new skin = dini_Int(Spieler,"Skin");
if(fexist(Spieler) && skin != -1)
{
SetPVarInt(playerid,"Skin",skin);
SetSpawnInfo(playerid,0,skin,1766.2850,-1895.8571,13.5629,273.2245,0,0,0,0,0,0);
SpawnPlayer(playerid);
SetCameraBehindPlayer(playerid);
}
Wie zeigst du dem Spieler den Dialog an?
Ok, dann soll er es so ausprobieren.
forward CheckFeuer();
public CheckFeuer() {
printf("CheckFeuer aufgerufen. Feuer: %d | IsFWDuty: %d", Feuer, IsFWDuty());
if(Feuer == 1) return 1; // Falls ein Feuer vorhanden ist wird kein neues mehr erstellt
if(!IsFWDuty()) return 1; // Falls kein Feuerwehrmann OnDuty ist wird es übersprungen
printf("Erstelle Feuer.");
CreateFire(random(3));
return 1;
}
stock IsFWDuty() {
print("IsFWDuty aufgerufen.");
for(new i = 0;i < MAX_PLAYERS;i++) {
if(!IsPlayerConnected(i)) continue;
printf("Spieler %d: fwduty: %d", i, fwduty[i]);
if(fwduty[i]==1) return 1;
}
printf("Niemand.");
return 0;
}
ocmd:fwduty(playerid,params[]){
#pragma unused params
if(!IsPlayerInFrakt(playerid,12))return 1;
if(!IsPlayerInRangeOfPoint(playerid,5,feuerwehrdutypoint))return ErrorMsg(playerid,"Hier nicht.");
if(fwduty[playerid]==0)
{
//hier rein gehen
fwduty[playerid]=1;
printf("DUTYCHANGEON: Spieler %d -> %d", playerid, fwduty[playerid]);
SetPlayerSkin(playerid,277);
GivePlayerWeapon(playerid,3,1);
GivePlayerWeapon(playerid,42,10000000);
SetPlayerColor(playerid,COLOR_BRIGHTRED);
SetPVarInt(playerid,"feuerwehrduty",1);
format(string,sizeof(string),"HQ: %s hat den Feuerwehr-Dienst begonnen.",SpielerName(playerid));
feuerwehrMessage(COLOR_BLUE,string);
return 1;
}
if(fwduty[playerid]==1)
{
//hier aus dem dienst gehen
fwduty[playerid]=0;
printf("DUTYCHANGEOFF: Spieler %d -> %d", playerid, fwduty[playerid]);
Feuer = 0;
SetPlayerColor(playerid,COLOR_WHITE);
ResetPlayerWeapons(playerid);
format(string,sizeof(string),"HQ: %s hat den Feuerwehr-Dienst beendet.",SpielerName(playerid));
feuerwehrMessage(COLOR_BLUE,string);
SetPlayerSkin(playerid,SpielerInfo[playerid][Skin]);
}
return 1;
}
Genau nochmal die 5 Schritte machen, die du erklärt hast, und dann den Server Log posten, wenn das Feuer wieder fälschlicherweise ausbricht.
Bei OnPlayerRequestClass:
new Spieler[64];
new Sname[MAX_PLAYER_NAME];
GetPlayerName(playerid,Sname,sizeof(Sname));
format(Spieler,sizeof(Spieler),"/Accounts/%s.txt",Sname);
if(fexist(Spieler))
{
new skin = dini_Int(Spieler,"Skin");
SetPVarInt(playerid,"Skin",skin)
SetSpawnInfo(playerid,0,skin,1766.2850,-1895.8571,13.5629,273.2245,0,0,0,0,0,0);
SpawnPlayer(playerid);
SetCameraBehindPlayer(playerid);
}
Die ganzen AddPlayerClass's müssen zu OnGameModeInit.
Die Fehler sind aber nicht alle in diesem Code.
Versuche es so:
ocmd:creategutschein(playerid, params[])
{
if(PlayerInfo[playerid][pAdmin] <= 7)
{
new typx, wertx;
if(sscanf(params,"ii",typx,wertx))
{
SendClientMessage(playerid, 0xFF0000FF, "/createcode [Typ] [Wert]");
return SendClientMessage(playerid, 0xFF0000FF, "1 = Geld | 2 = Respektpunkte | 3 = Premium | 4 = UBB Fahrzeug");
}
if(typx < 1 || typx > 4)return SendClientMessage(playerid,-1,"Bitte wähle einen Typ aus von 1-4");
if(wertx < 1 || wertx > 1000000) return SendClientMessage(playerid,-1,"Wert bitte nur von 1 - 1Mio.");
new code[40], str[145];
format(code, sizeof(code), "%04d-%04d-%04d-%04d", random(10000), random(10000), random(10000), random(10000));
format(str, sizeof(str), "Gutscheincode : %s",code);
SendClientMessage(playerid,ROT,str);
format(code, sizeof(code), "/codes/%s.txt", code);
dini_Create(code);
dini_IntSet(code, "typ", typx);
dini_IntSet(code, "wert", wertx);
}
else
{
SendClientMessage(playerid, 0xFF0000FF, "Du hast kein Adminlevel 7");
}
return 1;
}
Das kann aber sein, dass die Warnungen durch einen der Errors auftreten und daher weiterhin da sind. Poste bitte die Codes zu den Errors.
Ich kapier das nicht so ganz
Poste bitte mal dein ganzes OnDialogResponse, so wie es ist, wenn er nicht mehr kompiliert.
Auf Anfrage in PN:
Also ich sehe an dem Code nichts falsches, das sieht gut aus.
Kannst du bitte erklären, welche Dinge du genau machst?
Du gehst OnDuty, dann wird nach X Minuten ein Feuer gelegt, du löschst es und gehst dann OffDuty?
Und dann kommt nach X Minuten wieder ein Feuer?
Mit dieser Meldung im Chat (bzw. eine der anderen beiden)?
SendClientMessageToAll(0xFFFFFFFF, "[Feueralarm] Ein {FF0000}Feuer{FFFFFF} brach in der {00FF00}LS Mall{FFFFFF} aus!");
Besteht das Problem noch, du hast nicht mehr geantwortet.
Falls ja, dann kann ich dir leider nicht weiterhelfen, ich wüsste keinen Grund mehr, der noch zu einem Absturz führen kann, da alles korrekt ist.
Was du machen kannst, was leider ein etwas größerer Aufwand ist, ist das Plugin upzudaten, sprich die R39-3 zu verwenden. Dann sollte das Problem nicht mehr auftreten (zuvor ein Backup machen!).
Beim Speichern fügst du das hinzu:
format(var, 32, "CarFuel=%d\n",PlayerCar[playerid][x][Fuel]);fwrite(hFile, var);
Beim Laden das:
if( strcmp( key , "CarFuel" , true ) == 0 ) { val = ini_GetValue( Data ); PlayerCar[playerid][x][Fuel] = strval( val ); }
Der Befehl an sich funktioniert. Wie viele Bans hast du denn? Wahrscheinlich klappt das Anlegen der Bans nicht richtig, sondern er schreibt es immer in ID 1 rein.
Das kannst du mit dieser Funktion herausfinden:
stock GetPosHinterVeh(vehicleid, Float:dist, &Float:x, &Float:y, &Float:z) //©Jeffry
{
new Float:a;
GetVehicleZAngle(vehicleid, a);
GetVehiclePos(vehicleid, x, y, z);
x += (-dist * floatsin(-a, degrees));
y += (-dist * floatcos(-a, degrees));
return true;
}
Den Checkpoint erstellst du dann einfach an der Position, die du zurück bekommst, sprich:
new Float:x, Float:y, Float:z;
GetPosHinterVeh(GetPlayerVehicleID(playerid), 3.0, x, y, z);
SetPlayerCheckPoint(playerid, x, y, z, 2.0);
Ich gehe mal davon aus, dass keine weitere BanID existiert, die die Bedingungen erfüllt.
Teste es so und poste dann was im Server Log steht:
new string[1400];
for(new i=0; i<sizeof(banInfo); i++)
{
printf("i: %d | id: %d | name: %d | typ: %d", i, banInfo[i][ban_id], strlen(banInfo[i][ban_name]), banInfo[i][ban_type]);
if(!banInfo[i][ban_id])continue;
if(!strlen(banInfo[i][ban_name]))continue;
if(banInfo[i][ban_type]!=1)continue;
format(string, sizeof(string),"%s-%s[%d]-\n",string,banInfo[i][ban_name],banInfo[i][ban_id]);
print(string);
}
ShowPlayerDialog(playerid,DIALOG_BanListe_Info,DIALOG_STYLE_LIST,"Normale Ban Liste",string,"Auswählen","Abbrechen");
PS: Lösche bitte den Doppelthread: Schleife geht nicht
FPS Zahl eines Spielers anzeigen?
Das passt alles.
Jetzt so:
Server aus machen
Server Log löschen
Tabelle in der Datenbank leeren
Server starten
Server aus machen
Server starten
Log posten
format(query,sizeof(query),"UPDATE user SET level='%i',money='%i',alevel='%i' WHERE id='%i",sInfo[playerid][level],sInfo[playerid][money],sInfo[playerid][alevel],sInfo[playerid][id]);
zu:
format(query,sizeof(query),"UPDATE user SET level='%i',money='%i',alevel='%i' WHERE id='%i'",sInfo[playerid][level],sInfo[playerid][money],sInfo[playerid][alevel],sInfo[playerid][id]);
Am Ende des Queries hat ein ' gefehlt.