221 lines
		
	
	
		
			5.7 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			221 lines
		
	
	
		
			5.7 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
using System;
 | 
						|
using System.Collections;
 | 
						|
using UnityEngine;
 | 
						|
 | 
						|
[Serializable]
 | 
						|
public class VehicleBot : MonoBehaviour
 | 
						|
{
 | 
						|
	public Vehicle vehicle;
 | 
						|
 | 
						|
	private GameObject enemy;
 | 
						|
	private int botMovement;
 | 
						|
	private int botEnemySelection;
 | 
						|
	private int enemyUpdateTime;
 | 
						|
	private float rocketFireTime = 0.00f;
 | 
						|
 | 
						|
	public void Update()
 | 
						|
	{
 | 
						|
        //Enemy updates
 | 
						|
		if (
 | 
						|
            (float)enemyUpdateTime == 0f ||
 | 
						|
            Time.time - 2f > (float)enemyUpdateTime)
 | 
						|
		{
 | 
						|
			enemyUpdateTime = (int)Time.time;
 | 
						|
 | 
						|
			if (botEnemySelection == 1)
 | 
						|
			{
 | 
						|
                float distance = Mathf.Infinity;
 | 
						|
                foreach (DictionaryEntry plrE in Game.Players)
 | 
						|
                {
 | 
						|
                    if (!((Vehicle)plrE.Value).gameObject) continue;
 | 
						|
                    GameObject go = ((Vehicle)plrE.Value).gameObject;
 | 
						|
                    Vector3 diff = (go.transform.position - transform.position);
 | 
						|
                    float curDistance = diff.sqrMagnitude;
 | 
						|
                    if (curDistance < distance && go.name != name)
 | 
						|
                    {
 | 
						|
                        enemy = go;
 | 
						|
                        distance = curDistance;
 | 
						|
                    }
 | 
						|
                }
 | 
						|
			}
 | 
						|
			else if (botEnemySelection == 2)
 | 
						|
			{
 | 
						|
                foreach (DictionaryEntry plrE in Game.Players)
 | 
						|
                {
 | 
						|
                    if (((Vehicle)plrE.Value).isIt != 0)
 | 
						|
                    {
 | 
						|
                        enemy = ((Vehicle)plrE.Value).gameObject;
 | 
						|
                        break;
 | 
						|
                    }
 | 
						|
                }
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
        //Rabbit Hunt Mode
 | 
						|
        //if (true)
 | 
						|
        //{
 | 
						|
            if (vehicle.isIt != 0)
 | 
						|
            {
 | 
						|
                botMovement = 1;
 | 
						|
                botEnemySelection = 1;
 | 
						|
            }
 | 
						|
            else
 | 
						|
            {
 | 
						|
                botMovement = 2;
 | 
						|
                botEnemySelection = 2;
 | 
						|
            }
 | 
						|
        //}
 | 
						|
 | 
						|
        //Tag Mode (UNUSED)
 | 
						|
        /*else
 | 
						|
        {
 | 
						|
            if (vehicle.isIt == 0)
 | 
						|
            {
 | 
						|
                botMovement = 1;
 | 
						|
            }
 | 
						|
            else
 | 
						|
            {
 | 
						|
                botMovement = 2;
 | 
						|
                botEnemySelection = 1;
 | 
						|
            }
 | 
						|
        }*/
 | 
						|
 | 
						|
 | 
						|
		if (Game.Settings.botsCanDrive)
 | 
						|
		{
 | 
						|
            //Hiding movement
 | 
						|
			if (botMovement == 1)
 | 
						|
			{
 | 
						|
                //Tank
 | 
						|
				if (vehicle.vehId == 2)
 | 
						|
				{
 | 
						|
					vehicle.input.x = (Time.time % 2f == 0f ?
 | 
						|
                        0f :
 | 
						|
                        UnityEngine.Random.value * 2f - 1f);
 | 
						|
					vehicle.input.y = 1f;
 | 
						|
				}
 | 
						|
                //All others
 | 
						|
				else
 | 
						|
				{
 | 
						|
					vehicle.input.x = UnityEngine.Random.value * 2f - 1f;
 | 
						|
					vehicle.input.y = 1f;
 | 
						|
				}
 | 
						|
			}
 | 
						|
 | 
						|
            //Persuing movement
 | 
						|
			else if (botMovement == 2 && (bool)enemy)
 | 
						|
			{
 | 
						|
				float distance = Vector3.Distance(
 | 
						|
                    enemy.transform.position,
 | 
						|
                    vehicle.myRigidbody.position);
 | 
						|
				float rotation = Quaternion.LookRotation(
 | 
						|
                    enemy.transform.position -
 | 
						|
                        vehicle.myRigidbody.position).eulerAngles.y -
 | 
						|
                        transform.localRotation.eulerAngles.y;
 | 
						|
				if (rotation > 180f)
 | 
						|
				{
 | 
						|
					rotation -= 360f;
 | 
						|
				}
 | 
						|
				if (rotation < -180f)
 | 
						|
				{
 | 
						|
					rotation += 360f;
 | 
						|
				}
 | 
						|
 | 
						|
                //Buggy
 | 
						|
				if (vehicle.vehId == 0)
 | 
						|
				{
 | 
						|
					rotation /= 20f;
 | 
						|
					if (distance < 15f)
 | 
						|
					{
 | 
						|
                        vehicle.input.x = (Mathf.Abs(rotation) < 0.1f ?
 | 
						|
                            0f :
 | 
						|
                            Mathf.Clamp(rotation, -1f, 1f));
 | 
						|
					}
 | 
						|
					else
 | 
						|
					{
 | 
						|
                        vehicle.input.x = (Mathf.Abs(rotation) < 0.1f ?
 | 
						|
                            0 :
 | 
						|
                            Mathf.Clamp(rotation, -0.6f, 0.6f));
 | 
						|
					}
 | 
						|
					vehicle.input.y = 1f;
 | 
						|
					vehicle.specialInput = false;
 | 
						|
				}
 | 
						|
                //Hovercraft
 | 
						|
				else if (vehicle.vehId == 1)
 | 
						|
				{
 | 
						|
					rotation /= 15f;
 | 
						|
					vehicle.input.x = (Mathf.Abs(rotation) < 0.1f ?
 | 
						|
                        0f :
 | 
						|
                        Mathf.Clamp(rotation, -1f, 1f));
 | 
						|
					vehicle.input.y = 1f;
 | 
						|
					vehicle.specialInput = false;
 | 
						|
				}
 | 
						|
                //Tank
 | 
						|
				else if (vehicle.vehId == 2)
 | 
						|
				{
 | 
						|
					rotation /= 80f;
 | 
						|
					vehicle.input.x = (Mathf.Abs(rotation) < 0.3f ?
 | 
						|
                        0f :
 | 
						|
                        Mathf.Clamp(rotation, -1f, 1f));
 | 
						|
					vehicle.input.y = (Mathf.Abs(rotation) > 1f ?
 | 
						|
                        0 :
 | 
						|
                        1);
 | 
						|
					vehicle.specialInput = false;
 | 
						|
				}
 | 
						|
				else if (vehicle.vehId == 3)
 | 
						|
				{
 | 
						|
					rotation /= 10f;
 | 
						|
					vehicle.input.x = (Mathf.Abs(rotation) < 0.1f ?
 | 
						|
                        0f :
 | 
						|
                        Mathf.Clamp(rotation, -1f, 1f));
 | 
						|
					vehicle.input.y = 1f;
 | 
						|
					vehicle.input.z = Physics.Raycast(
 | 
						|
                        transform.position,
 | 
						|
                        Vector3.up * -1f,
 | 
						|
                        4f) ? 1f : 0.3f;
 | 
						|
					vehicle.specialInput = true;
 | 
						|
				}
 | 
						|
			}
 | 
						|
		}
 | 
						|
		else
 | 
						|
		{
 | 
						|
			vehicle.input.x = 0f;
 | 
						|
			vehicle.input.y = 0f;
 | 
						|
		}
 | 
						|
 | 
						|
        //Fire!
 | 
						|
		if (
 | 
						|
            (bool)enemy &&
 | 
						|
            Game.Settings.botsCanFire &&
 | 
						|
            Time.time - 1f > rocketFireTime &&
 | 
						|
            !Physics.Linecast(
 | 
						|
                transform.position,
 | 
						|
                enemy.transform.position,
 | 
						|
                1 << 8))
 | 
						|
		{
 | 
						|
			rocketFireTime = Time.time;
 | 
						|
			networkView.RPC(
 | 
						|
                "fRl",
 | 
						|
                RPCMode.All,
 | 
						|
                networkView.viewID,
 | 
						|
                Network.time + "",
 | 
						|
                vehicle.ridePos.position +
 | 
						|
                    vehicle.transform.up * -0.1f,
 | 
						|
                enemy.networkView.viewID);
 | 
						|
		}
 | 
						|
 | 
						|
        //Bounds Checking
 | 
						|
		if (vehicle.myRigidbody.position.y < -300f)
 | 
						|
		{
 | 
						|
			vehicle.myRigidbody.velocity = vehicle.myRigidbody.velocity.normalized;
 | 
						|
			vehicle.myRigidbody.isKinematic = true;
 | 
						|
			vehicle.transform.position = World.baseTF.position;
 | 
						|
			vehicle.myRigidbody.isKinematic = false;
 | 
						|
			if ((bool)Game.Messaging)
 | 
						|
			{
 | 
						|
				Game.Messaging.broadcast(name + " fell off the planet");
 | 
						|
			}
 | 
						|
		}
 | 
						|
	}
 | 
						|
}
 |