247 lines
6.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");
}
}
}
public void FixedUpdate()
{
if (
(bool)vehicle.ramoSphere &&
vehicle.zorbBall &&
(vehicle.input.y != 0f || vehicle.input.x != 0f))
{
rigidbody.AddForce(
Vector3.Scale(
new Vector3(1f, 0f, 1f),
Camera.main.transform.TransformDirection(new Vector3(
vehicle.input.x * Mathf.Max(
0f,
Game.Settings.zorbSpeed + Game.Settings.zorbAgility),
0f,
vehicle.input.y * Game.Settings.zorbSpeed))),
ForceMode.Acceleration);
rigidbody.AddTorque(
Camera.main.transform.TransformDirection(new Vector3(
vehicle.input.y,
0f,
vehicle.input.x * -1f)) * Game.Settings.zorbSpeed,
ForceMode.Acceleration);
}
}
}