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