Jump to content

Probleempje met maken/verwijderen objecten


Ymosky

Recommended Posts

Noes... zit al de hele avond te prutsen, en heb het gevoel dat ik nog steeds niks nuttigs gedaan heb... :D

Ik had het volgende geniale ( :7 ) idee:

Die objectstreamers e.d. ben ik al tijden hardstikke beu, bugs, ze kunnen niet samenwerken met elkaar en met het script... en de streamers zelf zijn me zo helder als koffiedik (en als ik ergens een hekel aan heb is het wel dingen in mn script die ik niet snap...) maar meer dan 150-200 objecten zou toch wel leuk zijn...

Dus had ik het volgende systeem uitgedacht/gemaakt:

Bij het uitvoeren van een (teleport)commando worden de nodige objecten gemaakt met behulp van "CreatePlayerObject". En bij een ander (teleport)commando en/of bij de OnPlayerDeath worden ze weer verwijderd. Waardoor je dus alleen de objecten ziet die je nodig hebt.

Dus het commando ziet er dan zo uit:

if (strcmp("/bigjump", cmdtext, true) == 0)
{
// kijken of de speler geld genoeg heeft enzo...
if (ObjectenActief[playerid] == 0)
{
	DestroyObjects(playerid);
	Objecten(playerid);
	ObjectenActief[playerid] = 1;
}
// de rest waarin speler word geteleport, en voertuigen meegenomen
return 1;
}

Het gedeelte waar het om draait word dus alleen uitgevoerd als die "ObjectenActief" op 0 staat. Want stel dat je al op die betreffende stunt staat en je voert het commando nog een keer uit, dan zouden opnieuw de objecten verwijderd en opnieuw gemaakt worden...

Bij "Objecten" worden de objecten aangemaakt, dat ziet er dan zo uit:

public Objecten(playerid)
{
object[1] = CreatePlayerObject(playerid, id, x, y, z, rx, ry, rz);
object[2] = CreatePlayerObject(playerid, id, x, y, z, rx, ry, rz);
object[3] = CreatePlayerObject(playerid, id, x, y, z, rx, ry, rz);
// enz.
}

En bij "DestroyObjects" worden de objecten weer verwijderd. Dat heb ik zo gedaan:

public DestroyObjects(playerid)
{
if (ObjectenActief[playerid] == 1)
{
	for(new i = 0; i <= sizeof(object); i++)
	DestroyPlayerObject(playerid, object[i]);
	ObjectenActief[playerid] = 0;
}
if (anderobjecten)
{
	// blabla
}
}

Bij dit laatste worden dus alleen de objecten verwijderd die "actief" zijn. Tot zover allemaal prima in orde. In totaal heb ik er nu 4 commando's op deze manier instaan (met in totaal 160 objecten)

Wanneer ik nu naar bijvoorbeeld een /stunt1 teleport werkt dat prima. Objecten worden gemaakt. Wanneer ik mezelf kill met behulp van /kill gaat het ook prima. De objecten verdwijnen direct na het /kill commando.

Maar wanneer ik probeer van de ene stunt naar de andere stunt te teleporteren dan gaat het mis. Stel ik sta bij /stunt1 en ik ga naar /stunt2.

De eerste keer dat ik /stunt2 intyp worden de objecten van /stunt1 verwijderd EN ik krijg de melding "unknown command". Pas de tweede keer dat ik /stunt2 intyp word ik ernaartoe geteleport. De ander commando's zoals /help blijven wel gewoon feilloos werken.

Ik heb het idee dat er iets fout zit in die "public DestroyObjects" maar geen flauw idee wat eigenlijk... al van alles uitgeprobeerd :-(

Link to comment
Delen op andere websites

Volgens mij, als je returnt in je public waarnaar verwezen word, word er ook in je command returnt, wat dus dan waarschijnlijk te vroeg is. En dan denk ik ook dat het "return 0"-s zijn, omdat je het "unknown command" probleem krijgt.

Haal dus eens alle returns uit die custom callbacks weg, kijk eens of dat helpt ;)

Link to comment
Delen op andere websites

Vervang:

public DestroyObjects(playerid)
{
if (ObjectenActief[playerid] == 1)
{
	for(new i = 0; i <= sizeof(object); i++)
	DestroyPlayerObject(playerid, object[i]);
	ObjectenActief[playerid] = 0;
}
if (anderobjecten)
{
	// blabla
}
}

Door:

public DestroyObjects(playerid)
{
if(ObjectenActief[playerid] == 1)
{
	ObjectenActief[playerid] = 0;
	for(new i = 0; i < sizeof(object); i++)
	{
			if(IsValidObject(i))
			{
				DestroyPlayerObject(playerid, object[i]);
			}
	}
}
if (anderobjecten)
{
	// blabla
}
}

Link to comment
Delen op andere websites

Werkt nog niet helemaal, de command's werken dan wel, alleen blijven de objecten gewoon staan :puh:

Ik neem aan dat dat komt doordat "IsValidObject", alleen werkt bij gewone objecten en niet bij "CreatePlayerObject"

Ik heb het daarna eens geprobeerd met de callback die wel bij CreatePlayerObject kan:

if (IsValidPlayerObject(playerid, object[i]))

Dan worden de objecten wel netjes verwijderd, maar ook krijg ik dan weer de melding "unknown command" terug :bonk:

Ik heb trouwens inmiddels een 2e versie van het hele spul. In eerste instantie was de opzet zo:

1. Commando uitvoeren, 2. Overbodige objecten verwijderen en 3. Nieuwe objecten maken, of laten staan als ze er al zijn.

Dat heb ik nu omgedraaid zodat eerst de nieuwe objecten worden en pas helemaal als laatste de overbodige objecten worden verwijderd. Op die manier staat het "DestroyObjects-gedoe" helemaal onderaan het commando, nu word dus wel het hele commando gewoon uitgevoerd... alleen dat unknown command dan nog.. :-(

Link to comment
Delen op andere websites

Met die return 1; werkte het nog steeds niet en kreeg dezelfde "unknown command". Had op alle mogelijke (en onmogelijke) plaatsen al returns gezet, wat soms zorgde dat ik die melding niet kreeg, maar dan bleven de objecten weer gewoon staan :puh:

Maar ik heb inmiddels een oplossing gevonden ( :dans: )

Zal even vertellen hoe ik dat gedaan heb, hebben jullie wel een beetje recht op, vind ik :Y

Ik heb de opzet weer iets gewijzigd, bij het teleportcommando staan nu alleen wat spullen zoals het de coordinaten, het aanmaken van de objecten en daarna word de speler freezed. Vervolgens word een timer gezet en krijgt de tekst "wait for loading objects..." voor z'n neus.

In die bijbehorende array word de speler weer unfreezed, in een voertuigje gestopt en de overbodige aangemaakte objecten verwijderd. Het hele spul werkt nu perfect. :)

Dit verhelpt tegelijkertijd alle andere kleinere probleempjes die ik ermee had zoals spelers die met hun voertuig dwars door een object vallen omdat het nog niet geladen is, objecten die niet laden als je al op een voertuig zit enz.

@D-V-D-K, Big Boss en Remi-X: bedankt voor het meehelpen/meedenken :tu:

Link to comment
Delen op andere websites

  • 2 weken later...
  • 4 weken later...

Een reactie plaatsen

Je kan nu een reactie plaatsen en pas achteraf registreren. Als je al lid bent, log eerst in om met je eigen account een reactie te plaatsen.

Gast
Op dit onderwerp reageren...

×   Je hebt text geplaatst met opmaak.   Opmaak verwijderen

  Only 75 emoji are allowed.

×   Je link is automatisch ingevoegd.   In plaats daarvan weergeven als link

×   Je vorige bewerkingen zijn hersteld.   Alles verwijderen

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

  • Recent actief   0 leden

    • Er zijn hier geen geregistreerde gebruikers aanwezig.
×
×
  • Create New...