Ejemplo n.º 1
0
        private void AddTargetSector(LookAt lookAt, LookTo lookTo, TargetingCone targetingCone, ICollection <TargetSector> sectors, float vDelta, float hDelta)
        {
            Vector3 lhs       = lookTo.Position - lookAt.Position;
            float   magnitude = lhs.magnitude;

            if ((magnitude <= targetingCone.Distance) && (magnitude >= lookTo.Radius))
            {
                float num2 = (float)((Math.Asin((double)(lookTo.Radius / magnitude)) * 180.0) / 3.1415926535897931);
                float num3 = num2 + vDelta;
                float num4 = num2 + hDelta;
                float num6 = Vector3.Dot(lhs, lookAt.Forward);
                float num7 = Vector3.Dot(lhs, lookAt.Up);
                float num8 = (float)((Math.Atan2((double)Vector3.Dot(lhs, lookAt.Left), (double)num6) * 180.0) / 3.1415926535897931);
                if ((num8 >= -(num4 + targetingCone.HAngle)) && (num8 <= (targetingCone.HAngle + num4)))
                {
                    float num9  = (float)((Math.Atan2((double)num7, (double)num6) * 180.0) / 3.1415926535897931);
                    float num10 = Math.Max(num9 - num3, -targetingCone.VAngleDown);
                    float num11 = Math.Min(num9 + num3, targetingCone.VAngleUp);
                    if (num10 < num11)
                    {
                        TargetSector item = new TargetSector {
                            Down     = num10,
                            Up       = num11,
                            Distance = magnitude
                        };
                        sectors.Add(item);
                    }
                }
            }
        }
Ejemplo n.º 2
0
        public void PrepareTargeting(TargetingEvent evt, WeaponNode weapon, [JoinByTank] TankNode tank)
        {
            TargetingData targetingData = evt.TargetingData;
            VerticalSectorsTargetingComponent verticalSectorsTargeting = weapon.verticalSectorsTargeting;
            MuzzleLogicAccessor accessor = new MuzzleLogicAccessor(weapon.muzzlePoint, weapon.weaponInstance);

            targetingData.Origin       = accessor.GetBarrelOriginWorld();
            targetingData.Dir          = accessor.GetFireDirectionWorld();
            targetingData.FullDistance = verticalSectorsTargeting.WorkDistance;
            targetingData.MaxAngle     = (verticalSectorsTargeting.VAngleUp <= verticalSectorsTargeting.VAngleDown) ? verticalSectorsTargeting.VAngleDown : verticalSectorsTargeting.VAngleUp;
            LinkedList <TargetSector> instance = BattleCache.targetSectors.GetInstance();

            instance.Clear();
            CollectTargetSectorsEvent eventInstance = BattleCache.collectTargetSectorsEvent.GetInstance().Init();

            eventInstance.TargetSectors = instance;
            TargetingCone cone = new TargetingCone {
                VAngleUp   = verticalSectorsTargeting.VAngleUp,
                VAngleDown = verticalSectorsTargeting.VAngleDown,
                HAngle     = verticalSectorsTargeting.HAngle,
                Distance   = verticalSectorsTargeting.WorkDistance
            };

            eventInstance.TargetingCone = cone;
            base.ScheduleEvent(eventInstance, weapon);
            CollectSectorDirectionsEvent event3 = BattleCache.collectSectorDirectionsEvent.GetInstance().Init();

            event3.TargetSectors = instance;
            event3.TargetingData = targetingData;
            base.ScheduleEvent(event3, weapon);
            base.ScheduleEvent(BattleCache.collectTargetsEvent.GetInstance().Init(targetingData), weapon);
            base.ScheduleEvent(BattleCache.targetEvaluateEvent.GetInstance().Init(targetingData), weapon);
        }