Exemple #1
0
        virtual public void FirePrimary(AttackSource src)
        {
            if (_primaryPrjDef == null)
            {
                return;
            }
            Transform t = _launchNode.GlobalTransform;

            SpawnPatterns.FillPattern(t, _primaryPatternDef, _launchTransforms);

            for (int i = 0; i < _primaryPatternDef.count; ++i)
            {
                Transform       launchT = _launchTransforms[i];
                PointProjectile prj     = Main.i.factory.SpawnProjectile(_primaryPrjDef.prefabPath);
                if (prj == null)
                {
                    Console.WriteLine($"Got no prj instance"); return;
                }
                prj.Launch(launchT.origin, -launchT.basis.z, _primaryPrjDef, src.ignoreBody, src.team);
            }
            // check for reload
            //_roundsLoaded--;
            //if (_roundsLoaded <= 0)
            //{
            //    _tick = _weaponDef.magazineReloadTime;
            //    _isReloading = true;
            //}
            //else
            //{
            _tick = _weaponDef.primaryRefireTime;
            //}
            _lastTickMax = _tick;
        }
Exemple #2
0
        public override void FireSecondary()
        {
            int numShots = _roundsLoaded;

            _roundsLoaded = 0;
            _isReloading  = true;
            _tick         = _weaponDef.magazineReloadTime;
            int numPellets = _weaponDef.primaryPrjCount * numShots;

            Console.WriteLine($"Fire {numShots} shots ({numPellets} pellets)");

            Transform t = _launchNode.GlobalTransform;

            // fill all angles, although we may be using less anyway.
            ZqfGodotUtils.FillSpreadAngles(t, _secondarySpread, 2000, 1200);
            for (int i = 0; i < numPellets; ++i)
            {
                PointProjectile prj = Main.i.factory.SpawnProjectile(_secondaryPrjDef.prefabPath);
                if (prj == null)
                {
                    Console.WriteLine($"Got no prj instance"); return;
                }
                prj.Launch(t.origin, _secondarySpread[i], _secondaryPrjDef, _ignoreBody);
                _tick = _weaponDef.secondaryRefireTime;
            }
        }
Exemple #3
0
 private void Shoot()
 {
     SpawnPatterns.FillPattern(GlobalTransform, _patternDef, _transforms);
     for (int i = 0; i < _transforms.Count; ++i)
     {
         PointProjectile prj = Main.i.factory.SpawnPointProjectile();
         prj.Launch(_transforms[i].origin, -_transforms[i].basis.z, _prjDef, null, Team.Mobs);
     }
 }
Exemple #4
0
        private void FireDeathRayShot(EquippableTickInfo info)
        {
            PointProjectile prj = Main.i.factory.SpawnProjectile(string.Empty);

            if (prj == null)
            {
                Console.WriteLine($"Got no prj instance"); return;
            }

            Transform t = _launchNode.GlobalTransform;

            prj.Launch(t.origin, -t.basis.z, _riflePrjDef, info.src.ignoreBody, info.src.team);
        }
Exemple #5
0
        virtual public void FirePrimary()
        {
            if (_primaryPrjDef == null)
            {
                return;
            }
            Transform t = _launchNode.GlobalTransform;

            ZqfGodotUtils.FillSpreadAngles(t, _primarySpread, 2000, 1200);
            for (int i = 0; i < _primarySpread.Count; ++i)
            {
                PointProjectile prj = Main.i.factory.SpawnProjectile(_primaryPrjDef.prefabPath);
                if (prj == null)
                {
                    Console.WriteLine($"Got no prj instance"); return;
                }
                //prj.Launch(_launchNode.GlobalTransform, _primaryPrjDef, _ignoreBody);

                prj.Launch(t.origin, _primarySpread[i], _primaryPrjDef, _ignoreBody);
                _tick = _weaponDef.primaryRefireTime;
            }
        }
Exemple #6
0
        virtual public void FireSecondary(AttackSource src)
        {
            if (_secondaryPrjDef == null)
            {
                return;
            }
            Transform t = _launchNode.GlobalTransform;

            ZqfGodotUtils.FillSpreadAngles(
                t, _secondarySpread, _weaponDef.secondarySpread.x, _weaponDef.secondarySpread.y);
            for (int i = 0; i < _secondarySpread.Count; ++i)
            {
                PointProjectile prj = Main.i.factory.SpawnProjectile(_secondaryPrjDef.prefabPath);
                if (prj == null)
                {
                    Console.WriteLine($"Got no prj instance"); return;
                }
                //prj.Launch(_launchNode.GlobalTransform, _primaryPrjDef, _ignoreBody);

                prj.Launch(t.origin, _secondarySpread[i], _secondaryPrjDef, src.ignoreBody, src.team);
                _tick        = _weaponDef.secondaryRefireTime;
                _lastTickMax = _tick;
            }
        }
Exemple #7
0
        public void Think(EntMob mob, float delta)
        {
            int stunAccum = mob.stunAccumulator;

            mob.stunAccumulator = 0;
            if (stunAccum >= mob.mobDef.stunThreshold)
            {
                // switch to stun and update with that instead
                _mobThink.ApplyStun(mob);
                _mobThink.UpdateMob(mob, delta);
                return;
            }

            IActor actor = Main.i.game.CheckTarget(mob.targetActorId, mob.GetTeam());

            if (actor == null)
            {
                mob.targetActorId = Game.NullActorId;
                return;
            }
            mob.targetActorId = actor.actorId;
            Transform self   = mob.GetTransformForTarget();
            Vector3   tar    = actor.GetTransformForTarget().origin;
            float     yawDeg = ZqfGodotUtils.FlatYawDegreesBetween(
                self.origin, tar);

            mob.body.RotationDegrees = new Vector3(0, yawDeg + 180, 0);
            self = mob.GetTransformForTarget();
            Vector3 toTar = (tar - self.origin).Normalized();

            if (mob.thinkTick <= 0)
            {
                mob.thinkTick = 1;
                PointProjectile prj = Main.i.factory.SpawnPointProjectile();
                prj.Launch(self.origin, toTar, mob.prjDef, mob.body, Team.Mobs);
            }
            else
            {
                mob.thinkTick -= delta;
            }

            if (mob.moveTick <= 0)
            {
                float rand = ZqfGodotUtils.Randomf();
                float dist = ZqfGodotUtils.Distance(self.origin, tar);
                mob.moveTick = 1.5f;
                // move toward target
                if (dist > mob.mobDef.evadeRange)
                {
                    // randomly jink to the side
                    if (rand < 0.25)
                    {
                        yawDeg += 45;
                    }
                    else if (rand < 0.5)
                    {
                        yawDeg -= 45;
                    }
                    // check movement again in:
                    mob.moveTick = 1f;
                }
                else
                {
                    // evade either left or right
                    // don't add a full 90 degrees as will evade straight out of evade dist
                    yawDeg      += (rand > 0.5) ? 70 : -70;
                    mob.moveTick = 1.5f;
                }
                float radians = Mathf.Deg2Rad(yawDeg);
                mob.lastSelfDir = new Vector3(Mathf.Sin(radians), 0, Mathf.Cos(radians));
            }
            else
            {
                mob.moveTick -= delta;
            }
            //////////////////////////////////////
            // Move

            // calculate self move
            mob.selfMove = FPSController.CalcVelocityQuakeStyle(
                mob.velocity, mob.lastSelfDir, mob.mobDef.walkSpeed, delta, true, mob.mobDef.friction, mob.mobDef.accelForce);

            mob.velocity = mob.selfMove;
            // apply push forces
            mob.velocity       += mob.pushAccumulator;
            mob.pushAccumulator = Vector3.Zero;
            if (mob.velocity.LengthSquared() > Game.MaxActorVelocity * Game.MaxActorVelocity)
            {
                mob.velocity  = mob.velocity.Normalized();
                mob.velocity *= Game.MaxActorVelocity;
            }
            Vector3 result = mob.body.MoveAndSlide(mob.velocity);
        }