Пример #1
0
    protected override void Start()
    {
        if (!isServer)
        {
            base.Start();
            return;
        }

        m_AnimAudioController = GetComponent <HerbistarAnimAudioController>();
        m_AnimAudioController.OnDyingFinished += Die;

        Grower = new ScaledGrowth(transform,
                                  DataStore.GetFloat(Data.HerbistarInitialScale),
                                  DataStore.GetFloat(Data.HerbistarFinalScaleMin),
                                  DataStore.GetFloat(Data.HerbistarFinalScaleMax));

        AgeData.DaysToGrown = DataStore.GetFloat(Data.HerbistarDaysToGrown);
        AgeData.LifeSpan    = DataStore.GetFloat(Data.HerbistarLifeSpan);
        BaseSpeed           = DataStore.GetFloat(Data.HerbistarBaseSpeed);

        WanderParameters.Radius   = DataStore.GetFloat(Data.HerbistarWanderRadius);
        WanderParameters.Distance = DataStore.GetFloat(Data.HerbistarWanderDistance);
        WanderParameters.Jitter   = DataStore.GetFloat(Data.HerbistarWanderJitter);

        base.Start();
        Scale = Grower.Scale;

        BehaviourBrain.In(BehaviourState.Running)
        .If(() => Health <= 0)
        .GoTo(BehaviourState.Death)
        .ExecuteWhileIn(Wander, AnimSwitchUpdate);

        BehaviourBrain.In(BehaviourState.Death)
        .DoOnce(Die);

        BehaviourBrain.Initialize(BehaviourState.Running);
    }
Пример #2
0
    protected override void Start()
    {
        if (Scale > 5f)
        {
            Scale = 1f;
        }
        else if (Scale < 1f)
        {
            Scale = 1f;
        }

        transform.localScale = new Vector3(Scale, Scale, Scale);

        if (FoodPosition == null)
        {
            Debug.LogError("FoodPosition is set to null in Gnomehatz", this);
        }

        if (!isServer && isClient)
        {
            base.Start();
            return;
        }

        m_AnimAudioController = GetComponent <GnomehatzAnimAudioController>();
        m_AnimAudioController.OnEatingFinished += OnEatingFinished;
        m_AnimAudioController.OnAttackFinished += OnAttackFinished;

        Grower = new ScaledGrowth(transform,
                                  DataStore.GetFloat(Data.GnomehatzInitialScale),
                                  DataStore.GetFloat(Data.GnomehatzFinalScaleMin),
                                  DataStore.GetFloat(Data.GnomehatzFinalScaleMax));

        Grower.StartGrowing();
        Scale = Grower.Scale;

        AgeData.DaysToGrown = DataStore.GetFloat(Data.GnomehatzDaysToGrown);
        AgeData.LifeSpan    = DataStore.GetFloat(Data.GnomehatzLifeSpan);
        BaseSpeed           = DataStore.GetFloat(Data.GnomehatzBaseSpeed);

        HuntingPeriodSpeed             = DataStore.GetFloat(Data.GnomehatzHuntingPeriodSpeed);
        DaysBetweenReproductions       = DataStore.GetFloat(Data.GnomehatzDaysBetweenReproductions);
        StarvingDamageAmount           = DataStore.GetFloat(Data.GnomehatzStarvingDamageAmount);
        StructureCollisionDamageAmount = DataStore.GetFloat(Data.GnomehatzStructureCollisionDamageAmount);
        MaximumHerdSizeToAttack        = DataStore.GetInt(Data.GnomehatzMaximumHerdSizeToAttack);
        HerdApproachDistance           = DataStore.GetFloat(Data.GnomehatzHerdApproachDistance);
        SensingRadius = DataStore.GetFloat(Data.GnomehatzSensingRadius);

        base.Start();

        BehaviourBrain.In(BehaviourState.Hunting)
        .If(() => Health <= 0 || AgeData.DaysOld > AgeData.LifeSpan)
        .GoTo(BehaviourState.Death)
        .If(() => ReproductionAllowed && Grower.State == GrowthState.Grown && Health >= 100f && FoodEatenWhileFullLife >= 2 && (AgeData.DaysOld - LastDayOfReproduction) > DaysBetweenReproductions)
        .GoTo(BehaviourState.Reproducing)
        .If(() => TimeSinceEating > DayClock.Singleton.DaysToSeconds(1f) && (HerbivoreSensor.Closest != null || ClosestSnatcher != null))
        .GoTo(BehaviourState.Attacking)
        .ExecuteWhileIn(Hunt);

        BehaviourBrain.In(BehaviourState.Attacking)
        .If(() => (HerbivoreSensor.Closest == null && ClosestSnatcher == null) || TimeSinceEating < DayClock.Singleton.DaysToSeconds(1f))
        .GoTo(BehaviourState.Hunting)
        .If(() => HerbivoreSensor.KClosest.Count > MaximumHerdSizeToAttack && HerbivoreSensor.Closest != null)
        .GoTo(BehaviourState.SkirtingHerd)
        .If(() => GrabbedTarget != null)
        .GoTo(BehaviourState.Eating)
        .ExecuteOnEntry(StartAttack)
        .ExecuteWhileIn(Attack)
        .ExecuteOnExit(EndAttack);

        BehaviourBrain.In(BehaviourState.Eating)
        .If(() => GrabbedTarget == null)
        .GoTo(BehaviourState.Hunting)
        .ExecuteOnEntry(StartEating)
        .ExecuteWhileIn(EatTarget)
        .ExecuteOnExit(EndEating);

        BehaviourBrain.In(BehaviourState.SkirtingHerd)
        .If(() => HerbivoreSensor.KClosest.Count < MaximumHerdSizeToAttack || HerbivoreSensor.Closest == null)
        .GoTo(BehaviourState.Hunting)
        .ExecuteWhileIn(SkirtHerd);

        BehaviourBrain.In(BehaviourState.Reproducing)
        .DoOnce(Reproduce)
        .If(() => true)
        .GoTo(BehaviourState.Hunting);

        BehaviourBrain.In(BehaviourState.Death)
        .DoOnce(Die);

        BehaviourBrain.Initialize(BehaviourState.Hunting);
    }
Пример #3
0
    public override void OnStartServer()
    {
        m_AnimAudioController = GetComponent <TriHorseAnimAudioController>();
        m_AnimAudioController.OnEatingFinished += OnEatingFinished;
        m_AnimAudioController.OnDyingFinished  += Die;

        Grower = new ScaledGrowth(transform,
                                  DataStore.GetFloat(Data.TriHorseInitialScale),
                                  DataStore.GetFloat(Data.TriHorseFinalScaleMin),
                                  DataStore.GetFloat(Data.TriHorseFinalScaleMax));

        Grower.StartGrowing();
        Scale = Grower.Scale;

        AgeData.DaysToGrown = DataStore.GetFloat(Data.TriHorseDaysToGrown);
        AgeData.LifeSpan    = DataStore.GetFloat(Data.TriHorseLifeSpan);
        BaseSpeed           = DataStore.GetFloat(Data.TriHorseBaseSpeed);

        DaysBeforeReproducing          = DataStore.GetFloat(Data.TriHorseDaysBeforeReproducing);
        DaysBetweenReproductions       = DataStore.GetFloat(Data.TriHorseDaysBetweenReproductions);
        StarvingDamageAmount           = DataStore.GetFloat(Data.TriHorseStarvingDamageAmount);
        StructureCollisionDamageAmount = DataStore.GetFloat(Data.TriHorseStructureCollisionDamageAmount);
        SensingRadius = DataStore.GetFloat(Data.TriHorseSensingRadius);

        WanderParameters.Radius              = DataStore.GetFloat(Data.TriHorseWanderRadius);
        WanderParameters.Distance            = DataStore.GetFloat(Data.TriHorseWanderDistance);
        WanderParameters.Jitter              = DataStore.GetFloat(Data.TriHorseWanderJitter);
        FlockingOptions.WanderWeight         = DataStore.GetFloat(Data.TriHorseWanderWeight);
        FlockingOptions.AlignmentWeight      = DataStore.GetFloat(Data.TriHorseAlignWeight);
        FlockingOptions.MinDispersion        = DataStore.GetFloat(Data.TriHorseMinFlockDispersion);
        FlockingOptions.MaxDispersion        = DataStore.GetFloat(Data.TriHorseMaxFlockDispersion);
        FlockingOptions.MinDispersionSquared = FlockingOptions.MinDispersion * FlockingOptions.MinDispersion;
        FlockingOptions.MaxDispersionSquared = FlockingOptions.MaxDispersion * FlockingOptions.MaxDispersion;

        m_FlockmateSensor             = new OctreeSensor <TriHorse>(transform, SensingRadius, 20, OctreeManager.Get(OctreeType.Herbivore));
        m_FlockmateSensor.RefreshRate = m_FlockmateSensor.RefreshRate.Randomize(.05f);

        base.OnStartServer();
        Scale = Grower.Scale;

        BehaviourBrain.In(BehaviourState.SeekingFood)
        .If(() => Health <= 0)
        .GoTo(BehaviourState.Death)
        .If(() => m_InDeathThrows)
        .GoTo(BehaviourState.Dying)
        .If(() => m_TimeSinceEating < DayClock.Singleton.DaysToSeconds(.4f))
        .GoTo(BehaviourState.Flocking)
        .If(CanReproduce)
        .GoTo(BehaviourState.Reproducing)
        .If(() => m_EatingNodule)
        .GoTo(BehaviourState.Eating)
        .ExecuteWhileIn(SeekFood, StarvationCheck);

        BehaviourBrain.In(BehaviourState.Flocking)
        .If(() => Health <= 0)
        .GoTo(BehaviourState.Death)
        .If(() => m_InDeathThrows)
        .GoTo(BehaviourState.Dying)
        .If(() => m_TimeSinceEating > DayClock.Singleton.DaysToSeconds(.4f))
        .GoTo(BehaviourState.SeekingFood)
        .If(CanReproduce)
        .GoTo(BehaviourState.Reproducing)
        .ExecuteWhileIn(Flocking);

        BehaviourBrain.In(BehaviourState.Eating)
        .If(() => m_InDeathThrows)
        .GoTo(BehaviourState.Dying)
        .If(() => !m_EatingNodule)
        .GoTo(BehaviourState.Flocking)
        .ExecuteOnEntry(StartEating)
        .ExecuteWhileIn(EatNodule)
        .ExecuteOnExit(EndEating);

        BehaviourBrain.In(BehaviourState.Reproducing)
        .DoOnce(Reproduce)
        .If(() => true)
        .GoTo(BehaviourState.SeekingFood);

        //Empty state. All action is handled through anim callbacks or outside function calls
        //Once we enter this state, we do not leave it.
        BehaviourBrain.In(BehaviourState.Dying);

        BehaviourBrain.In(BehaviourState.Death)
        .DoOnce(Die);

        BehaviourBrain.Initialize(BehaviourState.SeekingFood);

        //This forces the herbivore to start in the seeking food state
        m_TimeSinceEating = DayClock.Singleton.DaysToSeconds(.4f);
    }