[全流程完成]

This commit is contained in:
1820982382
2026-08-19 00:18:43 +08:00
parent fc72ebca78
commit 0aa6db226e
14 changed files with 2128 additions and 0 deletions
@@ -0,0 +1,106 @@
package thaumicenergistics.common.integration.jade;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.network.chat.Component;
import net.minecraft.resources.ResourceLocation;
import snownee.jade.api.BlockAccessor;
import snownee.jade.api.IBlockComponentProvider;
import snownee.jade.api.IServerDataProvider;
import snownee.jade.api.ITooltip;
import snownee.jade.api.config.IPluginConfig;
import snownee.jade.api.ui.IElementHelper;
import thaumicenergistics.ThaumicEnergistics;
import thaumicenergistics.common.tiles.TileInfusionMonitor;
import thaumicenergistics.common.tiles.TileInfusionMonitor.RiskData;
/**
* 注魔监视器 Jade 显示:网络连接时展示附近注魔祭坛的 5 档风险 + 不稳定度 + 档位文字。
* 服务端把 BE 缓存的 RiskData 写入 NBT,客户端渲染。
*/
public enum InfusionMonitorProvider implements IBlockComponentProvider, IServerDataProvider<BlockAccessor> {
INSTANCE;
private static final String KEY = "InfusionMonitorRisk";
private static final int TIER_COLOR = 0xFF55FFFF;
@Override
public void appendServerData(CompoundTag data, BlockAccessor accessor) {
if (accessor.getBlockEntity() instanceof TileInfusionMonitor monitor) {
RiskData risk = monitor.getCachedRisk();
CompoundTag tag = new CompoundTag();
tag.putBoolean("found", risk.found());
tag.putBoolean("crafting", risk.crafting());
tag.putInt("tier", risk.tier());
tag.putInt("instability", risk.instability());
tag.putInt("symmetry", risk.symmetry());
tag.putInt("recipeInstability", risk.recipeInstability());
tag.putString("tierText", risk.tierText());
tag.putString("shortages", risk.shortages());
tag.putInt("totalNeeded", risk.totalNeeded());
data.put(KEY, tag);
}
}
@Override
public void appendTooltip(ITooltip tooltip, BlockAccessor accessor, IPluginConfig config) {
if (!accessor.getServerData().contains(KEY)) return;
CompoundTag tag = accessor.getServerData().getCompound(KEY);
boolean found = tag.getBoolean("found");
// 标题:监视器 + 状态
tooltip.add(Component.translatable("thaumicenergistics.jade.monitor.title"));
if (!found) {
tooltip.add(Component.translatable("thaumicenergistics.jade.monitor.no_matrix"));
return;
}
boolean crafting = tag.getBoolean("crafting");
int tier = tag.getInt("tier");
int instability = tag.getInt("instability");
int symmetry = tag.getInt("symmetry");
int recipeInstability = tag.getInt("recipeInstability");
String tierText = tag.getString("tierText");
String shortages = tag.getString("shortages");
int totalNeeded = tag.getInt("totalNeeded");
// 档位:⭐×tier / 5
String stars = "★".repeat(Math.max(1, tier)) + "☆".repeat(5 - tier);
tooltip.add(Component.literal(stars + " (" + tier + "/5)")
.withStyle(style -> style.withColor(tierColor(tier))));
// 不稳定度(分解:基础 + 祭坛)
tooltip.add(Component.translatable("thaumicenergistics.jade.monitor.instability",
instability, recipeInstability, symmetry));
// 档位文字(后果描述)
if (!tierText.isEmpty()) {
tooltip.add(Component.literal(tierText));
}
// 源质缺口
if (crafting) {
tooltip.add(Component.translatable("thaumicenergistics.jade.monitor.crafting"));
}
if (!shortages.isEmpty()) {
tooltip.add(Component.translatable("thaumicenergistics.jade.monitor.shortages", shortages));
} else if (totalNeeded > 0) {
tooltip.add(Component.translatable("thaumicenergistics.jade.monitor.essence_ok"));
}
}
private static int tierColor(int tier) {
return switch (tier) {
case 1 -> 0xFF55FF55; // 绿
case 2 -> 0xFFAAFF55; // 黄绿
case 3 -> 0xFFFFFF55; // 黄
case 4 -> 0xFFFFAA55; // 橙
default -> 0xFFFF5555; // 红
};
}
@Override
public ResourceLocation getUid() {
return ResourceLocation.fromNamespaceAndPath(ThaumicEnergistics.MODID, "infusion_monitor");
}
}
@@ -0,0 +1,199 @@
package thaumicenergistics.common.tiles;
import net.minecraft.core.BlockPos;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.entity.BlockEntity;
import thaumcraft.api.aspects.Aspect;
import thaumcraft.api.aspects.AspectList;
import thaumcraft.api.aspects.IAspectContainer;
import thaumcraft.common.blockentities.InfusionMatrixBlockEntity;
import thaumcraft.common.blockentities.PedestalBlockEntity;
import thaumicenergistics.common.tiles.TileInfusionMonitor.RiskData;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
* 注魔风险计算:扫描附近的注魔矩阵,按 5 档风险显示。
* <p>
* 判定依据(与 0.2.2.95 {@code InfusionMatrixBlockEntity} 源码一致):
* <ul>
* <li>单次异常判定概率 = instability / 500(每 10 tick 一次)。</li>
* <li>instability = 配方基础不稳定 + 祭坛对称度(上限 25)。</li>
* <li>源质不足会持续推高不稳定 → 源质缺口越大档位越高。</li>
* </ul>
*/
public final class InfusionRiskCalculator {
/** 扫描祭坛的半径。 */
private static final int MATRIX_SEARCH_RADIUS = 16;
/** 源质扫描半径(对应 EssentiaHandler.drainEssentia 的 range=12)。 */
private static final int ESSENTIA_SCAN_RADIUS = 12;
private InfusionRiskCalculator() {}
/** 附近注魔矩阵信息。 */
public record InfusionMatrixInfo(BlockPos matrixPos, InfusionMatrixBlockEntity matrix) {}
/** 扫描指定位置附近的注魔矩阵(取最近的)。 */
public static InfusionMatrixInfo scanNearbyMatrix(Level level, BlockPos center) {
InfusionMatrixBlockEntity nearest = null;
int bestDist = Integer.MAX_VALUE;
for (int dx = -MATRIX_SEARCH_RADIUS; dx <= MATRIX_SEARCH_RADIUS; dx++) {
for (int dz = -MATRIX_SEARCH_RADIUS; dz <= MATRIX_SEARCH_RADIUS; dz++) {
// 注魔矩阵在 y 方向位置固定(中央柱在下方 2 格),扫描 3 层高度
for (int dy = -4; dy <= 4; dy++) {
BlockPos pos = center.offset(dx, dy, dz);
if (level.getBlockEntity(pos) instanceof InfusionMatrixBlockEntity matrix) {
int dist = dx * dx + dz * dz + dy * dy;
if (dist < bestDist) {
bestDist = dist;
nearest = matrix;
}
}
}
}
}
return nearest != null ? new InfusionMatrixInfo(nearest.getBlockPos(), nearest) : null;
}
/**
* 计算风险数据。若祭坛正在注魔,用实时 instability;否则估算:
* 复制 matches() 匹配当前祭坛布局的配方(忽略研究门禁),得出配方基础不稳定 + 祭坛对称度。
*/
public static RiskData computeRisk(Level level, InfusionMatrixInfo info) {
InfusionMatrixBlockEntity matrix = info.matrix();
boolean crafting = matrix.crafting();
int symmetry = matrix.symmetry();
int recipeInstability;
int instability;
if (crafting) {
// 注魔中:instability() 实时(可能被源质不足推高)
instability = Math.min(25, matrix.instability());
recipeInstability = Math.max(0, instability - symmetry);
} else {
// 未开始:估算配方基础不稳定
recipeInstability = estimateRecipeInstability(level, info);
instability = Math.min(25, recipeInstability + symmetry);
}
// 源质缺口:剩余所需 vs 周围可抽
String shortages = "";
int totalNeeded = 0;
AspectList remaining = matrix.remainingEssentia();
if (remaining != null && remaining.size() > 0) {
Map<Aspect, Long> available = scanAvailableEssentia(level, info.matrixPos());
StringBuilder sb = new StringBuilder();
for (Aspect aspect : remaining.aspects()) {
int need = remaining.amount(aspect);
if (need <= 0) continue;
totalNeeded += need;
long have = available.getOrDefault(aspect, 0L);
if (have < need) {
if (!sb.isEmpty()) sb.append(",");
sb.append(aspect.getTag()).append(" 缺 ").append(need - have);
}
}
shortages = sb.toString();
}
int tier = tierFor(instability, shortages, totalNeeded);
return new RiskData(true, crafting, tier, instability, symmetry, recipeInstability,
tierText(tier), shortages, totalNeeded);
}
/** 5 档判定:不稳定度 + 源质缺口强制升级。 */
private static int tierFor(int instability, String shortages, int totalNeeded) {
int tier;
if (instability <= 1) tier = 1;
else if (instability <= 3) tier = 2;
else if (instability <= 6) tier = 3;
else if (instability <= 12) tier = 4;
else tier = 5;
// 源质缺口强制升级
if (!shortages.isEmpty()) {
// 缺口过半(总需 > 0 且缺口文字非空)→ 至少 4 档;严重 → 5 档
if (totalNeeded > 0 && shortages.length() > 20) {
tier = Math.max(tier, 5);
} else {
tier = Math.max(tier, 4);
}
}
return tier;
}
/** 档位对应文字(玩家视角后果)。 */
public static String tierText(int tier) {
return switch (tier) {
case 1 -> "基本安静,偶发弹飞 1 个物品";
case 2 -> "弹飞常见;闪电/咒波几乎不出现";
case 3 -> "弹飞+可能电击;咒波罕见";
case 4 -> "电击/爆炸/咒波都可能;可能销毁物品";
case 5 -> "频繁销毁/爆炸/咒波/精神污染——不要开始";
default -> "";
};
}
/** 未注魔时估算匹配配方的配方基础不稳定(复制 matches 但忽略研究门禁)。 */
private static int estimateRecipeInstability(Level level, InfusionMatrixInfo info) {
InfusionMatrixBlockEntity matrix = info.matrix();
try {
// 取中央柱物品(注魔矩阵正下方 2 格)
PedestalBlockEntity center = level.getBlockEntity(info.matrixPos().below(2)) instanceof PedestalBlockEntity ped
? ped : null;
if (center == null || center.heldStack().isEmpty()) {
return 0;
}
ItemStack central = center.heldStack();
// 收集周围柱物品(与 scanSurroundings 一致的 ±8 范围简化版)
List<ItemStack> components = new ArrayList<>();
for (int dx = -8; dx <= 8; dx++) {
for (int dz = -8; dz <= 8; dz++) {
if (dx == 0 && dz == 0) continue;
for (int dy = 1; dy <= 10; dy++) {
BlockEntity be = level.getBlockEntity(info.matrixPos().offset(dx, -dy, dz));
if (be instanceof PedestalBlockEntity ped && !ped.heldStack().isEmpty()) {
components.add(ped.heldStack());
break;
}
}
}
}
// 找匹配配方(忽略研究:直接比对中央 + 组件,不调 matches 以免研究门禁)
for (Object o : thaumcraft.api.ThaumcraftApi.getCraftingRecipes()) {
if (!(o instanceof thaumcraft.api.crafting.InfusionRecipe recipe)) continue;
if (!recipe.getRecipeInput().is(central.getItem())) continue;
// 简化:中央物品匹配即采用其基础不稳定(组件精确匹配留给 craftingStart 处理)
return recipe.instability(central);
}
} catch (Exception ignored) {
}
return 0;
}
/** 扫描周围 12 格内源质容器,汇总每种源质可抽量。 */
private static Map<Aspect, Long> scanAvailableEssentia(Level level, BlockPos matrixPos) {
Map<Aspect, Long> totals = new ConcurrentHashMap<>();
for (int dx = -ESSENTIA_SCAN_RADIUS; dx <= ESSENTIA_SCAN_RADIUS; dx++) {
for (int dy = -6; dy <= 6; dy++) {
for (int dz = -ESSENTIA_SCAN_RADIUS; dz <= ESSENTIA_SCAN_RADIUS; dz++) {
BlockEntity be = level.getBlockEntity(matrixPos.offset(dx, dy, dz));
if (be == null || be == level.getBlockEntity(matrixPos)) continue;
if (be instanceof IAspectContainer container) {
AspectList aspects = container.getAspects();
if (aspects == null) continue;
for (Aspect aspect : aspects.aspects()) {
int amt = aspects.getAmount(aspect);
if (amt > 0) totals.merge(aspect, (long) amt, Long::sum);
}
}
}
}
}
return totals;
}
}
@@ -0,0 +1,517 @@
package thaumicenergistics.common.tiles;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.core.HolderLookup;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.network.chat.Component;
import net.minecraft.world.Container;
import net.minecraft.world.Containers;
import net.minecraft.world.SimpleContainer;
import net.minecraft.world.entity.EntityType;
import net.minecraft.world.entity.Display;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.phys.AABB;
import net.neoforged.neoforge.common.extensions.IPlayerExtension;
import net.neoforged.neoforge.network.PacketDistributor;
import java.util.EnumSet;
import java.util.List;
import appeng.api.networking.GridFlags;
import appeng.api.networking.GridHelper;
import appeng.api.networking.IGrid;
import appeng.api.networking.IGridNode;
import appeng.api.networking.IGridNodeListener;
import appeng.api.networking.IManagedGridNode;
import appeng.api.networking.IInWorldGridNodeHost;
import appeng.api.util.AECableType;
import net.minecraft.world.item.Items;
import thaumicenergistics.ThaumicEnergistics;
import thaumicenergistics.init.ModBlockEntities;
import thaumicenergistics.init.ModBlocks;
/**
* 注魔监视器(灵气观测器)方块实体。
* <ul>
* <li>1 格物品槽:Shift+右键放入魔导手册(book 状态)。</li>
* <li>AE2 网格节点:连接 ME 网络后 network 状态=true。</li>
* <li>每 tick 扫描附近注魔矩阵,缓存风险数据供 Jade 显示(5 档风险/不稳定度/档位文字)。</li>
* </ul>
* 方块状态:
* <ol>
* <li>默认 → off 模型</li>
* <li>放手册 → off + book</li>
* <li>手册 + 连网 → off + book + on</li>
* <li>连网(无手册)→ off + Jade 显示</li>
* </ol>
*/
public class TileInfusionMonitor extends ThETileBase implements IInWorldGridNodeHost {
/** 手册槽位。 */
public static final int BOOK_SLOT = 0;
private static final int SCAN_INTERVAL = 10; // 每 10 tick 扫描一次祭坛
protected final IManagedGridNode mainNode;
private final SimpleContainer inventory = new SimpleContainer(1) {
@Override
public void setChanged() {
super.setChanged();
TileInfusionMonitor.this.setChanged();
TileInfusionMonitor.this.updateBookState();
}
};
private int scanCounter = 0;
private BlockPos matrixPos = null;
/** 缓存的注魔风险数据(弹窗显示)。 */
private RiskData cachedRisk = RiskData.NONE;
/** 悬浮气泡实体(text_display,服务端引用)。 */
private net.minecraft.world.entity.Display.TextDisplay bubble;
/** 气泡实体 Tag(用于坐标匹配查找)。 */
private static final String BUBBLE_TAG = "thaumicenergistics:monitor_bubble";
/** 气泡背景:半透明深灰(ARGB,Alpha=176)。 */
private static final int BUBBLE_BG_COLOR = 0xB0333333;
/** 气泡行宽(换行宽度)。中文全角字符约 12px,最长行"不稳定度: 9 (基础 5 + 祭坛 4)"约 240px——
* 必须大于最长行,否则行尾空格被换行逻辑丢弃、背景只包住分段 → 右侧看似截断。 */
private static final int BUBBLE_LINE_WIDTH = 320;
private final IGridNodeListener<TileInfusionMonitor> nodeListener = new IGridNodeListener<>() {
@Override
public void onSaveChanges(TileInfusionMonitor owner, IGridNode node) {
owner.setChanged();
}
@Override
public void onStateChanged(TileInfusionMonitor owner, IGridNode node, State state) {
if (state == State.POWER) {
owner.updateNetworkState();
}
owner.markForUpdate();
}
};
public TileInfusionMonitor(BlockPos pos, BlockState state) {
super(ModBlockEntities.INFUSION_MONITOR.get(), pos, state);
this.mainNode = GridHelper.createManagedNode(this, nodeListener)
.setVisualRepresentation(thaumicenergistics.init.ModItems.INFUSION_MONITOR_ITEM.get())
.setInWorldNode(true)
.setTagName("proxy")
.setFlags(GridFlags.REQUIRE_CHANNEL)
.setExposedOnSides(EnumSet.allOf(Direction.class));
this.mainNode.setIdlePowerUsage(40.0);
}
@Override
public void onLoad() {
super.onLoad();
if (level != null && !level.isClientSide()) {
mainNode.create(level, getBlockPos());
}
updateBookState();
updateNetworkState();
}
@Override
public void setRemoved() {
super.setRemoved();
if (level != null && !level.isClientSide()) {
discardBubble();
}
if (mainNode != null) {
mainNode.destroy();
}
}
@Override
public void onChunkUnloaded() {
super.onChunkUnloaded();
if (mainNode != null) {
mainNode.destroy();
}
}
@Override
public void onBreakBlock() {
super.onBreakBlock();
if (level != null && !level.isClientSide) {
discardBubble();
Containers.dropContents(level, worldPosition, inventory);
}
}
// ===== tick / 扫描 =====
public static void tick(Level level, BlockPos pos, BlockState state, TileInfusionMonitor be) {
if (level.isClientSide()) return;
if (++be.scanCounter >= SCAN_INTERVAL) {
be.scanCounter = 0;
be.scanMatrix();
}
be.updateNetworkState();
be.updateBubble();
}
/** 扫描附近注魔矩阵并缓存风险数据。 */
private void scanMatrix() {
BlockPos found = null;
InfusionRiskCalculator.InfusionMatrixInfo info = InfusionRiskCalculator.scanNearbyMatrix(level, worldPosition);
RiskData newRisk = info != null ? InfusionRiskCalculator.computeRisk(level, info) : RiskData.NONE;
boolean riskChanged = !newRisk.equals(this.cachedRisk);
this.cachedRisk = newRisk;
if (info != null) {
found = info.matrixPos();
}
if (riskChanged || !java.util.Objects.equals(found, this.matrixPos)) {
this.matrixPos = found;
markForUpdate();
}
}
// ===== 网格节点 / 状态同步 =====
private void updateNetworkState() {
if (level == null || level.isClientSide()) return;
boolean net = mainNode.isActive();
BlockState st = getBlockState();
if (st.getValue(ModBlocks.NETWORK) != net) {
level.setBlock(worldPosition, st.setValue(ModBlocks.NETWORK, net), 3);
// setBlock 后本 BE 仍存在;刷新引用
BlockEntity be = level.getBlockEntity(worldPosition);
if (be != null && be != this) {
be.setChanged();
}
}
}
private void updateBookState() {
if (level == null || level.isClientSide()) return;
boolean hasBook = !inventory.getItem(BOOK_SLOT).isEmpty();
BlockState st = getBlockState();
if (st.getValue(ModBlocks.BOOK) != hasBook) {
level.setBlock(worldPosition, st.setValue(ModBlocks.BOOK, hasBook), 3);
BlockEntity be = level.getBlockEntity(worldPosition);
if (be != null && be != this) {
be.setChanged();
}
}
}
// ===== 悬浮气泡(text_display 实体) =====
/**
* 每 tick 更新气泡:条件 = 放入魔导手册 且 连接 AE 网络 且 检测到注魔祭坛。
* 满足 → 生成/更新气泡;不满足 → 销毁气泡。
*/
private void updateBubble() {
if (level == null || level.isClientSide()) return;
boolean shouldShow = getBlockState().getValue(ModBlocks.BOOK)
&& getBlockState().getValue(ModBlocks.NETWORK)
&& cachedRisk.found();
if (shouldShow) {
ensureBubble();
if (bubble != null) {
applyBubbleNbt(buildBubbleText(cachedRisk));
}
} else {
discardBubble();
}
}
/** 确保气泡实体存在(不存在则生成;区块重载后按 Tag 找回旧实体)。 */
private void ensureBubble() {
if (bubble != null && bubble.isAlive()) return;
bubble = findBubble();
if (bubble != null) return;
bubble = EntityType.TEXT_DISPLAY.create(level);
if (bubble == null) return;
bubble.setPos(worldPosition.getX() + 0.5, worldPosition.getY() + 1.4, worldPosition.getZ() + 0.5);
// 1.21.1 TextDisplay 配置 API 均为 private/protected:反射调用 readAdditionalSaveData
// 用 summon 命令同款 NBT 一次配置全部字段(text/background/billboard/shadow/see_through 等)。
applyBubbleNbt(buildBubbleText(cachedRisk));
bubble.addTag(BUBBLE_TAG);
level.addFreshEntity(bubble);
}
/** 反射调用 readAdditionalSaveData(CompoundTag) 配置气泡(缓存 Method)。 */
private static java.lang.reflect.Method READ_NBT_METHOD;
private void applyBubbleNbt(Component text) {
if (bubble == null || level == null) return;
try {
if (READ_NBT_METHOD == null) {
READ_NBT_METHOD = net.minecraft.world.entity.Entity.class
.getDeclaredMethod("readAdditionalSaveData", CompoundTag.class);
READ_NBT_METHOD.setAccessible(true);
}
CompoundTag nbt = new CompoundTag();
nbt.putString("text", Component.Serializer.toJson(text, level.registryAccess()));
nbt.putBoolean("default_background", false);
nbt.putInt("background", BUBBLE_BG_COLOR);
nbt.putString("billboard", "vertical");
nbt.putInt("line_width", BUBBLE_LINE_WIDTH);
nbt.putBoolean("shadow", true);
nbt.putBoolean("see_through", false);
// 文字调小:transformation.scale 整体缩到 0.5(text_display 无字号参数,靠实体缩放)
CompoundTag transform = new CompoundTag();
transform.put("scale", floatList(0.5F, 0.5F, 0.5F));
transform.put("translation", floatList(0F, 0F, 0F));
transform.put("left_rotation", floatList(0F, 0F, 0F, 1F));
transform.put("right_rotation", floatList(0F, 0F, 0F, 1F));
nbt.put("transformation", transform);
READ_NBT_METHOD.invoke(bubble, nbt);
} catch (Exception e) {
ThaumicEnergistics.LOG.warn("[Monitor] 气泡配置失败: {}", e.toString());
}
}
/** 构造 FloatTag 列表(1.21.1 CompoundTag 无 putFloatArray,需 ListTag)。 */
private static net.minecraft.nbt.ListTag floatList(float... values) {
net.minecraft.nbt.ListTag list = new net.minecraft.nbt.ListTag();
for (float v : values) {
list.add(net.minecraft.nbt.FloatTag.valueOf(v));
}
return list;
}
/** 按 Tag + 方块附近 AABB 查找已存在的气泡。 */
private net.minecraft.world.entity.Display.TextDisplay findBubble() {
if (level == null) return null;
AABB aabb = new AABB(worldPosition).inflate(0.15, 2.0, 0.15);
List<net.minecraft.world.entity.Display.TextDisplay> list = level.getEntitiesOfClass(
net.minecraft.world.entity.Display.TextDisplay.class, aabb,
e -> e.getTags().contains(BUBBLE_TAG));
return list.isEmpty() ? null : list.get(0);
}
/** 销毁气泡(方块拆除/条件不满足时)。 */
private void discardBubble() {
if (bubble != null && bubble.isAlive()) {
bubble.discard();
} else {
net.minecraft.world.entity.Display.TextDisplay found = findBubble();
if (found != null) {
found.discard();
}
}
bubble = null;
}
/** 风险数据 → 气泡多行文本(2 行:注魔风险/不稳定度;描述改由右键在聊天框显示)。 */
private static Component buildBubbleText(RiskData risk) {
// 内边距必须用不间断空格(\u00A0):普通空格在行尾会被字体布局裁剪,
// 导致背景只包住左侧、右侧贴边。NBSP 有真实字形,两侧都保留。
String pad = "\u00A0\u00A0"; // 左右内边距(NBSP)
String tierWord = tierWord(risk.tier());
Component line1 = Component.literal(pad + "注魔风险: " + tierWord + pad)
.withStyle(style -> style.withColor(tierColor(risk.tier())));
Component line2 = Component.literal(pad + "不稳定度: " + risk.instability()
+ " (基础 " + risk.recipeInstability() + " + 祭坛 " + risk.symmetry() + ")" + pad)
.withStyle(style -> style.withColor(0xFFFFFFFF));
// 上下各留一个空行(垂直内边距)
return Component.literal("\n")
.append(line1).append("\n")
.append(line2).append("\n");
}
/** 5 档文字(无星星)。 */
private static String tierWord(int tier) {
return switch (tier) {
case 1 -> "极低";
case 2 -> "低";
case 3 -> "中";
case 4 -> "高";
case 5 -> "极高";
default -> "?";
};
}
/** 5 档描述(神秘时代风)。 */
private static String tierDesc(int tier) {
return switch (tier) {
case 1 -> "灵光如镜,仪式安然";
case 2 -> "灵光微澜,无碍仪式";
case 3 -> "符文低鸣,灵光流转不宁";
case 4 -> "裂隙于虚空中睁开,注视着祭坛";
case 5 -> "咒波翻涌,裂隙将吞没一切";
default -> "";
};
}
/** 档位颜色:1 绿 → 5 红。 */
private static int tierColor(int tier) {
return switch (tier) {
case 1 -> 0xFF55FF55;
case 2 -> 0xFFAAFF55;
case 3 -> 0xFFFFFF55;
case 4 -> 0xFFFFAA55;
default -> 0xFFFF5555;
};
}
/** 放入魔导手册(方块右键拦截后调用,防止书自身 use 打开界面)。 */
public void placeBook(Player player, ItemStack held) {
if (level == null || level.isClientSide()) return;
if (inventory.getItem(BOOK_SLOT).isEmpty()) {
inventory.setItem(BOOK_SLOT, held.copyWithCount(1));
if (!player.getAbilities().instabuild) {
held.shrink(1);
}
setChanged();
}
}
/** 取回魔导手册(Shift+右键)。 */
public void retrieveBook(Player player) {
if (level == null || level.isClientSide()) return;
ItemStack book = inventory.getItem(BOOK_SLOT);
if (!book.isEmpty()) {
if (!player.getInventory().add(book)) {
net.minecraft.world.Containers.dropItemStack(level, worldPosition.getX(), worldPosition.getY(), worldPosition.getZ(), book);
}
inventory.setItem(BOOK_SLOT, ItemStack.EMPTY);
setChanged();
}
}
/** 右键:在玩家聊天框显示当前风险档位 + 描述。 */
public void showDescriptionInChat(Player player) {
if (level == null || level.isClientSide()) return;
if (!cachedRisk.found()) {
player.sendSystemMessage(Component.literal("§7韵魔观测器: 未检测到注魔祭坛"));
return;
}
String tierWord = tierWord(cachedRisk.tier());
String desc = tierDesc(cachedRisk.tier());
// 档位行用档位颜色
Component msg = Component.literal("注魔风险: ")
.withStyle(style -> style.withColor(tierColor(cachedRisk.tier())))
.append(Component.literal(tierWord + " §f—— " + desc));
player.sendSystemMessage(msg);
}
public static boolean isThaumonomicon(ItemStack stack) {
if (stack.isEmpty()) return false;
return stack.is(net.minecraft.core.registries.BuiltInRegistries.ITEM.get(
net.minecraft.resources.ResourceLocation.fromNamespaceAndPath("thaumcraft", "thaumonomicon")));
}
// ===== 访问器 =====
public Container getInventory() {
return inventory;
}
public boolean hasBook() {
return !inventory.getItem(BOOK_SLOT).isEmpty();
}
public RiskData getCachedRisk() {
return cachedRisk;
}
// ===== IInWorldGridNodeHost =====
@Override
public IGridNode getGridNode(Direction dir) {
return mainNode.getNode();
}
public AECableType getCableConnectionType(Direction dir) {
return AECableType.SMART;
}
public void markForUpdate() {
if (level != null) {
setChanged();
level.sendBlockUpdated(worldPosition, getBlockState(), getBlockState(), 3);
// blockEntityChanged → 触发 getUpdateTag 同步到客户端(悬浮弹窗数据依赖)
level.blockEntityChanged(worldPosition);
}
}
// ===== NBT =====
@Override
public CompoundTag getUpdateTag(HolderLookup.Provider reg) {
CompoundTag tag = super.getUpdateTag(reg);
saveRiskToTag(tag);
if (!inventory.getItem(BOOK_SLOT).isEmpty()) {
tag.put("Book", inventory.getItem(BOOK_SLOT).save(reg));
}
return tag;
}
@Override
public void handleUpdateTag(CompoundTag tag, HolderLookup.Provider reg) {
super.handleUpdateTag(tag, reg);
loadRiskFromTag(tag);
if (tag.contains("Book")) {
inventory.setItem(BOOK_SLOT, ItemStack.parseOptional(reg, tag.getCompound("Book")));
}
}
private void saveRiskToTag(CompoundTag tag) {
tag.putBoolean("RiskFound", cachedRisk.found());
tag.putBoolean("RiskCrafting", cachedRisk.crafting());
tag.putInt("RiskTier", cachedRisk.tier());
tag.putInt("RiskInstability", cachedRisk.instability());
tag.putInt("RiskSymmetry", cachedRisk.symmetry());
tag.putInt("RiskRecipeInstability", cachedRisk.recipeInstability());
tag.putString("RiskTierText", cachedRisk.tierText());
tag.putString("RiskShortages", cachedRisk.shortages());
tag.putInt("RiskTotalNeeded", cachedRisk.totalNeeded());
}
private void loadRiskFromTag(CompoundTag tag) {
this.cachedRisk = new RiskData(
tag.getBoolean("RiskFound"),
tag.getBoolean("RiskCrafting"),
tag.getInt("RiskTier"),
tag.getInt("RiskInstability"),
tag.getInt("RiskSymmetry"),
tag.getInt("RiskRecipeInstability"),
tag.getString("RiskTierText"),
tag.getString("RiskShortages"),
tag.getInt("RiskTotalNeeded"));
}
@Override
protected void loadAdditional(CompoundTag tag, HolderLookup.Provider reg) {
super.loadAdditional(tag, reg);
if (tag.contains("Book")) {
inventory.setItem(BOOK_SLOT, ItemStack.parseOptional(reg, tag.getCompound("Book")));
}
if (tag.contains("MatrixPos")) {
matrixPos = BlockPos.of(tag.getLong("MatrixPos"));
}
mainNode.loadFromNBT(tag);
}
@Override
protected void saveAdditional(CompoundTag tag, HolderLookup.Provider reg) {
super.saveAdditional(tag, reg);
if (!inventory.getItem(BOOK_SLOT).isEmpty()) {
tag.put("Book", inventory.getItem(BOOK_SLOT).save(reg));
}
if (matrixPos != null) {
tag.putLong("MatrixPos", matrixPos.asLong());
}
mainNode.saveToNBT(tag);
}
/** 注魔风险缓存数据(Jade 用)。 */
public record RiskData(boolean found, boolean crafting, int tier, int instability, int symmetry,
int recipeInstability, String tierText, String shortages, int totalNeeded) {
public static final RiskData NONE = new RiskData(false, false, 0, 0, 0, 0, "", "", 0);
}
}
@@ -0,0 +1,12 @@
{
"variants": {
"facing=north,variant=false": { "model": "thaumicenergistics:block/alkusure86fumo", "y": 0 },
"facing=south,variant=false": { "model": "thaumicenergistics:block/alkusure86fumo", "y": 180 },
"facing=east,variant=false": { "model": "thaumicenergistics:block/alkusure86fumo", "y": 90 },
"facing=west,variant=false": { "model": "thaumicenergistics:block/alkusure86fumo", "y": 270 },
"facing=north,variant=true": { "model": "thaumicenergistics:block/a999csfumo", "y": 0 },
"facing=south,variant=true": { "model": "thaumicenergistics:block/a999csfumo", "y": 180 },
"facing=east,variant=true": { "model": "thaumicenergistics:block/a999csfumo", "y": 90 },
"facing=west,variant=true": { "model": "thaumicenergistics:block/a999csfumo", "y": 270 }
}
}
@@ -0,0 +1,16 @@
{
"multipart": [
{ "when": { "facing": "north" }, "apply": { "model": "thaumicenergistics:block/infusion_monitor_off", "y": 180 } },
{ "when": { "facing": "south" }, "apply": { "model": "thaumicenergistics:block/infusion_monitor_off", "y": 0 } },
{ "when": { "facing": "east" }, "apply": { "model": "thaumicenergistics:block/infusion_monitor_off", "y": 270 } },
{ "when": { "facing": "west" }, "apply": { "model": "thaumicenergistics:block/infusion_monitor_off", "y": 90 } },
{ "when": { "facing": "north", "book": "true" }, "apply": { "model": "thaumicenergistics:block/infusion_monitor_book", "y": 180 } },
{ "when": { "facing": "south", "book": "true" }, "apply": { "model": "thaumicenergistics:block/infusion_monitor_book", "y": 0 } },
{ "when": { "facing": "east", "book": "true" }, "apply": { "model": "thaumicenergistics:block/infusion_monitor_book", "y": 270 } },
{ "when": { "facing": "west", "book": "true" }, "apply": { "model": "thaumicenergistics:block/infusion_monitor_book", "y": 90 } },
{ "when": { "facing": "north", "book": "true", "network": "true" }, "apply": { "model": "thaumicenergistics:block/infusion_monitor_on", "y": 180 } },
{ "when": { "facing": "south", "book": "true", "network": "true" }, "apply": { "model": "thaumicenergistics:block/infusion_monitor_on", "y": 0 } },
{ "when": { "facing": "east", "book": "true", "network": "true" }, "apply": { "model": "thaumicenergistics:block/infusion_monitor_on", "y": 270 } },
{ "when": { "facing": "west", "book": "true", "network": "true" }, "apply": { "model": "thaumicenergistics:block/infusion_monitor_on", "y": 90 } }
]
}
@@ -0,0 +1,216 @@
{
"format_version": "1.9.0",
"credit": "Made with _leng",
"render_type": "cutout",
"textures": {
"1": "thaumicenergistics:block/alkusure86fumo",
"particle": "thaumicenergistics:block/alkusure86fumo"
},
"elements": [
{
"name": "Head",
"from": [4.35, 4.48613, 8.33113],
"to": [11.65, 11.78613, 15.63113],
"rotation": {"angle": 22.5, "axis": "x", "origin": [7.975, 8.21113, 11.90613]},
"faces": {
"north": {"uv": [2, 2, 4, 4], "texture": "#1"},
"east": {"uv": [0, 2, 2, 4], "texture": "#1"},
"south": {"uv": [6, 2, 8, 4], "texture": "#1"},
"west": {"uv": [4, 2, 6, 4], "texture": "#1"},
"up": {"uv": [4, 2, 2, 0], "texture": "#1"},
"down": {"uv": [4, 0, 6, 2], "texture": "#1"}
}
},
{
"name": "Hat Layer",
"from": [4.1, 4.48613, 7.98113],
"to": [11.8, 12.08613, 15.68113],
"rotation": {"angle": 22.5, "axis": "x", "origin": [7.975, 8.21113, 11.90613]},
"faces": {
"north": {"uv": [10, 2, 12, 4], "texture": "#1"},
"east": {"uv": [8, 2, 10, 4], "texture": "#1"},
"south": {"uv": [14, 2, 16, 4], "texture": "#1"},
"west": {"uv": [12, 2, 14, 4], "texture": "#1"},
"up": {"uv": [12, 2, 10, 0], "texture": "#1"},
"down": {"uv": [12, 0, 14, 2], "texture": "#1"}
}
},
{
"name": "Left Arm",
"from": [3.89, -0.57401, 9.01167],
"to": [5.39, 5.42599, 11.01167],
"rotation": {"angle": -22.5, "axis": "z", "origin": [4.6527, 2.42599, 10.01167]},
"faces": {
"north": {"uv": [9, 13, 9.75, 16], "texture": "#1"},
"east": {"uv": [8, 13, 9, 16], "texture": "#1"},
"south": {"uv": [10.75, 13, 11.5, 16], "texture": "#1"},
"west": {"uv": [9.75, 13, 10.5, 16], "texture": "#1"},
"up": {"uv": [9, 12, 9.75, 13], "texture": "#1"},
"down": {"uv": [9.75, 12, 10.5, 13], "texture": "#1"}
}
},
{
"name": "Left Arm Layer",
"from": [3.8154, -0.67401, 8.91167],
"to": [5.5154, 5.52599, 11.11167],
"rotation": {"angle": -22.5, "axis": "z", "origin": [4.6527, 2.42599, 10.01167]},
"faces": {
"north": {"uv": [13, 13, 13.75, 16], "texture": "#1"},
"east": {"uv": [12, 13, 13, 16], "texture": "#1"},
"south": {"uv": [14.5, 13, 15.25, 16], "texture": "#1"},
"west": {"uv": [13.75, 13, 14.5, 16], "texture": "#1"},
"up": {"uv": [13, 12, 13.75, 13], "texture": "#1"},
"down": {"uv": [13.75, 12, 14.5, 13], "texture": "#1"}
}
},
{
"name": "RightArm",
"from": [10.48, -0.65754, 8.979],
"to": [11.98, 5.34246, 10.979],
"rotation": {"angle": 22.5, "axis": "z", "origin": [11.13663, 2.34246, 9.979]},
"faces": {
"north": {"uv": [11, 5, 11.75, 8], "texture": "#1"},
"east": {"uv": [10, 5, 11, 8], "texture": "#1"},
"south": {"uv": [12.75, 5, 13.5, 8], "texture": "#1"},
"west": {"uv": [11.75, 5, 12.5, 8], "texture": "#1"},
"up": {"uv": [11, 4, 11.75, 5], "texture": "#1"},
"down": {"uv": [12.5, 4, 11.75, 5], "texture": "#1"}
}
},
{
"name": "Right Arm Layer",
"from": [10.36163, -0.75754, 8.879],
"to": [12.06163, 5.44246, 11.079],
"rotation": {"angle": 22.5, "axis": "z", "origin": [11.16163, 2.34246, 9.979]},
"faces": {
"north": {"uv": [11, 9, 11.75, 12], "texture": "#1"},
"east": {"uv": [10, 9, 11, 12], "texture": "#1"},
"south": {"uv": [12.75, 9, 13.5, 12], "texture": "#1"},
"west": {"uv": [11.75, 9, 12.5, 12], "texture": "#1"},
"up": {"uv": [11, 8, 11.75, 9], "texture": "#1"},
"down": {"uv": [12.5, 8, 11.75, 9], "texture": "#1"}
}
},
{
"name": "Left Leg",
"from": [7.77, -0.23, -0.23],
"to": [10.23, 2.23, 6.23],
"rotation": {"angle": -22.5, "axis": "y", "origin": [8, 0.1, 7]},
"faces": {
"north": {"uv": [2, 4, 3, 5], "texture": "#1"},
"east": {"uv": [0, 8, 1, 5], "rotation": 90, "texture": "#1"},
"south": {"uv": [1, 4, 2, 5], "texture": "#1"},
"west": {"uv": [2, 5, 3, 8], "rotation": 90, "texture": "#1"},
"up": {"uv": [2, 8, 1, 5], "texture": "#1"},
"down": {"uv": [3, 5, 4, 8], "texture": "#1"}
}
},
{
"name": "Left Leg Layer",
"from": [7.67, -0.33, -0.33],
"to": [10.33, 2.33, 6.33],
"rotation": {"angle": -22.5, "axis": "y", "origin": [8, 0.1, 7]},
"faces": {
"north": {"uv": [2, 8, 3, 9], "texture": "#1"},
"east": {"uv": [0, 12, 1, 9], "rotation": 90, "texture": "#1"},
"south": {"uv": [1, 8, 2, 9], "texture": "#1"},
"west": {"uv": [2, 9, 3, 12], "rotation": 90, "texture": "#1"},
"up": {"uv": [2, 12, 1, 9], "texture": "#1"},
"down": {"uv": [3, 9, 4, 12], "texture": "#1"}
}
},
{
"name": "Right Leg",
"from": [5.77, -0.23, -0.23],
"to": [8.23, 2.23, 6.23],
"rotation": {"angle": 22.5, "axis": "y", "origin": [8, 0.1, 7]},
"faces": {
"north": {"uv": [6, 12, 7, 13], "texture": "#1"},
"east": {"uv": [4, 16, 5, 13], "rotation": 90, "texture": "#1"},
"south": {"uv": [5, 12, 6, 13], "texture": "#1"},
"west": {"uv": [6, 13, 7, 16], "rotation": 90, "texture": "#1"},
"up": {"uv": [6, 16, 5, 13], "texture": "#1"},
"down": {"uv": [7, 13, 8, 16], "texture": "#1"}
}
},
{
"name": "Right Leg Layer",
"from": [5.67, -0.33, -0.33],
"to": [8.33, 2.33, 6.33],
"rotation": {"angle": 22.5, "axis": "y", "origin": [8, 0.1, 7]},
"faces": {
"north": {"uv": [2, 12, 3, 13], "texture": "#1"},
"east": {"uv": [0, 16, 1, 13], "rotation": 90, "texture": "#1"},
"south": {"uv": [1, 12, 2, 13], "texture": "#1"},
"west": {"uv": [2, 13, 3, 16], "rotation": 90, "texture": "#1"},
"up": {"uv": [2, 16, 1, 13], "texture": "#1"},
"down": {"uv": [3, 13, 4, 16], "texture": "#1"}
}
},
{
"name": "Body",
"from": [5.6, -1, 9.6],
"to": [10.4, 5, 12.4],
"rotation": {"angle": 45, "axis": "x", "origin": [7.975, 5.4, 10.925]},
"faces": {
"north": {"uv": [5, 5, 7, 8], "texture": "#1"},
"east": {"uv": [4, 5, 5, 8], "texture": "#1"},
"south": {"uv": [8, 5, 10, 8], "texture": "#1"},
"west": {"uv": [7, 5, 8, 8], "texture": "#1"},
"up": {"uv": [5, 5, 7, 4], "texture": "#1"},
"down": {"uv": [7, 5, 9, 4], "texture": "#1"}
}
},
{
"name": "Body Layer",
"from": [5.5, -1.1, 9.5],
"to": [10.5, 5.1, 12.5],
"rotation": {"angle": 45, "axis": "x", "origin": [7.975, 5.4, 10.925]},
"faces": {
"north": {"uv": [5, 9, 7, 12], "texture": "#1"},
"east": {"uv": [4, 9, 5, 12], "texture": "#1"},
"south": {"uv": [8, 9, 10, 12], "texture": "#1"},
"west": {"uv": [7, 9, 8, 12], "texture": "#1"},
"up": {"uv": [5, 9, 7, 8], "texture": "#1"},
"down": {"uv": [7, 9, 9, 8], "texture": "#1"}
}
}
],
"display": {
"thirdperson_righthand": {
"rotation": [60, 0, 0],
"translation": [0.25, 4.25, 1.25],
"scale": [0.7, 0.7, 0.7]
},
"thirdperson_lefthand": {
"rotation": [60, 0, 0],
"translation": [0.25, 4.25, 1.25],
"scale": [0.7, 0.7, 0.7]
},
"firstperson_righthand": {
"rotation": [0, 120, 0],
"translation": [0, 3.75, 0],
"scale": [0.5, 0.5, 0.5]
},
"firstperson_lefthand": {
"rotation": [0, 123, 0],
"translation": [0, 3.75, 0],
"scale": [0.5, 0.5, 0.5]
},
"ground": {
"translation": [0, 2, 0],
"scale": [0.5, 0.5, 0.5]
},
"gui": {
"rotation": [15, 150, 0],
"translation": [-0.25, 0.25, 0],
"scale": [0.9, 0.9, 0.9]
},
"head": {
"translation": [12.75, 1.5, 0]
},
"fixed": {
"translation": [0, 0, -3.5]
}
}
}
@@ -0,0 +1,217 @@
{
"format_version": "1.9.0",
"credit": "Made with _leng",
"render_type": "cutout",
"textures": {
"1": "thaumicenergistics:block/alkusure86fumo",
"particle": "thaumicenergistics:block/alkusure86fumo"
},
"elements": [
{
"name": "Head",
"from": [4.35, 4.69613, 8.33113],
"to": [11.65, 11.99613, 15.63113],
"rotation": {"angle": 22.5, "axis": "x", "origin": [7.975, 8.42113, 11.90613]},
"faces": {
"north": {"uv": [2, 2, 4, 4], "texture": "#1"},
"east": {"uv": [0, 2, 2, 4], "texture": "#1"},
"south": {"uv": [6, 2, 8, 4], "texture": "#1"},
"west": {"uv": [4, 2, 6, 4], "texture": "#1"},
"up": {"uv": [4, 2, 2, 0], "texture": "#1"},
"down": {"uv": [4, 0, 6, 2], "texture": "#1"}
}
},
{
"name": "Hat Layer",
"from": [4.1, 4.69613, 7.98113],
"to": [11.8, 12.29613, 15.68113],
"rotation": {"angle": 22.5, "axis": "x", "origin": [7.975, 8.42113, 11.90613]},
"faces": {
"north": {"uv": [10, 2, 12, 4], "texture": "#1"},
"east": {"uv": [8, 2, 10, 4], "texture": "#1"},
"south": {"uv": [14, 2, 16, 4], "texture": "#1"},
"west": {"uv": [12, 2, 14, 4], "texture": "#1"},
"up": {"uv": [12, 2, 10, 0], "texture": "#1"},
"down": {"uv": [12, 0, 14, 2], "texture": "#1"}
}
},
{
"name": "Left Arm",
"from": [3.89, -0.36401, 9.01167],
"to": [5.39, 5.63599, 11.01167],
"rotation": {"angle": -22.5, "axis": "z", "origin": [4.6527, 2.63599, 10.01167]},
"faces": {
"north": {"uv": [9, 13, 9.75, 16], "texture": "#1"},
"east": {"uv": [8, 13, 9, 16], "texture": "#1"},
"south": {"uv": [10.75, 13, 11.5, 16], "texture": "#1"},
"west": {"uv": [9.75, 13, 10.5, 16], "texture": "#1"},
"up": {"uv": [9, 12, 9.75, 13], "texture": "#1"},
"down": {"uv": [10.5, 12, 9.75, 13], "texture": "#1"}
}
},
{
"name": "Left Arm Layer",
"from": [3.8154, -0.46401, 8.91167],
"to": [5.5154, 5.73599, 11.11167],
"rotation": {"angle": -22.5, "axis": "z", "origin": [4.6527, 2.63599, 10.01167]},
"faces": {
"north": {"uv": [13, 13, 13.75, 16], "texture": "#1"},
"east": {"uv": [12, 13, 13, 16], "texture": "#1"},
"south": {"uv": [14.5, 13, 15.25, 16], "texture": "#1"},
"west": {"uv": [13.75, 13, 14.5, 16], "texture": "#1"},
"up": {"uv": [13, 12, 13.75, 13], "texture": "#1"},
"down": {"uv": [13.75, 12, 14.5, 13], "texture": "#1"}
}
},
{
"name": "RightArm",
"from": [10.48, -0.44754, 8.979],
"to": [11.98, 5.55246, 10.979],
"rotation": {"angle": 22.5, "axis": "z", "origin": [11.13663, 2.55246, 9.979]},
"faces": {
"north": {"uv": [11, 5, 11.75, 8], "texture": "#1"},
"east": {"uv": [10, 5, 11, 8], "texture": "#1"},
"south": {"uv": [12.75, 5, 13.5, 8], "texture": "#1"},
"west": {"uv": [11.75, 5, 12.5, 8], "texture": "#1"},
"up": {"uv": [11, 4, 11.75, 5], "texture": "#1"},
"down": {"uv": [12.5, 4, 11.75, 5], "texture": "#1"}
}
},
{
"name": "Right Arm Layer",
"from": [10.36163, -0.54754, 8.879],
"to": [12.06163, 5.65246, 11.079],
"rotation": {"angle": 22.5, "axis": "z", "origin": [11.16163, 2.55246, 9.979]},
"faces": {
"north": {"uv": [11, 9, 11.75, 12], "texture": "#1"},
"east": {"uv": [10, 9, 11, 12], "texture": "#1"},
"south": {"uv": [12.75, 9, 13.5, 12], "texture": "#1"},
"west": {"uv": [11.75, 9, 12.5, 12], "texture": "#1"},
"up": {"uv": [11, 8, 11.75, 9], "texture": "#1"},
"down": {"uv": [12.5, 8, 11.75, 9], "texture": "#1"}
}
},
{
"name": "Left Leg",
"from": [7.77, -0.02, -0.23],
"to": [10.23, 2.44, 6.23],
"rotation": {"angle": -22.5, "axis": "y", "origin": [8, 0.31, 7]},
"faces": {
"north": {"uv": [2, 4, 3, 5], "texture": "#1"},
"east": {"uv": [0, 8, 1, 5], "rotation": 90, "texture": "#1"},
"south": {"uv": [1, 4, 2, 5], "texture": "#1"},
"west": {"uv": [2, 5, 3, 8], "rotation": 90, "texture": "#1"},
"up": {"uv": [2, 8, 1, 5], "texture": "#1"},
"down": {"uv": [3, 5, 4, 8], "texture": "#1"}
}
},
{
"name": "Left Leg Layer",
"from": [7.67, -0.12, -0.33],
"to": [10.33, 2.54, 6.33],
"rotation": {"angle": -22.5, "axis": "y", "origin": [8, 0.31, 7]},
"faces": {
"north": {"uv": [2, 8, 3, 9], "texture": "#1"},
"east": {"uv": [0, 12, 1, 9], "rotation": 90, "texture": "#1"},
"south": {"uv": [1, 8, 2, 9], "texture": "#1"},
"west": {"uv": [2, 9, 3, 12], "rotation": 90, "texture": "#1"},
"up": {"uv": [2, 12, 1, 9], "texture": "#1"},
"down": {"uv": [3, 9, 4, 12], "texture": "#1"}
}
},
{
"name": "Right Leg",
"from": [5.77, -0.02, -0.23],
"to": [8.23, 2.44, 6.23],
"rotation": {"angle": 22.5, "axis": "y", "origin": [8, 0.31, 7]},
"faces": {
"north": {"uv": [6, 12, 7, 13], "texture": "#1"},
"east": {"uv": [4, 16, 5, 13], "rotation": 90, "texture": "#1"},
"south": {"uv": [5, 12, 6, 13], "texture": "#1"},
"west": {"uv": [6, 13, 7, 16], "rotation": 90, "texture": "#1"},
"up": {"uv": [6, 16, 5, 13], "texture": "#1"},
"down": {"uv": [7, 13, 8, 16], "texture": "#1"}
}
},
{
"name": "Right Leg Layer",
"from": [5.67, -0.12, -0.33],
"to": [8.33, 2.54, 6.33],
"rotation": {"angle": 22.5, "axis": "y", "origin": [8, 0.31, 7]},
"faces": {
"north": {"uv": [2, 12, 3, 13], "texture": "#1"},
"east": {"uv": [0, 16, 1, 13], "rotation": 90, "texture": "#1"},
"south": {"uv": [1, 12, 2, 13], "texture": "#1"},
"west": {"uv": [2, 13, 3, 16], "rotation": 90, "texture": "#1"},
"up": {"uv": [2, 16, 1, 13], "texture": "#1"},
"down": {"uv": [3, 13, 4, 16], "texture": "#1"}
}
},
{
"name": "Body",
"from": [5.6, -0.79, 9.6],
"to": [10.4, 5.21, 12.4],
"rotation": {"angle": 45, "axis": "x", "origin": [7.975, 5.61, 10.925]},
"faces": {
"north": {"uv": [5, 5, 7, 8], "texture": "#1"},
"east": {"uv": [4, 5, 5, 8], "texture": "#1"},
"south": {"uv": [8, 5, 10, 8], "texture": "#1"},
"west": {"uv": [7, 5, 8, 8], "texture": "#1"},
"up": {"uv": [5, 5, 7, 4], "texture": "#1"},
"down": {"uv": [7, 5, 9, 4], "texture": "#1"}
}
},
{
"name": "Body Layer",
"from": [5.5, -0.89, 9.5],
"to": [10.5, 5.31, 12.5],
"rotation": {"angle": 45, "axis": "x", "origin": [7.975, 5.61, 10.925]},
"faces": {
"north": {"uv": [5, 9, 7, 12], "texture": "#1"},
"east": {"uv": [4, 9, 5, 12], "texture": "#1"},
"south": {"uv": [8, 9, 10, 12], "texture": "#1"},
"west": {"uv": [7, 9, 8, 12], "texture": "#1"},
"up": {"uv": [5, 9, 7, 8], "texture": "#1"},
"down": {"uv": [7, 9, 9, 8], "texture": "#1"}
}
}
],
"display": {
"thirdperson_righthand": {
"rotation": [37.5, 0, 0],
"translation": [0.25, 3, 3],
"scale": [0.5, 0.5, 0.5]
},
"thirdperson_lefthand": {
"rotation": [42.75, 0, 0],
"translation": [0.25, 2.75, 3.5],
"scale": [0.5, 0.5, 0.5]
},
"firstperson_righthand": {
"rotation": [0, 120, 0],
"translation": [0, 3.75, 0],
"scale": [0.5, 0.5, 0.5]
},
"firstperson_lefthand": {
"rotation": [0, 123, 0],
"translation": [0, 3.75, 0],
"scale": [0.5, 0.5, 0.5]
},
"ground": {
"translation": [0, 2, 0],
"scale": [0.5, 0.5, 0.5]
},
"gui": {
"rotation": [15, 150, 0],
"translation": [0, 1.75, 0],
"scale": [0.95, 0.95, 0.95]
},
"head": {
"translation": [12.75, 1.5, 0]
},
"fixed": {
"rotation": [-21.5, 0, 0],
"translation": [0, 0, -3.5]
}
}
}
@@ -0,0 +1,127 @@
{
"format_version": "1.21.6",
"credit": "Made with Blockbench",
"parent": "block/block",
"render_type": "cutout",
"texture_size": [64, 64],
"textures": {
"particle": "ae2:block/generics/back",
"model": "thaumicenergistics:block/infusion_monitor"
},
"elements": [
{
"from": [6.05, 8.99925, 3.0925],
"to": [9.95, 10.44225, 12.9075],
"faces": {
"north": {"uv": [7.5, 8.75, 8.5, 9.25], "texture": "#model"},
"east": {"uv": [8.5, 6, 11, 6.5], "texture": "#model"},
"south": {"uv": [7.5, 8.75, 8.5, 9.25], "texture": "#model"},
"west": {"uv": [8.5, 6, 11, 6.5], "texture": "#model"},
"up": {"uv": [2.5, 10.5, 1.5, 8], "texture": "#model"},
"down": {"uv": [3.5, 8, 2.5, 10.5], "texture": "#model"}
}
},
{
"from": [9.55658, 9.18425, 3.125],
"to": [15.40658, 9.83425, 12.875],
"rotation": {"angle": 22.5, "axis": "z", "origin": [10.20658, 10.08299, 6.375]},
"faces": {
"north": {"uv": [7.5, 8.5, 9, 8.75], "texture": "#model"},
"east": {"uv": [7, 6, 7.25, 8.5], "rotation": 270, "texture": "#model"},
"south": {"uv": [9, 8.5, 7.5, 8.75], "texture": "#model"},
"west": {"uv": [8.5, 6.5, 11, 6.75], "texture": "#model"},
"up": {"uv": [8.5, 8.5, 7, 6], "texture": "#model"},
"down": {"uv": [1.5, 8, 0, 10.5], "texture": "#model"}
}
},
{
"from": [8.44801, 9.34995, 3.775],
"to": [14.29801, 10.64995, 12.225],
"rotation": {"angle": 22.5, "axis": "z", "origin": [9.09801, 9.34995, 6.3425]},
"faces": {
"north": {"uv": [8.5, 7.75, 10, 8], "texture": "#model"},
"east": {"uv": [8.5, 7.75, 10, 8], "texture": "#model"},
"south": {"uv": [8.5, 7.75, 10, 8], "texture": "#model"},
"west": {"uv": [8.5, 7, 10.5, 7.25], "texture": "#model"},
"up": {"uv": [9.5, 2.75, 8, 0.75], "texture": "#model"}
}
},
{
"from": [7.142, 12.36275, 3.775],
"to": [12.992, 12.36275, 12.225],
"rotation": {"angle": 45, "axis": "z", "origin": [10.067, 12.36275, 8]},
"faces": {
"up": {"uv": [9.5, 0.75, 8, 2.75], "texture": "#model"},
"down": {"uv": [9.5, 0.75, 8, 2.75], "texture": "#model"}
}
},
{
"from": [3.008, 12.36925, 3.775],
"to": [8.858, 12.36925, 12.225],
"rotation": {"angle": -45, "axis": "z", "origin": [5.933, 12.36925, 8]},
"faces": {
"up": {"uv": [8, 0.75, 9.5, 2.75], "texture": "#model"},
"down": {"uv": [8, 0.75, 9.5, 2.75], "texture": "#model"}
}
},
{
"from": [2.04834, 11.09116, 3.775],
"to": [7.89834, 12.39116, 12.225],
"rotation": {"angle": -22.5, "axis": "z", "origin": [2.69834, 11.09116, 6.3425]},
"faces": {
"north": {"uv": [8.5, 7.75, 10, 8], "texture": "#model"},
"east": {"uv": [8.5, 7.25, 10.5, 7.5], "texture": "#model"},
"south": {"uv": [8.5, 7.75, 10, 8], "texture": "#model"},
"west": {"uv": [8.5, 7.75, 10, 8], "texture": "#model"},
"up": {"uv": [8, 0.75, 9.5, 2.75], "texture": "#model"}
}
},
{
"from": [0.54702, 10.09853, 3.125],
"to": [6.39702, 10.74853, 12.875],
"rotation": {"angle": -22.5, "axis": "z", "origin": [3.47202, 10.42353, 8]},
"faces": {
"north": {"uv": [9, 8.5, 7.5, 8.75], "texture": "#model"},
"east": {"uv": [8.5, 6.75, 11, 7], "texture": "#model"},
"south": {"uv": [8.5, 7.5, 10, 7.75], "texture": "#model"},
"west": {"uv": [7.25, 8.5, 7, 6], "rotation": 270, "texture": "#model"},
"up": {"uv": [7, 8.5, 8.5, 6], "texture": "#model"},
"down": {"uv": [0, 8, 1.5, 10.5], "texture": "#model"}
}
}
],
"display": {
"thirdperson_righthand": {
"rotation": [75, 45, 0],
"translation": [0, 2.5, 0],
"scale": [0.375, 0.375, 0.375]
},
"thirdperson_lefthand": {
"rotation": [75, 45, 0],
"translation": [0, 2.5, 0],
"scale": [0.375, 0.375, 0.375]
},
"firstperson_righthand": {
"rotation": [0, 45, 0],
"scale": [0.4, 0.4, 0.4]
},
"firstperson_lefthand": {
"rotation": [0, -135, 0],
"scale": [0.4, 0.4, 0.4]
},
"ground": {
"translation": [0, 3, 0],
"scale": [0.25, 0.25, 0.25]
},
"gui": {
"rotation": [30, -135, 0],
"scale": [0.625, 0.625, 0.625]
},
"head": {
"translation": [0, 14.25, 0]
},
"fixed": {
"scale": [0.5, 0.5, 0.5]
}
}
}
@@ -0,0 +1,246 @@
{
"format_version": "1.21.6",
"credit": "Made with Blockbench",
"parent": "block/block",
"render_type": "cutout",
"texture_size": [64, 64],
"textures": {
"particle": "ae2:block/generics/back",
"model": "thaumicenergistics:block/infusion_monitor"
},
"elements": [
{
"name": "base1",
"from": [2, 0, 2],
"to": [14, 8, 14],
"faces": {
"north": {"uv": [7, 4, 10, 6], "texture": "#model"},
"east": {"uv": [7, 4, 10, 6], "texture": "#model"},
"south": {"uv": [7, 4, 10, 6], "texture": "#model"},
"west": {"uv": [7, 4, 10, 6], "texture": "#model"},
"up": {"uv": [7, 7, 4, 4], "texture": "#model"},
"down": {"uv": [7, 7, 4, 10], "texture": "#model", "cullface": "south"}
}
},
{
"name": "base2",
"from": [0, 1, 0],
"to": [16, 4, 16],
"faces": {
"north": {"uv": [8, 0, 12, 0.75], "texture": "#model"},
"east": {"uv": [8, 0, 12, 0.75], "texture": "#model"},
"south": {"uv": [8, 0, 12, 0.75], "texture": "#model"},
"west": {"uv": [8, 0, 12, 0.75], "texture": "#model"},
"up": {"uv": [4, 4, 0, 0], "texture": "#model"},
"down": {"uv": [4, 4, 0, 8], "texture": "#model"}
}
},
{
"name": "base_light_side",
"from": [-0.001, 0.999, 6.999],
"to": [0.001, 3.001, 9.001],
"faces": {
"east": {"uv": [8.5, 8, 9, 8.5], "texture": "#model"},
"west": {"uv": [9, 8.5, 8.5, 8], "texture": "#model"}
}
},
{
"name": "base_light_side",
"from": [6.999, 0.999, -0.001],
"to": [9.001, 3.001, 0.001],
"faces": {
"north": {"uv": [9, 8.5, 8.5, 8], "texture": "#model"},
"south": {"uv": [8.5, 8.5, 9, 8], "texture": "#model"}
}
},
{
"name": "base_light_side",
"from": [15.999, 0.999, 6.999],
"to": [16.001, 3.001, 9.001],
"faces": {
"east": {"uv": [9, 8.5, 8.5, 8], "texture": "#model"},
"west": {"uv": [8.5, 8.5, 9, 8], "texture": "#model"}
}
},
{
"name": "base_light_side",
"from": [6.999, 0.999, 15.999],
"to": [9.001, 3.001, 16.001],
"faces": {
"north": {"uv": [8.5, 8.5, 9, 8], "texture": "#model"},
"south": {"uv": [9, 8.5, 8.5, 8], "texture": "#model"}
}
},
{
"name": "base_light_bottom",
"from": [0, 1, 0],
"to": [16, 1, 16],
"faces": {
"up": {"uv": [8, 4, 4, 0], "texture": "#model"},
"down": {"uv": [8, 0, 4, 4], "texture": "#model"}
}
},
{
"name": "base_side",
"from": [2.31462, 1.37727, 4],
"to": [4.31462, 5.37727, 12],
"rotation": {"angle": -22.5, "axis": "z", "origin": [8, 7.25, 8]},
"faces": {
"north": {"uv": [7, 8.5, 7.5, 9.5], "texture": "#model"},
"south": {"uv": [7.5, 8.5, 7, 9.5], "texture": "#model"},
"west": {"uv": [9.5, 0.75, 11.5, 1.75], "texture": "#model"}
}
},
{
"name": "base_side",
"from": [11.68538, 1.37727, 4],
"to": [13.68538, 5.37727, 12],
"rotation": {"angle": 22.5, "axis": "z", "origin": [8, 7.25, 8]},
"faces": {
"north": {"uv": [7.5, 8.5, 7, 9.5], "texture": "#model"},
"east": {"uv": [11.5, 0.75, 9.5, 1.75], "texture": "#model"},
"south": {"uv": [7, 8.5, 7.5, 9.5], "texture": "#model"}
}
},
{
"name": "base_side",
"from": [4, 1.39257, 2.31158],
"to": [12, 5.39257, 4.31158],
"rotation": {"angle": 22.5, "axis": "x", "origin": [8, 7.25, 8]},
"faces": {
"north": {"uv": [9.5, 0.75, 11.5, 1.75], "texture": "#model"},
"east": {"uv": [7, 8.5, 7.5, 9.5], "texture": "#model"},
"west": {"uv": [7.5, 8.5, 7, 9.5], "texture": "#model"}
}
},
{
"name": "base_side",
"from": [4, 1.37727, 11.68538],
"to": [12, 5.37727, 13.68538],
"rotation": {"angle": -22.5, "axis": "x", "origin": [8, 7.25, 8]},
"faces": {
"east": {"uv": [7.5, 8.5, 7, 9.5], "texture": "#model"},
"south": {"uv": [9.5, 0.75, 11.5, 1.75], "texture": "#model"},
"west": {"uv": [7, 8.5, 7.5, 9.5], "texture": "#model"}
}
},
{
"from": [3, 8, 3],
"to": [4, 9, 5],
"faces": {
"north": {"uv": [3.5, 9, 3.75, 9.25], "texture": "#model"},
"east": {"uv": [3.5, 9, 3.75, 9.25], "texture": "#model"},
"south": {"uv": [3.5, 9, 3.75, 9.25], "texture": "#model"},
"west": {"uv": [3.5, 9, 3.75, 9.25], "texture": "#model"},
"up": {"uv": [3.75, 9.25, 3.5, 9], "texture": "#model"}
}
},
{
"from": [11, 8, 12],
"to": [12, 9, 13],
"faces": {
"north": {"uv": [3.5, 9, 3.75, 9.25], "texture": "#model"},
"south": {"uv": [3.5, 9, 3.75, 9.25], "texture": "#model"},
"west": {"uv": [3.5, 9, 3.75, 9.25], "texture": "#model"},
"up": {"uv": [3.75, 9.25, 3.5, 9], "texture": "#model"}
}
},
{
"from": [12, 8, 11],
"to": [13, 9, 13],
"faces": {
"north": {"uv": [3.5, 9, 3.75, 9.25], "texture": "#model"},
"east": {"uv": [3.5, 9, 3.75, 9.25], "texture": "#model"},
"south": {"uv": [3.5, 9, 3.75, 9.25], "texture": "#model"},
"west": {"uv": [3.5, 9, 3.75, 9.25], "texture": "#model"},
"up": {"uv": [3.75, 9.25, 3.5, 9], "texture": "#model"}
}
},
{
"from": [4, 8, 12],
"to": [5, 9, 13],
"faces": {
"north": {"uv": [3.5, 9, 3.75, 9.25], "texture": "#model"},
"east": {"uv": [3.5, 9, 3.75, 9.25], "texture": "#model"},
"south": {"uv": [3.5, 9, 3.75, 9.25], "texture": "#model"},
"up": {"uv": [3.75, 9.25, 3.5, 9], "texture": "#model"}
}
},
{
"from": [3, 8, 11],
"to": [4, 9, 13],
"faces": {
"north": {"uv": [3.5, 9, 3.75, 9.25], "texture": "#model"},
"east": {"uv": [3.5, 9, 3.75, 9.25], "texture": "#model"},
"south": {"uv": [3.5, 9, 3.75, 9.25], "texture": "#model"},
"west": {"uv": [3.5, 9, 3.75, 9.25], "texture": "#model"},
"up": {"uv": [3.75, 9.25, 3.5, 9], "texture": "#model"}
}
},
{
"from": [4, 8, 3],
"to": [5, 9, 4],
"faces": {
"north": {"uv": [3.5, 9, 3.75, 9.25], "texture": "#model"},
"east": {"uv": [3.5, 9, 3.75, 9.25], "texture": "#model"},
"south": {"uv": [3.5, 9, 3.75, 9.25], "texture": "#model"},
"up": {"uv": [3.75, 9.25, 3.5, 9], "texture": "#model"}
}
},
{
"from": [12, 8, 3],
"to": [13, 9, 5],
"faces": {
"north": {"uv": [3.5, 9, 3.75, 9.25], "texture": "#model"},
"east": {"uv": [3.5, 9, 3.75, 9.25], "texture": "#model"},
"south": {"uv": [3.5, 9, 3.75, 9.25], "texture": "#model"},
"west": {"uv": [3.5, 9, 3.75, 9.25], "texture": "#model"},
"up": {"uv": [3.75, 9.25, 3.5, 9], "texture": "#model"}
}
},
{
"from": [11, 8, 3],
"to": [12, 9, 4],
"faces": {
"north": {"uv": [3.5, 9, 3.75, 9.25], "texture": "#model"},
"south": {"uv": [3.5, 9, 3.75, 9.25], "texture": "#model"},
"west": {"uv": [3.5, 9, 3.75, 9.25], "texture": "#model"},
"up": {"uv": [3.75, 9.25, 3.5, 9], "texture": "#model"}
}
}
],
"display": {
"thirdperson_righthand": {
"rotation": [75, 45, 0],
"translation": [0, 2.5, 0],
"scale": [0.375, 0.375, 0.375]
},
"thirdperson_lefthand": {
"rotation": [75, 45, 0],
"translation": [0, 2.5, 0],
"scale": [0.375, 0.375, 0.375]
},
"firstperson_righthand": {
"rotation": [0, 45, 0],
"scale": [0.4, 0.4, 0.4]
},
"firstperson_lefthand": {
"rotation": [0, -135, 0],
"scale": [0.4, 0.4, 0.4]
},
"ground": {
"translation": [0, 3, 0],
"scale": [0.25, 0.25, 0.25]
},
"gui": {
"rotation": [30, -135, 0],
"scale": [0.625, 0.625, 0.625]
},
"head": {
"translation": [0, 14.25, 0]
},
"fixed": {
"scale": [0.5, 0.5, 0.5]
}
}
}
@@ -0,0 +1,143 @@
{
"format_version": "1.21.6",
"credit": "Made with Blockbench",
"parent": "block/block",
"render_type": "translucent",
"texture_size": [64, 64],
"textures": {
"particle": "ae2:block/generics/back",
"lights": "ae2:block/molecular_assembler_lights"
},
"elements": [
{
"name": "cube_outline",
"from": [10.05, 10.54225, 13.0075],
"to": [5.95, 8.89925, 2.9925],
"faces": {
"north": {"uv": [2, 2, 3, 2.97], "rotation": 180, "texture": "#lights"},
"south": {"uv": [2, 13, 3, 14], "rotation": 180, "texture": "#lights"},
"up": {"uv": [3, 2.05, 2, 13.95], "rotation": 180, "texture": "#lights"}
}
},
{
"name": "cube_outline",
"from": [15.50658, 9.93425, 12.975],
"to": [9.45658, 9.08425, 3.025],
"rotation": {"angle": 22.5, "axis": "z", "origin": [10.20658, 10.08299, 6.375]},
"faces": {
"north": {"uv": [2, 2, 3, 13.95], "rotation": 180, "texture": "#lights"},
"south": {"uv": [3, 2, 2, 13.95], "rotation": 180, "texture": "#lights"},
"west": {"uv": [2.05, 14, 3, 2], "rotation": 180, "texture": "#lights"},
"up": {"uv": [2, 2, 3, 14], "rotation": 180, "texture": "#lights"},
"down": {"uv": [2, 14, 3, 2], "rotation": 180, "texture": "#lights"}
}
},
{
"name": "cube_outline",
"from": [6.49702, 10.84853, 12.975],
"to": [0.44702, 9.99853, 3.025],
"rotation": {"angle": -22.5, "axis": "z", "origin": [3.47202, 10.42353, 8]},
"faces": {
"north": {"uv": [3, 2.05, 2, 14], "rotation": 180, "texture": "#lights"},
"east": {"uv": [2.05, 2, 3, 14], "rotation": 180, "texture": "#lights"},
"south": {"uv": [2, 2, 3, 13.95], "rotation": 180, "texture": "#lights"},
"up": {"uv": [3, 2, 2, 14], "rotation": 180, "texture": "#lights"},
"down": {"uv": [3, 14, 2, 2], "rotation": 180, "texture": "#lights"}
}
},
{
"name": "cube_outline",
"from": [14.39801, 10.74995, 12.325],
"to": [8.34801, 9.24995, 3.675],
"rotation": {"angle": 22.5, "axis": "z", "origin": [9.09801, 9.34995, 6.3425]},
"faces": {
"north": {"uv": [2, 2, 3, 14], "rotation": 180, "texture": "#lights"},
"east": {"uv": [2, 2.05, 3, 14], "rotation": 180, "texture": "#lights"},
"south": {"uv": [2, 2, 3, 14], "rotation": 180, "texture": "#lights"},
"west": {"uv": [2, 2, 3, 14], "rotation": 180, "texture": "#lights"},
"down": {"uv": [2, 14, 3, 2], "rotation": 180, "texture": "#lights"}
}
},
{
"name": "cube_outline",
"from": [7.99834, 12.49116, 12.325],
"to": [1.94834, 10.99116, 3.675],
"rotation": {"angle": -22.5, "axis": "z", "origin": [2.69834, 11.09116, 6.3425]},
"faces": {
"north": {"uv": [2, 2, 14, 3], "rotation": 180, "texture": "#lights"},
"east": {"uv": [2, 2, 3, 14], "rotation": 180, "texture": "#lights"},
"south": {"uv": [2, 13, 14, 14], "rotation": 180, "texture": "#lights"},
"west": {"uv": [2, 2, 3, 13.95], "rotation": 180, "texture": "#lights"},
"up": {"uv": [2, 2, 3, 14], "rotation": 180, "texture": "#lights"},
"down": {"uv": [3, 14, 2, 2], "rotation": 180, "texture": "#lights"}
}
},
{
"name": "cube_outline",
"from": [13.092, 12.46275, 12.325],
"to": [7.042, 12.26275, 3.675],
"rotation": {"angle": 45, "axis": "z", "origin": [10.067, 12.36275, 8]},
"faces": {
"up": {"uv": [2, 2, 3, 14], "rotation": 180, "texture": "#lights"},
"down": {"uv": [2, 14, 3, 2], "rotation": 180, "texture": "#lights"}
}
},
{
"name": "cube_outline",
"from": [8.958, 12.46925, 12.325],
"to": [2.908, 12.26925, 3.675],
"rotation": {"angle": -45, "axis": "z", "origin": [5.933, 12.36925, 8]},
"faces": {
"up": {"uv": [3, 2, 2, 14], "rotation": 180, "texture": "#lights"},
"down": {"uv": [3, 14, 2, 2], "rotation": 180, "texture": "#lights"}
}
},
{
"name": "cube_outline_outline",
"from": [6.4, 7.9, 6.4],
"to": [9.6, 9.1, 9.6],
"faces": {
"north": {"uv": [2.1, 2.1, 2.85, 13.95], "rotation": 180, "texture": "#lights"},
"east": {"uv": [2.87, 2.03, 2.12, 13.98], "rotation": 180, "texture": "#lights"},
"south": {"uv": [2, 2.0025, 2.99, 13.9925], "rotation": 180, "texture": "#lights"},
"west": {"uv": [2.85, 2.1, 2.1, 13.95], "rotation": 180, "texture": "#lights"},
"up": {"uv": [2, 2, 3, 3], "rotation": 180, "texture": "#lights"},
"down": {"uv": [2, 2, 3, 3], "rotation": 180, "texture": "#lights"}
}
}
],
"display": {
"thirdperson_righthand": {
"rotation": [75, 45, 0],
"translation": [0, 2.5, 0],
"scale": [0.375, 0.375, 0.375]
},
"thirdperson_lefthand": {
"rotation": [75, 45, 0],
"translation": [0, 2.5, 0],
"scale": [0.375, 0.375, 0.375]
},
"firstperson_righthand": {
"rotation": [0, 45, 0],
"scale": [0.4, 0.4, 0.4]
},
"firstperson_lefthand": {
"rotation": [0, -135, 0],
"scale": [0.4, 0.4, 0.4]
},
"ground": {
"translation": [0, 3, 0],
"scale": [0.25, 0.25, 0.25]
},
"gui": {
"rotation": [30, -135, 0],
"scale": [0.625, 0.625, 0.625]
},
"head": {
"translation": [0, 14.25, 0]
},
"fixed": {
"scale": [0.5, 0.5, 0.5]
}
}
}
@@ -0,0 +1,3 @@
{
"parent": "thaumicenergistics:block/alkusure86fumo"
}
@@ -0,0 +1,326 @@
{
"format_version": "1.21.6",
"credit": "Made with Blockbench",
"parent": "block/block",
"render_type": "cutout",
"texture_size": [64, 64],
"textures": {
"particle": "ae2:block/generics/back",
"model": "thaumicenergistics:block/infusion_monitor"
},
"elements": [
{
"name": "base1",
"from": [2, 0, 2],
"to": [14, 8, 14],
"faces": {
"north": {"uv": [7, 4, 10, 6], "texture": "#model"},
"east": {"uv": [7, 4, 10, 6], "texture": "#model"},
"south": {"uv": [7, 4, 10, 6], "texture": "#model"},
"west": {"uv": [7, 4, 10, 6], "texture": "#model"},
"up": {"uv": [7, 7, 4, 4], "texture": "#model"},
"down": {"uv": [7, 7, 4, 10], "texture": "#model", "cullface": "south"}
}
},
{
"name": "base2",
"from": [0, 1, 0],
"to": [16, 4, 16],
"faces": {
"north": {"uv": [8, 0, 12, 0.75], "texture": "#model"},
"east": {"uv": [8, 0, 12, 0.75], "texture": "#model"},
"south": {"uv": [8, 0, 12, 0.75], "texture": "#model"},
"west": {"uv": [8, 0, 12, 0.75], "texture": "#model"},
"up": {"uv": [4, 4, 0, 0], "texture": "#model"},
"down": {"uv": [4, 4, 0, 8], "texture": "#model"}
}
},
{
"name": "base_light_side",
"from": [-0.001, 0.999, 6.999],
"to": [0.001, 3.001, 9.001],
"faces": {
"east": {"uv": [8.5, 8, 9, 8.5], "texture": "#model"},
"west": {"uv": [9, 8.5, 8.5, 8], "texture": "#model"}
}
},
{
"name": "base_light_side",
"from": [6.999, 0.999, -0.001],
"to": [9.001, 3.001, 0.001],
"faces": {
"north": {"uv": [9, 8.5, 8.5, 8], "texture": "#model"},
"south": {"uv": [8.5, 8.5, 9, 8], "texture": "#model"}
}
},
{
"name": "base_light_side",
"from": [15.999, 0.999, 6.999],
"to": [16.001, 3.001, 9.001],
"faces": {
"east": {"uv": [9, 8.5, 8.5, 8], "texture": "#model"},
"west": {"uv": [8.5, 8.5, 9, 8], "texture": "#model"}
}
},
{
"name": "base_light_side",
"from": [6.999, 0.999, 15.999],
"to": [9.001, 3.001, 16.001],
"faces": {
"north": {"uv": [8.5, 8.5, 9, 8], "texture": "#model"},
"south": {"uv": [9, 8.5, 8.5, 8], "texture": "#model"}
}
},
{
"name": "base_light_bottom",
"from": [0, 1, 0],
"to": [16, 1, 16],
"faces": {
"up": {"uv": [8, 4, 4, 0], "texture": "#model"},
"down": {"uv": [8, 0, 4, 4], "texture": "#model"}
}
},
{
"name": "base_side",
"from": [2.31462, 1.37727, 4],
"to": [4.31462, 5.37727, 12],
"rotation": {"angle": -22.5, "axis": "z", "origin": [8, 7.25, 8]},
"faces": {
"north": {"uv": [7, 8.5, 7.5, 9.5], "texture": "#model"},
"south": {"uv": [7.5, 8.5, 7, 9.5], "texture": "#model"},
"west": {"uv": [9.5, 0.75, 11.5, 1.75], "texture": "#model"}
}
},
{
"name": "base_side",
"from": [11.68538, 1.37727, 4],
"to": [13.68538, 5.37727, 12],
"rotation": {"angle": 22.5, "axis": "z", "origin": [8, 7.25, 8]},
"faces": {
"north": {"uv": [7.5, 8.5, 7, 9.5], "texture": "#model"},
"east": {"uv": [11.5, 0.75, 9.5, 1.75], "texture": "#model"},
"south": {"uv": [7, 8.5, 7.5, 9.5], "texture": "#model"}
}
},
{
"name": "base_side",
"from": [4, 1.39257, 2.31158],
"to": [12, 5.39257, 4.31158],
"rotation": {"angle": 22.5, "axis": "x", "origin": [8, 7.25, 8]},
"faces": {
"north": {"uv": [9.5, 0.75, 11.5, 1.75], "texture": "#model"},
"east": {"uv": [7, 8.5, 7.5, 9.5], "texture": "#model"},
"west": {"uv": [7.5, 8.5, 7, 9.5], "texture": "#model"}
}
},
{
"name": "base_side",
"from": [4, 1.37727, 11.68538],
"to": [12, 5.37727, 13.68538],
"rotation": {"angle": -22.5, "axis": "x", "origin": [8, 7.25, 8]},
"faces": {
"east": {"uv": [7.5, 8.5, 7, 9.5], "texture": "#model"},
"south": {"uv": [9.5, 0.75, 11.5, 1.75], "texture": "#model"},
"west": {"uv": [7, 8.5, 7.5, 9.5], "texture": "#model"}
}
},
{
"from": [3, 8, 3],
"to": [4, 9, 5],
"faces": {
"north": {"uv": [3.5, 9, 3.75, 9.25], "texture": "#model"},
"east": {"uv": [3.5, 9, 3.75, 9.25], "texture": "#model"},
"south": {"uv": [3.5, 9, 3.75, 9.25], "texture": "#model"},
"west": {"uv": [3.5, 9, 3.75, 9.25], "texture": "#model"},
"up": {"uv": [3.75, 9.25, 3.5, 9], "texture": "#model"}
}
},
{
"from": [11, 8, 12],
"to": [12, 9, 13],
"faces": {
"north": {"uv": [3.5, 9, 3.75, 9.25], "texture": "#model"},
"south": {"uv": [3.5, 9, 3.75, 9.25], "texture": "#model"},
"west": {"uv": [3.5, 9, 3.75, 9.25], "texture": "#model"},
"up": {"uv": [3.75, 9.25, 3.5, 9], "texture": "#model"}
}
},
{
"from": [12, 8, 11],
"to": [13, 9, 13],
"faces": {
"north": {"uv": [3.5, 9, 3.75, 9.25], "texture": "#model"},
"east": {"uv": [3.5, 9, 3.75, 9.25], "texture": "#model"},
"south": {"uv": [3.5, 9, 3.75, 9.25], "texture": "#model"},
"west": {"uv": [3.5, 9, 3.75, 9.25], "texture": "#model"},
"up": {"uv": [3.75, 9.25, 3.5, 9], "texture": "#model"}
}
},
{
"from": [4, 8, 12],
"to": [5, 9, 13],
"faces": {
"north": {"uv": [3.5, 9, 3.75, 9.25], "texture": "#model"},
"east": {"uv": [3.5, 9, 3.75, 9.25], "texture": "#model"},
"south": {"uv": [3.5, 9, 3.75, 9.25], "texture": "#model"},
"up": {"uv": [3.75, 9.25, 3.5, 9], "texture": "#model"}
}
},
{
"from": [3, 8, 11],
"to": [4, 9, 13],
"faces": {
"north": {"uv": [3.5, 9, 3.75, 9.25], "texture": "#model"},
"east": {"uv": [3.5, 9, 3.75, 9.25], "texture": "#model"},
"south": {"uv": [3.5, 9, 3.75, 9.25], "texture": "#model"},
"west": {"uv": [3.5, 9, 3.75, 9.25], "texture": "#model"},
"up": {"uv": [3.75, 9.25, 3.5, 9], "texture": "#model"}
}
},
{
"from": [4, 8, 3],
"to": [5, 9, 4],
"faces": {
"north": {"uv": [3.5, 9, 3.75, 9.25], "texture": "#model"},
"east": {"uv": [3.5, 9, 3.75, 9.25], "texture": "#model"},
"south": {"uv": [3.5, 9, 3.75, 9.25], "texture": "#model"},
"up": {"uv": [3.75, 9.25, 3.5, 9], "texture": "#model"}
}
},
{
"from": [12, 8, 3],
"to": [13, 9, 5],
"faces": {
"north": {"uv": [3.5, 9, 3.75, 9.25], "texture": "#model"},
"east": {"uv": [3.5, 9, 3.75, 9.25], "texture": "#model"},
"south": {"uv": [3.5, 9, 3.75, 9.25], "texture": "#model"},
"west": {"uv": [3.5, 9, 3.75, 9.25], "texture": "#model"},
"up": {"uv": [3.75, 9.25, 3.5, 9], "texture": "#model"}
}
},
{
"from": [11, 8, 3],
"to": [12, 9, 4],
"faces": {
"north": {"uv": [3.5, 9, 3.75, 9.25], "texture": "#model"},
"south": {"uv": [3.5, 9, 3.75, 9.25], "texture": "#model"},
"west": {"uv": [3.5, 9, 3.75, 9.25], "texture": "#model"},
"up": {"uv": [3.75, 9.25, 3.5, 9], "texture": "#model"}
}
},
{
"from": [6.05, 8.99925, 3.0925],
"to": [9.95, 10.44225, 12.9075],
"faces": {
"north": {"uv": [7.5, 8.75, 8.5, 9.25], "texture": "#model"},
"east": {"uv": [8.5, 6, 11, 6.5], "texture": "#model"},
"south": {"uv": [7.5, 8.75, 8.5, 9.25], "texture": "#model"},
"west": {"uv": [8.5, 6, 11, 6.5], "texture": "#model"},
"up": {"uv": [2.5, 10.5, 1.5, 8], "texture": "#model"},
"down": {"uv": [3.5, 8, 2.5, 10.5], "texture": "#model"}
}
},
{
"from": [9.55658, 9.18425, 3.125],
"to": [15.40658, 9.83425, 12.875],
"rotation": {"angle": 22.5, "axis": "z", "origin": [10.20658, 10.08299, 6.375]},
"faces": {
"north": {"uv": [7.5, 8.5, 9, 8.75], "texture": "#model"},
"east": {"uv": [7, 6, 7.25, 8.5], "rotation": 270, "texture": "#model"},
"south": {"uv": [9, 8.5, 7.5, 8.75], "texture": "#model"},
"west": {"uv": [8.5, 6.5, 11, 6.75], "texture": "#model"},
"up": {"uv": [8.5, 8.5, 7, 6], "texture": "#model"},
"down": {"uv": [1.5, 8, 0, 10.5], "texture": "#model"}
}
},
{
"from": [8.44801, 9.34995, 3.775],
"to": [14.29801, 10.64995, 12.225],
"rotation": {"angle": 22.5, "axis": "z", "origin": [9.09801, 9.34995, 6.3425]},
"faces": {
"north": {"uv": [8.5, 7.75, 10, 8], "texture": "#model"},
"east": {"uv": [8.5, 7.75, 10, 8], "texture": "#model"},
"south": {"uv": [8.5, 7.75, 10, 8], "texture": "#model"},
"west": {"uv": [8.5, 7, 10.5, 7.25], "texture": "#model"},
"up": {"uv": [9.5, 2.75, 8, 0.75], "texture": "#model"}
}
},
{
"from": [7.142, 12.36275, 3.775],
"to": [12.992, 12.36275, 12.225],
"rotation": {"angle": 45, "axis": "z", "origin": [10.067, 12.36275, 8]},
"faces": {
"up": {"uv": [9.5, 0.75, 8, 2.75], "texture": "#model"},
"down": {"uv": [9.5, 0.75, 8, 2.75], "texture": "#model"}
}
},
{
"from": [3.008, 12.36925, 3.775],
"to": [8.858, 12.36925, 12.225],
"rotation": {"angle": -45, "axis": "z", "origin": [5.933, 12.36925, 8]},
"faces": {
"up": {"uv": [8, 0.75, 9.5, 2.75], "texture": "#model"},
"down": {"uv": [8, 0.75, 9.5, 2.75], "texture": "#model"}
}
},
{
"from": [2.04834, 11.09116, 3.775],
"to": [7.89834, 12.39116, 12.225],
"rotation": {"angle": -22.5, "axis": "z", "origin": [2.69834, 11.09116, 6.3425]},
"faces": {
"north": {"uv": [8.5, 7.75, 10, 8], "texture": "#model"},
"east": {"uv": [8.5, 7.25, 10.5, 7.5], "texture": "#model"},
"south": {"uv": [8.5, 7.75, 10, 8], "texture": "#model"},
"west": {"uv": [8.5, 7.75, 10, 8], "texture": "#model"},
"up": {"uv": [8, 0.75, 9.5, 2.75], "texture": "#model"}
}
},
{
"from": [0.54702, 10.09853, 3.125],
"to": [6.39702, 10.74853, 12.875],
"rotation": {"angle": -22.5, "axis": "z", "origin": [3.47202, 10.42353, 8]},
"faces": {
"north": {"uv": [9, 8.5, 7.5, 8.75], "texture": "#model"},
"east": {"uv": [8.5, 6.75, 11, 7], "texture": "#model"},
"south": {"uv": [8.5, 7.5, 10, 7.75], "texture": "#model"},
"west": {"uv": [7.25, 8.5, 7, 6], "rotation": 270, "texture": "#model"},
"up": {"uv": [7, 8.5, 8.5, 6], "texture": "#model"},
"down": {"uv": [0, 8, 1.5, 10.5], "texture": "#model"}
}
}
],
"display": {
"thirdperson_righthand": {
"rotation": [75, 45, 0],
"translation": [0, 2.5, 0],
"scale": [0.375, 0.375, 0.375]
},
"thirdperson_lefthand": {
"rotation": [75, 45, 0],
"translation": [0, 2.5, 0],
"scale": [0.375, 0.375, 0.375]
},
"firstperson_righthand": {
"rotation": [0, 45, 0],
"scale": [0.4, 0.4, 0.4]
},
"firstperson_lefthand": {
"rotation": [0, -135, 0],
"scale": [0.4, 0.4, 0.4]
},
"ground": {
"translation": [0, 3, 0],
"scale": [0.25, 0.25, 0.25]
},
"gui": {
"rotation": [30, -135, 0],
"scale": [0.625, 0.625, 0.625]
},
"head": {
"translation": [0, 14.25, 0]
},
"fixed": {
"scale": [0.5, 0.5, 0.5]
}
}
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB