Core/Gossip: Drop OptionType for gossip_menu_option and rename OptionIcon to OptionNpc as it also determines functionality on client side

Port From (https://github.com/TrinityCore/TrinityCore/commit/69e0249807f5a8f351e6be6f7350ebace3d2997a)
This commit is contained in:
hondacrx
2022-09-08 18:06:18 -04:00
parent da1d0717fd
commit dbf746f9ea
13 changed files with 224 additions and 209 deletions
+9 -19
View File
@@ -29,7 +29,7 @@ namespace Game.Misc
{
public class GossipMenu
{
public uint AddMenuItem(int menuItemId, GossipOptionIcon icon, string message, uint sender, uint action, string boxMessage, uint boxMoney, bool coded = false)
public uint AddMenuItem(int menuItemId, GossipOptionNpc optionNpc, string message, uint sender, uint action, string boxMessage, uint boxMoney, bool coded = false)
{
Cypher.Assert(_menuItems.Count <= SharedConst.MaxGossipMenuItems);
@@ -51,11 +51,11 @@ namespace Game.Misc
GossipMenuItem menuItem = new();
menuItem.MenuItemIcon = (byte)icon;
menuItem.OptionNpc = optionNpc;
menuItem.Message = message;
menuItem.IsCoded = coded;
menuItem.Sender = sender;
menuItem.OptionType = action;
menuItem.Action = action;
menuItem.BoxMessage = boxMessage;
menuItem.BoxMoney = boxMoney;
@@ -124,7 +124,7 @@ namespace Game.Misc
}
// Add menu item with existing method. Menu item id -1 is also used in ADD_GOSSIP_ITEM macro.
uint newOptionId = AddMenuItem(-1, item.OptionIcon, strOptionText, sender, action, strBoxText, item.BoxMoney, item.BoxCoded);
uint newOptionId = AddMenuItem(-1, item.OptionNpc, strOptionText, sender, action, strBoxText, item.BoxMoney, item.BoxCoded);
AddGossipMenuItemData(newOptionId, item.ActionMenuId, item.ActionPoiId);
}
}
@@ -150,7 +150,7 @@ namespace Game.Misc
public uint GetMenuItemAction(uint menuItemId)
{
if (_menuItems.ContainsKey(menuItemId))
return _menuItems.LookupByKey(menuItemId).OptionType;
return _menuItems.LookupByKey(menuItemId).Action;
else
return 0;
}
@@ -163,15 +163,6 @@ namespace Game.Misc
return false;
}
public bool HasMenuItemType(uint optionType)
{
foreach (var menuItemPair in _menuItems)
if (menuItemPair.Value.OptionType == optionType)
return true;
return false;
}
public void ClearMenu()
{
_menuItems.Clear();
@@ -264,7 +255,7 @@ namespace Game.Misc
ClientGossipOptions opt = new();
GossipMenuItem item = pair.Value;
opt.ClientOption = (int)pair.Key;
opt.OptionNPC = item.MenuItemIcon;
opt.OptionNPC = item.OptionNpc;
opt.OptionFlags = (byte)(item.IsCoded ? 1 : 0); // makes pop up box password
opt.OptionCost = (int)item.BoxMoney; // money required to open menu, 2.0.3
opt.OptionLanguage = item.Language;
@@ -701,11 +692,11 @@ namespace Game.Misc
public class GossipMenuItem
{
public byte MenuItemIcon;
public GossipOptionNpc OptionNpc;
public bool IsCoded;
public string Message;
public uint Sender;
public uint OptionType;
public uint Action;
public string BoxMessage;
public uint BoxMoney;
public uint Language;
@@ -737,10 +728,9 @@ namespace Game.Misc
{
public uint MenuId;
public uint OptionId;
public GossipOptionIcon OptionIcon;
public GossipOptionNpc OptionNpc;
public string OptionText;
public uint OptionBroadcastTextId;
public GossipOption OptionType;
public NPCFlags OptionNpcFlag;
public uint Language;
public uint ActionMenuId;
@@ -642,12 +642,12 @@ namespace Game.Entities
SendPacket(packet);
}
public void SendRespecWipeConfirm(ObjectGuid guid, uint cost)
public void SendRespecWipeConfirm(ObjectGuid guid, uint cost, SpecResetType respecType)
{
RespecWipeConfirm respecWipeConfirm = new();
respecWipeConfirm.RespecMaster = guid;
respecWipeConfirm.Cost = cost;
respecWipeConfirm.RespecType = SpecResetType.Talents;
respecWipeConfirm.RespecType = respecType;
SendPacket(respecWipeConfirm);
}
+122 -80
View File
@@ -2326,60 +2326,90 @@ namespace Game.Entities
if (!menuItems.OptionNpcFlag.HasAnyFlag(npcflags))
continue;
switch (menuItems.OptionType)
switch (menuItems.OptionNpc)
{
case GossipOption.Armorer:
canTalk = false; // added in special mode
break;
case GossipOption.Spirithealer:
if (!IsDead())
canTalk = false;
break;
case GossipOption.Learndualspec:
canTalk = false;
break;
case GossipOption.Unlearntalents:
if (!creature.CanResetTalents(this))
canTalk = false;
break;
case GossipOption.Taxivendor:
case GossipOptionNpc.TaxiNode:
if (GetSession().SendLearnNewTaxiNode(creature))
return;
break;
case GossipOption.Battlefield:
case GossipOptionNpc.SpiritHealer:
if (!IsDead())
canTalk = false;
break;
case GossipOptionNpc.BattleMaster:
if (!creature.CanInteractWithBattleMaster(this, false))
canTalk = false;
break;
case GossipOption.Stablepet:
case GossipOptionNpc.TalentMaster:
case GossipOptionNpc.SpecializationMaster:
case GossipOptionNpc.GlyphMaster:
if (!creature.CanResetTalents(this))
canTalk = false;
break;
case GossipOptionNpc.StableMaster:
case GossipOptionNpc.PetSpecializationMaster:
if (GetClass() != Class.Hunter)
canTalk = false;
break;
case GossipOption.Questgiver:
canTalk = false;
case GossipOptionNpc.DisableXPGain:
if (HasPlayerFlag(PlayerFlags.NoXPGain))
canTalk = false;
break;
case GossipOption.Gossip:
case GossipOption.Vendor:
case GossipOption.Trainer:
case GossipOption.Spiritguide:
case GossipOption.Innkeeper:
case GossipOption.Banker:
case GossipOption.Petitioner:
case GossipOption.Tabarddesigner:
case GossipOption.Auctioneer:
case GossipOption.Transmogrifier:
case GossipOption.Mailbox:
break; // no checks
case GossipOptionNpc.EnableXPGain:
if (!HasPlayerFlag(PlayerFlags.NoXPGain))
canTalk = false;
break;
case GossipOptionNpc.None:
case GossipOptionNpc.Vendor:
case GossipOptionNpc.Trainer:
case GossipOptionNpc.Binder:
case GossipOptionNpc.Banker:
case GossipOptionNpc.PetitionVendor:
case GossipOptionNpc.TabardVendor:
case GossipOptionNpc.Auctioneer:
case GossipOptionNpc.Mailbox:
case GossipOptionNpc.Transmogrify:
break; // No checks
case GossipOptionNpc.CemeterySelect:
canTalk = false; // Deprecated
break;
case GossipOptionNpc.GuildBanker:
case GossipOptionNpc.SpellClick:
case GossipOptionNpc.WorldPVPQueue:
case GossipOptionNpc.LFGDungeon:
case GossipOptionNpc.ArtifactRespec:
case GossipOptionNpc.QueueScenario:
case GossipOptionNpc.GarrisonArchitect:
case GossipOptionNpc.GarrisonMission:
case GossipOptionNpc.ShipmentCrafter:
case GossipOptionNpc.GarrisonTradeskill:
case GossipOptionNpc.GarrisonRecruitment:
case GossipOptionNpc.AdventureMap:
case GossipOptionNpc.GarrisonTalent:
case GossipOptionNpc.ContributionCollector:
case GossipOptionNpc.AzeriteRespec:
case GossipOptionNpc.IslandsMission:
case GossipOptionNpc.UIItemInteraction:
case GossipOptionNpc.WorldMap:
case GossipOptionNpc.Soulbind:
case GossipOptionNpc.ChromieTime:
case GossipOptionNpc.CovenantPreview:
case GossipOptionNpc.RuneforgeLegendaryCrafting:
case GossipOptionNpc.NewPlayerGuide:
case GossipOptionNpc.RuneforgeLegendaryUpgrade:
case GossipOptionNpc.CovenantRenown:
break; // NYI
default:
Log.outError(LogFilter.Sql, "Creature entry {0} have unknown gossip option {1} for menu {2}", creature.GetEntry(), menuItems.OptionType, menuItems.MenuId);
Log.outError(LogFilter.Sql, $"Creature entry {creature.GetEntry()} has an unknown gossip option icon {menuItems.OptionNpc} for menu {menuItems.MenuId}.");
canTalk = false;
break;
}
}
else if (go != null)
{
switch (menuItems.OptionType)
switch (menuItems.OptionNpc)
{
case GossipOption.Gossip:
case GossipOptionNpc.None:
if (go.GetGoType() != GameObjectTypes.QuestGiver && go.GetGoType() != GameObjectTypes.Goober)
canTalk = false;
break;
@@ -2426,7 +2456,7 @@ namespace Game.Entities
}
}
menu.GetGossipMenu().AddMenuItem((int)menuItems.OptionId, menuItems.OptionIcon, strOptionText, 0, (uint)menuItems.OptionType, strBoxText, menuItems.BoxMoney, menuItems.BoxCoded);
menu.GetGossipMenu().AddMenuItem((int)menuItems.OptionId, menuItems.OptionNpc, strOptionText, 0, (uint)menuItems.OptionNpc, strBoxText, menuItems.BoxMoney, menuItems.BoxCoded);
menu.GetGossipMenu().AddGossipMenuItemData(menuItems.OptionId, menuItems.ActionMenuId, menuItems.ActionPoiId);
}
}
@@ -2467,12 +2497,12 @@ namespace Game.Entities
if (item == null)
return;
uint gossipOptionType = item.OptionType;
GossipOptionNpc gossipOptionNpc = item.OptionNpc;
ObjectGuid guid = source.GetGUID();
if (source.IsTypeId(TypeId.GameObject))
{
if (gossipOptionType > (int)GossipOption.Questgiver)
if (gossipOptionNpc != GossipOptionNpc.None)
{
Log.outError(LogFilter.Player, "Player guid {0} request invalid gossip option for GameObject entry {1}", GetGUID().ToString(), source.GetEntry());
return;
@@ -2491,9 +2521,9 @@ namespace Game.Entities
return;
}
switch ((GossipOption)gossipOptionType)
switch (gossipOptionNpc)
{
case GossipOption.Gossip:
case GossipOptionNpc.None:
{
if (menuItemData.GossipActionPoi != 0)
PlayerTalkClass.SendPointOfInterest(menuItemData.GossipActionPoi);
@@ -2506,56 +2536,36 @@ namespace Game.Entities
break;
}
case GossipOption.Spirithealer:
if (IsDead())
source.ToCreature().CastSpell(source.ToCreature(), 17251, new CastSpellExtraArgs(TriggerCastFlags.FullMask).SetOriginalCaster(GetGUID()));
break;
case GossipOption.Questgiver:
PrepareQuestMenu(guid);
SendPreparedQuest(source);
break;
case GossipOption.Vendor:
case GossipOption.Armorer:
case GossipOptionNpc.Vendor:
GetSession().SendListInventory(guid);
break;
case GossipOption.Stablepet:
GetSession().SendStablePet(guid);
break;
case GossipOption.Trainer:
GetSession().SendTrainerList(source.ToCreature(), Global.ObjectMgr.GetCreatureTrainerForGossipOption(source.GetEntry(), menuId, gossipListId));
break;
case GossipOption.Learndualspec:
break;
case GossipOption.Unlearntalents:
PlayerTalkClass.SendCloseGossip();
SendRespecWipeConfirm(guid, GetNextResetTalentsCost());
break;
case GossipOption.Taxivendor:
case GossipOptionNpc.TaxiNode:
GetSession().SendTaxiMenu(source.ToCreature());
break;
case GossipOption.Innkeeper:
case GossipOptionNpc.Trainer:
GetSession().SendTrainerList(source.ToCreature(), Global.ObjectMgr.GetCreatureTrainerForGossipOption(source.GetEntry(), menuId, gossipListId));
break;
case GossipOptionNpc.SpiritHealer:
if (IsDead())
source.ToCreature().CastSpell(source.ToCreature(), 17251, new CastSpellExtraArgs(TriggerCastFlags.FullMask)
.SetOriginalCaster(GetGUID()));
break;
case GossipOptionNpc.Binder:
PlayerTalkClass.SendCloseGossip();
SetBindPoint(guid);
break;
case GossipOption.Banker:
case GossipOptionNpc.Banker:
GetSession().SendShowBank(guid);
break;
case GossipOption.Petitioner:
case GossipOptionNpc.PetitionVendor:
PlayerTalkClass.SendCloseGossip();
GetSession().SendPetitionShowList(guid);
break;
case GossipOption.Tabarddesigner:
case GossipOptionNpc.TabardVendor:
PlayerTalkClass.SendCloseGossip();
GetSession().SendTabardVendorActivate(guid);
break;
case GossipOption.Auctioneer:
GetSession().SendAuctionHello(guid, source.ToCreature());
break;
case GossipOption.Spiritguide:
PrepareGossipMenu(source);
SendPreparedGossip(source);
break;
case GossipOption.Battlefield:
case GossipOptionNpc.BattleMaster:
{
BattlegroundTypeId bgTypeId = Global.BattlegroundMgr.GetBattleMasterBG(source.GetEntry());
@@ -2568,11 +2578,43 @@ namespace Game.Entities
Global.BattlegroundMgr.SendBattlegroundList(this, guid, bgTypeId);
break;
}
case GossipOption.Transmogrifier:
case GossipOptionNpc.Auctioneer:
GetSession().SendAuctionHello(guid, source.ToCreature());
break;
case GossipOptionNpc.TalentMaster:
PlayerTalkClass.SendCloseGossip();
SendRespecWipeConfirm(guid, WorldConfig.GetBoolValue(WorldCfg.NoResetTalentCost) ? 0 : GetNextResetTalentsCost(), SpecResetType.Talents);
break;
case GossipOptionNpc.StableMaster:
GetSession().SendStablePet(guid);
break;
case GossipOptionNpc.PetSpecializationMaster:
PlayerTalkClass.SendCloseGossip();
SendRespecWipeConfirm(guid, WorldConfig.GetBoolValue(WorldCfg.NoResetTalentCost) ? 0 : GetNextResetTalentsCost(), SpecResetType.PetTalents);
break;
case GossipOptionNpc.DisableXPGain:
PlayerTalkClass.SendCloseGossip();
SetPlayerFlag(PlayerFlags.NoXPGain);
break;
case GossipOptionNpc.EnableXPGain:
PlayerTalkClass.SendCloseGossip();
RemovePlayerFlag(PlayerFlags.NoXPGain);
break;
case GossipOptionNpc.Mailbox:
GetSession().SendShowMailBox(guid);
break;
case GossipOptionNpc.SpecializationMaster:
PlayerTalkClass.SendCloseGossip();
SendRespecWipeConfirm(guid, 0, SpecResetType.Specialization);
break;
case GossipOptionNpc.GlyphMaster:
PlayerTalkClass.SendCloseGossip();
SendRespecWipeConfirm(guid, 0, SpecResetType.Glyphs);
break;
case GossipOptionNpc.Transmogrify:
GetSession().SendOpenTransmogrifier(guid);
break;
case GossipOption.Mailbox:
GetSession().SendShowMailBox(guid);
default:
break;
}
@@ -7345,9 +7387,9 @@ namespace Game.Entities
}
//Helpers
public void AddGossipItem(GossipOptionIcon icon, string message, uint sender, uint action) { PlayerTalkClass.GetGossipMenu().AddMenuItem(-1, icon, message, sender, action, "", 0); }
public void AddGossipItem(GossipOptionNpc icon, string message, uint sender, uint action) { PlayerTalkClass.GetGossipMenu().AddMenuItem(-1, icon, message, sender, action, "", 0); }
public void AddGossipItem(uint menuId, uint menuItemId, uint sender, uint action) { PlayerTalkClass.GetGossipMenu().AddMenuItem(menuId, menuItemId, sender, action); }
public void ADD_GOSSIP_ITEM_EXTENDED(GossipOptionIcon icon, string message, uint sender, uint action, string boxmessage, uint boxmoney, bool coded) { PlayerTalkClass.GetGossipMenu().AddMenuItem(-1, icon, message, sender, action, boxmessage, boxmoney, coded); }
public void ADD_GOSSIP_ITEM_EXTENDED(GossipOptionNpc icon, string message, uint sender, uint action, string boxmessage, uint boxmoney, bool coded) { PlayerTalkClass.GetGossipMenu().AddMenuItem(-1, icon, message, sender, action, boxmessage, boxmoney, coded); }
// This fuction Sends the current menu to show to client, a - NPCTEXTID(uint32), b - npc guid(uint64)
public void SendGossipMenu(uint titleId, ObjectGuid objGUID) { PlayerTalkClass.SendGossipMenu(titleId, objGUID); }