public override void Handle(NecClient client, NecPacket packet) { int characterId = packet.data.ReadInt32(); Character character = database.SelectCharacterById(characterId); if (character == null) { _Logger.Error(client, $"No character for CharacterId: {characterId}"); client.Close(); return; } server.instances.AssignInstance(character); client.character = character; client.character.criminalState = client.soul.criminalLevel; client.UpdateIdentity(); client.character.CreateTask(server, client); _Logger.Debug(client, $"Selected Character: {character.name}"); IBuffer res3 = BufferProvider.Provide(); res3.WriteInt32(0); //ERR-CHARSELECT error check res3.WriteUInt32(client.character.instanceId); //sub_4E4210_2341 res3.WriteInt32(client.character.mapId); res3.WriteInt32(client.character.mapId); res3.WriteInt32(client.character.mapId); res3.WriteByte(0); res3.WriteByte(0); //Bool res3.WriteFixedString(settings.dataAreaIpAddress, 0x41); //IP res3.WriteUInt16(settings.areaPort); //Port res3.WriteFloat(client.character.x); res3.WriteFloat(client.character.y); res3.WriteFloat(client.character.z); res3.WriteByte(client.character.heading); router.Send(client, (ushort)MsgPacketId.recv_chara_select_r, res3, ServerType.Msg); /* * ERR_CHARSELECT GENERIC Failed to select a character (CODE:<errcode>) * ERR_CHARSELECT -8 Maintenance * ERR_CHARSELECT -13 You have selected an illegal character */ //Logic to support your dead body //Make this static. need a predictable deadbody instance ID to support disconnect/reconnet DeadBody deadBody = new DeadBody(); deadBody.id = character.id; server.instances.AssignInstance(deadBody); character.deadBodyInstanceId = deadBody.instanceId; deadBody.characterInstanceId = character.instanceId; _Logger.Debug($"Dead Body Instance ID {deadBody.instanceId} | Character Instance ID {character.instanceId}"); }
public override void Handle(NecClient client, NecPacket packet) { client.Character.mapChange = false; int mapId = packet.Data.ReadInt32(); Map map = Server.Maps.Get(mapId); if (map == null) { Logger.Error(client, $"MapId: {mapId} not found in map lookup"); client.Close(); return; } map.Enter(client); IBuffer res = BufferProvider.Provide(); res.WriteInt32(0); Router.Send(client, (ushort)AreaPacketId.recv_map_entry_r, res, ServerType.Area); }
public override void Handle(NecClient client, NecPacket packet) { string soulPassword = packet.Data.ReadCString(); Soul soul = client.Soul; soul.Password = soulPassword; if (!Database.UpdateSoul(soul)) { Logger.Error(client, $"Failed to save password for SoulId: {soul.Id}"); client.Close(); return; } IBuffer res = BufferProvider.Provide(); res.WriteInt32(0); res.WriteByte(0); // bool in JP client TODO what is it in US??? Router.Send(client, (ushort)MsgPacketId.recv_soul_set_passwd_r, res, ServerType.Msg); }
public override void Handle(NecClient client, NecPacket packet) { string soulPassword = packet.Data.ReadCString(); IBuffer res = BufferProvider.Provide(); if (Settings.RequirePin && client.Soul.Password != soulPassword) { res.WriteInt32(1); // Error: 0 - Success, other vales (maybe) error code res.WriteByte(0); // 0 = OK | 1 = need to change soul name (bool type) true = other values, false - 0 Router.Send(client, (ushort)MsgPacketId.recv_soul_authenticate_passwd_r, res, ServerType.Msg); client.Close(); return; } res.WriteInt32(0); // Error: 0 - Success, other vales (maybe) error code res.WriteByte(0); // 0 = OK | 1 = need to change soul name (bool type) true = other values, false - 0 Router.Send(client, (ushort)MsgPacketId.recv_soul_authenticate_passwd_r, res, ServerType.Msg); }
public override void Handle(NecClient client, NecPacket packet) { if (!server.maps.TryGet(client.character.mapId, out Map map)) { _Logger.Error(client, $"No map found for MapId: {client.character.mapId}"); client.Close(); return; } int channelId = packet.data.ReadInt32(); client.character.channel = channelId; IBuffer res = BufferProvider.Provide(); res.WriteInt32(0); //Error Check //sub_4E4210_2341 // impacts map spawn ID (old Comment) res.WriteInt32(map.id); //MapSerialID res.WriteInt32(channelId); //channel?????? res.WriteFixedString(settings.dataAreaIpAddress, 0x41); //IP? res.WriteUInt16(settings.areaPort); //Port //sub_484420 // does not impact map spawn coord (old Comment) res.WriteFloat(client.character.x); //X Pos res.WriteFloat(client.character.y); //Y Pos res.WriteFloat(client.character.z); //Z Pos res.WriteByte(client.character.heading); //View offset // router.Send(client, (ushort)MsgPacketId.recv_channel_select_r, res, ServerType.Msg); map.EnterForce(client); SendEventEnd(client); IBuffer res2 = BufferProvider.Provide(); res2.WriteUInt32(client.character.instanceId); res2.WriteCString("IsThisMyChannel?????"); //Length to be Found router.Send(server.clients.GetAll(), (ushort)AreaPacketId.recv_channel_notify, res2, ServerType.Area); }
public override void Handle(NecClient client, NecPacket packet) { string soulName = packet.data.ReadCString(); List <Soul> souls = database.SelectSoulsByAccountId(client.account.id); foreach (Soul soul in souls) { if (soul.name == soulName) { client.soul = soul; break; } } IBuffer res = BufferProvider.Provide(); if (client.soul == null) { _Logger.Error(client, $"Soul with name: '{soulName}' not found"); res.WriteInt32(1); // 0 = OK | 1 = Failed to return to soul selection router.Send(client, (ushort)MsgPacketId.recv_soul_select_r, res, ServerType.Msg); client.Close(); return; } res.WriteInt32(0); // 0 = OK | 1 = Failed to return to soul selection if (client.soul.password == null) { _Logger.Info(client, "Password not set, initiating set password"); res.WriteByte(0); // bool - 0 = Set New Password | 1 = Enter Password } else { res.WriteByte(1); // bool - 0 = Set New Password | 1 = Enter Password } router.Send(client, (ushort)MsgPacketId.recv_soul_select_r, res, ServerType.Msg); }
public override void Handle(NecClient client, NecPacket packet) { byte unknown = packet.Data.ReadByte(); string soulName = packet.Data.ReadCString(); Soul soul = new Soul(); soul.Name = soulName; soul.AccountId = client.Account.Id; if (!Database.InsertSoul(soul)) { Logger.Error(client, $"Failed to create SoulName: {soulName}"); client.Close(); return; } client.Soul = soul; Logger.Info($"Created SoulName: {soulName}"); IBuffer res = BufferProvider.Provide(); res.WriteInt32(0); Router.Send(client, (ushort)MsgPacketId.recv_soul_create_r, res, ServerType.Msg); }
public override void Handle(NecClient client, NecPacket packet) { int characterId = packet.Data.ReadInt32(); //Character character = Database.SelectCharacterById(characterId); Character character = Server.Characters.GetByCharacterId(characterId); if (character == null) { Logger.Error(client, $"No character for CharacterId: {characterId}"); client.Close(); return; } //Server.Instances.AssignInstance(character); //moved to database load. client.Character = character; client.UpdateIdentity(); client.Character.CreateTask(Server, client); Logger.Debug(client, $"Selected Character: {character.Name}"); IBuffer res3 = BufferProvider.Provide(); res3.WriteInt32(0); //ERR-CHARSELECT error check res3.WriteUInt32(client.Character.InstanceId); //sub_4E4210_2341 // res3.WriteInt32(client.Character.MapId); //MapSerialID //passeed to Send_Map_Entry res3.WriteInt32(client.Character.MapId); //MapID res3.WriteFixedString(Settings.DataAreaIpAddress, 0x41); //IP res3.WriteUInt16(Settings.AreaPort); //Port res3.WriteFloat(client.Character.X); res3.WriteFloat(client.Character.Y); res3.WriteFloat(client.Character.Z); res3.WriteByte(client.Character.Heading); Router.Send(client, (ushort)MsgPacketId.recv_chara_select_r, res3, ServerType.Msg); /* * ERR_CHARSELECT GENERIC Failed to select a character (CODE:<errcode>) * ERR_CHARSELECT -8 Maintenance * ERR_CHARSELECT -13 You have selected an illegal character */ //Logic to support your dead body //Do Dead Body IDs need to be persistant, or can they change at each login? TODO... DeadBody deadBody = new DeadBody(); Server.Instances.AssignInstance(deadBody); character.DeadBodyInstanceId = deadBody.InstanceId; deadBody.CharacterInstanceId = character.InstanceId; character.movementId = character.InstanceId; Logger.Debug( $"Dead Body Instance ID {deadBody.InstanceId} | Character Instance ID {character.InstanceId}"); deadBody.CharaName = character.Name; deadBody.MapId = character.MapId; deadBody.X = character.X; deadBody.Y = character.Y; deadBody.Z = character.Z; deadBody.Heading = character.Heading; deadBody.RaceId = character.Raceid; deadBody.SexId = character.Sexid; deadBody.HairStyle = character.HairId; deadBody.HairColor = character.HairColorId; deadBody.FaceId = character.FaceId; }
private void CreateShortcutBars(NecClient client, Character character, uint class_id) { ShortcutBar shortcutBar0 = new ShortcutBar(); if (class_id == 0) // Fighter { shortcutBar0.Slot0 = 11101; shortcutBar0.Action0 = 3; shortcutBar0.Slot1 = 11201; shortcutBar0.Action1 = 3; } else if (class_id == 1) // Thief { shortcutBar0.Slot0 = 14101; shortcutBar0.Action0 = 3; shortcutBar0.Slot1 = 14302; shortcutBar0.Action1 = 3; shortcutBar0.Slot2 = 14803; shortcutBar0.Action2 = 3; } else if (class_id == 2) // Mage { shortcutBar0.Slot0 = 13101; shortcutBar0.Action0 = 3; shortcutBar0.Slot1 = 13404; shortcutBar0.Action1 = 3; } else if (class_id == 3) // Priest { shortcutBar0.Slot0 = 12501; shortcutBar0.Action0 = 3; shortcutBar0.Slot1 = 12601; shortcutBar0.Action1 = 3; } shortcutBar0.Slot4 = 11; shortcutBar0.Action4 = 4; shortcutBar0.Slot6 = 18; shortcutBar0.Action6 = 4; shortcutBar0.Slot7 = 22; shortcutBar0.Action7 = 4; shortcutBar0.Slot9 = 2; shortcutBar0.Action9 = 4; if (!Database.InsertShortcutBar(shortcutBar0)) { Logger.Error(client, $"Failed to create ShortcutBar0"); client.Close(); character.shortcutBar0Id = -1; return; } character.shortcutBar0Id = shortcutBar0.Id; ShortcutBar shortcutBar1 = new ShortcutBar(); shortcutBar1.Slot0 = 1; shortcutBar1.Action0 = 5; shortcutBar1.Slot1 = 2; shortcutBar1.Action1 = 5; shortcutBar1.Slot2 = 4; shortcutBar1.Action2 = 5; shortcutBar1.Slot3 = 5; shortcutBar1.Action3 = 5; shortcutBar1.Slot4 = 6; shortcutBar1.Action4 = 5; shortcutBar1.Slot5 = 7; shortcutBar1.Action5 = 5; shortcutBar1.Slot6 = 11; shortcutBar1.Action6 = 5; shortcutBar1.Slot7 = 14; shortcutBar1.Action7 = 5; shortcutBar1.Slot8 = 15; shortcutBar1.Action8 = 5; shortcutBar1.Slot9 = 16; shortcutBar1.Action9 = 5; if (!Database.InsertShortcutBar(shortcutBar1)) { Logger.Error(client, $"Failed to create ShortcutBar1"); client.Close(); character.shortcutBar1Id = -1; return; } character.shortcutBar1Id = shortcutBar1.Id; ShortcutBar shortcutBar2 = new ShortcutBar(); if (!Database.InsertShortcutBar(shortcutBar2)) { Logger.Error(client, $"Failed to create ShortcutBar2"); client.Close(); character.shortcutBar2Id = -1; return; } character.shortcutBar2Id = shortcutBar2.Id; ShortcutBar shortcutBar3 = new ShortcutBar(); if (!Database.InsertShortcutBar(shortcutBar3)) { Logger.Error(client, $"Failed to create ShortcutBar3"); client.Close(); character.shortcutBar3Id = -1; return; } character.shortcutBar3Id = shortcutBar3.Id; ShortcutBar shortcutBar4 = new ShortcutBar(); if (!Database.InsertShortcutBar(shortcutBar4)) { Logger.Error(client, $"Failed to create ShortcutBar4"); client.Close(); character.shortcutBar4Id = -1; return; } character.shortcutBar4Id = shortcutBar4.Id; }
public override void Handle(NecClient client, NecPacket packet) { byte character_slot_id = packet.Data.ReadByte(); string character_name = packet.Data.ReadCString(); uint race_id = packet.Data.ReadUInt32(); uint sex_id = packet.Data.ReadUInt32(); byte hair_id = packet.Data.ReadByte(); byte hair_color_id = packet.Data.ReadByte(); byte face_id = packet.Data.ReadByte(); uint alignment_id = packet.Data.ReadUInt32(); ushort strength = packet.Data.ReadUInt16(); ushort vitality = packet.Data.ReadUInt16(); ushort dexterity = packet.Data.ReadUInt16(); ushort agility = packet.Data.ReadUInt16(); ushort intelligence = packet.Data.ReadUInt16(); ushort piety = packet.Data.ReadUInt16(); ushort luck = packet.Data.ReadUInt16(); uint class_id = packet.Data.ReadUInt32(); uint unknown_a = packet.Data.ReadUInt32(); //------------------------------------- // Send Character Creation packets to Database for laster use. if (!Maps.TryGet(Map.NewCharacterMapId, out Map map)) { Logger.Error($"New character map not found MapId: {Map.NewCharacterMapId}"); client.Close(); } Character character = new Character(); Server.Instances.AssignInstance(character); character.MapId = map.Id; character.X = map.X; character.Y = map.Y; character.Z = map.Z; character.Heading = (byte)map.Orientation; character.AccountId = client.Account.Id; character.SoulId = client.Soul.Id; character.Slot = character_slot_id; character.Name = character_name; character.Raceid = race_id; character.Sexid = sex_id; character.HairId = hair_id; character.HairColorId = hair_color_id; character.FaceId = face_id; character.Alignmentid = alignment_id; character.Strength = strength; character.vitality = vitality; character.dexterity = dexterity; character.agility = agility; character.intelligence = intelligence; character.piety = piety; character.luck = luck; character.ClassId = class_id; CreateShortcutBars(client, character, class_id); //---------------------------------------------------------- // Character Slot ID if (!Database.InsertCharacter(character)) { Logger.Error(client, $"Failed to create CharacterSlot: {character_slot_id}"); client.Close(); return; } CreateSkillTreeItems(client, character, class_id); client.Character = character; Logger.Info($"Created CharacterSlot: {character_slot_id}"); Logger.Info($"Created CharacterName: {character_name}"); Logger.Info($"Created race: {race_id}"); Logger.Info($"Created sex: {sex_id}"); Logger.Info($"Created hair: {hair_id}"); Logger.Info($"Created hair color: {hair_color_id}"); Logger.Info($"Created faceid: {face_id}"); Logger.Info($"Created alignment_id: {alignment_id}"); Logger.Info($"Created strength: {strength}"); Logger.Info($"Created vitality: {vitality}"); Logger.Info($"Created dexterity: {dexterity}"); Logger.Info($"Created agility: {agility}"); Logger.Info($"Created intelligence: {intelligence}"); Logger.Info($"Created piety: {piety}"); Logger.Info($"Created luck: {luck}"); Logger.Info($"Created class_id: {class_id}"); //------------------------------------------------------------------------------- Server.Characters.Add(character); //------------------------------------------------------------------------------- IBuffer res = BufferProvider.Provide(); res.WriteInt32(0); res.WriteInt32(character.Id); //CharacterId Router.Send(client, (ushort)MsgPacketId.recv_chara_create_r, res, ServerType.Msg); }
private void CreateSkillTreeItems(NecClient client, Character character, uint class_id) { if (class_id == 0) // Fighter { for (int i = 0; i < fighterSkills.Length; i++) { SkillTreeItem skillTreeItem = new SkillTreeItem(); skillTreeItem.Level = 1; skillTreeItem.SkillId = fighterSkills[i]; skillTreeItem.CharId = character.Id; if (!Database.InsertSkillTreeItem(skillTreeItem)) { Logger.Error(client, $"Failed to create SkillTreeItem"); client.Close(); return; } } } else if (class_id == 1) // Thief { for (int i = 0; i < thiefSkills.Length; i++) { SkillTreeItem skillTreeItem = new SkillTreeItem(); skillTreeItem.Level = 1; skillTreeItem.SkillId = thiefSkills[i]; skillTreeItem.CharId = character.Id; if (!Database.InsertSkillTreeItem(skillTreeItem)) { Logger.Error(client, $"Failed to create SkillTreeItem"); client.Close(); return; } } } else if (class_id == 2) // Mage { for (int i = 0; i < mageSkills.Length; i++) { SkillTreeItem skillTreeItem = new SkillTreeItem(); skillTreeItem.Level = 1; skillTreeItem.SkillId = mageSkills[i]; skillTreeItem.CharId = character.Id; if (!Database.InsertSkillTreeItem(skillTreeItem)) { Logger.Error(client, $"Failed to create SkillTreeItem"); client.Close(); return; } } } else if (class_id == 3) // Priest { for (int i = 0; i < priestSkills.Length; i++) { SkillTreeItem skillTreeItem = new SkillTreeItem(); skillTreeItem.Level = 1; skillTreeItem.SkillId = priestSkills[i]; skillTreeItem.CharId = character.Id; if (!Database.InsertSkillTreeItem(skillTreeItem)) { Logger.Error(client, $"Failed to create SkillTreeItem"); client.Close(); return; } } } }
public override void Handle(NecClient client, NecPacket packet) { byte characterSlotId = packet.data.ReadByte(); string characterName = packet.data.ReadCString(); uint raceId = packet.data.ReadUInt32(); uint sexId = packet.data.ReadUInt32(); byte hairId = packet.data.ReadByte(); byte hairColorId = packet.data.ReadByte(); byte faceId = packet.data.ReadByte(); byte faceArrangeId = packet.data.ReadByte(); byte voiceId = packet.data.ReadByte(); uint alignmentId = packet.data.ReadUInt32(); ushort strength = packet.data.ReadUInt16(); //bonus stat, not base ushort vitality = packet.data.ReadUInt16(); //bonus stat, not base ushort dexterity = packet.data.ReadUInt16(); //bonus stat, not base ushort agility = packet.data.ReadUInt16(); //bonus stat, not base ushort intelligence = packet.data.ReadUInt16(); //bonus stat, not base ushort piety = packet.data.ReadUInt16(); //bonus stat, not base ushort luck = packet.data.ReadUInt16(); //bonus stat, not base uint classId = packet.data.ReadUInt32(); int errorCheck = packet.data.ReadInt32(); byte unknown = packet.data.ReadByte(); //------------------------------------- // Send Character Creation packets to Database for laster use. if (!maps.TryGet(Map.NEW_CHARACTER_MAP_ID, out Map map)) { _Logger.Error($"New character map not found MapId: {Map.NEW_CHARACTER_MAP_ID}"); client.Close(); } Character character = new Character(); Attribute attribute = new Attribute(); attribute.DefaultClassAtributes(raceId); character.mapId = map.id; character.x = map.x; character.y = map.y; character.z = map.z; character.heading = map.orientation; character.accountId = client.account.id; character.soulId = client.soul.id; character.slot = characterSlotId; character.name = characterName; character.raceId = raceId; character.sexId = sexId; character.hairId = hairId; character.hairColorId = hairColorId; character.faceId = faceId; character.faceArrangeId = faceArrangeId; character.voiceId = voiceId; character.hp.SetMax(attribute.hp); character.hp.SetCurrent(attribute.hp); character.mp.SetMax(attribute.mp); character.mp.SetCurrent(attribute.mp); character.strength = (ushort)(strength + attribute.str); character.vitality = (ushort)(vitality + attribute.vit); character.dexterity = (ushort)(dexterity + attribute.dex); character.agility = (ushort)(agility + attribute.agi); character.intelligence = (ushort)(intelligence + attribute.@int); character.piety = (ushort)(piety + attribute.pie); character.luck = (ushort)(luck + attribute.luck); character.classId = classId; character.level = 1; //---------------------------------------------------------- // Character Slot ID if (!database.InsertCharacter(character)) { _Logger.Error(client, $"Failed to create CharacterSlot: {characterSlotId}"); client.Close(); return; } //after the DB instert, so Character has a valid ID. server.instances.AssignInstance(character); client.character = character; CreateSkillTreeItems(client, character, classId); CreateShortcutBars(client, character, classId); CreateEquipmentItems(client, character, classId); _Logger.Info($"Created CharacterSlot: {characterSlotId}"); _Logger.Info($"Created CharacterName: {characterName}"); _Logger.Info($"Created race: {raceId}"); _Logger.Info($"Created sex: {sexId}"); _Logger.Info($"Created hair: {hairId}"); _Logger.Info($"Created hair color: {hairColorId}"); _Logger.Info($"Created faceid: {faceId}"); _Logger.Info($"Created alignment_id: {alignmentId}"); _Logger.Info($"Created strength: {strength}"); _Logger.Info($"Created vitality: {vitality}"); _Logger.Info($"Created dexterity: {dexterity}"); _Logger.Info($"Created agility: {agility}"); _Logger.Info($"Created intelligence: {intelligence}"); _Logger.Info($"Created piety: {piety}"); _Logger.Info($"Created luck: {luck}"); _Logger.Info($"Created class_id: {classId}"); IBuffer res = BufferProvider.Provide(); res.WriteInt32(errorCheck); res.WriteInt32(character.id); //CharacterId router.Send(client, (ushort)MsgPacketId.recv_chara_create_r, res, ServerType.Msg); }
private void CreateSkillTreeItems(NecClient client, Character character, uint classId) { if (classId == 0) // Fighter { for (int i = 0; i < _fighterSkills.Length; i++) { SkillTreeItem skillTreeItem = new SkillTreeItem(); skillTreeItem.level = 1; skillTreeItem.skillId = _fighterSkills[i]; skillTreeItem.charId = character.id; if (!database.InsertSkillTreeItem(skillTreeItem)) { _Logger.Error(client, "Failed to create SkillTreeItem"); client.Close(); return; } } } else if (classId == 1) // Thief { for (int i = 0; i < _thiefSkills.Length; i++) { SkillTreeItem skillTreeItem = new SkillTreeItem(); skillTreeItem.level = 1; skillTreeItem.skillId = _thiefSkills[i]; skillTreeItem.charId = character.id; if (!database.InsertSkillTreeItem(skillTreeItem)) { _Logger.Error(client, "Failed to create SkillTreeItem"); client.Close(); return; } } } else if (classId == 2) // Mage { for (int i = 0; i < _mageSkills.Length; i++) { SkillTreeItem skillTreeItem = new SkillTreeItem(); skillTreeItem.level = 1; skillTreeItem.skillId = _mageSkills[i]; skillTreeItem.charId = character.id; if (!database.InsertSkillTreeItem(skillTreeItem)) { _Logger.Error(client, "Failed to create SkillTreeItem"); client.Close(); return; } } } else if (classId == 3) // Priest { for (int i = 0; i < _priestSkills.Length; i++) { SkillTreeItem skillTreeItem = new SkillTreeItem(); skillTreeItem.level = 1; skillTreeItem.skillId = _priestSkills[i]; skillTreeItem.charId = character.id; if (!database.InsertSkillTreeItem(skillTreeItem)) { _Logger.Error(client, "Failed to create SkillTreeItem"); client.Close(); return; } } } }