Core/PacketIO: Fill new packet fields with data
Port From (https://github.com/TrinityCore/TrinityCore/commit/83eecaf2c40cc72c1dc42335766534eb8d227e60)
This commit is contained in:
@@ -1808,6 +1808,7 @@ namespace Game
|
|||||||
{
|
{
|
||||||
bucketInfo.Key = new AuctionBucketKey(Key);
|
bucketInfo.Key = new AuctionBucketKey(Key);
|
||||||
bucketInfo.MinPrice = MinPrice;
|
bucketInfo.MinPrice = MinPrice;
|
||||||
|
bucketInfo.RequiredLevel = RequiredLevel;
|
||||||
bucketInfo.TotalQuantity = 0;
|
bucketInfo.TotalQuantity = 0;
|
||||||
|
|
||||||
foreach (AuctionPosting auction in Auctions)
|
foreach (AuctionPosting auction in Auctions)
|
||||||
|
|||||||
@@ -238,7 +238,7 @@ namespace Game.Chat
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
player.RewardQuest(quest, 0, player);
|
player.RewardQuest(quest, LootItemType.Item, 0, player);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1353,7 +1353,7 @@ namespace Game.DungeonFinding
|
|||||||
|
|
||||||
// if we can take the quest, means that we haven't done this kind of "run", IE: First Heroic Random of Day.
|
// if we can take the quest, means that we haven't done this kind of "run", IE: First Heroic Random of Day.
|
||||||
if (player.CanRewardQuest(quest, false))
|
if (player.CanRewardQuest(quest, false))
|
||||||
player.RewardQuest(quest, 0, null, false);
|
player.RewardQuest(quest, LootItemType.Item, 0, null, false);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
done = true;
|
done = true;
|
||||||
@@ -1361,7 +1361,7 @@ namespace Game.DungeonFinding
|
|||||||
if (quest == null)
|
if (quest == null)
|
||||||
continue;
|
continue;
|
||||||
// we give reward without informing client (retail does this)
|
// we give reward without informing client (retail does this)
|
||||||
player.RewardQuest(quest, 0, null, false);
|
player.RewardQuest(quest, LootItemType.Item, 0, null, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Give rewards
|
// Give rewards
|
||||||
|
|||||||
@@ -262,6 +262,7 @@ namespace Game.Misc
|
|||||||
opt.OptionCost = (int)item.BoxMoney; // money required to open menu, 2.0.3
|
opt.OptionCost = (int)item.BoxMoney; // money required to open menu, 2.0.3
|
||||||
opt.Text = item.Message; // text for gossip item
|
opt.Text = item.Message; // text for gossip item
|
||||||
opt.Confirm = item.BoxMessage; // accept text (related to money) pop up box, 2.0.3
|
opt.Confirm = item.BoxMessage; // accept text (related to money) pop up box, 2.0.3
|
||||||
|
opt.Status = GossipOptionStatus.Available;
|
||||||
packet.GossipOptions.Add(opt);
|
packet.GossipOptions.Add(opt);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -569,6 +569,105 @@ namespace Game.Entities
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public bool CanRewardQuest(Quest quest, LootItemType rewardType, uint rewardId, bool msg)
|
||||||
|
{
|
||||||
|
// prevent receive reward with quest items in bank or for not completed quest
|
||||||
|
if (!CanRewardQuest(quest, msg))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
List<ItemPosCount> dest = new List<ItemPosCount>();
|
||||||
|
if (quest.GetRewChoiceItemsCount() > 0)
|
||||||
|
{
|
||||||
|
switch (rewardType)
|
||||||
|
{
|
||||||
|
case LootItemType.Item:
|
||||||
|
for (uint i = 0; i < SharedConst.QuestRewardChoicesCount; ++i)
|
||||||
|
{
|
||||||
|
if (quest.RewardChoiceItemId[i] != 0 && quest.RewardChoiceItemType[i] == LootItemType.Item && quest.RewardChoiceItemId[i] == rewardId)
|
||||||
|
{
|
||||||
|
InventoryResult res = CanStoreNewItem(ItemConst.NullBag, ItemConst.NullSlot, dest, quest.RewardChoiceItemId[i], quest.RewardChoiceItemCount[i]);
|
||||||
|
if (res != InventoryResult.Ok)
|
||||||
|
{
|
||||||
|
if (msg)
|
||||||
|
SendQuestFailed(quest.Id, res);
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case LootItemType.Currency:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (quest.GetRewItemsCount() > 0)
|
||||||
|
{
|
||||||
|
for (uint i = 0; i < quest.GetRewItemsCount(); ++i)
|
||||||
|
{
|
||||||
|
if (quest.RewardItemId[i] != 0)
|
||||||
|
{
|
||||||
|
InventoryResult res = CanStoreNewItem(ItemConst.NullBag, ItemConst.NullSlot, dest, quest.RewardItemId[i], quest.RewardItemCount[i]);
|
||||||
|
if (res != InventoryResult.Ok)
|
||||||
|
{
|
||||||
|
if (msg)
|
||||||
|
SendQuestFailed(quest.Id, res);
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// QuestPackageItem.db2
|
||||||
|
if (quest.PackageID != 0)
|
||||||
|
{
|
||||||
|
bool hasFilteredQuestPackageReward = false;
|
||||||
|
var questPackageItems = Global.DB2Mgr.GetQuestPackageItems(quest.PackageID);
|
||||||
|
if (questPackageItems != null)
|
||||||
|
{
|
||||||
|
foreach (var questPackageItem in questPackageItems)
|
||||||
|
{
|
||||||
|
if (questPackageItem.ItemID != rewardId)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (CanSelectQuestPackageItem(questPackageItem))
|
||||||
|
{
|
||||||
|
hasFilteredQuestPackageReward = true;
|
||||||
|
InventoryResult res = CanStoreNewItem(ItemConst.NullBag, ItemConst.NullSlot, dest, questPackageItem.ItemID, questPackageItem.ItemQuantity);
|
||||||
|
if (res != InventoryResult.Ok)
|
||||||
|
{
|
||||||
|
SendEquipError(res, null, null, questPackageItem.ItemID);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!hasFilteredQuestPackageReward)
|
||||||
|
{
|
||||||
|
List<QuestPackageItemRecord> questPackageItems1 = Global.DB2Mgr.GetQuestPackageItemsFallback(quest.PackageID);
|
||||||
|
if (questPackageItems1 != null)
|
||||||
|
{
|
||||||
|
foreach (QuestPackageItemRecord questPackageItem in questPackageItems1)
|
||||||
|
{
|
||||||
|
if (questPackageItem.ItemID != rewardId)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
InventoryResult res = CanStoreNewItem(ItemConst.NullBag, ItemConst.NullSlot, dest, questPackageItem.ItemID, questPackageItem.ItemQuantity);
|
||||||
|
if (res != InventoryResult.Ok)
|
||||||
|
{
|
||||||
|
SendEquipError(res, null, null, questPackageItem.ItemID);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
public void AddQuestAndCheckCompletion(Quest quest, WorldObject questGiver)
|
public void AddQuestAndCheckCompletion(Quest quest, WorldObject questGiver)
|
||||||
{
|
{
|
||||||
AddQuest(quest, questGiver);
|
AddQuest(quest, questGiver);
|
||||||
@@ -623,98 +722,6 @@ namespace Game.Entities
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool CanRewardQuest(Quest quest, uint reward, bool msg)
|
|
||||||
{
|
|
||||||
// prevent receive reward with quest items in bank or for not completed quest
|
|
||||||
if (!CanRewardQuest(quest, msg))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
List<ItemPosCount> dest = new List<ItemPosCount>();
|
|
||||||
if (quest.GetRewChoiceItemsCount() > 0)
|
|
||||||
{
|
|
||||||
for (uint i = 0; i < quest.GetRewChoiceItemsCount(); ++i)
|
|
||||||
{
|
|
||||||
if (quest.RewardChoiceItemId[i] != 0 && quest.RewardChoiceItemId[i] == reward)
|
|
||||||
{
|
|
||||||
InventoryResult res = CanStoreNewItem(ItemConst.NullBag, ItemConst.NullSlot, dest, quest.RewardChoiceItemId[i], quest.RewardChoiceItemCount[i]);
|
|
||||||
if (res != InventoryResult.Ok)
|
|
||||||
{
|
|
||||||
if (msg)
|
|
||||||
SendQuestFailed(quest.Id, res);
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (quest.GetRewItemsCount() > 0)
|
|
||||||
{
|
|
||||||
for (uint i = 0; i < quest.GetRewItemsCount(); ++i)
|
|
||||||
{
|
|
||||||
if (quest.RewardItemId[i] != 0)
|
|
||||||
{
|
|
||||||
InventoryResult res = CanStoreNewItem(ItemConst.NullBag, ItemConst.NullSlot, dest, quest.RewardItemId[i], quest.RewardItemCount[i]);
|
|
||||||
if (res != InventoryResult.Ok)
|
|
||||||
{
|
|
||||||
if (msg)
|
|
||||||
SendQuestFailed(quest.Id, res);
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// QuestPackageItem.db2
|
|
||||||
if (quest.PackageID != 0)
|
|
||||||
{
|
|
||||||
bool hasFilteredQuestPackageReward = false;
|
|
||||||
var questPackageItems = Global.DB2Mgr.GetQuestPackageItems(quest.PackageID);
|
|
||||||
if (questPackageItems != null)
|
|
||||||
{
|
|
||||||
foreach (var questPackageItem in questPackageItems)
|
|
||||||
{
|
|
||||||
if (questPackageItem.ItemID != reward)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if (CanSelectQuestPackageItem(questPackageItem))
|
|
||||||
{
|
|
||||||
hasFilteredQuestPackageReward = true;
|
|
||||||
InventoryResult res = CanStoreNewItem(ItemConst.NullBag, ItemConst.NullSlot, dest, questPackageItem.ItemID, questPackageItem.ItemQuantity);
|
|
||||||
if (res != InventoryResult.Ok)
|
|
||||||
{
|
|
||||||
SendEquipError(res, null, null, questPackageItem.ItemID);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!hasFilteredQuestPackageReward)
|
|
||||||
{
|
|
||||||
List<QuestPackageItemRecord> questPackageItems1 = Global.DB2Mgr.GetQuestPackageItemsFallback(quest.PackageID);
|
|
||||||
if (questPackageItems1 != null)
|
|
||||||
{
|
|
||||||
foreach (QuestPackageItemRecord questPackageItem in questPackageItems1)
|
|
||||||
{
|
|
||||||
if (questPackageItem.ItemID != reward)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
InventoryResult res = CanStoreNewItem(ItemConst.NullBag, ItemConst.NullSlot, dest, questPackageItem.ItemID, questPackageItem.ItemQuantity);
|
|
||||||
if (res != InventoryResult.Ok)
|
|
||||||
{
|
|
||||||
SendEquipError(res, null, null, questPackageItem.ItemID);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void AddQuest(Quest quest, WorldObject questGiver)
|
public void AddQuest(Quest quest, WorldObject questGiver)
|
||||||
{
|
{
|
||||||
ushort log_slot = FindQuestSlot(0);
|
ushort log_slot = FindQuestSlot(0);
|
||||||
@@ -823,7 +830,7 @@ namespace Game.Entities
|
|||||||
Quest qInfo = Global.ObjectMgr.GetQuestTemplate(quest_id);
|
Quest qInfo = Global.ObjectMgr.GetQuestTemplate(quest_id);
|
||||||
if (qInfo != null)
|
if (qInfo != null)
|
||||||
if (qInfo.HasFlag(QuestFlags.Tracking))
|
if (qInfo.HasFlag(QuestFlags.Tracking))
|
||||||
RewardQuest(qInfo, 0, this, false);
|
RewardQuest(qInfo, LootItemType.Item, 0, this, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -932,7 +939,7 @@ namespace Game.Entities
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void RewardQuest(Quest quest, uint reward, WorldObject questGiver, bool announce = true)
|
public void RewardQuest(Quest quest, LootItemType rewardType, uint rewardId, WorldObject questGiver, bool announce = true)
|
||||||
{
|
{
|
||||||
//this THING should be here to protect code from quest, which cast on player far teleport as a reward
|
//this THING should be here to protect code from quest, which cast on player far teleport as a reward
|
||||||
//should work fine, cause far teleport will be executed in Update()
|
//should work fine, cause far teleport will be executed in Update()
|
||||||
@@ -986,27 +993,41 @@ namespace Game.Entities
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ItemTemplate rewardProto = Global.ObjectMgr.GetItemTemplate(reward);
|
switch (rewardType)
|
||||||
if (rewardProto != null && quest.GetRewChoiceItemsCount() != 0)
|
|
||||||
{
|
{
|
||||||
for (uint i = 0; i < quest.GetRewChoiceItemsCount(); ++i)
|
case LootItemType.Item:
|
||||||
{
|
ItemTemplate rewardProto = Global.ObjectMgr.GetItemTemplate(rewardId);
|
||||||
if (quest.RewardChoiceItemId[i] != 0 && quest.RewardChoiceItemId[i] == reward)
|
if (rewardProto != null && quest.GetRewChoiceItemsCount() != 0)
|
||||||
{
|
{
|
||||||
List<ItemPosCount> dest = new List<ItemPosCount>();
|
for (uint i = 0; i < SharedConst.QuestRewardChoicesCount; ++i)
|
||||||
if (CanStoreNewItem(ItemConst.NullBag, ItemConst.NullSlot, dest, reward, quest.RewardChoiceItemCount[i]) == InventoryResult.Ok)
|
|
||||||
{
|
{
|
||||||
Item item = StoreNewItem(dest, reward, true, ItemEnchantmentManager.GenerateItemRandomBonusListId(reward));
|
if (quest.RewardChoiceItemId[i] != 0 && quest.RewardChoiceItemType[i] == LootItemType.Item && quest.RewardChoiceItemId[i] == rewardId)
|
||||||
SendNewItem(item, quest.RewardChoiceItemCount[i], true, false);
|
{
|
||||||
|
List<ItemPosCount> dest = new List<ItemPosCount>();
|
||||||
|
if (CanStoreNewItem(ItemConst.NullBag, ItemConst.NullSlot, dest, rewardId, quest.RewardChoiceItemCount[i]) == InventoryResult.Ok)
|
||||||
|
{
|
||||||
|
Item item = StoreNewItem(dest, rewardId, true, ItemEnchantmentManager.GenerateItemRandomBonusListId(rewardId));
|
||||||
|
SendNewItem(item, quest.RewardChoiceItemCount[i], true, false);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// QuestPackageItem.db2
|
|
||||||
if (rewardProto != null && quest.PackageID != 0)
|
// QuestPackageItem.db2
|
||||||
RewardQuestPackage(quest.PackageID, reward);
|
if (rewardProto != null && quest.PackageID != 0)
|
||||||
|
RewardQuestPackage(quest.PackageID, rewardId);
|
||||||
|
break;
|
||||||
|
case LootItemType.Currency:
|
||||||
|
if (CliDB.CurrencyTypesStorage.HasRecord(rewardId) && quest.GetRewChoiceItemsCount() != 0)
|
||||||
|
{
|
||||||
|
for (uint i = 0; i < SharedConst.QuestRewardChoicesCount; ++i)
|
||||||
|
if (quest.RewardChoiceItemId[i] != 0 && quest.RewardChoiceItemType[i] == LootItemType.Currency && quest.RewardChoiceItemId[i] == rewardId)
|
||||||
|
ModifyCurrency((CurrencyTypes)quest.RewardChoiceItemId[i], (int)quest.RewardChoiceItemCount[i]);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
for (byte i = 0; i < SharedConst.QuestRewardCurrencyCount; ++i)
|
for (byte i = 0; i < SharedConst.QuestRewardCurrencyCount; ++i)
|
||||||
{
|
{
|
||||||
@@ -1107,21 +1128,23 @@ namespace Game.Entities
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
for (uint i = 0; i < SharedConst.QuestRewardDisplaySpellCount; ++i)
|
foreach (QuestRewardDisplaySpell displaySpell in quest.RewardDisplaySpell)
|
||||||
{
|
{
|
||||||
if (quest.RewardDisplaySpell[i] > 0)
|
var playerCondition = CliDB.PlayerConditionStorage.LookupByKey(displaySpell.PlayerConditionId);
|
||||||
{
|
if (playerCondition != null)
|
||||||
SpellInfo spellInfo = Global.SpellMgr.GetSpellInfo(quest.RewardDisplaySpell[i], GetMap().GetDifficultyID());
|
if (!ConditionManager.IsPlayerMeetingCondition(this, playerCondition))
|
||||||
Unit caster = this;
|
continue;
|
||||||
if (questGiver != null && questGiver.IsTypeMask(TypeMask.Unit) && !quest.HasFlag(QuestFlags.PlayerCastOnComplete) && !spellInfo.HasTargetType(Targets.UnitCaster))
|
|
||||||
{
|
|
||||||
Unit unit = questGiver.ToUnit();
|
|
||||||
if (unit != null)
|
|
||||||
caster = unit;
|
|
||||||
}
|
|
||||||
|
|
||||||
caster.CastSpell(this, spellInfo, true);
|
SpellInfo spellInfo = Global.SpellMgr.GetSpellInfo(displaySpell.SpellId, GetMap().GetDifficultyID());
|
||||||
|
Unit caster = this;
|
||||||
|
if (questGiver && questGiver.IsTypeMask(TypeMask.Unit) && !quest.HasFlag(QuestFlags.PlayerCastOnComplete) && !spellInfo.HasTargetType(Targets.UnitCaster))
|
||||||
|
{
|
||||||
|
Unit unit = questGiver.ToUnit();
|
||||||
|
if (unit)
|
||||||
|
caster = unit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
caster.CastSpell(this, spellInfo, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -5034,12 +5034,14 @@ namespace Game.Entities
|
|||||||
var playerChoiceResponse = new Networking.Packets.PlayerChoiceResponse();
|
var playerChoiceResponse = new Networking.Packets.PlayerChoiceResponse();
|
||||||
|
|
||||||
playerChoiceResponse.ResponseID = playerChoiceResponseTemplate.ResponseId;
|
playerChoiceResponse.ResponseID = playerChoiceResponseTemplate.ResponseId;
|
||||||
|
playerChoiceResponse.ResponseIdentifier = playerChoiceResponseTemplate.ResponseIdentifier;
|
||||||
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.UiTextureAtlasElementID = playerChoiceResponseTemplate.UiTextureAtlasElementID;
|
||||||
playerChoiceResponse.SoundKitID = playerChoiceResponseTemplate.SoundKitID;
|
playerChoiceResponse.SoundKitID = playerChoiceResponseTemplate.SoundKitID;
|
||||||
playerChoiceResponse.GroupID = playerChoiceResponseTemplate.GroupID;
|
playerChoiceResponse.GroupID = playerChoiceResponseTemplate.GroupID;
|
||||||
|
playerChoiceResponse.UiTextureKitID = playerChoiceResponseTemplate.UiTextureKitID;
|
||||||
playerChoiceResponse.Answer = playerChoiceResponseTemplate.Answer;
|
playerChoiceResponse.Answer = playerChoiceResponseTemplate.Answer;
|
||||||
playerChoiceResponse.Header = playerChoiceResponseTemplate.Header;
|
playerChoiceResponse.Header = playerChoiceResponseTemplate.Header;
|
||||||
playerChoiceResponse.SubHeader = playerChoiceResponseTemplate.SubHeader;
|
playerChoiceResponse.SubHeader = playerChoiceResponseTemplate.SubHeader;
|
||||||
@@ -5101,11 +5103,37 @@ namespace Game.Entities
|
|||||||
reward.Items.Add(rewardEntry);
|
reward.Items.Add(rewardEntry);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
foreach (PlayerChoiceResponseRewardItem item in playerChoiceResponseTemplate.Reward.Value.ItemChoices)
|
||||||
|
{
|
||||||
|
var rewardEntry = new Networking.Packets.PlayerChoiceResponseRewardEntry();
|
||||||
|
rewardEntry.Item.ItemID = item.Id;
|
||||||
|
rewardEntry.Quantity = item.Quantity;
|
||||||
|
if (!item.BonusListIDs.Empty())
|
||||||
|
{
|
||||||
|
rewardEntry.Item.ItemBonus.HasValue = true;
|
||||||
|
rewardEntry.Item.ItemBonus.Value.BonusListIDs = item.BonusListIDs;
|
||||||
|
}
|
||||||
|
|
||||||
|
reward.ItemChoices.Add(rewardEntry);
|
||||||
|
}
|
||||||
|
|
||||||
playerChoiceResponse.Reward.Set(reward);
|
playerChoiceResponse.Reward.Set(reward);
|
||||||
displayPlayerChoice.Responses[i] = playerChoiceResponse;
|
displayPlayerChoice.Responses[i] = playerChoiceResponse;
|
||||||
}
|
}
|
||||||
|
|
||||||
playerChoiceResponse.RewardQuestID = playerChoiceResponseTemplate.RewardQuestID;
|
playerChoiceResponse.RewardQuestID = playerChoiceResponseTemplate.RewardQuestID;
|
||||||
|
|
||||||
|
if (playerChoiceResponseTemplate.MawPower.HasValue)
|
||||||
|
{
|
||||||
|
var mawPower = new Networking.Packets.PlayerChoiceResponseMawPower();
|
||||||
|
mawPower.TypeArtFileID = playerChoiceResponse.MawPower.Value.TypeArtFileID;
|
||||||
|
mawPower.Rarity = playerChoiceResponse.MawPower.Value.Rarity;
|
||||||
|
mawPower.RarityColor = playerChoiceResponse.MawPower.Value.RarityColor;
|
||||||
|
mawPower.SpellID = playerChoiceResponse.MawPower.Value.SpellID;
|
||||||
|
mawPower.MaxStacks = playerChoiceResponse.MawPower.Value.MaxStacks;
|
||||||
|
|
||||||
|
playerChoiceResponse.MawPower.Set(mawPower);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
SendPacket(displayPlayerChoice);
|
SendPacket(displayPlayerChoice);
|
||||||
|
|||||||
@@ -2495,6 +2495,7 @@ namespace Game.Entities
|
|||||||
packet.CasterGUID = log.attacker.GetGUID();
|
packet.CasterGUID = log.attacker.GetGUID();
|
||||||
packet.CastID = log.castId;
|
packet.CastID = log.castId;
|
||||||
packet.SpellID = (int)(log.Spell != null ? log.Spell.Id : 0);
|
packet.SpellID = (int)(log.Spell != null ? log.Spell.Id : 0);
|
||||||
|
packet.Visual.SpellXSpellVisualID = log.SpellXSpellVisualID;
|
||||||
packet.Damage = (int)log.damage;
|
packet.Damage = (int)log.damage;
|
||||||
packet.OriginalDamage = (int)log.originalDamage;
|
packet.OriginalDamage = (int)log.originalDamage;
|
||||||
if (log.damage > log.preHitHealth)
|
if (log.damage > log.preHitHealth)
|
||||||
|
|||||||
@@ -100,6 +100,18 @@ namespace Game
|
|||||||
features.MinimumExpansionLevel = (int)Expansion.Classic;
|
features.MinimumExpansionLevel = (int)Expansion.Classic;
|
||||||
features.MaximumExpansionLevel = WorldConfig.GetIntValue(WorldCfg.Expansion);
|
features.MaximumExpansionLevel = WorldConfig.GetIntValue(WorldCfg.Expansion);
|
||||||
|
|
||||||
|
var europaTicketConfig = new EuropaTicketConfig();
|
||||||
|
europaTicketConfig.ThrottleState.MaxTries = 10;
|
||||||
|
europaTicketConfig.ThrottleState.PerMilliseconds = 60000;
|
||||||
|
europaTicketConfig.ThrottleState.TryCount = 1;
|
||||||
|
europaTicketConfig.ThrottleState.LastResetTimeBeforeNow = 111111;
|
||||||
|
europaTicketConfig.TicketsEnabled = WorldConfig.GetBoolValue(WorldCfg.SupportTicketsEnabled);
|
||||||
|
europaTicketConfig.BugsEnabled = WorldConfig.GetBoolValue(WorldCfg.SupportBugsEnabled);
|
||||||
|
europaTicketConfig.ComplaintsEnabled = WorldConfig.GetBoolValue(WorldCfg.SupportComplaintsEnabled);
|
||||||
|
europaTicketConfig.SuggestionsEnabled = WorldConfig.GetBoolValue(WorldCfg.SupportSuggestionsEnabled);
|
||||||
|
|
||||||
|
features.EuropaTicketSystemStatus.Set(europaTicketConfig);
|
||||||
|
|
||||||
SendPacket(features);
|
SendPacket(features);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -242,68 +242,91 @@ namespace Game
|
|||||||
if (quest == null)
|
if (quest == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// TODO: currency choice items
|
if (packet.Choice.Item.ItemID != 0)
|
||||||
if (packet.Choice.LootItemType != LootItemType.Item)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (packet.ItemChoiceID != 0)
|
|
||||||
{
|
{
|
||||||
ItemTemplate rewardProto = Global.ObjectMgr.GetItemTemplate(packet.Choice.Item.ItemID);
|
switch (packet.Choice.LootItemType)
|
||||||
if (rewardProto == null)
|
|
||||||
{
|
{
|
||||||
Log.outError(LogFilter.Network, "Error in CMSG_QUESTGIVER_CHOOSE_REWARD: player {0} ({1}) tried to get invalid reward item (Item Entry: {2}) for quest {3} (possible packet-hacking detected)", GetPlayer().GetName(), GetPlayer().GetGUID().ToString(), packet.ItemChoiceID, packet.QuestID);
|
case LootItemType.Item:
|
||||||
return;
|
ItemTemplate rewardProto = Global.ObjectMgr.GetItemTemplate(packet.Choice.Item.ItemID);
|
||||||
}
|
if (rewardProto == null)
|
||||||
|
{
|
||||||
|
Log.outError(LogFilter.Network, "Error in CMSG_QUESTGIVER_CHOOSE_REWARD: player {0} ({1}) tried to get invalid reward item (Item Entry: {2}) for quest {3} (possible packet-hacking detected)", GetPlayer().GetName(), GetPlayer().GetGUID().ToString(), packet.ItemChoiceID, packet.QuestID);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
bool itemValid = false;
|
bool itemValid = false;
|
||||||
for (uint i = 0; i < quest.GetRewChoiceItemsCount(); ++i)
|
for (uint i = 0; i < quest.GetRewChoiceItemsCount(); ++i)
|
||||||
{
|
{
|
||||||
if (quest.RewardChoiceItemId[i] != 0 && quest.RewardChoiceItemId[i] == packet.Choice.Item.ItemID)
|
if (quest.RewardChoiceItemId[i] != 0 && quest.RewardChoiceItemType[i] == LootItemType.Item && quest.RewardChoiceItemId[i] == packet.Choice.Item.ItemID)
|
||||||
{
|
{
|
||||||
itemValid = true;
|
itemValid = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!itemValid && quest.PackageID != 0)
|
||||||
|
{
|
||||||
|
var questPackageItems = Global.DB2Mgr.GetQuestPackageItems(quest.PackageID);
|
||||||
|
if (questPackageItems != null)
|
||||||
|
{
|
||||||
|
foreach (var questPackageItem in questPackageItems)
|
||||||
|
{
|
||||||
|
if (questPackageItem.ItemID != packet.Choice.Item.ItemID)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (_player.CanSelectQuestPackageItem(questPackageItem))
|
||||||
|
{
|
||||||
|
itemValid = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!itemValid)
|
||||||
|
{
|
||||||
|
var questPackageItems1 = Global.DB2Mgr.GetQuestPackageItemsFallback(quest.PackageID);
|
||||||
|
if (questPackageItems1 != null)
|
||||||
|
{
|
||||||
|
foreach (var questPackageItem in questPackageItems1)
|
||||||
|
{
|
||||||
|
if (questPackageItem.ItemID != packet.Choice.Item.ItemID)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
itemValid = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!itemValid)
|
||||||
|
{
|
||||||
|
Log.outError(LogFilter.Network, "Error in CMSG_QUESTGIVER_CHOOSE_REWARD: player {0} ({1}) tried to get reward item (Item Entry: {2}) wich is not a reward for quest {3} (possible packet-hacking detected)", GetPlayer().GetName(), GetPlayer().GetGUID().ToString(), packet.ItemChoiceID, packet.QuestID);
|
||||||
|
return;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
case LootItemType.Currency:
|
||||||
}
|
if (!CliDB.CurrencyTypesStorage.HasRecord(packet.Choice.Item.ItemID))
|
||||||
|
|
||||||
if (!itemValid && quest.PackageID != 0)
|
|
||||||
{
|
|
||||||
var questPackageItems = Global.DB2Mgr.GetQuestPackageItems(quest.PackageID);
|
|
||||||
if (questPackageItems != null)
|
|
||||||
{
|
|
||||||
foreach (var questPackageItem in questPackageItems)
|
|
||||||
{
|
{
|
||||||
if (questPackageItem.ItemID != packet.Choice.Item.ItemID)
|
Log.outError(LogFilter.Player, $"Error in CMSG_QUESTGIVER_CHOOSE_REWARD: player {_player.GetName()} ({_player.GetGUID()}) tried to get invalid reward currency (Currency ID: {packet.Choice.Item.ItemID}) for quest {packet.QuestID} (possible packet-hacking detected)");
|
||||||
continue;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (_player.CanSelectQuestPackageItem(questPackageItem))
|
bool currencyValid = false;
|
||||||
|
for (uint i = 0; i < quest.GetRewChoiceItemsCount(); ++i)
|
||||||
|
{
|
||||||
|
if (quest.RewardChoiceItemId[i] != 0 && quest.RewardChoiceItemType[i] == LootItemType.Currency && quest.RewardChoiceItemId[i] == packet.Choice.Item.ItemID)
|
||||||
{
|
{
|
||||||
itemValid = true;
|
currencyValid = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
if (!currencyValid)
|
||||||
|
|
||||||
if (!itemValid)
|
|
||||||
{
|
|
||||||
var questPackageItems1 = Global.DB2Mgr.GetQuestPackageItemsFallback(quest.PackageID);
|
|
||||||
if (questPackageItems1 != null)
|
|
||||||
{
|
{
|
||||||
foreach (var questPackageItem in questPackageItems1)
|
Log.outError(LogFilter.Player, $"Error in CMSG_QUESTGIVER_CHOOSE_REWARD: player {_player.GetName()} ({_player.GetGUID()}) tried to get reward currency (Currency ID: {packet.Choice.Item.ItemID}) wich is not a reward for quest {packet.QuestID} (possible packet-hacking detected)");
|
||||||
{
|
return;
|
||||||
if (questPackageItem.ItemID != packet.Choice.Item.ItemID)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
itemValid = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
break;
|
||||||
}
|
|
||||||
|
|
||||||
if (!itemValid)
|
|
||||||
{
|
|
||||||
Log.outError(LogFilter.Network, "Error in CMSG_QUESTGIVER_CHOOSE_REWARD: player {0} ({1}) tried to get reward item (Item Entry: {2}) wich is not a reward for quest {3} (possible packet-hacking detected)", GetPlayer().GetName(), GetPlayer().GetGUID().ToString(), packet.ItemChoiceID, packet.QuestID);
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -327,9 +350,9 @@ namespace Game
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (GetPlayer().CanRewardQuest(quest, packet.Choice.Item.ItemID, true))
|
if (GetPlayer().CanRewardQuest(quest, packet.Choice.LootItemType, packet.Choice.Item.ItemID, true))
|
||||||
{
|
{
|
||||||
GetPlayer().RewardQuest(quest, packet.Choice.Item.ItemID, obj);
|
GetPlayer().RewardQuest(quest, packet.Choice.LootItemType, packet.Choice.Item.ItemID, obj);
|
||||||
|
|
||||||
switch (obj.GetTypeId())
|
switch (obj.GetTypeId())
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -156,7 +156,7 @@ namespace Game.Movement
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (!splineflags.HasFlag(SplineFlag.OrientationFixed | SplineFlag.Falling | SplineFlag.Unknown0x8))
|
if (!splineflags.HasFlag(SplineFlag.OrientationFixed | SplineFlag.Falling | SplineFlag.Unknown_0x8))
|
||||||
{
|
{
|
||||||
Vector3 hermite;
|
Vector3 hermite;
|
||||||
spline.Evaluate_Derivative(point_Idx, u, out hermite);
|
spline.Evaluate_Derivative(point_Idx, u, out hermite);
|
||||||
|
|||||||
Reference in New Issue
Block a user