BlAckNighT.:
Speicherst du das donatorAblauf auch in den Statistiken, und lädst du es auch wieder?
Wenn ja, poste mal wie du das machst, wenn nein, mach das noch.
Beiträge von Jeffry
-
-
Ich weiß nicht genau ob das das ist was du willst, aber versuche es mal so:
ocmd:carkey(playerid)
{
new mc = MaxVeh;
if(mc > 1)
{
new mvstring[800],save=Dtc_PlayerKey[playerid];
Dtc_PlayerKey[playerid] = 0;
for(new mv;mv<MaxVeh;mv++)
{
if(Dtc_PlayerHaveCar[playerid][Dtc_PlayerKey[playerid]])
{
format(mvstring,800,"%s\n%s",mvstring,CarName[PlayerCar[playerid][Dtc_PlayerKey[playerid]][CarModel]-400]);
Dtc_PlayerKey[playerid]++;
}
else
{
format(mvstring,800,"%s\nFrei",mvstring);
}
}
ShowPlayerDialog(playerid,DIALOG_CARKEYS,DIALOG_STYLE_LIST,"Autoschlüssel",mvstring,"Auswählen","Abbrechen");
Dtc_PlayerKey[playerid]=save;
}
return 1;
}Wenn das nicht das ist was du willst, erkläre bitte genauer was du haben willst.
-
public PlayerCarUpdate(playerid)
{
if(IsPlayerNPC(playerid)) return 1;
new string[2048], playername[MAX_PLAYER_NAME];
GetPlayerName(playerid, playername, sizeof(playername));
for(new h = 0; h < MaxVeh[playerid]; h++)
{
format(string, sizeof(string), "UPDATE `cars` SET `ingarage`=%i,`AH_Typ`=%i,`AH_X`='%f',`AH_Y`='%f',`AH_Z`='%f',`AH_Rot`='%f',`AH_Status`=%i,`AH_Lock`=%i,`AH_Paintjob`=%i,`Farbe1`=%i,`Farbe2`=%i,`AH_mod1`=%i,`AH_mod2`=%i,`AH_mod3`=%i,`AH_mod4`=%i,`AH_mod5`=%i,`AH_mod6`=%i,`AH_mod7`=%i,`AH_mod8`=%i,`AH_mod9`=%i,`AH_mod10`=%i,`AH_mod11`=%i,`AH_mod12`=%i,`AH_mod13`=%i,`AH_mod14`=%i,`AH_mod15`=%i,`AH_mod16`=%i,`AH_mod17`=%i,",
Carlist[playerid][h][ingarage],Carlist[playerid][h][Typ],Carlist[playerid][h][pos_x],Carlist[playerid][h][pos_y],Carlist[playerid][h][pos_z],
Carlist[playerid][h][z_angle],Carlist[playerid][h][Status],Carlist[playerid][h][Lock],Carlist[playerid][h][Paintjob],
Carlist[playerid][h][Farbe1],Carlist[playerid][h][Farbe2],Carlist[playerid][h][mod1],Carlist[playerid][h][mod2],
Carlist[playerid][h][mod3],Carlist[playerid][h][mod4],Carlist[playerid][h][mod5],Carlist[playerid][h][mod6],
Carlist[playerid][h][mod7],Carlist[playerid][h][mod8],Carlist[playerid][h][mod9],Carlist[playerid][h][mod10],
Carlist[playerid][h][mod11],Carlist[playerid][h][mod12],Carlist[playerid][h][mod13],Carlist[playerid][h][mod14],
Carlist[playerid][h][mod15],Carlist[playerid][h][mod16],Carlist[playerid][h][mod17]);format(string, sizeof(string),"%s`AH_SpawnSaveX`=%f,`AH_SpawnSaveY`='%f',`AH_SpawnSaveZ`='%f',`AH_SpawnSaveRot`='%f',`AH_TankVolumen`=%i,`AH_Mats`=%i,`AH_Neon`=%i,`AH_NeonType`=%i,`AH_Drugs`=%i,`AH_StandTime`=%i,`AH_Meter`=%i WHERE `sqlid`=%i AND `carkey`=%i",
string, Carlist[playerid][h][SpawnSaveX],Carlist[playerid][h][SpawnSaveY],Carlist[playerid][h][SpawnSaveZ],
Carlist[playerid][h][SpawnSaveRot],Carlist[playerid][h][TankVolumen],Carlist[playerid][h][cMats],
Carlist[playerid][h][Neon],Carlist[playerid][h][NeonType],Carlist[playerid][h][cDrugs],Carlist[playerid][h][StandTime],
Carlist[playerid][h][Meter],PlayerInfo[playerid][pSQLID],h);self_mysql_query(string);
}
return 1;
}So, hab die Versicherung rausgenommen.
-
In dem Code von /creport findet sich die letzte Meldung im Chat gar nicht. Hast du dich vertippt, oder ist der Code mittlerweile anders?
-
forward OnGamemodeInit();
fehlt.Oder:
public OnGamemodeInit(){
zu:
public OnGameModeInit(){
(Ebenso bei den defines.)Je nach dem was du willst.
-
Erstelle dir doch mal einen Befehl, mit dem du dir das Admin Level geben kannst, einfach nur /test => Setzt die AdminLevel Variable auf 10.
Funktioniert es dann? -
Gibst du dir das Adminlevel manuell über die Datei, oder per Befehl? Poste ggf. den Befehl.
Du sollst den ganzen Code der bei OnPlayerUpdate steht weg machen, und in einen Timer packen, der alle 5 Minuten aufgerufen wird, und durch OnPlayerDisconnect aufgerufen wird, da du sonst den Spieler bis zu 50x pro Sekunde (!) speicherst.
-
Jetzt mal Schritt für Schritt:
Wenn du dich registrierst: Hast du dann ein Passwort in der Spielerdatei stehen? (Ja/Nein)
Wenn du dann den Server verlässt und wieder betrittst: Kannst du dich nur mit deinem Passwort einloggen? (Ja/Nein->Was noch?)
Steht das Passwort dann noch in der Datei, oder ist es nach dem relog weg?Übrigens: Nimm das Speichern des Spielers bei OnPlayerUpdate raus, das zerlegt dir irgendwann den Server. Der muss ja zwischen 20 und 50 mal pro Sekunde (!) deine ganzen Stats speichern, das ist viel zu viel. Es reicht, wenn du einen Timer machst, der das alle 5 Minuten speichert, und bei OnPlayerDisconnect.
-
Ich kann dir das Scripten nicht in aller Einzelheit erklären, daß ist auch nur schwer möglich, für jeden, denn das ist einfach so viel, das kann man einem nur schwer beibringen, aber ich gebe dir ein paar gute Tipps wie du dir es selbst sehr gut beibringen kannst, so habe ich es zumindest vor über 5 Jahren gelernt (von null an).
Du solltest dich zu aller erst mit den Grundlagen der Programmierung beschäftigen, bevor du anfängst einen vorhandenen Gamemode zu "vergewaltigen", dazu gehört nämlich ein Grundwissen, welches man sich zuerst aufbauen muss.
Ich erkläre dir mal wie du am besten lernen kannst, damit du in Zukunft auch verstehst, was ein Code ist, und wann du welchen Code benutzen musst.
Also ich habe PAWN gelernt, indem ich mir den LAdmin4v2 (damals sehr neu) genommen habe, und versucht habe, die einzelnen Teile zu verstehen. Dann habe ich einfach losgelegt, und überlegt, welcher Teil das tut, was ich will. Den Code hab ich mir dann angeschaut, und so für den neuen Code verändert, dass er seinen Zweck erfüllt hat.
Wichtig: Fang klein an, jeder tut das, nimm nicht gleich einen Gamemode und verunstalte den, du wirst nichts kapieren. Ich arbeite nun über 5 Jahre mit PAWN und mein Wissen ist noch lange nicht komplett, im Gegenteil.
Falls dir jemand sagt, du sollst dir die PAWN Doc durchlesen, lass es, genauso rate ich dir davon ab das wiki in allen Einzelteilen durchzulesen. Du wirst es nicht verstehen. Das kannst du in 3 Jahren machen, wenn du es verstehst, und selbst dann wirst du den Großteil in der Pawn Doc nicht auf Anhieb verstehen.Noch was: Ausprobieren. Du kannst nichts kaputt machen. Das einzige was passieren kann, ist dass du Errors bekommst. Na und? Für was gibt es STRG+Z. Einfach probieren, wenn du nicht weiter kommst, lass es, oder frag nach Hilfe, sofern es im kleinen Bereich ist.
Learning By Doing nennt sich das. Nicht aufgeben, einfach machen machen machen. Das muss nicht immer perfekt sein, und muss auch nicht immer Sinn ergeben, hauptsache du machst was. Zum Anfang kannst du dir z.B. vornehmen, einen FilterScript der hier im Forum veröffentlicht wurde (einen einfachen) nachzumachen. Musst ihn ja nicht auch veröffentlichen, aber nur zur Übung einfach nachmachen. Wenn du hängst, kannst du ja nachsehen, was falsch ist.
Meiner Meinung nach besser als alles andere.
Wie machst du das?
Du suchst dir einen Filterscript der irgendwas macht, sei es ein Auto Spawn Menu.
Schau dir zuerst mal an, was der FilterScript denn machst (z.B. ein Auto-Menu, um Auto's zu spawnen). Dann überlegst du, was du denn alles dafür brauchst, suchst dir die Funktionen zusammen (Google, SAMP Wiki) und legst los so ein Menu zu erstellen. Wenn du irgendwo hängst, kannst du einen Blick in den Code werfen, und ein paar Zeilen, die du denkst zu verstehen abschreiben, dann siehst du ja was passiert.
Am Besten ist es aber, wenn du es ganz ohne in den Code zu schauen hin bekommst, deshalb fang mit leichten Dingen an.
Bis du erst mal richtig rein findest vergehen mit Sicherheit 1-3 Monate! Also nicht verzagen, du wirst am Anfang ziemlich oft stecken bleiben und auf die Nase fallen (ist wie laufen lernen). Ich weiß das von mir. Wenn du einmal drinne bist, dann gehts jeden Tag besser.PS: Ich hab es ganz alleine gelernt. Die einzige Hilfestellung die ich damals hatte war ein /kill Command aus 6 Zeilen code, den mir jemand gemacht hat. Den gebe ich dir auch:
if(strcmp(cmdtext, "/kill", true) == 0)
{
SetPlayerHealth(playerid, 0.0);
SendClientMessage(playerid, 0xFF0000FF, "Du hast dich selbst getötet.");
return 1;
}
Probiere aus, mit diesem Code klar zu kommen, versuche das Prinzip zu verstehen.
Das fügst du im callback OnPlayerCommandText ein. Dann auf den Compiler drücken, und Server neu starten.
Wenn du damit klar kommst, gehe weiter und versuche Dinge selbst zu erstellen.Und am wichtigsten: Immer dranbleiben!
Viel Erfolg! -
Wie stellst du es auf diese Zeit? Hast du vielleicht das +gettime() vergessen?
-
new t=Spieler[playerid][pPremiumAblauf]-gettime();
new d=t/86400;
t-=d*86400;
new h=t/3600;
t-=h*3600;
new m=t/60;
new str[145];
format(str, sizeof(str), "Du hast noch %d Tage %d Stunden und %d Minuten.", d, h, m);
SendClientMessage(playerid, Farbe, str); -
INT passt. Du speicherst es ja in eine Integer Variable, nicht dass es da irgendwelche Probleme gibt.
-
Wenn die Zeit vorbei ist, ja.
Steht ja hier:
Spieler[i][pPremiumAblauf] = 0;Was du noch machen kannst:
Bei LoginPlayer (dort wo die Spielerstatistiken geladen werden):
CheckDonators();
Damit es keine Verzögerungen gibt.PS: Zitiere bitte nicht ganze Posts mit Code, das macht den Thread unübersichtlich.
-
Erstelle einen globalen Timer, der jede Minute aufgerufen wird:
SetTimer("CheckDonators", 60000, true);forward CheckDonators();
public CheckDonators()
{
for(new i=0; i<MAX_PLAYERS; i++)
{
if(!IsPlayerConnected(i) || Spieler[i][pPremium] == 0) continue;
if(Spieler[i][pPremiumAblauf] < gettime())
{
Spieler[i][pPremiumAblauf] = 0;
Spieler[i][pPremium] = 0;
}
}
return 1;
} -
Setzt du vorher vielleicht die Variable schon zurück? Lass dir mal den Float Wert von dem kubik mit in der Nachricht ausgeben (%f), was steht dann da als Wert? Wenn da auch 0 steht, dann setzt du es zuvor irgendwo auf 0.
-
Ok, ich glaube ich hab das Prinzip verstanden.
Schreib es mal so:
Spoiler anzeigen public OnPlayerEnterDynamicCP(playerid, checkpointid)
{
if(checkpointid == bmxo[playerid])
{
SetPlayerAttachedObject(playerid,0,1264,6,0.165999,0.003000,-0.184999,0.000000,0.000000,0.000000,0.498999,0.466999,0.489000);
ApplyAnimation(playerid,"CARRY","liftup",4.1,0, 0, 0, 1, 1);
ClearAnimations(playerid,1);
SetPlayerSpecialAction(playerid,25);
new Float:vX,Float:vY,Float:vZ;
GetPosVorVeh(pMuellAuto[playerid], -5.0, vX, vY, vZ);
DestroyDynamicCP(bmxo[playerid]);
bmxo[playerid] = -1;
fahrzeug[playerid] = CreateDynamicCP(vX,vY,vZ,4.0,-1,-1,playerid,30.0);
TogglePlayerDynamicCP(playerid,fahrzeug[playerid],1);
new rand1 = 5+random(3);
muellsacke[pMuellAuto[playerid]] = rand1;
return 1;
}
else if(checkpointid == fahrzeug[playerid])
{
if(kubik[pMuellAuto[playerid]] == 5.0)
{
SendClientMessage(playerid,COLOR_RED,"Das Fahrzeug ist voll, benutze /garbagestop");
ClearAnimations(playerid,1);
SetPlayerSpecialAction(playerid,0);
RemovePlayerAttachedObject(playerid, 0);
kubik[pMuellAuto[playerid]] = 0;
DestroyDynamicCP(fahrzeug[playerid]);
fahrzeug[playerid] = -1;
}
else
{
if(muellsacke[pMuellAuto[playerid]] == 1)
{
muellsacke[pMuellAuto[playerid]] = 0;
ClearAnimations(playerid,1);
SetPlayerSpecialAction(playerid,0);
RemovePlayerAttachedObject(playerid, 0);
DestroyDynamicCP(fahrzeug[playerid]);
fahrzeug[playerid] = -1;
kubik[pMuellAuto[playerid]] += 0.5;
new rand = random(sizeof(bmx1));
bmxo[playerid] = CreateDynamicCP(bmx1[rand][0],bmx1[rand][1],bmx1[rand][2],5.0,-1,-1,playerid,1000.0);
return 1;
}
else
{
new string[123],string2[123];
ClearAnimations(playerid,1);
SetPlayerSpecialAction(playerid,0);
kubik[pMuellAuto[playerid]] += 0.5;
muellsacke[pMuellAuto[playerid]] -= 1;//HIER
RemovePlayerAttachedObject(playerid, 0);
format(string,sizeof(string),"Kubik: %0.1f/15.0",kubik[pMuellAuto[playerid]]);
SendClientMessage(playerid,COLOR_LIGHTBLUE,string);
format(string2,sizeof(string2),"Müllsäcke: %d",muellsacke[pMuellAuto[playerid]]);
SendClientMessage(playerid,COLOR_LIGHTBLUE,string2);
DestroyDynamicCP(fahrzeug[playerid]);
fahrzeug[playerid] = -1;
bmxo[playerid] = CreateDynamicCP(globalVar[playerid][0],globalVar[playerid][1],globalVar[playerid][2],4.0,-1,-1,playerid,30.0);
return 1;
}
}
}
return 1;
}EDIT:
Gazette: Ich habe den Fehler bereits behoben, kopiere es nochmal. -
Kennt jemand vielleicht ein sehr kleinen Whirlpool für Interiors?
Soviel ich weiß gibt es das nicht.
Aber Badewannen: 2516 / 2519 / 2522 / 2526 sowie 2097 (etwas ausgefallenes Design). -
Wie sieht es so aus?
Spoiler anzeigen new fahrzeug[MAX_PLAYERS] = {-1,...};
new bmxo[MAX_PLAYERS] = {-1,...};
new muellsacke[MAX_VEHICLES];Spoiler anzeigen public OnPlayerEnterDynamicCP(playerid, checkpointid)
{
if(checkpointid == bmxo[playerid])
{
SetPlayerAttachedObject(playerid,0,1264,6,0.165999,0.003000,-0.184999,0.000000,0.000000,0.000000,0.498999,0.466999,0.489000);
ApplyAnimation(playerid,"CARRY","liftup",4.1,0, 0, 0, 1, 1);
ClearAnimations(playerid,1);
SetPlayerSpecialAction(playerid,25);
new Float:vX,Float:vY,Float:vZ;
GetPosVorVeh(pMuellAuto[playerid], -5.0, vX, vY, vZ);
DestroyDynamicCP(bmxo[playerid]);
bmxo[playerid] = -1;
fahrzeug[playerid] = CreateDynamicCP(vX,vY,vZ,4.0,-1,-1,playerid,30.0);
TogglePlayerDynamicCP(playerid,fahrzeug[playerid],1);
return 1;
}
else if(checkpointid == fahrzeug[playerid])
{
if(kubik[pMuellAuto[playerid]] == 5.0)
{
SendClientMessage(playerid,COLOR_RED,"Das Fahrzeug ist voll, benutze /garbagestop");
ClearAnimations(playerid,1);
SetPlayerSpecialAction(playerid,0);
RemovePlayerAttachedObject(playerid, 0);
kubik[pMuellAuto[playerid]] = 0;
DestroyDynamicCP(fahrzeug[playerid]);
fahrzeug[playerid] = -1;
}
else
{
if(muellsacke[pMuellAuto[playerid]] == 0)
{
new rand1 = 5+random(3);
muellsacke[pMuellAuto[playerid]] = rand1;
return 1;
}
else if(muellsacke[pMuellAuto[playerid]] == 1)
{
muellsacke[pMuellAuto[playerid]] = 0;
ClearAnimations(playerid,1);
SetPlayerSpecialAction(playerid,0);
RemovePlayerAttachedObject(playerid, 0);
DestroyDynamicCP(fahrzeug[playerid]);
fahrzeug[playerid] = -1;
kubik[pMuellAuto[playerid]] += 0.5;
new rand = random(sizeof(bmx1));
bmxo[playerid] = CreateDynamicCP(bmx1[rand][0],bmx1[rand][1],bmx1[rand][2],5.0,-1,-1,playerid,1000.0);
return 1;
}
else
{
new string[123],string2[123];
ClearAnimations(playerid,1);
SetPlayerSpecialAction(playerid,0);
kubik[pMuellAuto[playerid]] += 0.5;
muellsacke[pMuellAuto[playerid]] -= 1;//HIER
RemovePlayerAttachedObject(playerid, 0);
format(string,sizeof(string),"Kubik: %0.1f/15.0",kubik[pMuellAuto[playerid]]);
SendClientMessage(playerid,COLOR_LIGHTBLUE,string);
format(string2,sizeof(string2),"Müllsäcke: %d",muellsacke[pMuellAuto[playerid]]);
SendClientMessage(playerid,COLOR_LIGHTBLUE,string2);
DestroyDynamicCP(fahrzeug[playerid]);
fahrzeug[playerid] = -1;
bmxo[playerid] = CreateDynamicCP(globalVar[playerid][0],globalVar[playerid][1],globalVar[playerid][2],4.0,-1,-1,playerid,30.0);
return 1;
}
}
}
return 1;
}
Ich verstehe allerdings den Sinn von dem 5+random(3) Abschnitt nicht. Wann soll der aufgerufen werden?
-
Was sagt der MySQL Log?
PS: Kannst du bitte nicht immer meinen ganzen Post samt allen Codes zitieren? Das macht den Thread ziemlich unübersichtlich.
Danke. -
format(var, 32, "Key=%s\n", PlayerInfo[playerid][pKey]);fwrite(hFile, var);
zu:
format(var, 32, "Key=%s\n", password);fwrite(hFile, var);Steht dann was in der Datei?