private PlayerCharacterSerializer pcSerializer = null; // Used for storing pc data #endregion Fields #region Methods private void handleCreateChar(PlayerCharacter pc, IncommingMessage msg) { if (pc.LoginState == PlayerCharacterLoginState.ClientVersionCorrect) { CreateCharIncommingMessage msgCreateChar = (CreateCharIncommingMessage)msg; // Is acceptable character name if (!pcAuthentication.IsAcceptablePlayerName(msgCreateChar.UserName)) { CreateCharNotOkOutgoingMessage msgCreateCharNotOk = (CreateCharNotOkOutgoingMessage)OutgoingMessagesFactory.Create(OutgoingMessageType.CREATE_CHAR_NOT_OK); msgCreateCharNotOk.Message = "This character name is not acceptable."; pc.PutMessageIntoMyQueue(msgCreateCharNotOk); return; } // Does character exist? if (pcAuthentication.Exists(msgCreateChar.UserName)) { // Character already exists CreateCharNotOkOutgoingMessage msgCreateCharNotOk = (CreateCharNotOkOutgoingMessage)OutgoingMessagesFactory.Create(OutgoingMessageType.CREATE_CHAR_NOT_OK); msgCreateCharNotOk.Message = "A character with that name already exists."; pc.PutMessageIntoMyQueue(msgCreateCharNotOk); return; } // TODO: Add check for appearace values // All ok. Create a character try { pcAuthentication.Create(msgCreateChar.UserName, msgCreateChar.Password); } catch (Exception ex) { logger.LogError(LogSource.World, "Failed to create player " + pc.Name, ex); CreateCharNotOkOutgoingMessage msgCreateCharNotOk = (CreateCharNotOkOutgoingMessage)OutgoingMessagesFactory.Create(OutgoingMessageType.CREATE_CHAR_NOT_OK); msgCreateCharNotOk.Message = "Server could not create the character."; pc.PutMessageIntoMyQueue(msgCreateCharNotOk); return; } // Clear character (current state of character is undefined!) pc.ClearEntityImplementation(); EntityAppearance appearance = new EntityAppearance(msgCreateChar.Type); appearance.Head = msgCreateChar.Head; appearance.Skin = msgCreateChar.Skin; appearance.Hair = msgCreateChar.Hair; appearance.Shirt = msgCreateChar.Shirt; appearance.Pants = msgCreateChar.Pants; appearance.Boots = msgCreateChar.Boots; pc.Name = msgCreateChar.UserName; pc.CreateSetInitialAppearance(appearance); EntityLocation location = new EntityLocation(); short deviation = mapManager.StartPointDeviation; location.X = (short)(mapManager.StartPointX + (sbyte)WorldRNG.Next(-deviation, deviation)); location.Y = (short)(mapManager.StartPointY + (sbyte)WorldRNG.Next(-deviation, deviation)); location.Z = 0; location.Rotation = 0; location.CurrentMap = mapManager.StartPointMap; pc.CreateSetInitialLocation(location); // TODO: Apply race specific factors // Add bonus items ItemDefinition itmDef = null; // Royals itmDef = ItemDefinitionCache.GetItemDefinitionByID(5); if (itmDef != null) { Item itm = new Item(itmDef); itm.Quantity = 100; pc.InventoryUpdateItem(itm); } // Recalculate enerigies pc.CreateRecalculateInitialEnergies(); // Store data try { pc.ForceSerialization(); pc.Serialize(pcSerializer); } catch (Exception ex) { logger.LogError(LogSource.World, "Failed to serialize player " + pc.Name, ex); CreateCharNotOkOutgoingMessage msgCreateCharNotOk = (CreateCharNotOkOutgoingMessage)OutgoingMessagesFactory.Create(OutgoingMessageType.CREATE_CHAR_NOT_OK); msgCreateCharNotOk.Message = "Server could not create the character."; pc.PutMessageIntoMyQueue(msgCreateCharNotOk); return; } // Send char created ok message pc.PutMessageIntoMyQueue(msgStdCreateCharOk); } }