Core/PacketIO: Updated packet structures to 8.1.5

Port TrinityCore Commit: https://github.com/TrinityCore/TrinityCore/commit/31fda79556e55375962a3c9e46f6dbdbf6e90d18
This commit is contained in:
hondacrx
2019-06-22 18:42:45 -04:00
parent d500b65ad9
commit e4d500f4b5
54 changed files with 1179 additions and 1077 deletions
@@ -785,4 +785,11 @@ namespace Framework.Constants
NeedsFanfare = 0x01, NeedsFanfare = 0x01,
IsFavorite = 0x02 IsFavorite = 0x02
} }
public enum ToyFlags
{
None = 0,
Favorite = 0x01,
HasFanfare = 0x02
}
} }
+2 -1
View File
@@ -948,7 +948,8 @@ namespace Framework.Constants
{ {
Player = 0x01, Player = 0x01,
DeathKnight = 0x04, DeathKnight = 0x04,
DemonHunter = 0x20 DemonHunter = 0x20,
Conditional = 0x400
} }
public enum CharSectionType public enum CharSectionType
+3 -1
View File
@@ -84,6 +84,8 @@ namespace Framework.Constants
TooLowGearScore = 4, TooLowGearScore = 4,
TooHighGearScore = 5, TooHighGearScore = 5,
RaidLocked = 6, RaidLocked = 6,
NoSpec = 14,
HasRestriction = 15,
AttunementTooLowLevel = 1001, AttunementTooLowLevel = 1001,
AttunementTooHighLevel = 1002, AttunementTooHighLevel = 1002,
QuestNotCompleted = 1022, QuestNotCompleted = 1022,
@@ -146,7 +148,7 @@ namespace Framework.Constants
Ok = 0x00, // Joined (No Client Msg) Ok = 0x00, // Joined (No Client Msg)
GroupFull = 0x1f, // Your Group Is Already Full. GroupFull = 0x1f, // Your Group Is Already Full.
NoLfgObject = 0x21, // Internal Lfg Error. NoLfgObject = 0x21, // Internal Lfg Error.
NoSlotsPlayer = 0x22, // You Do Not Meet The Requirements For The Chosen Dungeons. NoSlots = 0x22, // You Do Not Meet The Requirements For The Chosen Dungeons.
MismatchedSlots = 0x23, // You Cannot Mix Dungeons, Raids, And Random When Picking Dungeons. MismatchedSlots = 0x23, // You Cannot Mix Dungeons, Raids, And Random When Picking Dungeons.
PartyPlayersFromDifferentRealms = 0x24, // The Dungeon You Chose Does Not Support Players From Multiple Realms. PartyPlayersFromDifferentRealms = 0x24, // The Dungeon You Chose Does Not Support Players From Multiple Realms.
MembersNotPresent = 0x25, // One Or More Group Members Are Pending Invites Or Disconnected. MembersNotPresent = 0x25, // One Or More Group Members Are Pending Invites Or Disconnected.
File diff suppressed because it is too large Load Diff
@@ -369,7 +369,7 @@ namespace Framework.Constants
BypassArmorForCaster = 345, BypassArmorForCaster = 345,
EnableAltPower = 346, // Nyi EnableAltPower = 346, // Nyi
ModSpellCooldownByHaste = 347, ModSpellCooldownByHaste = 347,
DepositBonusMoneyInGuildBankOnLoot = 348, // Nyi ModMoneyGain = 348, // Modifies gold gains from source: [Misc = 0, Quests][Misc = 1, Loot]
ModCurrencyGain = 349, ModCurrencyGain = 349,
ModGatheringItemsGainedPercent = 350, // Nyi ModGatheringItemsGainedPercent = 350, // Nyi
Unk351 = 351, Unk351 = 351,
@@ -149,8 +149,8 @@ namespace Framework.Database
PrepareStatement(LoginStatements.UPD_LAST_CHAR_UNDELETE, "UPDATE battlenet_accounts SET LastCharacterUndelete = UNIX_TIMESTAMP() WHERE Id = ?"); PrepareStatement(LoginStatements.UPD_LAST_CHAR_UNDELETE, "UPDATE battlenet_accounts SET LastCharacterUndelete = UNIX_TIMESTAMP() WHERE Id = ?");
// Account wide toys // Account wide toys
PrepareStatement(LoginStatements.SEL_ACCOUNT_TOYS, "SELECT itemId, isFavourite FROM battlenet_account_toys WHERE accountId = ?"); PrepareStatement(LoginStatements.SEL_ACCOUNT_TOYS, "SELECT itemId, isFavourite, hasFanfare FROM battlenet_account_toys WHERE accountId = ?");
PrepareStatement(LoginStatements.REP_ACCOUNT_TOYS, "REPLACE INTO battlenet_account_toys (accountId, itemId, isFavourite) VALUES (?, ?, ?)"); PrepareStatement(LoginStatements.REP_ACCOUNT_TOYS, "REPLACE INTO battlenet_account_toys (accountId, itemId, isFavourite, hasFanfare) VALUES (?, ?, ?, ?)");
// Battle Pets // Battle Pets
PrepareStatement(LoginStatements.SEL_BATTLE_PETS, "SELECT guid, species, breed, level, exp, health, quality, flags, name FROM battle_pets WHERE battlenetAccountId = ?"); PrepareStatement(LoginStatements.SEL_BATTLE_PETS, "SELECT guid, species, breed, level, exp, health, quality, flags, name FROM battle_pets WHERE battlenetAccountId = ?");
+34 -23
View File
@@ -120,31 +120,32 @@ public class RealmManager : Singleton<RealmManager>
return _realms.LookupByKey(id); return _realms.LookupByKey(id);
} }
// List of client builds for verbose version info in realmlist packet
RealmBuildInfo[] ClientBuilds =
{
new RealmBuildInfo(28938, 8, 1, 5, ' ' ),
new RealmBuildInfo(21355, 6, 2, 4, ' ' ),
new RealmBuildInfo(20726, 6, 2, 3, ' ' ),
new RealmBuildInfo(20574, 6, 2, 2, 'a' ),
new RealmBuildInfo(20490, 6, 2, 2, 'a' ),
new RealmBuildInfo(15595, 4, 3, 4, ' ' ),
new RealmBuildInfo(14545, 4, 2, 2, ' ' ),
new RealmBuildInfo(13623, 4, 0, 6, 'a' ),
new RealmBuildInfo(13930, 3, 3, 5, 'a' ), // 3.3.5a China Mainland build
new RealmBuildInfo(12340, 3, 3, 5, 'a' ),
new RealmBuildInfo(11723, 3, 3, 3, 'a' ),
new RealmBuildInfo(11403, 3, 3, 2, ' ' ),
new RealmBuildInfo(11159, 3, 3, 0, 'a' ),
new RealmBuildInfo(10505, 3, 2, 2, 'a' ),
new RealmBuildInfo(9947, 3, 1, 3, ' ' ),
new RealmBuildInfo(8606, 2, 4, 3, ' ' ),
new RealmBuildInfo(6141, 1, 12, 3, ' ' ),
new RealmBuildInfo(6005, 1, 12, 2, ' ' ),
new RealmBuildInfo(5875, 1, 12, 1, ' ' ),
};
RealmBuildInfo GetBuildInfo(uint build) RealmBuildInfo GetBuildInfo(uint build)
{ {
// List of client builds for verbose version info in realmlist packet
RealmBuildInfo[] ClientBuilds =
{
new RealmBuildInfo(21355, 6, 2, 4, ' '),
new RealmBuildInfo( 20726, 6, 2, 3, ' '),
new RealmBuildInfo(20574, 6, 2, 2, 'a'),
new RealmBuildInfo( 20490, 6, 2, 2, 'a'),
new RealmBuildInfo( 15595, 4, 3, 4, ' '),
new RealmBuildInfo( 14545, 4, 2, 2, ' '),
new RealmBuildInfo( 13623, 4, 0, 6, 'a'),
new RealmBuildInfo( 13930, 3, 3, 5, 'a'), // 3.3.5a China Mainland build
new RealmBuildInfo( 12340, 3, 3, 5, 'a'),
new RealmBuildInfo( 11723, 3, 3, 3, 'a'),
new RealmBuildInfo( 11403, 3, 3, 2, ' '),
new RealmBuildInfo( 11159, 3, 3, 0, 'a'),
new RealmBuildInfo( 10505, 3, 2, 2, 'a'),
new RealmBuildInfo( 9947, 3, 1, 3, ' '),
new RealmBuildInfo( 8606, 2, 4, 3, ' '),
new RealmBuildInfo( 6141, 1, 12, 3, ' '),
new RealmBuildInfo( 6005, 1, 12, 2, ' '),
new RealmBuildInfo( 5875, 1, 12, 1, ' '),
};
foreach (var clientBuild in ClientBuilds) foreach (var clientBuild in ClientBuilds)
if (clientBuild.Build == build) if (clientBuild.Build == build)
return clientBuild; return clientBuild;
@@ -152,6 +153,16 @@ public class RealmManager : Singleton<RealmManager>
return null; return null;
} }
public uint GetMinorMajorBugfixVersionForBuild(uint build)
{
RealmBuildInfo buildInfo = ClientBuilds.FirstOrDefault(p =>
{
return p.Build < build;
});
return buildInfo != null ? (buildInfo.MajorVersion * 10000 + buildInfo.MinorVersion * 100 + buildInfo.BugfixVersion) : 0;
}
public void WriteSubRegions(Bgs.Protocol.GameUtilities.V1.GetAllValuesForAttributeResponse response) public void WriteSubRegions(Bgs.Protocol.GameUtilities.V1.GetAllValuesForAttributeResponse response)
{ {
foreach (string subRegion in GetSubRegions()) foreach (string subRegion in GetSubRegions())
-18
View File
@@ -399,24 +399,6 @@ namespace Game.Arenas
} }
} }
public void Inspect(WorldSession session, ObjectGuid guid)
{
ArenaTeamMember member = GetMember(guid);
if (member == null)
return;
WorldPacket data = new WorldPacket(ServerOpcodes.InspectPvp);
data.WritePackedGuid(guid); // player guid
data.WriteUInt8(GetSlot()); // slot (0...2)
data.WriteUInt32(GetId()); // arena team id
data.WriteUInt32(stats.Rating); // rating
data.WriteUInt32(stats.SeasonGames); // season played
data.WriteUInt32(stats.SeasonWins); // season wins
data.WriteUInt32(member.SeasonGames); // played (count of all games, that the inspected member participated...)
data.WriteUInt32(member.PersonalRating); // personal rating
//session.SendPacket(data);
}
void BroadcastPacket(ServerPacket packet) void BroadcastPacket(ServerPacket packet)
{ {
foreach (var member in Members) foreach (var member in Members)
+7 -4
View File
@@ -611,7 +611,7 @@ namespace Game.DataStorage
uint count = 0; uint count = 0;
do do
{ {
uint id = result.Read<uint>(0); int id = result.Read<int>(0);
uint tableHash = result.Read<uint>(1); uint tableHash = result.Read<uint>(1);
int recordId = result.Read<int>(2); int recordId = result.Read<int>(2);
bool deleted = result.Read<bool>(3); bool deleted = result.Read<bool>(3);
@@ -621,7 +621,8 @@ namespace Game.DataStorage
continue; continue;
} }
_hotfixData[MathFunctions.MakePair64(id, tableHash)] = recordId; _hotfixData.Add(id, Tuple.Create(tableHash, recordId));
++_hotfixCount;
deletedRecords[Tuple.Create(tableHash, recordId)] = deleted; deletedRecords[Tuple.Create(tableHash, recordId)] = deleted;
++count; ++count;
@@ -669,7 +670,8 @@ namespace Game.DataStorage
Log.outInfo(LogFilter.ServerLoading, $"Loaded {_hotfixBlob.Count} hotfix blob records in {Time.GetMSTimeDiffToNow(oldMSTime)} ms"); Log.outInfo(LogFilter.ServerLoading, $"Loaded {_hotfixBlob.Count} hotfix blob records in {Time.GetMSTimeDiffToNow(oldMSTime)} ms");
} }
public Dictionary<ulong, int> GetHotfixData() { return _hotfixData; } public uint GetHotfixCount() { return _hotfixCount; }
public MultiMap<int, Tuple<uint, int>> GetHotfixData() { return _hotfixData; }
public byte[] GetHotfixBlobData(uint tableHash, int recordId) public byte[] GetHotfixBlobData(uint tableHash, int recordId)
{ {
@@ -1884,7 +1886,8 @@ namespace Game.DataStorage
} }
Dictionary<uint, IDB2Storage> _storage = new Dictionary<uint, IDB2Storage>(); Dictionary<uint, IDB2Storage> _storage = new Dictionary<uint, IDB2Storage>();
Dictionary<ulong, int> _hotfixData = new Dictionary<ulong, int>(); uint _hotfixCount = 0;
MultiMap<int, Tuple<uint, int>> _hotfixData = new MultiMap<int, Tuple<uint, int>>();
Dictionary<Tuple<uint, int>, byte[]> _hotfixBlob = new Dictionary<Tuple<uint, int>, byte[]>(); Dictionary<Tuple<uint, int>, byte[]> _hotfixBlob = new Dictionary<Tuple<uint, int>, byte[]>();
MultiMap<uint, uint> _areaGroupMembers = new MultiMap<uint, uint>(); MultiMap<uint, uint> _areaGroupMembers = new MultiMap<uint, uint>();
+18 -8
View File
@@ -382,7 +382,7 @@ namespace Game.DungeonFinding
// Check player or group member restrictions // Check player or group member restrictions
if (!player.GetSession().HasPermission(RBACPermissions.JoinDungeonFinder)) if (!player.GetSession().HasPermission(RBACPermissions.JoinDungeonFinder))
joinData.result = LfgJoinResult.NoSlotsPlayer; joinData.result = LfgJoinResult.NoSlots;
else if (player.InBattleground() || player.InArena() || player.InBattlegroundQueue()) else if (player.InBattleground() || player.InArena() || player.InBattlegroundQueue())
joinData.result = LfgJoinResult.CantUseDungeons; joinData.result = LfgJoinResult.CantUseDungeons;
else if (player.HasAura(SharedConst.LFGSpellDungeonDeserter)) else if (player.HasAura(SharedConst.LFGSpellDungeonDeserter))
@@ -390,9 +390,9 @@ namespace Game.DungeonFinding
else if (player.HasAura(SharedConst.LFGSpellDungeonCooldown)) else if (player.HasAura(SharedConst.LFGSpellDungeonCooldown))
joinData.result = LfgJoinResult.RandomCooldownPlayer; joinData.result = LfgJoinResult.RandomCooldownPlayer;
else if (dungeons.Empty()) else if (dungeons.Empty())
joinData.result = LfgJoinResult.NoSlotsPlayer; joinData.result = LfgJoinResult.NoSlots;
else if (player.HasAura(9454)) // check Freeze debuff else if (player.HasAura(9454)) // check Freeze debuff
joinData.result = LfgJoinResult.NoSlotsPlayer; joinData.result = LfgJoinResult.NoSlots;
else if (grp) else if (grp)
{ {
if (grp.GetMembersCount() > MapConst.MaxGroupSize) if (grp.GetMembersCount() > MapConst.MaxGroupSize)
@@ -414,7 +414,10 @@ namespace Game.DungeonFinding
else if (plrg.InBattleground() || plrg.InArena() || plrg.InBattlegroundQueue()) else if (plrg.InBattleground() || plrg.InArena() || plrg.InBattlegroundQueue())
joinData.result = LfgJoinResult.CantUseDungeons; joinData.result = LfgJoinResult.CantUseDungeons;
else if (plrg.HasAura(9454)) // check Freeze debuff else if (plrg.HasAura(9454)) // check Freeze debuff
joinData.result = LfgJoinResult.PartyNotMeetReqs; {
joinData.result = LfgJoinResult.NoSlots;
joinData.playersMissingRequirement.Add(plrg.GetName());
}
++memberCount; ++memberCount;
players.Add(plrg.GetGUID()); players.Add(plrg.GetGUID());
} }
@@ -471,9 +474,9 @@ namespace Game.DungeonFinding
dungeons = GetDungeonsByRandom(rDungeonId); dungeons = GetDungeonsByRandom(rDungeonId);
// if we have lockmap then there are no compatible dungeons // if we have lockmap then there are no compatible dungeons
GetCompatibleDungeons(dungeons, players, joinData.lockmap, isContinue); GetCompatibleDungeons(dungeons, players, joinData.lockmap, joinData.playersMissingRequirement, isContinue);
if (dungeons.Empty()) if (dungeons.Empty())
joinData.result = grp ? LfgJoinResult.NoLfgObject : LfgJoinResult.NoSlotsPlayer; joinData.result = LfgJoinResult.NoSlots;
} }
} }
@@ -730,10 +733,11 @@ namespace Game.DungeonFinding
} }
} }
void GetCompatibleDungeons(List<uint> dungeons, List<ObjectGuid> players, Dictionary<ObjectGuid, Dictionary<uint, LfgLockInfoData>> lockMap, bool isContinue) void GetCompatibleDungeons(List<uint> dungeons, List<ObjectGuid> players, Dictionary<ObjectGuid, Dictionary<uint, LfgLockInfoData>> lockMap, List<string> playersMissingRequirement, bool isContinue)
{ {
lockMap.Clear(); lockMap.Clear();
Dictionary<uint, uint> lockedDungeons = new Dictionary<uint, uint>(); Dictionary<uint, uint> lockedDungeons = new Dictionary<uint, uint>();
List<uint> dungeonsToRemove = new List<uint>();
foreach (var guid in players) foreach (var guid in players)
{ {
@@ -775,15 +779,20 @@ namespace Game.DungeonFinding
} }
if (eraseDungeon) if (eraseDungeon)
dungeons.Remove(dungeonId); dungeonsToRemove.Add(dungeonId);
if (!lockMap.ContainsKey(guid)) if (!lockMap.ContainsKey(guid))
lockMap[guid] = new Dictionary<uint, LfgLockInfoData>(); lockMap[guid] = new Dictionary<uint, LfgLockInfoData>();
lockMap[guid][it2.Key] = it2.Value; lockMap[guid][it2.Key] = it2.Value;
playersMissingRequirement.Add(player.GetName());
} }
} }
} }
foreach (uint dungeonIdToRemove in dungeonsToRemove)
dungeons.Remove(dungeonIdToRemove);
if (!dungeons.Empty()) if (!dungeons.Empty())
lockMap.Clear(); lockMap.Clear();
} }
@@ -1995,6 +2004,7 @@ namespace Game.DungeonFinding
public LfgJoinResult result; public LfgJoinResult result;
public LfgRoleCheckState state; public LfgRoleCheckState state;
public Dictionary<ObjectGuid, Dictionary<uint, LfgLockInfoData>> lockmap = new Dictionary<ObjectGuid, Dictionary<uint, LfgLockInfoData>>(); public Dictionary<ObjectGuid, Dictionary<uint, LfgLockInfoData>> lockmap = new Dictionary<ObjectGuid, Dictionary<uint, LfgLockInfoData>>();
public List<string> playersMissingRequirement = new List<string>();
} }
public class LfgUpdateData public class LfgUpdateData
@@ -83,6 +83,9 @@ namespace Game.Entities
public float ModExperience; public float ModExperience;
public bool RacialLeader; public bool RacialLeader;
public uint MovementId; public uint MovementId;
public float FadeRegionRadius;
public int WidgetSetID;
public int WidgetSetUnitConditionID;
public bool RegenHealth; public bool RegenHealth;
public uint MechanicImmuneMask; public uint MechanicImmuneMask;
public CreatureFlagsExtra FlagsExtra; public CreatureFlagsExtra FlagsExtra;
-3
View File
@@ -1481,9 +1481,6 @@ namespace Game.Entities
static bool HasStats(ItemInstance itemInstance, BonusData bonus) static bool HasStats(ItemInstance itemInstance, BonusData bonus)
{ {
if (itemInstance.RandomPropertiesID != 0)
return true;
for (byte i = 0; i < ItemConst.MaxStats; ++i) for (byte i = 0; i < ItemConst.MaxStats; ++i)
{ {
if (bonus.ItemStatAllocation[i] != 0) if (bonus.ItemStatAllocation[i] != 0)
@@ -399,6 +399,7 @@ namespace Game.Entities
data.WriteFloat(unit.GetSpeed(UnitMoveType.PitchRate)); data.WriteFloat(unit.GetSpeed(UnitMoveType.PitchRate));
data.WriteUInt32(0); // unit.m_movementInfo.forces.size() data.WriteUInt32(0); // unit.m_movementInfo.forces.size()
data.WriteFloat(1.0f); // MovementForcesModMagnitude
data.WriteBit(HasSpline); data.WriteBit(HasSpline);
data.FlushBits(); data.FlushBits();
@@ -73,9 +73,9 @@ namespace Game.Entities
_owner.GetPlayer().AddDynamicValue(ActivePlayerDynamicFields.Toys, value); _owner.GetPlayer().AddDynamicValue(ActivePlayerDynamicFields.Toys, value);
} }
public bool AddToy(uint itemId, bool isFavourite = false) public bool AddToy(uint itemId, bool isFavourite, bool hasFanfare)
{ {
if (UpdateAccountToys(itemId, isFavourite)) if (UpdateAccountToys(itemId, isFavourite, hasFanfare))
{ {
_owner.GetPlayer().AddDynamicValue(ActivePlayerDynamicFields.Toys, itemId); _owner.GetPlayer().AddDynamicValue(ActivePlayerDynamicFields.Toys, itemId);
return true; return true;
@@ -92,9 +92,8 @@ namespace Game.Entities
do do
{ {
uint itemId = result.Read<uint>(0); uint itemId = result.Read<uint>(0);
bool isFavourite = result.Read<bool>(1);
_toys[itemId] = isFavourite; _toys[itemId] = GetToyFlags(result.Read<bool>(1), result.Read<bool>(2));
} while (result.NextRow()); } while (result.NextRow());
} }
@@ -106,17 +105,18 @@ namespace Game.Entities
stmt = DB.Login.GetPreparedStatement(LoginStatements.REP_ACCOUNT_TOYS); stmt = DB.Login.GetPreparedStatement(LoginStatements.REP_ACCOUNT_TOYS);
stmt.AddValue(0, _owner.GetBattlenetAccountId()); stmt.AddValue(0, _owner.GetBattlenetAccountId());
stmt.AddValue(1, pair.Key); stmt.AddValue(1, pair.Key);
stmt.AddValue(2, pair.Value); stmt.AddValue(2, pair.Value.HasAnyFlag(ToyFlags.Favorite));
stmt.AddValue(3, pair.Value.HasAnyFlag(ToyFlags.HasFanfare));
trans.Append(stmt); trans.Append(stmt);
} }
} }
bool UpdateAccountToys(uint itemId, bool isFavourite = false) bool UpdateAccountToys(uint itemId, bool isFavourite, bool hasFanfare)
{ {
if (_toys.ContainsKey(itemId)) if (_toys.ContainsKey(itemId))
return false; return false;
_toys.Add(itemId, isFavourite); _toys.Add(itemId, GetToyFlags(isFavourite, hasFanfare));
return true; return true;
} }
@@ -125,7 +125,30 @@ namespace Game.Entities
if (!_toys.ContainsKey(itemId)) if (!_toys.ContainsKey(itemId))
return; return;
_toys[itemId] = favorite; if (favorite)
_toys[itemId] |= ToyFlags.Favorite;
else
_toys[itemId] &= ~ToyFlags.Favorite;
}
public void ToyClearFanfare(uint itemId)
{
if (!_toys.ContainsKey(itemId))
return;
_toys[itemId] &= ~ToyFlags.HasFanfare;
}
ToyFlags GetToyFlags(bool isFavourite, bool hasFanfare)
{
ToyFlags flags = ToyFlags.None;
if (isFavourite)
flags |= ToyFlags.Favorite;
if (hasFanfare)
flags |= ToyFlags.HasFanfare;
return flags;
} }
public void OnItemAdded(Item item) public void OnItemAdded(Item item)
@@ -825,13 +848,13 @@ namespace Game.Entities
} }
public bool HasToy(uint itemId) { return _toys.ContainsKey(itemId); } public bool HasToy(uint itemId) { return _toys.ContainsKey(itemId); }
public Dictionary<uint, bool> GetAccountToys() { return _toys; } public Dictionary<uint, ToyFlags> GetAccountToys() { return _toys; }
public Dictionary<uint, HeirloomData> GetAccountHeirlooms() { return _heirlooms; } public Dictionary<uint, HeirloomData> GetAccountHeirlooms() { return _heirlooms; }
public Dictionary<uint, MountStatusFlags> GetAccountMounts() { return _mounts; } public Dictionary<uint, MountStatusFlags> GetAccountMounts() { return _mounts; }
WorldSession _owner; WorldSession _owner;
Dictionary<uint, bool> _toys = new Dictionary<uint, bool>(); Dictionary<uint, ToyFlags> _toys = new Dictionary<uint, ToyFlags>();
Dictionary<uint, HeirloomData> _heirlooms = new Dictionary<uint, HeirloomData>(); Dictionary<uint, HeirloomData> _heirlooms = new Dictionary<uint, HeirloomData>();
Dictionary<uint, MountStatusFlags> _mounts = new Dictionary<uint, MountStatusFlags>(); Dictionary<uint, MountStatusFlags> _mounts = new Dictionary<uint, MountStatusFlags>();
System.Collections.BitSet _appearances; System.Collections.BitSet _appearances;
+1 -1
View File
@@ -3253,7 +3253,7 @@ namespace Game.Entities
stmt.AddValue(index++, GetByteValue(ActivePlayerFields.Bytes, PlayerFieldOffsets.FieldBytesOffsetActionBarToggles)); stmt.AddValue(index++, GetByteValue(ActivePlayerFields.Bytes, PlayerFieldOffsets.FieldBytesOffsetActionBarToggles));
stmt.AddValue(index++, m_grantableLevels); stmt.AddValue(index++, m_grantableLevels);
stmt.AddValue(index++, Global.WorldMgr.GetRealm().Build); stmt.AddValue(index++, Global.RealmMgr.GetMinorMajorBugfixVersionForBuild(Global.WorldMgr.GetRealm().Build));
} }
else else
{ {
+11 -1
View File
@@ -1327,6 +1327,7 @@ namespace Game.Entities
packet.WeeklyQuantity.Set(newWeekCount); packet.WeeklyQuantity.Set(newWeekCount);
packet.TrackedQuantity.Set(newTrackedCount); packet.TrackedQuantity.Set(newTrackedCount);
packet.Flags = playerCurrency.Flags; packet.Flags = playerCurrency.Flags;
packet.QuantityChange.Set(count);
SendPacket(packet); SendPacket(packet);
} }
@@ -2771,7 +2772,7 @@ namespace Game.Entities
} }
void SendNewMail() void SendNewMail()
{ {
SendPacket(new NotifyRecievedMail()); SendPacket(new NotifyReceivedMail());
} }
public void UpdateNextMailTimeAndUnreads() public void UpdateNextMailTimeAndUnreads()
{ {
@@ -5015,6 +5016,7 @@ namespace Game.Entities
displayPlayerChoice.SenderGUID = sender; displayPlayerChoice.SenderGUID = sender;
displayPlayerChoice.ChoiceID = choiceId; displayPlayerChoice.ChoiceID = choiceId;
displayPlayerChoice.UiTextureKitID = playerChoice.UiTextureKitId; displayPlayerChoice.UiTextureKitID = playerChoice.UiTextureKitId;
displayPlayerChoice.SoundKitID = playerChoice.SoundKitId;
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);
@@ -5032,9 +5034,13 @@ namespace Game.Entities
playerChoiceResponse.ChoiceArtFileID = playerChoiceResponseTemplate.ChoiceArtFileId; playerChoiceResponse.ChoiceArtFileID = playerChoiceResponseTemplate.ChoiceArtFileId;
playerChoiceResponse.Flags = playerChoiceResponseTemplate.Flags; playerChoiceResponse.Flags = playerChoiceResponseTemplate.Flags;
playerChoiceResponse.WidgetSetID = playerChoiceResponseTemplate.WidgetSetID; playerChoiceResponse.WidgetSetID = playerChoiceResponseTemplate.WidgetSetID;
playerChoiceResponse.UiTextureAtlasElementID = playerChoiceResponseTemplate.UiTextureAtlasElementID;
playerChoiceResponse.SoundKitID = playerChoiceResponseTemplate.SoundKitID;
playerChoiceResponse.GroupID = playerChoiceResponseTemplate.GroupID; playerChoiceResponse.GroupID = playerChoiceResponseTemplate.GroupID;
playerChoiceResponse.Answer = playerChoiceResponseTemplate.Answer; playerChoiceResponse.Answer = playerChoiceResponseTemplate.Answer;
playerChoiceResponse.Header = playerChoiceResponseTemplate.Header; playerChoiceResponse.Header = playerChoiceResponseTemplate.Header;
playerChoiceResponse.SubHeader = playerChoiceResponseTemplate.SubHeader;
playerChoiceResponse.ButtonTooltip = playerChoiceResponseTemplate.ButtonTooltip;
playerChoiceResponse.Description = playerChoiceResponseTemplate.Description; playerChoiceResponse.Description = playerChoiceResponseTemplate.Description;
playerChoiceResponse.Confirmation = playerChoiceResponseTemplate.Confirmation; playerChoiceResponse.Confirmation = playerChoiceResponseTemplate.Confirmation;
if (playerChoiceLocale != null) if (playerChoiceLocale != null)
@@ -5044,6 +5050,8 @@ namespace Game.Entities
{ {
ObjectManager.GetLocaleString(playerChoiceResponseLocale.Answer, locale, ref playerChoiceResponse.Answer); ObjectManager.GetLocaleString(playerChoiceResponseLocale.Answer, locale, ref playerChoiceResponse.Answer);
ObjectManager.GetLocaleString(playerChoiceResponseLocale.Header, locale, ref playerChoiceResponse.Header); ObjectManager.GetLocaleString(playerChoiceResponseLocale.Header, locale, ref playerChoiceResponse.Header);
ObjectManager.GetLocaleString(playerChoiceResponseLocale.SubHeader, locale, ref playerChoiceResponse.SubHeader);
ObjectManager.GetLocaleString(playerChoiceResponseLocale.ButtonTooltip, locale, ref playerChoiceResponse.ButtonTooltip);
ObjectManager.GetLocaleString(playerChoiceResponseLocale.Description, locale, ref playerChoiceResponse.Description); ObjectManager.GetLocaleString(playerChoiceResponseLocale.Description, locale, ref playerChoiceResponse.Description);
ObjectManager.GetLocaleString(playerChoiceResponseLocale.Confirmation, locale, ref playerChoiceResponse.Confirmation); ObjectManager.GetLocaleString(playerChoiceResponseLocale.Confirmation, locale, ref playerChoiceResponse.Confirmation);
} }
@@ -5093,6 +5101,8 @@ namespace Game.Entities
playerChoiceResponse.Reward.Set(reward); playerChoiceResponse.Reward.Set(reward);
displayPlayerChoice.Responses[i] = playerChoiceResponse; displayPlayerChoice.Responses[i] = playerChoiceResponse;
} }
playerChoiceResponse.RewardQuestID = playerChoiceResponseTemplate.RewardQuestID;
} }
SendPacket(displayPlayerChoice); SendPacket(displayPlayerChoice);
+4 -4
View File
@@ -977,7 +977,7 @@ namespace Game.Entities
playOrphanSpellVisual.SpellVisualID = spellVisualId; playOrphanSpellVisual.SpellVisualID = spellVisualId;
playOrphanSpellVisual.TravelSpeed = travelSpeed; playOrphanSpellVisual.TravelSpeed = travelSpeed;
playOrphanSpellVisual.SpeedAsTime = speedAsTime; playOrphanSpellVisual.SpeedAsTime = speedAsTime;
playOrphanSpellVisual.UnkZero = 0.0f; playOrphanSpellVisual.LaunchDelay = 0.0f;
SendMessageToSet(playOrphanSpellVisual, true); SendMessageToSet(playOrphanSpellVisual, true);
} }
@@ -991,7 +991,7 @@ namespace Game.Entities
playOrphanSpellVisual.SpellVisualID = spellVisualId; playOrphanSpellVisual.SpellVisualID = spellVisualId;
playOrphanSpellVisual.TravelSpeed = travelSpeed; playOrphanSpellVisual.TravelSpeed = travelSpeed;
playOrphanSpellVisual.SpeedAsTime = speedAsTime; playOrphanSpellVisual.SpeedAsTime = speedAsTime;
playOrphanSpellVisual.UnkZero = 0.0f; playOrphanSpellVisual.LaunchDelay = 0.0f;
SendMessageToSet(playOrphanSpellVisual, true); SendMessageToSet(playOrphanSpellVisual, true);
} }
@@ -1016,12 +1016,12 @@ namespace Game.Entities
SendMessageToSet(playSpellVisual, true); SendMessageToSet(playSpellVisual, true);
} }
public void SendPlaySpellVisual(Vector3 targetPosition, float o, uint spellVisualId, uint missReason, uint reflectStatus, float travelSpeed, bool speedAsTime = false) public void SendPlaySpellVisual(Vector3 targetPosition, float launchDelay, uint spellVisualId, uint missReason, uint reflectStatus, float travelSpeed, bool speedAsTime = false)
{ {
PlaySpellVisual playSpellVisual = new PlaySpellVisual(); PlaySpellVisual playSpellVisual = new PlaySpellVisual();
playSpellVisual.Source = GetGUID(); playSpellVisual.Source = GetGUID();
playSpellVisual.TargetPosition = targetPosition; // exclusive with Target playSpellVisual.TargetPosition = targetPosition; // exclusive with Target
playSpellVisual.Orientation = o; playSpellVisual.LaunchDelay = launchDelay;
playSpellVisual.SpellVisualID = spellVisualId; playSpellVisual.SpellVisualID = spellVisualId;
playSpellVisual.TravelSpeed = travelSpeed; playSpellVisual.TravelSpeed = travelSpeed;
playSpellVisual.MissReason = (ushort)missReason; playSpellVisual.MissReason = (ushort)missReason;
+48 -26
View File
@@ -1760,8 +1760,10 @@ namespace Game
"spell1, spell2, spell3, spell4, spell5, spell6, spell7, spell8, VehicleId, mingold, maxgold, AIName, MovementType, " + "spell1, spell2, spell3, spell4, spell5, spell6, spell7, spell8, VehicleId, mingold, maxgold, AIName, MovementType, " +
//60 61 62 63 64 65 66 67 68 //60 61 62 63 64 65 66 67 68
"InhabitType, HoverHeight, HealthModifier, HealthModifierExtra, ManaModifier, ManaModifierExtra, ArmorModifier, DamageModifier, ExperienceModifier, " + "InhabitType, HoverHeight, HealthModifier, HealthModifierExtra, ManaModifier, ManaModifierExtra, ArmorModifier, DamageModifier, ExperienceModifier, " +
//69 70 71 72 73 74 //69 70 71 72 73 74 75 76
"RacialLeader, movementId, RegenHealth, mechanic_immune_mask, flags_extra, ScriptName FROM creature_template"); "RacialLeader, movementId, FadeRegionRadius, WidgetSetID, WidgetSetUnitConditionID, RegenHealth, mechanic_immune_mask, flags_extra, " +
//77
"ScriptName FROM creature_template");
if (result.IsEmpty()) if (result.IsEmpty())
@@ -1855,10 +1857,13 @@ namespace Game
creature.ModExperience = fields.Read<float>(68); creature.ModExperience = fields.Read<float>(68);
creature.RacialLeader = fields.Read<bool>(69); creature.RacialLeader = fields.Read<bool>(69);
creature.MovementId = fields.Read<uint>(70); creature.MovementId = fields.Read<uint>(70);
creature.RegenHealth = fields.Read<bool>(71); creature.FadeRegionRadius = fields.Read<float>(71);
creature.MechanicImmuneMask = fields.Read<uint>(72); creature.WidgetSetID = fields.Read<int>(72);
creature.FlagsExtra = (CreatureFlagsExtra)fields.Read<uint>(73); creature.WidgetSetUnitConditionID = fields.Read<int>(73);
creature.ScriptID = GetScriptId(fields.Read<string>(74)); creature.RegenHealth = fields.Read<bool>(74);
creature.MechanicImmuneMask = fields.Read<uint>(75);
creature.FlagsExtra = (CreatureFlagsExtra)fields.Read<uint>(76);
creature.ScriptID = GetScriptId(fields.Read<string>(77));
creatureTemplateStorage.Add(entry, creature); creatureTemplateStorage.Add(entry, creature);
} }
@@ -6298,9 +6303,9 @@ namespace Game
"RewardFactionID5, RewardFactionValue5, RewardFactionOverride5, RewardFactionCapIn5, RewardFactionFlags, " + "RewardFactionID5, RewardFactionValue5, RewardFactionOverride5, RewardFactionCapIn5, RewardFactionFlags, " +
//96 97 98 99 100 101 102 103 //96 97 98 99 100 101 102 103
"RewardCurrencyID1, RewardCurrencyQty1, RewardCurrencyID2, RewardCurrencyQty2, RewardCurrencyID3, RewardCurrencyQty3, RewardCurrencyID4, RewardCurrencyQty4, " + "RewardCurrencyID1, RewardCurrencyQty1, RewardCurrencyID2, RewardCurrencyQty2, RewardCurrencyID3, RewardCurrencyQty3, RewardCurrencyID4, RewardCurrencyQty4, " +
//104 105 106 107 108 109 110 //104 105 106 107 108 109 110 111
"AcceptedSoundKitID, CompleteSoundKitID, AreaGroupID, TimeAllowed, AllowableRaces, TreasurePickerID, Expansion, " + "AcceptedSoundKitID, CompleteSoundKitID, AreaGroupID, TimeAllowed, AllowableRaces, TreasurePickerID, Expansion, ManagedWorldStateID, " +
//111 112 113 114 115 116 117 118 119 //112 113 114 115 116 117 118 119 120
"LogTitle, LogDescription, QuestDescription, AreaDescription, PortraitGiverText, PortraitGiverName, PortraitTurnInText, PortraitTurnInName, QuestCompletionLog" + "LogTitle, LogDescription, QuestDescription, AreaDescription, PortraitGiverText, PortraitGiverName, PortraitTurnInText, PortraitTurnInName, QuestCompletionLog" +
" FROM quest_template"); " FROM quest_template");
@@ -8834,7 +8839,7 @@ namespace Game
uint oldMSTime = Time.GetMSTime(); uint oldMSTime = Time.GetMSTime();
_playerChoices.Clear(); _playerChoices.Clear();
SQLResult choiceResult = DB.World.Query("SELECT ChoiceId, UiTextureKitId, Question, HideWarboardHeader, KeepOpenAfterChoice FROM playerchoice"); SQLResult choiceResult = DB.World.Query("SELECT ChoiceId, UiTextureKitId, SoundKitId, Question, HideWarboardHeader, KeepOpenAfterChoice 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.");
@@ -8852,15 +8857,16 @@ namespace Game
PlayerChoice choice = new PlayerChoice(); PlayerChoice choice = new PlayerChoice();
choice.ChoiceId = choiceResult.Read<int>(0); choice.ChoiceId = choiceResult.Read<int>(0);
choice.UiTextureKitId = choiceResult.Read<int>(1); choice.UiTextureKitId = choiceResult.Read<int>(1);
choice.Question = choiceResult.Read<string>(2); choice.SoundKitId = choiceResult.Read<uint>(2);
choice.HideWarboardHeader = choiceResult.Read<bool>(3); choice.Question = choiceResult.Read<string>(3);
choice.KeepOpenAfterChoice = choiceResult.Read<bool>(4); choice.HideWarboardHeader = choiceResult.Read<bool>(4);
choice.KeepOpenAfterChoice = choiceResult.Read<bool>(5);
_playerChoices[choice.ChoiceId] = choice; _playerChoices[choice.ChoiceId] = choice;
} while (choiceResult.NextRow()); } while (choiceResult.NextRow());
SQLResult responses = DB.World.Query("SELECT ChoiceId, ResponseId, ChoiceArtFileId, Flags, WidgetSetID, GroupID, Header, Answer, Description, Confirmation FROM playerchoice_response ORDER BY `Index` ASC"); SQLResult responses = DB.World.Query("SELECT ChoiceId, ResponseId, ChoiceArtFileId, Flags, WidgetSetID, UiTextureAtlasElementID, SoundKitID, GroupID, Answer, Header, SubHeader, ButtonTemplate, Description, Confirmation, RewardQuestID FROM playerchoice_response ORDER BY `Index` ASC");
if (!responses.IsEmpty()) if (!responses.IsEmpty())
{ {
do do
@@ -8881,11 +8887,17 @@ namespace Game
response.ChoiceArtFileId = responses.Read<int>(2); response.ChoiceArtFileId = responses.Read<int>(2);
response.Flags = responses.Read<int>(3); response.Flags = responses.Read<int>(3);
response.WidgetSetID = responses.Read<uint>(4); response.WidgetSetID = responses.Read<uint>(4);
response.GroupID = responses.Read<byte>(5); response.UiTextureAtlasElementID = responses.Read<uint>(5);
response.Header = responses.Read<string>(6); response.SoundKitID = responses.Read<uint>(6);
response.Answer = responses.Read<string>(7); response.GroupID = responses.Read<byte>(7);
response.Description = responses.Read<string>(8); response.Answer = responses.Read<string>(8);
response.Confirmation = responses.Read<string>(9); response.Header = responses.Read<string>(9);
response.SubHeader = responses.Read<string>(10);
response.ButtonTooltip = responses.Read<string>(11);
response.Description = responses.Read<string>(12);
response.Confirmation = responses.Read<string>(13);
if (!responses.IsNull(14))
response.RewardQuestID.Set(responses.Read<uint>(14));
++responseCount; ++responseCount;
choice.Responses[responseId] = response; choice.Responses[responseId] = response;
@@ -9122,8 +9134,8 @@ namespace Game
oldMSTime = Time.GetMSTime(); oldMSTime = Time.GetMSTime();
// 0 1 2 3 4 5 6 // 0 1 2 3 4 5 6 7 8
result = DB.World.Query("SELECT ChoiceID, ResponseID, locale, Header, Answer, Description, Confirmation FROM playerchoice_response_locale"); result = DB.World.Query("SELECT ChoiceID, ResponseID, locale, Answer, Header, SubHeader, ButtonTooltip, Description, Confirmation FROM playerchoice_response_locale");
if (!result.IsEmpty()) if (!result.IsEmpty())
{ {
uint count = 0; uint count = 0;
@@ -9151,10 +9163,12 @@ namespace Game
} }
PlayerChoiceResponseLocale data = playerChoiceLocale.Responses[responseId]; PlayerChoiceResponseLocale data = playerChoiceLocale.Responses[responseId];
AddLocaleString(result.Read<string>(3), locale, data.Header); AddLocaleString(result.Read<string>(3), locale, data.Answer);
AddLocaleString(result.Read<string>(4), locale, data.Answer); AddLocaleString(result.Read<string>(4), locale, data.Header);
AddLocaleString(result.Read<string>(5), locale, data.Description); AddLocaleString(result.Read<string>(5), locale, data.SubHeader);
AddLocaleString(result.Read<string>(6), locale, data.Confirmation); AddLocaleString(result.Read<string>(6), locale, data.ButtonTooltip);
AddLocaleString(result.Read<string>(7), locale, data.Description);
AddLocaleString(result.Read<string>(8), locale, data.Confirmation);
count++; count++;
} while (result.NextRow()); } while (result.NextRow());
@@ -10579,6 +10593,8 @@ namespace Game
{ {
public StringArray Answer = new StringArray((int)LocaleConstant.Total); public StringArray Answer = new StringArray((int)LocaleConstant.Total);
public StringArray Header = new StringArray((int)LocaleConstant.Total); public StringArray Header = new StringArray((int)LocaleConstant.Total);
public StringArray SubHeader = new StringArray((int)LocaleConstant.Total);
public StringArray ButtonTooltip = new StringArray((int)LocaleConstant.Total);
public StringArray Description = new StringArray((int)LocaleConstant.Total); public StringArray Description = new StringArray((int)LocaleConstant.Total);
public StringArray Confirmation = new StringArray((int)LocaleConstant.Total); public StringArray Confirmation = new StringArray((int)LocaleConstant.Total);
} }
@@ -10632,12 +10648,17 @@ namespace Game
public int ChoiceArtFileId; public int ChoiceArtFileId;
public int Flags; public int Flags;
public uint WidgetSetID; public uint WidgetSetID;
public uint UiTextureAtlasElementID;
public uint SoundKitID;
public byte GroupID; public byte GroupID;
public string Header;
public string Answer; public string Answer;
public string Header;
public string SubHeader;
public string ButtonTooltip;
public string Description; public string Description;
public string Confirmation; public string Confirmation;
public Optional<PlayerChoiceResponseReward> Reward; public Optional<PlayerChoiceResponseReward> Reward;
public Optional<uint> RewardQuestID;
} }
public class PlayerChoice public class PlayerChoice
@@ -10649,6 +10670,7 @@ namespace Game
public int ChoiceId; public int ChoiceId;
public int UiTextureKitId; public int UiTextureKitId;
public uint SoundKitId;
public string Question; public string Question;
public List<PlayerChoiceResponse> Responses = new List<PlayerChoiceResponse>(); public List<PlayerChoiceResponse> Responses = new List<PlayerChoiceResponse>();
public bool HideWarboardHeader; public bool HideWarboardHeader;
+3 -2
View File
@@ -254,10 +254,11 @@ namespace Game.Guilds
session.SendPacket(roster); session.SendPacket(roster);
} }
public void SendQueryResponse(WorldSession session) public void SendQueryResponse(WorldSession session, ObjectGuid playerGuid)
{ {
QueryGuildInfoResponse response = new QueryGuildInfoResponse(); QueryGuildInfoResponse response = new QueryGuildInfoResponse();
response.GuildGUID = GetGUID(); response.GuildGUID = GetGUID();
response.PlayerGuid = playerGuid;
response.HasGuildInfo = true; response.HasGuildInfo = true;
response.Info.GuildGuid = GetGUID(); response.Info.GuildGuid = GetGUID();
@@ -400,7 +401,7 @@ namespace Game.Guilds
SendSaveEmblemResult(session, GuildEmblemError.Success); // "Guild Emblem saved." SendSaveEmblemResult(session, GuildEmblemError.Success); // "Guild Emblem saved."
SendQueryResponse(session); SendQueryResponse(session, ObjectGuid.Empty);
} }
} }
-33
View File
@@ -1,33 +0,0 @@
/*
* Copyright (C) 2012-2019 CypherCore <http://github.com/CypherCore>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
using Framework.Constants;
using Game.Network.Packets;
namespace Game
{
public partial class WorldSession
{
void SendNotInArenaTeamPacket(ArenaTypes type)
{
ArenaError arenaError = new ArenaError();
arenaError.ErrorType = ArenaErrorType.NoTeam;
arenaError.TeamSize = (byte)type; // team type (2=2v2, 3=3v3, 5=5v5), can be used for custom types...
SendPacket(arenaError);
}
}
}
+11 -12
View File
@@ -57,11 +57,14 @@ namespace Game
void HandleBattlemasterJoin(BattlemasterJoin battlemasterJoin) void HandleBattlemasterJoin(BattlemasterJoin battlemasterJoin)
{ {
bool isPremade = false; bool isPremade = false;
Group grp = null;
BattlefieldStatusFailed battlefieldStatusFailed; if (battlemasterJoin.QueueIDs.Empty())
{
Log.outError(LogFilter.Network, $"Battleground: no bgtype received. possible cheater? {_player.GetGUID().ToString()}");
return;
}
uint bgTypeId_ = (uint)(battlemasterJoin.QueueID & 0xFFFF); uint bgTypeId_ = (uint)(battlemasterJoin.QueueIDs[0] & 0xFFFF);
if (!CliDB.BattlemasterListStorage.ContainsKey(bgTypeId_)) if (!CliDB.BattlemasterListStorage.ContainsKey(bgTypeId_))
{ {
Log.outError(LogFilter.Network, "Battleground: invalid bgtype ({0}) received. possible cheater? player guid {1}", bgTypeId_, GetPlayer().GetGUID().ToString()); Log.outError(LogFilter.Network, "Battleground: invalid bgtype ({0}) received. possible cheater? player guid {1}", bgTypeId_, GetPlayer().GetGUID().ToString());
@@ -94,8 +97,12 @@ namespace Game
return; return;
GroupJoinBattlegroundResult err = GroupJoinBattlegroundResult.None; GroupJoinBattlegroundResult err = GroupJoinBattlegroundResult.None;
Group grp = _player.GetGroup();
BattlefieldStatusFailed battlefieldStatusFailed;
// check queue conditions // check queue conditions
if (!battlemasterJoin.JoinAsGroup) if (grp == null)
{ {
if (GetPlayer().isUsingLfg()) if (GetPlayer().isUsingLfg())
{ {
@@ -159,11 +166,6 @@ namespace Game
} }
else else
{ {
grp = GetPlayer().GetGroup();
if (!grp)
return;
if (grp.GetLeaderGUID() != GetPlayer().GetGUID()) if (grp.GetLeaderGUID() != GetPlayer().GetGUID())
return; return;
@@ -517,10 +519,7 @@ namespace Game
// check real arenateam existence only here (if it was moved to group.CanJoin .. () then we would ahve to get it twice) // check real arenateam existence only here (if it was moved to group.CanJoin .. () then we would ahve to get it twice)
ArenaTeam at = Global.ArenaTeamMgr.GetArenaTeamById(ateamId); ArenaTeam at = Global.ArenaTeamMgr.GetArenaTeamById(ateamId);
if (at == null) if (at == null)
{
GetPlayer().GetSession().SendNotInArenaTeamPacket(arenatype);
return; return;
}
// get the team rating for queuing // get the team rating for queuing
uint arenaRating = at.GetRating(); uint arenaRating = at.GetRating();
+1 -1
View File
@@ -157,7 +157,7 @@ namespace Game
packet.MarketID = templ.MarketID; packet.MarketID = templ.MarketID;
packet.Item = templ.Item; packet.Item = templ.Item;
packet.RandomPropertiesID = templ.Item.RandomPropertiesID; packet.RandomPropertiesID = 0;
SendPacket(packet); SendPacket(packet);
} }
+2 -1
View File
@@ -34,13 +34,14 @@ namespace Game
{ {
if (guild.IsMember(query.PlayerGuid)) if (guild.IsMember(query.PlayerGuid))
{ {
guild.SendQueryResponse(this); guild.SendQueryResponse(this, query.PlayerGuid);
return; return;
} }
} }
QueryGuildInfoResponse response = new QueryGuildInfoResponse(); QueryGuildInfoResponse response = new QueryGuildInfoResponse();
response.GuildGUID = query.GuildGuid; response.GuildGUID = query.GuildGuid;
response.PlayerGuid = query.PlayerGuid;
SendPacket(response); SendPacket(response);
} }
+25 -22
View File
@@ -59,41 +59,44 @@ namespace Game
void SendAvailableHotfixes(int version) void SendAvailableHotfixes(int version)
{ {
SendPacket(new AvailableHotfixes(version, Global.DB2Mgr.GetHotfixData())); SendPacket(new AvailableHotfixes(version, Global.DB2Mgr.GetHotfixCount(), Global.DB2Mgr.GetHotfixData()));
} }
[WorldPacketHandler(ClientOpcodes.HotfixRequest, Status = SessionStatus.Authed)] [WorldPacketHandler(ClientOpcodes.HotfixRequest, Status = SessionStatus.Authed)]
void HandleHotfixRequest(HotfixRequest hotfixQuery) void HandleHotfixRequest(HotfixRequest hotfixQuery)
{ {
Dictionary<ulong, int> hotfixes = Global.DB2Mgr.GetHotfixData(); var hotfixes = Global.DB2Mgr.GetHotfixData();
HotfixResponse hotfixQueryResponse = new HotfixResponse(); HotfixResponse hotfixQueryResponse = new HotfixResponse();
foreach (ulong hotfixId in hotfixQuery.Hotfixes) foreach (HotfixRecord hotfixRecord in hotfixQuery.Hotfixes)
{ {
int hotfix = hotfixes.LookupByKey(hotfixId); var hotfixedRecords = hotfixes.LookupByKey(hotfixRecord.HotfixID);
if (hotfix != 0) if (!hotfixedRecords.Empty())
{ {
var storage = Global.DB2Mgr.GetStorage(MathFunctions.Pair64_HiPart(hotfixId)); foreach (var tableRecord in hotfixedRecords)
{
var storage = Global.DB2Mgr.GetStorage(hotfixRecord.TableHash);
HotfixResponse.HotfixData hotfixData = new HotfixResponse.HotfixData(); HotfixResponse.HotfixData hotfixData = new HotfixResponse.HotfixData();
hotfixData.ID = hotfixId; hotfixData.Record = hotfixRecord;
hotfixData.RecordID = hotfix; if (storage != null && storage.HasRecord((uint)hotfixData.Record.RecordID))
if (storage != null && storage.HasRecord((uint)hotfixData.RecordID))
{
hotfixData.Data.HasValue = true;
storage.WriteRecord((uint)hotfixData.RecordID, GetSessionDbcLocale(), hotfixData.Data.Value);
}
else
{
byte[] blobData = Global.DB2Mgr.GetHotfixBlobData(MathFunctions.Pair64_HiPart(hotfixId), hotfix);
if (blobData != null)
{ {
hotfixData.Data.HasValue = true; uint pos = hotfixQueryResponse.HotfixContent.GetSize();
hotfixData.Data.Value.WriteBytes(blobData); storage.WriteRecord((uint)hotfixData.Record.RecordID, GetSessionDbcLocale(), hotfixQueryResponse.HotfixContent);
hotfixData.Size.Set(hotfixQueryResponse.HotfixContent.GetSize() - pos);
}
else
{
byte[] blobData = Global.DB2Mgr.GetHotfixBlobData(hotfixData.Record.TableHash, hotfixData.Record.RecordID);
if (blobData != null)
{
hotfixData.Size.Set((uint)blobData.Length);
hotfixQueryResponse.HotfixContent.WriteBytes(blobData);
}
} }
}
hotfixQueryResponse.Hotfixes.Add(hotfixData); hotfixQueryResponse.Hotfixes.Add(hotfixData);
}
} }
} }
+5 -51
View File
@@ -78,61 +78,15 @@ namespace Game
inspectResult.InspecteeGUID = inspect.Target; inspectResult.InspecteeGUID = inspect.Target;
inspectResult.SpecializationID = (int)player.GetUInt32Value(PlayerFields.CurrentSpecId); inspectResult.SpecializationID = (int)player.GetUInt32Value(PlayerFields.CurrentSpecId);
inspectResult.LifetimeMaxRank = player.GetByteValue(ActivePlayerFields.Bytes, PlayerFieldOffsets.FieldBytesOffsetLifetimeMaxPvpRank);
inspectResult.TodayHK = player.GetUInt16Value(ActivePlayerFields.Kills, PlayerFieldOffsets.FieldKillsOffsetTodayKills);
inspectResult.YesterdayHK = player.GetUInt16Value(ActivePlayerFields.Kills, PlayerFieldOffsets.FieldKillsOffsetYesterdayKills);
inspectResult.LifetimeHK = player.GetUInt32Value(ActivePlayerFields.LifetimeHonorableKills);
inspectResult.HonorLevel = player.GetUInt32Value(PlayerFields.HonorLevel);
SendPacket(inspectResult); SendPacket(inspectResult);
} }
[WorldPacketHandler(ClientOpcodes.RequestHonorStats)]
void HandleRequestHonorStatsOpcode(RequestHonorStats request)
{
Player player = Global.ObjAccessor.FindPlayer(request.TargetGUID);
if (!player)
{
Log.outDebug(LogFilter.Network, "WorldSession.HandleRequestHonorStatsOpcode: Target {0} not found.", request.TargetGUID.ToString());
return;
}
if (!GetPlayer().IsWithinDistInMap(player, SharedConst.InspectDistance, false))
return;
if (GetPlayer().IsValidAttackTarget(player))
return;
InspectHonorStats honorStats = new InspectHonorStats();
honorStats.PlayerGUID = request.TargetGUID;
honorStats.LifetimeHK = player.GetUInt32Value(ActivePlayerFields.LifetimeHonorableKills);
honorStats.YesterdayHK = player.GetUInt16Value(ActivePlayerFields.Kills, 1);
honorStats.TodayHK = player.GetUInt16Value(ActivePlayerFields.Kills, 0);
honorStats.LifetimeMaxRank = 0; // @todo
SendPacket(honorStats);
}
[WorldPacketHandler(ClientOpcodes.InspectPvp)]
void HandleInspectPVP(InspectPVPRequest request)
{
// @todo: deal with request.InspectRealmAddress
Player player = Global.ObjAccessor.FindPlayer(request.InspectTarget);
if (!player)
{
Log.outDebug(LogFilter.Network, "WorldSession.HandleInspectPVP: Target {0} not found.", request.InspectTarget.ToString());
return;
}
if (!GetPlayer().IsWithinDistInMap(player, SharedConst.InspectDistance, false))
return;
if (GetPlayer().IsValidAttackTarget(player))
return;
InspectPVPResponse response = new InspectPVPResponse();
response.ClientGUID = request.InspectTarget;
// @todo: fill brackets
SendPacket(response);
}
[WorldPacketHandler(ClientOpcodes.QueryInspectAchievements)] [WorldPacketHandler(ClientOpcodes.QueryInspectAchievements)]
void HandleQueryInspectAchievements(QueryInspectAchievements inspect) void HandleQueryInspectAchievements(QueryInspectAchievements inspect)
{ {
+2 -1
View File
@@ -316,7 +316,6 @@ namespace Game
foreach (var dungeonId in dungeons) foreach (var dungeonId in dungeons)
lfgRoleCheckUpdate.JoinSlots.Add(Global.LFGMgr.GetLFGDungeonEntry(dungeonId)); lfgRoleCheckUpdate.JoinSlots.Add(Global.LFGMgr.GetLFGDungeonEntry(dungeonId));
lfgRoleCheckUpdate.BgQueueID = 0;
lfgRoleCheckUpdate.GroupFinderActivityID = 0; lfgRoleCheckUpdate.GroupFinderActivityID = 0;
if (!roleCheck.roles.Empty()) if (!roleCheck.roles.Empty())
{ {
@@ -348,6 +347,8 @@ namespace Game
lfgJoinResult.Result = (byte)joinData.result; lfgJoinResult.Result = (byte)joinData.result;
if (joinData.result == LfgJoinResult.RoleCheckFailed) if (joinData.result == LfgJoinResult.RoleCheckFailed)
lfgJoinResult.ResultDetail = (byte)joinData.state; lfgJoinResult.ResultDetail = (byte)joinData.state;
else if (joinData.result == LfgJoinResult.NoSlots)
lfgJoinResult.BlackListNames = joinData.playersMissingRequirement;
foreach (var it in joinData.lockmap) foreach (var it in joinData.lockmap)
{ {
+9 -19
View File
@@ -196,42 +196,32 @@ namespace Game
playersNear.Add(member); playersNear.Add(member);
} }
uint goldPerPlayer = (uint)(loot.gold / playersNear.Count); ulong goldPerPlayer = (ulong)(loot.gold / playersNear.Count);
foreach (var pl in playersNear) foreach (var pl in playersNear)
{ {
pl.ModifyMoney(goldPerPlayer); ulong goldMod = MathFunctions.CalculatePct(goldPerPlayer, pl.GetTotalAuraModifierByMiscValue(AuraType.ModMoneyGain, 1));
pl.UpdateCriteria(CriteriaTypes.LootMoney, goldPerPlayer);
Guild guild = Global.GuildMgr.GetGuildById(pl.GetGuildId()); pl.ModifyMoney((long)(goldPerPlayer + goldMod));
if (guild) pl.UpdateCriteria(CriteriaTypes.LootMoney, goldPerPlayer);
{
uint guildGold = MathFunctions.CalculatePct(goldPerPlayer, pl.GetTotalAuraModifier(AuraType.DepositBonusMoneyInGuildBankOnLoot));
if (guildGold != 0)
guild.HandleMemberDepositMoney(this, guildGold, true);
}
LootMoneyNotify packet = new LootMoneyNotify(); LootMoneyNotify packet = new LootMoneyNotify();
packet.Money = goldPerPlayer; packet.Money = goldPerPlayer;
packet.MoneyMod = goldMod;
packet.SoleLooter = playersNear.Count <= 1 ? true : false; packet.SoleLooter = playersNear.Count <= 1 ? true : false;
pl.SendPacket(packet); pl.SendPacket(packet);
} }
} }
else else
{ {
player.ModifyMoney(loot.gold); ulong goldMod = MathFunctions.CalculatePct(loot.gold, player.GetTotalAuraModifierByMiscValue(AuraType.ModMoneyGain, 1));
player.UpdateCriteria(CriteriaTypes.LootMoney, loot.gold);
Guild guild = Global.GuildMgr.GetGuildById(player.GetGuildId()); player.ModifyMoney((long)(loot.gold + goldMod));
if (guild) player.UpdateCriteria(CriteriaTypes.LootMoney, loot.gold);
{
uint guildGold = MathFunctions.CalculatePct(loot.gold, player.GetTotalAuraModifier(AuraType.DepositBonusMoneyInGuildBankOnLoot));
if (guildGold != 0)
guild.HandleMemberDepositMoney(this, guildGold, true);
}
LootMoneyNotify packet = new LootMoneyNotify(); LootMoneyNotify packet = new LootMoneyNotify();
packet.Money = loot.gold; packet.Money = loot.gold;
packet.MoneyMod = goldMod;
packet.SoleLooter = true; // "You loot..." packet.SoleLooter = true; // "You loot..."
SendPacket(packet); SendPacket(packet);
} }
+1
View File
@@ -534,6 +534,7 @@ namespace Game
item.StackCount = (int)itemTemplate.GetBuyCount(); item.StackCount = (int)itemTemplate.GetBuyCount();
item.Price = (ulong)price; item.Price = (ulong)price;
item.DoNotFilterOnVendor = vendorItem.IgnoreFiltering; item.DoNotFilterOnVendor = vendorItem.IgnoreFiltering;
item.Refundable = (itemTemplate.GetFlags() & ItemFlags.ItemPurchaseRecord) != 0 && vendorItem.ExtendedCost != 0 && itemTemplate.GetMaxStackSize() == 1;
item.Item.ItemID = vendorItem.item; item.Item.ItemID = vendorItem.item;
if (!vendorItem.BonusListIDs.Empty()) if (!vendorItem.BonusListIDs.Empty())
+3
View File
@@ -158,6 +158,9 @@ namespace Game
stats.HealthScalingExpansion = creatureInfo.HealthScalingExpansion; stats.HealthScalingExpansion = creatureInfo.HealthScalingExpansion;
stats.VignetteID = creatureInfo.VignetteID; stats.VignetteID = creatureInfo.VignetteID;
stats.Class = (int)creatureInfo.UnitClass; stats.Class = (int)creatureInfo.UnitClass;
stats.FadeRegionRadius = creatureInfo.FadeRegionRadius;
stats.WidgetSetID = creatureInfo.WidgetSetID;
stats.WidgetSetUnitConditionID = creatureInfo.WidgetSetUnitConditionID;
stats.Title = creatureInfo.SubName; stats.Title = creatureInfo.SubName;
stats.TitleAlt = creatureInfo.TitleAlt; stats.TitleAlt = creatureInfo.TitleAlt;
+7 -1
View File
@@ -48,7 +48,7 @@ namespace Game
return; return;
} }
if (_collectionMgr.AddToy(item.GetEntry(), false)) if (_collectionMgr.AddToy(item.GetEntry(), false, false))
_player.DestroyItem(item.GetBagSlot(), item.GetSlot(), true); _player.DestroyItem(item.GetBagSlot(), item.GetSlot(), true);
} }
@@ -93,5 +93,11 @@ namespace Game
spell.m_castFlagsEx |= SpellCastFlagsEx.UseToySpell; spell.m_castFlagsEx |= SpellCastFlagsEx.UseToySpell;
spell.prepare(targets); spell.prepare(targets);
} }
[WorldPacketHandler(ClientOpcodes.ToyClearFanfare)]
void HandleToyClearFanfare(ToyClearFanfare toyClearFanfare)
{
_collectionMgr.ToyClearFanfare(toyClearFanfare.ItemID);
}
} }
} }
@@ -32,10 +32,12 @@ namespace Game.Network.Packets
{ {
_worldPacket.WriteUInt32(CurrentSeason); _worldPacket.WriteUInt32(CurrentSeason);
_worldPacket.WriteUInt32(PreviousSeason); _worldPacket.WriteUInt32(PreviousSeason);
_worldPacket.WriteUInt32(PvpSeasonID);
} }
public uint PreviousSeason = 0; public uint PreviousSeason;
public uint CurrentSeason = 0; public uint CurrentSeason;
public uint PvpSeasonID;
} }
public class AreaSpiritHealerQuery : ClientPacket public class AreaSpiritHealerQuery : ClientPacket
@@ -301,16 +303,17 @@ namespace Game.Network.Packets
public override void Read() public override void Read()
{ {
QueueID = _worldPacket.ReadUInt64(); var queueCount = _worldPacket.ReadUInt32();
Roles = _worldPacket.ReadUInt8(); Roles = _worldPacket.ReadUInt8();
BlacklistMap[0] = _worldPacket.ReadInt32(); BlacklistMap[0] = _worldPacket.ReadInt32();
BlacklistMap[1] = _worldPacket.ReadInt32(); BlacklistMap[1] = _worldPacket.ReadInt32();
JoinAsGroup = _worldPacket.HasBit();
for (var i = 0; i < queueCount; ++i)
QueueIDs[i] = _worldPacket.ReadUInt64();
} }
public bool JoinAsGroup; public Array<ulong> QueueIDs = new Array<ulong>(1);
public byte Roles; public byte Roles;
public ulong QueueID;
public int[] BlacklistMap = new int[2]; public int[] BlacklistMap = new int[2];
} }
@@ -550,21 +553,6 @@ namespace Game.Network.Packets
public override void Read() { } public override void Read() { }
} }
public class ArenaError : ServerPacket
{
public ArenaError() : base(ServerOpcodes.ArenaError) { }
public override void Write()
{
_worldPacket.WriteUInt32(ErrorType);
if (ErrorType == ArenaErrorType.NoTeam)
_worldPacket.WriteUInt8(TeamSize);
}
public ArenaErrorType ErrorType;
public byte TeamSize;
}
//Structs //Structs
public struct BattlefieldStatusHeader public struct BattlefieldStatusHeader
{ {
@@ -49,10 +49,14 @@ namespace Game.Network.Packets
_worldPacket.WriteUInt32(Characters.Count); _worldPacket.WriteUInt32(Characters.Count);
_worldPacket.WriteInt32(MaxCharacterLevel); _worldPacket.WriteInt32(MaxCharacterLevel);
_worldPacket.WriteUInt32(RaceUnlockData.Count); _worldPacket.WriteUInt32(RaceUnlockData.Count);
_worldPacket.WriteUInt32(UnlockedConditionalAppearances.Count);
if (DisabledClassesMask.HasValue) if (DisabledClassesMask.HasValue)
_worldPacket.WriteUInt32(DisabledClassesMask.Value); _worldPacket.WriteUInt32(DisabledClassesMask.Value);
foreach (UnlockedConditionalAppearance unlockedConditionalAppearance in UnlockedConditionalAppearances)
unlockedConditionalAppearance.Write(_worldPacket);
foreach (CharacterInfo charInfo in Characters) foreach (CharacterInfo charInfo in Characters)
charInfo.Write(_worldPacket); charInfo.Write(_worldPacket);
@@ -72,6 +76,7 @@ namespace Game.Network.Packets
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<RaceUnlock> RaceUnlockData = new List<RaceUnlock>(); // public List<RaceUnlock> RaceUnlockData = new List<RaceUnlock>(); //
public List<UnlockedConditionalAppearance> UnlockedConditionalAppearances = new List<UnlockedConditionalAppearance>();
public class CharacterInfo public class CharacterInfo
{ {
@@ -169,7 +174,7 @@ namespace Game.Network.Packets
if (spec != null) if (spec != null)
SpecID = (ushort)spec.Id; SpecID = (ushort)spec.Id;
LastLoginBuild = fields.Read<uint>(30); LastLoginVersion = fields.Read<uint>(30);
for (byte slot = 0; slot < InventorySlots.BagEnd; ++slot) for (byte slot = 0; slot < InventorySlots.BagEnd; ++slot)
{ {
@@ -217,7 +222,7 @@ namespace Game.Network.Packets
data.WriteUInt32(LastPlayedTime); data.WriteUInt32(LastPlayedTime);
data.WriteUInt16(SpecID); data.WriteUInt16(SpecID);
data.WriteUInt32(Unknown703); data.WriteUInt32(Unknown703);
data.WriteUInt32(LastLoginBuild); data.WriteUInt32(LastLoginVersion);
data.WriteUInt32(Flags4); data.WriteUInt32(Flags4);
data.WriteBits(Name.GetByteCount(), 6); data.WriteBits(Name.GetByteCount(), 6);
data.WriteBit(FirstLogin); data.WriteBit(FirstLogin);
@@ -255,7 +260,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 uint LastLoginVersion;
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
@@ -274,6 +279,7 @@ namespace Game.Network.Packets
public uint DisplayEnchantId; public uint DisplayEnchantId;
public byte InventoryType; public byte InventoryType;
} }
public struct PetInfo public struct PetInfo
{ {
public uint CreatureDisplayId; // PetCreatureDisplayID public uint CreatureDisplayId; // PetCreatureDisplayID
@@ -298,6 +304,18 @@ namespace Game.Network.Packets
public bool HasAchievement; public bool HasAchievement;
public bool HasHeritageArmor; public bool HasHeritageArmor;
} }
public struct UnlockedConditionalAppearance
{
public void Write(WorldPacket data)
{
data.WriteInt32(AchievementID);
data.WriteInt32(Unused);
}
public int AchievementID;
public int Unused;
}
} }
public class CreateCharacter : ClientPacket public class CreateCharacter : ClientPacket
+1 -1
View File
@@ -388,7 +388,7 @@ namespace Game.Network.Packets
public override void Write() public override void Write()
{ {
_worldPacket.WriteUInt32(MessageID); _worldPacket.WriteInt32(MessageID);
_worldPacket.WriteBits(StringParam.GetByteCount(), 11); _worldPacket.WriteBits(StringParam.GetByteCount(), 11);
_worldPacket.WriteString(StringParam); _worldPacket.WriteString(StringParam);
@@ -443,7 +443,7 @@ namespace Game.Network.Packets
public int Unknown; public int Unknown;
} }
struct GarrisonMissionAreaBonus struct GarrisonMissionBonusAbility
{ {
public void Write(WorldPacket data) public void Write(WorldPacket data)
{ {
@@ -509,7 +509,7 @@ namespace Game.Network.Packets
missionRewardItem.Write(data); missionRewardItem.Write(data);
} }
foreach (GarrisonMissionAreaBonus areaBonus in MissionAreaBonuses) foreach (GarrisonMissionBonusAbility areaBonus in MissionAreaBonuses)
areaBonus.Write(data); areaBonus.Write(data);
foreach (GarrisonTalent talent in Talents) foreach (GarrisonTalent talent in Talents)
@@ -541,7 +541,7 @@ namespace Game.Network.Packets
public List<GarrisonMission> Missions = new List<GarrisonMission>(); public List<GarrisonMission> Missions = new List<GarrisonMission>();
public List<List<GarrisonMissionReward>> MissionRewards = new List<List<GarrisonMissionReward>>(); public List<List<GarrisonMissionReward>> MissionRewards = new List<List<GarrisonMissionReward>>();
public List<List<GarrisonMissionReward>> MissionOvermaxRewards = new List<List<GarrisonMissionReward>>(); public List<List<GarrisonMissionReward>> MissionOvermaxRewards = new List<List<GarrisonMissionReward>>();
public List<GarrisonMissionAreaBonus> MissionAreaBonuses = new List<GarrisonMissionAreaBonus>(); public List<GarrisonMissionBonusAbility> MissionAreaBonuses = new List<GarrisonMissionBonusAbility>();
public List<GarrisonTalent> Talents = new List<GarrisonTalent>(); public List<GarrisonTalent> Talents = new List<GarrisonTalent>();
public List<bool> CanStartMission = new List<bool>(); public List<bool> CanStartMission = new List<bool>();
public List<int> ArchivedMissions = new List<int>(); public List<int> ArchivedMissions = new List<int>();
@@ -44,6 +44,7 @@ namespace Game.Network.Packets
public override void Write() public override void Write()
{ {
_worldPacket.WritePackedGuid(GuildGUID); _worldPacket.WritePackedGuid(GuildGUID);
_worldPacket.WritePackedGuid(PlayerGuid);
_worldPacket.WriteBit(HasGuildInfo); _worldPacket.WriteBit(HasGuildInfo);
_worldPacket.FlushBits(); _worldPacket.FlushBits();
@@ -75,6 +76,7 @@ namespace Game.Network.Packets
} }
public ObjectGuid GuildGUID; public ObjectGuid GuildGUID;
public ObjectGuid PlayerGuid;
public GuildInfo Info = new GuildInfo(); public GuildInfo Info = new GuildInfo();
public bool HasGuildInfo; public bool HasGuildInfo;
+59 -19
View File
@@ -20,6 +20,7 @@ using Framework.Dynamic;
using Framework.IO; using Framework.IO;
using Game.Entities; using Game.Entities;
using System.Collections.Generic; using System.Collections.Generic;
using System;
namespace Game.Network.Packets namespace Game.Network.Packets
{ {
@@ -78,23 +79,32 @@ namespace Game.Network.Packets
class AvailableHotfixes : ServerPacket class AvailableHotfixes : ServerPacket
{ {
public AvailableHotfixes(int hotfixCacheVersion, Dictionary<ulong, int> hotfixes) : base(ServerOpcodes.AvailableHotfixes) public AvailableHotfixes(int hotfixCacheVersion, uint hotfixCount, MultiMap<int, Tuple<uint, int>> hotfixes) : base(ServerOpcodes.AvailableHotfixes)
{ {
HotfixCacheVersion = hotfixCacheVersion; HotfixCacheVersion = hotfixCacheVersion;
HotfixCount = hotfixCount;
Hotfixes = hotfixes; Hotfixes = hotfixes;
} }
public override void Write() public override void Write()
{ {
_worldPacket.WriteInt32(HotfixCacheVersion); _worldPacket.WriteInt32(HotfixCacheVersion);
_worldPacket.WriteUInt32(HotfixCount);
_worldPacket.WriteUInt32(Hotfixes.Count); foreach (var key in Hotfixes.Keys)
foreach (var hotfixEntry in Hotfixes) {
_worldPacket.WriteInt64(hotfixEntry.Key); foreach (var tableRecord in Hotfixes[key])
{
_worldPacket.WriteUInt32(tableRecord.Item1);
_worldPacket.WriteInt32(tableRecord.Item2);
_worldPacket.WriteInt32(key);
}
}
} }
public int HotfixCacheVersion; public int HotfixCacheVersion;
public Dictionary<ulong, int> Hotfixes = new Dictionary<ulong, int>(); public uint HotfixCount;
public MultiMap<int, Tuple<uint, int>> Hotfixes;
} }
class HotfixRequest : ClientPacket class HotfixRequest : ClientPacket
@@ -103,15 +113,17 @@ namespace Game.Network.Packets
public override void Read() public override void Read()
{ {
uint hotfixCount = _worldPacket.ReadUInt32(); ClientBuild = _worldPacket.ReadUInt32();
//if (hotfixCount > Global.DB2Mgr.GetHotfixData().Count) DataBuild = _worldPacket.ReadUInt32();
//throw PacketArrayMaxCapacityException(hotfixCount, sDB2Manager.GetHotfixData().size());
uint hotfixCount = _worldPacket.ReadUInt32();
for (var i = 0; i < hotfixCount; ++i) for (var i = 0; i < hotfixCount; ++i)
Hotfixes.Add(_worldPacket.ReadUInt64()); Hotfixes.Add(new HotfixRecord(_worldPacket));
} }
public List<ulong> Hotfixes = new List<ulong>(); public uint ClientBuild;
public uint DataBuild;
public List<HotfixRecord> Hotfixes = new List<HotfixRecord>();
} }
class HotfixResponse : ServerPacket class HotfixResponse : ServerPacket
@@ -123,27 +135,55 @@ namespace Game.Network.Packets
_worldPacket.WriteUInt32(Hotfixes.Count); _worldPacket.WriteUInt32(Hotfixes.Count);
foreach (HotfixData hotfix in Hotfixes) foreach (HotfixData hotfix in Hotfixes)
hotfix.Write(_worldPacket); hotfix.Write(_worldPacket);
_worldPacket.WriteUInt32(HotfixContent.GetSize());
_worldPacket.WriteBytes(HotfixContent);
} }
public List<HotfixData> Hotfixes = new List<HotfixData>(); public List<HotfixData> Hotfixes = new List<HotfixData>();
public ByteBuffer HotfixContent;
public class HotfixData public class HotfixData
{ {
public void Write(WorldPacket data) public void Write(WorldPacket data)
{ {
data.WriteInt64(ID); Record.Write(data);
data.WriteInt32(RecordID); if (Size.HasValue)
data.WriteBit(Data.HasValue);
if (Data.HasValue)
{ {
data.WriteUInt32(Data.Value.GetSize()); data.WriteUInt32(Size);
data.WriteBytes(Data.Value); data.WriteBit(true);
} }
else
{
data.WriteUInt32(0);
data.WriteBit(false);
}
data.FlushBits();
} }
public ulong ID; public HotfixRecord Record;
public int RecordID; public Optional<uint> Size;
public Optional<ByteBuffer> Data;
} }
} }
public struct HotfixRecord
{
public HotfixRecord(WorldPacket data)
{
TableHash = data.ReadUInt32();
RecordID = data.ReadInt32();
HotfixID = data.ReadInt32();
}
public void Write(WorldPacket data)
{
data.WriteUInt32(TableHash);
data.WriteInt32(RecordID);
data.WriteInt32(HotfixID);
}
public uint TableHash;
public int RecordID;
public int HotfixID;
}
} }
+13 -63
View File
@@ -48,6 +48,11 @@ namespace Game.Network.Packets
_worldPacket.WriteInt32(ClassID); _worldPacket.WriteInt32(ClassID);
_worldPacket.WriteInt32(SpecializationID); _worldPacket.WriteInt32(SpecializationID);
_worldPacket.WriteInt32(GenderID); _worldPacket.WriteInt32(GenderID);
_worldPacket.WriteUInt8(LifetimeMaxRank);
_worldPacket.WriteUInt16(TodayHK);
_worldPacket.WriteUInt16(YesterdayHK);
_worldPacket.WriteInt32(LifetimeHK);
_worldPacket.WriteInt32(HonorLevel);
for (int i = 0; i < Glyphs.Count; ++i) for (int i = 0; i < Glyphs.Count; ++i)
_worldPacket.WriteUInt16(Glyphs[i]); _worldPacket.WriteUInt16(Glyphs[i]);
@@ -62,13 +67,17 @@ namespace Game.Network.Packets
_worldPacket.WriteBit(AzeriteLevel.HasValue); _worldPacket.WriteBit(AzeriteLevel.HasValue);
_worldPacket.FlushBits(); _worldPacket.FlushBits();
Items.ForEach(p => p.Write(_worldPacket)); foreach (PVPBracketData bracket in Bracket)
bracket.Write(_worldPacket);
if (GuildData.HasValue) if (GuildData.HasValue)
GuildData.Value.Write(_worldPacket); GuildData.Value.Write(_worldPacket);
if (AzeriteLevel.HasValue) if (AzeriteLevel.HasValue)
_worldPacket.WriteInt32(AzeriteLevel.Value); _worldPacket.WriteInt32(AzeriteLevel.Value);
foreach (InspectItemData item in Items)
item.Write(_worldPacket);
} }
public ObjectGuid InspecteeGUID; public ObjectGuid InspecteeGUID;
@@ -79,74 +88,16 @@ namespace Game.Network.Packets
public Class ClassID = Class.None; public Class ClassID = Class.None;
public Gender GenderID = Gender.None; public Gender GenderID = Gender.None;
public Optional<InspectGuildData> GuildData = new Optional<InspectGuildData>(); public Optional<InspectGuildData> GuildData = new Optional<InspectGuildData>();
public Array<PVPBracketData> Bracket = new Array<PVPBracketData>(6);
public int SpecializationID; public int SpecializationID;
public Optional<int> AzeriteLevel; public Optional<int> AzeriteLevel;
}
public class RequestHonorStats : ClientPacket
{
public RequestHonorStats(WorldPacket packet) : base(packet) { }
public override void Read()
{
TargetGUID = _worldPacket.ReadPackedGuid();
}
public ObjectGuid TargetGUID;
}
public class InspectHonorStats : ServerPacket
{
public InspectHonorStats() : base(ServerOpcodes.InspectHonorStats) { }
public override void Write()
{
_worldPacket.WritePackedGuid(PlayerGUID);
_worldPacket.WriteUInt8(LifetimeMaxRank);
_worldPacket.WriteUInt16(YesterdayHK); // @todo: confirm order
_worldPacket.WriteUInt16(TodayHK); // @todo: confirm order
_worldPacket.WriteUInt32(LifetimeHK);
}
public ObjectGuid PlayerGUID;
public uint LifetimeHK; public uint LifetimeHK;
public ushort YesterdayHK; public uint HonorLevel;
public ushort TodayHK; public ushort TodayHK;
public ushort YesterdayHK;
public byte LifetimeMaxRank; public byte LifetimeMaxRank;
} }
public class InspectPVPRequest : ClientPacket
{
public InspectPVPRequest(WorldPacket packet) : base(packet) { }
public override void Read()
{
InspectTarget = _worldPacket.ReadPackedGuid();
InspectRealmAddress = _worldPacket.ReadUInt32();
}
public ObjectGuid InspectTarget;
public uint InspectRealmAddress;
}
public class InspectPVPResponse : ServerPacket
{
public InspectPVPResponse() : base(ServerOpcodes.InspectPvp) { }
public override void Write()
{
_worldPacket.WritePackedGuid(ClientGUID);
_worldPacket.WriteBits(Bracket.Count, 3);
_worldPacket.FlushBits();
Bracket.ForEach(p => p.Write(_worldPacket));
}
public List<PVPBracketData> Bracket = new List<PVPBracketData>();
public ObjectGuid ClientGUID;
}
public class QueryInspectAchievements : ClientPacket public class QueryInspectAchievements : ClientPacket
{ {
public QueryInspectAchievements(WorldPacket packet) : base(packet) { } public QueryInspectAchievements(WorldPacket packet) : base(packet) { }
@@ -272,7 +223,6 @@ namespace Game.Network.Packets
data.WriteInt32(Unk801_1); data.WriteInt32(Unk801_1);
data.WriteBit(Unk801_2); data.WriteBit(Unk801_2);
data.FlushBits(); data.FlushBits();
} }
public int Rating; public int Rating;
+2 -17
View File
@@ -774,8 +774,6 @@ namespace Game.Network.Packets
public ItemInstance(Item item) public ItemInstance(Item item)
{ {
ItemID = item.GetEntry(); ItemID = item.GetEntry();
RandomPropertiesSeed = item.GetItemSuffixFactor();
RandomPropertiesID = (uint)item.GetItemRandomPropertyId();
var bonusListIds = item.GetDynamicValues(ItemDynamicFields.BonusListIds); var bonusListIds = item.GetDynamicValues(ItemDynamicFields.BonusListIds);
if (!bonusListIds.Empty()) if (!bonusListIds.Empty())
{ {
@@ -800,9 +798,6 @@ namespace Game.Network.Packets
public ItemInstance(Loots.LootItem lootItem) public ItemInstance(Loots.LootItem lootItem)
{ {
ItemID = lootItem.itemid; ItemID = lootItem.itemid;
RandomPropertiesSeed = lootItem.randomSuffix;
if (lootItem.randomPropertyId.Type != ItemRandomEnchantmentType.BonusList)
RandomPropertiesID = lootItem.randomPropertyId.Id;
if (!lootItem.BonusListIDs.Empty()) if (!lootItem.BonusListIDs.Empty())
{ {
@@ -821,9 +816,6 @@ namespace Game.Network.Packets
public ItemInstance(VoidStorageItem voidItem) public ItemInstance(VoidStorageItem voidItem)
{ {
ItemID = voidItem.ItemEntry; ItemID = voidItem.ItemEntry;
RandomPropertiesSeed = voidItem.ItemSuffixFactor;
if (voidItem.ItemRandomPropertyId.Type != ItemRandomEnchantmentType.BonusList)
RandomPropertiesID = voidItem.ItemRandomPropertyId.Id;
if (voidItem.ItemUpgradeId != 0 || voidItem.FixedScalingLevel != 0 || voidItem.ArtifactKnowledgeLevel != 0) if (voidItem.ItemUpgradeId != 0 || voidItem.FixedScalingLevel != 0 || voidItem.ArtifactKnowledgeLevel != 0)
{ {
@@ -861,8 +853,6 @@ namespace Game.Network.Packets
public void Write(WorldPacket data) public void Write(WorldPacket data)
{ {
data.WriteUInt32(ItemID); data.WriteUInt32(ItemID);
data.WriteUInt32(RandomPropertiesSeed);
data.WriteUInt32(RandomPropertiesID);
data.WriteBit(ItemBonus.HasValue); data.WriteBit(ItemBonus.HasValue);
data.WriteBit(Modifications.HasValue); data.WriteBit(Modifications.HasValue);
@@ -878,8 +868,6 @@ namespace Game.Network.Packets
public void Read(WorldPacket data) public void Read(WorldPacket data)
{ {
ItemID = data.ReadUInt32(); ItemID = data.ReadUInt32();
RandomPropertiesSeed = data.ReadUInt32();
RandomPropertiesID = data.ReadUInt32();
ItemBonus.HasValue = data.HasBit(); ItemBonus.HasValue = data.HasBit();
Modifications.HasValue = data.HasBit(); Modifications.HasValue = data.HasBit();
@@ -894,8 +882,7 @@ namespace Game.Network.Packets
public override int GetHashCode() public override int GetHashCode()
{ {
return ItemID.GetHashCode() ^ RandomPropertiesSeed.GetHashCode() ^ return ItemID.GetHashCode() ^ ItemBonus.GetHashCode() ^ Modifications.GetHashCode();
RandomPropertiesID.GetHashCode() ^ ItemBonus.GetHashCode() ^ Modifications.GetHashCode();
} }
public override bool Equals(object obj) public override bool Equals(object obj)
@@ -908,7 +895,7 @@ namespace Game.Network.Packets
public static bool operator ==(ItemInstance left, ItemInstance right) public static bool operator ==(ItemInstance left, ItemInstance right)
{ {
if (left.ItemID != right.ItemID || left.RandomPropertiesID != right.RandomPropertiesID || left.RandomPropertiesSeed != right.RandomPropertiesSeed) if (left.ItemID != right.ItemID)
return false; return false;
if (left.ItemBonus.HasValue != right.ItemBonus.HasValue || left.Modifications.HasValue != right.Modifications.HasValue) if (left.ItemBonus.HasValue != right.ItemBonus.HasValue || left.Modifications.HasValue != right.Modifications.HasValue)
@@ -929,8 +916,6 @@ namespace Game.Network.Packets
} }
public uint ItemID; public uint ItemID;
public uint RandomPropertiesSeed;
public uint RandomPropertiesID;
public Optional<ItemBonusInstanceData> ItemBonus; public Optional<ItemBonusInstanceData> ItemBonus;
public Optional<CompactArray> Modifications; public Optional<CompactArray> Modifications;
} }
+14 -2
View File
@@ -235,13 +235,16 @@ namespace Game.Network.Packets
_worldPacket.WriteUInt8(PartyIndex); _worldPacket.WriteUInt8(PartyIndex);
_worldPacket.WriteUInt8(RoleCheckStatus); _worldPacket.WriteUInt8(RoleCheckStatus);
_worldPacket.WriteUInt32(JoinSlots.Count); _worldPacket.WriteUInt32(JoinSlots.Count);
_worldPacket.WriteUInt64(BgQueueID); _worldPacket.WriteUInt32(BgQueueIDs.Count);
_worldPacket.WriteUInt32(GroupFinderActivityID); _worldPacket.WriteUInt32(GroupFinderActivityID);
_worldPacket.WriteUInt32(Members.Count); _worldPacket.WriteUInt32(Members.Count);
foreach (var slot in JoinSlots) foreach (var slot in JoinSlots)
_worldPacket.WriteUInt32(slot); _worldPacket.WriteUInt32(slot);
foreach (ulong bgQueueID in BgQueueIDs)
_worldPacket.WriteUInt64(bgQueueID);
_worldPacket.WriteBit(IsBeginning); _worldPacket.WriteBit(IsBeginning);
_worldPacket.WriteBit(IsRequeue); _worldPacket.WriteBit(IsRequeue);
_worldPacket.FlushBits(); _worldPacket.FlushBits();
@@ -253,7 +256,7 @@ namespace Game.Network.Packets
public byte PartyIndex; public byte PartyIndex;
public byte RoleCheckStatus; public byte RoleCheckStatus;
public List<uint> JoinSlots = new List<uint>(); public List<uint> JoinSlots = new List<uint>();
public ulong BgQueueID; public List<ulong> BgQueueIDs = new List<ulong>();
public int GroupFinderActivityID = 0; public int GroupFinderActivityID = 0;
public List<LFGRoleCheckUpdateMember> Members = new List<LFGRoleCheckUpdateMember>(); public List<LFGRoleCheckUpdateMember> Members = new List<LFGRoleCheckUpdateMember>();
public bool IsBeginning; public bool IsBeginning;
@@ -271,15 +274,24 @@ namespace Game.Network.Packets
_worldPacket.WriteUInt8(Result); _worldPacket.WriteUInt8(Result);
_worldPacket.WriteUInt8(ResultDetail); _worldPacket.WriteUInt8(ResultDetail);
_worldPacket.WriteUInt32(BlackList.Count); _worldPacket.WriteUInt32(BlackList.Count);
_worldPacket.WriteUInt32(BlackListNames.Count);
foreach (LFGJoinBlackList blackList in BlackList) foreach (LFGJoinBlackList blackList in BlackList)
blackList.Write(_worldPacket); blackList.Write(_worldPacket);
foreach (string str in BlackListNames)
_worldPacket.WriteBits(str.GetByteCount() + 1, 24);
foreach (string str in BlackListNames)
if (!str.IsEmpty())
_worldPacket.WriteCString(str);
} }
public RideTicket Ticket = new RideTicket(); public RideTicket Ticket = new RideTicket();
public byte Result; public byte Result;
public byte ResultDetail; public byte ResultDetail;
public List<LFGJoinBlackList> BlackList = new List<LFGJoinBlackList>(); public List<LFGJoinBlackList> BlackList = new List<LFGJoinBlackList>();
public List<string> BlackListNames = new List<string>();
} }
class LFGQueueStatus : ServerPacket class LFGQueueStatus : ServerPacket
+4 -2
View File
@@ -143,12 +143,14 @@ namespace Game.Network.Packets
public override void Write() public override void Write()
{ {
_worldPacket.WriteUInt32(Money); _worldPacket.WriteUInt64(Money);
_worldPacket.WriteUInt64(MoneyMod);
_worldPacket.WriteBit(SoleLooter); _worldPacket.WriteBit(SoleLooter);
_worldPacket.FlushBits(); _worldPacket.FlushBits();
} }
public uint Money; public ulong Money;
public ulong MoneyMod;
public bool SoleLooter; public bool SoleLooter;
} }
+2 -2
View File
@@ -283,9 +283,9 @@ namespace Game.Network.Packets
} }
} }
public class NotifyRecievedMail : ServerPacket public class NotifyReceivedMail : ServerPacket
{ {
public NotifyRecievedMail() : base(ServerOpcodes.NotifyReceivedMail) { } public NotifyReceivedMail() : base(ServerOpcodes.NotifyReceivedMail) { }
public override void Write() public override void Write()
{ {
@@ -118,6 +118,9 @@ namespace Game.Network.Packets
_worldPacket.WriteBit(TrackedQuantity.HasValue); _worldPacket.WriteBit(TrackedQuantity.HasValue);
_worldPacket.WriteBit(MaxQuantity.HasValue); _worldPacket.WriteBit(MaxQuantity.HasValue);
_worldPacket.WriteBit(SuppressChatLog); _worldPacket.WriteBit(SuppressChatLog);
_worldPacket.WriteBit(QuantityChange.HasValue);
_worldPacket.WriteBit(QuantityGainSource.HasValue);
_worldPacket.WriteBit(QuantityLostSource.HasValue);
_worldPacket.FlushBits(); _worldPacket.FlushBits();
if (WeeklyQuantity.HasValue) if (WeeklyQuantity.HasValue)
@@ -128,6 +131,15 @@ namespace Game.Network.Packets
if (MaxQuantity.HasValue) if (MaxQuantity.HasValue)
_worldPacket.WriteInt32(MaxQuantity.Value); _worldPacket.WriteInt32(MaxQuantity.Value);
if (QuantityChange.HasValue)
_worldPacket.WriteInt32(QuantityChange.Value);
if (QuantityGainSource.HasValue)
_worldPacket.WriteInt32(QuantityGainSource.Value);
if (QuantityLostSource.HasValue)
_worldPacket.WriteInt32(QuantityLostSource.Value);
} }
public uint Type; public uint Type;
@@ -136,6 +148,9 @@ namespace Game.Network.Packets
public Optional<int> WeeklyQuantity; public Optional<int> WeeklyQuantity;
public Optional<int> TrackedQuantity; public Optional<int> TrackedQuantity;
public Optional<int> MaxQuantity; public Optional<int> MaxQuantity;
public Optional<int> QuantityChange;
public Optional<int> QuantityGainSource;
public Optional<int> QuantityLostSource;
public bool SuppressChatLog; public bool SuppressChatLog;
} }
@@ -1017,7 +1017,7 @@ namespace Game.Network.Packets
data.WriteBit(VehicleRecID.HasValue); data.WriteBit(VehicleRecID.HasValue);
data.WriteBit(CollisionHeight.HasValue); data.WriteBit(CollisionHeight.HasValue);
data.WriteBit(MovementForce_.HasValue); data.WriteBit(MovementForce_.HasValue);
data.WriteBit(Unknown.HasValue); data.WriteBit(MovementForceGUID.HasValue);
data.FlushBits(); data.FlushBits();
if (CollisionHeight.HasValue) if (CollisionHeight.HasValue)
@@ -1041,8 +1041,8 @@ namespace Game.Network.Packets
if (VehicleRecID.HasValue) if (VehicleRecID.HasValue)
data.WriteInt32(VehicleRecID.Value); data.WriteInt32(VehicleRecID.Value);
if (Unknown.HasValue) if (MovementForceGUID.HasValue)
data.WritePackedGuid(Unknown.Value); data.WritePackedGuid(MovementForceGUID.Value);
if (MovementForce_.HasValue) if (MovementForce_.HasValue)
MovementForce_.Value.Write(data); MovementForce_.Value.Write(data);
@@ -1055,7 +1055,7 @@ namespace Game.Network.Packets
public Optional<int> VehicleRecID; public Optional<int> VehicleRecID;
public Optional<CollisionHeightInfo> CollisionHeight; public Optional<CollisionHeightInfo> CollisionHeight;
public Optional<MovementForce> MovementForce_; public Optional<MovementForce> MovementForce_;
public Optional<ObjectGuid> Unknown; public Optional<ObjectGuid> MovementForceGUID;
} }
} }
@@ -333,6 +333,7 @@ namespace Game.Network.Packets
data.WriteInt32(PlayerConditionFailed); data.WriteInt32(PlayerConditionFailed);
Item.Write(data); Item.Write(data);
data.WriteBit(DoNotFilterOnVendor); data.WriteBit(DoNotFilterOnVendor);
data.WriteBit(Refundable);
data.FlushBits(); data.FlushBits();
} }
@@ -346,6 +347,7 @@ namespace Game.Network.Packets
public int ExtendedCostID; public int ExtendedCostID;
public int PlayerConditionFailed; public int PlayerConditionFailed;
public bool DoNotFilterOnVendor; public bool DoNotFilterOnVendor;
public bool Refundable;
} }
public class TrainerListSpell public class TrainerListSpell
+9 -8
View File
@@ -201,6 +201,13 @@ namespace Game.Network.Packets
public string Name; public string Name;
} }
class GroupUninvite : ServerPacket
{
public GroupUninvite() : base(ServerOpcodes.GroupUninvite) { }
public override void Write() { }
}
class RequestPartyMemberStats : ClientPacket class RequestPartyMemberStats : ClientPacket
{ {
public RequestPartyMemberStats(WorldPacket packet) : base(packet) { } public RequestPartyMemberStats(WorldPacket packet) : base(packet) { }
@@ -422,13 +429,6 @@ namespace Game.Network.Packets
public sbyte PartyIndex; public sbyte PartyIndex;
} }
class GroupUninvite : ServerPacket
{
public GroupUninvite() : base(ServerOpcodes.GroupUninvite) { }
public override void Write() { }
}
class GroupDestroyed : ServerPacket class GroupDestroyed : ServerPacket
{ {
public GroupDestroyed() : base(ServerOpcodes.GroupDestroyed) { } public GroupDestroyed() : base(ServerOpcodes.GroupDestroyed) { }
@@ -1042,7 +1042,8 @@ namespace Game.Network.Packets
data.WriteUInt8(RolesAssigned); data.WriteUInt8(RolesAssigned);
data.WriteUInt8(Class); data.WriteUInt8(Class);
data.WriteString(Name); data.WriteString(Name);
data.WriteString(VoiceStateID); if (!VoiceStateID.IsEmpty())
data.WriteString(VoiceStateID);
} }
public ObjectGuid GUID; public ObjectGuid GUID;
@@ -131,6 +131,9 @@ namespace Game.Network.Packets
_worldPacket.WriteUInt32(Stats.RequiredExpansion); _worldPacket.WriteUInt32(Stats.RequiredExpansion);
_worldPacket.WriteInt32(Stats.VignetteID); _worldPacket.WriteInt32(Stats.VignetteID);
_worldPacket.WriteInt32(Stats.Class); _worldPacket.WriteInt32(Stats.Class);
_worldPacket.WriteFloat(Stats.FadeRegionRadius);
_worldPacket.WriteInt32(Stats.WidgetSetID);
_worldPacket.WriteInt32(Stats.WidgetSetUnitConditionID);
if (!Stats.Title.IsEmpty()) if (!Stats.Title.IsEmpty())
_worldPacket.WriteCString(Stats.Title); _worldPacket.WriteCString(Stats.Title);
@@ -738,6 +741,9 @@ namespace Game.Network.Packets
public uint RequiredExpansion; public uint RequiredExpansion;
public uint VignetteID; public uint VignetteID;
public int Class; public int Class;
public float FadeRegionRadius;
public int WidgetSetID;
public int WidgetSetUnitConditionID;
public uint[] Flags = new uint[2]; public uint[] Flags = new uint[2];
public uint[] ProxyCreatureID = new uint[SharedConst.MaxCreatureKillCredit]; public uint[] ProxyCreatureID = new uint[SharedConst.MaxCreatureKillCredit];
public StringArray Name = new StringArray(SharedConst.MaxCreatureNames); public StringArray Name = new StringArray(SharedConst.MaxCreatureNames);
@@ -201,6 +201,7 @@ namespace Game.Network.Packets
_worldPacket.WriteInt64(Info.AllowableRaces); _worldPacket.WriteInt64(Info.AllowableRaces);
_worldPacket.WriteInt32(Info.TreasurePickerID); _worldPacket.WriteInt32(Info.TreasurePickerID);
_worldPacket.WriteInt32(Info.Expansion); _worldPacket.WriteInt32(Info.Expansion);
_worldPacket.WriteInt32(Info.ManagedWorldStateID);
_worldPacket.WriteBits(Info.LogTitle.GetByteCount(), 9); _worldPacket.WriteBits(Info.LogTitle.GetByteCount(), 9);
_worldPacket.WriteBits(Info.LogDescription.GetByteCount(), 12); _worldPacket.WriteBits(Info.LogDescription.GetByteCount(), 12);
@@ -837,6 +838,7 @@ namespace Game.Network.Packets
_worldPacket.WriteUInt32(Responses.Count); _worldPacket.WriteUInt32(Responses.Count);
_worldPacket.WritePackedGuid(SenderGUID); _worldPacket.WritePackedGuid(SenderGUID);
_worldPacket.WriteInt32(UiTextureKitID); _worldPacket.WriteInt32(UiTextureKitID);
_worldPacket.WriteUInt32(SoundKitID);
_worldPacket.WriteBits(Question.GetByteCount(), 8); _worldPacket.WriteBits(Question.GetByteCount(), 8);
_worldPacket.WriteBit(CloseChoiceFrame); _worldPacket.WriteBit(CloseChoiceFrame);
_worldPacket.WriteBit(HideWarboardHeader); _worldPacket.WriteBit(HideWarboardHeader);
@@ -852,6 +854,7 @@ namespace Game.Network.Packets
public ObjectGuid SenderGUID; public ObjectGuid SenderGUID;
public int ChoiceID; public int ChoiceID;
public int UiTextureKitID; public int UiTextureKitID;
public uint SoundKitID;
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;
@@ -965,6 +968,7 @@ namespace Game.Network.Packets
public uint TimeAllowed; public uint TimeAllowed;
public int TreasurePickerID; public int TreasurePickerID;
public int Expansion; public int Expansion;
public int ManagedWorldStateID;
public List<QuestObjective> Objectives = new List<QuestObjective>(); public List<QuestObjective> Objectives = new List<QuestObjective>();
public uint[] RewardItems = new uint[SharedConst.QuestRewardItemCount]; public uint[] RewardItems = new uint[SharedConst.QuestRewardItemCount];
public uint[] RewardAmount = new uint[SharedConst.QuestRewardItemCount]; public uint[] RewardAmount = new uint[SharedConst.QuestRewardItemCount];
@@ -1254,13 +1258,18 @@ namespace Game.Network.Packets
data.WriteInt32(ChoiceArtFileID); data.WriteInt32(ChoiceArtFileID);
data.WriteInt32(Flags); data.WriteInt32(Flags);
data.WriteUInt32(WidgetSetID); data.WriteUInt32(WidgetSetID);
data.WriteUInt32(UiTextureAtlasElementID);
data.WriteUInt32(SoundKitID);
data.WriteUInt8(GroupID); data.WriteUInt8(GroupID);
data.WriteBits(Answer.GetByteCount(), 9); data.WriteBits(Answer.GetByteCount(), 9);
data.WriteBits(Header.GetByteCount(), 9); data.WriteBits(Header.GetByteCount(), 9);
data.WriteBits(SubHeader.GetByteCount(), 7);
data.WriteBits(ButtonTooltip.GetByteCount(), 9);
data.WriteBits(Description.GetByteCount(), 11); data.WriteBits(Description.GetByteCount(), 11);
data.WriteBits(Confirmation.GetByteCount(), 7); data.WriteBits(Confirmation.GetByteCount(), 7);
data.WriteBit(RewardQuestID.HasValue);
data.WriteBit(Reward.HasValue); data.WriteBit(Reward.HasValue);
data.FlushBits(); data.FlushBits();
@@ -1269,19 +1278,29 @@ namespace Game.Network.Packets
data.WriteString(Answer); data.WriteString(Answer);
data.WriteString(Header); data.WriteString(Header);
data.WriteString(SubHeader);
data.WriteString(ButtonTooltip);
data.WriteString(Description); data.WriteString(Description);
data.WriteString(Confirmation); data.WriteString(Confirmation);
if (RewardQuestID.HasValue)
data.WriteUInt32(RewardQuestID.Value);
} }
public int ResponseID; public int ResponseID;
public int ChoiceArtFileID; public int ChoiceArtFileID;
public int Flags; public int Flags;
public uint WidgetSetID; public uint WidgetSetID;
public uint UiTextureAtlasElementID;
public uint SoundKitID;
public byte GroupID; public byte GroupID;
public string Answer; public string Answer;
public string Header; public string Header;
public string SubHeader;
public string ButtonTooltip;
public string Description; public string Description;
public string Confirmation; public string Confirmation;
public Optional<PlayerChoiceResponseReward> Reward; public Optional<PlayerChoiceResponseReward> Reward;
public Optional<uint> RewardQuestID;
} }
} }
@@ -22,7 +22,7 @@ namespace Game.Network.Packets
{ {
public class InitializeFactions : ServerPacket public class InitializeFactions : ServerPacket
{ {
const ushort FactionCount = 300; const ushort FactionCount = 350;
public InitializeFactions() : base(ServerOpcodes.InitializeFactions, ConnectionType.Instance) { } public InitializeFactions() : base(ServerOpcodes.InitializeFactions, ConnectionType.Instance) { }
+58 -28
View File
@@ -691,8 +691,8 @@ namespace Game.Network.Packets
_worldPacket.WritePackedGuid(Target); _worldPacket.WritePackedGuid(Target);
_worldPacket.WriteUInt32(SpellVisualID); _worldPacket.WriteUInt32(SpellVisualID);
_worldPacket.WriteFloat(TravelSpeed); _worldPacket.WriteFloat(TravelSpeed);
_worldPacket.WriteFloat(UnkZero); _worldPacket.WriteFloat(LaunchDelay);
_worldPacket.WriteFloat(Unk801); _worldPacket.WriteFloat(MinDuration);
_worldPacket.WriteBit(SpeedAsTime); _worldPacket.WriteBit(SpeedAsTime);
_worldPacket.FlushBits(); _worldPacket.FlushBits();
} }
@@ -702,8 +702,8 @@ namespace Game.Network.Packets
public uint SpellVisualID; public uint SpellVisualID;
public bool SpeedAsTime; public bool SpeedAsTime;
public float TravelSpeed; public float TravelSpeed;
public float UnkZero; // Always zero public float LaunchDelay; // Always zero
public float Unk801; public float MinDuration;
public Vector3 SourceRotation; // Vector of rotations, Orientation is z public Vector3 SourceRotation; // Vector of rotations, Orientation is z
public Vector3 TargetLocation; // Exclusive with Target public Vector3 TargetLocation; // Exclusive with Target
} }
@@ -716,29 +716,31 @@ namespace Game.Network.Packets
{ {
_worldPacket.WritePackedGuid(Source); _worldPacket.WritePackedGuid(Source);
_worldPacket.WritePackedGuid(Target); _worldPacket.WritePackedGuid(Target);
_worldPacket.WritePackedGuid(Unk801_1); _worldPacket.WritePackedGuid(Transport);
_worldPacket.WriteVector3(TargetPosition); _worldPacket.WriteVector3(TargetPosition);
_worldPacket.WriteUInt32(SpellVisualID); _worldPacket.WriteUInt32(SpellVisualID);
_worldPacket.WriteFloat(TravelSpeed); _worldPacket.WriteFloat(TravelSpeed);
_worldPacket.WriteUInt16(HitReason);
_worldPacket.WriteUInt16(MissReason); _worldPacket.WriteUInt16(MissReason);
_worldPacket.WriteUInt16(ReflectStatus); _worldPacket.WriteUInt16(ReflectStatus);
_worldPacket.WriteFloat(Orientation); _worldPacket.WriteFloat(LaunchDelay);
_worldPacket.WriteFloat(Unk801_2); _worldPacket.WriteFloat(MinDuration);
_worldPacket.WriteBit(SpeedAsTime); _worldPacket.WriteBit(SpeedAsTime);
_worldPacket.FlushBits(); _worldPacket.FlushBits();
} }
public ObjectGuid Source; public ObjectGuid Source;
public ObjectGuid Target; // Exclusive with TargetPosition public ObjectGuid Target; // Exclusive with TargetPosition
public ObjectGuid Unk801_1; public ObjectGuid Transport; // Used when Target = Empty && (SpellVisual::Flags & 0x400) == 0
public ushort MissReason;
public uint SpellVisualID;
public bool SpeedAsTime;
public ushort ReflectStatus;
public float TravelSpeed;
public Vector3 TargetPosition; // Exclusive with Target public Vector3 TargetPosition; // Exclusive with Target
public float Orientation; public uint SpellVisualID;
public float Unk801_2; public float TravelSpeed;
public ushort HitReason;
public ushort MissReason;
public ushort ReflectStatus;
public float LaunchDelay;
public float MinDuration;
public bool SpeedAsTime;
} }
class PlaySpellVisualKit : ServerPacket class PlaySpellVisualKit : ServerPacket
@@ -1268,6 +1270,7 @@ namespace Game.Network.Packets
{ {
data.WriteInt16(PlayerLevelDelta); data.WriteInt16(PlayerLevelDelta);
data.WriteUInt16(PlayerItemLevel); data.WriteUInt16(PlayerItemLevel);
data.WriteUInt16(TargetItemLevel);
data.WriteUInt16(ScalingHealthItemLevelCurveID); data.WriteUInt16(ScalingHealthItemLevelCurveID);
data.WriteUInt8(TargetLevel); data.WriteUInt8(TargetLevel);
data.WriteUInt8(Expansion); data.WriteUInt8(Expansion);
@@ -1282,6 +1285,7 @@ namespace Game.Network.Packets
public ContentTuningType TuningType; public ContentTuningType TuningType;
public short PlayerLevelDelta; public short PlayerLevelDelta;
public ushort PlayerItemLevel; public ushort PlayerItemLevel;
public ushort TargetItemLevel;
public ushort ScalingHealthItemLevelCurveID; public ushort ScalingHealthItemLevelCurveID;
public byte TargetLevel; public byte TargetLevel;
public byte Expansion; public byte Expansion;
@@ -1401,7 +1405,7 @@ namespace Game.Network.Packets
{ {
public void Read(WorldPacket data) public void Read(WorldPacket data)
{ {
Flags = (SpellCastTargetFlags)data.ReadBits<uint>(25); Flags = (SpellCastTargetFlags)data.ReadBits<uint>(26);
SrcLocation.HasValue = data.HasBit(); SrcLocation.HasValue = data.HasBit();
DstLocation.HasValue = data.HasBit(); DstLocation.HasValue = data.HasBit();
Orientation.HasValue = data.HasBit(); Orientation.HasValue = data.HasBit();
@@ -1428,7 +1432,7 @@ namespace Game.Network.Packets
public void Write(WorldPacket data) public void Write(WorldPacket data)
{ {
data.WriteBits((uint)Flags, 25); data.WriteBits((uint)Flags, 26);
data.WriteBit(SrcLocation.HasValue); data.WriteBit(SrcLocation.HasValue);
data.WriteBit(DstLocation.HasValue); data.WriteBit(DstLocation.HasValue);
data.WriteBit(Orientation.HasValue); data.WriteBit(Orientation.HasValue);
@@ -1525,19 +1529,40 @@ namespace Game.Network.Packets
public uint[] Misc = new uint[2]; public uint[] Misc = new uint[2];
} }
public struct SpellMissStatus public struct SpellHitStatus
{ {
public SpellHitStatus(SpellMissInfo reason)
{
Reason = reason;
}
public void Write(WorldPacket data) public void Write(WorldPacket data)
{ {
data.WriteBits(Reason, 4); data.WriteUInt8(Reason);
if (Reason == (byte)SpellMissInfo.Reflect) }
public SpellMissInfo Reason;
}
public struct SpellMissStatus
{
public SpellMissStatus(SpellMissInfo reason, SpellMissInfo reflectStatus)
{
Reason = reason;
ReflectStatus = reflectStatus;
}
public void Write(WorldPacket data)
{
data.WriteBits((byte)Reason, 4);
if (Reason == SpellMissInfo.Reflect)
data.WriteBits(ReflectStatus, 4); data.WriteBits(ReflectStatus, 4);
data.FlushBits(); data.FlushBits();
} }
public byte Reason; public SpellMissInfo Reason;
public byte ReflectStatus; public SpellMissInfo ReflectStatus;
} }
public struct SpellPowerData public struct SpellPowerData
@@ -1643,22 +1668,26 @@ namespace Game.Network.Packets
data.WriteBits(HitTargets.Count, 16); data.WriteBits(HitTargets.Count, 16);
data.WriteBits(MissTargets.Count, 16); data.WriteBits(MissTargets.Count, 16);
data.WriteBits(HitStatus.Count, 16);
data.WriteBits(MissStatus.Count, 16); data.WriteBits(MissStatus.Count, 16);
data.WriteBits(RemainingPower.Count, 9); data.WriteBits(RemainingPower.Count, 9);
data.WriteBit(RemainingRunes.HasValue); data.WriteBit(RemainingRunes.HasValue);
data.WriteBits(TargetPoints.Count, 16); data.WriteBits(TargetPoints.Count, 16);
data.FlushBits(); data.FlushBits();
foreach (SpellMissStatus status in MissStatus) foreach (SpellMissStatus missStatus in MissStatus)
status.Write(data); missStatus.Write(data);
Target.Write(data); Target.Write(data);
foreach (ObjectGuid target in HitTargets) foreach (ObjectGuid hitTarget in HitTargets)
data.WritePackedGuid(target); data.WritePackedGuid(hitTarget);
foreach (ObjectGuid target in MissTargets) foreach (ObjectGuid missTarget in MissTargets)
data.WritePackedGuid(target); data.WritePackedGuid(missTarget);
foreach (SpellHitStatus hitStatus in HitStatus)
hitStatus.Write(data);
foreach (SpellPowerData power in RemainingPower) foreach (SpellPowerData power in RemainingPower)
power.Write(data); power.Write(data);
@@ -1681,6 +1710,7 @@ namespace Game.Network.Packets
public uint CastTime; public uint CastTime;
public List<ObjectGuid> HitTargets = new List<ObjectGuid>(); public List<ObjectGuid> HitTargets = new List<ObjectGuid>();
public List<ObjectGuid> MissTargets = new List<ObjectGuid>(); public List<ObjectGuid> MissTargets = new List<ObjectGuid>();
public List<SpellHitStatus> HitStatus = new List<SpellHitStatus>();
public List<SpellMissStatus> MissStatus = new List<SpellMissStatus>(); public List<SpellMissStatus> MissStatus = new List<SpellMissStatus>();
public SpellTargetData Target = new SpellTargetData(); public SpellTargetData Target = new SpellTargetData();
public List<SpellPowerData> RemainingPower = new List<SpellPowerData>(); public List<SpellPowerData> RemainingPower = new List<SpellPowerData>();
@@ -50,6 +50,7 @@ namespace Game.Network.Packets
_worldPacket.WriteUInt32(BpayStoreProductDeliveryDelay); _worldPacket.WriteUInt32(BpayStoreProductDeliveryDelay);
_worldPacket.WriteUInt32(ClubsPresenceUpdateTimer); _worldPacket.WriteUInt32(ClubsPresenceUpdateTimer);
_worldPacket.WriteUInt32(HiddenUIClubsPresenceUpdateTimer);
_worldPacket.WriteBit(VoiceEnabled); _worldPacket.WriteBit(VoiceEnabled);
_worldPacket.WriteBit(EuropaTicketSystemStatus.HasValue); _worldPacket.WriteBit(EuropaTicketSystemStatus.HasValue);
@@ -77,6 +78,7 @@ namespace Game.Network.Packets
_worldPacket.WriteBit(ClubsEnabled); _worldPacket.WriteBit(ClubsEnabled);
_worldPacket.WriteBit(ClubsBattleNetClubTypeAllowed); _worldPacket.WriteBit(ClubsBattleNetClubTypeAllowed);
_worldPacket.WriteBit(ClubsCharacterClubTypeAllowed); _worldPacket.WriteBit(ClubsCharacterClubTypeAllowed);
_worldPacket.WriteBit(ClubsPresenceUpdateEnabled);
_worldPacket.WriteBit(VoiceChatDisabledByParentalControl); _worldPacket.WriteBit(VoiceChatDisabledByParentalControl);
_worldPacket.WriteBit(VoiceChatMutedByParentalControl); _worldPacket.WriteBit(VoiceChatMutedByParentalControl);
_worldPacket.FlushBits(); _worldPacket.FlushBits();
@@ -159,6 +161,7 @@ namespace Game.Network.Packets
public long TokenBalanceAmount; public long TokenBalanceAmount;
public uint BpayStoreProductDeliveryDelay; public uint BpayStoreProductDeliveryDelay;
public uint ClubsPresenceUpdateTimer; public uint ClubsPresenceUpdateTimer;
public uint HiddenUIClubsPresenceUpdateTimer; // Timer for updating club presence when communities ui frame is hidden
public bool ItemRestorationButtonEnabled; public bool ItemRestorationButtonEnabled;
public bool CharUndeleteEnabled; // Implemented public bool CharUndeleteEnabled; // Implemented
public bool BpayStoreDisabledByParentalControls; public bool BpayStoreDisabledByParentalControls;
@@ -176,6 +179,7 @@ namespace Game.Network.Packets
public bool ClubsEnabled; public bool ClubsEnabled;
public bool ClubsBattleNetClubTypeAllowed; public bool ClubsBattleNetClubTypeAllowed;
public bool ClubsCharacterClubTypeAllowed; public bool ClubsCharacterClubTypeAllowed;
public bool ClubsPresenceUpdateEnabled;
public bool VoiceChatDisabledByParentalControl; public bool VoiceChatDisabledByParentalControl;
public bool VoiceChatMutedByParentalControl; public bool VoiceChatMutedByParentalControl;
+2 -2
View File
@@ -87,12 +87,12 @@ namespace Game.Network.Packets
_worldPacket.WriteUInt64(CurrentMarketPrice); _worldPacket.WriteUInt64(CurrentMarketPrice);
_worldPacket.WriteUInt32(UnkInt); _worldPacket.WriteUInt32(UnkInt);
_worldPacket.WriteUInt32(Result); _worldPacket.WriteUInt32(Result);
_worldPacket.WriteUInt32(UnkInt2); _worldPacket.WriteUInt32(AuctionDuration);
} }
public ulong CurrentMarketPrice; public ulong CurrentMarketPrice;
public uint UnkInt; // send CMSG_REQUEST_WOW_TOKEN_MARKET_PRICE public uint UnkInt; // send CMSG_REQUEST_WOW_TOKEN_MARKET_PRICE
public TokenResult Result; public TokenResult Result;
public uint UnkInt2 = 0; public uint AuctionDuration; // preset auction duration enum
} }
} }
+23 -6
View File
@@ -18,6 +18,7 @@
using Framework.Constants; using Framework.Constants;
using Game.Entities; using Game.Entities;
using System.Collections.Generic; using System.Collections.Generic;
using System;
namespace Game.Network.Packets namespace Game.Network.Packets
{ {
@@ -54,20 +55,36 @@ namespace Game.Network.Packets
_worldPacket.WriteBit(IsFullUpdate); _worldPacket.WriteBit(IsFullUpdate);
_worldPacket.FlushBits(); _worldPacket.FlushBits();
// both lists have to have the same size // all lists have to have the same size
_worldPacket.WriteUInt32(Toys.Count);
_worldPacket.WriteUInt32(Toys.Count); _worldPacket.WriteUInt32(Toys.Count);
_worldPacket.WriteUInt32(Toys.Count); _worldPacket.WriteUInt32(Toys.Count);
foreach (var item in Toys) foreach (var pair in Toys)
_worldPacket.WriteUInt32(item.Key); _worldPacket.WriteUInt32(pair.Key);
foreach (var favourite in Toys) foreach (var pair in Toys)
_worldPacket.WriteBit(favourite.Value); _worldPacket.WriteBit(pair.Value.HasAnyFlag(ToyFlags.Favorite));
foreach (var pair in Toys)
_worldPacket.WriteBit(pair.Value.HasAnyFlag(ToyFlags.HasFanfare));
_worldPacket.FlushBits(); _worldPacket.FlushBits();
} }
public bool IsFullUpdate = false; public bool IsFullUpdate = false;
public Dictionary<uint, bool> Toys = new Dictionary<uint, bool>(); public Dictionary<uint, ToyFlags> Toys = new Dictionary<uint, ToyFlags>();
}
class ToyClearFanfare : ClientPacket
{
public ToyClearFanfare(WorldPacket packet) : base(packet) { }
public override void Read()
{
ItemID = _worldPacket.ReadUInt32();
}
public uint ItemID;
} }
} }
+11 -9
View File
@@ -124,16 +124,17 @@ namespace Game
AllowableRaces = (long)fields.Read<ulong>(108); AllowableRaces = (long)fields.Read<ulong>(108);
TreasurePickerID = fields.Read<int>(109); TreasurePickerID = fields.Read<int>(109);
Expansion = fields.Read<int>(110); Expansion = fields.Read<int>(110);
ManagedWorldStateID = fields.Read<int>(111);
LogTitle = fields.Read<string>(111); LogTitle = fields.Read<string>(112);
LogDescription = fields.Read<string>(112); LogDescription = fields.Read<string>(113);
QuestDescription = fields.Read<string>(113); QuestDescription = fields.Read<string>(114);
AreaDescription = fields.Read<string>(114); AreaDescription = fields.Read<string>(115);
PortraitGiverText = fields.Read<string>(115); PortraitGiverText = fields.Read<string>(116);
PortraitGiverName = fields.Read<string>(116); PortraitGiverName = fields.Read<string>(117);
PortraitTurnInText = fields.Read<string>(117); PortraitTurnInText = fields.Read<string>(118);
PortraitTurnInName = fields.Read<string>(118); PortraitTurnInName = fields.Read<string>(119);
QuestCompletionLog = fields.Read<string>(119); QuestCompletionLog = fields.Read<string>(120);
} }
public void LoadQuestDetails(SQLFields fields) public void LoadQuestDetails(SQLFields fields)
@@ -487,6 +488,7 @@ namespace Game
public long AllowableRaces { get; set; } public long AllowableRaces { get; set; }
public int TreasurePickerID; public int TreasurePickerID;
public int Expansion; public int Expansion;
public int ManagedWorldStateID;
public List<QuestObjective> Objectives = new List<QuestObjective>(); public List<QuestObjective> Objectives = new List<QuestObjective>();
public string LogTitle = ""; public string LogTitle = "";
public string LogDescription = ""; public string LogDescription = "";
+2 -6
View File
@@ -3724,6 +3724,7 @@ namespace Game.Spells
if (targetInfo.missCondition == SpellMissInfo.None) // hits if (targetInfo.missCondition == SpellMissInfo.None) // hits
{ {
data.HitTargets.Add(targetInfo.targetGUID); data.HitTargets.Add(targetInfo.targetGUID);
data.HitStatus.Add(new SpellHitStatus(SpellMissInfo.None));
m_channelTargetEffectMask |= targetInfo.effectMask; m_channelTargetEffectMask |= targetInfo.effectMask;
} }
@@ -3731,12 +3732,7 @@ namespace Game.Spells
{ {
data.MissTargets.Add(targetInfo.targetGUID); data.MissTargets.Add(targetInfo.targetGUID);
SpellMissStatus missStatus = new SpellMissStatus(); data.MissStatus.Add(new SpellMissStatus(targetInfo.missCondition, targetInfo.reflectResult));
missStatus.Reason = (byte)targetInfo.missCondition;
if (targetInfo.missCondition == SpellMissInfo.Reflect)
missStatus.ReflectStatus = (byte)targetInfo.reflectResult;
data.MissStatus.Add(missStatus);
} }
} }