Skip to content

Commit be01df1

Browse files
committed
events in autodoc
1 parent 351317a commit be01df1

6 files changed

Lines changed: 121 additions & 12 deletions

File tree

autodocs/autodoc.lua

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
--#region Information
44
-- GENERATED AUTODOC
5-
-- Generated: 2026-01-28T10:54:53.955274400
5+
-- Generated: 2026-01-28T14:45:03.339480400
66
-- Luafy Version: 2.0.0
77
-- Format: Lua LS library file
88
--#endregion
@@ -469,7 +469,21 @@ function text.compound(elements) end
469469

470470
--#region Script Event
471471

472-
-- luafy:load: Executes after a reload. ; this generator does not currently provide additional information.
473-
-- luafy:tick: Executes every server tick. ; this generator does not currently provide additional information.
472+
-- luafy:load | Executes after a reload.;
473+
--
474+
-- luafy:tick | Executes every server tick.;
475+
--
476+
-- luafy:entity_takes_damage | Executes after an entity takes damage.;
477+
-- entity: LivingEntity | Living Entity that took damage.
478+
-- attacker: Entity | Entity that dealt damage.
479+
-- damage_taken: number | Damage taken.
480+
-- source: string | Identifier of Damage Source.
481+
-- was_blocked: boolean | If true, the damage was blocked.
482+
--
483+
-- luafy:entity_dies | Executes after an entity dies.;
484+
-- entity: LivingEntity | Living Entity that died.
485+
-- attacker: Entity | Entity that killed this one.
486+
-- source: string | Identifier of Damage Source.
487+
--
474488
--#endregion
475489

src/main/java/dev/diamond/luafy/autodoc/generator/LuaLanguageServerAutodocGenerator.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,11 @@ public void addScriptApi(StringBuilder doc, ApiScriptPlugin.DocInfo api) {
128128

129129
@Override
130130
public void addScriptEvent(StringBuilder doc, ScriptEvent<?> event) {
131-
addComment(doc, LuafyRegistries.SCRIPT_EVENTS.getKey(event) + ": " + event.getDesc() + " ; this generator does not currently provide additional information.");
131+
addComment(doc, LuafyRegistries.SCRIPT_EVENTS.getKey(event) + " | " + event.getDesc() + ";");
132+
for (var arg : event.getArgList()) {
133+
addComment(doc, "\t" + arg.argName() + ": " + arg.argType().getArgtypeString() + " -> " + arg.argDesc());
134+
}
135+
addComment(doc, "");
132136
}
133137

134138
@Override

src/main/java/dev/diamond/luafy/registry/ScriptEvents.java

Lines changed: 72 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,80 @@
11
package dev.diamond.luafy.registry;
22

33
import dev.diamond.luafy.Luafy;
4+
import dev.diamond.luafy.autodoc.Argtypes;
45
import dev.diamond.luafy.script.event.ScriptEvent;
6+
import net.fabricmc.fabric.api.entity.event.v1.ServerLivingEntityEvents;
57
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents;
68
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerTickEvents;
9+
import net.minecraft.commands.CommandSourceStack;
710
import net.minecraft.core.Registry;
11+
import net.minecraft.core.registries.Registries;
12+
import net.minecraft.world.damagesource.DamageSource;
13+
import net.minecraft.world.entity.LivingEntity;
814

915
public class ScriptEvents {
1016

1117
public static ScriptEvent<Object> LOAD = new ScriptEvent<>("Executes after a reload.", b -> {
1218

13-
}, (src, ctx) -> {
19+
}, (b, ctx, script) -> {
1420

1521
});
1622

1723
public static ScriptEvent<Object> TICK = new ScriptEvent<>("Executes every server tick.", b -> {
1824

19-
}, (src, ctx) -> {
25+
}, (b, ctx, script) -> {});
26+
27+
public static ScriptEvent<EntityTakesDamage> ENTITY_TAKES_DAMAGE = new ScriptEvent<>("Executes after an entity takes damage.", b -> {
28+
b.add("entity", ScriptObjects.LIVING_ENTITY, "Living Entity that took damage.");
29+
b.add("attacker", ScriptObjects.ENTITY, "Entity that dealt damage.");
30+
b.add("damage_taken", Argtypes.NUMBER, "Damage taken.");
31+
b.add("source", Argtypes.STRING, "Identifier of Damage Source.");
32+
b.add("was_blocked", Argtypes.BOOLEAN, "If true, the damage was blocked.");
33+
}, (b, ctx, script) -> {
34+
b.add("entity", ScriptObjects.LIVING_ENTITY.provideTable(ctx.e, script));
35+
b.add("attacker", ScriptObjects.ENTITY.provideTable(ctx.src.getDirectEntity(), script));
36+
b.add("damage_taken", ctx.damageTaken);
37+
38+
var v = script
39+
.getSource()
40+
.getServer()
41+
.registryAccess()
42+
.get(Registries.DAMAGE_TYPE)
43+
.orElseThrow()
44+
.value()
45+
.getKey(ctx.src.type());
46+
47+
b.add("source", v.toString());
48+
b.add("was_blocked", ctx.damageTaken);
49+
});
2050

51+
public static ScriptEvent<EntityDies> ENTITY_DIES = new ScriptEvent<>("Executes after an entity dies.", b -> {
52+
b.add("entity", ScriptObjects.LIVING_ENTITY, "Living Entity that died.");
53+
b.add("attacker", ScriptObjects.ENTITY, "Entity that killed this one.");
54+
b.add("source", Argtypes.STRING, "Identifier of Damage Source.");
55+
}, (b, ctx, script) -> {
56+
b.add("entity", ScriptObjects.LIVING_ENTITY.provideTable(ctx.e, script));
57+
b.add("attacker", ScriptObjects.ENTITY.provideTable(ctx.src.getDirectEntity(), script));
58+
59+
var v = script
60+
.getSource()
61+
.getServer()
62+
.registryAccess()
63+
.get(Registries.DAMAGE_TYPE)
64+
.orElseThrow()
65+
.value()
66+
.getKey(ctx.src.type());
67+
68+
b.add("source", v.toString());
2169
});
2270

2371

2472

2573
public static void registerAll() {
2674
Registry.register(LuafyRegistries.SCRIPT_EVENTS, Luafy.id("load"), LOAD);
2775
Registry.register(LuafyRegistries.SCRIPT_EVENTS, Luafy.id("tick"), TICK);
76+
Registry.register(LuafyRegistries.SCRIPT_EVENTS, Luafy.id("entity_takes_damage"), ENTITY_TAKES_DAMAGE);
77+
Registry.register(LuafyRegistries.SCRIPT_EVENTS, Luafy.id("entity_dies"), ENTITY_DIES);
2878
}
2979

3080

@@ -43,7 +93,27 @@ public static void applyEvents() {
4393
});
4494

4595

96+
// damage
97+
ServerLivingEntityEvents.AFTER_DAMAGE.register((e, src, baseDmgTaken, dmgTaken, isBlocked) -> {
98+
ENTITY_TAKES_DAMAGE.trigger(getCommandSourceStack(e), new ScriptEvents.EntityTakesDamage(e, src, dmgTaken, isBlocked));
99+
});
100+
101+
ServerLivingEntityEvents.AFTER_DEATH.register((e, src) -> {
102+
ENTITY_DIES.trigger(getCommandSourceStack(e), new ScriptEvents.EntityDies(e, src));
103+
});
104+
46105

106+
107+
}
108+
109+
public static CommandSourceStack getCommandSourceStack(LivingEntity le) {
110+
if (le.level().getServer() == null) {
111+
throw new RuntimeException("Tried to get the server of an entity that is not in the server (??)");
112+
}
113+
return le.level().getServer().createCommandSourceStack();
47114
}
48115

116+
public record EntityTakesDamage(LivingEntity e, DamageSource src, float damageTaken, boolean blocked) {}
117+
public record EntityDies(LivingEntity e, DamageSource src) {}
118+
49119
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package dev.diamond.luafy.script.event;
2+
3+
import dev.diamond.luafy.lua.LuaTableBuilder;
4+
import dev.diamond.luafy.script.LuaScript;
5+
6+
7+
@FunctionalInterface
8+
public interface ContextBuilder<T> {
9+
void build(LuaTableBuilder b, T ctx, LuaScript script);
10+
}

src/main/java/dev/diamond/luafy/script/event/ScriptEvent.java

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import dev.diamond.luafy.Luafy;
77
import dev.diamond.luafy.registry.LuafyRegistries;
88
import dev.diamond.luafy.lua.LuaTableBuilder;
9+
import dev.diamond.luafy.script.LuaScript;
910
import org.jetbrains.annotations.NotNull;
1011
import org.luaj.vm2.LuaTable;
1112

@@ -18,11 +19,11 @@
1819

1920
public class ScriptEvent<T> implements SimpleAutodocumentable {
2021
private final ArrayList<ScriptEntry> entries;
21-
private final BiConsumer<T, LuaTableBuilder> ctxBuilder;
22+
private final ContextBuilder<T> ctxBuilder;
2223
private final String desc;
2324
private final ArrayList<ArgDocInfo> argList;
2425

25-
public ScriptEvent(String desc, Consumer<ArglistBuilder> arglistBuilder, BiConsumer<T, LuaTableBuilder> ctxBuilder) {
26+
public ScriptEvent(String desc, Consumer<ArglistBuilder> arglistBuilder, ContextBuilder<T> ctxBuilder) {
2627
this.entries = new ArrayList<>();
2728
this.ctxBuilder = ctxBuilder;
2829

@@ -35,13 +36,15 @@ public ScriptEvent(String desc, Consumer<ArglistBuilder> arglistBuilder, BiConsu
3536
}
3637

3738
public void trigger(@NotNull CommandSourceStack src, T context) {
38-
LuaTableBuilder builder = new LuaTableBuilder();
39-
ctxBuilder.accept(context, builder);
40-
LuaTable ctx = builder.build();
4139

4240
for (ScriptEntry entry : entries) {
4341
if (entry.canExecute()) {
44-
entry.setLastResult(Luafy.SCRIPT_MANAGER.get(entry.id).execute(src, ctx));
42+
LuaScript script = Luafy.SCRIPT_MANAGER.get(entry.id);
43+
LuaTableBuilder builder = new LuaTableBuilder();
44+
ctxBuilder.build(builder, context, script);
45+
LuaTable ctx = builder.build();
46+
47+
entry.setLastResult(script.execute(src, ctx));
4548
}
4649
}
4750
}
@@ -58,6 +61,10 @@ public String getDesc() {
5861
return this.desc;
5962
}
6063

64+
public ArrayList<ArgDocInfo> getArgList() {
65+
return this.argList;
66+
}
67+
6168
@Override
6269
public String generateAutodocString() {
6370
StringBuilder s = new StringBuilder();

src/main/java/dev/diamond/luafy/script/object/AbstractScriptObject.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,10 @@ public void applyInheritanceToTable(T obj, LuaTableBuilder builder, LuaScript sc
4141
parent.ifPresent(abstractScriptObject -> abstractScriptObject.toTable(obj, builder, script));
4242
}
4343

44+
public LuaTable provideTable(T obj, LuaScript script) {
45+
return LuaTableBuilder.provide(this, obj, script);
46+
}
47+
4448
public static void makeReadonly(LuaTableBuilder builder) {
4549
builder.addMetamethod(MetamethodNames.NEW_INDEX, args -> {
4650
Luafy.LOGGER.error("Tried to write to a readonly object!");

0 commit comments

Comments
 (0)