Skip to content

Commit cef9ecc

Browse files
committed
entity type registry object
1 parent afa7a36 commit cef9ecc

9 files changed

Lines changed: 159 additions & 21 deletions

File tree

autodocs/autodoc.lua

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
--#region Information
44
-- GENERATED AUTODOC
5-
-- Generated: 2026-01-29T12:14:59.199722800
5+
-- Generated: 2026-01-29T15:36:57.191277400
66
-- Luafy Version: 2.0.0
77
-- Format: Lua LS library file
88
--#endregion
@@ -241,6 +241,25 @@ local Item = {}
241241
function Item.create_stack(count) end
242242

243243

244+
--- An entity type.
245+
---@class EntityType
246+
local EntityType = {}
247+
248+
--- Returns true if this entity can exist in peaceful difficulty.
249+
---@return boolean
250+
function EntityType.can_exist_in_peaceful() end
251+
252+
--- Returns true if this entity is immune to fire.
253+
---@return boolean
254+
function EntityType.is_fire_immune() end
255+
256+
--- Spawns a new instance of this entity.
257+
---@param pos Vec3d Position to spawn at.
258+
---@param dimension string Id of dimension to spawn in.
259+
---@return Entity
260+
function EntityType.spawn(pos, dimension) end
261+
262+
244263
--- An item stack.
245264
---@class ItemStack
246265
local ItemStack = {}
@@ -373,6 +392,11 @@ function registry.item(id) end
373392
---@return Block
374393
function registry.block(id) end
375394

395+
--- Fetches an entity type from the registry.
396+
---@param id string Identifier of the entity type.
397+
---@return EntityType
398+
function registry.entity_type(id) end
399+
376400
minecraft.registry = registry
377401

378402
local entities = {}

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

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,5 +174,21 @@ public <T> ArrayList<T> nextArray(Function<LuaValue, T> getter, ArrayList<T> def
174174
return optionalVal(next(), def, val -> getArray(val, getter));
175175
}
176176

177+
178+
179+
// other stuff
180+
181+
public <T, X> T map(LuaValue value, T def, Function<LuaValue, X> getter, Function<X, T> convert) {
182+
if (value.isnil()) {
183+
return def;
184+
} else {
185+
return convert.apply(getter.apply(value));
186+
}
187+
}
188+
189+
public <T, X> T nextMap(T def, Function<LuaValue, X> getter, Function<X, T> convert) {
190+
return map(next(), def, getter, convert);
191+
}
192+
177193
}
178194
}

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

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

33
import dev.diamond.luafy.Luafy;
44
import dev.diamond.luafy.script.object.*;
5-
import dev.diamond.luafy.script.object.game.RegistryBlockScriptObject;
6-
import dev.diamond.luafy.script.object.game.RegistryItemScriptObject;
5+
import dev.diamond.luafy.script.object.game.registry.RegistryBlockScriptObject;
6+
import dev.diamond.luafy.script.object.game.registry.RegistryEntityTypeScriptObject;
7+
import dev.diamond.luafy.script.object.game.registry.RegistryItemScriptObject;
78
import dev.diamond.luafy.script.object.game.ItemStackScriptObject;
89
import dev.diamond.luafy.script.object.game.TextComponentScriptObject;
910
import dev.diamond.luafy.script.object.game.entity.EntityScriptObject;
@@ -23,9 +24,12 @@ public class ScriptObjects {
2324
public static LivingEntityScriptObject LIVING_ENTITY = new LivingEntityScriptObject();
2425
public static PlayerScriptObject PLAYER = new PlayerScriptObject();
2526

27+
// registry objects
28+
public static RegistryBlockScriptObject REGISTRY_BLOCK = new RegistryBlockScriptObject();
29+
public static RegistryItemScriptObject REGISTRY_ITEM = new RegistryItemScriptObject();
30+
public static RegistryEntityTypeScriptObject REGISTRY_ENTITY_TYPE = new RegistryEntityTypeScriptObject();
31+
2632
// game objects
27-
public static RegistryBlockScriptObject BLOCK = new RegistryBlockScriptObject();
28-
public static RegistryItemScriptObject ITEM = new RegistryItemScriptObject();
2933
public static ItemStackScriptObject ITEM_STACK = new ItemStackScriptObject();
3034
public static TextComponentScriptObject TEXT_COMPONENT = new TextComponentScriptObject();
3135

@@ -38,8 +42,10 @@ public static void registerAll() {
3842
Registry.register(LuafyRegistries.SCRIPT_OBJECTS, Luafy.id("living_entity"), LIVING_ENTITY);
3943
Registry.register(LuafyRegistries.SCRIPT_OBJECTS, Luafy.id("player"), PLAYER);
4044

41-
Registry.register(LuafyRegistries.SCRIPT_OBJECTS, Luafy.id("block"), BLOCK);
42-
Registry.register(LuafyRegistries.SCRIPT_OBJECTS, Luafy.id("item"), ITEM);
45+
Registry.register(LuafyRegistries.SCRIPT_OBJECTS, Luafy.id("registry_block"), REGISTRY_BLOCK);
46+
Registry.register(LuafyRegistries.SCRIPT_OBJECTS, Luafy.id("registry_item"), REGISTRY_ITEM);
47+
Registry.register(LuafyRegistries.SCRIPT_OBJECTS, Luafy.id("registry_entity_type"), REGISTRY_ENTITY_TYPE);
48+
4349
Registry.register(LuafyRegistries.SCRIPT_OBJECTS, Luafy.id("item_stack"), ITEM_STACK);
4450
Registry.register(LuafyRegistries.SCRIPT_OBJECTS, Luafy.id("text_component"), TEXT_COMPONENT);
4551

src/main/java/dev/diamond/luafy/script/LuaScript.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@
44
import dev.diamond.luafy.lua.LuaTableBuilder;
55
import dev.diamond.luafy.registry.LuafyRegistries;
66
import dev.diamond.luafy.script.enumeration.ScriptEnum;
7+
import net.minecraft.core.Registry;
8+
import net.minecraft.resources.Identifier;
9+
import net.minecraft.resources.ResourceKey;
710
import org.jetbrains.annotations.NotNull;
811
import org.jetbrains.annotations.Nullable;
912
import org.luaj.vm2.Globals;
@@ -67,6 +70,14 @@ public CommandSourceStack getSource() {
6770
return src;
6871
}
6972

73+
public <T> Registry<T> getRegistry(ResourceKey<Registry<T>> key) {
74+
return src.registryAccess().lookupOrThrow(key);
75+
}
76+
77+
public <T> T lookupRegistry(ResourceKey<Registry<T>> key, Identifier id) {
78+
return src.registryAccess().lookupOrThrow(key).getValue(id);
79+
}
80+
7081
public Globals getGlobals() {
7182
return globals;
7283
}

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

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,8 @@
99
import dev.diamond.luafy.registry.ScriptObjects;
1010
import dev.diamond.luafy.script.LuaScript;
1111
import dev.diamond.luafy.lua.LuaTableBuilder;
12-
import dev.diamond.luafy.lua.MetamethodImpl;
1312
import dev.diamond.luafy.script.enumeration.Instrument;
1413
import dev.diamond.luafy.script.enumeration.Note;
15-
import dev.diamond.luafy.script.object.game.TextComponentScriptObject;
1614
import net.minecraft.SharedConstants;
1715
import net.minecraft.commands.CommandSourceStack;
1816
import net.minecraft.commands.arguments.EntityArgument;
@@ -26,13 +24,12 @@
2624
import net.minecraft.server.level.ServerPlayer;
2725
import net.minecraft.sounds.SoundSource;
2826
import net.minecraft.world.entity.Entity;
27+
import net.minecraft.world.entity.EntityType;
2928
import net.minecraft.world.item.Item;
3029
import net.minecraft.world.item.ItemStack;
3130
import net.minecraft.world.level.block.Block;
3231
import net.minecraft.world.phys.Vec3;
33-
import org.luaj.vm2.LuaBoolean;
3432
import org.luaj.vm2.LuaString;
35-
import org.luaj.vm2.LuaTable;
3633
import org.luaj.vm2.LuaValue;
3734

3835
import java.util.List;
@@ -194,30 +191,38 @@ public void addFunctions(ScriptApiBuilder apiBuilder) {
194191
builder.add("item", args -> {
195192
Identifier id = Identifier.parse(args.nextString());
196193
Item item = BuiltInRegistries.ITEM.getValue(id);
197-
return LuaTableBuilder.provide(ScriptObjects.ITEM, item, script);
194+
return LuaTableBuilder.provide(ScriptObjects.REGISTRY_ITEM, item, script);
198195
}, "Fetches an item type from the registry.", args -> {
199196
args.add("id", Argtypes.STRING, "Identifier of the item type.");
200-
}, ScriptObjects.ITEM);
197+
}, ScriptObjects.REGISTRY_ITEM);
201198

202199
builder.add("block", args -> {
203200
Identifier id = Identifier.parse(args.nextString());
204201
Block block = BuiltInRegistries.BLOCK.getValue(id);
205-
return LuaTableBuilder.provide(ScriptObjects.BLOCK, block, script);
202+
return LuaTableBuilder.provide(ScriptObjects.REGISTRY_BLOCK, block, script);
206203
}, "Fetches an block type from the registry.", args -> {
207204
args.add("id", Argtypes.STRING, "Identifier of the block type.");
208-
}, ScriptObjects.BLOCK);
205+
}, ScriptObjects.REGISTRY_BLOCK);
206+
207+
builder.add("entity_type", args -> {
208+
Identifier id = Identifier.parse(args.nextString());
209+
EntityType<?> e = BuiltInRegistries.ENTITY_TYPE.getValue(id);
210+
return LuaTableBuilder.provide(ScriptObjects.REGISTRY_ENTITY_TYPE, e, script);
211+
}, "Fetches an entity type from the registry.", args -> {
212+
args.add("id", Argtypes.STRING, "Identifier of the entity type.");
213+
}, ScriptObjects.REGISTRY_ENTITY_TYPE);
209214

210215
});
211216

212217
apiBuilder.addGroup("object", builder -> {
213218

214219
builder.add("itemstack", args -> {
215-
Item item = args.nextScriptObject(ScriptObjects.ITEM, script.getSource(), script);
220+
Item item = args.nextScriptObject(ScriptObjects.REGISTRY_ITEM, script.getSource(), script);
216221
int count = args.nextInt();
217222
ItemStack stack = new ItemStack(item, count);
218223
return LuaTableBuilder.provide(ScriptObjects.ITEM_STACK, stack, script);
219224
}, "Creates an ItemStack from an item and count.", args -> {
220-
args.add("item", ScriptObjects.ITEM, "Item type.");
225+
args.add("item", ScriptObjects.REGISTRY_ITEM, "Item type.");
221226
args.add("count", Argtypes.INTEGER, "Count.");
222227
}, ScriptObjects.ITEM_STACK);
223228
});

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ public class ItemStackScriptObject extends AbstractScriptObject<ItemStack> {
3333
public ItemStackScriptObject() {
3434
super("An item stack.", doc -> {
3535

36-
doc.addFunction(FUNC_ITEM_TYPE, "Gets the item type of this stack.", args -> {}, ScriptObjects.ITEM);
36+
doc.addFunction(FUNC_ITEM_TYPE, "Gets the item type of this stack.", args -> {}, ScriptObjects.REGISTRY_ITEM);
3737
doc.addFunction(FUNC_ITEM_ID, "Gets the item id of this stack.", args -> {}, Argtypes.STRING);
3838

3939
doc.addFunction(FUNC_COUNT, "Gets the number of items in this stack.", args -> {}, Argtypes.INTEGER);
@@ -62,7 +62,7 @@ public void toTable(ItemStack obj, LuaTableBuilder builder, LuaScript script) {
6262
obj.setCount(args.nextInt());
6363
return LuaValue.NIL;
6464
});
65-
builder.add(FUNC_ITEM_TYPE, args -> LuaTableBuilder.provide(ScriptObjects.ITEM, obj.getItem(), script));
65+
builder.add(FUNC_ITEM_TYPE, args -> LuaTableBuilder.provide(ScriptObjects.REGISTRY_ITEM, obj.getItem(), script));
6666
builder.add(FUNC_ITEM_ID, args -> LuaValue.valueOf(BuiltInRegistries.ITEM.getId(obj.getItem())));
6767

6868
builder.add(FUNC_COMPONENT, args -> {

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package dev.diamond.luafy.script.object.game;
1+
package dev.diamond.luafy.script.object.game.registry;
22

33
import dev.diamond.luafy.lua.LuaTableBuilder;
44
import dev.diamond.luafy.script.LuaScript;
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
package dev.diamond.luafy.script.object.game.registry;
2+
3+
import dev.diamond.luafy.autodoc.Argtypes;
4+
import dev.diamond.luafy.lua.LuaTableBuilder;
5+
import dev.diamond.luafy.lua.MetamethodImpl;
6+
import dev.diamond.luafy.registry.ScriptObjects;
7+
import dev.diamond.luafy.script.LuaScript;
8+
import dev.diamond.luafy.script.object.AbstractScriptObject;
9+
import net.minecraft.commands.CommandSourceStack;
10+
import net.minecraft.core.registries.BuiltInRegistries;
11+
import net.minecraft.core.registries.Registries;
12+
import net.minecraft.resources.Identifier;
13+
import net.minecraft.server.level.ServerLevel;
14+
import net.minecraft.world.entity.Entity;
15+
import net.minecraft.world.entity.EntitySpawnReason;
16+
import net.minecraft.world.entity.EntityType;
17+
import net.minecraft.world.level.Level;
18+
import net.minecraft.world.phys.Vec3;
19+
import org.luaj.vm2.LuaTable;
20+
import org.luaj.vm2.LuaValue;
21+
22+
public class RegistryEntityTypeScriptObject extends AbstractScriptObject<EntityType<?>> {
23+
24+
public static final String SERIAL_PROP_ID = "_id";
25+
26+
public static final String FUNC_CAN_EXIST_IN_PEACEFUL = "can_exist_in_peaceful";
27+
public static final String FUNC_FIRE_IMMUNE = "is_fire_immune";
28+
public static final String FUNC_SPAWN = "spawn";
29+
30+
public RegistryEntityTypeScriptObject() {
31+
super("An entity type.", doc -> {
32+
doc.addFunction(FUNC_CAN_EXIST_IN_PEACEFUL, "Returns true if this entity can exist in peaceful difficulty.",
33+
args -> {}, Argtypes.BOOLEAN);
34+
doc.addFunction(FUNC_FIRE_IMMUNE, "Returns true if this entity is immune to fire.",
35+
args -> {}, Argtypes.BOOLEAN);
36+
doc.addFunction(FUNC_SPAWN, "Spawns a new instance of this entity.", args -> {
37+
args.add("pos", ScriptObjects.VEC3D, "Position to spawn at.");
38+
args.add("dimension", Argtypes.maybe(Argtypes.STRING), "Id of dimension to spawn in.");
39+
}, ScriptObjects.ENTITY);
40+
});
41+
}
42+
43+
@Override
44+
public void toTable(EntityType<?> obj, LuaTableBuilder builder, LuaScript script) {
45+
builder.add(SERIAL_PROP_ID, BuiltInRegistries.ENTITY_TYPE.getKey(obj).toString());
46+
47+
builder.add(FUNC_CAN_EXIST_IN_PEACEFUL, args -> LuaValue.valueOf(obj.isAllowedInPeaceful()));
48+
builder.add(FUNC_FIRE_IMMUNE, args -> LuaValue.valueOf(obj.fireImmune()));
49+
builder.add(FUNC_SPAWN, args -> {
50+
51+
Vec3 pos = args.nextScriptObject(ScriptObjects.VEC3D, script.getSource(), script);
52+
Level level = args.nextMap(script.getSource().getLevel(), args::getString, s -> {
53+
Identifier id = Identifier.parse(s);
54+
return script.lookupRegistry(Registries.DIMENSION, id);
55+
});
56+
57+
58+
Entity e = obj.create(level, EntitySpawnReason.COMMAND);
59+
e.setPos(pos);
60+
level.addFreshEntity(e);
61+
62+
return ScriptObjects.ENTITY.provideTable(e, script);
63+
});
64+
}
65+
66+
@Override
67+
public EntityType<?> toThing(LuaTable table, CommandSourceStack src, LuaScript script) {
68+
Identifier id = Identifier.parse(MetamethodImpl.tostring(table.get(SERIAL_PROP_ID)));
69+
return BuiltInRegistries.ENTITY_TYPE.getValue(id);
70+
}
71+
72+
@Override
73+
public String getArgtypeString() {
74+
return "EntityType";
75+
}
76+
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package dev.diamond.luafy.script.object.game;
1+
package dev.diamond.luafy.script.object.game.registry;
22

33
import dev.diamond.luafy.autodoc.Argtypes;
44
import dev.diamond.luafy.lua.LuaTableBuilder;

0 commit comments

Comments
 (0)