public Int32 ScriptMain([In] object[] ScriptParameters, [In] Int32 DefaultReturnCode)
{
Int32 ReturnCode;
int RequestType = (int)ScriptParameters[0];
//
// If we haven't yet done one time initialization, do so now.
//
if (!ScriptInitialized)
{
InitializeServerCommunicator();
ScriptInitialized = true;
}
//
// Now dispatch the command request.
//
switch ((REQUEST_TYPE)RequestType)
{
case REQUEST_TYPE.INITIALIZE:
{
ReturnCode = 0;
}
break;
case REQUEST_TYPE.SIGNAL_IPC_EVENT:
{
int SourcePlayerId = (int)ScriptParameters[1];
int SourceServerId = (int)ScriptParameters[2];
int DestinationPlayerId = (int)ScriptParameters[3];
int DestinationServerId = (int)ScriptParameters[4];
int EventType = (int)ScriptParameters[5];
string EventText = (string)ScriptParameters[6];
SignalIPCEvent(SourcePlayerId, SourceServerId, DestinationPlayerId, DestinationServerId, EventType, EventText);
ReturnCode = 0;
}
break;
case REQUEST_TYPE.RESOLVE_CHARACTER_NAME_TO_PLAYER_ID:
{
string CharacterName = (string)ScriptParameters[6];
ReturnCode = ResolveCharacterNameToPlayerId(CharacterName);
}
break;
case REQUEST_TYPE.RESOLVE_PLAYER_NAME:
{
string PlayerName = (string)ScriptParameters[6];
ReturnCode = ResolvePlayerName(PlayerName);
}
break;
case REQUEST_TYPE.RESOLVE_PLAYER_ID_TO_SERVER_ID:
{
int PlayerId = (int)ScriptParameters[1];
ReturnCode = ResolvePlayerIdToServerId(PlayerId);
}
break;
case REQUEST_TYPE.LIST_ONLINE_USERS:
{
uint PlayerObject = OBJECT_SELF;
ListOnlineUsers(PlayerObject);
ReturnCode = 0;
}
break;
case REQUEST_TYPE.HANDLE_CHAT_EVENT:
{
int ChatMode = (int)ScriptParameters[1];
string ChatText = (string)ScriptParameters[6];
uint SenderObjectId = OBJECT_SELF;
ReturnCode = HandleChatEvent(ChatMode, ChatText, SenderObjectId);
}
break;
case REQUEST_TYPE.HANDLE_CLIENT_ENTER:
{
uint SenderObjectId = OBJECT_SELF;
HandleClientEnter(SenderObjectId);
ReturnCode = 0;
}
break;
case REQUEST_TYPE.IS_SERVER_ONLINE:
{
int ServerId = (int)ScriptParameters[1];
ReturnCode = IsServerOnline(ServerId) ? TRUE : FALSE;
}
break;
case REQUEST_TYPE.ACTIVATE_SERVER_TO_SERVER_PORTAL:
{
int ServerId = (int)ScriptParameters[1];
int PortalId = (int)ScriptParameters[2];
uint PlayerObjectId = OBJECT_SELF;
ActivateServerToServerPortal(ServerId, PortalId, PlayerObjectId);
ReturnCode = 0;
}
break;
case REQUEST_TYPE.HANDLE_CLIENT_LEAVE:
{
uint SenderObjectId = OBJECT_SELF;
HandleClientLeave(SenderObjectId);
ReturnCode = 0;
}
break;
case REQUEST_TYPE.POPULATE_CHAT_SELECT:
{
uint PlayerObject = OBJECT_SELF;
ACR_PopulateChatSelect(PlayerObject);
ReturnCode = 0;
}
break;
case REQUEST_TYPE.HANDLE_LATENCY_CHECK_RESPONSE:
{
uint PlayerObject = OBJECT_SELF;
HandleLatencyCheckResponse(PlayerObject);
ReturnCode = 0;
}
break;
case REQUEST_TYPE.GET_PLAYER_LATENCY:
{
uint PlayerObject = OBJECT_SELF;
ReturnCode = GetPlayerLatency(PlayerObject);
}
break;
case REQUEST_TYPE.DISABLE_CHARACTER_SAVE:
{
uint PlayerObject = OBJECT_SELF;
ReturnCode = DisableCharacterSave(PlayerObject) ? TRUE : FALSE;
}
break;
case REQUEST_TYPE.ENABLE_CHARACTER_SAVE:
{
uint PlayerObject = OBJECT_SELF;
ReturnCode = EnableCharacterSave(PlayerObject) ? TRUE : FALSE;
}
break;
case REQUEST_TYPE.PAUSE_HEARTBEAT:
{
//
// Default processing in DispatchPeriodicEvents runs
// below.
//
ReturnCode = 0;
}
break;
case REQUEST_TYPE.HANDLE_QUARANTINE_PLAYER:
{
uint PlayerObject = OBJECT_SELF;
ReturnCode = HandleQuarantinePlayer(PlayerObject) ? TRUE : FALSE;
}
break;
case REQUEST_TYPE.HANDLE_GUI_RESYNC:
{
int SourceServerId = (int)ScriptParameters[1];
string ResyncCommand = (string)ScriptParameters[6];
ReturnCode = GUIResynchronizer.HandleGUIResync(SourceServerId, ResyncCommand, this);
}
break;
case REQUEST_TYPE.IS_SERVER_PUBLIC:
{
int ServerId = (int)ScriptParameters[1];
ReturnCode = IsServerPublic(ServerId) ? TRUE : FALSE;
}
break;
case REQUEST_TYPE.HANDLE_SERVER_PING_RESPONSE:
{
int SourceServerId = (int)ScriptParameters[1];
string Argument = (string)ScriptParameters[6];
ReturnCode = ServerLatencyMeasurer.HandleServerPingResponse(SourceServerId, Argument, this);
}
break;
default:
throw new ApplicationException("Invalid IPC script command " + RequestType.ToString());
}
//
// Now that we are done, check if we've got any entries in the
// local command queue to drain from the IPC worker thread, e.g. a
// tell to deliver.
//
DispatchPeriodicEvents();
return ReturnCode;
}