public ExitWorldRequest(GameClient client, ReceivablePacket packet) { WorldManager.RemoveObject(client.GetActiveChar()); }
public static void notify(ReceivablePacket packet) { CharacterCreationManager.instance.creationResult = packet.ReadByte(); }
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 Notify(ReceivablePacket packet) { CharacterSelectionManager.Instance.waitingServer = false; }
public static void Notify(ReceivablePacket packet) { CharacterCreationManager.Instance.SetCreationResult(packet.ReadByte()); }
public static void notify(ReceivablePacket packet) { int objectId = packet.ReadInt(); // TODO: Delete object from world. }
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; case 14: new TargetUpdateRequest(client, packet); break; } }
public static void Notify(ReceivablePacket packet) { LoginManager.Instance.status = packet.ReadByte(); }
protected override ReceivablePacket ReadPacket(ref SequenceReader <byte> reader) { if (ConnectionState == ConnectionState.Unauthenticated && reader.TryPeek(out byte firstByte) && firstByte == 0xFE) { // Server ping return(null); } if (!reader.TryReadVarInt(out int length)) { return(null); } long start = reader.Consumed; if (!reader.TryReadVarInt(out int packetId)) { return(null); } long idLength = reader.Consumed - start; ReceivablePacket packet = null; // Check handshake if (ConnectionState == ConnectionState.Unknown) { if (packetId != 0) { return(null); } packet = new C_Handshake(); } else if (ConnectionState == ConnectionState.Status) { packet = _selector.SelectStatusPacket(packetId); } else if (ConnectionState == ConnectionState.Unauthenticated) { packet = _selector.SelectLoginPacket(packetId); } else { packet = _selector.SelectPlayPacket(packetId); } if (CompressionEnabled) { } if (packet != null) { packet.Length = length; } else { Logger.LogInformation("Skipping {0} bytes", length); reader.Advance(length - idLength); } return(packet); }
public static void notify(ReceivablePacket packet) { // TODO: Read player information. }
public static void Process(ReceivablePacket packet) { long objectId = packet.ReadLong(); WorldManager.Instance.DeleteObject(objectId); }
public static void notify(ReceivablePacket packet) { AuthenticationManager.instance.status = packet.ReadByte(); }
public static void Process(ReceivablePacket packet) { LoginManager.Instance.SetStatus(packet.ReadByte()); }
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()); WorldManager.RemoveClient(existingClient); 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 CharacterDeletionRequest(GameClient client, ReceivablePacket packet) { // Read data. byte slot = (byte)packet.ReadByte(); // Get remaining character names. List <string> characterNames = new List <string>(); string deletedCharacterName = ""; 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()) { if ((byte)reader.GetInt16("slot") == slot) // TODO: Remove cast? { deletedCharacterName = reader.GetString("name"); } else { characterNames.Add(reader.GetString("name")); } } con.Close(); } catch (Exception e) { LogManager.Log(e.ToString()); } // Delete character. (Prefer to set access level to -1 and rename to name + deletion time.) long deleteTime = DateTimeOffset.Now.ToUnixTimeSeconds(); try { MySqlConnection con = DatabaseManager.GetConnection(); MySqlCommand cmd = new MySqlCommand(CHARACTER_DELETION_QUERY, con); cmd.Parameters.AddWithValue("name", deletedCharacterName + deleteTime); cmd.Parameters.AddWithValue("account", client.GetAccountName()); cmd.Parameters.AddWithValue("oldname", deletedCharacterName); cmd.ExecuteNonQuery(); con.Close(); } catch (Exception e) { LogManager.Log(e.ToString()); } // Delete character items. (Same as above, change item owner to name + deletion time.) try { MySqlConnection con = DatabaseManager.GetConnection(); MySqlCommand cmd = new MySqlCommand(CHARACTER_ITEM_DELETION_QUERY, con); cmd.Parameters.AddWithValue("owner", deletedCharacterName + deleteTime); cmd.Parameters.AddWithValue("oldowner", deletedCharacterName); cmd.ExecuteNonQuery(); con.Close(); } catch (Exception e) { LogManager.Log(e.ToString()); } // Delete character interface. (Same as above, change interface name to name + deletion time.) try { MySqlConnection con = DatabaseManager.GetConnection(); MySqlCommand cmd = new MySqlCommand(CHARACTER_INTERFACE_DELETION_QUERY, con); cmd.Parameters.AddWithValue("name", deletedCharacterName + deleteTime); cmd.Parameters.AddWithValue("oldname", deletedCharacterName); cmd.ExecuteNonQuery(); con.Close(); } catch (Exception e) { LogManager.Log(e.ToString()); } // Order remaining character slots. byte counter = 0; foreach (string characterName in characterNames) { counter++; try { MySqlConnection con = DatabaseManager.GetConnection(); MySqlCommand cmd = new MySqlCommand(CHARACTER_SLOT_UPDATE_QUERY, con); cmd.Parameters.AddWithValue("slot", counter); cmd.Parameters.AddWithValue("selected", ((counter == 1) && (slot == 1)) || (counter == (slot - 1)) ? 1 : 0); cmd.Parameters.AddWithValue("account", client.GetAccountName()); cmd.Parameters.AddWithValue("name", characterName); cmd.ExecuteNonQuery(); con.Close(); } catch (Exception e) { LogManager.Log(e.ToString()); } } // Notify the client that character was deleted. client.ChannelSend(new CharacterDeletionResult()); }
public static void Process(ReceivablePacket packet) { CharacterSelectionManager.Instance.SetWaitingServer(false); }
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); }