From 5171dafc51602ebf9a2b0ef92945bfbaea9079a9 Mon Sep 17 00:00:00 2001 From: Controllerdestiny <523321293@qq.com> Date: Sat, 22 Aug 2026 18:59:33 +0800 Subject: [PATCH 1/2] fix npc not spawning --- OTAPI.Scripts/Mods/HookNpcCreate.Both.cs | 33 ++++++++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) diff --git a/OTAPI.Scripts/Mods/HookNpcCreate.Both.cs b/OTAPI.Scripts/Mods/HookNpcCreate.Both.cs index 58ddc322..91ad6a1f 100644 --- a/OTAPI.Scripts/Mods/HookNpcCreate.Both.cs +++ b/OTAPI.Scripts/Mods/HookNpcCreate.Both.cs @@ -23,6 +23,7 @@ You should have received a copy of the GNU General Public License using Mono.Cecil; using Mono.Cecil.Cil; using MonoMod; +using MonoMod.Cil; using System; using Terraria.DataStructures; @@ -34,7 +35,7 @@ You should have received a copy of the GNU General Public License void HookNpcCreate(MonoModder modder) { #if Terraria_1457_OrAbove || TerrariaServer_1457_OrAbove - var callback = modder.GetMethodDefinition(() => OTAPI.Hooks.NPC.InvokeCreate(default, default, default, default, default, default, default, default, default, default, default, default)); + var callback = modder.GetMethodDefinition(() => OTAPI.Hooks.NPC.InvokeCreate(default, default, default, default, default, default, default, default, default, default, default, default, default)); var NewNPC = modder.GetILCursor(() => Terraria.NPC.NewNPC(default, default, default, default, default, default, default, default, default, default)); #elif TerrariaServer_EntitySourcesActive || Terraria_EntitySourcesActive || tModLoader_EntitySourcesActive var callback = modder.GetMethodDefinition(() => OTAPI.Hooks.NPC.InvokeCreate(default, default, default, default, default, default, default, default, default, default)); @@ -52,11 +53,35 @@ void HookNpcCreate(MonoModder modder) #endif ); +#if Terraria_1457_OrAbove || TerrariaServer_1457_OrAbove + NewNPC.GotoNext(MoveType.After, + i => i.OpCode == OpCodes.Stloc_1 || + (i.OpCode == OpCodes.Stloc && i.Operand is VariableDefinition vd && vd.Index == 1) + ); + + NewNPC.Emit(OpCodes.Ldloc_0); + NewNPC.Emit(OpCodes.Ldc_I4_0); + NewNPC.Emit(OpCodes.Ldarg_0); + NewNPC.Emit(OpCodes.Ldarg_1); + NewNPC.Emit(OpCodes.Ldarg_2); + NewNPC.Emit(OpCodes.Ldarg_3); + NewNPC.Emit(OpCodes.Ldarg_S, (byte)4); + NewNPC.Emit(OpCodes.Ldarg_S, (byte)5); + NewNPC.Emit(OpCodes.Ldarg_S, (byte)6); + NewNPC.Emit(OpCodes.Ldarg_S, (byte)7); + NewNPC.Emit(OpCodes.Ldarg_S, (byte)8); + NewNPC.Emit(OpCodes.Ldarg_S, (byte)9); + NewNPC.Emit(OpCodes.Ldloc_1); + NewNPC.Emit(OpCodes.Call, callback); + NewNPC.Emit(OpCodes.Pop); +#else NewNPC.Next.OpCode = OpCodes.Call; NewNPC.Next.Operand = callback; foreach (var prm in NewNPC.Method.Parameters) NewNPC.Emit(OpCodes.Ldarg, prm); +#endif + } namespace OTAPI @@ -89,7 +114,7 @@ public class CreateEventArgs : EventArgs public static event EventHandler Create; #if Terraria_1457_OrAbove || TerrariaServer_1457_OrAbove - public static Terraria.NPC InvokeCreate(int Slot, int Generation, IEntitySource source, int X, int Y, int Type, int Start, float ai0, float ai1, float ai2, float ai3, int Target) + public static void InvokeCreate(int Slot, int Generation, IEntitySource source, int X, int Y, int Type, int Start, float ai0, float ai1, float ai2, float ai3, int Target, Terraria.NPC? npc = null) #elif TerrariaServer_EntitySourcesActive || Terraria_EntitySourcesActive || tModLoader_EntitySourcesActive public static Terraria.NPC InvokeCreate(IEntitySource source, int X, int Y, int Type, int Start, float ai0, float ai1, float ai2, float ai3, int Target) #else @@ -113,11 +138,15 @@ public static Terraria.NPC InvokeCreate(int X, int Y, int Type, int Start, float #if Terraria_1457_OrAbove || TerrariaServer_1457_OrAbove , Slot = Slot , Generation = Generation + , Npc = npc #endif }; Create?.Invoke(null, args); +#if Terraria_1457_OrAbove || TerrariaServer_1457_OrAbove +#else return args.Npc ?? new Terraria.NPC(); +#endif } } } From bad9185c85bac1c889dc36ad9507f6e0eb445663 Mon Sep 17 00:00:00 2001 From: Controllerdestiny <523321293@qq.com> Date: Sat, 22 Aug 2026 22:48:57 +0800 Subject: [PATCH 2/2] There's no return value right now --- OTAPI.Scripts/Mods/HookNpcCreate.Both.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/OTAPI.Scripts/Mods/HookNpcCreate.Both.cs b/OTAPI.Scripts/Mods/HookNpcCreate.Both.cs index 91ad6a1f..69d3f18a 100644 --- a/OTAPI.Scripts/Mods/HookNpcCreate.Both.cs +++ b/OTAPI.Scripts/Mods/HookNpcCreate.Both.cs @@ -73,7 +73,6 @@ void HookNpcCreate(MonoModder modder) NewNPC.Emit(OpCodes.Ldarg_S, (byte)9); NewNPC.Emit(OpCodes.Ldloc_1); NewNPC.Emit(OpCodes.Call, callback); - NewNPC.Emit(OpCodes.Pop); #else NewNPC.Next.OpCode = OpCodes.Call; NewNPC.Next.Operand = callback;