Skip to content

Commit df4423f

Browse files
committed
Add silver berry collect trigger
1 parent d2055d6 commit df4423f

File tree

6 files changed

+81
-1
lines changed

6 files changed

+81
-1
lines changed
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
module CollabUtils2SilverBerryCollectTrigger
2+
3+
using ..Ahorn, Maple
4+
5+
@mapdef Trigger "CollabUtils2/SilverBerryCollectTrigger" SilverBerryCollectTrigger(x::Integer, y::Integer, width::Integer=Maple.defaultTriggerWidth, height::Integer=Maple.defaultTriggerHeight)
6+
7+
const placements = Ahorn.PlacementDict(
8+
"Silver Berry Collect (Collab Utils 2 / READ DOCS)" => Ahorn.EntityPlacement(
9+
SilverBerryCollectTrigger,
10+
"rectangle",
11+
),
12+
)
13+
14+
end

CollabModule.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ public override void Load() {
4646
SilverBlock.Load();
4747
MiniHeartDoorUnlockCutsceneTrigger.Load();
4848
LazyLoadingHandler.Load();
49+
SilverBerryCollectTrigger.Load();
4950

5051
Everest.Content.OnUpdate += onModAssetUpdate;
5152

@@ -68,6 +69,7 @@ public override void Unload() {
6869
SilverBlock.Unload();
6970
MiniHeartDoorUnlockCutsceneTrigger.Unload();
7071
LazyLoadingHandler.Unload();
72+
SilverBerryCollectTrigger.Unload();
7173

7274
Everest.Content.OnUpdate -= onModAssetUpdate;
7375

Loenn/lang/en_gb.lang

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,5 +62,8 @@ triggers.CollabUtils2/MiniHeartDoorUnlockCutsceneTrigger.attributes.description.
6262
# Rainbow Berry Unlock Cutscene Trigger
6363
triggers.CollabUtils2/RainbowBerryUnlockCutsceneTrigger.placements.name.default=Rainbow Berry Unlock Cutscene
6464

65+
# Silver Berry Collect Trigger
66+
triggers.CollabUtils2/SilverBerryCollectTrigger.placements.name.default=Silver Berry Collect
67+
6568
# Speed Berry Collect Trigger
6669
triggers.CollabUtils2/SpeedBerryCollectTrigger.placements.name.default=Speed Berry Collect
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
local trigger = {}
2+
trigger.name = "CollabUtils2/SilverBerryCollectTrigger"
3+
trigger.placements = {
4+
{
5+
name = "default"
6+
}
7+
}
8+
9+
return trigger
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
using Celeste.Mod.CollabUtils2.Entities;
2+
using Celeste.Mod.Entities;
3+
using Microsoft.Xna.Framework;
4+
using Mono.Cecil;
5+
using Mono.Cecil.Cil;
6+
using Monocle;
7+
using MonoMod.Cil;
8+
using MonoMod.RuntimeDetour;
9+
using System;
10+
11+
namespace Celeste.Mod.CollabUtils2.Triggers {
12+
[CustomEntity("CollabUtils2/SilverBerryCollectTrigger")]
13+
[Tracked]
14+
class SilverBerryCollectTrigger : Trigger {
15+
private static ILHook strawberryUpdateHook = null;
16+
17+
public static void Load() {
18+
strawberryUpdateHook = new ILHook(typeof(Strawberry).GetMethod("orig_Update"), hookStrawberryUpdate);
19+
}
20+
21+
public static void Unload() {
22+
strawberryUpdateHook?.Dispose();
23+
strawberryUpdateHook = null;
24+
}
25+
26+
public SilverBerryCollectTrigger(EntityData data, Vector2 offset) : base(data, offset) { }
27+
28+
private static void hookStrawberryUpdate(ILContext il) {
29+
ILCursor cursor = new ILCursor(il);
30+
31+
while (cursor.TryGotoNext(
32+
instr => instr.OpCode == OpCodes.Callvirt && (instr.Operand as MethodReference)?.FullName == "System.Boolean Monocle.Entity::CollideCheck<Celeste.GoldBerryCollectTrigger>()")) {
33+
34+
Logger.Log("CollabUtils2/SilverBerryCollectTrigger", $"Modding gold berry collect at {cursor.Index} in IL for Strawberry.orig_Update");
35+
36+
// argument 1 (player) is the same player that is used for the vanilla call, so clone it
37+
cursor.Emit(OpCodes.Dup);
38+
39+
// argument 2 (orig) will be the result of the vanilla call to CollideCheck<GoldBerryCollectTrigger>()
40+
cursor.Index++;
41+
42+
// argument 3 (self) is the strawberry that is being checked: the method we are hooking is part of it
43+
cursor.Emit(OpCodes.Ldarg_0);
44+
45+
cursor.EmitDelegate<Func<Player, bool, Strawberry, bool>>((player, orig, self) => {
46+
// collect golden berry and derivatives if the player is in a golden berry trigger, OR if it is a silver berry and the player is in a silver berry collect trigger.
47+
return orig || ((self is SilverBerry) && player.CollideCheck<SilverBerryCollectTrigger>());
48+
});
49+
}
50+
}
51+
}
52+
}

everest.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
- Name: CollabUtils2
2-
Version: 1.6.6
2+
Version: 1.6.7
33
DLL: bin/Debug/net452/CollabUtils2.dll
44
Dependencies:
55
- Name: Everest

0 commit comments

Comments
 (0)