Events are caused within events all the time--- people use events to do all
sorts of things: kick players, make people swap teams, teamkill punishment, etc.
Even if server event reentrance is a problem, we need some Valve documentation
saying this is forbidden or dangerous.

To clarify three points:
1. I'm not interested in specifically kicking a player. I'm interested in doing
X during an event where X is anything the administrator wants. So if he wants to
kick a player that's his thing. I, personally, am not trying to kick anyone
during an event. I'm letting people run semi-special config files during an
event.
2. The crash doesn't just happen when plugin code specifically kicks someone. It
can happen when a player is kicked via some administrative plugin, by the
console, etc. It just needs to happen at the around the time an event calls
ServerExecute.
3. The example below is the smallest example I made to reproduce the problem.
I'm no newbie to coding-- I've considered all sorts of workarounds. Like
scheduling things independently via GameFrame, avoiding the ServerExecute, etc.
Unfortunately, these alternatives are substandard/messy and, really, I just need
someone at Valve to say "this is a bug, we'll fix it" or "ServerExecute during
an event is unsupported because of X and we'll document it as such going
forward". If I've missed existing documentation to this effect, I'm hoping
someone on the list can point me to it. (Educated guesses stated as if they were
fact won't help me, though.)

Thanks,
-Mattie


cheeseh wrote: -------------------------------------------------------------------------

I am guessing that when you kick a player another event is triggered
that tells that the player was kicked/left the server. You cannot have
two events fire inside each other, I am taking this from the old "net
message" code that was from HL1, you could not have two messages start
before they end.

Instead of kicking the player there, try raising a flag (try storing a
global boolean variable and the player id) and check it on startframe
(or GameFrame () as it is now in HL2 I think) when the flag is true,
kick the stored player id, then set the flag to false. In the event code
replace it with setting the boolean to true and setting the playerid to
the userid.----- Original Message -----
From: "Mattie Casper" <[EMAIL PROTECTED]>
To: <hlcoders@list.valvesoftware.com>
Sent: Saturday, March 26, 2005 9:25 AM
Subject: FireGameEvent, kickid, ServerExecute, crash


Hello,

I've found what seems, for me, to be a really annoying bug in CSS (and
probably mods). The following problem happens regardless of whether you use
IGameEventListener or IGameEventListener2.

My Windows server crashes 98% of the time with the following code in a
listener/plugin:


void CEmptyServerPlugin::FireGameEvent( IGameEvent * event ) { const char * name = event->GetName(); if (FStrEq(name, "player_changename")) { if(tester_cvar.GetInt()==1) { Msg("Kicking ya.\n"); int userid = event->GetInt("userid"); char szMessage[1024]; sprintf(szMessage, "kickid %d Go away.\n", userid); engine->ServerCommand(szMessage); if (tester2_cvar.GetInt()==1) { // Crashes the server engine->ServerExecute(); } } } }

Basically, this silly code causes a player to get kicked immediately when he
tries to change his name. He certainly does get kicked, but the server crashes
immediately after.

This is just the sample reproduction code, but the problem shows itself at a
much deeper point in my EventScripts plugin when users are kicked in the
middle of an event. It can happen at times regardless of whether the event
handler is doing the kicking (i.e. another plugin or user could be kicking the
player while my event handlers are firing). I believe it is a timing or
threading issue because if I place a Windows Sleep(100) after the above
ServerExecute call, the crash usually doesn't happen.

Avoiding ServerExecute() is not really an option for me because I truly need
the command (not necessarily kick) executed immediately (typically an exec of
a cfg file). Regardless, the documentation places no caveats on when
ServerExecute() can be called, so I haven't been afraid to do so when needed.

Anyone have any recommendations or thoughts here?

Thanks for your help,
-Mattie




_______________________________________________
To unsubscribe, edit your list preferences, or view the list archives, please 
visit:
http://list.valvesoftware.com/mailman/listinfo/hlcoders



Reply via email to