Is there a better way ? -
Kyosaur - 15.03.2010
Im making a script that need an OnPlayerWorldChange callback. I know this callback doesnt exist, so i built my own using OnPlayerUpdate, which can be found below. It works, but im just worried its going to put a lot of strain on my server (The OnPlayerWolrdChange needs to have a lot of checks/loops/functions

).
Is there a more efficient way to do this?
Код:
public OnPlayerUpdate(playerid)
{
pData[playerid][WorldCheck] = GetPlayerVirtualWorld(playerid);
if(pData[playerid][WorldCheck] != pData[playerid][NewWorld])
{
pData[playerid][OldWorld] = pData[playerid][NewWorld];
pData[playerid][NewWorld] = pData[playerid][WorldCheck];
OnPlayerWorldChange(playerid, pData[playerid][NewWorld], pData[playerid][OldWorld]);
}
return 1;
}
Re: Is there a better way ? -
cessil - 15.03.2010
well yeah, since OnPlayerUpdate is called like 40-60 times a seconds from what I heard.
what causes a player to change virtual world? I would have the OnPlayerWorldChange there not OnPlayerUpdate
Re: Is there a better way ? -
Mike Garber - 15.03.2010
Why would you need It?
If It's for user stats, just save it under OnPlayerDisconnect or use a timer.
https://sampwiki.blast.hk/wiki/SetTimer
pawn Код:
// TOP OF YOUR SCRIPT
forward CheckPlayerWorldChange(playerid);
// Under OnGameModeInit
SetTimer("CheckPlayerWorldChange",1000,true); // True = Repeat False = Once (One Second Timer)
// Change 1000 to 500 If you want It to check twice / second
// Change 1000 to 250 If you want it to check four times / second
// Change 1000 to 125 If you want it to check 8 times / second
// And so on....
// Anywhere (NOT under any callback)
public CheckPlayerWorldChange(playerid)
{
pData[playerid][WorldCheck] = GetPlayerVirtualWorld(playerid);
if(pData[playerid][WorldCheck] != pData[playerid][NewWorld])
{
pData[playerid][OldWorld] = pData[playerid][NewWorld];
pData[playerid][NewWorld] = pData[playerid][WorldCheck];
OnPlayerWorldChange(playerid, pData[playerid][NewWorld], pData[playerid][OldWorld]);
}
return 1;
}
This will (if your code works) check If the player changed world every second.
Re: Is there a better way ? -
Kyosaur - 15.03.2010
Quote:
|
Originally Posted by cessil
well yeah, since OnPlayerUpdate is called like 40-60 times a seconds from what I heard.
what causes a player to change virtual world? I would have the OnPlayerWorldChange there not OnPlayerUpdate
|
Many events cause players to switch virtual worlds. Thats my problem lol. i guess i COULD go through all my filterscripts/my gm, and add a callremotefunction line before the SetVirtualWorld functions, but i would rather find a different way

.
Is there any way i can redefine SetVirtualWorld to a custom SetVirtualWorldEx ? (i tried to hook them, but failed due to not knowing much about the preprocessor

).
Re: Is there a better way ? -
Mike Garber - 15.03.2010
Quote:
|
Originally Posted by Kyosaur!!
Quote:
|
Originally Posted by cessil
well yeah, since OnPlayerUpdate is called like 40-60 times a seconds from what I heard.
what causes a player to change virtual world? I would have the OnPlayerWorldChange there not OnPlayerUpdate
|
Many events cause players to switch virtual worlds. Thats my problem lol. i guess i COULD go through all my filterscripts/my gm, and add a callremotefunction line before the SetVirtualWorld functions, but i would rather find a different way  .
Is there any way i can redefine SetVirtualWorld to a custom SetVirtualWorldEx ? (i tried to hook them, but failed due to not knowing much about the preprocessor  ).
|
Just use the timer I made. Should work without issues.
Re: Is there a better way ? -
Kyosaur - 15.03.2010
Quote:
|
Originally Posted by mavtias
Why would you need It?
If It's for user stats, just save it under OnPlayerDisconnect or use a timer.
https://sampwiki.blast.hk/wiki/SetTimer
pawn Код:
// TOP OF YOUR SCRIPT forward CheckPlayerWorldChange(playerid);
// Under OnGameModeInit SetTimer("CheckPlayerWorldChange",1000,true); // True = Repeat False = Once (One Second Timer)
// Change 1000 to 500 If you want It to check twice / second // Change 1000 to 250 If you want it to check four times / second // Change 1000 to 125 If you want it to check 8 times / second // And so on....
// Anywhere (NOT under any callback) public CheckPlayerWorldChange(playerid) { pData[playerid][WorldCheck] = GetPlayerVirtualWorld(playerid); if(pData[playerid][WorldCheck] != pData[playerid][NewWorld]) { pData[playerid][OldWorld] = pData[playerid][NewWorld]; pData[playerid][NewWorld] = pData[playerid][WorldCheck]; OnPlayerWorldChange(playerid, pData[playerid][NewWorld], pData[playerid][OldWorld]); } return 1; }
This will (if your code works) check If the player changed world every second.
|
Hmmm 3 things lol.
1. Not really looking to use timers (not a bad idea ... just dont want to use them/onplayerupdate if there's another way.)
2. Your using SetTimer on a public with parameters, that wont work.
3. If i wanted to use timers ... wouldnt be much easier to call OnPlayerWorldChange all on its own :P?
What i plan on doing with this OnPlayerWorldChange callback cant really be done with timers (even if i set the time to 500ms, still wouldnt work

). OnPlayerUpdate works fine (even thought i need to add it/all my variables to every script i use want to use my callback in), but im really worried about lag aha.
So im hoping there's a way to just hook SetPlayerVirtualWorld to a custom SetPlayerVirtualWorldEx... would be a lot easier on me.
Re: Is there a better way ? -
Desert - 15.03.2010
Well you could make it easy for yourself
forward OnPlayerWorldChange(playerid,worldid);
pawn Код:
stock SetPlayerVirtualWorldn(playerid,worldid)
{
SetPlayerVirtualWorld(playerid,worldid);
OnPlayerWorldChange(playerid,worldid);
return 1;
}
then you have the callback onplayerworldchange and a new modified SetPlayerVirtualWorld called SetPlayerVirtualWorldn just click CTRL + h which shows up a small box which can be used to quickly change 1 type of code to another with a few clicks.
Then just remove the additional "n" that will come.
Or even better put it in a include file
Re: Is there a better way ? - WackoX - 15.03.2010
It shouldn't be a problem, i saw someone putting a whole speedometer script under OnPlayerUpdate and it works fine without any lag, but the download/upload brandwith is high.
Re: Is there a better way ? -
Finn - 15.03.2010
Quote:
|
Originally Posted by Desert
...
|
pawn Код:
forward OnPlayerVirtualWorldChange(playerid, oldworld, newworld);
public OnPlayerVirtualWorldChange(playerid, oldworld, newworld)
{
printf("player %d's virtual world changed from %d to %d", playerid, oldworld, newworld);
return 1;
}
stock SetPlayerVirtualWorldEx(playerid, worldid)
{
OnPlayerVirtualWorldChange(playerid, GetPlayerVirtualWorld(playerid), worldid);
return SetPlayerVirtualWorld(playerid, worldid);
}
#define SetPlayerVirtualWorld SetPlayerVirtualWorldEx
With this you don't need to edit your code.
Re: Is there a better way ? -
Kyosaur - 15.03.2010
Quote:
|
Originally Posted by Finn
Quote:
|
Originally Posted by Desert
...
|
pawn Код:
forward OnPlayerVirtualWorldChange(playerid, oldworld, newworld); public OnPlayerVirtualWorldChange(playerid, oldworld, newworld) { printf("player %d's virtual world changed from %d to %d", playerid, oldworld, newworld); return 1; }
stock SetPlayerVirtualWorldEx(playerid, worldid) { OnPlayerVirtualWorldChange(playerid, GetPlayerVirtualWorld(playerid), worldid); return SetPlayerVirtualWorld(playerid, worldid); }
#define SetPlayerVirtualWorld SetPlayerVirtualWorldEx
With this you don't need to edit your code.
|
Thats what im looking for

lol.
Thanks for the help everyone, especially you Mr.Finn.