Author: Not specified Language: text
Description: Not specified Timestamp: 2013-06-03 23:18:36 +0000
View raw paste Reply
  1. using UnityEngine;
  2. using System;
  3. using System.Collections;
  4. using System.Collections.Generic;
  5. using Random = UnityEngine.Random;
  6.  
  7. [RequireComponent(typeof(Rigidbody))]
  8. [AddComponentMenu("Cosmic Storm/Targetable")]
  9. public class Targetable : MonoBehaviour {
  10.  
  11.         public static List<Targetable> all;
  12.         public string displayedName;
  13.         private Texture targetTexture, hudItemsTexture;
  14.         private Renderer usedRenderer;
  15.         private Dictionary<Ship, Vector3> previousVelocity; // FIXME need to delete nonexistent ships from this
  16.         private Damageable damageable;
  17.         private GuidedMissile guidedMissile;
  18.         public bool isTargeted { get; set; }
  19.         public bool isTargetedByTurret { get; set; }
  20.         public float hValue;
  21.         private int _team;
  22.         public int team { get; set; }
  23.         public bool isCloaked { get; set; }
  24.  
  25.         static Targetable() {
  26.                 all = new List<Targetable>();
  27.         }
  28.  
  29.         void Start() {
  30.                 targetTexture = Resources.Load("UITextures/Target") as Texture;
  31.                 hudItemsTexture = Resources.Load("UITextures/HUDItems") as Texture;
  32.                 usedRenderer = GetComponentInChildren<MeshRenderer>();
  33.                 damageable = GetComponent<Damageable>();
  34.                 guidedMissile = GetComponent<GuidedMissile>();
  35.                 if (hValue <= 0 || hValue >= 5) {
  36.                         hValue = 1;
  37.                         Debug.LogWarning(gameObject.name + " has an invalid hierarchy value!");
  38.                 }
  39.                 previousVelocity = new Dictionary<Ship, Vector3>();
  40.                 all.Add(this);
  41.         }
  42.  
  43.         void OnDestroy() {
  44.                 all.Remove(this);
  45.         }
  46.  
  47.         void OnGUI() {
  48.                 if (isCloaked || GlobalScripts.menuManager.isAnyMenuDisplayed)
  49.                         return;
  50.  
  51.                 Player localPlayer = GlobalScripts.gameState.localPlayer;
  52.                 Ship playerShip = (localPlayer == null) ? null : localPlayer.ship;
  53.  
  54.                 /* "WorldToScreenPoint may return a valid screen coordinate even when the object
  55.                  * is behind the camera; if you have this problem, check if renderer.isVisible is
  56.                  * true before rendering the window"
  57.                  * FIXME this is still kind of inaccurate for big objects.
  58.                  */
  59.                 if (playerShip != null) {
  60.                         if (playerShip.empTimer <= 3 && playerShip.gameObject != gameObject) {
  61.                                 if (usedRenderer.isVisible) {
  62.                                         Vector3 pos = Camera.mainCamera.WorldToScreenPoint(transform.position);
  63.                                         pos.y = Camera.mainCamera.pixelHeight - pos.y;
  64.  
  65.                                         float tx = 0.00f, ty = 1.0f - 0.25f * (team + 1);
  66.                                         if (isTargeted)
  67.                                                 tx = 0.25f;
  68.                                         GUI.DrawTextureWithTexCoords(new Rect(pos.x - 8, pos.y - 8, 16, 16), targetTexture, new Rect(tx, ty, 0.25f, 0.25f));
  69.                                         GUI.skin.GetStyle("Label").alignment = TextAnchor.LowerCenter;
  70.                                         GUI.Label(new Rect(pos.x - 100, pos.y - 48, 200, 48), displayedName);
  71.                                         if (isTargeted && damageable != null) {
  72.                                                 GUI.DrawTextureWithTexCoords(new Rect(pos.x - 16, pos.y - 16, 32, 2), hudItemsTexture,
  73.                                                         new Rect(0.0625f * (1 - (float)damageable.hp / damageable.maxHP), 0.5f, 0.0625f, 0.00390625f));
  74.                                         }
  75.                                         //GUI.Label(new Rect(pos.x - 100, pos.y + 12, 200, 20), string.Format("{0:F2}", targetScore));
  76.                                 }
  77.                                 else if (guidedMissile != null && !guidedMissile.wasEMPd && guidedMissile.target == playerShip.gameObject) {
  78.                                         Vector3 pos = Camera.mainCamera.WorldToScreenPoint(transform.position);
  79.                                         float px = pos.x - Screen.width / 2;
  80.                                         float py = Screen.height / 2 - pos.y;
  81.  
  82.                                         int side = 0;
  83.  
  84.                                         float y = Mathf.Sign(py) * Mathf.Min(Screen.height / 2, Mathf.Abs(Screen.width / 2 * py / px));
  85.                                         if (y > 0)
  86.                                                 y -= 16;
  87.                                         float x = Mathf.Sign(px) * Mathf.Min(Screen.width / 2, Mathf.Abs(Screen.height / 2 * px / py));
  88.                                         if (x > 0)
  89.                                                 x -= 16;
  90.  
  91.                                         float arrowAngle = Mathf.Abs(Mathf.Atan2(y, x));
  92.                                         arrowAngle = Mathf.Min(arrowAngle, Mathf.PI - arrowAngle);
  93.                                         float arrowOrientation = arrowAngle - Mathf.Atan2(Screen.height, Screen.width);
  94.  
  95.                                         if (arrowOrientation > 0)
  96.                                                 side = (y > 0) ? 2 : 0;
  97.                                         else
  98.                                                 side = (x > 0) ? 1 : 3;
  99.  
  100.                                         float tx = side * 0.03125f, ty = 0.5f - team * 0.03125f;
  101.                                         GUI.DrawTextureWithTexCoords(new Rect(x + Screen.width / 2, y + Screen.height / 2, 16, 16),
  102.                                                 hudItemsTexture, new Rect(tx, ty, 0.03125f, 0.03125f));
  103.                                 }
  104.                         }
  105.  
  106.                         Vector3 position = Quaternion.Inverse(playerShip.transform.rotation) * (transform.position - playerShip.transform.position);
  107.                         position /= 16;
  108.                         position.y = 0;
  109.                         if (playerShip.empTimer >= 0) {
  110.                                 position.x += (Random.value - 0.5f) * 32 * playerShip.empTimer;
  111.                                 position.z += (Random.value - 0.5f) * 32 * playerShip.empTimer;
  112.                         }
  113.                         if (position.sqrMagnitude < 9216)
  114.                                 GUI.DrawTextureWithTexCoords(new Rect(position.x + 96 - 8, 96 - position.z - 8, 16, 16), targetTexture,
  115.                                         new Rect(0.50f, 1.0f - 0.25f * (team + 1), 0.25f, 0.25f));
  116.                 }
  117.         }
  118.  
  119.         public float CalculateTargetScore(Ship playerShip) {
  120.                 if (isCloaked || (team != 0 && playerShip.player != null && playerShip.player.team == team)) {
  121.                         // don't target your own stuff
  122.                         return -99999;
  123.                 }
  124.                 else {
  125.                         Ship myShip = GetComponent<Ship>();
  126.                         if (myShip != null && myShip.player.spawnState == SpawnState.PreLaunch)
  127.                                 return -99999;
  128.  
  129.                         Vector3 relativePosition = (playerShip.transform.position - transform.position);
  130.                         Vector3 relativeVelocity = (playerShip.rigidbody.velocity - rigidbody.velocity);

This paste is large and only partially shown.
View full paste

View raw paste Reply