public static void LoadAddonInfoData(CharacterSession session, byte[] packedData, int packedSize, int unpackedSize) { // Check ZLib header (normal mode) if (packedData[0] == 0x78 && packedData[1] == 0x9C) { var unpackedAddonData = new byte[unpackedSize]; if (packedSize > 0) { using (var inflate = new DeflateStream(new MemoryStream(packedData, 2, packedSize - 6), CompressionMode.Decompress)) { var decompressed = new MemoryStream(); inflate.CopyTo(decompressed); decompressed.Seek(0, SeekOrigin.Begin); for (int i = 0; i < unpackedSize; i++) unpackedAddonData[i] = (byte)decompressed.ReadByte(); } } HandleAddonInfo(session, unpackedAddonData); } else { Log.Message(LogType.Error, "Wrong AddonInfo for Client '{0}'.", session.GetClientIP()); session.Dispose(); } }
public static bool InvokeHandler(Packet reader, CharacterSession session) { var message = reader.Header.Message; Log.Message(LogType.Packet, "Received Opcode: {0} (0x{0:X}), Length: {1}", message, reader.Data.Length); if (MessageHandlers.TryGetValue(message, out HandlePacket packet)) { packet.Invoke(reader, session); return true; } return false; }
public static void HandleAuthChallenge(CharacterSession session) { var authChallenge = new Packet(ServerMessage.AuthChallenge); // Part of the header authChallenge.Write<ushort>(0); authChallenge.Write(session.Challenge); for (int i = 0; i < 8; i++) authChallenge.Write<uint>(0); authChallenge.Write<byte>(1); session.Send(authChallenge); }
public static void OnCharDelete(Packet packet, CharacterSession session) { var guid = packet.Read<SmartGuid>(); if (guid.CreationBits > 0 && guid.Type == GuidType.Player) HandleDeleteChar(session, guid); }
public static void HandleAuthResponse(CharacterSession session) { }
public static void OnEnumCharacters(Packet packet, CharacterSession session) { }
public static void OnCharDelete(Packet packet, CharacterSession session) { }
public static void OnCreateCharacter(Packet packet, CharacterSession session) { var nameLength = packet.GetBits <int>(6); var useTemplateSet = packet.GetBit(); var raceId = packet.Read <Race>(); var classId = packet.Read <Class>(); var sexId = packet.Read <byte>(); var skinId = packet.Read <byte>(); var faceId = packet.Read <byte>(); var hairStyleId = packet.Read <byte>(); var hairColorId = packet.Read <byte>(); var facialHairStyleId = packet.Read <byte>(); packet.Skip(1); var name = packet.Read <string>(nameLength).ToLowerEnd(); var createChar = new Packet(ServerMessage.CreateChar); if (!ClientDB.ChrRaces.Any(c => c.Id == raceId) || !ClientDB.ChrClasses.Any(c => c.Id == classId)) { createChar.Write(CharCreateCode.Failed); session.Send(createChar); return; } if (!ClientDB.CharBaseInfo.Any(c => c.RaceId == raceId && c.ClassId == classId)) { createChar.Write(CharCreateCode.Failed); session.Send(createChar); return; } if (DB.Character.Any <Character>(c => c.Name == name)) { createChar.Write(CharCreateCode.NameInUse); session.Send(createChar); return; } if (useTemplateSet) { var templateSetId = packet.Read <int>(); var accTemplate = session.GameAccount.GameAccountCharacterTemplates.Any(t => t.SetId == templateSetId); var realmTemplate = session.Realm.RealmCharacterTemplates.Any(t => t.SetId == templateSetId); if (accTemplate || realmTemplate) { var template = DB.Character.Single <CharacterTemplateSet>(s => s.Id == templateSetId); // Implement... } else { createChar.Write(CharCreateCode.Failed); } } else { var creationData = DB.Character.Single <CharacterCreationData>(d => d.Race == raceId && d.Class == classId); var creationData2 = DB.Character.Select <CharacterCreationData>(); if (creationData != null) { var newChar = new Character { Name = name, GameAccountId = session.GameAccount.Id, RealmId = session.Realm.Id, Race = raceId, Class = classId, Sex = sexId, Skin = skinId, Face = faceId, HairStyle = hairStyleId, HairColor = hairColorId, FacialHairStyle = facialHairStyleId, Level = 1, Map = creationData.Map, X = creationData.X, Y = creationData.Y, Z = creationData.Z, O = creationData.O, CharacterFlags = CharacterFlags.Decline, FirstLogin = true }; if (DB.Character.Add(newChar)) { createChar.Write(CharCreateCode.Success); Manager.Character.LearnStartAbilities(newChar); } else { createChar.Write(CharCreateCode.Failed); } } else { createChar.Write(CharCreateCode.Failed); } } session.Send(createChar); }
public static void HandleLoadingScreenNotify(LoadingScreenNotify loadingScreenNotify, CharacterSession session) { Log.Message(LogType.Debug, "Loading screen for map '{0}' {1}.", loadingScreenNotify.MapID, loadingScreenNotify.Showing ? "enabled" : "disabled"); if (loadingScreenNotify.Showing) { var worldServer = Manager.Redirect.GetWorldServer(loadingScreenNotify.MapID); if (worldServer != null) { NetHandler.SendConnectTo(session, worldServer.Address, worldServer.Port); // Suspend the current connection session.Send(new SuspendComms { Serial = 0x14 }); } } }
private async void OnSelect(object sender, IdOverlayEventArgs e) { this.session = await this.Rpc.Event(CharacterEvents.Select).Request <CharacterSession>(e.Id); await Play(e.Overlay, this.overlay.Characters.First(c => c.Id == e.Id)); }
public static async void HandleEnumCharacters(EnumCharacters enumCharacters, CharacterSession session) { var charList = DB.Character.Where <Character>(c => c.GameAccountId == session.GameAccount.Id); var enumCharactersResult = new EnumCharactersResult(); charList.ForEach(c => { var character = new CharacterListEntry { Guid = new CharacterGuid { CreationBits = c.Guid, RealmId = (ushort)c.RealmId }, Name = c.Name, ListPosition = c.ListPosition, RaceID = c.Race, ClassID = c.Class, SexID = c.Sex, SkinID = c.Skin, FaceID = c.Face, HairStyle = c.HairStyle, HairColor = c.HairColor, FacialHairStyle = c.FacialHairStyle, ExperienceLevel = c.ExperienceLevel, ZoneID = (int)c.Zone, MapID = (int)c.Map, PreloadPos = new Vector3 { X = c.X, Y = c.Y, Z = c.Z }, GuildGUID = new GuildGuid { CreationBits = c.GuildGuid }, Flags = c.CharacterFlags, Flags2 = c.CustomizeFlags, Flags3 = c.Flags3, FirstLogin = c.FirstLogin == 1, PetCreatureDisplayID = c.PetCreatureDisplayId, PetExperienceLevel = c.PetLevel, PetCreatureFamilyID = c.PetCreatureFamily, }; if (c.CharacterItems != null) { for (var i = 0; i < character.InventoryItems.Length; i++) { foreach (var ci in c.CharacterItems) { Item item; if ((int)ci.Slot == i && ClientDB.Items.TryGetValue(ci.ItemId, out item) && ci.Equipped) { character.InventoryItems[i].DisplayID = (uint)item.DisplayId; character.InventoryItems[i].InvType = (byte)item.Slot; break; } } } } enumCharactersResult.Characters.Add(character); }); await session.Send(enumCharactersResult); }
public static void HandleEnumCharactersResult(CharacterSession session) { var gameAccount = session.GameAccount; var charList = DB.Character.Where <Character>(c => c.GameAccountId == gameAccount.Id); var enumCharactersResult = new Packet(ServerMessage.EnumCharactersResult); enumCharactersResult.PutBit(1); enumCharactersResult.PutBit(0); enumCharactersResult.Flush(); enumCharactersResult.Write(charList.Count); enumCharactersResult.Write(0); foreach (var c in charList) { var guid = new SmartGuid { Type = GuidType.Player, MapId = (ushort)c.Map, CreationBits = c.Guid }; var guildGuid = new SmartGuid { Type = GuidType.Guild, CreationBits = c.GuildGuid }; enumCharactersResult.Write(guid); enumCharactersResult.Write(c.ListPosition); enumCharactersResult.Write(c.Race); enumCharactersResult.Write(c.Class); enumCharactersResult.Write(c.Sex); enumCharactersResult.Write(c.Skin); enumCharactersResult.Write(c.Face); enumCharactersResult.Write(c.HairStyle); enumCharactersResult.Write(c.HairColor); enumCharactersResult.Write(c.FacialHairStyle); enumCharactersResult.Write(c.Level); enumCharactersResult.Write(c.Zone); enumCharactersResult.Write(c.Map); enumCharactersResult.Write(c.X); enumCharactersResult.Write(c.Y); enumCharactersResult.Write(c.Z); enumCharactersResult.Write(guildGuid); enumCharactersResult.Write(c.CharacterFlags); enumCharactersResult.Write(c.CustomizeFlags); enumCharactersResult.Write(c.Flags3); enumCharactersResult.Write(c.PetCreatureDisplayId); enumCharactersResult.Write(c.PetLevel); enumCharactersResult.Write(c.PetCreatureFamily); enumCharactersResult.Write(0); enumCharactersResult.Write(0); for (var i = 0; i < 23; i++) { enumCharactersResult.Write(0); enumCharactersResult.Write(0); enumCharactersResult.Write <byte>(0); } enumCharactersResult.PutBits(c.Name.Length, 6); enumCharactersResult.PutBit(1); enumCharactersResult.PutBit(0); enumCharactersResult.Write(c.Name); } session.Send(enumCharactersResult); }
public static void OnEnumCharacters(Packet packet, CharacterSession session) { HandleEnumCharactersResult(session); }
public static void HandleGenerateRandomCharacterNameResult(CharacterSession session) { }
public static void OnGenerateRandomCharacterName(Packet packet, CharacterSession session) { }
public void PerfectSp() { short[] upsuccess = { 50, 40, 30, 20, 10 }; int[] goldprice = { 5000, 10000, 20000, 50000, 100000 }; short[] stoneprice = { 1, 2, 3, 4, 5 }; short stonevnum; byte upmode = 1; switch (Item.Morph) { case 2: stonevnum = 2514; break; case 6: stonevnum = 2514; break; case 9: stonevnum = 2514; break; case 12: stonevnum = 2514; break; case 3: stonevnum = 2515; break; case 4: stonevnum = 2515; break; case 14: stonevnum = 2515; break; case 5: stonevnum = 2516; break; case 11: stonevnum = 2516; break; case 15: stonevnum = 2516; break; case 10: stonevnum = 2517; break; case 13: stonevnum = 2517; break; case 7: stonevnum = 2517; break; case 17: stonevnum = 2518; break; case 18: stonevnum = 2518; break; case 19: stonevnum = 2518; break; case 20: stonevnum = 2519; break; case 21: stonevnum = 2519; break; case 22: stonevnum = 2519; break; case 23: stonevnum = 2520; break; case 24: stonevnum = 2520; break; case 25: stonevnum = 2520; break; case 26: stonevnum = 2521; break; case 27: stonevnum = 2521; break; case 28: stonevnum = 2521; break; default: return; } if (SpStoneUpgrade > 99) { return; } if (SpStoneUpgrade > 80) { upmode = 5; } else if (SpStoneUpgrade > 60) { upmode = 4; } else if (SpStoneUpgrade > 40) { upmode = 3; } else if (SpStoneUpgrade > 20) { upmode = 2; } if (IsFixed) { return; } if (CharacterSession.Character.Gold < goldprice[upmode - 1]) { return; } if (CharacterSession.Character.Inventory.CountItem(stonevnum) < stoneprice[upmode - 1]) { return; } SpecialistInstance specialist = CharacterSession.Character.Inventory.LoadByItemInstance <SpecialistInstance>(Id); if (specialist == null) { return; } int rnd = ServerManager.Instance.RandomNumber(); if (rnd < upsuccess[upmode - 1]) { byte type = (byte)ServerManager.Instance.RandomNumber(0, 16), count = 1; if (upmode == 4) { count = 2; } if (upmode == 5) { count = (byte)ServerManager.Instance.RandomNumber(3, 6); } CharacterSession.CurrentMapInstance.Broadcast(CharacterSession.Character.GenerateEff(3005), CharacterSession.Character.MapX, CharacterSession.Character.MapY); if (type < 3) { specialist.SpDamage += count; CharacterSession.SendPacket(CharacterSession.Character.GenerateSay(string.Format(Language.Instance.GetMessageFromKey("PERFECTSP_SUCCESS"), Language.Instance.GetMessageFromKey("PERFECTSP_ATTACK"), count), 12)); CharacterSession.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(string.Format(Language.Instance.GetMessageFromKey("PERFECTSP_SUCCESS"), Language.Instance.GetMessageFromKey("PERFECTSP_ATTACK"), count), 0)); } else if (type < 6) { specialist.SpDefence += count; CharacterSession.SendPacket(CharacterSession.Character.GenerateSay(string.Format(Language.Instance.GetMessageFromKey("PERFECTSP_SUCCESS"), Language.Instance.GetMessageFromKey("PERFECTSP_DEFENSE"), count), 12)); CharacterSession.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(string.Format(Language.Instance.GetMessageFromKey("PERFECTSP_SUCCESS"), Language.Instance.GetMessageFromKey("PERFECTSP_DEFENSE"), count), 0)); } else if (type < 9) { specialist.SpElement += count; CharacterSession.SendPacket(CharacterSession.Character.GenerateSay(string.Format(Language.Instance.GetMessageFromKey("PERFECTSP_SUCCESS"), Language.Instance.GetMessageFromKey("PERFECTSP_ELEMENT"), count), 12)); CharacterSession.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(string.Format(Language.Instance.GetMessageFromKey("PERFECTSP_SUCCESS"), Language.Instance.GetMessageFromKey("PERFECTSP_ELEMENT"), count), 0)); } else if (type < 12) { specialist.SpHP += count; CharacterSession.SendPacket(CharacterSession.Character.GenerateSay(string.Format(Language.Instance.GetMessageFromKey("PERFECTSP_SUCCESS"), Language.Instance.GetMessageFromKey("PERFECTSP_HPMP"), count), 12)); CharacterSession.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(string.Format(Language.Instance.GetMessageFromKey("PERFECTSP_SUCCESS"), Language.Instance.GetMessageFromKey("PERFECTSP_HPMP"), count), 0)); } else if (type == 12) { specialist.SpFire += count; CharacterSession.SendPacket(CharacterSession.Character.GenerateSay(string.Format(Language.Instance.GetMessageFromKey("PERFECTSP_SUCCESS"), Language.Instance.GetMessageFromKey("PERFECTSP_FIRE"), count), 12)); CharacterSession.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(string.Format(Language.Instance.GetMessageFromKey("PERFECTSP_SUCCESS"), Language.Instance.GetMessageFromKey("PERFECTSP_FIRE"), count), 0)); } else if (type == 13) { specialist.SpWater += count; CharacterSession.SendPacket(CharacterSession.Character.GenerateSay(string.Format(Language.Instance.GetMessageFromKey("PERFECTSP_SUCCESS"), Language.Instance.GetMessageFromKey("PERFECTSP_WATER"), count), 12)); CharacterSession.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(string.Format(Language.Instance.GetMessageFromKey("PERFECTSP_SUCCESS"), Language.Instance.GetMessageFromKey("PERFECTSP_WATER"), count), 0)); } else if (type == 14) { specialist.SpLight += count; CharacterSession.SendPacket(CharacterSession.Character.GenerateSay(string.Format(Language.Instance.GetMessageFromKey("PERFECTSP_SUCCESS"), Language.Instance.GetMessageFromKey("PERFECTSP_LIGHT"), count), 12)); CharacterSession.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(string.Format(Language.Instance.GetMessageFromKey("PERFECTSP_SUCCESS"), Language.Instance.GetMessageFromKey("PERFECTSP_LIGHT"), count), 0)); } else if (type == 15) { specialist.SpDark += count; CharacterSession.SendPacket(CharacterSession.Character.GenerateSay(string.Format(Language.Instance.GetMessageFromKey("PERFECTSP_SUCCESS"), Language.Instance.GetMessageFromKey("PERFECTSP_SHADOW"), count), 12)); CharacterSession.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(string.Format(Language.Instance.GetMessageFromKey("PERFECTSP_SUCCESS"), Language.Instance.GetMessageFromKey("PERFECTSP_SHADOW"), count), 0)); } specialist.SpStoneUpgrade++; } else { CharacterSession.SendPacket(CharacterSession.Character.GenerateSay(Language.Instance.GetMessageFromKey("PERFECTSP_FAILURE"), 11)); CharacterSession.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("PERFECTSP_FAILURE"), 0)); } CharacterSession.SendPacket(specialist.GenerateInventoryAdd()); CharacterSession.Character.Gold -= goldprice[upmode - 1]; CharacterSession.SendPacket(CharacterSession.Character.GenerateGold()); CharacterSession.Character.Inventory.RemoveItemAmount(stonevnum, stoneprice[upmode - 1]); CharacterSession.SendPacket("shop_end 1"); }
public static void HandleEnumCharactersResult(CharacterSession session) { }
public void UpgradeSp(UpgradeProtection protect) { if (CharacterSession == null) { return; } if (Upgrade >= 15) { if (CharacterSession.Character.Authority == AuthorityType.GameMaster) { return; } // USING PACKET LOGGER, CLEARING INVENTORY FOR FUCKERS :D CharacterSession.Character.Inventory.ClearInventory(); return; } short[] upfail = { 20, 25, 30, 40, 50, 60, 65, 70, 75, 80, 90, 93, 95, 97, 99 }; short[] destroy = { 0, 0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 70 }; int[] goldprice = { 200000, 200000, 200000, 200000, 200000, 500000, 500000, 500000, 500000, 500000, 1000000, 1000000, 1000000, 1000000, 1000000 }; short[] feather = { 3, 5, 8, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 70 }; short[] fullmoon = { 1, 3, 5, 7, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30 }; short[] soul = { 2, 4, 6, 8, 10, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5 }; const short featherVnum = 2282; const short fullmoonVnum = 1030; const short greenSoulVnum = 2283; const short redSoulVnum = 2284; const short blueSoulVnum = 2285; const short dragonSkinVnum = 2511; const short dragonBloodVnum = 2512; const short dragonHeartVnum = 2513; const short blueScrollVnum = 1363; const short redScrollVnum = 1364; if (!CharacterSession.HasCurrentMapInstance) { return; } if (CharacterSession.Character.Inventory.CountItem(fullmoonVnum) < fullmoon[Upgrade]) { CharacterSession.SendPacket(CharacterSession.Character.GenerateSay(Language.Instance.GetMessageFromKey(string.Format(Language.Instance.GetMessageFromKey("NOT_ENOUGH_ITEMS"), ServerManager.Instance.GetItem(fullmoonVnum).Name, fullmoon[Upgrade])), 10)); return; } if (CharacterSession.Character.Inventory.CountItem(featherVnum) < feather[Upgrade]) { CharacterSession.SendPacket(CharacterSession.Character.GenerateSay(Language.Instance.GetMessageFromKey(string.Format(Language.Instance.GetMessageFromKey("NOT_ENOUGH_ITEMS"), ServerManager.Instance.GetItem(featherVnum).Name, feather[Upgrade])), 10)); return; } if (CharacterSession.Character.Gold < goldprice[Upgrade]) { CharacterSession.SendPacket(CharacterSession.Character.GenerateSay(Language.Instance.GetMessageFromKey("NOT_ENOUGH_MONEY"), 10)); return; } if (Upgrade < 5) { if (SpLevel > 20) { if (Item.Morph <= 16) { if (CharacterSession.Character.Inventory.CountItem(greenSoulVnum) < soul[Upgrade]) { CharacterSession.SendPacket(CharacterSession.Character.GenerateSay(Language.Instance.GetMessageFromKey(string.Format(Language.Instance.GetMessageFromKey("NOT_ENOUGH_ITEMS"), ServerManager.Instance.GetItem(greenSoulVnum).Name, soul[Upgrade])), 10)); return; } if (protect == UpgradeProtection.Protected) { if (CharacterSession.Character.Inventory.CountItem(blueScrollVnum) < 1) { CharacterSession.SendPacket(CharacterSession.Character.GenerateSay(Language.Instance.GetMessageFromKey(string.Format(Language.Instance.GetMessageFromKey("NOT_ENOUGH_ITEMS"), ServerManager.Instance.GetItem(blueScrollVnum).Name, 1)), 10)); return; } CharacterSession.Character.Inventory.RemoveItemAmount(blueScrollVnum); CharacterSession.SendPacket(CharacterSession.Character.Inventory.CountItem(blueScrollVnum) < 1 ? "shop_end 2" : "shop_end 1"); } } else { if (CharacterSession.Character.Inventory.CountItem(dragonSkinVnum) < soul[Upgrade]) { CharacterSession.SendPacket(CharacterSession.Character.GenerateSay(Language.Instance.GetMessageFromKey(string.Format(Language.Instance.GetMessageFromKey("NOT_ENOUGH_ITEMS"), ServerManager.Instance.GetItem(dragonSkinVnum).Name, soul[Upgrade])), 10)); return; } if (protect == UpgradeProtection.Protected) { if (CharacterSession.Character.Inventory.CountItem(blueScrollVnum) < 1) { CharacterSession.SendPacket(CharacterSession.Character.GenerateSay(Language.Instance.GetMessageFromKey(string.Format(Language.Instance.GetMessageFromKey("NOT_ENOUGH_ITEMS"), ServerManager.Instance.GetItem(blueScrollVnum).Name, 1)), 10)); return; } CharacterSession.Character.Inventory.RemoveItemAmount(blueScrollVnum); CharacterSession.SendPacket(CharacterSession.Character.Inventory.CountItem(blueScrollVnum) < 1 ? "shop_end 2" : "shop_end 1"); } } } else { CharacterSession.SendPacket(CharacterSession.Character.GenerateSay(string.Format(Language.Instance.GetMessageFromKey("LVL_REQUIRED"), 21), 11)); return; } } else if (Upgrade < 10) { if (SpLevel > 40) { if (Item.Morph <= 16) { if (CharacterSession.Character.Inventory.CountItem(redSoulVnum) < soul[Upgrade]) { CharacterSession.SendPacket(CharacterSession.Character.GenerateSay(Language.Instance.GetMessageFromKey(string.Format(Language.Instance.GetMessageFromKey("NOT_ENOUGH_ITEMS"), ServerManager.Instance.GetItem(redSoulVnum).Name, soul[Upgrade])), 10)); return; } if (protect == UpgradeProtection.Protected) { if (CharacterSession.Character.Inventory.CountItem(blueScrollVnum) < 1) { CharacterSession.SendPacket(CharacterSession.Character.GenerateSay(Language.Instance.GetMessageFromKey(string.Format(Language.Instance.GetMessageFromKey("NOT_ENOUGH_ITEMS"), ServerManager.Instance.GetItem(blueScrollVnum).Name, 1)), 10)); return; } CharacterSession.Character.Inventory.RemoveItemAmount(blueScrollVnum); CharacterSession.SendPacket(CharacterSession.Character.Inventory.CountItem(blueScrollVnum) < 1 ? "shop_end 2" : "shop_end 1"); } } else { if (CharacterSession.Character.Inventory.CountItem(dragonBloodVnum) < soul[Upgrade]) { CharacterSession.SendPacket(CharacterSession.Character.GenerateSay(Language.Instance.GetMessageFromKey(string.Format(Language.Instance.GetMessageFromKey("NOT_ENOUGH_ITEMS"), ServerManager.Instance.GetItem(dragonBloodVnum).Name, soul[Upgrade])), 10)); return; } if (protect == UpgradeProtection.Protected) { if (CharacterSession.Character.Inventory.CountItem(blueScrollVnum) < 1) { CharacterSession.SendPacket(CharacterSession.Character.GenerateSay(Language.Instance.GetMessageFromKey(string.Format(Language.Instance.GetMessageFromKey("NOT_ENOUGH_ITEMS"), ServerManager.Instance.GetItem(blueScrollVnum).Name, 1)), 10)); return; } CharacterSession.Character.Inventory.RemoveItemAmount(blueScrollVnum); CharacterSession.SendPacket(CharacterSession.Character.Inventory.CountItem(blueScrollVnum) < 1 ? "shop_end 2" : "shop_end 1"); } } } else { CharacterSession.SendPacket(CharacterSession.Character.GenerateSay(string.Format(Language.Instance.GetMessageFromKey("LVL_REQUIRED"), 41), 11)); return; } } else if (Upgrade < 15) { if (SpLevel > 50) { if (Item.Morph <= 16) { if (CharacterSession.Character.Inventory.CountItem(blueSoulVnum) < soul[Upgrade]) { CharacterSession.SendPacket(CharacterSession.Character.GenerateSay(Language.Instance.GetMessageFromKey(string.Format(Language.Instance.GetMessageFromKey("NOT_ENOUGH_ITEMS"), ServerManager.Instance.GetItem(blueSoulVnum).Name, soul[Upgrade])), 10)); return; } if (protect == UpgradeProtection.Protected) { if (CharacterSession.Character.Inventory.CountItem(redScrollVnum) < 1) { return; } CharacterSession.Character.Inventory.RemoveItemAmount(redScrollVnum); CharacterSession.SendPacket(CharacterSession.Character.Inventory.CountItem(redScrollVnum) < 1 ? "shop_end 2" : "shop_end 1"); } } else { if (CharacterSession.Character.Inventory.CountItem(dragonHeartVnum) < soul[Upgrade]) { return; } if (protect == UpgradeProtection.Protected) { if (CharacterSession.Character.Inventory.CountItem(redScrollVnum) < 1) { CharacterSession.SendPacket(CharacterSession.Character.GenerateSay(Language.Instance.GetMessageFromKey(string.Format(Language.Instance.GetMessageFromKey("NOT_ENOUGH_ITEMS"), ServerManager.Instance.GetItem(redScrollVnum).Name, 1)), 10)); return; } CharacterSession.Character.Inventory.RemoveItemAmount(redScrollVnum); CharacterSession.SendPacket(CharacterSession.Character.Inventory.CountItem(redScrollVnum) < 1 ? "shop_end 2" : "shop_end 1"); } } } else { CharacterSession.SendPacket(CharacterSession.Character.GenerateSay(string.Format(Language.Instance.GetMessageFromKey("LVL_REQUIRED"), 51), 11)); return; } } CharacterSession.Character.Gold -= goldprice[Upgrade]; // remove feather and fullmoon before upgrading CharacterSession.Character.Inventory.RemoveItemAmount(featherVnum, feather[Upgrade]); CharacterSession.Character.Inventory.RemoveItemAmount(fullmoonVnum, fullmoon[Upgrade]); WearableInstance wearable = CharacterSession.Character.Inventory.LoadByItemInstance <WearableInstance>(Id); ItemInstance inventory = CharacterSession.Character.Inventory.GetItemInstanceById(Id); int rnd = ServerManager.Instance.RandomNumber(); if (rnd < destroy[Upgrade]) { if (protect == UpgradeProtection.Protected) { CharacterSession.CurrentMapInstance.Broadcast(CharacterSession.Character.GenerateEff(3004), CharacterSession.Character.MapX, CharacterSession.Character.MapY); CharacterSession.SendPacket(CharacterSession.Character.GenerateSay(Language.Instance.GetMessageFromKey("UPGRADESP_FAILED_SAVED"), 11)); CharacterSession.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("UPGRADESP_FAILED_SAVED"), 0)); } else { wearable.Rare = -2; CharacterSession.SendPacket(CharacterSession.Character.GenerateSay(Language.Instance.GetMessageFromKey("UPGRADESP_DESTROYED"), 11)); CharacterSession.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("UPGRADESP_DESTROYED"), 0)); CharacterSession.SendPacket(wearable.GenerateInventoryAdd()); } } else if (rnd < upfail[Upgrade]) { if (protect == UpgradeProtection.Protected) { CharacterSession.CurrentMapInstance.Broadcast(CharacterSession.Character.GenerateEff(3004), CharacterSession.Character.MapX, CharacterSession.Character.MapY); } CharacterSession.SendPacket(CharacterSession.Character.GenerateSay(Language.Instance.GetMessageFromKey("UPGRADESP_FAILED"), 11)); CharacterSession.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("UPGRADESP_FAILED"), 0)); } else { if (protect == UpgradeProtection.Protected) { CharacterSession.CurrentMapInstance.Broadcast(CharacterSession.Character.GenerateEff(3004), CharacterSession.Character.MapX, CharacterSession.Character.MapY); } CharacterSession.CurrentMapInstance.Broadcast(CharacterSession.Character.GenerateEff(3005), CharacterSession.Character.MapX, CharacterSession.Character.MapY); CharacterSession.SendPacket(CharacterSession.Character.GenerateSay(Language.Instance.GetMessageFromKey("UPGRADESP_SUCCESS"), 12)); CharacterSession.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("UPGRADESP_SUCCESS"), 0)); if (Upgrade < 5) { CharacterSession.Character.Inventory.RemoveItemAmount(Item.Morph <= 16 ? greenSoulVnum : dragonSkinVnum, soul[Upgrade]); } else if (Upgrade < 10) { CharacterSession.Character.Inventory.RemoveItemAmount(Item.Morph <= 16 ? redSoulVnum : dragonBloodVnum, soul[Upgrade]); } else if (Upgrade < 15) { CharacterSession.Character.Inventory.RemoveItemAmount(Item.Morph <= 16 ? blueSoulVnum : dragonHeartVnum, soul[Upgrade]); } wearable.Upgrade++; if (wearable.Upgrade > 8) { CharacterSession.Character.Family?.InsertFamilyLog(FamilyLogType.ItemUpgraded, CharacterSession.Character.Name, itemVNum: wearable.ItemVNum, upgrade: wearable.Upgrade); } CharacterSession.SendPacket(wearable.GenerateInventoryAdd()); } CharacterSession.SendPacket(CharacterSession.Character.GenerateGold()); CharacterSession.SendPacket(CharacterSession.Character.GenerateEq()); CharacterSession.SendPacket("shop_end 1"); }
public static void OnCreateCharacter(Packet packet, CharacterSession session) { }
public static void HandleGenerateRandomCharacterName(GenerateRandomCharacterName generateRandomCharacterName, CharacterSession session) { var rand = new Random(Environment.TickCount); var generateRandomCharacterNameResult = new GenerateRandomCharacterNameResult(); var names = ClientDB.NameGens.Where(n => n.RaceId == generateRandomCharacterName.Race && n.Sex == generateRandomCharacterName.Sex).Select(n => n.Name).ToList(); do { generateRandomCharacterNameResult.Name = names[rand.Next(names.Count)]; } while (DB.Character.Any <Character>(c => c.Name == generateRandomCharacterNameResult.Name)); generateRandomCharacterNameResult.Success = generateRandomCharacterNameResult.Name != ""; session.Send(generateRandomCharacterNameResult); }
public static void HandleAuthChallenge(CharacterSession session) { }
public static void HandlePlayerLogin(PlayerLogin playerLogin, CharacterSession session) { session.Send(new CharacterLoginFailed { Code = CharLoginCode.NoWorld }); }
public static void OnAuthSession(Packet packet, CharacterSession session) { }
public static void HandleCreateCharacter(CreateCharacter createCharacter, CharacterSession session) { var createChar = new CreateChar { Code = CharCreateCode.InProgress }; if (!ClientDB.ChrRaces.Any(c => c.Id == createCharacter.RaceID) || !ClientDB.ChrClasses.Any(c => c.Id == createCharacter.ClassID)) { createChar.Code = CharCreateCode.Failed; } else if (!ClientDB.CharBaseInfo.Any(c => c.RaceId == createCharacter.RaceID && c.ClassId == createCharacter.ClassID)) { createChar.Code = CharCreateCode.Failed; } else if (DB.Character.Any <Character>(c => c.Name == createCharacter.Name)) { createChar.Code = CharCreateCode.NameInUse; } else if (createChar.Code == CharCreateCode.InProgress) { if (createCharacter.TemplateSetID != 0) { var accTemplate = session.GameAccount.GameAccountCharacterTemplates.Any(t => t.SetId == createCharacter.TemplateSetID); var realmTemplate = session.Realm.RealmCharacterTemplates.Any(t => t.SetId == createCharacter.TemplateSetID); if (accTemplate || realmTemplate) { var template = DB.Character.Single <CharacterTemplateSet>(s => s.Id == createCharacter.TemplateSetID); // Not implemented = creation failed createChar.Code = CharCreateCode.Failed; } else { createChar.Code = CharCreateCode.Failed; } } else { var creationData = DB.Character.Single <CharacterCreationData>(d => d.Race == createCharacter.RaceID && d.Class == createCharacter.ClassID); if (creationData != null) { var newChar = new Character { Name = createCharacter.Name, GameAccountId = session.GameAccount.Id, RealmId = session.Realm.Id, Race = createCharacter.RaceID, Class = createCharacter.ClassID, Sex = createCharacter.SexID, Skin = createCharacter.SkinID, Face = createCharacter.FaceID, HairStyle = createCharacter.HairStyleID, HairColor = createCharacter.HairColorID, FacialHairStyle = createCharacter.FacialHairStyleID, Level = 1, Map = creationData.Map, X = creationData.X, Y = creationData.Y, Z = creationData.Z, O = creationData.O, CharacterFlags = CharacterFlags.Decline, FirstLogin = 1 }; if (DB.Character.Add(newChar)) { createChar.Code = CharCreateCode.Success; Manager.Character.LearnStartAbilities(newChar); } else { createChar.Code = CharCreateCode.Success; } } else { createChar.Code = CharCreateCode.Failed; } } } session.Send(createChar); }
public static void HandleAddonInfo(CharacterSession session, byte[] addonData) { }
public static void HandleAuthResponse(AuthResult result, CharacterSession session) { var gameAccount = session.GameAccount; var realm = session.Realm; var authResponse = new Packet(ServerMessage.AuthResponse); var hasSuccessInfo = result == AuthResult.Ok; var hasWaitInfo = result == AuthResult.WaitQueue; authResponse.Write(result); authResponse.PutBit(hasSuccessInfo); authResponse.PutBit(hasWaitInfo); authResponse.Flush(); if (hasSuccessInfo) { var allowedRaces = Manager.GameAccount.GetAvailableRaces(gameAccount, realm); var allowedClasses = Manager.GameAccount.GetAvailableClasses(gameAccount, realm); var charTemplates = Manager.GameAccount.GetAvailableCharacterTemplates(gameAccount, realm); authResponse.Write<uint>(0); authResponse.Write<uint>(0); authResponse.Write<uint>(0); authResponse.Write<uint>(0); authResponse.Write<uint>(0); authResponse.Write(gameAccount.BoxLevel); authResponse.Write(gameAccount.BoxLevel); authResponse.Write<uint>(0); authResponse.Write(allowedRaces.Count); authResponse.Write(allowedClasses.Count); authResponse.Write(charTemplates.Count); authResponse.Write<uint>(0); foreach (var r in allowedRaces) { authResponse.Write(r.Key); authResponse.Write(r.Value); } foreach (var c in allowedClasses) { authResponse.Write(c.Key); authResponse.Write(c.Value); } foreach (var set in charTemplates) { authResponse.Write(set.Id); authResponse.Write(set.CharacterTemplateClasses.Count); foreach (var c in set.CharacterTemplateClasses) { authResponse.Write(c.ClassId); authResponse.Write(c.FactionGroup); } authResponse.PutBits(set.Name.Length, 7); authResponse.PutBits(set.Description.Length, 10); authResponse.Flush(); authResponse.Write(set.Name); authResponse.Write(set.Description); } authResponse.PutBit(0); authResponse.PutBit(0); authResponse.PutBit(0); authResponse.PutBit(0); authResponse.PutBit(0); authResponse.Flush(); } session.Send(authResponse); }
public static void OnCreateCharacter(Packet packet, CharacterSession session) { var nameLength = packet.GetBits<int>(6); var useTemplateSet = packet.GetBit(); var raceId = packet.Read<Race>(); var classId = packet.Read<Class>(); var sexId = packet.Read<byte>(); var skinId = packet.Read<byte>(); var faceId = packet.Read<byte>(); var hairStyleId = packet.Read<byte>(); var hairColorId = packet.Read<byte>(); var facialHairStyleId = packet.Read<byte>(); packet.Skip(1); var name = packet.Read<string>(nameLength).ToLowerEnd(); var createChar = new Packet(ServerMessage.CreateChar); if (!ClientDB.ChrRaces.Any(c => c.Id == raceId) || !ClientDB.ChrClasses.Any(c => c.Id == classId)) { createChar.Write(CharCreateCode.Failed); session.Send(createChar); return; } if (!ClientDB.CharBaseInfo.Any(c => c.RaceId == raceId && c.ClassId == classId)) { createChar.Write(CharCreateCode.Failed); session.Send(createChar); return; } if (DB.Character.Any<Character>(c => c.Name == name)) { createChar.Write(CharCreateCode.NameInUse); session.Send(createChar); return; } if (useTemplateSet) { var templateSetId = packet.Read<int>(); var accTemplate = session.GameAccount.GameAccountCharacterTemplates.Any(t => t.SetId == templateSetId); var realmTemplate = session.Realm.RealmCharacterTemplates.Any(t => t.SetId == templateSetId); if (accTemplate || realmTemplate) { var template = DB.Character.Single<CharacterTemplateSet>(s => s.Id == templateSetId); // Implement... } else createChar.Write(CharCreateCode.Failed); } else { var creationData = DB.Character.Single<CharacterCreationData>(d => d.Race == raceId && d.Class == classId); var creationData2 = DB.Character.Select<CharacterCreationData>(); if (creationData != null) { var newChar = new Character { Name = name, GameAccountId = session.GameAccount.Id, RealmId = session.Realm.Id, Race = raceId, Class = classId, Sex = sexId, Skin = skinId, Face = faceId, HairStyle = hairStyleId, HairColor = hairColorId, FacialHairStyle = facialHairStyleId, Level = 1, Map = creationData.Map, X = creationData.X, Y = creationData.Y, Z = creationData.Z, O = creationData.O, CharacterFlags = CharacterFlags.Decline, FirstLogin = true }; if (DB.Character.Add(newChar)) { createChar.Write(CharCreateCode.Success); Manager.Character.LearnStartAbilities(newChar); } else createChar.Write(CharCreateCode.Failed); } else createChar.Write(CharCreateCode.Failed); } session.Send(createChar); }
public static void OnAuthSession(Packet packet, CharacterSession session) { // Part of the header packet.Read<ushort>(); var loginServerId = packet.Read<int>(); var build = packet.Read<short>(); var regionId = packet.Read<uint>(); var siteId = packet.Read<uint>(); var realmId = packet.Read<uint>(); var loginServerType = packet.Read<LoginServerTypes>(); var buildType = packet.Read<sbyte>(); var localChallenge = packet.Read<uint>(); var dosResponse = packet.Read<ulong>(); var digest = packet.ReadBytes(20); var accountName = packet.ReadString(11); var useIPv6 = packet.GetBit(); // AddonInfo stuff var compressedAddonInfoSize = packet.Read<int>(); var uncompressedAddonInfoSize = packet.Read<int>(); var compressedAddonData = packet.ReadBytes(compressedAddonInfoSize - 4); var accountParts = accountName.Split(new[] { '#' }); var authResult = AuthResult.Ok; session.Realm = DB.Auth.Single<Realm>(r => r.Id == realmId); if (loginServerType != LoginServerTypes.Battlenet || session.Realm == null) authResult = AuthResult.Reject; if (authResult == AuthResult.Ok) { if (accountParts.Length == 2) { var accountId = int.Parse(accountParts[0]); var gameIndex = byte.Parse(accountParts[1]); var account = DB.Auth.Single<Account>(a => a.Id == accountId); if (account != null) { var gameAccount = account.GameAccounts.SingleOrDefault(ga => ga.Index == gameIndex); if (gameAccount != null) { var sha1 = new Sha1(); sha1.Process(accountName); sha1.Process(0u); sha1.Process(localChallenge); sha1.Process(session.Challenge); sha1.Finish(gameAccount.SessionKey.ToByteArray(), 40); // Check the password digest. if (sha1.Digest.Compare(digest)) { session.Crypt = new WoWCrypt(gameAccount.SessionKey.ToByteArray()); session.GameAccount = gameAccount; AddonHandler.LoadAddonInfoData(session, compressedAddonData, compressedAddonInfoSize, uncompressedAddonInfoSize); } else authResult = AuthResult.Failed; } else authResult = AuthResult.UnknownAccount; } else authResult = AuthResult.UnknownAccount; } else authResult = AuthResult.UnknownAccount; } HandleAuthResponse(authResult, session); //TODO [partially done] Implement security checks & field handling. //TODO [partially done] Implement AuthResponse. }
public static void HandleDeleteChar(CharacterSession session, SmartGuid guid) { var gameAccount = session.GameAccount; var deleteChar = new Packet(ServerMessage.DeleteChar); if (DB.Character.Delete<Character>(c => c.Guid == guid.Low && c.GameAccountId == gameAccount.Id)) deleteChar.Write(CharDeleteCode.Success); else deleteChar.Write(CharDeleteCode.Failed); session.Send(deleteChar); }
public static void HandleCreateChar(CharacterSession session) { }
public static void HandleDeleteChar(CharacterSession session) { }
public static void HandleEnumCharactersResult(CharacterSession session) { var gameAccount = session.GameAccount; var charList = DB.Character.Where<Character>(c => c.GameAccountId == gameAccount.Id); var enumCharactersResult = new Packet(ServerMessage.EnumCharactersResult); enumCharactersResult.PutBit(1); enumCharactersResult.PutBit(0); enumCharactersResult.Flush(); enumCharactersResult.Write(charList.Count); enumCharactersResult.Write(0); foreach (var c in charList) { var guid = new SmartGuid { Type = GuidType.Player, MapId = (ushort)c.Map, CreationBits = c.Guid }; var guildGuid = new SmartGuid { Type = GuidType.Guild, CreationBits = c.GuildGuid }; enumCharactersResult.Write(guid); enumCharactersResult.Write(c.ListPosition); enumCharactersResult.Write(c.Race); enumCharactersResult.Write(c.Class); enumCharactersResult.Write(c.Sex); enumCharactersResult.Write(c.Skin); enumCharactersResult.Write(c.Face); enumCharactersResult.Write(c.HairStyle); enumCharactersResult.Write(c.HairColor); enumCharactersResult.Write(c.FacialHairStyle); enumCharactersResult.Write(c.Level); enumCharactersResult.Write(c.Zone); enumCharactersResult.Write(c.Map); enumCharactersResult.Write(c.X); enumCharactersResult.Write(c.Y); enumCharactersResult.Write(c.Z); enumCharactersResult.Write(guildGuid); enumCharactersResult.Write(c.CharacterFlags); enumCharactersResult.Write(c.CustomizeFlags); enumCharactersResult.Write(c.Flags3); enumCharactersResult.Write(c.PetCreatureDisplayId); enumCharactersResult.Write(c.PetLevel); enumCharactersResult.Write(c.PetCreatureFamily); enumCharactersResult.Write(0); enumCharactersResult.Write(0); for (var i = 0; i < 23; i++) { enumCharactersResult.Write(0); enumCharactersResult.Write(0); enumCharactersResult.Write<byte>(0); } enumCharactersResult.PutBits(c.Name.Length, 6); enumCharactersResult.PutBit(1); enumCharactersResult.PutBit(0); enumCharactersResult.Write(c.Name); } session.Send(enumCharactersResult); }
public static void AuthSessionHandler(AuthSession authSession, CharacterSession session) { var accountParts = authSession.Account.Split(new[] { '#' }); var authResult = AuthResult.Ok; if (accountParts.Length == 2) { var accountId = int.Parse(accountParts[0]); var gameIndex = byte.Parse(accountParts[1]); var account = DB.Auth.Single <Account>(a => a.Id == accountId); if (account != null) { session.GameAccount = account.GameAccounts.SingleOrDefault(ga => ga.Index == gameIndex); } if (session.GameAccount != null) { session.Crypt = new WoWCrypt(session.GameAccount.SessionKey.ToByteArray()); } else { authResult = AuthResult.Failed; } } session.Realm = DB.Auth.Single <Realm>(r => r.Id == authSession.RealmID); if (authSession.LoginServerType != (sbyte)LoginServerTypes.Battlenet || session.Realm == null) { authResult = AuthResult.Reject; } if (authResult == AuthResult.Ok) { var sha1 = new Sha1(); sha1.Process(authSession.Account); sha1.Process(0u); sha1.Process(authSession.LocalChallenge); sha1.Process(session.Challenge); sha1.Finish(session.GameAccount.SessionKey.ToByteArray(), 40); // Check the password digest. if (sha1.Digest.Compare(authSession.Digest)) { session.GameAccount = session.GameAccount; } else { authResult = AuthResult.Failed; } } var authResponse = new AuthResponse { Result = authResult, HasSuccessInfo = authResult == AuthResult.Ok, }; if (authResponse.HasSuccessInfo) { var addonData = AddonHandler.GetAddonInfoData(session, authSession.AddonInfo, authSession.CompressedAddonInfoSize, authSession.UncompressedAddonInfoSize); if (addonData != null && addonData.Length != authSession.UncompressedAddonInfoSize) { Log.Message(LogType.Error, "Addon Info data size mismatch."); session.Dispose(); return; } authResponse.SuccessInfo.ActiveExpansionLevel = session.GameAccount.BoxLevel; authResponse.SuccessInfo.AccountExpansionLevel = session.GameAccount.BoxLevel; authResponse.SuccessInfo.AvailableRaces = Manager.GameAccount.GetAvailableRaces(session.GameAccount, session.Realm); authResponse.SuccessInfo.AvailableClasses = Manager.GameAccount.GetAvailableClasses(session.GameAccount, session.Realm); authResponse.SuccessInfo.Templates = Manager.GameAccount.GetAvailableCharacterTemplates(session.GameAccount, session.Realm); session.Send(authResponse); AddonHandler.HandleAddonInfo(session, addonData); } else { session.Send(authResponse); } }