Jump to content

Eroare in fisierul .AMX


Andronache

Recommended Posts

Salutare. Am si eu o eroare super stupida si nu inteleg deloc de ce imi tot apare eroarea asta.

Eroarea arata asa in consola jocului:

[debug] Run time error 4: "Array index out of bounds"
[debug]  Accessing element at negative index -1
[debug] AMX backtrace:
[debug] #0 0008539c in ?? (0, 1,8) from rg3.amx
[debug] #1 000083ac in public OnPlayerStateChange (0, 1,8) from rg3.amx

Am incercat sa vad care e problema, m-am uitat in comenzile de la taxi ca initial credeam ca de la comanda [/fare] apare eroarea, am rezolvat un bug de la /fare de care imi era lene crezand ca era ala, tot nu, am umblat si la OnPlayerStateChange la tot codul de acolo, nu inteleg ce are. Imi dau seama doar ca e ceva extrem de simplu si nu imi dau seama. Sunt incepator la capitolul pawno, "scriptez" doar ca sa exersez momentan. Am mai vazut ca mai era la cineva din afara problema asta doar ca era pe OnPlayerDeaths parca si trebuia sa declare un array, doar ca la mine nu stiu daca e neaparata nevoie. In fine, astea nu sunt detaliile importante, dupa ce am rezolvat problemele de la comanda /fare, am observat ca de fapt problema apare abia dupa ce dau /respawn. M-am uitat si in comanda aia, nimic, e aceeasi comanda pe care o aveam de la inceput. Ideea e ca eroarea nu strica cu nimic serverul sau jocul, nu se inchide sau ceva, merge totul cum trebuie doar ca apare eroarea aia in consola si ma enerveaza si vreau sa o rezolv. Putin ajutor? 

 

 

Link to comment
Share on other sites

Uhm. Ca inceput, creaza un fisier pawn.cfg (trebuie sa aibe exact exstensia .cfg) si scrie in el -d3 si reprodu bugu(desigur recompile la gm). Asta iti va oferi exact linia de la care provine eroarea

Acum, din eroarea ta imi dau seama ca se incearca acesarea unui array cu o alta variabila care e -1 care presupun ca are legatura cu playerid cel mai probabil

Link to comment
Share on other sites

@Andronache Bun. Rolul acelui pawn.cfg cu -d3 in el este de a exstinde informatiile despre erorile de tip run time error adaugand numarul liniei la care eroarea se produce

Erorile vor aparea normal ca si inainte, in consola, doar ca vor contine nu numar (nu sunt 100% sigur daca iti va scrie gen "on line x" ) care semnifica linia erori din respectivul script scutindu-te pe tine de mult timp pierdut cautand o eroare intr-un imens gm

Ti-am atasat un astfel de fisier la acest reply. Erorile nu vor aparea in acel fisier. Deasemena, da va trebui sa dai dinou compile la gm dupa sa dai restart la server si sa reproduci pasi care au dus la acea eroare

pawn.cfg

Link to comment
Share on other sites

@Banditul Am incercat sa fac ce mi-ai zis, am creat fisierul pawn.cfg, am pus -d3 dupa care codul de la OnPlayerStateChange, am recompilat GM, am deschis serverul am reprodus bugul dar nici in notepad nici in consola nu imi arata nimic legat de linia unde ar trebui sa fie problema. Am avut fisieru .cfg si in folderu general al gm-ului si in folderol "gamemodes", am facut ceva gresit?

Link to comment
Share on other sites

Acum 48 minute, Andronache a spus:

@Banditul Am incercat sa fac ce mi-ai zis, am creat fisierul pawn.cfg, am pus -d3 dupa care codul de la OnPlayerStateChange, am recompilat GM, am deschis serverul am reprodus bugul dar nici in notepad nici in consola nu imi arata nimic legat de linia unde ar trebui sa fie problema. Am avut fisieru .cfg si in folderu general al gm-ului si in folderol "gamemodes", am facut ceva gresit?

Ai si pluginul crashdetect pus in servercfg? Deasemenea imi poti face un screenshot la folderul pawno in care sa apara si acel pawn.cfg?

Pentru ca in monentul in care iti aparea eroarea(cea din primul post) trebuie sa apara si un numar indicand numarul liniei

Link to comment
Share on other sites

Pana la urma am reusit sa il fac sa imi arate care sunt liniile, dar nu inteleg de ce nu merge, adica imi arata problema la onstatechange la comanda fare care e asa de la inceput si a mers de la inceput

si acum nu imi merge si imi mai arata la ceva dstock declarat la inceputul gm-ului care iarasi asa era de la bun inceput

 

Link to comment
Share on other sites

Pana la urma am reusit sa il fac sa imi arate care sunt liniile, dar nu inteleg de ce nu merge, adica imi arata problema la onstatechange la comanda fare care e asa de la inceput si a mers de la inceput

si acum nu imi merge si imi mai arata la ceva dstock declarat la inceputul gm-ului care iarasi asa era de la bun inceput. 

 

Liniile la care imi arata eroare: 1.     while (start++ != end) (in folderul pawno/includes/YSI/y_hooks/impl.inc:     while (start++ != end)            2. Asta e din gamemode new money = floatround(TaxiDist[playerid])/100*FarePrice[TaxiDriver[playerid]];

Edited by Andronache
Link to comment
Share on other sites

Acum 3 minute, Andronache a spus:

Pana la urma am reusit sa il fac sa imi arate care sunt liniile, dar nu inteleg de ce nu merge, adica imi arata problema la onstatechange la comanda fare care e asa de la inceput si a mers de la inceput

si acum nu imi merge si imi mai arata la ceva dstock declarat la inceputul gm-ului care iarasi asa era de la bun inceput. 

 

Liniile la care imi arata eroare: 1. new PlayerText:     DSModel;            2.  new money = floatround(TaxiDist[playerid])/100*FarePrice[TaxiDriver[playerid]];

In cazul asta, problema poate sa fie de la TaxiDriver[playerid] cel mai probabil are valoarea -1 cand ajunge acolo.

Ce poti incerca sa faci e 

new money;

if(TaxiDriver[playerid] != -1)

{

money = floatround(TaxiDist[playerid])/100*FarePrice[TaxiDriver[playerid]];

}

Astfel te asiguri ca are valoare corecta, si anume face referire la un player

Link to comment
Share on other sites

Tot nu merge, acum da eroare pe linia 7783 si 1101 din include-uri. Iti las codul de la OnPlayerStateChange de la comanda fare aici, eu nu imi dau seama ce e gresit:
 

 

 

  if(newstate == PLAYER_STATE_ONFOOT)


    {
        new gString[256];
        if(PlayerData[playerid][OnDuty] == 1 && PlayerData[playerid] + PlayerData[playerid][Leader] == ?
        {
            PlayerData[playerid][OnDuty] = 0;
            FarePrice[playerid] = 0;
            format(gString, sizeof(gString), "You are now Off Duty and earned $%s.", FormatNumber(DriverMoney[playerid]));
            SendClientMessage(playerid, COLOR_YELLOW, gString);
            GivePlayerCash(playerid,DriverMoney[playerid]);
            DriverMoney[playerid] = 0;
            if(Taxi > 0) Taxi--;
            foreach(Player, i)
            {
                if(TaxiDriver == playerid)
                {
                    TaxiDriver = -1;
                    TaxiDist = 0.0;
                    for(new j = 0; j <= 3; j++) PlayerTextDrawHide(i, TaxiTD[j]);
                }
            }
        }
        if(PlayerData[playerid][OnDuty] != -1)
        {
            new money;
            if(TaxiDriver[playerid] != -1)
            {
                money = floatround(TaxiDist[playerid])/100*FarePrice[TaxiDriver[playerid]];
            }
            format(gString, sizeof(gString), "~w~The ride cost~n~~r~$%s",FormatNumber(money));
            GameTextForPlayer(playerid, gString, 5000, 1);
            format(gString, sizeof(gString), "~w~Passenger left the taxi~n~~g~Earned $%s",FormatNumber(money));
            GameTextForPlayer(TaxiDriver[playerid], gString, 5000, 1);
            GivePlayerCash(playerid, -money);
            DriverMoney[TaxiDriver[playerid]] += money;
            TaxiDriver[playerid] = -1;
            TaxiDist[playerid] = 0.0;
            for(new i = 0; i <= 3; i++) PlayerTextDrawHide(playerid, TaxiTD[playerid]);

            format(gString, sizeof(gString), "Jucatorul %s transportat la destinatie pentru %s$", GetName(playerid),FormatNumber(money));
        }
    }

 

 

Asta e de la fisierul impl.inc din folderol y_hooks

 

 

LATER EDIT: Cred ca mi-am dat seama de la ce e, la partea aia cu comanda /fare, primu spoiler, dupa drivermoney[taxidriver[playerid]]+=money; taxidriver a primit valoarea -1, asta insemna ca te scotea de pe lista de soferi pe tine ca player, din ce am vazut, iar asta cauza eroarea, am lasat cu 1 taxidriver[playerid] si acum nu mai da eroare.

EDIT 2: Acum iti ia bani si ca taximetrist daca te dai jos din masina. Prea multe buguri pe o singura comanda

 

 public OnPlayerStateChange(playerid, newstate, oldstate)


{
    P:2("Hooks_OnPlayerStateChange called: %d, %d, %d", playerid, newstate, oldstate);
    new
        end   = _:YSI_g_sCallbackEnd[ALS_OnPlayerStateChange],
        start = _:YSI_g_sCallbackStart[ALS_OnPlayerStateChange],
        ret = ALS_R_PlayerStateChange;
    while (start++ != end)
    {
        #emit PUSH.S oldstate
        #emit PUSH.S newstate
        #emit PUSH.S playerid
        #emit PUSH.C     12
        #emit CONST.alt  YSI_g_sCallbackAddresses
        #emit LOAD.S.pri start
        //#emit INC.pri
        //#emit STOR.S.pri start
        #emit LIDX
        #emit MOVE.alt
        #emit LCTRL      6
        #emit ADD.C      24
        #emit PUSH.pri
        #emit MOVE.pri
        #emit SCTRL      6
        #emit MOVE.alt
        #emit CONST.pri  0xFFFFFFFE
        #emit AND
        #emit PUSH.pri
        #emit LOAD.S.pri ret
        #emit AND
        #emit POP.alt
        #emit OR
        #emit STOR.S.pri ret
        if (ret < 0) return ret + 1;
    }
    return ret;
}
#if defined _ALS_OnPlayerStateChange
    #undef OnPlayerStateChange
#else
    #define _ALS_OnPlayerStateChange
#endif
#define OnPlayerStateChange S@@_OnPlayerStateChange
HOOK_FORWARD<PlayerStateChange>

Edited by Andronache
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. For more details you can also review our Terms of Use and Privacy Policy.