Пример #1
0
    // Returns false if its not within AI Range
    public static bool CheckAIRange(int EntityID, int targetEntity)
    {
        EntityAlive myEntity = GameManager.Instance.World.GetEntity(EntityID) as EntityAlive;

        if (myEntity == null)
        {
            return(false);
        }
        EntityAlive myTarget = GameManager.Instance.World.GetEntity(targetEntity) as EntityAlive;

        if (myTarget == null)
        {
            return(false);
        }

        // Find the max range for the weapon
        // Example Range:  50
        //   Hold Ground Distance between 20 to 50
        //   Retreat distance is 20%, so 20
        float MaxRangeForWeapon = EffectManager.GetValue(PassiveEffects.MaxRange, myEntity.inventory.holdingItemItemValue, 60f, myEntity, null, myEntity.inventory.holdingItem.ItemTags, true, true, true, true, 1, true);

        MaxRangeForWeapon = MaxRangeForWeapon * 2;
        float HoldGroundDistance = (float)MaxRangeForWeapon * 0.80f; // minimum range to hold ground
        float RetreatDistance    = (float)MaxRangeForWeapon * 0.30f; // start retreating at this distance.
        float distanceSq         = myTarget.GetDistanceSq(myEntity);

        float MinMeleeRange = GetFloatValue(EntityID, "MinimumMeleeRange");

        if (MinMeleeRange == -1)
        {
            MinMeleeRange = 4;
        }

        DisplayLog(myEntity.EntityName + " Max Range: " + MaxRangeForWeapon + " Hold Ground: " + HoldGroundDistance + " Retreatdistance: " + RetreatDistance + " Entity Distance: " + distanceSq);


        // if they are too close, switch to melee
        if (distanceSq <= MinMeleeRange)
        {
            return(false);
        }

        // Hold your ground
        if (distanceSq > RetreatDistance && distanceSq <= HoldGroundDistance) // distance greater than 20%  of the range of the weapon
        {
            Stop(EntityID);
        }

        // Back away!
        if (distanceSq > MinMeleeRange && distanceSq <= RetreatDistance)
        {
            BackupHelper(EntityID, myTarget.position, 40);
        }

        return(true);
    }
Пример #2
0
    public static bool CheckAIRange(int EntityID, int targetEntity)
    {
        EntityAlive myEntity = GameManager.Instance.World.GetEntity(EntityID) as EntityAlive;

        if (myEntity == null)
        {
            return(false);
        }
        EntityAlive myTarget = GameManager.Instance.World.GetEntity(targetEntity) as EntityAlive;

        if (myTarget == null)
        {
            return(false);
        }
        float distanceSq = myTarget.GetDistanceSq(myEntity);

        // Let the entity move closer, without walking a few steps and trying to fire, which can make the entity stutter as it tries to keep up with a retreating enemey.
        if (distanceSq > 50 && distanceSq < 60)
        {
            ChangeHandholdItem(EntityID, EntityUtilities.Need.Ranged);
            return(false);
        }
        // Hold your ground
        if (distanceSq > 20f && distanceSq < 60)
        {
            ChangeHandholdItem(EntityID, EntityUtilities.Need.Ranged);
            myEntity.navigator.clearPath();
            myEntity.moveHelper.Stop();
            return(false);
        }

        // Back away!
        if (distanceSq > 2 && distanceSq < 21)
        {
            BackupHelper(EntityID, myTarget.position, 40);
            ChangeHandholdItem(EntityID, EntityUtilities.Need.Ranged);
            return(false);
        }

        if (distanceSq < 2)
        {
            ChangeHandholdItem(EntityID, Need.Melee);
            return(true);
        }

        return(false);
    }
Пример #3
0
    public static bool CheckAIRange(int EntityID, int targetEntity)
    {
        EntityAlive myEntity = GameManager.Instance.World.GetEntity(EntityID) as EntityAlive;

        if (myEntity == null)
        {
            return(false);
        }
        EntityAlive myTarget = GameManager.Instance.World.GetEntity(targetEntity) as EntityAlive;

        if (myTarget == null)
        {
            return(false);
        }


        // Find the max range for the weapon
        // Example Range:  50
        //   Hold Ground Distance between 20 to 50
        //   Retreat distance is 20%, so 20
        float MaxRangeForWeapon  = EffectManager.GetValue(PassiveEffects.MaxRange, myEntity.inventory.holdingItemItemValue, 60f, myEntity, null, myEntity.inventory.holdingItem.ItemTags, true, true, true, true, 1, true);
        float HoldGroundDistance = (float)MaxRangeForWeapon * 0.80f; // minimum range to hold ground
        float RetreatDistance    = (float)MaxRangeForWeapon * 0.10f; // start retreating at this distance.
        float distanceSq         = myTarget.GetDistanceSq(myEntity);

        float MinMeleeRange = GetFloatValue(EntityID, "MinimumMeleeRange");

        if (MinMeleeRange == -1)
        {
            MinMeleeRange = 4;
        }

        DisplayLog(myEntity.EntityName + " Max Range: " + MaxRangeForWeapon + " Hold Ground: " + HoldGroundDistance + " Retreatdistance: " + RetreatDistance + " Entity Distance: " + distanceSq);
        myEntity.navigator.clearPath();
        myEntity.moveHelper.Stop();

        // Let the entity move closer, without walking a few steps and trying to fire, which can make the entity stutter as it tries to keep up with a retreating enemey.
        if (distanceSq > HoldGroundDistance)   // 80% of range
        {
            Debug.Log("moving forward");
            ChangeHandholdItem(EntityID, EntityUtilities.Need.Ranged);
            myEntity.moveHelper.SetMoveTo(myEntity.position, true);
            return(true);
        }

        // Hold your ground
        if (distanceSq > RetreatDistance && distanceSq <= HoldGroundDistance) // distance greater than 20%  of the range of the weapon
        {
            Debug.Log("Holding ground");
            ChangeHandholdItem(EntityID, EntityUtilities.Need.Ranged);

            return(false);
        }

        // Back away!
        if (distanceSq > MinMeleeRange && (distanceSq <= RetreatDistance || distanceSq < 8))
        {
            Debug.Log("backing away");
            BackupHelper(EntityID, myTarget.position, 40);
            ChangeHandholdItem(EntityID, EntityUtilities.Need.Ranged);
            return(false);
        }

        if (distanceSq <= MinMeleeRange) // if they are too close, switch to melee
        {
            ChangeHandholdItem(EntityID, Need.Melee);
            return(true);
        }

        Debug.Log("nothing");

        return(false);
    }