using Photon.Pun; using System.Collections; using System.Collections.Generic; using UnityEngine; public class MinionNPCController : BasicEnemyNPCController { protected bool isReady = false; public LayerMask movementMask; Camera cam; Plane plane = new Plane(Vector3.down, 0); Ray ray; RaycastHit hit; private bool readyWithoutAnimation = false; protected override void Start() { cam = Camera.main; base.Start(); if (!readyWithoutAnimation) isReady = false; } public virtual void OnSummonAnimationEnded() { isReady = true; } public void SetMinionReadyWithoutAnimation() { readyWithoutAnimation = true; isReady = true; } protected override void Update() { if (!photonView.IsMine) return; if (isDead) return; if (!isReady) { SetAgentMoving(false); return; } counter += Time.deltaTime; if (Input.GetKey(KeyCode.E)) { ray = cam.ScreenPointToRay(Input.mousePosition); if (Physics.Raycast(ray, out hit, 100f, movementMask)) { FollowInstruction(hit.point); } else { if (plane.Raycast(ray, out float distance)) { FollowInstruction(ray.GetPoint(distance)); } } } else { if (HasTarget()) { ChasingUpdate(); } else { PatrollingUpdate(); } } } protected override void PatrollingUpdate() { if (!HasAvailableTargets()) { //Debug.Log("BRAIN: !HasAVailableTargetsInside"); if (currentTarget != null) { //Debug.Log("BRAIN: TargetWasNull"); currentTarget = null; } if (agent.destination == null) { //Debug.Log("BRAIN: DEstination Null"); FollowOwner(); } else if (agent.remainingDistance < distanceToChangePatrolDestination) { //Debug.Log("BRAIN: StoppingDistanceReached"); FollowOwner(); } else { //Debug.Log("BRAIN: Else"); FollowOwner(); } } else { //Debug.Log("BRAIN: Else Else"); FollowOwner(); if (currentTarget == null) { UpdateCurrentTarget(GetClosestTarget()); } } } protected virtual void FollowOwner() { agent.speed = patrolAgentSpeed; patrolDestination = ((RiftPlayer)photonView.Owner.TagObject).transform.position; patrolDestination.y = 0f; UpdatePatrolTarget(patrolDestination); SetAgentMoving(true); //Debug.Log("BRAIN: Following owner"); } protected virtual void FollowInstruction(Vector3 instructionPosition) { agent.speed = patrolAgentSpeed; patrolDestination = instructionPosition; patrolDestination.y = 0f; UpdatePatrolTarget(patrolDestination); SetAgentMoving(true); } [PunRPC] protected override void RPC_OnDeath(bool lootDropped) { if (isDead) return; //Debug.Log($"{this.gameObject.name} died!"); isDead = true; agent.enabled = false; //experienceOnDeath.Raise(health.GetMaxValue() * GameConstants.GameBalancing.HealthIntoExperienceMultiplier); //dropTable.DropLoot(lootDropped); animatorController.SetDead(); if (!photonView.IsMine) return; } }