Core/DataStores: Updated db2 structures to 8.2.5
Port From (https://github.com/TrinityCore/TrinityCore/commit/3ac790287aba5f7d7c3bccf79e608de9119e461a)
This commit is contained in:
@@ -417,7 +417,7 @@ namespace Framework.Constants
|
||||
ReachAccountHonorLevel = 213,
|
||||
HeartOfAzerothArtifactPowerEarned = 214,
|
||||
HeartOfAzerothLevelReached = 215,
|
||||
TotalTypes = 217
|
||||
TotalTypes = 219
|
||||
}
|
||||
|
||||
public enum CriteriaDataType
|
||||
|
||||
@@ -304,7 +304,7 @@ namespace Framework.Constants
|
||||
BattlePetDisplayId = 6,
|
||||
EnchantIllusionAllSpecs = 7,
|
||||
ArtifactAppearanceId = 8,
|
||||
ScalingStatDistributionFixedLevel = 9,
|
||||
TimewalkerLevel = 9,
|
||||
EnchantIllusionSpec1 = 10,
|
||||
TransmogAppearanceSpec2 = 11,
|
||||
EnchantIllusionSpec2 = 12,
|
||||
@@ -317,9 +317,11 @@ namespace Framework.Constants
|
||||
ChallengeKeystoneAffixId1 = 19,
|
||||
ChallengeKeystoneAffixId2 = 20,
|
||||
ChallengeKeystoneAffixId3 = 21,
|
||||
ChallengeKeystoneIsCharged = 22,
|
||||
ChallengeKeystoneAffixId4 = 22,
|
||||
ArtifactKnowledgeLevel = 23,
|
||||
ArtifactTier = 24,
|
||||
Unused25 = 25,
|
||||
PvpRating = 26,
|
||||
|
||||
Max
|
||||
}
|
||||
|
||||
@@ -757,6 +757,7 @@ namespace Framework.Constants
|
||||
PvpIsland = 45,
|
||||
NormalWarfront = 147,
|
||||
HeroicWarfront = 149,
|
||||
LFR15thAnniversary = 151,
|
||||
|
||||
Max
|
||||
}
|
||||
|
||||
@@ -22,7 +22,7 @@ namespace Framework.Database
|
||||
public override void PreparedStatements()
|
||||
{
|
||||
const string SelectItemInstanceContent = "ii.guid, ii.itemEntry, ii.creatorGuid, ii.giftCreatorGuid, ii.count, ii.duration, ii.charges, ii.flags, ii.enchantments, ii.randomBonusListId, " +
|
||||
"ii.durability, ii.playedTime, ii.text, ii.upgradeId, ii.battlePetSpeciesId, ii.battlePetBreedData, ii.battlePetLevel, ii.battlePetDisplayId, ii.context, ii.bonusListIDs, " +
|
||||
"ii.durability, ii.playedTime, ii.text, ii.battlePetSpeciesId, ii.battlePetBreedData, ii.battlePetLevel, ii.battlePetDisplayId, ii.context, ii.bonusListIDs, " +
|
||||
"iit.itemModifiedAppearanceAllSpecs, iit.itemModifiedAppearanceSpec1, iit.itemModifiedAppearanceSpec2, iit.itemModifiedAppearanceSpec3, iit.itemModifiedAppearanceSpec4, " +
|
||||
"iit.spellItemEnchantmentAllSpecs, iit.spellItemEnchantmentSpec1, iit.spellItemEnchantmentSpec2, iit.spellItemEnchantmentSpec3, iit.spellItemEnchantmentSpec4, " +
|
||||
"ig.gemItemId1, ig.gemBonuses1, ig.gemContext1, ig.gemScalingLevel1, ig.gemItemId2, ig.gemBonuses2, ig.gemContext2, ig.gemScalingLevel2, ig.gemItemId3, ig.gemBonuses3, ig.gemContext3, ig.gemScalingLevel3, " +
|
||||
@@ -165,9 +165,9 @@ namespace Framework.Database
|
||||
PrepareStatement(CharStatements.DEL_ITEM_BOP_TRADE, "DELETE FROM item_soulbound_trade_data WHERE itemGuid = ? LIMIT 1");
|
||||
PrepareStatement(CharStatements.INS_ITEM_BOP_TRADE, "INSERT INTO item_soulbound_trade_data VALUES (?, ?)");
|
||||
PrepareStatement(CharStatements.REP_INVENTORY_ITEM, "REPLACE INTO character_inventory (guid, bag, slot, item) VALUES (?, ?, ?, ?)");
|
||||
PrepareStatement(CharStatements.REP_ITEM_INSTANCE, "REPLACE INTO item_instance (itemEntry, owner_guid, creatorGuid, giftCreatorGuid, count, duration, charges, flags, enchantments, randomBonusListId, durability, playedTime, text, upgradeId, battlePetSpeciesId, battlePetBreedData, battlePetLevel, battlePetDisplayId, context, bonusListIDs, guid) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
|
||||
PrepareStatement(CharStatements.UPD_ITEM_INSTANCE, "UPDATE item_instance SET itemEntry = ?, owner_guid = ?, creatorGuid = ?, giftCreatorGuid = ?, count = ?, duration = ?, charges = ?, flags = ?, enchantments = ?, randomBonusListId = ?, durability = ?, playedTime = ?, text = ?, upgradeId = ?, battlePetSpeciesId = ?, battlePetBreedData = ?, battlePetLevel = ?, battlePetDisplayId = ?, context = ?, bonusListIDs = ? WHERE guid = ?");
|
||||
PrepareStatement(CharStatements.UPD_ITEM_INSTANCE_ON_LOAD, "UPDATE item_instance SET duration = ?, flags = ?, durability = ?, upgradeId = ? WHERE guid = ?");
|
||||
PrepareStatement(CharStatements.REP_ITEM_INSTANCE, "REPLACE INTO item_instance (itemEntry, owner_guid, creatorGuid, giftCreatorGuid, count, duration, charges, flags, enchantments, randomBonusListId, durability, playedTime, text, battlePetSpeciesId, battlePetBreedData, battlePetLevel, battlePetDisplayId, context, bonusListIDs, guid) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
|
||||
PrepareStatement(CharStatements.UPD_ITEM_INSTANCE, "UPDATE item_instance SET itemEntry = ?, owner_guid = ?, creatorGuid = ?, giftCreatorGuid = ?, count = ?, duration = ?, charges = ?, flags = ?, enchantments = ?, randomBonusListId = ?, durability = ?, playedTime = ?, text = ?, battlePetSpeciesId = ?, battlePetBreedData = ?, battlePetLevel = ?, battlePetDisplayId = ?, context = ?, bonusListIDs = ? WHERE guid = ?");
|
||||
PrepareStatement(CharStatements.UPD_ITEM_INSTANCE_ON_LOAD, "UPDATE item_instance SET duration = ?, flags = ?, durability = ? WHERE guid = ?");
|
||||
PrepareStatement(CharStatements.DEL_ITEM_INSTANCE, "DELETE FROM item_instance WHERE guid = ?");
|
||||
PrepareStatement(CharStatements.DEL_ITEM_INSTANCE_BY_OWNER, "DELETE FROM item_instance WHERE owner_guid = ?");
|
||||
PrepareStatement(CharStatements.INS_ITEM_INSTANCE_GEMS, "INSERT INTO item_instance_gems (itemGuid, gemItemId1, gemBonuses1, gemContext1, gemScalingLevel1, gemItemId2, gemBonuses2, gemContext2, gemScalingLevel2, gemItemId3, gemBonuses3, gemContext3, gemScalingLevel3) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
|
||||
@@ -619,8 +619,8 @@ namespace Framework.Database
|
||||
PrepareStatement(CharStatements.DEL_CHAR_FISHINGSTEPS, "DELETE FROM character_fishingsteps WHERE guid = ?");
|
||||
|
||||
// Void Storage
|
||||
PrepareStatement(CharStatements.SEL_CHAR_VOID_STORAGE, "SELECT itemId, itemEntry, slot, creatorGuid, randomBonusListId, upgradeId, fixedScalingLevel, artifactKnowledgeLevel, context, bonusListIDs FROM character_void_storage WHERE playerGuid = ?");
|
||||
PrepareStatement(CharStatements.REP_CHAR_VOID_STORAGE_ITEM, "REPLACE INTO character_void_storage (itemId, playerGuid, itemEntry, slot, creatorGuid, randomBonusListId, upgradeId, fixedScalingLevel, artifactKnowledgeLevel, context, bonusListIDs) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
|
||||
PrepareStatement(CharStatements.SEL_CHAR_VOID_STORAGE, "SELECT itemId, itemEntry, slot, creatorGuid, randomBonusListId, fixedScalingLevel, artifactKnowledgeLevel, context, bonusListIDs FROM character_void_storage WHERE playerGuid = ?");
|
||||
PrepareStatement(CharStatements.REP_CHAR_VOID_STORAGE_ITEM, "REPLACE INTO character_void_storage (itemId, playerGuid, itemEntry, slot, creatorGuid, randomBonusListId, fixedScalingLevel, artifactKnowledgeLevel, context, bonusListIDs) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
|
||||
PrepareStatement(CharStatements.DEL_CHAR_VOID_STORAGE_ITEM_BY_CHAR_GUID, "DELETE FROM character_void_storage WHERE playerGuid = ?");
|
||||
PrepareStatement(CharStatements.DEL_CHAR_VOID_STORAGE_ITEM_BY_SLOT, "DELETE FROM character_void_storage WHERE slot = ? AND playerGuid = ?");
|
||||
|
||||
|
||||
@@ -447,8 +447,8 @@ namespace Framework.Database
|
||||
"ItemGroupSoundsID FROM item ORDER BY ID DESC");
|
||||
|
||||
// ItemAppearance.db2
|
||||
PrepareStatement(HotfixStatements.SEL_ITEM_APPEARANCE, "SELECT ID, DisplayType, ItemDisplayInfoID, DefaultIconFileDataID, UiOrder FROM item_appearance" +
|
||||
" ORDER BY ID DESC");
|
||||
PrepareStatement(HotfixStatements.SEL_ITEM_APPEARANCE, "SELECT ID, DisplayType, SubclassID, ItemDisplayInfoID, DefaultIconFileDataID, UiOrder" +
|
||||
" FROM item_appearance ORDER BY ID DESC");
|
||||
|
||||
// ItemArmorQuality.db2
|
||||
PrepareStatement(HotfixStatements.SEL_ITEM_ARMOR_QUALITY, "SELECT ID, Qualitymod1, Qualitymod2, Qualitymod3, Qualitymod4, Qualitymod5, Qualitymod6, " +
|
||||
@@ -569,10 +569,10 @@ namespace Framework.Database
|
||||
"StatPercentageOfSocket9, StatPercentageOfSocket10, StatPercentEditor1, StatPercentEditor2, StatPercentEditor3, StatPercentEditor4, " +
|
||||
"StatPercentEditor5, StatPercentEditor6, StatPercentEditor7, StatPercentEditor8, StatPercentEditor9, StatPercentEditor10, Stackable, " +
|
||||
"MaxCount, RequiredAbility, SellPrice, BuyPrice, VendorStackCount, PriceVariance, PriceRandomValue, Flags1, Flags2, Flags3, Flags4, " +
|
||||
"FactionRelated, ItemNameDescriptionID, RequiredTransmogHoliday, RequiredHoliday, LimitCategory, GemProperties, SocketMatchEnchantmentId, " +
|
||||
"TotemCategoryID, InstanceBound, ZoneBound, ItemSet, LockID, StartQuestID, PageID, ItemDelay, ScalingStatDistributionID, MinFactionID, " +
|
||||
"RequiredSkillRank, RequiredSkill, ItemLevel, AllowableClass, ExpansionID, ArtifactID, SpellWeight, SpellWeightCategory, SocketType1, " +
|
||||
"SocketType2, SocketType3, SheatheType, Material, PageMaterialID, LanguageID, Bonding, DamageDamageType, StatModifierBonusStat1, " +
|
||||
"FactionRelated, ItemNameDescriptionID, RequiredTransmogHoliday, RequiredHoliday, LimitCategory, GemProperties, SocketMatchEnchantmentId, " +
|
||||
"TotemCategoryID, InstanceBound, ZoneBound1, ZoneBound2, ItemSet, LockID, StartQuestID, PageID, ItemDelay, ScalingStatDistributionID, " +
|
||||
"MinFactionID, RequiredSkillRank, RequiredSkill, ItemLevel, AllowableClass, ExpansionID, ArtifactID, SpellWeight, SpellWeightCategory, " +
|
||||
"SocketType1, SocketType2, SocketType3, SheatheType, Material, PageMaterialID, LanguageID, Bonding, DamageDamageType, StatModifierBonusStat1, " +
|
||||
"StatModifierBonusStat2, StatModifierBonusStat3, StatModifierBonusStat4, StatModifierBonusStat5, StatModifierBonusStat6, " +
|
||||
"StatModifierBonusStat7, StatModifierBonusStat8, StatModifierBonusStat9, StatModifierBonusStat10, ContainerSlots, MinReputation, " +
|
||||
"RequiredPVPMedal, RequiredPVPRank, RequiredLevel, InventoryType, OverallQualityID FROM item_sparse ORDER BY ID DESC");
|
||||
@@ -586,10 +586,6 @@ namespace Framework.Database
|
||||
// ItemSpecOverride.db2
|
||||
PrepareStatement(HotfixStatements.SEL_ITEM_SPEC_OVERRIDE, "SELECT ID, SpecID, ItemID FROM item_spec_override ORDER BY ID DESC");
|
||||
|
||||
// ItemUpgrade.db2
|
||||
PrepareStatement(HotfixStatements.SEL_ITEM_UPGRADE, "SELECT ID, ItemUpgradePathID, ItemLevelIncrement, PrerequisiteID, CurrencyType, CurrencyAmount" +
|
||||
" FROM item_upgrade ORDER BY ID DESC");
|
||||
|
||||
// ItemXBonusTree.db2
|
||||
PrepareStatement(HotfixStatements.SEL_ITEM_X_BONUS_TREE, "SELECT ID, ItemBonusTreeID, ItemID FROM item_x_bonus_tree ORDER BY ID DESC");
|
||||
|
||||
@@ -712,7 +708,7 @@ namespace Framework.Database
|
||||
PrepareStatement(HotfixStatements.SEL_POWER_DISPLAY, "SELECT ID, GlobalStringBaseTag, ActualType, Red, Green, Blue FROM power_display ORDER BY ID DESC");
|
||||
|
||||
// PowerType.db2
|
||||
PrepareStatement(HotfixStatements.SEL_POWER_TYPE, "SELECT ID, NameGlobalStringTag, CostGlobalStringTag, PowerTypeEnum, MinPower, MaxBasePower, CenterPower, " +
|
||||
PrepareStatement(HotfixStatements.SEL_POWER_TYPE, "SELECT NameGlobalStringTag, CostGlobalStringTag, ID, PowerTypeEnum, MinPower, MaxBasePower, CenterPower, " +
|
||||
"DefaultPower, DisplayModifier, RegenInterruptTimeMS, RegenPeace, RegenCombat, Flags FROM power_type ORDER BY ID DESC");
|
||||
|
||||
// PrestigeLevelInfo.db2
|
||||
@@ -775,9 +771,6 @@ namespace Framework.Database
|
||||
// RewardPackXItem.db2
|
||||
PrepareStatement(HotfixStatements.SEL_REWARD_PACK_X_ITEM, "SELECT ID, ItemID, ItemQuantity, RewardPackID FROM reward_pack_x_item ORDER BY ID DESC");
|
||||
|
||||
// RulesetItemUpgrade.db2
|
||||
PrepareStatement(HotfixStatements.SEL_RULESET_ITEM_UPGRADE, "SELECT ID, ItemID, ItemUpgradeID FROM ruleset_item_upgrade ORDER BY ID DESC");
|
||||
|
||||
// ScalingStatDistribution.db2
|
||||
PrepareStatement(HotfixStatements.SEL_SCALING_STAT_DISTRIBUTION, "SELECT ID, PlayerLevelToItemLevelCurveID, MinLevel, MaxLevel" +
|
||||
" FROM scaling_stat_distribution ORDER BY ID DESC");
|
||||
@@ -865,7 +858,7 @@ namespace Framework.Database
|
||||
PrepareStatement(HotfixStatements.SEL_SPELL_DURATION, "SELECT ID, Duration, DurationPerLevel, MaxDuration FROM spell_duration ORDER BY ID DESC");
|
||||
|
||||
// SpellEffect.db2
|
||||
PrepareStatement(HotfixStatements.SEL_SPELL_EFFECT, "SELECT ID, DifficultyID, EffectIndex, Effect, EffectAmplitude, EffectAttributes, EffectAura, " +
|
||||
PrepareStatement(HotfixStatements.SEL_SPELL_EFFECT, "SELECT ID, EffectAura, DifficultyID, EffectIndex, Effect, EffectAmplitude, EffectAttributes, " +
|
||||
"EffectAuraPeriod, EffectBonusCoefficient, EffectChainAmplitude, EffectChainTargets, EffectItemType, EffectMechanic, EffectPointsPerResource, " +
|
||||
"EffectPosFacing, EffectRealPointsPerLevel, EffectTriggerSpell, BonusCoefficientFromAP, PvpMultiplier, Coefficient, Variance, " +
|
||||
"ResourceCoefficient, GroupSizeBasePointsCoefficient, EffectBasePoints, EffectMiscValue1, EffectMiscValue2, EffectRadiusIndex1, " +
|
||||
@@ -905,9 +898,9 @@ namespace Framework.Database
|
||||
" FROM spell_levels ORDER BY ID DESC");
|
||||
|
||||
// SpellMisc.db2
|
||||
PrepareStatement(HotfixStatements.SEL_SPELL_MISC, "SELECT ID, DifficultyID, CastingTimeIndex, DurationIndex, RangeIndex, SchoolMask, Speed, LaunchDelay, " +
|
||||
"MinDuration, SpellIconFileDataID, ActiveIconFileDataID, ContentTuningID, Attributes1, Attributes2, Attributes3, Attributes4, Attributes5, " +
|
||||
"Attributes6, Attributes7, Attributes8, Attributes9, Attributes10, Attributes11, Attributes12, Attributes13, Attributes14, SpellID" +
|
||||
PrepareStatement(HotfixStatements.SEL_SPELL_MISC, "SELECT Attributes1, Attributes2, Attributes3, Attributes4, Attributes5, Attributes6, Attributes7, " +
|
||||
"Attributes8, Attributes9, Attributes10, Attributes11, Attributes12, Attributes13, Attributes14, ID, DifficultyID, CastingTimeIndex, " +
|
||||
"DurationIndex, RangeIndex, SchoolMask, Speed, LaunchDelay, MinDuration, SpellIconFileDataID, ActiveIconFileDataID, ContentTuningID, SpellID" +
|
||||
" FROM spell_misc ORDER BY ID DESC");
|
||||
|
||||
// SpellName.db2
|
||||
@@ -1009,8 +1002,8 @@ namespace Framework.Database
|
||||
PrepareStatement(HotfixStatements.SEL_TRANSMOG_HOLIDAY, "SELECT ID, RequiredTransmogHoliday FROM transmog_holiday ORDER BY ID DESC");
|
||||
|
||||
// TransmogSet.db2
|
||||
PrepareStatement(HotfixStatements.SEL_TRANSMOG_SET, "SELECT Name, ID, ClassMask, TrackingQuestID, Flags, TransmogSetGroupID, ItemNameDescriptionID, " +
|
||||
"ParentTransmogSetID, Unknown810, ExpansionID, PatchID, UiOrder FROM transmog_set ORDER BY ID DESC");
|
||||
PrepareStatement(HotfixStatements.SEL_TRANSMOG_SET, "SELECT Name, ID, ClassMask, TrackingQuestID, Flags, TransmogSetGroupID, ItemNameDescriptionID, " +
|
||||
"ParentTransmogSetID, Unknown810, ExpansionID, PatchID, UiOrder, PlayerConditionID FROM transmog_set ORDER BY ID DESC");
|
||||
PrepareStatement(HotfixStatements.SEL_TRANSMOG_SET_LOCALE, "SELECT ID, Name_lang FROM transmog_set_locale WHERE locale = ?");
|
||||
|
||||
// TransmogSetGroup.db2
|
||||
@@ -1081,10 +1074,6 @@ namespace Framework.Database
|
||||
PrepareStatement(HotfixStatements.SEL_WORLD_MAP_OVERLAY, "SELECT ID, UiMapArtID, TextureWidth, TextureHeight, OffsetX, OffsetY, HitRectTop, HitRectBottom, " +
|
||||
"HitRectLeft, HitRectRight, PlayerConditionID, Flags, AreaID1, AreaID2, AreaID3, AreaID4 FROM world_map_overlay ORDER BY ID DESC");
|
||||
|
||||
// WorldSafeLocs.db2
|
||||
PrepareStatement(HotfixStatements.SEL_WORLD_SAFE_LOCS, "SELECT ID, AreaName, LocX, LocY, LocZ, MapID, Facing FROM world_safe_locs ORDER BY ID DESC");
|
||||
PrepareStatement(HotfixStatements.SEL_WORLD_SAFE_LOCS_LOCALE, "SELECT ID, AreaName_lang FROM world_safe_locs_locale WHERE locale = ?");
|
||||
|
||||
// WorldStateExpression.db2
|
||||
PrepareStatement(HotfixStatements.SEL_WORLD_STATE_EXPRESSION, "SELECT ID, Expression FROM world_state_expression ORDER BY ID DESC");
|
||||
}
|
||||
@@ -1380,8 +1369,6 @@ namespace Framework.Database
|
||||
|
||||
SEL_ITEM_SPEC_OVERRIDE,
|
||||
|
||||
SEL_ITEM_UPGRADE,
|
||||
|
||||
SEL_ITEM_X_BONUS_TREE,
|
||||
|
||||
SEL_KEYCHAIN,
|
||||
@@ -1475,8 +1462,6 @@ namespace Framework.Database
|
||||
|
||||
SEL_REWARD_PACK_X_ITEM,
|
||||
|
||||
SEL_RULESET_ITEM_UPGRADE,
|
||||
|
||||
SEL_SCALING_STAT_DISTRIBUTION,
|
||||
|
||||
SEL_SCENARIO,
|
||||
@@ -1634,9 +1619,6 @@ namespace Framework.Database
|
||||
|
||||
SEL_WORLD_MAP_OVERLAY,
|
||||
|
||||
SEL_WORLD_SAFE_LOCS,
|
||||
SEL_WORLD_SAFE_LOCS_LOCALE,
|
||||
|
||||
SEL_WORLD_STATE_EXPRESSION,
|
||||
|
||||
MAX_HOTFIXDATABASE_STATEMENTS
|
||||
|
||||
@@ -596,7 +596,7 @@ namespace Game.BattleFields
|
||||
return null;
|
||||
}
|
||||
|
||||
public WorldSafeLocsRecord GetClosestGraveYard(Player player)
|
||||
public WorldSafeLocsEntry GetClosestGraveYard(Player player)
|
||||
{
|
||||
BfGraveyard closestGY = null;
|
||||
float maxdist = -1;
|
||||
@@ -617,7 +617,7 @@ namespace Game.BattleFields
|
||||
}
|
||||
|
||||
if (closestGY != null)
|
||||
return CliDB.WorldSafeLocsStorage.LookupByKey(closestGY.GetGraveyardId());
|
||||
return Global.ObjectMgr.GetWorldSafeLoc(closestGY.GetGraveyardId());
|
||||
|
||||
return null;
|
||||
}
|
||||
@@ -891,8 +891,8 @@ namespace Game.BattleFields
|
||||
|
||||
public float GetDistance(Player player)
|
||||
{
|
||||
WorldSafeLocsRecord safeLoc = CliDB.WorldSafeLocsStorage.LookupByKey(m_GraveyardId);
|
||||
return player.GetDistance2d(safeLoc.Loc.X, safeLoc.Loc.Y);
|
||||
WorldSafeLocsEntry safeLoc = Global.ObjectMgr.GetWorldSafeLoc(m_GraveyardId);
|
||||
return player.GetDistance2d(safeLoc.Loc.GetPositionX(), safeLoc.Loc.GetPositionY());
|
||||
}
|
||||
|
||||
public void AddPlayer(ObjectGuid playerGuid)
|
||||
@@ -964,7 +964,7 @@ namespace Game.BattleFields
|
||||
|
||||
void RelocateDeadPlayers()
|
||||
{
|
||||
WorldSafeLocsRecord closestGrave = null;
|
||||
WorldSafeLocsEntry closestGrave = null;
|
||||
foreach (var guid in m_ResurrectQueue)
|
||||
{
|
||||
Player player = Global.ObjAccessor.FindPlayer(guid);
|
||||
@@ -972,12 +972,12 @@ namespace Game.BattleFields
|
||||
continue;
|
||||
|
||||
if (closestGrave != null)
|
||||
player.TeleportTo(player.GetMapId(), closestGrave.Loc.X, closestGrave.Loc.Y, closestGrave.Loc.Z, player.GetOrientation());
|
||||
player.TeleportTo(closestGrave.Loc);
|
||||
else
|
||||
{
|
||||
closestGrave = m_Bf.GetClosestGraveYard(player);
|
||||
if (closestGrave != null)
|
||||
player.TeleportTo(player.GetMapId(), closestGrave.Loc.X, closestGrave.Loc.Y, closestGrave.Loc.Z, player.GetOrientation());
|
||||
player.TeleportTo(closestGrave.Loc);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -966,9 +966,9 @@ namespace Game.BattleGrounds
|
||||
|
||||
public void TeleportPlayerToExploitLocation(Player player)
|
||||
{
|
||||
WorldSafeLocsRecord loc = GetExploitTeleportLocation(player.GetBGTeam());
|
||||
WorldSafeLocsEntry loc = GetExploitTeleportLocation(player.GetBGTeam());
|
||||
if (loc != null)
|
||||
player.TeleportTo(loc.MapID, loc.Loc.X, loc.Loc.Y, loc.Loc.Z, loc.Facing);
|
||||
player.TeleportTo(loc.Loc);
|
||||
}
|
||||
|
||||
public virtual void AddPlayer(Player player)
|
||||
@@ -1292,7 +1292,7 @@ namespace Game.BattleGrounds
|
||||
List<ObjectGuid> ghostList = m_ReviveQueue[guideGuid];
|
||||
if (!ghostList.Empty())
|
||||
{
|
||||
WorldSafeLocsRecord closestGrave = null;
|
||||
WorldSafeLocsEntry closestGrave = null;
|
||||
foreach (var guid in ghostList)
|
||||
{
|
||||
Player player = Global.ObjAccessor.FindPlayer(guid);
|
||||
@@ -1303,7 +1303,7 @@ namespace Game.BattleGrounds
|
||||
closestGrave = GetClosestGraveYard(player);
|
||||
|
||||
if (closestGrave != null)
|
||||
player.TeleportTo(GetMapId(), closestGrave.Loc.X, closestGrave.Loc.Y, closestGrave.Loc.Z, player.GetOrientation());
|
||||
player.TeleportTo(closestGrave.Loc);
|
||||
}
|
||||
ghostList.Clear();
|
||||
}
|
||||
@@ -1735,7 +1735,7 @@ namespace Game.BattleGrounds
|
||||
m_BgRaids[GetTeamIndexByTeamId(team)] = bg_raid;
|
||||
}
|
||||
|
||||
public virtual WorldSafeLocsRecord GetClosestGraveYard(Player player)
|
||||
public virtual WorldSafeLocsEntry GetClosestGraveYard(Player player)
|
||||
{
|
||||
return Global.ObjectMgr.GetClosestGraveYard(player, player.GetTeam(), player);
|
||||
}
|
||||
@@ -1926,7 +1926,7 @@ namespace Game.BattleGrounds
|
||||
|
||||
public virtual void HandlePlayerResurrect(Player player) { }
|
||||
|
||||
public virtual WorldSafeLocsRecord GetExploitTeleportLocation(Team team) { return null; }
|
||||
public virtual WorldSafeLocsEntry GetExploitTeleportLocation(Team team) { return null; }
|
||||
|
||||
public virtual bool HandlePlayerUnderMap(Player player) { return false; }
|
||||
|
||||
|
||||
@@ -451,10 +451,10 @@ namespace Game.BattleGrounds
|
||||
if (bgTemplate.Id != BattlegroundTypeId.AA && bgTemplate.Id != BattlegroundTypeId.RB)
|
||||
{
|
||||
uint startId = result.Read<uint>(5);
|
||||
if (CliDB.WorldSafeLocsStorage.ContainsKey(startId))
|
||||
WorldSafeLocsEntry start = Global.ObjectMgr.GetWorldSafeLoc(startId);
|
||||
if (start != null)
|
||||
{
|
||||
WorldSafeLocsRecord start = CliDB.WorldSafeLocsStorage.LookupByKey(startId);
|
||||
bgTemplate.StartLocation[TeamId.Alliance] = new Position(start.Loc.X, start.Loc.Y, start.Loc.Z, (start.Facing + MathFunctions.PI) / 180);
|
||||
bgTemplate.StartLocation[TeamId.Alliance] = start.Loc;
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -462,11 +462,11 @@ namespace Game.BattleGrounds
|
||||
continue;
|
||||
}
|
||||
|
||||
startId = result.Read<uint>(6);
|
||||
if (CliDB.WorldSafeLocsStorage.ContainsKey(startId))
|
||||
startId = result.Read<uint>(6);
|
||||
start = Global.ObjectMgr.GetWorldSafeLoc(startId);
|
||||
if (start != null)
|
||||
{
|
||||
WorldSafeLocsRecord start = CliDB.WorldSafeLocsStorage.LookupByKey(startId);
|
||||
bgTemplate.StartLocation[TeamId.Horde] = new Position(start.Loc.X, start.Loc.Y, start.Loc.Z, result.Read<float>(8));
|
||||
bgTemplate.StartLocation[TeamId.Horde] = start.Loc;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
@@ -631,7 +631,7 @@ namespace Game.BattleGrounds.Zones
|
||||
base.EndBattleground(winner);
|
||||
}
|
||||
|
||||
public override WorldSafeLocsRecord GetClosestGraveYard(Player player)
|
||||
public override WorldSafeLocsEntry GetClosestGraveYard(Player player)
|
||||
{
|
||||
int teamIndex = GetTeamIndexByTeamId(player.GetTeam());
|
||||
|
||||
@@ -641,7 +641,7 @@ namespace Game.BattleGrounds.Zones
|
||||
if (m_Nodes[i] == ABNodeStatus.Occupied + teamIndex)
|
||||
nodes.Add(i);
|
||||
|
||||
WorldSafeLocsRecord good_entry = null;
|
||||
WorldSafeLocsEntry good_entry = null;
|
||||
// If so, select the closest node to place ghost on
|
||||
if (!nodes.Empty())
|
||||
{
|
||||
@@ -651,10 +651,10 @@ namespace Game.BattleGrounds.Zones
|
||||
float mindist = 999999.0f;
|
||||
for (byte i = 0; i < nodes.Count; ++i)
|
||||
{
|
||||
WorldSafeLocsRecord entry = CliDB.WorldSafeLocsStorage.LookupByKey(GraveyardIds[nodes[i]]);
|
||||
WorldSafeLocsEntry entry = Global.ObjectMgr.GetWorldSafeLoc(GraveyardIds[nodes[i]]);
|
||||
if (entry == null)
|
||||
continue;
|
||||
float dist = (entry.Loc.X - plr_x) * (entry.Loc.X - plr_x) + (entry.Loc.Y - plr_y) * (entry.Loc.Y - plr_y);
|
||||
float dist = (entry.Loc.GetPositionX() - plr_x) * (entry.Loc.GetPositionX() - plr_x) + (entry.Loc.GetPositionY() - plr_y) * (entry.Loc.GetPositionY() - plr_y);
|
||||
if (mindist > dist)
|
||||
{
|
||||
mindist = dist;
|
||||
@@ -665,14 +665,14 @@ namespace Game.BattleGrounds.Zones
|
||||
}
|
||||
// If not, place ghost on starting location
|
||||
if (good_entry == null)
|
||||
good_entry = CliDB.WorldSafeLocsStorage.LookupByKey(GraveyardIds[teamIndex + 5]);
|
||||
good_entry = Global.ObjectMgr.GetWorldSafeLoc(GraveyardIds[teamIndex + 5]);
|
||||
|
||||
return good_entry;
|
||||
}
|
||||
|
||||
public override WorldSafeLocsRecord GetExploitTeleportLocation(Team team)
|
||||
public override WorldSafeLocsEntry GetExploitTeleportLocation(Team team)
|
||||
{
|
||||
return CliDB.WorldSafeLocsStorage.LookupByKey(team == Team.Alliance ? ExploitTeleportLocationAlliance : ExploitTeleportLocationHorde);
|
||||
return Global.ObjectMgr.GetWorldSafeLoc(team == Team.Alliance ? ExploitTeleportLocationAlliance : ExploitTeleportLocationHorde);
|
||||
}
|
||||
|
||||
public override bool UpdatePlayerScore(Player player, ScoreType type, uint value, bool doAddHonor = true)
|
||||
@@ -757,8 +757,8 @@ namespace Game.BattleGrounds.Zones
|
||||
public const int WarningNearVictoryScore = 1400;
|
||||
public const int MaxTeamScore = 1600;
|
||||
|
||||
public const int ExploitTeleportLocationAlliance = 3705;
|
||||
public const int ExploitTeleportLocationHorde = 3706;
|
||||
public const uint ExploitTeleportLocationAlliance = 3705;
|
||||
public const uint ExploitTeleportLocationHorde = 3706;
|
||||
|
||||
public static Position[] NodePositions =
|
||||
{
|
||||
|
||||
@@ -510,15 +510,15 @@ namespace Game.BattleGrounds.Zones
|
||||
Log.outError(LogFilter.Battleground, "BattlegroundEY: Could not spawn Speedbuff Fel Reaver.");
|
||||
}
|
||||
|
||||
WorldSafeLocsRecord sg = CliDB.WorldSafeLocsStorage.LookupByKey(EotSGaveyardIds.MainAlliance);
|
||||
if (sg == null || !AddSpiritGuide(EotSCreaturesTypes.SpiritMainAlliance, sg.Loc.X, sg.Loc.Y, sg.Loc.Z, 3.124139f, TeamId.Alliance))
|
||||
WorldSafeLocsEntry sg = Global.ObjectMgr.GetWorldSafeLoc(EotSGaveyardIds.MainAlliance);
|
||||
if (sg == null || !AddSpiritGuide(EotSCreaturesTypes.SpiritMainAlliance, sg.Loc.GetPositionX(), sg.Loc.GetPositionY(), sg.Loc.GetPositionZ(), 3.124139f, TeamId.Alliance))
|
||||
{
|
||||
Log.outError(LogFilter.Sql, "BatteGroundEY: Failed to spawn spirit guide. The battleground was not created.");
|
||||
return false;
|
||||
}
|
||||
|
||||
sg = CliDB.WorldSafeLocsStorage.LookupByKey(EotSGaveyardIds.MainHorde);
|
||||
if (sg == null || !AddSpiritGuide(EotSCreaturesTypes.SpiritMainHorde, sg.Loc.X, sg.Loc.Y, sg.Loc.Z, 3.193953f, TeamId.Horde))
|
||||
sg = Global.ObjectMgr.GetWorldSafeLoc(EotSGaveyardIds.MainHorde);
|
||||
if (sg == null || !AddSpiritGuide(EotSCreaturesTypes.SpiritMainHorde, sg.Loc.GetPositionX(), sg.Loc.GetPositionY(), sg.Loc.GetPositionZ(), 3.193953f, TeamId.Horde))
|
||||
{
|
||||
Log.outError(LogFilter.Sql, "BatteGroundEY: Failed to spawn spirit guide. The battleground was not created.");
|
||||
return false;
|
||||
@@ -752,8 +752,8 @@ namespace Game.BattleGrounds.Zones
|
||||
if (!BgCreatures[Point].IsEmpty())
|
||||
DelCreature(Point);
|
||||
|
||||
WorldSafeLocsRecord sg = CliDB.WorldSafeLocsStorage.LookupByKey(EotSMisc.m_CapturingPointTypes[Point].GraveYardId);
|
||||
if (sg == null || !AddSpiritGuide(Point, sg.Loc.X, sg.Loc.Y, sg.Loc.Z, 3.124139f, GetTeamIndexByTeamId(Team)))
|
||||
WorldSafeLocsEntry sg = Global.ObjectMgr.GetWorldSafeLoc(EotSMisc.m_CapturingPointTypes[Point].GraveYardId);
|
||||
if (sg == null || !AddSpiritGuide(Point, sg.Loc.GetPositionX(), sg.Loc.GetPositionY(), sg.Loc.GetPositionZ(), 3.124139f, GetTeamIndexByTeamId(Team)))
|
||||
Log.outError(LogFilter.Battleground, "BatteGroundEY: Failed to spawn spirit guide. point: {0}, team: {1}, graveyard_id: {2}",
|
||||
Point, Team, EotSMisc.m_CapturingPointTypes[Point].GraveYardId);
|
||||
|
||||
@@ -869,7 +869,7 @@ namespace Game.BattleGrounds.Zones
|
||||
packet.AddState(0xC0D, 0x17B);
|
||||
}
|
||||
|
||||
public override WorldSafeLocsRecord GetClosestGraveYard(Player player)
|
||||
public override WorldSafeLocsEntry GetClosestGraveYard(Player player)
|
||||
{
|
||||
uint g_id = 0;
|
||||
|
||||
@@ -884,9 +884,9 @@ namespace Game.BattleGrounds.Zones
|
||||
default: return null;
|
||||
}
|
||||
|
||||
WorldSafeLocsRecord entry = null;
|
||||
WorldSafeLocsRecord nearestEntry = null;
|
||||
entry = CliDB.WorldSafeLocsStorage.LookupByKey(g_id);
|
||||
WorldSafeLocsEntry entry = null;
|
||||
WorldSafeLocsEntry nearestEntry = null;
|
||||
entry = Global.ObjectMgr.GetWorldSafeLoc(g_id);
|
||||
nearestEntry = entry;
|
||||
|
||||
if (entry == null)
|
||||
@@ -899,19 +899,19 @@ namespace Game.BattleGrounds.Zones
|
||||
float plr_y = player.GetPositionY();
|
||||
float plr_z = player.GetPositionZ();
|
||||
|
||||
float distance = (entry.Loc.X - plr_x) * (entry.Loc.X - plr_x) + (entry.Loc.Y - plr_y) * (entry.Loc.Y - plr_y) + (entry.Loc.Z - plr_z) * (entry.Loc.Z - plr_z);
|
||||
float distance = (entry.Loc.GetPositionX() - plr_x) * (entry.Loc.GetPositionX() - plr_x) + (entry.Loc.GetPositionY() - plr_y) * (entry.Loc.GetPositionY() - plr_y) + (entry.Loc.GetPositionZ() - plr_z) * (entry.Loc.GetPositionZ() - plr_z);
|
||||
float nearestDistance = distance;
|
||||
|
||||
for (byte i = 0; i < EotSPoints.PointsMax; ++i)
|
||||
{
|
||||
if (m_PointOwnedByTeam[i] == player.GetTeam() && m_PointState[i] == EotSPointState.UnderControl)
|
||||
{
|
||||
entry = CliDB.WorldSafeLocsStorage.LookupByKey(EotSMisc.m_CapturingPointTypes[i].GraveYardId);
|
||||
entry = Global.ObjectMgr.GetWorldSafeLoc(EotSMisc.m_CapturingPointTypes[i].GraveYardId);
|
||||
if (entry == null)
|
||||
Log.outError(LogFilter.Battleground, "BattlegroundEY: Graveyard {0} could not be found.", EotSMisc.m_CapturingPointTypes[i].GraveYardId);
|
||||
else
|
||||
{
|
||||
distance = (entry.Loc.X - plr_x) * (entry.Loc.X - plr_x) + (entry.Loc.Y - plr_y) * (entry.Loc.Y - plr_y) + (entry.Loc.Z - plr_z) * (entry.Loc.Z - plr_z);
|
||||
distance = (entry.Loc.GetPositionX() - plr_x) * (entry.Loc.GetPositionX() - plr_x) + (entry.Loc.GetPositionY() - plr_y) * (entry.Loc.GetPositionY() - plr_y) + (entry.Loc.GetPositionZ() - plr_z) * (entry.Loc.GetPositionZ() - plr_z);
|
||||
if (distance < nearestDistance)
|
||||
{
|
||||
nearestDistance = distance;
|
||||
@@ -924,9 +924,9 @@ namespace Game.BattleGrounds.Zones
|
||||
return nearestEntry;
|
||||
}
|
||||
|
||||
public override WorldSafeLocsRecord GetExploitTeleportLocation(Team team)
|
||||
public override WorldSafeLocsEntry GetExploitTeleportLocation(Team team)
|
||||
{
|
||||
return CliDB.WorldSafeLocsStorage.LookupByKey(team == Team.Alliance ? EotSMisc.ExploitTeleportLocationAlliance : EotSMisc.ExploitTeleportLocationHorde);
|
||||
return Global.ObjectMgr.GetWorldSafeLoc(team == Team.Alliance ? EotSMisc.ExploitTeleportLocationAlliance : EotSMisc.ExploitTeleportLocationHorde);
|
||||
}
|
||||
|
||||
public override bool IsAllNodesControlledByTeam(Team team)
|
||||
|
||||
@@ -180,7 +180,7 @@ namespace Game.BattleGrounds.Zones
|
||||
//Graveyards
|
||||
for (byte i = 0; i < SAGraveyards.Max; i++)
|
||||
{
|
||||
WorldSafeLocsRecord sg = CliDB.WorldSafeLocsStorage.LookupByKey(SAMiscConst.GYEntries[i]);
|
||||
WorldSafeLocsEntry sg = Global.ObjectMgr.GetWorldSafeLoc(SAMiscConst.GYEntries[i]);
|
||||
if (sg == null)
|
||||
{
|
||||
Log.outError(LogFilter.Battleground, "SOTA: Can't find GY entry %u", SAMiscConst.GYEntries[i]);
|
||||
@@ -190,12 +190,12 @@ namespace Game.BattleGrounds.Zones
|
||||
if (i == SAGraveyards.BeachGy)
|
||||
{
|
||||
GraveyardStatus[i] = Attackers;
|
||||
AddSpiritGuide(i + SACreatureTypes.Max, sg.Loc.X, sg.Loc.Y, sg.Loc.Z, SAMiscConst.GYOrientation[i], Attackers);
|
||||
AddSpiritGuide(i + SACreatureTypes.Max, sg.Loc.GetPositionX(), sg.Loc.GetPositionY(), sg.Loc.GetPositionZ(), SAMiscConst.GYOrientation[i], Attackers);
|
||||
}
|
||||
else
|
||||
{
|
||||
GraveyardStatus[i] = ((Attackers == TeamId.Horde) ? TeamId.Alliance : TeamId.Horde);
|
||||
if (!AddSpiritGuide(i + SACreatureTypes.Max, sg.Loc.X, sg.Loc.Y, sg.Loc.Z, SAMiscConst.GYOrientation[i], Attackers == TeamId.Horde ? TeamId.Alliance : TeamId.Horde))
|
||||
if (!AddSpiritGuide(i + SACreatureTypes.Max, sg.Loc.GetPositionX(), sg.Loc.GetPositionY(), sg.Loc.GetPositionZ(), SAMiscConst.GYOrientation[i], Attackers == TeamId.Horde ? TeamId.Alliance : TeamId.Horde))
|
||||
Log.outError(LogFilter.Battleground, "SOTA: couldn't spawn GY: %u", i);
|
||||
}
|
||||
}
|
||||
@@ -700,7 +700,7 @@ namespace Game.BattleGrounds.Zones
|
||||
{
|
||||
}
|
||||
|
||||
public override WorldSafeLocsRecord GetClosestGraveYard(Player player)
|
||||
public override WorldSafeLocsEntry GetClosestGraveYard(Player player)
|
||||
{
|
||||
uint safeloc = 0;
|
||||
|
||||
@@ -709,16 +709,16 @@ namespace Game.BattleGrounds.Zones
|
||||
else
|
||||
safeloc = SAMiscConst.GYEntries[SAGraveyards.DefenderLastGy];
|
||||
|
||||
WorldSafeLocsRecord closest = CliDB.WorldSafeLocsStorage.LookupByKey(safeloc);
|
||||
float nearest = player.GetExactDistSq(closest.Loc.X, closest.Loc.Y, closest.Loc.Z);
|
||||
WorldSafeLocsEntry closest = Global.ObjectMgr.GetWorldSafeLoc(safeloc);
|
||||
float nearest = player.GetExactDistSq(closest.Loc);
|
||||
|
||||
for (byte i = SAGraveyards.RightCapturableGy; i < SAGraveyards.Max; i++)
|
||||
{
|
||||
if (GraveyardStatus[i] != player.GetTeamId())
|
||||
continue;
|
||||
|
||||
WorldSafeLocsRecord ret = CliDB.WorldSafeLocsStorage.LookupByKey(SAMiscConst.GYEntries[i]);
|
||||
float dist = player.GetExactDistSq(ret.Loc.X, ret.Loc.Y, ret.Loc.Z);
|
||||
WorldSafeLocsEntry ret = Global.ObjectMgr.GetWorldSafeLoc(SAMiscConst.GYEntries[i]);
|
||||
float dist = player.GetExactDistSq(ret.Loc);
|
||||
if (dist < nearest)
|
||||
{
|
||||
closest = ret;
|
||||
@@ -812,14 +812,14 @@ namespace Game.BattleGrounds.Zones
|
||||
|
||||
DelCreature(SACreatureTypes.Max + i);
|
||||
GraveyardStatus[i] = Source.GetTeamId();
|
||||
WorldSafeLocsRecord sg = CliDB.WorldSafeLocsStorage.LookupByKey(SAMiscConst.GYEntries[i]);
|
||||
WorldSafeLocsEntry sg = Global.ObjectMgr.GetWorldSafeLoc(SAMiscConst.GYEntries[i]);
|
||||
if (sg == null)
|
||||
{
|
||||
Log.outError(LogFilter.Battleground, "CaptureGraveyard: non-existant GY entry: %u", SAMiscConst.GYEntries[i]);
|
||||
Log.outError(LogFilter.Battleground, $"CaptureGraveyard: non-existant GY entry: {SAMiscConst.GYEntries[i]}");
|
||||
return;
|
||||
}
|
||||
|
||||
AddSpiritGuide(i + SACreatureTypes.Max, sg.Loc.X, sg.Loc.Y, sg.Loc.Z, SAMiscConst.GYOrientation[i], GraveyardStatus[i]);
|
||||
AddSpiritGuide(i + SACreatureTypes.Max, sg.Loc.GetPositionX(), sg.Loc.GetPositionY(), sg.Loc.GetPositionZ(), SAMiscConst.GYOrientation[i], GraveyardStatus[i]);
|
||||
uint npc = 0;
|
||||
int flag = 0;
|
||||
|
||||
|
||||
@@ -703,15 +703,15 @@ namespace Game.BattleGrounds.Zones
|
||||
return false;
|
||||
}
|
||||
|
||||
WorldSafeLocsRecord sg = CliDB.WorldSafeLocsStorage.LookupByKey(WSGGraveyards.MainAlliance);
|
||||
if (sg == null || !AddSpiritGuide(WSGCreatureTypes.SpiritMainAlliance, sg.Loc.X, sg.Loc.Y, sg.Loc.Z, 3.124139f, TeamId.Alliance))
|
||||
WorldSafeLocsEntry sg = Global.ObjectMgr.GetWorldSafeLoc(WSGGraveyards.MainAlliance);
|
||||
if (sg == null || !AddSpiritGuide(WSGCreatureTypes.SpiritMainAlliance, sg.Loc.GetPositionX(), sg.Loc.GetPositionY(), sg.Loc.GetPositionZ(), 3.124139f, TeamId.Alliance))
|
||||
{
|
||||
Log.outError(LogFilter.Sql, "BgWarsongGluch: Failed to spawn Alliance spirit guide! Battleground not created!");
|
||||
return false;
|
||||
}
|
||||
|
||||
sg = CliDB.WorldSafeLocsStorage.LookupByKey(WSGGraveyards.MainHorde);
|
||||
if (sg == null || !AddSpiritGuide(WSGCreatureTypes.SpiritMainHorde, sg.Loc.X, sg.Loc.Y, sg.Loc.Z, 3.193953f, TeamId.Horde))
|
||||
sg = Global.ObjectMgr.GetWorldSafeLoc(WSGGraveyards.MainHorde);
|
||||
if (sg == null || !AddSpiritGuide(WSGCreatureTypes.SpiritMainHorde, sg.Loc.GetPositionX(), sg.Loc.GetPositionY(), sg.Loc.GetPositionZ(), 3.193953f, TeamId.Horde))
|
||||
{
|
||||
Log.outError(LogFilter.Sql, "BgWarsongGluch: Failed to spawn Horde spirit guide! Battleground not created!");
|
||||
return false;
|
||||
@@ -800,7 +800,7 @@ namespace Game.BattleGrounds.Zones
|
||||
return true;
|
||||
}
|
||||
|
||||
public override WorldSafeLocsRecord GetClosestGraveYard(Player player)
|
||||
public override WorldSafeLocsEntry GetClosestGraveYard(Player player)
|
||||
{
|
||||
//if status in progress, it returns main graveyards with spiritguides
|
||||
//else it will return the graveyard in the flagroom - this is especially good
|
||||
@@ -810,22 +810,22 @@ namespace Game.BattleGrounds.Zones
|
||||
if (player.GetTeam() == Team.Alliance)
|
||||
{
|
||||
if (GetStatus() == BattlegroundStatus.InProgress)
|
||||
return CliDB.WorldSafeLocsStorage.LookupByKey(WSGGraveyards.MainAlliance);
|
||||
return Global.ObjectMgr.GetWorldSafeLoc(WSGGraveyards.MainAlliance);
|
||||
else
|
||||
return CliDB.WorldSafeLocsStorage.LookupByKey(WSGGraveyards.FlagRoomAlliance);
|
||||
return Global.ObjectMgr.GetWorldSafeLoc(WSGGraveyards.FlagRoomAlliance);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (GetStatus() == BattlegroundStatus.InProgress)
|
||||
return CliDB.WorldSafeLocsStorage.LookupByKey(WSGGraveyards.MainHorde);
|
||||
return Global.ObjectMgr.GetWorldSafeLoc(WSGGraveyards.MainHorde);
|
||||
else
|
||||
return CliDB.WorldSafeLocsStorage.LookupByKey(WSGGraveyards.FlagRoomHorde);
|
||||
return Global.ObjectMgr.GetWorldSafeLoc(WSGGraveyards.FlagRoomHorde);
|
||||
}
|
||||
}
|
||||
|
||||
public override WorldSafeLocsRecord GetExploitTeleportLocation(Team team)
|
||||
public override WorldSafeLocsEntry GetExploitTeleportLocation(Team team)
|
||||
{
|
||||
return CliDB.WorldSafeLocsStorage.LookupByKey(team == Team.Alliance ? ExploitTeleportLocationAlliance : ExploitTeleportLocationHorde);
|
||||
return Global.ObjectMgr.GetWorldSafeLoc(team == Team.Alliance ? ExploitTeleportLocationAlliance : ExploitTeleportLocationHorde);
|
||||
}
|
||||
|
||||
public override void FillInitialWorldStates(InitWorldStates packet)
|
||||
|
||||
@@ -550,7 +550,7 @@ namespace Game.Chat
|
||||
static bool HandleDebugNearGraveyard(StringArguments args, CommandHandler handler)
|
||||
{
|
||||
Player player = handler.GetSession().GetPlayer();
|
||||
WorldSafeLocsRecord nearestLoc = null;
|
||||
WorldSafeLocsEntry nearestLoc = null;
|
||||
|
||||
if (args.NextString().Equals("linked"))
|
||||
{
|
||||
@@ -573,22 +573,23 @@ namespace Game.Chat
|
||||
float z = player.GetPositionZ();
|
||||
float distNearest = float.MaxValue;
|
||||
|
||||
foreach (var loc in CliDB.WorldSafeLocsStorage.Values)
|
||||
foreach (var pair in Global.ObjectMgr.GetWorldSafeLocs())
|
||||
{
|
||||
if (loc.MapID == player.GetMapId())
|
||||
var worldSafe = pair.Value;
|
||||
if (worldSafe.Loc.GetMapId() == player.GetMapId())
|
||||
{
|
||||
float dist = (loc.Loc.X - x) * (loc.Loc.X - x) + (loc.Loc.Y - y) * (loc.Loc.Y - y) + (loc.Loc.Z - z) * (loc.Loc.Z - z);
|
||||
float dist = (worldSafe.Loc.GetPositionX() - x) * (worldSafe.Loc.GetPositionX() - x) + (worldSafe.Loc.GetPositionY() - y) * (worldSafe.Loc.GetPositionY() - y) + (worldSafe.Loc.GetPositionZ() - z) * (worldSafe.Loc.GetPositionZ() - z);
|
||||
if (dist < distNearest)
|
||||
{
|
||||
distNearest = dist;
|
||||
nearestLoc = loc;
|
||||
nearestLoc = worldSafe;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (nearestLoc != null)
|
||||
handler.SendSysMessage(CypherStrings.CommandNearGraveyard, nearestLoc.Id, nearestLoc.Loc.X, nearestLoc.Loc.Y, nearestLoc.Loc.Z);
|
||||
handler.SendSysMessage(CypherStrings.CommandNearGraveyard, nearestLoc.Id, nearestLoc.Loc.GetPositionX(), nearestLoc.Loc.GetPositionY(), nearestLoc.Loc.GetPositionZ());
|
||||
else
|
||||
handler.SendSysMessage(CypherStrings.CommandNearGraveyardNotfound);
|
||||
|
||||
|
||||
@@ -113,16 +113,16 @@ namespace Game.Chat.Commands
|
||||
if (graveyardId == 0)
|
||||
return false;
|
||||
|
||||
WorldSafeLocsRecord gy = CliDB.WorldSafeLocsStorage.LookupByKey(graveyardId);
|
||||
WorldSafeLocsEntry gy = Global.ObjectMgr.GetWorldSafeLoc(graveyardId);
|
||||
if (gy == null)
|
||||
{
|
||||
handler.SendSysMessage(CypherStrings.CommandGraveyardnoexist, graveyardId);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!GridDefines.IsValidMapCoord(gy.MapID, gy.Loc.X, gy.Loc.Y, gy.Loc.Z))
|
||||
if (!GridDefines.IsValidMapCoord(gy.Loc))
|
||||
{
|
||||
handler.SendSysMessage(CypherStrings.InvalidTargetCoord, gy.Loc.X, gy.Loc.Y, gy.MapID);
|
||||
handler.SendSysMessage(CypherStrings.InvalidTargetCoord, gy.Loc.GetPositionX(), gy.Loc.GetPositionY(), gy.Loc.GetMapId());
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -136,7 +136,7 @@ namespace Game.Chat.Commands
|
||||
else
|
||||
player.SaveRecallPosition();
|
||||
|
||||
player.TeleportTo(gy.MapID, gy.Loc.X, gy.Loc.Y, gy.Loc.Z, (gy.Facing * MathFunctions.PI) / 180); // Orientation is initially in degrees
|
||||
player.TeleportTo(gy.Loc);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -1069,7 +1069,7 @@ namespace Game.Chat
|
||||
else
|
||||
return false;
|
||||
|
||||
WorldSafeLocsRecord graveyard = CliDB.WorldSafeLocsStorage.LookupByKey(graveyardId);
|
||||
WorldSafeLocsEntry graveyard = Global.ObjectMgr.GetWorldSafeLoc(graveyardId);
|
||||
if (graveyard == null)
|
||||
{
|
||||
handler.SendSysMessage(CypherStrings.CommandGraveyardnoexist, graveyardId);
|
||||
@@ -1112,7 +1112,7 @@ namespace Game.Chat
|
||||
Player player = handler.GetSession().GetPlayer();
|
||||
uint zone_id = player.GetZoneId();
|
||||
|
||||
WorldSafeLocsRecord graveyard = Global.ObjectMgr.GetClosestGraveYard(player, team, null);
|
||||
WorldSafeLocsEntry graveyard = Global.ObjectMgr.GetClosestGraveYard(player, team, null);
|
||||
if (graveyard != null)
|
||||
{
|
||||
uint graveyardId = graveyard.Id;
|
||||
|
||||
@@ -1073,7 +1073,7 @@ namespace Game
|
||||
case ConditionSourceType.SmartEvent:
|
||||
break;
|
||||
case ConditionSourceType.Graveyard:
|
||||
if (!CliDB.WorldSafeLocsStorage.ContainsKey(cond.SourceEntry))
|
||||
if (Global.ObjectMgr.GetWorldSafeLoc((uint)cond.SourceEntry) == null)
|
||||
{
|
||||
Log.outError(LogFilter.Sql, $"{cond.ToString()} SourceEntry in `condition` table, does not exist in WorldSafeLocs.db2, ignoring.");
|
||||
return false;
|
||||
|
||||
@@ -161,7 +161,6 @@ namespace Game.DataStorage
|
||||
ItemSparseStorage = DBReader.Read<ItemSparseRecord>("ItemSparse.db2", HotfixStatements.SEL_ITEM_SPARSE, HotfixStatements.SEL_ITEM_SPARSE_LOCALE);
|
||||
ItemSpecStorage = DBReader.Read<ItemSpecRecord>("ItemSpec.db2", HotfixStatements.SEL_ITEM_SPEC);
|
||||
ItemSpecOverrideStorage = DBReader.Read<ItemSpecOverrideRecord>("ItemSpecOverride.db2", HotfixStatements.SEL_ITEM_SPEC_OVERRIDE);
|
||||
ItemUpgradeStorage = DBReader.Read<ItemUpgradeRecord>("ItemUpgrade.db2", HotfixStatements.SEL_ITEM_UPGRADE);
|
||||
ItemXBonusTreeStorage = DBReader.Read<ItemXBonusTreeRecord>("ItemXBonusTree.db2", HotfixStatements.SEL_ITEM_X_BONUS_TREE);
|
||||
//KeyChainStorage = DBReader.Read<KeyChainRecord>("KeyChain.db2", HotfixStatements.SEL_KEYCHAIN);
|
||||
LFGDungeonsStorage = DBReader.Read<LFGDungeonsRecord>("LFGDungeons.db2", HotfixStatements.SEL_LFG_DUNGEONS, HotfixStatements.SEL_LFG_DUNGEONS_LOCALE);
|
||||
@@ -204,7 +203,6 @@ namespace Game.DataStorage
|
||||
RewardPackStorage = DBReader.Read<RewardPackRecord>("RewardPack.db2", HotfixStatements.SEL_REWARD_PACK);
|
||||
RewardPackXCurrencyTypeStorage = DBReader.Read<RewardPackXCurrencyTypeRecord>("RewardPackXCurrencyType.db2", HotfixStatements.SEL_REWARD_PACK_X_CURRENCY_TYPE);
|
||||
RewardPackXItemStorage = DBReader.Read<RewardPackXItemRecord>("RewardPackXItem.db2", HotfixStatements.SEL_REWARD_PACK_X_ITEM);
|
||||
RulesetItemUpgradeStorage = DBReader.Read<RulesetItemUpgradeRecord>("RulesetItemUpgrade.db2", HotfixStatements.SEL_RULESET_ITEM_UPGRADE);
|
||||
ScalingStatDistributionStorage = DBReader.Read<ScalingStatDistributionRecord>("ScalingStatDistribution.db2", HotfixStatements.SEL_SCALING_STAT_DISTRIBUTION);
|
||||
ScenarioStorage = DBReader.Read<ScenarioRecord>("Scenario.db2", HotfixStatements.SEL_SCENARIO, HotfixStatements.SEL_SCENARIO_LOCALE);
|
||||
ScenarioStepStorage = DBReader.Read<ScenarioStepRecord>("ScenarioStep.db2", HotfixStatements.SEL_SCENARIO_STEP, HotfixStatements.SEL_SCENARIO_STEP_LOCALE);
|
||||
@@ -274,7 +272,6 @@ namespace Game.DataStorage
|
||||
WMOAreaTableStorage = DBReader.Read<WMOAreaTableRecord>("WMOAreaTable.db2", HotfixStatements.SEL_WMO_AREA_TABLE, HotfixStatements.SEL_WMO_AREA_TABLE_LOCALE);
|
||||
WorldEffectStorage = DBReader.Read<WorldEffectRecord>("WorldEffect.db2", HotfixStatements.SEL_WORLD_EFFECT);
|
||||
WorldMapOverlayStorage = DBReader.Read<WorldMapOverlayRecord>("WorldMapOverlay.db2", HotfixStatements.SEL_WORLD_MAP_OVERLAY);
|
||||
WorldSafeLocsStorage = DBReader.Read<WorldSafeLocsRecord>("WorldSafeLocs.db2", HotfixStatements.SEL_WORLD_SAFE_LOCS, HotfixStatements.SEL_WORLD_SAFE_LOCS_LOCALE);
|
||||
WorldStateExpressionStorage = DBReader.Read<WorldStateExpressionRecord>("WorldStateExpression.db2", HotfixStatements.SEL_WORLD_STATE_EXPRESSION);
|
||||
|
||||
Global.DB2Mgr.LoadStores();
|
||||
@@ -507,7 +504,6 @@ namespace Game.DataStorage
|
||||
public static DB6Storage<ItemSparseRecord> ItemSparseStorage;
|
||||
public static DB6Storage<ItemSpecRecord> ItemSpecStorage;
|
||||
public static DB6Storage<ItemSpecOverrideRecord> ItemSpecOverrideStorage;
|
||||
public static DB6Storage<ItemUpgradeRecord> ItemUpgradeStorage;
|
||||
public static DB6Storage<ItemXBonusTreeRecord> ItemXBonusTreeStorage;
|
||||
//public static DB6Storage<KeyChainRecord> KeyChainStorage;
|
||||
public static DB6Storage<LFGDungeonsRecord> LFGDungeonsStorage;
|
||||
@@ -550,7 +546,6 @@ namespace Game.DataStorage
|
||||
public static DB6Storage<RewardPackRecord> RewardPackStorage;
|
||||
public static DB6Storage<RewardPackXCurrencyTypeRecord> RewardPackXCurrencyTypeStorage;
|
||||
public static DB6Storage<RewardPackXItemRecord> RewardPackXItemStorage;
|
||||
public static DB6Storage<RulesetItemUpgradeRecord> RulesetItemUpgradeStorage;
|
||||
public static DB6Storage<ScalingStatDistributionRecord> ScalingStatDistributionStorage;
|
||||
public static DB6Storage<ScenarioRecord> ScenarioStorage;
|
||||
public static DB6Storage<ScenarioStepRecord> ScenarioStepStorage;
|
||||
@@ -620,7 +615,6 @@ namespace Game.DataStorage
|
||||
public static DB6Storage<WMOAreaTableRecord> WMOAreaTableStorage;
|
||||
public static DB6Storage<WorldEffectRecord> WorldEffectStorage;
|
||||
public static DB6Storage<WorldMapOverlayRecord> WorldMapOverlayStorage;
|
||||
public static DB6Storage<WorldSafeLocsRecord> WorldSafeLocsStorage;
|
||||
public static DB6Storage<WorldStateExpressionRecord> WorldStateExpressionStorage;
|
||||
#endregion
|
||||
|
||||
|
||||
@@ -127,11 +127,13 @@ namespace Game.DataStorage
|
||||
}
|
||||
|
||||
long previousStringTableSize = 0;
|
||||
long previousRecordCount = 0;
|
||||
for (int sectionIndex = 0; sectionIndex < Header.SectionsCount; sectionIndex++)
|
||||
{
|
||||
if (sections[sectionIndex].TactKeyLookup != 0)// && !hasTactKeyFunc(sections[sectionIndex].TactKeyLookup))
|
||||
{
|
||||
previousStringTableSize += sections[sectionIndex].StringTableSize;
|
||||
previousRecordCount += sections[sectionIndex].NumRecords;
|
||||
//Console.WriteLine("Detected db2 with encrypted section! HasKey {0}", CASC.HasKey(Sections[sectionIndex].TactKeyLookup));
|
||||
continue;
|
||||
}
|
||||
@@ -150,17 +152,11 @@ namespace Game.DataStorage
|
||||
// string data
|
||||
stringsTable = new Dictionary<long, string>();
|
||||
|
||||
long stringDataOffset = 0;
|
||||
if (sectionIndex == 0)
|
||||
stringDataOffset = (Header.RecordCount - sections[sectionIndex].NumRecords) * Header.RecordSize;
|
||||
else
|
||||
stringDataOffset = previousStringTableSize;
|
||||
|
||||
for (int i = 0; i < sections[sectionIndex].StringTableSize;)
|
||||
{
|
||||
long oldPos = reader.BaseStream.Position;
|
||||
|
||||
stringsTable[oldPos + stringDataOffset] = reader.ReadCString();
|
||||
stringsTable[i + previousStringTableSize] = reader.ReadCString();
|
||||
|
||||
i += (int)(reader.BaseStream.Position - oldPos);
|
||||
}
|
||||
@@ -238,7 +234,10 @@ namespace Game.DataStorage
|
||||
|
||||
bool hasRef = refData.Entries.TryGetValue(i, out int refId);
|
||||
|
||||
var rec = new WDC3Row(this, bitReader, sections[sectionIndex].FileOffset, Header.HasIndexTable() ? (isIndexEmpty ? i : indexData[i]) : -1, hasRef ? refId : -1, stringsTable);
|
||||
long recordIndex = i + previousRecordCount;
|
||||
long recordOffset = (recordIndex * Header.RecordSize) - (Header.RecordCount * Header.RecordSize);
|
||||
|
||||
var rec = new WDC3Row(this, bitReader, (int)recordOffset, Header.HasIndexTable() ? (isIndexEmpty ? i : indexData[i]) : -1, hasRef ? refId : -1, stringsTable);
|
||||
_records.Add(rec.Id, rec);
|
||||
}
|
||||
|
||||
@@ -250,6 +249,7 @@ namespace Game.DataStorage
|
||||
}
|
||||
|
||||
previousStringTableSize += sections[sectionIndex].StringTableSize;
|
||||
previousRecordCount += sections[sectionIndex].NumRecords;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -455,7 +455,7 @@ namespace Game.DataStorage
|
||||
}
|
||||
else
|
||||
{
|
||||
var pos = _recordsOffset + _data.Offset + (_data.Position >> 3);
|
||||
var pos = _recordsOffset + (_data.Position >> 3);
|
||||
|
||||
int[] strIdx = GetFieldValueArray<int>(fieldIndex, atr.Length);
|
||||
|
||||
@@ -522,7 +522,7 @@ namespace Game.DataStorage
|
||||
}
|
||||
else
|
||||
{
|
||||
var pos = _recordsOffset + _data.Offset + (_data.Position >> 3);
|
||||
var pos = _recordsOffset + (_data.Position >> 3);
|
||||
int ofs = GetFieldValue<int>(fieldIndex);
|
||||
f.SetValue(obj, _stringsTable.LookupByKey(pos + ofs));
|
||||
}
|
||||
|
||||
@@ -397,11 +397,6 @@ namespace Game.DataStorage
|
||||
|
||||
CliDB.RewardPackXItemStorage.Clear();
|
||||
|
||||
foreach (RulesetItemUpgradeRecord rulesetItemUpgrade in CliDB.RulesetItemUpgradeStorage.Values)
|
||||
_rulesetItemUpgrade[rulesetItemUpgrade.ItemID] = rulesetItemUpgrade.ItemUpgradeID;
|
||||
|
||||
CliDB.RulesetItemUpgradeStorage.Clear();
|
||||
|
||||
foreach (SkillLineRecord skill in CliDB.SkillLineStorage.Values)
|
||||
{
|
||||
if (skill.ParentSkillLineID != 0)
|
||||
@@ -1518,11 +1513,6 @@ namespace Game.DataStorage
|
||||
return _rewardPackItems.LookupByKey(rewardPackID);
|
||||
}
|
||||
|
||||
public uint GetRulesetItemUpgrade(uint itemId)
|
||||
{
|
||||
return _rulesetItemUpgrade.LookupByKey(itemId);
|
||||
}
|
||||
|
||||
public List<SkillLineRecord> GetSkillLinesForParentSkill(uint parentSkillId)
|
||||
{
|
||||
return _skillLinesByParentSkillLine.LookupByKey(parentSkillId);
|
||||
@@ -1982,7 +1972,6 @@ namespace Game.DataStorage
|
||||
Dictionary<uint, Tuple<List<QuestPackageItemRecord>, List<QuestPackageItemRecord>>> _questPackages = new Dictionary<uint, Tuple<List<QuestPackageItemRecord>, List<QuestPackageItemRecord>>>();
|
||||
MultiMap<uint, RewardPackXCurrencyTypeRecord> _rewardPackCurrencyTypes = new MultiMap<uint, RewardPackXCurrencyTypeRecord>();
|
||||
MultiMap<uint, RewardPackXItemRecord> _rewardPackItems = new MultiMap<uint, RewardPackXItemRecord>();
|
||||
Dictionary<uint, uint> _rulesetItemUpgrade = new Dictionary<uint, uint>();
|
||||
MultiMap<uint, SkillLineRecord> _skillLinesByParentSkillLine = new MultiMap<uint, SkillLineRecord>();
|
||||
MultiMap<uint, SkillLineAbilityRecord> _skillLineAbilitiesBySkillupSkill = new MultiMap<uint, SkillLineAbilityRecord>();
|
||||
MultiMap<uint, SkillRaceClassInfoRecord> _skillRaceClassInfoBySkill = new MultiMap<uint, SkillRaceClassInfoRecord>();
|
||||
|
||||
@@ -63,6 +63,7 @@ namespace Game.DataStorage
|
||||
{
|
||||
public uint Id;
|
||||
public byte DisplayType;
|
||||
public int SubclassID;
|
||||
public uint ItemDisplayInfoID;
|
||||
public int DefaultIconFileDataID;
|
||||
public int UiOrder;
|
||||
@@ -346,7 +347,7 @@ namespace Game.DataStorage
|
||||
public ushort SocketMatchEnchantmentId;
|
||||
public ushort TotemCategoryID;
|
||||
public ushort InstanceBound;
|
||||
public ushort ZoneBound;
|
||||
public ushort[] ZoneBound = new ushort[2];
|
||||
public ushort ItemSet;
|
||||
public ushort LockID;
|
||||
public ushort StartQuestID;
|
||||
@@ -397,16 +398,6 @@ namespace Game.DataStorage
|
||||
public uint ItemID;
|
||||
}
|
||||
|
||||
public sealed class ItemUpgradeRecord
|
||||
{
|
||||
public uint Id;
|
||||
public byte ItemUpgradePathID;
|
||||
public byte ItemLevelIncrement;
|
||||
public ushort PrerequisiteID;
|
||||
public ushort CurrencyType;
|
||||
public uint CurrencyAmount;
|
||||
}
|
||||
|
||||
public sealed class ItemXBonusTreeRecord
|
||||
{
|
||||
public uint Id;
|
||||
|
||||
@@ -129,9 +129,9 @@ namespace Game.DataStorage
|
||||
|
||||
public sealed class PowerTypeRecord
|
||||
{
|
||||
public uint Id;
|
||||
public string NameGlobalStringTag;
|
||||
public string CostGlobalStringTag;
|
||||
public uint Id;
|
||||
public PowerType PowerTypeEnum;
|
||||
public sbyte MinPower;
|
||||
public short MaxBasePower;
|
||||
|
||||
@@ -53,11 +53,4 @@ namespace Game.DataStorage
|
||||
public uint ItemQuantity;
|
||||
public uint RewardPackID;
|
||||
}
|
||||
|
||||
public sealed class RulesetItemUpgradeRecord
|
||||
{
|
||||
public uint Id;
|
||||
public uint ItemID;
|
||||
public ushort ItemUpgradeID;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -269,12 +269,12 @@ namespace Game.DataStorage
|
||||
public sealed class SpellEffectRecord
|
||||
{
|
||||
public uint Id;
|
||||
public short EffectAura;
|
||||
public uint DifficultyID;
|
||||
public uint EffectIndex;
|
||||
public uint Effect;
|
||||
public float EffectAmplitude;
|
||||
public int EffectAttributes;
|
||||
public short EffectAura;
|
||||
public uint EffectAuraPeriod;
|
||||
public float EffectBonusCoefficient;
|
||||
public float EffectChainAmplitude;
|
||||
@@ -382,6 +382,7 @@ namespace Game.DataStorage
|
||||
public sealed class SpellMiscRecord
|
||||
{
|
||||
public uint Id;
|
||||
public int[] Attributes = new int[14];
|
||||
public byte DifficultyID;
|
||||
public ushort CastingTimeIndex;
|
||||
public ushort DurationIndex;
|
||||
@@ -393,7 +394,6 @@ namespace Game.DataStorage
|
||||
public uint SpellIconFileDataID;
|
||||
public uint ActiveIconFileDataID;
|
||||
public uint ContentTuningID;
|
||||
public int[] Attributes = new int[14];
|
||||
public uint SpellID;
|
||||
}
|
||||
|
||||
|
||||
@@ -117,6 +117,7 @@ namespace Game.DataStorage
|
||||
public byte ExpansionID;
|
||||
public int PatchID;
|
||||
public short UiOrder;
|
||||
public uint PlayerConditionID;
|
||||
}
|
||||
|
||||
public sealed class TransmogSetGroupRecord
|
||||
|
||||
@@ -79,7 +79,7 @@ namespace Game.DataStorage
|
||||
public string ToolTip;
|
||||
public uint MinPower;
|
||||
public uint MaxPower;
|
||||
public ushort StartPower;
|
||||
public uint StartPower;
|
||||
public byte CenterPower;
|
||||
public float RegenerationPeace;
|
||||
public float RegenerationCombat;
|
||||
|
||||
@@ -67,15 +67,6 @@ namespace Game.DataStorage
|
||||
public uint[] AreaID = new uint[SharedConst.MaxWorldMapOverlayArea];
|
||||
}
|
||||
|
||||
public sealed class WorldSafeLocsRecord
|
||||
{
|
||||
public uint Id;
|
||||
public string AreaName;
|
||||
public Vector3 Loc;
|
||||
public ushort MapID;
|
||||
public float Facing;
|
||||
}
|
||||
|
||||
public sealed class WorldStateExpressionRecord
|
||||
{
|
||||
public uint Id;
|
||||
|
||||
@@ -166,7 +166,6 @@ namespace Game.Entities
|
||||
stmt.AddValue(++index, (uint)m_itemData.Durability);
|
||||
stmt.AddValue(++index, (uint)m_itemData.CreatePlayedTime);
|
||||
stmt.AddValue(++index, m_text);
|
||||
stmt.AddValue(++index, GetModifier(ItemModifier.UpgradeId));
|
||||
stmt.AddValue(++index, GetModifier(ItemModifier.BattlePetSpeciesId));
|
||||
stmt.AddValue(++index, GetModifier(ItemModifier.BattlePetBreedData));
|
||||
stmt.AddValue(++index, GetModifier(ItemModifier.BattlePetLevel));
|
||||
@@ -303,7 +302,7 @@ namespace Game.Entities
|
||||
|
||||
ItemModifier[] modifiersTable =
|
||||
{
|
||||
ItemModifier.ScalingStatDistributionFixedLevel,
|
||||
ItemModifier.TimewalkerLevel,
|
||||
ItemModifier.ArtifactKnowledgeLevel
|
||||
};
|
||||
|
||||
@@ -315,7 +314,7 @@ namespace Game.Entities
|
||||
{
|
||||
stmt = DB.Characters.GetPreparedStatement(CharStatements.INS_ITEM_INSTANCE_MODIFIERS);
|
||||
stmt.AddValue(0, GetGUID().GetCounter());
|
||||
stmt.AddValue(1, GetModifier(ItemModifier.ScalingStatDistributionFixedLevel));
|
||||
stmt.AddValue(1, GetModifier(ItemModifier.TimewalkerLevel));
|
||||
stmt.AddValue(2, GetModifier(ItemModifier.ArtifactKnowledgeLevel));
|
||||
trans.Append(stmt);
|
||||
}
|
||||
@@ -438,30 +437,14 @@ namespace Game.Entities
|
||||
SetCreatePlayedTime(fields.Read<uint>(11));
|
||||
SetText(fields.Read<string>(12));
|
||||
|
||||
uint upgradeId = fields.Read<uint>(13);
|
||||
ItemUpgradeRecord rulesetUpgrade = CliDB.ItemUpgradeStorage.LookupByKey(Global.DB2Mgr.GetRulesetItemUpgrade(entry));
|
||||
ItemUpgradeRecord upgrade = CliDB.ItemUpgradeStorage.LookupByKey(upgradeId);
|
||||
if (rulesetUpgrade == null || upgrade == null || rulesetUpgrade.ItemUpgradePathID != upgrade.ItemUpgradePathID)
|
||||
{
|
||||
upgradeId = 0;
|
||||
need_save = true;
|
||||
}
|
||||
SetModifier(ItemModifier.BattlePetSpeciesId, fields.Read<uint>(13));
|
||||
SetModifier(ItemModifier.BattlePetBreedData, fields.Read<uint>(14));
|
||||
SetModifier(ItemModifier.BattlePetLevel, fields.Read<ushort>(14));
|
||||
SetModifier(ItemModifier.BattlePetDisplayId, fields.Read<uint>(16));
|
||||
|
||||
if (rulesetUpgrade != null && upgradeId == 0)
|
||||
{
|
||||
upgradeId = rulesetUpgrade.Id;
|
||||
need_save = true;
|
||||
}
|
||||
SetContext(fields.Read<byte>(17));
|
||||
|
||||
SetModifier(ItemModifier.UpgradeId, upgradeId);
|
||||
SetModifier(ItemModifier.BattlePetSpeciesId, fields.Read<uint>(14));
|
||||
SetModifier(ItemModifier.BattlePetBreedData, fields.Read<uint>(15));
|
||||
SetModifier(ItemModifier.BattlePetLevel, fields.Read<ushort>(16));
|
||||
SetModifier(ItemModifier.BattlePetDisplayId, fields.Read<uint>(17));
|
||||
|
||||
SetContext(fields.Read<byte>(18));
|
||||
|
||||
var bonusListString = new StringArray(fields.Read<string>(19), ' ');
|
||||
var bonusListString = new StringArray(fields.Read<string>(18), ' ');
|
||||
List<uint> bonusListIDs = new List<uint>();
|
||||
for (var i = 0; i < bonusListString.Length; ++i)
|
||||
{
|
||||
@@ -470,25 +453,25 @@ namespace Game.Entities
|
||||
}
|
||||
SetBonuses(bonusListIDs);
|
||||
|
||||
SetModifier(ItemModifier.TransmogAppearanceAllSpecs, fields.Read<uint>(20));
|
||||
SetModifier(ItemModifier.TransmogAppearanceSpec1, fields.Read<uint>(21));
|
||||
SetModifier(ItemModifier.TransmogAppearanceSpec2, fields.Read<uint>(22));
|
||||
SetModifier(ItemModifier.TransmogAppearanceSpec3, fields.Read<uint>(23));
|
||||
SetModifier(ItemModifier.TransmogAppearanceSpec4, fields.Read<uint>(24));
|
||||
SetModifier(ItemModifier.TransmogAppearanceAllSpecs, fields.Read<uint>(19));
|
||||
SetModifier(ItemModifier.TransmogAppearanceSpec1, fields.Read<uint>(20));
|
||||
SetModifier(ItemModifier.TransmogAppearanceSpec2, fields.Read<uint>(21));
|
||||
SetModifier(ItemModifier.TransmogAppearanceSpec3, fields.Read<uint>(22));
|
||||
SetModifier(ItemModifier.TransmogAppearanceSpec4, fields.Read<uint>(23));
|
||||
|
||||
SetModifier(ItemModifier.EnchantIllusionAllSpecs, fields.Read<uint>(25));
|
||||
SetModifier(ItemModifier.EnchantIllusionSpec1, fields.Read<uint>(26));
|
||||
SetModifier(ItemModifier.EnchantIllusionSpec2, fields.Read<uint>(27));
|
||||
SetModifier(ItemModifier.EnchantIllusionSpec3, fields.Read<uint>(28));
|
||||
SetModifier(ItemModifier.EnchantIllusionSpec4, fields.Read<uint>(29));
|
||||
SetModifier(ItemModifier.EnchantIllusionAllSpecs, fields.Read<uint>(24));
|
||||
SetModifier(ItemModifier.EnchantIllusionSpec1, fields.Read<uint>(25));
|
||||
SetModifier(ItemModifier.EnchantIllusionSpec2, fields.Read<uint>(26));
|
||||
SetModifier(ItemModifier.EnchantIllusionSpec3, fields.Read<uint>(27));
|
||||
SetModifier(ItemModifier.EnchantIllusionSpec4, fields.Read<uint>(28));
|
||||
|
||||
int gemFields = 4;
|
||||
ItemDynamicFieldGems[] gemData = new ItemDynamicFieldGems[ItemConst.MaxGemSockets];
|
||||
for (int i = 0; i < ItemConst.MaxGemSockets; ++i)
|
||||
{
|
||||
gemData[i] = new ItemDynamicFieldGems();
|
||||
gemData[i].ItemId = fields.Read<uint>(30 + i * gemFields);
|
||||
var gemBonusListIDs = new StringArray(fields.Read<string>(31 + i * gemFields), ' ');
|
||||
gemData[i].ItemId = fields.Read<uint>(29 + i * gemFields);
|
||||
var gemBonusListIDs = new StringArray(fields.Read<string>(30 + i * gemFields), ' ');
|
||||
if (!gemBonusListIDs.IsEmpty())
|
||||
{
|
||||
uint b = 0;
|
||||
@@ -499,13 +482,13 @@ namespace Game.Entities
|
||||
}
|
||||
}
|
||||
|
||||
gemData[i].Context = fields.Read<byte>(32 + i * gemFields);
|
||||
gemData[i].Context = fields.Read<byte>(31 + i * gemFields);
|
||||
if (gemData[i].ItemId != 0)
|
||||
SetGem((ushort)i, gemData[i], fields.Read<uint>(33 + i * gemFields));
|
||||
SetGem((ushort)i, gemData[i], fields.Read<uint>(32 + i * gemFields));
|
||||
}
|
||||
|
||||
SetModifier(ItemModifier.ScalingStatDistributionFixedLevel, fields.Read<uint>(42));
|
||||
SetModifier(ItemModifier.ArtifactKnowledgeLevel, fields.Read<uint>(43));
|
||||
SetModifier(ItemModifier.TimewalkerLevel, fields.Read<uint>(41));
|
||||
SetModifier(ItemModifier.ArtifactKnowledgeLevel, fields.Read<uint>(42));
|
||||
|
||||
// Enchants must be loaded after all other bonus/scaling data
|
||||
var enchantmentTokens = new StringArray(fields.Read<string>(8), ' ');
|
||||
@@ -536,7 +519,6 @@ namespace Game.Entities
|
||||
stmt.AddValue(index++, (uint)m_itemData.Expiration);
|
||||
stmt.AddValue(index++, (uint)m_itemData.DynamicFlags);
|
||||
stmt.AddValue(index++, (uint)m_itemData.Durability);
|
||||
stmt.AddValue(index++, GetModifier(ItemModifier.UpgradeId));
|
||||
stmt.AddValue(index++, guid);
|
||||
DB.Characters.Execute(stmt);
|
||||
}
|
||||
@@ -1104,7 +1086,8 @@ namespace Game.Entities
|
||||
public bool IsLimitedToAnotherMapOrZone(uint cur_mapId, uint cur_zoneId)
|
||||
{
|
||||
ItemTemplate proto = GetTemplate();
|
||||
return proto != null && ((proto.GetMap() != 0 && proto.GetMap() != cur_mapId) || (proto.GetArea() != 0 && proto.GetArea() != cur_zoneId));
|
||||
return proto != null && ((proto.GetMap() != 0 && proto.GetMap() != cur_mapId) ||
|
||||
((proto.GetArea(0) != 0 && proto.GetArea(0) != cur_zoneId) && (proto.GetArea(1) != 0 && proto.GetArea(1) != cur_zoneId)));
|
||||
}
|
||||
|
||||
public void SendUpdateSockets()
|
||||
@@ -1892,12 +1875,11 @@ namespace Game.Entities
|
||||
uint minItemLevelCutoff = owner.m_unitData.MinItemLevelCutoff;
|
||||
uint maxItemLevel = GetTemplate().GetFlags3().HasAnyFlag(ItemFlags3.IgnoreItemLevelCapInPvp) ? 0u : owner.m_unitData.MaxItemLevel;
|
||||
bool pvpBonus = owner.IsUsingPvpItemLevels();
|
||||
return GetItemLevel(GetTemplate(), _bonusData, owner.GetLevel(), GetModifier(ItemModifier.ScalingStatDistributionFixedLevel), GetModifier(ItemModifier.UpgradeId),
|
||||
return GetItemLevel(GetTemplate(), _bonusData, owner.GetLevel(), GetModifier(ItemModifier.TimewalkerLevel),
|
||||
minItemLevel, minItemLevelCutoff, maxItemLevel, pvpBonus);
|
||||
}
|
||||
|
||||
public static uint GetItemLevel(ItemTemplate itemTemplate, BonusData bonusData, uint level, uint fixedLevel, uint upgradeId,
|
||||
uint minItemLevel, uint minItemLevelCutoff, uint maxItemLevel, bool pvpBonus)
|
||||
public static uint GetItemLevel(ItemTemplate itemTemplate, BonusData bonusData, uint level, uint fixedLevel, uint minItemLevel, uint minItemLevelCutoff, uint maxItemLevel, bool pvpBonus)
|
||||
{
|
||||
if (itemTemplate == null)
|
||||
return 1;
|
||||
@@ -1927,9 +1909,6 @@ namespace Game.Entities
|
||||
itemLevel += bonusData.GemItemLevelBonus[i];
|
||||
|
||||
uint itemLevelBeforeUpgrades = itemLevel;
|
||||
ItemUpgradeRecord upgrade = CliDB.ItemUpgradeStorage.LookupByKey(upgradeId);
|
||||
if (upgrade != null)
|
||||
itemLevel += upgrade.ItemLevelIncrement;
|
||||
|
||||
if (pvpBonus)
|
||||
itemLevel += Global.DB2Mgr.GetPvpItemLevelBonus(itemTemplate.GetId());
|
||||
@@ -1974,7 +1953,7 @@ namespace Game.Entities
|
||||
if (itemTemplate.GetFlags().HasAnyFlag(ItemFlags.Conjured | ItemFlags.NoDisenchant) || itemTemplate.GetBonding() == ItemBondingType.Quest)
|
||||
return null;
|
||||
|
||||
if (itemTemplate.GetArea() != 0 || itemTemplate.GetMap() != 0 || itemTemplate.GetMaxStackSize() > 1)
|
||||
if (itemTemplate.GetArea(0) != 0 || itemTemplate.GetArea(1) != 0 || itemTemplate.GetMap() != 0 || itemTemplate.GetMaxStackSize() > 1)
|
||||
return null;
|
||||
|
||||
if (GetSellPrice(itemTemplate, quality, itemLevel) == 0 && !Global.DB2Mgr.HasItemCurrencyCost(itemTemplate.GetId()))
|
||||
@@ -2380,7 +2359,7 @@ namespace Game.Entities
|
||||
|
||||
public void SetFixedLevel(uint level)
|
||||
{
|
||||
if (!_bonusData.HasFixedLevel || GetModifier(ItemModifier.ScalingStatDistributionFixedLevel) != 0)
|
||||
if (!_bonusData.HasFixedLevel || GetModifier(ItemModifier.TimewalkerLevel) != 0)
|
||||
return;
|
||||
|
||||
ScalingStatDistributionRecord ssd = CliDB.ScalingStatDistributionStorage.LookupByKey(_bonusData.ScalingStatDistribution);
|
||||
@@ -2393,7 +2372,7 @@ namespace Game.Entities
|
||||
if ((contentTuning.Flags.HasAnyFlag(2) || contentTuning.MinLevel != 0 || contentTuning.MaxLevel != 0) && !contentTuning.Flags.HasAnyFlag(4))
|
||||
level = (uint)Math.Min(Math.Max(level, contentTuning.MinLevel), contentTuning.MaxLevel);
|
||||
|
||||
SetModifier(ItemModifier.ScalingStatDistributionFixedLevel, level);
|
||||
SetModifier(ItemModifier.TimewalkerLevel, level);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2402,7 +2381,7 @@ namespace Game.Entities
|
||||
if (_bonusData.RequiredLevelOverride != 0)
|
||||
return _bonusData.RequiredLevelOverride;
|
||||
else if (_bonusData.HasFixedLevel)
|
||||
return (int)GetModifier(ItemModifier.ScalingStatDistributionFixedLevel);
|
||||
return (int)GetModifier(ItemModifier.TimewalkerLevel);
|
||||
else
|
||||
return _bonusData.RequiredLevel;
|
||||
}
|
||||
|
||||
@@ -30,9 +30,9 @@ namespace Game.Entities
|
||||
BasicData = item;
|
||||
ExtendedData = sparse;
|
||||
|
||||
Specializations[0] = new BitArray((int)Class.Max * PlayerConst.MaxSpecializations);
|
||||
Specializations[1] = new BitArray((int)Class.Max * PlayerConst.MaxSpecializations);
|
||||
Specializations[2] = new BitArray((int)Class.Max * PlayerConst.MaxSpecializations);
|
||||
Specializations[0] = new BitSet((int)Class.Max * PlayerConst.MaxSpecializations);
|
||||
Specializations[1] = new BitSet((int)Class.Max * PlayerConst.MaxSpecializations);
|
||||
Specializations[2] = new BitSet((int)Class.Max * PlayerConst.MaxSpecializations);
|
||||
}
|
||||
|
||||
public string GetName(LocaleConstant locale = SharedConst.DefaultLocale)
|
||||
@@ -296,7 +296,7 @@ namespace Game.Entities
|
||||
public uint GetStartQuest() { return ExtendedData.StartQuestID; }
|
||||
public uint GetLockID() { return ExtendedData.LockID; }
|
||||
public uint GetItemSet() { return ExtendedData.ItemSet; }
|
||||
public uint GetArea() { return ExtendedData.ZoneBound; }
|
||||
public uint GetArea(int index) { return ExtendedData.ZoneBound[index]; }
|
||||
public uint GetMap() { return ExtendedData.InstanceBound; }
|
||||
public BagFamilyMask GetBagFamily() { return (BagFamilyMask)ExtendedData.BagFamily; }
|
||||
public uint GetTotemCategory() { return ExtendedData.TotemCategoryID; }
|
||||
@@ -344,7 +344,7 @@ namespace Game.Entities
|
||||
public ItemFlagsCustom FlagsCu;
|
||||
public float SpellPPMRate;
|
||||
public uint RandomBonusListTemplateId;
|
||||
public BitArray[] Specializations = new BitArray[3];
|
||||
public BitSet[] Specializations = new BitSet[3];
|
||||
public uint ItemSpecClassMask;
|
||||
|
||||
protected ItemRecord BasicData;
|
||||
|
||||
@@ -2326,9 +2326,9 @@ namespace Game.Entities
|
||||
}
|
||||
if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag.PartyMember))
|
||||
{
|
||||
data.WriteBit(HasQuestSession);
|
||||
data.WriteBit((bool)HasQuestSession);
|
||||
}
|
||||
data.WriteBit(HasLevelLink);
|
||||
data.WriteBit((bool)HasLevelLink);
|
||||
data.FlushBits();
|
||||
}
|
||||
public override void WriteUpdate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, Player owner, Player receiver)
|
||||
|
||||
@@ -92,9 +92,9 @@ namespace Game.Entities
|
||||
if (item.GetTemplate().GetArtifactID() != 0 && artifactDataPair != null)
|
||||
item.LoadArtifactData(this, artifactDataPair.Item1, artifactDataPair.Item2, artifactDataPair.Item3, artifactDataPair.Item4);
|
||||
|
||||
ulong counter = result.Read<ulong>(44);
|
||||
ulong counter = result.Read<ulong>(43);
|
||||
ObjectGuid bagGuid = counter != 0 ? ObjectGuid.Create(HighGuid.Item, counter) : ObjectGuid.Empty;
|
||||
byte slot = result.Read<byte>(45);
|
||||
byte slot = result.Read<byte>(44);
|
||||
|
||||
GetSession().GetCollectionMgr().CheckHeirloomUpgrades(item);
|
||||
GetSession().GetCollectionMgr().AddItemAppearance(item);
|
||||
@@ -1100,18 +1100,17 @@ namespace Game.Entities
|
||||
|
||||
do
|
||||
{
|
||||
// SELECT itemId, itemEntry, slot, creatorGuid, randomBonusListId, upgradeId, fixedScalingLevel, artifactKnowledgeLevel, context, bonusListIDs FROM character_void_storage WHERE playerGuid = ?
|
||||
// SELECT itemId, itemEntry, slot, creatorGuid, randomBonusListId, fixedScalingLevel, artifactKnowledgeLevel, context, bonusListIDs FROM character_void_storage WHERE playerGuid = ?
|
||||
ulong itemId = result.Read<ulong>(0);
|
||||
uint itemEntry = result.Read<uint>(1);
|
||||
byte slot = result.Read<byte>(2);
|
||||
ObjectGuid creatorGuid = result.Read<ulong>(3) != 0 ? ObjectGuid.Create(HighGuid.Player, result.Read<ulong>(3)) : ObjectGuid.Empty;
|
||||
uint randomBonusListId = result.Read<uint>(4);
|
||||
uint upgradeId = result.Read<uint>(5);
|
||||
uint fixedScalingLevel = result.Read<uint>(6);
|
||||
uint artifactKnowledgeLevel = result.Read<uint>(7);
|
||||
byte context = result.Read<byte>(8);
|
||||
uint fixedScalingLevel = result.Read<uint>(5);
|
||||
uint artifactKnowledgeLevel = result.Read<uint>(6);
|
||||
byte context = result.Read<byte>(7);
|
||||
List<uint> bonusListIDs = new List<uint>();
|
||||
var bonusListIdTokens = new StringArray(result.Read<string>(9), ' ');
|
||||
var bonusListIdTokens = new StringArray(result.Read<string>(8), ' ');
|
||||
for (var i = 0; i < bonusListIdTokens.Length; ++i)
|
||||
{
|
||||
if (uint.TryParse(bonusListIdTokens[i], out uint id))
|
||||
@@ -1136,10 +1135,9 @@ namespace Game.Entities
|
||||
continue;
|
||||
}
|
||||
|
||||
_voidStorageItems[slot] = new VoidStorageItem(itemId, itemEntry, creatorGuid, randomBonusListId, upgradeId, fixedScalingLevel, artifactKnowledgeLevel, context, bonusListIDs);
|
||||
_voidStorageItems[slot] = new VoidStorageItem(itemId, itemEntry, creatorGuid, randomBonusListId, fixedScalingLevel, artifactKnowledgeLevel, context, bonusListIDs);
|
||||
|
||||
BonusData bonus = new BonusData(new ItemInstance(_voidStorageItems[slot]));
|
||||
|
||||
GetSession().GetCollectionMgr().AddItemAppearance(itemEntry, bonus.AppearanceModID);
|
||||
}
|
||||
while (result.NextRow());
|
||||
@@ -1230,7 +1228,7 @@ namespace Game.Entities
|
||||
}
|
||||
|
||||
Item item = Bag.NewItemOrBag(proto);
|
||||
ObjectGuid ownerGuid = result.Read<ulong>(44) != 0 ? ObjectGuid.Create(HighGuid.Player, result.Read<ulong>(44)) : ObjectGuid.Empty;
|
||||
ObjectGuid ownerGuid = result.Read<ulong>(43) != 0 ? ObjectGuid.Create(HighGuid.Player, result.Read<ulong>(43)) : ObjectGuid.Empty;
|
||||
if (!item.LoadFromDB(itemGuid, ownerGuid, result.GetFields(), itemEntry))
|
||||
{
|
||||
Log.outError(LogFilter.Player, "Player:_LoadMailedItems - Item in mail ({0}) doesn't exist !!!! - item guid: {1}, deleted from mail", mail.messageID, itemGuid);
|
||||
@@ -2249,15 +2247,14 @@ namespace Game.Entities
|
||||
stmt.AddValue(3, i);
|
||||
stmt.AddValue(4, _voidStorageItems[i].CreatorGuid.GetCounter());
|
||||
stmt.AddValue(5, (byte)_voidStorageItems[i].RandomBonusListId);
|
||||
stmt.AddValue(6, _voidStorageItems[i].ItemUpgradeId);
|
||||
stmt.AddValue(7, _voidStorageItems[i].FixedScalingLevel);
|
||||
stmt.AddValue(8, _voidStorageItems[i].ArtifactKnowledgeLevel);
|
||||
stmt.AddValue(9, _voidStorageItems[i].Context);
|
||||
stmt.AddValue(6, _voidStorageItems[i].FixedScalingLevel);
|
||||
stmt.AddValue(7, _voidStorageItems[i].ArtifactKnowledgeLevel);
|
||||
stmt.AddValue(8, _voidStorageItems[i].Context);
|
||||
|
||||
StringBuilder bonusListIDs = new StringBuilder();
|
||||
foreach (uint bonusListID in _voidStorageItems[i].BonusListIDs)
|
||||
bonusListIDs.AppendFormat("{0} ", bonusListID);
|
||||
stmt.AddValue(10, bonusListIDs.ToString());
|
||||
stmt.AddValue(9, bonusListIDs.ToString());
|
||||
}
|
||||
|
||||
trans.Append(stmt);
|
||||
|
||||
@@ -446,13 +446,12 @@ namespace Game.Entities
|
||||
|
||||
public class VoidStorageItem
|
||||
{
|
||||
public VoidStorageItem(ulong id, uint entry, ObjectGuid creator, uint randomBonusListId, uint upgradeId, uint fixedScalingLevel, uint artifactKnowledgeLevel, byte context, List<uint> bonuses)
|
||||
public VoidStorageItem(ulong id, uint entry, ObjectGuid creator, uint randomBonusListId, uint fixedScalingLevel, uint artifactKnowledgeLevel, byte context, List<uint> bonuses)
|
||||
{
|
||||
ItemId = id;
|
||||
ItemEntry = entry;
|
||||
CreatorGuid = creator;
|
||||
RandomBonusListId = randomBonusListId;
|
||||
ItemUpgradeId = upgradeId;
|
||||
FixedScalingLevel = fixedScalingLevel;
|
||||
ArtifactKnowledgeLevel = artifactKnowledgeLevel;
|
||||
Context = context;
|
||||
@@ -465,7 +464,6 @@ namespace Game.Entities
|
||||
public uint ItemEntry;
|
||||
public ObjectGuid CreatorGuid;
|
||||
public uint RandomBonusListId;
|
||||
public uint ItemUpgradeId;
|
||||
public uint FixedScalingLevel;
|
||||
public uint ArtifactKnowledgeLevel;
|
||||
public byte Context;
|
||||
@@ -545,14 +543,14 @@ namespace Game.Entities
|
||||
{
|
||||
public CUFProfile()
|
||||
{
|
||||
BoolOptions = new BitArray((int)CUFBoolOptions.BoolOptionsCount);
|
||||
BoolOptions = new BitSet((int)CUFBoolOptions.BoolOptionsCount);
|
||||
}
|
||||
|
||||
public CUFProfile(string name, ushort frameHeight, ushort frameWidth, byte sortBy, byte healthText, uint boolOptions,
|
||||
byte topPoint, byte bottomPoint, byte leftPoint, ushort topOffset, ushort bottomOffset, ushort leftOffset)
|
||||
{
|
||||
ProfileName = name;
|
||||
BoolOptions = new BitArray(new int[] { (int)boolOptions });
|
||||
BoolOptions = new BitSet(new uint[] { boolOptions });
|
||||
|
||||
FrameHeight = frameHeight;
|
||||
FrameWidth = frameWidth;
|
||||
@@ -576,7 +574,7 @@ namespace Game.Entities
|
||||
}
|
||||
public ulong GetUlongOptionValue()
|
||||
{
|
||||
int[] array = new int[1];
|
||||
uint[] array = new uint[1];
|
||||
BoolOptions.CopyTo(array, 0);
|
||||
return (ulong)array[0];
|
||||
}
|
||||
@@ -597,7 +595,7 @@ namespace Game.Entities
|
||||
public ushort BottomOffset;
|
||||
public ushort LeftOffset;
|
||||
|
||||
public BitArray BoolOptions;
|
||||
public BitSet BoolOptions;
|
||||
|
||||
// More fields can be added to BoolOptions without changing DB schema (up to 32, currently 27)
|
||||
}
|
||||
|
||||
@@ -1275,10 +1275,6 @@ namespace Game.Entities
|
||||
|
||||
item.AddItemFlag(ItemFieldFlags.NewItem);
|
||||
|
||||
uint upgradeID = Global.DB2Mgr.GetRulesetItemUpgrade(itemId);
|
||||
if (upgradeID != 0)
|
||||
item.SetModifier(ItemModifier.UpgradeId, upgradeID);
|
||||
|
||||
item.SetContext(context);
|
||||
item.SetBonuses(bonusListIDs);
|
||||
|
||||
|
||||
@@ -695,9 +695,9 @@ namespace Game.Entities
|
||||
// If map is dungeon find linked graveyard
|
||||
if (GetMap().IsDungeon())
|
||||
{
|
||||
WorldSafeLocsRecord entry = Global.ObjectMgr.GetClosestGraveYard(this, GetTeam(), this);
|
||||
WorldSafeLocsEntry entry = Global.ObjectMgr.GetClosestGraveYard(this, GetTeam(), this);
|
||||
if (entry != null)
|
||||
m_bgData.joinPos = new WorldLocation(entry.MapID, entry.Loc.X, entry.Loc.Y, entry.Loc.Z, 0.0f);
|
||||
m_bgData.joinPos = entry.Loc;
|
||||
else
|
||||
Log.outError(LogFilter.Player, "SetBattlegroundEntryPoint: Dungeon map {0} has no linked graveyard, setting home location as entry point.", GetMapId());
|
||||
}
|
||||
|
||||
@@ -4666,7 +4666,7 @@ namespace Game.Entities
|
||||
SpawnCorpseBones();
|
||||
}
|
||||
|
||||
WorldSafeLocsRecord ClosestGrave = null;
|
||||
WorldSafeLocsEntry ClosestGrave = null;
|
||||
|
||||
// Special handle for Battlegroundmaps
|
||||
Battleground bg = GetBattleground();
|
||||
@@ -4688,11 +4688,11 @@ namespace Game.Entities
|
||||
// and don't show spirit healer location
|
||||
if (ClosestGrave != null)
|
||||
{
|
||||
TeleportTo(ClosestGrave.MapID, ClosestGrave.Loc.X, ClosestGrave.Loc.Y, ClosestGrave.Loc.Z, (ClosestGrave.Facing * MathFunctions.PI) / 180);
|
||||
TeleportTo(ClosestGrave.Loc);
|
||||
if (IsDead()) // not send if alive, because it used in TeleportTo()
|
||||
{
|
||||
DeathReleaseLoc packet = new DeathReleaseLoc();
|
||||
packet.MapID = (int)ClosestGrave.MapID;
|
||||
packet.MapID = (int)ClosestGrave.Loc.GetMapId();
|
||||
packet.Loc = ClosestGrave.Loc;
|
||||
SendPacket(packet);
|
||||
}
|
||||
|
||||
@@ -746,7 +746,7 @@ namespace Game
|
||||
uint zoneId = result.Read<uint>(1);
|
||||
Team team = (Team)result.Read<uint>(2);
|
||||
|
||||
WorldSafeLocsRecord entry = CliDB.WorldSafeLocsStorage.LookupByKey(safeLocId);
|
||||
WorldSafeLocsEntry entry = GetWorldSafeLoc(safeLocId);
|
||||
if (entry == null)
|
||||
{
|
||||
Log.outError(LogFilter.Sql, "Table `graveyard_zone` has a record for not existing graveyard (WorldSafeLocs.dbc id) {0}, skipped.", safeLocId);
|
||||
@@ -772,16 +772,46 @@ namespace Game
|
||||
|
||||
Log.outInfo(LogFilter.ServerLoading, "Loaded {0} graveyard-zone links in {1} ms", count, Time.GetMSTimeDiffToNow(oldMSTime));
|
||||
}
|
||||
public void LoadWorldSafeLocs()
|
||||
{
|
||||
uint oldMSTime = Time.GetMSTime();
|
||||
|
||||
WorldSafeLocsRecord GetDefaultGraveYard(Team team)
|
||||
// 0 1 2 3 4 5
|
||||
SQLResult result = DB.World.Query("SELECT ID, MapID, LocX, LocY, LocZ, Facing FROM world_safe_locs");
|
||||
if (result.IsEmpty())
|
||||
{
|
||||
Log.outInfo(LogFilter.ServerLoading, "Loaded 0 world locations. DB table `world_safe_locs` is empty.");
|
||||
return;
|
||||
}
|
||||
do
|
||||
{
|
||||
uint id = result.Read<uint>(0);
|
||||
WorldLocation loc = new WorldLocation(result.Read<uint>(1), result.Read<float>(2), result.Read<float>(3), result.Read<float>(4), result.Read<float>(5));
|
||||
if (!GridDefines.IsValidMapCoord(loc))
|
||||
{
|
||||
Log.outError(LogFilter.Sql, $"World location (ID: {id}) has a invalid position MapID: {loc.GetMapId()} {loc.ToString()}, skipped");
|
||||
continue;
|
||||
}
|
||||
|
||||
WorldSafeLocsEntry worldSafeLocs = new WorldSafeLocsEntry();
|
||||
worldSafeLocs.Id = id;
|
||||
worldSafeLocs.Loc = loc;
|
||||
_worldSafeLocs[id] = worldSafeLocs;
|
||||
|
||||
} while (result.NextRow());
|
||||
|
||||
Log.outInfo(LogFilter.ServerLoading, $"Loaded {_worldSafeLocs.Count} world locations {Time.GetMSTimeDiffToNow(oldMSTime)} ms");
|
||||
}
|
||||
|
||||
WorldSafeLocsEntry GetDefaultGraveYard(Team team)
|
||||
{
|
||||
if (team == Team.Horde)
|
||||
return CliDB.WorldSafeLocsStorage.LookupByKey(10);
|
||||
return GetWorldSafeLoc(10);
|
||||
else if (team == Team.Alliance)
|
||||
return CliDB.WorldSafeLocsStorage.LookupByKey(4);
|
||||
return GetWorldSafeLoc(4);
|
||||
else return null;
|
||||
}
|
||||
public WorldSafeLocsRecord GetClosestGraveYard(WorldLocation location, Team team, WorldObject conditionObject)
|
||||
public WorldSafeLocsEntry GetClosestGraveYard(WorldLocation location, Team team, WorldObject conditionObject)
|
||||
{
|
||||
float x, y, z;
|
||||
location.GetPosition(out x, out y, out z);
|
||||
@@ -821,19 +851,19 @@ namespace Game
|
||||
// at corpse map
|
||||
bool foundNear = false;
|
||||
float distNear = 10000;
|
||||
WorldSafeLocsRecord entryNear = null;
|
||||
WorldSafeLocsEntry entryNear = null;
|
||||
|
||||
// at entrance map for corpse map
|
||||
bool foundEntr = false;
|
||||
float distEntr = 10000;
|
||||
WorldSafeLocsRecord entryEntr = null;
|
||||
WorldSafeLocsEntry entryEntr = null;
|
||||
|
||||
// some where other
|
||||
WorldSafeLocsRecord entryFar = null;
|
||||
WorldSafeLocsEntry entryFar = null;
|
||||
|
||||
foreach (var data in range)
|
||||
{
|
||||
WorldSafeLocsRecord entry = CliDB.WorldSafeLocsStorage.LookupByKey(data.safeLocId);
|
||||
WorldSafeLocsEntry entry = GetWorldSafeLoc(data.safeLocId);
|
||||
if (entry == null)
|
||||
{
|
||||
Log.outError(LogFilter.Sql, "Table `game_graveyard_zone` has record for not existing graveyard (WorldSafeLocs.dbc id) {0}, skipped.", data.safeLocId);
|
||||
@@ -850,17 +880,17 @@ namespace Game
|
||||
if (!Global.ConditionMgr.IsObjectMeetingNotGroupedConditions(ConditionSourceType.Graveyard, data.safeLocId, conditionSource))
|
||||
continue;
|
||||
|
||||
if (entry.MapID == mapEntry.ParentMapID && !conditionObject.GetPhaseShift().HasVisibleMapId(entry.MapID))
|
||||
if (entry.Loc.GetMapId() == mapEntry.ParentMapID && !conditionObject.GetPhaseShift().HasVisibleMapId(entry.Loc.GetMapId()))
|
||||
continue;
|
||||
}
|
||||
|
||||
// find now nearest graveyard at other map
|
||||
if (MapId != entry.MapID && entry.MapID != mapEntry.ParentMapID)
|
||||
if (MapId != entry.Loc.GetMapId() && entry.Loc.GetMapId() != mapEntry.ParentMapID)
|
||||
{
|
||||
// if find graveyard at different map from where entrance placed (or no entrance data), use any first
|
||||
if (mapEntry == null
|
||||
|| mapEntry.CorpseMapID < 0
|
||||
|| mapEntry.CorpseMapID != entry.MapID
|
||||
|| mapEntry.CorpseMapID != entry.Loc.GetMapId()
|
||||
|| (mapEntry.Corpse.X == 0 && mapEntry.Corpse.Y == 0))
|
||||
{
|
||||
// not have any corrdinates for check distance anyway
|
||||
@@ -869,8 +899,8 @@ namespace Game
|
||||
}
|
||||
|
||||
// at entrance map calculate distance (2D);
|
||||
float dist2 = (entry.Loc.X - mapEntry.Corpse.X) * (entry.Loc.X - mapEntry.Corpse.X)
|
||||
+ (entry.Loc.Y - mapEntry.Corpse.Y) * (entry.Loc.Y - mapEntry.Corpse.Y);
|
||||
float dist2 = (entry.Loc.GetPositionX() - mapEntry.Corpse.X) * (entry.Loc.GetPositionX() - mapEntry.Corpse.X)
|
||||
+ (entry.Loc.GetPositionY() - mapEntry.Corpse.Y) * (entry.Loc.GetPositionY() - mapEntry.Corpse.Y);
|
||||
if (foundEntr)
|
||||
{
|
||||
if (dist2 < distEntr)
|
||||
@@ -889,7 +919,7 @@ namespace Game
|
||||
// find now nearest graveyard at same map
|
||||
else
|
||||
{
|
||||
float dist2 = (entry.Loc.X - x) * (entry.Loc.X - x) + (entry.Loc.Y - y) * (entry.Loc.Y - y) + (entry.Loc.Z - z) * (entry.Loc.Z - z);
|
||||
float dist2 = (entry.Loc.GetPositionX() - x) * (entry.Loc.GetPositionX() - x) + (entry.Loc.GetPositionY() - y) * (entry.Loc.GetPositionY() - y) + (entry.Loc.GetPositionZ() - z) * (entry.Loc.GetPositionZ() - z);
|
||||
if (foundNear)
|
||||
{
|
||||
if (dist2 < distNear)
|
||||
@@ -925,6 +955,14 @@ namespace Game
|
||||
}
|
||||
return null;
|
||||
}
|
||||
public WorldSafeLocsEntry GetWorldSafeLoc(uint id)
|
||||
{
|
||||
return _worldSafeLocs.LookupByKey(id);
|
||||
}
|
||||
public Dictionary<uint, WorldSafeLocsEntry> GetWorldSafeLocs()
|
||||
{
|
||||
return _worldSafeLocs;
|
||||
}
|
||||
|
||||
public bool AddGraveYardLink(uint id, uint zoneId, Team team, bool persist = true)
|
||||
{
|
||||
@@ -4985,7 +5023,7 @@ namespace Game
|
||||
uint Trigger_ID = result.Read<uint>(0);
|
||||
uint PortLocID = result.Read<uint>(1);
|
||||
|
||||
WorldSafeLocsRecord portLoc = CliDB.WorldSafeLocsStorage.LookupByKey(PortLocID);
|
||||
WorldSafeLocsEntry portLoc = GetWorldSafeLoc(PortLocID);
|
||||
if (portLoc == null)
|
||||
{
|
||||
Log.outError(LogFilter.Sql, "Area Trigger (ID: {0}) has a non-existing Port Loc (ID: {1}) in WorldSafeLocs.dbc, skipped", Trigger_ID, PortLocID);
|
||||
@@ -4993,11 +5031,11 @@ namespace Game
|
||||
}
|
||||
|
||||
AreaTriggerStruct at = new AreaTriggerStruct();
|
||||
at.target_mapId = portLoc.MapID;
|
||||
at.target_X = portLoc.Loc.X;
|
||||
at.target_Y = portLoc.Loc.Y;
|
||||
at.target_Z = portLoc.Loc.Z;
|
||||
at.target_Orientation = (portLoc.Facing * MathFunctions.PI) / 180; // Orientation is initially in degrees
|
||||
at.target_mapId = portLoc.Loc.GetMapId();
|
||||
at.target_X = portLoc.Loc.GetPositionX();
|
||||
at.target_Y = portLoc.Loc.GetPositionY();
|
||||
at.target_Z = portLoc.Loc.GetPositionZ();
|
||||
at.target_Orientation = portLoc.Loc.GetOrientation();
|
||||
at.PortLocId = portLoc.Id;
|
||||
|
||||
AreaTriggerRecord atEntry = CliDB.AreaTriggerStorage.LookupByKey(Trigger_ID);
|
||||
@@ -9773,6 +9811,7 @@ namespace Game
|
||||
Dictionary<uint, AreaTriggerStruct> _areaTriggerStorage = new Dictionary<uint, AreaTriggerStruct>();
|
||||
Dictionary<ulong, AccessRequirement> _accessRequirementStorage = new Dictionary<ulong, AccessRequirement>();
|
||||
MultiMap<ulong, DungeonEncounter> _dungeonEncounterStorage = new MultiMap<ulong, DungeonEncounter>();
|
||||
Dictionary<uint, WorldSafeLocsEntry> _worldSafeLocs = new Dictionary<uint, WorldSafeLocsEntry>();
|
||||
|
||||
Dictionary<HighGuid, ObjectGuidGenerator> _guidGenerators = new Dictionary<HighGuid, ObjectGuidGenerator>();
|
||||
// first free id for selected id type
|
||||
@@ -10150,6 +10189,12 @@ namespace Game
|
||||
}
|
||||
}
|
||||
|
||||
public class WorldSafeLocsEntry
|
||||
{
|
||||
public uint Id;
|
||||
public WorldLocation Loc;
|
||||
}
|
||||
|
||||
public class GraveYardData
|
||||
{
|
||||
public uint safeLocId;
|
||||
|
||||
@@ -2678,7 +2678,7 @@ namespace Game.Groups
|
||||
BonusData bonusData = new BonusData(itemInstance);
|
||||
|
||||
ItemTemplate itemTemplate = Global.ObjectMgr.GetItemTemplate(itemid);
|
||||
uint itemLevel = Item.GetItemLevel(itemTemplate, bonusData, player.GetLevel(), 0, lootItemInSlot.upgradeId, 0, 0, 0, false);
|
||||
uint itemLevel = Item.GetItemLevel(itemTemplate, bonusData, player.GetLevel(), 0, 0, 0, 0, false);
|
||||
return Item.GetDisenchantLoot(itemTemplate, (uint)bonusData.Quality, itemLevel);
|
||||
}
|
||||
|
||||
|
||||
@@ -1315,7 +1315,7 @@ namespace Game.Guilds
|
||||
|
||||
public bool LoadBankItemFromDB(SQLFields field)
|
||||
{
|
||||
byte tabId = field.Read<byte>(45);
|
||||
byte tabId = field.Read<byte>(44);
|
||||
if (tabId >= _GetPurchasedTabsSize())
|
||||
{
|
||||
Log.outError(LogFilter.Guild, "Invalid tab for item (GUID: {0}, id: {1}) in guild bank, skipped.",
|
||||
@@ -3218,7 +3218,7 @@ namespace Game.Guilds
|
||||
|
||||
public bool LoadItemFromDB(SQLFields field)
|
||||
{
|
||||
byte slotId = field.Read<byte>(46);
|
||||
byte slotId = field.Read<byte>(45);
|
||||
uint itemGuid = field.Read<uint>(0);
|
||||
uint itemEntry = field.Read<uint>(1);
|
||||
if (slotId >= GuildConst.MaxBankSlots)
|
||||
|
||||
@@ -339,10 +339,9 @@ namespace Game
|
||||
|
||||
// Delete orphaned guild bank tab entries before loading the valid ones
|
||||
DB.Characters.DirectExecute("DELETE gbt FROM guild_bank_tab gbt LEFT JOIN guild g ON gbt.guildId = g.guildId WHERE g.guildId IS NULL");
|
||||
|
||||
// 0 1 2 3 4
|
||||
|
||||
// 0 1 2 3 4
|
||||
SQLResult result = DB.Characters.Query("SELECT guildid, TabId, TabName, TabIcon, TabText FROM guild_bank_tab ORDER BY guildid ASC, TabId ASC");
|
||||
|
||||
if (result.IsEmpty())
|
||||
{
|
||||
Log.outInfo(LogFilter.ServerLoading, "Loaded 0 guild bank tabs. DB table `guild_bank_tab` is empty.");
|
||||
@@ -383,7 +382,7 @@ namespace Game
|
||||
uint count = 0;
|
||||
do
|
||||
{
|
||||
ulong guildId = result.Read<ulong>(44);
|
||||
ulong guildId = result.Read<ulong>(43);
|
||||
Guild guild = GetGuildById(guildId);
|
||||
if (guild)
|
||||
guild.LoadBankItemFromDB(result.GetFields());
|
||||
|
||||
@@ -935,7 +935,7 @@ namespace Game
|
||||
if (gems[i])
|
||||
{
|
||||
uint gemScalingLevel = _player.GetLevel();
|
||||
uint fixedLevel = gems[i].GetModifier(ItemModifier.ScalingStatDistributionFixedLevel);
|
||||
uint fixedLevel = gems[i].GetModifier(ItemModifier.TimewalkerLevel);
|
||||
if (fixedLevel != 0)
|
||||
gemScalingLevel = fixedLevel;
|
||||
|
||||
|
||||
@@ -334,7 +334,7 @@ namespace Game
|
||||
|
||||
if (!teleported)
|
||||
{
|
||||
WorldSafeLocsRecord entranceLocation = null;
|
||||
WorldSafeLocsEntry entranceLocation = null;
|
||||
InstanceSave instanceSave = player.GetInstanceSave(at.target_mapId);
|
||||
if (instanceSave != null)
|
||||
{
|
||||
@@ -347,17 +347,17 @@ namespace Game
|
||||
{
|
||||
InstanceScript instanceScript = instanceMap.GetInstanceScript();
|
||||
if (instanceScript != null)
|
||||
entranceLocation = CliDB.WorldSafeLocsStorage.LookupByKey(instanceScript.GetEntranceLocation());
|
||||
entranceLocation = Global.ObjectMgr.GetWorldSafeLoc(instanceScript.GetEntranceLocation());
|
||||
}
|
||||
}
|
||||
|
||||
// Finally check with the instancesave for an entrance location if we did not get a valid one from the instancescript
|
||||
if (entranceLocation == null)
|
||||
entranceLocation = CliDB.WorldSafeLocsStorage.LookupByKey(instanceSave.GetEntranceLocation());
|
||||
entranceLocation = Global.ObjectMgr.GetWorldSafeLoc(instanceSave.GetEntranceLocation());
|
||||
}
|
||||
|
||||
if (entranceLocation != null)
|
||||
player.TeleportTo(entranceLocation.MapID, entranceLocation.Loc.X, entranceLocation.Loc.Y, entranceLocation.Loc.Z, (float)(entranceLocation.Facing * Math.PI / 180), TeleportToOptions.NotLeaveTransport);
|
||||
player.TeleportTo(entranceLocation.Loc, TeleportToOptions.NotLeaveTransport);
|
||||
else
|
||||
player.TeleportTo(at.target_mapId, at.target_X, at.target_Y, at.target_Z, at.target_Orientation, TeleportToOptions.NotLeaveTransport);
|
||||
}
|
||||
|
||||
@@ -273,7 +273,7 @@ namespace Game
|
||||
GetPlayer().DurabilityLossAll(0.25f, true);
|
||||
|
||||
// get corpse nearest graveyard
|
||||
WorldSafeLocsRecord corpseGrave = null;
|
||||
WorldSafeLocsEntry corpseGrave = null;
|
||||
WorldLocation corpseLocation = GetPlayer().GetCorpseLocation();
|
||||
if (GetPlayer().HasCorpse())
|
||||
{
|
||||
@@ -286,10 +286,10 @@ namespace Game
|
||||
// teleport to nearest from corpse graveyard, if different from nearest to player ghost
|
||||
if (corpseGrave != null)
|
||||
{
|
||||
WorldSafeLocsRecord ghostGrave = Global.ObjectMgr.GetClosestGraveYard(GetPlayer(), GetPlayer().GetTeam(), GetPlayer());
|
||||
WorldSafeLocsEntry ghostGrave = Global.ObjectMgr.GetClosestGraveYard(GetPlayer(), GetPlayer().GetTeam(), GetPlayer());
|
||||
|
||||
if (corpseGrave != ghostGrave)
|
||||
GetPlayer().TeleportTo(corpseGrave.MapID, corpseGrave.Loc.X, corpseGrave.Loc.Y, corpseGrave.Loc.Z, GetPlayer().GetOrientation());
|
||||
GetPlayer().TeleportTo(corpseGrave.Loc);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -156,8 +156,7 @@ namespace Game
|
||||
}
|
||||
|
||||
VoidStorageItem itemVS = new VoidStorageItem(Global.ObjectMgr.GenerateVoidStorageItemId(), item.GetEntry(), item.GetCreator(),
|
||||
item.GetItemRandomBonusListId(), item.GetModifier(ItemModifier.UpgradeId),
|
||||
item.GetModifier(ItemModifier.ScalingStatDistributionFixedLevel), item.GetModifier(ItemModifier.ArtifactKnowledgeLevel),
|
||||
item.GetItemRandomBonusListId(), item.GetModifier(ItemModifier.TimewalkerLevel), item.GetModifier(ItemModifier.ArtifactKnowledgeLevel),
|
||||
(byte)item.m_itemData.Context, item.m_itemData.BonusListIDs);
|
||||
|
||||
VoidItem voidItem;
|
||||
@@ -197,7 +196,6 @@ namespace Game
|
||||
|
||||
Item item = player.StoreNewItem(dest, itemVS.ItemEntry, true, itemVS.RandomBonusListId, null, itemVS.Context, itemVS.BonusListIDs);
|
||||
item.SetCreator(itemVS.CreatorGuid);
|
||||
item.SetModifier(ItemModifier.UpgradeId, itemVS.ItemUpgradeId);
|
||||
item.SetBinding(true);
|
||||
GetCollectionMgr().AddItemAppearance(item);
|
||||
|
||||
|
||||
@@ -41,7 +41,6 @@ namespace Game.Loots
|
||||
needs_quest = li.needs_quest;
|
||||
|
||||
randomBonusListId = ItemEnchantmentManager.GenerateItemRandomBonusListId(itemid);
|
||||
upgradeId = Global.DB2Mgr.GetRulesetItemUpgrade(itemid);
|
||||
canSave = true;
|
||||
}
|
||||
|
||||
@@ -88,7 +87,6 @@ namespace Game.Loots
|
||||
|
||||
public uint itemid;
|
||||
public uint randomBonusListId;
|
||||
public uint upgradeId;
|
||||
public List<uint> BonusListIDs = new List<uint>();
|
||||
public byte context;
|
||||
public List<Condition> conditions = new List<Condition>(); // additional loot condition
|
||||
|
||||
@@ -57,7 +57,7 @@ namespace Game.Maps
|
||||
return null;
|
||||
}
|
||||
|
||||
if (entranceId != 0 && !CliDB.WorldSafeLocsStorage.ContainsKey(entranceId))
|
||||
if (entranceId != 0 && Global.ObjectMgr.GetWorldSafeLoc(entranceId) == null)
|
||||
{
|
||||
Log.outWarn(LogFilter.Misc, "InstanceSaveManager.AddInstanceSave: invalid entranceId = {0} defined for instance save with mapid = {1}, instanceid = {2}!", entranceId, mapId, instanceId);
|
||||
entranceId = 0;
|
||||
|
||||
@@ -4320,7 +4320,7 @@ namespace Game.Maps
|
||||
List<Map> m_childTerrainMaps = new List<Map>(); // contains m_parentMap of maps that have MapEntry::ParentMapID == GetId()
|
||||
SortedMultiMap<long, ScriptAction> m_scriptSchedule = new SortedMultiMap<long, ScriptAction>();
|
||||
|
||||
BitArray marked_cells = new BitArray(MapConst.TotalCellsPerMap * MapConst.TotalCellsPerMap);
|
||||
BitSet marked_cells = new BitSet(MapConst.TotalCellsPerMap * MapConst.TotalCellsPerMap);
|
||||
public Dictionary<uint, CreatureGroup> CreatureGroupHolder = new Dictionary<uint, CreatureGroup>();
|
||||
internal uint i_InstanceId;
|
||||
long i_gridExpiry;
|
||||
|
||||
@@ -35,7 +35,7 @@ namespace Game.Network.Packets
|
||||
uint count = _worldPacket.ReadBits<uint>(13);
|
||||
for (uint i = 0; i < count; ++i)
|
||||
{
|
||||
Queries.Add(new DBQueryRecord(_worldPacket.ReadPackedGuid(), _worldPacket.ReadUInt32()));
|
||||
Queries.Add(new DBQueryRecord(_worldPacket.ReadUInt32()));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -44,13 +44,11 @@ namespace Game.Network.Packets
|
||||
|
||||
public struct DBQueryRecord
|
||||
{
|
||||
public DBQueryRecord(ObjectGuid guid, uint recordId)
|
||||
public DBQueryRecord(uint recordId)
|
||||
{
|
||||
GUID = guid;
|
||||
RecordID = recordId;
|
||||
}
|
||||
|
||||
public ObjectGuid GUID;
|
||||
public uint RecordID;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -774,25 +774,17 @@ namespace Game.Network.Packets
|
||||
if (lootItem.randomBonusListId != 0)
|
||||
ItemBonus.Value.BonusListIDs.Add(lootItem.randomBonusListId);
|
||||
}
|
||||
|
||||
if (lootItem.upgradeId != 0)
|
||||
{
|
||||
Modifications.HasValue = true;
|
||||
Modifications.Value.Insert((int)ItemModifier.UpgradeId, (int)lootItem.upgradeId);
|
||||
}
|
||||
}
|
||||
|
||||
public ItemInstance(VoidStorageItem voidItem)
|
||||
{
|
||||
ItemID = voidItem.ItemEntry;
|
||||
|
||||
if (voidItem.ItemUpgradeId != 0 || voidItem.FixedScalingLevel != 0 || voidItem.ArtifactKnowledgeLevel != 0)
|
||||
if (voidItem.FixedScalingLevel != 0 || voidItem.ArtifactKnowledgeLevel != 0)
|
||||
{
|
||||
Modifications.HasValue = true;
|
||||
if (voidItem.ItemUpgradeId != 0)
|
||||
Modifications.Value.Insert((int)ItemModifier.UpgradeId, (int)voidItem.ItemUpgradeId);
|
||||
if (voidItem.FixedScalingLevel != 0)
|
||||
Modifications.Value.Insert((int)ItemModifier.ScalingStatDistributionFixedLevel, (int)voidItem.FixedScalingLevel);
|
||||
Modifications.Value.Insert((int)ItemModifier.TimewalkerLevel, (int)voidItem.FixedScalingLevel);
|
||||
if (voidItem.ArtifactKnowledgeLevel != 0)
|
||||
Modifications.Value.Insert((int)ItemModifier.ArtifactKnowledgeLevel, (int)voidItem.ArtifactKnowledgeLevel);
|
||||
}
|
||||
|
||||
@@ -450,11 +450,11 @@ namespace Game.Network.Packets
|
||||
public override void Write()
|
||||
{
|
||||
_worldPacket.WriteInt32(MapID);
|
||||
_worldPacket.WriteVector3(Loc);
|
||||
_worldPacket.WriteXYZ(Loc);
|
||||
}
|
||||
|
||||
public int MapID;
|
||||
public Vector3 Loc;
|
||||
public WorldLocation Loc;
|
||||
}
|
||||
|
||||
public class PortGraveyard : ClientPacket
|
||||
|
||||
@@ -581,6 +581,9 @@ namespace Game
|
||||
Log.outInfo(LogFilter.ServerLoading, "Loading SpellArea Data..."); // must be after quest load
|
||||
Global.SpellMgr.LoadSpellAreas();
|
||||
|
||||
Log.outInfo(LogFilter.ServerLoading, "Loading World locations...");
|
||||
Global.ObjectMgr.LoadWorldSafeLocs(); // must be before LoadAreaTriggerTeleports and LoadGraveyardZones
|
||||
|
||||
Log.outInfo(LogFilter.ServerLoading, "Loading AreaTrigger definitions...");
|
||||
Global.ObjectMgr.LoadAreaTriggerTeleports();
|
||||
|
||||
|
||||
@@ -1990,92 +1990,97 @@ namespace Game.Entities
|
||||
effectsBySpell[effect.SpellID][effect.DifficultyID][effect.EffectIndex] = effect;
|
||||
}
|
||||
|
||||
foreach (var spell in CliDB.SpellNameStorage.Values)
|
||||
loadData[spell.Id] = new SpellInfoLoadHelper();
|
||||
SpellInfoLoadHelper GetSpellInfoLoadHelper(uint spellId)
|
||||
{
|
||||
if (!loadData.ContainsKey(spellId))
|
||||
loadData[spellId] = new SpellInfoLoadHelper();
|
||||
|
||||
return loadData[spellId];
|
||||
}
|
||||
|
||||
foreach (SpellAuraOptionsRecord auraOptions in CliDB.SpellAuraOptionsStorage.Values)
|
||||
if (auraOptions.DifficultyID == 0) // TODO: implement
|
||||
loadData[auraOptions.SpellID].AuraOptions = auraOptions;
|
||||
GetSpellInfoLoadHelper(auraOptions.SpellID).AuraOptions = auraOptions;
|
||||
|
||||
CliDB.SpellAuraOptionsStorage.Clear();
|
||||
|
||||
foreach (SpellAuraRestrictionsRecord auraRestrictions in CliDB.SpellAuraRestrictionsStorage.Values)
|
||||
{
|
||||
if (auraRestrictions.DifficultyID == 0) // TODO: implement
|
||||
loadData[auraRestrictions.SpellID].AuraRestrictions = auraRestrictions;
|
||||
GetSpellInfoLoadHelper(auraRestrictions.SpellID).AuraRestrictions = auraRestrictions;
|
||||
}
|
||||
CliDB.SpellAuraRestrictionsStorage.Clear();
|
||||
|
||||
foreach (SpellCastingRequirementsRecord castingRequirements in CliDB.SpellCastingRequirementsStorage.Values)
|
||||
loadData[castingRequirements.SpellID].CastingRequirements = castingRequirements;
|
||||
GetSpellInfoLoadHelper(castingRequirements.SpellID).CastingRequirements = castingRequirements;
|
||||
|
||||
CliDB.SpellCastingRequirementsStorage.Clear();
|
||||
|
||||
foreach (SpellCategoriesRecord categories in CliDB.SpellCategoriesStorage.Values)
|
||||
{
|
||||
if (categories.DifficultyID == 0) // TODO: implement
|
||||
loadData[categories.SpellID].Categories = categories;
|
||||
GetSpellInfoLoadHelper(categories.SpellID).Categories = categories;
|
||||
}
|
||||
CliDB.SpellCategoriesStorage.Clear();
|
||||
|
||||
foreach (SpellClassOptionsRecord classOptions in CliDB.SpellClassOptionsStorage.Values)
|
||||
loadData[classOptions.SpellID].ClassOptions = classOptions;
|
||||
GetSpellInfoLoadHelper(classOptions.SpellID).ClassOptions = classOptions;
|
||||
|
||||
CliDB.SpellClassOptionsStorage.Clear();
|
||||
|
||||
foreach (SpellCooldownsRecord cooldowns in CliDB.SpellCooldownsStorage.Values)
|
||||
{
|
||||
if (cooldowns.DifficultyID == 0) // TODO: implement
|
||||
loadData[cooldowns.SpellID].Cooldowns = cooldowns;
|
||||
GetSpellInfoLoadHelper(cooldowns.SpellID).Cooldowns = cooldowns;
|
||||
}
|
||||
CliDB.SpellCooldownsStorage.Clear();
|
||||
|
||||
foreach (SpellEquippedItemsRecord equippedItems in CliDB.SpellEquippedItemsStorage.Values)
|
||||
loadData[equippedItems.SpellID].EquippedItems = equippedItems;
|
||||
GetSpellInfoLoadHelper(equippedItems.SpellID).EquippedItems = equippedItems;
|
||||
|
||||
CliDB.SpellEquippedItemsStorage.Clear();
|
||||
|
||||
foreach (SpellInterruptsRecord interrupts in CliDB.SpellInterruptsStorage.Values)
|
||||
{
|
||||
if (interrupts.DifficultyID == 0) // TODO: implement
|
||||
loadData[interrupts.SpellID].Interrupts = interrupts;
|
||||
GetSpellInfoLoadHelper(interrupts.SpellID).Interrupts = interrupts;
|
||||
}
|
||||
CliDB.SpellInterruptsStorage.Clear();
|
||||
|
||||
foreach (SpellLevelsRecord levels in CliDB.SpellLevelsStorage.Values)
|
||||
{
|
||||
if (levels.DifficultyID == 0) // TODO: implement
|
||||
loadData[levels.SpellID].Levels = levels;
|
||||
GetSpellInfoLoadHelper(levels.SpellID).Levels = levels;
|
||||
}
|
||||
|
||||
foreach (SpellMiscRecord misc in CliDB.SpellMiscStorage.Values)
|
||||
if (misc.DifficultyID == 0)
|
||||
loadData[misc.SpellID].Misc = misc;
|
||||
GetSpellInfoLoadHelper(misc.SpellID).Misc = misc;
|
||||
|
||||
foreach (SpellReagentsRecord reagents in CliDB.SpellReagentsStorage.Values)
|
||||
loadData[reagents.SpellID].Reagents = reagents;
|
||||
GetSpellInfoLoadHelper(reagents.SpellID).Reagents = reagents;
|
||||
|
||||
CliDB.SpellReagentsStorage.Clear();
|
||||
|
||||
foreach (SpellScalingRecord scaling in CliDB.SpellScalingStorage.Values)
|
||||
loadData[scaling.SpellID].Scaling = scaling;
|
||||
GetSpellInfoLoadHelper(scaling.SpellID).Scaling = scaling;
|
||||
|
||||
CliDB.SpellScalingStorage.Clear();
|
||||
|
||||
foreach (SpellShapeshiftRecord shapeshift in CliDB.SpellShapeshiftStorage.Values)
|
||||
loadData[shapeshift.SpellID].Shapeshift = shapeshift;
|
||||
GetSpellInfoLoadHelper(shapeshift.SpellID).Shapeshift = shapeshift;
|
||||
|
||||
CliDB.SpellShapeshiftStorage.Clear();
|
||||
|
||||
foreach (SpellTargetRestrictionsRecord targetRestrictions in CliDB.SpellTargetRestrictionsStorage.Values)
|
||||
{
|
||||
if (targetRestrictions.DifficultyID == 0) // TODO: implement
|
||||
loadData[targetRestrictions.SpellID].TargetRestrictions = targetRestrictions;
|
||||
GetSpellInfoLoadHelper(targetRestrictions.SpellID).TargetRestrictions = targetRestrictions;
|
||||
}
|
||||
CliDB.SpellTargetRestrictionsStorage.Clear();
|
||||
|
||||
foreach (SpellTotemsRecord totems in CliDB.SpellTotemsStorage.Values)
|
||||
loadData[totems.SpellID].Totems = totems;
|
||||
GetSpellInfoLoadHelper(totems.SpellID).Totems = totems;
|
||||
|
||||
CliDB.SpellTotemsStorage.Clear();
|
||||
|
||||
@@ -2089,7 +2094,7 @@ namespace Game.Entities
|
||||
|
||||
foreach (var spellEntry in CliDB.SpellNameStorage.Values)
|
||||
{
|
||||
loadData[spellEntry.Id].Entry = spellEntry;
|
||||
GetSpellInfoLoadHelper(spellEntry.Id).Entry = spellEntry;
|
||||
mSpellInfoMap[spellEntry.Id] = new SpellInfo(loadData[spellEntry.Id], effectsBySpell.LookupByKey(spellEntry.Id), visualsBySpell.LookupByKey(spellEntry.Id));
|
||||
}
|
||||
|
||||
|
||||
@@ -1624,7 +1624,6 @@ CREATE TABLE `character_void_storage` (
|
||||
`slot` tinyint(3) unsigned NOT NULL,
|
||||
`creatorGuid` bigint(20) unsigned NOT NULL DEFAULT '0',
|
||||
`randomBonusListId` int(10) unsigned NOT NULL DEFAULT '0',
|
||||
`upgradeId` int(10) unsigned NOT NULL DEFAULT '0',
|
||||
`fixedScalingLevel` int(10) unsigned DEFAULT '0',
|
||||
`artifactKnowledgeLevel` int(10) unsigned DEFAULT '0',
|
||||
`context` tinyint(3) unsigned NOT NULL DEFAULT '0',
|
||||
@@ -2787,7 +2786,6 @@ CREATE TABLE `item_instance` (
|
||||
`playedTime` int(10) unsigned NOT NULL DEFAULT '0',
|
||||
`text` text,
|
||||
`transmogrification` int(10) unsigned NOT NULL DEFAULT '0',
|
||||
`upgradeId` int(10) unsigned NOT NULL DEFAULT '0',
|
||||
`enchantIllusion` int(10) unsigned NOT NULL DEFAULT '0',
|
||||
`battlePetSpeciesId` int(10) unsigned NOT NULL DEFAULT '0',
|
||||
`battlePetBreedData` int(10) unsigned NOT NULL DEFAULT '0',
|
||||
@@ -3570,7 +3568,9 @@ INSERT INTO `updates` VALUES
|
||||
('2019_06_08_00_characters.sql','6C5AF52AEF03BC019B96E7A07592C22660F9327B','RELEASED','2019-06-03 20:04:47',0),
|
||||
('2019_06_08_01_characters.sql','55076AFAF4B55DB4E34029C269EE0C84315C31BA','RELEASED','2019-06-04 22:11:47',0),
|
||||
('2019_06_25_00_characters.sql','B8CBF79DEE02B40B01424327D31E52C70335BEC6','RELEASED','2019-06-25 22:40:37',0),
|
||||
('2019_07_15_00_characters.sql','E1C77F604FB2A2FE8B32258CD0C9EC71BEA4F0FF','RELEASED','2019-06-25 22:40:37',0);
|
||||
('2019_07_15_00_characters.sql','E1C77F604FB2A2FE8B32258CD0C9EC71BEA4F0FF','RELEASED','2019-06-25 22:40:37',0),
|
||||
('2019_10_26_00_characters.sql','F1090ACDEB876A7BB5ED8829373F6305A217949A','RELEASED','2019-10-25 23:04:42',0),
|
||||
('2019_10_26_01_characters.sql','59D5860930D02AB77D2AAA704C564957A9143760','RELEASED','2019-10-26 22:04:46',0);
|
||||
/*!40000 ALTER TABLE `updates` ENABLE KEYS */;
|
||||
UNLOCK TABLES;
|
||||
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
ALTER TABLE `character_void_storage` DROP `upgradeId`;
|
||||
ALTER TABLE `item_instance` DROP `upgradeId`;
|
||||
@@ -0,0 +1,35 @@
|
||||
ALTER TABLE `item_appearance` ADD `SubclassID` int(11) NOT NULL DEFAULT 0 AFTER `DisplayType`;
|
||||
|
||||
ALTER TABLE `item_sparse` CHANGE `ZoneBound` `ZoneBound1` smallint(5) unsigned NOT NULL DEFAULT 0 AFTER `InstanceBound`;
|
||||
ALTER TABLE `item_sparse` ADD `ZoneBound2` smallint(5) unsigned NOT NULL DEFAULT 0 AFTER `ZoneBound1`;
|
||||
|
||||
ALTER TABLE `power_type` MODIFY `ID` int(10) UNSIGNED NOT NULL DEFAULT 0 AFTER `CostGlobalStringTag`;
|
||||
|
||||
ALTER TABLE `spell_effect` MODIFY `EffectAura` smallint(6) NOT NULL DEFAULT 0 AFTER `ID`;
|
||||
|
||||
ALTER TABLE `spell_misc` MODIFY `Attributes1` int(11) NOT NULL DEFAULT 0 AFTER `ID`;
|
||||
ALTER TABLE `spell_misc` MODIFY `Attributes2` int(11) NOT NULL DEFAULT 0 AFTER `Attributes1`;
|
||||
ALTER TABLE `spell_misc` MODIFY `Attributes3` int(11) NOT NULL DEFAULT 0 AFTER `Attributes2`;
|
||||
ALTER TABLE `spell_misc` MODIFY `Attributes4` int(11) NOT NULL DEFAULT 0 AFTER `Attributes3`;
|
||||
ALTER TABLE `spell_misc` MODIFY `Attributes5` int(11) NOT NULL DEFAULT 0 AFTER `Attributes4`;
|
||||
ALTER TABLE `spell_misc` MODIFY `Attributes6` int(11) NOT NULL DEFAULT 0 AFTER `Attributes5`;
|
||||
ALTER TABLE `spell_misc` MODIFY `Attributes7` int(11) NOT NULL DEFAULT 0 AFTER `Attributes6`;
|
||||
ALTER TABLE `spell_misc` MODIFY `Attributes8` int(11) NOT NULL DEFAULT 0 AFTER `Attributes7`;
|
||||
ALTER TABLE `spell_misc` MODIFY `Attributes9` int(11) NOT NULL DEFAULT 0 AFTER `Attributes8`;
|
||||
ALTER TABLE `spell_misc` MODIFY `Attributes10` int(11) NOT NULL DEFAULT 0 AFTER `Attributes9`;
|
||||
ALTER TABLE `spell_misc` MODIFY `Attributes11` int(11) NOT NULL DEFAULT 0 AFTER `Attributes10`;
|
||||
ALTER TABLE `spell_misc` MODIFY `Attributes12` int(11) NOT NULL DEFAULT 0 AFTER `Attributes11`;
|
||||
ALTER TABLE `spell_misc` MODIFY `Attributes13` int(11) NOT NULL DEFAULT 0 AFTER `Attributes12`;
|
||||
ALTER TABLE `spell_misc` MODIFY `Attributes14` int(11) NOT NULL DEFAULT 0 AFTER `Attributes13`;
|
||||
|
||||
ALTER TABLE `spell_visual_kit` MODIFY `FallbackPriority` tinyint(4) NOT NULL DEFAULT 0 AFTER `Flags`;
|
||||
ALTER TABLE `spell_visual_kit` MODIFY `FallbackSpellVisualKitId` int(10) UNSIGNED NOT NULL DEFAULT 0 AFTER `FallbackPriority`;
|
||||
|
||||
ALTER TABLE `transmog_set` ADD `PlayerConditionID` int(11) NOT NULL DEFAULT 0 AFTER `UiOrder`;
|
||||
|
||||
ALTER TABLE `unit_power_bar` MODIFY `StartPower` int(10) UNSIGNED NOT NULL DEFAULT 0 AFTER `MaxPower`;
|
||||
|
||||
DROP TABLE `item_upgrade`;
|
||||
DROP TABLE `ruleset_item_upgrade`;
|
||||
DROP TABLE `world_safe_locs`;
|
||||
DROP TABLE `world_safe_locs_locale`;
|
||||
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user