Szia!
Ahogy kérted leírom az észrevételeimet
A Belépés számláló szerintem nem jó így
A betöltés után növeld
public OnPlayerConnect(playerid)
{
new tag[MAX_PLAYER_NAME];
new kiad[42];
GetPlayerName(playerid,tag,sizeof(tag));
format(kiad,sizeof(kiad),\"Feljött a szerverre %s.\",tag);
SendClientMessageToAll(RED,kiad);
PlayerInfo[playerid][belepesek]++; // Növeled
format(kiad,sizeof(kiad),\"%s.ini\",tag);
SetSpawnInfo(playerid, 0, 0, 1958.33, 1343.12, 15.36, 269.15, 0, 0, 0, 0, 0, 0 );
SpawnPlayer(playerid);
if(dini_Exists(kiad))
{
PlayerInfo[playerid][szint] = dini_Int(kiad,\"Szint\");
PlayerInfo[playerid][Oles] = dini_Int(kiad,\"Ölés\");
PlayerInfo[playerid][Halal] = dini_Int(kiad,\"Halál\");
PlayerInfo[playerid][belepesek] = dini_Int(kiad,\"Belépések\"); // Felül írod a növelt értéket
PlayerInfo[playerid][Penz] = dini_Int(kiad,\"Pénz\");
}
return 1;
}
Itt s% van %s helyett: (65. sor, OnPlayerDisconnect alatt)
format(kiad,sizeof(kiad),\"Lelépett a szerverrõl s%\",tag);
1. kilépésnél csak létrehozza a fájlt és nem menti az adatokat...
if(dini_Exists(kiad))
{
dini_IntSet(kiad,\"Szint\", PlayerInfo[playerid][szint]);
dini_IntSet(kiad,\"Ölés\", PlayerInfo[playerid][Oles]);
dini_IntSet(kiad,\"Halál\", PlayerInfo[playerid][Halal]);
dini_IntSet(kiad,\"Belépések\", PlayerInfo[playerid][belepesek]);
dini_IntSet(kiad,\"Pénz\", PlayerInfo[playerid][Penz]);
}
else
{
dini_Create(kiad);
}
így próbáld meg:
// HA nem létezik a fájl AKKOR létrehozza
if(!dini_Exists(kiad)) { dini_Create(kiad); }
dini_IntSet(kiad,\"Szint\", PlayerInfo[playerid][szint]);
dini_IntSet(kiad,\"Ölés\", PlayerInfo[playerid][Oles]);
dini_IntSet(kiad,\"Halál\", PlayerInfo[playerid][Halal]);
dini_IntSet(kiad,\"Belépések\", PlayerInfo[playerid][belepesek]);
dini_IntSet(kiad,\"Pénz\", PlayerInfo[playerid][Penz]);
OnPlayerDeath alatt több dolgot is véltem feldefezni:
- kiad tömbbe 42 karakter fér 2 db 20 karakteres név + \" megölte \" + szöveg végi \\0 = 20 + 20 + 9 + 1 = 50, szóval lemarad 8 karakter a végéről
- játékos nevét tároló tömböknél MAX_PLAYER_NAME-et ajánlom, de ha nem azt írod akkor is 21-et írj, 20 karakter + szöveg végi \\0 = 21
- s% van %s helyett
- nem ellenőrzöd, hogy a gyilkos játékos e: (ebből több gond származik)
http://wiki.sa-mp.com/wiki/OnPlayerDeath\"You MUST check whether \'killerid\' is valid (not INVALID_PLAYER_ID) before using it in an array (or really anywhere), as it will cause the OnPlayerDeath script to crash (not the entire script). This is because INVALID_PLAYER_ID is defined as 65535, and if an array only has \'MAX_PLAYERS\' elements, e.g. 500, you\'re trying to access an index that is above 499, which is out of bounds.\"
- a halott kap ölést és a gyilkos halált a statba
new elo[20];
new halott[20];
new kiad[42];
format(kiad,sizeof(kiad),\"s% megölte %s\",elo,halott);
PlayerInfo[playerid][Oles]++;
PlayerInfo[killerid][Halal]++;
stringnek nem elég 42 cella ismét
itt a 128 belefér, mert 128 lehet a maximális parancs hossz és az egy sorban megjeleníthető szöveg is...
OnPlayerCommandPerformed:
new string[42];
format(string,sizeof(string),\"Nem létezik ez a parancs!(%s)\",cmdtext);
SendClientMessage(playerid,RED,string);
Minden if-nél bent van az ellenőrzés, pedig elég lenne 1x is ha az összes if elé beraknád
if(!IsPlayerInAnyVehicle(playerid)) return SendClientMessage(playerid,-1,\"Nem ülsz autóban.\");
OnDialogResponse:
if(dialogid == DIALOG_KOCSI)
{
if(response)
{
//if-ek
Nem kell mindenhova return 1; elég a dialog id ellenőrzés végére
if(dialogid == DIALOG_KOCSI)
{
if(response)
{
// ...
}
return 1;
}
Itt a 2 if helyett lehet if és else:
(!response helyett else)
if(dialogid == DIALOG_FELNI)
{
if(response)
// ...
if(!response)
// ...
}
helyett:
if(dialogid == DIALOG_FELNI)
{
if(response)
// ...
else
// ...
}
Ha egy szinttel feljebb kérdezed le a FELNIKNÉL a kocsit akkor nem kell minden if ágba beírnod
new kocsi = GetPlayerVehicleID(playerid);
így:
if(response)
{
new kocsi = GetPlayerVehicleID(playerid);
if(...)
// ...
A sok egymás alatti if, if, if, if, if helyett lehetne if, else if, else if, else if, else if VAGY switch
http://wiki.sa-mp.com/wiki/Control_Structures#else_ifhttp://wiki.sa-mp.com/wiki/Control_Structures#switch_2 new god[MAX_PLAYER_NAME];
helyett:
new god[MAX_PLAYERS];
Ez a parancs mindig a 0.0 0.0 0.0 pozícióra fog teleportálni:
Túl korán kéred le a pozíciót
CMD:goto(playerid,params[])
{
new Float:X,Float:Y,Float:Z;
new nevem;
GetPlayerPos(nevem,X,Y,Z);
if(sscanf(params,\"u\",nevem)) return SendClientMessage(playerid,RED,\"Használat:/goto <playerid/Névrészlet>\");
if(!IsPlayerConnected(nevem)) return SendClientMessage(playerid,-1,\"Nincs ilyen játékos.\");
SetPlayerPos(playerid,X,Y,Z);
return 1;
}
\"Átváltottad a skined erre:.\" + 3 szám + szöveg végi \\0 = 27+3+1 = 31
new kiad[42];
Az új sa-mp-vel jöttek új skinek, ezt majd módosítsd megfelelően
ha új verziót használsz
if(skin > 299 || skin < 0) return SendClientMessage(playerid,RED,\"Rossz Skin ID!\");
Itt enged perc-nek 60-at beírni, pedig 0-59-ig kellene
if(perc > 60 || perc < 0) return SendClientMessage(playerid,-1,\"Nincs ilyen perc.\");
ido parancs alatt:
nem elég a tömb cella, de itt most rád hagyom a matekot
new kiad[42];
format(kiad,sizeof(kiad),\"Átváltoztattad az idõd erre:%d óra és %d perc\",ora,perc);
A veh parancs alatt nincs ellenőrizve a szín és a jármű id, tehát akármilyen számot beírhatnak és ez gondot okozhat
Statikus szövegnél nem kell formázni
new kiad[42];
format(kiad,sizeof(kiad),\"Lekértél egy jármûvet!\");
SendClientMessage(playerid,-1,kiad);
helyett:
SendClientMessage(playerid,-1,\"Lekértél egy jármûvet!\");
A fegyverad parancsnál nincs ellenőrizve a fegyver id és a töltény szám akármilyen számot beírhatnak...
Eddig jól haladsz, további sok sikert