void handleCharacterSelectMessage(AccountClient client, MessageIn msg) { MessageOut reply=new MessageOut(Protocol.APMSG_CHAR_SELECT_RESPONSE); ISL.Server.Account.Account acc=client.getAccount(); if(acc==null) { reply.writeInt8((int)ErrorMessage.ERRMSG_NO_LOGIN); client.send(reply); return; // not logged in } int slot=msg.readInt8(); Dictionary<uint, Character> chars=acc.getCharacters(); if(chars.ContainsKey((uint)slot)==false) { // Invalid char selection reply.writeInt8((int)ErrorMessage.ERRMSG_INVALID_ARGUMENT); client.send(reply); return; } Character selectedChar=chars[(uint)slot]; string address; int port; int charMapId=selectedChar.getMapId(); bool gameServerHasMap=GameServerHandler.getGameServerFromMap(charMapId, out address, out port); if(!gameServerHasMap) { Logger.Write(LogLevel.Error, "Character Selection: No game server for map #{0}", selectedChar.getMapId()); reply.writeInt8((int)ErrorMessage.ERRMSG_FAILURE); client.send(reply); return; } reply.writeInt8((int)ErrorMessage.ERRMSG_OK); Logger.Write(LogLevel.Debug, "{0} is trying to enter the servers.", selectedChar.getName()); string magic_token=Various.GetUniqueID(); reply.writeString(magic_token); reply.writeString(address); reply.writeInt16(port); // Give address and port for the chat server reply.writeString(Configuration.getValue("net_chatHost", "localhost")); // When the chatListenToClientPort is set, we use it. // Otherwise, we use the accountListenToClientPort + 2 if the option is set. // If neither, the DEFAULT_SERVER_PORT + 2 is used. int alternativePort=Configuration.getValue("net_accountListenToClientPort", Configuration.DEFAULT_SERVER_PORT)+2; reply.writeInt16(Configuration.getValue("net_chatListenToClientPort", alternativePort)); GameServerHandler.registerClient(magic_token, selectedChar); //TODO Überprüfen ob diese beiden Funktionen funktionieren ChatHandler.registerChatClient(magic_token, selectedChar.getName(), acc.getLevel()); client.send(reply); // log transaction Transaction trans=new Transaction(); trans.mCharacterId=(uint)selectedChar.getDatabaseID(); trans.mAction=(uint)TransactionMembers.TRANS_CHAR_SELECTED; Program.storage.addTransaction(trans); }
void handleCharacterCreateMessage(AccountClient client, MessageIn msg) { string name=msg.readString(); int hairStyle=msg.readInt8(); int hairColor=msg.readInt8(); int gender=msg.readInt8(); // Avoid creation of character from old clients. // int slot=-1; // if(msg.getUnreadLength()>7) // { int slot=msg.readInt8(); // } MessageOut reply=new MessageOut(Protocol.APMSG_CHAR_CREATE_RESPONSE); ISL.Server.Account.Account acc=client.getAccount(); if(acc==null) { reply.writeInt8((byte)ErrorMessage.ERRMSG_NO_LOGIN); } else if(!Program.stringFilter.filterContent(name)) { reply.writeInt8((byte)ErrorMessage.ERRMSG_INVALID_ARGUMENT); } else if(Program.stringFilter.findDoubleQuotes(name)) { reply.writeInt8((byte)ErrorMessage.ERRMSG_INVALID_ARGUMENT); } else if(hairStyle>mNumHairStyles) { reply.writeInt8((byte)Create.CREATE_INVALID_HAIRSTYLE); } else if(hairColor>mNumHairColors) { reply.writeInt8((byte)Create.CREATE_INVALID_HAIRCOLOR); } else if(gender>mNumGenders) { reply.writeInt8((byte)Create.CREATE_INVALID_GENDER); } else if((name.Length<mMinNameLength)|| (name.Length>mMaxNameLength)) { reply.writeInt8((byte)ErrorMessage.ERRMSG_INVALID_ARGUMENT); } else { if(Program.storage.doesCharacterNameExist(name)) { reply.writeInt8((byte)Create.CREATE_EXISTS_NAME); client.send(reply); return; } // An account shouldn't have more // than <account_maxCharacters> characters. Dictionary<uint, ISL.Server.Account.Character> chars=acc.getCharacters(); if(slot<1||slot>mMaxCharacters||!acc.isSlotEmpty((uint)slot)) { reply.writeInt8((byte)Create.CREATE_INVALID_SLOT); client.send(reply); return; } if((int)chars.Count>=mMaxCharacters) { reply.writeInt8((byte)Create.CREATE_TOO_MUCH_CHARACTERS); client.send(reply); return; } // TODO: Add race, face and maybe special attributes. // Customization of character's attributes... List<int> attributes=new List<int>(); //std::vector<int>(mModifiableAttributes.size(), 0); for(uint i = 0;i < mModifiableAttributes.Count;++i) { attributes.Add(msg.readInt16()); } int totalAttributes=0; for(uint i = 0;i < mModifiableAttributes.Count;++i) { // For good total attributes check. totalAttributes+=attributes[(int)i]; // For checking if all stats are >= min and <= max. if(attributes[(int)i]<mAttributeMinimum ||attributes[(int)i]>mAttributeMaximum) { reply.writeInt8((byte)Create.CREATE_ATTRIBUTES_OUT_OF_RANGE); client.send(reply); return; } } if(totalAttributes>mStartingPoints) { reply.writeInt8((byte)Create.CREATE_ATTRIBUTES_TOO_HIGH); } else if(totalAttributes<mStartingPoints) { reply.writeInt8((byte)Create.CREATE_ATTRIBUTES_TOO_LOW); } else { Character newCharacter=new Character(name); // Set the initial attributes provided by the client for(uint i = 0;i < mModifiableAttributes.Count;++i) { //TODO schauen was hier genau passieren muss //newCharacter.mAttributes.Add((uint)(mModifiableAttributes[(int)i]), mModifiableAttributes[i]); //newCharacter.mAttributes.Add((uint)mModifiableAttributes[(int)i], attributes[(int)i]); } foreach(KeyValuePair<uint, Attribute> defaultAttributePair in mDefaultAttributes) { //TODO schauen was hier genau passieren muss // newCharacter.mAttributes.Add(defaultAttributePair.Key, defaultAttributePair.Value); } newCharacter.setAccount(acc); newCharacter.setCharacterSlot((uint)slot); newCharacter.setGender(gender); newCharacter.setHairStyle(hairStyle); newCharacter.setHairColor(hairColor); newCharacter.setMapId(Configuration.getValue("char_startMap", 1)); Point startingPos=new Point(Configuration.getValue("char_startX", 1024), Configuration.getValue("char_startY", 1024)); newCharacter.setPosition(startingPos); acc.addCharacter(newCharacter); Logger.Write(LogLevel.Information, "Character {0} was created for {1}'s account.", name, acc.getName()); Program.storage.flush(acc); // flush changes // log transaction Transaction trans=new Transaction(); trans.mCharacterId=(uint)newCharacter.getDatabaseID(); trans.mAction=(uint)TransactionMembers.TRANS_CHAR_CREATE; trans.mMessage=acc.getName()+" created character "; trans.mMessage+="called "+name; Program.storage.addTransaction(trans); reply.writeInt8((byte)ErrorMessage.ERRMSG_OK); client.send(reply); // Send new characters infos back to client sendCharacterData(client, chars[(uint)slot]); return; } } client.send(reply); }