This commit is contained in:
Lucca Faria Ferri 2023-01-21 22:18:16 -08:00
parent 9d7e315f2b
commit e9f11b04c8

View File

@ -68,15 +68,24 @@ namespace DiIiS_NA.GameServer.GSSystem.PlayerSystem
Logger Logger = new Logger("Conversation");
public event EventHandler ConversationEnded;
public int ConvPiggyBack { get { return asset.snoConvPiggyback; } }
public int ConvPiggyBack
{
get { return asset.snoConvPiggyback; }
}
public int SNOId = -1;
public ConversationTypes ConversationType { get { return asset.ConversationType; } }
public ConversationTypes ConversationType
{
get { return asset.ConversationType; }
}
private DiIiS_NA.Core.MPQ.FileFormats.Conversation asset
{
get
{
return (DiIiS_NA.Core.MPQ.FileFormats.Conversation)MPQStorage.Data.Assets[SNOGroup.Conversation][SNOId].Data;
return (DiIiS_NA.Core.MPQ.FileFormats.Conversation)MPQStorage.Data.Assets[SNOGroup.Conversation][SNOId]
.Data;
}
}
@ -94,12 +103,15 @@ namespace DiIiS_NA.GameServer.GSSystem.PlayerSystem
{
get
{
var node = from a in currentLineNode.ChildNodes where a.ClassFilter == player.Toon.VoiceClassID select a;
var node = from a in currentLineNode.ChildNodes
where a.ClassFilter == player.Toon.VoiceClassID
select a;
if (node.Count() == 0)
node = from a in currentLineNode.ChildNodes where a.ClassFilter == -1 select a;
if (node.Count() == 0) return 1;
return node.First().CompressedDisplayTimes.ElementAt((int)manager.ClientLanguage).Languages[player.Toon.VoiceClassID * 2 + (player.Toon.Gender == 0 ? 0 : 1)];
return node.First().CompressedDisplayTimes.ElementAt((int)manager.ClientLanguage)
.Languages[player.Toon.VoiceClassID * 2 + (player.Toon.Gender == 0 ? 0 : 1)];
}
}
@ -128,12 +140,16 @@ namespace DiIiS_NA.GameServer.GSSystem.PlayerSystem
case Speaker.None:
return null;
}
return null;
}
private ActorSystem.Actor GetActorBySNO(ActorSno sno)
{
ActorSystem.Actor SearchFunc(ActorSno a) => player.World.Actors.Values.Where(actor => actor.SNO == a && actor.IsRevealedToPlayer(player)).OrderBy((actor) => PowerMath.Distance2D(actor.Position, player.Position)).FirstOrDefault();
ActorSystem.Actor SearchFunc(ActorSno a) => player.World.Actors.Values
.Where(actor => actor.SNO == a && actor.IsRevealedToPlayer(player))
.OrderBy((actor) => PowerMath.Distance2D(actor.Position, player.Position)).FirstOrDefault();
//if (sno == 121208)
// sno = 4580; //hack
var result = SearchFunc(sno);
@ -153,7 +169,8 @@ namespace DiIiS_NA.GameServer.GSSystem.PlayerSystem
result = SearchFunc(sno);
if (result == null)
//return player;
return player.World.SpawnMonster(sno, new Vector3D(player.Position.X, player.Position.Y, player.Position.Z + 150));
return player.World.SpawnMonster(sno,
new Vector3D(player.Position.X, player.Position.Y, player.Position.Z + 150));
else
{
result.Reveal(player);
@ -231,7 +248,8 @@ namespace DiIiS_NA.GameServer.GSSystem.PlayerSystem
// rotate the primary speaker to face the secondary speaker
if (currentLineNode != null)
if (currentLineNode.LineSpeaker != Speaker.Player && currentLineNode.SpeakerTarget != Speaker.None)
if (currentLineNode.LineSpeaker != Speaker.Player &&
currentLineNode.SpeakerTarget != Speaker.None)
{
var speaker1 = GetSpeaker(currentLineNode.LineSpeaker);
var speaker2 = GetSpeaker(currentLineNode.SpeakerTarget);
@ -291,7 +309,8 @@ namespace DiIiS_NA.GameServer.GSSystem.PlayerSystem
Field2 = -1
});
if (asset.ConversationType != ConversationTypes.AmbientFloat && asset.ConversationType != ConversationTypes.GlobalFloat)
if (asset.ConversationType != ConversationTypes.AmbientFloat &&
asset.ConversationType != ConversationTypes.GlobalFloat)
player.CheckConversationCriteria(asset.Header.SNOId);
Logger.Trace("Handling conversation for Conversation: {0}", SNOId);
@ -310,6 +329,7 @@ namespace DiIiS_NA.GameServer.GSSystem.PlayerSystem
}
}
}
if (player.World.Game.SideQuestProgress.QuestTriggers.ContainsKey(SNOId)) //EnterLevelArea
{
var trigger = player.World.Game.SideQuestProgress.QuestTriggers[SNOId];
@ -325,6 +345,7 @@ namespace DiIiS_NA.GameServer.GSSystem.PlayerSystem
}
}
}
if (player.World.Game.SideQuestProgress.GlobalQuestTriggers.ContainsKey(SNOId))
{
var trigger = player.World.Game.SideQuestProgress.GlobalQuestTriggers[SNOId];
@ -353,7 +374,8 @@ namespace DiIiS_NA.GameServer.GSSystem.PlayerSystem
else if (SNOId == 208400) //Cow king
{
var portal = player.World.Game.GetWorld(WorldSno.trout_town).GetActorBySNO(ActorSno._g_portal_tentacle_trist);
var portal = player.World.Game.GetWorld(WorldSno.trout_town)
.GetActorBySNO(ActorSno._g_portal_tentacle_trist);
(portal as WhimsyshirePortal).Open();
}
@ -408,7 +430,8 @@ namespace DiIiS_NA.GameServer.GSSystem.PlayerSystem
.SetSuccess(true)
.SetIsFromCheat(false)
.SetRiftTier(plr.InGameClient.Game.NephalemGreaterLevel + 1)
.AddParticipantGameAccounts(D3.OnlineService.GameAccountHandle.CreateBuilder().SetId((uint)plr.Toon.GameAccount.BnetEntityId.Low).SetProgram(17459).SetRegion(1))
.AddParticipantGameAccounts(D3.OnlineService.GameAccountHandle.CreateBuilder()
.SetId((uint)plr.Toon.GameAccount.BnetEntityId.Low).SetProgram(17459).SetRegion(1))
.SetGoldReward(5000 * plr.Level)
.SetXpReward(50000 * (long)plr.Level)
.SetCompletionTimeMs(900 * 1000 - plr.InGameClient.Game.LastTieredRiftTimeout * 1000)
@ -452,7 +475,8 @@ namespace DiIiS_NA.GameServer.GSSystem.PlayerSystem
QuestStepComplete = D3.Quests.QuestStepComplete.CreateBuilder()
.SetIsQuestComplete(true)
.SetWasRewardAutoequipped(false)
.SetReward(D3.Quests.QuestReward.CreateBuilder().SetPlatinumGranted(1).SetGoldGranted(1000 * plr.Level).SetBonusXpGranted(10000 * (ulong)plr.Level))
.SetReward(D3.Quests.QuestReward.CreateBuilder().SetPlatinumGranted(1)
.SetGoldGranted(1000 * plr.Level).SetBonusXpGranted(10000 * (ulong)plr.Level))
.Build()
});
@ -473,6 +497,7 @@ namespace DiIiS_NA.GameServer.GSSystem.PlayerSystem
player.GrantCriteria(74987247265988);
}
}
//Таймер до закрытия
/*
plr.InGameClient.SendMessage(new DungeonFinderClosingMessage()
@ -504,8 +529,10 @@ namespace DiIiS_NA.GameServer.GSSystem.PlayerSystem
var HubWorld = player.InGameClient.Game.GetWorld(WorldSno.x1_tristram_adventure_mode_hub);
var NStone = HubWorld.GetActorBySNO(ActorSno._x1_openworld_lootrunobelisk_b);
bool Activated = true;
NStone.SetIdleAnimation(NStone.AnimationSet.TagMapAnimDefault[Core.Types.TagMap.AnimationSetKeys.IdleDefault]);
NStone.PlayActionAnimation(NStone.AnimationSet.TagMapAnimDefault[Core.Types.TagMap.AnimationSetKeys.Closing]);
NStone.SetIdleAnimation(
NStone.AnimationSet.TagMapAnimDefault[Core.Types.TagMap.AnimationSetKeys.IdleDefault]);
NStone.PlayActionAnimation(
NStone.AnimationSet.TagMapAnimDefault[Core.Types.TagMap.AnimationSetKeys.Closing]);
NStone.Attributes[GameAttribute.Team_Override] = (Activated ? -1 : 2);
NStone.Attributes[GameAttribute.Untargetable] = !Activated;
NStone.Attributes[GameAttribute.NPC_Is_Operatable] = Activated;
@ -515,7 +542,8 @@ namespace DiIiS_NA.GameServer.GSSystem.PlayerSystem
NStone.Attributes[GameAttribute.Immunity] = !Activated;
NStone.Attributes.BroadcastChangedIfRevealed();
foreach (var p in HubWorld.GetActorsBySNO(ActorSno._x1_openworld_lootrunportal, ActorSno._x1_openworld_tiered_rifts_portal))
foreach (var p in HubWorld.GetActorsBySNO(ActorSno._x1_openworld_lootrunportal,
ActorSno._x1_openworld_tiered_rifts_portal))
p.Destroy();
}
@ -547,7 +575,8 @@ namespace DiIiS_NA.GameServer.GSSystem.PlayerSystem
}
if (asset.RootTreeNodes[LineIndex].ConvNodeType == 4)
currentLineNode = asset.RootTreeNodes[LineIndex].ChildNodes[RandomHelper.Next(asset.RootTreeNodes[LineIndex].ChildNodes.Count)];
currentLineNode = asset.RootTreeNodes[LineIndex]
.ChildNodes[RandomHelper.Next(asset.RootTreeNodes[LineIndex].ChildNodes.Count)];
else
currentLineNode = asset.RootTreeNodes[LineIndex];
@ -562,10 +591,15 @@ namespace DiIiS_NA.GameServer.GSSystem.PlayerSystem
// TODO Actor id should be CurrentSpeaker.DynamicID not PrimaryNPC.ActorID. This is a workaround because no audio for the player is playing otherwise
player.InGameClient.SendMessage(new PlayConvLineMessage()
{
ActorID = GetSpeaker(currentLineNode.LineSpeaker).DynamicID(player), // GetActorBySNO(asset.SNOPrimaryNpc).DynamicID,
ActorID = GetSpeaker(currentLineNode.LineSpeaker)
.DynamicID(player), // GetActorBySNO(asset.SNOPrimaryNpc).DynamicID,
Field1 = new uint[9]
{
player.DynamicID(player), asset.SNOPrimaryNpc != -1 ? GetActorBySNO((ActorSno)asset.SNOPrimaryNpc).DynamicID(player) : 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF
player.DynamicID(player),
asset.SNOPrimaryNpc != -1
? GetActorBySNO((ActorSno)asset.SNOPrimaryNpc).DynamicID(player)
: 0xFFFFFFFF,
0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF
},
PlayLineParams = new PlayLineParams()
@ -581,7 +615,9 @@ namespace DiIiS_NA.GameServer.GSSystem.PlayerSystem
LineGender = -1,
AudioClass = (GameBalance.Class)player.Toon.VoiceClassID,
Gender = (player.Toon.Gender == 0) ? VoiceGender.Male : VoiceGender.Female,
TextClass = currentLineNode.LineSpeaker == Speaker.Player ? (GameBalance.Class)player.Toon.VoiceClassID : GameBalance.Class.None,
TextClass = currentLineNode.LineSpeaker == Speaker.Player
? (GameBalance.Class)player.Toon.VoiceClassID
: GameBalance.Class.None,
SNOSpeakerActor = (int)GetSpeaker(currentLineNode.LineSpeaker).SNO,
LineFlags = 0x00000000,
AnimationTag = currentLineNode.AnimationTag,
@ -597,13 +633,40 @@ namespace DiIiS_NA.GameServer.GSSystem.PlayerSystem
public class ConversationManager
{
Logger Logger = new Logger("ConversationManager");
internal enum Language { Invalid, Global, enUS, enGB, enSG, esES, esMX, frFR, itIT, deDE, koKR, ptBR, ruRU, zhCN, zTW, trTR, plPL, ptPT }
internal enum Language
{
Invalid,
Global,
enUS,
enGB,
enSG,
esES,
esMX,
frFR,
itIT,
deDE,
koKR,
ptBR,
ruRU,
zhCN,
zTW,
trTR,
plPL,
ptPT
}
private Player player;
private ConcurrentDictionary<int, Conversation> openConversations = new ConcurrentDictionary<int, Conversation>();
private ConcurrentDictionary<int, Conversation> openConversations =
new ConcurrentDictionary<int, Conversation>();
private int linesPlayedTotal = 0;
internal Language ClientLanguage { get { return Language.enUS; } }
internal Language ClientLanguage
{
get { return Language.enUS; }
}
internal int GetNextUniqueLineID()
{
@ -635,6 +698,7 @@ namespace DiIiS_NA.GameServer.GSSystem.PlayerSystem
Logger.Warn("Conversation not found: {0}", snoConversation);
return;
}
if (snoConversation != 131349)
if (!openConversations.ContainsKey(snoConversation))
{
@ -646,7 +710,9 @@ namespace DiIiS_NA.GameServer.GSSystem.PlayerSystem
newConversation.ConversationEnded += new EventHandler(ConversationEnded);
openConversations.TryAdd(snoConversation, newConversation);
#region События по началу диалогов
switch (snoConversation)
{
case 198199:
@ -654,6 +720,7 @@ namespace DiIiS_NA.GameServer.GSSystem.PlayerSystem
break;
}
#endregion
}
}
@ -664,7 +731,8 @@ namespace DiIiS_NA.GameServer.GSSystem.PlayerSystem
void ConversationEnded(object sender, EventArgs e)
{
Conversation conversation = sender as Conversation;
Logger.Trace(" (ConversationEnded) Sending a notify with type {0} and value {1}", conversation.ConversationType, conversation.SNOId);
Logger.Trace(" (ConversationEnded) Sending a notify with type {0} and value {1}",
conversation.ConversationType, conversation.SNOId);
//quests.Notify(QuestStepObjectiveType.HadConversation, conversation.SNOId); //deprecated
@ -673,7 +741,9 @@ namespace DiIiS_NA.GameServer.GSSystem.PlayerSystem
switch (conversation.SNOId)
{
#region Events after Dialogs
#region A1-Q2
case 17667:
//var BlacksmithQuest = player.InGameClient.Game.GetWorld(71150).GetActorBySNO(65036,true);
var world = player.InGameClient.Game.GetWorld(WorldSno.trdun_cain_intro);
@ -683,7 +753,8 @@ namespace DiIiS_NA.GameServer.GSSystem.PlayerSystem
cainBrains.Move(cainPath, facingAngle);
var a1Q2Wait1 = Task.Delay(7000).ContinueWith(delegate
{
var actor = world.GetActorsBySNO(ActorSno._trdun_cath_bookcaseshelf_door_reverse).Where(d => d.Visible).FirstOrDefault();
var actor = world.GetActorsBySNO(ActorSno._trdun_cath_bookcaseshelf_door_reverse)
.Where(d => d.Visible).FirstOrDefault();
(actor as Door).Open();
var a1Q2Wait2 = Task.Delay(2000).ContinueWith(delegate
@ -694,17 +765,23 @@ namespace DiIiS_NA.GameServer.GSSystem.PlayerSystem
});
break;
#endregion
#region A1-Q3
case 198292:
var blacksmithQuest = player.InGameClient.Game.GetWorld(WorldSno.trout_town).GetActorBySNO(ActorSno._pt_blacksmith_nonvendor, true);
var blacksmithQuest = player.InGameClient.Game.GetWorld(WorldSno.trout_town)
.GetActorBySNO(ActorSno._pt_blacksmith_nonvendor, true);
blacksmithQuest.WalkSpeed = 0.33f;
Vector3D firstPoint = new Vector3D(2905.856f, 2584.807f, 0.5997877f);
Vector3D secondPoint = new Vector3D(2790.396f, 2611.313f, 0.5997864f);
var firstfacingAngle = ActorSystem.Movement.MovementHelpers.GetFacingAngle(blacksmithQuest, firstPoint);
var firstfacingAngle =
ActorSystem.Movement.MovementHelpers.GetFacingAngle(blacksmithQuest, firstPoint);
var secondfacingAngle = ActorSystem.Movement.MovementHelpers.GetFacingAngle(blacksmithQuest, secondPoint);
var secondfacingAngle =
ActorSystem.Movement.MovementHelpers.GetFacingAngle(blacksmithQuest, secondPoint);
blacksmithQuest.Move(firstPoint, firstfacingAngle);
@ -715,8 +792,11 @@ namespace DiIiS_NA.GameServer.GSSystem.PlayerSystem
break;
#endregion
//168282
#region A1-Q4
case 168282:
var wrld = player.InGameClient.Game.GetWorld(WorldSno.a1trdun_level05_templar);
foreach (var wall in wrld.GetActorsBySNO(ActorSno._trdun_cath_bonewall_a_door))
@ -728,26 +808,29 @@ namespace DiIiS_NA.GameServer.GSSystem.PlayerSystem
wall.Attributes.BroadcastChangedIfRevealed();
wall.Destroy();
}
break;
case 17921:
var cryptwrld = player.InGameClient.Game.GetWorld(WorldSno.a1trdun_level07);
foreach (var ghost in cryptwrld.GetActorsBySNO(ActorSno._skeletonking_ghost))
ghost.Destroy();
break;
#endregion
#region A1-Q4 Event_DoK
case 139823: //Event_DoK_Kill.cnv
//kill the king
var leoricGhost = player.World.GetActorBySNO(ActorSno._skeletonking_leoricghost);
var lachdananGhost = player.World.GetActorBySNO(ActorSno._ghostknight3);
var swordPlace = player.World.GetActorBySNO(ActorSno._trdun_crypt_deathoftheking_sword_clickable);
var swordPlace =
player.World.GetActorBySNO(ActorSno._trdun_crypt_deathoftheking_sword_clickable);
lachdananGhost.Move(swordPlace.Position, ActorSystem.Movement.MovementHelpers.GetFacingAngle(lachdananGhost, swordPlace.Position));
lachdananGhost.Move(swordPlace.Position,
ActorSystem.Movement.MovementHelpers.GetFacingAngle(lachdananGhost, swordPlace.Position));
var listenerA1Q4Event1 = Task.Delay(4000).ContinueWith(delegate
{
StartConversation(139825);
});
var listenerA1Q4Event1 = Task.Delay(4000).ContinueWith(delegate { StartConversation(139825); });
break;
case 139825: //Event_DoK_Death.cnv
var leoricGhost1 = player.World.GetActorBySNO(ActorSno._skeletonking_leoricghost);
@ -764,8 +847,11 @@ namespace DiIiS_NA.GameServer.GSSystem.PlayerSystem
}
});
break;
#endregion
#region A1-SQ-Farmer
case 60179:
//player.InGameClient.Game.QuestManager.ClearQuests();
//player.InGameClient.Game.QuestManager.SetQuests();
@ -788,23 +874,34 @@ namespace DiIiS_NA.GameServer.GSSystem.PlayerSystem
var oldPit = player.World.GetActorsBySNO(ActorSno._fleshpitflyerspawner_b_event_farmambush);
foreach (var actor in oldPit)
player.World.Leave(actor);
var spawnerOfPits = player.World.GetActorsBySNO(ActorSno._spawner_fleshpitflyer_b_immediate);
var spawnerOfPits =
player.World.GetActorsBySNO(ActorSno._spawner_fleshpitflyer_b_immediate);
foreach (var actor in spawnerOfPits)
player.World.SpawnMonster(ActorSno._fleshpitflyerspawner_b_event_farmambush, actor.Position);
player.World.SpawnMonster(ActorSno._fleshpitflyerspawner_b_event_farmambush,
actor.Position);
var newPits = player.World.GetActorsBySNO(ActorSno._fleshpitflyerspawner_b_event_farmambush);
var newPits =
player.World.GetActorsBySNO(ActorSno._fleshpitflyerspawner_b_event_farmambush);
Logger.Debug("The flies are dead. The farmer can continue his work.");
}
break;
#endregion
#region A5
case 308393:
var npc = player.World.GetActorBySNO(ActorSno._x1_npc_westmarch_introguy) as ActorSystem.InteractiveNPC;
var npc =
player.World.GetActorBySNO(ActorSno._x1_npc_westmarch_introguy) as
ActorSystem.InteractiveNPC;
npc.Conversations.Clear();
npc.Attributes[GameAttribute.Conversation_Icon, 0] = 1;
npc.Attributes.BroadcastChangedIfRevealed();
break;
#endregion
#endregion
}
@ -820,12 +917,14 @@ namespace DiIiS_NA.GameServer.GSSystem.PlayerSystem
/// Returns true when the conversation playing finishes.
/// </summary>
private bool _conversationTrigger = false;
public bool ConversationRunning()
{
var status = _conversationTrigger;
_conversationTrigger = false;
return status;
}
/// <summary>
/// Update all open conversations
/// </summary>