Skip to content

Commit 7a7fecd

Browse files
committed
fix: block palette & item palette
1 parent d91fc9f commit 7a7fecd

5 files changed

Lines changed: 35 additions & 12 deletions

File tree

src/main/java/com/reider745/api/CustomManager.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,13 @@ public class CustomManager {
99
public int id;
1010
public Class<?> clazz;
1111
public String type;
12+
public String textId;
1213

13-
public CustomManager(int id, Class<?> clazz, String type) {
14+
public CustomManager(int id, Class<?> clazz, String type, String textId) {
1415
this.id = id;
1516
this.clazz = clazz;
1617
this.type = type;
18+
this.textId = textId;
1719
}
1820

1921
@SuppressWarnings("unchecked")

src/main/java/com/reider745/block/CustomBlock.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@ public static ArrayList<String> getVariants(CustomManager manager) {
143143
public static HashMap<String, Integer> customBlocks = new HashMap<>();
144144

145145
public static CustomManager registerBlock(String textId, int id, String name, Class<?> item) {
146-
CustomManager manager = new CustomManager(id, item, "block");
146+
CustomManager manager = new CustomManager(id, item, "block", textId);
147147
manager.put("name", name);
148148
manager.put("states", BlockMethods.getStatesForId(id));
149149

src/main/java/com/reider745/hooks/block/BlockPalette.java

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import cn.nukkit.block.Block;
55
import cn.nukkit.block.BlockDoor;
66
import cn.nukkit.block.BlockID;
7+
import cn.nukkit.level.format.leveldb.BlockStateMapping;
78
import cn.nukkit.level.format.leveldb.LevelDBConstants;
89
import cn.nukkit.nbt.tag.CompoundTag;
910
import cn.nukkit.network.protocol.ProtocolInfo;
@@ -18,10 +19,12 @@
1819
import com.reider745.block.wall.BlockWall;
1920
import it.unimi.dsi.fastutil.ints.Int2IntMap;
2021
import it.unimi.dsi.fastutil.ints.Int2IntOpenHashMap;
22+
import org.cloudburstmc.nbt.NbtMap;
2123
import org.jetbrains.annotations.Nullable;
2224
import org.json.JSONObject;
2325

2426
import java.util.*;
27+
import java.util.concurrent.atomic.AtomicReference;
2528

2629
@Hooks(className = "cn.nukkit.level.GlobalBlockPalette")
2730
public class BlockPalette {
@@ -79,7 +82,7 @@ public static int getIdByName(String name) {
7982
return stateIdByName.get(name);
8083
}
8184

82-
private record BlockDescription(int id, int newId, JSONObject states, int data) {
85+
private record BlockDescription(int id, int newId, JSONObject states, int data, String identifier) {
8386
}
8487

8588
private static JSONObject cloneJSON(JSONObject json) {
@@ -121,7 +124,7 @@ private static void variantGenerations(List<Integer> states, List<JSONObject> va
121124
}
122125
}
123126

124-
private static List<JSONObject> variantGenerations(List<Integer> states) {
127+
public static List<JSONObject> variantGenerations(List<Integer> states) {
125128
final JSONObject temp = new JSONObject();
126129
for(int state : states) {
127130
temp.put(getNameForId(state), 0);
@@ -158,16 +161,30 @@ public static void init() {
158161
if(!doors.contains(newId) && e.getString("nameId").contains("_door"))
159162
doors.add(newId);
160163

161-
sortStates.add(new BlockDescription(e.getInt("oldId"), newId, states, legacyData));
164+
sortStates.add(new BlockDescription(e.getInt("oldId"), newId, states, legacyData, "minecraft:" + e.getString("nameId")));
162165
}
163166

164167
// custom runtime block
168+
169+
AtomicReference<Integer> RUNTIME_ID = new AtomicReference<>(Integer.MAX_VALUE);
165170
CustomBlock.blocks.forEach((id, manager) -> {
166-
//final ArrayList<String> variants = CustomBlock.getVariants(manager);
167171
final List<JSONObject> states = variantGenerations(CustomBlock.getStates(manager));
168172

169173
for (int data = 0; data < states.size(); data++) {
170-
sortStates.add(new BlockDescription(id, id, states.get(data), data));
174+
var state = states.get(data);
175+
sortStates.add(new BlockDescription(id, id, state, data, manager.textId));
176+
177+
int runtimeId = RUNTIME_ID.getAndSet(RUNTIME_ID.get() - 1);
178+
blockPalette.registerState(id, data, runtimeId, null);
179+
var builder = NbtMap.builder();
180+
181+
state.keySet().forEach((name) -> {
182+
builder.putInt(name, state.getInt(name));
183+
});
184+
builder.putString("name", manager.textId);
185+
var nbt = builder.build();
186+
nbt.hashCode();
187+
BlockStateMapping.get().registerState(runtimeId, nbt);
171188
}
172189
});
173190

src/main/java/com/reider745/hooks/item/RuntimeItemsHooks.java

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,12 @@
1111
import com.reider745.api.hooks.annotation.Inject;
1212
import com.reider745.block.CustomBlock;
1313
import com.reider745.block.wall.BlockWall;
14+
import com.reider745.hooks.block.BlockPalette;
1415
import com.reider745.item.CustomItem;
1516
import com.reider745.item.ItemMethod;
1617
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
1718
import it.unimi.dsi.fastutil.objects.Object2IntMap;
19+
import org.json.JSONObject;
1820

1921
import java.lang.reflect.InvocationTargetException;
2022
import java.lang.reflect.Method;
@@ -66,8 +68,10 @@ public static void register(int protocolId) {
6668
legacyString2LegacyInt.put(name, id);
6769
});
6870

69-
CustomBlock.customBlocks.forEach((name, _id) -> {
70-
for (int id = _id, data = 0; data < 16; data++) {
71+
CustomBlock.blocks.forEach((id, manager) -> {
72+
final String name = manager.textId;
73+
final List<JSONObject> variants = BlockPalette.variantGenerations(CustomBlock.getStates(manager));
74+
for (int data = 0; data < variants.size(); data++) {
7175
runtimeId2Name.put(id, name);
7276
name2RuntimeId.put(name, id);
7377

@@ -80,9 +84,9 @@ public static void register(int protocolId) {
8084
identifier2Legacy.put(name, legacyEntry);
8185
}
8286

83-
legacyString2LegacyInt.put(name, _id);
87+
legacyString2LegacyInt.put(name, id);
8488

85-
Item item = Item.get(_id, 0);
89+
Item item = Item.get(id, 0);
8690
if (item.getId() != 0) {
8791
Item.NAMESPACED_ID_ITEM.put(name, () -> item);
8892
}

src/main/java/com/reider745/item/CustomItem.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ public static String getTextIdForNumber(int id) {
102102
}
103103

104104
public static CustomManager registerItem(String textId, int id, String name, Class<?> item) {
105-
CustomManager manager = new CustomManager(id, item, "item");
105+
CustomManager manager = new CustomManager(id, item, "item", textId);
106106
manager.put(PropertiesNames.NAME, name);
107107
manager.put(PropertiesNames.MAX_DAMAGE, 0);
108108
manager.put(PropertiesNames.MAX_STACK, 64);

0 commit comments

Comments
 (0)