Jump to content

[DISCUSSIE] HID: Highest (player) ID


Megadreams

Recommended Posts

Zoals jullie weten word het volgende zeer veel gebruikt als je een bepaald iets voor alle online spelers wil uitvoeren:

for(new i;i<MAX_PLAYERS;i++)
{
if(IsPlayerConnected(i))
{
	// Hier wat je wil doen...
}
}

Maar waarom eigenlijk de loop 500x uitvoeren als er toch maar bijvoorbeeld 5 spelers in de server zitten? Het kan in feite toch nog net wat efficiënter. Namelijk een variable die ik nu HID noem waarin de hoogste playerid in zit die zich op het moment in de server bevindt. Dan zal als er maar 5 spelers zijn in principe de loop dus maar 5x moeten lopen inplaats van die 500 (of iets anders als je de MAX_PLAYERS define redefined) keer. Dat brengt toch wat meer efficiëntie met zich mee.

Bij OnPlayerConnect moet er nagekeken worden of de playerid van de speler die net heeft geconnect groter is dan de huidige ID die zich HID bevindt. Zoja dan zal HID moeten verhoogt worden, dit kan heel simpel zo:

public OnPlayerConnect(playerid)
{
HID=(playerid>HID) ? playerid : HID;
return 1;
}

Of als je het liever wat anders wilt al komt het wel op hetzelfde neer:

public OnPlayerConnect(playerid)
{
if(playerid>HID) HID=playerid;
return 1;
}

Maar wanneer de speler met de hoogste playerid de server verlaat moet HID dus weer verlaagt worden naar de dan hoogste playerid. We hebben eigenlijk 2 mogelijkheden, we laten HID naar de werkelijke op dat moment hoogste playerid gaan of we doen gewoon -1. Gezien het feit dat in een normale server de id nadat een speler de server verlaten heeft snel weer zal opgevuld worden.

Mogelijkheid #1: Loop

public OnPlayerDisconnect(playerid, reason)
{
if(playerid==HID)
{
	for(new i;i<HID;i++)
	{
		if(IsPlayerConnected(i)) HID=i;
	}
}
return 1;
}

Mogelijkheid #2: -1

public OnPlayerDisconnect(playerid, reason)
{
if(playerid==HID) HID--;
return 1;
}

Ik zou meer voor de 2de gaan aangezien deze efficiënter is en de playerid normaal wel opgevuld zou moeten worden. Althans dat is toch wat je hoopt...

Wat vinden jullie van dit idee en de mogelijke mogelijkheden?

Link to comment
Delen op andere websites

Foreach inderdaad, al zit daar wel wat meer achter dan wat Megadreams gepost heeft. Wat ik persoonlijk altijd doe is:

#undef MAX_PLAYERS
#define MAX_PLAYERS (50)

De #undef is nodig omdat je anders een warning krijgt.

Link to comment
Delen op andere websites

Dat is ook iets wat ik altijd doet maar omdat het niet zo efficiënt is bedacht ik dit. Helaas dacht ik niet meer aan het feit dat er een foreach bestaat (met dank aan Y_Less die dit maakte al zouden de makers van pawn het zelf hebben moeten maken...).

Link to comment
Delen op andere websites

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...