示例#1
0
    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();
    }
示例#2
0
    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);
    }
示例#3
0
 private void AddEvents(int stateContainerID)
 {
     if (UseAIDesign && AIDesign != null)
     {
         Events.Init(this, AIDesign.GetStateContainerByID(stateContainerID), base.baseEntity, Senses);
     }
 }
示例#4
0
 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);
     }
 }
示例#5
0
 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);
     }
 }
示例#6
0
    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;
        }
    }