Updated to 7.3.5.25996 (Db2 files not updated)

This commit is contained in:
hondacrx
2018-02-19 10:32:16 -05:00
parent 0ab432f8c0
commit 0a3dfaba37
43 changed files with 1584 additions and 1425 deletions
@@ -75,50 +75,54 @@ namespace Framework.Constants
CharCreateTimeout = 48, CharCreateTimeout = 48,
CharCreateThrottle = 49, CharCreateThrottle = 49,
CharDeleteInProgress = 50, CharCreateAlliedRaceAchievement = 50,
CharDeleteSuccess = 51, CharCreateLevelRequirementDemonHunter = 51,
CharDeleteFailed = 52,
CharDeleteFailedLockedForTransfer = 53,
CharDeleteFailedGuildLeader = 54,
CharDeleteFailedArenaCaptain = 55,
CharDeleteFailedHasHeirloomOrMail = 56,
CharDeleteFailedUpgradeInProgress = 57,
CharDeleteFailedHasWowToken = 58,
CharDeleteFailedVasTransactionInProgress = 59,
CharLoginInProgress = 60, CharDeleteInProgress = 52,
CharLoginSuccess = 61, CharDeleteSuccess = 53,
CharLoginNoWorld = 62, CharDeleteFailed = 54,
CharLoginDuplicateCharacter = 63, CharDeleteFailedLockedForTransfer = 55,
CharLoginNoInstances = 64, CharDeleteFailedGuildLeader = 56,
CharLoginFailed = 65, CharDeleteFailedArenaCaptain = 57,
CharLoginDisabled = 66, CharDeleteFailedHasHeirloomOrMail = 58,
CharLoginNoCharacter = 67, CharDeleteFailedUpgradeInProgress = 59,
CharLoginLockedForTransfer = 68, CharDeleteFailedHasWowToken = 60,
CharLoginLockedByBilling = 69, CharDeleteFailedVasTransactionInProgress = 61,
CharLoginLockedByMobileAh = 70,
CharLoginTemporaryGmLock = 71,
CharLoginLockedByCharacterUpgrade = 72,
CharLoginLockedByRevokedCharacterUpgrade = 73,
CharLoginLockedByRevokedVasTransaction = 74,
CharNameSuccess = 75, CharLoginInProgress = 62,
CharNameFailure = 76, CharLoginSuccess = 63,
CharNameNoName = 77, CharLoginNoWorld = 64,
CharNameTooShort = 78, CharLoginDuplicateCharacter = 65,
CharNameTooLong = 79, CharLoginNoInstances = 66,
CharNameInvalidCharacter = 80, CharLoginFailed = 67,
CharNameMixedLanguages = 81, CharLoginDisabled = 68,
CharNameProfane = 82, CharLoginNoCharacter = 69,
CharNameReserved = 83, CharLoginLockedForTransfer = 70,
CharNameInvalidApostrophe = 84, CharLoginLockedByBilling = 71,
CharNameMultipleApostrophes = 85, CharLoginLockedByMobileAh = 72,
CharNameThreeConsecutive = 86, CharLoginTemporaryGmLock = 73,
CharNameInvalidSpace = 87, CharLoginLockedByCharacterUpgrade = 74,
CharNameConsecutiveSpaces = 88, CharLoginLockedByRevokedCharacterUpgrade = 75,
CharNameRussianConsecutiveSilentCharacters = 89, CharLoginLockedByRevokedVasTransaction = 76,
CharNameRussianSilentCharacterAtBeginningOrEnd = 90, CharLoginLockedByRestriction = 77,
CharNameDeclensionDoesntMatchBaseName = 91
CharNameSuccess = 78,
CharNameFailure = 79,
CharNameNoName = 80,
CharNameTooShort = 81,
CharNameTooLong = 82,
CharNameInvalidCharacter = 83,
CharNameMixedLanguages = 84,
CharNameProfane = 85,
CharNameReserved = 86,
CharNameInvalidApostrophe = 87,
CharNameMultipleApostrophes = 88,
CharNameThreeConsecutive = 89,
CharNameInvalidSpace = 90,
CharNameConsecutiveSpaces = 91,
CharNameRussianConsecutiveSilentCharacters = 92,
CharNameRussianSilentCharacterAtBeginningOrEnd = 93,
CharNameDeclensionDoesntMatchBaseName = 94
} }
public enum CharacterUndeleteResult public enum CharacterUndeleteResult
+13 -11
View File
@@ -108,21 +108,22 @@ namespace Framework.Constants
public const byte BagStart = 19; public const byte BagStart = 19;
public const byte BagEnd = 23; public const byte BagEnd = 23;
public const byte ItemStart = 23; public const byte ItemStart = 23;
public const byte ItemEnd = 39; public const byte ItemEnd = 47;
public const byte BankItemStart = 39; public const byte BankItemStart = 47;
public const byte BankItemEnd = 67; public const byte BankItemEnd = 75;
public const byte BankBagStart = 67; public const byte BankBagStart = 75;
public const byte BankBagEnd = 74; public const byte BankBagEnd = 82;
public const byte BuyBackStart = 74; public const byte BuyBackStart = 82;
public const byte BuyBackEnd = 86; public const byte BuyBackEnd = 94;
public const byte ReagentStart = 87; public const byte ReagentStart = 94;
public const byte ReagentEnd = 184; public const byte ReagentEnd = 192;
public const byte ChildEquipmentStart = 184; public const byte ChildEquipmentStart = 192;
public const byte ChildEquipmentEnd = 187; public const byte ChildEquipmentEnd = 195;
public const byte Bag0 = 255; public const byte Bag0 = 255;
public const byte DefaultSize = 16;
} }
public struct EquipmentSlot public struct EquipmentSlot
@@ -975,6 +976,7 @@ namespace Framework.Constants
CantUseItem = 98, // You can't use that item. CantUseItem = 98, // You can't use that item.
CantBeObliterated = 99, // You can't obliterate that item CantBeObliterated = 99, // You can't obliterate that item
GuildBankConjuredItem = 100,// You cannot store conjured items in the guild bank GuildBankConjuredItem = 100,// You cannot store conjured items in the guild bank
CantDoThatRightNow = 101,// You can't do that right now.
} }
public enum BuyResult public enum BuyResult
+2
View File
@@ -14,6 +14,7 @@
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
using System;
namespace Framework.Constants namespace Framework.Constants
{ {
@@ -99,6 +100,7 @@ namespace Framework.Constants
RespawnDelay RespawnDelay
} }
[Flags]
public enum GridMapTypeMask public enum GridMapTypeMask
{ {
None = 0x00, None = 0x00,
File diff suppressed because it is too large Load Diff
+10 -6
View File
@@ -101,6 +101,7 @@ namespace Framework.Constants
public const byte FieldBytes2OffsetIgnorePowerRegenPredictionMask = 0; public const byte FieldBytes2OffsetIgnorePowerRegenPredictionMask = 0;
public const byte FieldBytes2OffsetAuraVision = 1; public const byte FieldBytes2OffsetAuraVision = 1;
public const byte FieldBytes2OffsetNumBackpackSlots = 2;
public const byte FieldBytes3OffsetOverrideSpellsId = 2; // Uint16! public const byte FieldBytes3OffsetOverrideSpellsId = 2; // Uint16!
public const byte FieldBytes3OffsetOverrideSpellsIdUint16Offset = FieldBytes3OffsetOverrideSpellsId / 2; public const byte FieldBytes3OffsetOverrideSpellsIdUint16Offset = FieldBytes3OffsetOverrideSpellsId / 2;
@@ -485,14 +486,17 @@ namespace Framework.Constants
public enum PlayerLocalFlags public enum PlayerLocalFlags
{ {
ControllingPet = 0x01, // Displays "You have an active summon already" when trying to tame new pet
TrackStealthed = 0x02, TrackStealthed = 0x02,
ReleaseTimer = 0x08, // Display time till auto release spirit ReleaseTimer = 0x08, // Display time till auto release spirit
NoReleaseWindow = 0x10, // Display no "release spirit" window at all NoReleaseWindow = 0x10, // Display no "release spirit" window at all
NoPetBar = 0x00000020, // CGPetInfo::IsPetBarUsed NoPetBar = 0x20, // CGPetInfo::IsPetBarUsed
OverrideCameraMinHeight = 0x00000040, OverrideCameraMinHeight = 0x40,
UsingPartGarrison = 0x00000100, NewlyBosstedCharacter = 0x80,
CanUseObjectsMounted = 0x00000200, UsingPartGarrison = 0x100,
CanVisitPartyGarrison = 0x00000400 CanUseObjectsMounted = 0x200,
CanVisitPartyGarrison = 0x400,
AccountSecured = 0x1000 // Script_IsAccountSecured
} }
public enum PlayerFieldByte2Flags public enum PlayerFieldByte2Flags
@@ -572,7 +576,7 @@ namespace Framework.Constants
// first slot for item stored (in any way in player items data) // first slot for item stored (in any way in player items data)
Start = 0, Start = 0,
// last+1 slot for item stored (in any way in player items data) // last+1 slot for item stored (in any way in player items data)
End = 187, End = 195,
Count = (End - Start) Count = (End - Start)
} }
+8 -2
View File
@@ -526,7 +526,12 @@ namespace Framework.Constants
MistsOfPandaria = 4, MistsOfPandaria = 4,
WarlordsOfDraenor = 5, WarlordsOfDraenor = 5,
Legion = 6, Legion = 6,
Max Max,
// future expansion
BattleForAzeroth = 7,
MaxAccountExpansions
} }
public enum PowerType : byte public enum PowerType : byte
{ {
@@ -2302,7 +2307,8 @@ namespace Framework.Constants
QuestTurnInFailReason = 983, QuestTurnInFailReason = 983,
ClaimedChallengeModeRewardOld = 984, ClaimedChallengeModeRewardOld = 984,
TalentGrantedByAura = 985, TalentGrantedByAura = 985,
ChallengeModeAlreadyComplete = 986 ChallengeModeAlreadyComplete = 986,
GlyphTargetNotAvailable = 987
} }
public enum SceneFlags public enum SceneFlags
@@ -1051,6 +1051,19 @@ namespace Framework.Constants
MustBeStandingNearInjuredChromieInMountHyjal = 340, // Must Be Standing Near The Injured Chromie In Mount Hyjal. MustBeStandingNearInjuredChromieInMountHyjal = 340, // Must Be Standing Near The Injured Chromie In Mount Hyjal.
RemoveCannonsHeavyIronPlatingFirst = 342, // You Should Remove The Cannon'S Heavy Iron Plating First. RemoveCannonsHeavyIronPlatingFirst = 342, // You Should Remove The Cannon'S Heavy Iron Plating First.
RemoveCannonsElectrokineticDefenseGridFirst = 343, // You Should Remove The Cannon'S Electrokinetic Defense Grid First. RemoveCannonsElectrokineticDefenseGridFirst = 343, // You Should Remove The Cannon'S Electrokinetic Defense Grid First.
RequiresTheArmoryKeyAndDendriteClusters = 344, // You Are Missing Pieces Of The Armory Key Or Do Not Have Enough Dendrite Clusters.
ThisItemRequiresBasicObliterumToUpgrade = 345, // This Item Requires Basic Obliterum To Upgrade.
ThisItemRequiresPrimalObliterumToUpgrade = 346, // This Item Requires Primal Obliterum To Upgrade.
ThisItemRequiresFlightMastersWhistle = 347, // This Item Requires A Flight Master'S Whistle.
RequiresPowerThatEchoesThatOfTheAugari = 349, // Will Only Open To One Wielding The Power That Echoes That Of The Augari.
ThatPlayerHasAPendingTotemicRevival = 350, // That Player Has A Pending Totemic Revival.
YouHaveNoFireMinesDeployed = 351, // You Have No Fire Mines Deployed.
YouAreBlockedByAStructureAboveYou = 353, // You Are Blocked By A Structure Above You.
Requires100ImpMeat = 354, // Requires 100 Imp Meat.
YouHaveNotObtainedAnyBackgroundFilters = 355, // You Have Not Obtained Any Background Filters.
NothingInterestingPostedHereRightNow = 356, // There Is Nothing Interesting Posted Here Right Now.
ParagonReputationRequiresHigherLevel = 357, // Paragon Reputation Is Not Available Until A Higher Level.
UunaIsMissing = 358, // Uuna Is Missing.
} }
public enum SpellMissInfo public enum SpellMissInfo
@@ -363,6 +363,7 @@ namespace Framework.Constants
Private | Owner | UnitAll, // UNIT_FIELD_POWER_REGEN_INTERRUPTED_FLAT_MODIFIER+5 Private | Owner | UnitAll, // UNIT_FIELD_POWER_REGEN_INTERRUPTED_FLAT_MODIFIER+5
Public, // UNIT_FIELD_LEVEL Public, // UNIT_FIELD_LEVEL
Public, // UNIT_FIELD_EFFECTIVE_LEVEL Public, // UNIT_FIELD_EFFECTIVE_LEVEL
Public, // UNIT_FIELD_SANDBOX_SCALING_ID
Public, // UNIT_FIELD_SCALING_LEVEL_MIN Public, // UNIT_FIELD_SCALING_LEVEL_MIN
Public, // UNIT_FIELD_SCALING_LEVEL_MAX Public, // UNIT_FIELD_SCALING_LEVEL_MAX
Public, // UNIT_FIELD_SCALING_LEVEL_DELTA Public, // UNIT_FIELD_SCALING_LEVEL_DELTA
@@ -2110,6 +2111,39 @@ namespace Framework.Constants
Private, // PLAYER_FIELD_INV_SLOT_HEAD+745 Private, // PLAYER_FIELD_INV_SLOT_HEAD+745
Private, // PLAYER_FIELD_INV_SLOT_HEAD+746 Private, // PLAYER_FIELD_INV_SLOT_HEAD+746
Private, // PLAYER_FIELD_INV_SLOT_HEAD+747 Private, // PLAYER_FIELD_INV_SLOT_HEAD+747
Private, // PLAYER_FIELD_INV_SLOT_HEAD+748
Private, // PLAYER_FIELD_INV_SLOT_HEAD+749
Private, // PLAYER_FIELD_INV_SLOT_HEAD+750
Private, // PLAYER_FIELD_INV_SLOT_HEAD+751
Private, // PLAYER_FIELD_INV_SLOT_HEAD+752
Private, // PLAYER_FIELD_INV_SLOT_HEAD+753
Private, // PLAYER_FIELD_INV_SLOT_HEAD+754
Private, // PLAYER_FIELD_INV_SLOT_HEAD+755
Private, // PLAYER_FIELD_INV_SLOT_HEAD+756
Private, // PLAYER_FIELD_INV_SLOT_HEAD+757
Private, // PLAYER_FIELD_INV_SLOT_HEAD+758
Private, // PLAYER_FIELD_INV_SLOT_HEAD+759
Private, // PLAYER_FIELD_INV_SLOT_HEAD+760
Private, // PLAYER_FIELD_INV_SLOT_HEAD+761
Private, // PLAYER_FIELD_INV_SLOT_HEAD+762
Private, // PLAYER_FIELD_INV_SLOT_HEAD+763
Private, // PLAYER_FIELD_INV_SLOT_HEAD+764
Private, // PLAYER_FIELD_INV_SLOT_HEAD+765
Private, // PLAYER_FIELD_INV_SLOT_HEAD+766
Private, // PLAYER_FIELD_INV_SLOT_HEAD+767
Private, // PLAYER_FIELD_INV_SLOT_HEAD+768
Private, // PLAYER_FIELD_INV_SLOT_HEAD+769
Private, // PLAYER_FIELD_INV_SLOT_HEAD+770
Private, // PLAYER_FIELD_INV_SLOT_HEAD+771
Private, // PLAYER_FIELD_INV_SLOT_HEAD+772
Private, // PLAYER_FIELD_INV_SLOT_HEAD+773
Private, // PLAYER_FIELD_INV_SLOT_HEAD+774
Private, // PLAYER_FIELD_INV_SLOT_HEAD+775
Private, // PLAYER_FIELD_INV_SLOT_HEAD+776
Private, // PLAYER_FIELD_INV_SLOT_HEAD+777
Private, // PLAYER_FIELD_INV_SLOT_HEAD+778
Private, // PLAYER_FIELD_INV_SLOT_HEAD+779
Private, // PLAYER_FARSIGHT Private, // PLAYER_FARSIGHT
Private, // PLAYER_FARSIGHT+1 Private, // PLAYER_FARSIGHT+1
Private, // PLAYER_FARSIGHT+2 Private, // PLAYER_FARSIGHT+2
@@ -2134,6 +2168,7 @@ namespace Framework.Constants
Private, // PLAYER_FIELD_COINAGE+1 Private, // PLAYER_FIELD_COINAGE+1
Private, // PLAYER_XP Private, // PLAYER_XP
Private, // PLAYER_NEXT_LEVEL_XP Private, // PLAYER_NEXT_LEVEL_XP
Private, // PLAYER_TRIAL_XP
Private, // PLAYER_SKILL_LINEID Private, // PLAYER_SKILL_LINEID
Private, // PLAYER_SKILL_LINEID+1 Private, // PLAYER_SKILL_LINEID+1
Private, // PLAYER_SKILL_LINEID+2 Private, // PLAYER_SKILL_LINEID+2
@@ -2973,7 +3008,6 @@ namespace Framework.Constants
Private, // PLAYER_FIELD_MOD_TARGET_PHYSICAL_RESISTANCE Private, // PLAYER_FIELD_MOD_TARGET_PHYSICAL_RESISTANCE
Private, // PLAYER_FIELD_LOCAL_FLAGS Private, // PLAYER_FIELD_LOCAL_FLAGS
Private, // PLAYER_FIELD_BYTES Private, // PLAYER_FIELD_BYTES
Private, // PLAYER_SELF_RES_SPELL
Private, // PLAYER_FIELD_PVP_MEDALS Private, // PLAYER_FIELD_PVP_MEDALS
Private, // PLAYER_FIELD_BUYBACK_PRICE_1 Private, // PLAYER_FIELD_BUYBACK_PRICE_1
Private, // PLAYER_FIELD_BUYBACK_PRICE_1+1 Private, // PLAYER_FIELD_BUYBACK_PRICE_1+1
@@ -4885,6 +4919,7 @@ namespace Framework.Constants
Private, // PLAYER_DYNAMIC_FIELD_TOYS Private, // PLAYER_DYNAMIC_FIELD_TOYS
Private, // PLAYER_DYNAMIC_FIELD_TRANSMOG Private, // PLAYER_DYNAMIC_FIELD_TRANSMOG
Private, // PLAYER_DYNAMIC_FIELD_CONDITIONAL_TRANSMOG Private, // PLAYER_DYNAMIC_FIELD_CONDITIONAL_TRANSMOG
Private, // PLAYER_DYNAMIC_FIELD_SELF_RES_SPELLS
Private, // PLAYER_DYNAMIC_FIELD_CHARACTER_RESTRICTIONS Private, // PLAYER_DYNAMIC_FIELD_CHARACTER_RESTRICTIONS
Private, // PLAYER_DYNAMIC_FIELD_SPELL_PCT_MOD_BY_LABEL Private, // PLAYER_DYNAMIC_FIELD_SPELL_PCT_MOD_BY_LABEL
Private, // PLAYER_DYNAMIC_FIELD_SPELL_FLAT_MOD_BY_LABEL Private, // PLAYER_DYNAMIC_FIELD_SPELL_FLAT_MOD_BY_LABEL
+176 -173
View File
@@ -93,81 +93,83 @@ namespace Framework.Constants
PowerRegenInterruptedFlatModifier = ObjectFields.End + 0x042, // Size: 6, Flags: Private, Owner, UnitAll PowerRegenInterruptedFlatModifier = ObjectFields.End + 0x042, // Size: 6, Flags: Private, Owner, UnitAll
Level = ObjectFields.End + 0x048, // Size: 1, Flags: Public Level = ObjectFields.End + 0x048, // Size: 1, Flags: Public
EffectiveLevel = ObjectFields.End + 0x049, // Size: 1, Flags: Public EffectiveLevel = ObjectFields.End + 0x049, // Size: 1, Flags: Public
ScalingLevelMin = ObjectFields.End + 0x04a, // Size: 1, Flags: Public
ScalingLevelMax = ObjectFields.End + 0x04b, // Size: 1, Flags: Public SandboxScalingId = ObjectFields.End + 0x04a, // Size: 1, Flags: Public
ScalingLevelDelta = ObjectFields.End + 0x04c, // Size: 1, Flags: Public ScalingLevelMin = ObjectFields.End + 0x04b, // Size: 1, Flags: Public
FactionTemplate = ObjectFields.End + 0x04d, // Size: 1, Flags: Public ScalingLevelMax = ObjectFields.End + 0x04c, // Size: 1, Flags: Public
VirtualItemSlotId = ObjectFields.End + 0x04e, // Size: 6, Flags: Public ScalingLevelDelta = ObjectFields.End + 0x04d, // Size: 1, Flags: Public
Flags = ObjectFields.End + 0x054, // Size: 1, Flags: Public, Urgent FactionTemplate = ObjectFields.End + 0x04e, // Size: 1, Flags: Public
Flags2 = ObjectFields.End + 0x055, // Size: 1, Flags: Public, Urgent VirtualItemSlotId = ObjectFields.End + 0x04f, // Size: 6, Flags: Public
Flags3 = ObjectFields.End + 0x056, // Size: 1, Flags: Public, Urgent Flags = ObjectFields.End + 0x055, // Size: 1, Flags: Public, Urgent
AuraState = ObjectFields.End + 0x057, // Size: 1, Flags: Public Flags2 = ObjectFields.End + 0x056, // Size: 1, Flags: Public, Urgent
BaseAttackTime = ObjectFields.End + 0x058, // Size: 2, Flags: Public Flags3 = ObjectFields.End + 0x057, // Size: 1, Flags: Public, Urgent
RangedAttackTime = ObjectFields.End + 0x05a, // Size: 1, Flags: Private AuraState = ObjectFields.End + 0x058, // Size: 1, Flags: Public
BoundingRadius = ObjectFields.End + 0x05b, // Size: 1, Flags: Public BaseAttackTime = ObjectFields.End + 0x059, // Size: 2, Flags: Public
CombatReach = ObjectFields.End + 0x05c, // Size: 1, Flags: Public RangedAttackTime = ObjectFields.End + 0x05b, // Size: 1, Flags: Private
DisplayId = ObjectFields.End + 0x05d, // Size: 1, Flags: Dynamic, Urgent BoundingRadius = ObjectFields.End + 0x05c, // Size: 1, Flags: Public
NativeDisplayId = ObjectFields.End + 0x05e, // Size: 1, Flags: Public, Urgent CombatReach = ObjectFields.End + 0x05d, // Size: 1, Flags: Public
MountDisplayId = ObjectFields.End + 0x05f, // Size: 1, Flags: Public, Urgent DisplayId = ObjectFields.End + 0x05e, // Size: 1, Flags: Dynamic, Urgent
MinDamage = ObjectFields.End + 0x060, // Size: 1, Flags: Private, Owner, SpecialInfo NativeDisplayId = ObjectFields.End + 0x05f, // Size: 1, Flags: Public, Urgent
MaxDamage = ObjectFields.End + 0x061, // Size: 1, Flags: Private, Owner, SpecialInfo MountDisplayId = ObjectFields.End + 0x060, // Size: 1, Flags: Public, Urgent
MinOffHandDamage = ObjectFields.End + 0x062, // Size: 1, Flags: Private, Owner, SpecialInfo MinDamage = ObjectFields.End + 0x061, // Size: 1, Flags: Private, Owner, SpecialInfo
MaxOffHandDamage = ObjectFields.End + 0x063, // Size: 1, Flags: Private, Owner, SpecialInfo MaxDamage = ObjectFields.End + 0x062, // Size: 1, Flags: Private, Owner, SpecialInfo
Bytes1 = ObjectFields.End + 0x064, // Size: 1, Flags: Public MinOffHandDamage = ObjectFields.End + 0x063, // Size: 1, Flags: Private, Owner, SpecialInfo
PetNumber = ObjectFields.End + 0x065, // Size: 1, Flags: Public MaxOffHandDamage = ObjectFields.End + 0x064, // Size: 1, Flags: Private, Owner, SpecialInfo
PetNameTimestamp = ObjectFields.End + 0x066, // Size: 1, Flags: Public Bytes1 = ObjectFields.End + 0x065, // Size: 1, Flags: Public
PetExperience = ObjectFields.End + 0x067, // Size: 1, Flags: Owner PetNumber = ObjectFields.End + 0x066, // Size: 1, Flags: Public
PetNextLevelExp = ObjectFields.End + 0x068, // Size: 1, Flags: Owner PetNameTimestamp = ObjectFields.End + 0x067, // Size: 1, Flags: Public
ModCastSpeed = ObjectFields.End + 0x069, // Size: 1, Flags: Public PetExperience = ObjectFields.End + 0x068, // Size: 1, Flags: Owner
ModCastHaste = ObjectFields.End + 0x06a, // Size: 1, Flags: Public PetNextLevelExp = ObjectFields.End + 0x069, // Size: 1, Flags: Owner
ModHaste = ObjectFields.End + 0x06b, // Size: 1, Flags: Public ModCastSpeed = ObjectFields.End + 0x06a, // Size: 1, Flags: Public
ModRangedHaste = ObjectFields.End + 0x06c, // Size: 1, Flags: Public ModCastHaste = ObjectFields.End + 0x06b, // Size: 1, Flags: Public
ModHasteRegen = ObjectFields.End + 0x06d, // Size: 1, Flags: Public ModHaste = ObjectFields.End + 0x06c, // Size: 1, Flags: Public
ModTimeRate = ObjectFields.End + 0x06e, // Size: 1, Flags: Public ModRangedHaste = ObjectFields.End + 0x06d, // Size: 1, Flags: Public
CreatedBySpell = ObjectFields.End + 0x06f, // Size: 1, Flags: Public ModHasteRegen = ObjectFields.End + 0x06e, // Size: 1, Flags: Public
NpcFlags = ObjectFields.End + 0x070, // Size: 2, Flags: Public, Dynamic ModTimeRate = ObjectFields.End + 0x06f, // Size: 1, Flags: Public
NpcEmotestate = ObjectFields.End + 0x072, // Size: 1, Flags: Public CreatedBySpell = ObjectFields.End + 0x070, // Size: 1, Flags: Public
Stat = ObjectFields.End + 0x073, // Size: 4, Flags: Private, Owner NpcFlags = ObjectFields.End + 0x071, // Size: 2, Flags: Public, Dynamic
PosStat = ObjectFields.End + 0x077, // Size: 4, Flags: Private, Owner NpcEmotestate = ObjectFields.End + 0x073, // Size: 1, Flags: Public
NegStat = ObjectFields.End + 0x07b, // Size: 4, Flags: Private, Owner Stat = ObjectFields.End + 0x074, // Size: 4, Flags: Private, Owner
Resistances = ObjectFields.End + 0x07f, // Size: 7, Flags: Private, Owner, SpecialInfo PosStat = ObjectFields.End + 0x078, // Size: 4, Flags: Private, Owner
ResistanceBuffModsPositive = ObjectFields.End + 0x086, // Size: 7, Flags: Private, Owner NegStat = ObjectFields.End + 0x07c, // Size: 4, Flags: Private, Owner
ResistanceBuffModsNegative = ObjectFields.End + 0x08d, // Size: 7, Flags: Private, Owner Resistances = ObjectFields.End + 0x080, // Size: 7, Flags: Private, Owner, SpecialInfo
ModBonusArmor = ObjectFields.End + 0x094, // Size: 1, Flags: Private, Owner ResistanceBuffModsPositive = ObjectFields.End + 0x087, // Size: 7, Flags: Private, Owner
BaseMana = ObjectFields.End + 0x095, // Size: 1, Flags: Public ResistanceBuffModsNegative = ObjectFields.End + 0x08e, // Size: 7, Flags: Private, Owner
BaseHealth = ObjectFields.End + 0x096, // Size: 1, Flags: Private, Owner ModBonusArmor = ObjectFields.End + 0x095, // Size: 1, Flags: Private, Owner
Bytes2 = ObjectFields.End + 0x097, // Size: 1, Flags: Public BaseMana = ObjectFields.End + 0x096, // Size: 1, Flags: Public
AttackPower = ObjectFields.End + 0x098, // Size: 1, Flags: Private, Owner BaseHealth = ObjectFields.End + 0x097, // Size: 1, Flags: Private, Owner
AttackPowerModPos = ObjectFields.End + 0x099, // Size: 1, Flags: Private, Owner Bytes2 = ObjectFields.End + 0x098, // Size: 1, Flags: Public
AttackPowerModNeg = ObjectFields.End + 0x09a, // Size: 1, Flags: Private, Owner AttackPower = ObjectFields.End + 0x099, // Size: 1, Flags: Private, Owner
AttackPowerMultiplier = ObjectFields.End + 0x09b, // Size: 1, Flags: Private, Owner AttackPowerModPos = ObjectFields.End + 0x09a, // Size: 1, Flags: Private, Owner
RangedAttackPower = ObjectFields.End + 0x09c, // Size: 1, Flags: Private, Owner AttackPowerModNeg = ObjectFields.End + 0x09b, // Size: 1, Flags: Private, Owner
RangedAttackPowerModPos = ObjectFields.End + 0x09d, // Size: 1, Flags: Private, Owner AttackPowerMultiplier = ObjectFields.End + 0x09c, // Size: 1, Flags: Private, Owner
RangedAttackPowerModNeg = ObjectFields.End + 0x09e, // Size: 1, Flags: Private, Owner RangedAttackPower = ObjectFields.End + 0x09d, // Size: 1, Flags: Private, Owner
RangedAttackPowerMultiplier = ObjectFields.End + 0x09f, // Size: 1, Flags: Private, Owner RangedAttackPowerModPos = ObjectFields.End + 0x09e, // Size: 1, Flags: Private, Owner
AttackSpeedAura = ObjectFields.End + 0x0a0, // Size: 1, Flags: Private, Owner RangedAttackPowerModNeg = ObjectFields.End + 0x09f, // Size: 1, Flags: Private, Owner
MinRangedDamage = ObjectFields.End + 0x0a1, // Size: 1, Flags: Private, Owner RangedAttackPowerMultiplier = ObjectFields.End + 0x0a0, // Size: 1, Flags: Private, Owner
MaxRangedDamage = ObjectFields.End + 0x0a2, // Size: 1, Flags: Private, Owner AttackSpeedAura = ObjectFields.End + 0x0a1, // Size: 1, Flags: Private, Owner
PowerCostModifier = ObjectFields.End + 0x0a3, // Size: 7, Flags: Private, Owner MinRangedDamage = ObjectFields.End + 0x0a2, // Size: 1, Flags: Private, Owner
PowerCostMultiplier = ObjectFields.End + 0x0aa, // Size: 7, Flags: Private, Owner MaxRangedDamage = ObjectFields.End + 0x0a3, // Size: 1, Flags: Private, Owner
Maxhealthmodifier = ObjectFields.End + 0x0b1, // Size: 1, Flags: Private, Owner PowerCostModifier = ObjectFields.End + 0x0a4, // Size: 7, Flags: Private, Owner
HoverHeight = ObjectFields.End + 0x0b2, // Size: 1, Flags: Public PowerCostMultiplier = ObjectFields.End + 0x0ab, // Size: 7, Flags: Private, Owner
MinItemLevelCutoff = ObjectFields.End + 0x0b3, // Size: 1, Flags: Public MaxHealthModifier = ObjectFields.End + 0x0b2, // Size: 1, Flags: Private, Owner
MinItemLevel = ObjectFields.End + 0x0b4, // Size: 1, Flags: Public HoverHeight = ObjectFields.End + 0x0b3, // Size: 1, Flags: Public
Maxitemlevel = ObjectFields.End + 0x0b5, // Size: 1, Flags: Public MinItemLevelCutoff = ObjectFields.End + 0x0b4, // Size: 1, Flags: Public
WildBattlepetLevel = ObjectFields.End + 0x0b6, // Size: 1, Flags: Public MinItemLevel = ObjectFields.End + 0x0b5, // Size: 1, Flags: Public
BattlepetCompanionNameTimestamp = ObjectFields.End + 0x0b7, // Size: 1, Flags: Public Maxitemlevel = ObjectFields.End + 0x0b6, // Size: 1, Flags: Public
InteractSpellid = ObjectFields.End + 0x0b8, // Size: 1, Flags: Public WildBattlepetLevel = ObjectFields.End + 0x0b7, // Size: 1, Flags: Public
StateSpellVisualId = ObjectFields.End + 0x0b9, // Size: 1, Flags: Dynamic, Urgent BattlepetCompanionNameTimestamp = ObjectFields.End + 0x0b8, // Size: 1, Flags: Public
StateAnimId = ObjectFields.End + 0x0ba, // Size: 1, Flags: Dynamic, Urgent InteractSpellid = ObjectFields.End + 0x0b9, // Size: 1, Flags: Public
StateAnimKitId = ObjectFields.End + 0x0bb, // Size: 1, Flags: Dynamic, Urgent StateSpellVisualId = ObjectFields.End + 0x0ba, // Size: 1, Flags: Dynamic, Urgent
StateWorldEffectId = ObjectFields.End + 0x0bc, // Size: 4, Flags: Dynamic, Urgent StateAnimId = ObjectFields.End + 0x0bb, // Size: 1, Flags: Dynamic, Urgent
ScaleDuration = ObjectFields.End + 0x0c0, // Size: 1, Flags: Public StateAnimKitId = ObjectFields.End + 0x0bc, // Size: 1, Flags: Dynamic, Urgent
LooksLikeMountId = ObjectFields.End + 0x0c1, // Size: 1, Flags: Public StateWorldEffectId = ObjectFields.End + 0x0bd, // Size: 4, Flags: Dynamic, Urgent
LooksLikeCreatureId = ObjectFields.End + 0x0c2, // Size: 1, Flags: Public ScaleDuration = ObjectFields.End + 0x0c1, // Size: 1, Flags: Public
LookAtControllerId = ObjectFields.End + 0x0c3, // Size: 1, Flags: Public LooksLikeMountId = ObjectFields.End + 0x0c2, // Size: 1, Flags: Public
LookAtControllerTarget = ObjectFields.End + 0x0c4, // Size: 4, Flags: Public LooksLikeCreatureId = ObjectFields.End + 0x0c3, // Size: 1, Flags: Public
End = ObjectFields.End + 0x0c8 LookAtControllerId = ObjectFields.End + 0x0c4, // Size: 1, Flags: Public
LookAtControllerTarget = ObjectFields.End + 0x0c5, // Size: 4, Flags: Public
End = ObjectFields.End + 0x0c9
} }
public enum UnitDynamicFields public enum UnitDynamicFields
@@ -205,101 +207,101 @@ namespace Framework.Constants
CurrentBattlePetBreedQuality = UnitFields.End + 0x366, // Size: 1, Flags: Public CurrentBattlePetBreedQuality = UnitFields.End + 0x366, // Size: 1, Flags: Public
Prestige = UnitFields.End + 0x367, // Size: 1, Flags: Public Prestige = UnitFields.End + 0x367, // Size: 1, Flags: Public
HonorLevel = UnitFields.End + 0x368, // Size: 1, Flags: Public HonorLevel = UnitFields.End + 0x368, // Size: 1, Flags: Public
InvSlotHead = UnitFields.End + 0x369, // Size: 748, Flags: Private InvSlotHead = UnitFields.End + 0x369, // Size: 780, Flags: Private
EndNotSelf = UnitFields.End + 0x369, EndNotSelf = UnitFields.End + 0x369,
Farsight = UnitFields.End + 0x655, // Size: 4, Flags: Private Farsight = UnitFields.End + 0x675, // Size: 4, Flags: Private
SummonedBattlePetId = UnitFields.End + 0x659, // Size: 4, Flags: Private SummonedBattlePetId = UnitFields.End + 0x679, // Size: 4, Flags: Private
KnownTitles = UnitFields.End + 0x65d, // Size: 12, Flags: Private KnownTitles = UnitFields.End + 0x67d, // Size: 12, Flags: Private
Coinage = UnitFields.End + 0x669, // Size: 2, Flags: Private Coinage = UnitFields.End + 0x689, // Size: 2, Flags: Private
Xp = UnitFields.End + 0x66b, // Size: 1, Flags: Private Xp = UnitFields.End + 0x68b, // Size: 1, Flags: Private
NextLevelXp = UnitFields.End + 0x66c, // Size: 1, Flags: Private NextLevelXp = UnitFields.End + 0x68c, // Size: 1, Flags: Private
SkillLineId = UnitFields.End + 0x66d, // Size: 448, Flags: Private TrialXp = UnitFields.End + 0x68d, // Size: 1, Flags: Private
SkillLineStep = UnitFields.End + 0x6AD, SkillLineId = UnitFields.End + 0x68e, // Size: 448, Flags: Private
SkillLineRank = UnitFields.End + 0x6ED, SkillLineStep = UnitFields.End + 0x6ce,
SkillLineSubStartRank = UnitFields.End + 0x72D, SkillLineRank = UnitFields.End + 0x70e,
SkillLineMaxRank = UnitFields.End + 0x76D, SkillLineSubRank = UnitFields.End + 0x74e,
SkillLineTempBonus = UnitFields.End + 0x7AD, SkillLineMaxRank = UnitFields.End + 0x78c,
SkillLinePermBonus = UnitFields.End + 0x7ED, SkillLineTempBonus = UnitFields.End + 0x7ce,
CharacterPoints = UnitFields.End + 0x82d, // Size: 1, Flags: Private SkillLinePermBonus = UnitFields.End + 0x80e,
MaxTalentTiers = UnitFields.End + 0x82e, // Size: 1, Flags: Private CharacterPoints = UnitFields.End + 0x84e, // Size: 1, Flags: Private
TrackCreatures = UnitFields.End + 0x82f, // Size: 1, Flags: Private MaxTalentTiers = UnitFields.End + 0x84f, // Size: 1, Flags: Private
TrackResources = UnitFields.End + 0x830, // Size: 1, Flags: Private TrackCreatures = UnitFields.End + 0x850, // Size: 1, Flags: Private
Expertise = UnitFields.End + 0x831, // Size: 1, Flags: Private TrackResources = UnitFields.End + 0x851, // Size: 1, Flags: Private
OffhandExpertise = UnitFields.End + 0x832, // Size: 1, Flags: Private Expertise = UnitFields.End + 0x852, // Size: 1, Flags: Private
RangedExpertise = UnitFields.End + 0x833, // Size: 1, Flags: Private OffhandExpertise = UnitFields.End + 0x853, // Size: 1, Flags: Private
CombatRatingExpertise = UnitFields.End + 0x834, // Size: 1, Flags: Private RangedExpertise = UnitFields.End + 0x854, // Size: 1, Flags: Private
BlockPercentage = UnitFields.End + 0x835, // Size: 1, Flags: Private CombatRatingExpertise = UnitFields.End + 0x855, // Size: 1, Flags: Private
DodgePercentage = UnitFields.End + 0x836, // Size: 1, Flags: Private BlockPercentage = UnitFields.End + 0x856, // Size: 1, Flags: Private
DodgePercentageFromAttribute = UnitFields.End + 0x837, // Size: 1, Flags: Private DodgePercentage = UnitFields.End + 0x857, // Size: 1, Flags: Private
ParryPercentage = UnitFields.End + 0x838, // Size: 1, Flags: Private DodgePercentageFromAttribute = UnitFields.End + 0x858, // Size: 1, Flags: Private
ParryPercentageFromAttribute = UnitFields.End + 0x839, // Size: 1, Flags: Private ParryPercentage = UnitFields.End + 0x859, // Size: 1, Flags: Private
CritPercentage = UnitFields.End + 0x83a, // Size: 1, Flags: Private ParryPercentageFromAttribute = UnitFields.End + 0x85a, // Size: 1, Flags: Private
RangedCritPercentage = UnitFields.End + 0x83b, // Size: 1, Flags: Private CritPercentage = UnitFields.End + 0x85b, // Size: 1, Flags: Private
OffhandCritPercentage = UnitFields.End + 0x83c, // Size: 1, Flags: Private RangedCritPercentage = UnitFields.End + 0x85c, // Size: 1, Flags: Private
SpellCritPercentage1 = UnitFields.End + 0x83d, // Size: 1, Flags: Private OffhandCritPercentage = UnitFields.End + 0x85d, // Size: 1, Flags: Private
ShieldBlock = UnitFields.End + 0x83e, // Size: 1, Flags: Private SpellCritPercentage1 = UnitFields.End + 0x85e, // Size: 1, Flags: Private
ShieldBlockCritPercentage = UnitFields.End + 0x83f, // Size: 1, Flags: Private ShieldBlock = UnitFields.End + 0x85f, // Size: 1, Flags: Private
Mastery = UnitFields.End + 0x840, // Size: 1, Flags: Private ShieldBlockCritPercentage = UnitFields.End + 0x860, // Size: 1, Flags: Private
Speed = UnitFields.End + 0x841, // Size: 1, Flags: Private Mastery = UnitFields.End + 0x861, // Size: 1, Flags: Private
Lifesteal = UnitFields.End + 0x842, // Size: 1, Flags: Private Speed = UnitFields.End + 0x862, // Size: 1, Flags: Private
Avoidance = UnitFields.End + 0x843, // Size: 1, Flags: Private Lifesteal = UnitFields.End + 0x863, // Size: 1, Flags: Private
Sturdiness = UnitFields.End + 0x844, // Size: 1, Flags: Private Avoidance = UnitFields.End + 0x864, // Size: 1, Flags: Private
Versatility = UnitFields.End + 0x845, // Size: 1, Flags: Private Sturdiness = UnitFields.End + 0x865, // Size: 1, Flags: Private
VersatilityBonus = UnitFields.End + 0x846, // Size: 1, Flags: Private Versatility = UnitFields.End + 0x866, // Size: 1, Flags: Private
FieldPvpPowerDamage = UnitFields.End + 0x847, // Size: 1, Flags: Private VersatilityBonus = UnitFields.End + 0x867, // Size: 1, Flags: Private
FieldPvpPowerHealing = UnitFields.End + 0x848, // Size: 1, Flags: Private PvpPowerDamage = UnitFields.End + 0x868, // Size: 1, Flags: Private
ExploredZones1 = UnitFields.End + 0x849, // Size: 320, Flags: PRIVATE PvpPowerHealing = UnitFields.End + 0x869, // Size: 1, Flags: Private
RestInfo = UnitFields.End + 0x989, // Size: 4, Flags: Private ExploredZones1 = UnitFields.End + 0x86a, // Size: 320, Flags: Private
ModDamageDonePos = UnitFields.End + 0x98d, // Size: 7, Flags: Private RestInfo = UnitFields.End + 0x9aa, // Size: 4, Flags: Private
ModDamageDoneNeg = UnitFields.End + 0x994, // Size: 7, Flags: Private ModDamageDonePos = UnitFields.End + 0x9ae, // Size: 7, Flags: Private
ModDamageDonePct = UnitFields.End + 0x99b, // Size: 7, Flags: Private ModDamageDoneNeg = UnitFields.End + 0x9b5, // Size: 7, Flags: Private
ModHealingDonePos = UnitFields.End + 0x9a2, // Size: 1, Flags: Private ModDamageDonePct = UnitFields.End + 0x9bc, // Size: 7, Flags: Private
ModHealingPct = UnitFields.End + 0x9a3, // Size: 1, Flags: Private ModHealingDonePos = UnitFields.End + 0x9c3, // Size: 1, Flags: Private
ModHealingDonePct = UnitFields.End + 0x9a4, // Size: 1, Flags: Private ModHealingPct = UnitFields.End + 0x9c4, // Size: 1, Flags: Private
ModPeriodicHealingDonePercent = UnitFields.End + 0x9a5, // Size: 1, Flags: Private ModHealingDonePct = UnitFields.End + 0x9c5, // Size: 1, Flags: Private
WeaponDmgMultipliers = UnitFields.End + 0x9a6, // Size: 3, Flags: Private ModPeriodicHealingDonePercent = UnitFields.End + 0x9c6, // Size: 1, Flags: Private
WeaponAtkSpeedMultipliers = UnitFields.End + 0x9a9, // Size: 3, Flags: Private WeaponDmgMultipliers = UnitFields.End + 0x9c7, // Size: 3, Flags: Private
ModSpellPowerPct = UnitFields.End + 0x9ac, // Size: 1, Flags: Private WeaponAtkSpeedMultipliers = UnitFields.End + 0x9ca, // Size: 3, Flags: Private
ModResiliencePercent = UnitFields.End + 0x9ad, // Size: 1, Flags: Private ModSpellPowerPct = UnitFields.End + 0x9cd, // Size: 1, Flags: Private
OverrideSpellPowerByApPct = UnitFields.End + 0x9ae, // Size: 1, Flags: Private ModResiliencePercent = UnitFields.End + 0x9ce, // Size: 1, Flags: Private
OverrideApBySpellPowerPercent = UnitFields.End + 0x9af, // Size: 1, Flags: Private OverrideSpellPowerByApPct = UnitFields.End + 0x9cf, // Size: 1, Flags: Private
ModTargetResistance = UnitFields.End + 0x9b0, // Size: 1, Flags: Private OverrideApBySpellPowerPercent = UnitFields.End + 0x9d0, // Size: 1, Flags: Private
ModTargetPhysicalResistance = UnitFields.End + 0x9b1, // Size: 1, Flags: Private ModTargetResistance = UnitFields.End + 0x9d1, // Size: 1, Flags: Private
LocalFlags = UnitFields.End + 0x9b2, // Size: 1, Flags: Private ModTargetPhysicalResistance = UnitFields.End + 0x9d2, // Size: 1, Flags: Private
FieldBytes = UnitFields.End + 0x9b3, // Size: 1, Flags: Private LocalFlags = UnitFields.End + 0x9d3, // Size: 1, Flags: Private
SelfResSpell = UnitFields.End + 0x9b4, // Size: 1, Flags: Private FieldBytes = UnitFields.End + 0x9d4, // Size: 1, Flags: Private
PvpMedals = UnitFields.End + 0x9b5, // Size: 1, Flags: Private PvpMedals = UnitFields.End + 0x9d5, // Size: 1, Flags: Private
BuyBackPrice1 = UnitFields.End + 0x9b6, // Size: 12, Flags: Private BuyBackPrice1 = UnitFields.End + 0x9d6, // Size: 12, Flags: Private
BuyBackTimestamp1 = UnitFields.End + 0x9c2, // Size: 12, Flags: Private BuyBackTimestamp1 = UnitFields.End + 0x9e2, // Size: 12, Flags: Private
Kills = UnitFields.End + 0x9ce, // Size: 1, Flags: Private Kills = UnitFields.End + 0x9ee, // Size: 1, Flags: Private
LifetimeHonorableKills = UnitFields.End + 0x9cf, // Size: 1, Flags: Private LifetimeHonorableKills = UnitFields.End + 0x9ef, // Size: 1, Flags: Private
WatchedFactionIndex = UnitFields.End + 0x9d0, // Size: 1, Flags: Private WatchedFactionIndex = UnitFields.End + 0x9f0, // Size: 1, Flags: Private
CombatRating1 = UnitFields.End + 0x9d1, // Size: 32, Flags: Private CombatRating1 = UnitFields.End + 0x9f1, // Size: 32, Flags: Private
ArenaTeamInfo11 = UnitFields.End + 0x9f1, // Size: 42, Flags: Private ArenaTeamInfo11 = UnitFields.End + 0xa11, // Size: 42, Flags: Private
MaxLevel = UnitFields.End + 0xa1b, // Size: 1, Flags: Private MaxLevel = UnitFields.End + 0xa3b, // Size: 1, Flags: Private
ScalingLevelDelta = UnitFields.End + 0xa1c, // Size: 1, Flags: Private ScalingLevelDelta = UnitFields.End + 0xa3c, // Size: 1, Flags: Private
MaxCreatureScalingLevel = UnitFields.End + 0xa1d, // Size: 1, Flags: Private MaxCreatureScalingLevel = UnitFields.End + 0xa3d, // Size: 1, Flags: Private
NoReagentCost1 = UnitFields.End + 0xa1e, // Size: 4, Flags: Private NoReagentCost1 = UnitFields.End + 0xa3e, // Size: 4, Flags: Private
PetSpellPower = UnitFields.End + 0xa22, // Size: 1, Flags: Private PetSpellPower = UnitFields.End + 0xa42, // Size: 1, Flags: Private
Researching1 = UnitFields.End + 0xa23, // Size: 10, Flags: Private Researching1 = UnitFields.End + 0xa43, // Size: 10, Flags: Private
ProfessionSkillLine1 = UnitFields.End + 0xa2d, // Size: 2, Flags: Private ProfessionSkillLine1 = UnitFields.End + 0xa4d, // Size: 2, Flags: Private
UiHitModifier = UnitFields.End + 0xa2f, // Size: 1, Flags: Private UiHitModifier = UnitFields.End + 0xa4f, // Size: 1, Flags: Private
UiSpellHitModifier = UnitFields.End + 0xa30, // Size: 1, Flags: Private UiSpellHitModifier = UnitFields.End + 0xa50, // Size: 1, Flags: Private
HomeRealmTimeOffset = UnitFields.End + 0xa31, // Size: 1, Flags: Private HomeRealmTimeOffset = UnitFields.End + 0xa51, // Size: 1, Flags: Private
ModPetHaste = UnitFields.End + 0xa32, // Size: 1, Flags: Private ModPetHaste = UnitFields.End + 0xa52, // Size: 1, Flags: Private
FieldBytes2 = UnitFields.End + 0xa33, // Size: 1, Flags: Private FieldBytes2 = UnitFields.End + 0xa53, // Size: 1, Flags: Private
FieldBytes3 = UnitFields.End + 0xa34, // Size: 1, Flags: Private, UrgentSelfOnly FieldBytes3 = UnitFields.End + 0xa54, // Size: 1, Flags: Private, UrgentSelfOnly
LfgBonusFactionId = UnitFields.End + 0xa35, // Size: 1, Flags: Private LfgBonusFactionId = UnitFields.End + 0xa55, // Size: 1, Flags: Private
LootSpecId = UnitFields.End + 0xa36, // Size: 1, Flags: Private LootSpecId = UnitFields.End + 0xa56, // Size: 1, Flags: Private
OverrideZonePvpType = UnitFields.End + 0xa37, // Size: 1, Flags: Private, UrgentSelfOnly OverrideZonePvpType = UnitFields.End + 0xa57, // Size: 1, Flags: Private, UrgentSelfOnly
BagSlotFlags = UnitFields.End + 0xa38, // Size: 4, Flags: Private BagSlotFlags = UnitFields.End + 0xa58, // Size: 4, Flags: Private
BankBagSlotFlags = UnitFields.End + 0xa3c, // Size: 7, Flags: Private BankBagSlotFlags = UnitFields.End + 0xa5c, // Size: 7, Flags: Private
InsertItemsLeftToRight = UnitFields.End + 0xa43, // Size: 1, Flags: Private InsertItemsLeftToRight = UnitFields.End + 0xa63, // Size: 1, Flags: Private
QuestCompleted = UnitFields.End + 0xa44, // Size: 1750, Flags: Private QuestCompleted = UnitFields.End + 0xa64, // Size: 1750, Flags: Private
Honor = UnitFields.End + 0x111a, // Size: 1, Flags: Private Honor = UnitFields.End + 0x113a, // Size: 1, Flags: Private
HonorNextLevel = UnitFields.End + 0x111b, // Size: 1, Flags: Private HonorNextLevel = UnitFields.End + 0x113b, // Size: 1, Flags: Private
End = UnitFields.End + 0x111C End = UnitFields.End + 0x113c,
} }
public enum PlayerDynamicFields public enum PlayerDynamicFields
@@ -313,11 +315,12 @@ namespace Framework.Constants
Toys = UnitDynamicFields.End + 0x006, // Flags: Private Toys = UnitDynamicFields.End + 0x006, // Flags: Private
Transmog = UnitDynamicFields.End + 0x007, // Flags: PRIVATE Transmog = UnitDynamicFields.End + 0x007, // Flags: PRIVATE
ConditionalTransmog = UnitDynamicFields.End + 0x008, // Flags: PRIVATE ConditionalTransmog = UnitDynamicFields.End + 0x008, // Flags: PRIVATE
CharacterRestrictions = UnitDynamicFields.End + 0x009, // Flags: PRIVATE SelfResSpells = UnitDynamicFields.End + 0x009, // Flags: Private
SpellPctModByLabel = UnitDynamicFields.End + 0x00A, // Flags: PRIVATE CharacterRestrictions = UnitDynamicFields.End + 0x00a, // Flags: Private
SpellFlatModByLabel = UnitDynamicFields.End + 0x00B, // Flags: PRIVATE SpellPctModByLabel = UnitDynamicFields.End + 0x00b, // Flags: Private
ArenaCooldowns = UnitDynamicFields.End + 0x00C, // Flags: PUBLIC SpellFlatModByLabel = UnitDynamicFields.End + 0x00c, // Flags: Private
End = UnitDynamicFields.End + 0x00D ArenaCooldowns = UnitDynamicFields.End + 0x00d, // Flags: Public
End = UnitDynamicFields.End + 0x00e,
} }
public enum GameObjectFields public enum GameObjectFields
@@ -49,21 +49,21 @@ namespace Framework.Database
"subject, deliver_time, expire_time, money, has_items FROM mail WHERE receiver = ? "); "subject, deliver_time, expire_time, money, has_items FROM mail WHERE receiver = ? ");
PrepareStatement(CharStatements.SEL_MAIL_LIST_ITEMS, "SELECT itemEntry,count FROM item_instance WHERE guid = ?"); PrepareStatement(CharStatements.SEL_MAIL_LIST_ITEMS, "SELECT itemEntry,count FROM item_instance WHERE guid = ?");
PrepareStatement(CharStatements.SEL_ENUM, "SELECT c.guid, c.name, c.race, c.class, c.gender, c.skin, c.face, c.hairStyle, c.hairColor, c.facialStyle, c.customDisplay1, c.customDisplay2, c.customDisplay3, c.level, c.zone, c.map, c.position_x, c.position_y, c.position_z, " + PrepareStatement(CharStatements.SEL_ENUM, "SELECT c.guid, c.name, c.race, c.class, c.gender, c.skin, c.face, c.hairStyle, c.hairColor, c.facialStyle, c.customDisplay1, c.customDisplay2, c.customDisplay3, c.level, c.zone, c.map, c.position_x, c.position_y, c.position_z, " +
"gm.guildid, c.playerFlags, c.at_login, cp.entry, cp.modelid, cp.level, c.equipmentCache, cb.guid, c.slot, c.logout_time, c.activeTalentGroup " + "gm.guildid, c.playerFlags, c.at_login, cp.entry, cp.modelid, cp.level, c.equipmentCache, cb.guid, c.slot, c.logout_time, c.activeTalentGroup, c.lastLoginBuild " +
"FROM characters AS c LEFT JOIN character_pet AS cp ON c.guid = cp.owner AND cp.slot = ? LEFT JOIN guild_member AS gm ON c.guid = gm.guid " + "FROM characters AS c LEFT JOIN character_pet AS cp ON c.guid = cp.owner AND cp.slot = ? LEFT JOIN guild_member AS gm ON c.guid = gm.guid " +
"LEFT JOIN character_banned AS cb ON c.guid = cb.guid AND cb.active = 1 WHERE c.account = ? AND c.deleteInfos_Name IS NULL"); "LEFT JOIN character_banned AS cb ON c.guid = cb.guid AND cb.active = 1 WHERE c.account = ? AND c.deleteInfos_Name IS NULL");
PrepareStatement(CharStatements.SEL_ENUM_DECLINED_NAME, "SELECT c.guid, c.name, c.race, c.class, c.gender, c.skin, c.face, c.hairStyle, c.hairColor, c.facialStyle, c.customDisplay1, c.customDisplay2, c.customDisplay3, c.level, c.zone, c.map, " + PrepareStatement(CharStatements.SEL_ENUM_DECLINED_NAME, "SELECT c.guid, c.name, c.race, c.class, c.gender, c.skin, c.face, c.hairStyle, c.hairColor, c.facialStyle, c.customDisplay1, c.customDisplay2, c.customDisplay3, c.level, c.zone, c.map, " +
"c.position_x, c.position_y, c.position_z, gm.guildid, c.playerFlags, c.at_login, cp.entry, cp.modelid, cp.level, c.equipmentCache, " + "c.position_x, c.position_y, c.position_z, gm.guildid, c.playerFlags, c.at_login, cp.entry, cp.modelid, cp.level, c.equipmentCache, " +
"cb.guid, c.slot, c.logout_time, c.activeTalentGroup, cd.genitive FROM characters AS c LEFT JOIN character_pet AS cp ON c.guid = cp.owner AND cp.slot = ? " + "cb.guid, c.slot, c.logout_time, c.activeTalentGroup, c.lastLoginBuild, cd.genitive FROM characters AS c LEFT JOIN character_pet AS cp ON c.guid = cp.owner AND cp.slot = ? " +
"LEFT JOIN character_declinedname AS cd ON c.guid = cd.guid LEFT JOIN guild_member AS gm ON c.guid = gm.guid " + "LEFT JOIN character_declinedname AS cd ON c.guid = cd.guid LEFT JOIN guild_member AS gm ON c.guid = gm.guid " +
"LEFT JOIN character_banned AS cb ON c.guid = cb.guid AND cb.active = 1 WHERE c.account = ? AND c.deleteInfos_Name IS NULL"); "LEFT JOIN character_banned AS cb ON c.guid = cb.guid AND cb.active = 1 WHERE c.account = ? AND c.deleteInfos_Name IS NULL");
PrepareStatement(CharStatements.SEL_UNDELETE_ENUM, "SELECT c.guid, c.deleteInfos_Name, c.race, c.class, c.gender, c.skin, c.face, c.hairStyle, c.hairColor, c.facialStyle, c.customDisplay1, c.customDisplay2, c.customDisplay3, c.level, c.zone, c.map, c.position_x, c.position_y, c.position_z, " + PrepareStatement(CharStatements.SEL_UNDELETE_ENUM, "SELECT c.guid, c.deleteInfos_Name, c.race, c.class, c.gender, c.skin, c.face, c.hairStyle, c.hairColor, c.facialStyle, c.customDisplay1, c.customDisplay2, c.customDisplay3, c.level, c.zone, c.map, c.position_x, c.position_y, c.position_z, " +
"gm.guildid, c.playerFlags, c.at_login, cp.entry, cp.modelid, cp.level, c.equipmentCache, cb.guid, c.slot, c.logout_time, c.activeTalentGroup " + "gm.guildid, c.playerFlags, c.at_login, cp.entry, cp.modelid, cp.level, c.equipmentCache, cb.guid, c.slot, c.logout_time, c.activeTalentGroup, c.lastLoginBuild " +
"FROM characters AS c LEFT JOIN character_pet AS cp ON c.guid = cp.owner AND cp.slot = ? LEFT JOIN guild_member AS gm ON c.guid = gm.guid " + "FROM characters AS c LEFT JOIN character_pet AS cp ON c.guid = cp.owner AND cp.slot = ? LEFT JOIN guild_member AS gm ON c.guid = gm.guid " +
"LEFT JOIN character_banned AS cb ON c.guid = cb.guid AND cb.active = 1 WHERE c.deleteInfos_Account = ? AND c.deleteInfos_Name IS NOT NULL"); "LEFT JOIN character_banned AS cb ON c.guid = cb.guid AND cb.active = 1 WHERE c.deleteInfos_Account = ? AND c.deleteInfos_Name IS NOT NULL");
PrepareStatement(CharStatements.SEL_UNDELETE_ENUM_DECLINED_NAME, "SELECT c.guid, c.deleteInfos_Name, c.race, c.class, c.gender, c.skin, c.face, c.hairStyle, c.hairColor, c.facialStyle, c.customDisplay1, c.customDisplay2, c.customDisplay3, c.level, c.zone, c.map, " + PrepareStatement(CharStatements.SEL_UNDELETE_ENUM_DECLINED_NAME, "SELECT c.guid, c.deleteInfos_Name, c.race, c.class, c.gender, c.skin, c.face, c.hairStyle, c.hairColor, c.facialStyle, c.customDisplay1, c.customDisplay2, c.customDisplay3, c.level, c.zone, c.map, " +
"c.position_x, c.position_y, c.position_z, gm.guildid, c.playerFlags, c.at_login, cp.entry, cp.modelid, cp.level, c.equipmentCache, " + "c.position_x, c.position_y, c.position_z, gm.guildid, c.playerFlags, c.at_login, cp.entry, cp.modelid, cp.level, c.equipmentCache, " +
"cb.guid, c.slot, c.logout_time, c.activeTalentGroup, cd.genitive FROM characters AS c LEFT JOIN character_pet AS cp ON c.guid = cp.owner AND cp.slot = ? " + "cb.guid, c.slot, c.logout_time, c.activeTalentGroup, c.lastLoginBuild, cd.genitive FROM characters AS c LEFT JOIN character_pet AS cp ON c.guid = cp.owner AND cp.slot = ? " +
"LEFT JOIN character_declinedname AS cd ON c.guid = cd.guid LEFT JOIN guild_member AS gm ON c.guid = gm.guid " + "LEFT JOIN character_declinedname AS cd ON c.guid = cd.guid LEFT JOIN guild_member AS gm ON c.guid = gm.guid " +
"LEFT JOIN character_banned AS cb ON c.guid = cb.guid AND cb.active = 1 WHERE c.deleteInfos_Account = ? AND c.deleteInfos_Name IS NOT NULL"); "LEFT JOIN character_banned AS cb ON c.guid = cb.guid AND cb.active = 1 WHERE c.deleteInfos_Account = ? AND c.deleteInfos_Name IS NOT NULL");
PrepareStatement(CharStatements.SEL_FREE_NAME, "SELECT name, at_login FROM characters WHERE guid = ? AND NOT EXISTS (SELECT NULL FROM characters WHERE name = ?)"); PrepareStatement(CharStatements.SEL_FREE_NAME, "SELECT name, at_login FROM characters WHERE guid = ? AND NOT EXISTS (SELECT NULL FROM characters WHERE name = ?)");
@@ -77,7 +77,7 @@ namespace Framework.Database
PrepareStatement(CharStatements.DEL_BATTLEGROUND_RANDOM, "DELETE FROM character_battleground_random WHERE guid = ?"); PrepareStatement(CharStatements.DEL_BATTLEGROUND_RANDOM, "DELETE FROM character_battleground_random WHERE guid = ?");
PrepareStatement(CharStatements.INS_BATTLEGROUND_RANDOM, "INSERT INTO character_battleground_random (guid) VALUES (?)"); PrepareStatement(CharStatements.INS_BATTLEGROUND_RANDOM, "INSERT INTO character_battleground_random (guid) VALUES (?)");
PrepareStatement(CharStatements.SEL_CHARACTER, "SELECT c.guid, account, name, race, class, gender, level, xp, money, skin, face, hairStyle, hairColor, facialStyle, customDisplay1, customDisplay2, customDisplay3, bankSlots, restState, playerFlags, playerFlagsEx, " + PrepareStatement(CharStatements.SEL_CHARACTER, "SELECT c.guid, account, name, race, class, gender, level, xp, money, skin, face, hairStyle, hairColor, facialStyle, customDisplay1, customDisplay2, customDisplay3, inventorySlots, bankSlots, restState, playerFlags, playerFlagsEx, " +
"position_x, position_y, position_z, map, orientation, taximask, cinematic, totaltime, leveltime, rest_bonus, logout_time, is_logout_resting, resettalents_cost, " + "position_x, position_y, position_z, map, orientation, taximask, cinematic, totaltime, leveltime, rest_bonus, logout_time, is_logout_resting, resettalents_cost, " +
"resettalents_time, primarySpecialization, trans_x, trans_y, trans_z, trans_o, transguid, extra_flags, stable_slots, at_login, zone, online, death_expire_time, taxi_path, dungeonDifficulty, " + "resettalents_time, primarySpecialization, trans_x, trans_y, trans_z, trans_o, transguid, extra_flags, stable_slots, at_login, zone, online, death_expire_time, taxi_path, dungeonDifficulty, " +
"totalKills, todayKills, yesterdayKills, chosenTitle, watchedFaction, drunk, " + "totalKills, todayKills, yesterdayKills, chosenTitle, watchedFaction, drunk, " +
@@ -418,18 +418,18 @@ namespace Framework.Database
PrepareStatement(CharStatements.DEL_LFG_DATA, "DELETE FROM lfg_data WHERE guid = ?"); PrepareStatement(CharStatements.DEL_LFG_DATA, "DELETE FROM lfg_data WHERE guid = ?");
// Player saving // Player saving
PrepareStatement(CharStatements.INS_CHARACTER, "INSERT INTO characters (guid, account, name, race, class, gender, level, xp, money, skin, face, hairStyle, hairColor, facialStyle, customDisplay1, customDisplay2, customDisplay3, bankSlots, restState, playerFlags, playerFlagsEx, " + PrepareStatement(CharStatements.INS_CHARACTER, "INSERT INTO characters (guid, account, name, race, class, gender, level, xp, money, skin, face, hairStyle, hairColor, facialStyle, customDisplay1, customDisplay2, customDisplay3, inventorySlots, bankSlots, restState, playerFlags, playerFlagsEx, " +
"map, instance_id, dungeonDifficulty, raidDifficulty, legacyRaidDifficulty, position_x, position_y, position_z, orientation, trans_x, trans_y, trans_z, trans_o, transguid, " + "map, instance_id, dungeonDifficulty, raidDifficulty, legacyRaidDifficulty, position_x, position_y, position_z, orientation, trans_x, trans_y, trans_z, trans_o, transguid, " +
"taximask, cinematic, totaltime, leveltime, rest_bonus, logout_time, is_logout_resting, resettalents_cost, resettalents_time, primarySpecialization, " + "taximask, cinematic, totaltime, leveltime, rest_bonus, logout_time, is_logout_resting, resettalents_cost, resettalents_time, primarySpecialization, " +
"extra_flags, stable_slots, at_login, zone, death_expire_time, taxi_path, totalKills, todayKills, yesterdayKills, chosenTitle, watchedFaction, drunk, health, power1, power2, power3, " + "extra_flags, stable_slots, at_login, zone, death_expire_time, taxi_path, totalKills, todayKills, yesterdayKills, chosenTitle, watchedFaction, drunk, health, power1, power2, power3, " +
"power4, power5, power6, latency, activeTalentGroup, lootSpecId, exploredZones, equipmentCache, knownTitles, actionBars, grantableLevels) VALUES " + "power4, power5, power6, latency, activeTalentGroup, lootSpecId, exploredZones, equipmentCache, knownTitles, actionBars, grantableLevels, lastLoginBuild) VALUES " +
"(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"); "(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)");
PrepareStatement(CharStatements.UPD_CHARACTER, "UPDATE characters SET name=?,race=?,class=?,gender=?,level=?,xp=?,money=?,skin=?,face=?,hairStyle=?,hairColor=?,facialStyle=?,customDisplay1=?,customDisplay2=?,customDisplay3=?,bankSlots=?,restState=?,playerFlags=?,playerFlagsEx=?," + PrepareStatement(CharStatements.UPD_CHARACTER, "UPDATE characters SET name=?,race=?,class=?,gender=?,level=?,xp=?,money=?,skin=?,face=?,hairStyle=?,hairColor=?,facialStyle=?,customDisplay1=?,customDisplay2=?,customDisplay3=?,inventorySlots=?,bankSlots=?,restState=?,playerFlags=?,playerFlagsEx=?," +
"map=?,instance_id=?,dungeonDifficulty=?,raidDifficulty=?,legacyRaidDifficulty=?,position_x=?,position_y=?,position_z=?,orientation=?,trans_x=?,trans_y=?,trans_z=?,trans_o=?,transguid=?,taximask=?,cinematic=?,totaltime=?,leveltime=?,rest_bonus=?," + "map=?,instance_id=?,dungeonDifficulty=?,raidDifficulty=?,legacyRaidDifficulty=?,position_x=?,position_y=?,position_z=?,orientation=?,trans_x=?,trans_y=?,trans_z=?,trans_o=?,transguid=?,taximask=?,cinematic=?,totaltime=?,leveltime=?,rest_bonus=?," +
"logout_time=?,is_logout_resting=?,resettalents_cost=?,resettalents_time=?,primarySpecialization=?,extra_flags=?,stable_slots=?,at_login=?,zone=?,death_expire_time=?,taxi_path=?," + "logout_time=?,is_logout_resting=?,resettalents_cost=?,resettalents_time=?,primarySpecialization=?,extra_flags=?,stable_slots=?,at_login=?,zone=?,death_expire_time=?,taxi_path=?," +
"totalKills=?,todayKills=?,yesterdayKills=?,chosenTitle=?," + "totalKills=?,todayKills=?,yesterdayKills=?,chosenTitle=?," +
"watchedFaction=?,drunk=?,health=?,power1=?,power2=?,power3=?,power4=?,power5=?,power6=?,latency=?,activeTalentGroup=?,lootSpecId=?,exploredZones=?," + "watchedFaction=?,drunk=?,health=?,power1=?,power2=?,power3=?,power4=?,power5=?,power6=?,latency=?,activeTalentGroup=?,lootSpecId=?,exploredZones=?," +
"equipmentCache=?,knownTitles=?,actionBars=?,grantableLevels=?,online=?,honor=?,honorLevel=?,prestigeLevel=?,honorRestState=?,honorRestBonus=? WHERE guid=?"); "equipmentCache=?,knownTitles=?,actionBars=?,grantableLevels=?,online=?,honor=?,honorLevel=?,prestigeLevel=?,honorRestState=?,honorRestBonus=?,lastLoginBuild=? WHERE guid=?");
PrepareStatement(CharStatements.UPD_ADD_AT_LOGIN_FLAG, "UPDATE characters SET at_login = at_login | ? WHERE guid = ?"); PrepareStatement(CharStatements.UPD_ADD_AT_LOGIN_FLAG, "UPDATE characters SET at_login = at_login | ? WHERE guid = ?");
PrepareStatement(CharStatements.UPD_REM_AT_LOGIN_FLAG, "UPDATE characters set at_login = at_login & ~ ? WHERE guid = ?"); PrepareStatement(CharStatements.UPD_REM_AT_LOGIN_FLAG, "UPDATE characters set at_login = at_login & ~ ? WHERE guid = ?");
+1 -1
View File
@@ -174,7 +174,7 @@ abstract class Appender
public void Write(LogMessage message) public void Write(LogMessage message)
{ {
if (_level == LogLevel.Disabled || _level > message.level) if (_level == LogLevel.Disabled || (_level != LogLevel.Fatal && _level > message.level))
return; return;
StringBuilder ss = new StringBuilder(); StringBuilder ss = new StringBuilder();
+3
View File
@@ -282,6 +282,7 @@ namespace Game.Misc
text.QuestID = (int)questID; text.QuestID = (int)questID;
text.QuestType = item.QuestIcon; text.QuestType = item.QuestIcon;
text.QuestLevel = quest.Level; text.QuestLevel = quest.Level;
text.QuestMaxScalingLevel = quest.MaxScalingLevel;
text.QuestFlags = (int)quest.Flags; text.QuestFlags = (int)quest.Flags;
text.QuestFlagsEx = (int)quest.FlagsEx; text.QuestFlagsEx = (int)quest.FlagsEx;
text.Repeatable = quest.IsRepeatable(); text.Repeatable = quest.IsRepeatable();
@@ -375,6 +376,7 @@ namespace Game.Misc
text.QuestID = questID; text.QuestID = questID;
text.QuestType = questMenuItem.QuestIcon; text.QuestType = questMenuItem.QuestIcon;
text.QuestLevel = (uint)quest.Level; text.QuestLevel = (uint)quest.Level;
text.QuestMaxScalingLevel = (uint)quest.MaxScalingLevel;
text.QuestFlags = (uint)quest.Flags; text.QuestFlags = (uint)quest.Flags;
text.QuestFlagsEx = (uint)quest.FlagsEx; text.QuestFlagsEx = (uint)quest.FlagsEx;
text.Repeatable = false; // NYI text.Repeatable = false; // NYI
@@ -497,6 +499,7 @@ namespace Game.Misc
packet.Info.QuestID = quest.Id; packet.Info.QuestID = quest.Id;
packet.Info.QuestType = (int)quest.Type; packet.Info.QuestType = (int)quest.Type;
packet.Info.QuestLevel = quest.Level; packet.Info.QuestLevel = quest.Level;
packet.Info.QuestMaxScalingLevel = quest.MaxScalingLevel;
packet.Info.QuestPackageID = quest.PackageID; packet.Info.QuestPackageID = quest.PackageID;
packet.Info.QuestMinLevel = quest.MinLevel; packet.Info.QuestMinLevel = quest.MinLevel;
packet.Info.QuestSortID = quest.QuestSortID; packet.Info.QuestSortID = quest.QuestSortID;
+49 -44
View File
@@ -2370,8 +2370,8 @@ namespace Game.Entities
SetUInt32Value(UnitFields.Level, result.Read<uint>(6)); SetUInt32Value(UnitFields.Level, result.Read<uint>(6));
SetXP(result.Read<uint>(7)); SetXP(result.Read<uint>(7));
_LoadIntoDataField(result.Read<string>(65), (int)PlayerFields.ExploredZones1, PlayerConst.ExploredZonesSize); _LoadIntoDataField(result.Read<string>(66), (int)PlayerFields.ExploredZones1, PlayerConst.ExploredZonesSize);
_LoadIntoDataField(result.Read<string>(66), (int)PlayerFields.KnownTitles, PlayerConst.KnowTitlesSize * 2); _LoadIntoDataField(result.Read<string>(67), (int)PlayerFields.KnownTitles, PlayerConst.KnowTitlesSize * 2);
SetObjectScale(1.0f); SetObjectScale(1.0f);
SetFloatValue(UnitFields.HoverHeight, 1.0f); SetFloatValue(UnitFields.HoverHeight, 1.0f);
@@ -2397,12 +2397,13 @@ namespace Game.Entities
SetByteValue(PlayerFields.Bytes2, PlayerFieldOffsets.Bytes2OffsetFacialStyle, result.Read<byte>(13)); SetByteValue(PlayerFields.Bytes2, PlayerFieldOffsets.Bytes2OffsetFacialStyle, result.Read<byte>(13));
for (byte i = 0; i < PlayerConst.CustomDisplaySize; ++i) for (byte i = 0; i < PlayerConst.CustomDisplaySize; ++i)
SetByteValue(PlayerFields.Bytes2, (byte)(PlayerFieldOffsets.Bytes2OffsetCustomDisplayOption + i), customDisplay[i]); SetByteValue(PlayerFields.Bytes2, (byte)(PlayerFieldOffsets.Bytes2OffsetCustomDisplayOption + i), customDisplay[i]);
SetBankBagSlotCount(result.Read<byte>(17)); SetInventorySlotCount(result.Read<byte>(17));
SetBankBagSlotCount(result.Read<byte>(18));
SetByteValue(PlayerFields.Bytes3, PlayerFieldOffsets.Bytes3OffsetGender, (byte)gender); SetByteValue(PlayerFields.Bytes3, PlayerFieldOffsets.Bytes3OffsetGender, (byte)gender);
SetByteValue(PlayerFields.Bytes3, PlayerFieldOffsets.Bytes3OffsetInebriation, result.Read<byte>(54)); SetByteValue(PlayerFields.Bytes3, PlayerFieldOffsets.Bytes3OffsetInebriation, result.Read<byte>(55));
SetUInt32Value(PlayerFields.Flags, result.Read<uint>(19)); SetUInt32Value(PlayerFields.Flags, result.Read<uint>(20));
SetUInt32Value(PlayerFields.FlagsEx, result.Read<uint>(20)); SetUInt32Value(PlayerFields.FlagsEx, result.Read<uint>(21));
SetInt32Value(PlayerFields.WatchedFactionIndex, (int)result.Read<uint>(53)); SetInt32Value(PlayerFields.WatchedFactionIndex, (int)result.Read<uint>(54));
if (!ValidateAppearance((Race)result.Read<byte>(3), (Class)result.Read<byte>(4), (Gender)gender, if (!ValidateAppearance((Race)result.Read<byte>(3), (Class)result.Read<byte>(4), (Gender)gender,
GetByteValue(PlayerFields.Bytes, PlayerFieldOffsets.BytesOffsetHairStyleId), GetByteValue(PlayerFields.Bytes, PlayerFieldOffsets.BytesOffsetHairStyleId),
@@ -2416,9 +2417,9 @@ namespace Game.Entities
} }
// set which actionbars the client has active - DO NOT REMOVE EVER AGAIN (can be changed though, if it does change fieldwise) // set which actionbars the client has active - DO NOT REMOVE EVER AGAIN (can be changed though, if it does change fieldwise)
SetByteValue(PlayerFields.FieldBytes, PlayerFieldOffsets.FieldBytesOffsetActionBarToggles, result.Read<byte>(67)); SetByteValue(PlayerFields.FieldBytes, PlayerFieldOffsets.FieldBytesOffsetActionBarToggles, result.Read<byte>(68));
m_fishingSteps = result.Read<byte>(71); m_fishingSteps = result.Read<byte>(72);
InitDisplayIds(); InitDisplayIds();
@@ -2442,20 +2443,20 @@ namespace Game.Entities
InitPrimaryProfessions(); // to max set before any spell loaded InitPrimaryProfessions(); // to max set before any spell loaded
// init saved position, and fix it later if problematic // init saved position, and fix it later if problematic
ulong transLowGUID = result.Read<ulong>(40); ulong transLowGUID = result.Read<ulong>(41);
Relocate(result.Read<float>(21), result.Read<float>(22), result.Read<float>(23), result.Read<float>(25)); Relocate(result.Read<float>(22), result.Read<float>(23), result.Read<float>(24), result.Read<float>(26));
uint mapId = result.Read<uint>(24); uint mapId = result.Read<uint>(25);
uint instanceId = result.Read<uint>(62); uint instanceId = result.Read<uint>(63);
var RelocateToHomebind = new Action(() => { mapId = homebind.GetMapId(); instanceId = 0; Relocate(homebind); }); var RelocateToHomebind = new Action(() => { mapId = homebind.GetMapId(); instanceId = 0; Relocate(homebind); });
SetDungeonDifficultyID(CheckLoadedDungeonDifficultyID((Difficulty)result.Read<byte>(48))); SetDungeonDifficultyID(CheckLoadedDungeonDifficultyID((Difficulty)result.Read<byte>(49)));
SetRaidDifficultyID(CheckLoadedRaidDifficultyID((Difficulty)result.Read<byte>(69))); SetRaidDifficultyID(CheckLoadedRaidDifficultyID((Difficulty)result.Read<byte>(70)));
SetLegacyRaidDifficultyID(CheckLoadedLegacyRaidDifficultyID((Difficulty)result.Read<byte>(70))); SetLegacyRaidDifficultyID(CheckLoadedLegacyRaidDifficultyID((Difficulty)result.Read<byte>(71)));
string taxi_nodes = result.Read<string>(47); string taxi_nodes = result.Read<string>(48);
_LoadGroup(holder.GetResult(PlayerLoginQueryLoad.Group)); _LoadGroup(holder.GetResult(PlayerLoginQueryLoad.Group));
@@ -2479,9 +2480,9 @@ namespace Game.Entities
} }
_LoadCurrency(holder.GetResult(PlayerLoginQueryLoad.Currency)); _LoadCurrency(holder.GetResult(PlayerLoginQueryLoad.Currency));
SetUInt32Value(PlayerFields.LifetimeHonorableKills, result.Read<uint>(49)); SetUInt32Value(PlayerFields.LifetimeHonorableKills, result.Read<uint>(50));
SetUInt16Value(PlayerFields.Kills, 0, result.Read<ushort>(50)); SetUInt16Value(PlayerFields.Kills, PlayerFieldOffsets.FieldKillsOffsetTodayKills, result.Read<ushort>(51));
SetUInt16Value(PlayerFields.Kills, 1, result.Read<ushort>(51)); SetUInt16Value(PlayerFields.Kills, PlayerFieldOffsets.FieldKillsOffsetYesterdayKills, result.Read<ushort>(52));
_LoadBoundInstances(holder.GetResult(PlayerLoginQueryLoad.BoundInstances)); _LoadBoundInstances(holder.GetResult(PlayerLoginQueryLoad.BoundInstances));
_LoadInstanceTimeRestrictions(holder.GetResult(PlayerLoginQueryLoad.InstanceLockTimes)); _LoadInstanceTimeRestrictions(holder.GetResult(PlayerLoginQueryLoad.InstanceLockTimes));
@@ -2559,10 +2560,10 @@ namespace Game.Entities
if (transport) if (transport)
{ {
float x = result.Read<float>(36); float x = result.Read<float>(37);
float y = result.Read<float>(37); float y = result.Read<float>(38);
float z = result.Read<float>(38); float z = result.Read<float>(39);
float o = result.Read<float>(39); float o = result.Read<float>(40);
m_movementInfo.transport.pos = new Position(x, y, z, o); m_movementInfo.transport.pos = new Position(x, y, z, o);
transport.CalculatePassengerPosition(ref x, ref y, ref z, ref o); transport.CalculatePassengerPosition(ref x, ref y, ref z, ref o);
@@ -2757,7 +2758,7 @@ namespace Game.Entities
SaveRecallPosition(); SaveRecallPosition();
long now = Time.UnixTime; long now = Time.UnixTime;
long logoutTime = result.Read<int>(31); long logoutTime = result.Read<int>(32);
// since last logout (in seconds) // since last logout (in seconds)
uint time_diff = (uint)(now - logoutTime); uint time_diff = (uint)(now - logoutTime);
@@ -2770,32 +2771,32 @@ namespace Game.Entities
SetDrunkValue(newDrunkValue); SetDrunkValue(newDrunkValue);
m_cinematic = result.Read<byte>(27); m_cinematic = result.Read<byte>(28);
m_PlayedTimeTotal = result.Read<uint>(28); m_PlayedTimeTotal = result.Read<uint>(29);
m_PlayedTimeLevel = result.Read<uint>(29); m_PlayedTimeLevel = result.Read<uint>(30);
SetTalentResetCost(result.Read<uint>(33)); SetTalentResetCost(result.Read<uint>(34));
SetTalentResetTime(result.Read<uint>(34)); SetTalentResetTime(result.Read<uint>(35));
m_taxi.LoadTaxiMask(result.Read<string>(26)); // must be before InitTaxiNodesForLevel m_taxi.LoadTaxiMask(result.Read<string>(27)); // must be before InitTaxiNodesForLevel
PlayerExtraFlags extraflags = (PlayerExtraFlags)result.Read<uint>(41); PlayerExtraFlags extraflags = (PlayerExtraFlags)result.Read<uint>(42);
m_stableSlots = result.Read<byte>(42); m_stableSlots = result.Read<byte>(43);
if (m_stableSlots > 4) if (m_stableSlots > 4)
{ {
Log.outError(LogFilter.Player, "Player can have not more {0} stable slots, but have in DB {1}", 4, m_stableSlots); Log.outError(LogFilter.Player, "Player can have not more {0} stable slots, but have in DB {1}", 4, m_stableSlots);
m_stableSlots = 4; m_stableSlots = 4;
} }
atLoginFlags = (AtLoginFlags)result.Read<uint>(43); atLoginFlags = (AtLoginFlags)result.Read<uint>(44);
// Honor system // Honor system
// Update Honor kills data // Update Honor kills data
m_lastHonorUpdateTime = logoutTime; m_lastHonorUpdateTime = logoutTime;
UpdateHonorFields(); UpdateHonorFields();
m_deathExpireTime = result.Read<uint>(46); m_deathExpireTime = result.Read<uint>(47);
if (m_deathExpireTime > now + PlayerConst.MaxDeathCount * PlayerConst.DeathExpireStep) if (m_deathExpireTime > now + PlayerConst.MaxDeathCount * PlayerConst.DeathExpireStep)
m_deathExpireTime = now + PlayerConst.MaxDeathCount * PlayerConst.DeathExpireStep - 1; m_deathExpireTime = now + PlayerConst.MaxDeathCount * PlayerConst.DeathExpireStep - 1;
@@ -2826,19 +2827,19 @@ namespace Game.Entities
InitRunes(); InitRunes();
// rest bonus can only be calculated after InitStatsForLevel() // rest bonus can only be calculated after InitStatsForLevel()
_restMgr.LoadRestBonus(RestTypes.XP, (PlayerRestState)result.Read<byte>(18), result.Read<float>(30)); _restMgr.LoadRestBonus(RestTypes.XP, (PlayerRestState)result.Read<byte>(19), result.Read<float>(31));
// load skills after InitStatsForLevel because it triggering aura apply also // load skills after InitStatsForLevel because it triggering aura apply also
_LoadSkills(holder.GetResult(PlayerLoginQueryLoad.Skills)); _LoadSkills(holder.GetResult(PlayerLoginQueryLoad.Skills));
UpdateSkillsForLevel(); UpdateSkillsForLevel();
SetPrimarySpecialization(result.Read<uint>(35)); SetPrimarySpecialization(result.Read<uint>(36));
SetActiveTalentGroup(result.Read<byte>(63)); SetActiveTalentGroup(result.Read<byte>(64));
ChrSpecializationRecord primarySpec = CliDB.ChrSpecializationStorage.LookupByKey(GetPrimarySpecialization()); ChrSpecializationRecord primarySpec = CliDB.ChrSpecializationStorage.LookupByKey(GetPrimarySpecialization());
if (primarySpec == null || primarySpec.ClassID != (byte)GetClass() || GetActiveTalentGroup() >= PlayerConst.MaxSpecializations) if (primarySpec == null || primarySpec.ClassID != (byte)GetClass() || GetActiveTalentGroup() >= PlayerConst.MaxSpecializations)
ResetTalentSpecialization(); ResetTalentSpecialization();
uint lootSpecId = result.Read<byte>(64); uint lootSpecId = result.Read<byte>(65);
ChrSpecializationRecord chrSpec = CliDB.ChrSpecializationStorage.LookupByKey(lootSpecId); ChrSpecializationRecord chrSpec = CliDB.ChrSpecializationStorage.LookupByKey(lootSpecId);
if (chrSpec != null) if (chrSpec != null)
{ {
@@ -2900,7 +2901,7 @@ namespace Game.Entities
// check PLAYER_CHOSEN_TITLE compatibility with PLAYER__FIELD_KNOWN_TITLES // check PLAYER_CHOSEN_TITLE compatibility with PLAYER__FIELD_KNOWN_TITLES
// note: PLAYER__FIELD_KNOWN_TITLES updated at quest status loaded // note: PLAYER__FIELD_KNOWN_TITLES updated at quest status loaded
uint curTitle = result.Read<uint>(52); uint curTitle = result.Read<uint>(53);
if (curTitle != 0 && !HasTitle(curTitle)) if (curTitle != 0 && !HasTitle(curTitle))
curTitle = 0; curTitle = 0;
@@ -2923,7 +2924,7 @@ namespace Game.Entities
UpdateAllStats(); UpdateAllStats();
// restore remembered power/health values (but not more max values) // restore remembered power/health values (but not more max values)
uint savedHealth = result.Read<uint>(55); uint savedHealth = result.Read<uint>(56);
SetHealth(savedHealth > GetMaxHealth() ? GetMaxHealth() : savedHealth); SetHealth(savedHealth > GetMaxHealth() ? GetMaxHealth() : savedHealth);
int loadedPowers = 0; int loadedPowers = 0;
for (PowerType i = 0; i < PowerType.Max; ++i) for (PowerType i = 0; i < PowerType.Max; ++i)
@@ -3014,7 +3015,7 @@ namespace Game.Entities
} }
// RaF stuff. // RaF stuff.
m_grantableLevels = result.Read<byte>(68); m_grantableLevels = result.Read<byte>(69);
if (GetSession().IsARecruiter() || (GetSession().GetRecruiterId() != 0)) if (GetSession().IsARecruiter() || (GetSession().GetRecruiterId() != 0))
SetFlag(ObjectFields.DynamicFlags, UnitDynFlags.ReferAFriend); SetFlag(ObjectFields.DynamicFlags, UnitDynFlags.ReferAFriend);
@@ -3036,9 +3037,9 @@ namespace Game.Entities
holder.GetResult(PlayerLoginQueryLoad.GarrisonFollowerAbilities))) holder.GetResult(PlayerLoginQueryLoad.GarrisonFollowerAbilities)))
_garrison = garrison; _garrison = garrison;
_InitHonorLevelOnLoadFromDB(result.Read<uint>(72), result.Read<uint>(73), result.Read<uint>(74)); _InitHonorLevelOnLoadFromDB(result.Read<uint>(73), result.Read<uint>(74), result.Read<uint>(75));
_restMgr.LoadRestBonus(RestTypes.Honor, (PlayerRestState)result.Read<byte>(75), result.Read<float>(76)); _restMgr.LoadRestBonus(RestTypes.Honor, (PlayerRestState)result.Read<byte>(76), result.Read<float>(77));
if (time_diff > 0) if (time_diff > 0)
{ {
//speed collect rest bonus in offline, in logout, far from tavern, city (section/in hour) //speed collect rest bonus in offline, in logout, far from tavern, city (section/in hour)
@@ -3100,6 +3101,7 @@ namespace Game.Entities
stmt.AddValue(index++, GetByteValue(PlayerFields.Bytes2, PlayerFieldOffsets.Bytes2OffsetFacialStyle)); stmt.AddValue(index++, GetByteValue(PlayerFields.Bytes2, PlayerFieldOffsets.Bytes2OffsetFacialStyle));
for (int i = 0; i < PlayerConst.CustomDisplaySize; ++i) for (int i = 0; i < PlayerConst.CustomDisplaySize; ++i)
stmt.AddValue(index++, GetByteValue(PlayerFields.Bytes2, (byte)(PlayerFieldOffsets.Bytes2OffsetCustomDisplayOption + i))); stmt.AddValue(index++, GetByteValue(PlayerFields.Bytes2, (byte)(PlayerFieldOffsets.Bytes2OffsetCustomDisplayOption + i)));
stmt.AddValue(index++, GetInventorySlotCount());
stmt.AddValue(index++, GetBankBagSlotCount()); stmt.AddValue(index++, GetBankBagSlotCount());
stmt.AddValue(index++, (byte)GetUInt32Value(PlayerFields.RestInfo + PlayerFieldOffsets.RestStateXp)); stmt.AddValue(index++, (byte)GetUInt32Value(PlayerFields.RestInfo + PlayerFieldOffsets.RestStateXp));
stmt.AddValue(index++, GetUInt32Value(PlayerFields.Flags)); stmt.AddValue(index++, GetUInt32Value(PlayerFields.Flags));
@@ -3211,6 +3213,7 @@ namespace Game.Entities
stmt.AddValue(index++, GetByteValue(PlayerFields.FieldBytes, PlayerFieldOffsets.FieldBytesOffsetActionBarToggles)); stmt.AddValue(index++, GetByteValue(PlayerFields.FieldBytes, PlayerFieldOffsets.FieldBytesOffsetActionBarToggles));
stmt.AddValue(index++, m_grantableLevels); stmt.AddValue(index++, m_grantableLevels);
stmt.AddValue(index++, Global.WorldMgr.GetRealm().Build);
} }
else else
{ {
@@ -3231,6 +3234,7 @@ namespace Game.Entities
for (int i = 0; i < PlayerConst.CustomDisplaySize; ++i) for (int i = 0; i < PlayerConst.CustomDisplaySize; ++i)
stmt.AddValue(index++, GetByteValue(PlayerFields.Bytes2, (byte)( stmt.AddValue(index++, GetByteValue(PlayerFields.Bytes2, (byte)(
PlayerFieldOffsets.Bytes2OffsetCustomDisplayOption + i))); PlayerFieldOffsets.Bytes2OffsetCustomDisplayOption + i)));
stmt.AddValue(index++, GetInventorySlotCount());
stmt.AddValue(index++, GetBankBagSlotCount()); stmt.AddValue(index++, GetBankBagSlotCount());
stmt.AddValue(index++, (byte)GetUInt32Value(PlayerFields.RestInfo + PlayerFieldOffsets.RestStateXp)); stmt.AddValue(index++, (byte)GetUInt32Value(PlayerFields.RestInfo + PlayerFieldOffsets.RestStateXp));
stmt.AddValue(index++, GetUInt32Value(PlayerFields.Flags)); stmt.AddValue(index++, GetUInt32Value(PlayerFields.Flags));
@@ -3365,6 +3369,7 @@ namespace Game.Entities
stmt.AddValue(index++, GetPrestigeLevel()); stmt.AddValue(index++, GetPrestigeLevel());
stmt.AddValue(index++, (byte)GetUInt32Value(PlayerFields.RestInfo + PlayerFieldOffsets.RestStateHonor)); stmt.AddValue(index++, (byte)GetUInt32Value(PlayerFields.RestInfo + PlayerFieldOffsets.RestStateHonor));
stmt.AddValue(index++, _restMgr.GetRestBonus(RestTypes.Honor)); stmt.AddValue(index++, _restMgr.GetRestBonus(RestTypes.Honor));
stmt.AddValue(index++, Global.WorldMgr.GetRealm().Build);
// Index // Index
stmt.AddValue(index, GetGUID().GetCounter()); stmt.AddValue(index, GetGUID().GetCounter());
+86 -23
View File
@@ -274,7 +274,8 @@ namespace Game.Entities
if (inventory) if (inventory)
{ {
for (byte i = InventorySlots.ItemStart; i < InventorySlots.ItemEnd; i++) int inventoryEnd = InventorySlots.ItemStart + GetInventorySlotCount();
for (byte i = InventorySlots.ItemStart; i < inventoryEnd; i++)
{ {
Item pItem = GetItemByPos(InventorySlots.Bag0, i); Item pItem = GetItemByPos(InventorySlots.Bag0, i);
if (pItem != null) if (pItem != null)
@@ -326,7 +327,8 @@ namespace Game.Entities
if (inventory) if (inventory)
{ {
for (byte i = InventorySlots.ItemStart; i < InventorySlots.ItemEnd; i++) int inventoryEnd = InventorySlots.ItemStart + GetInventorySlotCount();
for (byte i = InventorySlots.ItemStart; i < inventoryEnd; i++)
{ {
Item pItem = GetItemByPos(InventorySlots.Bag0, i); Item pItem = GetItemByPos(InventorySlots.Bag0, i);
if (pItem != null) if (pItem != null)
@@ -388,7 +390,8 @@ namespace Game.Entities
{ {
uint TotalCost = 0; uint TotalCost = 0;
// equipped, backpack, bags itself // equipped, backpack, bags itself
for (byte i = EquipmentSlot.Start; i < InventorySlots.ItemEnd; i++) int inventoryEnd = InventorySlots.ItemStart + GetInventorySlotCount();
for (byte i = EquipmentSlot.Start; i < inventoryEnd; i++)
TotalCost += DurabilityRepair((ushort)((InventorySlots.Bag0 << 8) | i), cost, discountMod, guildBank); TotalCost += DurabilityRepair((ushort)((InventorySlots.Bag0 << 8) | i), cost, discountMod, guildBank);
// items in inventory bags // items in inventory bags
@@ -556,6 +559,7 @@ namespace Game.Entities
} }
// not specific slot or have space for partly store only in specific slot // not specific slot or have space for partly store only in specific slot
byte inventoryEnd = (byte)(InventorySlots.ItemStart + GetInventorySlotCount());
// in specific bag // in specific bag
if (bag != ItemConst.NullBag) if (bag != ItemConst.NullBag)
@@ -597,7 +601,7 @@ namespace Game.Entities
return InventoryResult.ItemMaxCount; return InventoryResult.ItemMaxCount;
} }
res = CanStoreItem_InInventorySlots(InventorySlots.ItemStart, InventorySlots.ItemEnd, dest, pProto, ref count, true, pItem, bag, slot); res = CanStoreItem_InInventorySlots(InventorySlots.ItemStart, inventoryEnd, dest, pProto, ref count, true, pItem, bag, slot);
if (res != InventoryResult.Ok) if (res != InventoryResult.Ok)
{ {
no_space_count = count + no_similar_count; no_space_count = count + no_similar_count;
@@ -678,7 +682,7 @@ namespace Game.Entities
} }
} }
res = CanStoreItem_InInventorySlots(InventorySlots.ItemStart, InventorySlots.ItemEnd, dest, pProto, ref count, false, pItem, bag, slot); res = CanStoreItem_InInventorySlots(InventorySlots.ItemStart, inventoryEnd, dest, pProto, ref count, false, pItem, bag, slot);
if (res != InventoryResult.Ok) if (res != InventoryResult.Ok)
{ {
no_space_count = count + no_similar_count; no_space_count = count + no_similar_count;
@@ -754,7 +758,7 @@ namespace Game.Entities
return InventoryResult.ItemMaxCount; return InventoryResult.ItemMaxCount;
} }
res = CanStoreItem_InInventorySlots(InventorySlots.ItemStart, InventorySlots.ItemEnd, dest, pProto, ref count, true, pItem, bag, slot); res = CanStoreItem_InInventorySlots(InventorySlots.ItemStart, inventoryEnd, dest, pProto, ref count, true, pItem, bag, slot);
if (res != InventoryResult.Ok) if (res != InventoryResult.Ok)
{ {
no_space_count = count + no_similar_count; no_space_count = count + no_similar_count;
@@ -917,7 +921,8 @@ namespace Game.Entities
uint[] inventoryCounts = new uint[InventorySlots.ItemEnd - InventorySlots.ItemStart]; uint[] inventoryCounts = new uint[InventorySlots.ItemEnd - InventorySlots.ItemStart];
uint[][] bagCounts = new uint[InventorySlots.BagEnd - InventorySlots.BagStart][]; uint[][] bagCounts = new uint[InventorySlots.BagEnd - InventorySlots.BagStart][];
for (byte i = InventorySlots.ItemStart; i < InventorySlots.ItemEnd; i++) int inventoryEnd = InventorySlots.ItemStart + GetInventorySlotCount();
for (byte i = InventorySlots.ItemStart; i < inventoryEnd; i++)
{ {
item2 = GetItemByPos(InventorySlots.Bag0, i); item2 = GetItemByPos(InventorySlots.Bag0, i);
if (item2 && !item2.IsInTrade()) if (item2 && !item2.IsInTrade())
@@ -974,7 +979,7 @@ namespace Game.Entities
// search stack for merge to // search stack for merge to
if (pProto.GetMaxStackSize() != 1) if (pProto.GetMaxStackSize() != 1)
{ {
for (byte t = InventorySlots.ItemStart; t < InventorySlots.ItemEnd; ++t) for (byte t = InventorySlots.ItemStart; t < inventoryEnd; ++t)
{ {
item2 = GetItemByPos(InventorySlots.Bag0, t); item2 = GetItemByPos(InventorySlots.Bag0, t);
if (item2 && item2.CanBeMergedPartlyWith(pProto) == InventoryResult.Ok && inventoryCounts[t - InventorySlots.ItemStart] + item.GetCount() <= pProto.GetMaxStackSize()) if (item2 && item2.CanBeMergedPartlyWith(pProto) == InventoryResult.Ok && inventoryCounts[t - InventorySlots.ItemStart] + item.GetCount() <= pProto.GetMaxStackSize())
@@ -1043,7 +1048,7 @@ namespace Game.Entities
// search free slot // search free slot
b_found = false; b_found = false;
for (int t = InventorySlots.ItemStart; t < InventorySlots.ItemEnd; ++t) for (int t = InventorySlots.ItemStart; t < inventoryEnd; ++t)
{ {
if (inventoryCounts[t - InventorySlots.ItemStart] == 0) if (inventoryCounts[t - InventorySlots.ItemStart] == 0)
{ {
@@ -1538,7 +1543,8 @@ namespace Game.Entities
} }
} }
for (byte i = InventorySlots.ItemStart; i < InventorySlots.ItemEnd; ++i) int inventoryEnd = InventorySlots.ItemStart + GetInventorySlotCount();
for (byte i = InventorySlots.ItemStart; i < inventoryEnd; ++i)
{ {
Item pItem = GetItemByPos(InventorySlots.Bag0, i); Item pItem = GetItemByPos(InventorySlots.Bag0, i);
if (pItem != null) if (pItem != null)
@@ -2682,7 +2688,8 @@ namespace Game.Entities
} }
public Item GetItemByGuid(ObjectGuid guid) public Item GetItemByGuid(ObjectGuid guid)
{ {
for (byte i = EquipmentSlot.Start; i < InventorySlots.ItemEnd; ++i) int inventoryEnd = InventorySlots.ItemStart + GetInventorySlotCount();
for (byte i = EquipmentSlot.Start; i < inventoryEnd; ++i)
{ {
Item pItem = GetItemByPos(InventorySlots.Bag0, i); Item pItem = GetItemByPos(InventorySlots.Bag0, i);
if (pItem != null) if (pItem != null)
@@ -2744,7 +2751,8 @@ namespace Game.Entities
public uint GetItemCount(uint item, bool inBankAlso = false, Item skipItem = null) public uint GetItemCount(uint item, bool inBankAlso = false, Item skipItem = null)
{ {
uint count = 0; uint count = 0;
for (byte i = EquipmentSlot.Start; i < InventorySlots.ItemEnd; i++) int inventoryEnd = InventorySlots.ItemStart + GetInventorySlotCount();
for (byte i = EquipmentSlot.Start; i < inventoryEnd; i++)
{ {
Item pItem = GetItemByPos(InventorySlots.Bag0, i); Item pItem = GetItemByPos(InventorySlots.Bag0, i);
if (pItem != null) if (pItem != null)
@@ -2761,7 +2769,7 @@ namespace Game.Entities
if (skipItem != null && skipItem.GetTemplate().GetGemProperties() != 0) if (skipItem != null && skipItem.GetTemplate().GetGemProperties() != 0)
{ {
for (byte i = EquipmentSlot.Start; i < InventorySlots.ItemEnd; ++i) for (byte i = EquipmentSlot.Start; i < inventoryEnd; ++i)
{ {
Item pItem = GetItemByPos(InventorySlots.Bag0, i); Item pItem = GetItemByPos(InventorySlots.Bag0, i);
if (pItem != null) if (pItem != null)
@@ -2874,7 +2882,8 @@ namespace Game.Entities
public Item GetItemByEntry(uint entry) public Item GetItemByEntry(uint entry)
{ {
// in inventory // in inventory
for (byte i = InventorySlots.ItemStart; i < InventorySlots.ItemEnd; ++i) int inventoryEnd = InventorySlots.ItemStart + GetInventorySlotCount();
for (byte i = InventorySlots.ItemStart; i < inventoryEnd; ++i)
{ {
Item pItem = GetItemByPos(InventorySlots.Bag0, i); Item pItem = GetItemByPos(InventorySlots.Bag0, i);
if (pItem != null) if (pItem != null)
@@ -2919,7 +2928,8 @@ namespace Game.Entities
{ {
List<Item> itemList = new List<Item>(); List<Item> itemList = new List<Item>();
for (byte i = InventorySlots.ItemStart; i < InventorySlots.ItemEnd; ++i) int inventoryEnd = InventorySlots.ItemStart + GetInventorySlotCount();
for (byte i = InventorySlots.ItemStart; i < inventoryEnd; ++i)
{ {
Item item = GetItemByPos(InventorySlots.Bag0, i); Item item = GetItemByPos(InventorySlots.Bag0, i);
if (item != null) if (item != null)
@@ -2974,7 +2984,8 @@ namespace Game.Entities
public bool HasItemCount(uint item, uint count = 1, bool inBankAlso = false) public bool HasItemCount(uint item, uint count = 1, bool inBankAlso = false)
{ {
uint tempcount = 0; uint tempcount = 0;
for (byte i = EquipmentSlot.Start; i < InventorySlots.ItemEnd; i++) int inventoryEnd = InventorySlots.ItemStart + GetInventorySlotCount();
for (byte i = EquipmentSlot.Start; i < inventoryEnd; i++)
{ {
Item pItem = GetItemByPos(InventorySlots.Bag0, i); Item pItem = GetItemByPos(InventorySlots.Bag0, i);
if (pItem != null && pItem.GetEntry() == item && !pItem.IsInTrade()) if (pItem != null && pItem.GetEntry() == item && !pItem.IsInTrade())
@@ -3083,7 +3094,7 @@ namespace Game.Entities
return true; return true;
// backpack slots // backpack slots
if (slot >= InventorySlots.ItemStart && slot < InventorySlots.ItemEnd) if (slot >= InventorySlots.ItemStart && slot < InventorySlots.ItemStart + GetInventorySlotCount())
return true; return true;
// bank main slots // bank main slots
@@ -3115,7 +3126,8 @@ namespace Game.Entities
public Item GetChildItemByGuid(ObjectGuid guid) public Item GetChildItemByGuid(ObjectGuid guid)
{ {
for (byte i = EquipmentSlot.Start; i < InventorySlots.ItemEnd; ++i) int inventoryEnd = InventorySlots.ItemStart + GetInventorySlotCount();
for (byte i = EquipmentSlot.Start; i < inventoryEnd; ++i)
{ {
Item pItem = GetItemByPos(InventorySlots.Bag0, i); Item pItem = GetItemByPos(InventorySlots.Bag0, i);
if (pItem) if (pItem)
@@ -3136,7 +3148,8 @@ namespace Game.Entities
uint GetItemCountWithLimitCategory(uint limitCategory, Item skipItem) uint GetItemCountWithLimitCategory(uint limitCategory, Item skipItem)
{ {
uint count = 0; uint count = 0;
for (byte i = EquipmentSlot.Start; i < InventorySlots.ItemEnd; ++i) int inventoryEnd = InventorySlots.ItemStart + GetInventorySlotCount();
for (byte i = EquipmentSlot.Start; i < inventoryEnd; ++i)
{ {
Item pItem = GetItemByPos(InventorySlots.Bag0, i); Item pItem = GetItemByPos(InventorySlots.Bag0, i);
if (pItem) if (pItem)
@@ -3220,7 +3233,8 @@ namespace Game.Entities
Log.outDebug(LogFilter.Player, "STORAGE: DestroyConjuredItems"); Log.outDebug(LogFilter.Player, "STORAGE: DestroyConjuredItems");
// in inventory // in inventory
for (byte i = InventorySlots.ItemStart; i < InventorySlots.ItemEnd; i++) int inventoryEnd = InventorySlots.ItemStart + GetInventorySlotCount();
for (byte i = InventorySlots.ItemStart; i < inventoryEnd; i++)
{ {
Item pItem = GetItemByPos(InventorySlots.Bag0, i); Item pItem = GetItemByPos(InventorySlots.Bag0, i);
if (pItem) if (pItem)
@@ -3260,7 +3274,8 @@ namespace Game.Entities
Log.outDebug(LogFilter.Player, "STORAGE: DestroyZoneLimitedItem in map {0} and area {1}", GetMapId(), new_zone); Log.outDebug(LogFilter.Player, "STORAGE: DestroyZoneLimitedItem in map {0} and area {1}", GetMapId(), new_zone);
// in inventory // in inventory
for (byte i = InventorySlots.ItemStart; i < InventorySlots.ItemEnd; i++) int inventoryEnd = InventorySlots.ItemStart + GetInventorySlotCount();
for (byte i = InventorySlots.ItemStart; i < inventoryEnd; i++)
{ {
Item pItem = GetItemByPos(InventorySlots.Bag0, i); Item pItem = GetItemByPos(InventorySlots.Bag0, i);
if (pItem) if (pItem)
@@ -3873,7 +3888,8 @@ namespace Game.Entities
public bool HasItemTotemCategory(uint TotemCategory) public bool HasItemTotemCategory(uint TotemCategory)
{ {
for (byte i = EquipmentSlot.Start; i < EquipmentSlot.End; ++i) int inventoryEnd = InventorySlots.ItemStart + GetInventorySlotCount();
for (byte i = EquipmentSlot.Start; i < inventoryEnd; ++i)
{ {
Item item = GetUseableItemByPos(InventorySlots.Bag0, i); Item item = GetUseableItemByPos(InventorySlots.Bag0, i);
if (item && Global.DB2Mgr.IsTotemCategoryCompatibleWith(item.GetTemplate().GetTotemCategory(), TotemCategory)) if (item && Global.DB2Mgr.IsTotemCategoryCompatibleWith(item.GetTemplate().GetTotemCategory(), TotemCategory))
@@ -5701,7 +5717,8 @@ namespace Game.Entities
uint remcount = 0; uint remcount = 0;
// in inventory // in inventory
for (byte i = InventorySlots.ItemStart; i < InventorySlots.ItemEnd; ++i) int inventoryEnd = InventorySlots.ItemStart + GetInventorySlotCount();
for (byte i = InventorySlots.ItemStart; i < inventoryEnd; ++i)
{ {
Item item = GetItemByPos(InventorySlots.Bag0, i); Item item = GetItemByPos(InventorySlots.Bag0, i);
if (item != null) if (item != null)
@@ -5973,6 +5990,52 @@ namespace Game.Entities
} }
} }
public byte GetInventorySlotCount() { return GetByteValue(PlayerFields.Bytes2, PlayerFieldOffsets.FieldBytes2OffsetNumBackpackSlots); }
public void SetInventorySlotCount(byte slots)
{
//ASSERT(slots <= (INVENTORY_SLOT_ITEM_END - INVENTORY_SLOT_ITEM_START));
if (slots < GetInventorySlotCount())
{
List<Item> unstorableItems = new List<Item>();
for (byte slot = (byte)(InventorySlots.ItemStart + slots); slot < InventorySlots.ItemEnd; ++slot)
{
Item unstorableItem = GetItemByPos(InventorySlots.Bag0, slot);
if (unstorableItem)
unstorableItems.Add(unstorableItem);
}
if (!unstorableItems.Empty())
{
int fullBatches = unstorableItems.Count / SharedConst.MaxMailItems;
int remainder = unstorableItems.Count % SharedConst.MaxMailItems;
SQLTransaction trans = new SQLTransaction();
var sendItemsBatch = new Action<int, int>((batchNumber, batchSize) =>
{
MailDraft draft = new MailDraft(Global.ObjectMgr.GetCypherString(CypherStrings.NotEquippedItem), "There were problems with equipping item(s).");
for (int j = 0; j < batchSize; ++j)
draft.AddItem(unstorableItems[batchNumber * SharedConst.MaxMailItems + j]);
draft.SendMailTo(trans, this, new MailSender(this, MailStationery.Gm), MailCheckMask.Copied);
});
for (int batch = 0; batch < fullBatches; ++batch)
sendItemsBatch(batch, SharedConst.MaxMailItems);
if (remainder != 0)
sendItemsBatch(fullBatches, remainder);
DB.Characters.CommitTransaction(trans);
SendPacket(new CharacterInventoryOverflowWarning());
}
}
SetByteValue(PlayerFields.FieldBytes2, PlayerFieldOffsets.FieldBytes2OffsetNumBackpackSlots, slots);
}
public byte GetBankBagSlotCount() { return GetByteValue(PlayerFields.Bytes3, PlayerFieldOffsets.Bytes3OffsetBankBagSlots); } public byte GetBankBagSlotCount() { return GetByteValue(PlayerFields.Bytes3, PlayerFieldOffsets.Bytes3OffsetBankBagSlots); }
public void SetBankBagSlotCount(byte count) { SetByteValue(PlayerFields.Bytes3, PlayerFieldOffsets.Bytes3OffsetBankBagSlots, count); } public void SetBankBagSlotCount(byte count) { SetByteValue(PlayerFields.Bytes3, PlayerFieldOffsets.Bytes3OffsetBankBagSlots, count); }
+8 -2
View File
@@ -211,7 +211,13 @@ namespace Game.Entities
return false; return false;
} }
public int GetQuestLevel(Quest quest) { return quest != null && (quest.Level > 0) ? quest.Level : (int)getLevel(); } public uint GetQuestLevel(Quest quest)
{
if (quest == null)
return getLevel();
return (uint)(quest.Level > 0 ? quest.Level : Math.Min((int)getLevel(), quest.MaxScalingLevel));
}
public bool IsQuestRewarded(uint quest_id) public bool IsQuestRewarded(uint quest_id)
{ {
@@ -1372,7 +1378,7 @@ namespace Game.Entities
public bool SatisfyQuestRace(Quest qInfo, bool msg) public bool SatisfyQuestRace(Quest qInfo, bool msg)
{ {
int reqraces = qInfo.AllowableRaces; long reqraces = qInfo.AllowableRaces;
if (reqraces == -1) if (reqraces == -1)
return true; return true;
+17 -19
View File
@@ -224,33 +224,30 @@ namespace Game.Entities
return GetUInt16Value(PlayerFields.SkillLineTempBonus + field, offset); return GetUInt16Value(PlayerFields.SkillLineTempBonus + field, offset);
} }
public uint GetResurrectionSpellId() void InitializeSelfResurrectionSpells()
{ {
// search priceless resurrection possibilities ClearDynamicValue(PlayerDynamicFields.SelfResSpells);
uint prio = 0;
uint spell_id = 0; uint[] spells = new uint[3];
var dummyAuras = GetAuraEffectsByType(AuraType.Dummy); var dummyAuras = GetAuraEffectsByType(AuraType.Dummy);
foreach (var eff in dummyAuras) foreach (var auraEffect in dummyAuras)
{ {
// Soulstone Resurrection // prio: 3 (max, non death persistent) // Soulstone Resurrection // prio: 3 (max, non death persistent)
if (prio < 2 && eff.GetSpellInfo().SpellFamilyName == SpellFamilyNames.Warlock && eff.GetSpellInfo().SpellFamilyFlags[1].HasAnyFlag(0x1000000u)) if (auraEffect.GetSpellInfo().SpellFamilyName == SpellFamilyNames.Warlock && auraEffect.GetSpellInfo().SpellFamilyFlags[1].HasAnyFlag(0x1000000u))
{ spells[0] = 3026;
spell_id = 3026;
prio = 3;
}
// Twisting Nether // prio: 2 (max) // Twisting Nether // prio: 2 (max)
else if (eff.GetId() == 23701 && RandomHelper.randChance(10)) else if (auraEffect.GetId() == 23701 && RandomHelper.randChance(10))
{ spells[1] = 23700;
prio = 2;
spell_id = 23700;
}
} }
// Reincarnation (passive spell) // prio: 1 // Reincarnation (passive spell) // prio: 1
if (prio < 1 && HasSpell(20608) && !GetSpellHistory().HasCooldown(21169)) if (HasSpell(20608) && !GetSpellHistory().HasCooldown(21169))
spell_id = 21169; spells[2] = 21169;
return spell_id; foreach (uint selfResSpell in spells)
if (selfResSpell != 0)
AddDynamicValue(PlayerDynamicFields.SelfResSpells, selfResSpell);
} }
public void PetSpellInitialize() public void PetSpellInitialize()
@@ -1027,7 +1024,8 @@ namespace Game.Entities
// remove enchants from inventory items // remove enchants from inventory items
// NOTE: no need to remove these from stats, since these aren't equipped // NOTE: no need to remove these from stats, since these aren't equipped
// in inventory // in inventory
for (byte i = InventorySlots.ItemStart; i < InventorySlots.ItemEnd; ++i) int inventoryEnd = InventorySlots.ItemStart + GetInventorySlotCount();
for (byte i = InventorySlots.ItemStart; i < inventoryEnd; ++i)
{ {
Item pItem = GetItemByPos(InventorySlots.Bag0, i); Item pItem = GetItemByPos(InventorySlots.Bag0, i);
if (pItem) if (pItem)
+19 -23
View File
@@ -231,6 +231,7 @@ namespace Game.Entities
SetUInt32Value(PlayerFields.RestInfo + PlayerFieldOffsets.RestStateHonor, (uint)PlayerRestState.NotRAFLinked); SetUInt32Value(PlayerFields.RestInfo + PlayerFieldOffsets.RestStateHonor, (uint)PlayerRestState.NotRAFLinked);
SetByteValue(PlayerFields.Bytes3, PlayerFieldOffsets.Bytes3OffsetGender, (byte)createInfo.Sex); SetByteValue(PlayerFields.Bytes3, PlayerFieldOffsets.Bytes3OffsetGender, (byte)createInfo.Sex);
SetByteValue(PlayerFields.Bytes4, PlayerFieldOffsets.Bytes4OffsetArenaFaction, 0); SetByteValue(PlayerFields.Bytes4, PlayerFieldOffsets.Bytes4OffsetArenaFaction, 0);
SetInventorySlotCount(InventorySlots.DefaultSize);
SetGuidValue(ObjectFields.Data, ObjectGuid.Empty); SetGuidValue(ObjectFields.Data, ObjectGuid.Empty);
SetUInt32Value(PlayerFields.GuildRank, 0); SetUInt32Value(PlayerFields.GuildRank, 0);
@@ -409,7 +410,8 @@ namespace Game.Entities
// bags and main-hand weapon must equipped at this moment // bags and main-hand weapon must equipped at this moment
// now second pass for not equipped (offhand weapon/shield if it attempt equipped before main-hand weapon) // now second pass for not equipped (offhand weapon/shield if it attempt equipped before main-hand weapon)
for (var i = InventorySlots.ItemStart; i < InventorySlots.ItemEnd; i++) int inventoryEnd = InventorySlots.ItemStart + GetInventorySlotCount();
for (byte i = InventorySlots.ItemStart; i < inventoryEnd; i++)
{ {
Item pItem = GetItemByPos(InventorySlots.Bag0, i); Item pItem = GetItemByPos(InventorySlots.Bag0, i);
if (pItem != null) if (pItem != null)
@@ -744,13 +746,11 @@ namespace Game.Entities
public override void setDeathState(DeathState s) public override void setDeathState(DeathState s)
{ {
uint ressSpellId = 0; bool oldIsAlive = IsAlive();
bool cur = IsAlive();
if (s == DeathState.JustDied) if (s == DeathState.JustDied)
{ {
if (!cur) if (!oldIsAlive)
{ {
Log.outError(LogFilter.Player, "Player.setDeathState: Attempted to kill a dead player '{0}' ({1})", GetName(), GetGUID().ToString()); Log.outError(LogFilter.Player, "Player.setDeathState: Attempted to kill a dead player '{0}' ({1})", GetName(), GetGUID().ToString());
return; return;
@@ -766,12 +766,8 @@ namespace Game.Entities
//FIXME: is pet dismissed at dying or releasing spirit? if second, add setDeathState(DEAD) to HandleRepopRequestOpcode and define pet unsummon here with (s == DEAD) //FIXME: is pet dismissed at dying or releasing spirit? if second, add setDeathState(DEAD) to HandleRepopRequestOpcode and define pet unsummon here with (s == DEAD)
RemovePet(null, PetSaveMode.NotInSlot, true); RemovePet(null, PetSaveMode.NotInSlot, true);
// save value before aura remove in Unit::setDeathState InitializeSelfResurrectionSpells();
ressSpellId = GetUInt32Value(PlayerFields.SelfResSpell);
// passive spell
if (ressSpellId == 0)
ressSpellId = GetResurrectionSpellId();
UpdateCriteria(CriteriaTypes.DeathAtMap, 1); UpdateCriteria(CriteriaTypes.DeathAtMap, 1);
UpdateCriteria(CriteriaTypes.Death, 1); UpdateCriteria(CriteriaTypes.Death, 1);
UpdateCriteria(CriteriaTypes.DeathInDungeon, 1); UpdateCriteria(CriteriaTypes.DeathInDungeon, 1);
@@ -782,13 +778,9 @@ namespace Game.Entities
base.setDeathState(s); base.setDeathState(s);
// restore resurrection spell id for player after aura remove if (IsAlive() && !oldIsAlive)
if (s == DeathState.JustDied && cur && ressSpellId != 0)
SetUInt32Value(PlayerFields.SelfResSpell, ressSpellId);
if (IsAlive() && !cur)
//clear aura case after resurrection by another way (spells will be applied before next death) //clear aura case after resurrection by another way (spells will be applied before next death)
SetUInt32Value(PlayerFields.SelfResSpell, 0); ClearDynamicValue(PlayerDynamicFields.SelfResSpells);
} }
public override void DestroyForPlayer(Player target) public override void DestroyForPlayer(Player target)
@@ -1667,15 +1659,15 @@ namespace Game.Entities
continue; continue;
if (quest.IsDaily()) if (quest.IsDaily())
rep = CalculateReputationGain(ReputationSource.DailyQuest, (uint)GetQuestLevel(quest), rep, (int)quest.RewardFactionId[i], noQuestBonus); rep = CalculateReputationGain(ReputationSource.DailyQuest, GetQuestLevel(quest), rep, (int)quest.RewardFactionId[i], noQuestBonus);
else if (quest.IsWeekly()) else if (quest.IsWeekly())
rep = CalculateReputationGain(ReputationSource.WeeklyQuest, (uint)GetQuestLevel(quest), rep, (int)quest.RewardFactionId[i], noQuestBonus); rep = CalculateReputationGain(ReputationSource.WeeklyQuest, GetQuestLevel(quest), rep, (int)quest.RewardFactionId[i], noQuestBonus);
else if (quest.IsMonthly()) else if (quest.IsMonthly())
rep = CalculateReputationGain(ReputationSource.MonthlyQuest, (uint)GetQuestLevel(quest), rep, (int)quest.RewardFactionId[i], noQuestBonus); rep = CalculateReputationGain(ReputationSource.MonthlyQuest, GetQuestLevel(quest), rep, (int)quest.RewardFactionId[i], noQuestBonus);
else if (quest.IsRepeatable()) else if (quest.IsRepeatable())
rep = CalculateReputationGain(ReputationSource.RepeatableQuest, (uint)GetQuestLevel(quest), rep, (int)quest.RewardFactionId[i], noQuestBonus); rep = CalculateReputationGain(ReputationSource.RepeatableQuest, GetQuestLevel(quest), rep, (int)quest.RewardFactionId[i], noQuestBonus);
else else
rep = CalculateReputationGain(ReputationSource.Quest, (uint)GetQuestLevel(quest), rep, (int)quest.RewardFactionId[i], noQuestBonus); rep = CalculateReputationGain(ReputationSource.Quest, GetQuestLevel(quest), rep, (int)quest.RewardFactionId[i], noQuestBonus);
bool noSpillover = Convert.ToBoolean(quest.RewardReputationMask & (1 << i)); bool noSpillover = Convert.ToBoolean(quest.RewardReputationMask & (1 << i));
GetReputationMgr().ModifyReputation(factionEntry, rep, noSpillover); GetReputationMgr().ModifyReputation(factionEntry, rep, noSpillover);
@@ -5003,11 +4995,13 @@ namespace Game.Entities
DisplayPlayerChoice displayPlayerChoice = new DisplayPlayerChoice(); DisplayPlayerChoice displayPlayerChoice = new DisplayPlayerChoice();
displayPlayerChoice.SenderGUID = sender; displayPlayerChoice.SenderGUID = sender;
displayPlayerChoice.ChoiceID = choiceId; displayPlayerChoice.ChoiceID = choiceId;
displayPlayerChoice.UiTextureKitID = playerChoice.UiTextureKitId;
displayPlayerChoice.Question = playerChoice.Question; displayPlayerChoice.Question = playerChoice.Question;
if (playerChoiceLocale != null) if (playerChoiceLocale != null)
ObjectManager.GetLocaleString(playerChoiceLocale.Question, locale, ref displayPlayerChoice.Question); ObjectManager.GetLocaleString(playerChoiceLocale.Question, locale, ref displayPlayerChoice.Question);
displayPlayerChoice.CloseChoiceFrame = false; displayPlayerChoice.CloseChoiceFrame = false;
displayPlayerChoice.HideWarboardHeader = playerChoice.HideWarboardHeader;
for (var i = 0; i < playerChoice.Responses.Count; ++i) for (var i = 0; i < playerChoice.Responses.Count; ++i)
{ {
@@ -5900,7 +5894,9 @@ namespace Game.Entities
RemoveByteFlag(UnitFields.Bytes2, UnitBytes2Offsets.PvpFlag, (UnitBytes2Flags.FFAPvp | UnitBytes2Flags.Sanctuary)); RemoveByteFlag(UnitFields.Bytes2, UnitBytes2Offsets.PvpFlag, (UnitBytes2Flags.FFAPvp | UnitBytes2Flags.Sanctuary));
// restore if need some important flags // restore if need some important flags
SetUInt32Value(PlayerFields.FieldBytes2, 0); // flags empty by default SetByteValue(PlayerFields.FieldBytes2, PlayerFieldOffsets.FieldBytes2OffsetIgnorePowerRegenPredictionMask, 0);
SetByteValue(PlayerFields.FieldBytes2, PlayerFieldOffsets.FieldBytes2OffsetAuraVision, 0);
SetByteValue(PlayerFields.FieldBytes2, 3, 0);
if (reapplyMods) // reapply stats values only on .reset stats (level) command if (reapplyMods) // reapply stats values only on .reset stats (level) command
_ApplyAllStatBonuses(); _ApplyAllStatBonuses();
@@ -6512,7 +6508,7 @@ namespace Game.Entities
packet.Reason = victim ? PlayerLogXPReason.Kill : PlayerLogXPReason.NoKill; packet.Reason = victim ? PlayerLogXPReason.Kill : PlayerLogXPReason.NoKill;
packet.Amount = (int)xp; packet.Amount = (int)xp;
packet.GroupBonus = group_rate; packet.GroupBonus = group_rate;
packet.ReferAFriend = recruitAFriend; packet.ReferAFriendBonusType = (byte)(recruitAFriend ? 1 : 0);
SendPacket(packet); SendPacket(packet);
uint curXP = GetUInt32Value(PlayerFields.Xp); uint curXP = GetUInt32Value(PlayerFields.Xp);
+3 -1
View File
@@ -673,8 +673,10 @@ namespace Game.Entities
z = nextFrame.Node.Loc.Z, z = nextFrame.Node.Loc.Z,
o = nextFrame.InitialOrientation; o = nextFrame.InitialOrientation;
foreach (var obj in _passengers) for (var i =0; i < _passengers.Count; ++i)
{ {
WorldObject obj = _passengers[i];
float destX, destY, destZ, destO; float destX, destY, destZ, destO;
obj.m_movementInfo.transport.pos.GetPosition(out destX, out destY, out destZ, out destO); obj.m_movementInfo.transport.pos.GetPosition(out destX, out destY, out destZ, out destO);
TransportPosHelper.CalculatePassengerPosition(ref destX, ref destY, ref destZ, ref destO, x, y, z, o); TransportPosHelper.CalculatePassengerPosition(ref destX, ref destY, ref destZ, ref destO, x, y, z, o);
+61 -43
View File
@@ -441,10 +441,10 @@ namespace Game
public void LoadRaceAndClassExpansionRequirements() public void LoadRaceAndClassExpansionRequirements()
{ {
uint oldMSTime = Time.GetMSTime(); uint oldMSTime = Time.GetMSTime();
_raceExpansionRequirementStorage.Clear(); _raceUnlockRequirementStorage.Clear();
// 0 1 // 0 1 2
SQLResult result = DB.World.Query("SELECT raceID, expansion FROM `race_expansion_requirement`"); SQLResult result = DB.World.Query("SELECT raceID, expansion, achievementId FROM `race_expansion_requirement`");
if (!result.IsEmpty()) if (!result.IsEmpty())
{ {
uint count = 0; uint count = 0;
@@ -452,21 +452,32 @@ namespace Game
{ {
byte raceID = result.Read<byte>(0); byte raceID = result.Read<byte>(0);
byte expansion = result.Read<byte>(1); byte expansion = result.Read<byte>(1);
uint achievementId = result.Read<uint>(2);
ChrRacesRecord raceEntry = CliDB.ChrRacesStorage.LookupByKey(raceID); ChrRacesRecord raceEntry = CliDB.ChrRacesStorage.LookupByKey(raceID);
if (raceEntry == null) if (raceEntry == null)
{ {
Log.outError(LogFilter.Sql, "Race {0} defined in `race_expansion_requirement` does not exists, skipped.", raceID); Log.outError(LogFilter.Sql, "Race {0} defined in `race_unlock_requirement` does not exists, skipped.", raceID);
continue; continue;
} }
if (expansion >= (int)Expansion.Max) if (expansion >= (int)Expansion.MaxAccountExpansions)
{ {
Log.outError(LogFilter.Sql, "Race {0} defined in `race_expansion_requirement` has incorrect expansion {1}, skipped.", raceID, expansion); Log.outError(LogFilter.Sql, "Race {0} defined in `race_unlock_requirement` has incorrect expansion {1}, skipped.", raceID, expansion);
continue; continue;
} }
_raceExpansionRequirementStorage[raceID] = expansion; if (achievementId != 0 && !CliDB.AchievementStorage.ContainsKey(achievementId))
{
Log.outError(LogFilter.Sql, $"Race {raceID} defined in `race_unlock_requirement` has incorrect achievement {achievementId}, skipped.");
continue;
}
RaceUnlockRequirement raceUnlockRequirement = new RaceUnlockRequirement();
raceUnlockRequirement.Expansion = expansion;
raceUnlockRequirement.AchievementId = achievementId;
_raceUnlockRequirementStorage[raceID] = raceUnlockRequirement;
++count; ++count;
} }
@@ -573,13 +584,8 @@ namespace Game
} }
return false; return false;
} }
public Dictionary<byte, byte> GetRaceExpansionRequirements() { return _raceExpansionRequirementStorage; } public Dictionary<byte, RaceUnlockRequirement> GetRaceUnlockRequirements() { return _raceUnlockRequirementStorage; }
public Expansion GetRaceExpansionRequirement(Race race) public RaceUnlockRequirement GetRaceUnlockRequirement(Race race) { return _raceUnlockRequirementStorage.LookupByKey((byte)race); }
{
if (_raceExpansionRequirementStorage.ContainsKey((byte)race))
return (Expansion)_raceExpansionRequirementStorage[(byte)race];
return Expansion.Classic;
}
public Dictionary<byte, byte> GetClassExpansionRequirements() { return _classExpansionRequirementStorage; } public Dictionary<byte, byte> GetClassExpansionRequirements() { return _classExpansionRequirementStorage; }
public Expansion GetClassExpansionRequirement(Class class_) public Expansion GetClassExpansionRequirement(Class class_)
{ {
@@ -4854,7 +4860,7 @@ namespace Game
if (id == -1) if (id == -1)
return equip[RandomHelper.IRand(0, equip.Count - 1)].Item2; return equip[RandomHelper.IRand(0, equip.Count - 1)].Item2;
else else
return equip.Find(p => p.Item1 == id).Item2; return equip.Find(p => p.Item1 == id)?.Item2;
} }
//Maps //Maps
@@ -6187,35 +6193,35 @@ namespace Game
_exclusiveQuestGroups.Clear(); _exclusiveQuestGroups.Clear();
SQLResult result = DB.World.Query("SELECT " + SQLResult result = DB.World.Query("SELECT " +
//0 1 2 3 4 5 6 7 8 9 10 //0 1 2 3 4 5 6 7 8 9 10 11
"ID, QuestType, QuestLevel, QuestPackageID, MinLevel, QuestSortID, QuestInfoID, SuggestedGroupNum, RewardNextQuest, RewardXPDifficulty, RewardXPMultiplier, " + "ID, QuestType, QuestLevel, MaxScalingLevel, QuestPackageID, MinLevel, QuestSortID, QuestInfoID, SuggestedGroupNum, RewardNextQuest, RewardXPDifficulty, RewardXPMultiplier, " +
//11 12 13 14 15 16 17 18 19 20 21 //12 13 14 15 16 17 18 19 20 21 22
"RewardMoney, RewardMoneyDifficulty, RewardMoneyMultiplier, RewardBonusMoney, RewardDisplaySpell1, RewardDisplaySpell2, RewardDisplaySpell3, RewardSpell, RewardHonor, RewardKillHonor, StartItem, " + "RewardMoney, RewardMoneyDifficulty, RewardMoneyMultiplier, RewardBonusMoney, RewardDisplaySpell1, RewardDisplaySpell2, RewardDisplaySpell3, RewardSpell, RewardHonor, RewardKillHonor, StartItem, " +
//22 23 24 25 26 //23 24 25 26 27
"RewardArtifactXPDifficulty, RewardArtifactXPMultiplier, RewardArtifactCategoryID, Flags, FlagsEx, " + "RewardArtifactXPDifficulty, RewardArtifactXPMultiplier, RewardArtifactCategoryID, Flags, FlagsEx, " +
//27 28 29 30 31 32 33 34 //28 29 30 31 32 33 34 35
"RewardItem1, RewardAmount1, ItemDrop1, ItemDropQuantity1, RewardItem2, RewardAmount2, ItemDrop2, ItemDropQuantity2, " + "RewardItem1, RewardAmount1, ItemDrop1, ItemDropQuantity1, RewardItem2, RewardAmount2, ItemDrop2, ItemDropQuantity2, " +
//35 36 37 38 39 40 41 42 //36 37 38 39 40 41 42 43
"RewardItem3, RewardAmount3, ItemDrop3, ItemDropQuantity3, RewardItem4, RewardAmount4, ItemDrop4, ItemDropQuantity4, " + "RewardItem3, RewardAmount3, ItemDrop3, ItemDropQuantity3, RewardItem4, RewardAmount4, ItemDrop4, ItemDropQuantity4, " +
//43 44 45 46 47 48 //44 45 46 47 48 49
"RewardChoiceItemID1, RewardChoiceItemQuantity1, RewardChoiceItemDisplayID1, RewardChoiceItemID2, RewardChoiceItemQuantity2, RewardChoiceItemDisplayID2, " + "RewardChoiceItemID1, RewardChoiceItemQuantity1, RewardChoiceItemDisplayID1, RewardChoiceItemID2, RewardChoiceItemQuantity2, RewardChoiceItemDisplayID2, " +
//49 50 51 52 53 54 //50 51 52 53 54 55
"RewardChoiceItemID3, RewardChoiceItemQuantity3, RewardChoiceItemDisplayID3, RewardChoiceItemID4, RewardChoiceItemQuantity4, RewardChoiceItemDisplayID4, " + "RewardChoiceItemID3, RewardChoiceItemQuantity3, RewardChoiceItemDisplayID3, RewardChoiceItemID4, RewardChoiceItemQuantity4, RewardChoiceItemDisplayID4, " +
//55 56 57 58 59 60 //56 57 58 59 60 61
"RewardChoiceItemID5, RewardChoiceItemQuantity5, RewardChoiceItemDisplayID5, RewardChoiceItemID6, RewardChoiceItemQuantity6, RewardChoiceItemDisplayID6, " + "RewardChoiceItemID5, RewardChoiceItemQuantity5, RewardChoiceItemDisplayID5, RewardChoiceItemID6, RewardChoiceItemQuantity6, RewardChoiceItemDisplayID6, " +
//61 62 63 64 65 66 67 68 69 70 //62 63 64 65 66 67 68 69 70 71
"POIContinent, POIx, POIy, POIPriority, RewardTitle, RewardArenaPoints, RewardSkillLineID, RewardNumSkillUps, PortraitGiver, PortraitTurnIn, " + "POIContinent, POIx, POIy, POIPriority, RewardTitle, RewardArenaPoints, RewardSkillLineID, RewardNumSkillUps, PortraitGiver, PortraitTurnIn, " +
//71 72 73 74 75 76 77 78 //72 73 74 75 76 77 78 79
"RewardFactionID1, RewardFactionValue1, RewardFactionOverride1, RewardFactionCapIn1, RewardFactionID2, RewardFactionValue2, RewardFactionOverride2, RewardFactionCapIn2, " + "RewardFactionID1, RewardFactionValue1, RewardFactionOverride1, RewardFactionCapIn1, RewardFactionID2, RewardFactionValue2, RewardFactionOverride2, RewardFactionCapIn2, " +
//79 80 81 82 83 84 85 86 //80 81 82 83 84 85 86 87
"RewardFactionID3, RewardFactionValue3, RewardFactionOverride3, RewardFactionCapIn3, RewardFactionID4, RewardFactionValue4, RewardFactionOverride4, RewardFactionCapIn4, " + "RewardFactionID3, RewardFactionValue3, RewardFactionOverride3, RewardFactionCapIn3, RewardFactionID4, RewardFactionValue4, RewardFactionOverride4, RewardFactionCapIn4, " +
//87 88 89 90 91 //88 89 90 91 92
"RewardFactionID5, RewardFactionValue5, RewardFactionOverride5, RewardFactionCapIn5, RewardFactionFlags, " + "RewardFactionID5, RewardFactionValue5, RewardFactionOverride5, RewardFactionCapIn5, RewardFactionFlags, " +
//92 93 94 95 96 97 98 99 //93 94 95 96 97 98 99 100
"RewardCurrencyID1, RewardCurrencyQty1, RewardCurrencyID2, RewardCurrencyQty2, RewardCurrencyID3, RewardCurrencyQty3, RewardCurrencyID4, RewardCurrencyQty4, " + "RewardCurrencyID1, RewardCurrencyQty1, RewardCurrencyID2, RewardCurrencyQty2, RewardCurrencyID3, RewardCurrencyQty3, RewardCurrencyID4, RewardCurrencyQty4, " +
//100 101 102 103 104 105 106 //101 102 103 104 105 106 107
"AcceptedSoundKitID, CompleteSoundKitID, AreaGroupID, TimeAllowed, AllowableRaces, QuestRewardID, Expansion, " + "AcceptedSoundKitID, CompleteSoundKitID, AreaGroupID, TimeAllowed, AllowableRaces, QuestRewardID, Expansion, " +
//107 108 109 110 111 112 113 114 115 //108 109 110 111 112 113 114 115 116
"LogTitle, LogDescription, QuestDescription, AreaDescription, PortraitGiverText, PortraitGiverName, PortraitTurnInText, PortraitTurnInName, QuestCompletionLog" + "LogTitle, LogDescription, QuestDescription, AreaDescription, PortraitGiverText, PortraitGiverName, PortraitTurnInText, PortraitTurnInName, QuestCompletionLog" +
" FROM quest_template"); " FROM quest_template");
@@ -6506,7 +6512,7 @@ namespace Game
// AllowableRaces, can be -1/RACEMASK_ALL_PLAYABLE to allow any race // AllowableRaces, can be -1/RACEMASK_ALL_PLAYABLE to allow any race
if (qinfo.AllowableRaces != -1) if (qinfo.AllowableRaces != -1)
{ {
if (!Convert.ToBoolean(qinfo.AllowableRaces & (uint)Race.RaceMaskAllPlayable)) if (qinfo.AllowableRaces > 0 && !Convert.ToBoolean(qinfo.AllowableRaces & (long)Race.RaceMaskAllPlayable))
{ {
Log.outError(LogFilter.Sql, "Quest {0} does not contain any playable races in `RequiredRaces` ({1}), value set to 0 (all races).", qinfo.Id, qinfo.AllowableRaces); Log.outError(LogFilter.Sql, "Quest {0} does not contain any playable races in `RequiredRaces` ({1}), value set to 0 (all races).", qinfo.Id, qinfo.AllowableRaces);
qinfo.AllowableRaces = -1; qinfo.AllowableRaces = -1;
@@ -7137,8 +7143,8 @@ namespace Game
uint count = 0; uint count = 0;
// 0 1 2 3 4 5 6 7 8 9 10 11 12 13 // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
SQLResult result = DB.World.Query("SELECT QuestID, BlobIndex, Idx1, ObjectiveIndex, QuestObjectiveID, QuestObjectID, MapID, WorldMapAreaId, Floor, Priority, Flags, WorldEffectID, PlayerConditionID, WoDUnk1 FROM quest_poi order by QuestID, Idx1"); SQLResult result = DB.World.Query("SELECT QuestID, BlobIndex, Idx1, ObjectiveIndex, QuestObjectiveID, QuestObjectID, MapID, WorldMapAreaId, Floor, Priority, Flags, WorldEffectID, PlayerConditionID, WoDUnk1, AlwaysAllowMergingBlobs FROM quest_poi order by QuestID, Idx1");
if (result.IsEmpty()) if (result.IsEmpty())
{ {
Log.outError(LogFilter.ServerLoading, "Loaded 0 quest POI definitions. DB table `quest_poi` is empty."); Log.outError(LogFilter.ServerLoading, "Loaded 0 quest POI definitions. DB table `quest_poi` is empty.");
@@ -7182,11 +7188,12 @@ namespace Game
int WorldEffectID = result.Read<int>(11); int WorldEffectID = result.Read<int>(11);
int PlayerConditionID = result.Read<int>(12); int PlayerConditionID = result.Read<int>(12);
int WoDUnk1 = result.Read<int>(13); int WoDUnk1 = result.Read<int>(13);
bool AlwaysAllowMergingBlobs = result.Read<bool>(14);
if (Global.ObjectMgr.GetQuestTemplate(QuestID) == null) if (Global.ObjectMgr.GetQuestTemplate(QuestID) == null)
Log.outError(LogFilter.Sql, "`quest_poi` quest id ({0}) Idx1 ({1}) does not exist in `quest_template`", QuestID, Idx1); Log.outError(LogFilter.Sql, "`quest_poi` quest id ({0}) Idx1 ({1}) does not exist in `quest_template`", QuestID, Idx1);
QuestPOI POI = new QuestPOI(BlobIndex, ObjectiveIndex, QuestObjectiveID, QuestObjectID, MapID, WorldMapAreaId, Floor, Priority, Flags, WorldEffectID, PlayerConditionID, WoDUnk1); QuestPOI POI = new QuestPOI(BlobIndex, ObjectiveIndex, QuestObjectiveID, QuestObjectID, MapID, WorldMapAreaId, Floor, Priority, Flags, WorldEffectID, PlayerConditionID, WoDUnk1, AlwaysAllowMergingBlobs);
if (!POIs.ContainsKey(QuestID) || !POIs[QuestID].ContainsKey(Idx1)) if (!POIs.ContainsKey(QuestID) || !POIs[QuestID].ContainsKey(Idx1))
{ {
Log.outError(LogFilter.Sql, "Table quest_poi references unknown quest points for quest {0} POI id {1}", QuestID, BlobIndex); Log.outError(LogFilter.Sql, "Table quest_poi references unknown quest points for quest {0} POI id {1}", QuestID, BlobIndex);
@@ -8640,7 +8647,7 @@ namespace Game
uint oldMSTime = Time.GetMSTime(); uint oldMSTime = Time.GetMSTime();
_playerChoices.Clear(); _playerChoices.Clear();
SQLResult choiceResult = DB.World.Query("SELECT ChoiceId, Question FROM playerchoice"); SQLResult choiceResult = DB.World.Query("SELECT ChoiceId, UiTextureKitId, Question, HideWarboardHeader FROM playerchoice");
if (choiceResult.IsEmpty()) if (choiceResult.IsEmpty())
{ {
Log.outInfo(LogFilter.ServerLoading, "Loaded 0 player choices. DB table `playerchoice` is empty."); Log.outInfo(LogFilter.ServerLoading, "Loaded 0 player choices. DB table `playerchoice` is empty.");
@@ -8655,12 +8662,13 @@ namespace Game
do do
{ {
int choiceId = choiceResult.Read<int>(0);
PlayerChoice choice = new PlayerChoice(); PlayerChoice choice = new PlayerChoice();
choice.ChoiceId = choiceId; choice.ChoiceId = choiceResult.Read<int>(0);
choice.Question = choiceResult.Read<string>(1); choice.UiTextureKitId = choiceResult.Read<int>(1);
_playerChoices[choiceId] = choice; choice.Question = choiceResult.Read<string>(2);
choice.HideWarboardHeader = choiceResult.Read<bool>(3);
_playerChoices[choice.ChoiceId] = choice;
} while (choiceResult.NextRow()); } while (choiceResult.NextRow());
@@ -9466,7 +9474,7 @@ namespace Game
List<string> _reservedNamesStorage = new List<string>(); List<string> _reservedNamesStorage = new List<string>();
Dictionary<uint, SceneTemplate> _sceneTemplateStorage = new Dictionary<uint, SceneTemplate>(); Dictionary<uint, SceneTemplate> _sceneTemplateStorage = new Dictionary<uint, SceneTemplate>();
Dictionary<byte, byte> _raceExpansionRequirementStorage = new Dictionary<byte, byte>(); Dictionary<byte, RaceUnlockRequirement> _raceUnlockRequirementStorage = new Dictionary<byte, RaceUnlockRequirement>();
Dictionary<byte, byte> _classExpansionRequirementStorage = new Dictionary<byte, byte>(); Dictionary<byte, byte> _classExpansionRequirementStorage = new Dictionary<byte, byte>();
Dictionary<uint, string> _realmNameStorage = new Dictionary<uint, string>(); Dictionary<uint, string> _realmNameStorage = new Dictionary<uint, string>();
@@ -9963,7 +9971,7 @@ namespace Game
public class QuestPOI public class QuestPOI
{ {
public QuestPOI(int _BlobIndex, int _ObjectiveIndex, int _QuestObjectiveID, int _QuestObjectID, int _MapID, int _WorldMapAreaID, int _Foor, int _Priority, int _Flags, public QuestPOI(int _BlobIndex, int _ObjectiveIndex, int _QuestObjectiveID, int _QuestObjectID, int _MapID, int _WorldMapAreaID, int _Foor, int _Priority, int _Flags,
int _WorldEffectID, int _PlayerConditionID, int _UnkWoD1) int _WorldEffectID, int _PlayerConditionID, int _UnkWoD1, bool _AlwaysAllowMergingBlobs)
{ {
BlobIndex = _BlobIndex; BlobIndex = _BlobIndex;
ObjectiveIndex = _ObjectiveIndex; ObjectiveIndex = _ObjectiveIndex;
@@ -9977,6 +9985,7 @@ namespace Game
WorldEffectID = _WorldEffectID; WorldEffectID = _WorldEffectID;
PlayerConditionID = _PlayerConditionID; PlayerConditionID = _PlayerConditionID;
UnkWoD1 = _UnkWoD1; UnkWoD1 = _UnkWoD1;
AlwaysAllowMergingBlobs = _AlwaysAllowMergingBlobs;
} }
public int BlobIndex; public int BlobIndex;
@@ -9992,6 +10001,7 @@ namespace Game
public int PlayerConditionID; public int PlayerConditionID;
public int UnkWoD1; public int UnkWoD1;
public List<QuestPOIPoint> points = new List<QuestPOIPoint>(); public List<QuestPOIPoint> points = new List<QuestPOIPoint>();
public bool AlwaysAllowMergingBlobs;
} }
public class QuestPOIPoint public class QuestPOIPoint
@@ -10425,7 +10435,15 @@ namespace Game
} }
public int ChoiceId; public int ChoiceId;
public int UiTextureKitId;
public string Question; public string Question;
public List<PlayerChoiceResponse> Responses = new List<PlayerChoiceResponse>(); public List<PlayerChoiceResponse> Responses = new List<PlayerChoiceResponse>();
public bool HideWarboardHeader;
}
public class RaceUnlockRequirement
{
public byte Expansion;
public uint AchievementId;
} }
} }
+2 -2
View File
@@ -462,7 +462,7 @@ namespace Game
reward.ItemID = result.Read<uint>(0); reward.ItemID = result.Read<uint>(0);
reward.MinGuildRep = result.Read<byte>(1); reward.MinGuildRep = result.Read<byte>(1);
reward.RaceMask = result.Read<int>(2); reward.RaceMask = result.Read<ulong>(2);
reward.Cost = result.Read<ulong>(3); reward.Cost = result.Read<ulong>(3);
if (Global.ObjectMgr.GetItemTemplate(reward.ItemID) == null) if (Global.ObjectMgr.GetItemTemplate(reward.ItemID) == null)
@@ -524,7 +524,7 @@ namespace Game
{ {
public uint ItemID; public uint ItemID;
public byte MinGuildRep; public byte MinGuildRep;
public int RaceMask; public ulong RaceMask;
public ulong Cost; public ulong Cost;
public List<uint> AchievementsRequired = new List<uint>(); public List<uint> AchievementsRequired = new List<uint>();
} }
@@ -32,7 +32,7 @@ namespace Game
response.SuccessInfo.HasValue = true; response.SuccessInfo.HasValue = true;
response.SuccessInfo.Value = new AuthResponse.AuthSuccessInfo(); response.SuccessInfo.Value = new AuthResponse.AuthSuccessInfo();
response.SuccessInfo.Value.AccountExpansionLevel = (byte)GetExpansion(); response.SuccessInfo.Value.AccountExpansionLevel = (byte)GetAccountExpansion();
response.SuccessInfo.Value.ActiveExpansionLevel = (byte)GetExpansion(); response.SuccessInfo.Value.ActiveExpansionLevel = (byte)GetExpansion();
response.SuccessInfo.Value.VirtualRealmAddress = Global.WorldMgr.GetVirtualRealmAddress(); response.SuccessInfo.Value.VirtualRealmAddress = Global.WorldMgr.GetVirtualRealmAddress();
response.SuccessInfo.Value.Time = (uint)Time.UnixTime; response.SuccessInfo.Value.Time = (uint)Time.UnixTime;
@@ -47,7 +47,6 @@ namespace Game
response.SuccessInfo.Value.Templates.Add(templ); response.SuccessInfo.Value.Templates.Add(templ);
response.SuccessInfo.Value.AvailableClasses = Global.ObjectMgr.GetClassExpansionRequirements(); response.SuccessInfo.Value.AvailableClasses = Global.ObjectMgr.GetClassExpansionRequirements();
response.SuccessInfo.Value.AvailableRaces = Global.ObjectMgr.GetRaceExpansionRequirements();
} }
if (queued) if (queued)
+33 -10
View File
@@ -108,15 +108,23 @@ namespace Game
else else
charResult.HasDemonHunterOnRealm = false; charResult.HasDemonHunterOnRealm = false;
if (charInfo.Level >= WorldConfig.GetIntValue(WorldCfg.CharacterCreatingMinLevelForDemonHunter) || canAlwaysCreateDemonHunter) charResult.MaxCharacterLevel = Math.Max(charResult.MaxCharacterLevel, charInfo.Level);
charResult.HasLevel70OnRealm = true;
charResult.Characters.Add(charInfo); charResult.Characters.Add(charInfo);
} }
while (result.NextRow()); while (result.NextRow());
} }
charResult.IsDemonHunterCreationAllowed = (!charResult.HasDemonHunterOnRealm && charResult.HasLevel70OnRealm) || canAlwaysCreateDemonHunter; charResult.IsDemonHunterCreationAllowed = GetAccountExpansion() >= Expansion.Legion || canAlwaysCreateDemonHunter;
charResult.IsAlliedRacesCreationAllowed = GetAccountExpansion() >= Expansion.BattleForAzeroth;
foreach (var requirement in Global.ObjectMgr.GetRaceUnlockRequirements())
{
EnumCharactersResult.RaceUnlock raceUnlock = new EnumCharactersResult.RaceUnlock();
raceUnlock.RaceID = requirement.Key;
raceUnlock.HasExpansion = (byte)GetAccountExpansion() >= requirement.Value.Expansion;
charResult.RaceUnlockData.Add(raceUnlock);
}
SendPacket(charResult); SendPacket(charResult);
} }
@@ -212,19 +220,34 @@ namespace Game
} }
// prevent character creating Expansion race without Expansion account // prevent character creating Expansion race without Expansion account
var raceExpansionRequirement = Global.ObjectMgr.GetRaceExpansionRequirement(charCreate.CreateInfo.RaceId); RaceUnlockRequirement raceExpansionRequirement = Global.ObjectMgr.GetRaceUnlockRequirement(charCreate.CreateInfo.RaceId);
if (raceExpansionRequirement > GetExpansion()) if (raceExpansionRequirement == null)
{ {
Log.outError(LogFilter.Network, "Expansion {0} account:[{1}] tried to Create character with expansion {2} race ({3})", GetExpansion(), GetAccountId(), raceExpansionRequirement, charCreate.CreateInfo.RaceId); Log.outError(LogFilter.Player, "Account {GetAccountId()} tried to create character with unavailable race {charCreate.CreateInfo.RaceId}");
SendCharCreate(ResponseCodes.AccountCreateFailed);
return;
}
if (raceExpansionRequirement.Expansion > (byte)GetAccountExpansion())
{
Log.outError(LogFilter.Player, $"Expansion {GetAccountExpansion()} account:[{GetAccountId()}] tried to Create character with expansion {raceExpansionRequirement.Expansion} race ({charCreate.CreateInfo.RaceId})");
SendCharCreate(ResponseCodes.CharCreateExpansion); SendCharCreate(ResponseCodes.CharCreateExpansion);
return; return;
} }
//if (raceExpansionRequirement->AchievementId && !)
//{
// TC_LOG_ERROR("entities.player.cheat", "Expansion %u account:[%d] tried to Create character without achievement %u race (%u)",
// GetAccountExpansion(), GetAccountId(), raceExpansionRequirement->AchievementId, charCreate.CreateInfo->Race);
// SendCharCreate(CHAR_CREATE_ALLIED_RACE_ACHIEVEMENT);
// return;
//}
// prevent character creating Expansion class without Expansion account // prevent character creating Expansion class without Expansion account
var classExpansionRequirement = Global.ObjectMgr.GetClassExpansionRequirement(charCreate.CreateInfo.ClassId); var classExpansionRequirement = Global.ObjectMgr.GetClassExpansionRequirement(charCreate.CreateInfo.ClassId);
if (classExpansionRequirement > GetExpansion()) if (classExpansionRequirement > GetAccountExpansion())
{ {
Log.outError(LogFilter.Network, "Expansion {0} account:[{1}] tried to Create character with expansion {2} class ({3})", GetExpansion(), GetAccountId(), classExpansionRequirement, charCreate.CreateInfo.ClassId); Log.outError(LogFilter.Network, $"Expansion {GetAccountExpansion()} account:[{GetAccountId()}] tried to Create character with expansion {classExpansionRequirement} class ({charCreate.CreateInfo.ClassId})");
SendCharCreate(ResponseCodes.CharCreateExpansionClass); SendCharCreate(ResponseCodes.CharCreateExpansionClass);
return; return;
} }
@@ -409,7 +432,7 @@ namespace Game
if (checkDemonHunterReqs && !hasDemonHunterReqLevel) if (checkDemonHunterReqs && !hasDemonHunterReqLevel)
{ {
SendCharCreate(ResponseCodes.CharCreateFailed); SendCharCreate(ResponseCodes.CharCreateLevelRequirementDemonHunter);
return; return;
} }
@@ -1818,7 +1841,7 @@ namespace Game
var questTemplates = Global.ObjectMgr.GetQuestTemplates(); var questTemplates = Global.ObjectMgr.GetQuestTemplates();
foreach (Quest quest in questTemplates.Values) foreach (Quest quest in questTemplates.Values)
{ {
uint newRaceMask = (uint)(newTeamId == TeamId.Alliance ? Race.RaceMaskAlliance : Race.RaceMaskHorde); long newRaceMask = (long)(newTeamId == TeamId.Alliance ? Race.RaceMaskAlliance : Race.RaceMaskHorde);
if (quest.AllowableRaces != -1 && !Convert.ToBoolean(quest.AllowableRaces & newRaceMask)) if (quest.AllowableRaces != -1 && !Convert.ToBoolean(quest.AllowableRaces & newRaceMask))
{ {
stmt = DB.Characters.GetPreparedStatement(CharStatements.UPD_CHAR_QUESTSTATUS_REWARDED_ACTIVE_BY_QUEST); stmt = DB.Characters.GetPreparedStatement(CharStatements.UPD_CHAR_QUESTSTATUS_REWARDED_ACTIVE_BY_QUEST);
+1
View File
@@ -396,6 +396,7 @@ namespace Game
questPOIBlobData.WorldEffectID = data.WorldEffectID; questPOIBlobData.WorldEffectID = data.WorldEffectID;
questPOIBlobData.PlayerConditionID = data.PlayerConditionID; questPOIBlobData.PlayerConditionID = data.PlayerConditionID;
questPOIBlobData.UnkWoD1 = data.UnkWoD1; questPOIBlobData.UnkWoD1 = data.UnkWoD1;
questPOIBlobData.AlwaysAllowMergingBlobs = data.AlwaysAllowMergingBlobs;
foreach (var point in data.points) foreach (var point in data.points)
questPOIBlobData.QuestPOIBlobPointStats.Add(new QuestPOIBlobPoint(point.X, point.Y)); questPOIBlobData.QuestPOIBlobPointStats.Add(new QuestPOIBlobPoint(point.X, point.Y));
+9 -8
View File
@@ -445,19 +445,20 @@ namespace Game
} }
[WorldPacketHandler(ClientOpcodes.SelfRes)] [WorldPacketHandler(ClientOpcodes.SelfRes)]
void HandleSelfRes(SelfRes packet) void HandleSelfRes(SelfRes selfRes)
{ {
if (_player.HasAuraType(AuraType.PreventResurrection)) if (_player.HasAuraType(AuraType.PreventResurrection))
return; // silent return, client should display error by itself and not send this opcode return; // silent return, client should display error by itself and not send this opcode
if (_player.GetUInt32Value(PlayerFields.SelfResSpell) != 0) var selfResSpells = _player.GetDynamicValues(PlayerDynamicFields.SelfResSpells);
{ if (!selfResSpells.Contains(selfRes.SpellId))
SpellInfo spellInfo = Global.SpellMgr.GetSpellInfo(_player.GetUInt32Value(PlayerFields.SelfResSpell)); return;
if (spellInfo != null)
_player.CastSpell(_player, spellInfo, false, null);
_player.SetUInt32Value(PlayerFields.SelfResSpell, 0); SpellInfo spellInfo = Global.SpellMgr.GetSpellInfo(selfRes.SpellId);
} if (spellInfo != null)
_player.CastSpell(_player, spellInfo, false, null);
_player.RemoveDynamicValue(PlayerDynamicFields.SelfResSpells, selfRes.SpellId);
} }
[WorldPacketHandler(ClientOpcodes.SpellClick)] [WorldPacketHandler(ClientOpcodes.SpellClick)]
+2 -1
View File
@@ -128,7 +128,8 @@ namespace Game
if (bag) if (bag)
freeBagSlots += bag.GetFreeSlots(); freeBagSlots += bag.GetFreeSlots();
} }
for (byte i = InventorySlots.ItemStart; i < InventorySlots.ItemEnd; i++) int inventoryEnd = InventorySlots.ItemStart + _player.GetInventorySlotCount();
for (byte i = InventorySlots.ItemStart; i < inventoryEnd; i++)
{ {
if (!player.GetItemByPos(InventorySlots.Bag0, i)) if (!player.GetItemByPos(InventorySlots.Bag0, i))
++freeBagSlots; ++freeBagSlots;
@@ -132,18 +132,11 @@ namespace Game.Network.Packets
_worldPacket.WriteUInt8(SuccessInfo.Value.ActiveExpansionLevel); _worldPacket.WriteUInt8(SuccessInfo.Value.ActiveExpansionLevel);
_worldPacket.WriteUInt8(SuccessInfo.Value.AccountExpansionLevel); _worldPacket.WriteUInt8(SuccessInfo.Value.AccountExpansionLevel);
_worldPacket.WriteUInt32(SuccessInfo.Value.TimeSecondsUntilPCKick); _worldPacket.WriteUInt32(SuccessInfo.Value.TimeSecondsUntilPCKick);
_worldPacket.WriteUInt32(SuccessInfo.Value.AvailableRaces.Count);
_worldPacket.WriteUInt32(SuccessInfo.Value.AvailableClasses.Count); _worldPacket.WriteUInt32(SuccessInfo.Value.AvailableClasses.Count);
_worldPacket.WriteUInt32(SuccessInfo.Value.Templates.Count); _worldPacket.WriteUInt32(SuccessInfo.Value.Templates.Count);
_worldPacket.WriteUInt32(SuccessInfo.Value.CurrencyID); _worldPacket.WriteUInt32(SuccessInfo.Value.CurrencyID);
_worldPacket.WriteUInt32(SuccessInfo.Value.Time); _worldPacket.WriteUInt32(SuccessInfo.Value.Time);
foreach (var race in SuccessInfo.Value.AvailableRaces)
{
_worldPacket.WriteUInt8(race.Key); /// the current race
_worldPacket.WriteUInt8(race.Value); /// the required Expansion
}
foreach (var klass in SuccessInfo.Value.AvailableClasses) foreach (var klass in SuccessInfo.Value.AvailableClasses)
{ {
_worldPacket.WriteUInt8(klass.Key); /// the current class _worldPacket.WriteUInt8(klass.Key); /// the current class
@@ -219,7 +212,6 @@ namespace Game.Network.Packets
public List<CharacterTemplate> Templates = new List<CharacterTemplate>(); // list of pre-made character templates. @todo implement public List<CharacterTemplate> Templates = new List<CharacterTemplate>(); // list of pre-made character templates. @todo implement
public Dictionary<byte, byte> AvailableClasses; // the minimum AccountExpansion required to select the classes public Dictionary<byte, byte> AvailableClasses; // the minimum AccountExpansion required to select the classes
public Dictionary<byte, byte> AvailableRaces; // the minimum AccountExpansion required to select the races
public bool IsExpansionTrial; public bool IsExpansionTrial;
public bool ForceCharacterTemplate; // forces the client to always use a character template when creating a new character. @see Templates. @todo implement public bool ForceCharacterTemplate; // forces the client to always use a character template when creating a new character. @see Templates. @todo implement
+82 -65
View File
@@ -44,79 +44,35 @@ namespace Game.Network.Packets
_worldPacket.WriteBit(IsDeletedCharacters); _worldPacket.WriteBit(IsDeletedCharacters);
_worldPacket.WriteBit(IsDemonHunterCreationAllowed); _worldPacket.WriteBit(IsDemonHunterCreationAllowed);
_worldPacket.WriteBit(HasDemonHunterOnRealm); _worldPacket.WriteBit(HasDemonHunterOnRealm);
_worldPacket.WriteBit(HasLevel70OnRealm);
_worldPacket.WriteBit(Unknown7x); _worldPacket.WriteBit(Unknown7x);
_worldPacket.WriteBit(DisabledClassesMask.HasValue); _worldPacket.WriteBit(DisabledClassesMask.HasValue);
_worldPacket.WriteBit(IsAlliedRacesCreationAllowed);
_worldPacket.WriteUInt32(Characters.Count); _worldPacket.WriteUInt32(Characters.Count);
_worldPacket.WriteUInt32(FactionChangeRestrictions.Count); _worldPacket.WriteInt32(MaxCharacterLevel);
_worldPacket.WriteUInt32(RaceUnlockData.Count);
if (DisabledClassesMask.HasValue) if (DisabledClassesMask.HasValue)
_worldPacket.WriteUInt32(DisabledClassesMask.Value); _worldPacket.WriteUInt32(DisabledClassesMask.Value);
foreach (RestrictedFactionChangeRuleInfo rule in FactionChangeRestrictions)
{
_worldPacket.WriteUInt32(rule.Mask);
_worldPacket.WriteUInt8(rule.Race);
}
foreach (CharacterInfo charInfo in Characters) foreach (CharacterInfo charInfo in Characters)
{ charInfo.Write(_worldPacket);
_worldPacket.WritePackedGuid(charInfo.Guid);
_worldPacket.WriteUInt8(charInfo.ListPosition);
_worldPacket.WriteUInt8(charInfo.RaceId);
_worldPacket.WriteUInt8(charInfo.ClassId);
_worldPacket.WriteUInt8(charInfo.Sex);
_worldPacket.WriteUInt8(charInfo.Skin);
_worldPacket.WriteUInt8(charInfo.Face);
_worldPacket.WriteUInt8(charInfo.HairStyle);
_worldPacket.WriteUInt8(charInfo.HairColor);
_worldPacket.WriteUInt8(charInfo.FacialHair);
charInfo.CustomDisplay.ForEach(id => _worldPacket.WriteUInt8(id));
_worldPacket.WriteUInt8(charInfo.Level);
_worldPacket.WriteUInt32(charInfo.ZoneId);
_worldPacket.WriteUInt32(charInfo.MapId);
_worldPacket.WriteVector3(charInfo.PreLoadPosition);
_worldPacket.WritePackedGuid(charInfo.GuildGuid);
_worldPacket.WriteUInt32(charInfo.Flags);
_worldPacket.WriteUInt32(charInfo.CustomizationFlag);
_worldPacket.WriteUInt32(charInfo.Flags3);
_worldPacket.WriteUInt32(charInfo.Pet.CreatureDisplayId);
_worldPacket.WriteUInt32(charInfo.Pet.Level);
_worldPacket.WriteUInt32(charInfo.Pet.CreatureFamily);
_worldPacket.WriteUInt32(charInfo.ProfessionIds[0]); foreach (RaceUnlock raceUnlock in RaceUnlockData)
_worldPacket.WriteUInt32(charInfo.ProfessionIds[1]); raceUnlock.Write(_worldPacket);
foreach (var visualItem in charInfo.VisualItems)
{
_worldPacket.WriteUInt32(visualItem.DisplayId);
_worldPacket.WriteUInt32(visualItem.DisplayEnchantId);
_worldPacket.WriteUInt8(visualItem.InventoryType);
}
_worldPacket.WriteUInt32(charInfo.LastPlayedTime);
_worldPacket.WriteUInt16(charInfo.SpecID);
_worldPacket.WriteUInt32(charInfo.Unknown703);
_worldPacket.WriteUInt32(charInfo.Flags4);
_worldPacket.WriteBits(charInfo.Name.GetByteCount(), 6);
_worldPacket.WriteBit(charInfo.FirstLogin);
_worldPacket.WriteBit(charInfo.BoostInProgress);
_worldPacket.WriteBits(charInfo.unkWod61x, 5);
_worldPacket.WriteString(charInfo.Name);
}
} }
public bool Success; public bool Success;
public bool IsDeletedCharacters; // used for character undelete list public bool IsDeletedCharacters; // used for character undelete list
public bool IsDemonHunterCreationAllowed = false; ///< used for demon hunter early access public bool IsDemonHunterCreationAllowed = false; ///< used for demon hunter early access
public bool HasDemonHunterOnRealm = false; public bool HasDemonHunterOnRealm = false;
public bool HasLevel70OnRealm = false;
public bool Unknown7x = false; public bool Unknown7x = false;
public bool IsAlliedRacesCreationAllowed = false;
public int MaxCharacterLevel = 1;
public Optional<uint> DisabledClassesMask = new Optional<uint>(); public Optional<uint> DisabledClassesMask = new Optional<uint>();
public List<CharacterInfo> Characters = new List<CharacterInfo>(); // all characters on the list public List<CharacterInfo> Characters = new List<CharacterInfo>(); // all characters on the list
public List<RestrictedFactionChangeRuleInfo> FactionChangeRestrictions = new List<RestrictedFactionChangeRuleInfo>(); // @todo: research public List<RaceUnlock> RaceUnlockData = new List<RaceUnlock>(); ///<
public class CharacterInfo public class CharacterInfo
{ {
@@ -130,8 +86,8 @@ namespace Game.Network.Packets
// "characters.zone, characters.map, characters.position_x, characters.position_y, characters.position_z, " // "characters.zone, characters.map, characters.position_x, characters.position_y, characters.position_z, "
// 19 20 21 22 23 24 25 // 19 20 21 22 23 24 25
// "guild_member.guildid, characters.playerFlags, characters.at_login, character_pet.entry, character_pet.modelid, character_pet.level, characters.equipmentCache, " // "guild_member.guildid, characters.playerFlags, characters.at_login, character_pet.entry, character_pet.modelid, character_pet.level, characters.equipmentCache, "
// 26 27 28 29 30 // 26 27 28 29 30 31
// "character_banned.guid, characters.slot, characters.logout_time, characters.activeTalentGroup, character_declinedname.genitive" // "character_banned.guid, characters.slot, characters.logout_time, characters.activeTalentGroup, characters.lastLoginBuild, character_declinedname.genitive"
Guid = ObjectGuid.Create(HighGuid.Player, fields.Read<ulong>(0)); Guid = ObjectGuid.Create(HighGuid.Player, fields.Read<ulong>(0));
Name = fields.Read<string>(1); Name = fields.Read<string>(1);
@@ -176,7 +132,7 @@ namespace Game.Network.Packets
if (fields.Read<uint>(26) != 0) if (fields.Read<uint>(26) != 0)
Flags |= CharacterFlags.LockedByBilling; Flags |= CharacterFlags.LockedByBilling;
if (WorldConfig.GetBoolValue(WorldCfg.DeclinedNamesUsed) && !string.IsNullOrEmpty(fields.Read<string>(30))) if (WorldConfig.GetBoolValue(WorldCfg.DeclinedNamesUsed) && !string.IsNullOrEmpty(fields.Read<string>(31)))
Flags |= CharacterFlags.Declined; Flags |= CharacterFlags.Declined;
if (atLoginFlags.HasAnyFlag(AtLoginFlags.Customize)) if (atLoginFlags.HasAnyFlag(AtLoginFlags.Customize))
@@ -214,6 +170,8 @@ namespace Game.Network.Packets
if (spec != null) if (spec != null)
SpecID = (ushort)spec.Id; SpecID = (ushort)spec.Id;
LastLoginBuild = fields.Read<uint>(30);
for (byte slot = 0; slot < InventorySlots.BagEnd; ++slot) for (byte slot = 0; slot < InventorySlots.BagEnd; ++slot)
{ {
VisualItems[slot].InventoryType = (byte)equipment.NextUInt32(); VisualItems[slot].InventoryType = (byte)equipment.NextUInt32();
@@ -222,6 +180,53 @@ namespace Game.Network.Packets
} }
} }
public void Write(WorldPacket data)
{
data.WritePackedGuid(Guid);
data.WriteUInt8(ListPosition);
data.WriteUInt8(RaceId);
data.WriteUInt8(ClassId);
data.WriteUInt8(Sex);
data.WriteUInt8(Skin);
data.WriteUInt8(Face);
data.WriteUInt8(HairStyle);
data.WriteUInt8(HairColor);
data.WriteUInt8(FacialHair);
foreach (var display in CustomDisplay)
data.WriteUInt8(display);
data.WriteUInt8(Level);
data.WriteUInt32(ZoneId);
data.WriteUInt32(MapId);
data.WriteVector3(PreLoadPosition);
data.WritePackedGuid(GuildGuid);
data.WriteUInt32(Flags);
data.WriteUInt32(CustomizationFlag);
data.WriteUInt32(Flags3);
data.WriteUInt32(Pet.CreatureDisplayId);
data.WriteUInt32(Pet.Level);
data.WriteUInt32(Pet.CreatureFamily);
data.WriteUInt32(ProfessionIds[0]);
data.WriteUInt32(ProfessionIds[1]);
foreach (var visualItem in VisualItems)
visualItem.Write(data);
data.WriteUInt32(LastPlayedTime);
data.WriteUInt16(SpecID);
data.WriteUInt32(Unknown703);
data.WriteUInt32(Flags4);
data.WriteBits(Name.GetByteCount(), 6);
data.WriteBit(FirstLogin);
data.WriteBit(BoostInProgress);
data.WriteBits(unkWod61x, 5);
data.FlushBits();
data.WriteString(Name);
}
public ObjectGuid Guid; public ObjectGuid Guid;
public string Name; public string Name;
public byte ListPosition; // Order of the characters in list public byte ListPosition; // Order of the characters in list
@@ -248,6 +253,7 @@ namespace Game.Network.Packets
public uint LastPlayedTime; public uint LastPlayedTime;
public ushort SpecID; public ushort SpecID;
public uint Unknown703; public uint Unknown703;
public uint LastLoginBuild;
public PetInfo Pet = new PetInfo(); public PetInfo Pet = new PetInfo();
public bool BoostInProgress; // @todo public bool BoostInProgress; // @todo
public uint[] ProfessionIds = new uint[2]; // @todo public uint[] ProfessionIds = new uint[2]; // @todo
@@ -255,6 +261,13 @@ namespace Game.Network.Packets
public struct VisualItemInfo public struct VisualItemInfo
{ {
public void Write(WorldPacket data)
{
data.WriteUInt32(DisplayId);
data.WriteUInt32(DisplayEnchantId);
data.WriteUInt8(InventoryType);
}
public uint DisplayId; public uint DisplayId;
public uint DisplayEnchantId; public uint DisplayEnchantId;
public byte InventoryType; public byte InventoryType;
@@ -267,16 +280,21 @@ namespace Game.Network.Packets
} }
} }
public struct RestrictedFactionChangeRuleInfo public struct RaceUnlock
{ {
public RestrictedFactionChangeRuleInfo(uint mask, byte race) public void Write(WorldPacket data)
{ {
Mask = mask; data.WriteInt32(RaceID);
Race = race; data.WriteBit(HasExpansion);
data.WriteBit(HasAchievement);
data.WriteBit(HasHeritageArmor);
data.FlushBits();
} }
public uint Mask; public int RaceID;
public byte Race; public bool HasExpansion;
public bool HasAchievement;
public bool HasHeritageArmor;
} }
} }
@@ -832,8 +850,7 @@ namespace Game.Network.Packets
_worldPacket.WriteUInt8(Reason); _worldPacket.WriteUInt8(Reason);
_worldPacket.WriteInt32(Amount); _worldPacket.WriteInt32(Amount);
_worldPacket.WriteFloat(GroupBonus); _worldPacket.WriteFloat(GroupBonus);
_worldPacket.WriteBit(ReferAFriend); _worldPacket.WriteUInt8(ReferAFriendBonusType);
_worldPacket.FlushBits();
} }
public ObjectGuid Victim; public ObjectGuid Victim;
@@ -841,7 +858,7 @@ namespace Game.Network.Packets
public PlayerLogXPReason Reason; public PlayerLogXPReason Reason;
public int Amount; public int Amount;
public float GroupBonus; public float GroupBonus;
public bool ReferAFriend; public byte ReferAFriendBonusType; // 1 - 300% of normal XP; 2 - 150% of normal XP
} }
class TitleEarned : ServerPacket class TitleEarned : ServerPacket
+2 -2
View File
@@ -1467,7 +1467,7 @@ namespace Game.Network.Packets
data.WriteUInt32(ItemID); data.WriteUInt32(ItemID);
data.WriteUInt32(Unk4); data.WriteUInt32(Unk4);
data.WriteUInt32(AchievementsRequired.Count); data.WriteUInt32(AchievementsRequired.Count);
data.WriteUInt32(RaceMask); data.WriteUInt64(RaceMask);
data.WriteUInt32(MinGuildLevel); data.WriteUInt32(MinGuildLevel);
data.WriteUInt32(MinGuildRep); data.WriteUInt32(MinGuildRep);
data.WriteUInt64(Cost); data.WriteUInt64(Cost);
@@ -1479,7 +1479,7 @@ namespace Game.Network.Packets
public uint ItemID; public uint ItemID;
public uint Unk4; public uint Unk4;
public List<uint> AchievementsRequired = new List<uint>(); public List<uint> AchievementsRequired = new List<uint>();
public uint RaceMask; public ulong RaceMask;
public int MinGuildLevel; public int MinGuildLevel;
public int MinGuildRep; public int MinGuildRep;
public ulong Cost; public ulong Cost;
@@ -218,12 +218,15 @@ namespace Game.Network.Packets
_worldPacket.WriteUInt32(MaxInCombatResCount); _worldPacket.WriteUInt32(MaxInCombatResCount);
_worldPacket.WriteUInt32(CombatResChargeRecovery); _worldPacket.WriteUInt32(CombatResChargeRecovery);
_worldPacket.WriteUInt32(NextCombatResChargeTime); _worldPacket.WriteUInt32(NextCombatResChargeTime);
_worldPacket.WriteBit(InProgress);
_worldPacket.FlushBits();
} }
public uint InCombatResCount; // amount of usable battle ressurections public uint InCombatResCount; // amount of usable battle ressurections
public uint MaxInCombatResCount; public uint MaxInCombatResCount;
public uint CombatResChargeRecovery; public uint CombatResChargeRecovery;
public uint NextCombatResChargeTime; public uint NextCombatResChargeTime;
public bool InProgress = true;
} }
class InstanceEncounterEnd : ServerPacket class InstanceEncounterEnd : ServerPacket
@@ -703,6 +703,13 @@ namespace Game.Network.Packets
public ObjectGuid ItemGuid { get; set; } public ObjectGuid ItemGuid { get; set; }
} }
class CharacterInventoryOverflowWarning : ServerPacket
{
public CharacterInventoryOverflowWarning() : base(ServerOpcodes.CharacterInventoryOverflowWarning) { }
public override void Write() { }
}
//Structs //Structs
public class ItemBonusInstanceData public class ItemBonusInstanceData
{ {
@@ -76,6 +76,7 @@ namespace Game.Network.Packets
_worldPacket.WriteInt32(text.QuestID); _worldPacket.WriteInt32(text.QuestID);
_worldPacket.WriteInt32(text.QuestType); _worldPacket.WriteInt32(text.QuestType);
_worldPacket.WriteInt32(text.QuestLevel); _worldPacket.WriteInt32(text.QuestLevel);
_worldPacket.WriteInt32(text.QuestMaxScalingLevel);
_worldPacket.WriteInt32(text.QuestFlags); _worldPacket.WriteInt32(text.QuestFlags);
_worldPacket.WriteInt32(text.QuestFlagsEx); _worldPacket.WriteInt32(text.QuestFlagsEx);
@@ -308,6 +309,7 @@ namespace Game.Network.Packets
public int QuestID; public int QuestID;
public int QuestType; public int QuestType;
public int QuestLevel; public int QuestLevel;
public int QuestMaxScalingLevel;
public bool Repeatable; public bool Repeatable;
public string QuestTitle; public string QuestTitle;
public int QuestFlags; public int QuestFlags;
@@ -437,6 +437,9 @@ namespace Game.Network.Packets
_worldPacket.WriteInt32(questPOIBlobPoint.X); _worldPacket.WriteInt32(questPOIBlobPoint.X);
_worldPacket.WriteInt32(questPOIBlobPoint.Y); _worldPacket.WriteInt32(questPOIBlobPoint.Y);
} }
_worldPacket.WriteBit(questPOIBlobData.AlwaysAllowMergingBlobs);
_worldPacket.FlushBits();
} }
} }
} }
@@ -759,6 +762,7 @@ namespace Game.Network.Packets
public int PlayerConditionID; public int PlayerConditionID;
public int UnkWoD1; public int UnkWoD1;
public List<QuestPOIBlobPoint> QuestPOIBlobPointStats = new List<QuestPOIBlobPoint>(); public List<QuestPOIBlobPoint> QuestPOIBlobPointStats = new List<QuestPOIBlobPoint>();
public bool AlwaysAllowMergingBlobs;
} }
public class QuestPOIData public class QuestPOIData
+12 -3
View File
@@ -117,6 +117,7 @@ namespace Game.Network.Packets
_worldPacket.WriteInt32(Info.QuestID); _worldPacket.WriteInt32(Info.QuestID);
_worldPacket.WriteInt32(Info.QuestType); _worldPacket.WriteInt32(Info.QuestType);
_worldPacket.WriteInt32(Info.QuestLevel); _worldPacket.WriteInt32(Info.QuestLevel);
_worldPacket.WriteInt32(Info.QuestMaxScalingLevel);
_worldPacket.WriteInt32(Info.QuestPackageID); _worldPacket.WriteInt32(Info.QuestPackageID);
_worldPacket.WriteInt32(Info.QuestMinLevel); _worldPacket.WriteInt32(Info.QuestMinLevel);
_worldPacket.WriteInt32(Info.QuestSortID); _worldPacket.WriteInt32(Info.QuestSortID);
@@ -194,7 +195,7 @@ namespace Game.Network.Packets
_worldPacket.WriteInt32(Info.TimeAllowed); _worldPacket.WriteInt32(Info.TimeAllowed);
_worldPacket.WriteUInt32(Info.Objectives.Count); _worldPacket.WriteUInt32(Info.Objectives.Count);
_worldPacket.WriteInt32(Info.AllowableRaces); _worldPacket.WriteInt64(Info.AllowableRaces);
_worldPacket.WriteInt32(Info.QuestRewardID); _worldPacket.WriteInt32(Info.QuestRewardID);
_worldPacket.WriteInt32(Info.Expansion); _worldPacket.WriteInt32(Info.Expansion);
@@ -619,6 +620,7 @@ namespace Game.Network.Packets
_worldPacket.WriteUInt32(gossip.QuestID); _worldPacket.WriteUInt32(gossip.QuestID);
_worldPacket.WriteUInt32(gossip.QuestType); _worldPacket.WriteUInt32(gossip.QuestType);
_worldPacket.WriteUInt32(gossip.QuestLevel); _worldPacket.WriteUInt32(gossip.QuestLevel);
_worldPacket.WriteUInt32(gossip.QuestMaxScalingLevel);
_worldPacket.WriteUInt32(gossip.QuestFlags); _worldPacket.WriteUInt32(gossip.QuestFlags);
_worldPacket.WriteUInt32(gossip.QuestFlagsEx); _worldPacket.WriteUInt32(gossip.QuestFlagsEx);
@@ -827,8 +829,10 @@ namespace Game.Network.Packets
_worldPacket.WriteInt32(ChoiceID); _worldPacket.WriteInt32(ChoiceID);
_worldPacket.WriteUInt32(Responses.Count); _worldPacket.WriteUInt32(Responses.Count);
_worldPacket.WritePackedGuid(SenderGUID); _worldPacket.WritePackedGuid(SenderGUID);
_worldPacket.WriteInt32(UiTextureKitID);
_worldPacket.WriteBits(Question.GetByteCount(), 8); _worldPacket.WriteBits(Question.GetByteCount(), 8);
_worldPacket.WriteBit(CloseChoiceFrame); _worldPacket.WriteBit(CloseChoiceFrame);
_worldPacket.WriteBit(HideWarboardHeader);
_worldPacket.FlushBits(); _worldPacket.FlushBits();
foreach (PlayerChoiceResponse response in Responses) foreach (PlayerChoiceResponse response in Responses)
@@ -839,9 +843,11 @@ namespace Game.Network.Packets
public ObjectGuid SenderGUID; public ObjectGuid SenderGUID;
public int ChoiceID; public int ChoiceID;
public int UiTextureKitID;
public string Question; public string Question;
public List<PlayerChoiceResponse> Responses = new List<PlayerChoiceResponse>(); public List<PlayerChoiceResponse> Responses = new List<PlayerChoiceResponse>();
public bool CloseChoiceFrame; public bool CloseChoiceFrame;
public bool HideWarboardHeader;
} }
class ChoiceResponse : ClientPacket class ChoiceResponse : ClientPacket
@@ -897,6 +903,7 @@ namespace Game.Network.Packets
public uint QuestID; public uint QuestID;
public int QuestType; // Accepted values: 0, 1 or 2. 0 == IsAutoComplete() (skip objectives/details) public int QuestType; // Accepted values: 0, 1 or 2. 0 == IsAutoComplete() (skip objectives/details)
public int QuestLevel; // may be -1, static data, in other cases must be used dynamic level: Player.GetQuestLevel (0 is not known, but assuming this is no longer valid for quest intended for client) public int QuestLevel; // may be -1, static data, in other cases must be used dynamic level: Player.GetQuestLevel (0 is not known, but assuming this is no longer valid for quest intended for client)
public int QuestMaxScalingLevel = 255;
public uint QuestPackageID; public uint QuestPackageID;
public int QuestMinLevel; public int QuestMinLevel;
public int QuestSortID; // zone or sort to display in quest log public int QuestSortID; // zone or sort to display in quest log
@@ -923,7 +930,7 @@ namespace Game.Network.Packets
public float POIx; public float POIx;
public float POIy; public float POIy;
public uint POIPriority; public uint POIPriority;
public int AllowableRaces = -1; public long AllowableRaces = -1;
public string LogTitle; public string LogTitle;
public string LogDescription; public string LogDescription;
public string QuestDescription; public string QuestDescription;
@@ -1129,11 +1136,12 @@ namespace Game.Network.Packets
public struct GossipText public struct GossipText
{ {
public GossipText(uint questID, uint questType, uint questLevel, uint questFlags, uint questFlagsEx, bool repeatable, string questTitle) public GossipText(uint questID, uint questType, uint questLevel, uint questMaxScalingLevel, uint questFlags, uint questFlagsEx, bool repeatable, string questTitle)
{ {
QuestID = questID; QuestID = questID;
QuestType = questType; QuestType = questType;
QuestLevel = questLevel; QuestLevel = questLevel;
QuestMaxScalingLevel = questMaxScalingLevel;
QuestFlags = questFlags; QuestFlags = questFlags;
QuestFlagsEx = questFlagsEx; QuestFlagsEx = questFlagsEx;
Repeatable = repeatable; Repeatable = repeatable;
@@ -1143,6 +1151,7 @@ namespace Game.Network.Packets
public uint QuestID; public uint QuestID;
public uint QuestType; public uint QuestType;
public uint QuestLevel; public uint QuestLevel;
public uint QuestMaxScalingLevel;
public uint QuestFlags; public uint QuestFlags;
public uint QuestFlagsEx; public uint QuestFlagsEx;
public bool Repeatable; public bool Repeatable;
+7 -2
View File
@@ -864,7 +864,12 @@ namespace Game.Network.Packets
{ {
public SelfRes(WorldPacket packet) : base(packet) { } public SelfRes(WorldPacket packet) : base(packet) { }
public override void Read() { } public override void Read()
{
SpellId = _worldPacket.ReadUInt32();
}
public uint SpellId;
} }
class GetMirrorImageData : ClientPacket class GetMirrorImageData : ClientPacket
@@ -1236,7 +1241,7 @@ namespace Game.Network.Packets
public void Write(WorldPacket data) public void Write(WorldPacket data)
{ {
data.WriteBits(Type, 3); data.WriteBits(Type, 4);
data.WriteInt16(PlayerLevelDelta); data.WriteInt16(PlayerLevelDelta);
data.WriteUInt16(PlayerItemLevel); data.WriteUInt16(PlayerItemLevel);
data.WriteUInt8(TargetLevel); data.WriteUInt8(TargetLevel);
@@ -315,6 +315,8 @@ namespace Game.Network.Packets
LastTitleAuthorGuid = data.ReadPackedGuid(); LastTitleAuthorGuid = data.ReadPackedGuid();
LastDescriptionAuthorGuid = data.ReadPackedGuid(); LastDescriptionAuthorGuid = data.ReadPackedGuid();
LastVoiceChatAuthorGuid = data.ReadPackedGuid(); LastVoiceChatAuthorGuid = data.ReadPackedGuid();
ListingCreatorGuid = data.ReadPackedGuid();
Unknown735 = data.ReadPackedGuid();
byte titleLength = data.ReadBits<byte>(8); byte titleLength = data.ReadBits<byte>(8);
byte descriptionLength = data.ReadBits<byte>(11); byte descriptionLength = data.ReadBits<byte>(11);
@@ -330,6 +332,8 @@ namespace Game.Network.Packets
ObjectGuid LastTitleAuthorGuid; ObjectGuid LastTitleAuthorGuid;
ObjectGuid LastDescriptionAuthorGuid; ObjectGuid LastDescriptionAuthorGuid;
ObjectGuid LastVoiceChatAuthorGuid; ObjectGuid LastVoiceChatAuthorGuid;
ObjectGuid ListingCreatorGuid;
ObjectGuid Unknown735;
string Title; string Title;
string Description; string Description;
string VoiceChat; string VoiceChat;
+2 -2
View File
@@ -101,7 +101,7 @@ namespace Game.Network.Packets
{ {
MinLevel = data.ReadInt32(); MinLevel = data.ReadInt32();
MaxLevel = data.ReadInt32(); MaxLevel = data.ReadInt32();
RaceFilter = data.ReadInt32(); RaceFilter = data.ReadInt64();
ClassFilter = data.ReadInt32(); ClassFilter = data.ReadInt32();
uint nameLength = data.ReadBits<uint>(6); uint nameLength = data.ReadBits<uint>(6);
@@ -137,7 +137,7 @@ namespace Game.Network.Packets
public string VirtualRealmName; public string VirtualRealmName;
public string Guild; public string Guild;
public string GuildVirtualRealmName; public string GuildVirtualRealmName;
public int RaceFilter = -1; public long RaceFilter = 0;
public int ClassFilter = -1; public int ClassFilter = -1;
public List<string> Words = new List<string>(); public List<string> Words = new List<string>();
public bool ShowEnemies; public bool ShowEnemies;
+5 -12
View File
@@ -36,9 +36,9 @@ namespace Game.Network
static byte[] SessionKeySeed = { 0x58, 0xCB, 0xCF, 0x40, 0xFE, 0x2E, 0xCE, 0xA6, 0x5A, 0x90, 0xB8, 0x01, 0x68, 0x6C, 0x28, 0x0B }; static byte[] SessionKeySeed = { 0x58, 0xCB, 0xCF, 0x40, 0xFE, 0x2E, 0xCE, 0xA6, 0x5A, 0x90, 0xB8, 0x01, 0x68, 0x6C, 0x28, 0x0B };
static byte[] ContinuedSessionSeed = { 0x16, 0xAD, 0x0C, 0xD4, 0x46, 0xF9, 0x4F, 0xB2, 0xEF, 0x7D, 0xEA, 0x2A, 0x17, 0x66, 0x4D, 0x2F }; static byte[] ContinuedSessionSeed = { 0x16, 0xAD, 0x0C, 0xD4, 0x46, 0xF9, 0x4F, 0xB2, 0xEF, 0x7D, 0xEA, 0x2A, 0x17, 0x66, 0x4D, 0x2F };
static uint[] ClientTypeSeed_Win = { 0xC34F59FE, 0xFF9A7F5E, 0x8A9DD986, 0x97B24A36 }; static byte[] ClientTypeSeed_Win = { 0x23, 0xC5, 0x9C, 0x59, 0x63, 0xCB, 0xEF, 0x5B, 0x72, 0x8D, 0x13, 0xA5, 0x08, 0x78, 0xDF, 0xCB };
static uint[] ClientTypeSeed_Wn64 = { 0x4E625212, 0xFAD6CBD8, 0x5D3FD3C7, 0xF335A567 }; static byte[] ClientTypeSeed_Wn64 = { 0xC7, 0xFF, 0x93, 0x2D, 0x6A, 0x21, 0x74, 0xA3, 0xD5, 0x38, 0xCA, 0x72, 0x12, 0x13, 0x6D, 0x2B };
static uint[] ClientTypeSeed_Mc64 = { 0x95EFC66, 0x266170B8, 0x3145F79, 0xD8C1C808 }; static byte[] ClientTypeSeed_Mc64 = { 0x21, 0x0B, 0x97, 0x01, 0x49, 0xD6, 0xF5, 0x6C, 0xAC, 0x9B, 0xAD, 0xF2, 0xAA, 0xC9, 0x1E, 0x8E };
public WorldSocket(Socket socket) : base(socket) public WorldSocket(Socket socket) : base(socket)
{ {
@@ -383,18 +383,15 @@ namespace Game.Network
// For hook purposes, we get Remoteaddress at this point. // For hook purposes, we get Remoteaddress at this point.
string address = GetRemoteIpAddress().ToString(); string address = GetRemoteIpAddress().ToString();
uint[] clientSeed = ClientTypeSeed_Win; byte[] clientSeed = ClientTypeSeed_Win;
if (account.game.OS == "Wn64") if (account.game.OS == "Wn64")
clientSeed = ClientTypeSeed_Wn64; clientSeed = ClientTypeSeed_Wn64;
else if (account.game.OS == "Mc64") else if (account.game.OS == "Mc64")
clientSeed = ClientTypeSeed_Mc64; clientSeed = ClientTypeSeed_Mc64;
byte[] byteArray = new byte[clientSeed.Length * 4];
Buffer.BlockCopy(clientSeed, 0, byteArray, 0, clientSeed.Length * 4);
Sha256 digestKeyHash = new Sha256(); Sha256 digestKeyHash = new Sha256();
digestKeyHash.Process(account.game.SessionKey, account.game.SessionKey.Length); digestKeyHash.Process(account.game.SessionKey, account.game.SessionKey.Length);
digestKeyHash.Finish(byteArray, byteArray.Length); digestKeyHash.Finish(clientSeed, clientSeed.Length);
HmacSha256 hmac = new HmacSha256(digestKeyHash.Digest); HmacSha256 hmac = new HmacSha256(digestKeyHash.Digest);
hmac.Process(authSession.LocalChallenge, authSession.LocalChallenge.Count); hmac.Process(authSession.LocalChallenge, authSession.LocalChallenge.Count);
@@ -744,10 +741,6 @@ namespace Game.Network
game.IsBanned = fields.Read<ulong>(13) != 0; game.IsBanned = fields.Read<ulong>(13) != 0;
game.IsRectuiter = fields.Read<uint>(14) != 0; game.IsRectuiter = fields.Read<uint>(14) != 0;
uint world_expansion = WorldConfig.GetUIntValue(WorldCfg.Expansion);
if (game.Expansion > world_expansion)
game.Expansion = (byte)world_expansion;
if (battleNet.Locale >= LocaleConstant.Total) if (battleNet.Locale >= LocaleConstant.Total)
battleNet.Locale = LocaleConstant.enUS; battleNet.Locale = LocaleConstant.enUS;
} }
@@ -33,14 +33,6 @@ namespace Game.Network
// -1 means use default // -1 means use default
_socketSendBufferSize = ConfigMgr.GetDefaultValue("Network.OutKBuff", -1); _socketSendBufferSize = ConfigMgr.GetDefaultValue("Network.OutKBuff", -1);
m_SockOutUBuff = ConfigMgr.GetDefaultValue("Network.OutUBuff", 65536);
if (m_SockOutUBuff <= 0)
{
Log.outError(LogFilter.Network, "Network.OutUBuff is wrong in your config file");
return false;
}
if (!base.StartNetwork(bindIp, port, threadCount)) if (!base.StartNetwork(bindIp, port, threadCount))
return false; return false;
@@ -82,7 +74,6 @@ namespace Game.Network
AsyncAcceptor _instanceAcceptor; AsyncAcceptor _instanceAcceptor;
int _socketSendBufferSize; int _socketSendBufferSize;
int m_SockOutUBuff;
bool _tcpNoDelay; bool _tcpNoDelay;
} }
} }
+65 -63
View File
@@ -33,38 +33,39 @@ namespace Game
Id = fields.Read<uint>(0); Id = fields.Read<uint>(0);
Type = (QuestType)fields.Read<byte>(1); Type = (QuestType)fields.Read<byte>(1);
Level = fields.Read<int>(2); Level = fields.Read<int>(2);
PackageID = fields.Read<uint>(3); MaxScalingLevel = fields.Read<int>(3);
MinLevel = fields.Read<int>(4); PackageID = fields.Read<uint>(4);
QuestSortID = fields.Read<short>(5); MinLevel = fields.Read<int>(5);
QuestInfoID = fields.Read<ushort>(6); QuestSortID = fields.Read<short>(6);
SuggestedPlayers = fields.Read<uint>(7); QuestInfoID = fields.Read<ushort>(7);
NextQuestInChain = fields.Read<uint>(8); SuggestedPlayers = fields.Read<uint>(8);
RewardXPDifficulty = fields.Read<uint>(9); NextQuestInChain = fields.Read<uint>(9);
RewardXPMultiplier = fields.Read<float>(10); RewardXPDifficulty = fields.Read<uint>(10);
RewardMoney = fields.Read<int>(11); RewardXPMultiplier = fields.Read<float>(11);
RewardMoneyDifficulty = fields.Read<uint>(12); RewardMoney = fields.Read<int>(12);
RewardMoneyMultiplier = fields.Read<float>(13); RewardMoneyDifficulty = fields.Read<uint>(13);
RewardBonusMoney = fields.Read<uint>(14); RewardMoneyMultiplier = fields.Read<float>(14);
RewardBonusMoney = fields.Read<uint>(15);
for (int i = 0; i < SharedConst.QuestRewardDisplaySpellCount; ++i) for (int i = 0; i < SharedConst.QuestRewardDisplaySpellCount; ++i)
RewardDisplaySpell[i] = fields.Read<uint>(15 + i); RewardDisplaySpell[i] = fields.Read<uint>(16 + i);
RewardSpell = fields.Read<uint>(18); RewardSpell = fields.Read<uint>(19);
RewardHonor = fields.Read<uint>(19); RewardHonor = fields.Read<uint>(20);
RewardKillHonor = fields.Read<uint>(20); RewardKillHonor = fields.Read<uint>(21);
SourceItemId = fields.Read<uint>(21); SourceItemId = fields.Read<uint>(22);
RewardArtifactXPDifficulty = fields.Read<uint>(22); RewardArtifactXPDifficulty = fields.Read<uint>(23);
RewardArtifactXPMultiplier = fields.Read<float>(23); RewardArtifactXPMultiplier = fields.Read<float>(24);
RewardArtifactCategoryID = fields.Read<uint>(24); RewardArtifactCategoryID = fields.Read<uint>(25);
Flags = (QuestFlags)fields.Read<uint>(25); Flags = (QuestFlags)fields.Read<uint>(26);
FlagsEx = (QuestFlagsEx)fields.Read<uint>(26); FlagsEx = (QuestFlagsEx)fields.Read<uint>(27);
for (int i = 0; i < SharedConst.QuestItemDropCount; ++i) for (int i = 0; i < SharedConst.QuestItemDropCount; ++i)
{ {
RewardItemId[i] = fields.Read<uint>(27 + i * 4); RewardItemId[i] = fields.Read<uint>(28 + i * 4);
RewardItemCount[i] = fields.Read<uint>(28 + i * 4); RewardItemCount[i] = fields.Read<uint>(29 + i * 4);
ItemDrop[i] = fields.Read<uint>(29 + i * 4); ItemDrop[i] = fields.Read<uint>(30 + i * 4);
ItemDropQuantity[i] = fields.Read<uint>(30 + i * 4); ItemDropQuantity[i] = fields.Read<uint>(31 + i * 4);
if (RewardItemId[i] != 0) if (RewardItemId[i] != 0)
++_rewItemsCount; ++_rewItemsCount;
@@ -72,63 +73,63 @@ namespace Game
for (int i = 0; i < SharedConst.QuestRewardChoicesCount; ++i) for (int i = 0; i < SharedConst.QuestRewardChoicesCount; ++i)
{ {
RewardChoiceItemId[i] = fields.Read<uint>(43 + i * 3); RewardChoiceItemId[i] = fields.Read<uint>(44 + i * 3);
RewardChoiceItemCount[i] = fields.Read<uint>(44 + i * 3); RewardChoiceItemCount[i] = fields.Read<uint>(45 + i * 3);
RewardChoiceItemDisplayId[i] = fields.Read<uint>(45 + i * 3); RewardChoiceItemDisplayId[i] = fields.Read<uint>(46 + i * 3);
if (RewardChoiceItemId[i] != 0) if (RewardChoiceItemId[i] != 0)
++_rewChoiceItemsCount; ++_rewChoiceItemsCount;
} }
POIContinent = fields.Read<uint>(61); POIContinent = fields.Read<uint>(62);
POIx = fields.Read<float>(62); POIx = fields.Read<float>(63);
POIy = fields.Read<float>(63); POIy = fields.Read<float>(64);
POIPriority = fields.Read<uint>(64); POIPriority = fields.Read<uint>(65);
RewardTitleId = fields.Read<uint>(65); RewardTitleId = fields.Read<uint>(66);
RewardArenaPoints = fields.Read<int>(66); RewardArenaPoints = fields.Read<int>(67);
RewardSkillId = fields.Read<uint>(67); RewardSkillId = fields.Read<uint>(68);
RewardSkillPoints = fields.Read<uint>(68); RewardSkillPoints = fields.Read<uint>(69);
QuestGiverPortrait = fields.Read<uint>(69); QuestGiverPortrait = fields.Read<uint>(70);
QuestTurnInPortrait = fields.Read<uint>(70); QuestTurnInPortrait = fields.Read<uint>(71);
for (int i = 0; i < SharedConst.QuestRewardReputationsCount; ++i) for (int i = 0; i < SharedConst.QuestRewardReputationsCount; ++i)
{ {
RewardFactionId[i] = fields.Read<uint>(71 + i * 4); RewardFactionId[i] = fields.Read<uint>(72 + i * 4);
RewardFactionValue[i] = fields.Read<int>(72 + i * 4); RewardFactionValue[i] = fields.Read<int>(73 + i * 4);
RewardFactionOverride[i] = fields.Read<int>(73 + i * 4); RewardFactionOverride[i] = fields.Read<int>(74 + i * 4);
RewardFactionCapIn[i] = fields.Read<uint>(74 + i * 4); RewardFactionCapIn[i] = fields.Read<uint>(75 + i * 4);
} }
RewardReputationMask = fields.Read<uint>(91); RewardReputationMask = fields.Read<uint>(92);
for (int i = 0; i < SharedConst.QuestRewardCurrencyCount; ++i) for (int i = 0; i < SharedConst.QuestRewardCurrencyCount; ++i)
{ {
RewardCurrencyId[i] = fields.Read<uint>(92 + i * 2); RewardCurrencyId[i] = fields.Read<uint>(93 + i * 2);
RewardCurrencyCount[i] = fields.Read<uint>(93 + i * 2); RewardCurrencyCount[i] = fields.Read<uint>(94 + i * 2);
if (RewardCurrencyId[i] != 0) if (RewardCurrencyId[i] != 0)
++_rewCurrencyCount; ++_rewCurrencyCount;
} }
SoundAccept = fields.Read<uint>(100); SoundAccept = fields.Read<uint>(101);
SoundTurnIn = fields.Read<uint>(101); SoundTurnIn = fields.Read<uint>(102);
AreaGroupID = fields.Read<uint>(102); AreaGroupID = fields.Read<uint>(103);
LimitTime = fields.Read<uint>(103); LimitTime = fields.Read<uint>(104);
AllowableRaces = fields.Read<int>(104); AllowableRaces = fields.Read<int>(105);
QuestRewardID = fields.Read<uint>(105); QuestRewardID = fields.Read<uint>(106);
Expansion = fields.Read<int>(106); Expansion = fields.Read<int>(107);
LogTitle = fields.Read<string>(107); LogTitle = fields.Read<string>(108);
LogDescription = fields.Read<string>(108); LogDescription = fields.Read<string>(109);
QuestDescription = fields.Read<string>(109); QuestDescription = fields.Read<string>(110);
AreaDescription = fields.Read<string>(110); AreaDescription = fields.Read<string>(111);
PortraitGiverText = fields.Read<string>(111); PortraitGiverText = fields.Read<string>(112);
PortraitGiverName = fields.Read<string>(112); PortraitGiverName = fields.Read<string>(113);
PortraitTurnInText = fields.Read<string>(113); PortraitTurnInText = fields.Read<string>(114);
PortraitTurnInName = fields.Read<string>(114); PortraitTurnInName = fields.Read<string>(115);
QuestCompletionLog = fields.Read<string>(115); QuestCompletionLog = fields.Read<string>(116);
} }
public void LoadQuestDetails(SQLFields fields) public void LoadQuestDetails(SQLFields fields)
@@ -427,6 +428,7 @@ namespace Game
public uint Id; public uint Id;
public QuestType Type; public QuestType Type;
public int Level; public int Level;
public int MaxScalingLevel;
public uint PackageID; public uint PackageID;
public int MinLevel; public int MinLevel;
public int QuestSortID; public int QuestSortID;
@@ -477,7 +479,7 @@ namespace Game
public uint SoundTurnIn { get; set; } public uint SoundTurnIn { get; set; }
public uint AreaGroupID; public uint AreaGroupID;
public uint LimitTime; public uint LimitTime;
public int AllowableRaces { get; set; } public long AllowableRaces { get; set; }
public uint QuestRewardID; public uint QuestRewardID;
public int Expansion; public int Expansion;
public List<QuestObjective> Objectives = new List<QuestObjective>(); public List<QuestObjective> Objectives = new List<QuestObjective>();
+4 -1
View File
@@ -46,7 +46,8 @@ namespace Game
_accountId = id; _accountId = id;
_accountName = name; _accountName = name;
_battlenetAccountId = battlenetAccountId; _battlenetAccountId = battlenetAccountId;
m_expansion = expansion; m_accountExpansion = expansion;
m_expansion = (Expansion)Math.Min((byte)expansion, WorldConfig.GetIntValue(WorldCfg.Expansion));
_os = os; _os = os;
m_sessionDbcLocale = Global.WorldMgr.GetAvailableDbcLocale(locale); m_sessionDbcLocale = Global.WorldMgr.GetAvailableDbcLocale(locale);
m_sessionDbLocaleIndex = locale; m_sessionDbLocaleIndex = locale;
@@ -602,6 +603,7 @@ namespace Game
public string GetRemoteAddress() { return m_Address; } public string GetRemoteAddress() { return m_Address; }
public Expansion GetAccountExpansion() { return m_accountExpansion; }
public Expansion GetExpansion() { return m_expansion; } public Expansion GetExpansion() { return m_expansion; }
public string GetOS() { return _os; } public string GetOS() { return _os; }
public void SetInQueue(bool state) { m_inQueue = state; } public void SetInQueue(bool state) { m_inQueue = state; }
@@ -820,6 +822,7 @@ namespace Game
uint _accountId; uint _accountId;
string _accountName; string _accountName;
uint _battlenetAccountId; uint _battlenetAccountId;
Expansion m_accountExpansion;
Expansion m_expansion; Expansion m_expansion;
string _os; string _os;
+1 -1
View File
@@ -1484,7 +1484,7 @@ namespace Game.Spells
while (chainTargets != 0) while (chainTargets != 0)
{ {
// try to get unit for next chain jump // try to get unit for next chain jump
var found = tempTargets.LastOrDefault(); WorldObject found = null;
// get unit with highest hp deficit in dist // get unit with highest hp deficit in dist
if (isChainHeal) if (isChainHeal)
{ {
@@ -1566,7 +1566,11 @@ namespace Scripts.Northrend.IcecrownCitadel
return true; return true;
}); });
targets = targets.SelectRandom(2).ToList();
var newTargets = targets.SelectRandom(2);
targets.Clear();
targets.AddRange(newTargets);
} }
void Land(uint effIndex) void Land(uint effIndex)
+6 -73
View File
@@ -212,15 +212,7 @@ Logger.Network = 1,Console Server
#Logger.Warden=3,Console Server #Logger.Warden=3,Console Server
# #
# Log.Async.Enable # Allow.IP.Based.Action.Logging (NYI)
# Description: Enables asyncronous message logging.
# Default: 0 - (Disabled)
# 1 - (Enabled)
Log.Async.Enable = 0
#
# Allow.IP.Based.Action.Logging
# Description: Logs actions, e.g. account login and logout to name a few, based on IP of # Description: Logs actions, e.g. account login and logout to name a few, based on IP of
# current session. # current session.
# Default: 0 - (Disabled) # Default: 0 - (Disabled)
@@ -2624,28 +2616,20 @@ ArenaLog.ExtendedInfo = 0
################################################################################################### ###################################################################################################
# NETWORK CONFIG # NETWORK CONFIG
# #
# Network.Threads (NYI) # Network.Threads
# Description: Number of threads for network. # Description: Number of threads for network.
# Default: 1 - (Recommended 1 thread per 1000 connections) # Default: 1 - (Recommended 1 thread per 1000 connections)
Network.Threads = 1 Network.Threads = 1
# #
# Network.OutKBuff (NYI) # Network.OutKBuff
# Description: Amount of memory (in bytes) used for the output kernel buffer (see SO_SNDBUF # Description: Specifies the total per-socket buffer space reserved for sends. This is unrelated
# socket option, TCP manual). # to the maximum message size or the size of a TCP window.
# Default: -1 - (Use system default setting) # Default: -1 - (Use system default setting)
Network.OutKBuff = -1 Network.OutKBuff = -1
#
# Network.OutUBuff (NYI)
# Description: Amount of memory (in bytes) reserved in the user space per connection for
# output buffering.
# Default: 65536
Network.OutUBuff = 65536
# #
# Network.TcpNoDelay: # Network.TcpNoDelay:
# Description: TCP Nagle algorithm setting. # Description: TCP Nagle algorithm setting.
@@ -2658,7 +2642,7 @@ Network.TcpNodelay = 1
################################################################################################### ###################################################################################################
################################################################################################### ###################################################################################################
# CONSOLE AND REMOTE ACCESS # CONSOLE
# #
# Console.Enable (NYI) # Console.Enable (NYI)
# Description: Enable console. # Description: Enable console.
@@ -2667,57 +2651,6 @@ Network.TcpNodelay = 1
Console.Enable = 1 Console.Enable = 1
#
# Ra.Enable (NYI)
# Description: Enable remote console (telnet).
# Default: 0 - (Disabled)
# 1 - (Enabled)
Ra.Enable = 0
#
# Ra.IP (NYI)
# Description: Bind remote access to IP/hostname.
# Default: "0.0.0.0" - (Bind to all IPs on the system)
Ra.IP = "0.0.0.0"
#
# Ra.Port (NYI)
# Description: TCP port to reach the remote console.
# Default: 3443
Ra.Port = 3443
#
# Ra.MinLevel (NYI)
# Description: Required security level to use the remote console.
# Default: 3
Ra.MinLevel = 3
#
# SOAP.Enable (NYI)
# Description: Enable soap service.
# Default: 0 - (Disabled)
# 1 - (Enabled)
SOAP.Enabled = 0
#
# SOAP.IP (NYI)
# Description: Bind SOAP service to IP/hostname.
# Default: "127.0.0.1" - (Bind to localhost)
SOAP.IP = "127.0.0.1"
#
# SOAP.Port (NYI)
# Description: TCP port to reach the SOAP service.
# Default: 7878
SOAP.Port = 7878
# #
################################################################################################### ###################################################################################################