Airdrop Problem.

Započeo pokerface, Oktobar 28, 2019, 20:50:32 POSLE PODNE

prethodna tema - sledeća tema

0 članova i 1 gost pregledaju ovu temu.

Problem(error/warning): Glup sam da otkrijem gdje je problem. Naime, kada pritisnem tipku F objekt se ne uništava, a inaće objekt kad sleti kreira dva ista iz nekoga razloga.
Dio skripte: public OnObjectMoved(objectid)
{
switch(GetObjectModel(objectid))
{
    case 1681:
    {
        // Avion, kreiraj ga i unisti.
        foreach(new i : SupplyDrops)
        {
            if(SupplyData[i][planeObj] == objectid)
            {
                DestroyObject(SupplyData[i][planeObj]);
                SupplyData[i][planeObj] = -1;
                break;
            }
        }
    }

case 2975:
{
        // ovo je kutija ili drop, provjeri dali je kreiraj i unisti.
        foreach(new i : SupplyDrops)
        {
            if(SupplyData[i][boxObj] == objectid)
            {
                new Float: x, Float: y, Float: z;

                GetObjectPos(objectid, x, y, z);
                SupplyData[i][boxObj] = CreateDynamicObject(2975, x, y, z-0.1, 0, 0, 0, -1, -1, -1, 210.0, 0.0);
               
                SupplyData[i][dropLabel] = Create3DTextLabel("Supply Package\n(Press F to unpack)", -1, x, y, z+0.1, 40.0, 0, 0);

                DestroyObject(SupplyData[i][paraObj]); SupplyData[i][paraObj] = -1;
                SupplyData[i][dropTimer] = SetTimerEx("RemoveDrop", DROP_LIFE * 60000, false, "i", i);

                if(IsPlayerConnected(SupplyData[i][requestedBy])) SendClientMessage(SupplyData[i][requestedBy], 0x3498DBFF, "SUPPLY DROP: {FFFFFF}Drop complete.");
                break;
            }
        }
        }
    }

    return 1;
}
public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
{
    if(newkeys & KEY_SECONDARY_ATTACK)
{
    foreach(new i : SupplyDrops)
{
      new obb = SupplyData[i][boxObj];
    if(IsValidDynamicObject(obb))
{
new Float:oX, Float:oY, Float:oZ;
GetDynamicObjectPos(obb,oX, oY, oZ);
if(IsPlayerInRangeOfPoint(playerid, 5, oX, oY, oZ))
{
DestroyDynamicObject(SupplyData[i][boxObj]);
    SupplyData[i][boxObj] = -1;

Delete3DTextLabel(SupplyData[i][dropLabel]);
KillTimer(SupplyData[i][dropTimer]);

SupplyData[i][requestedBy] = SupplyData[i][dropTimer] = -1;
SupplyData[i][dropLabel] = Text3D: -1;

SendClientMessage(playerid, 0xFF9900AA, "* You're equipped from package containing:  Desert Deagle (120 ammo), Shotgun (80 ammo).");
GivePlayerWeapon(playerid, 24, 120); GivePlayerWeapon(playerid, 25, 80);

new next;
Iter_SafeRemove(SupplyDrops, i, next);
break;
}
}
}
}
return 1;
}

Debug iz server_log(ukoliko je u pitanju crashanje servera - crashdetect log): [ code ]vaš odgovor[ /code ]
Slika/video ingame problema(obavezno ako je ingame problem): link slike
Poslednja Izmena: Oktobar 28, 2019, 20:52:04 POSLE PODNE od M0nster
You'll be always in my heart, the end and thanks for amazing times. #WeAreLords

I zaboravio sam da napomenem. U trenutku kada pritisnem tipku F jedan objekt od tih dva ista se uništi a onda ostale taj jedan isti.
You'll be always in my heart, the end and thanks for amazing times. #WeAreLords

1. Koristiš OnObjectMoved, dakle koristiš obične objekte (CreateObject, MoveObject), a dole na F provjeravaš dinamične.
2. Kreiraš novi objekat pod OnObjectMoved, i zato ti se kreiraju dva objekta, OnObjectMoved ne uništava objekat, samo poziva callback da je MoveObject završen, ako želiš nešto da učiniš sa njime.

Riješenja:
1. Ako koristiš dinamične objekte, callback je OnDynamicObjectMoved.
2. if(SupplyData[boxObj] == objectid) ti je provjera na kraju micanja, a kreiraš taj objekat, probaj provjeru zamjeniti is boxObj u paraObj jer taj i uništavaš.


Ovdje sam gledao samo da odgovorim na taj problem što imaš, nisam gledao suštinski kod i da li ćeš mimo toga imati koji problem u sistemu, ali se da riješiti kada se riješi i to sa objektima.

Hvala na odgovoru, pokušati ću sutra pa javim rezultate.
You'll be always in my heart, the end and thanks for amazing times. #WeAreLords

Citat: Slade poslato Oktobar 28, 2019, 21:00:40 POSLE PODNE
1. Koristiš OnObjectMoved, dakle koristiš obične objekte (CreateObject, MoveObject), a dole na F provjeravaš dinamične.
2. Kreiraš novi objekat pod OnObjectMoved, i zato ti se kreiraju dva objekta, OnObjectMoved ne uništava objekat, samo poziva callback da je MoveObject završen, ako želiš nešto da učiniš sa njime.

Riješenja:
1. Ako koristiš dinamične objekte, callback je OnDynamicObjectMoved.
2. if(SupplyData[boxObj] == objectid) ti je provjera na kraju micanja, a kreiraš taj objekat, probaj provjeru zamjeniti is boxObj u paraObj jer taj i uništavaš.


Ovdje sam gledao samo da odgovorim na taj problem što imaš, nisam gledao suštinski kod i da li ćeš mimo toga imati koji problem u sistemu, ali se da riješiti kada se riješi i to sa objektima.

@Slade

1. Prebaci sam sve na obično kreiranje objeckta pa na dinamično nakon toga, a rezultat je isti. Nema promjerna.
2.  Stavio sam u case 2975: kod ispod. Ali onda kada dođem blize objekta F tipka ne reagira, jer naravno objeckt kao da ne postoji a tamo je.

DestroyObject(SupplyData[i][boxObj]); SupplyData[i][boxObj] = -1;

3. Ovo što si rekao za if(SupplyData[boxObj] == objectid) sam isto probao i stavio "paraObj", međutim objekt padobrana ostane a kutija nestane.
You'll be always in my heart, the end and thanks for amazing times. #WeAreLords

Napokon sam skontao gdje je problem. Samo sam uklonio

SupplyData[i][boxObj] = CreateObject(2975, x, y, z-0.1, 0, 0, 0, 210.0);

Lock.
You'll be always in my heart, the end and thanks for amazing times. #WeAreLords