Mivčo 90 Odesláno: 1. Duben, 2021 Share Odesláno: 1. Duben, 2021 Čaute mám problem ked zadam napr: "/setvip 0 3 99" čo znamená ID level a dni tak mi padne server??? jak to je možné a chybu nevidím alebo som slepí CMD:setvip(playerid, params[]) { if(IsPlayerConnected(playerid)) { new id = strval(params); new tarif = chrfind(' ',params)+1; new days = tarif+2; if(PlayerInfo[playerid][Admin] < 6) return SendClientMessage(playerid,-1,"{FF0000}[VIP] {FFFFFF}Nemas AdminLevel 6"); if(sscanf(params, "uii", id,tarif,days)) return SendClientMessage(playerid,COLOR_WARNING,"[ ! ] {FFFFFF}Použi: /setvip [ ID ] [ 0-3 ] [ 0-99 ]"); if(tarif < 0 || tarif > 3) return SendClientMessage(playerid,COLOR_WARNING,"[ ! ] {FFFFFF}Musiš použiť rozmetie medzi 0 až 3."); if(days < 0 || days > 99) return SendClientMessage(playerid,COLOR_WARNING,"[ ! ] {FFFFFF}Musiš použit dni medzi 0 až 99."); if(!IsPlayerConnected(id)) return SendClientMessage(playerid,COLOR_WARNING,"[ ! ] {FFFFFF}Hráč zo zadaným ID nieje na serveri !"); if(IsPlayerNPC(id)) return SendClientMessage(playerid,COLOR_WARNING,"[ ! ]{ffffff} Toto je NPC !"); if(tarif > 0) { new viptarif[16]; if(strval(params[tarif])==1) viptarif="Bronze"; else if(strval(params[tarif])==2) viptarif="Silver"; else if(strval(params[tarif])==3) viptarif="Gold"; else viptarif=" "; new string[256]; format(string, 256, "%s %s dal hráčovi %s VIP %s na %d dní !", GetAdminRank(playerid),PlayerName(playerid),PlayerName(id),viptarif,strval(params[days])); SendClientMessageToAll(COLOR_ADMIN, string); DOF2_SetInt(UserPath(id),"VIP_Tarif", strval(params[tarif])); DOF2_SetInt(UserPath(id),"VIP_Days", strval(params[days])); } else if(tarif == 0) { new string[128]; format(string, 128, "is %s odobral hráčovi %s VIP !", GetAdminRank(playerid),PlayerName(playerid),PlayerName(id)); SendClientMessageToAll(COLOR_ADMIN, string); DOF2_SetInt(UserPath(id),"VIP_Tarif",0); DOF2_SetInt(UserPath(id),"VIP_Days",0); DOF2_SetInt(UserPath(id),"VIP",0); DOF2_SetInt(UserPath(id),"VIP_Time",0); PlayerInfo[playerid][VIP]=0; SendClientMessage(id,COLOR_GOLD,"[ VIP ] Bol ti odobrán VIP Účet !"); } } return 1; } Link to comment Share on other sites More sharing options...
DuFF 85 Odesláno: 2. Duben, 2021 Share Odesláno: 2. Duben, 2021 Prečo kombinuješ chrfind a strval so sscanf? Keď parametre načítaš pomocou sscanf, žiadne chrfind a strval nemusíš ďalej riešiť a môžeš pracovať priamo s premennými, do ktorých ti sscanf uložil nájdené hodnoty parametrov. Link to comment Share on other sites More sharing options...
Scydo 397 Odesláno: 2. Duben, 2021 Share Odesláno: 2. Duben, 2021 (upraveno) Ty vole, kde jsi tohle vyhrabal? Už to tu padlo, ale kombinovat sscanf a jiné metody práce s parametry je skutečně nesmysl. První co, tak se vykašli na to, jestliže je hráč připojený při psaní příkazu, a celý příkaz si logicky přerovnej. Začneš tím, jestliže na to má vůbec oprávnění a až pak deklaruješ proměnné(nic k nim nepřidávej): if (PlayerInfo[playerid][Admin] < 6) return SendClientMessage(playerid,-1,"{FF0000}[VIP] {FFFFFF}Nemas AdminLevel 6"); new id, tarif, days; Dál rozdělení sscanfem a zjištění jestliže sedí parametry(specifikátor u v rozdělení ti umožní, že hráč nemusí psát pouze id ale může i nick hráče): if (sscanf(params, "uii", id,tarif,days)) return SendClientMessage(playerid,COLOR_WARNING,"[ ! ] {FFFFFF}Použi: /setvip [ ID/JMÉNO ] [ 0-3 ] [ 0-99 ]"); Teď máš jistotu, že hráč zadal 3 parametry, 3(nebo 2 a nick) čísla. Takže začneš logicky od prvního a to, jestliže ten hráč je vůbec online: if (!IsPlayerConnected(id)) return SendClientMessage(playerid,COLOR_WARNING,"[ ! ] {FFFFFF}Hráč zo zadaným ID nieje na serveri !"); Když to musí být, tak jestliže je NPC: if(IsPlayerNPC(id)) return SendClientMessage(playerid,COLOR_WARNING,"[ ! ]{ffffff} Toto je NPC !"); Rozmezí u tarifu a dní. if (tarif < 0 || tarif > 3) return SendClientMessage(playerid,COLOR_WARNING,"[ ! ] {FFFFFF}Musiš použiť rozmetie medzi 0 až 3."); if (days < 0 || days > 99) return SendClientMessage(playerid,COLOR_WARNING,"[ ! ] {FFFFFF}Musiš použit dni medzi 0 až 99."); Teď, jestliže chceš mít místo čísel jména těch tarifů, tak bych si určitě deklarovat ty jména globálně, a ne pokaždé přidával řetězec k řetězci. new viptarif[] = { "", "Bronze", "Silver", "Gold"}; Protože v rozmezí máš i nulu, tak nemusíš přidávat žádné další podmínky na čísla/přepínat, rovnou s tím pracuješ: (na ty jména můžeš použít rovnou podmíněný operátor[viz dole] a nebo jestliže to chceš mít přehlednější tak podmínku[tu použiju já]): tarif != 0 ? viptarif[tarif] : viptarif[0] sscanf už dává jistotu, že tarif a days jsou čísla, takže nemusíš nic konvertovat: new string[144 + 1]; // <--- stačí if (tarif != 0) format(string, sizeof string, "%s %s dal hráčovi %s VIP %s na %d dní !", GetAdminRank(playerid),PlayerName(playerid),PlayerName(id), viptarif[tarif], days); else format(string, sizeof string, "%s %s odebral hráčovi %s VIP!", GetAdminRank(playerid), PlayerName(playerid), PlayerName(id)); SendClientMessageToAll(COLOR_ADMIN, string); A jak jsem říkal, protože jsi započítal i nulu, můžeš u všeho přidat rovnou jeho nastavení. A taky jediné speciální co je, tak jestliže teda dostane VIP a na jak dlouho, ostatní je zbytečné ukládat: // To ti jen uloží již definované jméno(číslo/id), // takže je to zbytečné abys to ukládal: // DOF2_SetInt(UserPath(id),"VIP_Tarif", tarif); DOF2_SetInt(UserPath(id), "VIP_Days", days); // Nebo PlayerInfo[playerid][VIP] je level? if (days > 0) PlayerInfo[playerid][VIP] = 0; else PlayerInfo[playerid][VIP] = 1; DOF2_SetInt(UserPath(id), "VIP", PlayerInfo[playerid][VIP]); Edited 2. Duben, 2021 by Scydo Link to comment Share on other sites More sharing options...
mxco 55 Odesláno: 2. Duben, 2021 Share Odesláno: 2. Duben, 2021 No jo, ale to že si refaktorizuje kód (a změní pořadí ifů) mu neodpoví na otázku, proč mu padá server. Takže to s tím sscanf je jen jakési doporučení. Při těchto obtížích je potřeba prostě klasicky debugovat (odkomentovat části kódu, vložit printy do různých bloků vypisovat si hodnoty proměnných) Link to comment Share on other sites More sharing options...
DeLeTeCZ 17 Odesláno: 2. Duben, 2021 Share Odesláno: 2. Duben, 2021 (upraveno) Jeden z důvodů proč to může padat je pokud UserPath(id) vrací cestu k souboru který neexistuje. Edited 2. Duben, 2021 by DeLeTeCZ Link to comment Share on other sites More sharing options...
ATomas 291 Odesláno: 2. Duben, 2021 Share Odesláno: 2. Duben, 2021 před 4hodinami, mxco said: No jo, ale to že si refaktorizuje kód (a změní pořadí ifů) mu neodpoví na otázku, proč mu padá server. Takže to s tím sscanf je jen jakési doporučení. Při těchto obtížích je potřeba prostě klasicky debugovat (odkomentovat části kódu, vložit printy do různých bloků vypisovat si hodnoty proměnných) Nebo pouzit crashdetect, na test server idealni nastroj 1 Link to comment Share on other sites More sharing options...
Scydo 397 Odesláno: 2. Duben, 2021 Share Odesláno: 2. Duben, 2021 před 6hodinami, mxco said: No jo, ale to že si refaktorizuje kód (a změní pořadí ifů) mu neodpoví na otázku, proč mu padá server. Takže to s tím sscanf je jen jakési doporučení. A taky jsem nepsal, že znám jeho odpověď. Ten problém pádu ani nemusí být v tom kódě. Sázím na problém, jak píše @DeLeTeCZ a nebo, spíše, protože ten soubor nezavírá pomocí DOF2_SaveFile(); Nicméně určitě neuškodí zkrášlit ten kód a zlepšit jeho všeobecnou přehlednost ale hlavně funkčnost. Nebo snad ano? Link to comment Share on other sites More sharing options...
DuFF 85 Odesláno: 2. Duben, 2021 Share Odesláno: 2. Duben, 2021 (upraveno) před 11hodinami, mxco said: No jo, ale to že si refaktorizuje kód (a změní pořadí ifů) mu neodpoví na otázku, proč mu padá server. Takže to s tím sscanf je jen jakési doporučení. Při těchto obtížích je potřeba prostě klasicky debugovat (odkomentovat části kódu, vložit printy do různých bloků vypisovat si hodnoty proměnných) Momentálne tam má viditeľný array index out of bounds na riadkoch: format(string, 256, "%s %s dal hráčovi %s VIP %s na %d dní !", GetAdminRank(playerid),PlayerName(playerid),PlayerName(id),viptarif,strval(params[days])); DOF2_SetInt(UserPath(id),"VIP_Days", strval(params[days])); (napríklad ak zadám príkaz /setvip 0 3 99, strval(params[99]) určite nespraví nič dobré) Ak by sa držal doporučenia pracovať iba so sscanf, tento problém by odstránil a vedeli by sme, či pády spôsobovalo toto, alebo niečo iné. Edited 2. Duben, 2021 by DuFF 1 1 Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now