Skip to content

Commit a9ac72e

Browse files
committed
oh this might not work actually
1 parent f2d3fdc commit a9ac72e

11 files changed

Lines changed: 135 additions & 38 deletions

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

Lines changed: 48 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,66 @@
11
package dev.diamond.luafy.lua;
22

3+
import dev.diamond.luafy.registry.LuafyRegistries;
34
import dev.diamond.luafy.script.LuaScript;
45
import dev.diamond.luafy.script.object.AbstractScriptObject;
56
import net.minecraft.commands.CommandSourceStack;
67
import org.luaj.vm2.*;
78

9+
import java.lang.reflect.Array;
810
import java.util.function.Function;
911

1012
@FunctionalInterface
1113
public interface ScriptFunction extends Function<Varargs, LuaValue> {
1214

13-
LuaValue call(ArgumentSupplier args);
15+
Object call(ArgumentSupplier args);
1416

1517
@Override
1618
default LuaValue apply(Varargs args) {
17-
return call(new ArgumentSupplier(args));
19+
Object obj = call(new ArgumentSupplier(args));
20+
return ScriptFunction.adapt(obj);
21+
}
22+
23+
static LuaValue adapt(Object obj) {
24+
25+
if (obj instanceof LuaValue val) {
26+
return val;
27+
28+
} else if (obj == null) {
29+
return LuaValue.NIL;
30+
} else if (obj instanceof Integer i) { // primitives + string
31+
return LuaValue.valueOf(i);
32+
} else if (obj instanceof Byte b) {
33+
return LuaValue.valueOf(b);
34+
} else if (obj instanceof Long l) {
35+
return LuaValue.valueOf(l);
36+
} else if (obj instanceof Float f) {
37+
return LuaValue.valueOf(f);
38+
} else if (obj instanceof Double d) {
39+
return LuaValue.valueOf(d);
40+
} else if (obj instanceof Boolean bl) {
41+
return LuaValue.valueOf(bl);
42+
} else if (obj instanceof String s) {
43+
return LuaValue.valueOf(s);
44+
} else if (obj instanceof Short sh) {
45+
return LuaValue.valueOf(sh);
46+
} else if (obj.getClass().isArray()) { // should probably be avoided anyway
47+
Object[] arr = (Object[]) obj;
48+
LuaValue[] luaArr = new LuaValue[arr.length];
49+
for (int i = 0; i < arr.length; i++) luaArr[i] = adapt(arr[i]);
50+
return LuaTable.tableOf(luaArr);
51+
} else { // script objects
52+
53+
for (var asco : LuafyRegistries.SCRIPT_OBJECTS) {
54+
if (obj.getClass() == asco.getType()) {
55+
return LuaTableBuilder.provide(asco, obj, script);
56+
}
57+
}
58+
59+
}
60+
61+
62+
throw new RuntimeException("Couldn't adapt some JVM value to a value returnable to Lua " +
63+
"(It might not be registered)");
1864
}
1965

2066
class ArgumentSupplier {

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ public AbstractScriptObject(String desc, Consumer<ScriptObjectDocBuilder> docBui
3131

3232
public abstract void toTable(T obj, LuaTableBuilder builder, LuaScript script);
3333
public abstract T toThing(LuaTable table, CommandSourceStack src, LuaScript script);
34+
public abstract Class<T> getType();
3435

3536
public Optional<AbstractScriptObject<? super T>> getParentType() {
3637
return Optional.empty();

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

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,31 +10,37 @@
1010

1111
public class ModScriptObject extends AbstractScriptObject<ModContainer> {
1212

13-
public static final String PROP_MODID = "modid";
14-
public static final String PROP_VERSION = "version";
13+
public static final String FUNC_MODID = "get_mod_id";
14+
public static final String FUNC_VERSION = "get_version";
1515

1616
public ModScriptObject() {
1717
super("An object representing a mod installed on the server.", doc -> {
18-
doc.addProperty(PROP_MODID, Argtypes.STRING, "The id of this mod.");
19-
doc.addProperty(PROP_VERSION, Argtypes.STRING, "The version of the mod currently installed.");
18+
doc.addFunction(FUNC_MODID, "Gets the id of this mod.", args -> {}, Argtypes.STRING);
19+
doc.addFunction(FUNC_VERSION, "The version of the mod currently installed.", args -> {}, Argtypes.STRING);
2020
});
2121
}
2222

2323
@Override
2424
public void toTable(ModContainer obj, LuaTableBuilder builder, LuaScript script) {
25-
builder.add(PROP_MODID, obj.getMetadata().getId());
26-
builder.add(PROP_VERSION, obj.getMetadata().getVersion().getFriendlyString());
25+
builder.add(FUNC_MODID, args -> obj.getMetadata().getId());
26+
builder.add(FUNC_VERSION, args -> obj.getMetadata().getVersion().getFriendlyString());
2727

2828
makeReadonly(builder);
2929
}
3030

3131
@Override
3232
public ModContainer toThing(LuaTable table, CommandSourceStack src, LuaScript script) {
33-
return FabricLoader.getInstance().getModContainer(table.get(PROP_MODID).tojstring()).orElseThrow();
33+
return FabricLoader.getInstance().getModContainer(table.get(FUNC_MODID).tojstring()).orElseThrow();
34+
}
35+
36+
@Override
37+
public Class<ModContainer> getType() {
38+
return ModContainer.class;
3439
}
3540

3641
@Override
3742
public String getArgtypeString() {
3843
return "Mod";
3944
}
4045
}
46+

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,12 @@ public Future<ScriptExecutionResult> toThing(LuaTable table, CommandSourceStack
8484
return script.getUnserializableData(idx, DummyFutureLuaScriptResultWrapper.class);
8585
}
8686

87+
@Override
88+
public Class<Future<ScriptExecutionResult>> getType() {
89+
// HOLY CURSED
90+
return (Class<Future<ScriptExecutionResult>>) DummyFutureLuaScriptResultWrapper.class.getInterfaces()[0];
91+
}
92+
8793
@Override
8894
public String getArgtypeString() {
8995
return "ScriptResult";

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

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,27 +12,35 @@
1212

1313
public class Vec3dScriptObject extends AbstractScriptObject<Vec3> {
1414

15+
public static final String PROP_X = "x";
16+
public static final String PROP_Y = "y";
17+
public static final String PROP_Z = "z";
1518

1619
public Vec3dScriptObject() {
1720
super("Mathematical 3D Vector", doc -> {
18-
doc.addProperty("x", Argtypes.NUMBER, "x component");
19-
doc.addProperty("y", Argtypes.NUMBER, "y component");
20-
doc.addProperty("z", Argtypes.NUMBER, "z component");
21+
doc.addProperty(PROP_X, Argtypes.NUMBER, "x component");
22+
doc.addProperty(PROP_Y, Argtypes.NUMBER, "y component");
23+
doc.addProperty(PROP_Z, Argtypes.NUMBER, "z component");
2124
});
2225
}
2326

2427
@Override
2528
public void toTable(Vec3 obj, LuaTableBuilder builder, LuaScript script) {
26-
builder.add("x", obj.x);
27-
builder.add("y", obj.y);
28-
builder.add("z", obj.z);
29+
builder.add(PROP_X, obj.x);
30+
builder.add(PROP_Y, obj.y);
31+
builder.add(PROP_Z, obj.z);
2932

3033
builder.addMetamethod(MetamethodNames.TO_STRING, args -> LuaString.valueOf(Vec3dScriptObject.toString(obj)));
3134
}
3235

3336
@Override
3437
public Vec3 toThing(LuaTable table, CommandSourceStack src, LuaScript script) {
35-
return new Vec3(table.get("x").tofloat(), table.get("y").tofloat(), table.get("z").tofloat());
38+
return new Vec3(table.get(PROP_X).tofloat(), table.get(PROP_Y).tofloat(), table.get(PROP_Z).tofloat());
39+
}
40+
41+
@Override
42+
public Class<Vec3> getType() {
43+
return Vec3.class;
3644
}
3745

3846
@Override

src/main/java/dev/diamond/luafy/script/object/game/ItemStackScriptObject.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,11 @@ public ItemStack toThing(LuaTable table, CommandSourceStack src, LuaScript scrip
105105
return script.getUnserializableData(ptr, ItemStack.class);
106106
}
107107

108+
@Override
109+
public Class<ItemStack> getType() {
110+
return ItemStack.class;
111+
}
112+
108113
@Override
109114
public String getArgtypeString() {
110115
return "ItemStack";

src/main/java/dev/diamond/luafy/script/object/game/RegistryBlockScriptObject.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,11 @@ public Block toThing(LuaTable table, CommandSourceStack src, LuaScript script) {
2525
return null;
2626
}
2727

28+
@Override
29+
public Class<Block> getType() {
30+
return Block.class;
31+
}
32+
2833
@Override
2934
public String getArgtypeString() {
3035
return "Block";

src/main/java/dev/diamond/luafy/script/object/game/RegistryItemScriptObject.java

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ public RegistryItemScriptObject() {
2323
super("An item type.", doc -> {
2424

2525
doc.addFunction(FUNC_CREATE_STACK, "Creates an items stack of this item type.", args -> {
26-
args.add("count", Argtypes.INTEGER, "The number of items to create a stack of.");
26+
args.add("count", Argtypes.maybe(Argtypes.INTEGER), "The number of items to create a stack of. Defaults to 1.");
2727
}, ScriptObjects.ITEM_STACK);
2828

2929
});
@@ -34,9 +34,9 @@ public void toTable(Item obj, LuaTableBuilder builder, LuaScript script) {
3434
builder.add(PROP_ID, BuiltInRegistries.ITEM.getKey(obj).toString());
3535

3636
builder.add(FUNC_CREATE_STACK, args -> {
37-
int count = args.arg1().toint();
37+
int count = args.nextInt(1);
3838
ItemStack stack = new ItemStack(obj, count);
39-
return LuaTableBuilder.provide(b -> ScriptObjects.ITEM_STACK.toTable(stack, b, script));
39+
return LuaTableBuilder.provide(ScriptObjects.ITEM_STACK, stack, script);
4040
});
4141

4242
builder.addMetamethod(MetamethodNames.TO_STRING, args -> LuaValue.valueOf(BuiltInRegistries.ITEM.getKey(obj).toString()));
@@ -47,6 +47,11 @@ public Item toThing(LuaTable table, CommandSourceStack src, LuaScript script) {
4747
return BuiltInRegistries.ITEM.getValue(Identifier.parse(table.get(PROP_ID).tojstring()));
4848
}
4949

50+
@Override
51+
public Class<Item> getType() {
52+
return Item.class;
53+
}
54+
5055
@Override
5156
public String getArgtypeString() {
5257
return "Item";

src/main/java/dev/diamond/luafy/script/object/game/entity/EntityScriptObject.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ public EntityScriptObject() {
3131
});
3232
}
3333

34+
3435
@Override
3536
public void toTable(Entity obj, LuaTableBuilder builder, LuaScript script) {
3637
builder.add(PROP_UUID, obj.getStringUUID());
@@ -47,6 +48,11 @@ public Entity toThing(LuaTable table, CommandSourceStack src, LuaScript script)
4748
return src.getLevel().getEntity(java.util.UUID.fromString(table.get(PROP_UUID).tojstring()));
4849
}
4950

51+
@Override
52+
public Class<Entity> getType() {
53+
return Entity.class;
54+
}
55+
5056
@Override
5157
public String getArgtypeString() {
5258
return "Entity";

src/main/java/dev/diamond/luafy/script/object/game/entity/LivingEntityScriptObject.java

Lines changed: 21 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -68,26 +68,23 @@ public LivingEntityScriptObject() {
6868
public void toTable(LivingEntity obj, LuaTableBuilder builder, LuaScript script) {
6969
applyInheritanceToTable(obj, builder, script);
7070

71-
builder.add(FUNC_GET_HEALTH, args -> LuaValue.valueOf(obj.getHealth()));
71+
builder.add(FUNC_GET_HEALTH, args -> obj.getHealth());
7272
builder.add(FUNC_HURT, args -> {
73-
Identifier damageTypeId = Identifier.parse(MetamethodImpl.tostring(args.arg(1)));
74-
float amount = args.arg(2).tofloat();
75-
Optional<Entity> e = args.arg(3).isnil() ?
76-
Optional.empty() : Optional.of(ScriptObjects.ENTITY.toThing(args.arg(3).checktable(), script.getSource(), script));
73+
Identifier damageTypeId = Identifier.parse(args.nextString());
74+
float amount = args.nextFloat();
75+
Optional<Entity> e = Optional.ofNullable(args.nextScriptObject(ScriptObjects.ENTITY, script.getSource(), script, null));
7776

7877
ServerLevel world = script.getSource().getLevel();
7978
DamageType type = world.registryAccess().lookupOrThrow(Registries.DAMAGE_TYPE).getValue(damageTypeId);
8079
DamageSource source = new DamageSource(world.registryAccess().lookupOrThrow(Registries.DAMAGE_TYPE).wrapAsHolder(type), e.orElse(null));
8180

8281
obj.hurtServer(world, source, amount);
8382

84-
return LuaValue.NIL;
83+
return null;
8584
});
8685
builder.add(FUNC_KILL, args -> {
87-
Optional<Identifier> damageTypeId = args.arg(1).isnil() ?
88-
Optional.empty() : Optional.of(Identifier.parse(MetamethodImpl.tostring(args.arg(1))));
89-
Optional<Entity> e = args.arg(2).isnil() ?
90-
Optional.empty() : Optional.of(ScriptObjects.ENTITY.toThing(args.arg(2).checktable(), script.getSource(), script));
86+
Optional<Identifier> damageTypeId = Optional.ofNullable(args.nextString(null)).map(Identifier::parse);
87+
Optional<Entity> e = Optional.ofNullable(args.nextScriptObject(ScriptObjects.ENTITY, script.getSource(), script, null));
9188

9289
ServerLevel world = script.getSource().getLevel();
9390
DamageType type;
@@ -104,13 +101,15 @@ public void toTable(LivingEntity obj, LuaTableBuilder builder, LuaScript script)
104101
return LuaValue.NIL;
105102
});
106103
builder.add(FUNC_TELEPORT, args -> {
107-
Vec3 pos = ScriptObjects.VEC3D.toThing(args.arg(1).checktable(), script.getSource(), script);
108-
float yaw = args.arg(2).or(LuaValue.valueOf(obj.getYRot())).tofloat();
109-
float pitch = args.arg(3).or(LuaValue.valueOf(obj.getXRot())).tofloat();
110-
boolean retainVel = args.arg(4).or(LuaValue.valueOf(true)).toboolean();
104+
Vec3 pos = args.nextScriptObject(ScriptObjects.VEC3D, script.getSource(), script);
105+
float yaw = args.nextFloat(obj.getYRot());
106+
float pitch = args.nextFloat(obj.getXRot());
107+
boolean retainVel = args.nextBoolean(true);
111108

112-
ResourceKey<Level> registryKey = args.arg(5).isnil() ?
113-
obj.level().dimension() : ResourceKey.create(Registries.DIMENSION, Identifier.parse(MetamethodImpl.tostring(args.arg(5))));
109+
ResourceKey<Level> registryKey = Optional
110+
.ofNullable(args.nextString(null))
111+
.map(s -> ResourceKey.create(Registries.DIMENSION, Identifier.parse(s)))
112+
.orElse(obj.level().dimension());
114113

115114
ServerLevel serverWorld = script.getSource().getServer().getLevel(registryKey);
116115

@@ -127,7 +126,7 @@ public void toTable(LivingEntity obj, LuaTableBuilder builder, LuaScript script)
127126
});
128127

129128
builder.add(FUNC_GET_ITEMSTACK, args -> {
130-
String reference = MetamethodImpl.tostring(args.arg1());
129+
String reference = args.nextString();
131130
SlotAccess access = obj.getSlot(Objects.requireNonNull(SlotRanges.nameToIds(reference)).slots().getFirst());
132131
ItemStack stack = access != null ? access.get() : ItemStack.EMPTY;
133132
return LuaTableBuilder.provide(ScriptObjects.ITEM_STACK, stack, script);
@@ -141,6 +140,11 @@ public LivingEntity toThing(LuaTable table, CommandSourceStack src, LuaScript sc
141140
return (LivingEntity) ScriptObjects.ENTITY.toThing(table, src, script);
142141
}
143142

143+
@Override
144+
public Class<LivingEntity> getType() {
145+
return LivingEntity.class;
146+
}
147+
144148
@Override
145149
public Optional<AbstractScriptObject<? super LivingEntity>> getParentType() {
146150
return Optional.of(ScriptObjects.ENTITY);

0 commit comments

Comments
 (0)