Files
UltimateFishing/Assets/Scripts/Assembly-CSharp/MegaHitDeform.cs
2026-02-21 16:45:37 +08:00

122 lines
2.5 KiB
C#

using UnityEngine;
[AddComponentMenu("Modifiers/Hit")]
public class MegaHitDeform : MegaModifier
{
public float hitradius = 1f;
public float Hardness = 0.5f;
public float deformlimit = 0.1f;
public float scaleforce = 1000f;
public float maxForce = 1f;
private Vector3[] offsets;
private float msize;
public override string ModName()
{
return "Hit Deform";
}
public override void Modify(MegaModifiers mc)
{
if (offsets != null)
{
for (int i = 0; i < sverts.Length; i++)
{
sverts[i] = verts[i] + offsets[i];
}
}
}
public void Deform(Vector3 point, Vector3 normal, float force)
{
force = Mathf.Min(maxForce, force);
if (!(force > 0.01f))
{
return;
}
float num = force * (msize * (0.1f / Mathf.Max(0.1f, Hardness)));
float num2 = deformlimit;
float num3 = num2 * num2;
Vector3 vector = base.transform.InverseTransformPoint(point);
Vector3 vector2 = base.transform.InverseTransformDirection(normal);
for (int i = 0; i < verts.Length; i++)
{
float sqrMagnitude = (verts[i] + offsets[i] - vector).sqrMagnitude;
if (!(sqrMagnitude <= num))
{
continue;
}
Vector3 vector3 = vector2 * (1f - sqrMagnitude / num) * num;
offsets[i] += vector3;
if (deformlimit > 0f)
{
vector3 = offsets[i];
sqrMagnitude = vector3.sqrMagnitude;
if (sqrMagnitude > num3)
{
offsets[i] = vector3 * (num2 / vector3.magnitude);
}
}
}
}
private void Deform(Collision collision)
{
float num = Mathf.Min(maxForce, collision.impactForceSum.sqrMagnitude / scaleforce);
if (num > 0.01f)
{
ContactPoint[] contacts = collision.contacts;
for (int i = 0; i < contacts.Length; i++)
{
Deform(contacts[i].point, contacts[i].normal, num);
}
}
}
public override bool ModLateUpdate(MegaModContext mc)
{
return Prepare(mc);
}
public override bool Prepare(MegaModContext mc)
{
if (offsets == null || offsets.Length != mc.mod.verts.Length)
{
offsets = new Vector3[mc.mod.verts.Length];
}
msize = MegaUtils.SmallestValue(mc.bbox.Size());
return true;
}
public void Repair(float repair)
{
Repair(repair, Vector3.zero, 0f);
}
public void Repair(float repair, Vector3 point, float radius)
{
point = base.transform.InverseTransformPoint(point);
float num = radius * radius;
for (int i = 0; i < offsets.Length && (!(radius > 0f) || !((point - verts[i]).sqrMagnitude >= num)); i++)
{
offsets[i] *= repair;
}
}
public void OnCollisionEnter(Collision collision)
{
Deform(collision);
}
public void OnCollisionStay(Collision collision)
{
Deform(collision);
}
}