home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Revista CD Expert 51
/
PCGamer51_17Demos.iso
/
games
/
CM
/
CyclingManagerDemoCangas.exe
/
CyclingManagerDemo
/
MenuServer
/
UserClient.cnc
< prev
next >
Wrap
Text File
|
2001-07-02
|
22KB
|
988 lines
// ******************************************************
// * Function : Player server connect/disconnect callback
// * Parameters : client : client connected/disconnected
// *
// * Add/Remove the client to/from the client list
// *******************************************************
func void UserConnectCB (Net_Client _client)
{
print("<< client connection: waiting for login...\n");
}
func void UserDisconnectCB (Net_Client _client)
{
var szx szLogin;
var i32x iUserId;
var i32x iDivisionId;
var i32x iPreRaceTeamId;
print("<< client disconnection...\n");
iUserId = NetClient_GetId(_client);
if (iUserId>0)
{
print("Remove logged client : ");
println(itoa(iUserId));
// get division
iDivisionId = Join_GetIntFromKey(g_stJoins.m_iUser_DivisionId, iUserId);
// get client list
var Net_ClientList pClientList;
pClientList = NetServer_GetClientList( g_pServer, iDivisionId-1);
// update database
Join_SetIntFromKey(g_stJoins.m_iUser_iInRaceReady, iUserId, 0);
Join_SetIntFromKey(g_stJoins.m_iUser_iConnected, iUserId, 0);
// inform gateway
if (g_stGateway.m_pClient)
{
// Retrieve gateway user id
szLogin = Join_GetStringFromKey(g_stJoins.m_iUser_szLogin, iUserId);
g_stGateway.m_pClient << mGateway_UserDisconnection(szLogin);
}
// inrace ?
// Client disconnected while in race
// Remove game client of Game Server
if (g_stVirtualDay.m_iActivePhase==G_iPhase_InRace)
{
iPreRaceTeamId = Join_GetIntFromKey( g_stJoins.m_iUser_iPreRaceTeamId, iUserId);
g_a_stPreRaceClientDivisions[iDivisionId-1].a_Clients[iPreRaceTeamId] = G_pNullClient;
RemoveClient(iDivisionId-1,iPreRaceTeamId);
}
// remove client from list
NetClientList_DelClient( pClientList, _client, 0);
// notify users
fnNotifyUserLogout(iUserId);
}
else if(iUserId<0)
{
var i32x iGuestID;
println("Guest disconnection...");
// Guest identifier are negative
iGuestID = -iUserId;
var Net_ClientList pClientList;
pClientList = NetServer_GetClientList( g_pServer, G_iGuestClientList);
// inform gateway
if (g_stGateway.m_pClient)
{
// Retrieve gateway user id
szLogin = Join_GetStringFromKey(g_stJoins.m_iUser_GuestLogin, iGuestID);
g_stGateway.m_pClient << mGateway_UserDisconnection(szLogin);
}
// Free guest slot
Join_SetIntFromKey(g_stJoins.m_iUser_GuestFree, iGuestID, g_iGUEST_STATUS_Free);
Join_SetStringFromKey(g_stJoins.m_iUser_GuestLogin, iGuestID, "0");
// remove client from list
NetClientList_DelClient( pClientList, _client, 0);
// notify clients
fnNotifyGuestLogout(iGuestID);
}
else
{
print("removed unlogged client...\n");
}
// remove client
NetClient_Destroy(_client);
}
// *********************
// user login
// *********************
func void fnUserLogin (szx _szLogin, szx _szGatewayAuthorization)
{
var i32x ok;
print(_szLogin);
print(" trying to login..\n");
// get client
var Net_Client client;
client = GetCurrentClient();
var i32x i;
var i32x user,manager,teamID,guest,guestok;
var i32x iDivision;
var szx szAuthorization;
var Net_ClientList pClientList;
guestok = 0;
ok = 1;
user = -1;
manager = -1;
teamID = -1;
// get user
user = Join_FindKeyFromStringData(g_stJoins.m_iUser_szLogin, _szLogin);
if(user == -1)
{
print("User not found\n");
ok = 0;
// ** internet : skip authorization...
// Check free guest user ID
guest = Join_FindKeyFromStringData(g_stJoins.m_iUser_GuestLogin,_szLogin);
if(guest < 0)
{
guest = Join_FindKeyFromIntData(g_stJoins.m_iUser_GuestFree,g_iGUEST_STATUS_Free);
if(guest > 0)
{
// Fill guest slot
Join_SetIntFromKey( g_stJoins.m_iUser_GuestFree, guest,g_iGUEST_STATUS_Guest);
Join_SetStringFromKey( g_stJoins.m_iUser_GuestLogin, guest,_szLogin);
Join_SetStringFromKey( g_stJoins.m_iUser_GuestPassword,guest,_szLogin);
}
}
if(guest >= 0)
{
// Okay for guest connection
print(" Guest connection with ID : ");println(itoa(guest));
guestok = 1;
}
}
if(guestok == 1)
{
// Guest connection
// Check guest authorization
szAuthorization = Join_GetStringFromKey(g_stJoins.m_iUser_GuestPassword, guest);
if (strcmp(szAuthorization,_szGatewayAuthorization)!=0)
{
print("guest authorization failed !\n");
println(_szLogin);
println(_szGatewayAuthorization);
println(szAuthorization);
println(itoa(guest));
guestok = 0;
}
if(guestok==1)
{
// Guest identifier are negative
// Set client identifier to -guest id
NetClient_SetId(client,-guest);
// Then add it to the menuserver guest client list
pClientList = NetServer_GetClientList( g_pServer, G_iGuestClientList);
NetClientList_AddClient( pClientList, client);
if(IsGameModeEnded())
{
// Set client to game over
NetClient_SetInterface(client,iGameOver);
}
else
{
// Set client to guest interface
NetClient_SetInterface(client,iGuestInterface);
}
// Guest slot is no more free
Join_SetIntFromKey(g_stJoins.m_iUser_GuestFree,guest,g_iGUEST_STATUS_Guest);
Join_SetStringFromKey(g_stJoins.m_iUser_GuestLogin,guest,_szLogin);
// Inform gateway
g_stGateway.m_pClient << mGateway_UserConnection(_szLogin);
// Inform client
client << mUser_GameGuestOK(guest,g_stGame.m_szAdminLogin);
client << mUser_GameConfig(GetMode(),GetCalendarMode(),0,IsGameModeEnded());
// notify clients
fnNotifyGuestLogin(guest,_szLogin);
}
}
else
{
// Registered user connection
// authorization
if (ok==1)
{
szAuthorization = Join_GetStringFromKey(g_stJoins.m_iUser_szPassword, user);
if (strcmp(szAuthorization,_szGatewayAuthorization)!=0)
{
print("user authorization failed !\n");
ok = 0;
}
}
// get manager
if (ok==1)
{
manager = Join_GetIntFromKey(g_stJoins.m_iUser_ManagerId, user);
if (manager == -1)
{
print("No manager for user ");
println(itoa(user));
ok = 0;
}
}
// get team
if (ok==1)
{
teamID = Join_GetIntFromKey(g_stJoins.m_iManager_TeamId, manager);
if (teamID == -1)
{
print("No team for user ");
print(itoa(user));
ok = 0;
}
}
// get division
if (ok==1)
{
//return 1 2 3 or 4: loosers
iDivision = Join_GetIntFromKey(g_stJoins.m_iUser_DivisionId, user)-1;
if ((iDivision<0)||(iDivision>G_iNumDivision))
{
print("wrong division\n");
ok = 0;
}
}
if (ok==1)
{
pClientList = NetServer_GetClientList( g_pServer, iDivision);
if (NetClientList_FindClient(pClientList, user))
{
print("duplicated login\n");
ok = 0;
}
}
// add client
if (ok==1)
{
NetClient_SetId(client,user);
//inform gateway
g_stGateway.m_pClient << mGateway_UserConnection(_szLogin);
// Then add it to the menuserver and corresponding resolution server
NetClientList_AddClient( pClientList, client);
// update database
Join_SetStringFromKey( g_stJoins.m_iUser_szPassword, user, _szGatewayAuthorization);
Join_SetIntFromKey( g_stJoins.m_iUser_iConnected, user, 1);
// inrace ?
if(g_stVirtualDay.m_iActivePhase == G_iPhase_InRace)
{
var i32x iPreRaceTeamId;
iPreRaceTeamId = GetPreRaceIDFromTeamID(teamID);
Join_SetIntFromKey(g_stJoins.m_iUser_iInRaceReady, user, 0);
Join_SetIntFromKey(g_stJoins.m_iUser_iPreRaceTeamId, user, iPreRaceTeamId);
g_a_stPreRaceClientDivisions[iDivision].a_Clients[iPreRaceTeamId] = client;
}
// inform client
client << mUser_GameLoginOK (_szGatewayAuthorization,user,manager,teamID,g_stGame.m_szAdminLogin);
client << mUser_GameConfig(GetMode(),GetCalendarMode(),0,IsGameModeEnded());
// notify clients
fnNotifyUserLogin(user);
if(IsGameModeEnded())
{
// Set client to game over
NetClient_SetInterface(client,iGameOver);
}
else
{
if(g_stVirtualDay.m_iActivePhase == G_iPhase_Management)
{
NetClient_SetInterface(client,iManagement);
}
if(g_stVirtualDay.m_iActivePhase == G_iPhase_PreRace)
{
NetClient_SetInterface(client,iPreRace);
}
if(g_stVirtualDay.m_iActivePhase == G_iPhase_InRace)
{
NetClient_SetInterface(client,iInRace);
// Client connected while in race
// Add game client to Game Server
var i32x iPreRaceTeamId;
var szx szIP;
if(GetGameServerState(iDivision)==1)
{
iPreRaceTeamId = GetPreRaceIDFromTeamID(teamID);
if(iPreRaceTeamId == -1)
{
print("Team not in race : ");
println(itoa(teamID));
}
else
{
print("Adding client to resolution server.\n");
AddPassword(iDivision,_szGatewayAuthorization,iPreRaceTeamId);
client << mUser_InRaceServer (GetGameServerPort(iDivision));
client << mUser_InRaceStart(iPreRaceTeamId);
}
}
}
}
}
else
{
NetClient_Disconnect(client);
}
}
}
//User set udp flow
func void fnSetUDPFlow (f32x _fValue)
{
// get client
var Net_Client pClient;
var i32x iUserID;
pClient = GetCurrentClient();
iUserID = NetClient_GetId(pClient);
println("Script : fnSetUDPFlow");
if(fnIsAdmin(iUserID)>0)
{
println("Script : fnSetUDPFlow for admin");
SetUDPFlow(_fValue);
}
}
// *********************
// *** Notifications ***
// *********************
func void fnNotifyGuestLogin(i32x iGuestID, szx szLogin)
{
var i32x i, j, iNumClients;
var Net_ClientList pClientList;
var Net_Client pClient;
i=0;
while (i<G_iNumDivision)
{
// notify registered users
pClientList = NetServer_GetClientList( g_pServer, i);
iNumClients = NetClientList_GetSize(pClientList);
j = 0;
while (j<iNumClients)
{
pClient = NetClientList_GetClient(pClientList,j);
pClient << mUser_NotifyGuestLogin(iGuestID, szLogin);
j=j+1;
}
i=i+1;
}
// notify registered guests
pClientList = NetServer_GetClientList( g_pServer, G_iGuestClientList);
iNumClients = NetClientList_GetSize(pClientList);
i = 0;
while (i<iNumClients)
{
pClient = NetClientList_GetClient(pClientList,i);
pClient << mUser_NotifyGuestLogin(iGuestID, szLogin);
i=i+1;
}
}
func void fnNotifyGuestLogout(i32x iGuestID)
{
var i32x i, j, iNumClients;
var Net_ClientList pClientList;
var Net_Client pClient;
i=0;
while (i<G_iNumDivision)
{
// notify registered users
pClientList = NetServer_GetClientList( g_pServer, i);
iNumClients = NetClientList_GetSize(pClientList);
j = 0;
while (j<iNumClients)
{
pClient = NetClientList_GetClient(pClientList,j);
pClient << mUser_NotifyGuestLogout(iGuestID);
j=j+1;
}
i=i+1;
}
// notify registered guests
pClientList = NetServer_GetClientList( g_pServer, G_iGuestClientList);
iNumClients = NetClientList_GetSize(pClientList);
i = 0;
while (i<iNumClients)
{
pClient = NetClientList_GetClient(pClientList,i);
pClient << mUser_NotifyGuestLogout(iGuestID);
i=i+1;
}
}
func void fnNotifyUserLogin(i32x iUserId)
{
var i32x i, j, iNumClients;
var Net_ClientList pClientList;
var Net_Client pClient;
i=0;
while (i<G_iNumDivision)
{
// notify registered users
pClientList = NetServer_GetClientList( g_pServer, i);
iNumClients = NetClientList_GetSize(pClientList);
j = 0;
while (j<iNumClients)
{
pClient = NetClientList_GetClient(pClientList,j);
pClient << mUser_NotifyUserLogin(iUserId);
j=j+1;
}
i=i+1;
}
// notify registered guests
pClientList = NetServer_GetClientList( g_pServer, G_iGuestClientList);
iNumClients = NetClientList_GetSize(pClientList);
i = 0;
while (i<iNumClients)
{
pClient = NetClientList_GetClient(pClientList,i);
pClient << mUser_NotifyUserLogin(iUserId);
i=i+1;
}
}
func void fnNotifyUserLogout(i32x iUserId)
{
var i32x i, j, iNumClients;
var Net_ClientList pClientList;
var Net_Client pClient;
i=0;
while (i<G_iNumDivision)
{
// notify registered users
pClientList = NetServer_GetClientList( g_pServer, i);
iNumClients = NetClientList_GetSize(pClientList);
j = 0;
while (j<iNumClients)
{
pClient = NetClientList_GetClient(pClientList,j);
pClient << mUser_NotifyUserLogout(iUserId);
j=j+1;
}
i=i+1;
}
// notify registered guests
pClientList = NetServer_GetClientList( g_pServer, G_iGuestClientList);
iNumClients = NetClientList_GetSize(pClientList);
i = 0;
while (i<iNumClients)
{
pClient = NetClientList_GetClient(pClientList,i);
pClient << mUser_NotifyUserLogout(iUserId);
i=i+1;
}
}
func void fnNotifyUserReady(i32x iUserId)
{
var i32x i, j, iNumClients;
var Net_ClientList pClientList;
var Net_Client pClient;
i=0;
while (i<G_iNumDivision)
{
// notify registered users
pClientList = NetServer_GetClientList( g_pServer, i);
iNumClients = NetClientList_GetSize(pClientList);
j = 0;
while (j<iNumClients)
{
pClient = NetClientList_GetClient(pClientList,j);
pClient << mUser_NotifyUserReady(iUserId);
j=j+1;
}
i=i+1;
}
// notify registered guests
pClientList = NetServer_GetClientList( g_pServer, G_iGuestClientList);
iNumClients = NetClientList_GetSize(pClientList);
i = 0;
while (i<iNumClients)
{
pClient = NetClientList_GetClient(pClientList,i);
pClient << mUser_NotifyUserReady(iUserId);
i=i+1;
}
}
func void fnNotifyUserNotReady(i32x iUserId)
{
var i32x i, j, iNumClients;
var Net_ClientList pClientList;
var Net_Client pClient;
i=0;
while (i<G_iNumDivision)
{
// notify registered users
pClientList = NetServer_GetClientList( g_pServer, i);
iNumClients = NetClientList_GetSize(pClientList);
j = 0;
while (j<iNumClients)
{
pClient = NetClientList_GetClient(pClientList,j);
pClient << mUser_NotifyUserNotReady(iUserId);
j=j+1;
}
i=i+1;
}
// notify registered guests
pClientList = NetServer_GetClientList( g_pServer, G_iGuestClientList);
iNumClients = NetClientList_GetSize(pClientList);
i = 0;
while (i<iNumClients)
{
pClient = NetClientList_GetClient(pClientList,i);
pClient << mUser_NotifyUserNotReady(iUserId);
i=i+1;
}
}
// *********************
// *** Admin command ***
// *********************
func i32x fnIsAdmin(i32x iUserID)
{
var szx szUserLogin;
var i32x iIsAdmin;
var i32x iGuestID;
iIsAdmin = 0;
if(iUserID>0)
{
// user
szUserLogin = Join_GetStringFromKey(g_stJoins.m_iUser_szLogin,iUserID);
if(strcmp(szUserLogin,g_stGame.m_szAdminLogin) == 0)
{
iIsAdmin = 1;
}
}
else if(iUserID<0)
{
// guest
iGuestID = -iUserID;
szUserLogin = Join_GetStringFromKey(g_stJoins.m_iUser_GuestLogin, iGuestID);
if(strcmp(szUserLogin,g_stGame.m_szAdminLogin) == 0)
{
iIsAdmin = 1;
}
}
return iIsAdmin;
}
func void fnAdminKickGuest(szx _szLogin)
{
// get client
var Net_Client pClient;
var Net_ClientList pClientList;
var i32x iUserID;
var i32x iGuestID;
pClient = GetCurrentClient();
iUserID = NetClient_GetId(pClient);
if(fnIsAdmin(iUserID)>0)
{
iGuestID = Join_FindKeyFromStringData(g_stJoins.m_iUser_GuestLogin, _szLogin);
if (iGuestID>0)
{
if ((iGuestID!=iUserID) &&(iGuestID!=-iUserID))
{
// disconnect
print("admin kicks out guest ");
println(_szLogin);
pClientList = NetServer_GetClientList(g_pServer,G_iGuestClientList);
pClient = NetClientList_FindClient(pClientList,-iGuestID);
if (pClient)
NetClient_Disconnect(pClient);
}
}
}
}
func void fnAdminKickUser(szx _szLogin)
{
var Net_Client pClient;
var Net_ClientList pClientList;
var i32x iUserID;
var i32x iDivision;
var i32x iKickUserID;
// get client
pClient = GetCurrentClient();
iUserID = NetClient_GetId(pClient);
if(fnIsAdmin(iUserID)>0)
{
iKickUserID = Join_FindKeyFromStringData(g_stJoins.m_iUser_szLogin, _szLogin);
if (iKickUserID>0)
{
if (iKickUserID!=iUserID)
{
// kick user
print("admin kicks out user");
println(_szLogin);
// get client
iDivision = Join_GetIntFromKey(g_stJoins.m_iUser_DivisionId,iKickUserID)-1;
pClientList = NetServer_GetClientList(g_pServer,iDivision);
pClient = NetClientList_FindClient(pClientList,iKickUserID);
// unsubscribe & Disconnect
fnUnsubscribeUser(iKickUserID);
if (pClient)
NetClient_Disconnect(pClient);
}
}
}
}
// valid next phase
func void fnCallNextPhaseNull()
{
}
func void fnCallNextPhase()
{
// get client
var Net_Client pClient;
var i32x iUserID,iNumUsers,iUser,bLaunch;
pClient = GetCurrentClient();
iUserID = NetClient_GetId(pClient);
if(iUserID>0)
{
// Valid registered user
print("User ");print(itoa(iUserID));print(" Ready.\n");
// Check is launch ready flag
Join_SetIntFromKey(g_stJoins.m_iUser_iLaunchGame,iUserID,1);
// notify users
fnNotifyUserReady(iUserID);
// if all users are ready launch race !
bLaunch = true;
iUser = 0;
iNumUsers = Join_GetNumRows(g_stJoins.m_iUser_iLaunchGame);
while(iUser<iNumUsers)
{
if(Join_GetIntFromIndex(g_stJoins.m_iUser_iConnected,iUser) == 1)
{
if(Join_GetIntFromIndex(g_stJoins.m_iUser_iLaunchGame,iUser) == 0)
{
bLaunch = false;
}
}
iUser = iUser + 1;
}
if(bLaunch)
{
// Reset ready flags
iUser = 0;
while(iUser<iNumUsers)
{
if(Join_GetIntFromIndex(g_stJoins.m_iUser_iConnected,iUser) == 1)
{
fnNotifyUserNotReady(Join_GetIntFromIndex(g_stJoins.m_iUser_iID,iUser));
}
Join_SetIntFromIndex(g_stJoins.m_iUser_iLaunchGame,iUser,0);
iUser = iUser + 1;
}
// Launch race server
print("Launch race server...\n");
NextPhase(); // PreRace phase
NextPhase(); // InRace phase
}
}
}
// Cancel next phase
func void fnCancelNextPhaseNull()
{
}
func void fnCancelNextPhase()
{
// get client
var Net_Client pClient;
var i32x iUserID;
pClient = GetCurrentClient();
iUserID = NetClient_GetId(pClient);
if(iUserID>0)
{
// Valid registered user
// Uncheck is launch ready flag
Join_SetIntFromKey(g_stJoins.m_iUser_iLaunchGame,iUserID,0);
// notify users
fnNotifyUserNotReady(iUserID);
}
}
func void fnAdminCallNextStageNull()
{
}
func void fnAdminCallNextStage()
{
print("<< next stage..\n");
// get client
var Net_Client pClient;
var i32x iUserID;
pClient = GetCurrentClient();
iUserID = NetClient_GetId(pClient);
if(fnIsAdmin(iUserID)>0)
{
// Don't skip stage in Stage mode
if(g_stGame.m_iMode != g_iGAMEMODE_SingleRace)
{
// Skip stage
NextStage();
// Compute CPU roster for next stage
ManageRoster();
}
}
}
func void fnConsoleSpeed(i32x iSpeed)
{
if(G_iDebugVersion)
{
if(iSpeed<=0)
{
SetRaceSpeed(0);
}
else if(iSpeed>=64)
{
SetRaceSpeed(64);
}
else
{
SetRaceSpeed(iSpeed);
}
}
else
{
// get client
var Net_Client pClient;
var i32x iUserID;
pClient = GetCurrentClient();
iUserID = NetClient_GetId(pClient);
if(fnIsAdmin(iUserID)>0)
{
if(iSpeed<=0)
{
SetRaceSpeed(0);
}
else if(iSpeed>=8)
{
SetRaceSpeed(8);
}
else
{
SetRaceSpeed(iSpeed);
}
}
else
{
print("###NOT Admin User can't set speed###\n");
}
}
}
func void fnConsoleSpeed_Null(i32x iSpeed)
{}
func void fnConsoleDelta(i32x iDelta)
{
if(G_iDebugVersion)
{
SetRaceDelta(iDelta);
}
}
func void fnConsoleDelta_Null(i32x iDelta)
{}
// *********************
// user subscribe
// *********************
func void fnUserSubscribe(i32x _iTeamID)
{
var i32x iGuestID;
// get client
var Net_Client pClient;
pClient = GetCurrentClient();
// Client is a guest
iGuestID = -NetClient_GetId(pClient);
if(iGuestID>0)
{
var i32x iPlayer;
print("<< guest client trying to subscribe team :");
println(Join_GetStringFromKey(g_stJoins.m_iTeam_szName,_iTeamID ));
// Check if team has no human manager
iPlayer = Join_GetIntFromKey( g_stJoins.m_iTeam_iUserId, _iTeamID);
if(iPlayer==0)
{
var szx szLogin;
// Free team
// Retrieve gateway user id from GAM_guestuser
szLogin = Join_GetStringFromKey(g_stJoins.m_iUser_GuestLogin,iGuestID);
// subscribe user
fnSubscribeUser(iGuestID,_iTeamID);
}
else
{
// Unvalid team
println("Team not free !");
// inform client
pClient<<mUser_GameSubscribeCancel();
}
}
else
{
print("Unvalid Guest ID for subscription :");
println(itoa(iGuestID));
// Flood ?
}
}
// *********************
// user Unsubscribe
// *********************
func void fnUserUnsubscribeNull()
{
}
func void fnUserUnsubscribe()
{
var i32x iUserID;
// get client
var Net_Client pClient;
pClient = GetCurrentClient();
// Client is a registered user
iUserID = NetClient_GetId(pClient);
if(iUserID>0)
{
var i32x iPlayer;
var i32x iTeamID;
// Retrieve team id of client
iTeamID = Join_GetIntFromKey(g_stJoins.m_iUser_iTeamId,iUserID);
print("<< client trying to unsubscribe from team :");
print(Join_GetStringFromKey(g_stJoins.m_iTeam_szName,iTeamID ));
print("... ");
// Check if team has human manager
iPlayer = Join_GetIntFromKey( g_stJoins.m_iTeam_iUserId, iTeamID);
if(iPlayer>0)
{
var szx szLogin;
// team is not free
// Retrieve gateway login from GAM_user
szLogin = Join_GetStringFromKey(g_stJoins.m_iUser_szLogin,iUserID);
fnUnsubscribeUser(iUserID);
}
else
{
// Unvalid team
println("Team already free !");
// inform client
pClient<<mUser_GameUnsubscribeCancel();
}
}
else
{
print("Unvalid User ID for unsubscription :");
println(itoa(iUserID));
// Flood ?
}
}