Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using UnityEngine;
- using System.Collections;
- using UnityEngine.UI;
- using UnityStandardAssets.Utility;
- [RequireComponent(typeof (UnityEngine.AI.NavMeshAgent))]
- public class PlayerControllerRTS : uLink.MonoBehaviour {
- public UnityEngine.AI.NavMeshAgent agent { get; private set; } // the navmesh agent required for the path finding
- public MobaStorm.PlayerState playerStatus = MobaStorm.PlayerState.idle;
- private MobaStorm.MouseState mouseState = MobaStorm.MouseState.server;
- private InputField inputFieldGameChat;
- //USED TO SEND THE TARGET NAME TO THE SERVER
- private GameObject targetObj;
- private Vector3 pointerPos;
- public GameObject mouseMovePointerPrefab;
- private GameObject mouseMovePointer;
- private GameObject mouseProjector;
- private Animator animator;
- //SCRIPTS ACCESED ON THIS CLASS
- private PlayerSpells playerSpellScript;
- private Image healthCdImage;
- private Image ManaCdImage;
- //private DmgDatabase dmgScript;
- private Vector3 destinationPos;
- public LayerMask redMask;
- public LayerMask blueMask;
- public LayerMask floorMask;
- public LayerMask mask;
- private GamePanelUi gamePanelScript;
- [HideInInspector] public PlayerStats playerStScript;
- //STORE THE INITIAL POSITION AND ROTATION OF THE PLAYER TO WARP THE AGENT WHEN THE PLAYER IS DEAD
- private Vector3 initialPos;
- private Quaternion initialRotation;
- //USED TO SEND LOCK THE CAMERA TO THE CURRENT OWNER NETWORK PLAYER
- private GameObject cameraObj;
- Camera cam;
- private CustomCamera cameraScript;
- //Handle particle creation
- //[HideInInspector] public ParticleManager particleScript;
- private GameObject teleportParticle;
- private GameObject teleportObj;
- private Image mainPortrait;
- //VOID START
- void Start () {
- mouseMovePointer = (GameObject)Instantiate(mouseMovePointerPrefab, Vector3.zero, Quaternion.identity);
- animator = GetComponent<Animator>();
- playerStScript = GetComponent<PlayerStats>();
- //FIND THE InputFieldGameChat Object and get the InputField COMPONENT
- inputFieldGameChat = GameObject.Find("InputFieldGameChat").GetComponent<InputField>();
- if (uLink.Network.isServer)
- {
- playerSpellScript = transform.GetComponent<PlayerSpells>();
- agent = GetComponentInChildren<UnityEngine.AI.NavMeshAgent>();
- agent.updateRotation = false;
- agent.updatePosition = true;
- initialRotation = transform.rotation;
- initialPos = transform.position;
- }
- }
- void Update () {
- //If the game has ended do nothing!
- if (ScoreTable.instance.GameEnded == true)
- {
- animator.Stop();
- return;
- }
- if (teleportObj)
- {
- teleportObj.transform.position = transform.position;
- }
- if (uLink.Network.isServer)
- {
- //DISABLE ANIMATOR COMPONENT IF THE PLAYER IS STUNNED
- if (playerStScript.stunObj && playerStScript.Health > 0)
- {
- if (uLink.Network.isServer)
- {
- agent.Stop();
- playerStatus = MobaStorm.PlayerState.idle;
- }
- animator.enabled = false;
- return;
- }
- else
- {
- animator.enabled = true;
- }
- if (playerStScript.Health<=0)
- {
- playerStatus = MobaStorm.PlayerState.dead;
- }
- //SHITCH CASE TO CONTROLL ALL ACTIONS OF THE PLAYER
- switch (playerStatus)
- {
- case MobaStorm.PlayerState.idle:
- animator.SetInteger("AnimType", (int)MobaStorm.PlayerState.idle);
- break;
- case MobaStorm.PlayerState.running:
- if (!playerStScript.charLocked && !playerStScript.abilityLocked)
- {
- animator.SetInteger("AnimType", (int)MobaStorm.PlayerState.running);
- MoveOrChase();
- if (!agent.pathPending)
- {
- if (agent.remainingDistance <= agent.stoppingDistance)
- {
- if (!agent.hasPath || agent.velocity.sqrMagnitude == 0f)
- {
- playerStatus = MobaStorm.PlayerState.idle;
- }
- }
- }
- }
- break;
- case MobaStorm.PlayerState.chasing:
- break;
- case MobaStorm.PlayerState.attackingBasic:
- CalculateAttack(playerStScript.stats.basic.weaponType, MobaStorm.PlayerState.attackingBasic, playerStScript.stats.basic.rangue, playerStScript.stats.basic.cdr, playerStScript.stats.basic.cdrTStamp,
- playerStScript.stats.basic.manaCost);
- break;
- case MobaStorm.PlayerState.attackingQ:
- CalculateAttack(playerStScript.stats.q.weaponType, MobaStorm.PlayerState.attackingQ, playerStScript.stats.q.rangue, playerStScript.stats.q.cdr, playerStScript.stats.q.cdrTStamp,
- playerStScript.stats.q.manaCost);
- break;
- case MobaStorm.PlayerState.attackingW:
- CalculateAttack(playerStScript.stats.w.weaponType, MobaStorm.PlayerState.attackingW, playerStScript.stats.w.rangue, playerStScript.stats.w.cdr, playerStScript.stats.w.cdrTStamp,
- playerStScript.stats.w.manaCost);
- break;
- case MobaStorm.PlayerState.attackingE:
- CalculateAttack(playerStScript.stats.e.weaponType, MobaStorm.PlayerState.attackingE, playerStScript.stats.e.rangue, playerStScript.stats.e.cdr, playerStScript.stats.e.cdrTStamp,
- playerStScript.stats.e.manaCost);
- break;
- case MobaStorm.PlayerState.attackingR:
- CalculateAttack(playerStScript.stats.r.weaponType, MobaStorm.PlayerState.attackingR, playerStScript.stats.r.rangue, playerStScript.stats.r.cdr, playerStScript.stats.r.cdrTStamp,
- playerStScript.stats.r.manaCost);
- break;
- case MobaStorm.PlayerState.dead:
- animator.SetInteger("AnimType", (int)MobaStorm.PlayerState.dead);
- agent.Stop();
- break;
- case MobaStorm.PlayerState.recall:
- animator.SetInteger("AnimType", (int)MobaStorm.PlayerState.recall);
- break;
- case MobaStorm.PlayerState.emote:
- animator.SetInteger("AnimType", (int)MobaStorm.PlayerState.emote);
- agent.Stop();
- break;
- }
- }
- }
- public void OnGUI () {
- RaycastHit hit;
- if (!uLink.Network.isServer)
- {
- if (playerStScript.PlayerTeam == "red")
- {
- mask = redMask;
- }
- else
- {
- mask = blueMask;
- }
- }
- }
- //ADD A LEVEL TO THE PLAYER SPELL AND SEND A RPC TO THE CLIENTS WITH THE NEW VALUE
- [RPC]
- private void UpgradeAbilityServer(MobaStorm.PlayerState type, bool levelUpAbility)
- {
- switch (type)
- {
- case MobaStorm.PlayerState.attackingBasic:
- if (playerStScript.stats.basic.weaponLvl < 1 && levelUpAbility)
- playerStScript.stats.basic.weaponLvl ++;
- networkView.RPC("UpgradeAbilityClient", uLink.RPCMode.Owner, MobaStorm.PlayerState.attackingBasic, playerStScript.stats.basic.cdr,
- playerStScript.stats.basic.ad, playerStScript.stats.basic.ap, playerStScript.stats.basic.weaponLvl);
- break;
- case MobaStorm.PlayerState.attackingQ:
- if (playerStScript.stats.q.weaponLvl<1 && levelUpAbility)
- playerStScript.stats.q.weaponLvl ++;
- networkView.RPC("UpgradeAbilityClient", uLink.RPCMode.Owner, MobaStorm.PlayerState.attackingQ, playerStScript.stats.q.cdr,
- playerStScript.stats.q.ad, playerStScript.stats.q.ap, playerStScript.stats.q.weaponLvl);
- break;
- case MobaStorm.PlayerState.attackingW:
- if (playerStScript.stats.w.weaponLvl<1 && levelUpAbility)
- playerStScript.stats.w.weaponLvl ++;
- networkView.RPC("UpgradeAbilityClient", uLink.RPCMode.Owner, MobaStorm.PlayerState.attackingW, playerStScript.stats.w.cdr,
- playerStScript.stats.w.ad, playerStScript.stats.w.ap, playerStScript.stats.w.weaponLvl);
- break;
- case MobaStorm.PlayerState.attackingE:
- if (playerStScript.stats.e.weaponLvl<1 && levelUpAbility)
- playerStScript.stats.e.weaponLvl ++;
- networkView.RPC("UpgradeAbilityClient", uLink.RPCMode.Owner, MobaStorm.PlayerState.attackingE, playerStScript.stats.e.cdr,
- playerStScript.stats.e.ad, playerStScript.stats.e.ap, playerStScript.stats.e.weaponLvl);
- break;
- case MobaStorm.PlayerState.attackingR:
- if (playerStScript.stats.r.weaponLvl <1 && levelUpAbility)
- playerStScript.stats.r.weaponLvl ++;
- networkView.RPC("UpgradeAbilityClient", uLink.RPCMode.Owner, MobaStorm.PlayerState.attackingR, playerStScript.stats.r.cdr,
- playerStScript.stats.r.ad, playerStScript.stats.r.ap, playerStScript.stats.r.weaponLvl);
- break;
- }
- }
- //THIS METHOD IS USED TO CALCULATE THE ATTACK COMMANDS OF THE PLAYER
- //AND CHANGE THE ANIMATION PARAMETERS TO THE ABILITY USED
- void CalculateAttack(DmgDataclass.type abilityType, MobaStorm.PlayerState StateAttacking, float range,float cdr_, float cdr_timestamp, float ManaCost)
- {
- switch (abilityType)
- {
- case DmgDataclass.type.lockedShot_rangue:
- if (!playerStScript.charLocked && !playerStScript.abilityLocked)
- {
- if (targetObj)
- {
- if (targetObj.GetComponent<PlayerStats>().Health <=0)
- {
- targetObj = null;
- playerStatus = MobaStorm.PlayerState.idle;
- agent.Stop();
- return;
- }
- }
- else
- {
- playerStatus = MobaStorm.PlayerState.idle;
- }
- if (Vector3.Distance(targetObj.transform.position,this.transform.position) < range)
- {
- agent.Stop();
- if (cdr_timestamp <= Time.time)
- {
- //DRAIN MANA FROM THE PLAYER
- MobaStorm.UpdateMana(this.networkView, playerStScript.Mana, playerStScript.ManaMax, playerStScript.HealthRegeneration, ManaCost);
- //ROTATE TO FACE THE TARGET
- Vector3 fromPosition = transform.position;
- fromPosition.y = 0;
- Vector3 toPosition = targetObj.transform.position;
- toPosition.y = 0;
- Quaternion targetRotation = Quaternion.LookRotation (toPosition - fromPosition);
- transform.rotation = targetRotation;
- UpdateCdr( StateAttacking, cdr_);
- cdr_timestamp = Time.time + cdr_;
- playerStScript.charLocked = true;
- playerStScript.abilityLocked = true;
- animator.SetInteger("AnimType", (int)StateAttacking);
- playerSpellScript.AttackDestination = targetObj.transform.position;
- playerSpellScript.target_obj = targetObj;
- }
- else
- {
- //ROTATE TO FACE THE TARGET
- Vector3 fromPosition = transform.position;
- fromPosition.y = 0;
- Vector3 toPosition = targetObj.transform.position;
- toPosition.y = 0;
- Quaternion targetRotation = Quaternion.LookRotation (toPosition - fromPosition);
- transform.rotation = Quaternion.Lerp (transform.rotation, targetRotation, 1);
- animator.SetInteger("AnimType", (int)MobaStorm.PlayerState.idle);
- }
- }
- else
- {
- animator.SetInteger("AnimType", (int)MobaStorm.PlayerState.running);
- MoveOrChase();
- }
- }
- break;
- case DmgDataclass.type.skillShot_front:
- if (!playerStScript.charLocked && !playerStScript.abilityLocked)
- {
- if (Vector3.Distance(destinationPos,this.transform.position) < range)
- {
- //ROTATE TO FACE THE TARGET
- Vector3 fromPosition = transform.position;
- fromPosition.y = 0;
- Vector3 toPosition = destinationPos;
- toPosition.y = 0;
- Quaternion targetRotation = Quaternion.LookRotation (toPosition - fromPosition);
- agent.Stop();
- if (cdr_timestamp <= Time.time && playerStScript.Mana >= ManaCost)
- {
- //DRAIN MANA FROM THE PLAYER
- MobaStorm.UpdateMana(this.networkView, playerStScript.Mana, playerStScript.ManaMax,playerStScript.HealthRegeneration, ManaCost);
- transform.rotation = targetRotation;
- UpdateCdr( StateAttacking, cdr_);
- cdr_timestamp = Time.time + cdr_;
- playerStScript.charLocked = true;
- playerStScript.abilityLocked = true;
- animator.SetInteger("AnimType", (int)StateAttacking);
- playerSpellScript.AttackDestination = destinationPos;
- playerSpellScript.target_obj = targetObj;
- }
- else
- {
- transform.rotation = Quaternion.Lerp (transform.rotation, targetRotation, 1);
- animator.SetInteger("AnimType", (int)MobaStorm.PlayerState.idle);
- }
- }
- else
- {
- animator.SetInteger("AnimType", (int)MobaStorm.PlayerState.running);
- MoveOrChase();
- }
- }
- break;
- case DmgDataclass.type.skillShot_floor:
- if (!playerStScript.charLocked && !playerStScript.abilityLocked)
- {
- if (Vector3.Distance(destinationPos,this.transform.position) < range)
- {
- //ROTATE TO FACE THE TARGET
- Vector3 fromPosition = transform.position;
- fromPosition.y = 0;
- Vector3 toPosition = destinationPos;
- toPosition.y = 0;
- Quaternion targetRotation = Quaternion.LookRotation (toPosition - fromPosition);
- agent.Stop();
- if (cdr_timestamp <= Time.time && playerStScript.Mana >= ManaCost)
- {
- //DRAIN MANA FROM THE PLAYER
- MobaStorm.UpdateMana(this.networkView, playerStScript.Mana, playerStScript.ManaMax,playerStScript.HealthRegeneration, ManaCost);
- transform.rotation = targetRotation;
- UpdateCdr( StateAttacking, cdr_);
- cdr_timestamp = Time.time + cdr_;
- playerStScript.charLocked = true;
- playerStScript.abilityLocked = true;
- animator.SetInteger("AnimType", (int)StateAttacking);
- playerSpellScript.AttackDestination = destinationPos;
- playerSpellScript.target_obj = targetObj;
- }
- else
- {
- transform.rotation = Quaternion.Lerp (transform.rotation, targetRotation, 1);
- animator.SetInteger("AnimType", (int)MobaStorm.PlayerState.idle);
- }
- }
- else
- {
- animator.SetInteger("AnimType", (int)MobaStorm.PlayerState.running);
- MoveOrChase();
- }
- }
- break;
- case DmgDataclass.type.aoe_instant:
- if (cdr_timestamp <= Time.time && playerStScript.Mana >= ManaCost)
- {
- //DRAIN MANA FROM THE PLAYER
- MobaStorm.UpdateMana(this.networkView, playerStScript.Mana, playerStScript.ManaMax,playerStScript.HealthRegeneration, ManaCost);
- UpdateCdr( StateAttacking, cdr_);
- cdr_timestamp = Time.time + cdr_;
- playerSpellScript.Attacking((int)StateAttacking);
- }
- break;
- }
- }
- //MOVE OR CHASE METHOD
- //USED TO CONTROL THE AGENT COMPONENT ATTACHED ON THE PLAYER
- public void MoveOrChase()
- {
- if (playerStScript.Health<=0)
- {
- agent.Stop();
- return;
- }
- agent.Resume();
- float finalSpeed = playerStScript.Speed + ((playerStScript.Speed * playerStScript.speedAdd) / 100);
- agent.speed = finalSpeed;
- if (targetObj)
- {
- agent.SetDestination(targetObj.transform.position);
- if (agent.velocity.normalized != Vector3.zero)
- transform.rotation = Quaternion.LookRotation(agent.velocity.normalized);
- }
- else
- {
- if (agent.velocity.normalized != Vector3.zero)
- transform.rotation = Quaternion.LookRotation(agent.velocity.normalized);
- }
- }
- //CALLED FROM THE ANIMATION EVENTS OF EACH PLAYER ANIMATION TO UNLOCK THE PLAYER
- //WHEN THE ABILITY ANIMATION IS ENDING
- void ExitAnim()
- {
- playerStScript.charLocked = false;
- }
- //THIS METHOD IS RUNNING ON THE SERVER
- //CALCULATE IF THE PLAYER WILL MOVE TO ANY LOCATIO OR ATTACK AN ENEMY
- [RPC]
- void SendAttackToServer (Vector3 newPosition, MobaStorm.PlayerState state, string targetName)
- {
- //Debug.Log("Attack Sent");
- if (!playerStScript.charLocked && !playerStScript.abilityLocked && playerStScript.Health > 0)
- {
- if (teleportObj)
- {
- Destroy(teleportObj);
- networkView.RPC("ShowTeleportParticle", uLink.RPCMode.Others, false);
- }
- playerStatus = state;
- if (playerStatus == MobaStorm.PlayerState.running) {
- if (targetName == "")
- {
- targetObj = null;
- agent.SetDestination(newPosition);
- playerStatus = MobaStorm.PlayerState.running;
- }
- else
- {
- targetObj = GameObject.Find(targetName);
- playerStatus = MobaStorm.PlayerState.attackingBasic;
- }
- }
- if (playerStatus == MobaStorm.PlayerState.attackingQ && targetName != "NoTarget") {
- agent.SetDestination(newPosition);
- destinationPos = newPosition;
- }
- if (playerStatus == MobaStorm.PlayerState.attackingW && targetName != "NoTarget") {
- agent.SetDestination(newPosition);
- destinationPos = newPosition;
- }
- if (playerStatus == MobaStorm.PlayerState.attackingE && targetName != "NoTarget") {
- agent.SetDestination(newPosition);
- destinationPos = newPosition;
- }
- if (playerStatus == MobaStorm.PlayerState.attackingR && targetName != "NoTarget") {
- agent.SetDestination(newPosition);
- destinationPos = newPosition;
- }
- }
- }
- //THIS METHOD IS USED TO UPDATE THE CURRENT CDR OF THE SERVER TO THE OWNER PLAYER
- [RPC]
- void UpdateCdr (MobaStorm.PlayerState state, float cdrFromServer)
- {
- if (uLink.Network.isServer)
- {
- networkView.RPC("UpdateCdr", uLink.RPCMode.Owner, state, cdrFromServer);
- }
- switch (state)
- {
- case MobaStorm.PlayerState.attackingBasic:
- playerStScript.stats.basic.cdr = cdrFromServer;
- playerStScript.stats.basic.cdrTStamp = Time.time + playerStScript.stats.basic.cdr;
- break;
- case MobaStorm.PlayerState.attackingQ:
- playerStScript.stats.q.cdr = cdrFromServer;
- playerStScript.stats.q.cdrTStamp = Time.time + playerStScript.stats.q.cdr;
- break;
- case MobaStorm.PlayerState.attackingW:
- playerStScript.stats.w.cdr = cdrFromServer;
- playerStScript.stats.w.cdrTStamp = Time.time + playerStScript.stats.w.cdr;
- break;
- case MobaStorm.PlayerState.attackingE:
- playerStScript.stats.e.cdr = cdrFromServer;
- playerStScript.stats.e.cdrTStamp = Time.time + playerStScript.stats.e.cdr;
- break;
- case MobaStorm.PlayerState.attackingR:
- playerStScript.stats.r.cdr = cdrFromServer;
- playerStScript.stats.r.cdrTStamp = Time.time + playerStScript.stats.r.cdr;
- break;
- }
- }
- //RECALL METHOD
- public void RecallBase()
- {
- networkView.RPC("RecallBaseRPC", uLink.RPCMode.Server);
- }
- [RPC]
- public IEnumerator RecallBaseRPC()
- {
- if (!playerStScript.abilityLocked && !playerStScript.charLocked && !teleportObj)
- {
- teleportObj = Instantiate(teleportParticle, new Vector3(transform.position.x, 0.1f, transform.position.z), Quaternion.Euler(-90, 0, 0)) as GameObject;
- networkView.RPC("ShowTeleportParticle", uLink.RPCMode.Others, true);
- playerStatus = MobaStorm.PlayerState.recall;
- agent.Stop();
- networkView.RPC("RecallBaseRPC", uLink.RPCMode.Others);
- //animator.SetInteger("AnimType", (int)MobaStorm.PlayerState.idle);
- yield return new WaitForSeconds(4f);
- if (teleportObj)
- {
- Destroy(teleportObj);
- networkView.RPC("ShowTeleportParticle", uLink.RPCMode.Others, false);
- playerStatus = MobaStorm.PlayerState.idle;
- animator.SetInteger("AnimType", (int)MobaStorm.PlayerState.idle);
- agent.Warp(initialPos);
- transform.rotation = initialRotation;
- agent.ResetPath();
- }
- }
- }
- [RPC]
- public IEnumerator ImDead()
- {
- playerStatus = MobaStorm.PlayerState.dead;
- //Transform trigger = transform.FindChild("Trigger");
- animator.SetInteger("AnimType", (int)MobaStorm.PlayerState.dead);
- agent.enabled = true;
- yield return new WaitForSeconds(playerStScript.RespawnTime);
- agent.enabled = true;
- agent.Warp(initialPos);
- Respawn();
- playerStScript.abilityLocked = false;
- playerStScript.charLocked = false;
- targetObj = null;
- playerStatus = MobaStorm.PlayerState.idle;
- animator.SetInteger("AnimType", (int)MobaStorm.PlayerState.idle);
- transform.rotation = initialRotation;
- }
- [RPC]
- public void Respawn ()
- {
- playerStScript.SetMaxHealth(playerStScript.HealthMax, playerStScript.HealthMax);
- playerStScript.SetMaxMana(playerStScript.ManaMax, playerStScript.ManaMax);
- playerStScript.destroyed = false;
- playerStScript.UpdateStatsOnClients();
- }
- [RPC]
- public void ShowTeleportParticle (bool create)
- {
- }
- [RPC]
- void ShowLvlUpParticle ()
- {
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement