diff --git a/Source/Framework/Constants/SharedConst.cs b/Source/Framework/Constants/SharedConst.cs index 5b9c8ecbe..3303aaf5e 100644 --- a/Source/Framework/Constants/SharedConst.cs +++ b/Source/Framework/Constants/SharedConst.cs @@ -682,7 +682,7 @@ namespace Framework.Constants Max = 19, All = 127, // default for class? Health = -2, // (-2 as signed value) - MaxPerClass = 6 + MaxPerClass = 7 } public enum Stats diff --git a/Source/Framework/Database/Databases/CharacterDatabase.cs b/Source/Framework/Database/Databases/CharacterDatabase.cs index da3dc320c..622be9575 100644 --- a/Source/Framework/Database/Databases/CharacterDatabase.cs +++ b/Source/Framework/Database/Databases/CharacterDatabase.cs @@ -83,7 +83,7 @@ namespace Framework.Database PrepareStatement(CharStatements.SEL_CHARACTER, "SELECT c.guid, account, name, race, class, gender, level, xp, money, inventorySlots, bankSlots, restState, playerFlags, playerFlagsEx, " + "position_x, position_y, position_z, map, orientation, taximask, createTime, createMode, cinematic, totaltime, leveltime, rest_bonus, logout_time, is_logout_resting, resettalents_cost, " + "resettalents_time, primarySpecialization, trans_x, trans_y, trans_z, trans_o, transguid, extra_flags, stable_slots, at_login, zone, online, death_expire_time, taxi_path, dungeonDifficulty, " + - "totalKills, todayKills, yesterdayKills, chosenTitle, watchedFaction, drunk, health, power1, power2, power3, power4, power5, power6, instance_id, activeTalentGroup, lootSpecId, exploredZones, " + + "totalKills, todayKills, yesterdayKills, chosenTitle, watchedFaction, drunk, health, power1, power2, power3, power4, power5, power6, power7, instance_id, activeTalentGroup, lootSpecId, exploredZones, " + "knownTitles, actionBars, raidDifficulty, legacyRaidDifficulty, fishingSteps, honor, honorLevel, honorRestState, honorRestBonus, numRespecs " + "FROM characters c LEFT JOIN character_fishingsteps cfs ON c.guid = cfs.guid WHERE c.guid = ?"); @@ -252,63 +252,59 @@ namespace Framework.Database PrepareStatement(CharStatements.UPD_NAME_BY_GUID, "UPDATE characters SET name = ? WHERE guid = ?"); // Guild handling - // 0: uint32, 1: string, 2: uint32, 3: string, 4: string, 5: uint64, 6-10: uint32, 11: uint64 PrepareStatement(CharStatements.INS_GUILD, "INSERT INTO guild (guildid, name, leaderguid, info, motd, createdate, EmblemStyle, EmblemColor, BorderStyle, BorderColor, BackgroundColor, BankMoney) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"); - PrepareStatement(CharStatements.DEL_GUILD, "DELETE FROM guild WHERE guildid = ?"); // 0: uint32 - // 0: string, 1: uint32 + PrepareStatement(CharStatements.DEL_GUILD, "DELETE FROM guild WHERE guildid = ?"); + PrepareStatement(CharStatements.UPD_GUILD_NAME, "UPDATE guild SET name = ? WHERE guildid = ?"); - // 0: uint32, 1: uint32, 2: uint8, 4: string, 5: string PrepareStatement(CharStatements.INS_GUILD_MEMBER, "INSERT INTO guild_member (guildid, guid, rank, pnote, offnote) VALUES (?, ?, ?, ?, ?)"); - PrepareStatement(CharStatements.DEL_GUILD_MEMBER, "DELETE FROM guild_member WHERE guid = ?"); // 0: uint32 - PrepareStatement(CharStatements.DEL_GUILD_MEMBERS, "DELETE FROM guild_member WHERE guildid = ?"); // 0: uint32 - // 0: uint32, 1: uint8, 3: string, 4: uint32, 5: uint32 + PrepareStatement(CharStatements.DEL_GUILD_MEMBER, "DELETE FROM guild_member WHERE guid = ?"); + PrepareStatement(CharStatements.DEL_GUILD_MEMBERS, "DELETE FROM guild_member WHERE guildid = ?"); + PrepareStatement(CharStatements.INS_GUILD_RANK, "INSERT INTO guild_rank (guildid, rid, rname, rights, BankMoneyPerDay) VALUES (?, ?, ?, ?, ?)"); - PrepareStatement(CharStatements.DEL_GUILD_RANKS, "DELETE FROM guild_rank WHERE guildid = ?"); // 0: uint32 - PrepareStatement(CharStatements.DEL_GUILD_RANK, "DELETE FROM guild_rank WHERE guildid = ? AND rid = ?"); // 0: uint32, 1: uint8 - PrepareStatement(CharStatements.INS_GUILD_BANK_TAB, "INSERT INTO guild_bank_tab (guildid, TabId) VALUES (?, ?)"); // 0: uint32, 1: uint8 - PrepareStatement(CharStatements.DEL_GUILD_BANK_TAB, "DELETE FROM guild_bank_tab WHERE guildid = ? AND TabId = ?"); // 0: uint32, 1: uint8 - PrepareStatement(CharStatements.DEL_GUILD_BANK_TABS, "DELETE FROM guild_bank_tab WHERE guildid = ?"); // 0: uint32 - // 0: uint32, 1: uint8, 2: uint8, 3: uint32, 4: uint32 + PrepareStatement(CharStatements.DEL_GUILD_RANKS, "DELETE FROM guild_rank WHERE guildid = ?"); + PrepareStatement(CharStatements.DEL_GUILD_RANK, "DELETE FROM guild_rank WHERE guildid = ? AND rid = ?"); + PrepareStatement(CharStatements.INS_GUILD_BANK_TAB, "INSERT INTO guild_bank_tab (guildid, TabId) VALUES (?, ?)"); + PrepareStatement(CharStatements.DEL_GUILD_BANK_TAB, "DELETE FROM guild_bank_tab WHERE guildid = ? AND TabId = ?"); + PrepareStatement(CharStatements.DEL_GUILD_BANK_TABS, "DELETE FROM guild_bank_tab WHERE guildid = ?"); + PrepareStatement(CharStatements.INS_GUILD_BANK_ITEM, "INSERT INTO guild_bank_item (guildid, TabId, SlotId, item_guid) VALUES (?, ?, ?, ?)"); - PrepareStatement(CharStatements.DEL_GUILD_BANK_ITEM, "DELETE FROM guild_bank_item WHERE guildid = ? AND TabId = ? AND SlotId = ?"); // 0: uint32, 1: uint8, 2: uint8 + PrepareStatement(CharStatements.DEL_GUILD_BANK_ITEM, "DELETE FROM guild_bank_item WHERE guildid = ? AND TabId = ? AND SlotId = ?"); PrepareStatement(CharStatements.SEL_GUILD_BANK_ITEMS, "SELECT " + SelectItemInstanceContent + ", guildid, TabId, SlotId FROM guild_bank_item gbi INNER JOIN item_instance ii ON gbi.item_guid = ii.guid LEFT JOIN item_instance_gems ig ON ii.guid = ig.itemGuid LEFT JOIN item_instance_transmog iit ON ii.guid = iit.itemGuid LEFT JOIN item_instance_modifiers im ON ii.guid = im.itemGuid"); - PrepareStatement(CharStatements.DEL_GUILD_BANK_ITEMS, "DELETE FROM guild_bank_item WHERE guildid = ?"); // 0: uint32 - // 0: uint32, 1: uint8, 2: uint8, 3: uint8, 4: uint32 + PrepareStatement(CharStatements.DEL_GUILD_BANK_ITEMS, "DELETE FROM guild_bank_item WHERE guildid = ?"); + PrepareStatement(CharStatements.INS_GUILD_BANK_RIGHT, "INSERT INTO guild_bank_right (guildid, TabId, rid, gbright, SlotPerDay) VALUES (?, ?, ?, ?, ?) " + "ON DUPLICATE KEY UPDATE gbright = VALUES(gbright), SlotPerDay = VALUES(SlotPerDay)"); - PrepareStatement(CharStatements.DEL_GUILD_BANK_RIGHTS, "DELETE FROM guild_bank_right WHERE guildid = ?"); // 0: uint32 - PrepareStatement(CharStatements.DEL_GUILD_BANK_RIGHTS_FOR_RANK, "DELETE FROM guild_bank_right WHERE guildid = ? AND rid = ?"); // 0: uint32, 1: uint8 - // 0-1: uint32, 2-3: uint8, 4-5: uint32, 6: uint16, 7: uint8, 8: uint64 + PrepareStatement(CharStatements.DEL_GUILD_BANK_RIGHTS, "DELETE FROM guild_bank_right WHERE guildid = ?"); + PrepareStatement(CharStatements.DEL_GUILD_BANK_RIGHTS_FOR_RANK, "DELETE FROM guild_bank_right WHERE guildid = ? AND rid = ?"); + PrepareStatement(CharStatements.INS_GUILD_BANK_EVENTLOG, "INSERT INTO guild_bank_eventlog (guildid, LogGuid, TabId, EventType, PlayerGuid, ItemOrMoney, ItemStackCount, DestTabId, TimeStamp) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)"); - PrepareStatement(CharStatements.DEL_GUILD_BANK_EVENTLOG, "DELETE FROM guild_bank_eventlog WHERE guildid = ? AND LogGuid = ? AND TabId = ?"); // 0: uint32, 1: uint32, 2: uint8 - PrepareStatement(CharStatements.DEL_GUILD_BANK_EVENTLOGS, "DELETE FROM guild_bank_eventlog WHERE guildid = ?"); // 0: uint32 - // 0-1: uint32, 2: uint8, 3-4: uint32, 5: uint8, 6: uint64 + PrepareStatement(CharStatements.DEL_GUILD_BANK_EVENTLOG, "DELETE FROM guild_bank_eventlog WHERE guildid = ? AND LogGuid = ? AND TabId = ?"); + PrepareStatement(CharStatements.DEL_GUILD_BANK_EVENTLOGS, "DELETE FROM guild_bank_eventlog WHERE guildid = ?"); + PrepareStatement(CharStatements.INS_GUILD_EVENTLOG, "INSERT INTO guild_eventlog (guildid, LogGuid, EventType, PlayerGuid1, PlayerGuid2, NewRank, TimeStamp) VALUES (?, ?, ?, ?, ?, ?, ?)"); - PrepareStatement(CharStatements.DEL_GUILD_EVENTLOG, "DELETE FROM guild_eventlog WHERE guildid = ? AND LogGuid = ?"); // 0: uint32, 1: uint32 - PrepareStatement(CharStatements.DEL_GUILD_EVENTLOGS, "DELETE FROM guild_eventlog WHERE guildid = ?"); // 0: uint32 - PrepareStatement(CharStatements.UPD_GUILD_MEMBER_PNOTE, "UPDATE guild_member SET pnote = ? WHERE guid = ?"); // 0: string, 1: uint32 - PrepareStatement(CharStatements.UPD_GUILD_MEMBER_OFFNOTE, "UPDATE guild_member SET offnote = ? WHERE guid = ?"); // 0: string, 1: uint32 - PrepareStatement(CharStatements.UPD_GUILD_MEMBER_RANK, "UPDATE guild_member SET rank = ? WHERE guid = ?"); // 0: uint8, 1: uint32 - PrepareStatement(CharStatements.UPD_GUILD_MOTD, "UPDATE guild SET motd = ? WHERE guildid = ?"); // 0: string, 1: uint32 - PrepareStatement(CharStatements.UPD_GUILD_INFO, "UPDATE guild SET info = ? WHERE guildid = ?"); // 0: string, 1: uint32 - PrepareStatement(CharStatements.UPD_GUILD_LEADER, "UPDATE guild SET leaderguid = ? WHERE guildid = ?"); // 0: uint32, 1: uint32 - PrepareStatement(CharStatements.UPD_GUILD_RANK_NAME, "UPDATE guild_rank SET rname = ? WHERE rid = ? AND guildid = ?"); // 0: string, 1: uint8, 2: uint32 - PrepareStatement(CharStatements.UPD_GUILD_RANK_RIGHTS, "UPDATE guild_rank SET rights = ? WHERE rid = ? AND guildid = ?"); // 0: uint32, 1: uint8, 2: uint32 - // 0-5: uint32 + PrepareStatement(CharStatements.DEL_GUILD_EVENTLOG, "DELETE FROM guild_eventlog WHERE guildid = ? AND LogGuid = ?"); + PrepareStatement(CharStatements.DEL_GUILD_EVENTLOGS, "DELETE FROM guild_eventlog WHERE guildid = ?"); + PrepareStatement(CharStatements.UPD_GUILD_MEMBER_PNOTE, "UPDATE guild_member SET pnote = ? WHERE guid = ?"); + PrepareStatement(CharStatements.UPD_GUILD_MEMBER_OFFNOTE, "UPDATE guild_member SET offnote = ? WHERE guid = ?"); + PrepareStatement(CharStatements.UPD_GUILD_MEMBER_RANK, "UPDATE guild_member SET rank = ? WHERE guid = ?"); + PrepareStatement(CharStatements.UPD_GUILD_MOTD, "UPDATE guild SET motd = ? WHERE guildid = ?"); + PrepareStatement(CharStatements.UPD_GUILD_INFO, "UPDATE guild SET info = ? WHERE guildid = ?"); + PrepareStatement(CharStatements.UPD_GUILD_LEADER, "UPDATE guild SET leaderguid = ? WHERE guildid = ?"); + PrepareStatement(CharStatements.UPD_GUILD_RANK_NAME, "UPDATE guild_rank SET rname = ? WHERE rid = ? AND guildid = ?"); + PrepareStatement(CharStatements.UPD_GUILD_RANK_RIGHTS, "UPDATE guild_rank SET rights = ? WHERE rid = ? AND guildid = ?"); + PrepareStatement(CharStatements.UPD_GUILD_EMBLEM_INFO, "UPDATE guild SET EmblemStyle = ?, EmblemColor = ?, BorderStyle = ?, BorderColor = ?, BackgroundColor = ? WHERE guildid = ?"); - // 0: string, 1: string, 2: uint32, 3: uint8 PrepareStatement(CharStatements.UPD_GUILD_BANK_TAB_INFO, "UPDATE guild_bank_tab SET TabName = ?, TabIcon = ? WHERE guildid = ? AND TabId = ?"); - PrepareStatement(CharStatements.UPD_GUILD_BANK_MONEY, "UPDATE guild SET BankMoney = ? WHERE guildid = ?"); // 0: uint64, 1: uint32 - // 0: uint8, 1: uint32, 2: uint8, 3: uint32 - PrepareStatement(CharStatements.UPD_GUILD_RANK_BANK_MONEY, "UPDATE guild_rank SET BankMoneyPerDay = ? WHERE rid = ? AND guildid = ?"); // 0: uint32, 1: uint8, 2: uint32 - PrepareStatement(CharStatements.UPD_GUILD_BANK_TAB_TEXT, "UPDATE guild_bank_tab SET TabText = ? WHERE guildid = ? AND TabId = ?"); // 0: string, 1: uint32, 2: uint8 + PrepareStatement(CharStatements.UPD_GUILD_BANK_MONEY, "UPDATE guild SET BankMoney = ? WHERE guildid = ?"); + + PrepareStatement(CharStatements.UPD_GUILD_RANK_BANK_MONEY, "UPDATE guild_rank SET BankMoneyPerDay = ? WHERE rid = ? AND guildid = ?"); + PrepareStatement(CharStatements.UPD_GUILD_BANK_TAB_TEXT, "UPDATE guild_bank_tab SET TabText = ? WHERE guildid = ? AND TabId = ?"); PrepareStatement(CharStatements.INS_GUILD_MEMBER_WITHDRAW_TABS, "INSERT INTO guild_member_withdraw (guid, tab0, tab1, tab2, tab3, tab4, tab5, tab6, tab7) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?) " + "ON DUPLICATE KEY UPDATE tab0 = VALUES (tab0), tab1 = VALUES (tab1), tab2 = VALUES (tab2), tab3 = VALUES (tab3), tab4 = VALUES (tab4), tab5 = VALUES (tab5), tab6 = VALUES (tab6), tab7 = VALUES (tab7)"); PrepareStatement(CharStatements.INS_GUILD_MEMBER_WITHDRAW_MONEY, "INSERT INTO guild_member_withdraw (guid, money) VALUES (?, ?) ON DUPLICATE KEY UPDATE money = VALUES (money)"); PrepareStatement(CharStatements.DEL_GUILD_MEMBER_WITHDRAW, "TRUNCATE guild_member_withdraw"); - // 0: uint32, 1: uint32, 2: uint32 PrepareStatement(CharStatements.SEL_CHAR_DATA_FOR_GUILD, "SELECT name, level, class, gender, zone, account FROM characters WHERE guid = ?"); PrepareStatement(CharStatements.DEL_GUILD_ACHIEVEMENT, "DELETE FROM guild_achievement WHERE guildId = ? AND achievement = ?"); PrepareStatement(CharStatements.INS_GUILD_ACHIEVEMENT, "INSERT INTO guild_achievement (guildId, achievement, date, guids) VALUES (?, ?, ?, ?)"); @@ -474,13 +470,13 @@ namespace Framework.Database "map, instance_id, dungeonDifficulty, raidDifficulty, legacyRaidDifficulty, position_x, position_y, position_z, orientation, trans_x, trans_y, trans_z, trans_o, transguid, " + "taximask, createTime, createMode, cinematic, totaltime, leveltime, rest_bonus, logout_time, is_logout_resting, resettalents_cost, resettalents_time, primarySpecialization, " + "extra_flags, stable_slots, at_login, death_expire_time, taxi_path, totalKills, todayKills, yesterdayKills, chosenTitle, watchedFaction, drunk, health, power1, power2, power3, " + - "power4, power5, power6, latency, activeTalentGroup, lootSpecId, exploredZones, equipmentCache, knownTitles, actionBars, lastLoginBuild) VALUES " + - "(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"); + "power4, power5, power6, power7, latency, activeTalentGroup, lootSpecId, exploredZones, equipmentCache, knownTitles, actionBars, lastLoginBuild) VALUES " + + "(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"); PrepareStatement(CharStatements.UPD_CHARACTER, "UPDATE characters SET name=?,race=?,class=?,gender=?,level=?,xp=?,money=?,inventorySlots=?,bankSlots=?,restState=?,playerFlags=?,playerFlagsEx=?," + "map=?,instance_id=?,dungeonDifficulty=?,raidDifficulty=?,legacyRaidDifficulty=?,position_x=?,position_y=?,position_z=?,orientation=?,trans_x=?,trans_y=?,trans_z=?,trans_o=?,transguid=?,taximask=?,cinematic=?,totaltime=?,leveltime=?,rest_bonus=?," + "logout_time=?,is_logout_resting=?,resettalents_cost=?,resettalents_time=?,numRespecs=?,primarySpecialization=?,extra_flags=?,stable_slots=?,at_login=?,zone=?,death_expire_time=?,taxi_path=?," + "totalKills=?,todayKills=?,yesterdayKills=?,chosenTitle=?," + - "watchedFaction=?,drunk=?,health=?,power1=?,power2=?,power3=?,power4=?,power5=?,power6=?,latency=?,activeTalentGroup=?,lootSpecId=?,exploredZones=?," + + "watchedFaction=?,drunk=?,health=?,power1=?,power2=?,power3=?,power4=?,power5=?,power6=?,power7=?,latency=?,activeTalentGroup=?,lootSpecId=?,exploredZones=?," + "equipmentCache=?,knownTitles=?,actionBars=?,online=?,honor=?,honorLevel=?,honorRestState=?,honorRestBonus=?,lastLoginBuild=? WHERE guid=?"); PrepareStatement(CharStatements.UPD_ADD_AT_LOGIN_FLAG, "UPDATE characters SET at_login = at_login | ? WHERE guid = ?"); @@ -664,9 +660,9 @@ namespace Framework.Database PrepareStatement(CharStatements.UPD_CHAR_SKILLS, "UPDATE character_skills SET value = ?, max = ? WHERE guid = ? AND skill = ?"); PrepareStatement(CharStatements.INS_CHAR_SPELL, "INSERT INTO character_spell (guid, spell, active, disabled) VALUES (?, ?, ?, ?)"); PrepareStatement(CharStatements.DEL_CHAR_STATS, "DELETE FROM character_stats WHERE guid = ?"); - PrepareStatement(CharStatements.INS_CHAR_STATS, "INSERT INTO character_stats (guid, maxhealth, maxpower1, maxpower2, maxpower3, maxpower4, maxpower5, maxpower6, strength, agility, stamina, intellect, " + + PrepareStatement(CharStatements.INS_CHAR_STATS, "INSERT INTO character_stats (guid, maxhealth, maxpower1, maxpower2, maxpower3, maxpower4, maxpower5, maxpower6, maxpower7, strength, agility, stamina, intellect, " + "armor, resHoly, resFire, resNature, resFrost, resShadow, resArcane, blockPct, dodgePct, parryPct, critPct, rangedCritPct, spellCritPct, attackPower, rangedAttackPower, " + - "spellPower, resilience) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"); + "spellPower, resilience) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"); PrepareStatement(CharStatements.DEL_PETITION_BY_OWNER, "DELETE FROM petition WHERE ownerguid = ?"); PrepareStatement(CharStatements.DEL_PETITION_SIGNATURE_BY_OWNER, "DELETE FROM petition_sign WHERE ownerguid = ?"); PrepareStatement(CharStatements.INS_CHAR_GLYPHS, "INSERT INTO character_glyphs VALUES(?, ?, ?)"); @@ -688,7 +684,6 @@ namespace Framework.Database PrepareStatement(CharStatements.DEL_CHAR_CUF_PROFILES_BY_ID, "DELETE FROM character_cuf_profiles WHERE guid = ? AND id = ?"); PrepareStatement(CharStatements.DEL_CHAR_CUF_PROFILES, "DELETE FROM character_cuf_profiles WHERE guid = ?"); - // Items that hold loot or money PrepareStatement(CharStatements.SEL_ITEMCONTAINER_ITEMS, "SELECT container_id, item_id, item_count, follow_rules, ffa, blocked, counted, under_threshold, needs_quest, rnd_bonus, context, bonus_list_ids FROM item_loot_items"); PrepareStatement(CharStatements.DEL_ITEMCONTAINER_ITEMS, "DELETE FROM item_loot_items WHERE container_id = ?"); @@ -1347,7 +1342,6 @@ namespace Framework.Database DEL_CHAR_CUF_PROFILES_BY_ID, DEL_CHAR_CUF_PROFILES, - REP_CALENDAR_EVENT, DEL_CALENDAR_EVENT, REP_CALENDAR_INVITE, diff --git a/Source/Game/Entities/AreaTrigger/AreaTrigger.cs b/Source/Game/Entities/AreaTrigger/AreaTrigger.cs index 6050395f1..e3a17fd14 100644 --- a/Source/Game/Entities/AreaTrigger/AreaTrigger.cs +++ b/Source/Game/Entities/AreaTrigger/AreaTrigger.cs @@ -112,21 +112,22 @@ namespace Game.Entities _shape = GetCreateProperties().Shape; _maxSearchRadius = GetCreateProperties().GetMaxSearchRadius(); - SetUpdateFieldValue(m_values.ModifyValue(m_areaTriggerData).ModifyValue(m_areaTriggerData.Caster), caster.GetGUID()); - SetUpdateFieldValue(m_values.ModifyValue(m_areaTriggerData).ModifyValue(m_areaTriggerData.CreatingEffectGUID), castId); + var areaTriggerData = m_values.ModifyValue(m_areaTriggerData); + SetUpdateFieldValue(areaTriggerData.ModifyValue(m_areaTriggerData.Caster), caster.GetGUID()); + SetUpdateFieldValue(areaTriggerData.ModifyValue(m_areaTriggerData.CreatingEffectGUID), castId); - SetUpdateFieldValue(m_values.ModifyValue(m_areaTriggerData).ModifyValue(m_areaTriggerData.SpellID), spell.Id); - SetUpdateFieldValue(m_values.ModifyValue(m_areaTriggerData).ModifyValue(m_areaTriggerData.SpellForVisuals), spell.Id); + SetUpdateFieldValue(areaTriggerData.ModifyValue(m_areaTriggerData.SpellID), spell.Id); + SetUpdateFieldValue(areaTriggerData.ModifyValue(m_areaTriggerData.SpellForVisuals), spell.Id); - SpellCastVisualField spellCastVisual = m_values.ModifyValue(m_areaTriggerData).ModifyValue(m_areaTriggerData.SpellVisual); + SpellCastVisualField spellCastVisual = areaTriggerData.ModifyValue(m_areaTriggerData.SpellVisual); SetUpdateFieldValue(ref spellCastVisual.SpellXSpellVisualID, spellVisual.SpellXSpellVisualID); SetUpdateFieldValue(ref spellCastVisual.ScriptVisualID, spellVisual.ScriptVisualID); - SetUpdateFieldValue(m_values.ModifyValue(m_areaTriggerData).ModifyValue(m_areaTriggerData.TimeToTargetScale), GetCreateProperties().TimeToTargetScale != 0 ? GetCreateProperties().TimeToTargetScale : m_areaTriggerData.Duration); - SetUpdateFieldValue(m_values.ModifyValue(m_areaTriggerData).ModifyValue(m_areaTriggerData.BoundsRadius2D), GetMaxSearchRadius()); - SetUpdateFieldValue(m_values.ModifyValue(m_areaTriggerData).ModifyValue(m_areaTriggerData.DecalPropertiesID), GetCreateProperties().DecalPropertiesId); + SetUpdateFieldValue(areaTriggerData.ModifyValue(m_areaTriggerData.TimeToTargetScale), GetCreateProperties().TimeToTargetScale != 0 ? GetCreateProperties().TimeToTargetScale : m_areaTriggerData.Duration); + SetUpdateFieldValue(areaTriggerData.ModifyValue(m_areaTriggerData.BoundsRadius2D), GetMaxSearchRadius()); + SetUpdateFieldValue(areaTriggerData.ModifyValue(m_areaTriggerData.DecalPropertiesID), GetCreateProperties().DecalPropertiesId); - ScaleCurve extraScaleCurve = m_values.ModifyValue(m_areaTriggerData).ModifyValue(m_areaTriggerData.ExtraScaleCurve); + ScaleCurve extraScaleCurve = areaTriggerData.ModifyValue(m_areaTriggerData.ExtraScaleCurve); if (GetCreateProperties().ExtraScale.Structured.StartTimeOffset != 0) SetUpdateFieldValue(extraScaleCurve.ModifyValue(extraScaleCurve.StartTimeOffset), GetCreateProperties().ExtraScale.Structured.StartTimeOffset); @@ -148,6 +149,11 @@ namespace Game.Entities SetUpdateFieldValue(extraScaleCurve.ModifyValue(extraScaleCurve.OverrideActive), GetCreateProperties().ExtraScale.Structured.OverrideActive != 0); } + VisualAnim visualAnim = areaTriggerData.ModifyValue(m_areaTriggerData.VisualAnim); + SetUpdateFieldValue(visualAnim.ModifyValue(visualAnim.AnimationDataID), GetCreateProperties().AnimId); + SetUpdateFieldValue(visualAnim.ModifyValue(visualAnim.AnimKitID), GetCreateProperties().AnimKitId); + if (GetTemplate() != null && GetTemplate().HasFlag(AreaTriggerFlags.Unk3)) + SetUpdateFieldValue(visualAnim.ModifyValue(visualAnim.Field_C), true); PhasingHandler.InheritPhaseShift(this, caster); diff --git a/Source/Game/Entities/Object/Update/UpdateFields.cs b/Source/Game/Entities/Object/Update/UpdateFields.cs index 22da6ad09..c37ce8403 100644 --- a/Source/Game/Entities/Object/Update/UpdateFields.cs +++ b/Source/Game/Entities/Object/Update/UpdateFields.cs @@ -127,15 +127,15 @@ namespace Game.Entities break; case GameObjectTypes.Transport: case GameObjectTypes.MapObjTransport: + { + uint transportPeriod = gameObject.GetTransportPeriod(); + if (transportPeriod != 0) { - uint transportPeriod = gameObject.GetTransportPeriod(); - if (transportPeriod != 0) - { - float timer = (float)(gameObject.GetGoValue().Transport.PathProgress % transportPeriod); - pathProgress = (ushort)(timer / (float)transportPeriod * 65535.0f); - } - break; + float timer = (float)(gameObject.GetGoValue().Transport.PathProgress % transportPeriod); + pathProgress = (ushort)(timer / (float)transportPeriod * 65535.0f); } + break; + } default: break; } @@ -824,9 +824,9 @@ namespace Game.Entities public class AzeriteItemData : BaseUpdateData { public UpdateField Enabled = new(0, 1); - public DynamicUpdateFieldUnlockedEssences = new(0, 2); - public DynamicUpdateFieldUnlockedEssenceMilestones = new(0, 4); - public DynamicUpdateFieldSelectedEssences = new(0, 3); + public DynamicUpdateField UnlockedEssences = new(0, 2); + public DynamicUpdateField UnlockedEssenceMilestones = new(0, 4); + public DynamicUpdateField SelectedEssences = new(0, 3); public UpdateField Xp = new(0, 5); public UpdateField Level = new(0, 6); public UpdateField AuraLevel = new(0, 7); @@ -1210,32 +1210,33 @@ namespace Game.Entities public UpdateField MaxItemLevel = new(96, 106); public UpdateField AzeriteItemLevel = new(96, 107); public UpdateField WildBattlePetLevel = new(96, 108); - public UpdateField BattlePetCompanionNameTimestamp = new(96, 109); - public UpdateField InteractSpellID = new(96, 110); - public UpdateField ScaleDuration = new(96, 111); - public UpdateField LooksLikeMountID = new(96, 112); - public UpdateField LooksLikeCreatureID = new(96, 113); - public UpdateField LookAtControllerID = new(96, 114); - public UpdateField TaxiNodesID = new(96, 115); - public UpdateField GuildGUID = new(96, 116); - public UpdateField SkinningOwnerGUID = new(96, 117); - public UpdateField SilencedSchoolMask = new(96, 118); - public UpdateField NameplateAttachToGUID = new(96, 119); // When set, nameplate of this unit will instead appear on that object - public UpdateFieldArray NpcFlags = new(2, 120, 121); - public UpdateFieldArray Power = new(6, 123, 124); - public UpdateFieldArray MaxPower = new(6, 123, 130); - public UpdateFieldArray PowerRegenFlatModifier = new(6, 123, 136); - public UpdateFieldArray PowerRegenInterruptedFlatModifier = new(6, 123, 142); - public UpdateFieldArray VirtualItems = new(3, 148, 149); - public UpdateFieldArray AttackRoundBaseTime = new(2, 152, 153); - public UpdateFieldArray Stats = new(4, 155, 156); - public UpdateFieldArray StatPosBuff = new(4, 155, 160); - public UpdateFieldArray StatNegBuff = new(4, 155, 164); - public UpdateFieldArray Resistances = new(7, 168, 169); - public UpdateFieldArray BonusResistanceMods = new(7, 168, 176); - public UpdateFieldArray ManaCostModifier = new(7, 168, 183); + public UpdateField Field_220 = new(96, 109); + public UpdateField BattlePetCompanionNameTimestamp = new(96, 110); + public UpdateField InteractSpellID = new(96, 111); + public UpdateField ScaleDuration = new(96, 112); + public UpdateField LooksLikeMountID = new(96, 113); + public UpdateField LooksLikeCreatureID = new(96, 114); + public UpdateField LookAtControllerID = new(96, 115); + public UpdateField TaxiNodesID = new(96, 116); + public UpdateField GuildGUID = new(96, 117); + public UpdateField SkinningOwnerGUID = new(96, 118); + public UpdateField SilencedSchoolMask = new(96, 119); + public UpdateField NameplateAttachToGUID = new(96, 120); // When set, nameplate of this unit will instead appear on that object + public UpdateFieldArray NpcFlags = new(2, 121, 122); + public UpdateFieldArray Power = new(7, 124, 125); + public UpdateFieldArray MaxPower = new(7, 124, 132); + public UpdateFieldArray PowerRegenFlatModifier = new(7, 124, 139); + public UpdateFieldArray PowerRegenInterruptedFlatModifier = new(7, 124, 146); + public UpdateFieldArray VirtualItems = new(3, 153, 154); + public UpdateFieldArray AttackRoundBaseTime = new(2, 157, 158); + public UpdateFieldArray Stats = new(4, 160, 161); + public UpdateFieldArray StatPosBuff = new(4, 160, 165); + public UpdateFieldArray StatNegBuff = new(4, 160, 169); + public UpdateFieldArray Resistances = new(7, 173, 174); + public UpdateFieldArray BonusResistanceMods = new(7, 173, 181); + public UpdateFieldArray ManaCostModifier = new(7, 173, 188); - public UnitData() : base(0, TypeId.Unit, 190) { } + public UnitData() : base(0, TypeId.Unit, 195) { } public void WriteCreate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, Unit owner, Player receiver) { @@ -1274,14 +1275,14 @@ namespace Game.Entities data.WriteUInt8(DisplayPower); data.WriteUInt32(OverrideDisplayPowerID); data.WriteUInt64(Health); - for (int i = 0; i < 6; ++i) + for (int i = 0; i < 7; ++i) { data.WriteInt32(Power[i]); data.WriteUInt32(MaxPower[i]); } if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag.Owner) || fieldVisibilityFlags.HasFlag(UpdateFieldFlag.UnitAll)) { - for (int i = 0; i < 6; ++i) + for (int i = 0; i < 7; ++i) { data.WriteFloat(PowerRegenFlatModifier[i]); data.WriteFloat(PowerRegenInterruptedFlatModifier[i]); @@ -1402,6 +1403,7 @@ namespace Game.Entities data.WriteUInt32(MaxItemLevel); data.WriteInt32(AzeriteItemLevel); data.WriteUInt32(WildBattlePetLevel); + data.WriteInt32(Field_220); data.WriteUInt32(BattlePetCompanionNameTimestamp); data.WriteInt32(InteractSpellID); data.WriteInt32(ScaleDuration); @@ -1429,7 +1431,7 @@ namespace Game.Entities public void WriteUpdate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, Unit owner, Player receiver) { - UpdateMask allowedMaskForTarget = new(192, new uint[] { 0xFFFFDFFFu, 0xE1FF7FFFu, 0x001EFFFFu, 0xFFFFFF81u, 0x07F000FFu, 0x00000000u }); + UpdateMask allowedMaskForTarget = new(195, new uint[] { 0xFFFFDFFFu, 0xE1FF7FFFu, 0x001EFFFFu, 0xFFFFFF81u, 0xFE0007FFu, 0x00000000u, 0x00000000u }); AppendAllowedFieldsMaskForFlag(allowedMaskForTarget, fieldVisibilityFlags); WriteUpdate(data, _changesMask & allowedMaskForTarget, false, owner, receiver); } @@ -1437,24 +1439,24 @@ namespace Game.Entities public void AppendAllowedFieldsMaskForFlag(UpdateMask allowedMaskForTarget, UpdateFieldFlag fieldVisibilityFlags) { if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag.Owner)) - allowedMaskForTarget.OR(new UpdateMask(190, new uint[] { 0x00002000u, 0x1E008000u, 0xFFE10000u, 0x0800007Eu, 0xF80FFF00u, 0x3FFFFFFFu })); + allowedMaskForTarget.OR(new UpdateMask(195, new uint[] { 0x00002000u, 0x1E008000u, 0xFFE10000u, 0x1000007Eu, 0x01FFF800u, 0xFFFFFFFFu, 0x00000007u })); if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag.UnitAll)) - allowedMaskForTarget.OR(new UpdateMask(190, new uint[] { 0x00000000u, 0x00000000u, 0x00000000u, 0x08000000u, 0x000FFF00u, 0x00000000u })); + allowedMaskForTarget.OR(new UpdateMask(195, new uint[] { 0x00000000u, 0x00000000u, 0x00000000u, 0x10000000u, 0x01FFF800u, 0x00000000u, 0x00000000u })); if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag.Empath)) - allowedMaskForTarget.OR(new UpdateMask(190, new uint[] { 0x00000000u, 0x1E000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x0000FF00u })); + allowedMaskForTarget.OR(new UpdateMask(195, new uint[] { 0x00000000u, 0x1E000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x001FE000u, 0x00000000u })); } public void FilterDisallowedFieldsMaskForFlag(UpdateMask changesMask, UpdateFieldFlag fieldVisibilityFlags) { - UpdateMask allowedMaskForTarget = new(190, new[] { 0xFFFFDFFFu, 0xE1FF7FFFu, 0x001EFFFFu, 0xFFFFFF81u, 0x07F000FFu, 0x00000000u }); + UpdateMask allowedMaskForTarget = new(195, new[] { 0xFFFFDFFFu, 0xE1FF7FFFu, 0x001EFFFFu, 0xFFFFFF81u, 0xFE0007FFu, 0x00000000u, 0x00000000u }); AppendAllowedFieldsMaskForFlag(allowedMaskForTarget, fieldVisibilityFlags); changesMask.AND(allowedMaskForTarget); } public void WriteUpdate(WorldPacket data, UpdateMask changesMask, bool ignoreNestedChangesMask, Unit owner, Player receiver) { - data.WriteBits(changesMask.GetBlocksMask(0), 6); - for (uint i = 0; i < 6; ++i) + data.WriteBits(changesMask.GetBlocksMask(0), 7); + for (uint i = 0; i < 7; ++i) if (changesMask.GetBlock(i) != 0) data.WriteBits(changesMask.GetBlock(i), 32); @@ -1942,132 +1944,136 @@ namespace Game.Entities } if (changesMask[109]) { - data.WriteUInt32(BattlePetCompanionNameTimestamp); + data.WriteInt32(Field_220); } if (changesMask[110]) { - data.WriteInt32(InteractSpellID); + data.WriteUInt32(BattlePetCompanionNameTimestamp); } if (changesMask[111]) { - data.WriteInt32(ScaleDuration); + data.WriteInt32(InteractSpellID); } if (changesMask[112]) { - data.WriteInt32(LooksLikeMountID); + data.WriteInt32(ScaleDuration); } if (changesMask[113]) { - data.WriteInt32(LooksLikeCreatureID); + data.WriteInt32(LooksLikeMountID); } if (changesMask[114]) { - data.WriteInt32(LookAtControllerID); + data.WriteInt32(LooksLikeCreatureID); } if (changesMask[115]) { - data.WriteInt32(TaxiNodesID); + data.WriteInt32(LookAtControllerID); } if (changesMask[116]) { - data.WritePackedGuid(GuildGUID); + data.WriteInt32(TaxiNodesID); } if (changesMask[117]) { - data.WritePackedGuid(SkinningOwnerGUID); + data.WritePackedGuid(GuildGUID); } if (changesMask[118]) { - data.WriteUInt32(SilencedSchoolMask); + data.WritePackedGuid(SkinningOwnerGUID); } if (changesMask[119]) + { + data.WriteUInt32(SilencedSchoolMask); + } + if (changesMask[120]) { data.WritePackedGuid(NameplateAttachToGUID); } } - if (changesMask[120]) + if (changesMask[121]) { for (int i = 0; i < 2; ++i) { - if (changesMask[121 + i]) + if (changesMask[122 + i]) { data.WriteUInt32(GetViewerDependentNpcFlags(this, i, owner, receiver)); } } } - if (changesMask[123]) + if (changesMask[124]) { - for (int i = 0; i < 6; ++i) + for (int i = 0; i < 7; ++i) { - if (changesMask[124 + i]) + if (changesMask[125 + i]) { data.WriteInt32(Power[i]); } - if (changesMask[130 + i]) + if (changesMask[132 + i]) { data.WriteUInt32(MaxPower[i]); } - if (changesMask[136 + i]) + if (changesMask[139 + i]) { data.WriteFloat(PowerRegenFlatModifier[i]); } - if (changesMask[142 + i]) + if (changesMask[146 + i]) { data.WriteFloat(PowerRegenInterruptedFlatModifier[i]); } } } - if (changesMask[148]) + if (changesMask[153]) { for (int i = 0; i < 3; ++i) { - if (changesMask[149 + i]) + if (changesMask[154 + i]) { VirtualItems[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } } } - if (changesMask[152]) + if (changesMask[157]) { for (int i = 0; i < 2; ++i) { - if (changesMask[153 + i]) + if (changesMask[158 + i]) { data.WriteUInt32(AttackRoundBaseTime[i]); } } } - if (changesMask[155]) + if (changesMask[160]) { for (int i = 0; i < 4; ++i) { - if (changesMask[156 + i]) + if (changesMask[161 + i]) { data.WriteInt32(Stats[i]); } - if (changesMask[160 + i]) + if (changesMask[165 + i]) { data.WriteInt32(StatPosBuff[i]); } - if (changesMask[164 + i]) + if (changesMask[169 + i]) { data.WriteInt32(StatNegBuff[i]); } } } - if (changesMask[168]) + if (changesMask[173]) { for (int i = 0; i < 7; ++i) { - if (changesMask[169 + i]) + if (changesMask[174 + i]) { data.WriteInt32(Resistances[i]); } - if (changesMask[176 + i]) + if (changesMask[181 + i]) { data.WriteInt32(BonusResistanceMods[i]); } - if (changesMask[183 + i]) + if (changesMask[188 + i]) { data.WriteInt32(ManaCostModifier[i]); } @@ -2182,6 +2188,7 @@ namespace Game.Entities ClearChangesMask(MaxItemLevel); ClearChangesMask(AzeriteItemLevel); ClearChangesMask(WildBattlePetLevel); + ClearChangesMask(Field_220); ClearChangesMask(BattlePetCompanionNameTimestamp); ClearChangesMask(InteractSpellID); ClearChangesMask(ScaleDuration); @@ -2501,9 +2508,9 @@ namespace Game.Entities { public UpdateField HasQuestSession = new(0, 1); public UpdateField HasLevelLink = new(0, 2); - public DynamicUpdateFieldCustomizations = new(0, 3); - public DynamicUpdateFieldQuestSessionQuestLog = new(0, 4); - public DynamicUpdateFieldArenaCooldowns = new(0, 5); + public DynamicUpdateField Customizations = new(0, 3); + public DynamicUpdateField QuestSessionQuestLog = new(0, 4); + public DynamicUpdateField ArenaCooldowns = new(0, 5); public UpdateField DuelArbiter = new(0, 6); public UpdateField WowAccount = new(0, 7); public UpdateField LootTargetGUID = new(0, 8); @@ -2532,9 +2539,9 @@ namespace Game.Entities public UpdateField CovenantID = new(0, 31); public UpdateField SoulbindID = new(32, 33); public UpdateField DungeonScore = new(32, 34); - public UpdateFieldArrayQuestLog = new(125, 35, 36); - public UpdateFieldArrayVisibleItems = new(19, 161, 162); - public UpdateFieldArrayAvgItemLevel = new(6, 181, 182); + public UpdateFieldArray QuestLog = new(125, 35, 36); + public UpdateFieldArray VisibleItems = new(19, 161, 162); + public UpdateFieldArray AvgItemLevel = new(6, 181, 182); public PlayerData() : base(0, TypeId.Player, 188) { } @@ -3045,8 +3052,10 @@ namespace Game.Entities public UpdateField SeasonBestRating = new(0, 8); public UpdateField PvpTierID = new(0, 9); public UpdateField WeeklyBestWinPvpTierID = new(0, 10); + public UpdateField Field_28 = new(0, 11); + public UpdateField Field_2C = new(0, 12); - public PVPInfo() : base(11) { } + public PVPInfo() : base(13) { } public void WriteCreate(WorldPacket data, Player owner, Player receiver) { @@ -3059,6 +3068,8 @@ namespace Game.Entities data.WriteUInt32(SeasonBestRating); data.WriteUInt32(PvpTierID); data.WriteUInt32(WeeklyBestWinPvpTierID); + data.WriteUInt32(Field_28); + data.WriteUInt32(Field_2C); data.WriteBit(Disqualified); data.FlushBits(); } @@ -3069,7 +3080,7 @@ namespace Game.Entities if (ignoreChangesMask) changesMask.SetAll(); - data.WriteBits(changesMask.GetBlock(0), 11); + data.WriteBits(changesMask.GetBlock(0), 13); if (changesMask[0]) { @@ -3117,6 +3128,14 @@ namespace Game.Entities { data.WriteUInt32(WeeklyBestWinPvpTierID); } + if (changesMask[11]) + { + data.WriteUInt32(Field_28); + } + if (changesMask[12]) + { + data.WriteUInt32(Field_2C); + } } data.FlushBits(); } @@ -3133,6 +3152,8 @@ namespace Game.Entities ClearChangesMask(SeasonBestRating); ClearChangesMask(PvpTierID); ClearChangesMask(WeeklyBestWinPvpTierID); + ClearChangesMask(Field_28); + ClearChangesMask(Field_2C); _changesMask.ResetAll(); } } @@ -3285,8 +3306,8 @@ namespace Game.Entities public class ActivePlayerUnk901 : BaseUpdateData { - public UpdateField Field_0 = new(0, 1 ); - public UpdateField Field_10 = new(0, 2 ); + public UpdateField Field_0 = new(0, 1); + public UpdateField Field_10 = new(0, 2); public ActivePlayerUnk901() : base(3) { } @@ -3525,7 +3546,7 @@ namespace Game.Entities public UpdateField GuildClubMemberID = new(98, 101); public UpdateField Honor = new(98, 102); public UpdateField HonorNextLevel = new(98, 103); - public UpdateFieldNumBankSlots = new(98, 104); + public UpdateField NumBankSlots = new(98, 104); public UpdateField Field_1410 = new(98, 106); public UpdateField> QuestSession = new(98, 105); public UpdateField UiChromieTimeExpansionID = new(98, 107); @@ -3534,26 +3555,25 @@ namespace Game.Entities public UpdateField DEBUGSoulbindConduitRank = new(98, 110); public UpdateField DungeonScore = new(98, 111); public UpdateFieldArray InvSlots = new(199, 112, 113); - public UpdateFieldArray TrackResourceMask = new(2, 312, 313); - public UpdateFieldArray ExploredZones = new(240, 315, 316); - public UpdateFieldArray RestInfo = new(2, 556, 557); - public UpdateFieldArray ModDamageDonePos = new(7, 559, 560); - public UpdateFieldArray ModDamageDoneNeg = new(7, 559, 567); - public UpdateFieldArray ModDamageDonePercent = new(7, 559, 574); - public UpdateFieldArray ModHealingDonePercent = new(7, 559, 581); - public UpdateFieldArray WeaponDmgMultipliers = new(3, 588, 589); - public UpdateFieldArray WeaponAtkSpeedMultipliers = new(3, 588, 592); - public UpdateFieldArray BuybackPrice = new(12, 595, 596); - public UpdateFieldArray BuybackTimestamp = new(12, 595, 608); - public UpdateFieldArray CombatRatings = new(32, 620, 621); - public UpdateFieldArray PvpInfo = new(6, 653, 654); - public UpdateFieldArray NoReagentCostMask = new(4, 660, 661); - public UpdateFieldArray ProfessionSkillLine = new(2, 665, 666); - public UpdateFieldArray BagSlotFlags = new(4, 668, 669); - public UpdateFieldArray BankBagSlotFlags = new(7, 673, 674); - public UpdateFieldArray QuestCompleted = new(875, 681, 682); + public UpdateFieldArray ExploredZones = new(240, 312, 313); + public UpdateFieldArray RestInfo = new(2, 553, 554); + public UpdateFieldArray ModDamageDonePos = new(7, 556, 557); + public UpdateFieldArray ModDamageDoneNeg = new(7, 556, 564); + public UpdateFieldArray ModDamageDonePercent = new(7, 556, 571); + public UpdateFieldArray ModHealingDonePercent = new(7, 556, 578); + public UpdateFieldArray WeaponDmgMultipliers = new(3, 585, 586); + public UpdateFieldArray WeaponAtkSpeedMultipliers = new(3, 585, 589); + public UpdateFieldArray BuybackPrice = new(12, 592, 593); + public UpdateFieldArray BuybackTimestamp = new(12, 592, 605); + public UpdateFieldArray CombatRatings = new(32, 617, 618); + public UpdateFieldArray PvpInfo = new(6, 650, 651); + public UpdateFieldArray NoReagentCostMask = new(4, 657, 658); + public UpdateFieldArray ProfessionSkillLine = new(2, 662, 663); + public UpdateFieldArray BagSlotFlags = new(4, 665, 666); + public UpdateFieldArray BankBagSlotFlags = new(7, 670, 671); + public UpdateFieldArray QuestCompleted = new(875, 678, 679); - public ActivePlayerData() : base(0, TypeId.ActivePlayer, 1557) { } + public ActivePlayerData() : base(0, TypeId.ActivePlayer, 1554) { } public void WriteCreate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, Player owner, Player receiver) { @@ -3572,10 +3592,6 @@ namespace Game.Entities data.WriteUInt32(CharacterPoints); data.WriteUInt32(MaxTalentTiers); data.WriteUInt32(TrackCreatureMask); - for (int i = 0; i < 2; ++i) - { - data.WriteUInt32(TrackResourceMask[i]); - } data.WriteFloat(MainhandExpertise); data.WriteFloat(OffhandExpertise); data.WriteFloat(RangedExpertise); @@ -4611,150 +4627,140 @@ namespace Game.Entities } } if (changesMask[312]) - { - for (int i = 0; i < 2; ++i) - { - if (changesMask[313 + i]) - { - data.WriteUInt32(TrackResourceMask[i]); - } - } - } - if (changesMask[315]) { for (int i = 0; i < 240; ++i) { - if (changesMask[316 + i]) + if (changesMask[313 + i]) { data.WriteUInt64(ExploredZones[i]); } } } - if (changesMask[556]) + if (changesMask[553]) { for (int i = 0; i < 2; ++i) { - if (changesMask[557 + i]) + if (changesMask[554 + i]) { RestInfo[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } } } - if (changesMask[559]) + if (changesMask[556]) { for (int i = 0; i < 7; ++i) { - if (changesMask[560 + i]) + if (changesMask[557 + i]) { data.WriteInt32(ModDamageDonePos[i]); } - if (changesMask[567 + i]) + if (changesMask[564 + i]) { data.WriteInt32(ModDamageDoneNeg[i]); } - if (changesMask[574 + i]) + if (changesMask[571 + i]) { data.WriteFloat(ModDamageDonePercent[i]); } - if (changesMask[581 + i]) + if (changesMask[578 + i]) { data.WriteFloat(ModHealingDonePercent[i]); } } } - if (changesMask[588]) + if (changesMask[585]) { for (int i = 0; i < 3; ++i) { - if (changesMask[589 + i]) + if (changesMask[586 + i]) { data.WriteFloat(WeaponDmgMultipliers[i]); } - if (changesMask[592 + i]) + if (changesMask[589 + i]) { data.WriteFloat(WeaponAtkSpeedMultipliers[i]); } } } - if (changesMask[595]) + if (changesMask[592]) { for (int i = 0; i < 12; ++i) { - if (changesMask[596 + i]) + if (changesMask[593 + i]) { data.WriteUInt32(BuybackPrice[i]); } - if (changesMask[608 + i]) + if (changesMask[605 + i]) { data.WriteUInt32(BuybackTimestamp[i]); } } } - if (changesMask[620]) + if (changesMask[617]) { for (int i = 0; i < 32; ++i) { - if (changesMask[621 + i]) + if (changesMask[618 + i]) { data.WriteUInt32(CombatRatings[i]); } } } - if (changesMask[660]) + if (changesMask[657]) { for (int i = 0; i < 4; ++i) { - if (changesMask[661 + i]) + if (changesMask[658 + i]) { data.WriteUInt32(NoReagentCostMask[i]); } } } - if (changesMask[665]) + if (changesMask[662]) { for (int i = 0; i < 2; ++i) { - if (changesMask[666 + i]) + if (changesMask[663 + i]) { data.WriteUInt32(ProfessionSkillLine[i]); } } } - if (changesMask[668]) + if (changesMask[665]) { for (int i = 0; i < 4; ++i) { - if (changesMask[669 + i]) + if (changesMask[666 + i]) { data.WriteUInt32(BagSlotFlags[i]); } } } - if (changesMask[673]) + if (changesMask[670]) { for (int i = 0; i < 7; ++i) { - if (changesMask[674 + i]) + if (changesMask[671 + i]) { data.WriteUInt32(BankBagSlotFlags[i]); } } } - if (changesMask[681]) + if (changesMask[678]) { for (int i = 0; i < 875; ++i) { - if (changesMask[682 + i]) + if (changesMask[679 + i]) { data.WriteUInt64(QuestCompleted[i]); } } } - if (changesMask[653]) + if (changesMask[650]) { for (int i = 0; i < 6; ++i) { - if (changesMask[654 + i]) + if (changesMask[651 + i]) { PvpInfo[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } @@ -4873,7 +4879,6 @@ namespace Game.Entities ClearChangesMask(DEBUGSoulbindConduitRank); ClearChangesMask(DungeonScore); ClearChangesMask(InvSlots); - ClearChangesMask(TrackResourceMask); ClearChangesMask(ExploredZones); ClearChangesMask(RestInfo); ClearChangesMask(ModDamageDonePos); @@ -5429,6 +5434,31 @@ namespace Game.Entities } } + public class VisualAnim : BaseUpdateData + { + public UpdateField Field_C = new(0, 1); + public UpdateField AnimationDataID = new(0, 2); + public UpdateField AnimKitID = new(0, 3); + public UpdateField AnimProgress = new(0, 4); + + public VisualAnim() : base(0, TypeId.AreaTrigger, 5) { } + + void WriteCreate(WorldPacket data, AreaTrigger owner, Player receiver) + { + + } + + void WriteUpdate(WorldPacket data, bool ignoreChangesMask, AreaTrigger owner, Player receiver) + { + + } + + public override void ClearChangesMask() + { + + } + } + public class AreaTriggerFieldData : BaseUpdateData { public UpdateField OverrideScaleCurve = new(0, 1); @@ -5444,11 +5474,13 @@ namespace Game.Entities public UpdateField BoundsRadius2D = new(0, 11); public UpdateField DecalPropertiesID = new(0, 12); public UpdateField CreatingEffectGUID = new(0, 13); + public UpdateField Field_80 = new(0, 14); + public UpdateField VisualAnim = new(0, 15); - public AreaTriggerFieldData() : base(0, TypeId.AreaTrigger, 14) { } + public AreaTriggerFieldData() : base(0, TypeId.AreaTrigger, 16) { } public void WriteCreate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, AreaTrigger owner, Player receiver) - { + { ((ScaleCurve)OverrideScaleCurve).WriteCreate(data, owner, receiver); data.WritePackedGuid(Caster); data.WriteUInt32(Duration); @@ -5690,9 +5722,10 @@ namespace Game.Entities public UpdateField> Lines = new(0, 2); public DynamicUpdateField Actors = new(0, 3); public UpdateField LastLineEndTime = new(0, 4); - public UpdateFieldProgress = new(0, 5); + public UpdateField Progress = new(0, 5); + public UpdateField Flags = new(0, 6); - public ConversationData() : base(0, TypeId.Conversation, 6) { } + public ConversationData() : base(0, TypeId.Conversation, 7) { } public void WriteCreate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, Conversation owner, Player receiver) { diff --git a/Source/Game/Entities/Object/WorldObject.cs b/Source/Game/Entities/Object/WorldObject.cs index 569cc5b81..00a6e4142 100644 --- a/Source/Game/Entities/Object/WorldObject.cs +++ b/Source/Game/Entities/Object/WorldObject.cs @@ -459,10 +459,6 @@ namespace Game.Entities bool hasMorphCurveID = createProperties != null && createProperties.MorphCurveId != 0; bool hasFacingCurveID = createProperties != null && createProperties.FacingCurveId != 0; bool hasMoveCurveID = createProperties != null && createProperties.MoveCurveId != 0; - bool hasAnimation = createProperties != null && createProperties.AnimId != 0; - bool hasUnk3 = areaTriggerTemplate != null && areaTriggerTemplate.HasFlag(AreaTriggerFlags.Unk3); - bool hasAnimKitID = createProperties != null && createProperties.AnimKitId != 0; - bool hasAnimProgress = false; bool hasAreaTriggerSphere = shape.IsSphere(); bool hasAreaTriggerBox = shape.IsBox(); bool hasAreaTriggerPolygon = createProperties != null && shape.IsPolygon(); @@ -482,10 +478,6 @@ namespace Game.Entities data.WriteBit(hasMorphCurveID); data.WriteBit(hasFacingCurveID); data.WriteBit(hasMoveCurveID); - data.WriteBit(hasAnimation); - data.WriteBit(hasAnimKitID); - data.WriteBit(hasUnk3); - data.WriteBit(hasAnimProgress); data.WriteBit(hasAreaTriggerSphere); data.WriteBit(hasAreaTriggerBox); data.WriteBit(hasAreaTriggerPolygon); @@ -494,9 +486,6 @@ namespace Game.Entities data.WriteBit(hasOrbit); data.WriteBit(hasMovementScript); - if (hasUnk3) - data.WriteBit(false); - data.FlushBits(); if (hasAreaTriggerSpline) @@ -522,15 +511,6 @@ namespace Game.Entities if (hasMoveCurveID) data.WriteUInt32(createProperties.MoveCurveId); - if (hasAnimation) - data.WriteUInt32(createProperties.AnimId); - - if (hasAnimKitID) - data.WriteUInt32(createProperties.AnimKitId); - - if (hasAnimProgress) - data.WriteUInt32(0); - if (hasAreaTriggerSphere) { data.WriteFloat(shape.SphereDatas.Radius); diff --git a/Source/Game/Entities/Player/Player.DB.cs b/Source/Game/Entities/Player/Player.DB.cs index c8c92da3c..acf743d4a 100644 --- a/Source/Game/Entities/Player/Player.DB.cs +++ b/Source/Game/Entities/Player/Player.DB.cs @@ -2309,7 +2309,7 @@ namespace Game.Entities stmt.AddValue(index++, GetMaxHealth()); for (byte i = 0; i < (int)PowerType.MaxPerClass; ++i) - stmt.AddValue(index++, GetMaxPower((PowerType)i)); + stmt.AddValue(index++, m_unitData.MaxPower[i]); for (byte i = 0; i < (int)Stats.Max; ++i) stmt.AddValue(index++, GetStat((Stats)i)); @@ -2317,14 +2317,14 @@ namespace Game.Entities for (int i = 0; i < (int)SpellSchools.Max; ++i) stmt.AddValue(index++, GetResistance((SpellSchools)i)); - stmt.AddValue(index++, (float)m_activePlayerData.BlockPercentage); - stmt.AddValue(index++, (float)m_activePlayerData.DodgePercentage); - stmt.AddValue(index++, (float)m_activePlayerData.ParryPercentage); - stmt.AddValue(index++, (float)m_activePlayerData.CritPercentage); - stmt.AddValue(index++, (float)m_activePlayerData.RangedCritPercentage); - stmt.AddValue(index++, (float)m_activePlayerData.SpellCritPercentage); - stmt.AddValue(index++, (int)m_unitData.AttackPower); - stmt.AddValue(index++, (int)m_unitData.RangedAttackPower); + stmt.AddValue(index++, m_activePlayerData.BlockPercentage); + stmt.AddValue(index++, m_activePlayerData.DodgePercentage); + stmt.AddValue(index++, m_activePlayerData.ParryPercentage); + stmt.AddValue(index++, m_activePlayerData.CritPercentage); + stmt.AddValue(index++, m_activePlayerData.RangedCritPercentage); + stmt.AddValue(index++, m_activePlayerData.SpellCritPercentage); + stmt.AddValue(index++, m_unitData.AttackPower); + stmt.AddValue(index++, m_unitData.RangedAttackPower); stmt.AddValue(index++, GetBaseSpellPowerBonus()); stmt.AddValue(index, m_activePlayerData.CombatRatings[(int)CombatRating.ResiliencePlayerDamage]); diff --git a/Source/Game/Entities/Player/Player.cs b/Source/Game/Entities/Player/Player.cs index f7da15b6a..8f98bb056 100644 --- a/Source/Game/Entities/Player/Player.cs +++ b/Source/Game/Entities/Player/Player.cs @@ -7436,9 +7436,6 @@ namespace Game.Entities public void AddTrackCreatureFlag(uint flags) { SetUpdateFieldFlagValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.TrackCreatureMask), flags); } public void RemoveTrackCreatureFlag(uint flags) { RemoveUpdateFieldFlagValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.TrackCreatureMask), flags); } - public void AddTrackResourceFlag(uint index, uint flags) { SetUpdateFieldFlagValue(ref m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.TrackResourceMask, (int)index), flags); } - public void RemoveTrackResourceFlag(uint index, uint flags) { RemoveUpdateFieldFlagValue(ref m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.TrackResourceMask, (int)index), flags); } - public void SetVersatilityBonus(float value) { SetUpdateFieldStatValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.VersatilityBonus), value); } public void ApplyModOverrideSpellPowerByAPPercent(float mod, bool apply) { ApplyModUpdateFieldValue(m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.OverrideSpellPowerByAPPercent), mod, apply); } diff --git a/Source/Game/Networking/Packets/MythicPlusPacketsCommon.cs b/Source/Game/Networking/Packets/MythicPlusPacketsCommon.cs index a00ffd677..fc857a607 100644 --- a/Source/Game/Networking/Packets/MythicPlusPacketsCommon.cs +++ b/Source/Game/Networking/Packets/MythicPlusPacketsCommon.cs @@ -23,7 +23,7 @@ namespace Game.Networking.Packets public struct DungeonScoreMapSummary { public int ChallengeModeID; - public int MapScore; + public float MapScore; public int BestRunLevel; public int BestRunDurationMS; public bool FinishedSuccess; @@ -31,7 +31,7 @@ namespace Game.Networking.Packets public void Write(WorldPacket data) { data.WriteInt32(ChallengeModeID); - data.WriteInt32(MapScore); + data.WriteFloat(MapScore); data.WriteInt32(BestRunLevel); data.WriteInt32(BestRunDurationMS); data.WriteBit(FinishedSuccess); @@ -41,12 +41,12 @@ namespace Game.Networking.Packets public class DungeonScoreSummary { - public int CurrentSeasonScore; + public float CurrentSeasonScore; public List Runs = new(); public void Write(WorldPacket data) { - data.WriteInt32(CurrentSeasonScore); + data.WriteFloat(CurrentSeasonScore); data.WriteInt32(Runs.Count); foreach (var dungeonScoreMapSummary in Runs) dungeonScoreMapSummary.Write(data); @@ -93,7 +93,7 @@ namespace Game.Networking.Packets public long CompletionDate; public int Season; public List Members = new(); - public int RunScore; + public float RunScore; public int[] KeystoneAffixIDs = new int[4]; public void Write(WorldPacket data) @@ -108,7 +108,7 @@ namespace Game.Networking.Packets data.WriteInt32(id); data.WriteInt32(Members.Count); - data.WriteInt32(RunScore); + data.WriteFloat(RunScore); foreach (var member in Members) member.Write(data); @@ -121,12 +121,12 @@ namespace Game.Networking.Packets { public int KeystoneAffixID; public MythicPlusRun Run = new(); - public int Score; + public float Score; public void Write(WorldPacket data) { data.WriteInt32(KeystoneAffixID); - data.WriteInt32(Score); + data.WriteFloat(Score); Run.Write(data); } } @@ -135,13 +135,13 @@ namespace Game.Networking.Packets { public int MapChallengeModeID; public List BestRuns = new(); - public int OverAllScore; + public float OverAllScore; public void Write(WorldPacket data) { data.WriteInt32(MapChallengeModeID); data.WriteInt32(BestRuns.Count); - data.WriteInt32(OverAllScore); + data.WriteFloat(OverAllScore); foreach (var bestRun in BestRuns) bestRun.Write(data); } @@ -151,13 +151,13 @@ namespace Game.Networking.Packets { public int Season; public List Maps = new(); - public int SeasonScore; + public float SeasonScore; public void Write(WorldPacket data) { data.WriteInt32(Season); data.WriteInt32(Maps.Count); - data.WriteInt32(SeasonScore); + data.WriteFloat(SeasonScore); foreach (var map in Maps) map.Write(data); } diff --git a/Source/Game/Spells/Auras/AuraEffect.cs b/Source/Game/Spells/Auras/AuraEffect.cs index ee86998d4..1dea1e956 100644 --- a/Source/Game/Spells/Auras/AuraEffect.cs +++ b/Source/Game/Spells/Auras/AuraEffect.cs @@ -1943,25 +1943,6 @@ namespace Game.Spells target.RemoveTrackCreatureFlag(1u << (GetMiscValue() - 1)); } - [AuraEffectHandler(AuraType.TrackResources)] - void HandleAuraTrackResources(AuraApplication aurApp, AuraEffectHandleModes mode, bool apply) - { - if (!mode.HasAnyFlag(AuraEffectHandleModes.SendForClientMask)) - return; - - Player target = aurApp.GetTarget().ToPlayer(); - if (target == null) - return; - - uint bitIndex = (uint)GetMiscValue() - 1; - uint index = bitIndex / 32; - uint flag = 1u << ((int)bitIndex % 32); - if (apply) - target.AddTrackResourceFlag(index, flag); - else - target.RemoveTrackResourceFlag(index, flag); - } - [AuraEffectHandler(AuraType.TrackStealthed)] void HandleAuraTrackStealthed(AuraApplication aurApp, AuraEffectHandleModes mode, bool apply) { diff --git a/sql/base/characters_database.sql b/sql/base/characters_database.sql index 21d4ff0ae..da109df7c 100644 --- a/sql/base/characters_database.sql +++ b/sql/base/characters_database.sql @@ -1632,6 +1632,7 @@ CREATE TABLE `character_stats` ( `maxpower4` int(10) unsigned NOT NULL DEFAULT '0', `maxpower5` int(10) unsigned NOT NULL DEFAULT '0', `maxpower6` int(10) unsigned NOT NULL DEFAULT '0', + `maxpower7` int(10) unsigned NOT NULL DEFAULT '0', `strength` int(10) unsigned NOT NULL DEFAULT '0', `agility` int(10) unsigned NOT NULL DEFAULT '0', `stamina` int(10) unsigned NOT NULL DEFAULT '0', @@ -1843,6 +1844,7 @@ CREATE TABLE `characters` ( `power4` int(10) unsigned NOT NULL DEFAULT '0', `power5` int(10) unsigned NOT NULL DEFAULT '0', `power6` int(10) unsigned NOT NULL DEFAULT '0', + `power7` int(10) unsigned NOT NULL DEFAULT '0', `latency` mediumint(8) unsigned NOT NULL DEFAULT '0', `activeTalentGroup` tinyint(3) unsigned NOT NULL DEFAULT '0', `lootSpecId` int(10) unsigned NOT NULL DEFAULT '0', @@ -3670,7 +3672,8 @@ INSERT INTO `updates` VALUES ('2021_10_02_01_characters.sql','F97B956F3B5F909294CA399F75B5795A07C4D8EC','ARCHIVED','2021-10-02 21:47:38',0), ('2021_10_15_00_characters.sql','906FECD65CBA7C406969F45FDF28DDEF8AAF8715','ARCHIVED','2021-10-15 10:11:47',0), ('2021_10_16_00_characters.sql','B5A31BB6FBC34512767475EDF13099DEC948EBB7','RELEASED','2021-10-16 01:12:20',0), -('2021_11_02_00_characters.sql','A3C0A6DA70CC70803C80685E4E2ED6255156520A','RELEASED','2021-11-02 18:11:13',0); +('2021_11_02_00_characters.sql','A3C0A6DA70CC70803C80685E4E2ED6255156520A','RELEASED','2021-11-02 18:11:13',0), +('2021_11_04_00_characters.sql','ED533235ADAD174F91A6B8E51D1046243B78B46D','RELEASED','2021-11-04 21:53:04',0); /*!40000 ALTER TABLE `updates` ENABLE KEYS */; UNLOCK TABLES; diff --git a/sql/updates/characters/master/2021_11_04_00_characters.sql b/sql/updates/characters/master/2021_11_04_00_characters.sql new file mode 100644 index 000000000..e6db9872f --- /dev/null +++ b/sql/updates/characters/master/2021_11_04_00_characters.sql @@ -0,0 +1,2 @@ +ALTER TABLE `characters` ADD `power7` int(10) unsigned NOT NULL DEFAULT '0' AFTER `power6`; +ALTER TABLE `character_stats` ADD `maxpower7` int(10) unsigned NOT NULL DEFAULT '0' AFTER `maxpower6`;