IEnumerable<IRenderable> IRender.Render(Actor self, WorldRenderer wr) { if(State == CarryallState.Carrying && !Carryable.IsDead) { if(carryablePreview == null) { var carryableInits = new TypeDictionary() { new OwnerInit(Carryable.Owner), new DynamicFacingInit(()=>facing.Facing), }; foreach (var api in Carryable.TraitsImplementing<IActorPreviewInitModifier>()) api.ModifyActorPreviewInit(Carryable, carryableInits); var init = new ActorPreviewInitializer(Carryable.Info, wr, carryableInits); carryablePreview = Carryable.Info.TraitInfos<IRenderActorPreviewInfo>().SelectMany(rpi => rpi.RenderPreview(init)).ToArray(); } var offset = body.LocalToWorld(CarryableOffset.Rotate(body.QuantizeOrientation(self, self.Orientation))); var previewRenderables = carryablePreview.SelectMany(p => p.Render(wr, self.CenterPosition + offset)).OrderBy(WorldRenderer.RenderableScreenZPositionComparisonKey); foreach (var r in previewRenderables) yield return r; } }
public virtual void UnreserveCarryable(Actor self) { if (Carryable != null && Carryable.IsInWorld && !Carryable.IsDead) Carryable.Trait<Carryable>().UnReserve(Carryable); Carryable = null; State = CarryallState.Idle; }
void INotifyActorDisposing.Disposing(Actor self) { if(State == CarryallState.Carrying) { Carryable.Dispose(); Carryable = null; } UnreserveCarryable(self); }
void INotifyKilled.Killed(Actor self, AttackInfo attackInfo) { if(State == CarryallState.Carrying) { if (Carryable.IsInWorld && !Carryable.IsDead) Carryable.Kill(attackInfo.Attacker); Carryable = null; } UnreserveCarryable(self); }