Core/Quests: Implemented player choice rewards
DB/Creature: Cosmetic Mottled Raptor
This commit is contained in:
@@ -838,6 +838,51 @@ namespace Game.Entities
|
||||
return false;
|
||||
}
|
||||
|
||||
public void RewardQuestPackage(uint questPackageId, uint onlyItemId = 0)
|
||||
{
|
||||
bool hasFilteredQuestPackageReward = false;
|
||||
var questPackageItems = Global.DB2Mgr.GetQuestPackageItems(questPackageId);
|
||||
if (questPackageItems != null)
|
||||
{
|
||||
foreach (QuestPackageItemRecord questPackageItem in questPackageItems)
|
||||
{
|
||||
if (onlyItemId != 0 && questPackageItem.ItemID != onlyItemId)
|
||||
continue;
|
||||
|
||||
if (CanSelectQuestPackageItem(questPackageItem))
|
||||
{
|
||||
hasFilteredQuestPackageReward = true;
|
||||
List<ItemPosCount> dest = new List<ItemPosCount>();
|
||||
if (CanStoreNewItem(ItemConst.NullBag, ItemConst.NullSlot, dest, questPackageItem.ItemID, questPackageItem.ItemCount) == InventoryResult.Ok)
|
||||
{
|
||||
Item item = StoreNewItem(dest, questPackageItem.ItemID, true, ItemEnchantment.GenerateItemRandomPropertyId(questPackageItem.ItemID));
|
||||
SendNewItem(item, questPackageItem.ItemCount, true, false);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!hasFilteredQuestPackageReward)
|
||||
{
|
||||
var questPackageItemsFallback = Global.DB2Mgr.GetQuestPackageItemsFallback(questPackageId);
|
||||
if (questPackageItemsFallback != null)
|
||||
{
|
||||
foreach (QuestPackageItemRecord questPackageItem in questPackageItemsFallback)
|
||||
{
|
||||
if (onlyItemId != 0 && questPackageItem.ItemID != onlyItemId)
|
||||
continue;
|
||||
|
||||
List<ItemPosCount> dest = new List<ItemPosCount>();
|
||||
if (CanStoreNewItem(ItemConst.NullBag, ItemConst.NullSlot, dest, questPackageItem.ItemID, questPackageItem.ItemCount) == InventoryResult.Ok)
|
||||
{
|
||||
Item item = StoreNewItem(dest, questPackageItem.ItemID, true, ItemEnchantment.GenerateItemRandomPropertyId(questPackageItem.ItemID));
|
||||
SendNewItem(item, questPackageItem.ItemCount, true, false);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void RewardQuest(Quest quest, uint reward, WorldObject questGiver, bool announce = true)
|
||||
{
|
||||
//this THING should be here to protect code from quest, which cast on player far teleport as a reward
|
||||
@@ -893,49 +938,7 @@ namespace Game.Entities
|
||||
|
||||
// QuestPackageItem.db2
|
||||
if (rewardProto != null && 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;
|
||||
List<ItemPosCount> dest = new List<ItemPosCount>();
|
||||
if (CanStoreNewItem(ItemConst.NullBag, ItemConst.NullSlot, dest, questPackageItem.ItemID, questPackageItem.ItemCount) == InventoryResult.Ok)
|
||||
{
|
||||
Item item = StoreNewItem(dest, questPackageItem.ItemID, true, ItemEnchantment.GenerateItemRandomPropertyId(questPackageItem.ItemID));
|
||||
SendNewItem(item, questPackageItem.ItemCount, true, false);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!hasFilteredQuestPackageReward)
|
||||
{
|
||||
List<QuestPackageItemRecord> questPackageItems1 = Global.DB2Mgr.GetQuestPackageItemsFallback(quest.PackageID);
|
||||
if (questPackageItems1 != null)
|
||||
{
|
||||
foreach (QuestPackageItemRecord questPackageItem in questPackageItems1)
|
||||
{
|
||||
if (questPackageItem.ItemID != reward)
|
||||
continue;
|
||||
|
||||
List<ItemPosCount> dest = new List<ItemPosCount>();
|
||||
if (CanStoreNewItem(ItemConst.NullBag, ItemConst.NullSlot, dest, questPackageItem.ItemID, questPackageItem.ItemCount) == InventoryResult.Ok)
|
||||
{
|
||||
Item item = StoreNewItem(dest, questPackageItem.ItemID, true, ItemEnchantment.GenerateItemRandomPropertyId(questPackageItem.ItemID));
|
||||
SendNewItem(item, questPackageItem.ItemCount, true, false);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
RewardQuestPackage(quest.PackageID, reward);
|
||||
|
||||
if (quest.GetRewItemsCount() > 0)
|
||||
{
|
||||
|
||||
@@ -408,11 +408,11 @@ namespace Game.Entities
|
||||
SendPacket(cooldowns);
|
||||
}
|
||||
|
||||
bool UpdateSkillPro(SkillType skillId, int chance, uint step)
|
||||
public bool UpdateSkillPro(SkillType skillId, int chance, uint step)
|
||||
{
|
||||
return UpdateSkillPro((uint)skillId, chance, step);
|
||||
}
|
||||
bool UpdateSkillPro(uint skillId, int chance, uint step)
|
||||
public bool UpdateSkillPro(uint skillId, int chance, uint step)
|
||||
{
|
||||
// levels sync. with spell requirement for skill levels to learn
|
||||
// bonus abilities in sSkillLineAbilityStore
|
||||
|
||||
@@ -4994,37 +4994,97 @@ namespace Game.Entities
|
||||
SendMessageToSet(updateCollisionHeight, false);
|
||||
}
|
||||
|
||||
public void SendPlayerChoice(ObjectGuid sender, uint choiceID)
|
||||
public void SendPlayerChoice(ObjectGuid sender, int choiceId)
|
||||
{
|
||||
PlayerChoice playerChoice = Global.ObjectMgr.GetPlayerChoice((int)choiceID);
|
||||
PlayerChoice playerChoice = Global.ObjectMgr.GetPlayerChoice(choiceId);
|
||||
if (playerChoice == null)
|
||||
return;
|
||||
|
||||
PlayerChoice localizedPlayerChoice = playerChoice;
|
||||
|
||||
LocaleConstant locale = GetSession().GetSessionDbLocaleIndex();
|
||||
if (locale != LocaleConstant.enUS)
|
||||
{
|
||||
PlayerChoiceLocale playerChoiceLocale = Global.ObjectMgr.GetPlayerChoiceLocale((uint)localizedPlayerChoice.ChoiceId);
|
||||
if (playerChoiceLocale != null)
|
||||
ObjectManager.GetLocaleString(playerChoiceLocale.Question, locale, ref localizedPlayerChoice.Question);
|
||||
PlayerChoiceLocale playerChoiceLocale = locale != LocaleConstant.enUS ? Global.ObjectMgr.GetPlayerChoiceLocale(choiceId) : null;
|
||||
|
||||
foreach (var playerChoiceResponse in localizedPlayerChoice.Responses)
|
||||
PlayerTalkClass.GetInteractionData().Reset();
|
||||
PlayerTalkClass.GetInteractionData().SourceGuid = sender;
|
||||
PlayerTalkClass.GetInteractionData().PlayerChoiceId = (uint)choiceId;
|
||||
|
||||
DisplayPlayerChoice displayPlayerChoice = new DisplayPlayerChoice();
|
||||
displayPlayerChoice.SenderGUID = sender;
|
||||
displayPlayerChoice.ChoiceID = choiceId;
|
||||
displayPlayerChoice.Question = playerChoice.Question;
|
||||
if (playerChoiceLocale != null)
|
||||
ObjectManager.GetLocaleString(playerChoiceLocale.Question, locale, ref displayPlayerChoice.Question);
|
||||
|
||||
displayPlayerChoice.CloseChoiceFrame = false;
|
||||
|
||||
for (var i = 0; i < playerChoice.Responses.Count; ++i)
|
||||
{
|
||||
PlayerChoiceResponse playerChoiceResponseTemplate = playerChoice.Responses[i];
|
||||
var playerChoiceResponse = new Network.Packets.PlayerChoiceResponse();
|
||||
|
||||
playerChoiceResponse.ResponseID = playerChoiceResponseTemplate.ResponseId;
|
||||
playerChoiceResponse.ChoiceArtFileID = playerChoiceResponseTemplate.ChoiceArtFileId;
|
||||
playerChoiceResponse.Answer = playerChoiceResponseTemplate.Answer;
|
||||
playerChoiceResponse.Header = playerChoiceResponseTemplate.Header;
|
||||
playerChoiceResponse.Description = playerChoiceResponseTemplate.Description;
|
||||
playerChoiceResponse.Confirmation = playerChoiceResponseTemplate.Confirmation;
|
||||
if (playerChoiceLocale != null)
|
||||
{
|
||||
PlayerChoiceResponseLocale playerChoiceResponseLocale = Global.ObjectMgr.GetPlayerChoiceResponseLocale((uint)localizedPlayerChoice.ChoiceId, (uint)playerChoiceResponse.Value.ResponseID);
|
||||
PlayerChoiceResponseLocale playerChoiceResponseLocale = playerChoiceLocale.Responses.LookupByKey(playerChoiceResponseTemplate.ResponseId);
|
||||
if (playerChoiceResponseLocale != null)
|
||||
{
|
||||
ObjectManager.GetLocaleString(playerChoiceResponseLocale.Header, locale, ref playerChoiceResponse.Value.Header);
|
||||
ObjectManager.GetLocaleString(playerChoiceResponseLocale.Answer, locale, ref playerChoiceResponse.Value.Answer);
|
||||
ObjectManager.GetLocaleString(playerChoiceResponseLocale.Description, locale, ref playerChoiceResponse.Value.Description);
|
||||
ObjectManager.GetLocaleString(playerChoiceResponseLocale.Confirmation, locale, ref playerChoiceResponse.Value.Confirmation);
|
||||
ObjectManager.GetLocaleString(playerChoiceResponseLocale.Answer, locale, ref playerChoiceResponse.Answer);
|
||||
ObjectManager.GetLocaleString(playerChoiceResponseLocale.Header, locale, ref playerChoiceResponse.Header);
|
||||
ObjectManager.GetLocaleString(playerChoiceResponseLocale.Description, locale, ref playerChoiceResponse.Description);
|
||||
ObjectManager.GetLocaleString(playerChoiceResponseLocale.Confirmation, locale, ref playerChoiceResponse.Confirmation);
|
||||
}
|
||||
}
|
||||
|
||||
if (playerChoiceResponseTemplate.Reward.HasValue)
|
||||
{
|
||||
var reward = new Network.Packets.PlayerChoiceResponseReward();
|
||||
reward.TitleID = playerChoiceResponseTemplate.Reward.Value.TitleId;
|
||||
reward.PackageID = playerChoiceResponseTemplate.Reward.Value.PackageId;
|
||||
reward.SkillLineID = playerChoiceResponseTemplate.Reward.Value.SkillLineId;
|
||||
reward.SkillPointCount = playerChoiceResponseTemplate.Reward.Value.SkillPointCount;
|
||||
reward.ArenaPointCount = playerChoiceResponseTemplate.Reward.Value.ArenaPointCount;
|
||||
reward.HonorPointCount = playerChoiceResponseTemplate.Reward.Value.HonorPointCount;
|
||||
reward.Money = playerChoiceResponseTemplate.Reward.Value.Money;
|
||||
reward.Xp = playerChoiceResponseTemplate.Reward.Value.Xp;
|
||||
|
||||
foreach (var item in playerChoiceResponseTemplate.Reward.Value.Items)
|
||||
{
|
||||
var rewardEntry = new Network.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.Items.Add(rewardEntry);
|
||||
}
|
||||
|
||||
foreach (var currency in playerChoiceResponseTemplate.Reward.Value.Currency)
|
||||
{
|
||||
var rewardEntry = new Network.Packets.PlayerChoiceResponseRewardEntry();
|
||||
rewardEntry.Item.ItemID = currency.Id;
|
||||
rewardEntry.Quantity = currency.Quantity;
|
||||
reward.Items.Add(rewardEntry);
|
||||
}
|
||||
|
||||
foreach (var faction in playerChoiceResponseTemplate.Reward.Value.Faction)
|
||||
{
|
||||
var rewardEntry = new Network.Packets.PlayerChoiceResponseRewardEntry();
|
||||
rewardEntry.Item.ItemID = faction.Id;
|
||||
rewardEntry.Quantity = faction.Quantity;
|
||||
reward.Items.Add(rewardEntry);
|
||||
}
|
||||
|
||||
playerChoiceResponse.Reward.Set(reward);
|
||||
displayPlayerChoice.Responses[i] = playerChoiceResponse;
|
||||
}
|
||||
}
|
||||
|
||||
DisplayPlayerChoice displayPlayerChoice = new DisplayPlayerChoice();
|
||||
displayPlayerChoice.Choice = localizedPlayerChoice;
|
||||
displayPlayerChoice.SenderGUID = sender;
|
||||
SendPacket(displayPlayerChoice);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user