void TickUpdate() { ComSat.Trace(this, "TickUpdate"); if (ComSat.EntityExists(target)) { destination = target.position; var radius = target.collisionRadius + entity.collisionRadius; if ((target.position - entity.position).sqrMagnitude < radius * radius) { var components = target.GetComponents(typeof(ISabotagable)); foreach (var c in components) { (c as ISabotagable).Sabotage(); } ComSat.DestroyEntity(entity, DestroyReason.HitTarget); } } if (moving) { if ((destination - entity.position).sqrMagnitude < sqrPositioningAccuracy) { // Close enough. moving = false; motor.Stop(); } else { motor.MoveTowards(destination); } } }
private void PickNewTarget() { if (targets == null) { targets = new Entity[] {} } ; targets = targets.Where(t => ComSat.EntityExists(t)).OrderBy(t => (t.position - entity.position).sqrMagnitude).ToArray(); if (targets.Count() > 0) { target = targets[0]; moving = true; } else { target = null; moving = false; } } void OnDrawGizmosSelected() { Gizmos.color = Color.red; Gizmos.DrawWireSphere(transform.position, detonateRange); Gizmos.color = Color.magenta; Gizmos.DrawWireSphere(transform.position, explosionRadius); } }
void FireMissile() { if (missileRecycleDelay > 0) { return; } if (missilesLoaded <= 0) { return; } missileFireSound.PlayOneShot(missileFireSound.clip); ComSat.SpawnEntity(entity, missilePrefab, entity.position, entity.rotation, (Entity ent) => { var proj = ent.gameObject.GetComponent <Projectile>(); if (proj != null && ComSat.EntityExists(combatVehicle.target)) { proj.target = combatVehicle.target; } }); missileRecycleDelay = missileRecycleTime; missilesLoaded -= 1; }
void Attack(Entity[] targets) { ComSat.Trace(this, "Attack"); var validTargets = targets.Where(t => ComSat.EntityExists(t) && t.GetComponent(typeof(ISabotagable)) != null).OrderBy(t => (t.position - entity.position).sqrMagnitude); if (!validTargets.Any()) { return; } target = validTargets.First(); moving = true; }
void TickUpdate() { ComSat.Trace(this, "TickUpdate"); if(!powerSink.poweredOn) { target = null; audio.Stop(); return; } if(!ComSat.EntityExists(target)) { // Magic. Destroyed GameObjects compare against null. // Explicitly set to null to avoid keeping it around. target = null; audio.Stop(); // Search for victims. target = ComSat.FindEntityWithinRadius(entity.position, attackRange, entity.team); if(target != null) { audio.Play(); } } else { var dp = target.position - entity.position; DReal targetTurretAngle; var projectileProjectile = projectilePrefab.GetComponent<Projectile>(); if(projectileProjectile != null && powerSink.Powered()) { var aimSpot = Utility.PredictShot(entity.position, projectileProjectile.initialSpeed, target.position, target.velocity); targetTurretAngle = DReal.Mod(DVector2.ToAngle(aimSpot - entity.position) - entity.rotation, DReal.TwoPI); } else { targetTurretAngle = DReal.Mod(DVector2.ToAngle(dp) - entity.rotation, DReal.TwoPI); } // Turn turret to point at target. TurnTurret(targetTurretAngle); // Fire when pointing the gun at the target. if(targetTurretAngle == turretRotation) { Fire(); } // Stop shooting when out of range. if(dp.sqrMagnitude >= attackRange * attackRange) { audio.Stop(); target = null; } } if(fireDelay > 0) { fireDelay -= ComSat.tickRate; } }
// (Client) void AttackCommand(int team, int entityID, int[] targetIDs) { targetIDs = targetIDs ?? new int[] {}; var entity = EntityFromID(entityID); var targets = targetIDs.Select(id => EntityFromID(id)).Where(e => ComSat.EntityExists(e)).ToArray(); if (entity != null && targets.Any() && entity.team == team) { Log("{" + tickID + "} " + entity + "[" + entityID + "] attack " + string.Join(", ", targetIDs.Select(x => x.ToString()).ToArray())); entity.gameObject.SendMessage("Attack", targets, SendMessageOptions.DontRequireReceiver); } }
void Update() { if (combatVehicle.mode == CombatVehicle.Mode.ATTACK && ComSat.EntityExists(combatVehicle.target)) { laser.enabled = true; laser.SetPosition(0, laserOrigin.transform.position); laser.SetPosition(1, combatVehicle.target.transform.position); } else { laser.enabled = false; } }
DReal barrelRecycleTime = 2; // Delay before refiring one barrel. void FireOneBarrel(int sign) { audio.PlayOneShot(audio.clip); ComSat.SpawnEntity(entity, projectilePrefab, entity.position, entity.rotation, (Entity ent) => { var proj = ent.gameObject.GetComponent <Projectile>(); if (proj != null && ComSat.EntityExists(combatVehicle.target)) { proj.target = combatVehicle.target; } }); }
private void PickNewTarget() { if (targets == null) { targets = new Entity[] {} } ; targets = targets.Where(t => ComSat.EntityExists(t)).OrderBy(t => (t.position - entity.position).sqrMagnitude).ToArray(); target = targets.FirstOrDefault(); if (target != null) { motor.Move(target.position); } } }
void FireOneBarrel(int sign, GameObject barrel) { if (ComSat.RateLimit()) { barrel.SendMessage("Fire"); } ComSat.SpawnEntity(entity, projectilePrefab, entity.position, entity.rotation + turretRotation, (Entity ent) => { var proj = ent.gameObject.GetComponent <Projectile>(); if (proj != null && ComSat.EntityExists(combatVehicle.target)) { proj.target = combatVehicle.target; } }); }
void TickUpdate() { if (!ComSat.EntityExists(target)) { PickNewTarget(); } if (target == null) { return; } if ((target.position - entity.position).sqrMagnitude < 4 + target.collisionRadius * target.collisionRadius && damageDelay-- <= 0) { target.Damage(1); damageDelay = 3; } }
void Fire() { if(fireDelay > 0) { return; } fireDelay = barrelRecycleTime; ComSat.SpawnEntity(entity, projectilePrefab, entity.position, entity.rotation + turretRotation, (Entity ent) => { var proj = ent.gameObject.GetComponent<Projectile>(); if(proj != null && ComSat.EntityExists(target)) { proj.target = target; } }); turretBarrel.SendMessage("Fire"); }
void TickUpdate() { ComSat.Trace(this, "TickUpdate"); if (ComSat.EntityExists(target)) { var dir = target.position - entity.position; // also vector to dest. var targetAngle = DVector2.ToAngle(dir); var baseAngle = Utility.CalculateNewAngle(entity.rotation, targetAngle, DReal.Radians(turnSpeed)); entity.rotation = baseAngle; } entity.velocity = DVector2.FromAngle(entity.rotation) * speed; DVector2 newPosition = entity.position + entity.velocity * ComSat.tickRate; // FIXME: this should do something to account for hitting fast-moving projectiles. DVector2 hitPosition; Entity hit = ComSat.LineCast(entity.position, newPosition, out hitPosition, entity.team); if (hit != null && (!hit.hitOnlyIfTargetted || hit == target)) { hit.Damage((int)ComputeDamage()); var position = new Vector3((float)hitPosition.y, 0, (float)hitPosition.x); var rotation = Quaternion.AngleAxis((float)entity.rotation, Vector3.up); if (impactPrefab != null && ComSat.RateLimit()) { ObjectPool.Instantiate(impactPrefab, position, rotation); } //if(trail) { // trail.transform.parent = null; // trail.autodestruct = true; // trail = null; //} if (!penetrates || speed < minPenetrationSpeed) { ComSat.DestroyEntity(entity, DestroyReason.HitTarget); return; } else { speed -= penetrationSpeedReduction; } } }
void FireGun() { if (gunRecycleDelay > 0) { return; } ComSat.SpawnEntity(entity, gunPrefab, entity.position, entity.rotation, (Entity ent) => { var proj = ent.gameObject.GetComponent <Projectile>(); if (proj != null && ComSat.EntityExists(combatVehicle.target)) { proj.target = combatVehicle.target; } }); gunRecycleDelay = gunRecycleTime; }
void TickUpdate() { for (int i = 0; i < teamPowerSupply.Length; i++) { teamPowerSupply[i] = 0; teamPowerUse[i] = 0; } sinks.RemoveAll(s => !ComSat.EntityExists(s.e)); sources.RemoveAll(s => !ComSat.EntityExists(s.e)); foreach (var s in sinks) { if (s.thing.poweredOn) { teamPowerUse[s.e.team] += s.thing.powerUsage; } } foreach (var s in sources) { teamPowerSupply[s.e.team] += s.thing.currentPower; } }
void Fire() { if (fireDelayTime > 0) { return; } // Fire left. fireDelayTime = barrelRecycleTime; if (ComSat.RateLimit()) { barrel.SendMessage("Fire"); } ComSat.SpawnEntity(entity, combatVehicle.projectilePrefab, entity.position, entity.rotation + turretRotation, (Entity ent) => { var proj = ent.gameObject.GetComponent <Projectile>(); if (proj != null && ComSat.EntityExists(combatVehicle.target)) { proj.target = combatVehicle.target; } }); }
void TickUpdate() { ComSat.Trace(this, "TickUpdate"); if (ComSat.EntityExists(target)) { moving = true; destination = target.position; if ((destination - entity.position).sqrMagnitude < detonateRange * detonateRange) { Detonate(); return; } } else if (targets != null && targets.Any()) { PickNewTarget(); } if (moving) { if ((ComSat.RandomValue() % 500) == 0) { Detonate(); return; } if ((destination - entity.position).sqrMagnitude < sqrPositioningAccuracy) { // Close enough. moving = false; motor.Stop(); } else { motor.MoveTowards(destination); } } }
void TickUpdate() { ComSat.Trace(this, "TickUpdate"); if (combatVehicle.mode == CombatVehicle.Mode.IDLE) { combatVehicle.mode = CombatVehicle.Mode.MOVE; combatVehicle.destination = entity.position; } if (ComSat.EntityExists(combatVehicle.target)) { var dist = combatVehicle.target.position - entity.position; var sqrDist = dist.sqrMagnitude; var targetAngle = DReal.Mod(DVector2.ToAngle(dist), DReal.TwoPI); // Get targetAngle within +/- pi of entity.rotation. if (targetAngle < entity.rotation - DReal.PI) { targetAngle += DReal.TwoPI; } else if (targetAngle > entity.rotation + DReal.PI) { targetAngle -= DReal.TwoPI; } if (sqrDist < missileRange * missileRange) { FireMissile(); } if (sqrDist < gunRange * gunRange && DReal.Abs(entity.rotation - targetAngle) < 1) { FireGun(); if (!gunFireSound.isPlaying) { gunFireSound.Play(); } } else { gunFireSound.Stop(); } } else { gunFireSound.Stop(); } if (missilesLoaded < maxMissiles) { if (missileReloadTime <= 0) { missileReloadTime = missileReloadDelay; } else { missileReloadTime -= ComSat.tickRate; if (missileReloadTime <= 0) { missilesLoaded += 1; } } } if (missileRecycleDelay > 0) { missileRecycleDelay -= ComSat.tickRate; } if (gunRecycleDelay > 0) { gunRecycleDelay -= ComSat.tickRate; } }
private void PickNewTarget() { if (targets == null) { targets = new Entity[] {} } ; targets = targets.Where(t => ComSat.EntityExists(t)).OrderBy(t => (t.position - entity.position).sqrMagnitude).ToArray(); if (targets.Count() > 0) { target = targets[0]; mode = Mode.ATTACK; } else { target = null; mode = Mode.IDLE; } } void TickUpdate() { ComSat.Trace(this, "TickUpdate"); if (mode == Mode.ATTACK && !ComSat.EntityExists(target)) { PickNewTarget(); if (!ComSat.EntityExists(target)) { vehicle.Stop(); } } if (mode == Mode.ATTACK) { var distVec = target.position - entity.position; var dist = distVec.magnitude; DReal targetTurretAngle; var projectileProjectile = projectilePrefab != null?projectilePrefab.GetComponent <Projectile>() : null; if (projectileProjectile != null) { var aimSpot = Utility.PredictShot(entity.position, projectileProjectile.initialSpeed, target.position, target.velocity); targetTurretAngle = DReal.Mod(DVector2.ToAngle(aimSpot - entity.position) - entity.rotation, DReal.TwoPI); } else { targetTurretAngle = DReal.Mod(DVector2.ToAngle(distVec) - entity.rotation, DReal.TwoPI); } // Turn turret to point at target when close. if (dist >= attackRange * 2) { targetTurretAngle = turretAutoResets ? 0 : turretRotation; } turretRotation = Utility.CalculateNewAngle(turretRotation, targetTurretAngle, turretTurnSpeed); SendMessage("TurnTurret", turretRotation); if (dist < attackDistance) { // Close enough. movingToTarget = false; vehicle.Stop(); } else if (movingToTarget || (dist >= attackRange)) { movingToTarget = true; // Approach target. vehicle.MoveTowards(target.position); } // Fire when in range and pointing the gun at the target. if (dist < attackRange && targetTurretAngle == turretRotation) { SendMessage("Fire"); } } else if (mode == Mode.MOVE) { // Move towards. if ((destination - entity.position).sqrMagnitude < sqrPositioningAccuracy) { // Close enough. mode = Mode.IDLE; vehicle.Stop(); } else { vehicle.MoveTowards(destination); } if (turretAutoResets) { turretRotation = Utility.CalculateNewAngle(turretRotation, 0, turretTurnSpeed); SendMessage("TurnTurret", turretRotation); } } else if (mode == Mode.IDLE) { vehicle.Stop(); if (turretAutoResets) { turretRotation = Utility.CalculateNewAngle(turretRotation, 0, turretTurnSpeed); SendMessage("TurnTurret", turretRotation); } } } }