// Turret offset in world-space public WVec Position(Actor self) { var bodyOrientation = body.QuantizeOrientation(self, self.Orientation); return(body.LocalToWorld(Offset.Rotate(bodyOrientation))); }
public void Tick(Actor self) { var local = info.Offset.Rotate(body.QuantizeOrientation(self, self.Orientation)); trail.Update(self.CenterPosition + body.LocalToWorld(local)); }
public override void Activate(Actor self, Order order, SupportPowerManager manager) { base.Activate(self, order, manager); if (self.Owner.IsAlliedWith(self.World.RenderPlayer)) { Sound.Play(Info.LaunchSound); } else { Sound.Play(Info.IncomingSound); } var npi = Info as NukePowerInfo; var rb = self.Trait <RenderSimple>(); rb.PlayCustomAnim(self, "active"); var targetPosition = self.World.Map.CenterOfCell(order.TargetLocation); var missile = new NukeLaunch(self.Owner, npi.MissileWeapon, self.CenterPosition + body.LocalToWorld(npi.SpawnOffset), targetPosition, npi.FlightVelocity, npi.FlightDelay, npi.SkipAscent); self.World.AddFrameEndTask(w => w.Add(missile)); if (npi.CameraActor != null) { var camera = self.World.CreateActor(false, npi.CameraActor, new TypeDictionary { new LocationInit(order.TargetLocation), new OwnerInit(self.Owner), }); camera.QueueActivity(new Wait(npi.CameraSpawnAdvance + npi.CameraRemoveDelay)); camera.QueueActivity(new RemoveSelf()); Action addCamera = () => self.World.AddFrameEndTask(w => w.Add(camera)); self.World.AddFrameEndTask(w => w.Add(new DelayedAction(npi.FlightDelay - npi.CameraSpawnAdvance, addCamera))); } if (Info.DisplayBeacon) { var beacon = new Beacon( order.Player, targetPosition, Info.BeaconPalettePrefix, Info.BeaconPoster, Info.BeaconPosterPalette, () => missile.FractionComplete); Action removeBeacon = () => self.World.AddFrameEndTask(w => { w.Remove(beacon); beacon = null; }); self.World.AddFrameEndTask(w => { w.Add(beacon); w.Add(new DelayedAction(npi.FlightDelay - npi.BeaconRemoveAdvance, removeBeacon)); }); } }