2025-10-20 16:57:05 -07:00

224 lines
8.0 KiB
C#

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[Serializable]
public class Tank : MonoBehaviour
{
public Vehicle vehicle;
public GameObject tracks;
public GameObject tracksSimple;
public int tracksPerSide = 3;
public float trackSpacing = 2.5f;
public GameObject superTracks;
public GameObject simpleTracks;
public void InitVehicle(Vehicle veh)
{
vehicle = veh;
List<Material> materialAccents = new List<Material>();
//Build Tracks
GameObject track;
superTracks = new GameObject("Tracks");
superTracks.transform.parent = transform;
for (int i = 0; i < tracksPerSide; i++)
{
//Left Side
track = (GameObject)Instantiate(
tracks,
transform.TransformPoint(new Vector3(
-2,
0,
-(((tracksPerSide - 1) * trackSpacing) / 2) +
i * trackSpacing)),
transform.rotation);
materialAccents.Add(
((MeshRenderer)track.transform
.Find("Detailed/Track")
.GetComponent(typeof(MeshRenderer)))
.material);
materialAccents.Add(
((MeshRenderer)track.transform
.Find("Detailed/Tread")
.GetComponent(typeof(MeshRenderer)))
.material);
materialAccents.Add(
((MeshRenderer)track.transform
.Find("Simple")
.GetComponent(typeof(MeshRenderer)))
.material);
track.transform.parent = superTracks.transform;
//Right Side
track = (GameObject)Instantiate(
tracks,
transform.TransformPoint(new Vector3(
2,
0,
-(((tracksPerSide - 1) * trackSpacing) / 2) +
i * trackSpacing)),
transform.rotation);
materialAccents.Add(
((MeshRenderer)track.transform
.Find("Detailed/Track")
.GetComponent(typeof(MeshRenderer)))
.material);
materialAccents.Add(
((MeshRenderer)track.transform
.Find("Detailed/Tread")
.GetComponent(typeof(MeshRenderer)))
.material);
materialAccents.Add(
((MeshRenderer)track.transform
.Find("Simple")
.GetComponent(typeof(MeshRenderer)))
.material);
track.transform.parent = superTracks.transform;
((TankTrack)track.GetComponent(typeof(TankTrack))).rightSide = true;
}
if (!vehicle.networkView.isMine)
{
simpleTracks = new GameObject();
simpleTracks.transform.parent = transform;
for (int i = 0; i < tracksPerSide; i++)
{
//Left Side
track = (GameObject)Instantiate(
tracks,
transform.TransformPoint(new Vector3(
-2,
0.2f,
-(((tracksPerSide - 1) * trackSpacing) / 2) +
i * trackSpacing)),
transform.rotation);
materialAccents.Add(
((MeshRenderer)track.transform
.Find("Detailed/Track")
.GetComponent(typeof(MeshRenderer)))
.material);
materialAccents.Add(
((MeshRenderer)track.transform
.Find("Detailed/Tread")
.GetComponent(typeof(MeshRenderer)))
.material);
materialAccents.Add(
((MeshRenderer)track.transform
.Find("Simple")
.GetComponent(typeof(MeshRenderer)))
.material);
track.transform.parent = simpleTracks.transform;
//Right Side
track = (GameObject)Instantiate(
tracks,
transform.TransformPoint(new Vector3(
2,
0.2f,
-(((tracksPerSide - 1) * trackSpacing) / 2) +
i * trackSpacing)),
transform.rotation);
materialAccents.Add(
((MeshRenderer)track.transform
.Find("Detailed/Track")
.GetComponent(typeof(MeshRenderer)))
.material);
materialAccents.Add(
((MeshRenderer)track.transform
.Find("Detailed/Tread")
.GetComponent(typeof(MeshRenderer)))
.material);
materialAccents.Add(
((MeshRenderer)track.transform
.Find("Simple")
.GetComponent(typeof(MeshRenderer)))
.material);
track.transform.parent = simpleTracks.transform;
}
}
else
{
TankMe tankMe = (TankMe)this.gameObject.AddComponent(typeof(TankMe));
tankMe.vehicle = vehicle;
}
vehicle.materialAccent = (Material[])materialAccents.ToArray();
if ((bool)World.baseTF)
{ //DRAGONHERE: why we need to do this I don't know, but if we don't, we will hover in mid air on local client instances
transform.position = World.baseTF.position;
}
//DRAGONHERE: VERY STRANGE UNITY BUG that sets localposition to -3 if a tank is already present in world...
transform.localPosition = Vector3.zero;
}
public void Update()
{
if (!vehicle) return;
Vector3 centerOfMass = vehicle.myRigidbody.centerOfMass;
centerOfMass.y = Game.Settings.tankCG;
vehicle.myRigidbody.centerOfMass = centerOfMass;
if (!vehicle.networkView.isMine && (bool)vehicle.vehicleNet)
{
//Enable advanced physics
if (vehicle.vehicleNet.simulatePhysics && simpleTracks.active)
{
vehicle.myRigidbody.useGravity = true; //Gravity is simulated on the authoratative client instance that owns this tank - it just makes the networked instances jittery
simpleTracks.SetActiveRecursively(false);
superTracks.SetActiveRecursively(true);
}
//Disable advanced physics
else if (!vehicle.vehicleNet.simulatePhysics && superTracks.active)
{
vehicle.myRigidbody.useGravity = true; //Gravity is simulated on the authoratative client instance that owns this tank - it just makes the networked instances jittery
simpleTracks.SetActiveRecursively(true);
superTracks.SetActiveRecursively(false);
}
}
}
public void OnLOD(int level)
{
if ((bool)superTracks)
{
foreach(Transform track in superTracks.transform)
{
((MeshRenderer)track
.Find("Detailed/Tread")
.gameObject.GetComponent(typeof(MeshRenderer))
).enabled = (level == 0);
((MeshRenderer)track
.Find("Detailed/Track")
.gameObject.GetComponent(typeof(MeshRenderer))
).enabled = (level == 0);
((MeshRenderer)track
.Find("Simple")
.gameObject.GetComponent(typeof(MeshRenderer))
).enabled = (level != 0);
}
}
if ((bool)simpleTracks)
{
foreach (Transform track in simpleTracks.transform)
{
((MeshRenderer)track
.Find("Detailed/Tread")
.gameObject.GetComponent(typeof(MeshRenderer))
).enabled = (level == 0);
((MeshRenderer)track
.Find("Detailed/Track")
.gameObject.GetComponent(typeof(MeshRenderer))
).enabled = (level == 0);
((MeshRenderer)track
.Find("Simple")
.gameObject.GetComponent(typeof(MeshRenderer))
).enabled = (level != 0);
}
}
}
}