生物群系画刷
基本信息
| 属性 | 值 |
|---|---|
| 注册名 | RandomThings:biomePainter |
| 类 | lumien.randomthings.Items.ItemBiomePainter |
| 堆叠上限 | 1(ItemBiomePainter.java:16) |
| 作用范围 | 1 个区块(Chunk 粒度) |
| 开关 | Items.BiomePainter(RTConfiguration.java:214) |
功能
生物群系画刷用生物群系胶囊的充能把一个区块的群系数组改写掉。它直接操作 Chunk.getBiomeArray(),是最"底层"的一类内容。
前置条件
onItemUse 首先要求玩家背包里有生物群系胶囊(ItemBiomePainter.java:23):
if (par2EntityPlayer.inventory.hasItem(ModItems.biomeCapsule)) {
然后遍历 36 格背包找已记录群系(getItemDamage() != 0)的胶囊(:26-27)。没有则静默失败。
充能检查
int charges = nbt.getInteger("charges");
if (charges > 0 || par2EntityPlayer.capabilities.isCreativeMode) {
(:33-34)—— 创造模式免费使用;生存模式每涂一次扣 1 点(:40-42):
nbt.setInteger("charges", charges - 1);
par2EntityPlayer.inventoryContainer.detectAndSendChanges();
群系改写
改写单位是整个区块(ItemBiomePainter.java:35-39):
Chunk c = par3World.getChunkFromBlockCoords(par4, par6);
int biomeID = is.getItemDamage() - 1;
byte[] biomeArray = c.getBiomeArray();
if ((biomeArray[(par6 & 15) << 4 | (par4 & 15)] & 255) != biomeID) {
biomeArray[(par6 & 15) << 4 | (par4 & 15)] = (byte) (biomeID & 255);
c.setBiomeArray(biomeArray);
...
索引 (par6 & 15) << 4 | (par4 & 15) 是原版 1.7.10 群系数组布局:Z 在高位、X 在低位。因此右键的方块坐标只用于定位"当前在哪个区块",实际改写的是该区块内 (x&15, z&15) 那一格的群系值。
改写后向全维度广播 MessagePaintBiome 以刷新客户端(:44 起,sendToDimension)。
数值
| 数值名 | 值 |
|---|---|
| 堆叠上限 | 1 |
| 影响范围 | 1 个 Chunk(256×256 列) |
| 充能消耗 | 每次 1 点(创造模式 0) |
| 群系 ID 来源 | 胶囊 metadata − 1 |
| 数组索引 | (z & 15) << 4 | (x & 15) |
交互
| 触发 | 行为 |
|---|---|
| 右键方块 | 改写该方块所在整个区块的群系值,消耗胶囊 1 点充能 |
| 无胶囊 / 无充能 | 静默无操作 |
| 创造模式 | 无限使用 |
| 改写后 | 全维度广播同步 |
合成配方
xtx
xwx
xox
| 字符 | 物品 |
|---|---|
t |
转换核心(RandomThings:ingredient meta 5) |
w |
羊毛(任意颜色,WILDCARD_VALUE) |
o |
黑曜石棒(stickObsidian) |
来源:Library/Recipes.java:440-451,受 ConfigItems.biomePainter 约束。