diff --git a/Source/Game/AuctionHouse/AuctionManager.cs b/Source/Game/AuctionHouse/AuctionManager.cs index f0348db28..94841f129 100644 --- a/Source/Game/AuctionHouse/AuctionManager.cs +++ b/Source/Game/AuctionHouse/AuctionManager.cs @@ -1808,6 +1808,7 @@ namespace Game { bucketInfo.Key = new AuctionBucketKey(Key); bucketInfo.MinPrice = MinPrice; + bucketInfo.RequiredLevel = RequiredLevel; bucketInfo.TotalQuantity = 0; foreach (AuctionPosting auction in Auctions) diff --git a/Source/Game/Chat/Commands/QuestCommands.cs b/Source/Game/Chat/Commands/QuestCommands.cs index fff9c2308..11289122b 100644 --- a/Source/Game/Chat/Commands/QuestCommands.cs +++ b/Source/Game/Chat/Commands/QuestCommands.cs @@ -238,7 +238,7 @@ namespace Game.Chat return false; } - player.RewardQuest(quest, 0, player); + player.RewardQuest(quest, LootItemType.Item, 0, player); return true; } } diff --git a/Source/Game/DungeonFinding/LFGManager.cs b/Source/Game/DungeonFinding/LFGManager.cs index 544a40534..0be763bbf 100644 --- a/Source/Game/DungeonFinding/LFGManager.cs +++ b/Source/Game/DungeonFinding/LFGManager.cs @@ -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 (player.CanRewardQuest(quest, false)) - player.RewardQuest(quest, 0, null, false); + player.RewardQuest(quest, LootItemType.Item, 0, null, false); else { done = true; @@ -1361,7 +1361,7 @@ namespace Game.DungeonFinding if (quest == null) continue; // 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 diff --git a/Source/Game/Entities/Creature/Gossip.cs b/Source/Game/Entities/Creature/Gossip.cs index 9ad4ba609..6cd922556 100644 --- a/Source/Game/Entities/Creature/Gossip.cs +++ b/Source/Game/Entities/Creature/Gossip.cs @@ -262,6 +262,7 @@ namespace Game.Misc opt.OptionCost = (int)item.BoxMoney; // money required to open menu, 2.0.3 opt.Text = item.Message; // text for gossip item opt.Confirm = item.BoxMessage; // accept text (related to money) pop up box, 2.0.3 + opt.Status = GossipOptionStatus.Available; packet.GossipOptions.Add(opt); } diff --git a/Source/Game/Entities/Player/Player.Quest.cs b/Source/Game/Entities/Player/Player.Quest.cs index e286b36e5..571bbc9d4 100644 --- a/Source/Game/Entities/Player/Player.Quest.cs +++ b/Source/Game/Entities/Player/Player.Quest.cs @@ -569,6 +569,105 @@ namespace Game.Entities 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 dest = new List(); + 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 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) { 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 dest = new List(); - 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 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) { ushort log_slot = FindQuestSlot(0); @@ -823,7 +830,7 @@ namespace Game.Entities Quest qInfo = Global.ObjectMgr.GetQuestTemplate(quest_id); if (qInfo != null) 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 //should work fine, cause far teleport will be executed in Update() @@ -986,27 +993,41 @@ namespace Game.Entities } } } - - ItemTemplate rewardProto = Global.ObjectMgr.GetItemTemplate(reward); - if (rewardProto != null && quest.GetRewChoiceItemsCount() != 0) + + switch (rewardType) { - for (uint i = 0; i < quest.GetRewChoiceItemsCount(); ++i) - { - if (quest.RewardChoiceItemId[i] != 0 && quest.RewardChoiceItemId[i] == reward) + case LootItemType.Item: + ItemTemplate rewardProto = Global.ObjectMgr.GetItemTemplate(rewardId); + if (rewardProto != null && quest.GetRewChoiceItemsCount() != 0) { - List dest = new List(); - if (CanStoreNewItem(ItemConst.NullBag, ItemConst.NullSlot, dest, reward, quest.RewardChoiceItemCount[i]) == InventoryResult.Ok) + for (uint i = 0; i < SharedConst.QuestRewardChoicesCount; ++i) { - Item item = StoreNewItem(dest, reward, true, ItemEnchantmentManager.GenerateItemRandomBonusListId(reward)); - SendNewItem(item, quest.RewardChoiceItemCount[i], true, false); + if (quest.RewardChoiceItemId[i] != 0 && quest.RewardChoiceItemType[i] == LootItemType.Item && quest.RewardChoiceItemId[i] == rewardId) + { + List dest = new List(); + 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) - RewardQuestPackage(quest.PackageID, reward); + + // QuestPackageItem.db2 + 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) { @@ -1107,21 +1128,23 @@ namespace Game.Entities } else { - for (uint i = 0; i < SharedConst.QuestRewardDisplaySpellCount; ++i) + foreach (QuestRewardDisplaySpell displaySpell in quest.RewardDisplaySpell) { - if (quest.RewardDisplaySpell[i] > 0) - { - SpellInfo spellInfo = Global.SpellMgr.GetSpellInfo(quest.RewardDisplaySpell[i], GetMap().GetDifficultyID()); - Unit caster = this; - if (questGiver != null && questGiver.IsTypeMask(TypeMask.Unit) && !quest.HasFlag(QuestFlags.PlayerCastOnComplete) && !spellInfo.HasTargetType(Targets.UnitCaster)) - { - Unit unit = questGiver.ToUnit(); - if (unit != null) - caster = unit; - } + var playerCondition = CliDB.PlayerConditionStorage.LookupByKey(displaySpell.PlayerConditionId); + if (playerCondition != null) + if (!ConditionManager.IsPlayerMeetingCondition(this, playerCondition)) + continue; - 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); } } diff --git a/Source/Game/Entities/Player/Player.cs b/Source/Game/Entities/Player/Player.cs index b8fc97a81..27894a459 100644 --- a/Source/Game/Entities/Player/Player.cs +++ b/Source/Game/Entities/Player/Player.cs @@ -5034,12 +5034,14 @@ namespace Game.Entities var playerChoiceResponse = new Networking.Packets.PlayerChoiceResponse(); playerChoiceResponse.ResponseID = playerChoiceResponseTemplate.ResponseId; + playerChoiceResponse.ResponseIdentifier = playerChoiceResponseTemplate.ResponseIdentifier; playerChoiceResponse.ChoiceArtFileID = playerChoiceResponseTemplate.ChoiceArtFileId; playerChoiceResponse.Flags = playerChoiceResponseTemplate.Flags; playerChoiceResponse.WidgetSetID = playerChoiceResponseTemplate.WidgetSetID; playerChoiceResponse.UiTextureAtlasElementID = playerChoiceResponseTemplate.UiTextureAtlasElementID; playerChoiceResponse.SoundKitID = playerChoiceResponseTemplate.SoundKitID; playerChoiceResponse.GroupID = playerChoiceResponseTemplate.GroupID; + playerChoiceResponse.UiTextureKitID = playerChoiceResponseTemplate.UiTextureKitID; playerChoiceResponse.Answer = playerChoiceResponseTemplate.Answer; playerChoiceResponse.Header = playerChoiceResponseTemplate.Header; playerChoiceResponse.SubHeader = playerChoiceResponseTemplate.SubHeader; @@ -5101,11 +5103,37 @@ namespace Game.Entities 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); displayPlayerChoice.Responses[i] = playerChoiceResponse; } 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); diff --git a/Source/Game/Entities/Unit/Unit.Spells.cs b/Source/Game/Entities/Unit/Unit.Spells.cs index 8e91b9fba..9455eb18c 100644 --- a/Source/Game/Entities/Unit/Unit.Spells.cs +++ b/Source/Game/Entities/Unit/Unit.Spells.cs @@ -2495,6 +2495,7 @@ namespace Game.Entities packet.CasterGUID = log.attacker.GetGUID(); packet.CastID = log.castId; packet.SpellID = (int)(log.Spell != null ? log.Spell.Id : 0); + packet.Visual.SpellXSpellVisualID = log.SpellXSpellVisualID; packet.Damage = (int)log.damage; packet.OriginalDamage = (int)log.originalDamage; if (log.damage > log.preHitHealth) diff --git a/Source/Game/Handlers/AuthenticationHandler.cs b/Source/Game/Handlers/AuthenticationHandler.cs index fbb974e76..2ad871a1d 100644 --- a/Source/Game/Handlers/AuthenticationHandler.cs +++ b/Source/Game/Handlers/AuthenticationHandler.cs @@ -100,6 +100,18 @@ namespace Game features.MinimumExpansionLevel = (int)Expansion.Classic; 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); } } diff --git a/Source/Game/Handlers/QuestHandler.cs b/Source/Game/Handlers/QuestHandler.cs index f2478d651..d970f1b80 100644 --- a/Source/Game/Handlers/QuestHandler.cs +++ b/Source/Game/Handlers/QuestHandler.cs @@ -242,68 +242,91 @@ namespace Game if (quest == null) return; - // TODO: currency choice items - if (packet.Choice.LootItemType != LootItemType.Item) - return; - - if (packet.ItemChoiceID != 0) + if (packet.Choice.Item.ItemID != 0) { - ItemTemplate rewardProto = Global.ObjectMgr.GetItemTemplate(packet.Choice.Item.ItemID); - if (rewardProto == null) + switch (packet.Choice.LootItemType) { - 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; - } + case LootItemType.Item: + 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; - for (uint i = 0; i < quest.GetRewChoiceItemsCount(); ++i) - { - if (quest.RewardChoiceItemId[i] != 0 && quest.RewardChoiceItemId[i] == packet.Choice.Item.ItemID) - { - itemValid = true; + bool itemValid = false; + for (uint i = 0; i < quest.GetRewChoiceItemsCount(); ++i) + { + if (quest.RewardChoiceItemId[i] != 0 && quest.RewardChoiceItemType[i] == LootItemType.Item && quest.RewardChoiceItemId[i] == packet.Choice.Item.ItemID) + { + 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; - } - } - - if (!itemValid && quest.PackageID != 0) - { - var questPackageItems = Global.DB2Mgr.GetQuestPackageItems(quest.PackageID); - if (questPackageItems != null) - { - foreach (var questPackageItem in questPackageItems) + case LootItemType.Currency: + if (!CliDB.CurrencyTypesStorage.HasRecord(packet.Choice.Item.ItemID)) { - if (questPackageItem.ItemID != packet.Choice.Item.ItemID) - continue; + 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)"); + 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; } } - } - - if (!itemValid) - { - var questPackageItems1 = Global.DB2Mgr.GetQuestPackageItemsFallback(quest.PackageID); - if (questPackageItems1 != null) + if (!currencyValid) { - foreach (var questPackageItem in questPackageItems1) - { - if (questPackageItem.ItemID != packet.Choice.Item.ItemID) - continue; - - itemValid = true; - break; - } + 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 (!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; } } @@ -327,9 +350,9 @@ namespace Game 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()) { diff --git a/Source/Game/Movement/MoveSpline.cs b/Source/Game/Movement/MoveSpline.cs index acae7f8d4..f975cafb1 100644 --- a/Source/Game/Movement/MoveSpline.cs +++ b/Source/Game/Movement/MoveSpline.cs @@ -156,7 +156,7 @@ namespace Game.Movement } else { - if (!splineflags.HasFlag(SplineFlag.OrientationFixed | SplineFlag.Falling | SplineFlag.Unknown0x8)) + if (!splineflags.HasFlag(SplineFlag.OrientationFixed | SplineFlag.Falling | SplineFlag.Unknown_0x8)) { Vector3 hermite; spline.Evaluate_Derivative(point_Idx, u, out hermite);