Skip to content
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 30 additions & 2 deletions OTAPI.Scripts/Mods/HookNpcCreate.Both.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand All @@ -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));
Expand All @@ -52,11 +53,34 @@ 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);
#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
Expand Down Expand Up @@ -89,7 +113,7 @@ public class CreateEventArgs : EventArgs
public static event EventHandler<CreateEventArgs> 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
Expand All @@ -113,11 +137,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
}
}
}
Expand Down