using UnityEngine; using UnityEngine.AI; using Photon.Pun; public class MovementSpeedModifierEffectInstance : StatusEffectInstance { public float currentSpeedModifierPercent; private NavMeshAgent navMeshAgent; private float baseSpeed; private float baseTurnSpeed; private float baseAcceleration; protected override void Awake() { base.Awake(); navMeshAgent = GetComponent(); baseSpeed = navMeshAgent.speed; baseTurnSpeed = navMeshAgent.angularSpeed; baseAcceleration = navMeshAgent.acceleration; } public float ModifyMovementSpeed() { return baseSpeed * (1 + currentSpeedModifierPercent); } public float ModifyTurnSpeed() { return baseTurnSpeed * (1 + currentSpeedModifierPercent); } public float ModifyAcceleration() { return baseAcceleration * (1 + currentSpeedModifierPercent); } public float GetHighestAmount(float value) { float highestAmount = value; for (int i = activeStacks.Count - 1; i >= 0; i--) { if (((MovementSpeedModifierEffect)activeStacks[i]).speedModifierPercentage > highestAmount) highestAmount = ((MovementSpeedModifierEffect)activeStacks[i]).speedModifierPercentage; } return highestAmount; } [PunRPC] public void RPC_ApplyMovementSpeedModifierEffect(int effectIndex, float value) { ApplyEffect(StatusEffectIndexer.Instance.StatusEffects[effectIndex], value); } public override void ApplyEffect(StatusEffect effect, float value) { base.ApplyEffect(effect, value); UpdateNavMeshAgentSpeed(); } protected override void AddStack(StatusEffect addedEffect, float value) { if (activeStacks.Count <= 0) { currentSpeedModifierPercent = value; } else if (canStack) { currentSpeedModifierPercent += value; } base.AddStack(addedEffect, value); UpdateNavMeshAgentSpeed(); } protected override void RefreshEffect(StatusEffect effect, float value) { base.RefreshEffect(effect, value); currentSpeedModifierPercent = GetHighestAmount(value); OnEffectStackAdded(); UpdateNavMeshAgentSpeed(); } protected override void EffectStateEnded() { currentSpeedModifierPercent = 0; UpdateNavMeshAgentSpeed(); base.EffectStateEnded(); } private void UpdateNavMeshAgentSpeed() { if (navMeshAgent != null) { navMeshAgent.speed = ModifyMovementSpeed(); navMeshAgent.speed = Mathf.Clamp(navMeshAgent.speed, baseSpeed, GameConstants.CharacterBalancing.MovementSpeedCap); navMeshAgent.angularSpeed = ModifyTurnSpeed(); navMeshAgent.angularSpeed = Mathf.Clamp(navMeshAgent.angularSpeed, baseTurnSpeed, baseTurnSpeed * (1 + GameConstants.CharacterBalancing.PercentAngularSpeedCap)); navMeshAgent.acceleration = ModifyAcceleration(); navMeshAgent.acceleration = Mathf.Clamp(navMeshAgent.acceleration, baseAcceleration, baseAcceleration * (1 + GameConstants.CharacterBalancing.PercentAccelerationCap)); } } }