11package com .james090500 .blocks ;
22
3+ import it .unimi .dsi .fastutil .ints .Int2ObjectArrayMap ;
4+
5+ import java .util .function .Function ;
6+
37public class Blocks {
48
5- public static Block [] ids ;
6-
7- public static final GrassBlock grassBlock = new GrassBlock ((byte ) 1 );
8- public static final DirtBlock dirtBlock = new DirtBlock ((byte ) 2 );
9- public static final StoneBlock stoneBlock = new StoneBlock ((byte ) 3 );
10- public static final SandBlock sandBlock = new SandBlock ((byte ) 4 );
11- public static final WaterBlock waterBlock = new WaterBlock ((byte ) 5 );
12- public static final OakLeafBlock leafBlock = new OakLeafBlock ((byte ) 6 );
13- public static final SpruceLeafBlock spruceLeafBlock = new SpruceLeafBlock ((byte ) 7 );
14- public static final OakLogBlock logBlock = new OakLogBlock ((byte ) 8 );
15- public static final SpruceLogBlock spruceLogBlock = new SpruceLogBlock ((byte ) 9 );
16- public static final BirchLogBlock birchLogBlock = new BirchLogBlock ((byte ) 10 );
17- public static final OakPlanksBlock oakPlanksBlock = new OakPlanksBlock ((byte ) 11 );
18- public static final SprucePlanksBlock sprucePlanksBlock = new SprucePlanksBlock ((byte ) 12 );
19- public static final BirchPlanksBlock birchPlanksBlock = new BirchPlanksBlock ((byte ) 13 );
20- public static final GlassBlock glassBlock = new GlassBlock ((byte ) 14 );
21- public static final SnowyGrassBlock snowyGrassBlock = new SnowyGrassBlock ((byte ) 15 );
22- public static final CactusBlock cactusBlock = new CactusBlock ((byte ) 16 );
23- public static final ShortGrassBlock shortGrassBlock = new ShortGrassBlock ((byte ) 17 );
9+ // 0 reserved for "air"/null
10+ private static final int MAX_BLOCKS = 256 ;
11+ private static final Int2ObjectArrayMap <Block > REGISTRY = new Int2ObjectArrayMap <>();
12+ private static int nextId = 1 ;
2413
25- static {
26- ids = new Block [] {
27- null ,
28- grassBlock ,
29- dirtBlock ,
30- stoneBlock ,
31- sandBlock ,
32- waterBlock ,
33- leafBlock ,
34- spruceLeafBlock ,
35- logBlock ,
36- spruceLogBlock ,
37- birchLogBlock ,
38- oakPlanksBlock ,
39- sprucePlanksBlock ,
40- birchPlanksBlock ,
41- glassBlock ,
42- snowyGrassBlock ,
43- cactusBlock ,
44- shortGrassBlock ,
45- };
46-
47- // Build models
48- for (Block block : Blocks .ids ) {
49- if (block instanceof IBlockRender ) {
50- block .getModel ().create ();
51- }
52- }
14+ /**
15+ * Stores block in registry by instance
16+ * @param ctor The block instance
17+ * @return The block instance
18+ * @param <T> A block ::new
19+ */
20+ private static <T extends Block > T register (Function <Byte , T > ctor ) {
21+ if (nextId >= MAX_BLOCKS ) throw new IllegalStateException ("Block registry full" );
22+ byte id = (byte ) nextId ;
23+ T block = ctor .apply (id );
24+ REGISTRY .put (id & 0xFF , block );
25+ nextId ++;
26+ return block ;
27+ }
28+
29+ /**
30+ * Get the block by ID (0 is null)
31+ * @param id Block ID
32+ * @return The block instance
33+ */
34+ public static Block get (int id ) {
35+ return REGISTRY .get (id & 0xFF );
5336 }
5437
55- }
38+ /**
39+ * Get the total blocks added
40+ * @return
41+ */
42+ public static int getTotalBlocks () {
43+ return REGISTRY .size ();
44+ }
45+
46+ // ---- Declarations (order == IDs). Append new ones at the end. ----
47+ public static final GrassBlock grassBlock = register (GrassBlock ::new );
48+ public static final DirtBlock dirtBlock = register (DirtBlock ::new );
49+ public static final StoneBlock stoneBlock = register (StoneBlock ::new );
50+ public static final SandBlock sandBlock = register (SandBlock ::new );
51+ public static final WaterBlock waterBlock = register (WaterBlock ::new );
52+ public static final OakLeafBlock leafBlock = register (OakLeafBlock ::new );
53+ public static final SpruceLeafBlock spruceLeafBlock = register (SpruceLeafBlock ::new );
54+ public static final OakLogBlock logBlock = register (OakLogBlock ::new );
55+ public static final SpruceLogBlock spruceLogBlock = register (SpruceLogBlock ::new );
56+ public static final BirchLogBlock birchLogBlock = register (BirchLogBlock ::new );
57+ public static final OakPlanksBlock oakPlanksBlock = register (OakPlanksBlock ::new );
58+ public static final SprucePlanksBlock sprucePlanksBlock = register (SprucePlanksBlock ::new );
59+ public static final BirchPlanksBlock birchPlanksBlock = register (BirchPlanksBlock ::new );
60+ public static final GlassBlock glassBlock = register (GlassBlock ::new );
61+ public static final SnowyGrassBlock snowyGrassBlock = register (SnowyGrassBlock ::new );
62+ public static final CactusBlock cactusBlock = register (CactusBlock ::new );
63+ public static final ShortGrassBlock shortGrassBlock = register (ShortGrassBlock ::new );
64+ public static final RedFlowerBlock redFlowerBlock = register (RedFlowerBlock ::new );
65+ public static final YellowFlowerBlock yellowFlowerBlock = register (YellowFlowerBlock ::new );
66+
67+ static {
68+ Blocks .REGISTRY .forEach ((id , block ) -> {
69+ if (block instanceof IBlockRender ) block .getModel ().create ();
70+ });
71+ }
72+ }
0 commit comments