public virtual void InitializeAI() { T entity = GetEntity(); entity.HasBrain = true; Navigator = GetComponent <BaseNavigator>(); if (UseAIDesign) { AIDesign = new AIDesign(); AIDesign.SetAvailableStates(GetStateList()); if (Events == null) { Events = new AIEvents(); } bool senseFriendlies = MaxGroupSize > 0; Senses.Init(entity, SenseRange, TargetLostRange, VisionCone, CheckVisionCone, CheckLOS, IgnoreNonVisionSneakers, ListenRange, HostileTargetsOnly, senseFriendlies, IgnoreSafeZonePlayers, SenseTypes); if (DefaultDesignSO == null) { Debug.LogWarning("Brain on " + base.gameObject.name + " is trying to load a null AI design!"); return; } Events.Memory.Position.Set(base.transform.position, 4); LoadAIDesign(AIDesigns.GetByNameOrInstance(DefaultDesignSO.Filename, InstanceSpecificDesign), null); AIInformationZone forPoint = AIInformationZone.GetForPoint(base.transform.position, false); if (forPoint != null) { forPoint.RegisterSleepableEntity(this); } } BaseEntity.Query.Server.AddBrain(entity); StartMovementTick(); }
private bool LoadAIDesign(ProtoBuf.AIDesign design, BasePlayer player) { if (design == null) { Debug.LogError(GetEntity().gameObject.name + " failed to load AI design!"); return(false); } if (player != null) { AIDesignScope scope = (AIDesignScope)design.scope; if (scope == AIDesignScope.Default && !player.IsDeveloper) { return(false); } if (scope == AIDesignScope.EntityServerWide && !player.IsDeveloper && !player.IsAdmin) { return(false); } } if (AIDesign == null) { return(false); } AIDesign.Load(design, base.baseEntity); AIStateContainer defaultStateContainer = AIDesign.GetDefaultStateContainer(); if (defaultStateContainer != null) { SwitchToState(defaultStateContainer.State, defaultStateContainer.ID); } return(true); }
private void AddEvents(int stateContainerID) { if (UseAIDesign && AIDesign != null) { Events.Init(this, AIDesign.GetStateContainerByID(stateContainerID), base.baseEntity, Senses); } }
private void RequestAIDesign(BaseEntity.RPCMessage msg) { if (UseAIDesign && !(msg.player == null) && AIDesign != null && PlayerCanDesignAI(msg.player)) { msg.player.designingAIEntity = GetEntity(); msg.player.ClientRPCPlayer(null, msg.player, "StartDesigningAI", AIDesign.ToProto(currentStateContainerID)); DesigningPlayer = msg.player; SetOwningPlayer(msg.player); } }
public void EventTriggeredStateChange(int newStateContainerID, int sourceEventID) { if (AIDesign != null && newStateContainerID != -1) { AIStateContainer stateContainerByID = AIDesign.GetStateContainerByID(newStateContainerID); int previousStateID = currentStateContainerID; SwitchToState(stateContainerByID.State, newStateContainerID); SendStateChangeEvent(previousStateID, currentStateContainerID, sourceEventID); } }
public void SaveDesign() { if (AIDesign == null) { return; } ProtoBuf.AIDesign aIDesign = AIDesign.ToProto(currentStateContainerID); string text = "cfg/ai/"; string filename = DefaultDesignSO.Filename; switch (AIDesign.Scope) { case AIDesignScope.Default: text += filename; try { using (FileStream stream2 = File.Create(text)) { ProtoBuf.AIDesign.Serialize(stream2, aIDesign); } AIDesigns.RefreshCache(filename, aIDesign); } catch (Exception) { Debug.LogWarning("Error trying to save default AI Design: " + text); } break; case AIDesignScope.EntityServerWide: filename += "_custom"; text += filename; try { using (FileStream stream = File.Create(text)) { ProtoBuf.AIDesign.Serialize(stream, aIDesign); } AIDesigns.RefreshCache(filename, aIDesign); } catch (Exception) { Debug.LogWarning("Error trying to save server-wide AI Design: " + text); } break; case AIDesignScope.EntityInstance: break; } }