Beispiel #1
0
        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;
        }
Beispiel #2
0
        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;
        }
Beispiel #3
0
        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;
        }
Beispiel #4
0
        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);
            }
        }
Beispiel #5
0
 public void RemoveWaypoint(Waypoint Wp)
 {
     Waypoints.Remove(Wp);
 }
Beispiel #6
0
        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);
        }