public static void Notify(ReceivablePacket packet) { // Read the data. int chatType = packet.ReadByte(); // 0 system, 1 normal chat, 2 personal message string senderName = packet.ReadString(); string message = packet.ReadString(); // Send the message. ChatBoxManager.Instance.SendMessageToChat(senderName + ": " + message, chatType); }
public EnterWorldRequest(GameClient client, ReceivablePacket packet) { // Read data. string characterName = packet.ReadString(); // Create a new PlayerInstance. Player player = new Player(client, characterName); // Add object to the world. WorldManager.AddObject(player); // Assign this player to client. client.SetActiveChar(player); // Send active player information to client. client.ChannelSend(new EnterWorldInformation(player)); // Send and receive visible object information. PlayerInformation playerInfo = new PlayerInformation(player); foreach (Player nearby in WorldManager.GetVisiblePlayers(player)) { // Send the information to the current player. client.ChannelSend(new PlayerInformation(nearby)); // Send information to the other player as well. nearby.ChannelSend(playerInfo); } }
public static void Notify(ReceivablePacket packet) { long objectId = packet.ReadLong(); CharacterDataHolder characterData = new CharacterDataHolder(); characterData.SetName(packet.ReadString()); characterData.SetRace((byte)packet.ReadByte()); characterData.SetHeight(packet.ReadFloat()); characterData.SetBelly(packet.ReadFloat()); characterData.SetHairType((byte)packet.ReadByte()); characterData.SetHairColor(packet.ReadInt()); characterData.SetSkinColor(packet.ReadInt()); characterData.SetEyeColor(packet.ReadInt()); characterData.SetHeadItem(packet.ReadInt()); characterData.SetChestItem(packet.ReadInt()); characterData.SetLegsItem(packet.ReadInt()); characterData.SetHandsItem(packet.ReadInt()); characterData.SetFeetItem(packet.ReadInt()); characterData.SetLeftHandItem(packet.ReadInt()); characterData.SetRightHandItem(packet.ReadInt()); characterData.SetX(packet.ReadFloat()); characterData.SetY(packet.ReadFloat()); characterData.SetZ(packet.ReadFloat()); characterData.SetHeading(packet.ReadFloat()); WorldManager.Instance.UpdateObject(objectId, characterData); }
public CharacterSelectionInfoRequest(GameClient client, ReceivablePacket packet) { // Read data. string accountName = packet.ReadString().ToLowerInvariant(); // If account has logged send the information. if (client.GetAccountName().Equals(accountName)) { client.ChannelSend(new CharacterSelectionInfoResult(accountName)); } }
public static void notify(ReceivablePacket packet) { // Get player list size. int listSize = packet.ReadByte(); // Read the data. ArrayList characterList = new ArrayList(listSize); for (int i = 0; i < listSize; i++) { CharacterDataHolder characterData = new CharacterDataHolder(); characterData.SetName(packet.ReadString()); characterData.SetSlot((byte)packet.ReadByte()); characterData.SetSelected(packet.ReadByte() == 1 ? true : false); characterData.SetClassId((byte)packet.ReadByte()); characterData.SetLocationName(packet.ReadString()); characterData.SetX(packet.ReadFloat()); characterData.SetY(packet.ReadFloat()); characterData.SetZ(packet.ReadFloat()); characterData.SetHeading(packet.ReadInt()); characterData.SetExperience(packet.ReadLong()); characterData.SetHp(packet.ReadLong()); characterData.SetMp(packet.ReadLong()); characterData.SetAccessLevel((byte)packet.ReadByte()); characterData.SetItemHead(packet.ReadInt()); characterData.SetItemChest(packet.ReadInt()); characterData.SetItemGloves(packet.ReadInt()); characterData.SetItemLegs(packet.ReadInt()); characterData.SetItemBoots(packet.ReadInt()); characterData.SetItemRightHand(packet.ReadInt()); characterData.SetItemLeftHand(packet.ReadInt()); characterList.Add(characterData); } // Send the data. PlayerManager.instance.characterList = characterList; // Enable player selection. CharacterSelectionManager.instance.waitingServer = false; }
public ChatRequest(GameClient client, ReceivablePacket packet) { // Read data. string message = packet.ReadString(); // Handle message. Player sender = client.GetActiveChar(); if (sender != null) { ChatManager.HandleChat(sender, message); } }
public static void notify(ReceivablePacket packet) { int objectId = packet.ReadInt(); string playerName = packet.ReadString(); float posX = packet.ReadFloat(); float posY = packet.ReadFloat(); float posZ = packet.ReadFloat(); int posHeading = packet.ReadInt(); //TODO: Manage PlayerInformation WorldManager.instance.AddObject(objectId, posX, posY, posZ, posHeading); }
public static void Notify(ReceivablePacket packet) { // Get player list size. int listSize = packet.ReadByte(); // Read the data. List <CharacterDataHolder> characterList = new List <CharacterDataHolder>(listSize); for (int i = 0; i < listSize; i++) { CharacterDataHolder characterData = new CharacterDataHolder(); characterData.SetName(packet.ReadString()); characterData.SetSlot((byte)packet.ReadByte()); characterData.SetSelected(packet.ReadByte() == 1 ? true : false); characterData.SetRace((byte)packet.ReadByte()); characterData.SetHeight(packet.ReadFloat()); characterData.SetBelly(packet.ReadFloat()); characterData.SetHairType(packet.ReadByte()); characterData.SetHairColor(packet.ReadInt()); characterData.SetSkinColor(packet.ReadInt()); characterData.SetEyeColor(packet.ReadInt()); characterData.SetHeadItem(packet.ReadInt()); characterData.SetChestItem(packet.ReadInt()); characterData.SetLegsItem(packet.ReadInt()); characterData.SetHandsItem(packet.ReadInt()); characterData.SetFeetItem(packet.ReadInt()); characterData.SetLeftHandItem(packet.ReadInt()); characterData.SetRightHandItem(packet.ReadInt()); characterData.SetX(packet.ReadFloat()); characterData.SetY(packet.ReadFloat()); characterData.SetZ(packet.ReadFloat()); characterData.SetHeading(packet.ReadFloat()); characterData.SetExperience(packet.ReadLong()); characterData.SetCurrentHp(packet.ReadLong()); characterData.SetMaxHp(packet.ReadLong()); characterData.SetCurrentMp(packet.ReadLong()); characterData.SetMaxMp(packet.ReadLong()); characterData.SetAccessLevel((byte)packet.ReadByte()); characterList.Add(characterData); } // Send the data. MainManager.Instance.SetCharacterList(characterList); // Enable player selection. CharacterSelectionManager.Instance.SetWaitingServer(false); }
public EnterWorldRequest(GameClient client, ReceivablePacket packet) { // Read data. string characterName = packet.ReadString(); // Create a new PlayerInstance. Player player = new Player(client, characterName); // Add object to the world. WorldManager.AddObject(player); // Assign this player to client. client.SetActiveChar(player); // Send user interface information to client. client.ChannelSend(new PlayerOptionsInformation(player)); // TODO: Send all inventory items to client. // Use a task to send and receive nearby player information, // because we need to have player initialization be complete in client side. Task.Delay(1000).ContinueWith(task => BroadcastAndReceiveInfo(player)); }
public AccountAuthenticationRequest(GameClient client, ReceivablePacket packet) { // Read data. double clientVersion = packet.ReadDouble(); string accountName = packet.ReadString().ToLowerInvariant(); string passwordHash = packet.ReadString(); // Client version check. if (clientVersion != Config.CLIENT_VERSION) { client.ChannelSend(new AccountAuthenticationResult(STATUS_INCORRECT_CLIENT)); return; } // Replace illegal characters. foreach (char c in Util.ILLEGAL_CHARACTERS) { accountName = accountName.Replace(c, '\''); } // Account name checks. if ((accountName.Length < 2) || (accountName.Length > 20) || accountName.Contains("'") || (passwordHash.Length == 0)) // 20 should not happen, checking it here in case of client cheat. { client.ChannelSend(new AccountAuthenticationResult(STATUS_NOT_FOUND)); return; } // Get data from database. string storedPassword = ""; int status = STATUS_NOT_FOUND; try { MySqlConnection con = DatabaseManager.GetConnection(); MySqlCommand cmd = new MySqlCommand(ACCOUNT_INFO_QUERY, con); cmd.Parameters.AddWithValue("account", accountName); MySqlDataReader reader = cmd.ExecuteReader(); while (reader.Read()) { storedPassword = reader.GetString("password"); status = reader.GetInt32("status"); } con.Close(); } catch (Exception e) { LogManager.Log(e.ToString()); } // In case of auto create accounts configuration. if ((status == 0) && Config.ACCOUNT_AUTO_CREATE) { // Create account. try { MySqlConnection con = DatabaseManager.GetConnection(); MySqlCommand cmd = new MySqlCommand(ACCOUNT_CREATE_QUERY, con); cmd.Parameters.AddWithValue("account", accountName); cmd.Parameters.AddWithValue("password", passwordHash); cmd.ExecuteNonQuery(); con.Close(); } catch (Exception e) { LogManager.Log(e.ToString()); } LogManager.Log("Created account " + accountName + "."); } else // Account status issue. { // 0 does not exist, 1 banned, 2 requires activation, 3 wrong password, 4 too many online, 100 authenticated if (status < STATUS_WRONG_PASSWORD) { client.ChannelSend(new AccountAuthenticationResult(status)); return; } // Wrong password. if (!passwordHash.Equals(storedPassword)) { client.ChannelSend(new AccountAuthenticationResult(STATUS_WRONG_PASSWORD)); return; } } // Kick existing logged client. GameClient existingClient = WorldManager.GetClientByAccountName(accountName); if (existingClient != null) { existingClient.ChannelSend(new Logout(accountName)); client.ChannelSend(new AccountAuthenticationResult(STATUS_ALREADY_ONLINE)); return; } // Too many online users. if (WorldManager.GetOnlineCount() >= Config.MAXIMUM_ONLINE_USERS) { client.ChannelSend(new AccountAuthenticationResult(STATUS_TOO_MANY_ONLINE)); return; } // Authentication was successful. WorldManager.AddClient(client); client.SetAccountName(accountName); client.ChannelSend(new AccountAuthenticationResult(STATUS_AUTHENTICATED)); // Update last login date and IP address. try { MySqlConnection con = DatabaseManager.GetConnection(); MySqlCommand cmd = new MySqlCommand(ACCOUNT_INFO_UPDATE_QUERY, con); cmd.Parameters.AddWithValue("last_active", DateTimeOffset.Now.ToUnixTimeSeconds()); cmd.Parameters.AddWithValue("ip", client.GetIp()); cmd.Parameters.AddWithValue("account", accountName); cmd.ExecuteNonQuery(); con.Close(); } catch (Exception e) { LogManager.Log(e.ToString()); } }
public CharacterCreationRequest(GameClient client, ReceivablePacket packet) { // Make sure player has authenticated. if ((client.GetAccountName() == null) || (client.GetAccountName().Length == 0)) { return; } // Read data. string characterName = packet.ReadString(); int race = packet.ReadByte(); float height = packet.ReadFloat(); float belly = packet.ReadFloat(); int hairType = packet.ReadByte(); int hairColor = packet.ReadInt(); int skinColor = packet.ReadInt(); int eyeColor = packet.ReadInt(); // Replace illegal characters. for (int i = 0; i < Util.ILLEGAL_CHARACTERS.Length; i++) { characterName = characterName.Replace(Util.ILLEGAL_CHARACTERS[i], '\''); } // Name character checks. if (characterName.Contains("'")) { client.ChannelSend(new CharacterCreationResult(INVALID_NAME)); return; } if ((characterName.Length < 2) || (characterName.Length > 12)) // 12 should not happen, checking it here in case of client cheat. { client.ChannelSend(new CharacterCreationResult(NAME_IS_TOO_SHORT)); return; } // Visual exploit checks. if ((race < 0 || race > 1) || (height < 0.39 || height > 0.61) || (hairType < 0 || hairType > 3) /*|| (!Config.VALID_SKIN_COLORS.Contains(skinColor))*/) // TODO: Check palette. { client.ChannelSend(new CharacterCreationResult(INVALID_PARAMETERS)); return; } // Account character count database check. int characterCount = 0; int lastCharacterSlot = 0; try { MySqlConnection con = DatabaseManager.GetConnection(); MySqlCommand cmd = new MySqlCommand(ACCOUNT_CHARACTER_QUERY, con); cmd.Parameters.AddWithValue("account", client.GetAccountName()); MySqlDataReader reader = cmd.ExecuteReader(); while (reader.Read()) { characterCount++; int slot = reader.GetInt32("slot"); if (slot > lastCharacterSlot) { lastCharacterSlot = slot; } } con.Close(); } catch (Exception e) { LogManager.Log(e.ToString()); } if (characterCount >= Config.ACCOUNT_MAX_CHARACTERS) { client.ChannelSend(new CharacterCreationResult(CANNOT_CREATE_ADDITIONAL_CHARACTERS)); return; } // Check database if name exists. bool characterExists = false; try { MySqlConnection con = DatabaseManager.GetConnection(); MySqlCommand cmd = new MySqlCommand(NAME_EXISTS_QUERY, con); { cmd.Parameters.AddWithValue("name", characterName); MySqlDataReader reader = cmd.ExecuteReader(); while (reader.Read()) { characterExists = true; } } con.Close(); } catch (Exception e) { LogManager.Log(e.ToString()); } if (characterExists) { client.ChannelSend(new CharacterCreationResult(NAME_ALREADY_EXISTS)); return; } // Make existing characters selected value false. try { MySqlConnection con = DatabaseManager.GetConnection(); MySqlCommand cmd = new MySqlCommand(CHARACTER_SELECTED_RESET_QUERY, con); cmd.Parameters.AddWithValue("account", client.GetAccountName()); cmd.ExecuteNonQuery(); con.Close(); } catch (Exception e) { LogManager.Log(e.ToString()); } // Create character. try { MySqlConnection con = DatabaseManager.GetConnection(); MySqlCommand cmd = new MySqlCommand(CHARACTER_CREATE_QUERY, con); cmd.Parameters.AddWithValue("account", client.GetAccountName()); cmd.Parameters.AddWithValue("name", characterName); cmd.Parameters.AddWithValue("slot", lastCharacterSlot + 1); cmd.Parameters.AddWithValue("selected", 1); // Selected character. cmd.Parameters.AddWithValue("race", race); cmd.Parameters.AddWithValue("height", height); cmd.Parameters.AddWithValue("belly", belly); cmd.Parameters.AddWithValue("hair_type", hairType); cmd.Parameters.AddWithValue("hair_color", hairColor); cmd.Parameters.AddWithValue("skin_color", skinColor); cmd.Parameters.AddWithValue("eye_color", eyeColor); cmd.Parameters.AddWithValue("x", Config.STARTING_LOCATION.GetX()); cmd.Parameters.AddWithValue("y", Config.STARTING_LOCATION.GetY()); cmd.Parameters.AddWithValue("z", Config.STARTING_LOCATION.GetZ()); cmd.Parameters.AddWithValue("heading", Config.STARTING_LOCATION.GetHeading()); cmd.Parameters.AddWithValue("experience", 0); // TODO: Implement Player level data. cmd.Parameters.AddWithValue("hp", 100); // TODO: Implement Player level data. cmd.Parameters.AddWithValue("mp", 100); // TODO: Implement Player level data. cmd.ExecuteNonQuery(); con.Close(); } catch (Exception e) { LogManager.Log(e.ToString()); } // Create a character_options entry for this character. try { MySqlConnection con = DatabaseManager.GetConnection(); MySqlCommand cmd = new MySqlCommand(CHARACTER_CREATE_OPTIONS_QUERY, con); cmd.Parameters.AddWithValue("name", characterName); cmd.ExecuteNonQuery(); con.Close(); } catch (Exception e) { LogManager.Log(e.ToString()); } // Add starting items. int itemCount = Config.STARTING_ITEMS.Count; if (itemCount > 0) { // Prepare query. StringBuilder query = new StringBuilder(CHARACTER_ITEM_START); List <ItemSlot> usedEquipableSlots = new List <ItemSlot>(); int inventorySlotCounter = 8; // First inventory item slot. foreach (int itemId in Config.STARTING_ITEMS) { query.Append("('"); query.Append(characterName); query.Append("',"); ItemTemplateHolder itemHolder = ItemData.GetItemTemplate(itemId); ItemSlot itemSlot = itemHolder.GetItemSlot(); if (itemHolder.GetItemType() == ItemType.EQUIP && !usedEquipableSlots.Contains(itemSlot)) { usedEquipableSlots.Add(itemSlot); query.Append((int)itemHolder.GetItemSlot()); } else { query.Append(inventorySlotCounter++); } query.Append(","); query.Append(itemId); query.Append(",1,0"); // quantity, enchant query.Append(")"); query.Append(itemCount-- == 1 ? ";" : ","); } // Store new item records. try { MySqlConnection con = DatabaseManager.GetConnection(); MySqlCommand cmd = new MySqlCommand(query.ToString(), con); cmd.ExecuteNonQuery(); con.Close(); } catch (Exception e) { LogManager.Log(e.ToString()); } } // Send success result. client.ChannelSend(new CharacterCreationResult(SUCCESS)); }
public CharacterCreationRequest(GameClient client, ReceivablePacket packet) { // Make sure player has authenticated. if ((client.GetAccountName() == null) || (client.GetAccountName().Length == 0)) { return; } // Read data. string characterName = packet.ReadString(); int classId = packet.ReadByte(); // Replace illegal characters. foreach (char c in Util.ILLEGAL_CHARACTERS) { characterName = characterName.Replace(c, '\''); } // Name character checks. if (characterName.Contains("'")) { client.ChannelSend(new CharacterCreationResult(INVALID_NAME)); return; } if ((characterName.Length < 2) || (characterName.Length > 12)) // 12 should not happen, checking it here in case of client cheat. { client.ChannelSend(new CharacterCreationResult(NAME_IS_TOO_SHORT)); return; } // Account character count database check. int characterCount = 0; int lastCharacterSlot = 0; try { MySqlConnection con = DatabaseManager.GetConnection(); MySqlCommand cmd = new MySqlCommand(ACCOUNT_CHARACTER_QUERY, con); cmd.Parameters.AddWithValue("account", client.GetAccountName()); MySqlDataReader reader = cmd.ExecuteReader(); while (reader.Read()) { characterCount++; int slot = reader.GetInt32("slot"); if (slot > lastCharacterSlot) { lastCharacterSlot = slot; } } con.Close(); } catch (Exception e) { LogManager.Log(e.ToString()); } if (characterCount >= Config.ACCOUNT_MAX_CHARACTERS) { client.ChannelSend(new CharacterCreationResult(CANNOT_CREATE_ADDITIONAL_CHARACTERS)); return; } // Check database if name exists. bool characterExists = false; try { MySqlConnection con = DatabaseManager.GetConnection(); MySqlCommand cmd = new MySqlCommand(NAME_EXISTS_QUERY, con); { cmd.Parameters.AddWithValue("name", characterName); MySqlDataReader reader = cmd.ExecuteReader(); while (reader.Read()) { characterExists = true; } } con.Close(); } catch (Exception e) { LogManager.Log(e.ToString()); } if (characterExists) { client.ChannelSend(new CharacterCreationResult(NAME_ALREADY_EXISTS)); return; } // Make existing characters selected value false. try { MySqlConnection con = DatabaseManager.GetConnection(); MySqlCommand cmd = new MySqlCommand(CHARACTER_SELECTED_RESET_QUERY, con); cmd.Parameters.AddWithValue("account", client.GetAccountName()); cmd.ExecuteNonQuery(); con.Close(); } catch (Exception e) { LogManager.Log(e.ToString()); } // Create character. try { MySqlConnection con = DatabaseManager.GetConnection(); MySqlCommand cmd = new MySqlCommand(CHARACTER_CREATE_QUERY, con); cmd.Parameters.AddWithValue("account", client.GetAccountName()); cmd.Parameters.AddWithValue("name", characterName); cmd.Parameters.AddWithValue("slot", lastCharacterSlot + 1); cmd.Parameters.AddWithValue("selected", 1); // Selected character. cmd.Parameters.AddWithValue("class_id", classId); cmd.Parameters.AddWithValue("location_name", "Start Location"); cmd.Parameters.AddWithValue("x", Config.STARTING_LOCATION.GetX()); cmd.Parameters.AddWithValue("y", Config.STARTING_LOCATION.GetY()); cmd.Parameters.AddWithValue("z", Config.STARTING_LOCATION.GetZ()); cmd.Parameters.AddWithValue("heading", Config.STARTING_LOCATION.GetHeading()); cmd.Parameters.AddWithValue("experience", 0); // TODO: Starting level experience. cmd.Parameters.AddWithValue("hp", 1); // TODO: Character stats HP. cmd.Parameters.AddWithValue("mp", 1); // TODO: Character stats MP. cmd.ExecuteNonQuery(); con.Close(); } catch (Exception e) { LogManager.Log(e.ToString()); } // Send success result. client.ChannelSend(new CharacterCreationResult(SUCCESS)); }
public static void Handle(GameClient client, ReceivablePacket packet) { /* * switch (packet.ReadShort()) // Packet id. * { * case 1: * new AccountAuthenticationRequest(client, packet); * break; * * case 2: * new CharacterSelectionInfoRequest(client, packet); * break; * * case 3: * new CharacterCreationRequest(client, packet); * break; * * case 4: * new CharacterDeletionRequest(client, packet); * break; * * case 5: * new CharacterSlotUpdate(client, packet); * break; * * case 6: * new CharacterSelectUpdate(client, packet); * break; * * case 7: * new EnterWorldRequest(client, packet); * break; * * case 8: * new ExitWorldRequest(client, packet); * break; * * case 9: * new LocationUpdateRequest(client, packet); * break; * * case 10: * new AnimatorUpdateRequest(client, packet); * break; * * case 11: * new ObjectInfoRequest(client, packet); * break; * * case 12: * new PlayerOptionsUpdate(client, packet); * break; * * case 13: * new ChatRequest(client, packet); * break; * } */ // Test receive. LogManager.Log("" + packet.ReadByte()); LogManager.Log("" + packet.ReadShort()); LogManager.Log("" + packet.ReadInt()); LogManager.Log("" + packet.ReadLong()); LogManager.Log("" + packet.ReadFloat()); LogManager.Log("" + packet.ReadDouble()); LogManager.Log("" + packet.ReadString()); // Test send. SendablePacket send = new SendablePacket(); send.WriteShort(1); // id send.WriteString("All is good!"); client.ChannelSend(send); }