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; }
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; } }
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); } }
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); }
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; } }
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; } }
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); }