public Hotbar(long gameOptionsId, Job job) { Slots = new QuickSlot[MaxSlots]; for (int i = 0; i < MaxSlots; i++) { Slots[i] = new(); } AddDefaultSkills(); Id = DatabaseManager.Hotbars.Insert(this, gameOptionsId); void AddDefaultSkills() { JobMetadata jobMetadata = JobMetadataStorage.GetJobMetadata(job); if (jobMetadata is null) { return; } List <int> skillIds = new(); jobMetadata.LearnedSkills.ForEach(x => skillIds.AddRange(x.SkillIds)); List <(int skillId, byte slotPriority)> hotbarSkills = new(); foreach (int skillId in skillIds) { JobSkillMetadata jobSkillMetadata = jobMetadata.Skills.First(x => x.SkillId == skillId); if (jobSkillMetadata.QuickSlotPriority != 99 && jobSkillMetadata.SubJobCode == 0) { hotbarSkills.Add((skillId, jobSkillMetadata.QuickSlotPriority)); } } foreach ((int skillId, byte _) in hotbarSkills.OrderBy(x => x.slotPriority)) { AddToFirstSlot(QuickSlot.From(skillId)); } } }
public override void Handle(GameSession session, PacketReader packet) { packet.ReadInt(); // ? // Liftable: 00 00 00 00 00 // SendBreakable // Self session.EnterField(session.Player.MapId); session.Send(StatPacket.SetStats(session.FieldPlayer)); session.Send(StatPointPacket.WriteTotalStatPoints(session.Player)); foreach (MasteryExp mastery in session.Player.Levels.MasteryExp) { session.Send(MasteryPacket.SetExp(mastery.Type, mastery.CurrentExp)); } if (session.Player.IsVip()) { session.Send(PremiumClubPacket.ActivatePremium(session.FieldPlayer, session.Player.VIPExpiration)); } session.Send(EmotePacket.LoadEmotes(session.Player)); session.Send(ChatStickerPacket.LoadChatSticker(session.Player)); session.Send(ResponseCubePacket.LoadHome(session.FieldPlayer)); // Normally skill layout would be loaded from a database QuickSlot arrowStream = QuickSlot.From(10500001); QuickSlot arrowBarrage = QuickSlot.From(10500011); QuickSlot eagleGlide = QuickSlot.From(10500151); QuickSlot testSkill = QuickSlot.From(10500153); if (session.Player.GameOptions.TryGetHotbar(0, out Hotbar mainHotbar)) { /* * mainHotbar.MoveQuickSlot(4, arrowStream); * mainHotbar.MoveQuickSlot(5, arrowBarrage); * mainHotbar.MoveQuickSlot(6, eagleGlide); * mainHotbar.MoveQuickSlot(7, testSkill); */ session.Send(KeyTablePacket.SendHotbars(session.Player.GameOptions)); } session.Send(GameEventPacket.Load()); }
public override void Handle(GameSession session, PacketReader packet) { packet.ReadInt(); // ? // Liftable: 00 00 00 00 00 // SendBreakable // Self session.EnterField(session.Player.MapId); session.Send(FieldObjectPacket.SetStats(session.FieldPlayer)); session.Send(EmotePacket.LoadEmotes()); // Normally skill layout would be loaded from a database QuickSlot arrowStream = QuickSlot.From(10500001); QuickSlot arrowBarrage = QuickSlot.From(10500011); QuickSlot eagleGlide = QuickSlot.From(10500151); QuickSlot testSkill = QuickSlot.From(10500153); if (session.Player.GameOptions.TryGetHotbar(0, out Hotbar mainHotbar)) { /* * mainHotbar.MoveQuickSlot(4, arrowStream); * mainHotbar.MoveQuickSlot(5, arrowBarrage); * mainHotbar.MoveQuickSlot(6, eagleGlide); * mainHotbar.MoveQuickSlot(7, testSkill); */ session.Send(KeyTablePacket.SendHotbars(session.Player.GameOptions)); } // Add catalysts for testing /* * int[] catalysts = { 40100001, 40100002, 40100003, 40100021, 40100023, 40100024, 40100026 }; * foreach (int catalyst in catalysts) { * var item = new Item(catalyst) { Amount = 99999, Uid = catalyst }; * session.Inventory.Add(item); * session.Send(ItemInventoryPacket.Add(item)); * } */ }
public void MoveQuickSlot(int targetSlotIndex, QuickSlot quickSlot) { if (targetSlotIndex is < 0 or >= MaxSlots) { // This should never occur throw new ArgumentException($"Invalid target slot {targetSlotIndex}"); } int sourceSlotIndex = FindQuickSlotIndex(quickSlot.SkillId, quickSlot.ItemUid); if (sourceSlotIndex != -1) { // Swapping with an existing slot on the hotbar QuickSlot sourceQuickSlot = Slots[targetSlotIndex]; Slots[sourceSlotIndex] = QuickSlot.From( sourceQuickSlot.SkillId, sourceQuickSlot.ItemId, sourceQuickSlot.ItemUid ); } Slots[targetSlotIndex] = quickSlot; }
public Hotbar(long gameOptionsId, Job job) { Slots = new QuickSlot[MAX_SLOTS]; for (int i = 0; i < MAX_SLOTS; i++) { Slots[i] = new(); } // Get default job skills IOrderedEnumerable <JobSkillMetadata> skills = JobMetadataStorage .GetJobskills((int)job).Where(skill => skill.QuickSlotPriority < 4).OrderBy(skill => skill.QuickSlotPriority); // Add skills to hotbar int index = 4; foreach (JobSkillMetadata metadata in skills) { Slots[index++] = QuickSlot.From(metadata.SkillId); } Id = DatabaseManager.Hotbars.Insert(this, gameOptionsId); }
public override void Handle(GameSession session, PacketReader packet) { packet.ReadInt(); // ? // Liftable: 00 00 00 00 00 // SendBreakable // Self session.EnterField(session.Player.MapId); session.Send(StatPacket.SetStats(session.FieldPlayer)); session.Send(StatPointPacket.WriteTotalStatPoints(session.Player)); session.Send(EmotePacket.LoadEmotes(session.Player)); session.Send(ChatStickerPacket.LoadChatSticker(session.Player)); // Normally skill layout would be loaded from a database QuickSlot arrowStream = QuickSlot.From(10500001); QuickSlot arrowBarrage = QuickSlot.From(10500011); QuickSlot eagleGlide = QuickSlot.From(10500151); QuickSlot testSkill = QuickSlot.From(10500153); if (session.Player.GameOptions.TryGetHotbar(0, out Hotbar mainHotbar)) { /* * mainHotbar.MoveQuickSlot(4, arrowStream); * mainHotbar.MoveQuickSlot(5, arrowBarrage); * mainHotbar.MoveQuickSlot(6, eagleGlide); * mainHotbar.MoveQuickSlot(7, testSkill); */ session.Send(KeyTablePacket.SendHotbars(session.Player.GameOptions)); } // Add catalysts for testing Item item = new Item(40100001) { Amount = 99999 }; Item item2 = new Item(40100001) { Amount = 90000 }; Item item3 = new Item(20302228) { Amount = 1 }; InventoryController.Add(session, item, true); InventoryController.Add(session, item2, true); InventoryController.Add(session, item3, true); //Add mail for testing //System mail without any item Mail sysMail = new Mail ( 101, session.Player.CharacterId, "50000002", "", "", 0, DateTimeOffset.UtcNow.ToUnixTimeSeconds(), null ); // System mail with an item List <Item> items = new List <Item> { new Item(40100001) // 20302228 { CreationTime = DateTimeOffset.UtcNow.ToUnixTimeSeconds(), Owner = session.Player, Amount = 10000 } }; Mail sysItemMail = new Mail ( 101, session.Player.CharacterId, "53000042", "", "", 0, DateTimeOffset.UtcNow.ToUnixTimeSeconds(), items ); // Regular mail Mail regMail = new Mail ( 1, session.Player.CharacterId, session.Player.Name, "Test Title", "Test Body", 0, DateTimeOffset.UtcNow.ToUnixTimeSeconds(), null ); session.Player.Mailbox.AddOrUpdate(sysItemMail); session.Player.Mailbox.AddOrUpdate(sysMail); session.Player.Mailbox.AddOrUpdate(regMail); }