コード例 #1
0
        public static float GetRangeModifier(ToHit instance, AbstractActor attacker, Weapon weapon, ICombatant target, Vector3 attackPosition, Vector3 targetPosition, LineOfFireLevel lofLevel, MeleeAttackType meleeAttackType, bool isCalledShot)
        {
            if (attacker.EncounterTags.ContainsAny(Core.Settings._C3NetworkEncounterTags) == false)
            {
                return(ToHitModifiersHelper.GetRangeModifier(instance, attacker, weapon, target, attackPosition, targetPosition, lofLevel, meleeAttackType, isCalledShot));
            }
            float   realDist           = Vector3.Distance(attackPosition, targetPosition);
            float   distance           = realDist;
            float   distMod            = 0f;
            float   minRange           = weapon.MinRange;
            float   shortRange         = weapon.ShortRange;
            float   medRange           = weapon.MediumRange;
            float   longRange          = weapon.LongRange;
            float   maxRange           = weapon.MaxRange;
            Vector3 alternateAttackPos = GetC3CachedPos(attacker, target);

            if (alternateAttackPos != Vector3.zero)
            {
                float alternateDist = Vector3.Distance(alternateAttackPos, targetPosition);
                if (alternateDist < realDist)
                {
                    if (alternateDist < minRange)
                    {
                        distance = minRange;
                    }
                    else
                    {
                        distance = alternateDist;
                    }
                }
            }
            if (distance < minRange)
            {
                distMod = weapon.parent.MinRangeAccMod();
                //Log.LogWrite(" minRange ");
            }
            else
            if (distance < shortRange)
            {
                distMod = weapon.parent.ShortRangeAccMod();
                //Log.LogWrite(" shortRange ");
            }
            else
            if (distance < medRange)
            {
                distMod = weapon.parent.MediumRangeAccMod();
                //Log.LogWrite(" medRange ");
            }
            else
            if (distance < longRange)
            {
                distMod = weapon.parent.LongRangeRangeAccMod();
                //Log.LogWrite(" longRange ");
            }
            else
            if (distance < maxRange)
            {
                distMod = weapon.parent.ExtraLongRangeAccMod();
                //Log.LogWrite(" extraRange ");
            }
            ;
            //return distMod;
            return(distMod + instance.GetRangeModifierForDist(weapon, distance));
        }