using System.Collections; using System.Collections.Generic; using TMPro; using UnityEngine; using UnityEngine.AI; using UnityEngine.VFX; using DG.Tweening; public class NPCAssistant { private NPC n; public NPCAssistant(NPC n) { this.n = n; } //random functions public void FireProjectile(int targetPlayerId, string projectile) { if (projectile == null) return; if (n.projectileOrigin == null) return; if (PlayerManager.Instance.GetPlayer(targetPlayerId) == null) return; Vector3 playerPos = PlayerManager.Instance.GetPlayer(targetPlayerId).gameObject.transform.position; playerPos += new Vector3(Random.Range(-2.0f, 2.0f), Random.Range(-0.6f, -0.2f), Random.Range(-2.0f, 2.0f)); Vector3 a = playerPos - n.gameObject.transform.position; a.Normalize(); Projectile projectilePrefab = OnDemandLoader.Load("projectiles/" + projectile); if (projectilePrefab != null) { Projectile projectileClone = n.Instantiate2(projectilePrefab); projectileClone.name = projectile; if (projectileClone != null) { projectileClone.transform.position = n.projectileOrigin.transform.position; projectileClone.transform.rotation = n.projectileOrigin.transform.rotation; projectileClone.ApplyForce(a, 1); } } //Debug.DrawRay(projectileOrigin.transform.position, new Vector3(direction.x, direction.y, direction.z) * 50f, Color.red, 100f); } /** * Used to Offset an NPC to put it in the center of a tile.. * Perhaps in the future this could be based on transform.scale? */ public float getSize(int npcType) { switch (npcType) { case 1: return 2.0f; default: return 1.0f; } } public Vector3 GetHeadPosition() => n.headTransform.position; public void AnimationMovement(float moveSpeed) { //float diff = Vector3.Distance(transform.position, previousPosition); //float currentMoveSpeed = animator.GetFloat(MOVE_SPEED); //float targetMoveSpeed = Mathf.Abs(diff) < 0.01f ? 0 : moveSpeed; //float interpolateMoveSpeed = Mathf.MoveTowards(currentMoveSpeed, targetMoveSpeed, 0.2f * Time.deltaTime); n.animator.SetFloat("Speed", moveSpeed); } public void InterpolateEntity() { float distance = Vector3.Distance(n.transform.position, n.targetPosition); float moveSpeed = n.deltaMultiplier * Time.deltaTime; //NPC Interpolation if (distance >= 10f || n.forcePositionUpdate) { n.transform.position = n.targetPosition; n.forcePositionUpdate = false; } else if (distance > 0.0f) { n.transform.position = Vector3.MoveTowards(n.transform.position, n.targetPosition, distance * moveSpeed); } AnimationMovement(moveSpeed); n.previousPosition = n.transform.position; } public void BindEntityToTerrain() { Terrain terrain = Misc.GetClosestCurrentTerrain(n.transform.position); float height = terrain.SampleHeight(n.transform.position); Vector3 setNPCHeight = n.transform.position; setNPCHeight.y = height; n.transform.position = setNPCHeight; //n.transform.position = new Vector3(n.transform.position.x, 22.5f, n.transform.position.z); } public void ToggleColliders(bool isEnabled) { foreach (Collider collider in n.npcColliders) { collider.enabled = isEnabled; } } public void InitializeVisuals(int weaponId, float scale, float h, float s, float v) { if (n.weaponRandomizer != null) n.weaponRandomizer.SetWeapon(weaponId); n.transform.localScale = new Vector3(scale, scale, scale); n.skinnedMesh.material.color = Color.HSVToRGB(h, s, v); } public void FadeHealthCanvas() { n.healthBarComponent.healthBar.SetHealth(0); n.healthBarComponent.healthBar.GetCanvasGroup().DOFade(0, 1.0f); } public IEnumerator WaitToSpawnDeathSoul() { yield return new WaitForSeconds(1.75f); NetworkPooler.Instance.PooledPlayEffect("Death_Soul", n.transform.position, n.transform.rotation, 5.0f); } public IEnumerator DeathFadePosition() { yield return new WaitForSeconds(5.0f); Vector3 pos = n.transform.position; float heightToMoveTo = pos.y -= 1.5f; n.transform.DOMoveY(heightToMoveTo, 2.0f).SetEase(Ease.OutQuad); } }