Skip to content

Commit 26104a5

Browse files
committed
Entity type registry method
1 parent 6c60e19 commit 26104a5

File tree

9 files changed

+115
-1
lines changed

9 files changed

+115
-1
lines changed
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package com.fox2code.foxloader.client.mixins;
2+
3+
import net.minecraft.src.game.entity.*;
4+
import org.spongepowered.asm.mixin.*;
5+
import org.spongepowered.asm.mixin.gen.*;
6+
7+
@Mixin(EntityList.class)
8+
public interface AccessorEntityList {
9+
@Invoker
10+
static void invokeAddMapping(Class<?> entityClass, String entityTypeName, int entityTypeID) {
11+
throw new IllegalStateException();
12+
}
13+
}

client/src/main/java/com/fox2code/foxloader/registry/GameRegistryClient.java

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import static com.fox2code.foxloader.loader.ClientMod.*;
44

55
import com.fox2code.foxloader.client.CreativeItems;
6+
import com.fox2code.foxloader.client.mixins.AccessorEntityList;
67
import com.fox2code.foxloader.client.registry.RegisteredBlockImpl;
78
import com.fox2code.foxloader.loader.ModLoader;
89
import com.fox2code.foxloader.loader.packet.ServerHello;
@@ -75,6 +76,7 @@ public static void freeze() {
7576

7677
private int nextBlockId = INITIAL_BLOCK_ID;
7778
private int nextItemId = INITIAL_ITEM_ID;
79+
private int nextEntityTypeId = INITIAL_ENTITY_TYPE_ID;
7880

7981
private GameRegistryClient() {}
8082

@@ -139,6 +141,22 @@ public int generateNewItemId(String name, int fallbackId) {
139141
return itemId;
140142
}
141143

144+
@Override
145+
public int generateNewEntityTypeId(String name, int fallbackId) {
146+
if (registryEntries.containsKey(name)) {
147+
throw new RuntimeException("Duplicate entity string id: " + name);
148+
}
149+
150+
int entityTypeId = nextEntityTypeId++;
151+
152+
if (entityTypeId > MAXIMUM_ITEM_ID) {
153+
throw new RuntimeException("Maximum block count registered! (Too many mods?)");
154+
}
155+
156+
entityTypeEntries.put(name, new EntityTypeRegistryEntry(entityTypeId, fallbackId, name));
157+
return entityTypeId;
158+
}
159+
142160
@Override
143161
public RegisteredBlock registerNewBlock(String name, BlockBuilder blockBuilder, int fallbackId) {
144162
name = validateAndFixRegistryName(name);
@@ -297,6 +315,11 @@ private RegisteredItem registerNewItem0(String name, ItemBuilder itemBuilder,
297315
return (RegisteredItem) item;
298316
}
299317

318+
@Override
319+
public void registerNewEntityType(String name, Class<? extends RegisteredEntity> entityClass, int fallbackId) {
320+
AccessorEntityList.invokeAddMapping(entityClass, name, generateNewEntityTypeId(name, fallbackId));
321+
}
322+
300323
@Override
301324
public void registerRecipe(RegisteredItemStack result, Object... recipe) {
302325
if (recipeFrozen) throw new UnsupportedOperationException(LATE_RECIPE_MESSAGE);

client/src/main/resources/foxloader.client.mixins.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
"package": "com.fox2code.foxloader.client.mixins",
55
"compatibilityLevel": "JAVA_8",
66
"mixins": [
7+
"AccessorEntityList",
78
"MixinBlock",
89
"MixinBlockFire",
910
"MixinChunk",

common/src/main/java/com/fox2code/foxloader/loader/Mod.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -255,6 +255,13 @@ public RegisteredBlock registerNewBlock(String name, BlockBuilder blockBuilder)
255255
return GameRegistry.getInstance().registerNewBlock(getModContainer().id + ":" + name, blockBuilder);
256256
}
257257

258+
/**
259+
* @see GameRegistry#registerNewEntityType(String, Class, int)
260+
*/
261+
public void registerNewEntityType(String name, Class<? extends RegisteredEntity> entityClass) {
262+
GameRegistry.getInstance().registerNewEntityType(name, entityClass);
263+
}
264+
258265
/**
259266
* @see GameRegistry#registerRecipe(RegisteredItemStack, Object...)
260267
*/
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package com.fox2code.foxloader.registry;
2+
3+
public class EntityTypeRegistryEntry {
4+
public final int realId, fallbackId;
5+
public final String name;
6+
7+
EntityTypeRegistryEntry(int realId, int fallbackId, String name) {
8+
this.realId = realId;
9+
this.fallbackId = fallbackId;
10+
this.name = name;
11+
}
12+
}

common/src/main/java/com/fox2code/foxloader/registry/GameRegistry.java

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,15 @@
88

99
public abstract class GameRegistry {
1010
static final HashMap<String, RegistryEntry> registryEntries = new HashMap<>();
11+
static final HashMap<String, EntityTypeRegistryEntry> entityTypeEntries = new HashMap<>();
1112
static final BlockBuilder DEFAULT_BLOCK_BUILDER = new BlockBuilder();
1213
static final ItemBuilder DEFAULT_ITEM_BUILDER = new ItemBuilder();
1314
private static GameRegistry gameRegistry;
1415
public static final int PARAM_ITEM_ID_DIFF = 256;
1516
public static final int INITIAL_BLOCK_ID = 360;
1617
public static final int MAXIMUM_BLOCK_ID = 1024; // Hard max: 1258
1718
public static final int INITIAL_ITEM_ID = 4096;
19+
public static final int INITIAL_ENTITY_TYPE_ID = 210;
1820
public static final int MAXIMUM_ITEM_ID = 8192; // Hard max: 31999
1921
// Block ids but translated to item ids
2022
public static final int INITIAL_TRANSLATED_BLOCK_ID = convertBlockIdToItemId(INITIAL_BLOCK_ID);
@@ -23,6 +25,8 @@ public abstract class GameRegistry {
2325
public static final int DEFAULT_FALLBACK_BLOCK_ID = 1;
2426
// The default fallback id for items is planks.
2527
public static final int DEFAULT_FALLBACK_ITEM_ID = 5;
28+
// The default fallback id for entity types is pig.
29+
public static final int DEFAULT_FALLBACK_ENTITY_TYPE_ID = 90;
2630

2731
public static GameRegistry getInstance() {
2832
return gameRegistry;
@@ -74,12 +78,19 @@ public RegisteredBlock getRegisteredBlock(String name) {
7478
}
7579

7680
/**
77-
* @return list of registered modded entries
81+
* @return list of registered modded block and item entries
7882
*/
7983
public static Collection<RegistryEntry> getRegistryEntries() {
8084
return Collections.unmodifiableCollection(registryEntries.values());
8185
}
8286

87+
/**
88+
* @return list of registered modded entities
89+
*/
90+
public static Collection<EntityTypeRegistryEntry> getEntityRegistryEntries() {
91+
return Collections.unmodifiableCollection(entityTypeEntries.values());
92+
}
93+
8394
/**
8495
* @return maximum expected block id
8596
*/
@@ -122,6 +133,11 @@ public static Collection<RegistryEntry> getRegistryEntries() {
122133
*/
123134
public abstract int generateNewItemId(String name, int fallbackId);
124135

136+
/**
137+
* Only use this if you know what you are doing.
138+
*/
139+
public abstract int generateNewEntityTypeId(String name, int fallbackId);
140+
125141
/**
126142
* Register a new block into the game
127143
*/
@@ -140,6 +156,15 @@ public final RegisteredItem registerNewItem(String name, ItemBuilder itemBuilder
140156

141157
public abstract RegisteredItem registerNewItem(String name, ItemBuilder itemBuilder, int fallbackId);
142158

159+
/**
160+
* Register a new entity type into the game
161+
*/
162+
public final void registerNewEntityType(String name, Class<? extends RegisteredEntity> entityClass) {
163+
this.registerNewEntityType(name, entityClass, DEFAULT_FALLBACK_ENTITY_TYPE_ID);
164+
}
165+
166+
public abstract void registerNewEntityType(String name, Class<? extends RegisteredEntity> entityClass, int fallbackId);
167+
143168
protected static final String LATE_RECIPE_MESSAGE = "Too late to register recipes!";
144169
protected static boolean recipeFrozen = false;
145170

server/src/main/java/com/fox2code/foxloader/registry/GameRegistryServer.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import com.fox2code.foxloader.loader.ModLoader;
55
import com.fox2code.foxloader.loader.packet.ServerHello;
66
import com.fox2code.foxloader.network.SidedMetadataAPI;
7+
import com.fox2code.foxloader.server.mixins.AccessorEntityList;
78
import com.fox2code.foxloader.server.network.NetworkPlayerImpl;
89
import com.fox2code.foxloader.server.registry.RegisteredBlockImpl;
910
import net.minecraft.src.game.block.*;
@@ -62,6 +63,7 @@ public static void freeze() {
6263

6364
private int nextBlockId = INITIAL_BLOCK_ID;
6465
private int nextItemId = INITIAL_ITEM_ID;
66+
private int nextEntityTypeId = INITIAL_ENTITY_TYPE_ID;
6567

6668
private GameRegistryServer() {}
6769

@@ -126,6 +128,18 @@ public int generateNewItemId(String name, int fallbackId) {
126128
return itemId;
127129
}
128130

131+
@Override
132+
public int generateNewEntityTypeId(String name, int fallbackId) {
133+
if (registryEntries.containsKey(name)) {
134+
throw new RuntimeException("Duplicate entity string id: " + name);
135+
}
136+
137+
int entityTypeId = nextEntityTypeId++;
138+
139+
entityTypeEntries.put(name, new EntityTypeRegistryEntry(entityTypeId, fallbackId, name));
140+
return entityTypeId;
141+
}
142+
129143
@Override
130144
public RegisteredBlock registerNewBlock(String name, BlockBuilder blockBuilder, int fallbackId) {
131145
name = validateAndFixRegistryName(name);
@@ -276,6 +290,11 @@ private RegisteredItem registerNewItem0(String name, ItemBuilder itemBuilder,
276290
return (RegisteredItem) item;
277291
}
278292

293+
@Override
294+
public void registerNewEntityType(String name, Class<? extends RegisteredEntity> entityClass, int fallbackId) {
295+
AccessorEntityList.invokeAddMapping(entityClass, name, generateNewEntityTypeId(name, fallbackId));
296+
}
297+
279298
@Override
280299
public void registerRecipe(RegisteredItemStack result, Object... recipe) {
281300
if (recipeFrozen) throw new UnsupportedOperationException(LATE_RECIPE_MESSAGE);
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package com.fox2code.foxloader.server.mixins;
2+
3+
import net.minecraft.src.game.entity.*;
4+
import org.spongepowered.asm.mixin.*;
5+
import org.spongepowered.asm.mixin.gen.*;
6+
7+
@Mixin(EntityList.class)
8+
public interface AccessorEntityList {
9+
@Invoker
10+
static void invokeAddMapping(Class<?> entityClass, String entityTypeName, int entityTypeID) {
11+
throw new IllegalStateException();
12+
}
13+
}

server/src/main/resources/foxloader.server.mixins.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
"plugin": "com.fox2code.foxloader.loader.mixin.MixinTestModePlugin",
66
"compatibilityLevel": "JAVA_8",
77
"mixins": [
8+
"AccessorEntityList",
89
"MixinBlock",
910
"MixinBlockFire",
1011
"MixinChunkBlockMap",

0 commit comments

Comments
 (0)