invertika_game.Game.AccountConnection.processMessage C# (CSharp) Method

processMessage() protected method

protected processMessage ( ISL.Server.Network.MessageIn msg ) : void
msg ISL.Server.Network.MessageIn
return void
        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;
                    }
            }
        }