mirror of
https://github.com/misternebula/quantum-space-buddies.git
synced 2025-02-21 09:39:56 +00:00
implement method nebula described
This commit is contained in:
parent
8ce1f706f8
commit
bc40e74d3b
@ -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";
|
||||
}
|
||||
}
|
||||
|
@ -139,6 +139,7 @@
|
||||
|
||||
MeteorPreLaunch,
|
||||
MeteorLaunch,
|
||||
MeteorResync
|
||||
FragmentDamage,
|
||||
FragmentResync
|
||||
}
|
||||
}
|
||||
|
@ -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(),
|
||||
|
38
QSB/MeteorSync/Events/FragmentDamageEvent.cs
Normal file
38
QSB/MeteorSync/Events/FragmentDamageEvent.cs
Normal 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);
|
||||
}
|
||||
}
|
||||
}
|
22
QSB/MeteorSync/Events/FragmentDamageMessage.cs
Normal file
22
QSB/MeteorSync/Events/FragmentDamageMessage.cs
Normal 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);
|
||||
}
|
||||
}
|
||||
}
|
92
QSB/MeteorSync/Events/FragmentResyncEvent.cs
Normal file
92
QSB/MeteorSync/Events/FragmentResyncEvent.cs
Normal 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);
|
||||
}
|
||||
}
|
41
QSB/MeteorSync/Events/FragmentResyncMessage.cs
Normal file
41
QSB/MeteorSync/Events/FragmentResyncMessage.cs
Normal 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -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");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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}");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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}");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -30,8 +30,5 @@ namespace QSB.MeteorSync.WorldObjects
|
||||
|
||||
MeteorManager.MeteorsReady = false;
|
||||
}
|
||||
|
||||
|
||||
public float Damage;
|
||||
}
|
||||
}
|
||||
|
@ -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)
|
||||
|
@ -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));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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" />
|
||||
|
Loading…
x
Reference in New Issue
Block a user