Extract Actor Sno ids into enum and replace int "magic constants"

This commit is contained in:
DeKaN 2022-09-10 14:52:14 +04:00
parent 197e61c442
commit 3017a74cac
No known key found for this signature in database
GPG Key ID: 8133F26EAA20C471
243 changed files with 25960 additions and 22635 deletions

File diff suppressed because it is too large Load Diff

View File

@ -90,7 +90,7 @@ namespace DiIiS_NA.GameServer.CommandManager
player.Position.Y + (float)RandomHelper.NextDouble() * 20f,
player.Position.Z);
var monster = player.World.SpawnMonster(actorSNO, position);
var monster = player.World.SpawnMonster((ActorSno)actorSNO, position);
}
return string.Format("Spawned {0} mobs with ActorSNO: {1}", amount, actorSNO);
@ -889,7 +889,7 @@ namespace DiIiS_NA.GameServer.CommandManager
var matches = invokerClient.InGameClient.Player.World.StartingPoints;
return matches.Aggregate(matches.Count >= 1 ? "Starting Points:\n" : "No match found.",
(current, match) => current + string.Format("[{0}] {1} - {2}\n", match.GlobalID.ToString("D6"), match.ActorSNO.Name, match.TargetId));
(current, match) => current + string.Format("[{0}] {1} - {2}\n", match.GlobalID.ToString("D6"), match.Name, match.TargetId));
}
[Command("weather", "Allows you to search for a Weather.\nUsage: lookup weather <pattern>")]

View File

@ -325,7 +325,7 @@ namespace DiIiS_NA.GameServer.Core
}
else
{
Logger.Error("Can't find slot in backpack to add item {0}", item.ActorSNO);
Logger.Error("Can't find slot in backpack to add item {0}", item.SNO);
if (_owner is Player)
_owner.World.DropItem((_owner as Player), item);
return false;
@ -342,7 +342,7 @@ namespace DiIiS_NA.GameServer.Core
}
else
{
Logger.Error("Can't find slot in backpack to add item {0}", item.ActorSNO);
Logger.Error("Can't find slot in backpack to add item {0}", item.SNO);
return false;
}
}

File diff suppressed because it is too large Load Diff

View File

@ -8,6 +8,7 @@ using System.Linq;
using DiIiS_NA.Core.Helpers.Math;
//Blizzless Project 2022
using DiIiS_NA.Core.MPQ;
using DiIiS_NA.D3_GameServer.Core.Types.SNO;
//Blizzless Project 2022
using DiIiS_NA.GameServer.Core.Types.Math;
//Blizzless Project 2022
@ -128,11 +129,12 @@ namespace DiIiS_NA.GameServer.GSSystem.AISystem.Brains
if (_powerDelay.TimedOut)
{
List<Actor> targets = (this.Body as Minion).Master.GetObjectsInRange<Monster>(40f).Where(m => !m.Dead &&
m.Visible &&
!m.ActorSNO.Name.ToLower().Contains("spawner") &&
!m.ActorSNO.Name.ToLower().Contains("_vo") &&
!m.ActorSNO.Name.ToLower().Contains("voiceo")).OrderBy(m => PowerMath.Distance2D(m.Position, this.Body.Position)).Cast<Actor>().ToList();
List<Actor> targets = (this.Body as Minion).Master
.GetObjectsInRange<Monster>(40f)
.Where(m => !m.Dead && m.Visible && m.SNO.IsTargetable())
.OrderBy(m => PowerMath.Distance2D(m.Position, this.Body.Position))
.Cast<Actor>()
.ToList();
if (this.Body.World.Game.PvP)
targets = (this.Body as Minion).Master.GetObjectsInRange<Player>(30f).Where(p => p.GlobalID != (this.Body as Minion).Master.GlobalID && p.Attributes[GameAttribute.TeamID] != (this.Body as Minion).Master.Attributes[GameAttribute.TeamID]).Cast<Actor>().ToList();
if (this.Body.World.IsPvP)
@ -211,7 +213,7 @@ namespace DiIiS_NA.GameServer.GSSystem.AISystem.Brains
{
if (!_warnedNoPowers && this.PresetPowers.Count == 0)
{
Logger.Debug("Minion \"{0}\" has no usable powers. ", this.Body.ActorSNO.Name);
Logger.Debug("Minion \"{0}\" has no usable powers. ", this.Body.Name);
_warnedNoPowers = true;
}

View File

@ -8,6 +8,7 @@ using System.Linq;
using DiIiS_NA.Core.Helpers.Math;
//Blizzless Project 2022
using DiIiS_NA.Core.MPQ;
using DiIiS_NA.D3_GameServer.Core.Types.SNO;
//Blizzless Project 2022
using DiIiS_NA.GameServer.Core.Types.SNO;
//Blizzless Project 2022
@ -85,9 +86,9 @@ namespace DiIiS_NA.GameServer.GSSystem.AISystem.Brains
public override void Think(int tickCounter)
{
if (this.Body.ActorSNO.Id == 255623 ||
this.Body.ActorSNO.Id == 210120 ||
this.Body.ActorSNO.Id == 208561)
if (this.Body.SNO == ActorSno._uber_siegebreakerdemon ||
this.Body.SNO == ActorSno._a4dun_garden_corruption_monster ||
this.Body.SNO == ActorSno._a4dun_garden_hellportal_pillar)
return;
//if(AttackedBy != null && TimeoutAttacked == null)
// TimeoutAttacked = new SecondsTickTimer(this.Body.World.Game, 3.0f);
@ -97,8 +98,7 @@ namespace DiIiS_NA.GameServer.GSSystem.AISystem.Brains
// TimeoutAttacked = null;
// AttackedBy = null;
// }
if (this.Body.ActorSNO.Id == 114527 //BelialVoiceover
)
if (this.Body.SNO == ActorSno._belialvoiceover) //BelialVoiceover
return;
if (this.Body.Hidden == true)
return;
@ -128,8 +128,8 @@ namespace DiIiS_NA.GameServer.GSSystem.AISystem.Brains
this.Body.Attributes[GameAttribute.Blind] ||
this.Body.Attributes[GameAttribute.Webbed] ||
this.Body.Disable ||
this.Body.World.BuffManager.GetFirstBuff<PowerSystem.Implementations.KnockbackBuff>(this.Body) != null ||
this.Body.World.BuffManager.GetFirstBuff<PowerSystem.Implementations.SummonedBuff>(this.Body) != null)
this.Body.World.BuffManager.GetFirstBuff<KnockbackBuff>(this.Body) != null ||
this.Body.World.BuffManager.GetFirstBuff<SummonedBuff>(this.Body) != null)
{
if (this.CurrentAction != null)
{
@ -195,9 +195,9 @@ namespace DiIiS_NA.GameServer.GSSystem.AISystem.Brains
.ToList();
else
targets = this.Body.GetActorsInRange(50f)
.Where(p => ((p is Player) && !p.Dead && p.Attributes[GameAttribute.Loading] == false && p.Attributes[GameAttribute.Is_Helper] == false && p.World.BuffManager.GetFirstBuff<PowerSystem.Implementations.ActorGhostedBuff>(p) == null)
.Where(p => ((p is Player) && !p.Dead && p.Attributes[GameAttribute.Loading] == false && p.Attributes[GameAttribute.Is_Helper] == false && p.World.BuffManager.GetFirstBuff<ActorGhostedBuff>(p) == null)
|| ((p is Minion) && !p.Dead && p.Attributes[GameAttribute.Is_Helper] == false)
|| (p is DesctructibleLootContainer && (p.ActorSNO.Name.ToLower().Contains("door") || p.ActorSNO.Name.ToLower().Contains("barricade")))
|| (p is DesctructibleLootContainer && p.SNO.IsDoorOrBarricade())
|| ((p is Hireling) && !p.Dead)
)
.OrderBy((actor) => PowerMath.Distance2D(actor.Position, this.Body.Position))
@ -241,7 +241,7 @@ namespace DiIiS_NA.GameServer.GSSystem.AISystem.Brains
}
else if (this.Body.WalkSpeed != 0)
{
if (this.Body.ActorSNO.Name.ToLower().Contains("woodwraith") || this.Body.ActorSNO.Name.ToLower().Contains("wasp"))
if (this.Body.SNO.IsWoodwraithOrWasp())
{
Logger.Trace("MoveToPointAction to target");
this.CurrentAction = new MoveToPointAction(
@ -268,9 +268,9 @@ namespace DiIiS_NA.GameServer.GSSystem.AISystem.Brains
}
else
{
switch (this.Body.ActorSNO.Id)
switch (this.Body.SNO)
{
case 89579:
case ActorSno._a1dun_leor_firewall2:
powerToUse = 223284;
break;
}
@ -309,7 +309,7 @@ namespace DiIiS_NA.GameServer.GSSystem.AISystem.Brains
targets = this.Body.GetActorsInRange(50f)
.Where(p => ((p is LorathNahr_NPC) && !p.Dead)
|| ((p is CaptainRumford) && !p.Dead)
|| (p is DesctructibleLootContainer && (p.ActorSNO.Name.ToLower().Contains("door") || p.ActorSNO.Name.ToLower().Contains("barricade")))
|| (p is DesctructibleLootContainer && p.SNO.IsDoorOrBarricade())
|| ((p is Cain) && !p.Dead))
.OrderBy((actor) => PowerMath.Distance2D(actor.Position, this.Body.Position))
.Cast<Actor>()
@ -340,7 +340,7 @@ namespace DiIiS_NA.GameServer.GSSystem.AISystem.Brains
_target = targets.First();
}
foreach (var tar in targets)
if (tar is DesctructibleLootContainer && (tar.ActorSNO.Name.ToLower().Contains("door") || tar.ActorSNO.Name.ToLower().Contains("barricade")) && tar.ActorSNO.Id != 81699)
if (tar is DesctructibleLootContainer && tar.SNO.IsDoorOrBarricade() && tar.SNO != ActorSno._trout_wagon_barricade)
{ _target = tar; break; }
}
else
@ -386,7 +386,7 @@ namespace DiIiS_NA.GameServer.GSSystem.AISystem.Brains
}
else if (this.Body.WalkSpeed != 0)
{
if (this.Body.ActorSNO.Name.ToLower().Contains("woodwraith") || this.Body.ActorSNO.Name.ToLower().Contains("wasp"))
if (this.Body.SNO.IsWoodwraithOrWasp())
{
Logger.Trace("MoveToPointAction to target");
this.CurrentAction = new MoveToPointAction(
@ -466,8 +466,7 @@ namespace DiIiS_NA.GameServer.GSSystem.AISystem.Brains
{
if (!_warnedNoPowers && this.PresetPowers.Count == 0)
{
Logger.Info("Monster \"{0}\" has no usable powers. {1} are defined in mpq data.",
this.Body.ActorSNO.Name, _mpqPowerCount);
Logger.Info("Monster \"{0}\" has no usable powers. {1} are defined in mpq data.", this.Body.Name, _mpqPowerCount);
_warnedNoPowers = true;
}

View File

@ -62,6 +62,16 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem
/// ActorSNO.
/// </summary>
public SNOHandle ActorSNO { get; private set; }
public ActorSno SNO
{
get { return (ActorSno)ActorSNO.Id; }
}
public string Name
{
get { return ActorSNO.Name; }
}
/// <summary>
/// Gets or sets the sno of the actor used to identify the actor to the player
@ -69,7 +79,7 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem
/// There are few exceptions though like the Inn_Zombies that have both.
/// Used by ACDEnterKnown to name the actor.
/// </summary>
public int NameSNOId { get; set; }
public ActorSno NameSNO { get; set; }
public bool Disable = false;
@ -191,7 +201,7 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem
{
get
{
return (DiIiS_NA.Core.MPQ.FileFormats.Actor)DiIiS_NA.Core.MPQ.MPQStorage.Data.Assets[SNOGroup.Actor][this.ActorSNO.Id].Data;
return (DiIiS_NA.Core.MPQ.FileFormats.Actor)DiIiS_NA.Core.MPQ.MPQStorage.Data.Assets[SNOGroup.Actor][(int)this.SNO].Data;
}
}
@ -236,9 +246,9 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem
/// Creates a new actor.
/// </summary>
/// <param name="world">The world that initially belongs to.</param>
/// <param name="snoId">SNOId of the actor.</param>
/// <param name="sno">SNOId of the actor.</param>
/// <param name="tags">TagMapEntry dictionary read for the actor from MPQ's..</param>
protected Actor(World world, int snoId, TagMap tags, bool isMarker = false)
protected Actor(World world, ActorSno sno, TagMap tags, bool isMarker = false)
: base(world, world.IsPvP ? World.NewActorPvPID : world.Game.NewActorGameID)
{
this.Tags = tags;
@ -255,8 +265,8 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem
// if (this.ActorData.AnimSetSNO != -1)
// this.AnimationSet = (Mooege.Common.MPQ.FileFormats.AnimSet)Mooege.Common.MPQ.MPQStorage.Data.Assets[SNOGroup.AnimSet][this.ActorData.AnimSetSNO].Data;
this.ActorSNO = new SNOHandle(SNOGroup.Actor, snoId);
this.NameSNOId = snoId;
this.ActorSNO = new SNOHandle(SNOGroup.Actor, (int)sno);
this.NameSNO = sno;
//Logger.Info("Loaded actor {0}, id {1}, type {2}", this.ActorSNO.Name, this.DynamicID, this.ActorData.Type);
this.Quality = 0;
this.HasLoot = true;
@ -283,9 +293,9 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem
/// Creates a new actor.
/// </summary>
/// <param name="world">The world that initially belongs to.</param>
/// <param name="snoId">SNOId of the actor.</param>
protected Actor(World world, int snoId)
: this(world, snoId, null)
/// <param name="sno">SNOId of the actor.</param>
protected Actor(World world, ActorSno sno)
: this(world, sno, null)
{ }
protected virtual void quest_OnQuestProgress() // erekose changed from protected to public
@ -306,7 +316,7 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem
/// </summary>
public override void Destroy()
{
if (this.ActorSNO.Id == 454066)
if (this.SNO == ActorSno._p6_necro_corpse_flesh)
if (World != null)
foreach (var plr in World.Game.Players.Values)
if (plr.SkillSet.HasPassive(208594) && DiIiS_NA.Core.Helpers.Math.RandomHelper.Next(0,100) > 45)
@ -328,15 +338,16 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem
public virtual void EnterWorld(Vector3D position)
{
var Quest = DiIiS_NA.Core.MPQ.MPQStorage.Data.Assets[Core.Types.SNO.SNOGroup.Quest][74128];
var Quest = DiIiS_NA.Core.MPQ.MPQStorage.Data.Assets[SNOGroup.Quest][74128];
if (this.World != null)
if (this.World.GetActorsBySNO(this.ActorSNO.Id).Count > 0)
{
int count = this.World.GetActorsBySNO(this.ActorSNO.Id).Count;
{
int count = this.World.GetActorsBySNO(this.SNO).Count;
if (count > 0)
NumberInWorld = count;
}
if (this.Spawned)
}
if (this.Spawned)
return;
this.Position = position;
@ -423,7 +434,7 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem
(minion as Minion).Brain.DeActivate();
(this as Player).Followers.Remove(fol);
minion.ChangeWorld(world, position);
(this as Player).Followers.Add(minion.GlobalID, minion.ActorSNO.Id);
(this as Player).Followers.Add(minion.GlobalID, minion.SNO);
(minion as Minion).Brain.Activate();
}
}
@ -823,14 +834,14 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem
return new ACDEnterKnownMessage
{
ActorID = this.DynamicID(plr),
ActorSNOId = this.ActorSNO.Id,
ActorSNOId = (int)this.SNO,
Flags = this.Field2,
LocationType = this.HasWorldLocation ? 0 : 1,
WorldLocation = this.HasWorldLocation ? this.WorldLocationMessage() : null,
InventoryLocation = this.HasWorldLocation ? null : this.InventoryLocationMessage(plr),
GBHandle = this.GBHandle,
snoGroup = this.Field7,
snoHandle = this.NameSNOId,
snoHandle = (int)this.NameSNO,
Quality = this.Quality,
LookLinkIndex = this.Field10,
snoAmbientOcclusionOverrideTex = null,
@ -861,25 +872,21 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem
WorldSno.trdun_crypt_skeletonkingcrown_02,
};
//Leave Miriam in Crypt
if (this.ActorSNO.Id == 175310 && mysticHiddenWorlds.Contains(World.SNO)) return false;
if (this.SNO == ActorSno._pt_mystic_novendor_nonglobalfollower && mysticHiddenWorlds.Contains(World.SNO)) return false;
//Destroy Bonewall and Jondar if Exit_S on Second Level of Cathedral
if (World.SNO == WorldSno.a1trdun_level04 && (this.ActorSNO.Id == 109209 || this.ActorSNO.Id == 86624)) return false;
if (World.SNO == WorldSno.a1trdun_level04 && (this.SNO == ActorSno._trdun_cath_bonewall_a_door || this.SNO == ActorSno._adventurer_d_templarintrounique)) return false;
if (this.ActorSNO.Name.Contains("Uber") && !this.World.SNO.IsUberWorld()) return false;
if (this.ActorSNO.Name.Contains("AdventureMode") && this.World.Game.CurrentAct != 3000) return false;
if (this.ActorSNO.Name.Contains("ScriptedSequenceOnly")) return false;
if (this.SNO.IsUberWorldActor() && !this.World.SNO.IsUberWorld()) return false;
if (this.SNO.IsAdventureModeActor() && this.World.Game.CurrentAct != 3000) return false;
if (this.SNO == ActorSno._x1_adria_boss_scriptedsequenceonly) return false;
if (player.RevealedObjects.ContainsKey(this.GlobalID)) return false; // already revealed
if (player.World == null) return false;
if (this.ActorSNO.Id == 218339)
if (this.World.SNO == WorldSno.trout_town)
if (this.CurrentScene.SceneSNO.Id == 33348)
if (this.Position.X < 2896)
return false;
if (this.SNO == ActorSno._zombieskinny_custom_a && this.World.SNO == WorldSno.trout_town && this.CurrentScene.SceneSNO.Id == 33348 && this.Position.X < 2896) return false;
if (!(this is Item) && player.World.GlobalID != this.World.GlobalID) return false;
@ -946,7 +953,7 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem
TrickleMessage Trickle = new TrickleMessage()
{
ActorId = this.DynamicID(player),
ActorSNO = this.ActorSNO.Id,
ActorSNO = (int)this.SNO,
WorldLocation = new WorldPlace()
{
WorldID = this.World.GlobalID,
@ -982,66 +989,66 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem
this.PlayActionAnimation(11514);
}
//Задаём идл для работяг
else if (this.World.SNO == WorldSno.trout_tristram_inn & this.ActorSNO.Id == 84529)
else if (this.World.SNO == WorldSno.trout_tristram_inn && this.SNO == ActorSno._omninpc_tristram_male_a)
this.PlayActionAnimation(102329);
else if (this.ActorSNO.Id == 4580)
else if (this.SNO == ActorSno._leah)
player.InGameClient.SendMessage(new MessageSystem.Message.Definitions.Inventory.VisualInventoryMessage()
{
ActorID = this.DynamicID(player),
EquipmentList = new MessageSystem.Message.Fields.VisualEquipment()
EquipmentList = new VisualEquipment()
{
Equipment = new MessageSystem.Message.Fields.VisualItem[]
Equipment = new VisualItem[]
{
new MessageSystem.Message.Fields.VisualItem()
new VisualItem()
{
GbId = -1,
DyeType = 0,
ItemEffectType = 0,
EffectLevel = -1,
},
new MessageSystem.Message.Fields.VisualItem()
new VisualItem()
{
GbId = -1,
DyeType = 0,
ItemEffectType = 0,
EffectLevel = -1,
},
new MessageSystem.Message.Fields.VisualItem()
new VisualItem()
{
GbId = -1,
DyeType = 0,
ItemEffectType = 0,
EffectLevel = -1,
},
new MessageSystem.Message.Fields.VisualItem()
new VisualItem()
{
GbId = -1,
DyeType = 0,
ItemEffectType = 0,
EffectLevel = -1,
},
new MessageSystem.Message.Fields.VisualItem()
new VisualItem()
{
GbId = unchecked((int)-2091504072),
DyeType = 0,
ItemEffectType = 0,
EffectLevel = -1,
},
new MessageSystem.Message.Fields.VisualItem()
new VisualItem()
{
GbId = -1,//0x6C3B0389,
DyeType = 0,
ItemEffectType = 0,
EffectLevel = -1,
},
new MessageSystem.Message.Fields.VisualItem()
new VisualItem()
{
GbId = -1,
DyeType = 0,
ItemEffectType = 0,
EffectLevel = -1,
},
new MessageSystem.Message.Fields.VisualItem()
new VisualItem()
{
GbId = -1,
DyeType = 0,
@ -1329,20 +1336,20 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem
int snoQuestRange = Tags[MarkerKeys.QuestRange].Id;
if (DiIiS_NA.Core.MPQ.MPQStorage.Data.Assets[SNOGroup.QuestRange].ContainsKey(snoQuestRange))
_questRange = DiIiS_NA.Core.MPQ.MPQStorage.Data.Assets[SNOGroup.QuestRange][snoQuestRange].Data as DiIiS_NA.Core.MPQ.FileFormats.QuestRange;
else Logger.Debug("Actor {0} GlobalID {1} is tagged with unknown QuestRange {2}", NameSNOId, GlobalID, snoQuestRange);
else Logger.Debug("Actor {0} GlobalID {1} is tagged with unknown QuestRange {2}", NameSNO, GlobalID, snoQuestRange);
}
if (Tags.ContainsKey(MarkerKeys.ConversationList) && WorldGenerator.DefaultConversationLists.ContainsKey(this.ActorSNO.Id))
if (Tags.ContainsKey(MarkerKeys.ConversationList) && WorldGenerator.DefaultConversationLists.ContainsKey((int)this.SNO))
{
int snoConversationList = WorldGenerator.DefaultConversationLists[this.ActorSNO.Id];//Tags[MarkerKeys.ConversationList].Id;
int snoConversationList = WorldGenerator.DefaultConversationLists[(int)this.SNO];//Tags[MarkerKeys.ConversationList].Id;
Logger.Trace(" (ReadTags) actor {0} GlobalID {2} has a conversation list {1}", NameSNOId, snoConversationList, GlobalID);
Logger.Trace(" (ReadTags) actor {0} GlobalID {2} has a conversation list {1}", NameSNO, snoConversationList, GlobalID);
if (DiIiS_NA.Core.MPQ.MPQStorage.Data.Assets[SNOGroup.ConversationList].ContainsKey(snoConversationList))
ConversationList = DiIiS_NA.Core.MPQ.MPQStorage.Data.Assets[SNOGroup.ConversationList][snoConversationList].Data as DiIiS_NA.Core.MPQ.FileFormats.ConversationList;
else
if (snoConversationList != -1)
Logger.Warn("Actor {0} - Conversation list {1} not found!", NameSNOId, snoConversationList);
Logger.Warn("Actor {0} - Conversation list {1} not found!", NameSNO, snoConversationList);
}
@ -1402,7 +1409,7 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem
public override string ToString()
{
return string.Format("[Actor] [Type: {0}] SNOId:{1} GlobalId: {2} Position: {3} Name: {4}", this.ActorType, this.ActorSNO.Id, this.GlobalID, this.Position, this.ActorSNO.Name);
return string.Format("[Actor] [Type: {0}] SNOId:{1} GlobalId: {2} Position: {3} Name: {4}", this.ActorType, this.SNO, this.GlobalID, this.Position, this.Name);
}
}

View File

@ -2,6 +2,7 @@
using DiIiS_NA.Core.Logging;
//Blizzless Project 2022
using DiIiS_NA.Core.MPQ;
using DiIiS_NA.D3_GameServer.Core.Types.SNO;
//Blizzless Project 2022
using DiIiS_NA.GameServer.Core.Types.Math;
//Blizzless Project 2022
@ -25,45 +26,47 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem
{
public static class ActorFactory
{
private static readonly Dictionary<int, Type> SNOHandlers = new Dictionary<int, Type>();
private static readonly Dictionary<ActorSno, Type> SNOHandlers = new Dictionary<ActorSno, Type>();
private static Logger Logger = new Logger("ActorFactory");
static ActorFactory()
{
LoadSNOHandlers();
}
SNOHandlers = Assembly.GetExecutingAssembly().GetTypes()
.Where(x => x.IsSubclassOf(typeof(Actor)))
.Select(x => new { Type = x, Attribute = x.GetCustomAttributes<HandledSNOAttribute>(true).FirstOrDefault() })
.Where(x => x.Attribute != null)
.SelectMany(x => x.Attribute.SNOIds.Select(a => new { x.Type, Sno = a }))
.ToDictionary(x => x.Sno, x => x.Type);
}
public static void LazyCreate(World world, int snoId, TagMap tags, Vector3D spawn, Action<Actor, Vector3D> OnCreate)
public static void LazyCreate(World world, ActorSno sno, TagMap tags, Vector3D spawn, Action<Actor, Vector3D> OnCreate)
{
var actor = Create(world, snoId, tags);
var actor = Create(world, sno, tags);
if (actor != null)
OnCreate.Invoke(actor, spawn);
}
public static Actor Create(World world, int snoId, TagMap tags)
public static Actor Create(World world, ActorSno sno, TagMap tags)
{
if (!MPQStorage.Data.Assets[SNOGroup.Actor].ContainsKey(snoId))
if (!MPQStorage.Data.Assets[SNOGroup.Actor].ContainsKey((int)sno))
{
//Logger.Warn("Actor asset not found, Id: {0}", snoId);
return null;
}
switch (snoId)
switch (sno)
{
case 6572:
case 139454:
case 139456:
case 170324:
case 170325:
case 495:
case 496:
int variable = DiIiS_NA.Core.Helpers.Math.RandomHelper.Next(0, 3);
switch (variable)
case ActorSno._woodwraith_a_01:
case ActorSno._woodwraith_a_02:
case ActorSno._woodwraith_a_03:
case ActorSno._woodwraith_b_01:
case ActorSno._woodwraith_b_02:
case ActorSno._woodwraith_b_03:
case ActorSno._woodwraith_unique_a:
switch (DiIiS_NA.Core.Helpers.Math.RandomHelper.Next(0, 3) / 2)
{
case 0: snoId = 470241; break;
case 1: snoId = 470241; break;
case 2: snoId = 430928; break;
case 3: snoId = 430928; break;
case 0: sno = ActorSno._ls_woodwraith; break;
case 1: sno = ActorSno._p4_woodwraith_a; break;
}
break;
}
@ -78,23 +81,23 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem
if (world.Game.CurrentAct == 3000 && !world.IsPvP
&& tags.ContainsKey(MarkerKeys.StoryModeOnly)
&& tags[MarkerKeys.StoryModeOnly] == 1
&& snoId != 6442) //only-Adventure Mode
&& sno != ActorSno._waypoint) //only-Adventure Mode
return null;
if (tags.ContainsKey(MarkerKeys.RiftOnly) && tags[MarkerKeys.RiftOnly] == 1) //Rift Mode
return null;
var actorAsset = MPQStorage.Data.Assets[SNOGroup.Actor][snoId];
var actorAsset = MPQStorage.Data.Assets[SNOGroup.Actor][(int)sno];
var actorData = actorAsset.Data as DiIiS_NA.Core.MPQ.FileFormats.Actor;
if (actorData == null)
{
Logger.Warn("Actor data not found, Id: {0}", snoId);
Logger.Warn("Actor data not found, Id: {0}", sno);
return null;
}
if (actorData.Type == ActorType.Invalid)
{
Logger.Warn("Actor type is Invalid, Id: {0}", snoId);
Logger.Warn("Actor type is Invalid, Id: {0}", sno);
return null;
}
@ -104,14 +107,14 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem
}
// see if we have an implementation for actor.
if (SNOHandlers.ContainsKey(snoId))
return (Actor)Activator.CreateInstance(SNOHandlers[snoId], new object[] { world, snoId, tags });
if (SNOHandlers.ContainsKey(sno))
return (Actor)Activator.CreateInstance(SNOHandlers[sno], new object[] { world, sno, tags });
switch (actorData.Type)
{
case ActorType.Monster:
if (tags.ContainsKey(MarkerKeys.ConversationList))
return new InteractiveNPC(world, snoId, tags);
return new InteractiveNPC(world, sno, tags);
else
if (!MPQStorage.Data.Assets[SNOGroup.Monster].ContainsKey(actorData.MonsterSNO))
return null;
@ -119,29 +122,29 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem
var monsterAsset = MPQStorage.Data.Assets[SNOGroup.Monster][actorData.MonsterSNO];
var monsterData = monsterAsset.Data as DiIiS_NA.Core.MPQ.FileFormats.Monster;
if (monsterData.Type == DiIiS_NA.Core.MPQ.FileFormats.Monster.MonsterType.Breakable)
return new Gizmo(world, snoId, tags);
return new Gizmo(world, sno, tags);
if (monsterData.Type == DiIiS_NA.Core.MPQ.FileFormats.Monster.MonsterType.Ally ||
monsterData.Type == DiIiS_NA.Core.MPQ.FileFormats.Monster.MonsterType.Helper ||
monsterData.Type == DiIiS_NA.Core.MPQ.FileFormats.Monster.MonsterType.Scenery)
return new NPC(world, snoId, tags);
return new NPC(world, sno, tags);
else
if (actorAsset.Name.ToLower().Contains("unique"))
return new Unique(world, snoId, tags);
return new Unique(world, sno, tags);
else
return new Monster(world, snoId, tags);
return new Monster(world, sno, tags);
case ActorType.Gizmo:
switch (actorData.TagMap[ActorKeys.GizmoGroup])
{
case GizmoGroup.LootContainer:
return new LootContainer(world, snoId, tags);
return new LootContainer(world, sno, tags);
case GizmoGroup.Door:
return new Door(world, snoId, tags);
return new Door(world, sno, tags);
case GizmoGroup.DestructibleLootContainer:
return new DesctructibleLootContainer(world, snoId, true, tags);
return new DesctructibleLootContainer(world, sno, true, tags);
case GizmoGroup.Destructible:
case GizmoGroup.Passive:
case GizmoGroup.Barricade:
return new DesctructibleLootContainer(world, snoId, false, tags);
return new DesctructibleLootContainer(world, sno, false, tags);
case GizmoGroup.Portal:
//Prevent Development Hell portal from showing
if (tags.ContainsKey(MarkerKeys.DestinationWorld) && tags[MarkerKeys.DestinationWorld].Id == 222591)
@ -149,37 +152,37 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem
if (tags.ContainsKey(MarkerKeys.DestinationWorld) && tags[MarkerKeys.DestinationWorld].Id == 443346)
return null;
else
return new Portal(world, snoId, tags);
return new Portal(world, sno, tags);
case GizmoGroup.BossPortal:
return new BossPortal(world, snoId, tags);
return new BossPortal(world, sno, tags);
case GizmoGroup.Readable:
return new Readable(world, snoId, tags);
return new Readable(world, sno, tags);
case GizmoGroup.Banner:
return new Banner(world, snoId, tags);
return new Banner(world, sno, tags);
case GizmoGroup.CheckPoint:
return new Checkpoint(world, snoId, tags);
return new Checkpoint(world, sno, tags);
case GizmoGroup.Waypoint:
return new Waypoint(world, snoId, tags);
return new Waypoint(world, sno, tags);
case GizmoGroup.Savepoint:
return new Savepoint(world, snoId, tags);
return new Savepoint(world, sno, tags);
case GizmoGroup.ProximityTriggered:
return new ProximityTriggeredGizmo(world, snoId, tags);
return new ProximityTriggeredGizmo(world, sno, tags);
case GizmoGroup.Shrine:
return new Shrine(world, snoId, tags);
return new Shrine(world, sno, tags);
case GizmoGroup.Healthwell:
return new Healthwell(world, snoId, tags);
return new Healthwell(world, sno, tags);
case GizmoGroup.ExpPool:
return new XPPool(world, snoId, tags);
return new XPPool(world, sno, tags);
case GizmoGroup.StartLocations:
return new StartingPoint(world, snoId, tags);
return new StartingPoint(world, sno, tags);
case GizmoGroup.HearthPortal:
return new HearthPortal(world, snoId, tags);
return new HearthPortal(world, sno, tags);
case GizmoGroup.DungeonStonePortal:
return new DungeonStonePortal(world, snoId, tags);
return new DungeonStonePortal(world, sno, tags);
case GizmoGroup.Headstone:
return new Headstone(world, snoId, tags);
return new Headstone(world, sno, tags);
case GizmoGroup.Spawner:
return new Spawner(world, snoId, tags);
return new Spawner(world, sno, tags);
case GizmoGroup.GateGizmo:
case GizmoGroup.ActChangeTempObject:
@ -194,30 +197,30 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem
case GizmoGroup.ScriptObject:
case GizmoGroup.LootRunObelisk:
case GizmoGroup.Unknown:
return CreateGizmo(world, snoId, tags);
return CreateGizmo(world, sno, tags);
default:
#if DEBUG
Logger.Warn("Unknown gizmo group {0}, id {1}", actorData.TagMap[ActorKeys.GizmoGroup], snoId);
Logger.Warn("Unknown gizmo group {0}, id {1}", actorData.TagMap[ActorKeys.GizmoGroup], sno);
#else
#endif
return CreateGizmo(world, snoId, tags);
return CreateGizmo(world, sno, tags);
}
case ActorType.ServerProp:
return new ServerProp(world, snoId, tags);
return new ServerProp(world, sno, tags);
case ActorType.Environment:
return new Environment(world, snoId, tags);
return new Environment(world, sno, tags);
case ActorType.Item:
return new StaticItem(world, snoId, tags);
return new StaticItem(world, sno, tags);
case ActorType.Player:
return new InteractiveNPC(world, snoId, tags);
return new InteractiveNPC(world, sno, tags);
default:
//Logger.Warn("Unknown Actor type {0}, Id: {1}", actorData.Type, snoId);
return null;
}
}
private static Actor CreateGizmo(World world, int snoId, TagMap tags)
private static Actor CreateGizmo(World world, ActorSno sno, TagMap tags)
{
//if (tags.ContainsKey(MarkerKeys.DestinationWorld)) //trying to spawn all portals
//{
@ -225,24 +228,7 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem
//return new Portal(world, snoId, tags);
//}
return new Gizmo(world, snoId, tags);
}
public static void LoadSNOHandlers()
{
foreach (var type in Assembly.GetExecutingAssembly().GetTypes())
{
if (!type.IsSubclassOf(typeof(Actor))) continue;
var attributes = (HandledSNOAttribute[])type.GetCustomAttributes(typeof(HandledSNOAttribute), true);
if (attributes.Length == 0) continue;
foreach (var sno in attributes.First().SNOIds)
{
if (!SNOHandlers.ContainsKey(sno))
SNOHandlers.Add(sno, type);
}
}
return new Gizmo(world, sno, tags);
}
}
}

View File

@ -2,6 +2,7 @@
using DiIiS_NA.Core.Helpers.Hash;
//Blizzless Project 2022
using DiIiS_NA.Core.Logging;
using DiIiS_NA.D3_GameServer.Core.Types.SNO;
//Blizzless Project 2022
using DiIiS_NA.GameServer.Core.Types.TagMap;
//Blizzless Project 2022
@ -37,6 +38,15 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem
{
static readonly Logger Logger = LogManager.CreateLogger();
// "EventPortal" actors
private static readonly ActorSno[] eventPortals = new ActorSno[]
{
ActorSno._x1_westmhub_scoundreleventportal,
ActorSno._x1_westmhub_templareventportal,
ActorSno._x1_westmhub_enchantresseventportal,
ActorSno._x1_westmhub_jewelereventportal,
};
public override ActorType ActorType { get { return ActorType.Gizmo; } }
private int Encounter;
@ -45,8 +55,8 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem
private int DestPoint;
private ResolvedPortalDestination Destination { get; set; }
public BossPortal(World world, int snoId, TagMap tags)
: base(world, snoId, tags)
public BossPortal(World world, ActorSno sno, TagMap tags)
: base(world, sno, tags)
{
this.Field2 = 0x9;//16;
@ -103,75 +113,75 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem
}
DestPoint = bossEncounter.I11;
//get EncounterSNO
switch (this.ActorSNO.Id)
switch (this.SNO)
{
case 168932: //CainIntro
case ActorSno._boss_portal_cainintro: //CainIntro
this.Encounter = 168925;
break;
case 159573: //Leoric
case ActorSno._boss_portal_skeletonking: //Leoric
this.Encounter = 159592;
break;
case 183032: //SpiderQueen
case ActorSno._boss_portal_spiderqueen: //SpiderQueen
this.Encounter = 181436;
break;
case 158944: //Butcher
case ActorSno._boss_portal_butcher: //Butcher
this.Encounter = 158915;
break;
case 195234: //Maghda
case ActorSno._boss_portal_maghda: //Maghda
this.Encounter = 195226;
break;
case 159578: //Cain Death
case ActorSno._boss_portal_binkleshulkout: //Cain Death
this.Encounter = 159591;
break;
//case 159578: //Belial Audience
//this.Encounter = 162231;
//break;
case 159580: //Adria Rescue
case ActorSno._boss_portal_adriasewer: //Adria Rescue
this.Encounter = 159584;
break;
case 159581: //Zoltun Kulle
case ActorSno._boss_portal_blacksoulstone: //Zoltun Kulle
this.Encounter = 159586;
break;
case 159574: //Belial
case ActorSno._boss_portal_belial: //Belial
this.Encounter = 159585;
break;
case 226784: //SiegeBreaker
case ActorSno._boss_portal_siegebreaker: //SiegeBreaker
this.Encounter = 226716;
break;
case 161278: //Cydaea
case ActorSno._boss_portal_mistressofpain: //Cydaea
this.Encounter = 161246;
break;
case 159575: //Azmodan
case ActorSno._boss_portal_azmodan: //Azmodan
this.Encounter = 159582;
break;
case 159576: //Adria_Betrayal
case ActorSno._boss_portal_adriabetrayal: //Adria_Betrayal
this.Encounter = 159583;
break;
case 182963: //Iskatu
case ActorSno._boss_portal_1000monsterfight: //Iskatu
this.Encounter = 182960;
break;
case 161276: //Rakanoth
case ActorSno._boss_portal_despair: //Rakanoth
this.Encounter = 161247;
break;
case 220551: //Imperius_Spire
case ActorSno._bossportal_imperius_spirebase: //Imperius_Spire
this.Encounter = 220541;
break;
case 161279: //Diablo
case ActorSno._boss_portal_diablo: //Diablo
this.Encounter = 161280;
break;
case 309883: //Urzael
case ActorSno._x1_urzael_bossportal: //Urzael
this.Encounter = 298128;
break;
case 293005: //Adria
case ActorSno._x1_boss_portal_adria: //Adria
this.Encounter = 293007;
break;
case 296314: //BatteringRam
case ActorSno._x1_boss_portal_batteringram: //BatteringRam
this.Encounter = 296315;
break;
case 374257: //Malthael
case ActorSno._x1_fortress_malthael_boss_portal: //Malthael
this.Encounter = 278965;
break;
case 380766:
case ActorSno._boss_portal_greed:
this.Encounter = 380760;
break;
default:
@ -186,9 +196,9 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem
StartingPointActorTag = DestPoint
};
}
public static bool setActorOperable(World world, Int32 snoId, bool status)
public static bool SetActorOperable(World world, ActorSno sno, bool status)
{
var actor = world.GetActorBySNO(snoId);
var actor = world.GetActorBySNO(sno);
if (actor == null)
return false;
@ -205,7 +215,7 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem
}
public override bool Reveal(Player player)
{
if (this.ActorSNO.Name.EndsWith("EventPortal")) return false;
if (eventPortals.Contains(this.SNO)) return false;
if (!base.Reveal(player))
return false;
/*
@ -220,7 +230,7 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem
}
});
//*/
player.InGameClient.SendMessage(new DiIiS_NA.GameServer.MessageSystem.Message.Definitions.Portal.PortalSpecifierMessage()
player.InGameClient.SendMessage(new PortalSpecifierMessage()
{
ActorID = this.DynamicID(player),
Destination = this.Destination
@ -235,7 +245,7 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem
public override void OnTargeted(Player player, TargetMessage message)
{
Logger.Trace("(OnTargeted) BossPortal has been activated, Id: {0}", this.ActorSNO.Id);
Logger.Trace("(OnTargeted) BossPortal has been activated, Id: {0}", this.SNO);
if (this.Encounter == 0) return;
//if (this.World.Game.CurrentEncounter.activated) return;

View File

@ -1,4 +1,5 @@
//Blizzless Project 2022
using DiIiS_NA.D3_GameServer.Core.Types.SNO;
using DiIiS_NA.GameServer.Core.Types.TagMap;
//Blizzless Project 2022
using DiIiS_NA.GameServer.GSSystem.MapSystem;
@ -9,8 +10,8 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem
{
public override ActorType ActorType { get { return ActorType.Environment; } }
public Environment(World world, int snoId, TagMap tags)
: base(world, snoId, tags)
public Environment(World world, ActorSno sno, TagMap tags)
: base(world, sno, tags)
{
this.Field2 = 0x10;//16;
this.Field7 = 0x00000000;

View File

@ -2,6 +2,7 @@
using System;
//Blizzless Project 2022
using DiIiS_NA.Core.Logging;
using DiIiS_NA.D3_GameServer.Core.Types.SNO;
//Blizzless Project 2022
using DiIiS_NA.GameServer.Core.Types.TagMap;
//Blizzless Project 2022
@ -20,8 +21,8 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem
public override ActorType ActorType { get { return ActorType.Gizmo; } }
protected Logger Logger = new Logger("Gizmo");
public Gizmo(World world, int snoId, TagMap tags, bool is_marker = false)
: base(world, snoId, tags, is_marker)
public Gizmo(World world, ActorSno sno, TagMap tags, bool is_marker = false)
: base(world, sno, tags, is_marker)
{
this.Field2 = 0x9;//16;
this.Field7 = 0x00000001;
@ -41,16 +42,16 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem
public override void OnTargeted(Player player, TargetMessage message)
{
if (this.Attributes[GameAttribute.Disabled] == true) return;
Logger.Trace("(OnTargeted) Gizmo has been activated! Id: {0}, Type: {1}", this.ActorSNO.Id, this.ActorData.TagMap[ActorKeys.GizmoGroup]);
Logger.Trace("(OnTargeted) Gizmo has been activated! Id: {0}, Type: {1}", this.SNO, this.ActorData.TagMap[ActorKeys.GizmoGroup]);
//handling quest triggers
if (this.World.Game.QuestProgress.QuestTriggers.ContainsKey(this.ActorSNO.Id))
if (this.World.Game.QuestProgress.QuestTriggers.ContainsKey((int)this.SNO))
{
var trigger = this.World.Game.QuestProgress.QuestTriggers[this.ActorSNO.Id];
var trigger = this.World.Game.QuestProgress.QuestTriggers[(int)this.SNO];
if (trigger.triggerType == DiIiS_NA.Core.MPQ.FileFormats.QuestStepObjectiveType.InteractWithActor)
{
this.World.Game.QuestProgress.UpdateCounter(this.ActorSNO.Id);
if (trigger.count == this.World.Game.QuestProgress.QuestTriggers[this.ActorSNO.Id].counter)
this.World.Game.QuestProgress.UpdateCounter((int)this.SNO);
if (trigger.count == this.World.Game.QuestProgress.QuestTriggers[(int)this.SNO].counter)
try
{
trigger.questEvent.Execute(this.World); // launch a questEvent
@ -61,27 +62,27 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem
}
}
}
else if (this.World.Game.SideQuestProgress.QuestTriggers.ContainsKey(this.ActorSNO.Id))
else if (this.World.Game.SideQuestProgress.QuestTriggers.ContainsKey((int)this.SNO))
{
var trigger = this.World.Game.SideQuestProgress.QuestTriggers[this.ActorSNO.Id];
var trigger = this.World.Game.SideQuestProgress.QuestTriggers[(int)this.SNO];
if (trigger.triggerType == DiIiS_NA.Core.MPQ.FileFormats.QuestStepObjectiveType.InteractWithActor)
{
this.World.Game.SideQuestProgress.UpdateSideCounter(this.ActorSNO.Id);
if (trigger.count == this.World.Game.SideQuestProgress.QuestTriggers[this.ActorSNO.Id].counter)
this.World.Game.SideQuestProgress.UpdateSideCounter((int)this.SNO);
if (trigger.count == this.World.Game.SideQuestProgress.QuestTriggers[(int)this.SNO].counter)
trigger.questEvent.Execute(this.World); // launch a questEvent
}
}
if (this.World.Game.SideQuestProgress.GlobalQuestTriggers.ContainsKey(this.ActorSNO.Id))
if (this.World.Game.SideQuestProgress.GlobalQuestTriggers.ContainsKey((int)this.SNO))
{
var trigger = this.World.Game.SideQuestProgress.GlobalQuestTriggers[this.ActorSNO.Id];
var trigger = this.World.Game.SideQuestProgress.GlobalQuestTriggers[(int)this.SNO];
if (trigger.triggerType == DiIiS_NA.Core.MPQ.FileFormats.QuestStepObjectiveType.InteractWithActor)
{
this.World.Game.SideQuestProgress.UpdateGlobalCounter(this.ActorSNO.Id);
if (trigger.count == this.World.Game.SideQuestProgress.GlobalQuestTriggers[this.ActorSNO.Id].counter)
this.World.Game.SideQuestProgress.UpdateGlobalCounter((int)this.SNO);
if (trigger.count == this.World.Game.SideQuestProgress.GlobalQuestTriggers[(int)this.SNO].counter)
try
{
trigger.questEvent.Execute(this.World); // launch a questEvent
this.World.Game.SideQuestProgress.GlobalQuestTriggers.Remove(this.ActorSNO.Id);
this.World.Game.SideQuestProgress.GlobalQuestTriggers.Remove((int)this.SNO);
}
catch (Exception e)
{

View File

@ -2,17 +2,18 @@
using System;
//Blizzless Project 2022
using System.Collections.Generic;
using DiIiS_NA.D3_GameServer.Core.Types.SNO;
namespace DiIiS_NA.GameServer.GSSystem.ActorSystem
{
[AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = false)]
public sealed class HandledSNOAttribute : Attribute
{
public List<int> SNOIds { get; private set; }
public List<ActorSno> SNOIds { get; private set; }
public HandledSNOAttribute(params int[] snoIds)
public HandledSNOAttribute(params ActorSno[] snoIds)
{
this.SNOIds = new List<int>();
this.SNOIds = new List<ActorSno>();
this.SNOIds.AddRange(snoIds);
}
}

View File

@ -1,4 +1,5 @@
//Blizzless Project 2022
using DiIiS_NA.D3_GameServer.Core.Types.SNO;
using DiIiS_NA.GameServer.Core.Types.TagMap;
//Blizzless Project 2022
using DiIiS_NA.GameServer.GSSystem.ActorSystem.Interactions;
@ -25,8 +26,8 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations.Artisans
{
public class Artisan : InteractiveNPC
{
public Artisan(World world, int snoId, TagMap tags)
: base(world, snoId, tags)
public Artisan(World world, ActorSno sno, TagMap tags)
: base(world, sno, tags)
{
this.Attributes[GameAttribute.MinimapActive] = true;
Interactions.Add(new CraftInteraction());

View File

@ -1,4 +1,5 @@
//Blizzless Project 2022
using DiIiS_NA.D3_GameServer.Core.Types.SNO;
using DiIiS_NA.GameServer.Core.Types.TagMap;
//Blizzless Project 2022
using DiIiS_NA.GameServer.GSSystem.PlayerSystem;
@ -9,15 +10,16 @@ using DiIiS_NA.GameServer.MessageSystem.Message.Definitions.World;
namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations.Artisans
{
[HandledSNO(0x0002FA63 /* PT_Blacksmith_ForgeWeaponShortcut.acr */,
0x0002FA64 /*PT_Blacksmith_ForgeArmorShortcut.acr */,
0x0002FA62 /*PT_Blacksmith_RepairShortcut.acr */,
212519 /* Actor PT_Jeweler_AddSocketShortcut */,
212517 /* Actor PT_Jeweler_CombineShortcut */,
212521 /* Actor PT_Jeweler_RemoveGemShortcut */,
212511 /* Actor PT_Mystic_EnhanceShortcut */,
212510 /* Actor PT_Mystic_IdentifyShortcut */,
439975 /* KanaiCube_Stand */)]
[HandledSNO(
ActorSno._pt_blacksmith_forgeweaponshortcut /* PT_Blacksmith_ForgeWeaponShortcut.acr */,
ActorSno._pt_blacksmith_forgearmorshortcut /*PT_Blacksmith_ForgeArmorShortcut.acr */,
ActorSno._pt_blacksmith_repairshortcut /*PT_Blacksmith_RepairShortcut.acr */,
ActorSno._pt_jeweler_addsocketshortcut /* Actor PT_Jeweler_AddSocketShortcut */,
ActorSno._pt_jeweler_combineshortcut /* Actor PT_Jeweler_CombineShortcut */,
ActorSno._pt_jeweler_removegemshortcut /* Actor PT_Jeweler_RemoveGemShortcut */,
ActorSno._pt_mystic_enhanceshortcut /* Actor PT_Mystic_EnhanceShortcut */,
ActorSno._pt_mystic_identifyshortcut /* Actor PT_Mystic_IdentifyShortcut */
)]
public class ArtisanShortcut : InteractiveNPC
{
/*
@ -42,79 +44,60 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations.Artisans
[442282] kanai_Cube_Wash
[138979] NephalemCube
//*/
public ArtisanShortcut(MapSystem.World world, int snoId, TagMap tags)
: base(world, snoId, tags)
public ArtisanShortcut(MapSystem.World world, ActorSno sno, TagMap tags)
: base(world, sno, tags)
{
Attributes[GameAttribute.MinimapActive] = false;
Attributes[GameAttribute.Conversation_Icon, 0] = 0;
switch (this.ActorSNO.Id)
{
case 0x0002FA62:
case 0x0002FA63:
case 0x0002FA64:
break;
case 212517:
case 212519:
case 212521:
break;
case 212510:
case 212511:
break;
}
}
public override void OnTargeted(Player player, TargetMessage message)
{
player.InGameClient.SendMessage(new MessageSystem.Message.Definitions.Misc.ANNDataMessage(Opcodes.OpenArtisanWindowMessage) { ActorID = this.DynamicID(player) });
switch (this.ActorSNO.Id)
switch (this.SNO)
{
case 0x0002FA62:
case 0x0002FA63:
case 0x0002FA64:
case ActorSno._pt_blacksmith_repairshortcut:
case ActorSno._pt_blacksmith_forgeweaponshortcut:
case ActorSno._pt_blacksmith_forgearmorshortcut:
player.ArtisanInteraction = "Blacksmith";
break;
case 212517:
case 212519:
case 212521:
case ActorSno._pt_jeweler_combineshortcut:
case ActorSno._pt_jeweler_addsocketshortcut:
case ActorSno._pt_jeweler_removegemshortcut:
player.ArtisanInteraction = "Jeweler";
break;
case 212510:
case 212511:
case ActorSno._pt_mystic_identifyshortcut:
case ActorSno._pt_mystic_enhanceshortcut:
player.ArtisanInteraction = "Mystic";
break;
case 439975:
player.ArtisanInteraction = "Cube";
break;
}
}
public override bool Reveal(Player player)
{
if(this.World.Game.CurrentAct != 3000)
switch (this.ActorSNO.Id)
if (this.World.Game.CurrentAct != 3000)
{
case 0x0002FA62:
case 0x0002FA63:
case 0x0002FA64:
if (!player.BlacksmithUnlocked)
return false;
break;
case 212517:
case 212519:
case 212521:
if (!player.JewelerUnlocked)
return false;
break;
case 212510:
case 212511:
if (!player.MysticUnlocked)
return false;
break;
switch (this.SNO)
{
case ActorSno._pt_blacksmith_repairshortcut:
case ActorSno._pt_blacksmith_forgeweaponshortcut:
case ActorSno._pt_blacksmith_forgearmorshortcut:
if (!player.BlacksmithUnlocked)
return false;
break;
case ActorSno._pt_jeweler_combineshortcut:
case ActorSno._pt_jeweler_addsocketshortcut:
case ActorSno._pt_jeweler_removegemshortcut:
if (!player.JewelerUnlocked)
return false;
break;
case ActorSno._pt_mystic_identifyshortcut:
case ActorSno._pt_mystic_enhanceshortcut:
if (!player.MysticUnlocked)
return false;
break;
}
}
if (this.ActorSNO.Id == 439975)
if (!player.KanaiUnlocked)
return false;
return base.Reveal(player);
}
}

View File

@ -1,4 +1,5 @@
//Blizzless Project 2022
using DiIiS_NA.D3_GameServer.Core.Types.SNO;
using DiIiS_NA.GameServer.Core.Types.TagMap;
//Blizzless Project 2022
using DiIiS_NA.GameServer.GSSystem.MapSystem;
@ -21,11 +22,11 @@ using System.Threading.Tasks;
namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations.Artisans
{
[HandledSNO(56947 /* PT_Blacksmith.acr */)]
[HandledSNO(ActorSno._pt_blacksmith /* PT_Blacksmith.acr */)]
public class Blacksmith : Artisan
{
public Blacksmith(World world, int snoId, TagMap tags)
: base(world, snoId, tags)
public Blacksmith(World world, ActorSno sno, TagMap tags)
: base(world, sno, tags)
{
// TODO add all blacksmith functionality? /fasbat
//this.Attributes[GameAttribute.TeamID] = 0;

View File

@ -1,4 +1,5 @@
//Blizzless Project 2022
using DiIiS_NA.D3_GameServer.Core.Types.SNO;
using DiIiS_NA.GameServer.Core.Types.TagMap;
//Blizzless Project 2022
using DiIiS_NA.GameServer.GSSystem.ItemsSystem;
@ -13,11 +14,11 @@ using DiIiS_NA.GameServer.MessageSystem.Message.Definitions.Misc;
namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations.Artisans
{
[HandledSNO(56949 /* PT_Jewler.acr */)]
[HandledSNO(ActorSno._pt_jeweler /* PT_Jewler.acr */)]
public class Jeweler : Artisan
{
public Jeweler(World world, int snoId, TagMap tags)
: base(world, snoId, tags)
public Jeweler(World world, ActorSno sno, TagMap tags)
: base(world, sno, tags)
{
}

View File

@ -1,4 +1,5 @@
//Blizzless Project 2022
using DiIiS_NA.D3_GameServer.Core.Types.SNO;
using DiIiS_NA.GameServer.Core.Types.TagMap;
//Blizzless Project 2022
using DiIiS_NA.GameServer.GSSystem.ItemsSystem;
@ -13,11 +14,11 @@ using DiIiS_NA.GameServer.MessageSystem.Message.Definitions.Misc;
namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations.Artisans
{
[HandledSNO(56948 /* PT_Mystic.acr */)]
[HandledSNO(ActorSno._pt_mystic /* PT_Mystic.acr */)]
public class Mystic : Artisan
{
public Mystic(World world, int snoId, TagMap tags)
: base(world, snoId, tags)
public Mystic(World world, ActorSno sno, TagMap tags)
: base(world, sno, tags)
{
}

View File

@ -1,4 +1,5 @@
//Blizzless Project 2022
using DiIiS_NA.D3_GameServer.Core.Types.SNO;
using DiIiS_NA.GameServer.Core.Types.TagMap;
//Blizzless Project 2022
using DiIiS_NA.GameServer.GSSystem.ItemsSystem;
@ -15,11 +16,11 @@ using DiIiS_NA.GameServer.MessageSystem.Message.Definitions.Quest;
namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations.Artisans
{
[HandledSNO(398682 /* P1_LR_TieredRift_Nephalem.acr */)]
[HandledSNO(ActorSno._p1_lr_tieredrift_nephalem /* P1_LR_TieredRift_Nephalem.acr */)]
public class Nephalem : Artisan
{
public Nephalem(World world, int snoId, TagMap tags)
: base(world, snoId, tags)
public Nephalem(World world, ActorSno sno, TagMap tags)
: base(world, sno, tags)
{
this.Attributes[GameAttribute.NPC_Is_Operatable] = true;
this.Attributes[GameAttribute.Is_NPC] = true;

View File

@ -1,5 +1,6 @@
//Blizzless Project 2022
using DiIiS_NA.Core.Storage;
using DiIiS_NA.D3_GameServer.Core.Types.SNO;
//Blizzless Project 2022
using DiIiS_NA.GameServer.Core.Types.TagMap;
//Blizzless Project 2022
@ -21,17 +22,17 @@ using System.Threading.Tasks;
namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations.Artisans
{
[HandledSNO(429005)] //Zoltun
[HandledSNO(ActorSno._p2_hq_zoltunkulle)] //Zoltun
//[HandledSNO(431095)] //Wardrobe
public class ZoltunNPC : Artisan
{
public ZoltunNPC(MapSystem.World world, int snoID, TagMap tags)
: base(world, snoID, tags)
public ZoltunNPC(MapSystem.World world, ActorSno sno, TagMap tags)
: base(world, sno, tags)
{
if (world.Game.CurrentAct == 3000)
{
this.Conversations.Add(new ActorSystem.Interactions.ConversationInteraction(430146));
this.Conversations.Add(new ConversationInteraction(430146));
//[430335] [Worlds] a3dun_ruins_frost_city_a_02
//[428493] [Worlds] a3dun_ruins_frost_city_a_01
//this.Attributes[GameAttribute.Conversation_Icon, 0] = 1;
@ -39,7 +40,7 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations.Artisans
}
}
public override void OnTargeted(PlayerSystem.Player player, MessageSystem.Message.Definitions.World.TargetMessage message)
public override void OnTargeted(Player player, MessageSystem.Message.Definitions.World.TargetMessage message)
{
base.OnTargeted(player, message);//player.InGameClient.SendMessage(new MessageSystem.Message.Definitions.Misc.ANNDataMessage(MessageSystem.Opcodes.OpenArtisanWindowMessage) { ActorID = this.DynamicID });
player.ArtisanInteraction = "KanaiCube";
@ -47,7 +48,7 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations.Artisans
public override bool Reveal(Player player)
{
if (this.ActorSNO.Id == 439975)
if (this.SNO == ActorSno._kanaicube_stand)
if (!player.KanaiUnlocked)
Interactions.Clear();
else
@ -59,18 +60,17 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations.Artisans
}
}
[HandledSNO(
439975 /* Actor KanaiCube_Stand */)]
[HandledSNO(ActorSno._kanaicube_stand /* Actor KanaiCube_Stand */)]
public class CubeShortcut : InteractiveNPC
{
public CubeShortcut(MapSystem.World world, int snoId, TagMap tags)
: base(world, snoId, tags)
public CubeShortcut(MapSystem.World world, ActorSno sno, TagMap tags)
: base(world, sno, tags)
{
Attributes[GameAttribute.MinimapActive] = true;
Attributes[GameAttribute.Conversation_Icon, 0] = 0;
}
public override void OnTargeted(PlayerSystem.Player player, MessageSystem.Message.Definitions.World.TargetMessage message)
public override void OnTargeted(Player player, MessageSystem.Message.Definitions.World.TargetMessage message)
{
player.InGameClient.SendMessage(new MessageSystem.Message.Definitions.Misc.ANNDataMessage(Opcodes.OpenArtisanWindowMessage) { ActorID = this.DynamicID(player) });
player.ArtisanInteraction = "Cube";

View File

@ -1,5 +1,6 @@
//Blizzless Project 2022
using System;
using System.Collections.Generic;
//Blizzless Project 2022
using System.Linq;
//Blizzless Project 2022
@ -10,32 +11,54 @@ using DiIiS_NA.GameServer.Core.Types.TagMap;
using DiIiS_NA.GameServer.GSSystem.PlayerSystem;
//Blizzless Project 2022
using DiIiS_NA.GameServer.MessageSystem.Message.Definitions.World;
using DiIiS_NA.D3_GameServer.Core.Types.SNO;
namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations
{
class Banner : Gizmo
{
public Banner(World world, int snoId, TagMap tags)
: base(world, snoId, tags)
private static readonly Dictionary<int, ActorSno[]> bannerActors = new Dictionary<int, ActorSno[]>()
{
if (this.ActorSNO.Name.Contains("Player_2"))
this.BannerPlayerIndex = 1;
else if (this.ActorSNO.Name.Contains("Player_3"))
this.BannerPlayerIndex = 2;
else if (this.ActorSNO.Name.Contains("Player_4"))
this.BannerPlayerIndex = 3;
[0] = new ActorSno[] {
ActorSno._banner_player_1,
ActorSno._emotebanner_player_1,
ActorSno._banner_player_1_act2,
ActorSno._emotebanner_player_1_lit,
ActorSno._banner_player_1_act5,
},
[1] = new ActorSno[] {
ActorSno._banner_player_2,
ActorSno._emotebanner_player_2,
ActorSno._banner_player_2_act2,
ActorSno._banner_player_2_act5,
},
[2] = new ActorSno[] {
ActorSno._banner_player_3,
ActorSno._emotebanner_player_3,
ActorSno._banner_player_3_act2,
ActorSno._banner_player_3_act5,
},
[3] = new ActorSno[] {
ActorSno._banner_player_4,
ActorSno._emotebanner_player_4,
ActorSno._banner_player_4_act2,
ActorSno._banner_player_4_act5,
},
};
public Banner(World world, ActorSno sno, TagMap tags)
: base(world, sno, tags)
{
this.BannerPlayerIndex = bannerActors.FirstOrDefault(x => x.Value.Contains(this.SNO)).Key;
}
public int BannerPlayerIndex = 0;
public override bool Reveal(Player player)
{
if (!base.Reveal(player))
return false;
return true;
}
return base.Reveal(player);
}
public override void OnTargeted(Player player, TargetMessage message)
public override void OnTargeted(Player player, TargetMessage message)
{
Logger.Trace("(OnTargeted) Banner has been activated ");

View File

@ -19,65 +19,65 @@ using System.Threading.Tasks;
namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations
{
[HandledSNO(
5350, //Leoric King
51341, //Aranea
3526, //Butcher
6031, //Maghda
80509, //Zoltun Kulle
62975, //Belial (small)
3349, //Belial (big)
87642, //Gluttony
96192, //Siegebreaker
95250, //Cydaea
89690, //Azmodan
148449, //Izual
196102, //Iskatu
4630, //Despair (Rakanoth)
114917, //Diablo
133562, //Diablo's shadow
291368, //Urzael
279394, //Adria
297730, //Malthael
//Nephalem Bosses
358429, //X1_LR_Boss_MistressofPain
358489, //X1_LR_Boss_Angel_Corrupt_A
358614, //X1_LR_Boss_creepMob_A
359094, //X1_LR_Boss_SkeletonSummoner_C
359688, //X1_LR_Boss_Succubus_A
360281, //X1_LR_Boss_Snakeman_Melee_Belial
360636, //X1_LR_Boss_TerrorDemon_A
434201, //P4_LR_Boss_Sandmonster_Turret
343743, //x1_LR_Boss_SkeletonKing
343751, //x1_LR_Boss_Gluttony
343759, //x1_LR_Boss_Despair
343767, //x1_LR_Boss_MalletDemon
344119, //X1_LR_Boss_morluSpellcaster_Ice
344389, //X1_LR_Boss_SandMonster
345004, //X1_LR_Boss_morluSpellcaster_Fire
346563, //X1_LR_Boss_DeathMaiden
353517, //X1_LR_Boss_Secret_Cow
353535, //X1_LR_Boss_Squigglet
353823, //X1_LR_Boss_sniperAngel
353874, //X1_LR_Boss_westmarchBrute
354050, //X1_LR_Boss_Dark_Angel
354144, //X1_LR_Boss_BigRed_Izual
354652, //X1_LR_Boss_demonFlyerMega
426943, //X1_LR_Boss_RatKing_A
428323, //X1_LR_Boss_RatKing_A_UI
429010, //X1_LR_Boss_TerrorDemon_A_BreathMinion
357917, //x1_LR_Boss_Butcher
358208, //X1_LR_Boss_ZoltunKulle
360766, //X1_LR_Boss_Minion_shadowVermin_A
360794, //X1_LR_Boss_Minion_TerrorDemon_Clone_C
360327, //X1_LR_Boss_Minion_Swarm_A
360329 //X1_LR_Boss_Minion_electricEel_B
ActorSno._skeletonking, //Leoric King
ActorSno._spiderqueen, //Aranea
ActorSno._butcher, //Butcher
ActorSno._maghda, //Maghda
ActorSno._zoltunkulle, //Zoltun Kulle
ActorSno._belial_trueform, //Belial (small)
ActorSno._belial, //Belial (big)
ActorSno._gluttony, //Gluttony
ActorSno._siegebreakerdemon, //Siegebreaker
ActorSno._mistressofpain, //Cydaea
ActorSno._azmodan, //Azmodan
ActorSno._bigred_izual, //Izual
ActorSno._terrordemon_a_unique_1000monster, //Iskatu
ActorSno._despair, //Despair (Rakanoth)
ActorSno._diablo, //Diablo
ActorSno._terrordiablo, //Diablo's shadow
ActorSno._x1_urzael_boss, //Urzael
ActorSno._x1_adria_boss, //Adria
ActorSno._x1_malthael_boss, //Malthael
//Nephalem Bosses
ActorSno._x1_lr_boss_mistressofpain, //X1_LR_Boss_MistressofPain
ActorSno._x1_lr_boss_angel_corrupt_a, //X1_LR_Boss_Angel_Corrupt_A
ActorSno._x1_lr_boss_creepmob_a, //X1_LR_Boss_creepMob_A
ActorSno._x1_lr_boss_skeletonsummoner_c, //X1_LR_Boss_SkeletonSummoner_C
ActorSno._x1_lr_boss_succubus_a, //X1_LR_Boss_Succubus_A
ActorSno._x1_lr_boss_snakeman_melee_belial, //X1_LR_Boss_Snakeman_Melee_Belial
ActorSno._x1_lr_boss_terrordemon_a, //X1_LR_Boss_TerrorDemon_A
ActorSno._p4_lr_boss_sandmonster_turret, //P4_LR_Boss_Sandmonster_Turret
ActorSno._x1_lr_boss_skeletonking, //x1_LR_Boss_SkeletonKing
ActorSno._x1_lr_boss_gluttony, //x1_LR_Boss_Gluttony
ActorSno._x1_lr_boss_despair, //x1_LR_Boss_Despair
ActorSno._x1_lr_boss_malletdemon, //x1_LR_Boss_MalletDemon
ActorSno._x1_lr_boss_morluspellcaster_ice, //X1_LR_Boss_morluSpellcaster_Ice
ActorSno._x1_lr_boss_sandmonster, //X1_LR_Boss_SandMonster
ActorSno._x1_lr_boss_morluspellcaster_fire, //X1_LR_Boss_morluSpellcaster_Fire
ActorSno._x1_lr_boss_deathmaiden, //X1_LR_Boss_DeathMaiden
ActorSno._x1_lr_boss_secret_cow, //X1_LR_Boss_Secret_Cow
ActorSno._x1_lr_boss_squigglet, //X1_LR_Boss_Squigglet
ActorSno._x1_lr_boss_sniperangel, //X1_LR_Boss_sniperAngel
ActorSno._x1_lr_boss_westmarchbrute, //X1_LR_Boss_westmarchBrute
ActorSno._x1_lr_boss_dark_angel, //X1_LR_Boss_Dark_Angel
ActorSno._x1_lr_boss_bigred_izual, //X1_LR_Boss_BigRed_Izual
ActorSno._x1_lr_boss_demonflyermega, //X1_LR_Boss_demonFlyerMega
ActorSno._x1_lr_boss_ratking_a, //X1_LR_Boss_RatKing_A
ActorSno._x1_lr_boss_ratking_a_ui, //X1_LR_Boss_RatKing_A_UI
ActorSno._x1_lr_boss_terrordemon_a_breathminion, //X1_LR_Boss_TerrorDemon_A_BreathMinion
ActorSno._x1_lr_boss_butcher, //x1_LR_Boss_Butcher
ActorSno._x1_lr_boss_zoltunkulle, //X1_LR_Boss_ZoltunKulle
ActorSno._x1_lr_boss_minion_shadowvermin_a, //X1_LR_Boss_Minion_shadowVermin_A
ActorSno._x1_lr_boss_minion_terrordemon_clone_c, //X1_LR_Boss_Minion_TerrorDemon_Clone_C
ActorSno._x1_lr_boss_minion_swarm_a, //X1_LR_Boss_Minion_Swarm_A
ActorSno._x1_lr_boss_minion_electriceel_b //X1_LR_Boss_Minion_electricEel_B
)/*Act Bosses*/]
public sealed class Boss : Monster
{
public Boss(MapSystem.World world, int snoId, TagMap tags)
: base(world, snoId, tags)
public Boss(MapSystem.World world, ActorSno sno, TagMap tags)
: base(world, sno, tags)
{
if (snoId == 80509 && world.SNO == WorldSno.a2dun_zolt_lobby) this.SetVisible(false);
if (sno == ActorSno._zoltunkulle && world.SNO == WorldSno.a2dun_zolt_lobby) this.SetVisible(false);
this.Attributes[GameAttribute.MinimapActive] = true;
//this.Attributes[GameAttribute.Immune_To_Charm] = true;
this.Attributes[GameAttribute.//Blizzless Project 2022
@ -90,13 +90,14 @@ using_Bossbar] = true;
this.Attributes[GameAttribute.TeamID] = 10;
this.WalkSpeed *= 0.5f;
switch (snoId)
MonsterBrain monsterBrain = (Brain as MonsterBrain);
switch (sno)
{
case 114917: //Diablo
//(Brain as MonsterBrain).RemovePresetPower(30592);
//(Brain as MonsterBrain).AddPresetPower(136189); //[136189] Diablo_ClawRip
(Brain as MonsterBrain).AddPresetPower(136223); //Diablo_RingOfFire
(Brain as MonsterBrain).AddPresetPower(136226); //Diablo_HellSpikes
case ActorSno._diablo: //Diablo
//(Brain as MonsterBrain).RemovePresetPower(30592);
//(Brain as MonsterBrain).AddPresetPower(136189); //[136189] Diablo_ClawRip
monsterBrain.AddPresetPower(136223); //Diablo_RingOfFire
monsterBrain.AddPresetPower(136226); //Diablo_HellSpikes
;
/*
@ -155,30 +156,30 @@ using_Bossbar] = true;
*/
break;
case 5350://Leoric King
(Brain as MonsterBrain).RemovePresetPower(30592);
(Brain as MonsterBrain).AddPresetPower(30496);
(Brain as MonsterBrain).AddPresetPower(30504);
(Brain as MonsterBrain).AddPresetPower(73824);
(Brain as MonsterBrain).AddPresetPower(79334);
case ActorSno._skeletonking://Leoric King
monsterBrain.RemovePresetPower(30592);
monsterBrain.AddPresetPower(30496);
monsterBrain.AddPresetPower(30504);
monsterBrain.AddPresetPower(73824);
monsterBrain.AddPresetPower(79334);
break;
case 3526://Butcher
(Brain as MonsterBrain).AddPresetPower(83008);
case ActorSno._butcher://Butcher
monsterBrain.AddPresetPower(83008);
break;
case 62975://Belial (small)
case ActorSno._belial_trueform://Belial (small)
this.HasLoot = false;
break;
case 3349://Belial (big)
(Brain as MonsterBrain).AddPresetPower(152540);
case ActorSno._belial://Belial (big)
monsterBrain.AddPresetPower(152540);
break;
case 6031://Maghda
(Brain as MonsterBrain).AddPresetPower(131744); //summon berserker
//(Brain as MonsterBrain).AddPresetPower(131745); //mothDust
(Brain as MonsterBrain).AddPresetPower(131749); //teleport
case ActorSno._maghda://Maghda
monsterBrain.AddPresetPower(131744); //summon berserker
//(Brain as MonsterBrain).AddPresetPower(131745); //mothDust
monsterBrain.AddPresetPower(131749); //teleport
break;
case 87642://Gluttony
(Brain as MonsterBrain).AddPresetPower(93676); //gas cloud
(Brain as MonsterBrain).AddPresetPower(211292); //slime spawn
case ActorSno._gluttony://Gluttony
monsterBrain.AddPresetPower(93676); //gas cloud
monsterBrain.AddPresetPower(211292); //slime spawn
break;
default:
break;
@ -202,7 +203,7 @@ using_Bossbar] = true;
public override bool Reveal(PlayerSystem.Player player)
{
if (this.ActorSNO.Id == 196102)
if (this.SNO == ActorSno._terrordemon_a_unique_1000monster)
{
this.Destroy();
return false;

View File

@ -1,4 +1,5 @@
//Blizzless Project 2022
using DiIiS_NA.D3_GameServer.Core.Types.SNO;
using DiIiS_NA.GameServer.Core.Types.TagMap;
//Blizzless Project 2022
using DiIiS_NA.GameServer.GSSystem.PlayerSystem;
@ -11,11 +12,11 @@ using DiIiS_NA.GameServer.MessageSystem.Message.Definitions.World;
namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations
{
[HandledSNO(460429)]
[HandledSNO(ActorSno._challenge_rift_inspect_armorrack)]
class CR_Glass : Gizmo
{
public CR_Glass(MapSystem.World world, int snoId, TagMap tags)
: base(world, snoId, tags)
public CR_Glass(MapSystem.World world, ActorSno sno, TagMap tags)
: base(world, sno, tags)
{
this.Attributes[GameAttribute.TeamID] = 2;
this.Attributes[GameAttribute.MinimapActive] = true;

View File

@ -1,4 +1,5 @@
//Blizzless Project 2022
using DiIiS_NA.D3_GameServer.Core.Types.SNO;
using DiIiS_NA.GameServer.Core.Types.TagMap;
//Blizzless Project 2022
using DiIiS_NA.GameServer.GSSystem.PlayerSystem;
@ -22,21 +23,20 @@ using System.Threading.Tasks;
namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations
{
//5747
[HandledSNO(5744, 89503 // trDun_cath_Chandilier_Trap.acr
[HandledSNO(
ActorSno._trdun_cath_chandelier_trap, ActorSno._trdun_cath_braizer_trap // trDun_cath_Chandilier_Trap.acr
)]
class CathedralLamp : Gizmo
{
public CathedralLamp(MapSystem.World world, int snoId, TagMap tags)
: base(world, snoId, tags)
public CathedralLamp(MapSystem.World world, ActorSno sno, TagMap tags)
: base(world, sno, tags)
{
}
private int[] Unbreakables = new int[] { 81699, 5744, 89503 };
public void ReceiveDamage(Actor source, float damage)
{
if (this.ActorSNO.Id == 225252 && this.World.Game.CurrentSideQuest != 225253) return;
if (this.SNO == ActorSno._trout_highlands_goatman_totem_gharbad && this.World.Game.CurrentSideQuest != 225253) return;
World.BroadcastIfRevealed(plr => new FloatingNumberMessage
{
@ -48,7 +48,7 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations
Attributes[GameAttribute.Hitpoints_Cur] = Math.Max(Attributes[GameAttribute.Hitpoints_Cur] - damage, 0);
Attributes.BroadcastChangedIfRevealed();
if (Attributes[GameAttribute.Hitpoints_Cur] == 0 && !this.Unbreakables.Contains(this.ActorSNO.Id))
if (Attributes[GameAttribute.Hitpoints_Cur] == 0 && !this.SNO.IsUndestroyable())
Die(source);
}
@ -56,7 +56,7 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations
{
base.OnTargeted(null, null);
Logger.Trace("Breaked barricade, id: {0}", this.ActorSNO.Id);
Logger.Trace("Breaked barricade, id: {0}", this.SNO);
if (this.AnimationSet.TagMapAnimDefault.ContainsKey(AnimationSetKeys.DeathDefault))
World.BroadcastIfRevealed(plr => new PlayAnimationMessage

View File

@ -1,4 +1,5 @@
//Blizzless Project 2022
using DiIiS_NA.D3_GameServer.Core.Types.SNO;
using DiIiS_NA.GameServer.Core.Types.TagMap;
//Blizzless Project 2022
using DiIiS_NA.GameServer.GSSystem.PlayerSystem;
@ -21,21 +22,20 @@ using System.Threading.Tasks;
namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations
{
[HandledSNO(5786 // trDun_cath_Chandilier_Trap.acr
[HandledSNO(
ActorSno._trdun_cath_wallcollapse_01// trDun_cath_Chandilier_Trap.acr
)]
class CathedralWall : Gizmo
{
public CathedralWall(MapSystem.World world, int snoId, TagMap tags)
: base(world, snoId, tags)
public CathedralWall(MapSystem.World world, ActorSno sno, TagMap tags)
: base(world, sno, tags)
{
}
private int[] Unbreakables = new int[] { 81699, 5744, 89503 };
public void ReceiveDamage(Actor source, float damage)
{
if (this.ActorSNO.Id == 225252 && this.World.Game.CurrentSideQuest != 225253) return;
if (this.SNO == ActorSno._trout_highlands_goatman_totem_gharbad && this.World.Game.CurrentSideQuest != 225253) return;
World.BroadcastIfRevealed(plr => new FloatingNumberMessage
{
@ -47,7 +47,7 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations
Attributes[GameAttribute.Hitpoints_Cur] = Math.Max(Attributes[GameAttribute.Hitpoints_Cur] - damage, 0);
Attributes.BroadcastChangedIfRevealed();
if (Attributes[GameAttribute.Hitpoints_Cur] == 0 && !this.Unbreakables.Contains(this.ActorSNO.Id))
if (Attributes[GameAttribute.Hitpoints_Cur] == 0 && !this.SNO.IsUndestroyable())
Die(source);
}
@ -55,7 +55,7 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations
{
base.OnTargeted(null, null);
Logger.Trace("Breaked barricade, id: {0}", this.ActorSNO.Id);
Logger.Trace("Breaked barricade, id: {0}", this.SNO);
if (this.AnimationSet.TagMapAnimDefault.ContainsKey(AnimationSetKeys.DeathDefault))
World.BroadcastIfRevealed(plr => new PlayAnimationMessage

View File

@ -1,4 +1,5 @@
//Blizzless Project 2022
using DiIiS_NA.D3_GameServer.Core.Types.SNO;
using DiIiS_NA.GameServer.Core.Types.TagMap;
//Blizzless Project 2022
using DiIiS_NA.GameServer.GSSystem.MapSystem;
@ -25,11 +26,11 @@ using System.Threading.Tasks;
namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations
{
[HandledSNO(416137 /* x1_OpenWorld_LootRunObelisk_B.acr */)]
[HandledSNO(ActorSno._p2_weeklychallenge_obelisk /* x1_OpenWorld_LootRunObelisk_B.acr */)]
public sealed class ChallengeObelisk : Gizmo
{
public ChallengeObelisk(World world, int snoId, TagMap tags)
: base(world, snoId, tags)
public ChallengeObelisk(World world, ActorSno sno, TagMap tags)
: base(world, sno, tags)
{
this.Attributes[GameAttribute.TeamID] = 2;
this.Attributes[GameAttribute.MinimapActive] = true;
@ -52,11 +53,12 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations
CollFlags = 0;
TickTimer Timeout = new SecondsTickTimer(this.World.Game, 3.5f);
var Boom = System.Threading.Tasks.Task<bool>.Factory.StartNew(() => WaitToSpawn(Timeout));
var Boom = Task<bool>.Factory.StartNew(() => WaitToSpawn(Timeout));
Boom.ContinueWith(delegate
{
this.World.GetActorBySNO(473334).SetVisible(true);
this.World.GetActorBySNO(473334).Reveal(player);
var actor = this.World.GetActorBySNO(ActorSno._x1_openworld_challenge_rifts_portal);
actor.SetVisible(true);
actor.Reveal(player);
World.BroadcastIfRevealed(plr => new ACDCollFlagsMessage()
{
@ -73,8 +75,9 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations
return false;
if (!Attributes[GameAttribute.Operatable])
{
this.World.GetActorBySNO(473334).SetVisible(false);
this.World.GetActorBySNO(473334).Unreveal(player);
var actor = this.World.GetActorBySNO(ActorSno._x1_openworld_challenge_rifts_portal);
actor.SetVisible(false);
actor.Unreveal(player);
}
else
{

View File

@ -1,4 +1,5 @@
//Blizzless Project 2022
using DiIiS_NA.D3_GameServer.Core.Types.SNO;
using DiIiS_NA.GameServer.Core.Types.TagMap;
//Blizzless Project 2022
using DiIiS_NA.GameServer.GSSystem.AISystem.Brains;
@ -19,8 +20,8 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations
private int NamePrefix = -1;
private int NameSuffix = -1;
public Champion(MapSystem.World world, int snoId, TagMap tags)
: base(world, snoId, tags)
public Champion(MapSystem.World world, ActorSno sno, TagMap tags)
: base(world, sno, tags)
{
this.Attributes[GameAttribute.Hitpoints_Max] *= 4.0f;
this.Attributes[GameAttribute.Immune_To_Charm] = true;

View File

@ -1,4 +1,5 @@
//Blizzless Project 2022
using DiIiS_NA.D3_GameServer.Core.Types.SNO;
using DiIiS_NA.GameServer.Core.Types.TagMap;
//Blizzless Project 2022
using DiIiS_NA.GameServer.GSSystem.MapSystem;
@ -13,8 +14,8 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations
{
private bool _checkpointReached = false;
public Checkpoint(World world, int snoId, TagMap tags)
: base(world, snoId, tags, false)
public Checkpoint(World world, ActorSno sno, TagMap tags)
: base(world, sno, tags, false)
{
}

View File

@ -1,4 +1,5 @@
//Blizzless Project 2022
using DiIiS_NA.D3_GameServer.Core.Types.SNO;
using DiIiS_NA.GameServer.Core.Types.TagMap;
//Blizzless Project 2022
using DiIiS_NA.GameServer.MessageSystem;
@ -15,11 +16,11 @@ using System.Threading.Tasks;
namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations
{
[HandledSNO(364559, 365097)]
[HandledSNO(ActorSno._x1_global_chest_cursedchest, ActorSno._x1_global_chest_cursedchest_b)]
class CursedChest : Gizmo
{
public CursedChest(MapSystem.World world, int snoId, TagMap tags)
: base(world, snoId, tags)
public CursedChest(MapSystem.World world, ActorSno sno, TagMap tags)
: base(world, sno, tags)
{
Attributes[GameAttribute.MinimapActive] = true;
}

View File

@ -12,14 +12,19 @@ using DiIiS_NA.GameServer.MessageSystem;
using DiIiS_NA.GameServer.GSSystem.TickerSystem;
//Blizzless Project 2022
using DiIiS_NA.GameServer.MessageSystem.Message.Definitions.Misc;
using DiIiS_NA.D3_GameServer.Core.Types.SNO;
namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations
{
[HandledSNO(364601, 368169)]
[HandledSNO(
//364601, 368169 - not found, possible values below
ActorSno._p4_bountygrounds_cursedshrine,
ActorSno._p4_bountygrounds_cursedshrine_a5
)]
class CursedShrine : Gizmo
{
public CursedShrine(MapSystem.World world, int snoId, TagMap tags)
: base(world, snoId, tags)
public CursedShrine(MapSystem.World world, ActorSno sno, TagMap tags)
: base(world, sno, tags)
{
Attributes[GameAttribute.MinimapActive] = true;
}

View File

@ -6,6 +6,7 @@ using System.Collections.Generic;
using System.Linq;
//Blizzless Project 2022
using DiIiS_NA.Core.Helpers.Math;
using DiIiS_NA.D3_GameServer.Core.Types.SNO;
//Blizzless Project 2022
using DiIiS_NA.GameServer.Core.Types.TagMap;
//Blizzless Project 2022
@ -29,22 +30,28 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations
{
class DesctructibleLootContainer : Gizmo
{
private static readonly ActorSno[] tombs = new ActorSno[]
{
ActorSno._trout_oldtristramtombstonedestructiblea,
ActorSno._trout_oldtristramtombstonedestructibled,
ActorSno._trout_oldtristramtombstonedestructiblee,
ActorSno._trout_oldtristramtombstonedestructibleb,
ActorSno._tombstone_a_wilderness_trout_wilderness,
ActorSno._tombstone_c_wilderness_trout_wilderness,
ActorSno._tombstone_b_wilderness_trout_wilderness
};
private bool haveDrop;
public DesctructibleLootContainer(World world, int snoId, bool haveDrop, TagMap tags)
: base(world, snoId, tags)
public DesctructibleLootContainer(World world, ActorSno sno, bool haveDrop, TagMap tags)
: base(world, sno, tags)
{
this.haveDrop = haveDrop;
}
private List<int> tombs = new List<int>() { 6155, 6158, 6159, 6156, 74909, 75023, 75132 };
private int[] Unbreakables = new int[] { 81699, 5744, 89503 };
public void ReceiveDamage(Actor source, float damage /* critical, type */)
{
if (this.ActorSNO.Id == 225252 && this.World.Game.CurrentSideQuest != 225253) return;
if (this.SNO == ActorSno._trout_highlands_goatman_totem_gharbad && this.World.Game.CurrentSideQuest != 225253) return;
World.BroadcastIfRevealed(plr => new FloatingNumberMessage
{
@ -58,7 +65,7 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations
Attributes.BroadcastChangedIfRevealed();
if (Attributes[GameAttribute.Hitpoints_Cur] == 0 && !this.Unbreakables.Contains(this.ActorSNO.Id))
if (Attributes[GameAttribute.Hitpoints_Cur] == 0 && !this.SNO.IsUndestroyable())
{
Die(source);
}
@ -92,9 +99,9 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations
}
}
Logger.Trace("Breaked barricade, id: {0}", this.ActorSNO.Id);
Logger.Trace("Breaked barricade, id: {0}", this.SNO);
if (source != null && source is Player && this.tombs.Contains(this.ActorSNO.Id))
if (source != null && source is Player && tombs.Contains(this.SNO))
{
(source as Player).AddAchievementCounter(74987243307171, 1);
}
@ -124,28 +131,28 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations
Attributes.BroadcastChangedIfRevealed();
//handling quest triggers
if (this.World.Game.QuestProgress.QuestTriggers.ContainsKey(this.ActorSNO.Id))
if (this.World.Game.QuestProgress.QuestTriggers.ContainsKey((int)this.SNO))
{
var trigger = this.World.Game.QuestProgress.QuestTriggers[this.ActorSNO.Id];
var trigger = this.World.Game.QuestProgress.QuestTriggers[(int)this.SNO];
if (trigger.triggerType == DiIiS_NA.Core.MPQ.FileFormats.QuestStepObjectiveType.KillMonster)
{
this.World.Game.QuestProgress.UpdateCounter(this.ActorSNO.Id);
if (trigger.count == this.World.Game.QuestProgress.QuestTriggers[this.ActorSNO.Id].counter)
this.World.Game.QuestProgress.UpdateCounter((int)this.SNO);
if (trigger.count == this.World.Game.QuestProgress.QuestTriggers[(int)this.SNO].counter)
trigger.questEvent.Execute(this.World); // launch a questEvent
}
else
if (trigger.triggerType == DiIiS_NA.Core.MPQ.FileFormats.QuestStepObjectiveType.MonsterFromGroup)
{
this.World.Game.QuestProgress.UpdateCounter(this.ActorSNO.Id);
this.World.Game.QuestProgress.UpdateCounter((int)this.SNO);
}
}
else if (this.World.Game.SideQuestProgress.QuestTriggers.ContainsKey(this.ActorSNO.Id))
else if (this.World.Game.SideQuestProgress.QuestTriggers.ContainsKey((int)this.SNO))
{
var trigger = this.World.Game.SideQuestProgress.QuestTriggers[this.ActorSNO.Id];
var trigger = this.World.Game.SideQuestProgress.QuestTriggers[(int)this.SNO];
if (trigger.triggerType == DiIiS_NA.Core.MPQ.FileFormats.QuestStepObjectiveType.KillMonster)
{
this.World.Game.SideQuestProgress.UpdateSideCounter(this.ActorSNO.Id);
if (trigger.count == this.World.Game.SideQuestProgress.QuestTriggers[this.ActorSNO.Id].counter)
this.World.Game.SideQuestProgress.UpdateSideCounter((int)this.SNO);
if (trigger.count == this.World.Game.SideQuestProgress.QuestTriggers[(int)this.SNO].counter)
trigger.questEvent.Execute(this.World); // launch a questEvent
}
}

View File

@ -28,13 +28,13 @@ using System.Threading.Tasks;
namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations
{
[HandledSNO(175810)]
[HandledSNO(ActorSno._caout_stingingwinds_khamsin_gate)]
class Door : Gizmo
{
public bool isOpened = false;
public Portal NearestPortal = null;
public Door(World world, int snoId, TagMap tags)
: base(world, snoId, tags)
public Door(World world, ActorSno sno, TagMap tags)
: base(world, sno, tags)
{
var Portals = GetObjectsInRange<Portal>(10f);
if (Portals.Count > 0)
@ -49,14 +49,14 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations
public override bool Reveal(Player player)
{
if (this.ActorSNO.Id == 167185) return false;
if (this.ActorSNO.Id == 207615 && this.World.SNO != WorldSno.a2dun_aqd_oasis_randomfacepuzzle_large) return false; //dakab door
if (this.ActorSNO.Id == 153836 && this.World.SNO == WorldSno.a2dun_aqd_oasis_randomfacepuzzle_large) return false; //not dakab door
if (this.SNO == ActorSno._trout_cultists_summoning_portal_b) return false;
if (this.SNO == ActorSno._a2dun_aqd_godhead_door_largepuzzle && this.World.SNO != WorldSno.a2dun_aqd_oasis_randomfacepuzzle_large) return false; //dakab door
if (this.SNO == ActorSno._a2dun_aqd_godhead_door && this.World.SNO == WorldSno.a2dun_aqd_oasis_randomfacepuzzle_large) return false; //not dakab door
if (this.ActorSNO.Id == 220337) //Treasure Room door
if (this.SNO == ActorSno._a2dun_zolt_random_portal_timed) //Treasure Room door
this.isOpened = true;
if (this.ActorSNO.Id == 178161 && (float)DiIiS_NA.Core.Helpers.Math.FastRandom.Instance.NextDouble() < 0.3f) //Mysterious Cave door
if (this.SNO == ActorSno._caout_oasis_mine_entrance_a && (float)DiIiS_NA.Core.Helpers.Math.FastRandom.Instance.NextDouble() < 0.3f) //Mysterious Cave door
this.isOpened = true;
if (!base.Reveal(player))

View File

@ -30,8 +30,8 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations
private ResolvedPortalDestination Destination { get; set; }
public DungeonStonePortal(World world, int snoId, TagMap tags)
: base(world, snoId, tags)
public DungeonStonePortal(World world, ActorSno sno, TagMap tags)
: base(world, sno, tags)
{
//this.Field2 = 0x9;//16;
@ -79,7 +79,7 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations
{
StartingPoint NeededStartingPoint = world.GetStartingPointById(this.Destination.StartingPointActorTag);
var DestWorld = world.Game.GetWorld((WorldSno)this.Destination.WorldSNO);
var StartingPoints = DestWorld.GetActorsBySNO(5502);
var StartingPoints = DestWorld.GetActorsBySNO(ActorSno._start_location_0);
foreach (var ST in StartingPoints)
{
if (ST.CurrentScene.SceneSNO.Id == this.Destination.StartingPointActorTag)

View File

@ -1,4 +1,5 @@
//Blizzless Project 2022
using DiIiS_NA.D3_GameServer.Core.Types.SNO;
using DiIiS_NA.GameServer.Core.Types.TagMap;
//Blizzless Project 2022
using DiIiS_NA.GameServer.GSSystem.PlayerSystem;
@ -21,11 +22,11 @@ using System.Threading.Tasks;
namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations
{
[HandledSNO(451547)] //EquipmentManagerTest
[HandledSNO(ActorSno._equipmentmanagertest)] //EquipmentManagerTest
class EquipmentManager : InteractiveNPC
{
public EquipmentManager(MapSystem.World world, int snoID, TagMap tags)
: base(world, snoID, tags)
public EquipmentManager(MapSystem.World world, ActorSno sno, TagMap tags)
: base(world, sno, tags)
{
this.Attributes[GameAttribute.MinimapActive] = true;
}

View File

@ -1,4 +1,5 @@
//Blizzless Project 2022
using DiIiS_NA.D3_GameServer.Core.Types.SNO;
using DiIiS_NA.GameServer.Core.Types.TagMap;
//Blizzless Project 2022
using DiIiS_NA.GameServer.GSSystem.MapSystem;
@ -8,20 +9,20 @@ using DiIiS_NA.GameServer.MessageSystem;
namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations
{
[HandledSNO(
129345, //maghda
5360, //Leoric ghost
211014, //Maghda event
215247, //Diablo_EndGame
186130, //DemonVoiceover
321479, 321451, 321454, //A5 voice actors
175310, //PT_Mystic_NoVendor_NonGlobalFollower
340101, //x1_Urzael_Invisible
373456 //Malthael ghost
ActorSno._maghda_a_tempprojection, //maghda
ActorSno._skeletonking_ghost, //Leoric ghost
ActorSno._maghda_nolaugh, //Maghda event
ActorSno._diablo_endgame, //Diablo_EndGame
ActorSno._demonvoiceover, //DemonVoiceover
ActorSno._x1_westm_heroworship03_vo, ActorSno._x1_westm_heroworship01_vo, ActorSno._x1_westm_heroworship02_vo, //A5 voice actors
ActorSno._pt_mystic_novendor_nonglobalfollower, //PT_Mystic_NoVendor_NonGlobalFollower
ActorSno._x1_urzael_invisible, //x1_Urzael_Invisible
ActorSno._x1_malthael_deathorbevent //Malthael ghost
)]
public class Ghost : InteractiveNPC
{
public Ghost(MapSystem.World world, int snoId, TagMap tags)
: base(world, snoId, tags)
public Ghost(World world, ActorSno sno, TagMap tags)
: base(world, sno, tags)
{
this.CollFlags = 0;
this.WalkSpeed = 0;

View File

@ -19,15 +19,14 @@ using System;
namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations
{
[HandledSNO(
5984, //treasureGoblin_A
5985, //treasureGoblin_B
5987, //treasureGoblin_C
5988 //treasureGoblin_D
ActorSno._treasuregoblin_a, //treasureGoblin_A
ActorSno._treasuregoblin_b, //treasureGoblin_B
ActorSno._treasuregoblin_c //treasureGoblin_C
)]
public class Goblin : Monster
{
public Goblin(World world, int snoId, TagMap tags)//, int level = 1)
: base(world, snoId, tags)
public Goblin(World world, ActorSno sno, TagMap tags)//, int level = 1)
: base(world, sno, tags)
{
// Override minimap icon in markerset tags
this.WalkSpeed = 0;

View File

@ -1,6 +1,7 @@

//Blizzless Project 2022
using System.Linq;
using DiIiS_NA.D3_GameServer.Core.Types.SNO;
//Blizzless Project 2022
using DiIiS_NA.GameServer.Core.Types.TagMap;
//Blizzless Project 2022
@ -12,13 +13,13 @@ using DiIiS_NA.GameServer.MessageSystem.Message.Definitions.World;
namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations
{
[HandledSNO(4860 /* PlayerHeadstone.acr */)]
[HandledSNO(ActorSno._playerheadstone /* PlayerHeadstone.acr */)]
class Headstone : Gizmo
{
public int playerIndex { get; set; }
public Headstone(World world, int snoId, TagMap tags, int playerIndex = -1)
: base(world, snoId, tags)
public Headstone(World world, ActorSno sno, TagMap tags, int playerIndex = -1)
: base(world, sno, tags)
{
this.playerIndex = playerIndex;
this.Attributes[GameAttribute.MinimapActive] = true;

View File

@ -1,5 +1,6 @@
//Blizzless Project 2022
using System.Linq;
using DiIiS_NA.D3_GameServer.Core.Types.SNO;
//Blizzless Project 2022
using DiIiS_NA.GameServer.Core.Types.TagMap;
//Blizzless Project 2022
@ -11,11 +12,16 @@ using DiIiS_NA.GameServer.MessageSystem.Message.Definitions.World;
namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations
{
[HandledSNO(141246, 226343, 226345, 309879)]
[HandledSNO(
ActorSno._priest_male_b_nolook,
ActorSno._priest_caldeum,
ActorSno._priest_bastionskeep_healer,
ActorSno._x1_a5_westmhub_healer
)]
public sealed class Healer : InteractiveNPC
{
public Healer(World world, int snoId, TagMap tags)
: base(world, snoId, tags)
public Healer(World world, ActorSno sno, TagMap tags)
: base(world, sno, tags)
{
this.Attributes[GameAttribute.TeamID] = 0;
this.Attributes[GameAttribute.MinimapActive] = true;

View File

@ -1,4 +1,5 @@
//Blizzless Project 2022
using DiIiS_NA.D3_GameServer.Core.Types.SNO;
using DiIiS_NA.GameServer.Core.Types.TagMap;
//Blizzless Project 2022
using DiIiS_NA.GameServer.GSSystem.MapSystem;
@ -21,8 +22,8 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations
{
class Healthwell : Gizmo
{
public Healthwell(World world, int snoId, TagMap tags)
: base(world, snoId, tags)
public Healthwell(World world, ActorSno sno, TagMap tags)
: base(world, sno, tags)
{
Attributes[GameAttribute.MinimapActive] = true;
Attributes[GameAttribute.Gizmo_State] = 0;

View File

@ -32,8 +32,8 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations
public Player Owner = null;
public HearthPortal(World world, int snoId, TagMap tags)
: base(world, snoId, tags)
public HearthPortal(World world, ActorSno sno, TagMap tags)
: base(world, sno, tags)
{
this.Attributes[GameAttribute.MinimapActive] = true;
this.SetVisible(false);

View File

@ -1,5 +1,6 @@
//Blizzless Project 2022
using DiIiS_NA.Core.Helpers.Math;
using DiIiS_NA.D3_GameServer.Core.Types.SNO;
//Blizzless Project 2022
using DiIiS_NA.GameServer.Core.Types.TagMap;
//Blizzless Project 2022
@ -23,13 +24,34 @@ using System.Threading.Tasks;
namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations
{
[HandledSNO(81610, 105372, 81609, 107419, 106354, 115928, 144328, 176826)]
[HandledSNO(
ActorSno._a1_genericvendor_tinker,
ActorSno._a1_uniquevendor_alchemist,
ActorSno._a1_uniquevendor_armorer,
ActorSno._a1_uniquevendor_curios,
ActorSno._a1_uniquevendor_weaponsmith,
ActorSno._a2_uniquevendor_event_mapvendor,
ActorSno._a2_uniquevendor_tinker,
ActorSno._a3_uniquevendor_alchemist
)]
public class HiddenVendor : Vendor
{
// TODO: extract
private static readonly Dictionary<ActorSno, ulong> criteria = new Dictionary<ActorSno, ulong>
{
[ActorSno._a1_genericvendor_tinker] = 74987243309911,
[ActorSno._a1_uniquevendor_alchemist] = 74987243309912,
[ActorSno._a1_uniquevendor_armorer] = 74987243309913,
[ActorSno._a1_uniquevendor_curios] = 74987243309914,
[ActorSno._a1_uniquevendor_weaponsmith] = 74987243309915,
[ActorSno._a2_uniquevendor_event_mapvendor] = 74987243309918,
[ActorSno._a2_uniquevendor_tinker] = 74987243309920,
[ActorSno._a3_uniquevendor_alchemist] = 74987243309922
};
private bool Enabled = false;
public HiddenVendor(World world, int snoId, TagMap tags)
: base(world, snoId, tags)
public HiddenVendor(World world, ActorSno sno, TagMap tags)
: base(world, sno, tags)
{
this.Enabled = (FastRandom.Instance.Next(100) < 40);
}
@ -57,33 +79,8 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations
public override void OnTargeted(PlayerSystem.Player player, TargetMessage message)
{
base.OnTargeted(player, message);
switch (this.ActorSNO.Id)
{
case 81610:
player.GrantCriteria(74987243309911);
break;
case 105372:
player.GrantCriteria(74987243309912);
break;
case 81609:
player.GrantCriteria(74987243309913);
break;
case 107419:
player.GrantCriteria(74987243309914);
break;
case 106354:
player.GrantCriteria(74987243309915);
break;
case 115928:
player.GrantCriteria(74987243309918);
break;
case 144328:
player.GrantCriteria(74987243309920);
break;
case 176826:
player.GrantCriteria(74987243309922);
break;
}
if (criteria.ContainsKey(SNO))
player.GrantCriteria(criteria[SNO]);
}
}
}

View File

@ -10,26 +10,27 @@ using DiIiS_NA.GameServer.Core.Types.TagMap;
using DiIiS_NA.Core.Storage.AccountDataBase.Entities;
//Blizzless Project 2022
using DiIiS_NA.Core.Helpers.Hash;
using DiIiS_NA.D3_GameServer.Core.Types.SNO;
namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations.Hirelings
{
[HandledSNO(4062 /* Enchantress.acr */)]
[HandledSNO(ActorSno._enchantress /* Enchantress.acr */)]
public class Enchantress : Hireling
{
public Enchantress(MapSystem.World world, int snoId, TagMap tags)
: base(world, snoId, tags)
public Enchantress(MapSystem.World world, ActorSno sno, TagMap tags)
: base(world, sno, tags)
{
mainSNO = 4062;
hirelingSNO = 4482;
proxySNO = 192942;
mainSNO = ActorSno._enchantress;
hirelingSNO = ActorSno._hireling_enchantress;
proxySNO = ActorSno._hireling_enchantress_proxy;
skillKit = 484938;
hirelingGBID = StringHashHelper.HashItemName("Enchantress");
this.Attributes[GameAttribute.Hireling_Class] = 3;
}
public override Hireling CreateHireling(MapSystem.World world, int snoId, TagMap tags)
public override Hireling CreateHireling(MapSystem.World world, ActorSno sno, TagMap tags)
{
return new Enchantress(world, snoId, tags);
return new Enchantress(world, sno, tags);
}
public void SetSkill(Player player, int SkillSNOId)

View File

@ -36,14 +36,15 @@ using DiIiS_NA.GameServer.GSSystem.AISystem.Brains;
using DiIiS_NA.GameServer.GSSystem.ItemsSystem;
//Blizzless Project 2022
using DiIiS_NA.GameServer.MessageSystem.Message.Definitions.Hireling;
using DiIiS_NA.D3_GameServer.Core.Types.SNO;
namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations.Hirelings
{
public class Hireling : InteractiveNPC, IUpdateable
{
protected int mainSNO = -1;
protected int hirelingSNO = -1;
protected int proxySNO = -1;
protected ActorSno mainSNO = ActorSno.__NONE;
protected ActorSno hirelingSNO = ActorSno.__NONE;
protected ActorSno proxySNO = ActorSno.__NONE;
protected int skillKit = -1;
protected int hirelingGBID = -1;
@ -51,15 +52,15 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations.Hirelings
// Resource generation timing
private int _lastResourceUpdateTick;
public bool IsProxy { get { return ActorSNO.Id == proxySNO; } }
public bool IsHireling { get { return ActorSNO.Id == hirelingSNO; } }
public bool HasHireling { get { return this.hirelingSNO != -1; } }
public bool HasProxy { get { return this.proxySNO != -1; } }
public bool IsProxy { get { return SNO == proxySNO; } }
public bool IsHireling { get { return SNO == hirelingSNO; } }
public bool HasHireling { get { return this.hirelingSNO != ActorSno.__NONE; } }
public bool HasProxy { get { return this.proxySNO != ActorSno.__NONE; } }
public int PetType { get { return IsProxy ? 22 : 0; } }
private Dictionary<Player, Dictionary<int, Item>> _equipment = new Dictionary<Player, Dictionary<int, Item>>();
public Hireling(MapSystem.World world, int snoId, TagMap tags)
: base(world, snoId, tags)
public Hireling(MapSystem.World world, ActorSno sno, TagMap tags)
: base(world, sno, tags)
{
this.Attributes[GameAttribute.TeamID] = 2;
Interactions.Add(new HireInteraction());
@ -156,7 +157,7 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations.Hirelings
}
public virtual Hireling CreateHireling(MapSystem.World world, int snoId, TagMap tags)
public virtual Hireling CreateHireling(MapSystem.World world, ActorSno sno, TagMap tags)
{
throw new NotImplementedException();
}
@ -231,7 +232,7 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations.Hirelings
public override void OnHire(Player player)
{
if (hirelingSNO == -1)
if (hirelingSNO == ActorSno.__NONE)
return;
if (this.World.Game.Players.Count > 1) return;
@ -274,7 +275,7 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations.Hirelings
}
if (player.ActiveHireling == null)
return;
if (proxySNO == -1)
if (proxySNO == ActorSno.__NONE)
return;
if (IsHireling || IsProxy)
@ -447,7 +448,7 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations.Hirelings
Owner = player.PlayerIndex,
Index = 10,
PetId = this.DynamicID(player),
Type = this.ActorSNO.Id == 274457 ? 29 : 0,
Type = this.SNO == ActorSno._x1_malthael_npc ? 29 : 0,
});
return true;

View File

@ -1,5 +1,6 @@
//Blizzless Project 2022
using DiIiS_NA.Core.Helpers.Hash;
using DiIiS_NA.D3_GameServer.Core.Types.SNO;
//Blizzless Project 2022
using DiIiS_NA.GameServer.Core.Types.TagMap;
//Blizzless Project 2022
@ -21,15 +22,16 @@ using System.Threading.Tasks;
namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations.Hirelings
{
//[HandledSNO(144681 /* Leah_Party.acr */)]
public class Leah : Hireling
// TODO: Check for copy-paste from Scoundrel
//[HandledSNO(144681 /* Leah_Party.acr */)]
public class Leah : Hireling
{
public Leah(World world, int snoId, TagMap tags)
: base(world, snoId, tags)
public Leah(World world, ActorSno sno, TagMap tags)
: base(world, sno, tags)
{
mainSNO = 4580;
hirelingSNO = 52694;
proxySNO = 192941;
mainSNO = ActorSno._leah;
hirelingSNO = ActorSno._hireling_scoundrel;
proxySNO = ActorSno._hireling_scoundrel_proxy;
skillKit = 0x8AFE;
hirelingGBID = StringHashHelper.HashItemName("Scoundrel");
Attributes[GameAttribute.Hireling_Class] = 4;
@ -49,9 +51,9 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations.Hirelings
}
public override Hireling CreateHireling(World world, int snoId, TagMap tags)
public override Hireling CreateHireling(World world, ActorSno sno, TagMap tags)
{
return new Leah(world, snoId, tags);
return new Leah(world, sno, tags);
}
public override bool Reveal(Player player)

View File

@ -10,18 +10,19 @@ using DiIiS_NA.GameServer.Core.Types.TagMap;
using DiIiS_NA.Core.Storage.AccountDataBase.Entities;
//Blizzless Project 2022
using DiIiS_NA.Core.Helpers.Hash;
using DiIiS_NA.D3_GameServer.Core.Types.SNO;
namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations.Hirelings
{
public class MalthaelHireling : Hireling
{
public MalthaelHireling(MapSystem.World world, int snoId, TagMap tags)
: base(world, snoId, tags)
public MalthaelHireling(MapSystem.World world, ActorSno sno, TagMap tags)
: base(world, sno, tags)
{
//Brain = new AISystem.Brains.HirelingBrain(this);
mainSNO = 365908;
hirelingSNO = 274457;
proxySNO = 0x0002F1AC;
mainSNO = ActorSno._x1_malthael_npc_nocollision;
hirelingSNO = ActorSno._x1_malthael_npc;
proxySNO = ActorSno._hireling_templar_proxy;
skillKit = 484941;
hirelingGBID = StringHashHelper.HashItemName("Templar");
this.Attributes[GameAttribute.Hireling_Class] = 0;
@ -29,9 +30,9 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations.Hirelings
this.Attributes[GameAttribute.Team_Override] = 2;
}
public override Hireling CreateHireling(MapSystem.World world, int snoId, TagMap tags)
public override Hireling CreateHireling(MapSystem.World world, ActorSno sno, TagMap tags)
{
return new MalthaelHireling(world, snoId, tags);
return new MalthaelHireling(world, sno, tags);
}
public void SetSkill(Player player, int SkillSNOId)

View File

@ -10,26 +10,27 @@ using DiIiS_NA.GameServer.Core.Types.TagMap;
using DiIiS_NA.Core.Storage.AccountDataBase.Entities;
//Blizzless Project 2022
using DiIiS_NA.Core.Helpers.Hash;
using DiIiS_NA.D3_GameServer.Core.Types.SNO;
namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations.Hirelings
{
[HandledSNO(4644 /* Scoundrel.acr */)]
[HandledSNO(ActorSno._scoundrel /* Scoundrel.acr */)]
public class Scoundrel : Hireling
{
public Scoundrel(MapSystem.World world, int snoId, TagMap tags)
: base(world, snoId, tags)
public Scoundrel(MapSystem.World world, ActorSno sno, TagMap tags)
: base(world, sno, tags)
{
mainSNO = 4644;
hirelingSNO = 52694;
proxySNO = 192941;
mainSNO = ActorSno._scoundrel;
hirelingSNO = ActorSno._hireling_scoundrel;
proxySNO = ActorSno._hireling_scoundrel_proxy;
skillKit = 484937;
hirelingGBID = StringHashHelper.HashItemName("Scoundrel");
Attributes[GameAttribute.Hireling_Class] = 2;
}
public override Hireling CreateHireling(MapSystem.World world, int snoId, TagMap tags)
public override Hireling CreateHireling(MapSystem.World world, ActorSno sno, TagMap tags)
{
return new Scoundrel(world, snoId, tags);
return new Scoundrel(world, sno, tags);
}
public void SetSkill(Player player, int SkillSNOId)

View File

@ -10,26 +10,27 @@ using DiIiS_NA.GameServer.Core.Types.TagMap;
using DiIiS_NA.Core.Storage.AccountDataBase.Entities;
//Blizzless Project 2022
using DiIiS_NA.Core.Helpers.Hash;
using DiIiS_NA.D3_GameServer.Core.Types.SNO;
namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations.Hirelings
{
[HandledSNO(4538 /* Templar.acr */)]
[HandledSNO(ActorSno._templar /* Templar.acr */)]
public class Templar : Hireling
{
public Templar(MapSystem.World world, int snoId, TagMap tags)
: base(world, snoId, tags)
public Templar(MapSystem.World world, ActorSno sno, TagMap tags)
: base(world, sno, tags)
{
mainSNO = 4538;
hirelingSNO = 0x0000CDD5;
proxySNO = 0x0002F1AC;
mainSNO = ActorSno._templar;
hirelingSNO = ActorSno._hireling_templar;
proxySNO = ActorSno._hireling_templar_proxy;
skillKit = 484941;
hirelingGBID = StringHashHelper.HashItemName("Templar");
this.Attributes[GameAttribute.Hireling_Class] = 1;
}
public override Hireling CreateHireling(MapSystem.World world, int snoId, TagMap tags)
public override Hireling CreateHireling(MapSystem.World world, ActorSno sno, TagMap tags)
{
return new Templar(world, snoId, tags);
return new Templar(world, sno, tags);
}
public void SetSkill(Player player, int SkillSNOId)

View File

@ -1,4 +1,5 @@
//Blizzless Project 2022
using DiIiS_NA.D3_GameServer.Core.Types.SNO;
using DiIiS_NA.GameServer.Core.Types.TagMap;
//Blizzless Project 2022
using System;
@ -15,20 +16,20 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations
{
[HandledSNO(
//act 1
109467,
ActorSno._trout_barkeep,
//act 2
180291,
ActorSno._a2_uniquevendor_innkeeper,
//act 3
181473,
ActorSno._a3_uniquevendor_innkeeper,
//act 4
182413,
ActorSno._a4_uniquevendor_innkeeper,
//act 5
309718
)]
ActorSno._x1_a5_uniquevendor_innkeeper
)]
public class Innkeeper : Vendor
{
public Innkeeper(MapSystem.World world, int snoId, TagMap tags)
: base(world, snoId, tags)
public Innkeeper(MapSystem.World world, ActorSno sno, TagMap tags)
: base(world, sno, tags)
{
}

View File

@ -1,4 +1,5 @@
//Blizzless Project 2022
using DiIiS_NA.D3_GameServer.Core.Types.SNO;
using DiIiS_NA.GameServer.Core.Types.TagMap;
//Blizzless Project 2022
using System;
@ -13,37 +14,36 @@ using System.Threading.Tasks;
namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations
{
[HandledSNO(361241)]
[HandledSNO(ActorSno._x1_randomitemnpc)]
public class Kadala : Vendor
{
public Kadala(MapSystem.World world, int snoId, TagMap tags)
: base(world, snoId, tags)
private static readonly int[] itemGbIds = new int[]
{
-1492848355,
-594428401,
2050033703,
-2026108002,
-537237168,
-1493063970,
-2010009315,
1281756953,
-1492484569,
1816611999,
-767866790,
-1099096773,
-1780286480,
215071258,
-1492657844,
-1843121997
};
public Kadala(MapSystem.World world, ActorSno sno, TagMap tags)
: base(world, sno, tags)
{
}
protected override List<ItemsSystem.Item> GetVendorItems()
{
var list = new List<ItemsSystem.Item>
{
ItemsSystem.ItemGenerator.CookFromDefinition(this.World, ItemsSystem.ItemGenerator.GetItemDefinition(-1492848355), 1, false),
ItemsSystem.ItemGenerator.CookFromDefinition(this.World, ItemsSystem.ItemGenerator.GetItemDefinition(-594428401), 1, false),
ItemsSystem.ItemGenerator.CookFromDefinition(this.World, ItemsSystem.ItemGenerator.GetItemDefinition(2050033703), 1, false),
ItemsSystem.ItemGenerator.CookFromDefinition(this.World, ItemsSystem.ItemGenerator.GetItemDefinition(-2026108002), 1, false),
ItemsSystem.ItemGenerator.CookFromDefinition(this.World, ItemsSystem.ItemGenerator.GetItemDefinition(-537237168), 1, false),
ItemsSystem.ItemGenerator.CookFromDefinition(this.World, ItemsSystem.ItemGenerator.GetItemDefinition(-1493063970), 1, false),
ItemsSystem.ItemGenerator.CookFromDefinition(this.World, ItemsSystem.ItemGenerator.GetItemDefinition(-2010009315), 1, false),
ItemsSystem.ItemGenerator.CookFromDefinition(this.World, ItemsSystem.ItemGenerator.GetItemDefinition(1281756953), 1, false),
ItemsSystem.ItemGenerator.CookFromDefinition(this.World, ItemsSystem.ItemGenerator.GetItemDefinition(-1492484569), 1, false),
ItemsSystem.ItemGenerator.CookFromDefinition(this.World, ItemsSystem.ItemGenerator.GetItemDefinition(1816611999), 1, false),
ItemsSystem.ItemGenerator.CookFromDefinition(this.World, ItemsSystem.ItemGenerator.GetItemDefinition(-767866790), 1, false),
ItemsSystem.ItemGenerator.CookFromDefinition(this.World, ItemsSystem.ItemGenerator.GetItemDefinition(-1099096773), 1, false),
ItemsSystem.ItemGenerator.CookFromDefinition(this.World, ItemsSystem.ItemGenerator.GetItemDefinition(-1780286480), 1, false),
ItemsSystem.ItemGenerator.CookFromDefinition(this.World, ItemsSystem.ItemGenerator.GetItemDefinition(215071258), 1, false),
ItemsSystem.ItemGenerator.CookFromDefinition(this.World, ItemsSystem.ItemGenerator.GetItemDefinition(-1492657844), 1, false),
ItemsSystem.ItemGenerator.CookFromDefinition(this.World, ItemsSystem.ItemGenerator.GetItemDefinition(-1843121997), 1, false)
};
return list;
return itemGbIds.Select(x => ItemsSystem.ItemGenerator.CookFromDefinition(this.World, ItemsSystem.ItemGenerator.GetItemDefinition(x), 1, false)).ToList();
}
public override bool Reveal(PlayerSystem.Player player)

View File

@ -6,6 +6,7 @@ using System.Collections.Generic;
using System.Linq;
//Blizzless Project 2022
using DiIiS_NA.Core.Helpers.Math;
using DiIiS_NA.D3_GameServer.Core.Types.SNO;
//Blizzless Project 2022
using DiIiS_NA.GameServer.Core.Types.TagMap;
//Blizzless Project 2022
@ -31,26 +32,26 @@ using DiIiS_NA.GameServer.MessageSystem.Message.Fields;
namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations
{
[HandledSNO(96993)]
[HandledSNO(ActorSno._a1dun_cath_chest_rare)]
class LegendaryChest : LootContainer
{
public bool ChestActive = false;
public LegendaryChest(World world, int snoId, TagMap tags)
: base(world, snoId, tags)
public LegendaryChest(World world, ActorSno sno, TagMap tags)
: base(world, sno, tags)
{
this.NameSNOId = 108122;
this.NameSNO = ActorSno._caout_stingingwinds_chest;
this.Field7 = 1;
}
public override bool Reveal(PlayerSystem.Player player)
public override bool Reveal(Player player)
{
if (!this.ChestActive) return false;
return base.Reveal(player);
}
public override void OnTargeted(PlayerSystem.Player player, TargetMessage message)
public override void OnTargeted(Player player, TargetMessage message)
{
if (this.Attributes[GameAttribute.Disabled]) return;

View File

@ -35,32 +35,32 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations
private bool haveDrop = false;
public bool rewardChestAvailable = true;
public LootContainer(World world, int snoId, TagMap tags)
: base(world, snoId, tags)
public LootContainer(World world, ActorSno sno, TagMap tags)
: base(world, sno, tags)
{
if (this.ActorSNO.Id == 200872) this.Attributes[GameAttribute.MinimapActive] = true;
if (this.SNO == ActorSno._a3dunrmpt_interactives_signal_fire_a_prop) this.Attributes[GameAttribute.MinimapActive] = true;
if (this.ActorSNO.Name.ToLower().Contains("chest") || this.ActorSNO.Name.ToLower().Contains("corpse")) haveDrop = true;
if (this.SNO.IsChest() || this.SNO.IsCorpse()) haveDrop = true;
switch (snoId)
switch (sno)
{
case 79319: //bloody
case ActorSno._trout_highlands_chest_bloody: //bloody
this.Quality = 1;
break;
case 62860: //rare
case 101500: //Zolt_rare
case 363725: //event
case ActorSno._trout_fields_chest_rare: //rare
case ActorSno._a2dun_zolt_chest_rare: //Zolt_rare
case ActorSno._x1_global_chest_startsclean: //event
this.Quality = 2;
break;
}
if (snoId == 363725) rewardChestAvailable = false;
if (sno == ActorSno._x1_global_chest_startsclean) rewardChestAvailable = false;
}
public override bool Reveal(PlayerSystem.Player player)
public override bool Reveal(Player player)
{
if (this.ActorSNO.Id == 190524 && this.World.SNO != WorldSno.a2dun_aqd_oasis_randomfacepuzzle_large) return false; //dakab chest
if (this.ActorSNO.Id == 190708 && this.World.SNO == WorldSno.a2dun_aqd_oasis_randomfacepuzzle_large) return false; //not dakab chest
if (this.SNO == ActorSno._a2dun_aqd_chest_special_facepuzzle_large && this.World.SNO != WorldSno.a2dun_aqd_oasis_randomfacepuzzle_large) return false; //dakab chest
if (this.SNO == ActorSno._a2dun_aqd_chest_rare_facepuzzlesmall && this.World.SNO == WorldSno.a2dun_aqd_oasis_randomfacepuzzle_large) return false; //not dakab chest
if (!rewardChestAvailable) return false; //event reward chest
@ -79,143 +79,139 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations
public override void OnTargeted(PlayerSystem.Player player, TargetMessage message)
public override void OnTargeted(Player player, TargetMessage message)
{
if (this.ActorSNO.Id == 450254)
if (this.SNO == ActorSno._p4_setdung_totem_cru_thorns)
return;
if (this.Attributes[GameAttribute.Disabled]) return;
base.OnTargeted(player, message);
player.AddAchievementCounter(74987243307152, 1);
if (ActorData.TagMap.ContainsKey(ActorKeys.Lore))
Logger.Debug("Lore detected: {0}", ActorData.TagMap[ActorKeys.Lore].Id);
if (this.SNO == ActorSno._trout_highlands_manor_firewood) //Leor bone
{
foreach (var plr in this.GetPlayersInRange(30))
this.World.SpawnItem(this, plr, -629520052);
}
if (this.SNO == ActorSno._trout_newtristram_adria_blackmushroom) //Black Mushroom
{
foreach (var plr in this.GetPlayersInRange(30))
this.World.SpawnItem(this, plr, -1993550104);
}
if (this.SNO == ActorSno._caout_oasis_chest_rare_mapvendorcave) //Rainbow Chest
{
foreach (var plr in this.GetPlayersInRange(30))
this.World.SpawnItem(this, plr, 725082635);
}
else
{
if (this.Attributes[GameAttribute.Disabled]) return;
base.OnTargeted(player, message);
player.AddAchievementCounter(74987243307152, 1);
if (ActorData.TagMap.ContainsKey(ActorKeys.Lore))
Logger.Debug("Lore detected: {0}", ActorData.TagMap[ActorKeys.Lore].Id);
if (this.ActorSNO.Id == 213905) //Leor bone
{
if (haveDrop)
{
var dropRates = this.World.Game.IsHardcore ? LootManager.GetSeasonalDropRates((int)this.Quality, Program.MaxLevel) : LootManager.GetDropRates((int)this.Quality, Program.MaxLevel);
foreach (var rate in dropRates)
foreach (var plr in this.GetPlayersInRange(30))
this.World.SpawnItem(this, plr, -629520052);
}
if (this.ActorSNO.Id == 172948) //Black Mushroom
{
foreach (var plr in this.GetPlayersInRange(30))
this.World.SpawnItem(this, plr, -1993550104);
}
if (this.ActorSNO.Id == 207706) //Rainbow Chest
{
foreach (var plr in this.GetPlayersInRange(30))
this.World.SpawnItem(this, plr, 725082635);
}
if (haveDrop)
{
var dropRates = this.World.Game.IsHardcore ? LootManager.GetSeasonalDropRates((int)this.Quality, Program.MaxLevel) : LootManager.GetDropRates((int)this.Quality, Program.MaxLevel);
foreach (var rate in dropRates)
foreach (var plr in this.GetPlayersInRange(30))
{
float seed = (float)FastRandom.Instance.NextDouble();
if (seed < 0.8f)
this.World.SpawnGold(this, plr);
if (seed < 0.6f)
this.World.SpawnGold(this, plr);
if (seed < 0.5f)
this.World.SpawnRandomCraftItem(this, plr);
if (seed < 0.2f)
this.World.SpawnRandomCraftItem(this, plr);
if (seed < 0.07f)
this.World.SpawnRandomGem(this, plr);
if (seed < 0.04f)
this.World.SpawnRandomGem(this, plr);
if (seed < 0.10f)
this.World.SpawnRandomPotion(this, plr);
if (seed < (rate * (1f + plr.Attributes[GameAttribute.Magic_Find])))
{
float seed = (float)FastRandom.Instance.NextDouble();
if (seed < 0.8f)
this.World.SpawnGold(this, plr);
if (seed < 0.6f)
this.World.SpawnGold(this, plr);
if (seed < 0.5f)
this.World.SpawnRandomCraftItem(this, plr);
if (seed < 0.2f)
this.World.SpawnRandomCraftItem(this, plr);
if (seed < 0.07f)
this.World.SpawnRandomGem(this, plr);
if (seed < 0.04f)
this.World.SpawnRandomGem(this, plr);
if (seed < 0.10f)
this.World.SpawnRandomPotion(this, plr);
if (seed < (rate * (1f + plr.Attributes[GameAttribute.Magic_Find])))
{
var lootQuality = this.World.Game.IsHardcore ? LootManager.GetSeasonalLootQuality((int)this.Quality, this.World.Game.Difficulty) : LootManager.GetLootQuality((int)this.Quality, this.World.Game.Difficulty);
this.World.SpawnRandomEquip(plr, plr, lootQuality);
}
else
break;
var lootQuality = this.World.Game.IsHardcore ? LootManager.GetSeasonalLootQuality((int)this.Quality, this.World.Game.Difficulty) : LootManager.GetLootQuality((int)this.Quality, this.World.Game.Difficulty);
this.World.SpawnRandomEquip(plr, plr, lootQuality);
}
}
if (GeneratorsSystem.LoreRegistry.Lore.ContainsKey(this.World.SNO) && GeneratorsSystem.LoreRegistry.Lore[this.World.SNO].chests_lore.ContainsKey(this.ActorSNO.Id))
foreach (var p in this.GetPlayersInRange(30))
foreach (int loreId in GeneratorsSystem.LoreRegistry.Lore[this.World.SNO].chests_lore[this.ActorSNO.Id])
if (!p.HasLore(loreId))
{
World.DropItem(this, null, ItemGenerator.CreateLore(p, loreId));
break;
}
World.BroadcastIfRevealed(plr => new PlayAnimationMessage
{
ActorID = this.DynamicID(plr),
AnimReason = 5,
UnitAniimStartTime = 0,
tAnim = new PlayAnimationMessageSpec[]
{
new PlayAnimationMessageSpec()
{
Duration = 50,
AnimationSNO = AnimationSet.TagMapAnimDefault[AnimationSetKeys.Opening],
PermutationIndex = 0,
AnimationTag = 0,
Speed = 1
}
else
break;
}
}
}, this);
if (GeneratorsSystem.LoreRegistry.Lore.ContainsKey(this.World.SNO) && GeneratorsSystem.LoreRegistry.Lore[this.World.SNO].chests_lore.ContainsKey(this.SNO))
foreach (var p in this.GetPlayersInRange(30))
foreach (int loreId in GeneratorsSystem.LoreRegistry.Lore[this.World.SNO].chests_lore[this.SNO])
if (!p.HasLore(loreId))
{
World.DropItem(this, null, ItemGenerator.CreateLore(p, loreId));
break;
}
World.BroadcastIfRevealed(plr => new SetIdleAnimationMessage
World.BroadcastIfRevealed(plr => new PlayAnimationMessage
{
ActorID = this.DynamicID(plr),
AnimReason = 5,
UnitAniimStartTime = 0,
tAnim = new PlayAnimationMessageSpec[]
{
ActorID = this.DynamicID(plr),
AnimationSNO = AnimationSetKeys.Open.ID
}, this);
this.Attributes[GameAttribute.Gizmo_Has_Been_Operated] = true;
//this.Attributes[GameAttribute.Gizmo_Operator_ACDID] = unchecked((int)player.DynamicID);
this.Attributes[GameAttribute.Chest_Open, 0xFFFFFF] = true;
Attributes.BroadcastChangedIfRevealed();
this.Attributes[GameAttribute.Disabled] = true;
if (this.ActorSNO.Id == 5747)
new PlayAnimationMessageSpec()
{
var lamp = this.GetActorsInRange(50f).Where(x => x.ActorSNO.Id == 5744 || x.ActorSNO.Id == 89503).First();
if (lamp != null)
(lamp as CathedralLamp).Die();
Duration = 50,
AnimationSNO = AnimationSet.TagMapAnimDefault[AnimationSetKeys.Opening],
PermutationIndex = 0,
AnimationTag = 0,
Speed = 1
}
}
if (this.ActorSNO.Id == 2975)
{
if (this.World.SNO == WorldSno.a2dun_zolt_level01)
foreach (var plr in this.World.Game.Players.Values)
plr.InGameClient.SendMessage(new QuestCounterMessage()
{
snoQuest = 57337,
snoLevelArea = -1,
StepID = 35,
TaskIndex = 0,
Counter = 1,
Checked = 1,
});
else
foreach (var plr in this.World.Game.Players.Values)
plr.InGameClient.SendMessage(new QuestCounterMessage()
{
snoQuest = 57337,
snoLevelArea = -1,
StepID = 35,
TaskIndex = 1,
Counter = 1,
Checked = 1,
});
}
}, this);
World.BroadcastIfRevealed(plr => new SetIdleAnimationMessage
{
ActorID = this.DynamicID(plr),
AnimationSNO = AnimationSetKeys.Open.ID
}, this);
this.Attributes[GameAttribute.Gizmo_Has_Been_Operated] = true;
//this.Attributes[GameAttribute.Gizmo_Operator_ACDID] = unchecked((int)player.DynamicID);
this.Attributes[GameAttribute.Chest_Open, 0xFFFFFF] = true;
Attributes.BroadcastChangedIfRevealed();
this.Attributes[GameAttribute.Disabled] = true;
if (this.SNO == ActorSno._trdun_cath_chandelier_trap_switch2)
{
var lamp = this.GetActorsInRange(50f).Where(x => x.SNO == ActorSno._trdun_cath_chandelier_trap || x.SNO == ActorSno._trdun_cath_braizer_trap).First();
if (lamp != null)
(lamp as CathedralLamp).Die();
}
if (this.SNO == ActorSno._a2dun_zolt_centerpiece_a)
{
if (this.World.SNO == WorldSno.a2dun_zolt_level01)
foreach (var plr in this.World.Game.Players.Values)
plr.InGameClient.SendMessage(new QuestCounterMessage()
{
snoQuest = 57337,
snoLevelArea = -1,
StepID = 35,
TaskIndex = 0,
Counter = 1,
Checked = 1,
});
else
foreach (var plr in this.World.Game.Players.Values)
plr.InGameClient.SendMessage(new QuestCounterMessage()
{
snoQuest = 57337,
snoLevelArea = -1,
StepID = 35,
TaskIndex = 1,
Counter = 1,
Checked = 1,
});
}
}
}

View File

@ -32,14 +32,14 @@ using DiIiS_NA.GameServer.MessageSystem.Message.Fields;
namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations
{
[HandledSNO(345935)]
[HandledSNO(ActorSno._x1_openworld_lootrunportal)]
public class LootRunPortal : Portal
{
static readonly Logger Logger = LogManager.CreateLogger();
private int MinimapIcon;
public LootRunPortal(World world, int snoId, TagMap tags)
: base(world, snoId, tags)
public LootRunPortal(World world, ActorSno sno, TagMap tags)
: base(world, sno, tags)
{
this.Destination = new ResolvedPortalDestination
{
@ -79,7 +79,7 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations
public override void OnTargeted(Player player, TargetMessage message)
{
Logger.Debug("(OnTargeted) Portal has been activated, Id: {0}, LevelArea: {1}, World: {2}", this.ActorSNO.Id, this.Destination.DestLevelAreaSNO, this.Destination.WorldSNO);
Logger.Debug("(OnTargeted) Portal has been activated, Id: {0}, LevelArea: {1}, World: {2}", (int)this.SNO, this.Destination.DestLevelAreaSNO, this.Destination.WorldSNO);
var world = this.World.Game.GetWorld((WorldSno)this.Destination.WorldSNO);
@ -93,7 +93,7 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations
if (startingPoint != null)
{
if (this.ActorSNO.Id == 230751) //a2 timed event
if (this.SNO == ActorSno._a2dun_zolt_portal_timedevent) //a2 timed event
{
if (!this.World.Game.QuestManager.SideQuests[120396].Completed)
player.ShowConfirmation(this.DynamicID(player), (() => {

View File

@ -12,6 +12,7 @@ using DiIiS_NA.GameServer.GSSystem.TickerSystem;
using DiIiS_NA.GameServer.GSSystem.PlayerSystem;
//Blizzless Project 2022
using DiIiS_NA.GameServer.GSSystem.MapSystem;
using DiIiS_NA.D3_GameServer.Core.Types.SNO;
namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations.Minions
{
@ -20,7 +21,7 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations.Minions
public new int SummonLimit = 1;
public AncientKorlic(World world, PowerContext context, int AncientsID)
: base(world, 90443, context.User, null)
: base(world, ActorSno._barbarian_calloftheancients_1, context.User, null)
{
Scale = 1.2f; //they look cooler bigger :)
//TODO: get a proper value for this.
@ -47,8 +48,8 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations.Minions
{
if (this.Master is Player)
{
if ((this.Master as Player).Followers.Values.Count(a => a == 90443) > 1)
(this.Master as Player).DestroyFollower(90443);
if ((this.Master as Player).Followers.Values.Count(a => a == SNO) > 1)
(this.Master as Player).DestroyFollower(SNO);
}
}

View File

@ -12,6 +12,7 @@ using DiIiS_NA.GameServer.GSSystem.TickerSystem;
using DiIiS_NA.GameServer.GSSystem.PlayerSystem;
//Blizzless Project 2022
using DiIiS_NA.GameServer.GSSystem.MapSystem;
using DiIiS_NA.D3_GameServer.Core.Types.SNO;
namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations.Minions
{
@ -20,7 +21,7 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations.Minions
public new int SummonLimit = 1;
public AncientMawdawc(World world, PowerContext context, int AncientsID)
: base(world, 90536, context.User, null)
: base(world, ActorSno._barbarian_calloftheancients_3, context.User, null)
{
Scale = 1.2f; //they look cooler bigger :)
//TODO: get a proper value for this.
@ -47,8 +48,8 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations.Minions
{
if (this.Master is Player)
{
if ((this.Master as Player).Followers.Values.Count(a => a == 90536) > 1)
(this.Master as Player).DestroyFollower(90536);
if ((this.Master as Player).Followers.Values.Count(a => a == SNO) > 1)
(this.Master as Player).DestroyFollower(SNO);
}
}

View File

@ -12,6 +12,7 @@ using DiIiS_NA.GameServer.GSSystem.TickerSystem;
using DiIiS_NA.GameServer.GSSystem.PlayerSystem;
//Blizzless Project 2022
using DiIiS_NA.GameServer.GSSystem.MapSystem;
using DiIiS_NA.D3_GameServer.Core.Types.SNO;
namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations.Minions
{
@ -20,7 +21,7 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations.Minions
public new int SummonLimit = 1;
public AncientTalic(World world, PowerContext context, int AncientsID)
: base(world, 90535, context.User, null)
: base(world, ActorSno._barbarian_calloftheancients_2, context.User, null)
{
Scale = 1.2f; //they look cooler bigger :)
//TODO: get a proper value for this.
@ -47,8 +48,8 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations.Minions
{
if (this.Master is Player)
{
if ((this.Master as Player).Followers.Values.Count(a => a == 90535) > 1)
(this.Master as Player).DestroyFollower(90535);
if ((this.Master as Player).Followers.Values.Count(a => a == SNO) > 1)
(this.Master as Player).DestroyFollower(SNO);
}
}

View File

@ -12,13 +12,14 @@ using DiIiS_NA.GameServer.GSSystem.TickerSystem;
using DiIiS_NA.GameServer.GSSystem.PlayerSystem;
//Blizzless Project 2022
using DiIiS_NA.GameServer.GSSystem.MapSystem;
using DiIiS_NA.D3_GameServer.Core.Types.SNO;
namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations.Minions
{
class AvatarMelee : Minion
{
public AvatarMelee(World world, PowerContext context, int AvatarID, float damageMult, TickTimer lifeTime)
: base(world, 345682, context.User, null)
: base(world, ActorSno._x1_crusader_phalanx, context.User, null)
{
Scale = 1.2f;
WalkSpeed *= 5;
@ -42,7 +43,7 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations.Minions
class AvatarRanged : Minion
{
public AvatarRanged(World world, PowerContext context, int AvatarID, float damageMult, TickTimer lifeTime)
: base(world, 369795, context.User, null)
: base(world, ActorSno._x1_crusader_phalanxarcher, context.User, null)
{
Scale = 1f;
WalkSpeed *= 5;

View File

@ -14,6 +14,7 @@ using DiIiS_NA.GameServer.GSSystem.PlayerSystem;
using DiIiS_NA.GameServer.GSSystem.MapSystem;
//Blizzless Project 2022
using System.Collections.Generic;
using DiIiS_NA.D3_GameServer.Core.Types.SNO;
namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations.Minions
{
@ -24,10 +25,17 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations.Minions
public new int SummonLimit = 1;
public static List<int> Companions = new List<int>() { 133741, 173827, 181748, 159098, 159102, 178664 };
private static readonly List<ActorSno> Companions = new List<ActorSno>() {
ActorSno._dh_companion,
ActorSno._dh_companion_spider,
ActorSno._dh_companion_boar,
ActorSno._dh_companion_runec,
ActorSno._dh_companion_runed,
ActorSno._dh_companion_ferret
};
public CompanionMinion(World world, PowerContext context, int CompanionSNOId)
: base(world, CompanionSNOId, context.User, null)
public CompanionMinion(World world, PowerContext context, ActorSno CompanionSNO)
: base(world, CompanionSNO, context.User, null)
{
Scale = 1.2f;
if (context.User.Attributes[GameAttribute.Rune_B, 0x000592ff] > 0) Scale = 2f; //Boar
@ -38,7 +46,7 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations.Minions
this.Attributes[GameAttribute.Invulnerable] = true;
this.Attributes[GameAttribute.Is_Helper] = true;
this.Attributes[GameAttribute.Summoned_By_SNO] = context.PowerSNO;
if (CompanionSNOId == 178664)
if (CompanionSNO == ActorSno._dh_companion_ferret)
SetBrain(new LooterBrain(this, false));
else
{

View File

@ -12,6 +12,7 @@ using DiIiS_NA.GameServer.GSSystem.TickerSystem;
using DiIiS_NA.GameServer.GSSystem.PlayerSystem;
//Blizzless Project 2022
using DiIiS_NA.GameServer.GSSystem.MapSystem;
using DiIiS_NA.D3_GameServer.Core.Types.SNO;
namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations.Minions
{
@ -19,8 +20,8 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations.Minions
{
//107031, 106731, 106749, 107067, 107107, 107112
public CorpseSpider(World world, PowerContext context, int snoId, int SpiderID)
: base(world, snoId, context.User, null)
public CorpseSpider(World world, PowerContext context, ActorSno sno, int SpiderID)
: base(world, sno, context.User, null)
{
Scale = 0.7f; //they look cooler bigger :)
//TODO: get a proper value for this.

View File

@ -14,6 +14,7 @@ using DiIiS_NA.GameServer.GSSystem.PlayerSystem;
using DiIiS_NA.GameServer.GSSystem.MapSystem;
//Blizzless Project 2022
using System.Collections.Generic;
using DiIiS_NA.D3_GameServer.Core.Types.SNO;
namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations.Minions
{
@ -24,7 +25,7 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations.Minions
public new int SummonLimit = 1;
public CorpseSpiderQueen(World world, PowerContext context, int SpiderID)
: base(world, 106749, context.User, null)
: base(world, ActorSno._witchdoctor_corpsespider_indigorune, context.User, null)
{
Scale = 0.7f; //they look cooler bigger :)
//TODO: get a proper value for this.
@ -54,7 +55,7 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations.Minions
{
var rem = new List<uint>();
foreach (var fol in (this.Master as Player).Followers)
if (fol.Value == 106749 && fol.Key != this.GlobalID)
if (fol.Value == SNO && fol.Key != this.GlobalID)
rem.Add(fol.Key);
foreach (var rm in rem)
(this.Master as Player).DestroyFollowerById(rm);

View File

@ -14,6 +14,7 @@ using DiIiS_NA.GameServer.GSSystem.PlayerSystem;
using DiIiS_NA.GameServer.GSSystem.MapSystem;
//Blizzless Project 2022
using System.Collections.Generic;
using DiIiS_NA.D3_GameServer.Core.Types.SNO;
namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations.Minions
{
@ -21,7 +22,7 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations.Minions
{
//Melee - 87189, 89933 - ranged, 90320 - shaman, skeleton? - 89934
public FetishHunter(World world, PowerContext context, int FetishID)
: base(world, 89933, context.User, null)
: base(world, ActorSno._fetish_ranged_a, context.User, null)
{
Scale = 1.2f; //they look cooler bigger :)
//TODO: get a proper value for this.

View File

@ -14,6 +14,7 @@ using DiIiS_NA.GameServer.GSSystem.PlayerSystem;
using DiIiS_NA.GameServer.GSSystem.MapSystem;
//Blizzless Project 2022
using System.Collections.Generic;
using DiIiS_NA.D3_GameServer.Core.Types.SNO;
namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations.Minions
{
@ -21,7 +22,7 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations.Minions
{
//Melee - 87189, 89933 - ranged, 90320 - shaman, skeleton? - 89934
public FetishMelee(World world, PowerContext context, int FetishID)
: base(world, 87189, context.User, null)
: base(world, ActorSno._fetish_melee_a, context.User, null)
{
Scale = 1.2f; //they look cooler bigger :)
//TODO: get a proper value for this.

View File

@ -14,6 +14,7 @@ using DiIiS_NA.GameServer.GSSystem.PlayerSystem;
using DiIiS_NA.GameServer.GSSystem.MapSystem;
//Blizzless Project 2022
using System.Collections.Generic;
using DiIiS_NA.D3_GameServer.Core.Types.SNO;
namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations.Minions
{
@ -21,7 +22,7 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations.Minions
{
//Melee - 87189, 89933 - ranged, 90320 - shaman, skeleton? - 89934
public FetishShaman(World world, PowerContext context, int FetishID)
: base(world, 90320, context.User, null)
: base(world, ActorSno._fetish_shaman_a, context.User, null)
{
Scale = 1.2f; //they look cooler bigger :)
//TODO: get a proper value for this.

View File

@ -14,13 +14,14 @@ using DiIiS_NA.GameServer.GSSystem.PlayerSystem;
using DiIiS_NA.GameServer.GSSystem.MapSystem;
//Blizzless Project 2022
using System.Collections.Generic;
using DiIiS_NA.D3_GameServer.Core.Types.SNO;
namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations.Minions
{
class GargantuanMinion : Minion
{
public GargantuanMinion(World world, PowerContext context, int GargID)
: base(world, 122305, context.User, null)
: base(world, ActorSno._wd_gargantuan, context.User, null)
{
Scale = 1f;
//TODO: get a proper value for this.
@ -58,7 +59,7 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations.Minions
{
var rem = new List<uint>();
foreach (var fol in (this.Master as Player).Followers)
if (fol.Value == 122305 && fol.Key != this.GlobalID)
if (fol.Value == SNO && fol.Key != this.GlobalID)
rem.Add(fol.Key);
foreach (var rm in rem)
(this.Master as Player).DestroyFollowerById(rm);

View File

@ -1,4 +1,5 @@
//Blizzless Project 2022
using DiIiS_NA.D3_GameServer.Core.Types.SNO;
using DiIiS_NA.GameServer.Core.Types.TagMap;
//Blizzless Project 2022
using DiIiS_NA.GameServer.GSSystem.AISystem.Brains;
@ -33,8 +34,8 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations.Minions
//[460042] [Actor] p6_BloodGolem
public class BaseGolem : Minion
{
public BaseGolem(MapSystem.World world, ActorSystem.Actor master)
: base(world, 471947, master, null)
public BaseGolem(World world, Actor master)
: base(world, ActorSno._p6_necro_revive_golem, master, null)
{
Scale = 1.35f;
//TODO: get a proper value for this.
@ -53,8 +54,8 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations.Minions
}
public class ConsumeFleshGolem : Minion
{
public ConsumeFleshGolem(MapSystem.World world, ActorSystem.Actor master)
: base(world, 471646, master, null)
public ConsumeFleshGolem(World world, Actor master)
: base(world, ActorSno._p6_consumefleshgolem, master, null)
{
Scale = 1.35f;
//TODO: get a proper value for this.
@ -73,7 +74,8 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations.Minions
}
public class IceGolem : Minion
{
public IceGolem(MapSystem.World world, ActorSystem.Actor master) : base(world, 471647, master, null)
public IceGolem(World world, Actor master)
: base(world, ActorSno._p6_icegolem, master, null)
{
Scale = 1.35f;
//TODO: get a proper value for this.
@ -92,7 +94,8 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations.Minions
}
public class BoneGolem : Minion
{
public BoneGolem(MapSystem.World world, ActorSystem.Actor master) : base(world, 465239, master, null)
public BoneGolem(World world, Actor master)
: base(world, ActorSno._p6_bonegolem, master, null)
{
Scale = 1.35f;
//TODO: get a proper value for this.
@ -110,7 +113,8 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations.Minions
}
public class DecayGolem : Minion
{
public DecayGolem(MapSystem.World world, ActorSystem.Actor master) : base(world, 471619, master, null)
public DecayGolem(World world, Actor master)
: base(world, ActorSno._p6_decaygolem, master, null)
{
Scale = 1.35f;
//TODO: get a proper value for this.
@ -129,7 +133,8 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations.Minions
}
public class BloodGolem : Minion
{
public BloodGolem(MapSystem.World world, ActorSystem.Actor master) : base(world, 460042, master, null)
public BloodGolem(World world, Actor master)
: base(world, ActorSno._p6_bloodgolem, master, null)
{
Scale = 1.35f;
//TODO: get a proper value for this.

View File

@ -14,13 +14,14 @@ using DiIiS_NA.GameServer.GSSystem.PlayerSystem;
using DiIiS_NA.GameServer.GSSystem.MapSystem;
//Blizzless Project 2022
using System.Collections.Generic;
using DiIiS_NA.D3_GameServer.Core.Types.SNO;
namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations.Minions
{
class HexMinion : Minion
{
public HexMinion(World world, PowerContext context, int HexID)
: base(world, 107826, context.User, null)
: base(world, ActorSno._fetish_hex, context.User, null)
{
Scale = 1f;
//TODO: get a proper value for this.

View File

@ -14,6 +14,7 @@ using DiIiS_NA.GameServer.GSSystem.PlayerSystem;
using DiIiS_NA.GameServer.GSSystem.MapSystem;
//Blizzless Project 2022
using System.Collections.Generic;
using DiIiS_NA.D3_GameServer.Core.Types.SNO;
namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations.Minions
{
@ -22,7 +23,7 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations.Minions
public new int SummonLimit = 1;
public LooterPetAnniversary(World world, Actor master)
: base(world, 4093, master, null)
: base(world, ActorSno._fallenlunatic_a, master, null)
{
Scale = 0.75f;
this.WalkSpeed *= 5;

View File

@ -14,13 +14,14 @@ using DiIiS_NA.GameServer.GSSystem.PlayerSystem;
using DiIiS_NA.GameServer.GSSystem.MapSystem;
//Blizzless Project 2022
using System.Collections.Generic;
using DiIiS_NA.D3_GameServer.Core.Types.SNO;
namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations.Minions
{
class MirrorImageMinion : Minion
{
public MirrorImageMinion(World world, PowerContext context, int ImageID, float lifetime)
: base(world, 98010, context.User, null) //male Mirror images
: base(world, ActorSno._wizard_mirrorimage_female, context.User, null) //female Mirror images
{
Scale = 1.2f; //they look cooler bigger :)
//TODO: get a proper value for this.
@ -41,13 +42,13 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations.Minions
LifeTime = TickTimer.WaitSeconds(world.Game, lifetime);
if (this.Master != null && context.ScriptFormula(1) < (this.Master as Player).Followers.Values.Where(f => f == 98010).Count())
if (this.Master != null && context.ScriptFormula(1) < (this.Master as Player).Followers.Values.Where(f => f == SNO).Count())
{
if (this.Master is Player)
{
var rem = new List<uint>();
foreach (var fol in (this.Master as Player).Followers.Where(f => f.Key != this.GlobalID).Take((this.Master as Player).Followers.Values.Where(f => f == 98010).Count() - (int)context.ScriptFormula(1)))
if (fol.Value == 98010)
foreach (var fol in (this.Master as Player).Followers.Where(f => f.Key != this.GlobalID).Take((this.Master as Player).Followers.Values.Where(f => f == SNO).Count() - (int)context.ScriptFormula(1)))
if (fol.Value == SNO)
rem.Add(fol.Key);
foreach (var rm in rem)
(this.Master as Player).DestroyFollowerById(rm);

View File

@ -14,6 +14,7 @@ using DiIiS_NA.GameServer.GSSystem.PlayerSystem;
using DiIiS_NA.GameServer.GSSystem.MapSystem;
//Blizzless Project 2022
using System.Collections.Generic;
using DiIiS_NA.D3_GameServer.Core.Types.SNO;
namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations.Minions
{
@ -21,7 +22,7 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations.Minions
{
public new int SummonLimit = 1;
public MysticAllyMinion(World world, PowerContext context, int MysticAllyID)
public MysticAllyMinion(World world, PowerContext context, ActorSno MysticAllyID)
: base(world, MysticAllyID, context.User, null)
{
Scale = 1.35f; //they look cooler bigger :)

View File

@ -1,4 +1,5 @@
//Blizzless Project 2022
using DiIiS_NA.D3_GameServer.Core.Types.SNO;
using DiIiS_NA.GameServer.Core.Types.TagMap;
//Blizzless Project 2022
using DiIiS_NA.GameServer.GSSystem.AISystem.Brains;
@ -25,8 +26,8 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations.Minions
{
class NecromancerSkeleton_A : Minion
{
public NecromancerSkeleton_A(MapSystem.World world, int snoId, ActorSystem.Actor master)
: base(world, snoId, master, null)
public NecromancerSkeleton_A(MapSystem.World world, ActorSno sno, ActorSystem.Actor master)
: base(world, sno, master, null)
{
Scale = 1.35f;

View File

@ -14,6 +14,7 @@ using DiIiS_NA.GameServer.GSSystem.PlayerSystem;
using DiIiS_NA.GameServer.GSSystem.MapSystem;
//Blizzless Project 2022
using System.Collections.Generic;
using DiIiS_NA.D3_GameServer.Core.Types.SNO;
namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations.Minions
{
@ -22,10 +23,18 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations.Minions
//Changes creature with each rune,
//RuneSelect(141402, 168815, 150024, 150025, 150026, 150027)
public static List<int> Sentries = new List<int>() { 141402, 168815, 150024, 150025, 150026, 150027 };
public static readonly List<ActorSno> Sentries = new List<ActorSno>()
{
ActorSno._dh_sentry,
ActorSno._dh_sentry_tether,
ActorSno._dh_sentry_addsduration,
ActorSno._dh_sentry_addsmissiles,
ActorSno._dh_sentry_addsheals,
ActorSno._dh_sentry_addsshield
};
public SentryMinion(World world, PowerContext context, int SentrySNOId)
: base(world, SentrySNOId, context.User, null)
public SentryMinion(World world, PowerContext context, ActorSno SentrySNO)
: base(world, SentrySNO, context.User, null)
{
Scale = 1.2f;
//TODO: get a proper value for this.

View File

@ -1,4 +1,5 @@
//Blizzless Project 2022
using DiIiS_NA.D3_GameServer.Core.Types.SNO;
using DiIiS_NA.GameServer.GSSystem.AISystem.Brains;
//Blizzless Project 2022
using DiIiS_NA.GameServer.GSSystem.MapSystem;
@ -25,7 +26,7 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations.Minions
{
public bool Rune_Flesh = false;
//Melee - 87189, 89933 - ranged, 90320 - shaman, skeleton? - 89934
public SkeletalMage(World world, PowerContext context, int FetishID, int SNO)
public SkeletalMage(World world, PowerContext context, int FetishID, ActorSno SNO)
: base(world, SNO, context.User, null)
{
Scale = 1.2f;

View File

@ -14,6 +14,7 @@ using DiIiS_NA.GameServer.GSSystem.PlayerSystem;
using DiIiS_NA.GameServer.GSSystem.MapSystem;
//Blizzless Project 2022
using System.Collections.Generic;
using DiIiS_NA.D3_GameServer.Core.Types.SNO;
namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations.Minions
{
@ -22,7 +23,7 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations.Minions
public new int SummonLimit = 10;
public WallCreeper(World world, PowerContext context, int creeperID)
: base(world, 146534, context.User, null)
: base(world, ActorSno._wd_wallofzombiesrune_spawn, context.User, null)
{
Scale = 1.2f; //they look cooler bigger :)
//TODO: get a proper value for this.

View File

@ -14,6 +14,7 @@ using DiIiS_NA.GameServer.GSSystem.PlayerSystem;
using DiIiS_NA.GameServer.GSSystem.MapSystem;
//Blizzless Project 2022
using System.Collections.Generic;
using DiIiS_NA.D3_GameServer.Core.Types.SNO;
namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations.Minions
{
@ -22,7 +23,7 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations.Minions
public new int SummonLimit = 4;
public ZombieDog(World world, Actor master, int dogID, float mul = 1f)
: base(world, 51353, master, null)
: base(world, ActorSno._wd_zombiedog, master, null)
{
Scale = 1.35f;
//TODO: get a proper value for this.

View File

@ -8,6 +8,7 @@ using System.Linq;
using System.Text;
//Blizzless Project 2022
using System.Threading.Tasks;
using DiIiS_NA.D3_GameServer.Core.Types.SNO;
//Blizzless Project 2022
using DiIiS_NA.GameServer.Core.Types.TagMap;
//Blizzless Project 2022
@ -20,11 +21,11 @@ using DiIiS_NA.GameServer.MessageSystem;
namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations.Monsters
{
#region Unique_CaptainDaltyn
[HandledSNO(156801)]
[HandledSNO(ActorSno._unique_captaindaltyn)]
public class Unique_CaptainDaltyn : Monster
{
public Unique_CaptainDaltyn(World world, int snoId, TagMap tags)
: base(world, snoId, tags)
public Unique_CaptainDaltyn(World world, ActorSno sno, TagMap tags)
: base(world, sno, tags)
{
this.Attributes[GameAttribute.MinimapActive] = true;
this.Attributes[GameAttribute.Immune_To_Charm] = true;

View File

@ -1,4 +1,5 @@
//Blizzless Project 2022
using DiIiS_NA.D3_GameServer.Core.Types.SNO;
using DiIiS_NA.GameServer.Core.Types.TagMap;
//Blizzless Project 2022
using DiIiS_NA.GameServer.GSSystem.AISystem.Brains;
@ -20,11 +21,11 @@ using System.Threading.Tasks;
namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations.Monsters
{
//89578 GlobalId: 1015703058 Position: x:338 y:320.78137 z:-11.422008 Name: a1dun_leor_firewall1
[HandledSNO(89578)]
public class a1dun_firewall : Monster
[HandledSNO(ActorSno._a1dun_leor_firewall1, ActorSno._a1dun_leor_firewall2)]
public class A1dun_firewall : Monster
{
public a1dun_firewall(World world, int snoId, TagMap tags)
: base(world, snoId, tags)
public A1dun_firewall(World world, ActorSno sno, TagMap tags)
: base(world, sno, tags)
{
this.Field2 = 0x8;
this.CollFlags = 0;

View File

@ -2,6 +2,7 @@
using DiIiS_NA.Core.MPQ;
//Blizzless Project 2022
using DiIiS_NA.Core.MPQ.FileFormats;
using DiIiS_NA.D3_GameServer.Core.Types.SNO;
//Blizzless Project 2022
using DiIiS_NA.GameServer.Core.Types.SNO;
//Blizzless Project 2022
@ -19,11 +20,11 @@ using MonsterFF = DiIiS_NA.Core.MPQ.FileFormats.Monster;
namespace DiIiS_NA.GameServer.GSSystem.ActorSystem
{
[HandledSNO(5998)]
[HandledSNO(ActorSno._tristramgateguardr)]
class ArrowGuardian : NPC, IUpdateable
{
public ArrowGuardian(MapSystem.World world, int snoID, TagMap tags)
: base(world, snoID, tags)
public ArrowGuardian(MapSystem.World world, ActorSno sno, TagMap tags)
: base(world, sno, tags)
{
Brain = new AggressiveNPCBrain(this); // erekose

View File

@ -10,14 +10,15 @@ using DiIiS_NA.GameServer.Core.Types.TagMap;
using DiIiS_NA.GameServer.GSSystem.PlayerSystem;
//Blizzless Project 2022
using DiIiS_NA.GameServer.MessageSystem.Message.Definitions.World;
using DiIiS_NA.D3_GameServer.Core.Types.SNO;
namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations
{
[HandledSNO(435707)] //px_Ruins_Frost_Camp_BarbNPC
[HandledSNO(ActorSno._px_ruins_frost_camp_barbnpc)] //px_Ruins_Frost_Camp_BarbNPC
public class BarbarianNPC : InteractiveNPC
{
public BarbarianNPC(World world, int snoId, TagMap tags)
: base(world, snoId, tags)
public BarbarianNPC(World world, ActorSno sno, TagMap tags)
: base(world, sno, tags)
{ }
protected override void ReadTags()

View File

@ -1,4 +1,5 @@
//Blizzless Project 2022
using DiIiS_NA.D3_GameServer.Core.Types.SNO;
using DiIiS_NA.GameServer.Core.Types.TagMap;
//Blizzless Project 2022
using DiIiS_NA.GameServer.GSSystem.PlayerSystem;
@ -19,11 +20,11 @@ using System.Threading.Tasks;
namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations
{
[HandledSNO(470782)] //SNO - 470782, Name - P6_ChallengeRift_Nephalem
[HandledSNO(ActorSno._p6_challengerift_nephalem)] //SNO - 470782, Name - P6_ChallengeRift_Nephalem
class CR_Nephalem : InteractiveNPC
{
public CR_Nephalem(MapSystem.World world, int snoId, TagMap tags)
: base(world, snoId, tags)
public CR_Nephalem(MapSystem.World world, ActorSno sno, TagMap tags)
: base(world, sno, tags)
{
Conversations.Clear();
Conversations.Add(new Interactions.ConversationInteraction(471065));

View File

@ -12,14 +12,15 @@ using DiIiS_NA.GameServer.GSSystem.PlayerSystem;
using DiIiS_NA.GameServer.MessageSystem.Message.Definitions.World;
//Blizzless Project 2022
using DiIiS_NA.GameServer.MessageSystem;
using DiIiS_NA.D3_GameServer.Core.Types.SNO;
namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations
{
[HandledSNO(3533)] //Cain
[HandledSNO(ActorSno._cain)] //Cain
public class Cain : InteractiveNPC
{
public Cain(World world, int snoId, TagMap tags)
: base(world, snoId, tags)
public Cain(World world, ActorSno sno, TagMap tags)
: base(world, sno, tags)
{
this.Attributes[GameAttribute.Invulnerable] = true;
}

View File

@ -2,6 +2,7 @@
using DiIiS_NA.Core.MPQ;
//Blizzless Project 2022
using DiIiS_NA.Core.MPQ.FileFormats;
using DiIiS_NA.D3_GameServer.Core.Types.SNO;
//Blizzless Project 2022
using DiIiS_NA.GameServer.Core.Types.SNO;
//Blizzless Project 2022
@ -19,11 +20,25 @@ using MonsterFF = DiIiS_NA.Core.MPQ.FileFormats.Monster;
namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations
{
[HandledSNO(3739, 174436, 205189, 3546, 164195, 181857, 181858, 362323, 362440, 284568, 378363, 361670, 256248, 275409)]
[HandledSNO(
ActorSno._captainrumfoord,
ActorSno._angel_trooper_a,
ActorSno._bastionskeepguard_melee_a_01_stationedguard,
ActorSno._caldeumguard_cleaver_a,
ActorSno._caldeumguard_cleaver_a_jarulf,
ActorSno._caldeumguard_cleaver_a_town,
ActorSno._caldeumguard_spear_imperial_town,
ActorSno._x1_westmhub_guardnohelmunarmed,
ActorSno._x1_westmhub_guard_patrol,
ActorSno._x1_westmhub_guard,
ActorSno._x1_westmhub_guardnohelm,
ActorSno._x1_malthael,
ActorSno._x1_imperius
)]
class CaptainRumford : InteractiveNPC, IUpdateable
{
public CaptainRumford(MapSystem.World world, int snoID, TagMap tags)
: base(world, snoID, tags)
public CaptainRumford(MapSystem.World world, ActorSno sno, TagMap tags)
: base(world, sno, tags)
{
Brain = new AggressiveNPCBrain(this); // erekose
@ -48,9 +63,6 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations
}
base.ReadTags();
if (this.ActorSNO.Id == 256248)
this.Attributes[GameAttribute.TeamID] = 0;
}
public void Update(int tickCounter)

View File

@ -1,15 +1,16 @@
//Blizzless Project 2022
using DiIiS_NA.D3_GameServer.Core.Types.SNO;
using DiIiS_NA.GameServer.Core.Types.TagMap;
//Blizzless Project 2022
using DiIiS_NA.GameServer.MessageSystem;
namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations
{
[HandledSNO(112768)]
[HandledSNO(ActorSno._fate)]
class Fate : InteractiveNPC
{
public Fate(MapSystem.World world, int snoId, TagMap tags)
: base(world, snoId, tags)
public Fate(MapSystem.World world, ActorSno sno, TagMap tags)
: base(world, sno, tags)
{
this.Field7 = 1;
this.Attributes[GameAttribute.TeamID] = 2;

View File

@ -1,15 +1,24 @@
//Blizzless Project 2022
using DiIiS_NA.D3_GameServer.Core.Types.SNO;
using DiIiS_NA.GameServer.Core.Types.TagMap;
//Blizzless Project 2022
using DiIiS_NA.GameServer.MessageSystem;
namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations
{
[HandledSNO(196900, 196901, 196902, 196903, 196904, 196905)] //Ghosts
[HandledSNO(
ActorSno._a4dun_aspect_ghost_01,
ActorSno._a4dun_aspect_ghost_02,
ActorSno._a4dun_aspect_ghost_03,
ActorSno._a4dun_aspect_ghost_04,
ActorSno._a4dun_aspect_ghost_05,
ActorSno._a4dun_aspect_ghost_06,
ActorSno._a4dun_aspect_ghost_07
)] //Ghosts
public class GhostOnSpire : InteractiveNPC
{
public GhostOnSpire(MapSystem.World world, int snoId, TagMap tags)
: base(world, snoId, tags)
public GhostOnSpire(MapSystem.World world, ActorSno sno, TagMap tags)
: base(world, sno, tags)
{
this.Field7 = 1;
this.Attributes[GameAttribute.TeamID] = 2;

View File

@ -2,6 +2,7 @@
using DiIiS_NA.Core.MPQ;
//Blizzless Project 2022
using DiIiS_NA.Core.MPQ.FileFormats;
using DiIiS_NA.D3_GameServer.Core.Types.SNO;
//Blizzless Project 2022
using DiIiS_NA.GameServer.Core.Types.SNO;
//Blizzless Project 2022
@ -21,8 +22,8 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations
{
class HirelingNPC : InteractiveNPC, IUpdateable
{
public HirelingNPC(MapSystem.World world, int snoID, TagMap tags)
: base(world, snoID, tags)
public HirelingNPC(MapSystem.World world, ActorSno sno, TagMap tags)
: base(world, sno, tags)
{
Brain = new AggressiveNPCBrain(this); // erekose
@ -47,9 +48,6 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations
}
base.ReadTags();
if (this.ActorSNO.Id == 256248)
this.Attributes[GameAttribute.TeamID] = 0;
}
public void Update(int tickCounter)

View File

@ -1,15 +1,16 @@
//Blizzless Project 2022
using DiIiS_NA.D3_GameServer.Core.Types.SNO;
using DiIiS_NA.GameServer.Core.Types.TagMap;
//Blizzless Project 2022
using DiIiS_NA.GameServer.MessageSystem;
namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations
{
[HandledSNO(114074)]
[HandledSNO(ActorSno._hope)]
class Hope : InteractiveNPC
{
public Hope(MapSystem.World world, int snoId, TagMap tags)
: base(world, snoId, tags)
public Hope(MapSystem.World world, ActorSno sno, TagMap tags)
: base(world, sno, tags)
{
this.Field7 = 1;
this.Attributes[GameAttribute.TeamID] = 2;

View File

@ -8,18 +8,19 @@ using DiIiS_NA.GameServer.MessageSystem;
namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations
{
[HandledSNO(308474, //X1_WestM_Intro_Human_Male
309191, //X1_WestM_Intro_Human_Male2
181563, //vizjereiMale_A_Town
210087, //Zakarum_Female_Wealthy_Gates
190390, //A3_Hub_SacrificeLadyNew
378376 //x1_WestmHub_Guard_NoLoS_KnownWithScene
)]
[HandledSNO(
ActorSno._x1_westm_intro_human_male, //X1_WestM_Intro_Human_Male
ActorSno._x1_westm_intro_human_male2, //X1_WestM_Intro_Human_Male2
ActorSno._vizjereimale_a_town, //vizjereiMale_A_Town
ActorSno._zakarum_female_wealthy_gates, //Zakarum_Female_Wealthy_Gates
ActorSno._a3_hub_sacrificeladynew, //A3_Hub_SacrificeLadyNew
ActorSno._x1_westmhub_guard_nolos_knownwithscene //x1_WestmHub_Guard_NoLoS_KnownWithScene
)]
class Humans : NPC
{
private bool _collapsed = false;
public Humans(World world, int snoId, TagMap tags)
: base(world, snoId, tags)
public Humans(World world, ActorSno sno, TagMap tags)
: base(world, sno, tags)
{
this.Field7 = 1;
this.Attributes[GameAttribute.TeamID] = 2;
@ -44,20 +45,25 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations
_collapsed = true;
if (this.World.SNO == WorldSno.x1_westm_intro)
switch (this.ActorSNO.Id)
switch (this.SNO)
{
case 308474:
case ActorSno._x1_westm_intro_human_male:
if (this.Position.X > 1440)
StartConversation(this.World, 311433);
else
{
foreach (var man in this.World.GetActorsBySNO(308474)) if (man.CurrentScene.SceneSNO.Id == this.CurrentScene.SceneSNO.Id) man.PlayActionAnimation(306544);
foreach (var man in this.World.GetActorsBySNO(309191)) if (man.CurrentScene.SceneSNO.Id == this.CurrentScene.SceneSNO.Id) man.PlayActionAnimation(306544);
foreach (var man in this.World.GetActorsBySNO(310653)) if (man.CurrentScene.SceneSNO.Id == this.CurrentScene.SceneSNO.Id) man.PlayActionAnimation(306544);
foreach (var man in this.World.GetActorsBySNO(310631)) if (man.CurrentScene.SceneSNO.Id == this.CurrentScene.SceneSNO.Id) man.PlayActionAnimation(306544);
foreach (var man in this.World.GetActorsBySNO(
ActorSno._x1_westm_intro_human_male,
ActorSno._x1_westm_intro_human_male2,
ActorSno._x1_westm_intro_human_female,
ActorSno._x1_westmarchfemale_deathmaidenkill
))
{
if (man.CurrentScene.SceneSNO.Id == this.CurrentScene.SceneSNO.Id) man.PlayActionAnimation(306544);
}
}
break;
case 309191:
case ActorSno._x1_westm_intro_human_male2:
if (this.Position.X > 1300 & this.Position.Y > 440)
{
StartConversation(this.World, 311435);
@ -73,9 +79,14 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations
+ [5] {70976 = 328782} DiIiS_NA.GameServer.Core.Types.TagMap.TagMapEntry
+ [6] {98304 = 330015} DiIiS_NA.GameServer.Core.Types.TagMap.TagMapEntry
*/
foreach (var man in this.World.GetActorsBySNO(308474)) if (man.CurrentScene.SceneSNO.Id == this.CurrentScene.SceneSNO.Id) man.PlayActionAnimation(306544);
foreach (var man in this.World.GetActorsBySNO(309191)) if (man.CurrentScene.SceneSNO.Id == this.CurrentScene.SceneSNO.Id) man.PlayActionAnimation(306544);
foreach (var man in this.World.GetActorsBySNO(310653)) if (man.CurrentScene.SceneSNO.Id == this.CurrentScene.SceneSNO.Id) man.PlayActionAnimation(306544);
foreach (var man in this.World.GetActorsBySNO(
ActorSno._x1_westm_intro_human_male,
ActorSno._x1_westm_intro_human_male2,
ActorSno._x1_westm_intro_human_female
))
{
if (man.CurrentScene.SceneSNO.Id == this.CurrentScene.SceneSNO.Id) man.PlayActionAnimation(306544);
}
}

View File

@ -10,16 +10,17 @@ using DiIiS_NA.GameServer.Core.Types.TagMap;
using DiIiS_NA.GameServer.GSSystem.PlayerSystem;
//Blizzless Project 2022
using DiIiS_NA.GameServer.MessageSystem.Message.Definitions.World;
using DiIiS_NA.D3_GameServer.Core.Types.SNO;
namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations
{
//[ Info] [AttackPayload]: Игрок с индесом: 0 - задамажил: ID: 449323 Name: Barbarian_KKG_Event, NumInWorld: 0
//[ Info] [AttackPayload]: Игрок с индесом: 0 - задамажил: ID: 435818 Name: Barbarian_KKG, NumInWorld: 0
[HandledSNO(435818, 449323)] //Barbarian_KKG
[HandledSNO(ActorSno._barbarian_kkg, ActorSno._barbarian_kkg_event)] //Barbarian_KKG
public class Barbarian_KKG : NPC
{
public Barbarian_KKG(World world, int snoId, TagMap tags)
: base(world, snoId, tags)
public Barbarian_KKG(World world, ActorSno sno, TagMap tags)
: base(world, sno, tags)
{
this.PlayActionAnimation(449259);
}

View File

@ -10,16 +10,17 @@ using DiIiS_NA.GameServer.Core.Types.TagMap;
using DiIiS_NA.GameServer.GSSystem.PlayerSystem;
//Blizzless Project 2022
using DiIiS_NA.GameServer.MessageSystem.Message.Definitions.World;
using DiIiS_NA.D3_GameServer.Core.Types.SNO;
namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations
{
//[ Info] [AttackPayload]: Игрок с индесом: 0 - задамажил: ID: 437089 Name: Barbarian_KKG_Follower_NPC, NumInWorld: 0
[HandledSNO(437089)] //Barbarian_KKG_Follower_NPC
[HandledSNO(ActorSno._barbarian_kkg_follower_npc)] //Barbarian_KKG_Follower_NPC
public class Barbarian_KKG_Follower_NPC : NPC
{
private bool _collapsed = false;
public Barbarian_KKG_Follower_NPC(World world, int snoId, TagMap tags)
: base(world, snoId, tags)
public Barbarian_KKG_Follower_NPC(World world, ActorSno sno, TagMap tags)
: base(world, sno, tags)
{
//{[Actor] [Type: Monster] SNOId:437089 GlobalId: 1017303615 Position: x:348.598 y:853.68604 z:5.41089 Name: Barbarian_KKG_Follower_NPC}
//437394 - Рык
@ -53,7 +54,7 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations
_collapsed = true;
this.PlayActionAnimation(439753);
var Cube = World.GetActorBySNO(437895);
var Cube = World.GetActorBySNO(ActorSno._p4_ruins_frost_kanaicube_altar);
Cube.PlayActionAnimation(441642);
//{[Actor] [Type: Gizmo] SNOId:437895 GlobalId: 1017303610 Position: x:331.9304 y:867.761 z:5.41071 Name: p4_Ruins_Frost_KanaiCube_Altar}
foreach (var plr in player.InGameClient.Game.Players.Values)

View File

@ -10,15 +10,16 @@ using DiIiS_NA.GameServer.Core.Types.TagMap;
using DiIiS_NA.GameServer.GSSystem.PlayerSystem;
//Blizzless Project 2022
using DiIiS_NA.GameServer.MessageSystem.Message.Definitions.World;
using DiIiS_NA.D3_GameServer.Core.Types.SNO;
namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations
{
[HandledSNO(437073)] //p2_HQ_ZoltunKulle_NPC
public class p2_HQ_ZoltunKulle_NPC : NPC
[HandledSNO(ActorSno._p2_hq_zoltunkulle_npc)] //p2_HQ_ZoltunKulle_NPC
public class P2_HQ_ZoltunKulle_NPC : NPC
{
public p2_HQ_ZoltunKulle_NPC(World world, int snoId, TagMap tags)
: base(world, snoId, tags)
public P2_HQ_ZoltunKulle_NPC(World world, ActorSno sno, TagMap tags)
: base(world, sno, tags)
{
this.Hidden = true;
}

View File

@ -1,4 +1,5 @@
//Blizzless Project 2022
using DiIiS_NA.D3_GameServer.Core.Types.SNO;
using DiIiS_NA.GameServer.Core.Types.TagMap;
//Blizzless Project 2022
using DiIiS_NA.GameServer.MessageSystem;
@ -15,11 +16,11 @@ using System.Threading.Tasks;
namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations
{
[HandledSNO(138271)]
[HandledSNO(ActorSno._leah_afterevent31_exit)]
class LeahNPC : InteractiveNPC
{
public LeahNPC(MapSystem.World world, int snoId, TagMap tags)
: base(world, snoId, tags)
public LeahNPC(MapSystem.World world, ActorSno sno, TagMap tags)
: base(world, sno, tags)
{
this.Field7 = 1;
this.Attributes[GameAttribute.TeamID] = 2;

View File

@ -21,11 +21,11 @@ using MonsterFF = DiIiS_NA.Core.MPQ.FileFormats.Monster;
namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations
{
//{[Actor] [Type: Monster] SNOId:284530 GlobalId: 1017400498 Position: x:593.36835 y:489.5003 z:-4.8999996 Name: x1_NPC_LorathNahr}
[HandledSNO(284530)]
[HandledSNO(ActorSno._x1_npc_lorathnahr)]
class LorathNahr_NPC : InteractiveNPC, IUpdateable
{
public LorathNahr_NPC(MapSystem.World world, int snoID, TagMap tags)
: base(world, snoID, tags)
public LorathNahr_NPC(MapSystem.World world, ActorSno sno, TagMap tags)
: base(world, sno, tags)
{
Brain = new AggressiveNPCBrain(this); // erekose
@ -59,9 +59,6 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations
}
base.ReadTags();
if (this.ActorSNO.Id == 256248)
this.Attributes[GameAttribute.TeamID] = 0;
}
public void Update(int tickCounter)

View File

@ -12,14 +12,15 @@ using DiIiS_NA.GameServer.GSSystem.PlayerSystem;
using DiIiS_NA.GameServer.MessageSystem.Message.Definitions.World;
//Blizzless Project 2022
using DiIiS_NA.GameServer.MessageSystem;
using DiIiS_NA.D3_GameServer.Core.Types.SNO;
namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations
{
[HandledSNO(61524)] //PT_Mystic_NoVendor
[HandledSNO(ActorSno._pt_mystic_novendor)] //PT_Mystic_NoVendor
public class MysticNoVendor : InteractiveNPC
{
public MysticNoVendor(World world, int snoId, TagMap tags)
: base(world, snoId, tags)
public MysticNoVendor(World world, ActorSno sno, TagMap tags)
: base(world, sno, tags)
{
this.Attributes[GameAttribute.Invulnerable] = true;
}
@ -30,11 +31,11 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations
base.ReadTags();
}
}
[HandledSNO(87037)] //PT_Mystic_NoVendor
[HandledSNO(ActorSno._templarnpc)]
public class TemplarNPC : InteractiveNPC
{
public TemplarNPC(World world, int snoId, TagMap tags)
: base(world, snoId, tags)
public TemplarNPC(World world, ActorSno sno, TagMap tags)
: base(world, sno, tags)
{
this.Attributes[GameAttribute.Invulnerable] = true;
}

View File

@ -4,14 +4,15 @@ using DiIiS_NA.GameServer.Core.Types.TagMap;
using DiIiS_NA.GameServer.MessageSystem;
//Blizzless Project 2022
using DiIiS_NA.GameServer.GSSystem.MapSystem;
using DiIiS_NA.D3_GameServer.Core.Types.SNO;
namespace DiIiS_NA.GameServer.GSSystem.ActorSystem
{
[HandledSNO(453600)]
[HandledSNO(ActorSno._p43_ad_cow)]
class Cow : NPC
{
public Cow(World world, int snoId, TagMap tags)
: base(world, snoId, tags)
public Cow(World world, ActorSno sno, TagMap tags)
: base(world, sno, tags)
{
this.Field7 = 1;
this.Attributes[GameAttribute.TeamID] = 2;

View File

@ -4,14 +4,15 @@ using DiIiS_NA.GameServer.Core.Types.TagMap;
using DiIiS_NA.GameServer.MessageSystem;
//Blizzless Project 2022
using DiIiS_NA.GameServer.GSSystem.MapSystem;
using DiIiS_NA.D3_GameServer.Core.Types.SNO;
namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations
{
[HandledSNO(453551)]
[HandledSNO(ActorSno._p43_ad_farnham)]
class Farnham : InteractiveNPC
{
public Farnham(World world, int snoId, TagMap tags)
: base(world, snoId, tags)
public Farnham(World world, ActorSno sno, TagMap tags)
: base(world, sno, tags)
{
this.Field7 = 1;
this.Attributes[GameAttribute.TeamID] = 2;

View File

@ -4,14 +4,15 @@ using DiIiS_NA.GameServer.Core.Types.TagMap;
using DiIiS_NA.GameServer.MessageSystem;
//Blizzless Project 2022
using DiIiS_NA.GameServer.GSSystem.MapSystem;
using DiIiS_NA.D3_GameServer.Core.Types.SNO;
namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations
{
[HandledSNO(453553)]
[HandledSNO(ActorSno._p43_ad_griswold)]
class Griswold : InteractiveNPC
{
public Griswold(World world, int snoId, TagMap tags)
: base(world, snoId, tags)
public Griswold(World world, ActorSno sno, TagMap tags)
: base(world, sno, tags)
{
this.Field7 = 1;
this.Attributes[GameAttribute.TeamID] = 2;

View File

@ -4,14 +4,15 @@ using DiIiS_NA.GameServer.Core.Types.TagMap;
using DiIiS_NA.GameServer.MessageSystem;
//Blizzless Project 2022
using DiIiS_NA.GameServer.GSSystem.MapSystem;
using DiIiS_NA.D3_GameServer.Core.Types.SNO;
namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations
{
[HandledSNO(453554)]
[HandledSNO(ActorSno._p43_ad_ogden)]
class Ogden : InteractiveNPC
{
public Ogden(World world, int snoId, TagMap tags)
: base(world, snoId, tags)
public Ogden(World world, ActorSno sno, TagMap tags)
: base(world, sno, tags)
{
this.Field7 = 1;
this.Attributes[GameAttribute.TeamID] = 2;

View File

@ -4,14 +4,15 @@ using DiIiS_NA.GameServer.Core.Types.TagMap;
using DiIiS_NA.GameServer.MessageSystem;
//Blizzless Project 2022
using DiIiS_NA.GameServer.GSSystem.MapSystem;
using DiIiS_NA.D3_GameServer.Core.Types.SNO;
namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations
{
[HandledSNO(453555)]
[HandledSNO(ActorSno._p43_ad_pepin)]
class Pepin : InteractiveNPC
{
public Pepin(World world, int snoId, TagMap tags)
: base(world, snoId, tags)
public Pepin(World world, ActorSno sno, TagMap tags)
: base(world, sno, tags)
{
this.Field7 = 1;
this.Attributes[GameAttribute.TeamID] = 2;

View File

@ -2,6 +2,7 @@
using DiIiS_NA.Core.MPQ;
//Blizzless Project 2022
using DiIiS_NA.Core.MPQ.FileFormats;
using DiIiS_NA.D3_GameServer.Core.Types.SNO;
//Blizzless Project 2022
using DiIiS_NA.GameServer.Core.Types.SNO;
//Blizzless Project 2022
@ -19,11 +20,11 @@ using MonsterFF = DiIiS_NA.Core.MPQ.FileFormats.Monster;
namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations
{
[HandledSNO(4580)]
[HandledSNO(ActorSno._leah)]
class TownLeah : InteractiveNPC, IUpdateable
{
public TownLeah(MapSystem.World world, int snoID, TagMap tags)
: base(world, snoID, tags)
public TownLeah(MapSystem.World world, ActorSno sno, TagMap tags)
: base(world, sno, tags)
{
Brain = new AggressiveNPCBrain(this);
(Brain as AggressiveNPCBrain).PresetPowers.Clear();
@ -48,9 +49,6 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations
}
base.ReadTags();
if (this.ActorSNO.Id == 256248)
this.Attributes[GameAttribute.TeamID] = 0;
}
public void Update(int tickCounter)

View File

@ -2,6 +2,7 @@
using DiIiS_NA.Core.MPQ;
//Blizzless Project 2022
using DiIiS_NA.Core.MPQ.FileFormats;
using DiIiS_NA.D3_GameServer.Core.Types.SNO;
//Blizzless Project 2022
using DiIiS_NA.GameServer.Core.Types.SNO;
//Blizzless Project 2022
@ -19,11 +20,11 @@ using MonsterFF = DiIiS_NA.Core.MPQ.FileFormats.Monster;
namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations
{
[HandledSNO(6353)]
[HandledSNO(ActorSno._tyrael)]
class Tyrael : InteractiveNPC, IUpdateable
{
public Tyrael(MapSystem.World world, int snoID, TagMap tags)
: base(world, snoID, tags)
public Tyrael(MapSystem.World world, ActorSno sno, TagMap tags)
: base(world, sno, tags)
{
Brain = new AggressiveNPCBrain(this); // erekose
@ -48,9 +49,6 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations
}
base.ReadTags();
if (this.ActorSNO.Id == 256248)
this.Attributes[GameAttribute.TeamID] = 0;
}
public void Update(int tickCounter)

View File

@ -1,5 +1,6 @@
//Blizzless Project 2022
using DiIiS_NA.Core.Logging;
using DiIiS_NA.D3_GameServer.Core.Types.SNO;
//Blizzless Project 2022
using DiIiS_NA.GameServer.Core.Types.TagMap;
//Blizzless Project 2022
@ -8,11 +9,11 @@ using DiIiS_NA.GameServer.MessageSystem;
namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations
{
[HandledSNO(454066)]
[HandledSNO(ActorSno._p6_necro_corpse_flesh)]
class NecromancerFlesh : Gizmo
{
public NecromancerFlesh(MapSystem.World world, int snoId, TagMap tags)
: base(world, snoId, tags)
public NecromancerFlesh(MapSystem.World world, ActorSno sno, TagMap tags)
: base(world, sno, tags)
{
this.Field2 = 16;//16;
this.Field7 = 0x00000001;

View File

@ -1,4 +1,5 @@
//Blizzless Project 2022
using DiIiS_NA.D3_GameServer.Core.Types.SNO;
using DiIiS_NA.GameServer.Core.Types.TagMap;
//Blizzless Project 2022
using DiIiS_NA.GameServer.GSSystem.MapSystem;
@ -23,11 +24,11 @@ using System.Threading.Tasks;
namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations
{
[HandledSNO(364715 /* x1_OpenWorld_LootRunObelisk_B.acr */)]
[HandledSNO(ActorSno._x1_openworld_lootrunobelisk_b /* x1_OpenWorld_LootRunObelisk_B.acr */)]
public sealed class NephalemStone : Gizmo
{
public NephalemStone(World world, int snoId, TagMap tags)
: base(world, snoId, tags)
public NephalemStone(World world, ActorSno sno, TagMap tags)
: base(world, sno, tags)
{
this.Attributes[GameAttribute.TeamID] = 2;
this.Attributes[GameAttribute.MinimapActive] = true;

Some files were not shown because too many files have changed in this diff Show More