Small changes

This commit is contained in:
Lucca Faria Ferri 2023-01-31 14:10:07 -08:00
parent ef89b0b732
commit 66f1423ecc
4 changed files with 173 additions and 158 deletions

View File

@ -204,6 +204,11 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem
public int? MarkerSetSNO { get; private set; } public int? MarkerSetSNO { get; private set; }
public bool Hidden = false; public bool Hidden = false;
// TODO: check if the following is correct: @iamdroppy
// {
// get => Attributes[GameAttribute.Hidden];
// set => Attributes[GameAttribute.Hidden] = value;
// }
public bool AdjustPosition = true; public bool AdjustPosition = true;
@ -239,7 +244,7 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem
ActorSNO = new SNOHandle(SNOGroup.Actor, (int)sno); ActorSNO = new SNOHandle(SNOGroup.Actor, (int)sno);
NameSNO = sno; NameSNO = sno;
//Logger.Info("Loaded actor {0}, id {1}, type {2}", this.ActorSNO.Name, this.DynamicID, this.ActorData.Type); //Logger.Info("Loaded actor {0}, id {1}, type {2}", this.ActorSNO.Name, this.DynamicID, this.ActorData.Type);
Quality = 0; //Quality = 0; - removed, 0 is default and you can't change the quality
HasLoot = true; HasLoot = true;
if (ActorData.TagMap.ContainsKey(ActorKeys.TeamID)) if (ActorData.TagMap.ContainsKey(ActorKeys.TeamID))
@ -369,7 +374,7 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem
CheckPointPosition = position; CheckPointPosition = position;
if (this is Player) if (this is Player)
world.BroadcastIfRevealed((ACDWorldPositionMessage), this); world.BroadcastIfRevealed(ACDWorldPositionMessage, this);
AfterChangeWorld(); AfterChangeWorld();
if (this is Player plr) if (this is Player plr)
@ -506,7 +511,7 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem
int radius = (int)Math.Pow(2, i); int radius = (int)Math.Pow(2, i);
for (int a = 0; a < 8; a++) for (int a = 0; a < 8; a++)
{ {
float angle = (float)((0.125f * a) * (Math.PI * 2)); float angle = (float)(0.125f * a * (Math.PI * 2));
Vector3D correctPosition = Position + new Vector3D((float)Math.Cos(angle) * radius, (float)Math.Sin(angle) * radius, 0); Vector3D correctPosition = Position + new Vector3D((float)Math.Cos(angle) * radius, (float)Math.Sin(angle) * radius, 0);
if (World.CheckLocationForFlag(correctPosition, DiIiS_NA.Core.MPQ.FileFormats.Scene.NavCellFlags.AllowWalk)) if (World.CheckLocationForFlag(correctPosition, DiIiS_NA.Core.MPQ.FileFormats.Scene.NavCellFlags.AllowWalk))
{ {
@ -557,7 +562,7 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem
World.BroadcastIfRevealed(plr => new PlayHitEffectMessage World.BroadcastIfRevealed(plr => new PlayHitEffectMessage
{ {
ActorID = DynamicID(plr), ActorID = DynamicID(plr),
HitDealer = (hitDealer.IsRevealedToPlayer(plr) ? hitDealer.DynamicID(plr) : DynamicID(plr)), HitDealer = hitDealer.IsRevealedToPlayer(plr) ? hitDealer.DynamicID(plr) : DynamicID(plr),
DamageType = hitEffect, DamageType = hitEffect,
CriticalDamage = false CriticalDamage = false
}, this); }, this);
@ -709,7 +714,7 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem
public void AddPercentHP(int percentage, bool GuidingLight = false) public void AddPercentHP(int percentage, bool GuidingLight = false)
{ {
float quantity = (percentage * Attributes[GameAttribute.Hitpoints_Max_Total]) / 100; float quantity = percentage * Attributes[GameAttribute.Hitpoints_Max_Total] / 100;
AddHP(quantity, GuidingLight); AddHP(quantity, GuidingLight);
} }
@ -762,7 +767,7 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem
public void SetUsable(bool activated) public void SetUsable(bool activated)
{ {
Attributes[GameAttribute.Team_Override] = (activated ? -1 : 2); Attributes[GameAttribute.Team_Override] = activated ? -1 : 2;
Attributes[GameAttribute.Untargetable] = !activated; Attributes[GameAttribute.Untargetable] = !activated;
Attributes[GameAttribute.NPC_Is_Operatable] = activated; Attributes[GameAttribute.NPC_Is_Operatable] = activated;
Attributes[GameAttribute.Operatable] = activated; Attributes[GameAttribute.Operatable] = activated;
@ -818,8 +823,8 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem
lock (player.RevealedObjects) lock (player.RevealedObjects)
{ {
if (Hidden || Dead || !Visible || World == null) return false; if (Hidden || Dead || !Visible || World == null) return false;
var mysticHiddenWorlds = new WorldSno[] { var mysticHiddenWorlds = new[] {
WorldSno.trdun_crypt_falsepassage_01, WorldSno.trdun_crypt_falsepassage_01,
WorldSno.trdun_crypt_falsepassage_02, WorldSno.trdun_crypt_falsepassage_02,
WorldSno.trdun_crypt_fields_flooded_memories_level01, WorldSno.trdun_crypt_fields_flooded_memories_level01,
@ -833,7 +838,8 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem
//Destroy Bonewall and Jondar if Exit_S on Second Level of Cathedral //Destroy Bonewall and Jondar if Exit_S on Second Level of Cathedral
if (World.SNO == WorldSno.a1trdun_level04 && (SNO == ActorSno._trdun_cath_bonewall_a_door || SNO == ActorSno._adventurer_d_templarintrounique)) return false; if (World.SNO == WorldSno.a1trdun_level04 && SNO is ActorSno._trdun_cath_bonewall_a_door or ActorSno._adventurer_d_templarintrounique)
return false;
if (SNO.IsUberWorldActor() && !World.SNO.IsUberWorld()) return false; if (SNO.IsUberWorldActor() && !World.SNO.IsUberWorld()) return false;
if (SNO.IsAdventureModeActor() && World.Game.CurrentAct != 3000) return false; if (SNO.IsAdventureModeActor() && World.Game.CurrentAct != 3000) return false;
@ -850,15 +856,15 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem
if (!(this is Item) && GetScenesInRange().Count > 0 && !GetScenesInRange().OrderBy(scene => PowerMath.Distance2D(scene.Position, Position)).First().IsRevealedToPlayer(player)) return false; if (!(this is Item) && GetScenesInRange().Count > 0 && !GetScenesInRange().OrderBy(scene => PowerMath.Distance2D(scene.Position, Position)).First().IsRevealedToPlayer(player)) return false;
uint objId = player.NewDynamicID(GlobalID, (this is Player && (!(this as Player).IsInPvPWorld || this == player)) ? (int)(this as Player).PlayerIndex : -1); uint objId = player.NewDynamicID(GlobalID, this is Player thisPlayer && (!thisPlayer.IsInPvPWorld || this == player) ? thisPlayer.PlayerIndex : -1);
player.RevealedObjects.Add(GlobalID, objId); player.RevealedObjects.Add(GlobalID, objId);
var gbidbank = new int[AffixList.Count]; var gbIdBank = new int[AffixList.Count];
int i = 0; int i = 0;
foreach (var affix in AffixList) foreach (var affix in AffixList)
{ {
gbidbank[i] = affix.AffixGbid; gbIdBank[i] = affix.AffixGbid;
i++; i++;
} }
/* /*
@ -873,13 +879,15 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem
var msg = ACDEnterKnown(player); var msg = ACDEnterKnown(player);
// normaly when we send acdenterknown for players own actor it's set to 0x09. But while sending the acdenterknown for another player's actor we should set it to 0x01. /raist // normaly when we send acdenterknown for players own actor it's set to 0x09. But while sending the acdenterknown for another player's actor we should set it to 0x01. /raist
if ((this is Player) && this != player) if (this is Player)
msg.Flags = 0x01; {
msg.Flags = this == player ? 0x09 : 0x01;
}
player.InGameClient.SendMessage(msg); player.InGameClient.SendMessage(msg);
// Collision Flags // Collision Flags
if (!((this is Projectile) || (this is Item))) if (this is not Projectile && this is not Item)
{ {
player.InGameClient.SendMessage(new ACDCollFlagsMessage player.InGameClient.SendMessage(new ACDCollFlagsMessage
{ {
@ -907,7 +915,7 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem
if (this is Player || this is NPC || this is Goblin) if (this is Player || this is NPC || this is Goblin)
player.InGameClient.SendMessage(new ACDCreateActorMessage(objId)); player.InGameClient.SendMessage(new ACDCreateActorMessage(objId));
TrickleMessage Trickle = new TrickleMessage() TrickleMessage trickle = new TrickleMessage()
{ {
ActorId = DynamicID(player), ActorId = DynamicID(player),
ActorSNO = (int)SNO, ActorSNO = (int)SNO,
@ -920,10 +928,10 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem
}; };
if (this is Player) if (this is Player playerTrickle)
Trickle.PlayerIndex = (this as Player).PlayerIndex; trickle.PlayerIndex = playerTrickle.PlayerIndex;
player.InGameClient.SendMessage(Trickle); player.InGameClient.SendMessage(trickle);
// Actor group // Actor group
@ -937,93 +945,103 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem
#region Special cases #region Special cases
// set idle animation for zombies in tristram - ZHRAAT
if (World.SNO == WorldSno.trout_town) switch (World.SNO)
{ {
if (Tags != null) // set idle animation for zombies in tristram - ZHRAAT
if (Tags.ContainsKey(MarkerKeys.Group1Hash)) case WorldSno.trout_town:
if (Tags[MarkerKeys.Group1Hash] == -1248096796)
PlayActionAnimation(AnimationSno.zombie_male_skinny_eating);
}
// set idle animation for workers
else if (World.SNO == WorldSno.trout_tristram_inn && SNO == ActorSno._omninpc_tristram_male_a)
PlayActionAnimation(AnimationSno.omninpc_male_hth_injured);
else if (SNO == ActorSno._leah)
player.InGameClient.SendMessage(new MessageSystem.Message.Definitions.Inventory.VisualInventoryMessage()
{ {
ActorID = DynamicID(player), if (Tags != null)
EquipmentList = new VisualEquipment() if (Tags.ContainsKey(MarkerKeys.Group1Hash))
{ if (Tags[MarkerKeys.Group1Hash] == -1248096796)
Equipment = new VisualItem[] PlayActionAnimation(AnimationSno.zombie_male_skinny_eating);
break;
}
// set idle animation for workers
case WorldSno.trout_tristram_inn when SNO == ActorSno._omninpc_tristram_male_a:
PlayActionAnimation(AnimationSno.omninpc_male_hth_injured);
break;
default:
{
if (SNO == ActorSno._leah)
player.InGameClient.SendMessage(new MessageSystem.Message.Definitions.Inventory.VisualInventoryMessage()
{ {
new() ActorID = DynamicID(player),
EquipmentList = new VisualEquipment()
{ {
GbId = -1, Equipment = new VisualItem[]
DyeType = 0, {
ItemEffectType = 0, new()
EffectLevel = -1, {
}, GbId = -1,
new() DyeType = 0,
{ ItemEffectType = 0,
GbId = -1, EffectLevel = -1,
DyeType = 0, },
ItemEffectType = 0, new()
EffectLevel = -1, {
}, GbId = -1,
new() DyeType = 0,
{ ItemEffectType = 0,
GbId = -1, EffectLevel = -1,
DyeType = 0, },
ItemEffectType = 0, new()
EffectLevel = -1, {
}, GbId = -1,
new() DyeType = 0,
{ ItemEffectType = 0,
GbId = -1, EffectLevel = -1,
DyeType = 0, },
ItemEffectType = 0, new()
EffectLevel = -1, {
}, GbId = -1,
new() DyeType = 0,
{ ItemEffectType = 0,
GbId = unchecked((int)-2091504072), EffectLevel = -1,
DyeType = 0, },
ItemEffectType = 0, new()
EffectLevel = -1, {
}, GbId = unchecked((int)-2091504072),
new() DyeType = 0,
{ ItemEffectType = 0,
GbId = -1,//0x6C3B0389, EffectLevel = -1,
DyeType = 0, },
ItemEffectType = 0, new()
EffectLevel = -1, {
}, GbId = -1,//0x6C3B0389,
new() DyeType = 0,
{ ItemEffectType = 0,
GbId = -1, EffectLevel = -1,
DyeType = 0, },
ItemEffectType = 0, new()
EffectLevel = -1, {
}, GbId = -1,
new() DyeType = 0,
{ ItemEffectType = 0,
GbId = -1, EffectLevel = -1,
DyeType = 0, },
ItemEffectType = 0, new()
EffectLevel = -1, {
}, GbId = -1,
} DyeType = 0,
} ItemEffectType = 0,
}); EffectLevel = -1,
},
}
}
});
break;
}
}
#endregion #endregion
if (this is NPC || this is InteractiveNPC) // if (this is NPC || this is InteractiveNPC)
{ // {
//.Contains<TagMap>(AnimationSetKeys.Idle) // //.Contains<TagMap>(AnimationSetKeys.Idle)
//if (this.AnimationSet.Animations.ContainsKey(AnimationSetKeys.Idle.ID)) // //if (this.AnimationSet.Animations.ContainsKey(AnimationSetKeys.Idle.ID))
// this.SetIdleAnimation(this.AnimationSet.TagMapAnimDefault[AnimationSetKeys.Idle]); // // this.SetIdleAnimation(this.AnimationSet.TagMapAnimDefault[AnimationSetKeys.Idle]);
//this.PlayAnimation(0, this.AnimationSet.TagMapAnimDefault[AnimationSetKeys.Idle]); // //this.PlayAnimation(0, this.AnimationSet.TagMapAnimDefault[AnimationSetKeys.Idle]);
} // }
//Logger.Trace("Reveal actor [{2}]{0} as {1}", this.GlobalID, objId, this.ActorSNO.Name); //Logger.Trace("Reveal actor [{2}]{0} as {1}", this.GlobalID, objId, this.ActorSNO.Name);

View File

@ -31,6 +31,7 @@ using DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations.Hirelings;
using DiIiS_NA.GameServer.GSSystem.GeneratorsSystem; using DiIiS_NA.GameServer.GSSystem.GeneratorsSystem;
using DiIiS_NA.GameServer.GSSystem.AISystem.Brains; using DiIiS_NA.GameServer.GSSystem.AISystem.Brains;
using System.Diagnostics; using System.Diagnostics;
using System.Runtime.CompilerServices;
using DiIiS_NA.Core.MPQ.FileFormats; using DiIiS_NA.Core.MPQ.FileFormats;
using DiIiS_NA.D3_GameServer.Core.Types.SNO; using DiIiS_NA.D3_GameServer.Core.Types.SNO;
using DiIiS_NA.D3_GameServer.GSSystem.GameSystem; using DiIiS_NA.D3_GameServer.GSSystem.GameSystem;
@ -408,8 +409,9 @@ namespace DiIiS_NA.GameServer.GSSystem.GameSystem
/// Executes an action to all players in the game. /// Executes an action to all players in the game.
/// </summary> /// </summary>
/// <param name="action">Action to execute</param> /// <param name="action">Action to execute</param>
public void BroadcastPlayers(Action<GameClient, Player> action) public void BroadcastPlayers(Action<GameClient, Player> action, [CallerMemberName] string methodName = "")
{ {
Logger.MethodTrace("Broadcasting to players", methodName);
foreach (var player in Players) foreach (var player in Players)
{ {
action(player.Key, player.Value); action(player.Key, player.Value);
@ -421,8 +423,9 @@ namespace DiIiS_NA.GameServer.GSSystem.GameSystem
/// </summary> /// </summary>
/// <param name="predicate">Predicate to check</param> /// <param name="predicate">Predicate to check</param>
/// <param name="action">Action to execute</param> /// <param name="action">Action to execute</param>
public void BroadcastPlayers(Func<GameClient, Player, bool> predicate, Action<GameClient, Player> action) public void BroadcastPlayers(Func<GameClient, Player, bool> predicate, Action<GameClient, Player> action, [CallerMemberName] string methodName = "")
{ {
Logger.MethodTrace("Broadcasting to players", methodName);
foreach (var player in Players.Where(s=>predicate(s.Key, s.Value))) foreach (var player in Players.Where(s=>predicate(s.Key, s.Value)))
{ {
action(player.Key, player.Value); action(player.Key, player.Value);
@ -433,8 +436,9 @@ namespace DiIiS_NA.GameServer.GSSystem.GameSystem
/// Executes an action to all worlds in the game. /// Executes an action to all worlds in the game.
/// </summary> /// </summary>
/// <param name="action">Action to execute</param> /// <param name="action">Action to execute</param>
public void BroadcastWorlds(Action<World> action) public void BroadcastWorlds(Action<World> action, [CallerMemberName] string methodName = "")
{ {
Logger.MethodTrace("Broadcasting to players", methodName);
foreach (var world in Worlds) foreach (var world in Worlds)
{ {
action(world); action(world);
@ -446,8 +450,9 @@ namespace DiIiS_NA.GameServer.GSSystem.GameSystem
/// </summary> /// </summary>
/// <param name="predicate">Predicate to check</param> /// <param name="predicate">Predicate to check</param>
/// <param name="action">Action to execute</param> /// <param name="action">Action to execute</param>
public void BroadcastWorlds(Func<World, bool> predicate, Action<World> action) public void BroadcastWorlds(Func<World, bool> predicate, Action<World> action, [CallerMemberName] string methodName = "")
{ {
Logger.MethodTrace("Broadcasting to players", methodName);
foreach (var world in Worlds.Where(predicate)) foreach (var world in Worlds.Where(predicate))
{ {
action(world); action(world);

View File

@ -3,6 +3,7 @@ using System.Collections.Generic;
using System.Collections.Immutable; using System.Collections.Immutable;
using System.Linq; using System.Linq;
using System.Reflection; using System.Reflection;
using D3.Quests;
using DiIiS_NA.Core.Extensions; using DiIiS_NA.Core.Extensions;
using DiIiS_NA.Core.Helpers.Hash; using DiIiS_NA.Core.Helpers.Hash;
using DiIiS_NA.Core.Helpers.Math; using DiIiS_NA.Core.Helpers.Math;
@ -193,56 +194,51 @@ namespace DiIiS_NA.D3_GameServer.GSSystem.GameSystem
{ {
SaveQuestProgress(true); SaveQuestProgress(true);
Logger.Trace($"$[white]$(Advance)$[/]$ Game {Game.GameId} Advanced to quest $[underline white]${Game.CurrentQuest}$[/]$, completed $[underline white]${Quests[Game.CurrentQuest].Completed}$[/]$"); Logger.Trace($"$[white]$(Advance)$[/]$ Game {Game.GameId} Advanced to quest $[underline white]${Game.CurrentQuest}$[/]$, completed $[underline white]${Quests[Game.CurrentQuest].Completed}$[/]$");
foreach (var player in Game.Players.Values) Game.BroadcastPlayers((client, player) =>
{ {
if (Game.CurrentQuest == 312429) return; // open world quest
int xpReward = (int)(Quests[Game.CurrentQuest].RewardXp * Game.XpModifier); int xpReward = (int)(Quests[Game.CurrentQuest].RewardXp * Game.XpModifier);
int goldReward = (int)(Quests[Game.CurrentQuest].RewardGold * Game.GoldModifier); int goldReward = (int)(Quests[Game.CurrentQuest].RewardGold * Game.GoldModifier);
if (Game.CurrentQuest != 312429) // open world quest player.InGameClient.SendMessage(new QuestStepCompleteMessage()
{ {
player.InGameClient.SendMessage(new QuestStepCompleteMessage() QuestStepComplete = QuestStepComplete.CreateBuilder()
{
QuestStepComplete = D3.Quests.QuestStepComplete.CreateBuilder()
.SetReward(D3.Quests.QuestReward.CreateBuilder() .SetReward(QuestReward.CreateBuilder()
.SetGoldGranted(goldReward) .SetGoldGranted(goldReward)
.SetXpGranted((ulong)xpReward) .SetXpGranted((ulong)xpReward)
.SetSnoQuest(Game.CurrentQuest) .SetSnoQuest(Game.CurrentQuest)
) )
.SetIsQuestComplete(true) .SetIsQuestComplete(true)
.Build() .Build()
//snoQuest = this.Game.CurrentQuest, });
//isQuestComplete = true, player.InGameClient.SendMessage(new GameServer.MessageSystem.Message.Definitions.Base.FloatingAmountMessage()
//rewardXp = xpReward, {
//rewardGold = goldReward Place = new WorldPlace()
});
player.InGameClient.SendMessage(new GameServer.MessageSystem.Message.Definitions.Base.FloatingAmountMessage()
{ {
Place = new WorldPlace() Position = player.Position,
{ WorldID = player.World.DynamicID(player),
Position = player.Position, },
WorldID = player.World.DynamicID(player),
},
Amount = xpReward, Amount = xpReward,
Type = GameServer.MessageSystem.Message.Definitions.Base.FloatingAmountMessage.FloatType.Experience, Type = GameServer.MessageSystem.Message.Definitions.Base.FloatingAmountMessage.FloatType.Experience,
}); });
player.InGameClient.SendMessage(new GameServer.MessageSystem.Message.Definitions.Base.FloatingAmountMessage() player.InGameClient.SendMessage(new GameServer.MessageSystem.Message.Definitions.Base.FloatingAmountMessage()
{
Place = new WorldPlace()
{ {
Place = new WorldPlace() Position = player.Position,
{ WorldID = player.World.DynamicID(player),
Position = player.Position, },
WorldID = player.World.DynamicID(player),
},
Amount = goldReward, Amount = goldReward,
Type = GameServer.MessageSystem.Message.Definitions.Base.FloatingAmountMessage.FloatType.Gold, Type = GameServer.MessageSystem.Message.Definitions.Base.FloatingAmountMessage.FloatType.Gold,
}); });
player.UpdateExp(xpReward); player.UpdateExp(xpReward);
player.Inventory.AddGoldAmount(goldReward); player.Inventory.AddGoldAmount(goldReward);
player.AddAchievementCounter(74987243307173, (uint)goldReward); player.AddAchievementCounter(74987243307173, (uint)goldReward);
player.CheckQuestCriteria(Game.CurrentQuest); player.CheckQuestCriteria(Game.CurrentQuest);
} });
};
} }
if (Quests[Game.CurrentQuest].NextQuest == -1) return; if (Quests[Game.CurrentQuest].NextQuest == -1) return;
@ -305,9 +301,9 @@ namespace DiIiS_NA.D3_GameServer.GSSystem.GameSystem
player.InGameClient.SendMessage(new QuestStepCompleteMessage() player.InGameClient.SendMessage(new QuestStepCompleteMessage()
{ {
QuestStepComplete = D3.Quests.QuestStepComplete.CreateBuilder() QuestStepComplete = QuestStepComplete.CreateBuilder()
.SetReward(D3.Quests.QuestReward.CreateBuilder() .SetReward(QuestReward.CreateBuilder()
.SetGoldGranted(goldReward) .SetGoldGranted(goldReward)
.SetXpGranted((ulong)xpReward) .SetXpGranted((ulong)xpReward)
.SetSnoQuest(Game.CurrentSideQuest) .SetSnoQuest(Game.CurrentSideQuest)
@ -416,13 +412,8 @@ namespace DiIiS_NA.D3_GameServer.GSSystem.GameSystem
public float QuestTimerEstimate = 0f; public float QuestTimerEstimate = 0f;
public void LaunchRiftQuestTimer(float duration, Action<int> onDone, int idSNO = 0) public void LaunchRiftQuestTimer(float duration, Action<int> onDone)
{ {
foreach (var player in Game.Players.Values)
{
};
QuestTimerEstimate = duration; QuestTimerEstimate = duration;
Game.QuestTimer = SteppedTickTimer.WaitSecondsStepped(Game, 1f, duration, new Action<int>((q) => Game.QuestTimer = SteppedTickTimer.WaitSecondsStepped(Game, 1f, duration, new Action<int>((q) =>
@ -435,7 +426,7 @@ namespace DiIiS_NA.D3_GameServer.GSSystem.GameSystem
public void LaunchQuestTimer(int questId, float duration, Action<int> onDone, int masterId = 0) public void LaunchQuestTimer(int questId, float duration, Action<int> onDone, int masterId = 0)
{ {
foreach (var player in Game.Players.Values) Game.BroadcastPlayers((client, player) =>
{ {
player.InGameClient.SendMessage(new QuestMeterMessage() player.InGameClient.SendMessage(new QuestMeterMessage()
{ {
@ -443,7 +434,7 @@ namespace DiIiS_NA.D3_GameServer.GSSystem.GameSystem
annMeter = masterId, annMeter = masterId,
flMeter = 1f flMeter = 1f
}); });
}; });
QuestTimerEstimate = duration; QuestTimerEstimate = duration;
@ -472,7 +463,7 @@ namespace DiIiS_NA.D3_GameServer.GSSystem.GameSystem
Quests[Game.CurrentQuest].Steps[Game.CurrentStep].Objectives[objId].Counter++; Quests[Game.CurrentQuest].Steps[Game.CurrentStep].Objectives[objId].Counter++;
var objective = Quests[Game.CurrentQuest].Steps[Game.CurrentStep].Objectives[objId]; var objective = Quests[Game.CurrentQuest].Steps[Game.CurrentStep].Objectives[objId];
foreach (var player in Game.Players.Values) Game.BroadcastPlayers((client, player) =>
player.InGameClient.SendMessage(new QuestCounterMessage() player.InGameClient.SendMessage(new QuestCounterMessage()
{ {
snoQuest = Game.CurrentQuest, snoQuest = Game.CurrentQuest,
@ -481,7 +472,7 @@ namespace DiIiS_NA.D3_GameServer.GSSystem.GameSystem
TaskIndex = objId, TaskIndex = objId,
Counter = objective.Counter, Counter = objective.Counter,
Checked = objective.Counter < objective.Limit ? 0 : 1, Checked = objective.Counter < objective.Limit ? 0 : 1,
}); }));
if (!Quests[Game.CurrentQuest].Steps[Game.CurrentStep].Objectives.Any(obj => obj.Counter < obj.Limit)) if (!Quests[Game.CurrentQuest].Steps[Game.CurrentStep].Objectives.Any(obj => obj.Counter < obj.Limit))
Advance(); Advance();
@ -1038,9 +1029,9 @@ namespace DiIiS_NA.D3_GameServer.GSSystem.GameSystem
}); });
player.InGameClient.SendMessage(new QuestStepCompleteMessage() player.InGameClient.SendMessage(new QuestStepCompleteMessage()
{ {
QuestStepComplete = D3.Quests.QuestStepComplete.CreateBuilder() QuestStepComplete = QuestStepComplete.CreateBuilder()
.SetIsQuestComplete(true) .SetIsQuestComplete(true)
.SetReward(D3.Quests.QuestReward.CreateBuilder() .SetReward(QuestReward.CreateBuilder()
.SetSnoQuest(BountySNOid) .SetSnoQuest(BountySNOid)
.SetXpGranted((ulong)xpReward) .SetXpGranted((ulong)xpReward)
.SetGoldGranted((int)goldReward) .SetGoldGranted((int)goldReward)

View File

@ -3745,9 +3745,9 @@ public class Player : Actor, IMessageConsumer, IUpdateable
WarpFadeInSecods = 0f WarpFadeInSecods = 0f
}); });
if (SkillSet.HasSkill(460757)) if (SkillSet.HasSkill(460757)) // P6_Necro_Devour
foreach (var skill in SkillSet.ActiveSkills) foreach (var skill in SkillSet.ActiveSkills)
if (skill.snoSkill == 460757) if (skill.snoSkill == 460757) // P6_Necro_Devour
if (skill.snoRune == 3) if (skill.snoRune == 3)
World.BuffManager.AddBuff(this, this, new P6_Necro_Devour_Aura()); World.BuffManager.AddBuff(this, this, new P6_Necro_Devour_Aura());
else else
@ -3810,7 +3810,7 @@ public class Player : Actor, IMessageConsumer, IUpdateable
AllBuffs.Clear(); AllBuffs.Clear();
BetweenWorlds = false; BetweenWorlds = false;
if (_CurrentHPValue != -1) if (Math.Abs(_CurrentHPValue - (-1)) > 0.0001)
{ {
Attributes[GameAttribute.Hitpoints_Cur] = _CurrentHPValue; Attributes[GameAttribute.Hitpoints_Cur] = _CurrentHPValue;
Attributes[GameAttribute.Resource_Cur, (int)Toon.HeroTable.PrimaryResource + 1] = _CurrentResourceValue; Attributes[GameAttribute.Resource_Cur, (int)Toon.HeroTable.PrimaryResource + 1] = _CurrentResourceValue;
@ -3828,7 +3828,8 @@ public class Player : Actor, IMessageConsumer, IUpdateable
#region hero-state #region hero-state
public void WTF() [Obsolete("Does this make sense?")]
private void WTF()
{ {
Attributes[GameAttribute.Power_Buff_0_Visual_Effect_None, 208468] = true; Attributes[GameAttribute.Power_Buff_0_Visual_Effect_None, 208468] = true;
Attributes[GameAttribute.Thorns_Fixed_Total, 0] = 0; Attributes[GameAttribute.Thorns_Fixed_Total, 0] = 0;