Example #1
0
        public override void Perform(Creature creature, float deltaTime)
        {
            //Debugger.Log("attack prio : " + prio);

            ProfilingUtils.BeginSample("CreatureAction::Perform (AttackEcoTarget)");

            if (Time.time > this.timeNextSwim)
            {
                this.timeNextSwim = Time.time + this.swimInterval;

                Vector3 position = Player.main.transform.position;

                Vector3 targetDirection = -MainCamera.camera.transform.forward;

                base.swimBehaviour.Attack(position, targetDirection, this.swimVelocity);
            }

            if (this.resetAggressionOnTime && Time.time > this.timeStartAttack + this.maxAttackDuration)
            {
                this.StopAttack();
            }

            ProfilingUtils.EndSample(null);
        }
        public static bool Prefix(Creature __instance, float deltaTime, Animator ___traitsAnimator, ref CreatureAction ___lastAction,
                                  CreatureAction ___prevBestAction, float ___flinch, float ___flinchFadeRate, List <CreatureAction> ___actions, ref int ___indexLastActionChecked,
                                  ref int ___animAggressive, ref int ___animScared, ref int ___animTired, ref int ___animHappy, ref int ___animFlinch)
        {
            TechType techType   = CraftData.GetTechType(__instance.gameObject);
            string   myTechType = techType.AsString(true);

            if (!(myTechType == "ghostleviathan" || myTechType == "ghostleviathanjuvenile") || !PassiveGhostLeviathansPatcher.Config.isGhostPassive)
            {
                return(true);
            }

            int myIndexLast = ___indexLastActionChecked;

            CreatureAction ChooseBestAction()
            {
                if (___actions.Count == 0)
                {
                    return(null);
                }
                if (__instance.liveMixin && !__instance.liveMixin.IsAlive())
                {
                    SwimBehaviour component = __instance.GetComponentInParent <SwimBehaviour>();
                    if (component)
                    {
                        component.Idle();
                    }
                    return(null);
                }
                ProfilingUtils.BeginSample("Creature.ChooseBestAction");
                float          mynum            = 0f;
                CreatureAction mycreatureAction = null;

                if (___prevBestAction != null)
                {
                    mycreatureAction = ___prevBestAction;
                    ProfilingUtils.BeginSample("bestAction.Evaluate");
                    mynum = mycreatureAction.Evaluate(__instance);
                    ProfilingUtils.EndSample(null);
                }
                myIndexLast++;
                if (myIndexLast >= ___actions.Count)
                {
                    myIndexLast = 0;
                }
                CreatureAction creatureAction2 = ___actions[myIndexLast];

                ProfilingUtils.BeginSample("current.Evaluate");
                float num2 = creatureAction2.Evaluate(__instance);

                ProfilingUtils.EndSample(null);
                if (num2 > mynum && !Utils.NearlyEqual(num2, 0f, 1E-45f))
                {
                    mycreatureAction = creatureAction2;
                }
                ProfilingUtils.EndSample(null);
                return(mycreatureAction);
            }

            ___indexLastActionChecked = myIndexLast;

            ProfilingUtils.BeginSample("CreatureBehavior::Update");
            ProfilingUtils.BeginSample("choose action");
            CreatureAction creatureAction = ChooseBestAction();

            if (___prevBestAction != creatureAction)
            {
                if (___prevBestAction)
                {
                    ___prevBestAction.StopPerform(__instance);
                }
                if (creatureAction)
                {
                    //Logger.Log(creatureAction.ToString());
                    creatureAction.StartPerform(__instance);
                }
                ___prevBestAction = creatureAction;
            }
            ProfilingUtils.EndSample(null);
            if (creatureAction)
            {
                ProfilingUtils.BeginSample("perform action");
                creatureAction.Perform(__instance, deltaTime);
                ProfilingUtils.EndSample(null);
            }
            float num = DayNightUtils.Evaluate(1f, __instance.activity);

            __instance.Tired.Value = Mathf.Lerp(__instance.Tired.Value, 1f - num, 0.1f * deltaTime);
            ProfilingUtils.BeginSample("update traits");
            __instance.Curiosity.UpdateTrait(deltaTime);
            __instance.Friendliness.UpdateTrait(deltaTime);
            __instance.Hunger.UpdateTrait(deltaTime);
            __instance.Aggression.UpdateTrait(deltaTime);
            __instance.Scared.UpdateTrait(deltaTime);
            __instance.Tired.UpdateTrait(deltaTime);
            __instance.Happy.UpdateTrait(deltaTime);
            ___flinch = Mathf.Lerp(___flinch, 0f, ___flinchFadeRate * deltaTime);
            ProfilingUtils.EndSample(null);
            if (___traitsAnimator && ___traitsAnimator.isActiveAndEnabled)
            {
                ___traitsAnimator.SetFloat(___animAggressive, __instance.Aggression.Value);
                ___traitsAnimator.SetFloat(___animScared, __instance.Scared.Value);
                ___traitsAnimator.SetFloat(___animTired, __instance.Tired.Value);
                ___traitsAnimator.SetFloat(___animHappy, __instance.Happy.Value);
                ___traitsAnimator.SetFloat(___animFlinch, ___flinch);
            }
            ProfilingUtils.EndSample(null);
            return(false);
        }
        public static bool Prefix(MoveTowardsTarget __instance)
        {
            float aggressionMultiplier;
            int   aggressionRadius;

            if (CraftData.GetTechType(__instance.gameObject) == TechType.Crash)
            {
                return(true); // Explody ambush fish just runs normal method
            }

            if (Player.main.precursorOutOfWater || !Player.main.IsUnderwater() || PrecursorMoonPoolTrigger.inMoonpool || (Ocean.main.GetDepthOf(Player.main.gameObject) < 5))
            {
                return(true);
            }

            Vehicle veh = Player.main.currentMountedVehicle;

            if (veh != null)
            {
                if (veh.precursorOutOfWater)
                {
                    return(true);
                }
            }

            //BR// Adjust aggression levels
            if (Config.DEATHRUN.Equals(DeathRun.config.creatureAggression) || Config.EXORBITANT.Equals(DeathRun.config.creatureAggression))
            {
                if (DayNightCycle.main.timePassedAsFloat > DeathRun.FULL_AGGRESSION)
                {
                    aggressionMultiplier = 4;
                    aggressionRadius     = 6;
                }
                else if (DayNightCycle.main.timePassedAsFloat > DeathRun.MORE_AGGRESSION)
                {
                    aggressionMultiplier = 2;
                    aggressionRadius     = 3;
                }
                else
                {
                    return(true);
                }
            }
            else if (Config.HARD.Equals(DeathRun.config.creatureAggression) && (DayNightCycle.main.timePassedAsFloat > DeathRun.MORE_AGGRESSION))
            {
                aggressionMultiplier = 2;
                aggressionRadius     = 3;
            }
            else
            {
                return(true); // Just run normal method
            }

            ProfilingUtils.BeginSample("UpdateCurrentTarget");
            if (EcoRegionManager.main != null && (Mathf.Approximately(__instance.requiredAggression, 0f) || __instance.creature.Aggression.Value * aggressionMultiplier >= __instance.requiredAggression))
            {
                IEcoTarget ecoTarget = EcoRegionManager.main.FindNearestTarget(__instance.targetType, __instance.transform.position, __instance.isTargetValidFilter, aggressionRadius);

                if (ecoTarget != null)
                {
                    __instance.currentTarget = ecoTarget;
                }
                else
                {
                    __instance.currentTarget = null;
                }
            }
            ProfilingUtils.EndSample(null);
            return(false);
        }
        public static void PostFix(EcoRegion __instance, EcoTargetType type, Vector3 wsPos, EcoRegion.TargetFilter isTargetValid, ref float bestDist, ref IEcoTarget best)
        {
            if (DeathRun.crashFishSemaphore)
            {
                return;
            }

            ProfilingUtils.BeginSample("EcoRegion.FindNearestTarget");
            __instance.timeStamp = Time.time;
            System.Collections.Generic.HashSet <IEcoTarget> hashSet;
            if (!__instance.ecoTargets.TryGetValue((int)type, out hashSet))
            {
                ProfilingUtils.EndSample(null);
                return;
            }
            float num = float.MaxValue;

            foreach (IEcoTarget ecoTarget in hashSet)
            {
                if (ecoTarget != null && !ecoTarget.Equals(null))
                {
                    float sqrMagnitude = (wsPos - ecoTarget.GetPosition()).sqrMagnitude;

                    if (((ecoTarget.GetGameObject() == Player.main.gameObject) && !Player.main.IsInside() && Player.main.IsUnderwater() && !Player.main.precursorOutOfWater) ||
                        (ecoTarget.GetGameObject().GetComponent <Vehicle>() && (ecoTarget.GetGameObject().GetComponent <Vehicle>() == Player.main.currentMountedVehicle)) && !Player.main.currentMountedVehicle.precursorOutOfWater)
                    {
                        bool feeding = false;
                        if (ecoTarget.GetGameObject() == Player.main.gameObject)
                        {
                            Pickupable held = Inventory.main.GetHeld();
                            if (held != null && (held.GetTechType() == TechType.Peeper))
                            {
                                feeding = true;
                            }
                        }

                        float depth = Ocean.main.GetDepthOf(ecoTarget.GetGameObject());
                        if ((depth > 5) && !feeding)
                        {
                            if (Config.DEATHRUN.Equals(DeathRun.config.creatureAggression) || Config.EXORBITANT.Equals(DeathRun.config.creatureAggression))
                            {
                                if (DayNightCycle.main.timePassedAsFloat >= DeathRun.FULL_AGGRESSION)
                                {
                                    sqrMagnitude = 1; //BR// Player appears very close! (i.e. attractive target)
                                }
                                else if (DayNightCycle.main.timePassedAsFloat >= DeathRun.MORE_AGGRESSION)
                                {
                                    sqrMagnitude /= 4;
                                }
                                else
                                {
                                    sqrMagnitude /= 2;
                                }
                            }
                            else if (Config.HARD.Equals(DeathRun.config.creatureAggression))
                            {
                                if (DayNightCycle.main.timePassedAsFloat >= DeathRun.FULL_AGGRESSION)
                                {
                                    sqrMagnitude /= 3; //BR// Player appears closer! (i.e. attractive target)
                                }
                                else if (DayNightCycle.main.timePassedAsFloat >= DeathRun.MORE_AGGRESSION)
                                {
                                    sqrMagnitude /= 2;
                                }
                            }
                        }
                    }

                    if (sqrMagnitude < num && (isTargetValid == null || isTargetValid(ecoTarget)))
                    {
                        best = ecoTarget;
                        num  = sqrMagnitude;
                    }
                }
            }
            if (best != null)
            {
                bestDist = Mathf.Sqrt(num);
            }
            ProfilingUtils.EndSample(null);
        }