public void OnWorldValidationPacketReceive(GamePacketReceiveEvent e) { if (e.Packet is WorldValidationPacket) { WorldValidationPacket request = (WorldValidationPacket)e.Packet; string username = request.Username; string sessionSecret = request.SessionKey; DisconnectReason dcReason = DisconnectReason.NoReason; Session session = Server.Instance.SessionManager.GetSession(username); if (session != null) { if (session.Secret == sessionSecret) { session.Address = e.SourceAddress; session.Port = e.SourcePort; } else { dcReason = DisconnectReason.InvalidSessionKey; } } else { dcReason = DisconnectReason.UnauthenticatedAccount; } if (dcReason != DisconnectReason.NoReason) { GeneralDisconnectNotifyPacket dcPacket = new GeneralDisconnectNotifyPacket(); dcPacket.DisconnectReason = dcReason; Server.Instance.SendGamePacket(dcPacket, GeneralPacketId.MSG_SERVER_DISCONNECT_NOTIFY, e.SourceAddress, e.SourcePort); } Server.Instance.Logger.Log("A client requested to validate their session. address=" + e.SourceAddress + " port=" + e.SourcePort + " username="******" dcReason=" + dcReason); } }
public void OnWorldCharacterDeleteRequestReceive(GamePacketReceiveEvent e) { if (e.Packet is WorldCharacterDeleteRequestPacket) { WorldCharacterDeleteRequestPacket request = (WorldCharacterDeleteRequestPacket)e.Packet; Session session = Server.Instance.SessionManager.GetSession(e.SourceAddress, e.SourcePort); if (session != null) { Server.Instance.Scheduler.RunTaskAsync( () => { long characterId = request.CharacterId; string name = String.Empty; bool isOwnedByRequester = false; MySqlHandle mySqlHandle = Server.Instance.DatabaseManager.GetMySqlHandle(); try { mySqlHandle.Open(); List <CharacterInfo> characterInfos = mySqlHandle.CharactersGetCharacterInfos(session.ActiveAccountInfo.AccountId); for (int i = 0; i < characterInfos.Count && !isOwnedByRequester; i++) { if (characterInfos[i].CharacterId == characterId) { isOwnedByRequester = true; name = characterInfos[i].Name; mySqlHandle.CharactersDeleteCharacter(characterId); } } mySqlHandle.Close(); } catch (Exception exc) { Server.Instance.LogDatabaseError(exc); } mySqlHandle.Free(); Server.Instance.Logger.Log("A client requested to delete a character. address=" + e.SourceAddress + " port=" + e.SourcePort + " name=" + name + " isOwnedByRequester=" + isOwnedByRequester); if (!isOwnedByRequester) { GeneralDisconnectNotifyPacket dcPacket = new GeneralDisconnectNotifyPacket(); dcPacket.DisconnectReason = DisconnectReason.CharacterNotFound; Server.Instance.SendGamePacket(dcPacket, GeneralPacketId.MSG_SERVER_DISCONNECT_NOTIFY, e.SourceAddress, e.SourcePort); } } ); } } }
public void OnWorldCharacterRenameRequestPacketReceive(GamePacketReceiveEvent e) { if (e.Packet is WorldCharacterRenameRequestPacket) { WorldCharacterRenameRequestPacket request = (WorldCharacterRenameRequestPacket)e.Packet; Session session = Server.Instance.SessionManager.GetSession(e.SourceAddress, e.SourcePort); if (session != null) { Server.Instance.Scheduler.RunTaskAsync( () => { ClientCharacterRenameResponsePacket response = new ClientCharacterRenameResponsePacket(); response.CharacterRenameResult = CharacterRenameResult.DenyInvalidCustomName; string oldName = String.Empty; string newName = request.NewName; long characterId = request.CharacterId; CharacterInfo characterInfo = null; MySqlHandle mySqlHandle = Server.Instance.DatabaseManager.GetMySqlHandle(); try { mySqlHandle.Open(); List <CharacterInfo> characterInfos = mySqlHandle.CharactersGetCharacterInfos(session.ActiveAccountInfo.AccountId); for (int i = 0; i < characterInfos.Count && characterInfo == null; i++) { if (characterInfos[i].CharacterId == characterId) { characterInfo = characterInfos[i]; } } if (characterInfo != null) { oldName = characterInfo.Name; bool success = mySqlHandle.CharactersSetPendingName(characterId, newName); if (success) { response.CharacterRenameResult = CharacterRenameResult.Allow; } else { response.CharacterRenameResult = CharacterRenameResult.DenyCustomNameTaken; mySqlHandle.CharactersUpdateLastLogout(characterId); } } mySqlHandle.Close(); } catch (Exception exc) { Server.Instance.LogDatabaseError(exc); } mySqlHandle.Free(); Server.Instance.SendGamePacket(response, ClientPacketId.MSG_CLIENT_CHARACTER_RENAME_RESPONSE, e.SourceAddress, e.SourcePort); Server.Instance.Scheduler.RunTask(() => Server.Instance.EventManager.Publish(new CharacterListRequestEvent(session))); Server.Instance.Logger.Log("A client requested to rename a character. address=" + e.SourceAddress + " port=" + e.SourcePort + " oldName=" + oldName + " newName=" + newName + " isOwnedByRequester=" + (characterInfo != null)); if (characterInfo != null) { GeneralDisconnectNotifyPacket dcPacket = new GeneralDisconnectNotifyPacket(); dcPacket.DisconnectReason = DisconnectReason.CharacterNotFound; Server.Instance.SendGamePacket(dcPacket, GeneralPacketId.MSG_SERVER_DISCONNECT_NOTIFY, e.SourceAddress, e.SourcePort); } } ); } } }
public void OnWorldLoginRequestPacketReceive(GamePacketReceiveEvent e) { if (e.Packet is WorldLoginRequestPacket) { WorldLoginRequestPacket request = (WorldLoginRequestPacket)e.Packet; Session session = Server.Instance.SessionManager.GetSession(e.SourceAddress, e.SourcePort); if (session != null) { Server.Instance.Scheduler.RunTaskAsync( () => { long characterId = request.CharacterId; CharacterInfo characterInfo = null; MySqlHandle mySqlHandle = Server.Instance.DatabaseManager.GetMySqlHandle(); try { mySqlHandle.Open(); List <CharacterInfo> characterInfos = mySqlHandle.CharactersGetCharacterInfos(session.ActiveAccountInfo.AccountId); for (int i = 0; i < characterInfos.Count && characterInfo == null; i++) { if (characterInfos[i].CharacterId == characterId) { characterInfo = characterInfos[i]; } } mySqlHandle.Close(); } catch (Exception exc) { Server.Instance.LogDatabaseError(exc); } mySqlHandle.Free(); if (characterInfo != null) { if (session.ActiveCharacterInfo == null || session.ActiveCharacterInfo.CharacterId == characterInfo.CharacterId) { if (characterInfo.ZoneId == 0) { characterInfo.ZoneId = 1000; } session.ActiveCharacterInfo = characterInfo; } ClientLoadStaticZonePacket response = new ClientLoadStaticZonePacket(); response.ZoneId = characterInfo.ZoneId; response.CloneId = characterInfo.CloneId; response.ZoneChecksum = Server.Instance.ZoneChecksumCache.GetZoneChecksum(characterInfo.ZoneId); response.EditorEnabled = (characterInfo.EditorLevel) > 0 ? (byte)1 : (byte)0; response.EditorLevel = characterInfo.EditorLevel; response.Position = characterInfo.Position; Server.Instance.SendGamePacket(response, ClientPacketId.MSG_CLIENT_LOAD_STATIC_ZONE, e.SourceAddress, e.SourcePort); } else { GeneralDisconnectNotifyPacket dcPacket = new GeneralDisconnectNotifyPacket(); dcPacket.DisconnectReason = DisconnectReason.CharacterNotFound; Server.Instance.SendGamePacket(dcPacket, GeneralPacketId.MSG_SERVER_DISCONNECT_NOTIFY, e.SourceAddress, e.SourcePort); } } ); } } }
public void OnWorldLevelLoadCompletePacketReceive(GamePacketReceiveEvent e) { if (e.Packet is WorldLevelLoadCompletePacket) { Session session = Server.Instance.SessionManager.GetSession(e.SourceAddress, e.SourcePort); if (session != null) { if (session.ActiveCharacterInfo != null) { WriteOnlyBinaryLdf ldfMap = new WriteOnlyBinaryLdf(); ldfMap.AddWideString("name", session.ActiveCharacterInfo.Name); ldfMap.AddBoolean("editor_enabled", session.ActiveCharacterInfo.EditorLevel > 0); ldfMap.AddInt32("editor_level", session.ActiveCharacterInfo.EditorLevel); ldfMap.AddInt32("template", 1); ldfMap.AddInt32("gmlevel", session.ActiveCharacterInfo.GmLevel); ldfMap.AddUInt64("objid", (ulong)session.ActiveCharacterInfo.CharacterId); ldfMap.AddFloat("position.x", session.ActiveCharacterInfo.Position.X); ldfMap.AddFloat("position.y", session.ActiveCharacterInfo.Position.Y); ldfMap.AddFloat("position.z", session.ActiveCharacterInfo.Position.Z); ldfMap.AddFloat("rotation.x", session.ActiveCharacterInfo.Rotation.X); ldfMap.AddFloat("rotation.y", session.ActiveCharacterInfo.Rotation.Y); ldfMap.AddFloat("rotation.z", session.ActiveCharacterInfo.Rotation.Z); ldfMap.AddFloat("rotation.w", session.ActiveCharacterInfo.Rotation.W); ClientCreateCharacterPacket response = new ClientCreateCharacterPacket(); response.LdfMap = ldfMap; Server.Instance.SendGamePacket(response, ClientPacketId.MSG_CLIENT_CREATE_CHARACTER, e.SourceAddress, e.SourcePort); Replica character = new Replica(session.ActiveCharacterInfo.CharacterId, null, 1, 0); character.Name = session.ActiveCharacterInfo.Name; ControllablePhysicsComponent controllablePhysicsComponent = new ControllablePhysicsComponent(); controllablePhysicsComponent.Position = session.ActiveCharacterInfo.Position; controllablePhysicsComponent.Rotation = session.ActiveCharacterInfo.Rotation; character.AddComponent(controllablePhysicsComponent); DestructibleComponent destructibleComponent = new DestructibleComponent(); character.AddComponent(destructibleComponent); StatsComponent statsComponent = new StatsComponent(); statsComponent.IsSmashable = false; statsComponent.FactionIds.Add(1); statsComponent.CurrentHealth = session.ActiveCharacterInfo.CurrentHealth; statsComponent.CurrentArmor = session.ActiveCharacterInfo.CurrentArmor; statsComponent.CurrentImagination = session.ActiveCharacterInfo.CurrentImagination; statsComponent.MaxHealth = session.ActiveCharacterInfo.MaxHealth; statsComponent.MaxArmor = session.ActiveCharacterInfo.MaxArmor; statsComponent.MaxImagination = session.ActiveCharacterInfo.MaxImagination; character.AddComponent(statsComponent); CharacterComponent characterComponent = new CharacterComponent(); characterComponent.CharacterInfo = session.ActiveCharacterInfo; characterComponent.AccountInfo = session.ActiveAccountInfo; character.AddComponent(characterComponent); InventoryComponent inventoryComponent = new InventoryComponent(); character.AddComponent(inventoryComponent); SkillComponent skillComponent = new SkillComponent(); character.AddComponent(skillComponent); RenderComponent renderComponent = new RenderComponent(); character.AddComponent(renderComponent); BbbComponent bbbComponent = new BbbComponent(); character.AddComponent(bbbComponent); ReplicaManager thingManager = Server.Instance.GetReplicaManager(session.ActiveCharacterInfo.ZoneId); thingManager.AddPlayer(session, character); ServerDoneLoadingAllObjectGameMessage serverDoneLoadingAllObjects = new ServerDoneLoadingAllObjectGameMessage(session.ActiveCharacterInfo.CharacterId); Server.Instance.SendGamePacket(serverDoneLoadingAllObjects, ClientPacketId.MSG_CLIENT_GAME_MSG, e.SourceAddress, e.SourcePort); } else { GeneralDisconnectNotifyPacket dcPacket = new GeneralDisconnectNotifyPacket(); dcPacket.DisconnectReason = DisconnectReason.CharacterCorruption; Server.Instance.SendGamePacket(dcPacket, GeneralPacketId.MSG_SERVER_DISCONNECT_NOTIFY, e.SourceAddress, e.SourcePort); } } } }