Skip to content

Commit 89a7b36

Browse files
committed
Merge branch 'upcoming' into upcoming-nuget-release
2 parents 9348ecf + 1517d65 commit 89a7b36

12 files changed

Lines changed: 150 additions & 44 deletions

OTAPI.Patcher/OTAPI.Patcher.csproj

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,11 @@
33
<PropertyGroup>
44
<OutputType>Exe</OutputType>
55
<TargetFramework>net9.0</TargetFramework>
6-
<Version>3.2.6</Version>
6+
<Version>3.3.0</Version>
77
<PreserveCompilationContext>true</PreserveCompilationContext>
88
<RuntimeIdentifiers>win;osx;linux;</RuntimeIdentifiers>
99
<Nullable>enable</Nullable>
10-
<PackageReleaseNotes>Terraria 1.4.4.9 on .NET9</PackageReleaseNotes>
10+
<PackageReleaseNotes>Terraria 1.4.5.0 on .NET9</PackageReleaseNotes>
1111
</PropertyGroup>
1212
<ItemGroup>
1313
<PackageReference Include="ModFramework.Modules.ClearScript" Version="1.1.15" />

OTAPI.Patcher/Targets/IPatchTarget.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,8 @@ public static void AddConstants(this IModPatchTarget target, string inputName, M
160160
constants.Add($"{inputName}_1442_OrAbove");
161161
if (version >= new Version("1.4.4.8"))
162162
constants.Add($"{inputName}_1448_OrAbove");
163+
if (version >= new Version("1.4.5"))
164+
constants.Add($"{inputName}_1450_OrAbove");
163165

164166
target.ModContext.ReferenceConstants.AddRange(constants.Select(x => $"#define {x}"));
165167

OTAPI.Scripts/Mods/HookCommandProcessing.Server.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,13 @@ void HookCommandProcessing(MonoModder modder)
4747
throw new NotSupportedException("Expected the second variable to be string");
4848

4949
var exceptionHandler = startDedInputCallBack.Body.ExceptionHandlers.Single(
50-
x => x.TryStart.Next.OpCode == OpCodes.Ldstr
50+
x => (
51+
x.TryStart.Next.OpCode == OpCodes.Ldstr
5152
&& x.TryStart.Next.Operand.Equals("CLI.Help_Command")
53+
) || (
54+
x.TryStart.OpCode == OpCodes.Ldstr
55+
&& x.TryStart.Operand.Equals("CLI.Help_Command")
56+
)
5257
);
5358

5459
startDedInputCallBack.Goto(exceptionHandler.TryStart, MoveType.Before);

OTAPI.Scripts/Mods/HookNpcBossBag.Server.cs

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,9 @@ void HookNpcBossBag(ModFramework.ModFwModder modder)
3939
})
4040
{
4141
var callback = csr.Module.ImportReference(
42-
#if TerrariaServer_EntitySourcesActive || Terraria_EntitySourcesActive || tModLoader_EntitySourcesActive
42+
#if TerrariaServer_1450_OrAbove || Terraria__1450_OrAbove || tModLoader_1450_OrAbove
43+
modder.GetMethodDefinition(() => OTAPI.Hooks.NPC.InvokeBossBag(null, 0, 0, 0, 0, 0, 0, false, 0, false, null))
44+
#elif TerrariaServer_EntitySourcesActive || Terraria_EntitySourcesActive || tModLoader_EntitySourcesActive
4345
modder.GetMethodDefinition(() => OTAPI.Hooks.NPC.InvokeBossBag(null, 0, 0, 0, 0, 0, 0, false, 0, false, false, null))
4446
#else
4547
modder.GetMethodDefinition(() => OTAPI.Hooks.NPC.InvokeBossBag(0, 0, 0, 0, 0, 0, false, 0, false, false, null))
@@ -98,6 +100,9 @@ public class BossBagEventArgs : EventArgs
98100
public bool NoBroadcast { get; set; }
99101
public int Pfix { get; set; }
100102
public bool NoGrabDelay { get; set; }
103+
#if TerrariaServer_1450_OrAbove || Terraria__1450_OrAbove || tModLoader_1450_OrAbove
104+
[Obsolete("ReverseLookup is no longer used in Terraria 1.4.5 and above, but is kept for API compatibility.")]
105+
#endif
101106
public bool ReverseLookup { get; set; }
102107
}
103108
public static event EventHandler<BossBagEventArgs> BossBag;
@@ -115,7 +120,9 @@ public static int InvokeBossBag(
115120
bool noBroadcast,
116121
int pfix,
117122
bool noGrabDelay,
123+
#if !TerrariaServer_1450_OrAbove && !Terraria__1450_OrAbove && !tModLoader_1450_OrAbove
118124
bool reverseLookup,
125+
#endif
119126
Terraria.NPC npc
120127
)
121128
{
@@ -133,14 +140,19 @@ Terraria.NPC npc
133140
NoBroadcast = noBroadcast,
134141
Pfix = pfix,
135142
NoGrabDelay = noGrabDelay,
143+
#if TerrariaServer_1450_OrAbove || Terraria__1450_OrAbove || tModLoader_1450_OrAbove
144+
ReverseLookup = false, // no longer used, but kept for api compatibility.
145+
#else
136146
ReverseLookup = reverseLookup,
147+
#endif
137148
Npc = npc,
138149
};
139150
BossBag?.Invoke(null, args);
140151
if (args.Result == HookResult.Cancel)
141152
return -1;
142-
143-
#if TerrariaServer_EntitySourcesActive || Terraria_EntitySourcesActive || tModLoader_EntitySourcesActive
153+
#if TerrariaServer_1450_OrAbove || Terraria__1450_OrAbove || tModLoader_1450_OrAbove
154+
return Terraria.Item.NewItem(Source, args.X, args.Y, args.Width, args.Height, args.Type, args.Stack, args.NoBroadcast, args.Pfix, args.NoGrabDelay);
155+
#elif TerrariaServer_EntitySourcesActive || Terraria_EntitySourcesActive || tModLoader_EntitySourcesActive
144156
return Terraria.Item.NewItem(Source, args.X, args.Y, args.Width, args.Height, args.Type, args.Stack, args.NoBroadcast, args.Pfix, args.NoGrabDelay, args.ReverseLookup);
145157
#else
146158
return Terraria.Item.NewItem(args.X, args.Y, args.Width, args.Height, args.Type, args.Stack, args.NoBroadcast, args.Pfix, args.NoGrabDelay, args.ReverseLookup);

OTAPI.Scripts/Mods/HookNpcKilled.Server.cs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,10 +34,16 @@ void HookNpcKilled(MonoModder modder)
3434
{
3535
var checkDead = modder.GetILCursor(() => (new Terraria.NPC()).checkDead());
3636

37+
#if TerrariaServer_1450_OrAbove || Terraria__1450_OrAbove || tModLoader_1450_OrAbove
38+
var declaringType = "Terraria.NPC";
39+
#else
40+
var declaringType = "Terraria.Entity";
41+
#endif
42+
3743
checkDead.GotoNext(
3844
// active = false;
3945
i => i.OpCode == OpCodes.Ldc_I4_0
40-
, i => i.OpCode == OpCodes.Stfld && i.Operand is FieldReference fieldReference && fieldReference.Name == "active" && fieldReference.DeclaringType.FullName == "Terraria.Entity"
46+
, i => i.OpCode == OpCodes.Stfld && i.Operand is FieldReference fieldReference && fieldReference.Name == "active" && fieldReference.DeclaringType.FullName == declaringType
4147
);
4248

4349
checkDead.EmitDelegate(OTAPI.Hooks.NPC.InvokeKilled);

OTAPI.Scripts/Mods/HookNpcLoot.Server.cs

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,9 @@ void HookNpcLoot(MonoModder modder)
4242
);
4343

4444
NewNPC.Emit(OpCodes.Ldarg_0); // NPC instance
45-
#if TerrariaServer_EntitySourcesActive || Terraria_EntitySourcesActive || tModLoader_EntitySourcesActive
45+
#if TerrariaServer_1450_OrAbove || Terraria__1450_OrAbove || tModLoader_1450_OrAbove
46+
NewNPC.Next.Operand = modder.GetMethodDefinition(() => OTAPI.Hooks.NPC.InvokeDropLoot(default, default, default, default, default, default, default, default, default, default, default));
47+
#elif TerrariaServer_EntitySourcesActive || Terraria_EntitySourcesActive || tModLoader_EntitySourcesActive
4648
NewNPC.Next.Operand = modder.GetMethodDefinition(() => OTAPI.Hooks.NPC.InvokeDropLoot(default, default, default, default, default, default, default, default, default, default, default, default));
4749
#else
4850
NewNPC.Next.Operand = modder.GetMethodDefinition(() => OTAPI.Hooks.NPC.InvokeDropLoot(default, default, default, default, default, default, default, default, default, default, default));
@@ -74,6 +76,9 @@ public class DropLootEventArgs : EventArgs
7476
public bool NoBroadcast { get; set; }
7577
public int Pfix { get; set; }
7678
public bool NoGrabDelay { get; set; }
79+
#if TerrariaServer_1450_OrAbove || Terraria__1450_OrAbove || tModLoader_1450_OrAbove
80+
[Obsolete("ReverseLookup is no longer used in Terraria 1.4.5 and above, but is kept for API compatibility.")]
81+
#endif
7782
public bool ReverseLookup { get; set; }
7883
}
7984
public static event EventHandler<DropLootEventArgs>? DropLoot;
@@ -83,7 +88,12 @@ public static int InvokeDropLoot(Terraria.DataStructures.IEntitySource source, i
8388
#else
8489
public static int InvokeDropLoot(int X, int Y, int Width, int Height, int Type,
8590
#endif
91+
92+
#if TerrariaServer_1450_OrAbove || Terraria__1450_OrAbove || tModLoader_1450_OrAbove
93+
int Stack, bool noBroadcast, int pfix, bool noGrabDelay,
94+
#else
8695
int Stack, bool noBroadcast, int pfix, bool noGrabDelay, bool reverseLookup,
96+
#endif
8797
Terraria.NPC instance)
8898
{
8999
var args = new DropLootEventArgs()
@@ -101,15 +111,21 @@ public static int InvokeDropLoot(int X, int Y, int Width, int Height, int Type,
101111
NoBroadcast = noBroadcast,
102112
Pfix = pfix,
103113
NoGrabDelay = noGrabDelay,
114+
#if TerrariaServer_1450_OrAbove || Terraria__1450_OrAbove || tModLoader_1450_OrAbove
115+
ReverseLookup = false, // no longer used, but kept for api compatibility.
116+
#else
104117
ReverseLookup = reverseLookup,
118+
#endif
105119
Npc = instance,
106120

107121
ItemIndex = 0,
108122
};
109123
DropLoot?.Invoke(null, args);
110124
if (args.Result != HookResult.Cancel)
111125
{
112-
#if TerrariaServer_EntitySourcesActive || Terraria_EntitySourcesActive || tModLoader_EntitySourcesActive
126+
#if TerrariaServer_1450_OrAbove || Terraria__1450_OrAbove || tModLoader_1450_OrAbove
127+
args.ItemIndex = Terraria.Item.NewItem(args.Source, X, Y, Width, Height, Type, Stack, noBroadcast, pfix, noGrabDelay);
128+
#elif TerrariaServer_EntitySourcesActive || Terraria_EntitySourcesActive || tModLoader_EntitySourcesActive
113129
args.ItemIndex = Terraria.Item.NewItem(args.Source, X, Y, Width, Height, Type, Stack, noBroadcast, pfix, noGrabDelay, reverseLookup);
114130
#else
115131
args.ItemIndex = Terraria.Item.NewItem(X, Y, Width, Height, Type, Stack, noBroadcast, pfix, noGrabDelay, reverseLookup);

OTAPI.Scripts/Mods/HookNpcTransform.Server.cs

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,11 +33,16 @@ You should have received a copy of the GNU General Public License
3333
[MonoMod.MonoModIgnore]
3434
void HookNpcTransform(MonoModder modder)
3535
{
36+
#if TerrariaServer_1450_OrAbove || Terraria__1450_OrAbove || tModLoader_1450_OrAbove
37+
var transform = modder.GetILCursor(() => (new Terraria.NPC()).Transform(0, 0f, 0f, 0f, 0f, false));
38+
#else
3639
var transform = modder.GetILCursor(() => (new Terraria.NPC()).Transform(0));
40+
#endif
3741

3842
transform.GotoNext(ins => ins.Operand is FieldReference fr && fr.Name == "netMode" && ins.Next.OpCode == OpCodes.Ldc_I4_2);
3943
transform.Emit(OpCodes.Ldarg_0);
40-
transform.Emit(OpCodes.Ldarga, transform.Method.Parameters.Single());
44+
foreach(var parameter in transform.Method.Parameters)
45+
transform.Emit(OpCodes.Ldarga, parameter);
4146
transform.EmitDelegate(OTAPI.Hooks.NPC.InvokeTransforming);
4247
transform.Emit(OpCodes.Brtrue, transform.Next);
4348
transform.Emit(OpCodes.Ret);
@@ -55,18 +60,44 @@ public class TransformingEventArgs : EventArgs
5560

5661
public Terraria.NPC Npc { get; set; }
5762
public int NewType { get; set; }
63+
64+
#if TerrariaServer_1450_OrAbove || Terraria__1450_OrAbove || tModLoader_1450_OrAbove
65+
public float Ai0 { get; set; }
66+
public float Ai1 { get; set; }
67+
public float Ai2 { get; set; }
68+
public float Ai3 { get; set; }
69+
public bool WithReposition { get; set; }
70+
#endif
5871
}
5972
public static event EventHandler<TransformingEventArgs> Transforming;
6073

61-
public static bool InvokeTransforming(Terraria.NPC instance, ref int newType)
74+
public static bool InvokeTransforming(Terraria.NPC instance, ref int newType
75+
#if TerrariaServer_1450_OrAbove || Terraria__1450_OrAbove || tModLoader_1450_OrAbove
76+
, ref float ai0, ref float ai1, ref float ai2, ref float ai3, ref bool withReposition
77+
#endif
78+
)
6279
{
6380
var args = new TransformingEventArgs()
6481
{
6582
Npc = instance,
6683
NewType = newType,
84+
#if TerrariaServer_1450_OrAbove || Terraria__1450_OrAbove || tModLoader_1450_OrAbove
85+
Ai0 = ai0,
86+
Ai1 = ai1,
87+
Ai2 = ai2,
88+
Ai3 = ai3,
89+
WithReposition = withReposition,
90+
#endif
6791
};
6892
Transforming?.Invoke(null, args);
6993
newType = args.NewType;
94+
#if TerrariaServer_1450_OrAbove || Terraria__1450_OrAbove || tModLoader_1450_OrAbove
95+
ai0 = args.Ai0;
96+
ai1 = args.Ai1;
97+
ai2 = args.Ai2;
98+
ai3 = args.Ai3;
99+
withReposition = args.WithReposition;
100+
#endif
70101
return args.Result != HookResult.Cancel;
71102
}
72103
}

OTAPI.Scripts/Mods/OnPacketWrite.Server.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,9 @@ void OnPacketWrite(MonoModder modder)
5757
callback.Parameters.Add(new ParameterDefinition("ms", ParameterAttributes.None, ms.VariableType));
5858
callback.Parameters.Add(new ParameterDefinition("bw", ParameterAttributes.None, bw.VariableType));
5959

60-
sendData.GotoNext(ins => ins.Operand is MethodReference mr && mr.Name == "IsConnected" && mr.DeclaringType.Name == "ISocket");
60+
sendData.GotoNext(ins => ins.Operand is MethodReference mr && mr.Name == "IsConnected" && (
61+
mr.DeclaringType.Name == "ISocket" || mr.DeclaringType.Name == "RemoteServer"
62+
));
6163
sendData.GotoPrev(ins => ins.Operand is FieldReference fr && fr.Name == "netMode" && fr.DeclaringType.Name == "Main");
6264

6365
sendData.Emit(OpCodes.Ldloc, bufferID);

OTAPI.Scripts/Patches/HookChestQuickStack.Server.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,9 @@ partial class ChestHooks
3838
[Modification(ModType.PreMerge, "Hooking chest stacking")]
3939
static void HookChestQuickStack(ModFwModder modder)
4040
{
41+
#if TerrariaServer_1450_OrAbove || Terraria__1450_OrAbove || tModLoader_1450_OrAbove
42+
Console.WriteLine("[TODO] reimplement HookChestQuickStack for 1.4.5+");
43+
#else
4144
var csr = modder.GetILCursor(() => Terraria.Chest.PutItemInNearbyChest(null, default));
4245
PutItemInNearbyChest = csr.Method;
4346

@@ -74,6 +77,7 @@ static void HookChestQuickStack(ModFwModder modder)
7477
new { OpCodes.Br, Operand = (Instruction)beginInstruction.Operand }
7578
);
7679
}
80+
#endif
7781
}
7882

7983
private static void Modder_OnRewritingMethodBody(MonoModder modder, MethodBody body, Instruction instr, int instri)

OTAPI.Scripts/Patches/PatchNpcStrikeArgs.Server.cs

Lines changed: 51 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -15,28 +15,30 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1515
1616
You should have received a copy of the GNU General Public License
1717
along with this program. If not, see <http://www.gnu.org/licenses/>.
18-
*/
18+
*/
1919
#if !tModLoaderServer_V1_3
2020
using ModFramework;
21-
using Mono.Cecil;
22-
using Mono.Cecil.Cil;
23-
using MonoMod;
21+
using Mono.Cecil;
22+
using Mono.Cecil.Cil;
23+
using MonoMod;
2424
using System;
25-
using System.Linq;
26-
27-
/// <summary>
28-
/// @doc Adds a Terraria.Entity entity parameter to Terraria.NPC.StrikeNPC.
29-
/// </summary>
30-
[MonoModIgnore]
31-
partial class NpcStrikeArgs
32-
{
33-
//static ParameterDefinition Entity { get; set; }
34-
//static MethodDefinition StrikeNPC { get; set; }
35-
36-
[Modification(ModType.PreMerge, "Patching in entity source for NPC strike")]
37-
static void PatchNpcStrikeArgs(ModFwModder modder)
38-
{
25+
using System.Linq;
26+
27+
/// <summary>
28+
/// @doc Adds a Terraria.Entity entity parameter to Terraria.NPC.StrikeNPC.
29+
/// </summary>
30+
[MonoModIgnore]
31+
partial class NpcStrikeArgs
32+
{
33+
[Modification(ModType.PreMerge, "Patching in entity source for NPC strike")]
34+
static void PatchNpcStrikeArgs(ModFwModder modder)
35+
{
36+
#if TerrariaServer_1450_OrAbove || Terraria__1450_OrAbove || tModLoader_1450_OrAbove
37+
var csr = modder.GetILCursor(() => (new Terraria.NPC()).StrikeNPC(0, 0, 0, false, false, false, 0));
38+
#else
3939
var csr = modder.GetILCursor(() => (new Terraria.NPC()).StrikeNPC(0, 0, 0, false, false, false));
40+
#endif
41+
4042
var redirects = csr.Method.DeclaringType.Methods
4143
.Where(x => (HookEmitter.HookMethodNamePrefix + x.Name) == csr.Method.Name || ("orig_" + x.Name) == csr.Method.Name)
4244
.Select(x => x.GetILCursor())
@@ -45,16 +47,16 @@ static void PatchNpcStrikeArgs(ModFwModder modder)
4547
foreach (var method in redirects.Append(csr))
4648
{
4749
ParameterDefinition Entity;
48-
method.Method.Parameters.Add(Entity = new ("entity",
49-
ParameterAttributes.HasDefault | ParameterAttributes.Optional,
50-
51-
modder.Module.ImportReference(modder.GetDefinition<Terraria.Entity>())
50+
method.Method.Parameters.Add(Entity = new ("entity",
51+
ParameterAttributes.HasDefault | ParameterAttributes.Optional,
52+
53+
modder.Module.ImportReference(modder.GetDefinition<Terraria.Entity>())
5254
)
5355
{
5456
Constant = null
5557
});
5658

57-
modder.OnRewritingMethodBody += (MonoModder modder, MethodBody body, Instruction instr, int instri) =>
59+
modder.OnRewritingMethodBody += (MonoModder modder, MethodBody body, Instruction instr, int instri) =>
5860
{
5961
if (instr.Operand is MethodReference methodReference)
6062
{
@@ -71,12 +73,22 @@ static void PatchNpcStrikeArgs(ModFwModder modder)
7173
switch (methodName.Replace(HookEmitter.HookMethodNamePrefix, ""))
7274
{
7375
case "MessageBuffer.GetData":
76+
var playerRef = Instruction.Create(OpCodes.Ldsfld, modder.Module.ImportReference(modder.GetFieldDefinition(() => Terraria.Main.player)));
77+
body.GetILProcessor().InsertBefore(instr, playerRef);
7478
body.GetILProcessor().InsertBefore(instr,
75-
new { OpCodes.Ldsfld, Operand = modder.Module.ImportReference(modder.GetFieldDefinition(() => Terraria.Main.player)) },
76-
new { OpCodes.Ldarg_0 },
77-
new { OpCodes.Ldfld, Operand = modder.Module.ImportReference(modder.GetFieldDefinition(() => (new Terraria.MessageBuffer()).whoAmI)) },
78-
new { OpCodes.Ldelem_Ref }
79-
);
79+
new { OpCodes.Ldarg_0 },
80+
new { OpCodes.Ldfld, Operand = modder.Module.ImportReference(modder.GetFieldDefinition(() => (new Terraria.MessageBuffer()).whoAmI)) },
81+
new { OpCodes.Ldelem_Ref }
82+
);
83+
84+
var hasWhoAmI = instr.Previous.OpCode == OpCodes.Ldfld &&
85+
instr.Previous.Operand is FieldReference fieldReference &&
86+
fieldReference.Name == "whoAmI";
87+
if (hasWhoAmI) { // 145+
88+
// rewire the branching
89+
var brs = instr.Previous(x => x.OpCode == OpCodes.Br_S);
90+
brs.Operand = playerRef;
91+
}
8092
break;
8193

8294
case "NPC.StrikeNPCNoInteraction":
@@ -96,13 +108,21 @@ static void PatchNpcStrikeArgs(ModFwModder modder)
96108
);
97109
break;
98110

111+
case "Projectile.Damage_PVE_Inner":
112+
// find the NPC parameter
113+
var prm = body.Method.Parameters.Single(x => x.ParameterType.FullName == "Terraria.NPC");
114+
body.GetILProcessor().InsertBefore(instr,
115+
new { OpCodes.Ldarg, Operand = prm }
116+
);
117+
break;
118+
99119
default:
100-
throw new NotImplementedException($"{body.Method.Name} is not a supported caller for this modification");
120+
throw new NotImplementedException($"{body.Method.FullName} is not a supported caller for this modification");
101121
}
102122
}
103123
}
104124
};
105-
}
106-
}
125+
}
126+
}
107127
}
108128
#endif

0 commit comments

Comments
 (0)