//these are both done stupidly and could probably be done through reflection instead but for now... public override Dictionary <string, object> GetExtraData() { Dictionary <string, object> extraData = new Dictionary <string, object>(); var actorData = new ActorExtraData(); //save! actorData.CurrentAiState = CurrentAiState; actorData.LastAiState = LastAiState; actorData.LockAiState = LockAiState; actorData.CurrentAnimState = AnimationComponent.Ref()?.CurrentAnimState ?? default; actorData.LockAnimState = AnimationComponent.Ref()?.LockAnimState ?? default; actorData.SavedTarget = Target != null ? Target.name : string.Empty; //damn it! actorData.AltTarget = MovementComponent.MovementTarget; actorData.TimeInState = TimeInState; actorData.Health = Health; actorData.BeenHit = BeenHit; actorData.IsRunning = MovementComponent.IsRunning; if (InteractionComponent != null) { actorData.InteractionForceDisabled = InteractionComponent.InteractionDisabledByHit; if (InteractionComponent.CorpseContainer != null) { extraData["Container"] = SerializableContainerModel.MakeSerializableContainerModel(InteractionComponent.CorpseContainer); } } extraData["Actor"] = actorData; return(extraData); }
public override void RestoreEntityData(Dictionary <string, object> data) { base.RestoreEntityData(data); if (data.ContainsKey("Actor")) { ActorExtraData actorData = data["Actor"] as ActorExtraData; if (actorData != null) { //restore! CurrentAiState = actorData.CurrentAiState; LastAiState = actorData.LastAiState; LockAiState = actorData.LockAiState; if (AnimationComponent != null) { AnimationComponent.CurrentAnimState = actorData.CurrentAnimState; AnimationComponent.LockAnimState = actorData.LockAnimState; } SavedTarget = actorData.SavedTarget; TimeInState = actorData.TimeInState; Health = actorData.Health; BeenHit = actorData.BeenHit; LastHit = actorData.LastHit; LastHitDamage = actorData.LastHitDamage; WasExtremeDeath = actorData.WasExtremeDeath; MovementComponent.BeforeRestore(data); MovementComponent.MovementTarget = actorData.AltTarget; MovementComponent.IsRunning = actorData.IsRunning; if (CurrentAiState == ActorAiState.Dead) { MovementComponent.HandleDeath(); } if (InteractionComponent != null) { InteractionComponent.InteractionDisabledByHit = actorData.InteractionForceDisabled; if (data.ContainsKey("Container")) { InteractionComponent.CorpseContainer = SerializableContainerModel.MakeContainerModel((SerializableContainerModel)data["Container"]); } } } else { CDebug.LogEx(string.Format("Invalid actor data for {0} found on restore!", this.name), LogLevel.Error, this); } } else { CDebug.LogEx(string.Format("No actor data for {0} found on restore!", this.name), LogLevel.Error, this); } }
//these are both done stupidly and could probably be done through reflection instead but for now... public override Dictionary <string, object> CommitEntityData() { Dictionary <string, object> extraData = base.CommitEntityData(); var actorData = new ActorExtraData(); //save! actorData.CurrentAiState = CurrentAiState; actorData.LastAiState = LastAiState; actorData.LockAiState = LockAiState; actorData.CurrentAnimState = AnimationComponent.Ref()?.CurrentAnimState ?? default; actorData.LockAnimState = AnimationComponent.Ref()?.LockAnimState ?? default; actorData.SavedTarget = Target != null ? Target.name : string.Empty; //damn it! actorData.AltTarget = MovementComponent.MovementTarget; actorData.TimeInState = TimeInState; actorData.Health = Health; actorData.BeenHit = BeenHit; if (LastHit.HasValue) { var modLastHit = LastHit.Value; modLastHit.Originator = null; //hack because this breaks saves and we don't need it for death handling anyway actorData.LastHit = modLastHit; } actorData.LastHitDamage = LastHitDamage; actorData.WasExtremeDeath = WasExtremeDeath; MovementComponent.BeforeCommit(extraData); actorData.IsRunning = MovementComponent.IsRunning; if (InteractionComponent != null) { actorData.InteractionForceDisabled = InteractionComponent.InteractionDisabledByHit; if (InteractionComponent.CorpseContainer != null) { extraData["Container"] = SerializableContainerModel.MakeSerializableContainerModel(InteractionComponent.CorpseContainer); } } extraData["Actor"] = actorData; return(extraData); }