r2mods/ilspy_dump/ror2_csproj/RoR2/TitanRockController.cs

244 lines
6.0 KiB
C#

using System.Runtime.InteropServices;
using RoR2.Projectile;
using UnityEngine;
using UnityEngine.Networking;
namespace RoR2;
public class TitanRockController : NetworkBehaviour
{
[Tooltip("The child transform from which projectiles will be fired.")]
public Transform fireTransform;
[Tooltip("How long it takes to start firing.")]
public float startDelay = 4f;
[Tooltip("Firing interval.")]
public float fireInterval = 1f;
[Tooltip("The prefab to fire as a projectile.")]
public GameObject projectilePrefab;
[Tooltip("The damage coefficient to multiply by the owner's damage stat for the projectile's final damage value.")]
public float damageCoefficient;
[Tooltip("The force of the projectile's damage.")]
public float damageForce;
[SyncVar(hook = "SetOwner")]
private GameObject owner;
private Transform targetTransform;
private Vector3 velocity;
private static readonly Vector3 targetLocalPosition = new Vector3(0f, 12f, -3f);
private float fireTimer;
private InputBankTest ownerInputBank;
private CharacterBody ownerCharacterBody;
private bool isCrit;
private bool foundOwner;
private NetworkInstanceId ___ownerNetId;
public GameObject Networkowner
{
get
{
return owner;
}
[param: In]
set
{
if (NetworkServer.localClientActive && !base.syncVarHookGuard)
{
base.syncVarHookGuard = true;
SetOwner(value);
base.syncVarHookGuard = false;
}
SetSyncVarGameObject(value, ref owner, 1u, ref ___ownerNetId);
}
}
private void Start()
{
if (!NetworkServer.active)
{
SetOwner(owner);
}
else
{
fireTimer = startDelay;
}
}
public void SetOwner(GameObject newOwner)
{
ownerInputBank = null;
ownerCharacterBody = null;
isCrit = false;
Networkowner = newOwner;
if (!owner)
{
return;
}
ownerInputBank = owner.GetComponent<InputBankTest>();
ownerCharacterBody = owner.GetComponent<CharacterBody>();
ModelLocator component = owner.GetComponent<ModelLocator>();
if ((bool)component)
{
Transform modelTransform = component.modelTransform;
if ((bool)modelTransform)
{
ChildLocator component2 = modelTransform.GetComponent<ChildLocator>();
if ((bool)component2)
{
targetTransform = component2.FindChild("Chest");
if ((bool)targetTransform)
{
base.transform.rotation = targetTransform.rotation;
}
}
}
}
base.transform.position = owner.transform.position + Vector3.down * 20f;
if (NetworkServer.active && (bool)ownerCharacterBody)
{
CharacterMaster master = ownerCharacterBody.master;
if ((bool)master)
{
isCrit = Util.CheckRoll(ownerCharacterBody.crit, master);
}
}
}
public void FixedUpdate()
{
if ((bool)targetTransform)
{
foundOwner = true;
base.transform.position = Vector3.SmoothDamp(base.transform.position, targetTransform.TransformPoint(targetLocalPosition), ref velocity, 1f);
base.transform.rotation = targetTransform.rotation;
}
else if (foundOwner)
{
foundOwner = false;
ParticleSystem[] componentsInChildren = GetComponentsInChildren<ParticleSystem>();
foreach (ParticleSystem obj in componentsInChildren)
{
ParticleSystem.MainModule main = obj.main;
main.gravityModifier = 1f;
ParticleSystem.EmissionModule emission = obj.emission;
emission.enabled = false;
ParticleSystem.NoiseModule noise = obj.noise;
noise.enabled = false;
ParticleSystem.LimitVelocityOverLifetimeModule limitVelocityOverLifetime = obj.limitVelocityOverLifetime;
limitVelocityOverLifetime.enabled = false;
}
ParticleSystem.CollisionModule collision = base.transform.Find("Debris").GetComponent<ParticleSystem>().collision;
collision.enabled = true;
Light[] componentsInChildren2 = GetComponentsInChildren<Light>();
for (int i = 0; i < componentsInChildren2.Length; i++)
{
componentsInChildren2[i].enabled = false;
}
Util.PlaySound("Stop_titanboss_shift_loop", base.gameObject);
}
if (NetworkServer.active)
{
FixedUpdateServer();
}
}
[Server]
private void FixedUpdateServer()
{
if (!NetworkServer.active)
{
Debug.LogWarning("[Server] function 'System.Void RoR2.TitanRockController::FixedUpdateServer()' called on client");
return;
}
fireTimer -= Time.fixedDeltaTime;
if (fireTimer <= 0f)
{
Fire();
fireTimer += fireInterval;
}
}
[Server]
private void Fire()
{
if (!NetworkServer.active)
{
Debug.LogWarning("[Server] function 'System.Void RoR2.TitanRockController::Fire()' called on client");
}
else if ((bool)ownerInputBank)
{
Vector3 position = fireTransform.position;
Vector3 forward = ownerInputBank.aimDirection;
if (Util.CharacterRaycast(owner, new Ray(ownerInputBank.aimOrigin, ownerInputBank.aimDirection), out var hitInfo, float.PositiveInfinity, (int)LayerIndex.world.mask | (int)LayerIndex.entityPrecise.mask, QueryTriggerInteraction.UseGlobal))
{
forward = hitInfo.point - position;
}
float num = (ownerCharacterBody ? ownerCharacterBody.damage : 1f);
ProjectileManager.instance.FireProjectile(projectilePrefab, position, Util.QuaternionSafeLookRotation(forward), owner, damageCoefficient * num, damageForce, isCrit);
}
}
private void UNetVersion()
{
}
public override bool OnSerialize(NetworkWriter writer, bool forceAll)
{
if (forceAll)
{
writer.Write(owner);
return true;
}
bool flag = false;
if ((base.syncVarDirtyBits & (true ? 1u : 0u)) != 0)
{
if (!flag)
{
writer.WritePackedUInt32(base.syncVarDirtyBits);
flag = true;
}
writer.Write(owner);
}
if (!flag)
{
writer.WritePackedUInt32(base.syncVarDirtyBits);
}
return flag;
}
public override void OnDeserialize(NetworkReader reader, bool initialState)
{
if (initialState)
{
___ownerNetId = reader.ReadNetworkId();
return;
}
int num = (int)reader.ReadPackedUInt32();
if (((uint)num & (true ? 1u : 0u)) != 0)
{
SetOwner(reader.ReadGameObject());
}
}
public override void PreStartClient()
{
if (!___ownerNetId.IsEmpty())
{
Networkowner = ClientScene.FindLocalObject(___ownerNetId);
}
}
}