Core/PacketIO: Update opcodes and packet structures to 8.2.5
Port From (https://github.com/TrinityCore/TrinityCore/commit/ee2e49429f4383732b4e0f39b493470b9c1dd10c)
This commit is contained in:
File diff suppressed because it is too large
Load Diff
@@ -105,7 +105,8 @@ namespace Framework.Constants
|
||||
CommerceObj = 45,
|
||||
ClientSession = 46,
|
||||
Cast = 47,
|
||||
ClientConnection = 48
|
||||
ClientConnection = 48,
|
||||
ClubFinder = 49
|
||||
}
|
||||
|
||||
public enum NotifyFlags
|
||||
|
||||
@@ -837,8 +837,8 @@ namespace Game.BattleGrounds.Zones
|
||||
{
|
||||
base.BuildPvPLogPlayerDataPacket(out playerData);
|
||||
|
||||
playerData.Stats.Add(BasesAssaulted);
|
||||
playerData.Stats.Add(BasesDefended);
|
||||
playerData.Stats.Add(new PVPLogData.PVPMatchPlayerPVPStat((int)ABObjectives.AssaultBase, BasesAssaulted));
|
||||
playerData.Stats.Add(new PVPLogData.PVPMatchPlayerPVPStat((int)ABObjectives.DefendBase, BasesDefended));
|
||||
}
|
||||
|
||||
public override uint GetAttr1() { return BasesAssaulted; }
|
||||
|
||||
@@ -1003,7 +1003,7 @@ namespace Game.BattleGrounds.Zones
|
||||
{
|
||||
base.BuildPvPLogPlayerDataPacket(out playerData);
|
||||
|
||||
playerData.Stats.Add(FlagCaptures);
|
||||
playerData.Stats.Add(new PVPLogData.PVPMatchPlayerPVPStat((int)EotSMisc.ObjectiveCaptureFlag, FlagCaptures));
|
||||
}
|
||||
|
||||
public override uint GetAttr1() { return FlagCaptures; }
|
||||
|
||||
@@ -1088,6 +1088,25 @@ namespace Game.BattleGrounds.Zones
|
||||
return true;
|
||||
}
|
||||
|
||||
public override bool UpdatePlayerScore(Player player, ScoreType type, uint value, bool doAddHonor = true)
|
||||
{
|
||||
if (!base.UpdatePlayerScore(player, type, value, doAddHonor))
|
||||
return false;
|
||||
|
||||
switch (type)
|
||||
{
|
||||
case ScoreType.DestroyedDemolisher:
|
||||
player.UpdateCriteria(CriteriaTypes.BgObjectiveCapture, (uint)SAObjectives.DemolishersDestroyed);
|
||||
break;
|
||||
case ScoreType.DestroyedWall:
|
||||
player.UpdateCriteria(CriteriaTypes.BgObjectiveCapture, (uint)SAObjectives.GatesDestroyed);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
SAGateInfo GetGate(uint entry)
|
||||
{
|
||||
foreach (var gate in SAMiscConst.Gates)
|
||||
@@ -1157,8 +1176,8 @@ namespace Game.BattleGrounds.Zones
|
||||
{
|
||||
base.BuildPvPLogPlayerDataPacket(out playerData);
|
||||
|
||||
playerData.Stats.Add(DemolishersDestroyed);
|
||||
playerData.Stats.Add(GatesDestroyed);
|
||||
playerData.Stats.Add(new PVPLogData.PVPMatchPlayerPVPStat((int)SAObjectives.DemolishersDestroyed, DemolishersDestroyed));
|
||||
playerData.Stats.Add(new PVPLogData.PVPMatchPlayerPVPStat((int)SAObjectives.GatesDestroyed, GatesDestroyed));
|
||||
}
|
||||
|
||||
public override uint GetAttr1() { return DemolishersDestroyed; }
|
||||
@@ -1643,5 +1662,11 @@ namespace Game.BattleGrounds.Zones
|
||||
public const int CentralCapturableGy = 4;
|
||||
public const int Max = 5;
|
||||
}
|
||||
|
||||
enum SAObjectives
|
||||
{
|
||||
GatesDestroyed = 231,
|
||||
DemolishersDestroyed = 232
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
|
||||
@@ -789,10 +789,10 @@ namespace Game.BattleGrounds.Zones
|
||||
switch (type)
|
||||
{
|
||||
case ScoreType.FlagCaptures: // flags captured
|
||||
player.UpdateCriteria(CriteriaTypes.BgObjectiveCapture, 42);
|
||||
player.UpdateCriteria(CriteriaTypes.BgObjectiveCapture, WSObjectives.CaptureFlag);
|
||||
break;
|
||||
case ScoreType.FlagReturns: // flags returned
|
||||
player.UpdateCriteria(CriteriaTypes.BgObjectiveCapture, 44);
|
||||
player.UpdateCriteria(CriteriaTypes.BgObjectiveCapture, WSObjectives.ReturnFlag);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
@@ -970,8 +970,8 @@ namespace Game.BattleGrounds.Zones
|
||||
{
|
||||
base.BuildPvPLogPlayerDataPacket(out playerData);
|
||||
|
||||
playerData.Stats.Add(FlagCaptures);
|
||||
playerData.Stats.Add(FlagReturns);
|
||||
playerData.Stats.Add(new PVPLogData.PVPMatchPlayerPVPStat(WSObjectives.CaptureFlag, FlagCaptures));
|
||||
playerData.Stats.Add(new PVPLogData.PVPMatchPlayerPVPStat(WSObjectives.ReturnFlag, FlagReturns));
|
||||
}
|
||||
|
||||
public override uint GetAttr1() { return FlagCaptures; }
|
||||
@@ -1115,5 +1115,10 @@ namespace Game.BattleGrounds.Zones
|
||||
public const uint AllianceFlagReturned = 9808;
|
||||
public const uint HordeFlagReturned = 9809;
|
||||
}
|
||||
struct WSObjectives
|
||||
{
|
||||
public const int CaptureFlag = 42;
|
||||
public const int ReturnFlag = 44;
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
|
||||
@@ -30,11 +30,12 @@ namespace Game.Chat
|
||||
{
|
||||
public class Channel
|
||||
{
|
||||
public Channel(uint channelId, Team team = 0, AreaTableRecord zoneEntry = null)
|
||||
public Channel(ObjectGuid guid, uint channelId, Team team = 0, AreaTableRecord zoneEntry = null)
|
||||
{
|
||||
_channelFlags = ChannelFlags.General;
|
||||
_channelId = channelId;
|
||||
_channelTeam = team;
|
||||
_channelGuid = guid;
|
||||
_zoneEntry = zoneEntry;
|
||||
|
||||
ChatChannelsRecord channelEntry = CliDB.ChatChannelsStorage.LookupByKey(channelId);
|
||||
@@ -50,12 +51,13 @@ namespace Game.Chat
|
||||
_channelFlags |= ChannelFlags.NotLfg;
|
||||
}
|
||||
|
||||
public Channel(string name, Team team = 0)
|
||||
public Channel(ObjectGuid guid, string name, Team team = 0)
|
||||
{
|
||||
_announceEnabled = true;
|
||||
_ownershipEnabled = true;
|
||||
_channelFlags = ChannelFlags.Custom;
|
||||
_channelTeam = team;
|
||||
_channelGuid = guid;
|
||||
_channelName = name;
|
||||
|
||||
// If storing custom channels in the db is enabled either load or save the channel
|
||||
@@ -881,6 +883,7 @@ namespace Game.Chat
|
||||
}
|
||||
|
||||
public uint GetChannelId() { return _channelId; }
|
||||
public ObjectGuid GetChannelGuid() { return _channelGuid; }
|
||||
public bool IsConstant() { return _channelId != 0; }
|
||||
|
||||
public bool IsLFG() { return GetFlags().HasAnyFlag(ChannelFlags.Lfg); }
|
||||
@@ -924,6 +927,7 @@ namespace Game.Chat
|
||||
ChannelFlags _channelFlags;
|
||||
uint _channelId;
|
||||
Team _channelTeam;
|
||||
ObjectGuid _channelGuid;
|
||||
ObjectGuid _ownerGuid;
|
||||
string _channelName;
|
||||
string _channelPassword;
|
||||
|
||||
@@ -71,6 +71,7 @@ namespace Game.Chat
|
||||
//notify.InstanceID = 0;
|
||||
notify.ChannelFlags = _source.GetFlags();
|
||||
notify.Channel = _source.GetName(localeIdx);
|
||||
notify.ChannelGUID = _source.GetChannelGuid();
|
||||
return notify;
|
||||
}
|
||||
|
||||
|
||||
@@ -29,6 +29,7 @@ namespace Game.Chat
|
||||
public ChannelManager(Team team)
|
||||
{
|
||||
_team = team;
|
||||
_guidGenerator = new ObjectGuidGenerator(HighGuid.ChatChannel);
|
||||
}
|
||||
|
||||
public static ChannelManager ForTeam(Team team)
|
||||
@@ -61,18 +62,13 @@ namespace Game.Chat
|
||||
{
|
||||
if (channelId != 0) // builtin
|
||||
{
|
||||
ChatChannelsRecord channelEntry = CliDB.ChatChannelsStorage.LookupByKey(channelId);
|
||||
uint zoneId = zoneEntry != null ? zoneEntry.Id : 0;
|
||||
if (channelEntry.Flags.HasAnyFlag(ChannelDBCFlags.Global | ChannelDBCFlags.CityOnly))
|
||||
zoneId = 0;
|
||||
|
||||
Tuple<uint, uint> key = Tuple.Create(channelId, zoneId);
|
||||
var channel = _channels.LookupByKey(key);
|
||||
ObjectGuid channelGuid = CreateBuiltinChannelGuid(channelId, zoneEntry);
|
||||
var channel = _channels.LookupByKey(channelGuid);
|
||||
if (channel != null)
|
||||
return channel;
|
||||
|
||||
Channel newChannel = new Channel(channelId, _team, zoneEntry);
|
||||
_channels[key] = newChannel;
|
||||
Channel newChannel = new Channel(channelGuid, channelId, _team, zoneEntry);
|
||||
_channels[channelGuid] = newChannel;
|
||||
return newChannel;
|
||||
}
|
||||
else // custom
|
||||
@@ -81,7 +77,7 @@ namespace Game.Chat
|
||||
if (channel != null)
|
||||
return channel;
|
||||
|
||||
Channel newChannel = new Channel(name, _team);
|
||||
Channel newChannel = new Channel(CreateCustomChannelGuid(), name, _team);
|
||||
_customChannels[name.ToLower()] = newChannel;
|
||||
return newChannel;
|
||||
}
|
||||
@@ -92,13 +88,7 @@ namespace Game.Chat
|
||||
Channel result = null;
|
||||
if (channelId != 0) // builtin
|
||||
{
|
||||
ChatChannelsRecord channelEntry = CliDB.ChatChannelsStorage.LookupByKey(channelId);
|
||||
uint zoneId = zoneEntry != null ? zoneEntry.Id : 0;
|
||||
if (channelEntry.Flags.HasAnyFlag(ChannelDBCFlags.Global | ChannelDBCFlags.CityOnly))
|
||||
zoneId = 0;
|
||||
|
||||
Tuple<uint, uint> key = Tuple.Create(channelId, zoneId);
|
||||
var channel = _channels.LookupByKey(key);
|
||||
var channel = _channels.LookupByKey(CreateBuiltinChannelGuid(channelId, zoneEntry));
|
||||
if (channel != null)
|
||||
result = channel;
|
||||
}
|
||||
@@ -134,18 +124,13 @@ namespace Game.Chat
|
||||
|
||||
public void LeftChannel(uint channelId, AreaTableRecord zoneEntry)
|
||||
{
|
||||
ChatChannelsRecord channelEntry = CliDB.ChatChannelsStorage.LookupByKey(channelId);
|
||||
uint zoneId = zoneEntry != null ? zoneEntry.Id : 0;
|
||||
if (channelEntry.Flags.HasAnyFlag(ChannelDBCFlags.Global | ChannelDBCFlags.CityOnly))
|
||||
zoneId = 0;
|
||||
|
||||
Tuple<uint, uint> key = Tuple.Create(channelId, zoneId);
|
||||
var channel = _channels.LookupByKey(key);
|
||||
var guid = CreateBuiltinChannelGuid(channelId, zoneEntry);
|
||||
var channel = _channels.LookupByKey(guid);
|
||||
if (channel == null)
|
||||
return;
|
||||
|
||||
if (channel.GetNumPlayers() == 0)
|
||||
_channels.Remove(key);
|
||||
_channels.Remove(guid);
|
||||
}
|
||||
|
||||
public static void SendNotOnChannelNotify(Player player, string name)
|
||||
@@ -156,9 +141,45 @@ namespace Game.Chat
|
||||
player.SendPacket(notify);
|
||||
}
|
||||
|
||||
ObjectGuid CreateCustomChannelGuid()
|
||||
{
|
||||
ulong high = 0;
|
||||
high |= (ulong)HighGuid.ChatChannel << 58;
|
||||
high |= (ulong)Global.WorldMgr.GetRealmId().Realm << 42;
|
||||
high |= (ulong)(_team == Team.Alliance ? 3 : 5) << 4;
|
||||
|
||||
ObjectGuid channelGuid = new ObjectGuid();
|
||||
channelGuid.SetRawValue(high, _guidGenerator.Generate());
|
||||
return channelGuid;
|
||||
}
|
||||
|
||||
ObjectGuid CreateBuiltinChannelGuid(uint channelId, AreaTableRecord zoneEntry = null)
|
||||
{
|
||||
|
||||
ChatChannelsRecord channelEntry = CliDB.ChatChannelsStorage.LookupByKey(channelId);
|
||||
uint zoneId = zoneEntry != null ? zoneEntry.Id : 0;
|
||||
if (channelEntry.Flags.HasAnyFlag(ChannelDBCFlags.Global | ChannelDBCFlags.CityOnly))
|
||||
zoneId = 0;
|
||||
|
||||
ulong high = 0;
|
||||
high |= (ulong)HighGuid.ChatChannel << 58;
|
||||
high |= (ulong)Global.WorldMgr.GetRealmId().Realm << 42;
|
||||
high |= 1ul << 25; // built-in
|
||||
if (channelEntry.Flags.HasAnyFlag(ChannelDBCFlags.CityOnly2))
|
||||
high |= 1ul << 24; // trade
|
||||
|
||||
high |= (ulong)(zoneId) << 10;
|
||||
high |= (ulong)(_team == Team.Alliance ? 3 : 5) << 4;
|
||||
|
||||
ObjectGuid channelGuid = new ObjectGuid();
|
||||
channelGuid.SetRawValue(high, channelId);
|
||||
return channelGuid;
|
||||
}
|
||||
|
||||
Dictionary<string, Channel> _customChannels = new Dictionary<string, Channel>();
|
||||
Dictionary<Tuple<uint /*channelId*/, uint /*zoneId*/>, Channel> _channels = new Dictionary<Tuple<uint, uint>, Channel>();
|
||||
Dictionary<ObjectGuid, Channel> _channels = new Dictionary<ObjectGuid, Channel>();
|
||||
Team _team;
|
||||
ObjectGuidGenerator _guidGenerator;
|
||||
|
||||
static ChannelManager allianceChannelMgr = new ChannelManager(Team.Alliance);
|
||||
static ChannelManager hordeChannelMgr = new ChannelManager(Team.Horde);
|
||||
|
||||
@@ -434,6 +434,7 @@ namespace Game.Misc
|
||||
packet.PortraitGiver = quest.QuestGiverPortrait;
|
||||
packet.PortraitGiverMount = quest.QuestGiverPortraitMount;
|
||||
packet.PortraitTurnIn = quest.QuestTurnInPortrait;
|
||||
packet.QuestSessionBonus = 0; //quest.GetQuestSessionBonus(); // this is only sent while quest session is active
|
||||
packet.AutoLaunched = autoLaunched;
|
||||
packet.DisplayPopup = displayPopup;
|
||||
packet.QuestFlags[0] = (uint)(quest.Flags & (WorldConfig.GetBoolValue(WorldCfg.QuestIgnoreAutoAccept) ? ~QuestFlags.AutoAccept : ~QuestFlags.None));
|
||||
|
||||
@@ -295,6 +295,7 @@ namespace Game.Entities
|
||||
{
|
||||
case HighGuid.Player:
|
||||
case HighGuid.Item:
|
||||
case HighGuid.ChatChannel:
|
||||
case HighGuid.Transport:
|
||||
case HighGuid.Guild:
|
||||
return true;
|
||||
|
||||
@@ -319,8 +319,10 @@ namespace Game.Entities
|
||||
_changesMask = new UpdateMask(changeMask);
|
||||
}
|
||||
|
||||
public abstract void WriteCreate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, T owner, Player receiver);
|
||||
public abstract void WriteUpdate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, T owner, Player receiver);
|
||||
public virtual void WriteCreate(WorldPacket data, T owner, Player receiver) { }
|
||||
public virtual void WriteUpdate(WorldPacket data, T owner, Player receiver) { }
|
||||
public virtual void WriteCreate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, T owner, Player receiver) { }
|
||||
public virtual void WriteUpdate(WorldPacket data, UpdateFieldFlag fieldVisibilityFlags, T owner, Player receiver) { }
|
||||
|
||||
public abstract void ClearChangesMask();
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -3205,17 +3205,17 @@ namespace Game.Entities
|
||||
Item item = GetItemByPos(InventorySlots.Bag0, i);
|
||||
if (item != null)
|
||||
{
|
||||
ss.Append($"{item.GetTemplate().GetInventoryType()} {item.GetDisplayId(this)} ");
|
||||
ss.Append($"{(uint)item.GetTemplate().GetInventoryType()} {item.GetDisplayId(this)} ");
|
||||
SpellItemEnchantmentRecord enchant = CliDB.SpellItemEnchantmentStorage.LookupByKey(item.GetVisibleEnchantmentId(this));
|
||||
if (enchant != null)
|
||||
ss.Append(enchant.ItemVisual);
|
||||
else
|
||||
ss.Append('0');
|
||||
|
||||
ss.Append(' ');
|
||||
ss.Append($" {(uint)CliDB.ItemStorage.LookupByKey(item.GetVisibleEntry(this)).SubclassID} ");
|
||||
}
|
||||
else
|
||||
ss.Append("0 0 0 ");
|
||||
ss.Append("0 0 0 0 ");
|
||||
}
|
||||
|
||||
stmt.AddValue(index++, ss.ToString());
|
||||
@@ -3362,10 +3362,10 @@ namespace Game.Entities
|
||||
else
|
||||
ss.Append('0');
|
||||
|
||||
ss.Append(' ');
|
||||
ss.Append($" {(uint)CliDB.ItemStorage.LookupByKey(item.GetVisibleEntry(this)).SubclassID} ");
|
||||
}
|
||||
else
|
||||
ss.Append("0 0 0 ");
|
||||
ss.Append("0 0 0 0 ");
|
||||
}
|
||||
|
||||
stmt.AddValue(index++, ss.ToString());
|
||||
|
||||
@@ -6252,9 +6252,9 @@ namespace Game
|
||||
"RewardFactionID5, RewardFactionValue5, RewardFactionOverride5, RewardFactionCapIn5, RewardFactionFlags, " +
|
||||
//96 97 98 99 100 101 102 103
|
||||
"RewardCurrencyID1, RewardCurrencyQty1, RewardCurrencyID2, RewardCurrencyQty2, RewardCurrencyID3, RewardCurrencyQty3, RewardCurrencyID4, RewardCurrencyQty4, " +
|
||||
//104 105 106 107 108 109 110 111
|
||||
"AcceptedSoundKitID, CompleteSoundKitID, AreaGroupID, TimeAllowed, AllowableRaces, TreasurePickerID, Expansion, ManagedWorldStateID, " +
|
||||
//112 113 114 115 116 117 118 119 120
|
||||
//104 105 106 107 108 109 110 111 112
|
||||
"AcceptedSoundKitID, CompleteSoundKitID, AreaGroupID, TimeAllowed, AllowableRaces, TreasurePickerID, Expansion, ManagedWorldStateID, QuestSessionBonus, " +
|
||||
//113 114 115 116 117 118 119 120 121
|
||||
"LogTitle, LogDescription, QuestDescription, AreaDescription, PortraitGiverText, PortraitGiverName, PortraitTurnInText, PortraitTurnInName, QuestCompletionLog" +
|
||||
" FROM quest_template");
|
||||
|
||||
|
||||
@@ -73,24 +73,24 @@ namespace Game
|
||||
|
||||
Log.outInfo(LogFilter.Network, "Loading Character {0} from account {1}.", charInfo.Guid.ToString(), GetAccountId());
|
||||
|
||||
if (!Player.ValidateAppearance((Race)charInfo.RaceId, charInfo.ClassId, (Gender)charInfo.Sex, charInfo.HairStyle, charInfo.HairColor, charInfo.Face, charInfo.FacialHair, charInfo.Skin, charInfo.CustomDisplay))
|
||||
if (!Player.ValidateAppearance((Race)charInfo.RaceId, charInfo.ClassId, (Gender)charInfo.SexId, charInfo.HairStyle, charInfo.HairColor, charInfo.FaceId, charInfo.FacialHair, charInfo.SkinId, charInfo.CustomDisplay))
|
||||
{
|
||||
Log.outError(LogFilter.Player, "Player {0} has wrong Appearance values (Hair/Skin/Color), forcing recustomize", charInfo.Guid.ToString());
|
||||
|
||||
// Make sure customization always works properly - send all zeroes instead
|
||||
charInfo.Skin = 0;
|
||||
charInfo.Face = 0;
|
||||
charInfo.SkinId = 0;
|
||||
charInfo.FaceId = 0;
|
||||
charInfo.HairStyle = 0;
|
||||
charInfo.HairColor = 0;
|
||||
charInfo.FacialHair = 0;
|
||||
|
||||
if (charInfo.CustomizationFlag != CharacterCustomizeFlags.Customize)
|
||||
if (charInfo.Flags2 != CharacterCustomizeFlags.Customize)
|
||||
{
|
||||
PreparedStatement stmt = DB.Characters.GetPreparedStatement(CharStatements.UPD_ADD_AT_LOGIN_FLAG);
|
||||
stmt.AddValue(0, (ushort)AtLoginFlags.Customize);
|
||||
stmt.AddValue(1, charInfo.Guid.GetCounter());
|
||||
DB.Characters.Execute(stmt);
|
||||
charInfo.CustomizationFlag = CharacterCustomizeFlags.Customize;
|
||||
charInfo.Flags2 = CharacterCustomizeFlags.Customize;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -99,7 +99,7 @@ namespace Game
|
||||
_legitCharacters.Add(charInfo.Guid);
|
||||
|
||||
if (!Global.CharacterCacheStorage.HasCharacterCacheEntry(charInfo.Guid)) // This can happen if characters are inserted into the database manually. Core hasn't loaded name data yet.
|
||||
Global.CharacterCacheStorage.AddCharacterCacheEntry(charInfo.Guid, GetAccountId(), charInfo.Name, charInfo.Sex, charInfo.RaceId, (byte)charInfo.ClassId, charInfo.Level, false);
|
||||
Global.CharacterCacheStorage.AddCharacterCacheEntry(charInfo.Guid, GetAccountId(), charInfo.Name, charInfo.SexId, charInfo.RaceId, (byte)charInfo.ClassId, charInfo.ExperienceLevel, false);
|
||||
|
||||
if (charInfo.ClassId == Class.DemonHunter)
|
||||
demonHunterCount++;
|
||||
@@ -109,7 +109,7 @@ namespace Game
|
||||
else
|
||||
charResult.HasDemonHunterOnRealm = false;
|
||||
|
||||
charResult.MaxCharacterLevel = Math.Max(charResult.MaxCharacterLevel, charInfo.Level);
|
||||
charResult.MaxCharacterLevel = Math.Max(charResult.MaxCharacterLevel, charInfo.ExperienceLevel);
|
||||
|
||||
charResult.Characters.Add(charInfo);
|
||||
}
|
||||
@@ -163,7 +163,7 @@ namespace Game
|
||||
Log.outInfo(LogFilter.Network, "Loading undeleted char guid {0} from account {1}.", charInfo.Guid.ToString(), GetAccountId());
|
||||
|
||||
if (!Global.CharacterCacheStorage.HasCharacterCacheEntry(charInfo.Guid)) // This can happen if characters are inserted into the database manually. Core hasn't loaded name data yet.
|
||||
Global.CharacterCacheStorage.AddCharacterCacheEntry(charInfo.Guid, GetAccountId(), charInfo.Name, charInfo.Sex, charInfo.RaceId, (byte)charInfo.ClassId, charInfo.Level, true);
|
||||
Global.CharacterCacheStorage.AddCharacterCacheEntry(charInfo.Guid, GetAccountId(), charInfo.Name, charInfo.SexId, charInfo.RaceId, (byte)charInfo.ClassId, charInfo.ExperienceLevel, true);
|
||||
|
||||
charEnum.Characters.Add(charInfo);
|
||||
}
|
||||
@@ -891,7 +891,6 @@ namespace Game
|
||||
features.CfgRealmID = 2;
|
||||
features.CfgRealmRecID = 0;
|
||||
features.TokenPollTimeSeconds = 300;
|
||||
features.TokenRedeemIndex = 0;
|
||||
features.VoiceEnabled = false;
|
||||
features.BrowserEnabled = false; // Has to be false, otherwise client will crash if "Customer Support" is opened
|
||||
|
||||
|
||||
@@ -285,6 +285,7 @@ namespace Game
|
||||
lfgUpdateStatus.Joined = join;
|
||||
lfgUpdateStatus.LfgJoined = updateData.updateType != LfgUpdateType.RemovedFromQueue;
|
||||
lfgUpdateStatus.Queued = queued;
|
||||
lfgUpdateStatus.QueueMapID = Global.LFGMgr.GetDungeonMapId(_player.GetGUID());
|
||||
|
||||
SendPacket(lfgUpdateStatus);
|
||||
}
|
||||
|
||||
@@ -24,7 +24,7 @@ namespace Game
|
||||
{
|
||||
public partial class WorldSession
|
||||
{
|
||||
[WorldPacketHandler(ClientOpcodes.GrantLevel)]
|
||||
//[WorldPacketHandler(ClientOpcodes.GrantLevel)]
|
||||
void HandleGrantLevel(GrantLevel grantLevel)
|
||||
{
|
||||
Player target = Global.ObjAccessor.GetPlayer(GetPlayer(), grantLevel.Target);
|
||||
@@ -60,12 +60,12 @@ namespace Game
|
||||
return;
|
||||
}
|
||||
|
||||
ProposeLevelGrant proposeLevelGrant = new ProposeLevelGrant();
|
||||
proposeLevelGrant.Sender = GetPlayer().GetGUID();
|
||||
target.SendPacket(proposeLevelGrant);
|
||||
//ProposeLevelGrant proposeLevelGrant = new ProposeLevelGrant();
|
||||
//proposeLevelGrant.Sender = GetPlayer().GetGUID();
|
||||
//target.SendPacket(proposeLevelGrant);
|
||||
}
|
||||
|
||||
[WorldPacketHandler(ClientOpcodes.AcceptLevelGrant)]
|
||||
//[WorldPacketHandler(ClientOpcodes.AcceptLevelGrant)]
|
||||
void HandleAcceptGrantLevel(AcceptLevelGrant acceptLevelGrant)
|
||||
{
|
||||
Player other = Global.ObjAccessor.GetPlayer(GetPlayer(), acceptLevelGrant.Granter);
|
||||
|
||||
@@ -19,6 +19,7 @@ using Framework.Constants;
|
||||
using Game.Entities;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using Framework.Dynamic;
|
||||
|
||||
namespace Game.Network.Packets
|
||||
{
|
||||
@@ -302,7 +303,11 @@ namespace Game.Network.Packets
|
||||
data.WriteUInt32(TimeFromStart);
|
||||
data.WriteUInt32(TimeFromCreate);
|
||||
data.WriteBits(Flags, 4);
|
||||
data.WriteBit(RafAcceptanceID.HasValue);
|
||||
data.FlushBits();
|
||||
|
||||
if (RafAcceptanceID.HasValue)
|
||||
data.WriteUInt64(RafAcceptanceID.Value);
|
||||
}
|
||||
|
||||
public uint Id;
|
||||
@@ -312,6 +317,7 @@ namespace Game.Network.Packets
|
||||
public long Date;
|
||||
public uint TimeFromStart;
|
||||
public uint TimeFromCreate;
|
||||
public Optional<ulong> RafAcceptanceID;
|
||||
}
|
||||
|
||||
public struct GuildCriteriaProgress
|
||||
|
||||
@@ -135,6 +135,25 @@ namespace Game.Network.Packets
|
||||
public uint ContributionPoints;
|
||||
}
|
||||
|
||||
public struct PVPMatchPlayerPVPStat
|
||||
{
|
||||
public int PvpStatID;
|
||||
public uint PvpStatValue;
|
||||
|
||||
public PVPMatchPlayerPVPStat(int pvpStatID, uint pvpStatValue)
|
||||
{
|
||||
PvpStatID = pvpStatID;
|
||||
PvpStatValue = pvpStatValue;
|
||||
}
|
||||
|
||||
public void Write(WorldPacket data)
|
||||
{
|
||||
data.WriteInt32(PvpStatID);
|
||||
data.WriteUInt32(PvpStatValue);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public class PVPMatchPlayerStatistics
|
||||
{
|
||||
public void Write(WorldPacket data)
|
||||
@@ -151,8 +170,8 @@ namespace Game.Network.Packets
|
||||
data.WriteInt32(CreatureID);
|
||||
data.WriteInt32(HonorLevel);
|
||||
|
||||
foreach (var id in Stats)
|
||||
data.WriteUInt32(id);
|
||||
foreach (var pvpStat in Stats)
|
||||
pvpStat.Write(data);
|
||||
|
||||
data.WriteBit(Faction);
|
||||
data.WriteBit(IsInWorld);
|
||||
@@ -190,7 +209,7 @@ namespace Game.Network.Packets
|
||||
public Optional<int> RatingChange;
|
||||
public Optional<uint> PreMatchMMR;
|
||||
public Optional<int> MmrChange;
|
||||
public List<uint> Stats = new List<uint>();
|
||||
public List<PVPMatchPlayerPVPStat> Stats = new List<PVPMatchPlayerPVPStat>();
|
||||
public int PrimaryTalentTree;
|
||||
public int Sex;
|
||||
public Race PlayerRace;
|
||||
|
||||
@@ -116,6 +116,7 @@ namespace Game.Network.Packets
|
||||
_worldPacket.WriteUInt32((uint)ChannelFlags);
|
||||
_worldPacket.WriteInt32(ChatChannelID);
|
||||
_worldPacket.WriteUInt64((ulong)InstanceID);
|
||||
_worldPacket.WritePackedGuid(ChannelGUID);
|
||||
_worldPacket.WriteString(Channel);
|
||||
_worldPacket.WriteString(ChannelWelcomeMsg);
|
||||
}
|
||||
@@ -125,6 +126,7 @@ namespace Game.Network.Packets
|
||||
public int InstanceID;
|
||||
public ChannelFlags ChannelFlags;
|
||||
public string Channel = "";
|
||||
public ObjectGuid ChannelGUID;
|
||||
}
|
||||
|
||||
public class ChannelNotifyLeft : ServerPacket
|
||||
|
||||
@@ -97,19 +97,19 @@ namespace Game.Network.Packets
|
||||
Name = fields.Read<string>(1);
|
||||
RaceId = fields.Read<byte>(2);
|
||||
ClassId = (Class)fields.Read<byte>(3);
|
||||
Sex = fields.Read<byte>(4);
|
||||
Skin = fields.Read<byte>(5);
|
||||
Face = fields.Read<byte>(6);
|
||||
SexId = fields.Read<byte>(4);
|
||||
SkinId = fields.Read<byte>(5);
|
||||
FaceId = fields.Read<byte>(6);
|
||||
HairStyle = fields.Read<byte>(7);
|
||||
HairColor = fields.Read<byte>(8);
|
||||
FacialHair = fields.Read<byte>(9);
|
||||
CustomDisplay[0] = fields.Read<byte>(10);
|
||||
CustomDisplay[1] = fields.Read<byte>(11);
|
||||
CustomDisplay[2] = fields.Read<byte>(12);
|
||||
Level = fields.Read<byte>(13);
|
||||
ExperienceLevel = fields.Read<byte>(13);
|
||||
ZoneId = fields.Read<uint>(14);
|
||||
MapId = fields.Read<uint>(15);
|
||||
PreLoadPosition = new Vector3(fields.Read<float>(16), fields.Read<float>(17), fields.Read<float>(18));
|
||||
PreloadPos = new Vector3(fields.Read<float>(16), fields.Read<float>(17), fields.Read<float>(18));
|
||||
|
||||
ulong guildId = fields.Read<ulong>(19);
|
||||
if (guildId != 0)
|
||||
@@ -134,11 +134,11 @@ namespace Game.Network.Packets
|
||||
Flags |= CharacterFlags.Declined;
|
||||
|
||||
if (atLoginFlags.HasAnyFlag(AtLoginFlags.Customize))
|
||||
CustomizationFlag = CharacterCustomizeFlags.Customize;
|
||||
Flags2 = CharacterCustomizeFlags.Customize;
|
||||
else if (atLoginFlags.HasAnyFlag(AtLoginFlags.ChangeFaction))
|
||||
CustomizationFlag = CharacterCustomizeFlags.Faction;
|
||||
Flags2 = CharacterCustomizeFlags.Faction;
|
||||
else if (atLoginFlags.HasAnyFlag(AtLoginFlags.ChangeRace))
|
||||
CustomizationFlag = CharacterCustomizeFlags.Race;
|
||||
Flags2 = CharacterCustomizeFlags.Race;
|
||||
|
||||
Flags3 = 0;
|
||||
Flags4 = 0;
|
||||
@@ -150,9 +150,9 @@ namespace Game.Network.Packets
|
||||
CreatureTemplate creatureInfo = Global.ObjectMgr.GetCreatureTemplate(fields.Read<uint>(22));
|
||||
if (creatureInfo != null)
|
||||
{
|
||||
Pet.CreatureDisplayId = fields.Read<uint>(23);
|
||||
Pet.Level = fields.Read<ushort>(24);
|
||||
Pet.CreatureFamily = (uint)creatureInfo.Family;
|
||||
PetCreatureDisplayId = fields.Read<uint>(23);
|
||||
PetExperienceLevel = fields.Read<ushort>(24);
|
||||
PetCreatureFamilyId = (uint)creatureInfo.Family;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -172,9 +172,10 @@ namespace Game.Network.Packets
|
||||
|
||||
for (byte slot = 0; slot < InventorySlots.BagEnd; ++slot)
|
||||
{
|
||||
VisualItems[slot].InventoryType = (byte)equipment.NextUInt32();
|
||||
VisualItems[slot].InvType = (byte)equipment.NextUInt32();
|
||||
VisualItems[slot].DisplayId = equipment.NextUInt32();
|
||||
VisualItems[slot].DisplayEnchantId = equipment.NextUInt32();
|
||||
VisualItems[slot].Subclass = (byte)equipment.NextUInt32();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -185,9 +186,9 @@ namespace Game.Network.Packets
|
||||
data.WriteUInt8(ListPosition);
|
||||
data.WriteUInt8(RaceId);
|
||||
data.WriteUInt8((byte)ClassId);
|
||||
data.WriteUInt8(Sex);
|
||||
data.WriteUInt8(Skin);
|
||||
data.WriteUInt8(Face);
|
||||
data.WriteUInt8(SexId);
|
||||
data.WriteUInt8(SkinId);
|
||||
data.WriteUInt8(FaceId);
|
||||
data.WriteUInt8(HairStyle);
|
||||
data.WriteUInt8(HairColor);
|
||||
data.WriteUInt8(FacialHair);
|
||||
@@ -195,17 +196,17 @@ namespace Game.Network.Packets
|
||||
foreach (var display in CustomDisplay)
|
||||
data.WriteUInt8(display);
|
||||
|
||||
data.WriteUInt8(Level);
|
||||
data.WriteUInt8(ExperienceLevel);
|
||||
data.WriteUInt32(ZoneId);
|
||||
data.WriteUInt32(MapId);
|
||||
data.WriteVector3(PreLoadPosition);
|
||||
data.WriteVector3(PreloadPos);
|
||||
data.WritePackedGuid(GuildGuid);
|
||||
data.WriteUInt32((uint)Flags);
|
||||
data.WriteUInt32((uint)CustomizationFlag);
|
||||
data.WriteUInt32((uint)Flags2);
|
||||
data.WriteUInt32(Flags3);
|
||||
data.WriteUInt32(Pet.CreatureDisplayId);
|
||||
data.WriteUInt32(Pet.Level);
|
||||
data.WriteUInt32(Pet.CreatureFamily);
|
||||
data.WriteUInt32(PetCreatureDisplayId);
|
||||
data.WriteUInt32(PetExperienceLevel);
|
||||
data.WriteUInt32(PetCreatureFamilyId);
|
||||
|
||||
data.WriteUInt32(ProfessionIds[0]);
|
||||
data.WriteUInt32(ProfessionIds[1]);
|
||||
@@ -233,20 +234,20 @@ namespace Game.Network.Packets
|
||||
public byte ListPosition; // Order of the characters in list
|
||||
public byte RaceId;
|
||||
public Class ClassId;
|
||||
public byte Sex;
|
||||
public byte Skin;
|
||||
public byte Face;
|
||||
public byte SexId;
|
||||
public byte SkinId;
|
||||
public byte FaceId;
|
||||
public byte HairStyle;
|
||||
public byte HairColor;
|
||||
public byte FacialHair;
|
||||
public Array<byte> CustomDisplay = new Array<byte>(PlayerConst.CustomDisplaySize);
|
||||
public byte Level;
|
||||
public byte ExperienceLevel;
|
||||
public uint ZoneId;
|
||||
public uint MapId;
|
||||
public Vector3 PreLoadPosition;
|
||||
public Vector3 PreloadPos;
|
||||
public ObjectGuid GuildGuid;
|
||||
public CharacterFlags Flags; // Character flag @see enum CharacterFlags
|
||||
public CharacterCustomizeFlags CustomizationFlag; // Character customization flags @see enum CharacterCustomizeFlags
|
||||
public CharacterCustomizeFlags Flags2; // Character customization flags @see enum CharacterCustomizeFlags
|
||||
public uint Flags3; // Character flags 3 @todo research
|
||||
public uint Flags4;
|
||||
public bool FirstLogin;
|
||||
@@ -255,7 +256,9 @@ namespace Game.Network.Packets
|
||||
public ushort SpecID;
|
||||
public uint Unknown703;
|
||||
public uint LastLoginVersion;
|
||||
public PetInfo Pet = new PetInfo();
|
||||
public uint PetCreatureDisplayId;
|
||||
public uint PetExperienceLevel;
|
||||
public uint PetCreatureFamilyId;
|
||||
public bool BoostInProgress; // @todo
|
||||
public uint[] ProfessionIds = new uint[2]; // @todo
|
||||
public VisualItemInfo[] VisualItems = new VisualItemInfo[InventorySlots.BagEnd];
|
||||
@@ -266,12 +269,14 @@ namespace Game.Network.Packets
|
||||
{
|
||||
data.WriteUInt32(DisplayId);
|
||||
data.WriteUInt32(DisplayEnchantId);
|
||||
data.WriteUInt8(InventoryType);
|
||||
data.WriteUInt8(InvType);
|
||||
data.WriteUInt8(Subclass);
|
||||
}
|
||||
|
||||
public uint DisplayId;
|
||||
public uint DisplayEnchantId;
|
||||
public byte InventoryType;
|
||||
public byte InvType;
|
||||
public byte Subclass;
|
||||
}
|
||||
|
||||
public struct PetInfo
|
||||
|
||||
@@ -559,7 +559,6 @@ namespace Game.Network.Packets
|
||||
RankID = _worldPacket.ReadInt32();
|
||||
RankOrder = _worldPacket.ReadInt32();
|
||||
Flags = _worldPacket.ReadUInt32();
|
||||
OldFlags = _worldPacket.ReadUInt32();
|
||||
WithdrawGoldLimit = _worldPacket.ReadUInt32();
|
||||
|
||||
for (byte i = 0; i < GuildConst.MaxBankTabs; i++)
|
||||
@@ -572,6 +571,8 @@ namespace Game.Network.Packets
|
||||
uint rankNameLen = _worldPacket.ReadBits<uint>(7);
|
||||
|
||||
RankName = _worldPacket.ReadString(rankNameLen);
|
||||
|
||||
OldFlags = _worldPacket.ReadUInt32();
|
||||
}
|
||||
|
||||
public int RankID;
|
||||
@@ -1445,7 +1446,7 @@ namespace Game.Network.Packets
|
||||
{
|
||||
public void Write(WorldPacket data)
|
||||
{
|
||||
data.WriteUInt32(RankID);
|
||||
data.WriteUInt8(RankID);
|
||||
data.WriteUInt32(RankOrder);
|
||||
data.WriteUInt32(Flags);
|
||||
data.WriteUInt32(WithdrawGoldLimit);
|
||||
@@ -1460,7 +1461,7 @@ namespace Game.Network.Packets
|
||||
data.WriteString(RankName);
|
||||
}
|
||||
|
||||
public uint RankID;
|
||||
public byte RankID;
|
||||
public uint RankOrder;
|
||||
public uint Flags;
|
||||
public uint WithdrawGoldLimit;
|
||||
|
||||
@@ -179,6 +179,7 @@ namespace Game.Network.Packets
|
||||
_worldPacket.WriteInt32(Slots.Count);
|
||||
_worldPacket.WriteUInt32(RequestedRoles);
|
||||
_worldPacket.WriteInt32(SuspendedPlayers.Count);
|
||||
_worldPacket.WriteUInt32(QueueMapID);
|
||||
|
||||
foreach (var slot in Slots)
|
||||
_worldPacket.WriteUInt32(slot);
|
||||
@@ -201,6 +202,7 @@ namespace Game.Network.Packets
|
||||
public List<uint> Slots = new List<uint>();
|
||||
public uint RequestedRoles;
|
||||
public List<ObjectGuid> SuspendedPlayers = new List<ObjectGuid>();
|
||||
public uint QueueMapID;
|
||||
public bool NotifyUI;
|
||||
public bool IsParty;
|
||||
public bool Joined;
|
||||
|
||||
@@ -731,7 +731,6 @@ namespace Game.Network.Packets
|
||||
|
||||
public struct DBQueryRecord
|
||||
{
|
||||
public ObjectGuid GUID;
|
||||
public uint RecordID;
|
||||
}
|
||||
|
||||
|
||||
@@ -202,6 +202,7 @@ namespace Game.Network.Packets
|
||||
_worldPacket.WriteInt32(Info.TreasurePickerID);
|
||||
_worldPacket.WriteInt32(Info.Expansion);
|
||||
_worldPacket.WriteInt32(Info.ManagedWorldStateID);
|
||||
_worldPacket.WriteInt32(Info.QuestSessionBonus);
|
||||
|
||||
_worldPacket.WriteBits(Info.LogTitle.GetByteCount(), 9);
|
||||
_worldPacket.WriteBits(Info.LogDescription.GetByteCount(), 12);
|
||||
@@ -428,6 +429,7 @@ namespace Game.Network.Packets
|
||||
_worldPacket.WriteInt32(DescEmotes.Count);
|
||||
_worldPacket.WriteInt32(Objectives.Count);
|
||||
_worldPacket.WriteInt32(QuestStartItemID);
|
||||
_worldPacket.WriteInt32(QuestSessionBonus);
|
||||
|
||||
foreach (uint spell in LearnSpells)
|
||||
_worldPacket.WriteUInt32(spell);
|
||||
@@ -454,6 +456,7 @@ namespace Game.Network.Packets
|
||||
_worldPacket.WriteBits(PortraitTurnInText.GetByteCount(), 10);
|
||||
_worldPacket.WriteBits(PortraitTurnInName.GetByteCount(), 8);
|
||||
_worldPacket.WriteBit(AutoLaunched);
|
||||
_worldPacket.WriteBit(false); // unused in client
|
||||
_worldPacket.WriteBit(StartCheat);
|
||||
_worldPacket.WriteBit(DisplayPopup);
|
||||
_worldPacket.FlushBits();
|
||||
@@ -483,6 +486,7 @@ namespace Game.Network.Packets
|
||||
public uint PortraitGiver;
|
||||
public uint PortraitGiverMount;
|
||||
public int QuestStartItemID;
|
||||
public int QuestSessionBonus;
|
||||
public string PortraitGiverText = "";
|
||||
public string PortraitGiverName = "";
|
||||
public string PortraitTurnInText = "";
|
||||
@@ -969,6 +973,7 @@ namespace Game.Network.Packets
|
||||
public int TreasurePickerID;
|
||||
public int Expansion;
|
||||
public int ManagedWorldStateID;
|
||||
public int QuestSessionBonus;
|
||||
public List<QuestObjective> Objectives = new List<QuestObjective>();
|
||||
public uint[] RewardItems = new uint[SharedConst.QuestRewardItemCount];
|
||||
public uint[] RewardAmount = new uint[SharedConst.QuestRewardItemCount];
|
||||
|
||||
@@ -45,7 +45,7 @@ namespace Game.Network.Packets
|
||||
public ObjectGuid Target;
|
||||
}
|
||||
|
||||
public class ProposeLevelGrant : ServerPacket
|
||||
/*public class ProposeLevelGrant : ServerPacket
|
||||
{
|
||||
public ProposeLevelGrant() : base(ServerOpcodes.ProposeLevelGrant) { }
|
||||
|
||||
@@ -55,7 +55,7 @@ namespace Game.Network.Packets
|
||||
}
|
||||
|
||||
public ObjectGuid Sender;
|
||||
}
|
||||
}*/
|
||||
|
||||
public class ReferAFriendFailure : ServerPacket
|
||||
{
|
||||
|
||||
@@ -41,11 +41,15 @@ namespace Game.Network.Packets
|
||||
_worldPacket.WriteUInt32(CfgRealmID);
|
||||
_worldPacket.WriteInt32(CfgRealmRecID);
|
||||
|
||||
_worldPacket.WriteUInt32(RAFSystem.MaxRecruits);
|
||||
_worldPacket.WriteUInt32(RAFSystem.MaxRecruitMonths);
|
||||
_worldPacket.WriteUInt32(RAFSystem.MaxRecruitmentUses);
|
||||
_worldPacket.WriteUInt32(RAFSystem.DaysInCycle);
|
||||
|
||||
_worldPacket.WriteUInt32(TwitterPostThrottleLimit);
|
||||
_worldPacket.WriteUInt32(TwitterPostThrottleCooldown);
|
||||
|
||||
_worldPacket.WriteUInt32(TokenPollTimeSeconds);
|
||||
_worldPacket.WriteUInt32(TokenRedeemIndex);
|
||||
_worldPacket.WriteInt64(TokenBalanceAmount);
|
||||
|
||||
_worldPacket.WriteUInt32(BpayStoreProductDeliveryDelay);
|
||||
@@ -61,7 +65,8 @@ namespace Game.Network.Packets
|
||||
_worldPacket.WriteBit(ItemRestorationButtonEnabled);
|
||||
_worldPacket.WriteBit(BrowserEnabled);
|
||||
_worldPacket.WriteBit(SessionAlert.HasValue);
|
||||
_worldPacket.WriteBit(RecruitAFriendSendingEnabled);
|
||||
_worldPacket.WriteBit(RAFSystem.Enabled);
|
||||
_worldPacket.WriteBit(RAFSystem.RecruitingEnabled);
|
||||
_worldPacket.WriteBit(CharUndeleteEnabled);
|
||||
_worldPacket.WriteBit(RestrictedAccount);
|
||||
_worldPacket.WriteBit(CommerceSystemEnabled);
|
||||
@@ -81,6 +86,9 @@ namespace Game.Network.Packets
|
||||
_worldPacket.WriteBit(ClubsPresenceUpdateEnabled);
|
||||
_worldPacket.WriteBit(VoiceChatDisabledByParentalControl);
|
||||
_worldPacket.WriteBit(VoiceChatMutedByParentalControl);
|
||||
_worldPacket.WriteBit(QuestSessionEnabled);
|
||||
_worldPacket.WriteBit(Unused825);
|
||||
_worldPacket.WriteBit(ClubFinderEnabled);
|
||||
_worldPacket.FlushBits();
|
||||
|
||||
{
|
||||
@@ -144,7 +152,6 @@ namespace Game.Network.Packets
|
||||
public bool VoiceEnabled;
|
||||
public bool BrowserEnabled;
|
||||
public bool BpayStoreAvailable;
|
||||
public bool RecruitAFriendSendingEnabled;
|
||||
public bool BpayStoreEnabled;
|
||||
public Optional<SessionAlertConfig> SessionAlert;
|
||||
public uint ScrollOfResurrectionMaxRequestsPerDay;
|
||||
@@ -157,7 +164,6 @@ namespace Game.Network.Packets
|
||||
public uint TwitterPostThrottleLimit;
|
||||
public uint TwitterPostThrottleCooldown;
|
||||
public uint TokenPollTimeSeconds;
|
||||
public uint TokenRedeemIndex;
|
||||
public long TokenBalanceAmount;
|
||||
public uint BpayStoreProductDeliveryDelay;
|
||||
public uint ClubsPresenceUpdateTimer;
|
||||
@@ -182,10 +188,14 @@ namespace Game.Network.Packets
|
||||
public bool ClubsPresenceUpdateEnabled;
|
||||
public bool VoiceChatDisabledByParentalControl;
|
||||
public bool VoiceChatMutedByParentalControl;
|
||||
public bool QuestSessionEnabled;
|
||||
public bool Unused825;
|
||||
public bool ClubFinderEnabled;
|
||||
|
||||
public Optional<List<byte>> RaceClassExpansionLevels;
|
||||
public SocialQueueConfig QuickJoinConfig;
|
||||
public VoiceChatProxySettings VoiceChatManagerSettings;
|
||||
public RafSystemFeatureInfo RAFSystem;
|
||||
|
||||
public struct SavedThrottleObjectState
|
||||
{
|
||||
@@ -245,6 +255,16 @@ namespace Game.Network.Packets
|
||||
public ObjectGuid BnetAccountGuid;
|
||||
public ObjectGuid GuildGuid;
|
||||
}
|
||||
|
||||
public struct RafSystemFeatureInfo
|
||||
{
|
||||
public bool Enabled;
|
||||
public bool RecruitingEnabled;
|
||||
public uint MaxRecruits;
|
||||
public uint MaxRecruitMonths;
|
||||
public uint MaxRecruitmentUses;
|
||||
public uint DaysInCycle;
|
||||
}
|
||||
}
|
||||
|
||||
public class FeatureSystemStatusGlueScreen : ServerPacket
|
||||
@@ -263,7 +283,6 @@ namespace Game.Network.Packets
|
||||
_worldPacket.WriteBit(IsExpansionPreorderInStore);
|
||||
_worldPacket.WriteBit(KioskModeEnabled);
|
||||
_worldPacket.WriteBit(CompetitiveModeEnabled);
|
||||
_worldPacket.WriteBit(false); // not accessed in handler
|
||||
_worldPacket.WriteBit(TrialBoostEnabled);
|
||||
_worldPacket.WriteBit(TokenBalanceEnabled);
|
||||
_worldPacket.WriteBit(LiveRegionCharacterListEnabled);
|
||||
@@ -271,8 +290,7 @@ namespace Game.Network.Packets
|
||||
_worldPacket.WriteBit(LiveRegionAccountCopyEnabled);
|
||||
_worldPacket.FlushBits();
|
||||
|
||||
_worldPacket.WriteInt32(TokenPollTimeSeconds);
|
||||
_worldPacket.WriteInt32(TokenRedeemIndex);
|
||||
_worldPacket.WriteUInt32(TokenPollTimeSeconds);
|
||||
_worldPacket.WriteInt64(TokenBalanceAmount);
|
||||
_worldPacket.WriteInt32(MaxCharactersPerRealm);
|
||||
_worldPacket.WriteUInt32(BpayStoreProductDeliveryDelay);
|
||||
@@ -297,8 +315,7 @@ namespace Game.Network.Packets
|
||||
public bool LiveRegionCharacterListEnabled; // NYI
|
||||
public bool LiveRegionCharacterCopyEnabled; // NYI
|
||||
public bool LiveRegionAccountCopyEnabled; // NYI
|
||||
public int TokenPollTimeSeconds; // NYI
|
||||
public int TokenRedeemIndex; // NYI
|
||||
public uint TokenPollTimeSeconds; // NYI
|
||||
public long TokenBalanceAmount; // NYI
|
||||
public int MaxCharactersPerRealm;
|
||||
public uint BpayStoreProductDeliveryDelay; // NYI
|
||||
|
||||
@@ -149,6 +149,7 @@ namespace Game.Network.Packets
|
||||
bool hasLFGListSearchResult = _worldPacket.HasBit();
|
||||
bool hasLFGListApplicant = _worldPacket.HasBit();
|
||||
bool hasClubMessage = _worldPacket.HasBit();
|
||||
bool hasClubFinderResult = _worldPacket.HasBit();
|
||||
|
||||
_worldPacket.ResetBitPos();
|
||||
|
||||
@@ -159,14 +160,16 @@ namespace Game.Network.Packets
|
||||
_worldPacket.ResetBitPos();
|
||||
}
|
||||
|
||||
HorusChatLog.Read(_worldPacket);
|
||||
|
||||
Note = _worldPacket.ReadString(noteLength);
|
||||
|
||||
if (hasMailInfo)
|
||||
{
|
||||
MailInfo.HasValue = true;
|
||||
MailInfo.Value.Read(_worldPacket);
|
||||
}
|
||||
|
||||
Note = _worldPacket.ReadString(noteLength);
|
||||
|
||||
if (hasCalendarInfo)
|
||||
{
|
||||
CalenderInfo.HasValue = true;
|
||||
@@ -196,6 +199,12 @@ namespace Game.Network.Packets
|
||||
LFGListApplicant.HasValue = true;
|
||||
LFGListApplicant.Value.Read(_worldPacket);
|
||||
}
|
||||
|
||||
if (hasClubFinderResult)
|
||||
{
|
||||
ClubFinderResult.HasValue = true;
|
||||
ClubFinderResult.Value.Read(_worldPacket);
|
||||
}
|
||||
}
|
||||
|
||||
public SupportTicketHeader Header;
|
||||
@@ -203,6 +212,7 @@ namespace Game.Network.Packets
|
||||
public ObjectGuid TargetCharacterGUID;
|
||||
public byte ComplaintType;
|
||||
public string Note;
|
||||
public SupportTicketHorusChatLog HorusChatLog;
|
||||
public Optional<SupportTicketMailInfo> MailInfo;
|
||||
public Optional<SupportTicketCalendarEventInfo> CalenderInfo;
|
||||
public Optional<SupportTicketPetInfo> PetInfo;
|
||||
@@ -210,6 +220,7 @@ namespace Game.Network.Packets
|
||||
public Optional<SupportTicketLFGListSearchResult> LFGListSearchResult;
|
||||
public Optional<SupportTicketLFGListApplicant> LFGListApplicant;
|
||||
public Optional<SupportTicketCommunityMessage> CommunityMessage;
|
||||
public Optional<SupportTicketClubFinderResult> ClubFinderResult;
|
||||
|
||||
public struct SupportTicketChatLine
|
||||
{
|
||||
@@ -254,6 +265,82 @@ namespace Game.Network.Packets
|
||||
public Optional<uint> ReportLineIndex;
|
||||
}
|
||||
|
||||
public struct SupportTicketHorusChatLine
|
||||
{
|
||||
public void Read(WorldPacket data)
|
||||
{
|
||||
Timestamp = data.ReadInt32();
|
||||
AuthorGUID = data.ReadPackedGuid();
|
||||
|
||||
bool hasClubID = data.HasBit();
|
||||
bool hasChannelGUID = data.HasBit();
|
||||
bool hasRealmAddress = data.HasBit();
|
||||
bool hasSlashCmd = data.HasBit();
|
||||
uint textLength = data.ReadBits<uint>(12);
|
||||
|
||||
if (hasClubID)
|
||||
{
|
||||
ClubID.HasValue = true;
|
||||
ClubID.Value = data.ReadUInt64();
|
||||
}
|
||||
|
||||
if (hasChannelGUID)
|
||||
{
|
||||
ChannelGUID.HasValue = true;
|
||||
ChannelGUID.Value = data.ReadPackedGuid();
|
||||
}
|
||||
|
||||
if (hasRealmAddress)
|
||||
{
|
||||
RealmAddress.HasValue = true;
|
||||
RealmAddress.Value.VirtualRealmAddress = data.ReadUInt32();
|
||||
RealmAddress.Value.field_4 = data.ReadUInt16();
|
||||
RealmAddress.Value.field_6 = data.ReadUInt8();
|
||||
}
|
||||
|
||||
if (hasSlashCmd)
|
||||
{
|
||||
SlashCmd.HasValue = true;
|
||||
SlashCmd.Value = data.ReadInt32();
|
||||
}
|
||||
|
||||
Text = data.ReadString(textLength);
|
||||
}
|
||||
|
||||
public struct SenderRealm
|
||||
{
|
||||
public uint VirtualRealmAddress;
|
||||
public ushort field_4;
|
||||
public byte field_6;
|
||||
}
|
||||
|
||||
public int Timestamp;
|
||||
public ObjectGuid AuthorGUID;
|
||||
public Optional<ulong> ClubID;
|
||||
public Optional<ObjectGuid> ChannelGUID;
|
||||
public Optional<SenderRealm> RealmAddress;
|
||||
public Optional<int> SlashCmd;
|
||||
public string Text;
|
||||
}
|
||||
|
||||
public class SupportTicketHorusChatLog
|
||||
{
|
||||
public List<SupportTicketHorusChatLine> Lines = new List<SupportTicketHorusChatLine>();
|
||||
|
||||
public void Read(WorldPacket data)
|
||||
{
|
||||
uint linesCount = data.ReadUInt32();
|
||||
data.ResetBitPos();
|
||||
|
||||
for (uint i = 0; i < linesCount; i++)
|
||||
{
|
||||
var chatLine = new SupportTicketHorusChatLine();
|
||||
chatLine.Read(data);
|
||||
Lines.Add(chatLine);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public struct SupportTicketMailInfo
|
||||
{
|
||||
public void Read(WorldPacket data)
|
||||
@@ -266,9 +353,9 @@ namespace Game.Network.Packets
|
||||
MailSubject = data.ReadString(subjectLength);
|
||||
}
|
||||
|
||||
int MailID;
|
||||
string MailSubject;
|
||||
string MailBody;
|
||||
public int MailID;
|
||||
public string MailSubject;
|
||||
public string MailBody;
|
||||
}
|
||||
|
||||
public struct SupportTicketCalendarEventInfo
|
||||
@@ -281,9 +368,9 @@ namespace Game.Network.Packets
|
||||
EventTitle = data.ReadString(data.ReadBits<byte>(8));
|
||||
}
|
||||
|
||||
ulong EventID;
|
||||
ulong InviteID;
|
||||
string EventTitle;
|
||||
public ulong EventID;
|
||||
public ulong InviteID;
|
||||
public string EventTitle;
|
||||
}
|
||||
|
||||
public struct SupportTicketPetInfo
|
||||
@@ -295,8 +382,8 @@ namespace Game.Network.Packets
|
||||
PetName = data.ReadString(data.ReadBits<byte>(8));
|
||||
}
|
||||
|
||||
ObjectGuid PetID;
|
||||
string PetName;
|
||||
public ObjectGuid PetID;
|
||||
public string PetName;
|
||||
}
|
||||
|
||||
public struct SupportTicketGuildInfo
|
||||
@@ -309,8 +396,8 @@ namespace Game.Network.Packets
|
||||
GuildName = data.ReadString(nameLength);
|
||||
}
|
||||
|
||||
ObjectGuid GuildID;
|
||||
string GuildName;
|
||||
public ObjectGuid GuildID;
|
||||
public string GuildName;
|
||||
}
|
||||
|
||||
public struct SupportTicketLFGListSearchResult
|
||||
@@ -336,16 +423,16 @@ namespace Game.Network.Packets
|
||||
VoiceChat = data.ReadString(voiceChatLength);
|
||||
}
|
||||
|
||||
RideTicket RideTicket;
|
||||
uint GroupFinderActivityID;
|
||||
ObjectGuid LastTitleAuthorGuid;
|
||||
ObjectGuid LastDescriptionAuthorGuid;
|
||||
ObjectGuid LastVoiceChatAuthorGuid;
|
||||
ObjectGuid ListingCreatorGuid;
|
||||
ObjectGuid Unknown735;
|
||||
string Title;
|
||||
string Description;
|
||||
string VoiceChat;
|
||||
public RideTicket RideTicket;
|
||||
public uint GroupFinderActivityID;
|
||||
public ObjectGuid LastTitleAuthorGuid;
|
||||
public ObjectGuid LastDescriptionAuthorGuid;
|
||||
public ObjectGuid LastVoiceChatAuthorGuid;
|
||||
public ObjectGuid ListingCreatorGuid;
|
||||
public ObjectGuid Unknown735;
|
||||
public string Title;
|
||||
public string Description;
|
||||
public string VoiceChat;
|
||||
}
|
||||
|
||||
public struct SupportTicketLFGListApplicant
|
||||
@@ -358,14 +445,30 @@ namespace Game.Network.Packets
|
||||
Comment = data.ReadString(data.ReadBits<uint>(9));
|
||||
}
|
||||
|
||||
RideTicket RideTicket;
|
||||
string Comment;
|
||||
public RideTicket RideTicket;
|
||||
public string Comment;
|
||||
}
|
||||
|
||||
public struct SupportTicketCommunityMessage
|
||||
{
|
||||
public bool IsPlayerUsingVoice;
|
||||
}
|
||||
|
||||
public struct SupportTicketClubFinderResult
|
||||
{
|
||||
public ulong ClubFinderPostingID;
|
||||
public ulong ClubID;
|
||||
public ObjectGuid ClubFinderGUID;
|
||||
public string ClubName;
|
||||
|
||||
public void Read(WorldPacket data)
|
||||
{
|
||||
ClubFinderPostingID = data.ReadUInt64();
|
||||
ClubID = data.ReadUInt64();
|
||||
ClubFinderGUID = data.ReadPackedGuid();
|
||||
ClubName = data.ReadString(data.ReadBits<uint>(12));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class Complaint : ClientPacket
|
||||
|
||||
@@ -54,14 +54,19 @@ namespace Game.Network.Packets
|
||||
_worldPacket.WriteBit(IsFullUpdate);
|
||||
_worldPacket.WriteBit(IsSetFavorite);
|
||||
_worldPacket.WriteInt32(FavoriteAppearances.Count);
|
||||
_worldPacket.WriteInt32(NewAppearances.Count);
|
||||
|
||||
foreach (uint itemModifiedAppearanceId in FavoriteAppearances)
|
||||
_worldPacket.WriteUInt32(itemModifiedAppearanceId);
|
||||
|
||||
foreach (var newAppearance in NewAppearances)
|
||||
_worldPacket.WriteUInt32(newAppearance);
|
||||
}
|
||||
|
||||
public bool IsFullUpdate;
|
||||
public bool IsSetFavorite;
|
||||
public List<uint> FavoriteAppearances = new List<uint>();
|
||||
public List<uint> NewAppearances = new List<uint>();
|
||||
}
|
||||
|
||||
class OpenTransmogrifier : ServerPacket
|
||||
|
||||
@@ -37,7 +37,7 @@ namespace Game.Network
|
||||
static byte[] ContinuedSessionSeed = { 0x16, 0xAD, 0x0C, 0xD4, 0x46, 0xF9, 0x4F, 0xB2, 0xEF, 0x7D, 0xEA, 0x2A, 0x17, 0x66, 0x4D, 0x2F };
|
||||
static byte[] EncryptionKeySeed = { 0xE9, 0x75, 0x3C, 0x50, 0x90, 0x93, 0x61, 0xDA, 0x3B, 0x07, 0xEE, 0xFA, 0xFF, 0x9D, 0x41, 0xB8 };
|
||||
|
||||
static byte[] ClientTypeSeed_Wn64 = { 0x79, 0x73, 0xA8, 0xD5, 0x4B, 0xDB, 0x8B, 0x79, 0x8D, 0x92, 0x97, 0xB0, 0x96, 0xE7, 0x71, 0xEF };
|
||||
static byte[] ClientTypeSeed_Wn64 = { 0x21, 0xF5, 0xA6, 0xFC, 0x7A, 0xD8, 0x9F, 0xBF, 0x41, 0x1F, 0xDA, 0x8B, 0x87, 0x38, 0x18, 0x6A };
|
||||
static byte[] ClientTypeSeed_Mc64 = { 0x34, 0x1C, 0xFE, 0xFE, 0x3D, 0x72, 0xAC, 0xA9, 0xA4, 0x40, 0x7D, 0xC5, 0x35, 0xDE, 0xD6, 0x6A };
|
||||
|
||||
public WorldSocket(Socket socket) : base(socket)
|
||||
|
||||
+14
-10
@@ -125,16 +125,17 @@ namespace Game
|
||||
TreasurePickerID = fields.Read<int>(109);
|
||||
Expansion = fields.Read<int>(110);
|
||||
ManagedWorldStateID = fields.Read<int>(111);
|
||||
QuestSessionBonus = fields.Read<int>(112);
|
||||
|
||||
LogTitle = fields.Read<string>(112);
|
||||
LogDescription = fields.Read<string>(113);
|
||||
QuestDescription = fields.Read<string>(114);
|
||||
AreaDescription = fields.Read<string>(115);
|
||||
PortraitGiverText = fields.Read<string>(116);
|
||||
PortraitGiverName = fields.Read<string>(117);
|
||||
PortraitTurnInText = fields.Read<string>(118);
|
||||
PortraitTurnInName = fields.Read<string>(119);
|
||||
QuestCompletionLog = fields.Read<string>(120);
|
||||
LogTitle = fields.Read<string>(113);
|
||||
LogDescription = fields.Read<string>(114);
|
||||
QuestDescription = fields.Read<string>(115);
|
||||
AreaDescription = fields.Read<string>(116);
|
||||
PortraitGiverText = fields.Read<string>(117);
|
||||
PortraitGiverName = fields.Read<string>(118);
|
||||
PortraitTurnInText = fields.Read<string>(119);
|
||||
PortraitTurnInName = fields.Read<string>(120);
|
||||
QuestCompletionLog = fields.Read<string>(121);
|
||||
}
|
||||
|
||||
public void LoadQuestDetails(SQLFields fields)
|
||||
@@ -498,8 +499,10 @@ namespace Game
|
||||
QueryData.Info.POIPriority = POIPriority;
|
||||
|
||||
QueryData.Info.AllowableRaces = AllowableRaces;
|
||||
QueryData.Info.TreasurePickerID = (int)TreasurePickerID;
|
||||
QueryData.Info.TreasurePickerID = TreasurePickerID;
|
||||
QueryData.Info.Expansion = Expansion;
|
||||
QueryData.Info.ManagedWorldStateID = ManagedWorldStateID;
|
||||
QueryData.Info.QuestSessionBonus = 0; //GetQuestSessionBonus(); // this is only sent while quest session is active
|
||||
|
||||
foreach (QuestObjective questObjective in Objectives)
|
||||
QueryData.Info.Objectives.Add(questObjective);
|
||||
@@ -606,6 +609,7 @@ namespace Game
|
||||
public int TreasurePickerID;
|
||||
public int Expansion;
|
||||
public int ManagedWorldStateID;
|
||||
public int QuestSessionBonus;
|
||||
public List<QuestObjective> Objectives = new List<QuestObjective>();
|
||||
public string LogTitle = "";
|
||||
public string LogDescription = "";
|
||||
|
||||
@@ -0,0 +1,25 @@
|
||||
UPDATE `characters` SET `equipmentCache`=CONCAT(
|
||||
CONCAT(SUBSTRING_INDEX(SUBSTRING_INDEX(`equipmentCache`, ' ', -70), ' ', 2), ' 0 0 '),
|
||||
CONCAT(SUBSTRING_INDEX(SUBSTRING_INDEX(`equipmentCache`, ' ', -67), ' ', 2), ' 0 0 '),
|
||||
CONCAT(SUBSTRING_INDEX(SUBSTRING_INDEX(`equipmentCache`, ' ', -64), ' ', 2), ' 0 0 '),
|
||||
CONCAT(SUBSTRING_INDEX(SUBSTRING_INDEX(`equipmentCache`, ' ', -61), ' ', 2), ' 0 0 '),
|
||||
CONCAT(SUBSTRING_INDEX(SUBSTRING_INDEX(`equipmentCache`, ' ', -58), ' ', 2), ' 0 0 '),
|
||||
CONCAT(SUBSTRING_INDEX(SUBSTRING_INDEX(`equipmentCache`, ' ', -55), ' ', 2), ' 0 0 '),
|
||||
CONCAT(SUBSTRING_INDEX(SUBSTRING_INDEX(`equipmentCache`, ' ', -52), ' ', 2), ' 0 0 '),
|
||||
CONCAT(SUBSTRING_INDEX(SUBSTRING_INDEX(`equipmentCache`, ' ', -49), ' ', 2), ' 0 0 '),
|
||||
CONCAT(SUBSTRING_INDEX(SUBSTRING_INDEX(`equipmentCache`, ' ', -46), ' ', 2), ' 0 0 '),
|
||||
CONCAT(SUBSTRING_INDEX(SUBSTRING_INDEX(`equipmentCache`, ' ', -43), ' ', 2), ' 0 0 '),
|
||||
CONCAT(SUBSTRING_INDEX(SUBSTRING_INDEX(`equipmentCache`, ' ', -40), ' ', 2), ' 0 0 '),
|
||||
CONCAT(SUBSTRING_INDEX(SUBSTRING_INDEX(`equipmentCache`, ' ', -37), ' ', 2), ' 0 0 '),
|
||||
CONCAT(SUBSTRING_INDEX(SUBSTRING_INDEX(`equipmentCache`, ' ', -34), ' ', 2), ' 0 0 '),
|
||||
CONCAT(SUBSTRING_INDEX(SUBSTRING_INDEX(`equipmentCache`, ' ', -31), ' ', 2), ' 0 0 '),
|
||||
CONCAT(SUBSTRING_INDEX(SUBSTRING_INDEX(`equipmentCache`, ' ', -28), ' ', 2), ' 0 0 '),
|
||||
CONCAT(SUBSTRING_INDEX(SUBSTRING_INDEX(`equipmentCache`, ' ', -25), ' ', 2), ' 0 0 '),
|
||||
CONCAT(SUBSTRING_INDEX(SUBSTRING_INDEX(`equipmentCache`, ' ', -22), ' ', 2), ' 0 0 '),
|
||||
CONCAT(SUBSTRING_INDEX(SUBSTRING_INDEX(`equipmentCache`, ' ', -19), ' ', 2), ' 0 0 '),
|
||||
CONCAT(SUBSTRING_INDEX(SUBSTRING_INDEX(`equipmentCache`, ' ', -16), ' ', 2), ' 0 0 '),
|
||||
CONCAT(SUBSTRING_INDEX(SUBSTRING_INDEX(`equipmentCache`, ' ', -13), ' ', 2), ' 0 0 '),
|
||||
CONCAT(SUBSTRING_INDEX(SUBSTRING_INDEX(`equipmentCache`, ' ', -10), ' ', 2), ' 0 0 '),
|
||||
CONCAT(SUBSTRING_INDEX(SUBSTRING_INDEX(`equipmentCache`, ' ', -7), ' ', 2), ' 0 0 '),
|
||||
CONCAT(SUBSTRING_INDEX(SUBSTRING_INDEX(`equipmentCache`, ' ', -4), ' ', 2), ' 0 0 ')
|
||||
) WHERE LENGTH(`equipmentCache`) > 0;
|
||||
@@ -0,0 +1 @@
|
||||
ALTER TABLE `quest_template` ADD `QuestSessionBonus` int(11) NOT NULL DEFAULT '0' AFTER `ManagedWorldStateID`;
|
||||
Reference in New Issue
Block a user