implement method nebula described

This commit is contained in:
JohnCorby 2021-11-13 20:41:46 -08:00
parent 8ce1f706f8
commit bc40e74d3b
18 changed files with 228 additions and 369 deletions

View File

@ -95,6 +95,7 @@
public static string QSBAnglerChangeState = "QSBAnglerChangeState";
public static string QSBMeteorPreLaunch = "QSBMeteorPreLaunch";
public static string QSBMeteorLaunch = "QSBMeteorLaunch";
public static string QSBMeteorResync = "QSBMeteorResync";
public static string QSBFragmentDamage = "QSBFragmentDamage";
public static string QSBFragmentResync = "QSBFragmentResync";
}
}

View File

@ -139,6 +139,7 @@
MeteorPreLaunch,
MeteorLaunch,
MeteorResync
FragmentDamage,
FragmentResync
}
}

View File

@ -96,7 +96,8 @@ namespace QSB.Events
new AnglerChangeStateEvent(),
new MeteorPreLaunchEvent(),
new MeteorLaunchEvent(),
new MeteorResyncEvent(),
new FragmentDamageEvent(),
new FragmentResyncEvent(),
// Conversation/dialogue/exploration
new ConversationEvent(),
new ConversationStartEndEvent(),

View File

@ -0,0 +1,38 @@
using QSB.Events;
using QSB.MeteorSync.WorldObjects;
using QSB.WorldSync;
using EventType = QSB.Events.EventType;
namespace QSB.MeteorSync.Events
{
public class FragmentDamageEvent : QSBEvent<FragmentDamageMessage>
{
public override EventType Type => EventType.FragmentDamage;
public override void SetupListener()
=> GlobalMessenger<QSBFragment, float>.AddListener(EventNames.QSBFragmentDamage, Handler);
public override void CloseListener()
=> GlobalMessenger<QSBFragment, float>.RemoveListener(EventNames.QSBFragmentDamage, Handler);
private void Handler(QSBFragment qsbFragment, float damage) =>
SendEvent(CreateMessage(qsbFragment, damage));
private FragmentDamageMessage CreateMessage(QSBFragment qsbFragment, float damage) => new FragmentDamageMessage
{
ObjectId = qsbFragment.ObjectId,
Damage = damage
};
public override void OnReceiveRemote(bool isHost, FragmentDamageMessage message)
{
if (!QSBCore.WorldObjectsReady)
{
return;
}
var qsbFragment = QSBWorldSync.GetWorldFromId<QSBFragment>(message.ObjectId);
qsbFragment.AddDamage(message.Damage);
}
}
}

View File

@ -0,0 +1,22 @@
using QSB.WorldSync.Events;
using QuantumUNET.Transport;
namespace QSB.MeteorSync.Events
{
public class FragmentDamageMessage : WorldObjectMessage
{
public float Damage;
public override void Deserialize(QNetworkReader reader)
{
base.Deserialize(reader);
Damage = reader.ReadSingle();
}
public override void Serialize(QNetworkWriter writer)
{
base.Serialize(writer);
writer.Write(Damage);
}
}
}

View File

@ -0,0 +1,92 @@
using QSB.Events;
using QSB.MeteorSync.WorldObjects;
using QSB.Utility;
using QSB.WorldSync;
using UnityEngine;
using EventType = QSB.Events.EventType;
namespace QSB.MeteorSync.Events
{
/// called when we request a resync on client join
public class FragmentResyncEvent : QSBEvent<FragmentResyncMessage>
{
public override EventType Type => EventType.FragmentResync;
public override void SetupListener()
=> GlobalMessenger<QSBFragment>.AddListener(EventNames.QSBFragmentResync, Handler);
public override void CloseListener()
=> GlobalMessenger<QSBFragment>.RemoveListener(EventNames.QSBFragmentResync, Handler);
private void Handler(QSBFragment qsbFragment) => SendEvent(CreateMessage(qsbFragment));
private FragmentResyncMessage CreateMessage(QSBFragment qsbFragment)
{
return new FragmentResyncMessage();
var msg = new FragmentResyncMessage
{
ObjectId = qsbFragment.ObjectId,
Integrity = qsbFragment.AttachedObject.GetIntegrity()
};
if (msg.Integrity <= 0)
{
var refBody = Locator._brittleHollow.GetOWRigidbody();
var body = qsbFragment.AttachedObject.GetAttachedOWRigidbody();
msg.Pos = refBody.transform.InverseTransformPoint(body.transform.position);
msg.Rot = refBody.transform.InverseTransformRotation(body.transform.rotation);
msg.Vel = GetRelativeVelocity(body, refBody);
msg.AngVel = body.GetRelativeAngularVelocity(refBody);
}
return msg;
}
public override void OnReceiveRemote(bool isHost, FragmentResyncMessage msg)
{
return;
if (!MeteorManager.MeteorsReady)
{
return;
}
var qsbFragment = QSBWorldSync.GetWorldFromId<QSBFragment>(msg.ObjectId);
qsbFragment.AttachedObject._integrity = msg.Integrity;
if (msg.Integrity <= 0)
{
var refBody = Locator._brittleHollow.GetOWRigidbody();
var body = qsbFragment.AttachedObject.GetAttachedOWRigidbody();
var targetPos = refBody.transform.TransformPoint(msg.Pos);
var targetRot = refBody.transform.TransformRotation(msg.Rot);
var targetVel = refBody.GetPointVelocity(targetPos) + msg.Vel;
var targetAngVel = refBody.GetAngularVelocity() + msg.AngVel;
body.MoveToPosition(targetPos);
body.MoveToRotation(targetRot);
SetVelocity(body, targetVel);
body.SetAngularVelocity(targetAngVel);
}
}
// code yoink from transform sync lol
private static void SetVelocity(OWRigidbody rigidbody, Vector3 relativeVelocity)
{
var isRunningKinematic = rigidbody.RunningKinematicSimulation();
var currentVelocity = rigidbody._currentVelocity;
if (isRunningKinematic)
{
rigidbody._kinematicRigidbody.velocity = relativeVelocity + Locator.GetCenterOfTheUniverse().GetStaticFrameVelocity_Internal();
}
else
{
rigidbody._rigidbody.velocity = relativeVelocity + Locator.GetCenterOfTheUniverse().GetStaticFrameVelocity_Internal();
}
rigidbody._lastVelocity = currentVelocity;
rigidbody._currentVelocity = relativeVelocity;
}
private static Vector3 GetRelativeVelocity(OWRigidbody body, OWRigidbody refBody)
=> body.GetVelocity() - refBody.GetPointVelocity(body.transform.position);
}
}

View File

@ -0,0 +1,41 @@
using QSB.WorldSync.Events;
using QuantumUNET.Transport;
using UnityEngine;
namespace QSB.MeteorSync.Events
{
public class FragmentResyncMessage : WorldObjectMessage
{
public float Integrity;
public Vector3 Pos;
public Quaternion Rot;
public Vector3 Vel;
public Vector3 AngVel;
public override void Deserialize(QNetworkReader reader)
{
base.Deserialize(reader);
Integrity = reader.ReadSingle();
if (Integrity <= 0)
{
Pos = reader.ReadVector3();
Rot = reader.ReadQuaternion();
Vel = reader.ReadVector3();
AngVel = reader.ReadVector3();
}
}
public override void Serialize(QNetworkWriter writer)
{
base.Serialize(writer);
writer.Write(Integrity);
if (Integrity <= 0)
{
writer.Write(Pos);
writer.Write(Rot);
writer.Write(Vel);
writer.Write(AngVel);
}
}
}
}

View File

@ -23,7 +23,6 @@ namespace QSB.MeteorSync.Events
ObjectId = qsbMeteorLauncher.ObjectId,
MeteorId = qsbMeteorLauncher.MeteorId,
LaunchSpeed = qsbMeteorLauncher.LaunchSpeed,
Damage = qsbMeteorLauncher.Damage
};
public override void OnReceiveRemote(bool isHost, MeteorLaunchMessage message)
@ -34,7 +33,7 @@ namespace QSB.MeteorSync.Events
}
var qsbMeteorLauncher = QSBWorldSync.GetWorldFromId<QSBMeteorLauncher>(message.ObjectId);
qsbMeteorLauncher.LaunchMeteor(message.MeteorId, message.LaunchSpeed, message.Damage);
qsbMeteorLauncher.LaunchMeteor(message.MeteorId, message.LaunchSpeed);
}
}
}

View File

@ -7,14 +7,12 @@ namespace QSB.MeteorSync.Events
{
public int MeteorId;
public float LaunchSpeed;
public float Damage;
public override void Deserialize(QNetworkReader reader)
{
base.Deserialize(reader);
MeteorId = reader.ReadInt32();
LaunchSpeed = reader.ReadSingle();
Damage = reader.ReadSingle();
}
public override void Serialize(QNetworkWriter writer)
@ -22,7 +20,6 @@ namespace QSB.MeteorSync.Events
base.Serialize(writer);
writer.Write(MeteorId);
writer.Write(LaunchSpeed);
writer.Write(Damage);
}
}
}

View File

@ -1,148 +0,0 @@
using System.Linq;
using QSB.Events;
using QSB.MeteorSync.WorldObjects;
using QSB.Utility;
using QSB.WorldSync;
using UnityEngine;
using EventType = QSB.Events.EventType;
namespace QSB.MeteorSync.Events
{
/// called when we request a resync on client join
public class MeteorResyncEvent : QSBEvent<MeteorResyncMessage>
{
public override EventType Type => EventType.MeteorResync;
public override void SetupListener()
=> GlobalMessenger.AddListener(EventNames.QSBMeteorResync, Handler);
public override void CloseListener()
=> GlobalMessenger.RemoveListener(EventNames.QSBMeteorResync, Handler);
private void Handler() => SendEvent(CreateMessage());
private MeteorResyncMessage CreateMessage()
{
var qsbMeteors = QSBWorldSync.GetWorldObjects<QSBMeteor>().ToArray();
var fragments = QSBWorldSync.GetUnityObjects<FragmentIntegrity>().ToArray();
var msg = new MeteorResyncMessage
{
Suspended = new bool[qsbMeteors.Length],
Damage = new float[qsbMeteors.Length],
MeteorTransforms = new MeteorResyncMessage.TransformMessage[qsbMeteors.Length],
Integrity = new float[fragments.Length],
FragmentTransforms = new MeteorResyncMessage.TransformMessage[fragments.Length]
};
// var refBody = Locator._brittleHollow.GetOWRigidbody();
// for (var i = 0; i < qsbMeteors.Length; i++)
// {
// msg.Suspended[i] = qsbMeteors[i].AttachedObject.isSuspended;
// msg.Damage[i] = qsbMeteors[i].Damage;
// var body = qsbMeteors[i].AttachedObject.owRigidbody;
// msg.MeteorTransforms[i] = new MeteorResyncMessage.TransformMessage
// {
// pos = refBody.transform.InverseTransformPoint(body.transform.position),
// rot = refBody.transform.InverseTransformRotation(body.transform.rotation),
// vel = GetRelativeVelocity(body, refBody),
// angVel = body.GetRelativeAngularVelocity(refBody)
// };
// }
//
// for (var i = 0; i < fragments.Length; i++)
// {
// msg.Integrity[i] = fragments[i].GetIntegrity();
// var body = fragments[i].GetAttachedOWRigidbody();
// msg.FragmentTransforms[i] = new MeteorResyncMessage.TransformMessage
// {
// pos = refBody.transform.InverseTransformPoint(body.transform.position),
// rot = refBody.transform.InverseTransformRotation(body.transform.rotation),
// vel = GetRelativeVelocity(body, refBody),
// angVel = body.GetRelativeAngularVelocity(refBody)
// };
// }
return msg;
}
public override void OnReceiveRemote(bool isHost, MeteorResyncMessage msg)
{
if (!MeteorManager.MeteorsReady)
{
return;
}
var qsbMeteors = QSBWorldSync.GetWorldObjects<QSBMeteor>().ToArray();
var fragments = QSBWorldSync.GetUnityObjects<FragmentIntegrity>().ToArray();
// var refBody = Locator._brittleHollow.GetOWRigidbody();
// for (var i = 0; i < qsbMeteors.Length; i++)
// {
// if (!msg.Suspended[i] && qsbMeteors[i].AttachedObject.isSuspended)
// {
// // todo
// DebugLog.DebugWrite($"{qsbMeteors[i].LogName} - TODO unsuspend");
// }
// else if (msg.Suspended[i] && !qsbMeteors[i].AttachedObject.isSuspended)
// {
// // todo
// DebugLog.DebugWrite($"{qsbMeteors[i].LogName} - TODO suspend");
// }
//
// qsbMeteors[i].Damage = msg.Damage[i];
// var body = qsbMeteors[i].AttachedObject.owRigidbody;
// var targetPos = refBody.transform.TransformPoint(msg.MeteorTransforms[i].pos);
// var targetRot = refBody.transform.TransformRotation(msg.MeteorTransforms[i].rot);
// var targetVel = refBody.GetPointVelocity(targetPos) + msg.MeteorTransforms[i].vel;
// var targetAngVel = refBody.GetAngularVelocity() + msg.MeteorTransforms[i].angVel;
// body.MoveToPosition(targetPos);
// body.MoveToRotation(targetRot);
// SetVelocity(body, targetVel);
// body.SetAngularVelocity(targetAngVel);
// }
//
// for (var i = 0; i < fragments.Length; i++)
// {
// fragments[i]._integrity = 0;
// fragments[i].AddDamage(fragments[i]._origIntegrity - msg.Integrity[i]);
//
// var body = fragments[i].GetAttachedOWRigidbody();
// var targetPos = refBody.transform.TransformPoint(msg.FragmentTransforms[i].pos);
// var targetRot = refBody.transform.TransformRotation(msg.FragmentTransforms[i].rot);
// var targetVel = refBody.GetPointVelocity(targetPos) + msg.FragmentTransforms[i].vel;
// var targetAngVel = refBody.GetAngularVelocity() + msg.FragmentTransforms[i].angVel;
// body.MoveToPosition(targetPos);
// body.MoveToRotation(targetRot);
// SetVelocity(body, targetVel);
// body.SetAngularVelocity(targetAngVel);
// }
DebugLog.DebugWrite($"METEOR RESYNC REQUESTED - synced {qsbMeteors.Length} meteors and {fragments.Length} fragments");
}
// code yoink from transform sync lol
private static void SetVelocity(OWRigidbody rigidbody, Vector3 relativeVelocity)
{
var isRunningKinematic = rigidbody.RunningKinematicSimulation();
var currentVelocity = rigidbody._currentVelocity;
if (isRunningKinematic)
{
rigidbody._kinematicRigidbody.velocity = relativeVelocity + Locator.GetCenterOfTheUniverse().GetStaticFrameVelocity_Internal();
}
else
{
rigidbody._rigidbody.velocity = relativeVelocity + Locator.GetCenterOfTheUniverse().GetStaticFrameVelocity_Internal();
}
rigidbody._lastVelocity = currentVelocity;
rigidbody._currentVelocity = relativeVelocity;
}
private static Vector3 GetRelativeVelocity(OWRigidbody body, OWRigidbody refBody)
=> body.GetVelocity() - refBody.GetPointVelocity(body.transform.position);
}
}

View File

@ -1,109 +0,0 @@
using QSB.Messaging;
using QuantumUNET.Messages;
using QuantumUNET.Transport;
using UnityEngine;
namespace QSB.MeteorSync.Events
{
/// this will be the best and worst thing you've seen outta me :D
public class MeteorResyncMessage : PlayerMessage
{
public bool[] Suspended;
public float[] Damage;
public TransformMessage[] MeteorTransforms;
public float[] Integrity;
public TransformMessage[] FragmentTransforms;
public override void Deserialize(QNetworkReader reader)
{
base.Deserialize(reader);
// Suspended = new bool[reader.ReadInt32()];
// for (var i = 0; i < Suspended.Length; i++)
// {
// Suspended[i] = reader.ReadBoolean();
// }
// Damage = new float[reader.ReadInt32()];
// for (var i = 0; i < Damage.Length; i++)
// {
// Damage[i] = reader.ReadSingle();
// }
// MeteorTransforms = new TransformMessage[reader.ReadInt32()];
// for (var i = 0; i < MeteorTransforms.Length; i++)
// {
// MeteorTransforms[i] = reader.ReadMessage<TransformMessage>();
// }
//
// Integrity = new float[reader.ReadInt32()];
// for (var i = 0; i < Integrity.Length; i++)
// {
// Integrity[i] = reader.ReadSingle();
// }
// FragmentTransforms = new TransformMessage[reader.ReadInt32()];
// for (var i = 0; i < FragmentTransforms.Length; i++)
// {
// FragmentTransforms[i] = reader.ReadMessage<TransformMessage>();
// }
}
public override void Serialize(QNetworkWriter writer)
{
base.Serialize(writer);
// writer.Write(Suspended.Length);
// foreach (var x in Suspended)
// {
// writer.Write(x);
// }
// writer.Write(Damage.Length);
// foreach (var x in Damage)
// {
// writer.Write(x);
// }
// writer.Write(MeteorTransforms.Length);
// foreach (var x in MeteorTransforms)
// {
// writer.Write(x);
// }
//
// writer.Write(Integrity.Length);
// foreach (var x in Integrity)
// {
// writer.Write(x);
// }
// writer.Write(FragmentTransforms.Length);
// foreach (var x in FragmentTransforms)
// {
// writer.Write(x);
// }
}
public class TransformMessage : QMessageBase
{
public Vector3 pos;
public Quaternion rot;
public Vector3 vel;
public Vector3 angVel;
public override void Deserialize(QNetworkReader reader)
{
base.Deserialize(reader);
pos = reader.ReadVector3();
rot = reader.ReadQuaternion();
vel = reader.ReadVector3();
angVel = reader.ReadVector3();
}
public override void Serialize(QNetworkWriter writer)
{
base.Serialize(writer);
writer.Write(pos);
writer.Write(rot);
writer.Write(vel);
writer.Write(angVel);
}
}
}
}

View File

@ -94,8 +94,6 @@ namespace QSB.MeteorSync.Patches
}
if (meteorController != null)
{
qsbMeteor.Damage = qsbMeteorLauncher.Damage;
var linearVelocity = __instance._parentBody.GetPointVelocity(__instance.transform.position) + __instance.transform.TransformDirection(__instance._launchDirection) * qsbMeteorLauncher.LaunchSpeed;
var angularVelocity = __instance.transform.forward * 2f;
meteorController.Launch(null, __instance.transform.position, __instance.transform.rotation, linearVelocity, angularVelocity);
@ -105,7 +103,7 @@ namespace QSB.MeteorSync.Patches
__instance._launchSource.PlayOneShot(AudioType.BH_MeteorLaunch);
}
DebugLog.DebugWrite($"{qsbMeteorLauncher.LogName} - launch {qsbMeteor.LogName} {qsbMeteorLauncher.LaunchSpeed} {qsbMeteor.Damage}");
DebugLog.DebugWrite($"{qsbMeteorLauncher.LogName} - launch {qsbMeteor.LogName} {qsbMeteorLauncher.LaunchSpeed}");
}
else
{
@ -121,22 +119,8 @@ namespace QSB.MeteorSync.Patches
public static bool Impact(MeteorController __instance,
GameObject hitObject, Vector3 impactPoint, Vector3 impactVel)
{
var qsbMeteor = QSBWorldSync.GetWorldFromUnity<QSBMeteor>(__instance);
// todo send back when a player (or probe???) impacts
var componentInParent = hitObject.GetComponentInParent<FragmentIntegrity>();
var damage = qsbMeteor.Damage;
if (componentInParent != null)
{
if (!componentInParent.GetIgnoreMeteorDamage())
{
componentInParent.AddDamage(damage);
}
else if (componentInParent.GetParentFragment() != null && !componentInParent.GetParentFragment().GetIgnoreMeteorDamage())
{
componentInParent.GetParentFragment().AddDamage(damage);
}
}
MeteorImpactMapper.RecordImpact(impactPoint, componentInParent);
__instance._intactRenderer.enabled = false;
__instance._impactLight.enabled = true;
__instance._impactLight.intensity = __instance._impactLightCurve.Evaluate(0f);
@ -159,22 +143,7 @@ namespace QSB.MeteorSync.Patches
__instance._hasImpacted = true;
__instance._impactTime = Time.time;
DebugLog.DebugWrite($"{qsbMeteor.LogName} - impact! {hitObject.name} {impactPoint} {impactVel} {damage}");
return false;
}
[HarmonyPostfix]
[HarmonyPatch(typeof(MeteorController), nameof(MeteorController.Suspend), new Type[0])]
public static void Suspend(MeteorController __instance)
{
var qsbMeteor = QSBWorldSync.GetWorldFromUnity<QSBMeteor>(__instance);
if (qsbMeteor == null)
{
return;
}
DebugLog.DebugWrite($"{qsbMeteor.LogName} - suspended");
}
}
}

View File

@ -61,6 +61,7 @@ namespace QSB.MeteorSync.Patches
var qsbMeteorLauncher = QSBWorldSync.GetWorldFromUnity<QSBMeteorLauncher>(__instance);
QSBEventManager.FireEvent(EventNames.QSBMeteorPreLaunch, qsbMeteorLauncher);
DebugLog.DebugWrite($"{qsbMeteorLauncher.LogName} - prelaunch");
}
if (Time.time > __instance._lastLaunchTime + __instance._launchDelay + 2.3f)
{
@ -120,8 +121,6 @@ namespace QSB.MeteorSync.Patches
qsbMeteorLauncher.MeteorId = qsbMeteor.ObjectId;
qsbMeteorLauncher.LaunchSpeed = Random.Range(__instance._minLaunchSpeed, __instance._maxLaunchSpeed);
qsbMeteorLauncher.Damage = Random.Range(meteorController._minDamage, meteorController._maxDamage);
qsbMeteor.Damage = qsbMeteorLauncher.Damage;
var linearVelocity = __instance._parentBody.GetPointVelocity(__instance.transform.position) + __instance.transform.TransformDirection(__instance._launchDirection) * qsbMeteorLauncher.LaunchSpeed;
var angularVelocity = __instance.transform.forward * 2f;
@ -133,72 +132,21 @@ namespace QSB.MeteorSync.Patches
}
QSBEventManager.FireEvent(EventNames.QSBMeteorLaunch, qsbMeteorLauncher);
DebugLog.DebugWrite($"{qsbMeteorLauncher.LogName} - launch {qsbMeteor.LogName} {qsbMeteorLauncher.LaunchSpeed} {qsbMeteor.Damage}");
DebugLog.DebugWrite($"{qsbMeteorLauncher.LogName} - launch {qsbMeteor.LogName} {qsbMeteorLauncher.LaunchSpeed}");
}
return false;
}
[HarmonyPrefix]
[HarmonyPatch(typeof(MeteorController), nameof(MeteorController.Impact))]
public static bool Impact(MeteorController __instance,
GameObject hitObject, Vector3 impactPoint, Vector3 impactVel)
{
var qsbMeteor = QSBWorldSync.GetWorldFromUnity<QSBMeteor>(__instance);
var componentInParent = hitObject.GetComponentInParent<FragmentIntegrity>();
var damage = qsbMeteor.Damage;
if (componentInParent != null)
{
if (!componentInParent.GetIgnoreMeteorDamage())
{
componentInParent.AddDamage(damage);
}
else if (componentInParent.GetParentFragment() != null && !componentInParent.GetParentFragment().GetIgnoreMeteorDamage())
{
componentInParent.GetParentFragment().AddDamage(damage);
}
}
MeteorImpactMapper.RecordImpact(impactPoint, componentInParent);
__instance._intactRenderer.enabled = false;
__instance._impactLight.enabled = true;
__instance._impactLight.intensity = __instance._impactLightCurve.Evaluate(0f);
var rotation = Quaternion.LookRotation(impactVel);
foreach (var particleSystem in __instance._impactParticles)
{
particleSystem.transform.rotation = rotation;
particleSystem.Play();
}
__instance._impactSource.PlayOneShot(AudioType.BH_MeteorImpact);
foreach (var owCollider in __instance._owColliders)
{
owCollider.SetActivation(false);
}
__instance._owRigidbody.MakeKinematic();
__instance.transform.SetParent(hitObject.GetAttachedOWRigidbody().transform);
FragmentSurfaceProxy.UntrackMeteor(__instance);
FragmentCollisionProxy.UntrackMeteor(__instance);
__instance._ignoringCollisions = false;
__instance._hasImpacted = true;
__instance._impactTime = Time.time;
DebugLog.DebugWrite($"{qsbMeteor.LogName} - impact! {hitObject.name} {impactPoint} {impactVel} {damage}");
return false;
}
[HarmonyPostfix]
[HarmonyPatch(typeof(MeteorController), nameof(MeteorController.Suspend), new Type[0])]
public static void Suspend(MeteorController __instance)
[HarmonyPatch(typeof(FragmentIntegrity), nameof(FragmentIntegrity.AddDamage))]
public static void AddDamage(FragmentIntegrity __instance,
float damage)
{
var qsbMeteor = QSBWorldSync.GetWorldFromUnity<QSBMeteor>(__instance);
if (qsbMeteor == null)
{
return;
}
DebugLog.DebugWrite($"{qsbMeteor.LogName} - suspended");
var qsbFragment = QSBWorldSync.GetWorldFromUnity<QSBFragment>(__instance);
QSBEventManager.FireEvent(EventNames.QSBFragmentDamage, qsbFragment, damage);
DebugLog.DebugWrite($"{qsbFragment.LogName} - damage {damage}");
}
}
}

View File

@ -1,4 +1,5 @@
using QSB.WorldSync;
using QSB.Utility;
using QSB.WorldSync;
namespace QSB.MeteorSync.WorldObjects
{
@ -9,5 +10,11 @@ namespace QSB.MeteorSync.WorldObjects
ObjectId = id;
AttachedObject = attachedObject;
}
public void AddDamage(float damage)
{
AttachedObject.AddDamage(damage);
DebugLog.DebugWrite($"{LogName} - damage {damage}");
}
}
}

View File

@ -30,8 +30,5 @@ namespace QSB.MeteorSync.WorldObjects
MeteorManager.MeteorsReady = false;
}
public float Damage;
}
}

View File

@ -1,4 +1,5 @@
using QSB.WorldSync;
using QSB.Utility;
using QSB.WorldSync;
namespace QSB.MeteorSync.WorldObjects
{
@ -13,7 +14,6 @@ namespace QSB.MeteorSync.WorldObjects
public int MeteorId;
public float LaunchSpeed;
public float Damage;
public void PreLaunchMeteor()
{
@ -21,13 +21,13 @@ namespace QSB.MeteorSync.WorldObjects
{
particleSystem.Play();
}
DebugLog.DebugWrite($"{LogName} - prelaunch");
}
public void LaunchMeteor(int meteorId, float launchSpeed, float damage)
public void LaunchMeteor(int meteorId, float launchSpeed)
{
MeteorId = meteorId;
LaunchSpeed = launchSpeed;
Damage = damage;
AttachedObject.LaunchMeteor();
foreach (var particleSystem in AttachedObject._launchParticles)

View File

@ -81,7 +81,8 @@ namespace QSB.Player.Events
QSBWorldSync.GetWorldObjects<QSBCampfire>().ForEach(campfire
=> QSBEventManager.FireEvent(EventNames.QSBCampfireState, campfire.ObjectId, campfire.GetState()));
QSBEventManager.FireEvent(EventNames.QSBMeteorResync);
QSBWorldSync.GetWorldObjects<QSBFragment>().ForEach(fragment
=> QSBEventManager.FireEvent(EventNames.QSBFragmentResync, fragment));
}
}
}

View File

@ -124,11 +124,13 @@
<Compile Include="Menus\IMenuAPI.cs" />
<Compile Include="Menus\MenuManager.cs" />
<Compile Include="Messaging\BoolMessage.cs" />
<Compile Include="MeteorSync\Events\FragmentDamageEvent.cs" />
<Compile Include="MeteorSync\Events\FragmentDamageMessage.cs" />
<Compile Include="MeteorSync\Events\MeteorLaunchEvent.cs" />
<Compile Include="MeteorSync\Events\MeteorLaunchMessage.cs" />
<Compile Include="MeteorSync\Events\MeteorPreLaunchEvent.cs" />
<Compile Include="MeteorSync\Events\MeteorResyncEvent.cs" />
<Compile Include="MeteorSync\Events\MeteorResyncMessage.cs" />
<Compile Include="MeteorSync\Events\FragmentResyncEvent.cs" />
<Compile Include="MeteorSync\Events\FragmentResyncMessage.cs" />
<Compile Include="MeteorSync\MeteorManager.cs" />
<Compile Include="MeteorSync\Patches\MeteorClientPatches.cs" />
<Compile Include="MeteorSync\Patches\MeteorServerPatches.cs" />