Пример #1
0
        /// <summary>
        /// Adds a retaliate target for a monster that it would not normally attack
        /// </summary>
        public void AddRetaliateTarget(PhysicsObj obj)
        {
            rwLock.EnterWriteLock();
            try
            {
                if (RetaliateTargets.ContainsKey(obj.ID))
                {
                    //Console.WriteLine($"{PhysicsObj.Name}.AddRetaliateTarget({obj.Name}) - retaliate target already exists");
                    return;
                }
                //Console.WriteLine($"{PhysicsObj.Name}.AddRetaliateTarget({obj.Name})");
                RetaliateTargets.Add(obj.ID, obj);

                // we're going to add retaliate targets to the list of visible targets as well,
                // so that we don't have to traverse both VisibleTargets and RetaliateTargets
                // in all of the logic based on VisibleTargets
                if (VisibleTargets.ContainsKey(obj.ID))
                {
                    //Console.WriteLine($"{PhysicsObj.Name}.AddRetaliateTarget({obj.Name}) - visible target already exists");
                    return;
                }
                VisibleTargets.Add(obj.ID, obj);
            }
            finally
            {
                rwLock.ExitWriteLock();
            }
        }
Пример #2
0
 /// <summary>
 /// Clears all of the ObjMaint tables for an object
 /// </summary>
 private void RemoveAllObjects()
 {
     KnownObjects.Clear();
     VisibleObjects.Clear();
     DestructionQueue.Clear();
     KnownPlayers.Clear();
     VisibleTargets.Clear();
 }
Пример #3
0
        /// <summary>
        /// For monster and CombatPet FindNextTarget
        /// - for monsters, contains players and combat pets
        /// - for combat pets, contains monsters
        /// </summary>
        public bool AddVisibleTarget(PhysicsObj obj, bool clamp = true)
        {
            if (PhysicsObj.WeenieObj.IsCombatPet)
            {
                // only tracking monsters
                if (!obj.WeenieObj.IsMonster)
                {
                    Console.WriteLine($"{PhysicsObj.Name}.ObjectMaint.AddVisibleTarget({obj.Name}): tried to add a non-monster");
                    return(false);
                }
            }
            else
            {
                // only tracking players and combat pets
                if (!obj.IsPlayer && !obj.WeenieObj.IsCombatPet)
                {
                    Console.WriteLine($"{PhysicsObj.Name}.ObjectMaint.AddVisibleTarget({obj.Name}): tried to add a non-player / non-combat pet");
                    return(false);
                }
            }
            if (PhysicsObj.DatObject)
            {
                Console.WriteLine($"{PhysicsObj.Name}.ObjectMaint.AddVisibleTarget({obj.Name}): tried to add player for dat object");
                return(false);
            }

            if (clamp && InitialClamp && obj.IsPlayer && !obj.ObjMaint.KnownObjects.ContainsKey(obj.ID))
            {
                var distSq = PhysicsObj.Position.Distance2DSquared(obj.Position);

                if (distSq > InitialClamp_DistSq)
                {
                    return(false);
                }
            }

            // TryAdd for existing keys still modifies collection?
            if (VisibleTargets.ContainsKey(obj.ID))
            {
                return(false);
            }

            //Console.WriteLine($"{PhysicsObj.Name} ({PhysicsObj.ID:X8}).ObjectMaint.AddVisibleTarget({obj.Name})");

            VisibleTargets.Add(obj.ID, obj);

            // maintain inverse for monsters / combat pets
            if (!obj.IsPlayer)
            {
                obj.ObjMaint.AddVisibleTarget(PhysicsObj);
            }

            return(true);
        }
Пример #4
0
 public bool VisibleTargetsContainsKey(uint key)
 {
     rwLock.EnterReadLock();
     try
     {
         return(VisibleTargets.ContainsKey(key));
     }
     finally
     {
         rwLock.ExitReadLock();
     }
 }
Пример #5
0
        /// <summary>
        /// Called when a monster goes back to sleep
        /// </summary>
        public void ClearRetaliateTargets()
        {
            rwLock.EnterWriteLock();
            try
            {
                // remove retaliate targets from visible targets
                foreach (var retaliateTarget in RetaliateTargets)
                {
                    VisibleTargets.Remove(retaliateTarget.Key);
                }

                RetaliateTargets.Clear();
            }
            finally
            {
                rwLock.ExitWriteLock();
            }
        }
Пример #6
0
        /// <summary>
        /// For monster and CombatPet FindNextTarget
        /// - for monsters, contains players and combat pets
        /// - for combat pets, contains monsters
        /// </summary>
        private bool AddVisibleTarget(PhysicsObj obj, bool clamp = true)
        {
            if (PhysicsObj.WeenieObj.IsCombatPet)
            {
                // only tracking monsters
                if (!obj.WeenieObj.IsMonster)
                {
                    Console.WriteLine($"{PhysicsObj.Name}.ObjectMaint.AddVisibleTarget({obj.Name}): tried to add a non-monster");
                    return(false);
                }
            }
            else if (PhysicsObj.WeenieObj.IsFactionMob)
            {
                // only tracking players, combat pets, and monsters of differing faction
                if (!obj.IsPlayer && !obj.WeenieObj.IsCombatPet && (!obj.WeenieObj.IsMonster || PhysicsObj.WeenieObj.SameFaction(obj)))
                {
                    Console.WriteLine($"{PhysicsObj.Name}.ObjectMaint.AddVisibleTarget({obj.Name}): tried to add a non-player / non-combat pet / non-opposing faction mob");
                    return(false);
                }
            }
            else
            {
                // handle special case:
                // we want to select faction mobs for monsters inverse targets,
                // but not add to the original monster
                if (obj.WeenieObj.IsFactionMob)
                {
                    obj.ObjMaint.AddVisibleTarget(PhysicsObj);
                    return(false);
                }

                // only tracking players and combat pets
                if (!obj.IsPlayer && !obj.WeenieObj.IsCombatPet)
                {
                    Console.WriteLine($"{PhysicsObj.Name}.ObjectMaint.AddVisibleTarget({obj.Name}): tried to add a non-player / non-combat pet");
                    return(false);
                }
            }
            if (PhysicsObj.DatObject)
            {
                Console.WriteLine($"{PhysicsObj.Name}.ObjectMaint.AddVisibleTarget({obj.Name}): tried to add player for dat object");
                return(false);
            }

            if (clamp && InitialClamp && obj.IsPlayer && !obj.ObjMaint.KnownObjects.ContainsKey(obj.ID))
            {
                var distSq = PhysicsObj.Position.Distance2DSquared(obj.Position);

                if (distSq > InitialClamp_DistSq)
                {
                    return(false);
                }
            }

            // TryAdd for existing keys still modifies collection?
            if (VisibleTargets.ContainsKey(obj.ID))
            {
                return(false);
            }

            //Console.WriteLine($"{PhysicsObj.Name} ({PhysicsObj.ID:X8}).ObjectMaint.AddVisibleTarget({obj.Name})");

            VisibleTargets.Add(obj.ID, obj);

            // maintain inverse for monsters / combat pets
            if (!obj.IsPlayer)
            {
                obj.ObjMaint.AddVisibleTarget(PhysicsObj);
            }

            return(true);
        }
Пример #7
0
 private bool RemoveVisibleTarget(PhysicsObj obj)
 {
     //Console.WriteLine($"{PhysicsObj.Name} ({PhysicsObj.ID:X8}).ObjectMaint.RemoveVisibleTarget({obj.Name})");
     return(VisibleTargets.Remove(obj.ID));
 }