Skip to content

Commit f2d3fdc

Browse files
committed
restructure functions to make it easier to deal with
1 parent 882be23 commit f2d3fdc

14 files changed

Lines changed: 194 additions & 41 deletions

README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,9 @@ this mod uses the FiguraMC implementation of Lua.
2222
- [x] threaded
2323
- [x] events
2424
- APIs / game interfaces
25-
- [ ] entity
26-
- [ ] block
27-
- [ ] item
25+
- [x] entity
26+
- [x] block
27+
- [x] item
2828
- [ ] world/server
2929
- [x] math (vectors, mainly)
3030
- other

src/main/java/dev/diamond/luafy/autodoc/FunctionListBuilder.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,15 @@
11
package dev.diamond.luafy.autodoc;
22

3+
import dev.diamond.luafy.lua.ScriptFunction;
34
import org.luaj.vm2.LuaFunction;
45
import org.luaj.vm2.LuaTable;
5-
import org.luaj.vm2.LuaValue;
66
import org.luaj.vm2.Varargs;
77
import org.luaj.vm2.lib.VarArgFunction;
88

99
import java.util.ArrayList;
1010
import java.util.Collection;
1111
import java.util.HashMap;
1212
import java.util.function.Consumer;
13-
import java.util.function.Function;
1413

1514
public class FunctionListBuilder {
1615
private final HashMap<String, LuaFunction> functions;
@@ -21,7 +20,7 @@ public FunctionListBuilder() {
2120
this.documentation = new ArrayList<>();
2221
}
2322

24-
public void add(String name, Function<Varargs, LuaValue> function, String desc, Consumer<ArglistBuilder> arglistBuilder, Argtype returnType) {
23+
public void add(String name, ScriptFunction function, String desc, Consumer<ArglistBuilder> arglistBuilder, Argtype returnType) {
2524
this.functions.put(name, new VarArgFunction() {
2625
@Override
2726
public Varargs invoke(Varargs args) {

src/main/java/dev/diamond/luafy/lua/LuaTableBuilder.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ private void addInternal(String key, LuaValue value) {
3737
public void add(String key, float f) { addInternal(key, LuaValue.valueOf(f)); }
3838
public void add(String key, double d) { addInternal(key, LuaValue.valueOf(d)); }
3939
public void add(String key, LuaTable tbl) { addInternal(key, tbl); }
40-
public void add(String key, Function<Varargs, LuaValue> function) { addInternal(key, new VarArgFunction() {
40+
public void add(String key, ScriptFunction function) { addInternal(key, new VarArgFunction() {
4141
@Override
4242
public Varargs invoke(Varargs args) {
4343
return function.apply(args);
Lines changed: 133 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,133 @@
1+
package dev.diamond.luafy.lua;
2+
3+
import dev.diamond.luafy.script.LuaScript;
4+
import dev.diamond.luafy.script.object.AbstractScriptObject;
5+
import net.minecraft.commands.CommandSourceStack;
6+
import org.luaj.vm2.*;
7+
8+
import java.util.function.Function;
9+
10+
@FunctionalInterface
11+
public interface ScriptFunction extends Function<Varargs, LuaValue> {
12+
13+
LuaValue call(ArgumentSupplier args);
14+
15+
@Override
16+
default LuaValue apply(Varargs args) {
17+
return call(new ArgumentSupplier(args));
18+
}
19+
20+
class ArgumentSupplier {
21+
private final Varargs args;
22+
private int argIdx;
23+
24+
private ArgumentSupplier(Varargs args) {
25+
this.args = args;
26+
this.argIdx = 1;
27+
}
28+
29+
public LuaTable getTable(int idx) {
30+
return args.arg(idx).checktable();
31+
}
32+
33+
public int getInt(int idx) {
34+
return args.arg(idx).toint();
35+
}
36+
37+
public float getFloat(int idx) {
38+
return args.arg(idx).tofloat();
39+
}
40+
41+
public boolean getBoolean(int idx) {
42+
return args.arg(idx).toboolean();
43+
}
44+
45+
public String getString(int idx) {
46+
return MetamethodImpl.tostring(args.arg(idx));
47+
}
48+
49+
public LuaValue getLuaValue(int idx) {
50+
return args.arg(idx);
51+
}
52+
53+
public LuaFunction getFunction(int idx) {
54+
return args.arg(idx).checkfunction();
55+
}
56+
57+
public <T> T getScriptObject(AbstractScriptObject<T> obj, int idx, CommandSourceStack src, LuaScript script) {
58+
return obj.toThing(getTable(idx), src, script);
59+
}
60+
61+
62+
public LuaTable nextTable() {
63+
return args.arg(this.argIdx++).checktable();
64+
}
65+
66+
public int nextInt() {
67+
return args.arg(this.argIdx++).toint();
68+
}
69+
70+
public float nextFloat() {
71+
return args.arg(this.argIdx++).tofloat();
72+
}
73+
74+
public boolean nextBoolean() {
75+
return args.arg(this.argIdx++).toboolean();
76+
}
77+
78+
public String nextString() {
79+
return MetamethodImpl.tostring(args.arg(this.argIdx++));
80+
}
81+
82+
public LuaValue nextLuaValue() {
83+
return args.arg(this.argIdx++);
84+
}
85+
86+
public LuaFunction nextFunction() {
87+
return args.arg(this.argIdx++).checkfunction();
88+
}
89+
90+
public <T> T nextScriptObject(AbstractScriptObject<T> obj, CommandSourceStack src, LuaScript script) {
91+
return obj.toThing(getTable(this.argIdx++), src, script);
92+
}
93+
94+
95+
public LuaTable nextTable(LuaTable def) {
96+
return args.arg(this.argIdx++).checktable().opttable(def);
97+
}
98+
99+
public int nextInt(int def) {
100+
return args.arg(this.argIdx++).optint(def);
101+
}
102+
103+
public float nextFloat(float def) {
104+
return (float) args.arg(this.argIdx++).optdouble(def);
105+
}
106+
107+
public boolean nextBoolean(boolean def) {
108+
return args.arg(this.argIdx++).optboolean(def);
109+
}
110+
111+
public String nextString(String def) {
112+
return MetamethodImpl.tostring(args.arg(this.argIdx++).optstring(LuaString.valueOf(def)));
113+
}
114+
115+
public LuaValue nextLuaValue(LuaValue def) {
116+
return args.arg(this.argIdx++).optvalue(def);
117+
}
118+
119+
public LuaFunction nextFunction(LuaFunction def) {
120+
return args.arg(this.argIdx++).optfunction(def);
121+
}
122+
123+
public <T> T nextScriptObject(AbstractScriptObject<T> obj, CommandSourceStack src, LuaScript script, T def) {
124+
LuaTable table = getTable(this.argIdx++);
125+
if (table.isnil()) {
126+
return def;
127+
} else {
128+
return obj.toThing(table, src, script);
129+
}
130+
}
131+
132+
}
133+
}

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22

33
import dev.diamond.luafy.Luafy;
44
import dev.diamond.luafy.script.object.*;
5-
import dev.diamond.luafy.script.object.game.BlockScriptObject;
6-
import dev.diamond.luafy.script.object.game.ItemScriptObject;
5+
import dev.diamond.luafy.script.object.game.RegistryBlockScriptObject;
6+
import dev.diamond.luafy.script.object.game.RegistryItemScriptObject;
77
import dev.diamond.luafy.script.object.game.ItemStackScriptObject;
88
import dev.diamond.luafy.script.object.game.entity.EntityScriptObject;
99
import dev.diamond.luafy.script.object.game.entity.LivingEntityScriptObject;
@@ -23,8 +23,8 @@ public class ScriptObjects {
2323
public static PlayerScriptObject PLAYER = new PlayerScriptObject();
2424

2525
// game objects
26-
public static BlockScriptObject BLOCK = new BlockScriptObject();
27-
public static ItemScriptObject ITEM = new ItemScriptObject();
26+
public static RegistryBlockScriptObject BLOCK = new RegistryBlockScriptObject();
27+
public static RegistryItemScriptObject ITEM = new RegistryItemScriptObject();
2828
public static ItemStackScriptObject ITEM_STACK = new ItemStackScriptObject();
2929

3030
public static void registerAll() {

src/main/java/dev/diamond/luafy/script/api/FabricApi.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,15 +31,16 @@ public void addFunctions(ScriptApiBuilder apiBuilder) {
3131
}, Argtypes.STRING);
3232

3333
builder.add("has_mod", args -> {
34-
String modid = MetamethodImpl.tostring(args.arg1());
34+
String modid = args.nextString();
35+
3536
Optional<ModContainer> mod = FabricLoader.getInstance().getModContainer(modid);
3637
return LuaBoolean.valueOf(mod.isPresent());
3738
}, "Returns true if the specified mod exists.", args -> {
3839
args.add("modid", Argtypes.STRING, "A mod id.");
3940
}, Argtypes.BOOLEAN);
4041

4142
builder.add("get_mod", args -> {
42-
String modid = MetamethodImpl.tostring(args.arg1());
43+
String modid = args.nextString();
4344

4445
Optional<ModContainer> mod = FabricLoader.getInstance().getModContainer(modid);
4546
if (mod.isPresent()) {

src/main/java/dev/diamond/luafy/script/api/LuafyApi.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@ public void addFunctions(ScriptApiBuilder apiBuilder) {
2525

2626
apiBuilder.addGroupless(builder -> {
2727
builder.add("script", args -> {
28-
String script = MetamethodImpl.tostring(args.arg1());
29-
LuaTable context = args.arg(2).isnil() ? LuaTable.tableOf() : args.arg(2).checktable();
28+
String script = args.nextString();
29+
LuaTable context = args.nextTable(LuaValue.tableOf());
3030

3131
var future = Luafy.SCRIPT_MANAGER.get(Identifier.parse(script)).execute(this.script.getSource().getServer().createCommandSourceStack(), context);
3232
return LuaTableBuilder.provide(b -> ScriptObjects.SCRIPT_RESULT.toTable(future, b, this.script));
@@ -50,7 +50,7 @@ public void addFunctions(ScriptApiBuilder apiBuilder) {
5050
}, "Returns the version of LuaJ used by the mod.", args -> {}, Argtypes.STRING);
5151

5252
builder.add("dump", args -> {
53-
LuaTable table = args.arg1().checktable();
53+
LuaTable table = args.nextTable();
5454

5555
return LuaValue.valueOf(dumpTable(table));
5656
}, "Dump a table to a string.", args -> {

src/main/java/dev/diamond/luafy/script/api/MathApi.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ public void addFunctions(ScriptApiBuilder apiBuilder) {
1717
apiBuilder.addGroupless(builder -> {
1818
builder.add("vec3d", args -> {
1919
var b = new LuaTableBuilder();
20-
ScriptObjects.VEC3D.toTable(new Vec3(args.arg(1).tofloat(), args.arg(2).tofloat(), args.arg(3).tofloat()), b, this.script);
20+
ScriptObjects.VEC3D.toTable(new Vec3(args.nextFloat(), args.nextFloat(), args.nextFloat()), b, this.script);
2121
return b.build();
2222
}, "Creates a 3-component vector object.", b -> {
2323
b.add("x", Argtypes.NUMBER, "x component");

src/main/java/dev/diamond/luafy/script/api/MinecraftApi.java

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ public void addFunctions(ScriptApiBuilder apiBuilder) {
5252
}, "Returns the current Minecraft version string.", args -> {}, Argtypes.STRING);
5353

5454
builder.add("say", args -> {
55-
String s = MetamethodImpl.tostring(args.arg1());
55+
String s = args.nextString();
5656

5757
for (ServerPlayer spe : script.getSource().getServer().getPlayerList().getPlayers()) {
5858
spe.sendSystemMessage(Component.literal(s), false);
@@ -67,7 +67,7 @@ public void addFunctions(ScriptApiBuilder apiBuilder) {
6767
}, Argtypes.NIL);
6868

6969
builder.add("command", args -> {
70-
String s = MetamethodImpl.tostring(args.arg1());
70+
String s = args.nextString();
7171
var source = script.getSource().getServer().createCommandSourceStack();
7272
var cmd = parseCommand(s, source);
7373
int result = executeCommand(cmd, source);
@@ -77,10 +77,10 @@ public void addFunctions(ScriptApiBuilder apiBuilder) {
7777
}, Argtypes.INTEGER);
7878

7979
builder.add("note", args -> {
80-
Note note = ScriptEnums.NOTE.fromKey(MetamethodImpl.tostring(args.arg(1)));
81-
Instrument instrument = ScriptEnums.INSTRUMENT.fromKey(MetamethodImpl.tostring(args.arg(2)));
82-
Vec3 pos = ScriptObjects.VEC3D.toThing(args.arg(3).checktable(), script.getSource(), this.script);
83-
boolean particle = args.arg(4).or(LuaBoolean.TRUE).checkboolean();
80+
Note note = ScriptEnums.NOTE.fromKey(args.nextString());
81+
Instrument instrument = ScriptEnums.INSTRUMENT.fromKey(args.nextString());
82+
Vec3 pos = ScriptObjects.VEC3D.toThing(args.nextTable(), script.getSource(), this.script);
83+
boolean particle = args.nextBoolean(true);
8484

8585
ServerLevel world = script.getSource().getLevel();
8686

@@ -102,7 +102,7 @@ public void addFunctions(ScriptApiBuilder apiBuilder) {
102102
}, Argtypes.NIL);
103103

104104
builder.add("sleep", args -> {
105-
float seconds = args.arg1().tofloat();
105+
float seconds = args.nextFloat();
106106
try {
107107
Thread.sleep((long) (seconds * 1000));
108108
} catch (InterruptedException e) {
@@ -117,7 +117,7 @@ public void addFunctions(ScriptApiBuilder apiBuilder) {
117117

118118
apiBuilder.addGroup("entities", builder -> {
119119
builder.add("get_player_from_selector", args -> {
120-
String selector = MetamethodImpl.tostring(args.arg1());
120+
String selector = args.nextString();
121121
EntitySelectorParser reader = new EntitySelectorParser(new StringReader(selector), true);
122122
try {
123123
EntitySelector s = reader.parse();
@@ -136,7 +136,7 @@ public void addFunctions(ScriptApiBuilder apiBuilder) {
136136
}, ScriptObjects.PLAYER);
137137

138138
builder.add("get_entity_from_selector", args -> {
139-
String selector = MetamethodImpl.tostring(args.arg1());
139+
String selector = args.nextString();
140140
EntitySelectorParser reader = new EntitySelectorParser(new StringReader(selector), true);
141141
try {
142142
EntitySelector s = reader.parse();
@@ -155,7 +155,7 @@ public void addFunctions(ScriptApiBuilder apiBuilder) {
155155
}, ScriptObjects.ENTITY);
156156

157157
builder.add("get_entities_from_selector", args -> {
158-
String selector = MetamethodImpl.tostring(args.arg1());
158+
String selector = args.nextString();
159159
EntitySelectorParser reader = new EntitySelectorParser(new StringReader(selector), true);
160160
try {
161161
EntitySelector s = reader.parse();
@@ -176,15 +176,15 @@ public void addFunctions(ScriptApiBuilder apiBuilder) {
176176
apiBuilder.addGroup("registry", builder -> {
177177

178178
builder.add("item", args -> {
179-
Identifier id = Identifier.parse(MetamethodImpl.tostring(args.arg1()));
179+
Identifier id = Identifier.parse(args.nextString());
180180
Item item = BuiltInRegistries.ITEM.getValue(id);
181181
return LuaTableBuilder.provide(ScriptObjects.ITEM, item, script);
182182
}, "Fetches an item type from the registry.", args -> {
183183
args.add("id", Argtypes.STRING, "Identifier of the item type.");
184184
}, ScriptObjects.ITEM);
185185

186186
builder.add("block", args -> {
187-
Identifier id = Identifier.parse(MetamethodImpl.tostring(args.arg1()));
187+
Identifier id = Identifier.parse(args.nextString());
188188
Block block = BuiltInRegistries.BLOCK.getValue(id);
189189
return LuaTableBuilder.provide(ScriptObjects.BLOCK, block, script);
190190
}, "Fetches an block type from the registry.", args -> {
@@ -196,8 +196,8 @@ public void addFunctions(ScriptApiBuilder apiBuilder) {
196196
apiBuilder.addGroup("object", builder -> {
197197

198198
builder.add("itemstack", args -> {
199-
Item item = ScriptObjects.ITEM.toThing(args.arg1().checktable(), script.getSource(), script);
200-
int count = args.arg(2).toint();
199+
Item item = args.nextScriptObject(ScriptObjects.ITEM, script.getSource(), script);
200+
int count = args.nextInt();
201201
ItemStack stack = new ItemStack(item, count);
202202
return LuaTableBuilder.provide(ScriptObjects.ITEM_STACK, stack, script);
203203
}, "Creates an ItemStack from an item and count.", args -> {

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

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,11 @@
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.ScriptExecutionResult;
109
import org.jetbrains.annotations.NotNull;
1110
import org.luaj.vm2.LuaTable;
1211

1312
import java.util.ArrayList;
1413
import java.util.Collection;
15-
import java.util.concurrent.Future;
1614
import java.util.function.BiConsumer;
1715
import java.util.function.Consumer;
1816
import net.minecraft.commands.CommandSourceStack;

0 commit comments

Comments
 (0)