protected override void processMessage(MessageIn msg)
{
switch(msg.getId())
{
case Protocol.AGMSG_REGISTER_RESPONSE:
{
if(msg.readInt16()!=(short)DataVersion.DATA_VERSION_OK)
{
Logger.Write(LogLevel.Error, "Item database is outdated! Please update to prevent inconsistencies");
stop(); //Disconnect gracefully from account server.
//Stop gameserver to prevent inconsistencies.
System.Environment.Exit((int)ExitValue.EXIT_DB_EXCEPTION);
}
else
{
Logger.Write(LogLevel.Debug, "Local item database is in sync with account server.");
}
if(msg.readInt16()!=(short)Password.PASSWORD_OK)
{
Logger.Write(LogLevel.Error, "This game server sent a invalid password");
stop();
System.Environment.Exit((int)ExitValue.EXIT_BAD_CONFIG_PARAMETER);
}
//read world state variables
while(msg.getUnreadLength()>0)
{
string key=msg.readString();
string @value=msg.readString();
if(key!=""&&@value!="")
{
GameState.setVariableFromDbserver(key, @value);
}
}
}
break;
case Protocol.AGMSG_PLAYER_ENTER:
{
string token=msg.readString();
Character ptr=new Character(msg);
Program.gameHandler.addPendingCharacter(token, ptr);
}
break;
case Protocol.AGMSG_ACTIVE_MAP:
{
int mapId=msg.readInt16();
if(MapManager.activateMap(mapId))
{
// Set map variables
MapComposite m=MapManager.getMap(mapId);
int mapVarsNumber=msg.readInt16();
for(int i = 0;i < mapVarsNumber;++i)
{
string key=msg.readString();
string @value=msg.readString();
if(key!=""&&@value!="")
{
m.setVariableFromDbserver(key, @value);
}
}
//Recreate potential persistent floor items
Logger.Write(LogLevel.Debug, "Recreate persistant items on map {0}", mapId);
int floorItemsNumber=msg.readInt16();
for(int i = 0;i < floorItemsNumber;i += 4)
{
int itemId=msg.readInt32();
int amount=msg.readInt16();
int posX=msg.readInt16();
int posY=msg.readInt16();
ItemClass ic=Program.itemManager.getItem(itemId);
if(ic!=null)
{
Item item=new Item(ic, amount);
item.setMap(m);
Point dst=new Point(posX, posY);
item.setPosition(dst);
if(!GameState.insertOrDelete((Thing)item))
{
// The map is full.
Logger.Write(LogLevel.Debug, "Couldn't add floor item(s) {0} into map {1}", itemId, mapId);
return;
}
}
}
}
break;
}
case Protocol.AGMSG_SET_VAR_WORLD:
{
string key=msg.readString();
string @value=msg.readString();
GameState.setVariableFromDbserver(key, value);
Logger.Write(LogLevel.Debug, "Global variable \"{0}\" has changed to \"{1}\"", key, @value);
}
break;
case Protocol.AGMSG_REDIRECT_RESPONSE:
{
int id=msg.readInt32();
string token=msg.readString();
string address=msg.readString();
int port=msg.readInt16();
Program.gameHandler.completeServerChange(id, token, address, port);
}
break;
case Protocol.AGMSG_GET_VAR_CHR_RESPONSE:
{
int id=msg.readInt32();
string name=msg.readString();
string @value=msg.readString();
Quest.recoveredQuestVar(id, name, @value);
}
break;
case Protocol.CGMSG_CHANGED_PARTY:
{
// Character DB id
int charid=msg.readInt32();
// Party id, 0 for none
int partyid=msg.readInt32();
Program.gameHandler.updateCharacter(charid, partyid);
}
break;
case Protocol.CGMSG_POST_RESPONSE:
{
// get the character
Character character=Program.postMan.getCharacter(msg.readInt32());
// check character is still valid
if(character==null)
{
break;
}
string sender=msg.readString();
string letter=msg.readString();
Program.postMan.gotPost(character, sender, letter);
}
break;
case Protocol.CGMSG_STORE_POST_RESPONSE:
{
// get character
Character character=Program.postMan.getCharacter(msg.readInt32());
// check character is valid
if(character==null)
{
break;
}
//TODO: Get NPC to tell character if the sending of post
//was successful or not
}
break;
default:
{
Logger.Write(LogLevel.Warning, "Invalid message type");
break;
}
}
}