Merge pull request #299 from misternebula/ship-stuff

One ship, syncing repairs
This commit is contained in:
_nebula 2021-06-20 13:05:50 +01:00 committed by GitHub
commit db86cda860
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
189 changed files with 3569 additions and 664 deletions

Binary file not shown.

View File

@ -1,9 +1,9 @@
ManifestFileVersion: 0
CRC: 3669040473
CRC: 1574640978
Hashes:
AssetFileHash:
serializedVersion: 2
Hash: 102cbe12b50dffef59e4f393401b86ab
Hash: 7f0a5acd2c87eeadfd051836171b2256
TypeTreeHash:
serializedVersion: 2
Hash: 8b6abf066340f652e25eed06e6b72102

View File

@ -37,6 +37,7 @@ namespace QNetWeaver
Console.WriteLine("No symbols for " + inputFile);
result = null;
}
return result;
}
@ -48,6 +49,7 @@ namespace QNetWeaver
{
return false;
}
foreach (var typeReference in ResolveInheritanceHierarchy(typeRef))
{
if (typeReference.IsGenericInstance)
@ -63,6 +65,7 @@ namespace QNetWeaver
catch
{
}
return false;
}
@ -75,6 +78,7 @@ namespace QNetWeaver
yield return Weaver.objectType;
yield break;
}
while (type != null && type.FullName != Weaver.objectType.FullName)
{
yield return type;
@ -85,6 +89,7 @@ namespace QNetWeaver
{
break;
}
type = typeDefinition.BaseType;
}
catch
@ -92,6 +97,7 @@ namespace QNetWeaver
break;
}
}
yield return Weaver.objectType;
yield break;
}
@ -122,6 +128,7 @@ namespace QNetWeaver
{
result = type.Name;
}
return result;
}
@ -132,6 +139,7 @@ namespace QNetWeaver
{
assemblyResolver = new DefaultAssemblyResolver();
}
var addSearchDirectoryHelper = new Helpers.AddSearchDirectoryHelper(assemblyResolver);
addSearchDirectoryHelper.AddSearchDirectory(Path.GetDirectoryName(assemblyPath));
addSearchDirectoryHelper.AddSearchDirectory(UnityEngineDLLDirectoryName());
@ -144,6 +152,7 @@ namespace QNetWeaver
addSearchDirectoryHelper.AddSearchDirectory(directory);
}
}
readerParameters.AssemblyResolver = assemblyResolver;
readerParameters.SymbolReaderProvider = GetSymbolReaderProvider(assemblyPath);
return readerParameters;
@ -160,6 +169,7 @@ namespace QNetWeaver
{
writerParameters.SymbolWriterProvider = new MdbWriterProvider();
}
return writerParameters;
}
@ -169,11 +179,13 @@ namespace QNetWeaver
{
throw new ArgumentException();
}
var genericInstanceType = new GenericInstanceType(self);
foreach (var item in arguments)
{
genericInstanceType.GenericArguments.Add(item);
}
return genericInstanceType;
}
@ -189,10 +201,12 @@ namespace QNetWeaver
{
methodReference.Parameters.Add(new ParameterDefinition(parameterDefinition.ParameterType));
}
foreach (var genericParameter in self.GenericParameters)
{
methodReference.GenericParameters.Add(new GenericParameter(genericParameter.Name, methodReference));
}
return methodReference;
}
@ -208,6 +222,7 @@ namespace QNetWeaver
{
throw new Exception("Assembly resolver doesn't implement AddSearchDirectory method.");
}
_addSearchDirectory = (Helpers.AddSearchDirectoryHelper.AddSearchDirectoryDelegate)Delegate.CreateDelegate(typeof(Helpers.AddSearchDirectoryHelper.AddSearchDirectoryDelegate), assemblyResolver, method);
}

View File

@ -34,6 +34,7 @@ namespace QNetWeaver
return;
}
}
if (m_td.Fields.Count != 0)
{
foreach (var fieldDefinition in m_td.Fields)
@ -52,6 +53,7 @@ namespace QNetWeaver
return;
}
}
var methodDefinition2 = new MethodDefinition("Serialize", MethodAttributes.FamANDAssem | MethodAttributes.Family | MethodAttributes.Virtual | MethodAttributes.HideBySig, Weaver.voidType);
methodDefinition2.Parameters.Add(new ParameterDefinition("writer", ParameterAttributes.None, Weaver.scriptDef.MainModule.ImportReference(Weaver.NetworkWriterType)));
var ilprocessor = methodDefinition2.Body.GetILProcessor();
@ -74,6 +76,7 @@ namespace QNetWeaver
}));
return;
}
if (fieldDefinition2.FieldType.Resolve().IsInterface)
{
Weaver.fail = true;
@ -89,6 +92,7 @@ namespace QNetWeaver
}));
return;
}
var writeFunc = Weaver.GetWriteFunc(fieldDefinition2.FieldType);
if (writeFunc == null)
{
@ -105,12 +109,14 @@ namespace QNetWeaver
}));
return;
}
ilprocessor.Append(ilprocessor.Create(OpCodes.Ldarg_1));
ilprocessor.Append(ilprocessor.Create(OpCodes.Ldarg_0));
ilprocessor.Append(ilprocessor.Create(OpCodes.Ldfld, fieldDefinition2));
ilprocessor.Append(ilprocessor.Create(OpCodes.Call, writeFunc));
}
}
ilprocessor.Append(ilprocessor.Create(OpCodes.Ret));
m_td.Methods.Add(methodDefinition2);
}
@ -126,6 +132,7 @@ namespace QNetWeaver
return;
}
}
if (m_td.Fields.Count != 0)
{
var methodDefinition2 = new MethodDefinition("Deserialize", MethodAttributes.FamANDAssem | MethodAttributes.Family | MethodAttributes.Virtual | MethodAttributes.HideBySig, Weaver.voidType);
@ -149,12 +156,14 @@ namespace QNetWeaver
}));
return;
}
ilprocessor.Append(ilprocessor.Create(OpCodes.Ldarg_0));
ilprocessor.Append(ilprocessor.Create(OpCodes.Ldarg_1));
ilprocessor.Append(ilprocessor.Create(OpCodes.Call, readFunc));
ilprocessor.Append(ilprocessor.Create(OpCodes.Stfld, fieldDefinition));
}
}
ilprocessor.Append(ilprocessor.Create(OpCodes.Ret));
m_td.Methods.Add(methodDefinition2);
}

View File

@ -31,6 +31,7 @@ namespace QNetWeaver
Weaver.fail = true;
}
}
if (Helpers.InheritsFromSyncList(fieldDefinition.FieldType))
{
Log.Error(string.Format("Script {0} defines field {1} with type {2}, but it's not a NetworkBehaviour", m_td.FullName, fieldDefinition.Name, Helpers.PrettyPrintType(fieldDefinition.FieldType)));
@ -57,6 +58,7 @@ namespace QNetWeaver
}));
Weaver.fail = true;
}
if (customAttribute.AttributeType.FullName == Weaver.ClientRpcType.FullName)
{
Log.Error(string.Concat(new string[]
@ -69,6 +71,7 @@ namespace QNetWeaver
}));
Weaver.fail = true;
}
if (customAttribute.AttributeType.FullName == Weaver.TargetRpcType.FullName)
{
Log.Error(string.Concat(new string[]
@ -81,6 +84,7 @@ namespace QNetWeaver
}));
Weaver.fail = true;
}
var text = customAttribute.Constructor.DeclaringType.ToString();
if (text == "UnityEngine.Networking.ServerAttribute")
{

View File

@ -117,12 +117,14 @@ namespace QNetWeaver
Weaver.fail = true;
return false;
}
worker.Append(worker.Create(OpCodes.Ldloc_0));
worker.Append(worker.Create(OpCodes.Ldarg, num));
worker.Append(worker.Create(OpCodes.Call, writeFunc));
num += 1;
}
}
return true;
}
@ -135,6 +137,7 @@ namespace QNetWeaver
return;
}
}
var methodDefinition2 = new MethodDefinition("UNetVersion", MethodAttributes.Private, Weaver.voidType);
var ilprocessor = methodDefinition2.Body.GetILProcessor();
ilprocessor.Append(ilprocessor.Create(OpCodes.Ret));
@ -169,6 +172,7 @@ namespace QNetWeaver
Weaver.fail = true;
return;
}
cctorMethodDef.Body.Instructions.RemoveAt(cctorMethodDef.Body.Instructions.Count - 1);
}
}
@ -191,6 +195,7 @@ namespace QNetWeaver
ctorMethodDef.Body.Instructions.RemoveAt(ctorMethodDef.Body.Instructions.Count - 1);
break;
}
Weaver.fail = true;
Log.Error("No .ctor for " + m_td.Name);
return;
@ -266,6 +271,7 @@ namespace QNetWeaver
GenerateCommandDelegate(ilprocessor2, Weaver.registerSyncListDelegateReference, m_SyncListInvocationFuncs[syncListIndex], field5);
syncListIndex++;
}
ilprocessor2.Append(ilprocessor2.Create(OpCodes.Ldstr, m_td.Name));
ilprocessor2.Append(ilprocessor2.Create(OpCodes.Ldc_I4, m_QosChannel));
ilprocessor2.Append(ilprocessor2.Create(OpCodes.Call, Weaver.RegisterBehaviourReference));
@ -274,6 +280,7 @@ namespace QNetWeaver
{
m_td.Methods.Add(cctorMethodDef);
}
ilprocessor.Append(ilprocessor.Create(OpCodes.Ret));
m_td.Attributes = (m_td.Attributes & ~TypeAttributes.BeforeFieldInit);
if (m_SyncLists.Count != 0)
@ -288,6 +295,7 @@ namespace QNetWeaver
flag2 = true;
}
}
if (methodDefinition8 != null)
{
if (methodDefinition8.Body.Instructions.Count != 0)
@ -299,6 +307,7 @@ namespace QNetWeaver
Weaver.fail = true;
return;
}
methodDefinition8.Body.Instructions.RemoveAt(methodDefinition8.Body.Instructions.Count - 1);
}
}
@ -306,17 +315,20 @@ namespace QNetWeaver
{
methodDefinition8 = new MethodDefinition("Awake", MethodAttributes.Private, Weaver.voidType);
}
var ilprocessor3 = methodDefinition8.Body.GetILProcessor();
if (!flag2)
{
CheckForCustomBaseClassAwakeMethod(ilprocessor3);
}
var num6 = 0;
foreach (var fd in m_SyncLists)
{
GenerateSyncListInitializer(ilprocessor3, fd, num6);
num6++;
}
ilprocessor3.Append(ilprocessor3.Create(OpCodes.Ret));
if (!flag2)
{
@ -339,6 +351,7 @@ namespace QNetWeaver
awakeWorker.Append(awakeWorker.Create(OpCodes.Call, methodDefinition));
break;
}
baseType = baseType.Resolve().BaseType;
}
}
@ -356,6 +369,7 @@ namespace QNetWeaver
}
}
}
var method = Weaver.scriptDef.MainModule.ImportReference(Enumerable.First<MethodDefinition>(fd.FieldType.Resolve().Methods, (MethodDefinition x) => x.Name == ".ctor" && !x.HasParameters));
ctorWorker.Append(ctorWorker.Create(OpCodes.Ldarg_0));
ctorWorker.Append(ctorWorker.Create(OpCodes.Newobj, method));
@ -402,6 +416,7 @@ namespace QNetWeaver
return;
}
}
var methodDefinition2 = new MethodDefinition("OnSerialize", MethodAttributes.FamANDAssem | MethodAttributes.Family | MethodAttributes.Virtual | MethodAttributes.HideBySig, Weaver.boolType);
methodDefinition2.Parameters.Add(new ParameterDefinition("writer", ParameterAttributes.None, Weaver.scriptDef.MainModule.ImportReference(Weaver.NetworkWriterType)));
methodDefinition2.Parameters.Add(new ParameterDefinition("forceAll", ParameterAttributes.None, Weaver.boolType));
@ -440,6 +455,7 @@ namespace QNetWeaver
{
ilprocessor.Append(ilprocessor.Create(OpCodes.Ldloc_0));
}
ilprocessor.Append(ilprocessor.Create(OpCodes.Ret));
m_td.Methods.Add(methodDefinition2);
}
@ -469,8 +485,10 @@ namespace QNetWeaver
}));
return;
}
ilprocessor.Append(ilprocessor.Create(OpCodes.Call, writeFunc));
}
Weaver.DLog(m_td, $" Finish foreach 1", new object[0]);
ilprocessor.Append(ilprocessor.Create(OpCodes.Ldc_I4_1));
ilprocessor.Append(ilprocessor.Create(OpCodes.Ret));
@ -512,10 +530,12 @@ namespace QNetWeaver
Weaver.fail = true;
return;
}
ilprocessor.Append(ilprocessor.Create(OpCodes.Call, writeFunc2));
ilprocessor.Append(instruction2);
num++;
}
Weaver.DLog(m_td, $" Finish foreach 2", new object[0]);
WriteDirtyCheck(ilprocessor, false);
if (Weaver.generateLogErrors)
@ -523,6 +543,7 @@ namespace QNetWeaver
ilprocessor.Append(ilprocessor.Create(OpCodes.Ldstr, "Injected Serialize " + m_td.Name));
ilprocessor.Append(ilprocessor.Create(OpCodes.Call, Weaver.logErrorReference));
}
if (flag)
{
ilprocessor.Append(ilprocessor.Create(OpCodes.Ldloc_0));
@ -533,10 +554,12 @@ namespace QNetWeaver
{
ilprocessor.Append(ilprocessor.Create(OpCodes.Ldloc_0));
}
ilprocessor.Append(ilprocessor.Create(OpCodes.Ret));
m_td.Methods.Add(methodDefinition2);
Weaver.DLog(m_td, $" Finish", new object[0]);
}
Weaver.DLog(m_td, $" Finish", new object[0]);
}
@ -554,6 +577,7 @@ namespace QNetWeaver
serWorker.Append(serWorker.Create(OpCodes.Ldc_I4_1));
serWorker.Append(serWorker.Create(OpCodes.Stloc_0));
}
serWorker.Append(instruction);
}
@ -574,6 +598,7 @@ namespace QNetWeaver
}
}
}
return result;
}
@ -599,16 +624,19 @@ namespace QNetWeaver
Weaver.fail = true;
return false;
}
if (methodDefinition.Parameters[0].ParameterType != syncVar.FieldType)
{
Log.Error("SyncVar Hook function " + text + " has wrong type signature for " + m_td.Name);
Weaver.fail = true;
return false;
}
foundMethod = methodDefinition;
return true;
}
}
Log.Error("SyncVar Hook function " + text + " not found for " + m_td.Name);
Weaver.fail = true;
return false;
@ -616,6 +644,7 @@ namespace QNetWeaver
}
}
}
return true;
}
@ -651,15 +680,18 @@ namespace QNetWeaver
{
continue;
}
if (HasMethod("GetNetworkChannel"))
{
Log.Error("GetNetworkChannel, is already implemented, please make sure you either use NetworkSettings or GetNetworkChannel");
Weaver.fail = true;
return;
}
m_QosChannel = (int)customAttributeNamedArgument.Argument.Value;
GenerateNetworkChannelSetting(m_QosChannel);
}
if (customAttributeNamedArgument.Name == "sendInterval")
{
if (Math.Abs((float)customAttributeNamedArgument.Argument.Value - 0.1f) > 1E-05f)
@ -670,6 +702,7 @@ namespace QNetWeaver
Weaver.fail = true;
return;
}
GenerateNetworkIntervalSetting((float)customAttributeNamedArgument.Argument.Value);
}
}
@ -690,6 +723,7 @@ namespace QNetWeaver
return;
}
}
foreach (var fieldDefinition in m_SyncVars)
{
if (fieldDefinition.FieldType.FullName == Weaver.gameObjectType.FullName)
@ -699,6 +733,7 @@ namespace QNetWeaver
methodDefinition = new MethodDefinition("PreStartClient", MethodAttributes.FamANDAssem | MethodAttributes.Family | MethodAttributes.Virtual | MethodAttributes.HideBySig, Weaver.voidType);
ilprocessor = methodDefinition.Body.GetILProcessor();
}
var field = m_SyncVarNetIds[m_NetIdFieldCounter];
m_NetIdFieldCounter++;
var instruction = ilprocessor.Create(OpCodes.Nop);
@ -714,6 +749,7 @@ namespace QNetWeaver
ilprocessor.Append(instruction);
}
}
if (methodDefinition != null)
{
ilprocessor.Append(ilprocessor.Create(OpCodes.Ret));
@ -732,6 +768,7 @@ namespace QNetWeaver
return;
}
}
var methodDefinition2 = new MethodDefinition("OnDeserialize", MethodAttributes.FamANDAssem | MethodAttributes.Family | MethodAttributes.Virtual | MethodAttributes.HideBySig, Weaver.voidType);
methodDefinition2.Parameters.Add(new ParameterDefinition("reader", ParameterAttributes.None, Weaver.scriptDef.MainModule.ImportReference(Weaver.NetworkReaderType)));
methodDefinition2.Parameters.Add(new ParameterDefinition("initialState", ParameterAttributes.None, Weaver.boolType));
@ -747,6 +784,7 @@ namespace QNetWeaver
ilprocessor.Append(ilprocessor.Create(OpCodes.Call, methodReference));
}
}
if (m_SyncVars.Count == 0)
{
ilprocessor.Append(ilprocessor.Create(OpCodes.Ret));
@ -794,11 +832,13 @@ namespace QNetWeaver
Weaver.fail = true;
return;
}
ilprocessor.Append(ilprocessor.Create(OpCodes.Call, readFunc));
ilprocessor.Append(ilprocessor.Create(OpCodes.Stfld, fieldDefinition));
}
}
}
ilprocessor.Append(ilprocessor.Create(OpCodes.Ret));
ilprocessor.Append(instruction);
methodDefinition2.Body.InitLocals = true;
@ -839,10 +879,12 @@ namespace QNetWeaver
Weaver.fail = true;
return;
}
if (!CheckForHookFunction(fieldDefinition2, out var methodDefinition3))
{
return;
}
if (methodDefinition3 == null)
{
ilprocessor.Append(ilprocessor.Create(OpCodes.Ldarg_0));
@ -858,14 +900,17 @@ namespace QNetWeaver
ilprocessor.Append(ilprocessor.Create(OpCodes.Call, methodDefinition3));
}
}
ilprocessor.Append(instruction2);
num++;
}
if (Weaver.generateLogErrors)
{
ilprocessor.Append(ilprocessor.Create(OpCodes.Ldstr, "Injected Deserialize " + m_td.Name));
ilprocessor.Append(ilprocessor.Create(OpCodes.Call, Weaver.logErrorReference));
}
ilprocessor.Append(ilprocessor.Create(OpCodes.Ret));
m_td.Methods.Add(methodDefinition2);
}
@ -894,6 +939,7 @@ namespace QNetWeaver
Weaver.fail = true;
return false;
}
worker.Append(worker.Create(OpCodes.Ldarg_1));
worker.Append(worker.Create(OpCodes.Call, readFunc));
if (parameterDefinition.ParameterType.FullName == Weaver.singleType.FullName)
@ -906,6 +952,7 @@ namespace QNetWeaver
}
}
}
return true;
}
@ -929,6 +976,7 @@ namespace QNetWeaver
AddInvokeParameters(methodDefinition.Parameters);
result = methodDefinition;
}
return result;
}
@ -945,6 +993,7 @@ namespace QNetWeaver
{
methodDefinition.Parameters.Add(new ParameterDefinition(parameterDefinition.Name, ParameterAttributes.None, parameterDefinition.ParameterType));
}
var ilprocessor = methodDefinition.Body.GetILProcessor();
var label = ilprocessor.Create(OpCodes.Nop);
WriteSetupLocals(ilprocessor);
@ -953,6 +1002,7 @@ namespace QNetWeaver
ilprocessor.Append(ilprocessor.Create(OpCodes.Ldstr, "Call Command function " + md.Name));
ilprocessor.Append(ilprocessor.Create(OpCodes.Call, Weaver.logErrorReference));
}
WriteClientActiveCheck(ilprocessor, md.Name, label, "Command function");
var instruction = ilprocessor.Create(OpCodes.Nop);
ilprocessor.Append(ilprocessor.Create(OpCodes.Ldarg_0));
@ -963,6 +1013,7 @@ namespace QNetWeaver
{
ilprocessor.Append(ilprocessor.Create(OpCodes.Ldarg, i + 1));
}
ilprocessor.Append(ilprocessor.Create(OpCodes.Call, md));
ilprocessor.Append(ilprocessor.Create(OpCodes.Ret));
ilprocessor.Append(instruction);
@ -995,12 +1046,14 @@ namespace QNetWeaver
value = (int)customAttributeNamedArgument.Argument.Value;
}
}
var text = md.Name;
var num = text.IndexOf("InvokeCmd");
if (num > -1)
{
text = text.Substring("InvokeCmd".Length);
}
ilprocessor.Append(ilprocessor.Create(OpCodes.Ldarg_0));
ilprocessor.Append(ilprocessor.Create(OpCodes.Ldloc_0));
ilprocessor.Append(ilprocessor.Create(OpCodes.Ldc_I4, value));
@ -1009,6 +1062,7 @@ namespace QNetWeaver
ilprocessor.Append(ilprocessor.Create(OpCodes.Ret));
result = methodDefinition;
}
return result;
}
@ -1033,6 +1087,7 @@ namespace QNetWeaver
AddInvokeParameters(methodDefinition.Parameters);
result = methodDefinition;
}
return result;
}
@ -1056,6 +1111,7 @@ namespace QNetWeaver
AddInvokeParameters(methodDefinition.Parameters);
result = methodDefinition;
}
return result;
}
@ -1066,6 +1122,7 @@ namespace QNetWeaver
{
methodDefinition.Parameters.Add(new ParameterDefinition(parameterDefinition.Name, ParameterAttributes.None, parameterDefinition.ParameterType));
}
var ilprocessor = methodDefinition.Body.GetILProcessor();
var label = ilprocessor.Create(OpCodes.Nop);
WriteSetupLocals(ilprocessor);
@ -1106,12 +1163,14 @@ namespace QNetWeaver
value = (int)customAttributeNamedArgument.Argument.Value;
}
}
var text = md.Name;
var num = text.IndexOf("InvokeTargetRpc");
if (num > -1)
{
text = text.Substring("InvokeTargetRpc".Length);
}
ilprocessor.Append(ilprocessor.Create(OpCodes.Ldarg_0));
ilprocessor.Append(ilprocessor.Create(OpCodes.Ldarg_1));
ilprocessor.Append(ilprocessor.Create(OpCodes.Ldloc_0));
@ -1121,6 +1180,7 @@ namespace QNetWeaver
ilprocessor.Append(ilprocessor.Create(OpCodes.Ret));
result = methodDefinition;
}
return result;
}
@ -1131,6 +1191,7 @@ namespace QNetWeaver
{
methodDefinition.Parameters.Add(new ParameterDefinition(parameterDefinition.Name, ParameterAttributes.None, parameterDefinition.ParameterType));
}
var ilprocessor = methodDefinition.Body.GetILProcessor();
var label = ilprocessor.Create(OpCodes.Nop);
WriteSetupLocals(ilprocessor);
@ -1163,12 +1224,14 @@ namespace QNetWeaver
value = (int)customAttributeNamedArgument.Argument.Value;
}
}
var text = md.Name;
var num = text.IndexOf("InvokeRpc");
if (num > -1)
{
text = text.Substring("InvokeRpc".Length);
}
ilprocessor.Append(ilprocessor.Create(OpCodes.Ldarg_0));
ilprocessor.Append(ilprocessor.Create(OpCodes.Ldloc_0));
ilprocessor.Append(ilprocessor.Create(OpCodes.Ldc_I4, value));
@ -1177,6 +1240,7 @@ namespace QNetWeaver
ilprocessor.Append(ilprocessor.Create(OpCodes.Ret));
result = methodDefinition;
}
return result;
}
@ -1229,6 +1293,7 @@ namespace QNetWeaver
{
result = true;
}
return result;
}
@ -1320,9 +1385,11 @@ namespace QNetWeaver
return false;
}
}
i++;
continue;
}
Log.Error(string.Concat(new string[]
{
actionType,
@ -1336,8 +1403,10 @@ namespace QNetWeaver
Weaver.fail = true;
result = false;
}
return result;
}
return true;
}
@ -1374,6 +1443,7 @@ namespace QNetWeaver
{
result = (ProcessMethodsValidateFunction(md, ca, "Command") && ProcessMethodsValidateParameters(md, ca, "Command"));
}
return result;
}
@ -1441,6 +1511,7 @@ namespace QNetWeaver
{
result = ProcessMethodsValidateParameters(md, ca, "Target Rpc");
}
return result;
}
@ -1477,6 +1548,7 @@ namespace QNetWeaver
{
result = (ProcessMethodsValidateFunction(md, ca, "Rpc") && ProcessMethodsValidateParameters(md, ca, "Rpc"));
}
return result;
}
@ -1494,6 +1566,7 @@ namespace QNetWeaver
{
return;
}
if (hashSet.Contains(methodDefinition.Name))
{
Log.Error(string.Concat(new string[]
@ -1507,6 +1580,7 @@ namespace QNetWeaver
Weaver.fail = true;
return;
}
hashSet.Add(methodDefinition.Name);
m_Cmds.Add(methodDefinition);
var methodDefinition2 = ProcessCommandInvoke(methodDefinition);
@ -1514,6 +1588,7 @@ namespace QNetWeaver
{
m_CmdInvocationFuncs.Add(methodDefinition2);
}
var methodDefinition3 = ProcessCommandCall(methodDefinition, customAttribute);
if (methodDefinition3 != null)
{
@ -1521,6 +1596,7 @@ namespace QNetWeaver
Weaver.lists.replacedMethods.Add(methodDefinition);
Weaver.lists.replacementMethods.Add(methodDefinition3);
}
break;
}
else if (customAttribute.AttributeType.FullName == Weaver.TargetRpcType.FullName)
@ -1529,6 +1605,7 @@ namespace QNetWeaver
{
return;
}
if (hashSet.Contains(methodDefinition.Name))
{
Log.Error(string.Concat(new string[]
@ -1542,6 +1619,7 @@ namespace QNetWeaver
Weaver.fail = true;
return;
}
hashSet.Add(methodDefinition.Name);
m_TargetRpcs.Add(methodDefinition);
var methodDefinition4 = ProcessTargetRpcInvoke(methodDefinition);
@ -1549,6 +1627,7 @@ namespace QNetWeaver
{
m_TargetRpcInvocationFuncs.Add(methodDefinition4);
}
var methodDefinition5 = ProcessTargetRpcCall(methodDefinition, customAttribute);
if (methodDefinition5 != null)
{
@ -1556,6 +1635,7 @@ namespace QNetWeaver
Weaver.lists.replacedMethods.Add(methodDefinition);
Weaver.lists.replacementMethods.Add(methodDefinition5);
}
break;
}
else if (customAttribute.AttributeType.FullName == Weaver.ClientRpcType.FullName)
@ -1564,6 +1644,7 @@ namespace QNetWeaver
{
return;
}
if (hashSet.Contains(methodDefinition.Name))
{
Log.Error(string.Concat(new string[]
@ -1577,6 +1658,7 @@ namespace QNetWeaver
Weaver.fail = true;
return;
}
hashSet.Add(methodDefinition.Name);
m_Rpcs.Add(methodDefinition);
var methodDefinition6 = ProcessRpcInvoke(methodDefinition);
@ -1584,6 +1666,7 @@ namespace QNetWeaver
{
m_RpcInvocationFuncs.Add(methodDefinition6);
}
var methodDefinition7 = ProcessRpcCall(methodDefinition, customAttribute);
if (methodDefinition7 != null)
{
@ -1591,30 +1674,37 @@ namespace QNetWeaver
Weaver.lists.replacedMethods.Add(methodDefinition);
Weaver.lists.replacementMethods.Add(methodDefinition7);
}
break;
}
}
}
foreach (var item in m_CmdInvocationFuncs)
{
m_td.Methods.Add(item);
}
foreach (var item2 in m_CmdCallFuncs)
{
m_td.Methods.Add(item2);
}
foreach (var item3 in m_RpcInvocationFuncs)
{
m_td.Methods.Add(item3);
}
foreach (var item4 in m_TargetRpcInvocationFuncs)
{
m_td.Methods.Add(item4);
}
foreach (var item5 in m_RpcCallFuncs)
{
m_td.Methods.Add(item5);
}
foreach (var item6 in m_TargetRpcCallFuncs)
{
m_td.Methods.Add(item6);
@ -1632,6 +1722,7 @@ namespace QNetWeaver
break;
}
}
MethodDefinition result;
if (fieldDefinition == null)
{
@ -1668,6 +1759,7 @@ namespace QNetWeaver
result = methodDefinition;
}
}
return result;
}
@ -1679,6 +1771,7 @@ namespace QNetWeaver
{
methodDefinition.Parameters.Add(new ParameterDefinition(parameterDefinition.Name, ParameterAttributes.None, parameterDefinition.ParameterType));
}
var ilprocessor = methodDefinition.Body.GetILProcessor();
var label = ilprocessor.Create(OpCodes.Nop);
WriteSetupLocals(ilprocessor);
@ -1711,6 +1804,7 @@ namespace QNetWeaver
value = (int)customAttributeNamedArgument.Argument.Value;
}
}
ilprocessor.Append(ilprocessor.Create(OpCodes.Ldarg_0));
ilprocessor.Append(ilprocessor.Create(OpCodes.Ldloc_0));
ilprocessor.Append(ilprocessor.Create(OpCodes.Ldc_I4, value));
@ -1719,6 +1813,7 @@ namespace QNetWeaver
ilprocessor.Append(ilprocessor.Create(OpCodes.Ret));
result = methodDefinition;
}
return result;
}
@ -1743,6 +1838,7 @@ namespace QNetWeaver
Weaver.fail = true;
return;
}
if (eventDefinition.EventType.Resolve().HasGenericParameters)
{
Log.Error(string.Concat(new string[]
@ -1756,12 +1852,14 @@ namespace QNetWeaver
Weaver.fail = true;
return;
}
m_Events.Add(eventDefinition);
var methodDefinition = ProcessEventInvoke(eventDefinition);
if (methodDefinition == null)
{
return;
}
m_td.Methods.Add(methodDefinition);
m_EventInvocationFuncs.Add(methodDefinition);
Weaver.DLog(m_td, "ProcessEvent " + eventDefinition, new object[0]);
@ -1800,7 +1898,7 @@ namespace QNetWeaver
CheckForHookFunction(fd, out var methodDefinition2);
if (methodDefinition2 != null)
{
ilprocessor.Append(ilprocessor.Create(OpCodes.Call, Weaver.NetworkServerGetLocalClientActive));
ilprocessor.Append(ilprocessor.Create(OpCodes.Brfalse, noOperatorInstruction));
ilprocessor.Append(ilprocessor.Create(OpCodes.Ldarg_0));
@ -1852,6 +1950,7 @@ namespace QNetWeaver
ilprocessor.Append(ilprocessor.Create(OpCodes.Ldarg_0));
ilprocessor.Append(ilprocessor.Create(OpCodes.Call, Weaver.NetworkBehaviourClientSendUpdateVars));
}
ilprocessor.Append(returnInstruction);
methodDefinition.Parameters.Add(new ParameterDefinition("value", ParameterAttributes.In, fd.FieldType));
methodDefinition.SemanticsAttributes = MethodSemanticsAttributes.Setter;
@ -1870,6 +1969,7 @@ namespace QNetWeaver
m_SyncVarNetIds.Add(fieldDefinition);
Weaver.lists.netIdFields.Add(fieldDefinition);
}
var methodDefinition = ProcessSyncVarGet(fd, name);
var methodDefinition2 = ProcessSyncVarSet(fd, name, dirtyBit, fieldDefinition);
var item = new PropertyDefinition("Network" + name, PropertyAttributes.None, fd.FieldType)
@ -1932,30 +2032,35 @@ namespace QNetWeaver
Weaver.fail = true;
return;
}
if (Weaver.IsDerivedFrom(typeDefinition, Weaver.ScriptableObjectType))
{
Log.Error("SyncVar [" + fieldDefinition.FullName + "] cannot be derived from ScriptableObject.");
Weaver.fail = true;
return;
}
if ((ushort)(fieldDefinition.Attributes & FieldAttributes.Static) != 0)
{
Log.Error("SyncVar [" + fieldDefinition.FullName + "] cannot be static.");
Weaver.fail = true;
return;
}
if (typeDefinition.HasGenericParameters)
{
Log.Error("SyncVar [" + fieldDefinition.FullName + "] cannot have generic parameters.");
Weaver.fail = true;
return;
}
if (typeDefinition.IsInterface)
{
Log.Error("SyncVar [" + fieldDefinition.FullName + "] cannot be an interface.");
Weaver.fail = true;
return;
}
var name = typeDefinition.Module.Name;
if (name != Weaver.scriptDef.MainModule.Name && name != Weaver.UnityAssemblyDefinition.MainModule.Name && name != Weaver.QNetAssemblyDefinition.MainModule.Name && name != Weaver.corLib.Name && name != "System.Runtime.dll")
{
@ -1963,17 +2068,20 @@ namespace QNetWeaver
Weaver.fail = true;
return;
}
if (fieldDefinition.FieldType.IsArray)
{
Log.Error("SyncVar [" + fieldDefinition.FullName + "] cannot be an array. Use a SyncList instead.");
Weaver.fail = true;
return;
}
if (Helpers.InheritsFromSyncList(fieldDefinition.FieldType))
{
Log.Warning(string.Format("Script class [{0}] has [SyncVar] attribute on SyncList field {1}, SyncLists should not be marked with SyncVar.", m_td.FullName, fieldDefinition.Name));
break;
}
m_SyncVars.Add(fieldDefinition);
ProcessSyncVar(fieldDefinition, 1 << num2);
num2++;
@ -1991,15 +2099,18 @@ namespace QNetWeaver
Weaver.fail = true;
return;
}
break;
}
}
if (fieldDefinition.FieldType.FullName.Contains("UnityEngine.Networking.SyncListStruct"))
{
Log.Error("SyncListStruct member variable [" + fieldDefinition.FullName + "] must use a dervied class, like \"class MySyncList : SyncListStruct<MyStruct> {}\".");
Weaver.fail = true;
return;
}
if (Weaver.IsDerivedFrom(fieldDefinition.FieldType.Resolve(), Weaver.SyncListType))
{
if (fieldDefinition.IsStatic)
@ -2015,6 +2126,7 @@ namespace QNetWeaver
Weaver.fail = true;
return;
}
m_SyncVars.Add(fieldDefinition);
m_SyncLists.Add(fieldDefinition);
list.Add(ProcessSyncList(fieldDefinition, 1 << num2));
@ -2035,19 +2147,23 @@ namespace QNetWeaver
}
}
}
foreach (var fieldDefinition2 in list)
{
m_td.Fields.Add(fieldDefinition2);
m_SyncListStaticFields.Add(fieldDefinition2);
}
foreach (var item in m_SyncVarNetIds)
{
m_td.Fields.Add(item);
}
foreach (var item2 in m_SyncListInvocationFuncs)
{
m_td.Methods.Add(item2);
}
Weaver.SetNumSyncVars(m_td.FullName, num);
}
@ -2068,6 +2184,7 @@ namespace QNetWeaver
return true;
}
}
return false;
}

View File

@ -35,6 +35,7 @@ namespace QNetWeaver
{
throw new Exception("dll could not be located at " + path + "!");
}
Console.WriteLine($"Path OK!");
}
@ -45,6 +46,7 @@ namespace QNetWeaver
{
throw new Exception("Assembly " + assemblyPath + " does not exist!");
}
Console.WriteLine($"Assembly Path OK!");
}
@ -55,6 +57,7 @@ namespace QNetWeaver
{
Directory.CreateDirectory(outputDir);
}
Console.WriteLine($"Output Path OK!");
}
}

View File

@ -49,6 +49,7 @@ namespace QNetWeaver
{
text += "None";
}
var methodDefinition = new MethodDefinition(text, MethodAttributes.FamANDAssem | MethodAttributes.Family | MethodAttributes.Static | MethodAttributes.HideBySig, Weaver.voidType);
methodDefinition.Parameters.Add(new ParameterDefinition("reader", ParameterAttributes.None, Weaver.scriptDef.MainModule.ImportReference(Weaver.NetworkReaderType)));
methodDefinition.Parameters.Add(new ParameterDefinition("instance", ParameterAttributes.None, m_TypeDef));
@ -105,6 +106,7 @@ namespace QNetWeaver
{
text += "None";
}
var methodDefinition = new MethodDefinition(text, MethodAttributes.FamANDAssem | MethodAttributes.Family | MethodAttributes.Static | MethodAttributes.HideBySig, Weaver.voidType);
methodDefinition.Parameters.Add(new ParameterDefinition("writer", ParameterAttributes.None, Weaver.scriptDef.MainModule.ImportReference(Weaver.NetworkWriterType)));
methodDefinition.Parameters.Add(new ParameterDefinition("value", ParameterAttributes.None, Weaver.scriptDef.MainModule.ImportReference(m_TypeDef)));
@ -164,6 +166,7 @@ namespace QNetWeaver
return methodDefinition;
}
}
var methodDefinition2 = new MethodDefinition("SerializeItem", MethodAttributes.FamANDAssem | MethodAttributes.Family | MethodAttributes.Virtual | MethodAttributes.HideBySig, Weaver.voidType);
methodDefinition2.Parameters.Add(new ParameterDefinition("writer", ParameterAttributes.None, Weaver.scriptDef.MainModule.ImportReference(Weaver.NetworkWriterType)));
methodDefinition2.Parameters.Add(new ParameterDefinition("item", ParameterAttributes.None, m_ItemType));
@ -198,6 +201,7 @@ namespace QNetWeaver
}));
return null;
}
if (typeDefinition.IsInterface)
{
Weaver.fail = true;
@ -213,6 +217,7 @@ namespace QNetWeaver
}));
return null;
}
var writeFunc = Weaver.GetWriteFunc(fieldDefinition.FieldType);
if (writeFunc == null)
{
@ -229,16 +234,19 @@ namespace QNetWeaver
}));
return null;
}
ilprocessor.Append(ilprocessor.Create(OpCodes.Ldarg_1));
ilprocessor.Append(ilprocessor.Create(OpCodes.Ldarg_2));
ilprocessor.Append(ilprocessor.Create(OpCodes.Ldfld, fieldReference));
ilprocessor.Append(ilprocessor.Create(OpCodes.Call, writeFunc));
}
}
ilprocessor.Append(ilprocessor.Create(OpCodes.Ret));
m_TypeDef.Methods.Add(methodDefinition2);
result = methodDefinition2;
}
return result;
}
@ -252,6 +260,7 @@ namespace QNetWeaver
return methodDefinition;
}
}
var methodDefinition2 = new MethodDefinition("DeserializeItem", MethodAttributes.FamANDAssem | MethodAttributes.Family | MethodAttributes.Virtual | MethodAttributes.HideBySig, m_ItemType);
methodDefinition2.Parameters.Add(new ParameterDefinition("reader", ParameterAttributes.None, Weaver.scriptDef.MainModule.ImportReference(Weaver.NetworkReaderType)));
var ilprocessor = methodDefinition2.Body.GetILProcessor();
@ -279,12 +288,14 @@ namespace QNetWeaver
}));
return null;
}
ilprocessor.Append(ilprocessor.Create(OpCodes.Ldloca, 0));
ilprocessor.Append(ilprocessor.Create(OpCodes.Ldarg_1));
ilprocessor.Append(ilprocessor.Create(OpCodes.Call, readFunc));
ilprocessor.Append(ilprocessor.Create(OpCodes.Stfld, fieldReference));
}
}
ilprocessor.Append(ilprocessor.Create(OpCodes.Ldloc_0));
ilprocessor.Append(ilprocessor.Create(OpCodes.Ret));
m_TypeDef.Methods.Add(methodDefinition2);

View File

@ -35,13 +35,17 @@ namespace QNetWeaver
{
return false;
}
continue;
}
var typeDefinition = parent.Resolve();
result = (typeDefinition != null);
}
return result;
}
return true;
}
@ -67,6 +71,7 @@ namespace QNetWeaver
{
result = 0;
}
return result;
}
@ -91,6 +96,7 @@ namespace QNetWeaver
return methodReference;
}
}
if (variable.IsByReference)
{
Log.Error("GetWriteFunc variable.IsByReference error.");
@ -107,6 +113,7 @@ namespace QNetWeaver
{
return null;
}
methodDefinition = GenerateArrayWriteFunc(variable, writeFunc);
}
else
@ -115,8 +122,10 @@ namespace QNetWeaver
{
return NetworkWriterWriteInt32;
}
methodDefinition = GenerateWriterFunction(variable);
}
if (methodDefinition == null)
{
result = null;
@ -128,6 +137,7 @@ namespace QNetWeaver
}
}
}
return result;
}
@ -150,6 +160,7 @@ namespace QNetWeaver
{
result = null;
}
return result;
}
@ -163,6 +174,7 @@ namespace QNetWeaver
return methodReference;
}
}
var typeDefinition = variable.Resolve();
MethodReference result;
if (typeDefinition == null)
@ -186,6 +198,7 @@ namespace QNetWeaver
{
return null;
}
methodDefinition = GenerateArrayReadFunc(variable, readFunc);
}
else
@ -194,8 +207,10 @@ namespace QNetWeaver
{
return NetworkReaderReadInt32;
}
methodDefinition = GenerateReadFunction(variable);
}
if (methodDefinition == null)
{
Log.Error("GetReadFunc unable to generate function for:" + variable.FullName);
@ -207,6 +222,7 @@ namespace QNetWeaver
result = methodDefinition;
}
}
return result;
}
@ -245,6 +261,7 @@ namespace QNetWeaver
{
text += "None";
}
var methodDefinition = new MethodDefinition(text, MethodAttributes.FamANDAssem | MethodAttributes.Family | MethodAttributes.Static | MethodAttributes.HideBySig, variable);
methodDefinition.Parameters.Add(new ParameterDefinition("reader", ParameterAttributes.None, scriptDef.MainModule.ImportReference(NetworkReaderType)));
methodDefinition.Body.Variables.Add(new VariableDefinition(int32Type));
@ -289,6 +306,7 @@ namespace QNetWeaver
ilprocessor.Append(ilprocessor.Create(OpCodes.Ret));
result = methodDefinition;
}
return result;
}
@ -311,6 +329,7 @@ namespace QNetWeaver
{
text += "None";
}
var methodDefinition = new MethodDefinition(text, MethodAttributes.FamANDAssem | MethodAttributes.Family | MethodAttributes.Static | MethodAttributes.HideBySig, voidType);
methodDefinition.Parameters.Add(new ParameterDefinition("writer", ParameterAttributes.None, scriptDef.MainModule.ImportReference(NetworkWriterType)));
methodDefinition.Parameters.Add(new ParameterDefinition("value", ParameterAttributes.None, scriptDef.MainModule.ImportReference(variable)));
@ -360,6 +379,7 @@ namespace QNetWeaver
ilprocessor.Append(ilprocessor.Create(OpCodes.Ret));
result = methodDefinition;
}
return result;
}
@ -381,6 +401,7 @@ namespace QNetWeaver
{
text += "None";
}
var methodDefinition = new MethodDefinition(text, MethodAttributes.FamANDAssem | MethodAttributes.Family | MethodAttributes.Static | MethodAttributes.HideBySig, voidType);
methodDefinition.Parameters.Add(new ParameterDefinition("writer", ParameterAttributes.None, scriptDef.MainModule.ImportReference(NetworkWriterType)));
methodDefinition.Parameters.Add(new ParameterDefinition("value", ParameterAttributes.None, scriptDef.MainModule.ImportReference(variable)));
@ -405,6 +426,7 @@ namespace QNetWeaver
}));
return null;
}
if (fieldDefinition.FieldType.Resolve().IsInterface)
{
fail = true;
@ -420,6 +442,7 @@ namespace QNetWeaver
}));
return null;
}
var writeFunc = GetWriteFunc(fieldDefinition.FieldType);
if (writeFunc == null)
{
@ -434,6 +457,7 @@ namespace QNetWeaver
fail = true;
return null;
}
num += 1U;
ilprocessor.Append(ilprocessor.Create(OpCodes.Ldarg_0));
ilprocessor.Append(ilprocessor.Create(OpCodes.Ldarg_1));
@ -441,13 +465,16 @@ namespace QNetWeaver
ilprocessor.Append(ilprocessor.Create(OpCodes.Call, writeFunc));
}
}
if (num == 0U)
{
Log.Warning("The class / struct " + variable.Name + " has no public or non-static fields to serialize");
}
ilprocessor.Append(ilprocessor.Create(OpCodes.Ret));
result = methodDefinition;
}
return result;
}
@ -469,6 +496,7 @@ namespace QNetWeaver
{
text += "None";
}
var methodDefinition = new MethodDefinition(text, MethodAttributes.FamANDAssem | MethodAttributes.Family | MethodAttributes.Static | MethodAttributes.HideBySig, variable);
methodDefinition.Body.Variables.Add(new VariableDefinition(variable));
methodDefinition.Body.InitLocals = true;
@ -487,9 +515,11 @@ namespace QNetWeaver
Log.Error("The class " + variable.Name + " has no default constructor or it's private, aborting.");
return null;
}
ilprocessor.Append(ilprocessor.Create(OpCodes.Newobj, methodDefinition2));
ilprocessor.Append(ilprocessor.Create(OpCodes.Stloc_0));
}
var num = 0U;
foreach (var fieldDefinition in variable.Resolve().Fields)
{
@ -503,6 +533,7 @@ namespace QNetWeaver
{
ilprocessor.Append(ilprocessor.Create(OpCodes.Ldloc, 0));
}
var readFunc = GetReadFunc(fieldDefinition.FieldType);
if (readFunc == null)
{
@ -517,20 +548,24 @@ namespace QNetWeaver
fail = true;
return null;
}
ilprocessor.Append(ilprocessor.Create(OpCodes.Ldarg_0));
ilprocessor.Append(ilprocessor.Create(OpCodes.Call, readFunc));
ilprocessor.Append(ilprocessor.Create(OpCodes.Stfld, fieldDefinition));
num += 1U;
}
}
if (num == 0U)
{
Log.Warning("The class / struct " + variable.Name + " has no public or non-static fields to serialize");
}
ilprocessor.Append(ilprocessor.Create(OpCodes.Ldloc_0));
ilprocessor.Append(ilprocessor.Create(OpCodes.Ret));
result = methodDefinition;
}
return result;
}
@ -549,6 +584,7 @@ namespace QNetWeaver
}
}
}
return null;
}
@ -632,6 +668,7 @@ namespace QNetWeaver
ProcessInstructionMethod(moduleDef, td, md, i, methodReference, iCount);
}
}
if (i.OpCode == OpCodes.Stfld)
{
var fieldDefinition = i.Operand as FieldDefinition;
@ -707,6 +744,7 @@ namespace QNetWeaver
ilprocessor.InsertBefore(instruction, ilprocessor.Create(OpCodes.Ldstr, "[Server] function '" + md.FullName + "' called on client"));
ilprocessor.InsertBefore(instruction, ilprocessor.Create(OpCodes.Call, logWarningReference));
}
InjectGuardParameters(md, ilprocessor, instruction);
InjectGuardReturnValue(md, ilprocessor, instruction);
ilprocessor.InsertBefore(instruction, ilprocessor.Create(OpCodes.Ret));
@ -730,6 +768,7 @@ namespace QNetWeaver
ilprocessor.InsertBefore(instruction, ilprocessor.Create(OpCodes.Ldstr, "[Client] function '" + md.FullName + "' called on server"));
ilprocessor.InsertBefore(instruction, ilprocessor.Create(OpCodes.Call, logWarningReference));
}
InjectGuardParameters(md, ilprocessor, instruction);
InjectGuardReturnValue(md, ilprocessor, instruction);
ilprocessor.InsertBefore(instruction, ilprocessor.Create(OpCodes.Ret));
@ -770,6 +809,7 @@ namespace QNetWeaver
InjectClientGuard(moduleDef, td, md, false);
}
}
var num = 0;
foreach (var i in md.Body.Instructions)
{
@ -789,6 +829,7 @@ namespace QNetWeaver
{
ProcessSiteMethod(moduleDef, td, md);
}
foreach (var td2 in td.NestedTypes)
{
ProcessSiteClass(moduleDef, td2);
@ -805,6 +846,7 @@ namespace QNetWeaver
ProcessSiteClass(moduleDef, typeDefinition);
}
}
if (lists.generateContainerClass != null)
{
moduleDef.Types.Add(lists.generateContainerClass);
@ -813,11 +855,13 @@ namespace QNetWeaver
{
scriptDef.MainModule.ImportReference(method);
}
foreach (var method2 in lists.generatedWriteFunctions)
{
scriptDef.MainModule.ImportReference(method2);
}
}
Console.WriteLine(string.Concat(new object[]
{
" ProcessSitesModule ",
@ -859,6 +903,7 @@ namespace QNetWeaver
return false;
}
}
DLog(td, "Found NetworkBehaviour " + td.FullName, new object[0]);
var networkBehaviourProcessor = new NetworkBehaviourProcessor(td);
networkBehaviourProcessor.Process();
@ -883,14 +928,17 @@ namespace QNetWeaver
return scriptDef.MainModule.ImportReference(methodDefinition);
}
}
Log.Error($"ResolveMethod failed - Couldn't find {name} in {t.Name}");
foreach (var methodDefinition2 in t.Resolve().Methods)
{
Log.Error("- has method " + methodDefinition2.Name);
}
fail = true;
result = null;
}
return result;
}
@ -909,6 +957,7 @@ namespace QNetWeaver
}
}
}
Log.Error(string.Concat(new object[]
{
"ResolveMethodWithArg failed ",
@ -931,6 +980,7 @@ namespace QNetWeaver
return methodDefinition;
}
}
return null;
}
@ -955,6 +1005,7 @@ namespace QNetWeaver
}
}
}
Log.Error(string.Concat(new object[]
{
"ResolveMethodGeneric failed ",
@ -977,6 +1028,7 @@ namespace QNetWeaver
return scriptDef.MainModule.ImportReference(fieldDefinition);
}
}
return null;
}
@ -989,6 +1041,7 @@ namespace QNetWeaver
return scriptDef.MainModule.ImportReference(propertyDefinition.GetMethod);
}
}
Log.Error($"ResolveProperty failed - Couldn't find {name} in {t.Name}");
return null;
}
@ -1000,6 +1053,7 @@ namespace QNetWeaver
{
Log.Error("Vector2Type is null!");
}
vector3Type = UnityAssemblyDefinition.MainModule.GetType("UnityEngine.Vector3");
vector4Type = UnityAssemblyDefinition.MainModule.GetType("UnityEngine.Vector4");
colorType = UnityAssemblyDefinition.MainModule.GetType("UnityEngine.Color");
@ -1014,6 +1068,7 @@ namespace QNetWeaver
{
Log.Error("GameObjectType is null!");
}
transformType = UnityAssemblyDefinition.MainModule.GetType("UnityEngine.Transform");
unityObjectType = UnityAssemblyDefinition.MainModule.GetType("UnityEngine.Object");
@ -1328,6 +1383,7 @@ namespace QNetWeaver
{
return true;
}
try
{
baseType = baseType.Resolve().BaseType;
@ -1337,8 +1393,10 @@ namespace QNetWeaver
break;
}
}
result = false;
}
return result;
}
@ -1360,10 +1418,12 @@ namespace QNetWeaver
{
text = text.Substring(0, num);
}
if (text == baseClass.FullName)
{
return true;
}
try
{
baseType = baseType.Resolve().BaseType;
@ -1373,8 +1433,10 @@ namespace QNetWeaver
break;
}
}
result = false;
}
return result;
}
@ -1400,6 +1462,7 @@ namespace QNetWeaver
{
result = true;
}
return result;
}
@ -1433,6 +1496,7 @@ namespace QNetWeaver
{
break;
}
try
{
list.Insert(0, typeDefinition);
@ -1443,13 +1507,16 @@ namespace QNetWeaver
break;
}
}
var flag = false;
foreach (var td2 in list)
{
flag |= ProcessNetworkBehaviourType(td2);
}
result = flag;
}
return result;
}
@ -1471,6 +1538,7 @@ namespace QNetWeaver
flag |= ProcessMessageType(td);
break;
}
try
{
baseType = baseType.Resolve().BaseType;
@ -1480,12 +1548,15 @@ namespace QNetWeaver
break;
}
}
foreach (var td2 in td.NestedTypes)
{
flag |= CheckMessageBase(td2);
}
result = flag;
}
return result;
}
@ -1507,6 +1578,7 @@ namespace QNetWeaver
flag |= ProcessSyncListStructType(td);
break;
}
try
{
baseType = baseType.Resolve().BaseType;
@ -1516,12 +1588,15 @@ namespace QNetWeaver
break;
}
}
foreach (var td2 in td.NestedTypes)
{
flag |= CheckSyncListStruct(td2);
}
result = flag;
}
return result;
}
@ -1560,19 +1635,23 @@ namespace QNetWeaver
{
scriptDef.MainModule.SymbolReader.Dispose();
}
fail = true;
throw ex;
}
}
if (fail)
{
if (scriptDef.MainModule.SymbolReader != null)
{
scriptDef.MainModule.SymbolReader.Dispose();
}
return false;
}
}
stopwatch.Stop();
Console.WriteLine(string.Concat(new object[]
{
@ -1583,12 +1662,14 @@ namespace QNetWeaver
" milliseconds"
}));
}
if (flag)
{
foreach (var methodDefinition in lists.replacedMethods)
{
lists.replacementMethodNames.Add(methodDefinition.FullName);
}
try
{
ProcessPropertySites();
@ -1600,16 +1681,20 @@ namespace QNetWeaver
{
scriptDef.MainModule.SymbolReader.Dispose();
}
return false;
}
if (fail)
{
if (scriptDef.MainModule.SymbolReader != null)
{
scriptDef.MainModule.SymbolReader.Dispose();
}
return false;
}
var fileName = Helpers.DestinationFileFor(outputDir, assName);
var writerParameters = Helpers.GetWriterParameters(readerParameters);
if (writerParameters.SymbolWriterProvider is PdbWriterProvider)
@ -1618,12 +1703,15 @@ namespace QNetWeaver
var text = Path.ChangeExtension(assName, ".pdb");
File.Delete(text);
}
scriptDef.Write(fileName, writerParameters);
}
if (scriptDef.MainModule.SymbolReader != null)
{
scriptDef.MainModule.SymbolReader.Dispose();
}
return true;
}
@ -1650,6 +1738,7 @@ namespace QNetWeaver
Log.Error("Exception :" + ex);
return false;
}
corLib = null;
return true;
}

View File

@ -18,27 +18,16 @@ namespace QSB.Animation.NPC.Patches
public override void DoPatches()
{
QSBCore.HarmonyHelper.AddPrefix<CharacterAnimController>("OnAnimatorIK", typeof(CharacterAnimationPatches), nameof(AnimController_OnAnimatorIK));
QSBCore.HarmonyHelper.AddPrefix<CharacterAnimController>("OnZoneEntry", typeof(CharacterAnimationPatches), nameof(AnimController_OnZoneEntry));
QSBCore.HarmonyHelper.AddPrefix<CharacterAnimController>("OnZoneExit", typeof(CharacterAnimationPatches), nameof(AnimController_OnZoneExit));
QSBCore.HarmonyHelper.AddPrefix<FacePlayerWhenTalking>("OnStartConversation", typeof(CharacterAnimationPatches), nameof(FacePlayerWhenTalking_OnStartConversation));
QSBCore.HarmonyHelper.AddPrefix<CharacterDialogueTree>("StartConversation", typeof(CharacterAnimationPatches), nameof(CharacterDialogueTree_StartConversation));
QSBCore.HarmonyHelper.AddPrefix<CharacterDialogueTree>("EndConversation", typeof(CharacterAnimationPatches), nameof(CharacterDialogueTree_EndConversation));
QSBCore.HarmonyHelper.AddPrefix<KidRockController>("Update", typeof(CharacterAnimationPatches), nameof(KidRockController_Update));
Prefix(nameof(CharacterAnimController_OnAnimatorIK));
Prefix(nameof(CharacterAnimController_OnZoneEntry));
Prefix(nameof(CharacterAnimController_OnZoneExit));
Prefix(nameof(FacePlayerWhenTalking_OnStartConversation));
Prefix(nameof(CharacterDialogueTree_StartConversation));
Prefix(nameof(CharacterDialogueTree_EndConversation));
Prefix(nameof(KidRockController_Update));
}
public override void DoUnpatches()
{
QSBCore.HarmonyHelper.Unpatch<CharacterAnimController>("OnAnimatorIK");
QSBCore.HarmonyHelper.Unpatch<CharacterAnimController>("OnZoneEntry");
QSBCore.HarmonyHelper.Unpatch<CharacterAnimController>("OnZoneExit");
QSBCore.HarmonyHelper.Unpatch<FacePlayerWhenTalking>("OnStartConversation");
QSBCore.HarmonyHelper.Unpatch<CharacterDialogueTree>("StartConversation");
QSBCore.HarmonyHelper.Unpatch<CharacterDialogueTree>("EndConversation");
QSBCore.HarmonyHelper.Unpatch<KidRockController>("Update");
}
public static bool AnimController_OnAnimatorIK(
public static bool CharacterAnimController_OnAnimatorIK(
CharacterAnimController __instance,
float ___headTrackingWeight,
bool ___lookOnlyWhenTalking,
@ -59,7 +48,7 @@ namespace QSB.Animation.NPC.Patches
var player = QSBPlayerManager.GetPlayer(playerId);
var qsbObj = QSBWorldSync.GetWorldFromUnity<QSBCharacterAnimController, CharacterAnimController>(__instance); // TODO : maybe cache this somewhere... or assess how slow this is
PlayerInfo playerToUse;
PlayerInfo playerToUse = null;
if (____inConversation)
{
if (playerId == uint.MaxValue)
@ -78,18 +67,20 @@ namespace QSB.Animation.NPC.Patches
{
playerToUse = QSBPlayerManager.GetClosestPlayerToWorldPoint(qsbObj.GetPlayersInHeadZone(), __instance.transform.position);
}
else
else if (QSBPlayerManager.PlayerList.Count != 0)
{
playerToUse = QSBPlayerManager.GetClosestPlayerToWorldPoint(__instance.transform.position, true);
}
var localPosition = ____animator.transform.InverseTransformPoint(playerToUse.CameraBody.transform.position);
var localPosition = playerToUse != null
? ____animator.transform.InverseTransformPoint(playerToUse.CameraBody.transform.position)
: Vector3.zero;
var targetWeight = ___headTrackingWeight;
if (___lookOnlyWhenTalking)
{
if (!____inConversation
|| qsbObj.GetPlayersInHeadZone().Count == 0
if (!____inConversation
|| qsbObj.GetPlayersInHeadZone().Count == 0
|| !qsbObj.GetPlayersInHeadZone().Contains(playerToUse))
{
targetWeight *= 0;
@ -97,7 +88,7 @@ namespace QSB.Animation.NPC.Patches
}
else
{
if (qsbObj.GetPlayersInHeadZone().Count == 0
if (qsbObj.GetPlayersInHeadZone().Count == 0
|| !qsbObj.GetPlayersInHeadZone().Contains(playerToUse))
{
targetWeight *= 0;
@ -112,14 +103,14 @@ namespace QSB.Animation.NPC.Patches
}
public static bool AnimController_OnZoneExit(CharacterAnimController __instance)
public static bool CharacterAnimController_OnZoneExit(CharacterAnimController __instance)
{
var qsbObj = QSBWorldSync.GetWorldFromUnity<QSBCharacterAnimController, CharacterAnimController>(__instance);
QSBEventManager.FireEvent(EventNames.QSBExitHeadZone, qsbObj.ObjectId);
return false;
}
public static bool AnimController_OnZoneEntry(CharacterAnimController __instance)
public static bool CharacterAnimController_OnZoneEntry(CharacterAnimController __instance)
{
var qsbObj = QSBWorldSync.GetWorldFromUnity<QSBCharacterAnimController, CharacterAnimController>(__instance);
QSBEventManager.FireEvent(EventNames.QSBEnterHeadZone, qsbObj.ObjectId);
@ -136,6 +127,7 @@ namespace QSB.Animation.NPC.Patches
DebugLog.ToConsole($"Error - No player talking to {____dialogueTree.name}!", MessageType.Error);
return false;
}
var player = QSBPlayerManager.GetPlayer(playerId);
var distance = player.Body.transform.position - __instance.transform.position;
@ -156,6 +148,7 @@ namespace QSB.Animation.NPC.Patches
{
return true;
}
var id = QSBWorldSync.GetIdFromTypeSubset(ownerOfThis);
QSBEventManager.FireEvent(EventNames.QSBNpcAnimEvent, AnimationEvent.StartConversation, id);
return true;
@ -169,6 +162,7 @@ namespace QSB.Animation.NPC.Patches
{
return true;
}
var id = QSBWorldSync.GetIdFromTypeSubset(ownerOfThis);
QSBEventManager.FireEvent(EventNames.QSBNpcAnimEvent, AnimationEvent.EndConversation, id);
return true;
@ -184,12 +178,14 @@ namespace QSB.Animation.NPC.Patches
{
return true;
}
var qsbObj = QSBWorldSync.GetWorldObjects<QSBCharacterAnimController>().First(x => x.GetDialogueTree() == ____dialogueTree);
if (!____throwingRock && !qsbObj.InConversation() && Time.time > ____nextThrowTime)
{
__instance.GetType().GetMethod("StartRockThrow", BindingFlags.NonPublic | BindingFlags.Instance).Invoke(__instance, null);
}
return false;
}
}

View File

@ -14,10 +14,10 @@ namespace QSB.Animation.NPC.WorldObjects
public abstract CharacterDialogueTree GetDialogueTree();
public virtual void StartConversation()
public virtual void StartConversation()
=> QSBWorldSync.RaiseEvent(GetDialogueTree(), "OnStartConversation");
public virtual void EndConversation()
public virtual void EndConversation()
=> QSBWorldSync.RaiseEvent(GetDialogueTree(), "OnEndConversation");
public abstract bool InConversation();

View File

@ -8,7 +8,7 @@ namespace QSB.Animation.NPC.WorldObjects
{
private readonly List<PlayerInfo> _playersInHeadZone = new List<PlayerInfo>();
public List<PlayerInfo> GetPlayersInHeadZone()
public List<PlayerInfo> GetPlayersInHeadZone()
=> _playersInHeadZone;
public void AddPlayerToHeadZone(PlayerInfo player)
@ -17,7 +17,8 @@ namespace QSB.Animation.NPC.WorldObjects
{
return;
}
_playersInHeadZone.Add(player);
_playersInHeadZone.Add(player);
}
public void RemovePlayerFromHeadZone(PlayerInfo player)
@ -26,13 +27,14 @@ namespace QSB.Animation.NPC.WorldObjects
{
return;
}
_playersInHeadZone.Remove(player);
}
public override CharacterDialogueTree GetDialogueTree()
public override CharacterDialogueTree GetDialogueTree()
=> AttachedObject.GetValue<CharacterDialogueTree>("_dialogueTree");
public override bool InConversation()
public override bool InConversation()
=> AttachedObject.GetValue<bool>("_inConversation");
}
}

View File

@ -64,6 +64,7 @@ namespace QSB.Animation.Player
{
LoadControllers();
}
NetworkAnimator.enabled = true;
VisibleAnimator = body.GetComponent<Animator>();
Mirror = body.gameObject.AddComponent<AnimatorMirror>();
@ -158,11 +159,13 @@ namespace QSB.Animation.Player
{
return;
}
if (state)
{
SuitUp();
return;
}
SuitDown();
}
@ -172,15 +175,18 @@ namespace QSB.Animation.Player
{
return;
}
CurrentType = type;
if (_unsuitedAnimController == null)
{
DebugLog.ToConsole($"Error - Unsuited controller is null. ({PlayerId})", MessageType.Error);
}
if (_suitedAnimController == null)
{
DebugLog.ToConsole($"Error - Suited controller is null. ({PlayerId})", MessageType.Error);
}
RuntimeAnimatorController controller = default;
switch (type)
{
@ -216,6 +222,7 @@ namespace QSB.Animation.Player
controller = _riebeckController;
break;
}
InvisibleAnimator.runtimeAnimatorController = controller;
VisibleAnimator.runtimeAnimatorController = controller;
if (type != AnimationType.PlayerSuited && type != AnimationType.PlayerUnsuited)
@ -229,6 +236,7 @@ namespace QSB.Animation.Player
VisibleAnimator.SetTrigger("Grounded");
InvisibleAnimator.SetTrigger("Grounded");
}
NetworkAnimator.animator = InvisibleAnimator; // Probably not needed.
Mirror.RebuildFloatParams();
for (var i = 0; i < InvisibleAnimator.parameterCount; i++)

View File

@ -21,15 +21,18 @@ namespace QSB.Animation.Player
{
DebugLog.ToConsole($"Error - Trying to init AnimatorMirror with null \"from\".", MessageType.Error);
}
if (to == null)
{
DebugLog.ToConsole($"Error - Trying to init AnimatorMirror with null \"to\".", MessageType.Error);
}
if (to == null || from == null)
{
// Doing the return this way so you can see if one or both are null
return;
}
_from = from;
_to = to;
if (_from.runtimeAnimatorController == null)
@ -40,6 +43,7 @@ namespace QSB.Animation.Player
{
_to.runtimeAnimatorController = _from.runtimeAnimatorController;
}
foreach (var param in _from.parameters.Where(p => p.type == AnimatorControllerParameterType.Float))
{
_floatParams.Add(param.name, new AnimFloatParam());
@ -52,10 +56,12 @@ namespace QSB.Animation.Player
{
return;
}
if (_to.runtimeAnimatorController != _from.runtimeAnimatorController)
{
_to.runtimeAnimatorController = _from.runtimeAnimatorController;
}
SyncParams();
SmoothFloats();
}
@ -73,6 +79,7 @@ namespace QSB.Animation.Player
RebuildFloatParams();
break;
}
_floatParams[fromParam.name].Target = _from.GetFloat(fromParam.name);
break;

View File

@ -30,6 +30,7 @@ namespace QSB.Animation.Player
SyncLocalCrouch();
return;
}
SyncRemoteCrouch();
}
@ -39,6 +40,7 @@ namespace QSB.Animation.Player
{
return;
}
var jumpChargeFraction = _playerController.GetJumpChargeFraction();
_crouchValue = jumpChargeFraction;
}
@ -49,6 +51,7 @@ namespace QSB.Animation.Player
{
return;
}
CrouchParam.Target = _crouchValue;
CrouchParam.Smooth(CrouchSmoothTime);
var jumpChargeFraction = CrouchParam.Current;

View File

@ -21,11 +21,12 @@ namespace QSB.Animation.Player.Events
public override void OnReceiveRemote(bool server, AnimationTriggerMessage message)
{
if (!QSBCore.WorldObjectsReady)
var animationSync = QSBPlayerManager.GetSyncObject<AnimationSync>(message.AttachedNetId);
if (!QSBCore.WorldObjectsReady || animationSync != null)
{
return;
}
var animationSync = QSBPlayerManager.GetSyncObject<AnimationSync>(message.AttachedNetId);
animationSync.VisibleAnimator.SetTrigger(message.Name);
}
}

View File

@ -26,6 +26,7 @@ namespace QSB.Animation.Player.Events
{
return;
}
QSBPlayerManager.GetPlayer(message.AboutId).AnimationSync.SetAnimationType(message.EnumValue);
QSBPlayerManager.GetSyncObject<InstrumentsManager>(message.AboutId).CheckInstrumentProps(message.EnumValue);
}

View File

@ -10,8 +10,8 @@ namespace QSB.Animation.Patches
{
public override QSBPatchTypes Type => QSBPatchTypes.OnClientConnect;
public override void DoPatches() => QSBCore.HarmonyHelper.AddPrefix<PlayerAnimController>("LateUpdate", typeof(PlayerAnimationPatches), nameof(PlayerAnimController_LateUpdate));
public override void DoUnpatches() => QSBCore.HarmonyHelper.Unpatch<PlayerAnimController>("LateUpdate");
public override void DoPatches()
=> Prefix(nameof(PlayerAnimController_LateUpdate));
public static bool PlayerAnimController_LateUpdate(
PlayerAnimController __instance,
@ -37,18 +37,22 @@ namespace QSB.Animation.Patches
{
movementVector = ____playerController.GetRelativeGroundVelocity();
}
if (Mathf.Abs(movementVector.x) < 0.05f)
{
movementVector.x = 0f;
}
if (Mathf.Abs(movementVector.z) < 0.05f)
{
movementVector.z = 0f;
}
if (isFlying)
{
____ungroundedTime = Time.time;
}
var freefallMagnitude = 0f;
var timeInFreefall = 0f;
var lastGroundBody = ____playerController.GetLastGroundBody();
@ -57,6 +61,7 @@ namespace QSB.Animation.Patches
freefallMagnitude = (____playerController.GetAttachedOWRigidbody(false).GetVelocity() - lastGroundBody.GetPointVelocity(____playerController.transform.position)).magnitude;
timeInFreefall = Time.time - ____ungroundedTime;
}
____animator.SetFloat("RunSpeedX", movementVector.x / 3f);
____animator.SetFloat("RunSpeedY", movementVector.z / 3f);
____animator.SetFloat("TurnSpeed", ____playerController.GetTurning());
@ -79,6 +84,7 @@ namespace QSB.Animation.Patches
QSBEventManager.FireEvent(EventNames.QSBAnimTrigger, playerAnimationSync.AttachedNetId, "Land");
}
}
if (isGrounded)
{
var leftFootLift = ____animator.GetFloat("LeftFootLift");
@ -92,6 +98,7 @@ namespace QSB.Animation.Patches
____leftFootGrounded = false;
QSBWorldSync.RaiseEvent(__instance, "OnLeftFootLift");
}
var rightFootLift = ____animator.GetFloat("RightFootLift");
if (!____rightFootGrounded && rightFootLift < 0.333f)
{
@ -104,6 +111,7 @@ namespace QSB.Animation.Patches
QSBWorldSync.RaiseEvent(__instance, "OnRightFootLift");
}
}
____justBecameGrounded = false;
____justTookFallDamage = false;
var usingTool = Locator.GetToolModeSwapper().GetToolMode() != ToolMode.None;

View File

@ -23,16 +23,19 @@ namespace QSB.Animation.Player
{
return;
}
if (_attachedAnimator == null)
{
DebugLog.ToConsole($"Error - _attachedAnimator is null!", MessageType.Error);
return;
}
if (_lookBase == null)
{
DebugLog.ToConsole($"Error - _lookBase is null!", MessageType.Error);
return;
}
var bone = _attachedAnimator.GetBoneTransform(HumanBodyBones.Head);
// Get the camera's local rotation with respect to the player body
var lookLocalRotation = Quaternion.Inverse(_attachedAnimator.transform.rotation) * _lookBase.rotation;

View File

@ -16,7 +16,7 @@ namespace QSB.Animation.Player.Thrusters
public Vector3 LocalAcceleration => _localAcceleration;
public bool IsThrusting => _isThrusting;
public void Init(ThrusterModel model)
public void Init(ThrusterModel model)
=> _thrusterModel = model;
public void Update()

View File

@ -61,17 +61,20 @@ namespace QSB.Animation.Player.Thrusters
{
num *= _belowMaxThrustScalar;
}
_currentScale = _scaleSpring.Update(_currentScale, num, Time.deltaTime);
if (_currentScale < 0f)
{
_currentScale = 0f;
_scaleSpring.ResetVelocity();
}
if (_currentScale <= 0.001f)
{
_currentScale = 0f;
_scaleSpring.ResetVelocity();
}
transform.localScale = Vector3.one * _currentScale;
_light.range = _baseLightRadius * _currentScale;
_thrusterRenderer.enabled = _currentScale > 0f;

View File

@ -36,6 +36,7 @@ namespace QSB.Animation.Player.Thrusters
DebugLog.ToConsole($"Error - DefaultParticleSystem is null!", OWML.Common.MessageType.Error);
return;
}
_defaultMainModule = _defaultParticleSystem.main;
_defaultEmissionModule = _defaultParticleSystem.emission;
_baseDefaultEmissionRate = _defaultEmissionModule.rateOverTime.constant;
@ -73,6 +74,7 @@ namespace QSB.Animation.Player.Thrusters
{
_defaultParticleSystem.Play();
}
_defaultEmissionModule.rateOverTimeMultiplier = _baseDefaultEmissionRate * emissionThrusterScale;
_defaultParticleSystem.transform.SetPositionAndRotation(position, rotation);
if (_defaultMainModule.customSimulationSpace != hitInfo.transform)

View File

@ -9,8 +9,7 @@ namespace QSB.CampfireSync.Patches
{
public override QSBPatchTypes Type => QSBPatchTypes.OnClientConnect;
public override void DoPatches() => QSBCore.HarmonyHelper.AddPrefix<Campfire>("OnPressInteract", typeof(CampfirePatches), nameof(Campfire_OnPressInteract));
public override void DoUnpatches() => QSBCore.HarmonyHelper.Unpatch<Campfire>("OnPressInteract");
public override void DoPatches() => Prefix(nameof(Campfire_OnPressInteract));
public static bool Campfire_OnPressInteract(Campfire __instance, Campfire.State ____state)
{
@ -25,6 +24,7 @@ namespace QSB.CampfireSync.Patches
QSBEventManager.FireEvent(EventNames.QSBCampfireState, qsbCampfire.ObjectId, Campfire.State.LIT);
Locator.GetFlashlight().TurnOff(false);
}
return false;
}
}

View File

@ -30,6 +30,7 @@ namespace QSB.ConversationSync
{
DebugLog.ToConsole("Error - Font is null!", MessageType.Error);
}
_boxPrefab.GetComponent<Text>().font = font;
_boxPrefab.GetComponent<Text>().color = Color.white;
}
@ -52,6 +53,7 @@ namespace QSB.ConversationSync
DebugLog.ToConsole("Warning - Tried to send conv. event with char id -1.", MessageType.Warning);
return;
}
QSBEventManager.FireEvent(EventNames.QSBConversation, (uint)id, text, ConversationType.Character);
}
@ -68,6 +70,7 @@ namespace QSB.ConversationSync
DebugLog.ToConsole("Warning - Tried to send conv. start/end event with char id -1.", MessageType.Warning);
return;
}
QSBEventManager.FireEvent(EventNames.QSBConversationStartEnd, charId, QSBPlayerManager.LocalPlayerId, state);
}

View File

@ -28,6 +28,7 @@ namespace QSB.ConversationSync.Events
{
return;
}
switch (message.EnumValue)
{
case ConversationType.Character:
@ -45,6 +46,7 @@ namespace QSB.ConversationSync.Events
{
break;
}
var tree = QSBWorldSync.OldDialogueTrees[message.ObjectId];
UnityEngine.Object.Destroy(ConversationManager.Instance.BoxMappings[tree]);
break;

View File

@ -33,6 +33,7 @@ namespace QSB.ConversationSync.Events
{
QSBWorldSync.SetDialogueCondition(message.ConditionName, message.ConditionState);
}
DialogueConditionManager.SharedInstance.SetConditionState(message.ConditionName, message.ConditionState);
}
}

View File

@ -13,42 +13,37 @@ namespace QSB.ConversationSync.Patches
public override void DoPatches()
{
QSBCore.HarmonyHelper.AddPostfix<DialogueNode>("GetNextPage", typeof(ConversationPatches), nameof(Node_GetNextPage));
QSBCore.HarmonyHelper.AddPrefix<CharacterDialogueTree>("InputDialogueOption", typeof(ConversationPatches), nameof(Tree_InputDialogueOption));
QSBCore.HarmonyHelper.AddPrefix<CharacterDialogueTree>("StartConversation", typeof(ConversationPatches), nameof(Tree_StartConversation));
QSBCore.HarmonyHelper.AddPrefix<CharacterDialogueTree>("EndConversation", typeof(ConversationPatches), nameof(Tree_EndConversation));
Postfix(nameof(DialogueNode_GetNextPage));
Prefix(nameof(CharacterDialogueTree_InputDialogueOption));
Prefix(nameof(CharacterDialogueTree_StartConversation));
Prefix(nameof(CharacterDialogueTree_EndConversation));
}
public override void DoUnpatches()
{
QSBCore.HarmonyHelper.Unpatch<DialogueNode>("GetNextPage");
QSBCore.HarmonyHelper.Unpatch<CharacterDialogueTree>("InputDialogueOption");
QSBCore.HarmonyHelper.Unpatch<CharacterDialogueTree>("StartConversation");
QSBCore.HarmonyHelper.Unpatch<CharacterDialogueTree>("EndConversation");
}
public static void Tree_StartConversation(CharacterDialogueTree __instance)
public static void CharacterDialogueTree_StartConversation(CharacterDialogueTree __instance)
{
var index = QSBWorldSync.OldDialogueTrees.FindIndex(x => x == __instance);
if (index == -1)
{
DebugLog.ToConsole($"Warning - Index for tree {__instance.name} was -1.", MessageType.Warning);
}
QSBPlayerManager.LocalPlayer.CurrentCharacterDialogueTreeId = index;
ConversationManager.Instance.SendConvState(index, true);
}
public static bool Tree_EndConversation(CharacterDialogueTree __instance)
public static bool CharacterDialogueTree_EndConversation(CharacterDialogueTree __instance)
{
if (!__instance.enabled)
{
return false;
}
if (QSBPlayerManager.LocalPlayer.CurrentCharacterDialogueTreeId == -1)
{
DebugLog.ToConsole($"Warning - Ending conversation with CurrentDialogueId of -1! Called from {__instance.name}", MessageType.Warning);
return true;
}
ConversationManager.Instance.SendConvState(QSBPlayerManager.LocalPlayer.CurrentCharacterDialogueTreeId, false);
ConversationManager.Instance.CloseBoxCharacter(QSBPlayerManager.LocalPlayer.CurrentCharacterDialogueTreeId);
QSBPlayerManager.LocalPlayer.CurrentCharacterDialogueTreeId = -1;
@ -56,7 +51,7 @@ namespace QSB.ConversationSync.Patches
return true;
}
public static bool Tree_InputDialogueOption(int optionIndex, DialogueBoxVer2 ____currentDialogueBox)
public static bool CharacterDialogueTree_InputDialogueOption(int optionIndex, DialogueBoxVer2 ____currentDialogueBox)
{
if (optionIndex < 0)
{
@ -70,7 +65,7 @@ namespace QSB.ConversationSync.Patches
return true;
}
public static void Node_GetNextPage(string ____name, List<string> ____listPagesToDisplay, int ____currentPage)
public static void DialogueNode_GetNextPage(string ____name, List<string> ____listPagesToDisplay, int ____currentPage)
{
var key = ____name + ____listPagesToDisplay[____currentPage];
// Sending key so translation can be done on client side - should make different language-d clients compatible

View File

@ -1,9 +1,12 @@
using Harmony;
using QSB.Events;
using QSB.Patches;
using QSB.ShipSync;
using QSB.Utility;
using System.Collections.Generic;
using System.Linq;
using System.Reflection.Emit;
using UnityEngine;
namespace QSB.DeathSync.Patches
{
@ -13,26 +16,175 @@ namespace QSB.DeathSync.Patches
public override void DoPatches()
{
QSBCore.HarmonyHelper.AddPrefix<DeathManager>("KillPlayer", typeof(DeathPatches), nameof(PreFinishDeathSequence));
QSBCore.HarmonyHelper.AddPostfix<DeathManager>("KillPlayer", typeof(DeathPatches), nameof(BroadcastDeath));
QSBCore.HarmonyHelper.Transpile<ShipDetachableLeg>("Detach", typeof(DeathPatches), nameof(ReturnNull));
QSBCore.HarmonyHelper.Transpile<ShipDetachableModule>("Detach", typeof(DeathPatches), nameof(ReturnNull));
QSBCore.HarmonyHelper.EmptyMethod<ShipEjectionSystem>("OnPressInteract");
QSBCore.HarmonyHelper.AddPostfix<ShipDamageController>("Awake", typeof(DeathPatches), nameof(DamageController_Exploded));
QSBCore.HarmonyHelper.AddPrefix<DestructionVolume>("VanishShip", typeof(DeathPatches), nameof(DestructionVolume_VanishShip));
Prefix(nameof(DeathManager_KillPlayer_Prefix));
Postfix(nameof(DeathManager_KillPlayer_Postfix));
Prefix(nameof(ShipDetachableLeg_Detach));
Prefix(nameof(ShipDetachableModule_Detach));
Empty("ShipEjectionSystem_OnPressInteract");
Postfix(nameof(ShipDamageController_Awake));
Prefix(nameof(DestructionVolume_VanishShip));
Prefix(nameof(HighSpeedImpactSensor_FixedUpdate));
Prefix(nameof(PlayerResources_OnImpact));
}
public override void DoUnpatches()
public static bool ShipDetachableLeg_Detach(ref OWRigidbody __result)
{
QSBCore.HarmonyHelper.Unpatch<DeathManager>("KillPlayer");
QSBCore.HarmonyHelper.Unpatch<ShipDetachableLeg>("Detach");
QSBCore.HarmonyHelper.Unpatch<ShipDetachableModule>("Detach");
QSBCore.HarmonyHelper.Unpatch<ShipEjectionSystem>("OnPressInteract");
QSBCore.HarmonyHelper.Unpatch<ShipDamageController>("Awake");
QSBCore.HarmonyHelper.Unpatch<DestructionVolume>("VanishShip");
__result = null;
return false;
}
public static bool PreFinishDeathSequence(DeathType deathType)
public static bool ShipDetachableModule_Detach(ref OWRigidbody __result)
{
__result = null;
return false;
}
public static bool PlayerResources_OnImpact(ImpactData impact, PlayerResources __instance, float ____currentHealth)
{
if (PlayerState.IsInsideShip())
{
return false;
}
var speed = Mathf.Clamp01((impact.speed - __instance.GetMinImpactSpeed()) / (__instance.GetMaxImpactSpeed() - __instance.GetMinImpactSpeed()));
var tookDamage = __instance.ApplyInstantDamage(100f * speed, InstantDamageType.Impact);
if (tookDamage && ____currentHealth <= 0f && !PlayerState.IsDead())
{
Locator.GetDeathManager().SetImpactDeathSpeed(impact.speed);
Locator.GetDeathManager().KillPlayer(DeathType.Impact);
DebugLog.DebugWrite(string.Concat(new object[]
{
"Player killed from impact with ",
impact.otherCollider,
" attached to ",
impact.otherCollider.attachedRigidbody.gameObject.name
}));
}
return false;
}
public static bool HighSpeedImpactSensor_FixedUpdate(
HighSpeedImpactSensor __instance,
bool ____isPlayer,
ref bool ____dead,
ref bool ____dieNextUpdate,
OWRigidbody ____body,
ref float ____impactSpeed,
float ____sqrCheckSpeedThreshold,
RaycastHit[] ____raycastHits,
SectorDetector ____sectorDetector,
float ____radius,
Vector3 ____localOffset
)
{
if (____isPlayer && (PlayerState.IsAttached() || PlayerState.IsInsideShuttle() || PlayerState.UsingNomaiRemoteCamera()))
{
return false;
}
if (____dieNextUpdate && !____dead)
{
____dead = true;
____dieNextUpdate = false;
if (__instance.gameObject.CompareTag("Player"))
{
Locator.GetDeathManager().SetImpactDeathSpeed(____impactSpeed);
Locator.GetDeathManager().KillPlayer(DeathType.Impact);
}
else if (__instance.gameObject.CompareTag("Ship"))
{
__instance.GetComponent<ShipDamageController>().Explode(false);
}
}
if (____isPlayer && PlayerState.IsInsideShip())
{
var shipCenter = Locator.GetShipTransform().position + (Locator.GetShipTransform().up * 2f);
var distanceFromShip = Vector3.Distance(____body.GetPosition(), shipCenter);
if (distanceFromShip > 8f)
{
____body.SetPosition(shipCenter);
DebugLog.DebugWrite("MOVE PLAYER BACK TO SHIP CENTER");
}
if (!____dead)
{
var a = ____body.GetVelocity() - Locator.GetShipBody().GetPointVelocity(____body.GetPosition());
if (a.sqrMagnitude > ____sqrCheckSpeedThreshold)
{
____impactSpeed = a.magnitude;
____body.AddVelocityChange(-a);
DebugLog.DebugWrite("Would have killed player...");
//____dieNextUpdate = true;
DebugLog.DebugWrite(string.Concat(new object[]
{
"HIGH SPEED IMPACT: ",
__instance.name,
" hit the Ship at ",
____impactSpeed,
"m/s Dist from ship: ",
distanceFromShip
}));
}
}
return false;
}
var passiveReferenceFrame = ____sectorDetector.GetPassiveReferenceFrame();
if (!____dead && passiveReferenceFrame != null)
{
var relativeVelocity = ____body.GetVelocity() - passiveReferenceFrame.GetOWRigidBody().GetPointVelocity(____body.GetPosition());
if (relativeVelocity.sqrMagnitude > ____sqrCheckSpeedThreshold)
{
var hitCount = Physics.RaycastNonAlloc(__instance.transform.TransformPoint(____localOffset), relativeVelocity, ____raycastHits, (relativeVelocity.magnitude * Time.deltaTime) + ____radius, OWLayerMask.physicalMask, QueryTriggerInteraction.Ignore);
for (var i = 0; i < hitCount; i++)
{
if (____raycastHits[i].rigidbody.mass > 10f && !____raycastHits[i].rigidbody.Equals(____body.GetRigidbody()))
{
var owRigidbody = ____raycastHits[i].rigidbody.GetComponent<OWRigidbody>();
if (owRigidbody == null)
{
DebugLog.ToConsole("Rigidbody does not have attached OWRigidbody!!!", OWML.Common.MessageType.Error);
Debug.Break();
}
else
{
relativeVelocity = ____body.GetVelocity() - owRigidbody.GetPointVelocity(____body.GetPosition());
var a2 = Vector3.Project(relativeVelocity, ____raycastHits[i].normal);
if (a2.sqrMagnitude > ____sqrCheckSpeedThreshold)
{
____body.AddVelocityChange(-a2);
____impactSpeed = a2.magnitude;
if (!PlayerState.IsInsideTheEye())
{
____dieNextUpdate = true;
}
DebugLog.DebugWrite(string.Concat(new object[]
{
"HIGH SPEED IMPACT: ",
__instance.name,
" hit ",
____raycastHits[i].rigidbody.name,
" at ",
____impactSpeed,
"m/s RF: ",
passiveReferenceFrame.GetOWRigidBody().name
}));
break;
}
}
}
}
}
}
return false;
}
public static bool DeathManager_KillPlayer_Prefix(DeathType deathType)
{
if (RespawnOnDeath.Instance == null)
{
@ -44,15 +196,21 @@ namespace QSB.DeathSync.Patches
return true;
}
if (!ShipManager.Instance.HasAuthority)
{
RespawnOnDeath.Instance.ResetPlayer();
return false;
}
RespawnOnDeath.Instance.ResetShip();
RespawnOnDeath.Instance.ResetPlayer();
return false;
}
public static void BroadcastDeath(DeathType deathType)
public static void DeathManager_KillPlayer_Postfix(DeathType deathType)
=> QSBEventManager.FireEvent(EventNames.QSBPlayerDeath, deathType);
public static void DamageController_Exploded(ref bool ____exploded)
public static void ShipDamageController_Awake(ref bool ____exploded)
=> ____exploded = true;
public static IEnumerable<CodeInstruction> ReturnNull(IEnumerable<CodeInstruction> instructions)
@ -71,6 +229,11 @@ namespace QSB.DeathSync.Patches
return true;
}
if (!ShipManager.Instance.HasAuthority)
{
return false;
}
if (PlayerState.IsInsideShip() || PlayerState.UsingShipComputer() || PlayerState.AtFlightConsole())
{
Locator.GetDeathManager().KillPlayer(____deathType);

View File

@ -1,5 +1,6 @@
using OWML.Common;
using OWML.Utils;
using QSB.ShipSync.TransformSync;
using QSB.Utility;
using System.Linq;
using UnityEngine;
@ -30,6 +31,7 @@ namespace QSB.DeathSync
private ShipCockpitController _cockpitController;
private PlayerSpacesuit _spaceSuit;
private ShipTractorBeamSwitch _shipTractorBeam;
private SuitPickupVolume[] _suitPickupVolumes;
public void Awake() => Instance = this;
@ -40,6 +42,8 @@ namespace QSB.DeathSync
_spaceSuit = Locator.GetPlayerSuit();
_playerSpawner = FindObjectOfType<PlayerSpawner>();
_shipTractorBeam = FindObjectOfType<ShipTractorBeamSwitch>();
_suitPickupVolumes = FindObjectsOfType<SuitPickupVolume>();
_fluidDetector = Locator.GetPlayerCamera().GetComponentInChildren<FluidDetector>();
_playerSpawnPoint = GetSpawnPoint();
@ -51,6 +55,7 @@ namespace QSB.DeathSync
DebugLog.ToConsole($"Warning - Init() ran when ship was null?", MessageType.Warning);
return;
}
_shipComponents = shipTransform.GetComponentsInChildren<ShipComponent>();
_hatchController = shipTransform.GetComponentInChildren<HatchController>();
_cockpitController = shipTransform.GetComponentInChildren<ShipCockpitController>();
@ -71,6 +76,7 @@ namespace QSB.DeathSync
public void ResetPlayer()
{
DebugLog.DebugWrite($"Trying to reset player.");
if (_playerSpawnPoint == null)
{
DebugLog.ToConsole("Warning - _playerSpawnPoint is null!", MessageType.Warning);
@ -88,10 +94,44 @@ namespace QSB.DeathSync
_playerResources.SetValue("_isSuffocating", false);
_playerResources.DebugRefillResources();
_spaceSuit.RemoveSuit(true);
foreach (var pickupVolume in _suitPickupVolumes)
{
var containsSuit = pickupVolume.GetValue<bool>("_containsSuit");
var allowReturn = pickupVolume.GetValue<bool>("_allowSuitReturn");
if (!containsSuit && allowReturn)
{
var interactVolume = pickupVolume.GetValue<MultipleInteractionVolume>("_interactVolume");
var pickupSuitIndex = pickupVolume.GetValue<int>("_pickupSuitCommandIndex");
pickupVolume.SetValue("_containsSuit", true);
interactVolume.ChangePrompt(UITextType.SuitUpPrompt, pickupSuitIndex);
var suitGeometry = pickupVolume.GetValue<GameObject>("_suitGeometry");
var suitCollider = pickupVolume.GetValue<OWCollider>("_suitOWCollider");
var toolGeometries = pickupVolume.GetValue<GameObject[]>("_toolGeometry");
suitGeometry.SetActive(true);
suitCollider.SetActivation(true);
foreach (var geo in toolGeometries)
{
geo.SetActive(true);
}
}
}
}
public void ResetShip()
{
DebugLog.DebugWrite($"Trying to reset ship.");
if (!ShipTransformSync.LocalInstance.HasAuthority)
{
DebugLog.ToConsole($"Warning - Tried to reset ship when not in control!", MessageType.Warning);
return;
}
if (_shipSpawnPoint == null)
{
DebugLog.ToConsole("Warning - _shipSpawnPoint is null!", MessageType.Warning);
@ -117,6 +157,7 @@ namespace QSB.DeathSync
private void ExitShip()
{
DebugLog.DebugWrite($"Exit ship.");
_cockpitController.Invoke("ExitFlightConsole");
_cockpitController.Invoke("CompleteExitFlightConsole");
_hatchController.SetValue("_isPlayerInShip", false);
@ -132,6 +173,7 @@ namespace QSB.DeathSync
DebugLog.ToConsole($"Warning - _spawnList was null for player spawner!", MessageType.Warning);
return null;
}
return spawnList.FirstOrDefault(spawnPoint =>
spawnPoint.GetSpawnLocation() == SpawnLocation.TimberHearth
&& spawnPoint.IsShipSpawn() == isShip);

View File

@ -10,15 +10,14 @@ namespace QSB.ElevatorSync.Patches
{
public override QSBPatchTypes Type => QSBPatchTypes.OnClientConnect;
public static void StartLift(Elevator __instance)
public static void Elevator_StartLift(Elevator __instance)
{
var isGoingUp = __instance.GetValue<bool>("_goingToTheEnd");
var id = QSBWorldSync.GetIdFromUnity<QSBElevator, Elevator>(__instance);
QSBEventManager.FireEvent(EventNames.QSBStartLift, id, isGoingUp);
}
public override void DoPatches() => QSBCore.HarmonyHelper.AddPostfix<Elevator>("StartLift", typeof(ElevatorPatches), nameof(StartLift));
public override void DoUnpatches() => QSBCore.HarmonyHelper.Unpatch<Elevator>("StartLift");
public override void DoPatches()
=> Postfix(nameof(Elevator_StartLift));
}
}

View File

@ -22,6 +22,10 @@
public static string ExitQuantumMoon = "PlayerExitQuantumMoon";
public static string EnterRoastingMode = "EnterRoastingMode";
public static string ExitRoastingMode = "ExitRoastingMode";
public static string EnterFlightConsole = "EnterFlightConsole";
public static string ExitFlightConsole = "ExitFlightConsole";
public static string EnterShip = "EnterShip";
public static string ExitShip = "ExitShip";
// Custom event names -- change if you want! These can be anything, as long as both
// sides of the GlobalMessenger (fireevent and addlistener) reference the same thing.
@ -63,5 +67,15 @@
public static string QSBEnterHeadZone = "QSBEnterHeadZone";
public static string QSBExitHeadZone = "QSBExitHeadZone";
public static string QSBNpcAnimEvent = "QSBNpcAnimEvent";
public static string QSBHatchState = "QSBHatchState";
public static string QSBEnableFunnel = "QSBEnableFunnel";
public static string QSBHullImpact = "QSBHullImpact";
public static string QSBHullDamaged = "QSBHullDamaged";
public static string QSBHullChangeIntegrity = "QSBHullChangeIntegrity";
public static string QSBHullRepaired = "QSBHullRepaired";
public static string QSBHullRepairTick = "QSBHullRepairTick";
public static string QSBComponentDamaged = "QSBComponentDamaged";
public static string QSBComponentRepaired = "QSBComponentRepaired";
public static string QSBComponentRepairTick = "QSBComponentRepairTick";
}
}

View File

@ -42,6 +42,17 @@
Roasting,
MarshmallowEvent,
AnimTrigger,
NpcAnimEvent
NpcAnimEvent,
FlyShip,
OpenHatch,
EnableFunnel,
HullImpact,
HullDamaged,
HullChangeIntegrity,
HullRepaired,
HullRepairTick,
ComponentDamaged,
ComponentRepaired,
ComponentRepairTick
}
}

View File

@ -21,6 +21,7 @@ namespace QSB.Events
{
return;
}
_eventHandler = new MessageHandler<T>(Type);
_eventHandler.OnClientReceiveMessage += message => OnReceive(false, message);
_eventHandler.OnServerReceiveMessage += message => OnReceive(true, message);

View File

@ -14,6 +14,9 @@ using QSB.Player.Events;
using QSB.ProbeSync.Events;
using QSB.QuantumSync.Events;
using QSB.RoastingSync.Events;
using QSB.ShipSync.Events;
using QSB.ShipSync.Events.Component;
using QSB.ShipSync.Events.Hull;
using QSB.StatueSync.Events;
using QSB.TimeSync.Events;
using QSB.Tools.Events;
@ -76,7 +79,19 @@ namespace QSB.Events
new RevealFactEvent(),
new IdentifyFrequencyEvent(),
new IdentifySignalEvent(),
new NpcAnimationEvent()
new NpcAnimationEvent(),
// Ship
new FlyShipEvent(),
new HatchEvent(),
new FunnelEnableEvent(),
new HullImpactEvent(),
new HullDamagedEvent(),
new HullChangeIntegrityEvent(),
new HullRepairedEvent(),
new HullRepairTickEvent(),
new ComponentDamagedEvent(),
new ComponentRepairedEvent(),
new ComponentRepairTickEvent()
};
if (UnitTestDetector.IsInUnitTest)
@ -104,6 +119,7 @@ namespace QSB.Events
{
return;
}
GlobalMessenger.FireEvent(eventName);
}
@ -114,6 +130,7 @@ namespace QSB.Events
DebugLog.ToConsole($"Warning - Tried to send event {eventName} while not connected to/hosting server.", MessageType.Warning);
return;
}
GlobalMessenger<T>.FireEvent(eventName, arg);
}
@ -124,6 +141,7 @@ namespace QSB.Events
DebugLog.ToConsole($"Warning - Tried to send event {eventName} while not connected to/hosting server.", MessageType.Warning);
return;
}
GlobalMessenger<T, U>.FireEvent(eventName, arg1, arg2);
}
@ -134,6 +152,7 @@ namespace QSB.Events
DebugLog.ToConsole($"Warning - Tried to send event {eventName} while not connected to/hosting server.", MessageType.Warning);
return;
}
GlobalMessenger<T, U, V>.FireEvent(eventName, arg1, arg2, arg3);
}
@ -144,6 +163,7 @@ namespace QSB.Events
DebugLog.ToConsole($"Warning - Tried to send event {eventName} while not connected to/hosting server.", MessageType.Warning);
return;
}
GlobalMessenger<T, U, V, W>.FireEvent(eventName, arg1, arg2, arg3, arg4);
}
@ -154,6 +174,7 @@ namespace QSB.Events
DebugLog.ToConsole($"Warning - Tried to send event {eventName} while not connected to/hosting server.", MessageType.Warning);
return;
}
GlobalMessenger<T, U, V, W, X>.FireEvent(eventName, arg1, arg2, arg3, arg4, arg5);
}
@ -164,6 +185,7 @@ namespace QSB.Events
DebugLog.ToConsole($"Warning - Tried to send event {eventName} while not connected to/hosting server.", MessageType.Warning);
return;
}
GlobalMessenger<T, U, V, W, X, Y>.FireEvent(eventName, arg1, arg2, arg3, arg4, arg5, arg6);
}
}

View File

@ -9,20 +9,14 @@ namespace QSB.FrequencySync.Patches
public override void DoPatches()
{
QSBCore.HarmonyHelper.AddPostfix<AudioSignal>("IdentifyFrequency", typeof(FrequencyPatches), nameof(IdentifyFrequency));
QSBCore.HarmonyHelper.AddPostfix<AudioSignal>("IdentifySignal", typeof(FrequencyPatches), nameof(IdentifySignal));
Postfix(nameof(AudioSignal_IdentifyFrequency));
Postfix(nameof(AudioSignal_IdentifySignal));
}
public override void DoUnpatches()
{
QSBCore.HarmonyHelper.Unpatch<AudioSignal>("IdentifyFrequency");
QSBCore.HarmonyHelper.Unpatch<AudioSignal>("IdentifySignal");
}
public static void IdentifyFrequency(SignalFrequency ____frequency)
public static void AudioSignal_IdentifyFrequency(SignalFrequency ____frequency)
=> QSBEventManager.FireEvent(EventNames.QSBIdentifyFrequency, ____frequency);
public static void IdentifySignal(SignalName ____name)
public static void AudioSignal_IdentifySignal(SignalName ____name)
=> QSBEventManager.FireEvent(EventNames.QSBIdentifySignal, ____name);
}
}

View File

@ -27,6 +27,7 @@ namespace QSB.GeyserSync.Events
{
return;
}
var geyser = QSBWorldSync.GetWorldFromId<QSBGeyser>(message.ObjectId);
geyser?.SetState(message.State);
}

View File

@ -6,7 +6,6 @@ namespace QSB.GeyserSync.Patches
{
public override QSBPatchTypes Type => QSBPatchTypes.OnNonServerClientConnect;
public override void DoPatches() => QSBCore.HarmonyHelper.EmptyMethod<GeyserController>("Update");
public override void DoUnpatches() => QSBCore.HarmonyHelper.Unpatch<GeyserController>("Update");
public override void DoPatches() => Empty("GeyserController_Update");
}
}

View File

@ -29,6 +29,7 @@ namespace QSB.GeyserSync.WorldObjects
AttachedObject?.ActivateGeyser();
return;
}
AttachedObject?.DeactivateGeyser();
}
}

View File

@ -0,0 +1,15 @@
using QSB.Patches;
namespace QSB.Inputs.Patches
{
class InputPatches : QSBPatch
{
public override QSBPatchTypes Type => QSBPatchTypes.OnClientConnect;
public override void DoPatches()
=> Prefix(nameof(OWInput_Update));
public static bool OWInput_Update()
=> QSBInputManager.Instance.InputsEnabled;
}
}

View File

@ -1,6 +1,7 @@
using UnityEngine;
using QSB.Utility;
using UnityEngine;
namespace QSB
namespace QSB.Inputs
{
public class QSBInputManager : MonoBehaviour
{
@ -47,5 +48,18 @@ namespace QSB
}
}
*/
public static QSBInputManager Instance { get; private set; }
public void Start()
=> Instance = this;
public bool InputsEnabled { get; private set; } = true;
public void SetInputsEnabled(bool enabled)
{
DebugLog.DebugWrite($"INPUTS ENABLED? : {enabled}");
InputsEnabled = enabled;
}
}
}

View File

@ -78,6 +78,7 @@ namespace QSB.Instruments
// TODO : fix for instrument release
mr.sharedMaterial = null;
}
drum.transform.parent = _rootObj;
drum.transform.rotation = _rootObj.rotation;
drum.transform.localPosition = Vector3.zero;
@ -94,10 +95,12 @@ namespace QSB.Instruments
DebugLog.ToConsole("Error - Tried to start instrument on non-local player!", MessageType.Error);
return;
}
if (Player.PlayingInstrument || !Locator.GetPlayerController().IsGrounded())
{
return;
}
_savedType = Player.AnimationSync.CurrentType;
CameraManager.Instance.SwitchTo3rdPerson();
SwitchToType(type);
@ -109,6 +112,7 @@ namespace QSB.Instruments
{
return;
}
CameraManager.Instance.SwitchTo1stPerson();
SwitchToType(_savedType);
}

View File

@ -23,6 +23,7 @@ namespace QSB.Instruments.QSBCamera
{
return;
}
UpdatePosition();
UpdateInput();
UpdateRotation();
@ -43,6 +44,7 @@ namespace QSB.Instruments.QSBCamera
// Raycast didn't hit collider, get target from camera direction
localTargetPoint = RayLength * PercentToMove * localDirection;
}
var targetDistance = Vector3.Distance(origin, transform.TransformPoint(localTargetPoint));
var currentDistance = Vector3.Distance(origin, CameraObject.transform.position);
var movement = targetDistance < currentDistance

View File

@ -10,7 +10,6 @@ namespace QSB.Instruments.QSBCamera
{
public static CameraManager Instance;
public bool IsSetUp { get; private set; }
public CameraMode Mode { get; private set; }
@ -71,16 +70,19 @@ namespace QSB.Instruments.QSBCamera
Mode = CameraMode.ThirdPerson;
return;
}
if (Mode == CameraMode.ThirdPerson)
{
DebugLog.ToConsole("Warning - Already in 3rd person!", MessageType.Warning);
return;
}
if (OWInput.GetInputMode() != InputMode.Character)
{
DebugLog.ToConsole("Warning - Cannot change to 3rd person while not in Character inputmode!", MessageType.Warning);
return;
}
OWInput.ChangeInputMode(InputMode.None);
QSBEventManager.FireEvent("SwitchActiveCamera", _owCamera);
Locator.GetPlayerCamera().mainCamera.enabled = false;
@ -89,6 +91,7 @@ namespace QSB.Instruments.QSBCamera
var postProcessing = _cameraObj.AddComponent<PostProcessingBehaviour>();
postProcessing.profile = Locator.GetPlayerCamera().gameObject.GetComponent<PostProcessingBehaviour>().profile;
}
_camera.enabled = true;
Mode = CameraMode.ThirdPerson;
}
@ -102,11 +105,13 @@ namespace QSB.Instruments.QSBCamera
Mode = CameraMode.FirstPerson;
return;
}
if (Mode == CameraMode.FirstPerson)
{
DebugLog.ToConsole("Warning - Already in 1st person!", MessageType.Warning);
return;
}
OWInput.ChangeInputMode(InputMode.Character);
QSBEventManager.FireEvent("SwitchActiveCamera", Locator.GetPlayerCamera());
Locator.GetActiveCamera().mainCamera.enabled = true;

View File

@ -50,6 +50,7 @@ namespace QSB.ItemSync.Events
break;
}
itemObject.PickUpItem(itemSocket, message.AboutId);
}
}

View File

@ -42,6 +42,7 @@ namespace QSB.ItemSync.Events
DebugLog.ToConsole($"Warning - Trying to start unsocket on socket that is unoccupied! Socket:{(socketWorldObject as IWorldObject).Name}");
return;
}
socketWorldObject.RemoveFromSocket();
return;
case SocketEventType.CompleteUnsocket:

View File

@ -27,6 +27,7 @@ namespace QSB.ItemSync
DebugLog.ToConsole($"Error - Trying to run GetObject (Item) with null unity object!", MessageType.Error);
return default;
}
IQSBOWItem worldObj = null;
if (unityObject.GetType() == typeof(ScrollItem))
{
@ -48,6 +49,7 @@ namespace QSB.ItemSync
{
DebugLog.ToConsole($"Warning - couldn't work out type of OWItem {unityObject.name}.", MessageType.Warning);
}
return worldObj;
}
@ -58,6 +60,7 @@ namespace QSB.ItemSync
DebugLog.ToConsole($"Error - Trying to run GetObject (Socket) with null unity object!", MessageType.Error);
return default;
}
IQSBOWItemSocket worldObj = null;
if (unityObject.GetType() == typeof(ScrollSocket))
{
@ -79,6 +82,7 @@ namespace QSB.ItemSync
{
DebugLog.ToConsole($"Warning - couldn't work out type of OWItemSocket {unityObject.name}.", MessageType.Warning);
}
return worldObj;
}
}

View File

@ -13,20 +13,11 @@ namespace QSB.ItemSync.Patches
public override void DoPatches()
{
QSBCore.HarmonyHelper.AddPrefix<ItemTool>("MoveItemToCarrySocket", typeof(ItemPatches), nameof(ItemTool_MoveItemToCarrySocket));
QSBCore.HarmonyHelper.AddPrefix<ItemTool>("SocketItem", typeof(ItemPatches), nameof(ItemTool_SocketItem));
QSBCore.HarmonyHelper.AddPrefix<ItemTool>("StartUnsocketItem", typeof(ItemPatches), nameof(ItemTool_StartUnsocketItem));
QSBCore.HarmonyHelper.AddPrefix<ItemTool>("CompleteUnsocketItem", typeof(ItemPatches), nameof(ItemTool_CompleteUnsocketItem));
QSBCore.HarmonyHelper.AddPrefix<ItemTool>("DropItem", typeof(ItemPatches), nameof(ItemTool_DropItem));
}
public override void DoUnpatches()
{
QSBCore.HarmonyHelper.Unpatch<ItemTool>("MoveItemToCarrySocket");
QSBCore.HarmonyHelper.Unpatch<ItemTool>("SocketItem");
QSBCore.HarmonyHelper.Unpatch<ItemTool>("StartUnsocketItem");
QSBCore.HarmonyHelper.Unpatch<ItemTool>("CompleteUnsocketItem");
QSBCore.HarmonyHelper.Unpatch<ItemTool>("DropItem");
Prefix(nameof(ItemTool_MoveItemToCarrySocket));
Prefix(nameof(ItemTool_SocketItem));
Prefix(nameof(ItemTool_StartUnsocketItem));
Prefix(nameof(ItemTool_CompleteUnsocketItem));
Prefix(nameof(ItemTool_DropItem));
}
public static bool ItemTool_MoveItemToCarrySocket(OWItem item)
@ -70,10 +61,12 @@ namespace QSB.ItemSync.Patches
gameObject2 = gameObject2.transform.parent.gameObject;
sectorGroup = gameObject2.GetComponent<ISectorGroup>();
}
if (sectorGroup != null)
{
sector = sectorGroup.GetSector();
}
var parent = (detachableFragment != null)
? detachableFragment.transform
: targetRigidbody.transform;
@ -88,6 +81,7 @@ namespace QSB.ItemSync.Patches
QSBEventManager.FireEvent(EventNames.QSBDropItem, objectId, localPos, hit.normal, parentSector);
return false;
}
DebugLog.ToConsole($"Error - No sector found for rigidbody {targetRigidbody.name}!.", MessageType.Error);
return false;
}

View File

@ -27,6 +27,7 @@ namespace QSB.ItemSync.WorldObjects
var qsbObj = ItemManager.GetObject(InitialParent.GetComponent<OWItemSocket>());
InitialSocket = qsbObj;
}
QSBPlayerManager.OnRemovePlayer += OnPlayerLeave;
}
@ -38,11 +39,13 @@ namespace QSB.ItemSync.WorldObjects
{
return;
}
if (InitialSocket != null)
{
InitialSocket.PlaceIntoSocket(this);
return;
}
AttachedObject.transform.parent = InitialParent;
AttachedObject.transform.localPosition = InitialPosition;
AttachedObject.transform.localRotation = InitialRotation;
@ -63,7 +66,6 @@ namespace QSB.ItemSync.WorldObjects
HoldingPlayer = 0;
}
public virtual void PickUpItem(Transform holdTransform, uint playerId)
{
AttachedObject.PickUpItem(holdTransform);

View File

@ -34,10 +34,12 @@ namespace QSB.LogSync.Events
{
QSBWorldSync.AddFactReveal(message.FactId, message.SaveGame, message.ShowNotification);
}
if (!QSBCore.WorldObjectsReady)
{
return;
}
Locator.GetShipLogManager().RevealFact(message.FactId, message.SaveGame, message.ShowNotification);
}
}

View File

@ -7,17 +7,16 @@ namespace QSB.LogSync.Patches
{
public override QSBPatchTypes Type => QSBPatchTypes.OnClientConnect;
public static void RevealFact(string id, bool saveGame, bool showNotification, bool __result)
public static void ShipLogManager_RevealFact(string id, bool saveGame, bool showNotification, bool __result)
{
if (!__result)
{
return;
}
QSBEventManager.FireEvent(EventNames.QSBRevealFact, id, saveGame, showNotification);
}
public override void DoPatches() => QSBCore.HarmonyHelper.AddPostfix<ShipLogManager>("RevealFact", typeof(LogPatches), nameof(RevealFact));
public override void DoUnpatches() => QSBCore.HarmonyHelper.Unpatch<ShipLogManager>("RevealFact");
public override void DoPatches() => Postfix(nameof(ShipLogManager_RevealFact));
}
}

View File

@ -35,6 +35,7 @@ namespace QSB.Messaging
QNetworkServer.handlers.Remove(_eventType);
QNetworkManager.singleton.client.handlers.Remove(_eventType);
}
QNetworkServer.RegisterHandler(_eventType, OnServerReceiveMessageHandler);
QNetworkManager.singleton.client.RegisterHandler(_eventType, OnClientReceiveMessageHandler);
}
@ -45,6 +46,7 @@ namespace QSB.Messaging
{
return;
}
QNetworkServer.SendToAll(_eventType, message);
}
@ -54,6 +56,7 @@ namespace QSB.Messaging
{
return;
}
QNetworkManager.singleton.client.Send(_eventType, message);
}

View File

@ -57,15 +57,18 @@ namespace QSB.OrbSync.Events
DebugLog.ToConsole($"Error - OrbTransformSyncs is empty or null. (ID {message.ObjectId})", MessageType.Error);
return;
}
if (QSBWorldSync.OldOrbList == null || QSBWorldSync.OldOrbList.Count == 0)
{
DebugLog.ToConsole($"Error - OldOrbList is empty or null. (ID {message.ObjectId})", MessageType.Error);
return;
}
if (fromPlayer == null)
{
DebugLog.ToConsole("Error - FromPlayer is null!", MessageType.Error);
}
var orbSync = NomaiOrbTransformSync.OrbTransformSyncs
.FirstOrDefault(x => x.AttachedObject == QSBWorldSync.OldOrbList[message.ObjectId].gameObject);
if (orbSync == null)
@ -73,16 +76,19 @@ namespace QSB.OrbSync.Events
DebugLog.ToConsole($"Error - No orb found for user event. (ID {message.ObjectId})", MessageType.Error);
return;
}
var orbIdentity = orbSync.GetComponent<QNetworkIdentity>();
if (orbIdentity == null)
{
DebugLog.ToConsole($"Error - Orb identity is null. (ID {message.ObjectId})", MessageType.Error);
return;
}
if (orbIdentity.ClientAuthorityOwner != null && orbIdentity.ClientAuthorityOwner != fromPlayer)
{
orbIdentity.RemoveClientAuthority(orbIdentity.ClientAuthorityOwner);
}
orbIdentity.AssignClientAuthority(fromPlayer);
orbSync.enabled = true;
}
@ -94,16 +100,19 @@ namespace QSB.OrbSync.Events
DebugLog.ToConsole($"Error - OrbTransformSyncs is empty or null. (ID {message.ObjectId})", MessageType.Error);
return;
}
if (QSBWorldSync.OldOrbList == null || QSBWorldSync.OldOrbList.Count == 0)
{
DebugLog.ToConsole($"Error - OldOrbList is empty or null. (ID {message.ObjectId})", MessageType.Error);
return;
}
if (!NomaiOrbTransformSync.OrbTransformSyncs.Any(x => x.AttachedObject == QSBWorldSync.OldOrbList[message.ObjectId].gameObject))
{
DebugLog.ToConsole($"Error - No NomaiOrbTransformSync has AttachedOrb with objectId {message.ObjectId}!");
return;
}
var orb = NomaiOrbTransformSync.OrbTransformSyncs
.First(x => x.AttachedObject == QSBWorldSync.OldOrbList[message.ObjectId].gameObject);
orb.enabled = true;

View File

@ -28,6 +28,7 @@ namespace QSB.OrbSync
NomaiOrbTransformSync.OrbTransformSyncs.Clear();
QSBWorldSync.OldOrbList.ForEach(x => QNetworkServer.Spawn(Instantiate(QSBNetworkManager.Instance.OrbPrefab)));
}
DebugLog.DebugWrite($"Finished orb build with {QSBWorldSync.OldOrbList.Count} orbs.", MessageType.Success);
}
}

View File

@ -9,7 +9,7 @@ namespace QSB.OrbSync.Patches
{
public override QSBPatchTypes Type => QSBPatchTypes.OnClientConnect;
public static void StartDragCallEvent(bool __result, NomaiInterfaceOrb __instance)
public static void NomaiInterfaceOrb_StartDragFromPosition(bool __result, NomaiInterfaceOrb __instance)
{
if (__result)
{
@ -17,7 +17,7 @@ namespace QSB.OrbSync.Patches
}
}
public static bool CheckOrbCollision(ref bool __result, NomaiInterfaceSlot __instance, NomaiInterfaceOrb orb,
public static bool NomaiInterfaceSlot_CheckOrbCollision(ref bool __result, NomaiInterfaceSlot __instance, NomaiInterfaceOrb orb,
bool ____ignoreDraggedOrbs, float ____radius, float ____exitRadius, ref NomaiInterfaceOrb ____occupyingOrb)
{
if (____ignoreDraggedOrbs && orb.IsBeingDragged())
@ -25,6 +25,7 @@ namespace QSB.OrbSync.Patches
__result = false;
return false;
}
var orbDistance = Vector3.Distance(orb.transform.position, __instance.transform.position);
var triggerRadius = orb.IsBeingDragged() ? ____exitRadius : ____radius;
if (____occupyingOrb == null && orbDistance < ____radius)
@ -35,14 +36,17 @@ namespace QSB.OrbSync.Patches
QSBWorldSync.HandleSlotStateChange(__instance, orb, true);
QSBWorldSync.RaiseEvent(__instance, "OnSlotActivated", __instance);
}
__result = true;
return false;
}
if (____occupyingOrb == null || ____occupyingOrb != orb)
{
__result = false;
return false;
}
if (orbDistance > triggerRadius)
{
QSBWorldSync.HandleSlotStateChange(__instance, orb, false);
@ -51,20 +55,15 @@ namespace QSB.OrbSync.Patches
__result = false;
return false;
}
__result = true;
return false;
}
public override void DoPatches()
{
QSBCore.HarmonyHelper.AddPostfix<NomaiInterfaceOrb>("StartDragFromPosition", typeof(OrbPatches), nameof(StartDragCallEvent));
QSBCore.HarmonyHelper.AddPrefix<NomaiInterfaceSlot>("CheckOrbCollision", typeof(OrbPatches), nameof(CheckOrbCollision));
}
public override void DoUnpatches()
{
QSBCore.HarmonyHelper.Unpatch<NomaiInterfaceOrb>("StartDragFromPosition");
QSBCore.HarmonyHelper.Unpatch<NomaiInterfaceSlot>("CheckOrbCollision");
Postfix(nameof(NomaiInterfaceOrb_StartDragFromPosition));
Prefix(nameof(NomaiInterfaceSlot_CheckOrbCollision));
}
}
}

View File

@ -11,17 +11,11 @@ namespace QSB.OrbSync.TransformSync
public static List<NomaiOrbTransformSync> OrbTransformSyncs = new List<NomaiOrbTransformSync>();
private int _index => OrbTransformSyncs.IndexOf(this);
private bool _isReady;
public override void OnStartClient()
{
QSBSceneManager.OnSceneLoaded += (OWScene scene, bool inUniverse) => _isReady = false;
OrbTransformSyncs.Add(this);
}
public override void OnStartClient() => OrbTransformSyncs.Add(this);
protected override void OnDestroy()
{
QSBSceneManager.OnSceneLoaded -= (OWScene scene, bool inUniverse) => _isReady = false;
OrbTransformSyncs.Remove(this);
QSBSceneManager.OnSceneLoaded -= OnSceneLoaded;
}
@ -34,16 +28,24 @@ namespace QSB.OrbSync.TransformSync
private GameObject GetTransform()
{
if (_index == -1)
{
DebugLog.ToConsole($"Error - Index cannot be found.", OWML.Common.MessageType.Error);
return null;
}
if (QSBWorldSync.OldOrbList == null || QSBWorldSync.OldOrbList.Count <= _index)
{
DebugLog.ToConsole($"Error - OldOrbList is null or does not contain index {_index}.", OWML.Common.MessageType.Error);
return null;
}
if (QSBWorldSync.OldOrbList[_index] == null)
{
DebugLog.ToConsole($"Error - OldOrbList index {_index} is null.", OWML.Common.MessageType.Error);
return null;
}
return QSBWorldSync.OldOrbList[_index].gameObject;
}

View File

@ -23,6 +23,7 @@ namespace QSB.OrbSync.WorldObjects
{
return;
}
QSBEventManager.FireEvent(EventNames.QSBOrbSlot, ObjectId, orbId, state);
}
@ -32,6 +33,7 @@ namespace QSB.OrbSync.WorldObjects
{
return;
}
var occOrb = state ? QSBWorldSync.OldOrbList[orbId] : null;
AttachedObject.SetValue("_occupyingOrb", occOrb);
var ev = state ? "OnSlotActivated" : "OnSlotDeactivated";

View File

@ -1,9 +1,118 @@
namespace QSB.Patches
using Harmony;
using OWML.Common;
using OWML.Utils;
using QSB.Utility;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
namespace QSB.Patches
{
public abstract class QSBPatch
{
public abstract QSBPatchTypes Type { get; }
public abstract void DoPatches();
public abstract void DoUnpatches();
public void DoUnpatches()
{
foreach (var item in _patchedMethods)
{
DebugLog.DebugWrite($"[Unpatch] {item.DeclaringType}.{item.Name}", MessageType.Info);
Unpatch(item);
}
_patchedMethods.Clear();
}
private List<MethodInfo> _patchedMethods = new List<MethodInfo>();
public void Empty(string patchName)
{
DebugLog.DebugWrite($"[Empty] {patchName}", MessageType.Success);
var method = GetMethodInfo(patchName);
QSBCore.Helper.HarmonyHelper.EmptyMethod(method);
}
public void Prefix(string patchName)
=> DoPrefixPostfix(true, patchName);
public void Postfix(string patchName)
=> DoPrefixPostfix(false, patchName);
private void DoPrefixPostfix(bool isPrefix, string patchName)
{
var method = GetMethodInfo(patchName);
if (method != null)
{
if (isPrefix)
{
QSBCore.Helper.HarmonyHelper.AddPrefix(method, GetType(), patchName);
}
else
{
QSBCore.Helper.HarmonyHelper.AddPostfix(method, GetType(), patchName);
}
_patchedMethods.Add(method);
}
DebugLog.DebugWrite($"{(isPrefix ? "[Prefix]" : "[Postfix]")} {patchName}", method == null ? MessageType.Error : MessageType.Success);
}
private MethodInfo GetMethodInfo(string patchName)
{
var splitName = patchName.Split('_');
var typeName = splitName[0];
var methodName = splitName[1];
var type = GetFirstTypeByName(typeName);
if (type == null)
{
DebugLog.ToConsole($"Error - Couldn't find type for patch name {patchName}!", MessageType.Error);
return null;
}
var method = type.GetAnyMethod(methodName);
if (method == null)
{
DebugLog.ToConsole($"Error - Couldn't find method for patch name {patchName}!", MessageType.Error);
return null;
}
return method;
}
private Type GetFirstTypeByName(string typeName)
{
var a = typeof(OWRigidbody).Assembly;
var assemblyTypes = a.GetTypes();
for (var j = 0; j < assemblyTypes.Length; j++)
{
if (assemblyTypes[j].Name == typeName)
{
return assemblyTypes[j];
}
}
return null;
}
private void Unpatch(MethodInfo method)
{
var dictionary = typeof(HarmonySharedState).Invoke<Dictionary<MethodBase, byte[]>>("GetState", new object[0]);
var methodBase = dictionary.Keys.First(m =>
m.DeclaringType == method.DeclaringType
&& m.Name == method.Name);
var patchInfo = PatchInfoSerialization.Deserialize(dictionary.GetValueSafe(methodBase));
patchInfo.RemovePostfix(QSBCore.Helper.Manifest.UniqueName);
patchInfo.RemovePrefix(QSBCore.Helper.Manifest.UniqueName);
patchInfo.RemoveTranspiler(QSBCore.Helper.Manifest.UniqueName);
PatchFunctions.UpdateWrapper(methodBase, patchInfo, QSBCore.Helper.Manifest.UniqueName);
dictionary[methodBase] = patchInfo.Serialize();
}
}
}

View File

@ -7,6 +7,7 @@ using QSB.DeathSync.Patches;
using QSB.ElevatorSync.Patches;
using QSB.FrequencySync.Patches;
using QSB.GeyserSync.Patches;
using QSB.Inputs.Patches;
using QSB.ItemSync.Patches;
using QSB.LogSync.Patches;
using QSB.OrbSync.Patches;
@ -14,6 +15,7 @@ using QSB.Player.Patches;
using QSB.PoolSync.Patches;
using QSB.QuantumSync.Patches;
using QSB.RoastingSync.Patches;
using QSB.ShipSync.Patches;
using QSB.StatueSync.Patches;
using QSB.TimeSync.Patches;
using QSB.TranslationSync.Patches;
@ -39,7 +41,6 @@ namespace QSB.Patches
new DeathPatches(),
new ElevatorPatches(),
new OrbPatches(),
new WakeUpPatches(),
new LogPatches(),
new QuantumVisibilityPatches(),
new ServerQuantumPatches(),
@ -55,7 +56,10 @@ namespace QSB.Patches
new RoastingPatches(),
new PlayerPatches(),
new PlayerAnimationPatches(),
new CharacterAnimationPatches()
new CharacterAnimationPatches(),
new ShipPatches(),
new InputPatches(),
new TimePatches()
};
DebugLog.DebugWrite("Patch Manager ready.", MessageType.Success);

View File

@ -9,6 +9,8 @@
EnterPlatform = 4,
ExitPlatform = 5,
EnterHeadZone = 6,
ExitHeadZone = 7
ExitHeadZone = 7,
EnterShip = 8,
ExitShip = 9
}
}

View File

@ -1,6 +1,7 @@
using QSB.Animation.NPC.WorldObjects;
using QSB.Events;
using QSB.PoolSync;
using QSB.ShipSync;
using QSB.Utility;
using QSB.WorldSync;
using QSB.WorldSync.Events;
@ -21,6 +22,8 @@ namespace QSB.Player.Events
GlobalMessenger<int>.AddListener(EventNames.QSBExitPlatform, (int id) => Handler(EnterLeaveType.ExitPlatform, id));
GlobalMessenger<int>.AddListener(EventNames.QSBEnterHeadZone, (int id) => Handler(EnterLeaveType.EnterHeadZone, id));
GlobalMessenger<int>.AddListener(EventNames.QSBExitHeadZone, (int id) => Handler(EnterLeaveType.ExitHeadZone, id));
GlobalMessenger.AddListener(EventNames.EnterShip, () => Handler(EnterLeaveType.EnterShip));
GlobalMessenger.AddListener(EventNames.ExitShip, () => Handler(EnterLeaveType.ExitShip));
}
public override void CloseListener()
@ -46,6 +49,7 @@ namespace QSB.Player.Events
public override void OnReceiveRemote(bool server, EnumWorldObjectMessage<EnterLeaveType> message)
{
var player = QSBPlayerManager.GetPlayer(message.FromId);
DebugLog.DebugWrite($"{message.FromId} {message.EnumValue}", OWML.Common.MessageType.Info);
switch (message.EnumValue)
{
case EnterLeaveType.EnterMoon:
@ -74,6 +78,12 @@ namespace QSB.Player.Events
case EnterLeaveType.ExitHeadZone:
QSBWorldSync.GetWorldFromId<QSBCharacterAnimController>(message.ObjectId).RemovePlayerFromHeadZone(player);
break;
case EnterLeaveType.EnterShip:
ShipManager.Instance.AddPlayerToShip(player);
break;
case EnterLeaveType.ExitShip:
ShipManager.Instance.RemovePlayerFromShip(player);
break;
default:
DebugLog.ToConsole($"Warning - Unknown EnterLeaveType : {message.EnumValue}", OWML.Common.MessageType.Warning);
break;

View File

@ -28,6 +28,7 @@ namespace QSB.Player.Events
player.EntangledObject = null;
return;
}
var quantumObject = QSBWorldSync.GetWorldFromId<IQSBQuantumObject>(message.ObjectId);
player.EntangledObject = quantumObject;
}
@ -40,6 +41,7 @@ namespace QSB.Player.Events
player.EntangledObject = null;
return;
}
var quantumObject = QSBWorldSync.GetWorldFromId<IQSBQuantumObject>(message.ObjectId);
player.EntangledObject = quantumObject;
}

View File

@ -28,6 +28,7 @@ namespace QSB.Player.Events
QSBEventManager.FireEvent(EventNames.QSBPlayerKick, message.AboutId, KickReason.VersionNotMatching);
return;
}
var player = QSBPlayerManager.GetPlayer(message.AboutId);
player.Name = message.PlayerName;
DebugLog.ToAll($"{player.Name} joined!", MessageType.Info);

View File

@ -27,6 +27,7 @@ namespace QSB.Player.Events
{
return;
}
QSBCore.UnityEvents.FireInNUpdates(() => KickPlayer(message.AboutId), 10);
}
@ -42,9 +43,11 @@ namespace QSB.Player.Events
DebugLog.ToAll($"{QSBPlayerManager.GetPlayer(message.AboutId).Name} was kicked.");
return;
}
DebugLog.ToAll($"Player id:{message.AboutId} was kicked.");
return;
}
DebugLog.ToAll($"Kicked from server. Reason : {message.EnumValue}");
}
}

View File

@ -8,14 +8,8 @@ namespace QSB.Player.Patches
public override void DoPatches()
{
QSBCore.HarmonyHelper.AddPrefix<PlayerCrushedController>("CrushPlayer", typeof(PlayerPatches), nameof(PlayerCrushedController_CrushPlayer));
QSBCore.HarmonyHelper.AddPrefix<PauseMenuManager>("OnExitToMainMenu", typeof(PlayerPatches), nameof(PauseMenuManager_OnExitToMainMenu));
}
public override void DoUnpatches()
{
QSBCore.HarmonyHelper.Unpatch<PlayerCrushedController>("CrushPlayer");
QSBCore.HarmonyHelper.Unpatch<PauseMenuManager>("OnExitToMainMenu");
Prefix(nameof(PlayerCrushedController_CrushPlayer));
Prefix(nameof(PauseMenuManager_OnExitToMainMenu));
}
public static bool PlayerCrushedController_CrushPlayer()

View File

@ -16,11 +16,13 @@ namespace QSB.Player
{
return;
}
var controller = Locator.GetPlayerController();
if (controller == null)
{
return;
}
var collidingQuantumObject = controller.GetValue<QuantumObject>("_collidingQuantumObject");
if (_previousCollidingQuantumObject != collidingQuantumObject)
{

View File

@ -38,6 +38,7 @@ namespace QSB.Player
{
return;
}
_markerLabel = _player.Name.ToUpper();
_isReady = false;
@ -51,10 +52,12 @@ namespace QSB.Player
{
_canvasMarker.DestroyMarker();
}
if (_markerTarget != null)
{
Destroy(_markerTarget.gameObject);
}
Destroy(this);
}
}

View File

@ -67,6 +67,7 @@ namespace QSB.Player
{
return;
}
FlashLight?.UpdateState(PlayerStates.FlashlightActive);
Translator?.ChangeEquipState(PlayerStates.TranslatorEquipped);
ProbeLauncher?.ChangeEquipState(PlayerStates.ProbeLauncherEquipped);

View File

@ -41,6 +41,7 @@ namespace QSB.Player
{
markerManager.RegisterMarker(_canvasMarker, transform);
}
_canvasMarker.SetLabel(PlayerName.ToUpper());
_canvasMarker.SetColor(Color.white);
_canvasMarker.SetVisibility(false);
@ -56,6 +57,7 @@ namespace QSB.Player
{
InitMarker();
}
var a = Locator.GetActiveCamera().WorldToScreenPoint(transform.position);
var b = Locator.GetActiveCamera().WorldToScreenPoint(_playerTransform.position);
var vector = a - b;

View File

@ -20,14 +20,18 @@ namespace QSB.Player
var localInstance = PlayerTransformSync.LocalInstance;
if (localInstance == null)
{
DebugLog.ToConsole($"Error - Trying to get LocalPlayerId when the local PlayerTransformSync instance is null.", MessageType.Error);
var method = new StackTrace().GetFrame(1).GetMethod();
DebugLog.ToConsole($"Error - Trying to get LocalPlayerId when the local PlayerTransformSync instance is null." +
$"{Environment.NewLine} Called from {method.DeclaringType.Name}.{method.Name} ", MessageType.Error);
return uint.MaxValue;
}
if (localInstance.NetIdentity == null)
{
DebugLog.ToConsole($"Error - Trying to get LocalPlayerId when the local PlayerTransformSync instance's QNetworkIdentity is null.", MessageType.Error);
return uint.MaxValue;
}
return localInstance.NetIdentity.NetId.Value;
}
}
@ -52,11 +56,13 @@ namespace QSB.Player
{
return default;
}
var player = PlayerList.FirstOrDefault(x => x.PlayerId == id);
if (player != null)
{
return player;
}
var trace = new StackTrace().GetFrame(1).GetMethod();
DebugLog.DebugWrite($"Create Player : id<{id}> (Called from {trace.DeclaringType.Name}.{trace.Name})", MessageType.Info);
player = new PlayerInfo(id);
@ -110,6 +116,7 @@ namespace QSB.Player
{
cameraList.Add(LocalPlayer);
}
return cameraList;
}
@ -130,6 +137,7 @@ namespace QSB.Player
DebugLog.ToConsole($"Warning - Player {playerId} has a null player model!", MessageType.Warning);
return;
}
foreach (var renderer in player.Body.GetComponentsInChildren<Renderer>())
{
renderer.enabled = visible;
@ -150,6 +158,7 @@ namespace QSB.Player
DebugLog.DebugWrite($"Error - Cannot get closest player from empty player list.", MessageType.Error);
return null;
}
return playerList.Where(x => x.PlayerStates.IsReady).OrderBy(x => Vector3.Distance(x.Body.transform.position, worldPoint)).FirstOrDefault();
}
}

View File

@ -1,4 +1,5 @@
using QSB.Events;
using QSB.SectorSync;
using QSB.Syncs.TransformSync;
using QSB.Tools;
using QSB.Utility;
@ -8,9 +9,9 @@ namespace QSB.Player.TransformSync
{
public class PlayerCameraSync : SectoredTransformSync
{
protected override GameObject InitLocalTransform()
protected override Transform InitLocalTransform()
{
SectorSync.SetSectorDetector(Locator.GetPlayerSectorDetector());
SectorSync.Init(Locator.GetPlayerSectorDetector(), this);
var body = Locator.GetPlayerCamera().gameObject.transform;
Player.Camera = Locator.GetPlayerCamera();
@ -21,10 +22,10 @@ namespace QSB.Player.TransformSync
DebugLog.DebugWrite("PlayerCameraSync init done - Request state!");
QSBEventManager.FireEvent(EventNames.QSBPlayerStatesRequest);
return body.gameObject;
return body;
}
protected override GameObject InitRemoteTransform()
protected override Transform InitRemoteTransform()
{
var body = new GameObject("RemotePlayerCamera");
@ -39,7 +40,7 @@ namespace QSB.Player.TransformSync
Player.Camera = owcamera;
Player.CameraBody = body;
return body;
return body.transform;
}
public override bool IsReady => Locator.GetPlayerTransform() != null
@ -49,5 +50,7 @@ namespace QSB.Player.TransformSync
&& NetId.Value != 0U;
public override bool UseInterpolation => true;
public override TargetType Type => TargetType.PlayerCamera;
}
}

View File

@ -1,5 +1,6 @@
using QSB.Animation.Player;
using QSB.Instruments;
using QSB.SectorSync;
using QSB.Syncs.TransformSync;
using UnityEngine;
@ -7,9 +8,6 @@ namespace QSB.Player.TransformSync
{
public class PlayerTransformSync : SectoredTransformSync
{
public static PlayerTransformSync LocalInstance { get; private set; }
public override bool UseInterpolation => true;
static PlayerTransformSync() => AnimControllerPatch.Init();
public override void OnStartLocalPlayer()
@ -35,9 +33,9 @@ namespace QSB.Player.TransformSync
private Transform GetPlayerModel() =>
Locator.GetPlayerTransform().Find("Traveller_HEA_Player_v2");
protected override GameObject InitLocalTransform()
protected override Transform InitLocalTransform()
{
SectorSync.SetSectorDetector(Locator.GetPlayerSectorDetector());
SectorSync.Init(Locator.GetPlayerSectorDetector(), this);
var body = GetPlayerModel();
GetComponent<AnimationSync>().InitLocal(body);
@ -45,10 +43,10 @@ namespace QSB.Player.TransformSync
Player.Body = body.gameObject;
return body.gameObject;
return body;
}
protected override GameObject InitRemoteTransform()
protected override Transform InitRemoteTransform()
{
var body = Instantiate(GetPlayerModel());
Player.Body = body.gameObject;
@ -61,7 +59,7 @@ namespace QSB.Player.TransformSync
body.gameObject.AddComponent<PlayerMapMarker>().PlayerName = Player.Name;
return body.gameObject;
return body;
}
public override bool IsReady => Locator.GetPlayerTransform() != null
@ -70,5 +68,11 @@ namespace QSB.Player.TransformSync
&& Player.PlayerStates.IsReady
&& NetId.Value != uint.MaxValue
&& NetId.Value != 0U;
public static PlayerTransformSync LocalInstance { get; private set; }
public override bool UseInterpolation => true;
public override TargetType Type => TargetType.Player;
}
}

View File

@ -79,6 +79,7 @@ namespace QSB.PoolSync
s_propID_Ripple2Position = Shader.PropertyToID("_Ripple2Position");
s_propID_Ripple2Params = Shader.PropertyToID("_Ripple2Params");
}
_socket = GetComponentInChildren<SharedStoneSocket>();
if (_socket != null)
{
@ -88,6 +89,7 @@ namespace QSB.PoolSync
{
Debug.LogWarning("SharedStoneSocket not found!", this);
}
UpdatePoolRenderer();
_hologramGroup.SetActive(false);
UpdateRendererFade();
@ -101,6 +103,7 @@ namespace QSB.PoolSync
{
CustomPlatformList = new List<CustomNomaiRemoteCameraPlatform>(32);
}
CustomPlatformList.Add(this);
_playerCamera = Locator.GetPlayerCamera();
if (_socket != null)
@ -108,6 +111,7 @@ namespace QSB.PoolSync
_socket.OnSocketableRemoved += OnSocketableRemoved;
_socket.OnSocketableDonePlacing += OnSocketableDonePlacing;
}
enabled = false;
QSBPlayerManager.OnRemovePlayer += OnRemovePlayer;
}
@ -119,15 +123,18 @@ namespace QSB.PoolSync
_socket.OnSocketableRemoved -= OnSocketableRemoved;
_socket.OnSocketableDonePlacing -= OnSocketableDonePlacing;
}
if (CustomPlatformList != null)
{
CustomPlatformList.Remove(this);
}
if (_cameraState == CameraState.Connected || _cameraState == CameraState.Connecting_FadeIn || _cameraState == CameraState.Connecting_FadeOut)
{
DisconnectCamera();
SwitchToPlayerCamera();
}
QSBPlayerManager.OnRemovePlayer -= OnRemovePlayer;
}
@ -159,6 +166,7 @@ namespace QSB.PoolSync
UpdateHologramTransforms();
}
}
if (_platformActive)
{
UpdatePools(1f, _poolFillLength);
@ -167,6 +175,7 @@ namespace QSB.PoolSync
{
UpdatePools(0f, _poolEmptyLength);
}
switch (_cameraState)
{
case CameraState.WaitingForPedestalContact:
@ -175,6 +184,7 @@ namespace QSB.PoolSync
_cameraState = CameraState.Disconnected;
ConnectCamera();
}
break;
case CameraState.Connecting_FadeIn:
_transitionFade = Mathf.MoveTowards(_transitionFade, 1f, Time.deltaTime / _fadeInLength);
@ -195,6 +205,7 @@ namespace QSB.PoolSync
Locator.GetAudioMixer().MixRemoteCameraPlatform(_fadeInLength);
_cameraState = CameraState.Connecting_FadeOut;
}
break;
case CameraState.Connecting_FadeOut:
_slavePlatform._transitionFade = Mathf.MoveTowards(_slavePlatform._transitionFade, 0f, Time.deltaTime / _fadeInLength);
@ -205,6 +216,7 @@ namespace QSB.PoolSync
{
_cameraState = CameraState.Connected;
}
break;
case CameraState.Connected:
VerifySectorOccupancy();
@ -231,6 +243,7 @@ namespace QSB.PoolSync
_hologramGroup.SetActive(false);
_cameraState = CameraState.Disconnecting_FadeOut;
}
break;
case CameraState.Disconnecting_FadeOut:
_transitionFade = Mathf.MoveTowards(_transitionFade, 0f, Time.deltaTime / _fadeOutLength);
@ -239,8 +252,10 @@ namespace QSB.PoolSync
{
_cameraState = CameraState.Disconnected;
}
break;
}
if (_cameraState == CameraState.Disconnected && !_platformActive && _poolT == 0f)
{
enabled = false;
@ -256,8 +271,10 @@ namespace QSB.PoolSync
{
_slavePlatform = null;
}
return;
}
UpdatePoolRenderer();
_slavePlatform._poolT = _poolT;
_slavePlatform.UpdatePoolRenderer();
@ -276,16 +293,17 @@ namespace QSB.PoolSync
{
parentSector.AddOccupant(Locator.GetPlayerSectorDetector());
}
parentSector = parentSector.GetParentSector();
}
}
if (_slavePlatform._visualSector2 != null && !_slavePlatform._visualSector2.ContainsOccupant(DynamicOccupant.Player))
{
_slavePlatform._visualSector2.AddOccupant(Locator.GetPlayerSectorDetector());
}
}
private void UpdatePoolRenderer()
{
_poolRenderer.transform.localPosition = new Vector3(0f, _poolHeightCurve.Evaluate(_poolT), 0f);
@ -302,6 +320,7 @@ namespace QSB.PoolSync
ripplePosition.y = playerPosition.z;
rippleParams.x = 0.5f;
}
_poolRenderer.material.SetVector(s_propID_Ripple2Position, ripplePosition);
_poolRenderer.material.SetVector(s_propID_Ripple2Params, rippleParams);
}
@ -321,6 +340,7 @@ namespace QSB.PoolSync
_transitionRenderers[i].enabled = true;
}
}
_ownedCamera.SetImageEffectFade(1f - _transitionFade);
}
@ -339,6 +359,7 @@ namespace QSB.PoolSync
DebugLog.ToConsole($"Error - Gameobject for {item.Key.PlayerId} in _playerToHologram is null!", MessageType.Error);
continue;
}
var hologram = item.Value.transform.GetChild(0);
hologram.position = TransformPoint(item.Key.Body.transform.position, this, _slavePlatform);
hologram.rotation = TransformRotation(item.Key.Body.transform.rotation, this, _slavePlatform);
@ -362,10 +383,12 @@ namespace QSB.PoolSync
{
QSBEventManager.FireEvent(EventNames.QSBExitPlatform, CustomPlatformList.IndexOf(this));
}
if (_slavePlatform == null)
{
return;
}
DisconnectCamera();
_transitionStone.SetActive(false);
_slavePlatform._transitionStone.SetActive(false);
@ -374,14 +397,17 @@ namespace QSB.PoolSync
{
_transitionPedestalAnimator.PlayOpen();
}
if (_slavePlatform._pedestalAnimator != null)
{
_slavePlatform._pedestalAnimator.PlayOpen();
}
if (_slavePlatform._transitionPedestalAnimator != null)
{
_slavePlatform._transitionPedestalAnimator.PlayOpen();
}
_sharedStone = null;
_platformActive = false;
_wasLocalInBounds = false;
@ -395,17 +421,20 @@ namespace QSB.PoolSync
{
Debug.LogError("Placed an empty item or a non SharedStone in a NomaiRemoteCameraPlatform");
}
_slavePlatform = GetPlatform(_sharedStone.GetRemoteCameraID());
if (_slavePlatform == null)
{
Debug.LogError("Shared stone with Remote Camera ID: " + _sharedStone.GetRemoteCameraID() + " has no registered camera platform!");
}
if (_slavePlatform == this || !_slavePlatform.gameObject.activeSelf)
{
_sharedStone = null;
_slavePlatform = null;
return;
}
_transitionStone.SetActive(true);
_slavePlatform._transitionStone.SetActive(true);
_socket.GetPedestalAnimator().PlayClose();
@ -413,14 +442,17 @@ namespace QSB.PoolSync
{
_transitionPedestalAnimator.PlayClose();
}
if (_slavePlatform._pedestalAnimator != null)
{
_slavePlatform._pedestalAnimator.PlayClose();
}
if (_slavePlatform._transitionPedestalAnimator != null)
{
_slavePlatform._transitionPedestalAnimator.PlayClose();
}
enabled = true;
}
@ -438,6 +470,7 @@ namespace QSB.PoolSync
{
_alreadyOccupiedSectors.Add(_visualSector);
}
_slavePlatform._visualSector.AddOccupant(Locator.GetPlayerSectorDetector());
var parentSector = _slavePlatform._visualSector.GetParentSector();
while (parentSector != null)
@ -446,14 +479,17 @@ namespace QSB.PoolSync
{
_alreadyOccupiedSectors.Add(parentSector);
}
parentSector.AddOccupant(Locator.GetPlayerSectorDetector());
parentSector = parentSector.GetParentSector();
}
}
if (_slavePlatform._visualSector2 != null)
{
_slavePlatform._visualSector2.AddOccupant(Locator.GetPlayerSectorDetector());
}
if (_slavePlatform._darkZone != null)
{
_slavePlatform._darkZone.AddPlayerToZone(true);
@ -468,6 +504,7 @@ namespace QSB.PoolSync
{
_slavePlatform._visualSector.RemoveOccupant(Locator.GetPlayerSectorDetector());
}
var parentSector = _slavePlatform._visualSector.GetParentSector();
while (parentSector != null)
{
@ -475,17 +512,21 @@ namespace QSB.PoolSync
{
parentSector.RemoveOccupant(Locator.GetPlayerSectorDetector());
}
parentSector = parentSector.GetParentSector();
}
}
if (_slavePlatform._visualSector2 != null)
{
_slavePlatform._visualSector2.RemoveOccupant(Locator.GetPlayerSectorDetector());
}
if (_slavePlatform._darkZone != null)
{
_slavePlatform._darkZone.RemovePlayerFromZone(true);
}
QSBEventManager.FireEvent(EventNames.QSBExitPlatform, CustomPlatformList.IndexOf(this));
GlobalMessenger.FireEvent("ExitNomaiRemoteCamera");
_slavePlatform._ownedCamera.Deactivate();
@ -506,6 +547,7 @@ namespace QSB.PoolSync
{
return;
}
var cameraState = _cameraState;
if (cameraState != CameraState.Disconnected && cameraState != CameraState.Disconnecting_FadeOut)
{
@ -518,6 +560,7 @@ namespace QSB.PoolSync
{
_cameraState = CameraState.Connecting_FadeIn;
}
_oneShotAudioSource.PlayOneShot(AudioType.NomaiRemoteCameraEntry, 1f);
enabled = true;
}
@ -528,6 +571,7 @@ namespace QSB.PoolSync
{
return;
}
var cameraState = _cameraState;
if (cameraState != CameraState.Connected && cameraState != CameraState.Connecting_FadeOut)
{
@ -551,6 +595,7 @@ namespace QSB.PoolSync
{
return;
}
if (_pedestalAnimator.HasMadeContact())
{
ConnectCamera();
@ -569,21 +614,25 @@ namespace QSB.PoolSync
{
return;
}
_platformActive = false;
if (_pedestalAnimator != null)
{
_pedestalAnimator.PlayOpen();
}
if (_transitionPedestalAnimator != null)
{
_transitionPedestalAnimator.PlayOpen();
}
if (_slavePlatform != null)
{
if (_slavePlatform._pedestalAnimator != null)
{
_slavePlatform._pedestalAnimator.PlayOpen();
}
if (_slavePlatform._transitionPedestalAnimator != null)
{
_slavePlatform._transitionPedestalAnimator.PlayOpen();
@ -615,6 +664,7 @@ namespace QSB.PoolSync
}
}
}
return null;
}
@ -628,16 +678,19 @@ namespace QSB.PoolSync
{
return;
}
var player = QSBPlayerManager.GetPlayer(id);
if (!_playerToHologram.Any(x => x.Key == player))
{
return;
}
var hologram = _playerToHologram.First(x => x.Key == player).Value;
if (hologram.activeSelf)
{
OnRemotePlayerExit(id);
}
_playerToHologram.Remove(player);
}
@ -656,6 +709,7 @@ namespace QSB.PoolSync
_playerToHologram[player].SetActive(true);
return;
}
var hologramCopy = Instantiate(_playerHologram);
hologramCopy.parent = _playerHologram.parent;
Destroy(hologramCopy.GetChild(0).GetComponent<PlayerAnimController>());
@ -673,6 +727,7 @@ namespace QSB.PoolSync
{
DebugLog.ToConsole($"Warning - {playerId}'s VisibleAnimator is null!", MessageType.Error);
}
mirror.Init(player.AnimationSync.VisibleAnimator, hologramCopy.GetChild(0).gameObject.GetComponent<Animator>());
_playerToHologram.Add(player, hologramCopy.gameObject);
@ -686,11 +741,13 @@ namespace QSB.PoolSync
{
return;
}
var player = QSBPlayerManager.GetPlayer(playerId);
if (!_playerToHologram.ContainsKey(player))
{
return;
}
_playerToHologram[player].SetActive(false);
if (!_platformActive)

View File

@ -8,32 +8,27 @@ namespace QSB.PoolSync.Patches
public override void DoPatches()
{
QSBCore.HarmonyHelper.AddPrefix<NomaiRemoteCameraPlatform>("Awake", typeof(PoolPatches), nameof(ReturnFalse));
QSBCore.HarmonyHelper.AddPrefix<NomaiRemoteCameraPlatform>("Update", typeof(PoolPatches), nameof(ReturnFalse));
QSBCore.HarmonyHelper.AddPrefix<NomaiRemoteCameraPlatform>("OnSocketableRemoved", typeof(PoolPatches), nameof(ReturnFalse));
QSBCore.HarmonyHelper.AddPrefix<NomaiRemoteCameraPlatform>("OnSocketableDonePlacing", typeof(PoolPatches), nameof(ReturnFalse));
QSBCore.HarmonyHelper.AddPrefix<NomaiRemoteCameraPlatform>("OnPedestalContact", typeof(PoolPatches), nameof(ReturnFalse));
QSBCore.HarmonyHelper.AddPrefix<NomaiRemoteCameraStreaming>("FixedUpdate", typeof(PoolPatches), nameof(ReturnFalse));
QSBCore.HarmonyHelper.AddPrefix<NomaiRemoteCameraStreaming>("OnSectorOccupantAdded", typeof(PoolPatches), nameof(ReturnFalse));
QSBCore.HarmonyHelper.AddPrefix<NomaiRemoteCameraStreaming>("OnSectorOccupantRemoved", typeof(PoolPatches), nameof(ReturnFalse));
QSBCore.HarmonyHelper.AddPrefix<NomaiRemoteCameraStreaming>("OnEntry", typeof(PoolPatches), nameof(ReturnFalse));
QSBCore.HarmonyHelper.AddPrefix<NomaiRemoteCameraStreaming>("OnExit", typeof(PoolPatches), nameof(ReturnFalse));
Prefix(nameof(NomaiRemoteCameraPlatform_Awake));
Prefix(nameof(NomaiRemoteCameraPlatform_Update));
Prefix(nameof(NomaiRemoteCameraPlatform_OnSocketableRemoved));
Prefix(nameof(NomaiRemoteCameraPlatform_OnSocketableDonePlacing));
Prefix(nameof(NomaiRemoteCameraPlatform_OnPedestalContact));
Prefix(nameof(NomaiRemoteCameraStreaming_FixedUpdate));
Prefix(nameof(NomaiRemoteCameraStreaming_OnSectorOccupantAdded));
Prefix(nameof(NomaiRemoteCameraStreaming_OnSectorOccupantRemoved));
Prefix(nameof(NomaiRemoteCameraStreaming_OnEntry));
Prefix(nameof(NomaiRemoteCameraStreaming_OnExit));
}
public override void DoUnpatches()
{
QSBCore.HarmonyHelper.Unpatch<NomaiRemoteCameraPlatform>("Awake");
QSBCore.HarmonyHelper.Unpatch<NomaiRemoteCameraPlatform>("Update");
QSBCore.HarmonyHelper.Unpatch<NomaiRemoteCameraPlatform>("OnSocketableRemoved");
QSBCore.HarmonyHelper.Unpatch<NomaiRemoteCameraPlatform>("OnSocketableDonePlacing");
QSBCore.HarmonyHelper.Unpatch<NomaiRemoteCameraPlatform>("OnPedestalContact");
QSBCore.HarmonyHelper.Unpatch<NomaiRemoteCameraStreaming>("FixedUpdate");
QSBCore.HarmonyHelper.Unpatch<NomaiRemoteCameraStreaming>("OnSectorOccupantAdded");
QSBCore.HarmonyHelper.Unpatch<NomaiRemoteCameraStreaming>("OnSectorOccupantRemoved");
QSBCore.HarmonyHelper.Unpatch<NomaiRemoteCameraStreaming>("OnEntry");
QSBCore.HarmonyHelper.Unpatch<NomaiRemoteCameraStreaming>("OnExit");
}
public static bool ReturnFalse() => false;
public static bool NomaiRemoteCameraPlatform_Awake() => false;
public static bool NomaiRemoteCameraPlatform_Update() => false;
public static bool NomaiRemoteCameraPlatform_OnSocketableRemoved() => false;
public static bool NomaiRemoteCameraPlatform_OnSocketableDonePlacing() => false;
public static bool NomaiRemoteCameraPlatform_OnPedestalContact() => false;
public static bool NomaiRemoteCameraStreaming_FixedUpdate() => false;
public static bool NomaiRemoteCameraStreaming_OnSectorOccupantAdded() => false;
public static bool NomaiRemoteCameraStreaming_OnSectorOccupantRemoved() => false;
public static bool NomaiRemoteCameraStreaming_OnEntry() => false;
public static bool NomaiRemoteCameraStreaming_OnExit() => false;
}
}

View File

@ -11,10 +11,12 @@ namespace QSB.PoolSync
{
streaming.gameObject.AddComponent<CustomNomaiRemoteCameraStreaming>();
}
foreach (var camera in Resources.FindObjectsOfTypeAll<NomaiRemoteCamera>())
{
camera.gameObject.AddComponent<CustomNomaiRemoteCamera>();
}
foreach (var platform in Resources.FindObjectsOfTypeAll<NomaiRemoteCameraPlatform>())
{
platform.gameObject.AddComponent<CustomNomaiRemoteCameraPlatform>();

View File

@ -13,6 +13,7 @@ namespace QSB.ProbeSync
gameObject.Show();
return;
}
gameObject.Hide();
}
}

View File

@ -1,5 +1,6 @@
using OWML.Common;
using QSB.Player;
using QSB.SectorSync;
using QSB.Syncs.TransformSync;
using QSB.Tools;
using QSB.Utility;
@ -11,9 +12,6 @@ namespace QSB.ProbeSync.TransformSync
{
public static PlayerProbeSync LocalInstance { get; private set; }
protected override float DistanceLeeway => 10f;
public override bool UseInterpolation => true;
public override void OnStartAuthority()
{
DebugLog.DebugWrite($"OnStartAuthority probe");
@ -23,17 +21,17 @@ namespace QSB.ProbeSync.TransformSync
private Transform GetProbe() =>
Locator.GetProbe().transform.Find("CameraPivot").Find("Geometry");
protected override GameObject InitLocalTransform()
protected override Transform InitLocalTransform()
{
SectorSync.SetSectorDetector(Locator.GetProbe().GetSectorDetector());
SectorSync.Init(Locator.GetProbe().GetSectorDetector(), this);
var body = GetProbe();
Player.ProbeBody = body.gameObject;
return body.gameObject;
return body;
}
protected override GameObject InitRemoteTransform()
protected override Transform InitRemoteTransform()
{
var probe = GetProbe();
@ -52,7 +50,7 @@ namespace QSB.ProbeSync.TransformSync
Player.ProbeBody = body.gameObject;
return body.gameObject;
return body;
}
public override bool IsReady => Locator.GetProbe() != null
@ -61,5 +59,11 @@ namespace QSB.ProbeSync.TransformSync
&& Player.PlayerStates.IsReady
&& NetId.Value != uint.MaxValue
&& NetId.Value != 0U;
protected override float DistanceLeeway => 10f;
public override bool UseInterpolation => true;
public override TargetType Type => TargetType.Probe;
}
}

View File

@ -155,6 +155,7 @@
<Compile Include="FrequencySync\Events\IdentifySignalEvent.cs" />
<Compile Include="FrequencySync\Patches\FrequencyPatches.cs" />
<Compile Include="GeyserSync\Patches\GeyserPatches.cs" />
<Compile Include="Inputs\Patches\InputPatches.cs" />
<Compile Include="Instruments\QSBCamera\CameraController.cs" />
<Compile Include="Instruments\QSBCamera\CameraManager.cs" />
<Compile Include="Instruments\QSBCamera\CameraMode.cs" />
@ -207,7 +208,7 @@
<Compile Include="Player\PlayerSyncObject.cs" />
<Compile Include="PoolSync\Patches\PoolPatches.cs" />
<Compile Include="PoolSync\PoolManager.cs" />
<Compile Include="QSBInputManager.cs" />
<Compile Include="Inputs\QSBInputManager.cs" />
<Compile Include="QSBNetworkLobby.cs" />
<Compile Include="Patches\QSBPatch.cs" />
<Compile Include="Patches\QSBPatchTypes.cs" />
@ -238,6 +239,28 @@
<Compile Include="QuantumSync\QuantumManager.cs" />
<Compile Include="QuantumSync\Patches\QuantumVisibilityPatches.cs" />
<Compile Include="QuantumSync\Patches\ServerQuantumPatches.cs" />
<Compile Include="SectorSync\TargetType.cs" />
<Compile Include="ShipSync\ComponentType.cs" />
<Compile Include="ShipSync\Events\Component\ComponentDamagedEvent.cs" />
<Compile Include="ShipSync\Events\Component\ComponentRepairedEvent.cs" />
<Compile Include="ShipSync\Events\Component\ComponentRepairTickEvent.cs" />
<Compile Include="ShipSync\Events\FunnelEnableEvent.cs" />
<Compile Include="ShipSync\Events\Hull\HullChangeIntegrityEvent.cs" />
<Compile Include="ShipSync\Events\Hull\HullChangeIntegrityMessage.cs" />
<Compile Include="ShipSync\Events\Hull\HullDamagedEvent.cs" />
<Compile Include="ShipSync\Events\Hull\HullImpactEvent.cs" />
<Compile Include="ShipSync\Events\Hull\HullImpactMessage.cs" />
<Compile Include="ShipSync\Events\Hull\HullRepairedEvent.cs" />
<Compile Include="ShipSync\Events\Hull\HullRepairTickEvent.cs" />
<Compile Include="ShipSync\Events\ImpactDataMessage.cs" />
<Compile Include="ShipSync\Events\RepairTickMessage.cs" />
<Compile Include="ShipSync\WorldObjects\QSBShipComponent.cs" />
<Compile Include="ShipSync\WorldObjects\QSBShipHull.cs" />
<Compile Include="Syncs\ISectoredSync.cs" />
<Compile Include="Syncs\ISync.cs" />
<Compile Include="Syncs\RigidbodySync\UnparentedBaseRigidbodySync.cs" />
<Compile Include="Syncs\RigidbodySync\SectoredRigidbodySync.cs" />
<Compile Include="TimeSync\Patches\TimePatches.cs" />
<Compile Include="Utility\CustomRelativisticParticleSystem.cs" />
<Compile Include="RoastingSync\QSBMarshmallow.cs" />
<Compile Include="RoastingSync\Events\EnterExitRoastingEvent.cs" />
@ -245,13 +268,17 @@
<Compile Include="RoastingSync\MarshmallowEventType.cs" />
<Compile Include="RoastingSync\Patches\RoastingPatches.cs" />
<Compile Include="SectorSync\FakeSector.cs" />
<Compile Include="ShipSync\Events\FlyShipEvent.cs" />
<Compile Include="ShipSync\Events\HatchEvent.cs" />
<Compile Include="ShipSync\Patches\ShipPatches.cs" />
<Compile Include="ShipSync\ShipManager.cs" />
<Compile Include="StatueSync\Events\StartStatueEvent.cs" />
<Compile Include="StatueSync\Events\StartStatueMessage.cs" />
<Compile Include="StatueSync\Patches\StatuePatches.cs" />
<Compile Include="StatueSync\StatueManager.cs" />
<Compile Include="RoastingSync\TransformSync\RoastingStickTransformSync.cs" />
<Compile Include="Syncs\TransformSync\BaseTransformSync.cs" />
<Compile Include="Syncs\TransformSync\IntermediaryTransform.cs" />
<Compile Include="Syncs\IntermediaryTransform.cs" />
<Compile Include="Syncs\TransformSync\SectoredTransformSync.cs" />
<Compile Include="Syncs\TransformSync\UnparentedBaseTransformSync.cs" />
<Compile Include="TranslationSync\Events\SetAsTranslatedEvent.cs" />
@ -264,7 +291,6 @@
<Compile Include="TranslationSync\Patches\SpiralPatches.cs" />
<Compile Include="TimeSync\TimeSyncType.cs" />
<Compile Include="TimeSync\TimeSyncUI.cs" />
<Compile Include="TimeSync\Patches\WakeUpPatches.cs" />
<Compile Include="Tools\Events\PlayerFlashlightEvent.cs" />
<Compile Include="Player\Events\PlayerJoinEvent.cs" />
<Compile Include="ProbeSync\Events\PlayerProbeEvent.cs" />
@ -285,6 +311,7 @@
<Compile Include="SectorSync\SectorSync.cs" />
<Compile Include="Utility\CustomCallbacks.cs" />
<Compile Include="Utility\DebugBoxManager.cs" />
<Compile Include="Utility\DebugGUI.cs" />
<Compile Include="Utility\ZOverride.cs" />
<Compile Include="Utility\Extensions.cs" />
<Compile Include="Utility\GlobalMessenger4Args.cs" />

View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<GameDir>E:\Epic\Epic Games\OuterWilds</GameDir>
<GameDir>D:\EpicGames\OuterWilds</GameDir>
<OwmlDir>C:\Users\Henry\AppData\Roaming\OuterWildsModManager\OWML</OwmlDir>
<ProjectView>ShowAllFiles</ProjectView>
</PropertyGroup>

View File

@ -7,16 +7,16 @@ using QSB.CampfireSync;
using QSB.ConversationSync;
using QSB.ElevatorSync;
using QSB.GeyserSync;
using QSB.Inputs;
using QSB.ItemSync;
using QSB.OrbSync;
using QSB.Patches;
using QSB.Player;
using QSB.Player.TransformSync;
using QSB.PoolSync;
using QSB.ProbeSync.TransformSync;
using QSB.QuantumSync;
using QSB.QuantumSync.WorldObjects;
using QSB.SectorSync;
using QSB.ShipSync;
using QSB.StatueSync;
using QSB.TimeSync;
using QSB.TranslationSync;
@ -24,9 +24,6 @@ using QSB.Utility;
using QSB.WorldSync;
using QuantumUNET;
using QuantumUNET.Components;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using UnityEngine;
/*
@ -52,31 +49,23 @@ namespace QSB
public class QSBCore : ModBehaviour
{
public static IModHelper Helper { get; private set; }
public static IHarmonyHelper HarmonyHelper => Helper.HarmonyHelper;
public static IModUnityEvents UnityEvents => Helper.Events.Unity;
public static string DefaultServerIP { get; private set; }
public static int Port { get; private set; }
public static bool DebugMode { get; private set; }
public static bool ShowLinesInDebug { get; private set; }
public static int SocketedObjToDebug { get; private set; }
public static AssetBundle NetworkAssetBundle { get; private set; }
public static AssetBundle InstrumentAssetBundle { get; private set; }
public static AssetBundle ConversationAssetBundle { get; private set; }
public static bool WorldObjectsReady => WorldObjectManager.AllReady;
public static bool WorldObjectsReady => WorldObjectManager.AllReady && IsInMultiplayer && PlayerTransformSync.LocalInstance != null;
public static bool IsServer => QNetworkServer.active;
public static bool IsInMultiplayer => QNetworkManager.singleton.isNetworkActive;
public static string QSBVersion => Helper.Manifest.Version;
public static GameObject GameObjectInstance => _thisInstance.gameObject;
private static QSBCore _thisInstance;
private const float _debugLineSpacing = 11f;
public void Awake()
{
Application.runInBackground = true;
_thisInstance = this;
var instance = TextTranslation.Get().GetValue<TextTranslation.TranslationTable>("m_table");
instance.theUITable[(int)UITextType.PleaseUseController] =
"<color=orange>Quantum Space Buddies</color> is best experienced with friends...";
@ -85,7 +74,7 @@ namespace QSB
public void Start()
{
Helper = ModHelper;
DebugLog.ToConsole($"* Start of QSB version {Helper.Manifest.Version} - authored by {Helper.Manifest.Author}", MessageType.Info);
DebugLog.ToConsole($"* Start of QSB version {QSBVersion} - authored by {Helper.Manifest.Author}", MessageType.Info);
NetworkAssetBundle = Helper.Assets.LoadBundle("assets/network");
InstrumentAssetBundle = Helper.Assets.LoadBundle("assets/instruments");
@ -101,6 +90,7 @@ namespace QSB
gameObject.AddComponent<TimeSyncUI>();
gameObject.AddComponent<RepeatingManager>();
gameObject.AddComponent<PlayerEntanglementWatcher>();
gameObject.AddComponent<DebugGUI>();
// WorldObject managers
gameObject.AddComponent<QuantumManager>();
@ -114,6 +104,7 @@ namespace QSB
gameObject.AddComponent<PoolManager>();
gameObject.AddComponent<CampfireManager>();
gameObject.AddComponent<CharacterAnimManager>();
gameObject.AddComponent<ShipManager>();
DebugBoxManager.Init();
@ -126,124 +117,6 @@ namespace QSB
public void Update() =>
QNetworkIdentity.UNetStaticUpdate();
public void OnGUI()
{
if (!DebugMode)
{
return;
}
var offset = 10f;
GUI.Label(new Rect(220, 10, 200f, 20f), $"FPS : {Mathf.Round(1f / Time.smoothDeltaTime)}");
offset += _debugLineSpacing;
GUI.Label(new Rect(220, offset, 200f, 20f), $"HasWokenUp : {WorldObjectsReady}");
offset += _debugLineSpacing;
if (WakeUpSync.LocalInstance != null)
{
GUI.Label(new Rect(220, offset, 200f, 20f), $"Time Difference : {WakeUpSync.LocalInstance.GetTimeDifference()}");
offset += _debugLineSpacing;
GUI.Label(new Rect(220, offset, 200f, 20f), $"Timescale : {OWTime.GetTimeScale()}");
offset += _debugLineSpacing;
}
if (!WorldObjectsReady)
{
return;
}
var offset3 = 10f;
var playerSector = PlayerTransformSync.LocalInstance.ReferenceSector;
var playerText = playerSector == null ? "NULL" : playerSector.Name;
GUI.Label(new Rect(420, offset3, 400f, 20f), $"Current sector : {playerText}");
offset3 += _debugLineSpacing;
var probeSector = PlayerProbeSync.LocalInstance.ReferenceSector;
var probeText = probeSector == null ? "NULL" : probeSector.Name;
GUI.Label(new Rect(420, offset3, 400f, 20f), $"Probe sector : {probeText}");
offset3 += _debugLineSpacing;
var offset2 = 10f;
GUI.Label(new Rect(620, offset2, 200f, 20f), $"Owned Objects :");
offset2 += _debugLineSpacing;
foreach (var obj in QSBWorldSync.GetWorldObjects<IQSBQuantumObject>().Where(x => x.ControllingPlayer == QSBPlayerManager.LocalPlayerId))
{
GUI.Label(new Rect(620, offset2, 200f, 20f), $"- {(obj as IWorldObject).Name}, {obj.ControllingPlayer}, {obj.IsEnabled}");
offset2 += _debugLineSpacing;
}
if (QSBSceneManager.CurrentScene != OWScene.SolarSystem)
{
return;
}
GUI.Label(new Rect(220, offset, 200f, 20f), $"Probe Active : {Locator.GetProbe().gameObject.activeInHierarchy}");
offset += _debugLineSpacing;
GUI.Label(new Rect(220, offset, 200f, 20f), $"Player data :");
offset += _debugLineSpacing;
foreach (var player in QSBPlayerManager.PlayerList.Where(x => x.PlayerStates.IsReady))
{
var networkTransform = player.TransformSync;
var sector = networkTransform.ReferenceSector;
GUI.Label(new Rect(220, offset, 400f, 20f), $"- {player.PlayerId} : {networkTransform.transform.localPosition} from {(sector == null ? "NULL" : sector.Name)}");
offset += _debugLineSpacing;
GUI.Label(new Rect(220, offset, 400f, 20f), $"- LocalAccel : {player.JetpackAcceleration?.LocalAcceleration}");
offset += _debugLineSpacing;
GUI.Label(new Rect(220, offset, 400f, 20f), $"- Thrusting : {player.JetpackAcceleration?.IsThrusting}");
offset += _debugLineSpacing;
}
if (SocketedObjToDebug == -1)
{
return;
}
// Used for diagnosing specific socketed objects.
// 110 = Cave Twin entanglement shard
// 342 = Timber Hearth museum shard
var socketedObject = QSBWorldSync.GetWorldFromId<QSBSocketedQuantumObject>(SocketedObjToDebug);
GUI.Label(new Rect(220, offset, 200f, 20f), $"{SocketedObjToDebug} Controller : {socketedObject.ControllingPlayer}");
offset += _debugLineSpacing;
GUI.Label(new Rect(220, offset, 200f, 20f), $"{SocketedObjToDebug} Illuminated : {socketedObject.AttachedObject.IsIlluminated()}");
offset += _debugLineSpacing;
var socketedTrackers = socketedObject.AttachedObject.GetComponentsInChildren<ShapeVisibilityTracker>();
if (socketedTrackers == null || socketedTrackers.Length == 0)
{
GUI.Label(new Rect(220, offset, 200f, 20f), $"- List is null or empty.");
return;
}
if (socketedTrackers.Any(x => x is null))
{
GUI.Label(new Rect(220, offset, 200f, 20f), $"- Uses a null.");
return;
}
GUI.Label(new Rect(220, offset, 200f, 20f), $"Visible by :");
offset += _debugLineSpacing;
foreach (var player in QSBPlayerManager.GetPlayersWithCameras())
{
GUI.Label(new Rect(220, offset, 200f, 20f), $" - {player.PlayerId} : {socketedTrackers.Any(x => (bool)x.GetType().GetMethod("IsInFrustum", BindingFlags.NonPublic | BindingFlags.Instance).Invoke(x, new object[] { player.Camera.GetFrustumPlanes() }))}");
offset += _debugLineSpacing;
}
GUI.Label(new Rect(220, offset, 200f, 20f), $"Entangled Players :");
offset += _debugLineSpacing;
foreach (var player in QuantumManager.GetEntangledPlayers(socketedObject.AttachedObject))
{
GUI.Label(new Rect(220, offset, 200f, 20f), $" - {player.PlayerId}");
offset += _debugLineSpacing;
}
var sockets = socketedObject.AttachedObject.GetValue<List<QuantumSocket>>("_socketList");
foreach (var socket in sockets)
{
GUI.Label(new Rect(220, offset, 200f, 20f), $"- {socket.name} :");
offset += _debugLineSpacing;
GUI.Label(new Rect(220, offset, 200f, 20f), $" - Visible:{socket.GetVisibilityObject().IsVisible()}");
offset += _debugLineSpacing;
GUI.Label(new Rect(220, offset, 200f, 20f), $" - Illuminated:{socket.GetVisibilityObject().IsIlluminated()}");
offset += _debugLineSpacing;
GUI.Label(new Rect(220, offset, 200f, 20f), $" - Occupied?:{socket.IsOccupied()}");
offset += _debugLineSpacing;
}
}
public override void Configure(IModConfig config)
{
DefaultServerIP = config.GetSettingsValue<string>("defaultServerIP");
@ -252,9 +125,33 @@ namespace QSB
{
QSBNetworkManager.Instance.networkPort = Port;
}
DebugMode = config.GetSettingsValue<bool>("debugMode");
ShowLinesInDebug = config.GetSettingsValue<bool>("showLinesInDebug");
SocketedObjToDebug = config.GetSettingsValue<int>("socketedObjToDebug");
}
}
}
}
/*
* _nebula's music thanks
* I listen to music constantly while programming/working - here's my thanks to them for keeping me entertained :P
*
* Wintergatan
* HOME
* C418
* Lupus Nocte
* Max Cooper
* Darren Korb
* Harry Callaghan
* Toby Fox
* Andrew Prahlow
* Valve (Mike Morasky, Kelly Bailey)
* Joel Nielsen
* Vulfpeck
* Detektivbyrån
* Ben Prunty
* ConcernedApe
* Jake Chudnow
* Murray Gold
* Teleskärm
*/

View File

@ -11,6 +11,8 @@ namespace QSB
public bool CanEditName { get; set; }
public string PlayerName { get; private set; }
// TODO : Could delete a lot of this - shouldnt be possible to not have a profile and still play
private readonly string[] _defaultNames = {
"Arkose",
"Chert",

View File

@ -32,14 +32,14 @@ namespace QSB
public event Action OnNetworkManagerReady;
public bool IsReady { get; private set; }
public GameObject OrbPrefab { get; set; }
public GameObject OrbPrefab { get; private set; }
public GameObject ShipPrefab { get; private set; }
private const int MaxConnections = 128;
private const int MaxBufferedPackets = 64;
private QSBNetworkLobby _lobby;
private AssetBundle _assetBundle;
private GameObject _shipPrefab;
private GameObject _cameraPrefab;
private GameObject _probePrefab;
private GameObject _stickPrefab;
@ -63,18 +63,18 @@ namespace QSB
playerPrefab.AddComponent<JetpackAccelerationSync>();
playerPrefab.AddComponent<InstrumentsManager>();
_shipPrefab = _assetBundle.LoadAsset<GameObject>("assets/networkship.prefab");
SetupNetworkId(_shipPrefab);
SetupNetworkTransform(_shipPrefab);
_shipPrefab.AddComponent<ShipTransformSync>();
spawnPrefabs.Add(_shipPrefab);
_cameraPrefab = _assetBundle.LoadAsset<GameObject>("assets/networkcameraroot.prefab");
SetupNetworkId(_cameraPrefab);
SetupNetworkTransform(_cameraPrefab);
_cameraPrefab.AddComponent<PlayerCameraSync>();
spawnPrefabs.Add(_cameraPrefab);
ShipPrefab = _assetBundle.LoadAsset<GameObject>("assets/networkship.prefab");
SetupNetworkId(ShipPrefab);
SetupNetworkTransform(_cameraPrefab);
ShipPrefab.AddComponent<ShipTransformSync>();
spawnPrefabs.Add(ShipPrefab);
_probePrefab = _assetBundle.LoadAsset<GameObject>("assets/networkprobe.prefab");
SetupNetworkId(_probePrefab);
SetupNetworkTransform(_probePrefab);
@ -112,6 +112,7 @@ namespace QSB
child.Target = item.target;
Destroy(item);
}
Destroy(go.GetComponent<NetworkTransform>());
Destroy(go.GetComponent<NetworkIdentity>());
}
@ -145,7 +146,6 @@ namespace QSB
DebugLog.DebugWrite($"OnServerAddPlayer {playerControllerId}", MessageType.Info);
base.OnServerAddPlayer(connection, playerControllerId);
QNetworkServer.SpawnWithClientAuthority(Instantiate(_shipPrefab), connection);
QNetworkServer.SpawnWithClientAuthority(Instantiate(_cameraPrefab), connection);
QNetworkServer.SpawnWithClientAuthority(Instantiate(_probePrefab), connection);
QNetworkServer.SpawnWithClientAuthority(Instantiate(_stickPrefab), connection);
@ -253,10 +253,12 @@ namespace QSB
{
Destroy(platform);
}
foreach (var camera in Resources.FindObjectsOfTypeAll<CustomNomaiRemoteCamera>())
{
Destroy(camera);
}
foreach (var streaming in Resources.FindObjectsOfTypeAll<CustomNomaiRemoteCameraStreaming>())
{
Destroy(streaming);

View File

@ -29,6 +29,7 @@ namespace QSB
// So objects have time to be deleted, made, whatever
QSBCore.UnityEvents.FireOnNextUpdate(() => WorldObjectManager.Rebuild(newScene));
}
OnSceneLoaded?.SafeInvoke(newScene, universe);
if (universe)
{

View File

@ -29,6 +29,7 @@ namespace QSB.QuantumSync.Events
{
return;
}
var moon = Locator.GetQuantumMoon();
var wasPlayerEntangled = moon.IsPlayerEntangled();
var location = new RelativeLocationData(Locator.GetPlayerTransform().GetComponent<OWRigidbody>(), moon.transform);
@ -44,6 +45,7 @@ namespace QSB.QuantumSync.Events
{
Physics.SyncTransforms();
}
constantFoceDetector.AddConstantVolume(owRigidbody.GetAttachedGravityVolume(), true, true);
moonBody.SetVelocity(OWPhysics.CalculateOrbitVelocity(owRigidbody, moonBody, message.OrbitAngle) + owRigidbody.GetVelocity());
moon.SetValue("_stateIndex", message.StateIndex);
@ -57,12 +59,14 @@ namespace QSB.QuantumSync.Events
moon.GetType().GetMethod("SetSurfaceState", BindingFlags.NonPublic | BindingFlags.Instance).Invoke(moon, new object[] { -1 });
moon.GetValue<AudioSignal>("_quantumSignal").SetSignalActivation(message.StateIndex != 5, 2f);
}
moon.GetValue<ReferenceFrameVolume>("_referenceFrameVolume").gameObject.SetActive(message.StateIndex != 5);
moonBody.SetIsTargetable(message.StateIndex != 5);
foreach (var obj in moon.GetValue<GameObject[]>("_deactivateAtEye"))
{
obj.SetActive(message.StateIndex != 5);
}
GlobalMessenger<OWRigidbody>.FireEvent("QuantumMoonChangeState", moonBody);
if (wasPlayerEntangled)

View File

@ -28,6 +28,7 @@ namespace QSB.QuantumSync.Events
{
return;
}
var qsbObj = QSBWorldSync.GetWorldFromId<QSBMultiStateQuantumObject>(message.ObjectId);
qsbObj.DebugBoxText.text = message.StateIndex.ToString();
}
@ -38,12 +39,14 @@ namespace QSB.QuantumSync.Events
{
return;
}
var qsbObj = QSBWorldSync.GetWorldFromId<QSBMultiStateQuantumObject>(message.ObjectId);
if (qsbObj.ControllingPlayer != message.FromId)
{
DebugLog.ToConsole($"Error - Got MultiStateChangeEvent for {qsbObj.Name} from {message.FromId}, but it's currently controlled by {qsbObj.ControllingPlayer}!", MessageType.Error);
return;
}
qsbObj.ChangeState(message.StateIndex);
}
}

View File

@ -26,6 +26,7 @@ namespace QSB.QuantumSync.Events
{
return;
}
var obj = QSBWorldSync.GetWorldFromId<QSBQuantumShuffleObject>(message.ObjectId);
obj.ShuffleObjects(message.IndexArray);
}

View File

@ -30,12 +30,14 @@ namespace QSB.QuantumSync.Events
{
return;
}
var obj = QSBWorldSync.GetWorldFromId<QSBSocketedQuantumObject>(message.ObjectId);
if (obj.ControllingPlayer != message.FromId)
{
DebugLog.ToConsole($"Error - Got SocketStateChangeEvent for {obj.Name} from {message.FromId}, but it's currently controlled by {obj.ControllingPlayer}!", MessageType.Error);
return;
}
obj.MoveToSocket(message);
}
}

View File

@ -9,19 +9,14 @@ namespace QSB.QuantumSync.Patches
public override void DoPatches()
{
QSBCore.HarmonyHelper.AddPrefix<QuantumMoon>("ChangeQuantumState", typeof(ClientQuantumPatches), nameof(ReturnFalsePatch));
QSBCore.HarmonyHelper.AddPostfix<QuantumMoon>("Start", typeof(ClientQuantumPatches), nameof(Moon_CollapseOnStart));
Prefix(nameof(QuantumMoon_ChangeQuantumState));
Postfix(nameof(QuantumMoon_Start));
}
public override void DoUnpatches()
{
QSBCore.HarmonyHelper.Unpatch<QuantumMoon>("ChangeQuantumState");
QSBCore.HarmonyHelper.Unpatch<QuantumMoon>("Start");
}
public static void Moon_CollapseOnStart(QuantumMoon __instance)
public static void QuantumMoon_Start(QuantumMoon __instance)
=> __instance.GetType().GetMethod("SetSurfaceState", BindingFlags.NonPublic | BindingFlags.Instance).Invoke(__instance, new object[] { -1 });
public static bool ReturnFalsePatch() => false;
public static bool QuantumMoon_ChangeQuantumState()
=> false;
}
}

View File

@ -18,43 +18,28 @@ namespace QSB.QuantumSync.Patches
public override void DoPatches()
{
QSBCore.HarmonyHelper.AddPrefix<SocketedQuantumObject>("ChangeQuantumState", typeof(QuantumPatches), nameof(Socketed_ChangeQuantumState));
QSBCore.HarmonyHelper.AddPostfix<SocketedQuantumObject>("MoveToSocket", typeof(QuantumPatches), nameof(Socketed_MoveToSocket));
QSBCore.HarmonyHelper.AddPrefix<QuantumShuffleObject>("ChangeQuantumState", typeof(QuantumPatches), nameof(Shuffle_ChangeQuantumState));
QSBCore.HarmonyHelper.AddPrefix<MultiStateQuantumObject>("ChangeQuantumState", typeof(QuantumPatches), nameof(MultiState_ChangeQuantumState));
QSBCore.HarmonyHelper.AddPostfix<QuantumState>("SetVisible", typeof(QuantumPatches), nameof(QuantumState_SetVisible));
QSBCore.HarmonyHelper.AddPrefix<QuantumShrine>("IsPlayerInDarkness", typeof(QuantumPatches), nameof(Shrine_IsPlayerInDarkness));
QSBCore.HarmonyHelper.AddPrefix<QuantumShrine>("ChangeQuantumState", typeof(QuantumPatches), nameof(Shrine_ChangeQuantumState));
QSBCore.HarmonyHelper.AddPrefix<QuantumShrine>("OnEntry", typeof(QuantumPatches), nameof(Shrine_OnEntry));
QSBCore.HarmonyHelper.AddPrefix<QuantumShrine>("OnExit", typeof(QuantumPatches), nameof(Shrine_OnExit));
QSBCore.HarmonyHelper.AddPrefix<QuantumMoon>("CheckPlayerFogProximity", typeof(QuantumPatches), nameof(Moon_CheckPlayerFogProximity));
QSBCore.HarmonyHelper.AddPrefix<QuantumObject>("IsLockedByPlayerContact", typeof(QuantumPatches), nameof(Object_IsLockedByPlayerContact));
QSBCore.HarmonyHelper.AddPrefix<MultiStateQuantumObject>("Start", typeof(QuantumPatches), nameof(MultiState_Start));
Prefix(nameof(SocketedQuantumObject_ChangeQuantumState));
Postfix(nameof(SocketedQuantumObject_MoveToSocket));
Prefix(nameof(QuantumShuffleObject_ChangeQuantumState));
Prefix(nameof(MultiStateQuantumObject_ChangeQuantumState));
Postfix(nameof(QuantumState_SetVisible));
Prefix(nameof(QuantumShrine_IsPlayerInDarkness));
Prefix(nameof(QuantumShrine_ChangeQuantumState));
Prefix(nameof(QuantumShrine_OnEntry));
Prefix(nameof(QuantumShrine_OnExit));
Prefix(nameof(QuantumMoon_CheckPlayerFogProximity));
Prefix(nameof(QuantumObject_IsLockedByPlayerContact));
Prefix(nameof(MultiStateQuantumObject_Start));
}
public override void DoUnpatches()
{
QSBCore.HarmonyHelper.Unpatch<SocketedQuantumObject>("ChangeQuantumState");
QSBCore.HarmonyHelper.Unpatch<SocketedQuantumObject>("MoveToSocket");
QSBCore.HarmonyHelper.Unpatch<QuantumShuffleObject>("ChangeQuantumState");
QSBCore.HarmonyHelper.Unpatch<MultiStateQuantumObject>("ChangeQuantumState");
QSBCore.HarmonyHelper.Unpatch<QuantumState>("SetVisible");
QSBCore.HarmonyHelper.Unpatch<QuantumShrine>("IsPlayerInDarkness");
QSBCore.HarmonyHelper.Unpatch<QuantumShrine>("ChangeQuantumState");
QSBCore.HarmonyHelper.Unpatch<QuantumShrine>("OnEntry");
QSBCore.HarmonyHelper.Unpatch<QuantumShrine>("OnExit");
QSBCore.HarmonyHelper.Unpatch<QuantumMoon>("CheckPlayerFogProximity");
QSBCore.HarmonyHelper.Unpatch<QuantumObject>("IsLockedByPlayerContact");
}
public static bool Object_IsLockedByPlayerContact(ref bool __result, QuantumObject __instance)
public static bool QuantumObject_IsLockedByPlayerContact(ref bool __result, QuantumObject __instance)
{
var playersEntangled = QuantumManager.GetEntangledPlayers(__instance);
__result = playersEntangled.Count() != 0 && __instance.IsIlluminated();
return false;
}
public static bool Socketed_ChangeQuantumState(
public static bool SocketedQuantumObject_ChangeQuantumState(
SocketedQuantumObject __instance,
ref bool __result,
bool skipInstantVisibilityCheck,
@ -121,6 +106,7 @@ namespace QSB.QuantumSync.Patches
__result = true;
return false;
}
bool socketNotSuitable;
var isSocketIlluminated = (bool)__instance.GetType().GetMethod("CheckIllumination", BindingFlags.NonPublic | BindingFlags.Instance).Invoke(__instance, null);
@ -150,18 +136,20 @@ namespace QSB.QuantumSync.Patches
__result = true;
return false;
}
list.RemoveAt(index);
if (list.Count == 0)
{
break;
}
}
__instance.GetType().GetMethod("MoveToSocket", BindingFlags.NonPublic | BindingFlags.Instance).Invoke(__instance, new object[] { occupiedSocket });
__result = false;
return false;
}
public static void Socketed_MoveToSocket(SocketedQuantumObject __instance, QuantumSocket socket)
public static void SocketedQuantumObject_MoveToSocket(SocketedQuantumObject __instance, QuantumSocket socket)
{
if (!WorldObjectManager.AllReady)
{
@ -173,6 +161,7 @@ namespace QSB.QuantumSync.Patches
DebugLog.ToConsole($"Error - Trying to move {__instance.name} to a null socket!", MessageType.Error);
return;
}
var objectWorldObject = QSBWorldSync.GetWorldFromUnity<QSBSocketedQuantumObject, SocketedQuantumObject>(__instance);
var socketWorldObject = QSBWorldSync.GetWorldFromUnity<QSBQuantumSocket, QuantumSocket>(socket);
@ -194,7 +183,7 @@ namespace QSB.QuantumSync.Patches
__instance.transform.localRotation);
}
public static bool Shuffle_ChangeQuantumState(
public static bool QuantumShuffleObject_ChangeQuantumState(
QuantumShuffleObject __instance,
ref List<int> ____indexList,
ref Vector3[] ____localPositions,
@ -221,7 +210,6 @@ namespace QSB.QuantumSync.Patches
____indexList[random] = temp;
}
for (var j = 0; j < ____shuffledObjects.Length; j++)
{
____shuffledObjects[j].localPosition = ____localPositions[____indexList[j]];
@ -239,7 +227,7 @@ namespace QSB.QuantumSync.Patches
return false;
}
public static bool MultiState_Start(MultiStateQuantumObject __instance, Sector ____sector, bool ____collapseOnStart)
public static bool MultiStateQuantumObject_Start(MultiStateQuantumObject __instance, Sector ____sector, bool ____collapseOnStart)
{
if (!WorldObjectManager.AllReady)
{
@ -264,6 +252,7 @@ namespace QSB.QuantumSync.Patches
{
__instance.GetType().GetMethod("CheckEnabled", BindingFlags.NonPublic | BindingFlags.Instance).Invoke(__instance, null);
}
if (____collapseOnStart)
{
__instance.GetType().GetMethod("Collapse", BindingFlags.NonPublic | BindingFlags.Instance).Invoke(__instance, new object[] { true });
@ -272,7 +261,7 @@ namespace QSB.QuantumSync.Patches
return false;
}
public static bool MultiState_ChangeQuantumState(MultiStateQuantumObject __instance)
public static bool MultiStateQuantumObject_ChangeQuantumState(MultiStateQuantumObject __instance)
{
if (!WorldObjectManager.AllReady)
{
@ -284,6 +273,7 @@ namespace QSB.QuantumSync.Patches
{
return true;
}
var isInControl = qsbObj.ControllingPlayer == QSBPlayerManager.LocalPlayerId;
return isInControl;
}
@ -299,6 +289,7 @@ namespace QSB.QuantumSync.Patches
{
return;
}
var allMultiStates = QSBWorldSync.GetWorldObjects<QSBMultiStateQuantumObject>();
var stateObject = QSBWorldSync.GetWorldFromUnity<QSBQuantumState, QuantumState>(__instance);
var owner = allMultiStates.First(x => x.QuantumStates.Contains(stateObject));
@ -306,6 +297,7 @@ namespace QSB.QuantumSync.Patches
{
return;
}
var stateIndex = owner.QuantumStates.IndexOf(stateObject);
QSBEventManager.FireEvent(
EventNames.QSBMultiStateChange,
@ -313,7 +305,7 @@ namespace QSB.QuantumSync.Patches
stateIndex);
}
public static bool Shrine_IsPlayerInDarkness(ref bool __result, Light[] ____lamps, float ____fadeFraction, bool ____isProbeInside, NomaiGateway ____gate)
public static bool QuantumShrine_IsPlayerInDarkness(ref bool __result, Light[] ____lamps, float ____fadeFraction, bool ____isProbeInside, NomaiGateway ____gate)
{
foreach (var lamp in ____lamps)
{
@ -359,14 +351,14 @@ namespace QSB.QuantumSync.Patches
return false;
}
public static bool Shrine_ChangeQuantumState(QuantumShrine __instance)
public static bool QuantumShrine_ChangeQuantumState(QuantumShrine __instance)
{
var shrineWorldObject = QSBWorldSync.GetWorldFromUnity<QSBSocketedQuantumObject, SocketedQuantumObject>(__instance);
var isInControl = shrineWorldObject.ControllingPlayer == QSBPlayerManager.LocalPlayerId;
return isInControl;
}
public static bool Shrine_OnEntry(
public static bool QuantumShrine_OnEntry(
GameObject hitObj,
ref bool ____isPlayerInside,
ref bool ____fading,
@ -384,10 +376,11 @@ namespace QSB.QuantumSync.Patches
{
____isProbeInside = true;
}
return false;
}
public static bool Shrine_OnExit(
public static bool QuantumShrine_OnExit(
GameObject hitObj,
ref bool ____isPlayerInside,
ref bool ____fading,
@ -405,10 +398,11 @@ namespace QSB.QuantumSync.Patches
{
____isProbeInside = false;
}
return false;
}
public static bool Moon_CheckPlayerFogProximity(
public static bool QuantumMoon_CheckPlayerFogProximity(
QuantumMoon __instance,
int ____stateIndex,
float ____eyeStateFogOffset,
@ -435,7 +429,7 @@ namespace QSB.QuantumSync.Patches
fogAlpha = Mathf.InverseLerp(____fogThickness + ____fogRolloffDistance, ____fogThickness, distanceFromFog);
if (distanceFromFog < 0f)
{
if ((bool)__instance.GetType().GetMethod("IsLockedByProbeSnapshot", BindingFlags.NonPublic | BindingFlags.Instance).Invoke(__instance, null) || QuantumManager.IsVisibleUsingCameraFrustum((ShapeVisibilityTracker)____visibilityTracker, true))
if ((bool)__instance.GetType().GetMethod("IsLockedByProbeSnapshot", BindingFlags.NonPublic | BindingFlags.Instance).Invoke(__instance, null) || QuantumManager.IsVisibleUsingCameraFrustum((ShapeVisibilityTracker)____visibilityTracker, true).First)
{
____isPlayerInside = true;
__instance.GetType().GetMethod("SetSurfaceState", BindingFlags.NonPublic | BindingFlags.Instance).Invoke(__instance, new object[] { ____stateIndex });
@ -456,10 +450,11 @@ namespace QSB.QuantumSync.Patches
if (____stateIndex != 5)
{
____isPlayerInside = false;
if (!(bool)__instance.GetType().GetMethod("IsLockedByProbeSnapshot", BindingFlags.NonPublic | BindingFlags.Instance).Invoke(__instance, null) && !QuantumManager.IsVisibleUsingCameraFrustum((ShapeVisibilityTracker)____visibilityTracker, true))
if (!(bool)__instance.GetType().GetMethod("IsLockedByProbeSnapshot", BindingFlags.NonPublic | BindingFlags.Instance).Invoke(__instance, null) && !QuantumManager.IsVisibleUsingCameraFrustum((ShapeVisibilityTracker)____visibilityTracker, true).First)
{
__instance.GetType().GetMethod("Collapse", BindingFlags.NonPublic | BindingFlags.Instance).Invoke(__instance, new object[] { true });
}
__instance.GetType().GetMethod("SetSurfaceState", BindingFlags.NonPublic | BindingFlags.Instance).Invoke(__instance, new object[] { -1 });
QSBEventManager.FireEvent("PlayerExitQuantumMoon");
}
@ -473,6 +468,7 @@ namespace QSB.QuantumSync.Patches
{
Physics.SyncTransforms();
}
var component = Locator.GetPlayerCamera().GetComponent<PlayerCameraController>();
component.SetDegreesY(component.GetMinDegreesY());
____vortexAudio.SetLocalVolume(0f);
@ -481,6 +477,7 @@ namespace QSB.QuantumSync.Patches
}
}
}
____playerFogBubble.SetFogAlpha(fogAlpha);
____shipLandingCamFogBubble.SetFogAlpha(fogAlpha);
return false;

View File

@ -13,22 +13,12 @@ namespace QSB.QuantumSync.Patches
public override void DoPatches()
{
QSBCore.HarmonyHelper.AddPrefix<ShapeVisibilityTracker>("IsVisibleUsingCameraFrustum", typeof(QuantumVisibilityPatches), nameof(ShapeIsVisibleUsingCameraFrustum));
QSBCore.HarmonyHelper.AddPrefix<ShapeVisibilityTracker>("IsVisible", typeof(QuantumVisibilityPatches), nameof(ShapeIsVisible));
QSBCore.HarmonyHelper.AddPrefix<RendererVisibilityTracker>("IsVisibleUsingCameraFrustum", typeof(QuantumVisibilityPatches), nameof(RenderIsVisibleUsingCameraFrustum));
QSBCore.HarmonyHelper.AddPrefix<VisibilityObject>("CheckIllumination", typeof(QuantumVisibilityPatches), nameof(CheckIllumination));
QSBCore.HarmonyHelper.AddPostfix<Shape>("OnEnable", typeof(QuantumVisibilityPatches), nameof(Shape_OnEnable));
QSBCore.HarmonyHelper.AddPostfix<Shape>("OnDisable", typeof(QuantumVisibilityPatches), nameof(Shape_OnDisable));
}
public override void DoUnpatches()
{
QSBCore.HarmonyHelper.Unpatch<ShapeVisibilityTracker>("IsVisibleUsingCameraFrustum");
QSBCore.HarmonyHelper.Unpatch<ShapeVisibilityTracker>("IsVisible");
QSBCore.HarmonyHelper.Unpatch<RendererVisibilityTracker>("IsVisibleUsingCameraFrustum");
QSBCore.HarmonyHelper.Unpatch<VisibilityObject>("CheckIllumination");
QSBCore.HarmonyHelper.Unpatch<Shape>("OnEnable");
QSBCore.HarmonyHelper.Unpatch<Shape>("OnDisable");
Prefix(nameof(ShapeVisibilityTracker_IsVisibleUsingCameraFrustum));
Prefix(nameof(ShapeVisibilityTracker_IsVisible));
Prefix(nameof(RendererVisibilityTracker_IsVisibleUsingCameraFrustum));
Prefix(nameof(VisibilityObject_CheckIllumination));
Postfix(nameof(Shape_OnEnable));
Postfix(nameof(Shape_OnDisable));
}
public static void Shape_OnEnable(Shape __instance)
@ -39,13 +29,13 @@ namespace QSB.QuantumSync.Patches
// ShapeVisibilityTracker patches
public static bool ShapeIsVisibleUsingCameraFrustum(ShapeVisibilityTracker __instance, ref bool __result)
public static bool ShapeVisibilityTracker_IsVisibleUsingCameraFrustum(ShapeVisibilityTracker __instance, ref bool __result)
{
__result = QuantumManager.IsVisibleUsingCameraFrustum(__instance, false);
__result = QuantumManager.IsVisibleUsingCameraFrustum(__instance, false).First;
return false;
}
public static bool ShapeIsVisible(ShapeVisibilityTracker __instance, ref bool __result)
public static bool ShapeVisibilityTracker_IsVisible(ShapeVisibilityTracker __instance, ref bool __result)
{
__result = QuantumManager.IsVisible(__instance, false);
return false;
@ -53,7 +43,7 @@ namespace QSB.QuantumSync.Patches
// RendererVisibilityTracker patches - probably not needed as i don't think RendererVisibilityTracker is ever used?
public static bool RenderIsVisibleUsingCameraFrustum(RendererVisibilityTracker __instance, ref bool __result, Renderer ____renderer, bool ____checkFrustumOcclusion)
public static bool RendererVisibilityTracker_IsVisibleUsingCameraFrustum(RendererVisibilityTracker __instance, ref bool __result, Renderer ____renderer, bool ____checkFrustumOcclusion)
{
__result = QSBPlayerManager.GetPlayersWithCameras()
.Any(x => GeometryUtility.TestPlanesAABB(x.Camera.GetFrustumPlanes(), ____renderer.bounds))
@ -66,13 +56,14 @@ namespace QSB.QuantumSync.Patches
// VisibilityObject
public static bool CheckIllumination(VisibilityObject __instance, ref bool __result, bool ____checkIllumination, Vector3 ____localIlluminationOffset, float ____illuminationRadius, Light[] ____lightSources)
public static bool VisibilityObject_CheckIllumination(VisibilityObject __instance, ref bool __result, bool ____checkIllumination, Vector3 ____localIlluminationOffset, float ____illuminationRadius, Light[] ____lightSources)
{
if (!____checkIllumination)
{
__result = true;
return false;
}
var point = __instance.transform.TransformPoint(____localIlluminationOffset);
var tupleFlashlights = QSBPlayerManager.GetPlayerFlashlights();
var localFlashlight = tupleFlashlights.First;
@ -117,6 +108,7 @@ namespace QSB.QuantumSync.Patches
}
}
}
__result = false;
return false;
}

View File

@ -1,8 +1,9 @@
using OWML.Common;
using QSB.Events;
using QSB.Patches;
using QSB.Player;
using QSB.Utility;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using UnityEngine;
@ -13,12 +14,9 @@ namespace QSB.QuantumSync.Patches
public override QSBPatchTypes Type => QSBPatchTypes.OnServerClientConnect;
public override void DoPatches()
=> QSBCore.HarmonyHelper.AddPrefix<QuantumMoon>("ChangeQuantumState", typeof(ServerQuantumPatches), nameof(Moon_ChangeQuantumState));
=> Prefix(nameof(QuantumMoon_ChangeQuantumState));
public override void DoUnpatches()
=> QSBCore.HarmonyHelper.Unpatch<QuantumMoon>("ChangeQuantumState");
public static bool Moon_ChangeQuantumState(
public static bool QuantumMoon_ChangeQuantumState(
QuantumMoon __instance,
ref bool __result,
bool skipInstantVisibilityCheck,
@ -40,32 +38,80 @@ namespace QSB.QuantumSync.Patches
GameObject[] ____deactivateAtEye
)
{
if (QuantumManager.IsVisibleUsingCameraFrustum((ShapeVisibilityTracker)____visibilityTracker, skipInstantVisibilityCheck) && !QuantumManager.Shrine.IsPlayerInDarkness())
var isVisibleOutput = QuantumManager.IsVisibleUsingCameraFrustum((ShapeVisibilityTracker)____visibilityTracker, skipInstantVisibilityCheck);
//var moonVisible = isVisibleOutput.First;
var moonVisiblePlayers = isVisibleOutput.Second;
var inMoonPlayers = QSBPlayerManager.PlayerList.Where(x => x.IsInMoon);
if (inMoonPlayers == null)
{
DebugLog.ToConsole($"Warning - inMoonPlayers is null.", MessageType.Warning);
return false;
}
var inShrinePlayers = QSBPlayerManager.PlayerList.Where(x => x.IsInShrine);
if (inShrinePlayers == null)
{
DebugLog.ToConsole($"Warning - inShrinePlayers is null.", MessageType.Warning);
return false;
}
//var outMoonPlayers = QSBPlayerManager.PlayerList.Where(x => !x.IsInMoon);
var outShrinePlayers = QSBPlayerManager.PlayerList.Where(x => !x.IsInShrine);
if (outShrinePlayers == null)
{
DebugLog.ToConsole($"Warning - outShrinePlayers is null.", MessageType.Warning);
return false;
}
if (QuantumManager.Shrine == null)
{
DebugLog.ToConsole($"Warning - QuantumManager.Shrine is null.", MessageType.Warning);
return false;
}
var shrineLit = QuantumManager.Shrine.IsPlayerInDarkness();
// If any of the players in the moon are not in the shrine
if (inMoonPlayers.Any(x => !x.IsInShrine))
{
if (!skipInstantVisibilityCheck)
{
var method = new StackTrace().GetFrame(3).GetMethod();
DebugLog.ToConsole($"Warning - Tried to change moon state while still observed. Called by {method.DeclaringType}.{method.Name}", MessageType.Warning);
}
__result = false;
return false;
}
// If any of the players outside the shrine can see the moon
if (outShrinePlayers.Any(moonVisiblePlayers.Contains))
{
__result = false;
return false;
}
// If there are players in the shrine and the shrine is not lit
if (inShrinePlayers.Count() != 0 && !shrineLit)
{
__result = false;
return false;
}
var flag = false;
if (____isPlayerInside && ____hasSunCollapsed)
{
__result = false;
return false;
}
if (Time.time - ____playerWarpTime < 1f)
{
__result = false;
return false;
}
if (____stateIndex == 5 && ____isPlayerInside && !__instance.IsPlayerEntangled())
{
__result = false;
return false;
}
for (var i = 0; i < 10; i++)
{
var stateIndex = (____collapseToIndex == -1) ? (int)__instance.GetType().GetMethod("GetRandomStateIndex", BindingFlags.NonPublic | BindingFlags.Instance).Invoke(__instance, null) : ____collapseToIndex;
@ -78,10 +124,12 @@ namespace QSB.QuantumSync.Patches
break;
}
}
if (orbitIndex == -1)
{
DebugLog.ToConsole($"Error - QM failed to find orbit for state {stateIndex}", MessageType.Error);
}
var orbitRadius = (orbitIndex == -1) ? 10000f : ____orbits[orbitIndex].GetOrbitRadius();
var owRigidbody = (orbitIndex == -1) ? Locator.GetAstroObject(AstroObject.Name.Sun).GetOWRigidbody() : ____orbits[orbitIndex].GetAttachedOWRigidbody();
var onUnitSphere = UnityEngine.Random.onUnitSphere;
@ -90,6 +138,7 @@ namespace QSB.QuantumSync.Patches
onUnitSphere.y = 0f;
onUnitSphere.Normalize();
}
var position = (onUnitSphere * orbitRadius) + owRigidbody.GetWorldCenterOfMass();
if (!Physics.CheckSphere(position, ____sphereCheckRadius, OWLayerMask.physicalMask) || ____collapseToIndex != -1)
{
@ -98,13 +147,15 @@ namespace QSB.QuantumSync.Patches
{
Physics.SyncTransforms();
}
if (__instance.IsPlayerEntangled() || !QuantumManager.IsVisibleUsingCameraFrustum((ShapeVisibilityTracker)____visibilityTracker, skipInstantVisibilityCheck))
if (__instance.IsPlayerEntangled() || !QuantumManager.IsVisibleUsingCameraFrustum((ShapeVisibilityTracker)____visibilityTracker, skipInstantVisibilityCheck).First)
{
____moonBody.transform.position = position;
if (!Physics.autoSyncTransforms)
{
Physics.SyncTransforms();
}
____visibilityTracker.transform.localPosition = Vector3.zero;
____constantForceDetector.AddConstantVolume(owRigidbody.GetAttachedGravityVolume(), true, true);
var velocity = owRigidbody.GetVelocity();
@ -114,6 +165,7 @@ namespace QSB.QuantumSync.Patches
velocity = (initialMotion == null) ? Vector3.zero : initialMotion.GetInitVelocity();
____useInitialMotion = false;
}
var orbitAngle = UnityEngine.Random.Range(0, 360);
____moonBody.SetVelocity(OWPhysics.CalculateOrbitVelocity(owRigidbody, ____moonBody, orbitAngle) + velocity);
____lastStateIndex = ____stateIndex;
@ -124,9 +176,11 @@ namespace QSB.QuantumSync.Patches
{
____stateSkipCounts[k] = (k != ____stateIndex) ? (____stateSkipCounts[k] + 1) : 0;
}
QSBEventManager.FireEvent(EventNames.QSBMoonStateChange, stateIndex, onUnitSphere, orbitAngle);
break;
}
____visibilityTracker.transform.localPosition = Vector3.zero;
}
else
@ -134,6 +188,7 @@ namespace QSB.QuantumSync.Patches
DebugLog.ToConsole("Warning - Quantum moon orbit position occupied! Aborting collapse.", MessageType.Warning);
}
}
if (flag)
{
if (____isPlayerInside)
@ -145,16 +200,19 @@ namespace QSB.QuantumSync.Patches
__instance.GetType().GetMethod("SetSurfaceState", BindingFlags.NonPublic | BindingFlags.Instance).Invoke(__instance, new object[] { -1 });
____quantumSignal.SetSignalActivation(____stateIndex != 5, 2f);
}
____referenceFrameVolume.gameObject.SetActive(____stateIndex != 5);
____moonBody.SetIsTargetable(____stateIndex != 5);
for (var l = 0; l < ____deactivateAtEye.Length; l++)
{
____deactivateAtEye[l].SetActive(____stateIndex != 5);
}
GlobalMessenger<OWRigidbody>.FireEvent("QuantumMoonChangeState", ____moonBody);
__result = true;
return false;
}
__result = false;
return false;
}

View File

@ -51,6 +51,7 @@ namespace QSB.QuantumSync
{
return;
}
var quantumObjects = QSBWorldSync.GetWorldObjects<IQSBQuantumObject>().ToList();
for (var i = 0; i < quantumObjects.Count; i++)
{
@ -76,19 +77,24 @@ namespace QSB.QuantumSync
}
}
public static bool IsVisibleUsingCameraFrustum(ShapeVisibilityTracker tracker, bool ignoreLocalCamera)
public static Tuple<bool, List<PlayerInfo>> IsVisibleUsingCameraFrustum(ShapeVisibilityTracker tracker, bool ignoreLocalCamera)
{
var playersWithCameras = QSBPlayerManager.GetPlayersWithCameras(!ignoreLocalCamera);
if (playersWithCameras.Count == 0)
{
DebugLog.ToConsole($"Warning - Trying to run IsVisibleUsingCameraFrustum when there are no players!", MessageType.Warning);
return false;
return new Tuple<bool, List<PlayerInfo>>(false, null);
}
if (!tracker.gameObject.activeInHierarchy)
{
return false;
return new Tuple<bool, List<PlayerInfo>>(false, null);
}
var frustumMethod = tracker.GetType().GetMethod("IsInFrustum", BindingFlags.NonPublic | BindingFlags.Instance);
var playersWhoCanSee = new List<PlayerInfo>();
var foundPlayers = false;
foreach (var player in playersWithCameras)
{
if (player.Camera == null)
@ -96,19 +102,22 @@ namespace QSB.QuantumSync
DebugLog.ToConsole($"Warning - Camera is null for id:{player.PlayerId}!", MessageType.Warning);
continue;
}
var isInFrustum = (bool)frustumMethod.Invoke(tracker, new object[] { player.Camera.GetFrustumPlanes() });
if (isInFrustum)
{
return true;
playersWhoCanSee.Add(player);
foundPlayers = true;
}
}
return false;
return new Tuple<bool, List<PlayerInfo>>(foundPlayers, playersWhoCanSee);
}
public static bool IsVisible(ShapeVisibilityTracker tracker, bool ignoreLocalCamera)
{
return tracker.gameObject.activeInHierarchy
&& IsVisibleUsingCameraFrustum(tracker, ignoreLocalCamera)
&& IsVisibleUsingCameraFrustum(tracker, ignoreLocalCamera).First
&& QSBPlayerManager.GetPlayersWithCameras(!ignoreLocalCamera)
.Any(x => VisibilityOccluder.CanYouSee(tracker, x.Camera.mainCamera.transform.position));
}
@ -119,6 +128,7 @@ namespace QSB.QuantumSync
{
return Enumerable.Empty<PlayerInfo>();
}
var worldObj = GetObject(obj);
return QSBPlayerManager.PlayerList.Where(x => x.EntangledObject == worldObj);
}
@ -150,6 +160,7 @@ namespace QSB.QuantumSync
{
DebugLog.ToConsole($"Warning - couldn't work out type of QuantumObject {unityObject.name}.", MessageType.Warning);
}
return worldObj;
}
}

View File

@ -31,6 +31,7 @@ namespace QSB.QuantumSync.WorldObjects
{
DebugBoxText = DebugBoxManager.CreateBox(AttachedObject.transform, 0, CurrentState.ToString()).GetComponent<Text>();
}
base.Init(attachedObject, id);
}
@ -40,6 +41,7 @@ namespace QSB.QuantumSync.WorldObjects
{
QuantumStates[CurrentState].SetVisible(false);
}
QuantumStates[newStateIndex].SetVisible(true);
AttachedObject.SetValue("_stateIndex", newStateIndex);
if (QSBCore.DebugMode)

View File

@ -43,6 +43,7 @@ namespace QSB.QuantumSync.WorldObjects
shape.OnShapeDeactivated += (Shape s)
=> QSBCore.UnityEvents.FireOnNextUpdate(() => OnDisable(s));
}
if (GetAttachedShapes().Any(x => !x.enabled || !x.active))
{
ControllingPlayer = 0u;
@ -60,22 +61,26 @@ namespace QSB.QuantumSync.WorldObjects
{
return new List<Shape>();
}
var visibilityTrackers = AttachedObject.GetValue<VisibilityTracker[]>("_visibilityTrackers");
if (visibilityTrackers == null || visibilityTrackers.Length == 0)
{
return new List<Shape>();
}
if (visibilityTrackers.Any(x => x.GetType() == typeof(RendererVisibilityTracker)))
{
DebugLog.ToConsole($"Warning - {AttachedObject.name} has a RendererVisibilityTracker!", MessageType.Warning);
return new List<Shape>();
}
var totalShapes = new List<Shape>();
foreach (var tracker in visibilityTrackers)
{
var shapes = tracker.GetValue<Shape[]>("_shapes");
totalShapes.AddRange(shapes);
}
return totalShapes;
}
@ -86,11 +91,13 @@ namespace QSB.QuantumSync.WorldObjects
{
return;
}
if (ControllingPlayer != 0)
{
// controlled by another player, dont care that we activate it
return;
}
var id = QSBWorldSync.GetIdFromTypeSubset<IQSBQuantumObject>(this);
// no one is controlling this object right now, request authority
QSBEventManager.FireEvent(EventNames.QSBQuantumAuthority, id, QSBPlayerManager.LocalPlayerId);
@ -102,20 +109,24 @@ namespace QSB.QuantumSync.WorldObjects
{
return;
}
if (GetAttachedShapes().Any(x => x.isActiveAndEnabled))
{
return;
}
IsEnabled = false;
if (!QSBCore.WorldObjectsReady && !QSBCore.IsServer)
{
return;
}
if (ControllingPlayer != QSBPlayerManager.LocalPlayerId)
{
// not being controlled by us, don't care if we leave area
return;
}
var id = QSBWorldSync.GetIdFromTypeSubset<IQSBQuantumObject>(this);
// send event to other players that we're releasing authority
QSBEventManager.FireEvent(EventNames.QSBQuantumAuthority, id, 0u);

View File

@ -41,6 +41,7 @@ namespace QSB.QuantumSync.WorldObjects
DebugLog.ToConsole($"Couldn't find socket id {message.SocketId}", MessageType.Error);
return;
}
var socket = qsbSocket.AttachedObject;
if (socket == null)
{

View File

@ -30,6 +30,7 @@ namespace QSB.RoastingSync.Events
SendEvent(CreateMessage(-1, roasting));
return;
}
var qsbObj = QSBWorldSync.GetWorldFromUnity<QSBCampfire, Campfire>(campfire);
SendEvent(CreateMessage(qsbObj.ObjectId, roasting));
}
@ -47,11 +48,13 @@ namespace QSB.RoastingSync.Events
{
return;
}
if (message.State && message.ObjectId == -1)
{
DebugLog.ToConsole($"Error - Null campfire supplied for start roasting event!", OWML.Common.MessageType.Error);
return;
}
var player = QSBPlayerManager.GetPlayer(message.AboutId);
player.RoastingStick.SetActive(message.State);
if (message.State)

View File

@ -29,12 +29,14 @@ namespace QSB.RoastingSync.Events
{
return;
}
var marshmallow = QSBPlayerManager.GetPlayer(message.AboutId).Marshmallow;
if (marshmallow == null)
{
DebugLog.ToConsole($"Warning - Marshmallow is null for player {message.AboutId}.", OWML.Common.MessageType.Warning);
return;
}
switch (message.EnumValue)
{
case MarshmallowEventType.Burn:
@ -73,6 +75,7 @@ namespace QSB.RoastingSync.Events
DebugLog.DebugWrite($"Error - Campfire for {playerId} is null.", OWML.Common.MessageType.Error);
return;
}
rigidbody.SetVelocity(player.Campfire.AttachedObject.GetAttachedOWRigidbody(false).GetPointVelocity(stickTip.position) + (stickTip.forward * 3f));
rigidbody.SetAngularVelocity(stickTip.right * 10f);
if (player.Marshmallow == null)
@ -80,6 +83,7 @@ namespace QSB.RoastingSync.Events
DebugLog.DebugWrite($"Error - Marshmallow for {playerId} is null.", OWML.Common.MessageType.Error);
return;
}
tossedMallow.GetComponentInChildren<MeshRenderer>().material.color = player.Marshmallow._burntColor;
}
}

View File

@ -10,16 +10,11 @@ namespace QSB.RoastingSync.Patches
public override void DoPatches()
{
QSBCore.HarmonyHelper.AddPrefix<RoastingStickController>("UpdateMarshmallowInput", typeof(RoastingPatches), nameof(RoastingStickController_UpdateMarshmallowInput));
QSBCore.HarmonyHelper.AddPrefix<Marshmallow>("Burn", typeof(RoastingPatches), nameof(Marshmallow_Burn));
QSBCore.HarmonyHelper.AddPrefix<Marshmallow>("Shrivel", typeof(RoastingPatches), nameof(Marshmallow_Shrivel));
QSBCore.HarmonyHelper.AddPrefix<Marshmallow>("RemoveMallow", typeof(RoastingPatches), nameof(Marshmallow_RemoveMallow));
QSBCore.HarmonyHelper.AddPrefix<Marshmallow>("SpawnMallow", typeof(RoastingPatches), nameof(Marshmallow_SpawnMallow));
}
public override void DoUnpatches()
{
Prefix(nameof(RoastingStickController_UpdateMarshmallowInput));
Prefix(nameof(Marshmallow_Burn));
Prefix(nameof(Marshmallow_Shrivel));
Prefix(nameof(Marshmallow_RemoveMallow));
Prefix(nameof(Marshmallow_SpawnMallow));
}
public static bool Marshmallow_SpawnMallow()
@ -44,6 +39,7 @@ namespace QSB.RoastingSync.Patches
____audioController.PlayMarshmallowCatchFire();
QSBEventManager.FireEvent(EventNames.QSBMarshmallowEvent, MarshmallowEventType.Burn);
}
return false;
}
@ -57,6 +53,7 @@ namespace QSB.RoastingSync.Patches
____mallowState = Marshmallow.MallowState.Shriveling;
QSBEventManager.FireEvent(EventNames.QSBMarshmallowEvent, MarshmallowEventType.Shrivel);
}
return false;
}
@ -112,6 +109,7 @@ namespace QSB.RoastingSync.Patches
QSBEventManager.FireEvent(EventNames.QSBMarshmallowEvent, MarshmallowEventType.Toss);
}
}
if (OWInput.IsNewlyPressed(InputLibrary.interact, InputMode.Roasting) && ____marshmallow.IsEdible())
{
____marshmallow.Eat();

View File

@ -83,9 +83,11 @@ namespace QSB.RoastingSync
{
_fireRenderer.enabled = false;
}
transform.localScale = Vector3.one * (1f - shrivelFraction);
}
}
_heatPerSecond = 0f;
}
@ -105,6 +107,7 @@ namespace QSB.RoastingSync
{
_smokeParticles.Play();
}
var smokeColor = new Color(1f, 1f, 1f, num);
_smokeParticlesSettings.startColor = smokeColor;
}
@ -112,6 +115,7 @@ namespace QSB.RoastingSync
{
_smokeParticles.Stop();
}
Color newColor;
if (_toastedFraction < PERFECT_TOASTED_FRACTION)
{
@ -123,6 +127,7 @@ namespace QSB.RoastingSync
var fractionTowardsBurnt = (_toastedFraction - PERFECT_TOASTED_FRACTION) / 0.3f;
newColor = Color.Lerp(_toastedColor, _burntColor, fractionTowardsBurnt);
}
_mallowRenderer.material.color = Color.Lerp(_mallowRenderer.material.color, newColor, RAW_TOASTED_FRACTION);
_smokeParticles.transform.forward = Locator.GetPlayerTransform().up;
}

View File

@ -1,5 +1,6 @@
using OWML.Utils;
using QSB.Player;
using QSB.SectorSync;
using QSB.Syncs.TransformSync;
using QSB.Utility;
using System.Linq;
@ -9,8 +10,6 @@ namespace QSB.RoastingSync.TransformSync
{
internal class RoastingStickTransformSync : SectoredTransformSync
{
public override bool UseInterpolation => true;
private Transform _stickTip;
private Transform _networkStickTip => gameObject.transform.GetChild(0);
private const float SmoothTime = 0.1f;
@ -20,15 +19,15 @@ namespace QSB.RoastingSync.TransformSync
private Transform GetPivot()
=> Resources.FindObjectsOfTypeAll<RoastingStickController>().First().transform.Find("Stick_Root/Stick_Pivot");
protected override GameObject InitLocalTransform()
protected override Transform InitLocalTransform()
{
var pivot = GetPivot();
Player.RoastingStick = pivot.gameObject;
_stickTip = pivot.Find("Stick_Tip");
return pivot.gameObject;
return pivot;
}
protected override GameObject InitRemoteTransform()
protected override Transform InitRemoteTransform()
{
var newPivot = Instantiate(GetPivot());
newPivot.parent = null;
@ -58,7 +57,7 @@ namespace QSB.RoastingSync.TransformSync
Player.Marshmallow = newMarshmallow;
mallowRoot.gameObject.SetActive(true);
_stickTip = newPivot.Find("Stick_Tip");
return newPivot.gameObject;
return newPivot;
}
protected override void UpdateTransform()
@ -87,5 +86,9 @@ namespace QSB.RoastingSync.TransformSync
&& Player.PlayerStates.IsReady
&& NetId.Value != uint.MaxValue
&& NetId.Value != 0U;
public override bool UseInterpolation => true;
public override TargetType Type => TargetType.RoastingStick;
}
}

View File

@ -1,8 +1,9 @@
using OWML.Common;
using QSB.SectorSync.WorldObjects;
using QSB.Syncs.TransformSync;
using QSB.Syncs;
using QSB.Utility;
using QSB.WorldSync;
using QuantumUNET;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
@ -18,16 +19,35 @@ namespace QSB.SectorSync
private void OnEnable() => RepeatingManager.Repeatings.Add(this);
private void OnDisable() => RepeatingManager.Repeatings.Remove(this);
public List<ISectoredSync<Transform>> SectoredTransformSyncs = new List<ISectoredSync<Transform>>();
public List<ISectoredSync<OWRigidbody>> SectoredRigidbodySyncs = new List<ISectoredSync<OWRigidbody>>();
public void Invoke()
{
foreach (var sync in SectoredTransformSync.SectoredNetworkTransformList)
foreach (var sync in SectoredTransformSyncs)
{
if (sync.AttachedObject == null)
{
continue;
}
if (sync.HasAuthority
&& sync.AttachedObject.activeInHierarchy
if ((sync as QNetworkBehaviour).HasAuthority
&& sync.AttachedObject.gameObject.activeInHierarchy
&& sync.IsReady)
{
CheckTransformSyncSector(sync);
}
}
foreach (var sync in SectoredRigidbodySyncs)
{
if (sync.AttachedObject == null)
{
continue;
}
if ((sync as QNetworkBehaviour).HasAuthority
&& sync.AttachedObject.gameObject.activeInHierarchy
&& sync.IsReady)
{
CheckTransformSyncSector(sync);
@ -60,11 +80,13 @@ namespace QSB.SectorSync
DebugLog.ToConsole($"Error - TimeLoopRing_Body not found!", MessageType.Error);
}
}
QSBWorldSync.Init<QSBSector, Sector>();
IsReady = QSBWorldSync.GetWorldObjects<QSBSector>().Any();
}
private void CheckTransformSyncSector(SectoredTransformSync transformSync)
private void CheckTransformSyncSector<T>(ISectoredSync<T> transformSync)
where T : Component
{
var attachedObject = transformSync.AttachedObject;
var closestSector = transformSync.SectorSync.GetClosestSector(attachedObject.transform);
@ -72,10 +94,12 @@ namespace QSB.SectorSync
{
return;
}
if (closestSector == transformSync.ReferenceSector)
{
return;
}
transformSync.SetReferenceSector(closestSector);
}
}

Some files were not shown because too many files have changed in this diff Show More