public override void OnLoad() { InteractType = GenerateInteractType(Spawn.Title != 0 ? Spawn.Title : Spawn.Proto.Title); SetFaction(Spawn.Faction != 0 ? Spawn.Faction : Spawn.Proto.Faction); ItmInterface.Load(WorldMgr.GetCreatureItems(Spawn.Entry)); if (Spawn.Proto.MinLevel > Spawn.Proto.MaxLevel) Spawn.Proto.MinLevel = Spawn.Proto.MaxLevel; if (Spawn.Proto.MaxLevel <= Spawn.Proto.MinLevel) Spawn.Proto.MaxLevel = Spawn.Proto.MinLevel; if (Spawn.Proto.MaxLevel == 0) Spawn.Proto.MaxLevel = 1; if (Spawn.Proto.MinLevel == 0) Spawn.Proto.MinLevel = 1; Level = (byte)RandomMgr.Next((int)Spawn.Proto.MinLevel, (int)Spawn.Proto.MaxLevel+1); StsInterface.SetBaseStat((byte)GameData.Stats.STATS_WOUNDS, GenerateWounds(Level,Rank)); StsInterface.ApplyStats(); Health = TotalHealth; X = Zone.CalculPin((uint)(Spawn.WorldX), true); Y = Zone.CalculPin((uint)(Spawn.WorldY), false); Z = (ushort)(Spawn.WorldZ); if (Zone.ZoneId == 161) { Z += 16384; X += 16384; Y += 16384; } // TODO : Bad Height Formula /*int HeightMap = HeightMapMgr.GetHeight(Zone.ZoneId, X, Y); if (Z < HeightMap) { Log.Error("Creature", "["+Spawn.Entry+"] Invalid Height : Min=" + HeightMap + ",Z=" + Z); return; }*/ Heading = (ushort)Spawn.WorldO; WorldPosition.X = Spawn.WorldX; WorldPosition.Y = Spawn.WorldY; WorldPosition.Z = Spawn.WorldZ; SetOffset((ushort)(Spawn.WorldX >> 12), (ushort)(Spawn.WorldY >> 12)); ScrInterface.AddScript(Spawn.Proto.ScriptName); base.OnLoad(); if (Spawn.Title == 0 && Spawn.Icone == 0 && Spawn.Proto.Title == 0 && Spawn.Icone == 0 && Spawn.Emote == 0 && Spawn.Proto.FinishingQuests == null && Spawn.Proto.StartingQuests == null) { if (Faction <= 1 || Faction == 128 || Faction == 129) { SFastRandom Random = new SFastRandom(X ^ Y ^ Z); for (int i = 0; i < 3; ++i) { Waypoint Wp = new Waypoint(); Wp.X = (ushort)(X + Random.randomInt(50) + Random.randomInt(100) + Random.randomInt(150)); Wp.Y = (ushort)(Y + Random.randomInt(50) + Random.randomInt(100) + Random.randomInt(150)); Wp.Z = (ushort)Z; Wp.Speed = 10; Wp.WaitAtEndMS = (uint)(5000 + Random.randomIntAbs(10) * 1000); AiInterface.AddWaypoint(Wp); } } } IsActive = true; }
public static bool NpcAddWaypoint(Player Plr, ref List<string> Values) { Object Target = Plr.CbtInterface.GetCurrentTarget(); if (Target == null || !Target.IsCreature()) return false; Waypoint Wp = new Waypoint(); Wp.X = (ushort)Plr.X; Wp.Y = (ushort)Plr.Y; Wp.Z = (ushort)Plr.Z; Wp.WaitAtEndMS = 2000; Target.GetUnit().AiInterface.AddWaypoint(Wp); // TODO : Save it return true; }
public void EndWaypoint(long Tick) { //Log.Info("Waypoints", "Ending Waypoint"); if (!Ended) { // TODO : Messages, Emote, etc if(CurrentWaypoint.TextOnEnd != "") _Owner.GetUnit().Say(CurrentWaypoint.TextOnEnd, SystemData.ChatLogFilters.CHATLOGFILTERS_MONSTER_SAY); } NextAllowedMovementTime = Tick + CurrentWaypoint.WaitAtEndMS; CurrentWaypoint = null; Started = false; Ended = true; }
public void SetNextWaypoint(long Tick) { if (!IsWalkingBack) ++CurrentWaypointID; else --CurrentWaypointID; if (CurrentWaypointID < 0) { if (CurrentWaypointType == Waypoint.Loop) { IsWalkingBack = false; CurrentWaypointID = 0; } } else if (CurrentWaypointID >= Waypoints.Count) { if (CurrentWaypointType == Waypoint.Loop) { IsWalkingBack = true; CurrentWaypointID = Waypoints.Count - 2; } } if (CurrentWaypointID >= Waypoints.Count || CurrentWaypointID < 0) { CurrentWaypoint = null; } else { CurrentWaypoint = Waypoints[CurrentWaypointID]; StartWaypoint(Tick); } }
public void RemoveWaypoint(Waypoint Wp) { Waypoints.Remove(Wp); }
public void AddWaypoint(Waypoint Wp) { if (Waypoints.Count == 0) { Waypoint Base = new Waypoint(); Base.X = (ushort)_Owner.X; Base.Y = (ushort)_Owner.Y; Base.Z = (ushort)_Owner.Z; Base.WaitAtEndMS = 2000; Waypoints.Add(Base); } Waypoints.Add(Wp); }