profile
viewpoint
Quentin E. / iDeath xiaoxiao921 France

harbingerofme/DebugToolkit 7

Debugging commands for Risk of Rain 2. Previously known as RoR2Cheats.

xiaoxiao921/Lead 4

Custom item for Valheim

sirskunkalot/Veilheim 3

Valheim mod

harbingerofme/R2DS-Essentials 2

Name not final. Essentials for risk of rain 2 dedicated server modding.

xiaoxiao921/CHEF 1

A Discord bot made for the Risk of Rain 2 modding server.

xiaoxiao921/ItemLib 1

library for custom items in RoR2

fadiyared1/projet-tutore 0

WordPress plugin

risk-of-thunder/BepInEx.GUI 0

Gui for BepInEx process

startedBepInEx/NStrip

started time in 7 hours

starteddotnet/roslyn

started time in 5 days

startedicsharpcode/ILSpy

started time in 5 days

startedabsolute-quantum/cats-blender-plugin

started time in 10 days

startedDrBibop/RoR2VRMod

started time in 10 days

issue commentrisk-of-thunder/R2API

Is there any way to download previous versions of R2API?

r2modman should allow you to use whatever version you want, if you are manually installing, all the previous versions are available here at the bottom of the page : https://thunderstore.io/package/tristanmcpherson/R2API/

That being said, the latest version should always be the one you using, we try to never break backward compatibilities meaning that the latest version is always the best one to have as new mods may need the latest version to properly work anyway. If there is something we missed and broke in an update, please tell us so that we can fix it

Cacklefruits

comment created time in 11 days

startedabseil/abseil-cpp

started time in 11 days

startedioncodes/ceload

started time in 13 days

pull request commentPassivePicasso/ThunderKit

Add UNetWeaver support

Works fine on 2018.4 which was shipping with the HLAPI and works fine on 2019.4 + HLAPI from the unity package manager version 1.0.0 to 1.1.1

xiaoxiao921

comment created time in 17 days

push eventxiaoxiao921/ThunderKit

xiaoxiao921

commit sha 6e74777494fb09049cfd5d42f0b7a5b1ea8b9dce

add support for hlapi (starting from unity 2019)

view details

push time in 17 days

startedVollRagm/KernelBypassSharp

started time in 18 days

startedincludeos/IncludeOS

started time in 18 days

startedgoogle/zx

started time in 18 days

startedbloomberg/corokafka

started time in 18 days

startedBareflank/hypervisor

started time in 18 days

startedBareflank/bsl

started time in 18 days

starteddanielmiessler/SecLists

started time in 19 days

startedJakeBayer/FuzzySharp

started time in 19 days

pull request commentPassivePicasso/ThunderKit

Add UNetWeaver support

Just realized I need to try this on unity version which needs the HLAPI package instead. Don't merge yet

xiaoxiao921

comment created time in 21 days

PR opened PassivePicasso/ThunderKit

Add UNetWeaver support
+89 -1

0 comment

3 changed files

pr created time in 21 days

push eventxiaoxiao921/ThunderKit

xiaoxiao921

commit sha 51db14e366bf7b098ec5cdfb32dbd2aeab06476b

Add UNetWeaver support

view details

push time in 21 days

fork xiaoxiao921/ThunderKit

Mod Project Development Environment for Unity and Unity Games

fork in 21 days

issue commentYimura/YimMenu

Menu doesn't open, caused by minhook.x64.dll not being present

https://github.com/Yimura/YimMenu/blob/master/premake5.lua#L117 minhook is statically linked to yimmenu so that error cannot phyiscally happen when you use premake

ThatKakiGuy

comment created time in 24 days

issue commentnesrak1/AssetsTools.NET

Cannot serialize custom monobehaviours field values

Oooh, my bad, thanks a lot for the help, it was such a silly mistake, doing SaveFieldChange(assetsReplacers, assetExternal.info, targetBaseField, AssetHelper.GetScriptIndex(assetsFile.file, assetExternal.info)); instead fixed it, thanks again

xiaoxiao921

comment created time in 25 days

issue openednesrak1/AssetsTools.NET

Cannot serialize custom monobehaviours field values

I'm trying to change some field values on an assetbundle, unity version 2018.4.16f1 AssetsTools version is latest commit. I'm using the following code :

Init the asset manager

private static void InitAssetsManager()
{
	_assetsManager = new AssetsManager();
	_assetsManager.LoadClassPackage("classdata.tpk");
}

Loading the bundle

private static void LoadUserAssetBundleData(string userAssetBundlePath)
{
	_userAssetBundleFileInstance = _assetsManager.LoadBundleFile(userAssetBundlePath, true);

	for (int i = 0; i < _userAssetBundleFileInstance.file.NumFiles; i++)
	{
		if (!_userAssetBundleFileInstance.file.IsAssetsFile(i))
		{
			continue;
		}

		var assetBundleAssetsFile = _assetsManager.LoadAssetsFileFromBundle(_userAssetBundleFileInstance, i);
		_userAssetBundleAssetsFiles.Add(assetBundleAssetsFile);
		_assetsManager.LoadClassDatabaseFromPackage(assetBundleAssetsFile.file.typeTree.unityVersion);
	}
}

Two helper methods for saving the changes to the field

private static void SetUnityObjRef(AssetTypeValueField fieldChildren, SerializedUnityObjectRef unityObjectRef)
{
	if (fieldChildren.childrenCount == 2)
	{
		AssetTypeValueField fileId = fieldChildren.children[0];
		AssetTypeValueField pathId = fieldChildren.children[1];
		string fileIdName = fileId.templateField.name;
		string fileIdType = fileId.templateField.type;
		string pathIdName = pathId.templateField.name;
		string pathIdType = pathId.templateField.type;
		if (fileIdName == "m_FileID" && fileIdType == "int" &&
			pathIdName == "m_PathID" && pathIdType == "SInt64")
		{
			fileId.GetValue().Set(unityObjectRef.FileId);
			pathId.GetValue().Set(unityObjectRef.PathId);
		}
	}
}

private static void SaveFieldChange(List<AssetsReplacer> assetsReplacers, AssetFileInfoEx assetInfo, AssetTypeValueField field, ushort monoScriptIndex = 0xFFFF)
{
	var newFieldBytes = field.WriteToByteArray();
	Console.WriteLine("monoScriptIndex:" + monoScriptIndex);
	var repl = new AssetsReplacerFromMemory(0, assetInfo.index, (int)assetInfo.curFileType, monoScriptIndex, newFieldBytes);
	assetsReplacers.Add(repl);
}

Code that actually retrieve the "test" field on my custom script, which is a reference to a gameobject asset

foreach (var assetsFile in _userAssetBundleAssetsFiles)
{
	if (!_userAssetsFilesToReplacers.TryGetValue(assetsFile, out var assetsReplacers))
	{
		assetsReplacers = new();
		_userAssetsFilesToReplacers.Add(assetsFile, assetsReplacers);
	}

	foreach (var assetInfo in assetsFile.table.assetFileInfo)
	{
		if (assetInfo.index != 8948727843312140990)
		{
			continue;
		}

		var field = _assetsManager.GetTypeInstance(assetsFile, assetInfo).GetBaseField();
		AssetTypeValueField components = field.Get("m_Component").Get("Array");
		int componentSize = components.GetValue().AsArray().size;
		AssetTypeValueField componentPtr = components[componentSize - 1].GetLastChild();
		AssetExternal assetExternal = _assetsManager.GetExtAsset(assetsFile, componentPtr);
		if (assetExternal.instance != null)
		{
			string className = AssetHelper.FindAssetClassByID(_assetsManager.classFile, assetExternal.info.curFileType).name.GetString(_assetsManager.classFile);
			if (className == "MonoBehaviour")
			{
				var managedPath = @"C:\Users\Quentin\desktop_files\code\csharp\ror2\UnityProjFixBundleRef\FixBundleRefTest\OutputGame\FixBundleRefTest_Data\Managed";
				var targetBaseField = MonoDeserializer.GetMonoBaseField(_assetsManager, assetsFile, assetExternal.info, managedPath);
				var testField = targetBaseField.Get("test");
				SetUnityObjRef(testField, new SerializedUnityObjectRef(3, 8));
				SaveFieldChange(assetsReplacers, assetExternal.info, testField, AssetHelper.GetScriptIndex(assetsFile.file, assetExternal.info));
				break;
			}
		}
	}
}

Code that save the changes to a new bundle file :

private static void SaveChangesToAssetBundle(string userAssetBundlePath)
{
	var newAssetsFileDatas = new List<(string, byte[])>();
	foreach ((var userAssetFile, var assetsReplacer) in _userAssetsFilesToReplacers)
	{
		byte[] newAssetsFileData;
		using (var memoryStream = new MemoryStream())
		using (var _writer = new AssetsFileWriter(memoryStream))
		{
			userAssetFile.file.Write(_writer, 0, assetsReplacer, 0);
			newAssetsFileData = memoryStream.ToArray();

			newAssetsFileDatas.Add((userAssetFile.name, newAssetsFileData));
		}
	}

	using (var fileStream = new FileStream(userAssetBundlePath + "_ref_fixed", FileMode.Create))
	{
		var bundleReplacers = new List<BundleReplacer>();
		foreach ((var assetsFileName, var newAssetsFileData) in newAssetsFileDatas)
		{
			var bundleReplacer = new BundleReplacerFromMemory(assetsFileName, null, false, newAssetsFileData, -1);
			bundleReplacers.Add(bundleReplacer);
		}

		var writer = new AssetsFileWriter(fileStream);
		_userAssetBundleFileInstance.file.Write(writer, bundleReplacers);
	}
}

Unmodified bundle : https://i.imgur.com/DVFAiOB.png

Modified bundle : https://i.imgur.com/mJ08Bzp.png

We can see that the changes end up in the wrong location, and i'm not sure why

created time in 25 days

issue openedMonoMod/MonoMod.Common

DMDEmitDynamicMethodGenerator._Generate throws PlatformNotSupportedException on some machines

I'm using some NativeDetour in a BepInEx patcher for Risk of Rain 2 (running netstandard2.0 backend) and the PlatformNotSupportedException exception is thrown in the _Generate method. This issue seems to be happening regardless of the DMD type used by monomod, (either Cecil with the env variable or the default value). I'm personally not experiencing this issue myself but an user do The user is running Windows 10, Version 20H2 (OS Build 19042.1415) Here is the full call trace :

[Message:   BepInEx] BepInEx 5.4.18.0 - Risk of Rain 2 (12/25/2021 11:51:07 PM)
[Info   :   BepInEx] Running under Unity v2018.4.16.15133130
[Info   :   BepInEx] CLR runtime version: 4.0.30319.17020
[Info   :   BepInEx] Supports SRE: False
[Info   :   BepInEx] System platform: Bits64, Windows
[Message:   BepInEx] Preloader started
[Info   :   BepInEx] Loaded 1 patcher method from [BepInEx.Preloader 5.4.18.0]
[Info   :   BepInEx] Loaded 1 patcher method from [LighterPatcher 1.0.5.0]
[Info   :   BepInEx] Loaded 1 patcher method from [FixPluginTypesSerialization 1.0.0.0]
[Info   :   BepInEx] Loaded 1 patcher method from [BepInEx.MonoMod.HookGenPatcher 1.1.0.0]
[Info   :   BepInEx] 4 patcher plugins loaded
[Info   :HookGenPatcher] Previous MMHOOK location found. Using that location to save instead.
[Info   :HookGenPatcher] Already ran for this version, reusing that file.
[Message:FixPluginTypesSerialization] MonoMod.RuntimeDetour, Version=21.12.13.1, Culture=neutral, PublicKeyToken=null: 21.12.13.1
[Message:FixPluginTypesSerialization] MonoMod.Utils, Version=21.12.13.1, Culture=neutral, PublicKeyToken=null: 21.12.13.1
[Message:FixPluginTypesSerialization] Using the config cache
[Error  :FixPluginTypesSerialization] Failed to initialize plugin types serialization fix: (System.PlatformNotSupportedException) Operation is not supported on this platform.. Some plugins may not work properly.
[Error  :FixPluginTypesSerialization] System.PlatformNotSupportedException: Operation is not supported on this platform.
  at MonoMod.Utils.DMDEmitDynamicMethodGenerator._Generate (MonoMod.Utils.DynamicMethodDefinition dmd, System.Object context) [0x002fb] in <5f90dad3071341a6a36a73b8614e5b1b>:0 
  at MonoMod.Utils.DMDGenerator`1[TSelf].Generate (MonoMod.Utils.DynamicMethodDefinition dmd, System.Object context) [0x00013] in <5f90dad3071341a6a36a73b8614e5b1b>:0 
  at MonoMod.RuntimeDetour.Platforms.DetourRuntimeILPlatform.TryMemAllocScratchCloseTo (System.IntPtr target, System.IntPtr& ptr, System.Int32 size) [0x0008c] in <e815268fce7a48e5afe5bb5fccb7a46c>:0 
  at MonoMod.RuntimeDetour.Platforms.DetourNativeX86Platform.GetDetourType (System.IntPtr from, System.IntPtr to, System.IntPtr& extra) [0x00049] in <e815268fce7a48e5afe5bb5fccb7a46c>:0 
  at MonoMod.RuntimeDetour.Platforms.DetourNativeX86Platform.Create (System.IntPtr from, System.IntPtr to, System.Nullable`1[T] type) [0x0002c] in <e815268fce7a48e5afe5bb5fccb7a46c>:0 
  at MonoMod.RuntimeDetour.Platforms.DetourNativeWindowsPlatform.Create (System.IntPtr from, System.IntPtr to, System.Nullable`1[T] type) [0x00000] in <e815268fce7a48e5afe5bb5fccb7a46c>:0 
  at MonoMod.RuntimeDetour.DetourHelper.GenerateNativeProxy (System.IntPtr target, System.Reflection.MethodBase signature) [0x000ac] in <e815268fce7a48e5afe5bb5fccb7a46c>:0 
  at MonoMod.RuntimeDetour.NativeDetour.GenerateTrampoline (System.Reflection.MethodBase signature) [0x0005f] in <e815268fce7a48e5afe5bb5fccb7a46c>:0 
  at MonoMod.RuntimeDetour.NativeDetour.GenerateTrampoline[T] () [0x0004a] in <e815268fce7a48e5afe5bb5fccb7a46c>:0 
  at FixPluginTypesSerialization.Patchers.AwakeFromLoad.Apply (System.IntPtr from) [0x0002f] in <193176db432b40fca16bd67e848b25a0>:0 
  at FixPluginTypesSerialization.Patchers.Patcher.PatchWithPdb (System.IntPtr unityModule, FixPluginTypesSerialization.Util.MiniPdbReader pdbReader, BepInEx.Configuration.ConfigEntry`1[T] functionOffsetCache) [0x00060] in <193176db432b40fca16bd67e848b25a0>:0 
  at FixPluginTypesSerialization.Patchers.Patcher.Patch (System.IntPtr unityModule, System.Int32 moduleSize, FixPluginTypesSerialization.Util.MiniPdbReader pdbReader, BepInEx.Configuration.ConfigEntry`1[T] functionOffsetCache) [0x00008] in <193176db432b40fca16bd67e848b25a0>:0 
  at FixPluginTypesSerialization.FixPluginTypesSerializationPatcher.DetourUnityPlayer () [0x00061] in <193176db432b40fca16bd67e848b25a0>:0 
  at FixPluginTypesSerialization.FixPluginTypesSerializationPatcher.InitializeInternal () [0x00000] in <193176db432b40fca16bd67e848b25a0>:0 
  at FixPluginTypesSerialization.FixPluginTypesSerializationPatcher.Initialize () [0x00074] in <193176db432b40fca16bd67e848b25a0>:0 

In this log i'm printing both the runtimedetour assembly fullname and same for Monomod.utils, which are 21.12.13.1

Here is the full log just in case : LogOutput.log

The code that triggers the exception above is available here : https://github.com/xiaoxiao921/FixPluginTypesSerialization/blob/master/src/FixPluginTypesSerialization/Patchers/AwakeFromLoad.cs#L37

created time in 25 days

startedxScooper/Makermod

started time in a month

PR opened risk-of-thunder/BepInEx.GUI

V2

Uses Avalonia, runs on net6

For testing it out cd <.sln folder>;dotnet publish -c Release -r win10-x64 in console and put the generated publish folder in BepInEx\patchers\, same for the BepInEx.GUI.Patcher.dll

Requires https://thunderstore.io/package/Twiner/WebSlog/ to run properly.

Dev environment is not the best yet since packages references are not output in the Debug folder when pressing building solution in VS and I can't figure why, so basically you have to run the cmd instead and put the files in the game folder / or use sym links

Ideally we want a github actions that run dotnet publish -c Release -r for win, macos, and linux, those last two platforms will require testing but if net6 cross platform is as good as they say everything should work

The code base is sensitive to platforms too sadly and only windows is implemented for now, most notably the Pause Game button (it pauses Threads through win api) , and the open folders buttons (it starts explorer.exe)

Small thing : dotnet publish -c Release -r generates a 100 mb folder for me, I tried using PublishTrimmed to reduce that size but without success, .exe wasnt starting anymore for me

+1266 -1014

0 comment

52 changed files

pr created time in a month

more