just sync prelaunch/launch, stop worrying about impact and collisions for now

This commit is contained in:
JohnCorby 2021-11-13 00:09:41 -08:00
parent 4e4bad6885
commit 5f4368c1e7
14 changed files with 48 additions and 171 deletions

View File

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

View File

@ -139,7 +139,6 @@
MeteorPreLaunch,
MeteorLaunch,
MeteorImpact,
MeteorResync
}
}

View File

@ -96,7 +96,6 @@ namespace QSB.Events
new AnglerChangeStateEvent(),
new MeteorPreLaunchEvent(),
new MeteorLaunchEvent(),
new MeteorImpactEvent(),
new MeteorResyncEvent(),
// Conversation/dialogue/exploration
new ConversationEvent(),

View File

@ -1,41 +0,0 @@
using QSB.Events;
using QSB.MeteorSync.WorldObjects;
using QSB.Utility;
using QSB.WorldSync;
using UnityEngine;
using EventType = QSB.Events.EventType;
namespace QSB.MeteorSync.Events
{
public class MeteorImpactEvent : QSBEvent<MeteorImpactMessage>
{
public override EventType Type => EventType.MeteorImpact;
public override void SetupListener()
=> GlobalMessenger<int, Vector3, Quaternion, float>.AddListener(EventNames.QSBMeteorImpact, Handler);
public override void CloseListener()
=> GlobalMessenger<int, Vector3, Quaternion, float>.RemoveListener(EventNames.QSBMeteorImpact, Handler);
private void Handler(int id, Vector3 pos, Quaternion rot, float damage) => SendEvent(CreateMessage(id, pos, rot, damage));
private MeteorImpactMessage CreateMessage(int id, Vector3 pos, Quaternion rot, float damage) => new MeteorImpactMessage
{
ObjectId = id,
Pos = pos,
Rot = rot,
Damage = damage
};
public override void OnReceiveRemote(bool isHost, MeteorImpactMessage message)
{
if (!MeteorManager.MeteorsReady)
{
return;
}
var qsbMeteor = QSBWorldSync.GetWorldFromId<QSBMeteor>(message.ObjectId);
qsbMeteor.Impact(message.Pos, message.Rot, message.Damage);
}
}
}

View File

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

View File

@ -11,19 +11,20 @@ namespace QSB.MeteorSync.Events
public override EventType Type => EventType.MeteorLaunch;
public override void SetupListener()
=> GlobalMessenger<int, int, float>.AddListener(EventNames.QSBMeteorLaunch, Handler);
=> GlobalMessenger<QSBMeteorLauncher>.AddListener(EventNames.QSBMeteorLaunch, Handler);
public override void CloseListener()
=> GlobalMessenger<int, int, float>.RemoveListener(EventNames.QSBMeteorLaunch, Handler);
=> GlobalMessenger<QSBMeteorLauncher>.RemoveListener(EventNames.QSBMeteorLaunch, Handler);
private void Handler(int id, int meteorId, float launchSpeed) =>
SendEvent(CreateMessage(id, meteorId, launchSpeed));
private void Handler(QSBMeteorLauncher qsbMeteorLauncher) =>
SendEvent(CreateMessage(qsbMeteorLauncher));
private MeteorLaunchMessage CreateMessage(int id, int meteorId, float launchSpeed) => new MeteorLaunchMessage
private MeteorLaunchMessage CreateMessage(QSBMeteorLauncher qsbMeteorLauncher) => new MeteorLaunchMessage
{
ObjectId = id,
MeteorId = meteorId,
LaunchSpeed = launchSpeed
ObjectId = qsbMeteorLauncher.ObjectId,
MeteorId = qsbMeteorLauncher.MeteorId,
LaunchSpeed = qsbMeteorLauncher.LaunchSpeed,
Damage = qsbMeteorLauncher.Damage
};
public override void OnReceiveRemote(bool isHost, MeteorLaunchMessage message)
@ -34,7 +35,7 @@ namespace QSB.MeteorSync.Events
}
var qsbMeteorLauncher = QSBWorldSync.GetWorldFromId<QSBMeteorLauncher>(message.ObjectId);
qsbMeteorLauncher.LaunchMeteor(message.MeteorId, message.LaunchSpeed);
qsbMeteorLauncher.LaunchMeteor(message.MeteorId, message.LaunchSpeed, message.Damage);
}
}
}

View File

@ -7,12 +7,14 @@ 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)
@ -20,6 +22,7 @@ namespace QSB.MeteorSync.Events
base.Serialize(writer);
writer.Write(MeteorId);
writer.Write(LaunchSpeed);
writer.Write(Damage);
}
}
}

View File

@ -11,16 +11,16 @@ namespace QSB.MeteorSync.Events
public override EventType Type => EventType.MeteorPreLaunch;
public override void SetupListener()
=> GlobalMessenger<int>.AddListener(EventNames.QSBMeteorPreLaunch, Handler);
=> GlobalMessenger<QSBMeteorLauncher>.AddListener(EventNames.QSBMeteorPreLaunch, Handler);
public override void CloseListener()
=> GlobalMessenger<int>.RemoveListener(EventNames.QSBMeteorPreLaunch, Handler);
=> GlobalMessenger<QSBMeteorLauncher>.RemoveListener(EventNames.QSBMeteorPreLaunch, Handler);
private void Handler(int id) => SendEvent(CreateMessage(id));
private void Handler(QSBMeteorLauncher qsbMeteorLauncher) => SendEvent(CreateMessage(qsbMeteorLauncher));
private WorldObjectMessage CreateMessage(int id) => new WorldObjectMessage
private WorldObjectMessage CreateMessage(QSBMeteorLauncher qsbMeteorLauncher) => new WorldObjectMessage
{
ObjectId = id
ObjectId = qsbMeteorLauncher.ObjectId
};
public override void OnReceiveRemote(bool isHost, WorldObjectMessage message)

View File

@ -37,7 +37,7 @@ namespace QSB.MeteorSync.Events
var qsbMeteor = QSBWorldSync.GetWorldFromId<QSBMeteor>(message.ObjectId);
// todo
DebugLog.DebugWrite($"{qsbMeteor.LogName} - resync requested");
// DebugLog.DebugWrite($"{qsbMeteor.LogName} - resync requested");
}
}
}

View File

@ -1,5 +1,4 @@
using System;
using System.Linq;
using HarmonyLib;
using OWML.Common;
using QSB.MeteorSync.WorldObjects;
@ -95,8 +94,9 @@ namespace QSB.MeteorSync.Patches
}
if (meteorController != null)
{
var launchSpeed = qsbMeteorLauncher.LaunchSpeed;
var linearVelocity = __instance._parentBody.GetPointVelocity(__instance.transform.position) + __instance.transform.TransformDirection(__instance._launchDirection) * launchSpeed;
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);
if (__instance._audioSector.ContainsOccupant(DynamicOccupant.Player))
@ -104,37 +104,18 @@ namespace QSB.MeteorSync.Patches
__instance._launchSource.pitch = Random.Range(0.4f, 0.6f);
__instance._launchSource.PlayOneShot(AudioType.BH_MeteorLaunch);
}
DebugLog.DebugWrite($"{qsbMeteorLauncher.LogName} - launch {qsbMeteor.LogName} {launchSpeed}");
DebugLog.DebugWrite($"{qsbMeteorLauncher.LogName} - launch {qsbMeteor.LogName} {qsbMeteorLauncher.LaunchSpeed} {qsbMeteor.Damage}");
}
else
{
DebugLog.ToConsole($"{qsbMeteorLauncher.LogName} - could not find meteor {qsbMeteorLauncher.MeteorId} in pool", MessageType.Warning);
}
return false;
}
[HarmonyPostfix]
[HarmonyPatch(typeof(MeteorController), nameof(MeteorController.Launch))]
public static void Launch(MeteorController __instance,
Transform parent, Vector3 worldPosition, Quaternion worldRotation, Vector3 linearVelocity, Vector3 angularVelocity)
{
__instance.gameObject.SetActive(true);
__instance.transform.SetParent(parent);
__instance.transform.SetPositionAndRotation(worldPosition, worldRotation);
__instance._owRigidbody.MakeNonKinematic();
__instance._owRigidbody.SetVelocity(linearVelocity);
__instance._owRigidbody.SetAngularVelocity(angularVelocity);
__instance._intactRenderer.enabled = true;
__instance._glowLight.intensity = __instance._lightStartIntensity;
__instance._smokeTrail.enabled = true;
__instance._smokeTrail.GetParticleSystem().Play();
__instance._suspended = false;
__instance._hasLaunched = true;
__instance._launchTime = Time.time;
__instance._hasImpacted = false;
__instance._impactTime = 0f;
__instance._heat = 1f;
}
[HarmonyPrefix]
[HarmonyPatch(typeof(MeteorController), nameof(MeteorController.Impact))]
public static bool Impact(MeteorController __instance,
@ -178,15 +159,7 @@ namespace QSB.MeteorSync.Patches
__instance._hasImpacted = true;
__instance._impactTime = Time.time;
if (qsbMeteor.ShouldImpact)
{
DebugLog.DebugWrite($"{qsbMeteor.LogName} - impact! {hitObject.name} {impactPoint} {impactVel} {damage}");
qsbMeteor.ShouldImpact = false;
}
else
{
DebugLog.ToConsole($"{qsbMeteor.LogName} - impacted locally, but not on server. THIS SHOULD BE IMPOSSIBLE", MessageType.Error);
}
DebugLog.DebugWrite($"{qsbMeteor.LogName} - impact! {hitObject.name} {impactPoint} {impactVel} {damage}");
return false;
}
@ -202,11 +175,6 @@ namespace QSB.MeteorSync.Patches
}
var qsbMeteor = QSBWorldSync.GetWorldFromUnity<QSBMeteor>(__instance);
if (qsbMeteor.ShouldImpact)
{
DebugLog.ToConsole($"{qsbMeteor.LogName} - impacted on server, but not locally", MessageType.Error);
qsbMeteor.ShouldImpact = false;
}
DebugLog.DebugWrite($"{qsbMeteor.LogName} - suspended");
}
}

View File

@ -60,7 +60,7 @@ namespace QSB.MeteorSync.Patches
}
var qsbMeteorLauncher = QSBWorldSync.GetWorldFromUnity<QSBMeteorLauncher>(__instance);
QSBEventManager.FireEvent(EventNames.QSBMeteorPreLaunch, qsbMeteorLauncher.ObjectId);
QSBEventManager.FireEvent(EventNames.QSBMeteorPreLaunch, qsbMeteorLauncher);
}
if (Time.time > __instance._lastLaunchTime + __instance._launchDelay + 2.3f)
{
@ -115,8 +115,15 @@ namespace QSB.MeteorSync.Patches
}
if (meteorController != null)
{
var launchSpeed = Random.Range(__instance._minLaunchSpeed, __instance._maxLaunchSpeed);
var linearVelocity = __instance._parentBody.GetPointVelocity(__instance.transform.position) + __instance.transform.TransformDirection(__instance._launchDirection) * launchSpeed;
var qsbMeteorLauncher = QSBWorldSync.GetWorldFromUnity<QSBMeteorLauncher>(__instance);
var qsbMeteor = QSBWorldSync.GetWorldFromUnity<QSBMeteor>(meteorController);
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;
meteorController.Launch(null, __instance.transform.position, __instance.transform.rotation, linearVelocity, angularVelocity);
if (__instance._audioSector.ContainsOccupant(DynamicOccupant.Player))
@ -125,10 +132,8 @@ namespace QSB.MeteorSync.Patches
__instance._launchSource.PlayOneShot(AudioType.BH_MeteorLaunch);
}
var qsbMeteorLauncher = QSBWorldSync.GetWorldFromUnity<QSBMeteorLauncher>(__instance);
var qsbMeteor = QSBWorldSync.GetWorldFromUnity<QSBMeteor>(meteorController);
QSBEventManager.FireEvent(EventNames.QSBMeteorLaunch, qsbMeteorLauncher.ObjectId, qsbMeteor.ObjectId, launchSpeed);
DebugLog.DebugWrite($"{qsbMeteorLauncher.LogName} - launch {qsbMeteor.LogName} {launchSpeed}");
QSBEventManager.FireEvent(EventNames.QSBMeteorLaunch, qsbMeteorLauncher);
DebugLog.DebugWrite($"{qsbMeteorLauncher.LogName} - launch {qsbMeteor.LogName} {qsbMeteorLauncher.LaunchSpeed} {qsbMeteor.Damage}");
}
return false;
@ -140,8 +145,10 @@ namespace QSB.MeteorSync.Patches
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 = Random.Range(__instance._minDamage, __instance._maxDamage);
var damage = qsbMeteor.Damage;
if (componentInParent != null)
{
if (!componentInParent.GetIgnoreMeteorDamage())
@ -176,10 +183,6 @@ namespace QSB.MeteorSync.Patches
__instance._hasImpacted = true;
__instance._impactTime = Time.time;
var qsbMeteor = QSBWorldSync.GetWorldFromUnity<QSBMeteor>(__instance);
var pos = Locator._brittleHollow.transform.InverseTransformPoint(__instance.owRigidbody.GetPosition());
var rot = Locator._brittleHollow.transform.InverseTransformRotation(__instance.owRigidbody.GetRotation());
QSBEventManager.FireEvent(EventNames.QSBMeteorImpact, qsbMeteor.ObjectId, pos, rot, damage);
DebugLog.DebugWrite($"{qsbMeteor.LogName} - impact! {hitObject.name} {impactPoint} {impactVel} {damage}");
return false;

View File

@ -1,6 +1,4 @@
using QSB.Utility;
using QSB.WorldSync;
using UnityEngine;
using QSB.WorldSync;
namespace QSB.MeteorSync.WorldObjects
{
@ -34,29 +32,6 @@ namespace QSB.MeteorSync.WorldObjects
}
public bool ShouldImpact;
public float Damage;
public void Impact(Vector3 pos, Quaternion rot, float damage)
{
pos = Locator._brittleHollow.transform.TransformPoint(pos);
rot = Locator._brittleHollow.transform.TransformRotation(rot);
Damage = damage;
AttachedObject.owRigidbody.SetPosition(pos);
AttachedObject.owRigidbody.SetRotation(rot);
foreach (var owCollider in AttachedObject._owColliders)
{
owCollider.SetActivation(!OWLayerMask.IsLayerInMask(owCollider.gameObject.layer, OWLayerMask.physicalMask));
}
FragmentSurfaceProxy.TrackMeteor(AttachedObject);
FragmentCollisionProxy.TrackMeteor(AttachedObject);
AttachedObject._hasImpacted = true;
AttachedObject._impactTime = Time.time;
ShouldImpact = true;
}
}
}

View File

@ -13,6 +13,7 @@ namespace QSB.MeteorSync.WorldObjects
public int MeteorId;
public float LaunchSpeed;
public float Damage;
public void PreLaunchMeteor()
{
@ -22,10 +23,11 @@ namespace QSB.MeteorSync.WorldObjects
}
}
public void LaunchMeteor(int meteorId, float launchSpeed)
public void LaunchMeteor(int meteorId, float launchSpeed, float damage)
{
MeteorId = meteorId;
LaunchSpeed = launchSpeed;
Damage = damage;
AttachedObject.LaunchMeteor();
foreach (var particleSystem in AttachedObject._launchParticles)

View File

@ -124,8 +124,6 @@
<Compile Include="Menus\IMenuAPI.cs" />
<Compile Include="Menus\MenuManager.cs" />
<Compile Include="Messaging\BoolMessage.cs" />
<Compile Include="MeteorSync\Events\MeteorImpactEvent.cs" />
<Compile Include="MeteorSync\Events\MeteorImpactMessage.cs" />
<Compile Include="MeteorSync\Events\MeteorLaunchEvent.cs" />
<Compile Include="MeteorSync\Events\MeteorLaunchMessage.cs" />
<Compile Include="MeteorSync\Events\MeteorPreLaunchEvent.cs" />