逃过一劫

This commit is contained in:
GaLi 2026-04-16 17:31:31 +08:00
parent 66a8feaaaf
commit 56a64b921c
41 changed files with 4125 additions and 115 deletions

View File

@ -47,7 +47,9 @@ public class ProviderSelectScreen extends Screen {
// 置顶的供应器名称集合静态变量持久化到配置文件
private static final Set<String> pinnedProviders = new HashSet<>();
private static final String PINNED_CONFIG_PATH = "extendedae_plus/pinned_providers.json";
private static final String AUTO_UPLOAD_UNIQUE_MATCH_KEY = "auto_upload_unique_match";
private static final Gson GSON = new GsonBuilder().setPrettyPrinting().disableHtmlEscaping().create();
private static boolean autoUploadUniqueMatchEnabled = true;
// 静态初始化块加载置顶配置
static {
@ -62,6 +64,7 @@ public class ProviderSelectScreen extends Screen {
private EditBox searchBox;
// 中文名输入框用于添加映射
private EditBox cnInput;
private Button autoUploadToggleButton;
private String query = "";
// 翻页按钮
private Button prevButton;
@ -168,37 +171,42 @@ public class ProviderSelectScreen extends Screen {
int totalWidth = btnWidth2 + btnGap + inputWidth + btnGap + btnWidth2 * 2 + btnGap + btnWidth2;
int startX = centerX - totalWidth / 2;
this.autoUploadToggleButton = Button.builder(buildAutoUploadToggleLabel(), b -> toggleAutoUploadUniqueMatch())
.bounds(startX + btnWidth2 + btnGap + inputWidth + btnGap + btnWidth2 + btnGap, navY + 30, btnWidth2 * 2 + btnGap, 20)
.build();
this.addRenderableWidget(this.autoUploadToggleButton);
// 重载映射按钮
Button reload = Button.builder(Component.translatable("extendedae_plus.screen.reload_mapping"), b -> reloadMapping())
.bounds(startX, navY + 30, btnWidth2, 20)
.bounds(startX, navY + 55, btnWidth2, 20)
.build();
this.addRenderableWidget(reload);
// 中文名输入框用于新增映射的值
if (cnInput == null) {
cnInput = new EditBox(this.font, startX + btnWidth2 + btnGap, navY + 30, inputWidth, 20, Component.translatable("extendedae_plus.screen.upload.name"));
cnInput = new EditBox(this.font, startX + btnWidth2 + btnGap, navY + 55, inputWidth, 20, Component.translatable("extendedae_plus.screen.upload.name"));
} else {
cnInput.setX(startX + btnWidth2 + btnGap);
cnInput.setY(navY + 30);
cnInput.setY(navY + 55);
cnInput.setWidth(inputWidth);
}
this.addRenderableWidget(cnInput);
// 关闭按钮
Button close = Button.builder(Component.translatable("gui.cancel"), b -> onClose())
.bounds(startX + btnWidth2 + btnGap + inputWidth + btnGap, navY + 30, btnWidth2, 20)
.bounds(startX + btnWidth2 + btnGap + inputWidth + btnGap, navY + 55, btnWidth2, 20)
.build();
this.addRenderableWidget(close);
// 添加映射按钮使用当前搜索关键字 -> 中文
Button addMap = Button.builder(Component.translatable("extendedae_plus.screen.add_mapping"), b -> addMappingFromUI())
.bounds(startX + btnWidth2 + btnGap + inputWidth + btnGap + btnWidth2 + btnGap, navY + 30, btnWidth2, 20)
.bounds(startX + btnWidth2 + btnGap + inputWidth + btnGap + btnWidth2 + btnGap, navY + 55, btnWidth2, 20)
.build();
this.addRenderableWidget(addMap);
// 删除映射按钮按中文值精确匹配删除按钮
Button delByCn = Button.builder(Component.translatable("extendedae_plus.screen.delete_mapping"), b -> deleteMappingByCnFromUI())
.bounds(startX + btnWidth2 + btnGap + inputWidth + btnGap + btnWidth2 * 2 + btnGap * 2, navY + 30, btnWidth2, 20)
.bounds(startX + btnWidth2 + btnGap + inputWidth + btnGap + btnWidth2 * 2 + btnGap * 2, navY + 55, btnWidth2, 20)
.build();
this.addRenderableWidget(delByCn);
@ -244,6 +252,22 @@ public class ProviderSelectScreen extends Screen {
}
}
private Component buildAutoUploadToggleLabel() {
String stateKey = autoUploadUniqueMatchEnabled
? "config.extendedae_plus.option.state_on"
: "config.extendedae_plus.option.state_off";
return Component.translatable("extendedae_plus.screen.auto_upload_unique_match",
Component.translatable(stateKey));
}
private void toggleAutoUploadUniqueMatch() {
autoUploadUniqueMatchEnabled = !autoUploadUniqueMatchEnabled;
savePinnedProviders();
if (this.autoUploadToggleButton != null) {
this.autoUploadToggleButton.setMessage(buildAutoUploadToggleLabel());
}
}
/**
* 将服务器发送的名称可能是 Component JSON反序列化为本地化文本
*/
@ -399,7 +423,7 @@ public class ProviderSelectScreen extends Screen {
}
private void tryAutoUploadIfUniqueMatch() {
if (!autoUploadRequestedFromPresetSearch || autoUploadAttempted) {
if (!autoUploadUniqueMatchEnabled || !autoUploadRequestedFromPresetSearch || autoUploadAttempted) {
return;
}
autoUploadAttempted = true;
@ -636,6 +660,11 @@ public class ProviderSelectScreen extends Screen {
}
}
}
JsonElement autoUploadElement = obj.get(AUTO_UPLOAD_UNIQUE_MATCH_KEY);
if (autoUploadElement != null && autoUploadElement.isJsonPrimitive()) {
autoUploadUniqueMatchEnabled = autoUploadElement.getAsBoolean();
}
} catch (IOException | JsonSyntaxException e) {
// 加载失败时静默处理
}
@ -655,6 +684,7 @@ public class ProviderSelectScreen extends Screen {
arr.add(name);
}
obj.add("pinned", arr);
obj.addProperty(AUTO_UPLOAD_UNIQUE_MATCH_KEY, autoUploadUniqueMatchEnabled);
Files.writeString(cfgPath, GSON.toJson(obj));
} catch (IOException e) {

View File

@ -4,6 +4,7 @@ import appeng.api.implementations.items.IMemoryCard;
import appeng.block.crafting.PatternProviderBlock;
import appeng.util.InteractionUtil;
import net.minecraft.core.BlockPos;
import net.minecraft.network.chat.Component;
import net.minecraft.world.InteractionHand;
import net.minecraft.world.InteractionResult;
import net.minecraft.world.entity.player.Player;
@ -14,6 +15,10 @@ import org.jetbrains.annotations.Nullable;
public class MirrorPatternProviderBlock extends PatternProviderBlock {
public MirrorPatternProviderBlock() {
super();
}
@Override
public InteractionResult onActivated(Level level, BlockPos pos, Player player, InteractionHand hand,
@Nullable ItemStack heldItem, BlockHitResult hit) {
@ -22,23 +27,32 @@ public class MirrorPatternProviderBlock extends PatternProviderBlock {
return InteractionResult.PASS;
}
if (InteractionUtil.isInAlternateUseMode(player)) {
return InteractionResult.PASS;
}
if (heldItem != null
&& (InteractionUtil.canWrenchRotate(heldItem) || heldItem.getItem() instanceof IMemoryCard)) {
if (!level.isClientSide) {
player.displayClientMessage(
net.minecraft.network.chat.Component.translatable(
"extendedae_plus.message.mirror_pattern_provider.readonly"),
Component.translatable("extendedae_plus.message.mirror_pattern_provider.readonly"),
true);
}
return InteractionResult.sidedSuccess(level.isClientSide);
}
if (heldItem != null && !heldItem.isEmpty()) {
return InteractionResult.PASS;
}
if (!level.isClientSide) {
player.displayClientMessage(mirror.getStatusMessage(), true);
if (player.isShiftKeyDown()) {
if (mirror.tryBindToAdjacentMaster()) {
player.displayClientMessage(mirror.createBoundMessage(), true);
} else {
player.displayClientMessage(
Component.translatable("extendedae_plus.message.mirror_pattern_provider.missing_master"),
true);
}
} else {
player.displayClientMessage(mirror.getStatusMessage(), true);
}
}
return InteractionResult.sidedSuccess(level.isClientSide);

View File

@ -6,22 +6,27 @@ import appeng.api.networking.IManagedGridNode;
import appeng.block.crafting.PatternProviderBlock;
import appeng.block.crafting.PushDirection;
import appeng.blockentity.crafting.PatternProviderBlockEntity;
import appeng.blockentity.networking.CableBusBlockEntity;
import appeng.helpers.patternprovider.PatternProviderLogic;
import appeng.util.CustomNameUtil;
import appeng.helpers.patternprovider.PatternProviderLogicHost;
import appeng.parts.AEBasePart;
import appeng.util.SettingsFrom;
import appeng.util.inv.AppEngInternalInventory;
import com.extendedae_plus.api.bridge.PatternProviderLogicSyncBridge;
import com.extendedae_plus.config.ModConfig;
import com.extendedae_plus.init.ModBlockEntities;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.core.GlobalPos;
import net.minecraft.core.registries.Registries;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.nbt.Tag;
import net.minecraft.network.chat.Component;
import net.minecraft.network.chat.MutableComponent;
import net.minecraft.resources.ResourceKey;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.server.level.ServerLevel;
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;
@ -35,6 +40,7 @@ public class MirrorPatternProviderBlockEntity extends PatternProviderBlockEntity
private static final String TAG_MASTER = "mirrorMaster";
private static final String TAG_MASTER_DIMENSION = "dimension";
private static final String TAG_MASTER_POS = "pos";
private static final String TAG_MASTER_SIDE = "side";
private static final int FAST_SYNC_INTERVAL = 2;
private static final int STABLE_SYNC_INTERVAL = 20;
private static final int UNLOADED_MASTER_RETRY_INTERVAL = 40;
@ -49,10 +55,26 @@ public class MirrorPatternProviderBlockEntity extends PatternProviderBlockEntity
@Nullable
private BlockPos masterPos;
@Nullable
private Direction masterSide;
private long nextSyncTick = Long.MIN_VALUE;
private long lastSyncedPatternVersion = UNKNOWN_PATTERN_SYNC_VERSION;
private boolean needsUnboundPatternCleanup;
public record MasterLocation(ResourceKey<Level> dimension, BlockPos pos, @Nullable Direction side) {
public MasterLocation {
pos = pos.immutable();
}
public GlobalPos asGlobalPos() {
return GlobalPos.of(this.dimension, this.pos);
}
}
private record ResolvedMaster(MasterLocation location, PatternProviderLogicHost host) {
}
public MirrorPatternProviderBlockEntity(BlockPos pos, BlockState blockState) {
super(ModBlockEntities.MIRROR_PATTERN_PROVIDER_BE.get(), pos, blockState);
}
@ -104,6 +126,9 @@ public class MirrorPatternProviderBlockEntity extends PatternProviderBlockEntity
var masterTag = new CompoundTag();
masterTag.putString(TAG_MASTER_DIMENSION, this.masterDimension.location().toString());
masterTag.putLong(TAG_MASTER_POS, this.masterPos.asLong());
if (this.masterSide != null) {
masterTag.putString(TAG_MASTER_SIDE, this.masterSide.getSerializedName());
}
data.put(TAG_MASTER, masterTag);
} else {
data.remove(TAG_MASTER);
@ -116,6 +141,7 @@ public class MirrorPatternProviderBlockEntity extends PatternProviderBlockEntity
this.masterDimension = null;
this.masterPos = null;
this.masterSide = null;
this.scheduleImmediateSync();
this.invalidatePatternSyncState();
this.needsUnboundPatternCleanup = true;
@ -126,6 +152,9 @@ public class MirrorPatternProviderBlockEntity extends PatternProviderBlockEntity
this.masterDimension = ResourceKey.create(Registries.DIMENSION,
new ResourceLocation(masterTag.getString(TAG_MASTER_DIMENSION)));
this.masterPos = BlockPos.of(masterTag.getLong(TAG_MASTER_POS));
if (masterTag.contains(TAG_MASTER_SIDE, Tag.TAG_STRING)) {
this.masterSide = Direction.byName(masterTag.getString(TAG_MASTER_SIDE));
}
this.needsUnboundPatternCleanup = false;
}
}
@ -150,6 +179,24 @@ public class MirrorPatternProviderBlockEntity extends PatternProviderBlockEntity
}
public boolean bindToMaster(GlobalPos master) {
return this.bindToMaster(new MasterLocation(master.dimension(), master.pos(), null));
}
public boolean tryBindToAdjacentMaster() {
if (!(this.getLevel() instanceof ServerLevel)) {
return false;
}
var master = this.findAdjacentMaster();
if (master == null) {
return false;
}
this.syncFromMaster(master);
return true;
}
public boolean bindToMaster(MasterLocation master) {
if (!(this.getLevel() instanceof ServerLevel serverLevel)) {
return false;
}
@ -158,17 +205,18 @@ public class MirrorPatternProviderBlockEntity extends PatternProviderBlockEntity
return false;
}
var resolvedMaster = this.resolveMaster(serverLevel, master);
if (resolvedMaster != null) {
this.syncFromMaster(resolvedMaster);
return true;
}
var masterLevel = serverLevel.getServer().getLevel(master.dimension());
if (masterLevel != null && masterLevel.hasChunkAt(master.pos())) {
var blockEntity = masterLevel.getBlockEntity(master.pos());
if (isValidMaster(blockEntity)) {
this.syncFromMaster((PatternProviderBlockEntity) blockEntity);
return true;
}
return false;
}
var changed = this.setBoundMaster(master.dimension(), master.pos());
var changed = this.setBoundMaster(master);
if (changed) {
this.flushStateChanges();
}
@ -177,27 +225,22 @@ public class MirrorPatternProviderBlockEntity extends PatternProviderBlockEntity
}
@Nullable
public PatternProviderBlockEntity getMaster() {
if (this.masterDimension == null || this.masterPos == null || !(this.getLevel() instanceof ServerLevel serverLevel)) {
public PatternProviderLogicHost getMaster() {
if (!(this.getLevel() instanceof ServerLevel serverLevel)) {
return null;
}
var masterLevel = this.getMasterLevel(serverLevel);
if (masterLevel == null || !masterLevel.hasChunkAt(this.masterPos)) {
return null;
}
var blockEntity = masterLevel.getBlockEntity(this.masterPos);
return isValidMaster(blockEntity) ? (PatternProviderBlockEntity) blockEntity : null;
var master = this.resolveBoundMaster(serverLevel);
return master != null ? master.host() : null;
}
public Component createBoundMessage() {
if (this.masterPos != null) {
return Component.translatable(
return this.appendMasterSide(Component.translatable(
"extendedae_plus.message.mirror_pattern_provider.bound",
this.masterPos.getX(),
this.masterPos.getY(),
this.masterPos.getZ());
this.masterPos.getZ()));
}
return Component.translatable("extendedae_plus.message.mirror_pattern_provider.missing_master");
@ -205,11 +248,11 @@ public class MirrorPatternProviderBlockEntity extends PatternProviderBlockEntity
public Component getStatusMessage() {
if (this.masterPos != null) {
return Component.translatable(
return this.appendMasterSide(Component.translatable(
"extendedae_plus.message.mirror_pattern_provider.following",
this.masterPos.getX(),
this.masterPos.getY(),
this.masterPos.getZ());
this.masterPos.getZ()));
}
return Component.translatable("extendedae_plus.message.mirror_pattern_provider.missing_master");
@ -251,7 +294,11 @@ public class MirrorPatternProviderBlockEntity extends PatternProviderBlockEntity
return UNLOADED_MASTER_RETRY_INTERVAL;
}
var master = this.getMaster();
if (!(this.getLevel() instanceof ServerLevel serverLevel)) {
return UNLOADED_MASTER_RETRY_INTERVAL;
}
var master = this.resolveBoundMaster(serverLevel);
if (master != null) {
return this.syncFromMaster(master) ? FAST_SYNC_INTERVAL : STABLE_SYNC_INTERVAL;
}
@ -276,12 +323,19 @@ public class MirrorPatternProviderBlockEntity extends PatternProviderBlockEntity
return true;
}
var masterLevel = this.getMasterLevel(serverLevel);
if (masterLevel == null || !masterLevel.hasChunkAt(this.masterPos)) {
var target = this.getBoundMasterLocation();
if (target == null) {
return false;
}
return !isValidMaster(masterLevel.getBlockEntity(this.masterPos));
var masterLevel = target.dimension() == serverLevel.dimension()
? serverLevel
: serverLevel.getServer().getLevel(target.dimension());
if (masterLevel == null || !masterLevel.hasChunkAt(target.pos())) {
return false;
}
return this.resolveMaster(serverLevel, target) == null;
}
private boolean clearMasterBinding(boolean clearMirroredPatterns) {
@ -289,6 +343,7 @@ public class MirrorPatternProviderBlockEntity extends PatternProviderBlockEntity
this.masterDimension = null;
this.masterPos = null;
this.masterSide = null;
this.invalidatePatternSyncState();
this.needsUnboundPatternCleanup = false;
@ -301,12 +356,14 @@ public class MirrorPatternProviderBlockEntity extends PatternProviderBlockEntity
return changed;
}
private boolean setBoundMaster(ResourceKey<Level> dimension, BlockPos pos) {
var newPos = pos.immutable();
var changed = !Objects.equals(this.masterDimension, dimension) || !Objects.equals(this.masterPos, newPos);
private boolean setBoundMaster(MasterLocation master) {
var changed = !Objects.equals(this.masterDimension, master.dimension())
|| !Objects.equals(this.masterPos, master.pos())
|| !Objects.equals(this.masterSide, master.side());
this.masterDimension = dimension;
this.masterPos = newPos;
this.masterDimension = master.dimension();
this.masterPos = master.pos();
this.masterSide = master.side();
this.needsUnboundPatternCleanup = false;
if (changed) {
this.invalidatePatternSyncState();
@ -314,16 +371,32 @@ public class MirrorPatternProviderBlockEntity extends PatternProviderBlockEntity
return changed;
}
private boolean syncFromMaster(PatternProviderBlockEntity master) {
var masterLevel = master.getLevel();
if (masterLevel == null) {
return false;
@Nullable
private ResolvedMaster findAdjacentMaster() {
var level = this.getLevel();
if (level == null) {
return null;
}
var bindingChanged = this.setBoundMaster(masterLevel.dimension(), master.getBlockPos());
for (var direction : Direction.values()) {
var adjacent = level.getBlockEntity(this.getBlockPos().relative(direction));
var master = resolveMaster(adjacent, null);
if (master == null) {
master = resolveMaster(adjacent, direction.getOpposite());
}
if (master != null) {
return master;
}
}
return null;
}
private boolean syncFromMaster(ResolvedMaster master) {
var bindingChanged = this.setBoundMaster(master.location());
var changed = bindingChanged;
changed |= this.syncMirroredSettings(master);
changed |= this.syncMirroredPatterns(master, bindingChanged);
changed |= this.syncMirroredSettings(master.host());
changed |= this.syncMirroredPatterns(master.host(), bindingChanged);
if (changed) {
this.flushStateChanges();
@ -332,17 +405,13 @@ public class MirrorPatternProviderBlockEntity extends PatternProviderBlockEntity
return changed;
}
private boolean syncMirroredSettings(PatternProviderBlockEntity master) {
private boolean syncMirroredSettings(PatternProviderLogicHost master) {
if (!this.hasDifferentMirroredSettings(master)) {
return false;
}
var settingsTag = new CompoundTag();
master.getLogic().getConfigManager().writeToNBT(settingsTag);
settingsTag.putByte(PatternProviderBlock.PUSH_DIRECTION.getName(),
(byte) master.getBlockState().getValue(PatternProviderBlock.PUSH_DIRECTION).ordinal());
CustomNameUtil.setCustomName(settingsTag, master.getCustomName());
exportMasterSettings(master, settingsTag);
super.importSettings(SettingsFrom.MEMORY_CARD, settingsTag, null);
this.getLogic().getConfigManager().readFromNBT(settingsTag);
@ -359,11 +428,11 @@ public class MirrorPatternProviderBlockEntity extends PatternProviderBlockEntity
return this.syncMirroredSettings(defaultMirror);
}
private boolean hasDifferentMirroredSettings(PatternProviderBlockEntity master) {
private boolean hasDifferentMirroredSettings(PatternProviderLogicHost master) {
var mirrorLogic = this.getLogic();
var masterLogic = master.getLogic();
return !Objects.equals(this.getCustomName(), master.getCustomName())
return !Objects.equals(this.getCustomName(), getCustomName(master))
|| this.getPriority() != master.getPriority()
|| mirrorLogic.getConfigManager().getSetting(Settings.BLOCKING_MODE)
!= masterLogic.getConfigManager().getSetting(Settings.BLOCKING_MODE)
@ -371,11 +440,11 @@ public class MirrorPatternProviderBlockEntity extends PatternProviderBlockEntity
!= masterLogic.getConfigManager().getSetting(Settings.PATTERN_ACCESS_TERMINAL)
|| mirrorLogic.getConfigManager().getSetting(Settings.LOCK_CRAFTING_MODE)
!= masterLogic.getConfigManager().getSetting(Settings.LOCK_CRAFTING_MODE)
|| this.getBlockState().getValue(PatternProviderBlock.PUSH_DIRECTION)
!= master.getBlockState().getValue(PatternProviderBlock.PUSH_DIRECTION);
|| supportsPushDirectionState(master)
&& this.getBlockState().getValue(PatternProviderBlock.PUSH_DIRECTION) != getPushDirection(master);
}
private boolean syncMirroredPatterns(PatternProviderBlockEntity master, boolean forceSync) {
private boolean syncMirroredPatterns(PatternProviderLogicHost master, boolean forceSync) {
var masterPatternVersion = getPatternSyncVersion(master);
if (!forceSync && masterPatternVersion != UNKNOWN_PATTERN_SYNC_VERSION
&& masterPatternVersion == this.lastSyncedPatternVersion) {
@ -467,11 +536,107 @@ public class MirrorPatternProviderBlockEntity extends PatternProviderBlockEntity
}
@Nullable
private ServerLevel getMasterLevel(ServerLevel serverLevel) {
if (serverLevel.dimension() == this.masterDimension) {
return serverLevel;
private MasterLocation getBoundMasterLocation() {
if (this.masterDimension == null || this.masterPos == null) {
return null;
}
return serverLevel.getServer().getLevel(this.masterDimension);
return new MasterLocation(this.masterDimension, this.masterPos, this.masterSide);
}
@Nullable
private ResolvedMaster resolveBoundMaster(ServerLevel serverLevel) {
var target = this.getBoundMasterLocation();
return target != null ? this.resolveMaster(serverLevel, target) : null;
}
@Nullable
private ResolvedMaster resolveMaster(ServerLevel serverLevel, MasterLocation target) {
var masterLevel = target.dimension() == serverLevel.dimension()
? serverLevel
: serverLevel.getServer().getLevel(target.dimension());
if (masterLevel == null || !masterLevel.hasChunkAt(target.pos())) {
return null;
}
return resolveMaster(masterLevel.getBlockEntity(target.pos()), target.side());
}
@Nullable
private static ResolvedMaster resolveMaster(@Nullable BlockEntity blockEntity, @Nullable Direction partSide) {
if (blockEntity == null || blockEntity.isRemoved()) {
return null;
}
if (partSide == null && blockEntity instanceof PatternProviderLogicHost host && isValidMasterHost(host)) {
var level = blockEntity.getLevel();
if (level == null) {
return null;
}
return new ResolvedMaster(
new MasterLocation(level.dimension(), blockEntity.getBlockPos(), null),
host);
}
if (partSide != null && blockEntity instanceof CableBusBlockEntity cableBus) {
return resolvePartMaster(cableBus, partSide);
}
return null;
}
@Nullable
private static ResolvedMaster resolvePartMaster(CableBusBlockEntity cableBus, Direction side) {
var part = cableBus.getCableBus().getPart(side);
if (part instanceof AEBasePart basePart && isValidMasterHost(basePart)) {
var level = cableBus.getLevel();
if (level == null) {
return null;
}
return new ResolvedMaster(
new MasterLocation(level.dimension(), cableBus.getBlockPos(), side),
(PatternProviderLogicHost) basePart);
}
return null;
}
private static void exportMasterSettings(PatternProviderLogicHost master, CompoundTag output) {
if (master instanceof PatternProviderBlockEntity blockEntity) {
blockEntity.exportSettings(SettingsFrom.MEMORY_CARD, output, null);
} else if (master instanceof AEBasePart part) {
part.exportSettings(SettingsFrom.MEMORY_CARD, output);
}
}
@Nullable
private static Component getCustomName(PatternProviderLogicHost host) {
if (host instanceof PatternProviderBlockEntity blockEntity) {
return blockEntity.getCustomName();
}
if (host instanceof AEBasePart part) {
return part.getCustomName();
}
return null;
}
private static PushDirection getPushDirection(PatternProviderLogicHost host) {
Direction target = null;
var targets = host.getTargets();
if (targets.size() == 1) {
target = targets.iterator().next();
}
return PushDirection.fromDirection(target);
}
private static boolean supportsPushDirectionState(PatternProviderLogicHost host) {
return host instanceof PatternProviderBlockEntity;
}
private Component appendMasterSide(MutableComponent component) {
if (this.masterSide != null) {
component.append(Component.literal(" [" + this.masterSide.getSerializedName() + "]"));
}
return component;
}
private static AppEngInternalInventory asPatternInventory(Object inventory) {
@ -496,7 +661,7 @@ public class MirrorPatternProviderBlockEntity extends PatternProviderBlockEntity
return ItemStack.isSameItemSameTags(left, right) && left.getCount() == right.getCount();
}
private static long getPatternSyncVersion(PatternProviderBlockEntity master) {
private static long getPatternSyncVersion(PatternProviderLogicHost master) {
if (master.getLogic() instanceof PatternProviderLogicSyncBridge bridge) {
return bridge.eap$getPatternSyncVersion();
}
@ -510,8 +675,20 @@ public class MirrorPatternProviderBlockEntity extends PatternProviderBlockEntity
&& !blockEntity.isRemoved();
}
private static boolean isValidMaster(@Nullable BlockEntity blockEntity) {
return isSupportedMaster(blockEntity);
private static boolean isValidMasterHost(Object host) {
if (!(host instanceof PatternProviderLogicHost)) {
return false;
}
if (host instanceof MirrorPatternProviderBlockEntity) {
return false;
}
if (host instanceof BlockEntity blockEntity) {
return !blockEntity.isRemoved();
}
return host instanceof AEBasePart part && part.getBlockEntity() != null && !part.getBlockEntity().isRemoved();
}
private static final class MirrorLogic extends PatternProviderLogic {

View File

@ -0,0 +1,41 @@
package com.extendedae_plus.content.decor;
import net.minecraft.core.Direction;
import net.minecraft.world.item.context.BlockPlaceContext;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.Mirror;
import net.minecraft.world.level.block.Rotation;
import net.minecraft.world.level.block.state.BlockBehaviour;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.block.state.StateDefinition;
import net.minecraft.world.level.block.state.properties.BlockStateProperties;
import net.minecraft.world.level.block.state.properties.DirectionProperty;
public class DollBlock extends Block {
public static final DirectionProperty FACING = BlockStateProperties.HORIZONTAL_FACING;
public DollBlock(BlockBehaviour.Properties properties) {
super(properties);
this.registerDefaultState(this.stateDefinition.any().setValue(FACING, Direction.NORTH));
}
@Override
protected void createBlockStateDefinition(StateDefinition.Builder<Block, BlockState> builder) {
builder.add(FACING);
}
@Override
public BlockState getStateForPlacement(BlockPlaceContext context) {
return this.defaultBlockState().setValue(FACING, context.getHorizontalDirection().getOpposite());
}
@Override
public BlockState rotate(BlockState state, Rotation rotation) {
return state.setValue(FACING, rotation.rotate(state.getValue(FACING)));
}
@Override
public BlockState mirror(BlockState state, Mirror mirror) {
return state.rotate(mirror.getRotation(state.getValue(FACING)));
}
}

View File

@ -6,6 +6,7 @@ import appeng.core.definitions.AEBlockEntities;
import com.extendedae_plus.ExtendedAEPlus;
import com.extendedae_plus.content.ae2.MirrorPatternProviderBlock;
import com.extendedae_plus.content.crafting.EPlusCraftingUnitType;
import com.extendedae_plus.content.decor.DollBlock;
import com.extendedae_plus.content.matrix.CrafterCorePlusBlock;
import com.extendedae_plus.content.matrix.PatternCorePlusBlock;
import com.extendedae_plus.content.matrix.SpeedCorePlusBlock;
@ -13,6 +14,7 @@ import com.extendedae_plus.content.matrix.UploadCoreBlock;
import com.extendedae_plus.content.wireless.LabeledWirelessTransceiverBlock;
import com.extendedae_plus.content.wireless.WirelessTransceiverBlock;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.Blocks;
import net.minecraft.world.level.block.state.BlockBehaviour;
import net.minecraft.world.level.material.MapColor;
import net.minecraftforge.registries.DeferredRegister;
@ -132,4 +134,16 @@ public final class ModBlocks {
"mirror_pattern_provider",
MirrorPatternProviderBlock::new
);
public static final RegistryObject<Block> C_H716 = registerDollBlock("c-h716");
public static final RegistryObject<Block> FISH_DAN = registerDollBlock("fish_dan_");
public static final RegistryObject<Block> _FENG = registerDollBlock("_feng");
public static final RegistryObject<Block> XBAI = registerDollBlock("xbai");
private static RegistryObject<Block> registerDollBlock(String name) {
return BLOCKS.register(
name,
() -> new DollBlock(BlockBehaviour.Properties.copy(Blocks.WHITE_WOOL).noOcclusion())
);
}
}

View File

@ -28,6 +28,10 @@ public final class ModCreativeTabs {
//超级装配矩阵样板核心
output.accept(ModItems.ASSEMBLER_MATRIX_PATTERN_PLUS.get());
output.accept(ModItems.MIRROR_PATTERN_PROVIDER.get());
output.accept(ModItems.C_H716.get());
output.accept(ModItems.FISH_DAN.get());
output.accept(ModItems._FENG.get());
output.accept(ModItems.XBAI.get());
output.accept(ModItems.MIRROR_PATTERN_BINDING_TOOL.get());

View File

@ -91,6 +91,26 @@ public final class ModItems {
() -> new BlockItem(ModBlocks.MIRROR_PATTERN_PROVIDER.get(), new Item.Properties())
);
public static final RegistryObject<Item> C_H716 = ITEMS.register(
"c-h716",
() -> new BlockItem(ModBlocks.C_H716.get(), new Item.Properties())
);
public static final RegistryObject<Item> FISH_DAN = ITEMS.register(
"fish_dan_",
() -> new BlockItem(ModBlocks.FISH_DAN.get(), new Item.Properties())
);
public static final RegistryObject<Item> _FENG = ITEMS.register(
"_feng",
() -> new BlockItem(ModBlocks._FENG.get(), new Item.Properties())
);
public static final RegistryObject<Item> XBAI = ITEMS.register(
"xbai",
() -> new BlockItem(ModBlocks.XBAI.get(), new Item.Properties())
);
public static final RegistryObject<MirrorPatternBindingToolItem> MIRROR_PATTERN_BINDING_TOOL = ITEMS.register(
"mirror_pattern_binding_tool",
() -> new MirrorPatternBindingToolItem(new Item.Properties())

View File

@ -1,13 +1,18 @@
package com.extendedae_plus.items.tools;
import appeng.blockentity.crafting.PatternProviderBlockEntity;
import appeng.blockentity.networking.CableBusBlockEntity;
import appeng.helpers.patternprovider.PatternProviderLogicHost;
import appeng.parts.AEBasePart;
import com.extendedae_plus.content.ae2.MirrorPatternProviderBlockEntity;
import com.extendedae_plus.content.ae2.MirrorPatternProviderBlockEntity.MasterLocation;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.core.GlobalPos;
import net.minecraft.core.registries.Registries;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.nbt.Tag;
import net.minecraft.network.chat.Component;
import net.minecraft.network.chat.MutableComponent;
import net.minecraft.resources.ResourceKey;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.InteractionHand;
@ -19,6 +24,7 @@ import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.TooltipFlag;
import net.minecraft.world.item.context.UseOnContext;
import net.minecraft.world.level.Level;
import net.minecraft.world.phys.Vec3;
import org.jetbrains.annotations.Nullable;
import java.util.List;
@ -28,6 +34,7 @@ public class MirrorPatternBindingToolItem extends Item {
private static final String TAG_SELECTED_RANGE_START = "selectedRangeStart";
private static final String TAG_DIMENSION = "dimension";
private static final String TAG_POS = "pos";
private static final String TAG_SIDE = "side";
public MirrorPatternBindingToolItem(Properties properties) {
super(properties.stacksTo(1));
@ -43,31 +50,18 @@ public class MirrorPatternBindingToolItem extends Item {
return this.handleBlockUse(context, context.getItemInHand());
}
public InteractionResult handleBlockUse(UseOnContext context, ItemStack stack) {
private InteractionResult handleBlockUse(UseOnContext context, ItemStack stack) {
var level = context.getLevel();
var player = context.getPlayer();
var blockEntity = level.getBlockEntity(context.getClickedPos());
if (blockEntity instanceof PatternProviderBlockEntity
&& !(blockEntity instanceof MirrorPatternProviderBlockEntity)) {
var clickedMaster = getClickedMaster(level, context);
if (clickedMaster != null) {
if (player != null && player.isShiftKeyDown()) {
if (!level.isClientSide) {
if (MirrorPatternProviderBlockEntity.isSupportedMaster(blockEntity)) {
setSelectedMaster(stack, GlobalPos.of(level.dimension(), context.getClickedPos()));
clearSelectedRangeStart(stack);
player.displayClientMessage(
Component.translatable(
"extendedae_plus.message.mirror_binding_tool.selected",
context.getClickedPos().getX(),
context.getClickedPos().getY(),
context.getClickedPos().getZ()),
true);
} else {
player.displayClientMessage(
Component.translatable(
"extendedae_plus.message.mirror_binding_tool.unsupported_provider"),
true);
}
setSelectedMaster(stack, clickedMaster);
clearSelectedRangeStart(stack);
player.displayClientMessage(createSelectedMessage(clickedMaster), true);
}
return InteractionResult.sidedSuccess(level.isClientSide);
}
@ -127,7 +121,6 @@ public class MirrorPatternBindingToolItem extends Item {
tooltipComponents.add(Component.translatable("item.extendedae_plus.mirror_pattern_binding_tool.tip.bind"));
tooltipComponents.add(Component.translatable("item.extendedae_plus.mirror_pattern_binding_tool.tip.unbind"));
tooltipComponents.add(Component.translatable("item.extendedae_plus.mirror_pattern_binding_tool.tip.range"));
tooltipComponents.add(Component.translatable("item.extendedae_plus.mirror_pattern_binding_tool.tip.clear"));
var selectedMaster = getSelectedMaster(stack);
if (selectedMaster != null) {
@ -140,6 +133,9 @@ public class MirrorPatternBindingToolItem extends Item {
tooltipComponents.add(Component.translatable(
"item.extendedae_plus.mirror_pattern_binding_tool.dimension",
selectedMaster.dimension().location().toString()));
if (selectedMaster.side() != null) {
tooltipComponents.add(Component.literal("方向: " + selectedMaster.side().getSerializedName()));
}
} else {
tooltipComponents.add(Component.translatable("item.extendedae_plus.mirror_pattern_binding_tool.unset"));
}
@ -155,9 +151,9 @@ public class MirrorPatternBindingToolItem extends Item {
}
}
private static void setSelectedMaster(ItemStack stack, GlobalPos master) {
private static void setSelectedMaster(ItemStack stack, MasterLocation master) {
var tag = stack.getOrCreateTag();
tag.put(TAG_SELECTED_MASTER, createGlobalPosTag(master));
tag.put(TAG_SELECTED_MASTER, createMasterTag(master));
}
private static void clearSelectedMaster(ItemStack stack) {
@ -180,8 +176,8 @@ public class MirrorPatternBindingToolItem extends Item {
}
@Nullable
private static GlobalPos getSelectedMaster(ItemStack stack) {
return getStoredGlobalPos(stack, TAG_SELECTED_MASTER);
private static MasterLocation getSelectedMaster(ItemStack stack) {
return getStoredMasterLocation(stack, TAG_SELECTED_MASTER);
}
@Nullable
@ -189,6 +185,14 @@ public class MirrorPatternBindingToolItem extends Item {
return getStoredGlobalPos(stack, TAG_SELECTED_RANGE_START);
}
private static CompoundTag createMasterTag(MasterLocation master) {
var selectedTag = createGlobalPosTag(master.asGlobalPos());
if (master.side() != null) {
selectedTag.putString(TAG_SIDE, master.side().getSerializedName());
}
return selectedTag;
}
private static CompoundTag createGlobalPosTag(GlobalPos globalPos) {
var selectedTag = new CompoundTag();
selectedTag.putString(TAG_DIMENSION, globalPos.dimension().location().toString());
@ -196,6 +200,27 @@ public class MirrorPatternBindingToolItem extends Item {
return selectedTag;
}
@Nullable
private static MasterLocation getStoredMasterLocation(ItemStack stack, String tagKey) {
var globalPos = getStoredGlobalPos(stack, tagKey);
if (globalPos == null) {
return null;
}
var tag = stack.getTag();
if (tag == null) {
return null;
}
var selectedTag = tag.getCompound(tagKey);
Direction side = null;
if (selectedTag.contains(TAG_SIDE, Tag.TAG_STRING)) {
side = Direction.byName(selectedTag.getString(TAG_SIDE));
}
return new MasterLocation(globalPos.dimension(), globalPos.pos(), side);
}
@Nullable
private static GlobalPos getStoredGlobalPos(ItemStack stack, String tagKey) {
var tag = stack.getTag();
@ -261,7 +286,7 @@ public class MirrorPatternBindingToolItem extends Item {
true);
}
private static RangeBindResult bindMirrorsInRange(Level level, BlockPos start, BlockPos end, GlobalPos selectedMaster) {
private static RangeBindResult bindMirrorsInRange(Level level, BlockPos start, BlockPos end, MasterLocation selectedMaster) {
int totalMirrors = 0;
int boundMirrors = 0;
@ -285,6 +310,48 @@ public class MirrorPatternBindingToolItem extends Item {
return new RangeBindResult(totalMirrors, boundMirrors, totalMirrors - boundMirrors);
}
@Nullable
private static MasterLocation getClickedMaster(Level level, UseOnContext context) {
var pos = context.getClickedPos();
var blockEntity = level.getBlockEntity(pos);
if (blockEntity == null || blockEntity instanceof MirrorPatternProviderBlockEntity) {
return null;
}
if (blockEntity instanceof PatternProviderLogicHost) {
return new MasterLocation(level.dimension(), pos, null);
}
if (blockEntity instanceof CableBusBlockEntity cableBus) {
Vec3 hitVec = context.getClickLocation();
Vec3 hitInBlock = new Vec3(hitVec.x - pos.getX(), hitVec.y - pos.getY(), hitVec.z - pos.getZ());
var selectedPart = cableBus.getCableBus().selectPartLocal(hitInBlock).part;
if (selectedPart instanceof AEBasePart basePart
&& selectedPart instanceof PatternProviderLogicHost) {
return new MasterLocation(level.dimension(), pos, basePart.getSide());
}
}
return null;
}
private static Component createSelectedMessage(MasterLocation master) {
return appendSide(
Component.translatable(
"extendedae_plus.message.mirror_binding_tool.selected",
master.pos().getX(),
master.pos().getY(),
master.pos().getZ()),
master.side());
}
private static Component appendSide(MutableComponent message, @Nullable Direction side) {
if (side != null) {
message.append(Component.literal(" [" + side.getSerializedName() + "]"));
}
return message;
}
@Override
public InteractionResultHolder<ItemStack> use(Level level, Player player, InteractionHand usedHand) {
var stack = player.getItemInHand(usedHand);

View File

@ -1,7 +1,7 @@
package com.extendedae_plus.mixin.ae2.helpers.patternprovider;
import appeng.helpers.patternprovider.PatternProviderLogic;
import appeng.util.inv.AppEngInternalInventory;
import appeng.api.inventories.InternalInventory;
import com.extendedae_plus.api.bridge.PatternProviderLogicSyncBridge;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Unique;
@ -15,7 +15,7 @@ public abstract class PatternProviderLogicSyncVersionMixin implements PatternPro
private long eap$patternSyncVersion;
@Inject(method = "onChangeInventory", at = @At("TAIL"))
private void eap$trackPatternInventoryChanges(AppEngInternalInventory inv, int slot, CallbackInfo ci) {
private void eap$trackPatternInventoryChanges(InternalInventory inv, int slot, CallbackInfo ci) {
this.eap$patternSyncVersion++;
}

View File

@ -25,7 +25,7 @@ item_ids:
- **超级装配矩阵样板核心**:;每个核心提供 72 个样板槽位。
- **超级装配矩阵合成核心**:每个核心可同时运行 32 个合成任务。
- **超级装配矩阵速度核心**提供相当于普通速度核心5倍的加速效果。
- **超级装配矩阵速度核心**提供相当于普通速度核心5倍的加速效果。(一个的效果顶原版五个,放一个就到上限了,多放无用。)

View File

@ -26,7 +26,7 @@ The **Entity Accelerator** consumes energy from the AE2 network to accelerate bl
- If the *Applied Flux* mod is installed, FE energy stored in network disks can be consumed to continue acceleration when AE energy is insufficient (priority configurable).
4. **Configuration Options:** Base energy consumption, entity blacklist, and per-entity energy multiplier can be adjusted via the config file.
![Entity Accelerator Interface](../../picture/entity_speed_ticker.png)
![Entity Accelerator Interface](../../picture/entity_speed_ticker_en.png)
## Energy Consumption Mechanism
@ -95,4 +95,4 @@ Let \( N \) = number of installed energy cards
- Energy Ratio: 82.85%
- **Final Energy Consumption:** 65,536 × 0.8285 ≈ 54,267 AE
> Actual energy consumption may vary depending on entity-specific configuration.
> Actual energy consumption may vary depending on entity-specific configuration.

View File

@ -18,7 +18,7 @@ The **Pattern Provider Status Controller** is a central control unit that allows
## User Interface & Operations
![Pattern Provider Status Controller Interface](../../picture/network_pattern_controller.png)
![Pattern Provider Status Controller Interface](../../picture/network_pattern_controller_en.png)
The controller UI provides the following control options:

View File

@ -25,6 +25,6 @@ Their roles are analogous to the original ExtendedAE Assembler Matrix cores, but
- **Assembler Matrix Pattern Core+**: each core provides **72 pattern slots**.
- **Assembler Matrix Craft Core+**: each core can run **32 crafting jobs in parallel**.
- **Assembler Matrix Speed Core+**: provides **5× the effect of a regular speed core** for the matrix.
- **Assembler Matrix Speed Core+**: provides **5× the effect of a regular speed core** for the matrix.(Its just that its strength is five times, so placing just one is enough.)

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.3 KiB

View File

@ -0,0 +1,8 @@
{
"variants": {
"facing=north": { "model": "extendedae_plus:block/_feng" },
"facing=east": { "model": "extendedae_plus:block/_feng", "y": 90 },
"facing=south": { "model": "extendedae_plus:block/_feng", "y": 180 },
"facing=west": { "model": "extendedae_plus:block/_feng", "y": 270 }
}
}

View File

@ -0,0 +1,8 @@
{
"variants": {
"facing=north": { "model": "extendedae_plus:block/c-h716" },
"facing=east": { "model": "extendedae_plus:block/c-h716", "y": 90 },
"facing=south": { "model": "extendedae_plus:block/c-h716", "y": 180 },
"facing=west": { "model": "extendedae_plus:block/c-h716", "y": 270 }
}
}

View File

@ -0,0 +1,8 @@
{
"variants": {
"facing=north": { "model": "extendedae_plus:block/fish_dan_" },
"facing=east": { "model": "extendedae_plus:block/fish_dan_", "y": 90 },
"facing=south": { "model": "extendedae_plus:block/fish_dan_", "y": 180 },
"facing=west": { "model": "extendedae_plus:block/fish_dan_", "y": 270 }
}
}

View File

@ -0,0 +1,8 @@
{
"variants": {
"facing=north": { "model": "extendedae_plus:block/xbai" },
"facing=east": { "model": "extendedae_plus:block/xbai", "y": 90 },
"facing=south": { "model": "extendedae_plus:block/xbai", "y": 180 },
"facing=west": { "model": "extendedae_plus:block/xbai", "y": 270 }
}
}

View File

@ -18,6 +18,10 @@
"item.extendedae_plus.256x_crafting_accelerator": "256x Crafting Accelerator",
"item.extendedae_plus.1024x_crafting_accelerator": "1024x Crafting Accelerator",
"item.extendedae_plus.network_pattern_controller": "Pattern Supplier State Controller",
"item.extendedae_plus.c-h716": "C-H716 Doll",
"item.extendedae_plus.fish_dan_": "Fish Dan Doll",
"item.extendedae_plus._feng": "_feng Doll",
"item.extendedae_plus.xbai": "Xbai Doll",
"item.extendedae_plus.entity_speed_card": "Entity Acceleration Card",
"item.extendedae_plus.entity_speed_card.x1": "§k§l?#@§r§8Should not be stored in §k§l%§r real §centity §k&0%§r speed §k§l*§r cards§k§l...§r",
"item.extendedae_plus.entity_speed_card.x2": "Entity Acceleration Card (x2)",
@ -70,6 +74,10 @@
"block.extendedae_plus.256x_crafting_accelerator": "256x Crafting Accelerator",
"block.extendedae_plus.1024x_crafting_accelerator": "1024x Crafting Accelerator",
"block.extendedae_plus.network_pattern_controller": "Pattern Supplier State Controller",
"block.extendedae_plus.c-h716": "C-H716 Doll",
"block.extendedae_plus.fish_dan_": "Fish Dan Doll",
"block.extendedae_plus._feng": "_feng Doll",
"block.extendedae_plus.xbai": "Xbai Doll",
"block.extendedae_plus.mirror_pattern_provider": "Mirror Pattern Provider",
"block.extendedae_plus.assembler_matrix_upload_core": "Assembler Matrix Upload Core",
"block.extendedae_plus.assembler_matrix_speed_plus": "Assembler Matrix Speed Core Plus",
@ -116,6 +124,7 @@
"extendedae_plus.screen.reload_mapping_fail": "Overloading mapping failed: %s",
"extendedae_plus.screen.add_mapping": "Add Mapping",
"extendedae_plus.screen.delete_mapping": "Delete Mapping",
"extendedae_plus.screen.auto_upload_unique_match": "Auto Upload on Unique Match: %s",
"extendedae_plus.screen.upload.enter_search_key": "Please enter a search keyword before adding a mapping",
"extendedae_plus.screen.upload.enter_name": "Please enter a name",
"extendedae_plus.screen.upload.mapping_added": "Mapping added/updated: %s -> %s",

View File

@ -18,6 +18,10 @@
"item.extendedae_plus.256x_crafting_accelerator": "256x并行处理单元",
"item.extendedae_plus.1024x_crafting_accelerator": "1024x并行处理单元",
"item.extendedae_plus.network_pattern_controller": "样板供应器状态控制器",
"item.extendedae_plus.c-h716": "C-H716 玩偶",
"item.extendedae_plus.fish_dan_": "Fish_Dan_ 玩偶",
"item.extendedae_plus._feng": "_feng 玩偶",
"item.extendedae_plus.xbai": "Xbai 玩偶",
"item.extendedae_plus.entity_speed_card": "实体加速卡",
"item.extendedae_plus.entity_speed_card.x1": "§k§l?#@§r§8不§k§l1§r限§k§l0§r存于§k§l%§r现实的§c实§k&0%§r体加§k§l*§r速卡§k§l...§r",
"item.extendedae_plus.entity_speed_card.x2": "实体加速卡 (x2)",
@ -68,6 +72,10 @@
"block.extendedae_plus.256x_crafting_accelerator": "256x并行处理单元",
"block.extendedae_plus.1024x_crafting_accelerator": "1024x并行处理单元",
"block.extendedae_plus.network_pattern_controller": "样板供应器状态控制器",
"block.extendedae_plus.c-h716": "C-H716 玩偶",
"block.extendedae_plus.fish_dan_": "Fish_Dan_ 玩偶",
"block.extendedae_plus._feng": "_feng 玩偶",
"block.extendedae_plus.xbai": "Xbai 玩偶",
"block.extendedae_plus.mirror_pattern_provider": "镜像样板供应器",
"block.extendedae_plus.assembler_matrix_upload_core": "装配矩阵上传核心",
"block.extendedae_plus.assembler_matrix_speed_plus": "超级装配矩阵速度核心",
@ -115,6 +123,7 @@
"extendedae_plus.screen.reload_mapping_fail": "重载映射失败: %s",
"extendedae_plus.screen.add_mapping": "增加映射",
"extendedae_plus.screen.delete_mapping": "删除映射",
"extendedae_plus.screen.auto_upload_unique_match": "唯一匹配时自动上传: %s",
"extendedae_plus.screen.upload.enter_search_key": "请输入搜索关键字后再添加映射",
"extendedae_plus.screen.upload.enter_name": "请输入名称",
"extendedae_plus.screen.upload.mapping_added": "已添加/更新映射: %s -> %s",

View File

@ -18,6 +18,10 @@
"item.extendedae_plus.256x_crafting_accelerator": "256x並行處理單元",
"item.extendedae_plus.1024x_crafting_accelerator": "1024x並行處理單元",
"item.extendedae_plus.network_pattern_controller": "樣板供應器狀態控制器",
"item.extendedae_plus.c-h716": "C-H716 玩偶",
"item.extendedae_plus.fish_dan_": "Fish_Dan_ 玩偶",
"item.extendedae_plus._feng": "_feng 玩偶",
"item.extendedae_plus.xbai": "Xbai 玩偶",
"item.extendedae_plus.entity_speed_card": "實體加速卡",
"item.extendedae_plus.entity_speed_card.x1": "§k§l?#@§r§8不§k§l1§r限§k§l0§r存於§k§l%§r現實的§c實§k&0%§r體加§k§l*§r速卡§k§l...§r",
"item.extendedae_plus.entity_speed_card.x2": "實體加速卡 (x2)",
@ -50,11 +54,11 @@
"tooltip.extendedae_plus.basic_core.ready_to_craft": "核心構建完成,等待最終合成",
"tooltip.extendedae_plus.infinity_biginteger_cell": "§7——§b絕對儲存的現實投影§e\"有限\"§6已被定義為§c非法\n§b其存在本身即是對§d熵增§b的終極否定",
"tooltip.extendedae_plus.entity_speed_card.multiplier": "乘數: %s",
"tooltip.extendedae_plus.entity_speed_card.max": "最大生效: %s 倍",
"extendedae_plus.tooltip.swap_processing_outputs": "主副切換",
"extendedae_plus.tooltip.restore_processing_ratio": "恢復比例",
"block.extendedae_plus.assembler_matrix_upload_core.tooltip": "裝配矩陣上傳核心",
"tooltip.extendedae_plus.entity_speed_card.max": "最大生效: %s 倍",
"extendedae_plus.tooltip.swap_processing_outputs": "主副切換",
"extendedae_plus.tooltip.restore_processing_ratio": "恢復比例",
"block.extendedae_plus.assembler_matrix_upload_core.tooltip": "裝配矩陣上傳核心",
"block.extendedae_plus.assembler_matrix_upload_core.tooltip.upload": "上傳到裝配矩陣",
"block.extendedae_plus.assembler_matrix_upload_core.tooltip.upload_success": "樣板已上傳到裝配矩陣",
"block.extendedae_plus.assembler_matrix_upload_core.tooltip.upload_fail_not_crafting": "僅支援上傳合成樣板,處理樣板將被忽略",
@ -68,11 +72,15 @@
"block.extendedae_plus.256x_crafting_accelerator": "256x並行處理單元",
"block.extendedae_plus.1024x_crafting_accelerator": "1024x並行處理單元",
"block.extendedae_plus.network_pattern_controller": "樣板供應器狀態控制器",
"block.extendedae_plus.c-h716": "C-H716 玩偶",
"block.extendedae_plus.fish_dan_": "Fish_Dan_ 玩偶",
"block.extendedae_plus._feng": "_feng 玩偶",
"block.extendedae_plus.xbai": "Xbai 玩偶",
"block.extendedae_plus.assembler_matrix_upload_core": "裝配矩陣上傳核心",
"block.extendedae_plus.assembler_matrix_speed_plus": "超級裝配矩陣速度核心",
"block.extendedae_plus.assembler_matrix_crafter_plus": "超級裝配矩陣合成核心",
"block.extendedae_plus.assembler_matrix_pattern_plus": "超級裝配矩陣樣板核心",
"gui.extendedae_plus.assembler_matrix.pattern": "超級裝配矩陣樣板核心",
"block.extendedae_plus.assembler_matrix_pattern_plus": "超級裝配矩陣樣板核心",
"gui.extendedae_plus.assembler_matrix.pattern": "超級裝配矩陣樣板核心",
"block.extendedae_plus.labeled_wireless_transceiver": "標籤無線收發器",
"extendedae_plus.upload_to_matrix": "上傳到裝配矩陣",
@ -114,6 +122,7 @@
"extendedae_plus.screen.reload_mapping_fail": "重新載入對映失敗: %s",
"extendedae_plus.screen.add_mapping": "增加對映",
"extendedae_plus.screen.delete_mapping": "刪除對映",
"extendedae_plus.screen.auto_upload_unique_match": "唯一匹配時自動上傳: %s",
"extendedae_plus.screen.upload.enter_search_key": "請輸入搜尋關鍵字後再新增對映",
"extendedae_plus.screen.upload.enter_name": "請輸入名稱",
"extendedae_plus.screen.upload.mapping_added": "已新增/更新對映: %s -> %s",
@ -122,13 +131,13 @@
"extendedae_plus.screen.upload.mapping_deleted": "已刪除 %d 條對映,名稱 = %s",
"extendedae_plus.screen.upload.mapping_not_found": "未找到名稱為 '%s' 的對映",
"extendedae_plus.screen.upload.name": "對映名",
"extendedae_plus.screen.upload.select_provider_first": "請先點選左側按鈕選擇一個樣板供應器",
"extendedae_plus.screen.upload.invalid_pattern": "無效樣板",
"extendedae_plus.screen.upload.no_network_support": "未找到 ExtendedAE 網路支援(可能未安裝或版本不相容)",
"extendedae_plus.screen.upload.auto_upload_success": "已自動上傳到唯一匹配的樣板供應器:%s",
"extendedae_plus.screen.upload.auto_upload_failed": "自動上傳到樣板供應器失敗:%s",
"extendedae_plus.screen.open_provider_ui": "開啟該供應器目標容器的介面",
"extendedae_plus.screen.upload.select_provider_first": "請先點選左側按鈕選擇一個樣板供應器",
"extendedae_plus.screen.upload.invalid_pattern": "無效樣板",
"extendedae_plus.screen.upload.no_network_support": "未找到 ExtendedAE 網路支援(可能未安裝或版本不相容)",
"extendedae_plus.screen.upload.auto_upload_success": "已自動上傳到唯一匹配的樣板供應器:%s",
"extendedae_plus.screen.upload.auto_upload_failed": "自動上傳到樣板供應器失敗:%s",
"extendedae_plus.screen.open_provider_ui": "開啟該供應器目標容器的介面",
"extendedae_plus.button.choose_provider": "上傳樣板",
"extendedae_plus.pattern.hovertext.player": "由 %s 編碼",

View File

@ -0,0 +1,208 @@
{
"format_version": "1.9.0",
"credit": "Made with Blockbench",
"render_type": "cutout",
"textures": {
"1": "extendedae_plus:block/_feng_fumo",
"particle": "extendedae_plus:block/_feng_fumo"
},
"elements": [
{
"name": "Head",
"from": [4.35, 6, 7.35],
"to": [11.65, 13.3, 14.65],
"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, 6, 7],
"to": [11.8, 13.6, 14.7],
"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": [4, 0.35599, 10.01167],
"to": [5.5, 6.35599, 12.01167],
"rotation": {"angle": -22.5, "axis": "z", "origin": [4.7627, 3.35599, 11.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.9254, 0.25599, 9.91167],
"to": [5.6254, 6.45599, 12.11167],
"rotation": {"angle": -22.5, "axis": "z", "origin": [4.7627, 3.35599, 11.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.6, 0.34246, 9.979],
"to": [12.1, 6.34246, 11.979],
"rotation": {"angle": 22.5, "axis": "z", "origin": [11.25663, 3.34246, 10.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": [11.75, 4, 12.5, 5], "texture": "#1"}
}
},
{
"name": "Right Arm Layer",
"from": [10.48163, 0.24246, 9.879],
"to": [12.18163, 6.44246, 12.079],
"rotation": {"angle": 22.5, "axis": "z", "origin": [11.28163, 3.34246, 10.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": [11.75, 8, 12.5, 9], "texture": "#1"}
}
},
{
"name": "Left Leg",
"from": [8, -0.1, 4],
"to": [10, 1.9, 10],
"rotation": {"angle": -22.5, "axis": "y", "origin": [8, 0, 11]},
"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.9, -0.2, 3.9],
"to": [10.1, 2, 10.1],
"rotation": {"angle": -22.5, "axis": "y", "origin": [8, 0, 11]},
"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": [6, -0.1, 4],
"to": [8, 1.9, 10],
"rotation": {"angle": 22.5, "axis": "y", "origin": [8, 0, 11]},
"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.9, -0.2, 3.9],
"to": [8.1, 2, 10.1],
"rotation": {"angle": 22.5, "axis": "y", "origin": [8, 0, 11]},
"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, 9.6],
"to": [10.4, 6, 12.4],
"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.1, 9.5],
"to": [10.5, 6.1, 12.5],
"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, 5, 0],
"scale": [0.5, 0.5, 0.5]
},
"gui": {
"rotation": [15, 150, 0],
"scale": [0.7, 0.7, 0.7]
},
"fixed": {
"translation": [0, 0, -3.5]
}
}
}

View File

@ -0,0 +1,222 @@
{
"format_version": "1.21.6",
"credit": "Made with Blockbench",
"render_type": "cutout",
"textures": {
"1": "extendedae_plus:block/iava_user",
"2": "extendedae_plus:block/infinity_biginteger_cell",
"particle": "extendedae_plus:block/iava_user"
},
"elements": [
{
"name": "Head",
"from": [4.35, 6, 7.35],
"to": [11.65, 13.3, 14.65],
"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": [2, 2, 4, 0], "texture": "#1"},
"down": {"uv": [4, 0, 6, 2], "texture": "#1"}
}
},
{
"name": "Hat Layer",
"from": [4.1, 6, 7],
"to": [11.8, 13.6, 14.675],
"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": [10, 2, 12, 0], "texture": "#1"},
"down": {"uv": [12, 0, 14, 2], "texture": "#1"}
}
},
{
"name": "Left Arm",
"from": [5, 4, 7.08248],
"to": [6.5, 6, 13.08248],
"rotation": {"angle": -22.5, "axis": "x", "origin": [8.04619, 5, 9.15224]},
"faces": {
"north": {"uv": [9.75, 12, 10.5, 13], "rotation": 180, "texture": "#1"},
"east": {"uv": [8, 13, 9, 16], "rotation": 270, "texture": "#1"},
"south": {"uv": [9, 12, 9.75, 13], "texture": "#1"},
"west": {"uv": [9.75, 13, 10.5, 16], "rotation": 90, "texture": "#1"},
"up": {"uv": [9, 13, 9.75, 16], "rotation": 180, "texture": "#1"},
"down": {"uv": [10.5, 13, 11.5, 16], "texture": "#1"}
}
},
{
"name": "Left Arm Layer",
"from": [4.9004, 3.9, 6.98248],
"to": [6.6004, 6.1, 13.18248],
"rotation": {"angle": -22.5, "axis": "x", "origin": [7.89619, 5, 9.15224]},
"faces": {
"north": {"uv": [13.75, 12, 14.5, 13], "rotation": 180, "texture": "#1"},
"east": {"uv": [12, 13, 13, 16], "rotation": 270, "texture": "#1"},
"south": {"uv": [13, 12, 13.75, 13], "texture": "#1"},
"west": {"uv": [13.75, 13, 14.5, 16], "rotation": 90, "texture": "#1"},
"up": {"uv": [13, 13, 13.75, 16], "rotation": 180, "texture": "#1"},
"down": {"uv": [14.5, 13, 15.5, 16], "texture": "#1"}
}
},
{
"name": "RightArm",
"from": [9.6, 4.34246, 6.979],
"to": [11.1, 6.34246, 12.979],
"rotation": {"angle": -22.5, "axis": "x", "origin": [10.25663, 5.34246, 9.979]},
"faces": {
"north": {"uv": [11.75, 4, 12.5, 5], "rotation": 180, "texture": "#1"},
"east": {"uv": [10, 5, 11, 8], "rotation": 270, "texture": "#1"},
"south": {"uv": [11, 4, 11.75, 5], "texture": "#1"},
"west": {"uv": [11.75, 5, 12.5, 8], "rotation": 90, "texture": "#1"},
"up": {"uv": [11, 5, 11.75, 8], "rotation": 180, "texture": "#1"},
"down": {"uv": [12.5, 5, 13.5, 8], "texture": "#1"}
}
},
{
"name": "Right Arm Layer",
"from": [9.50663, 4.24246, 6.879],
"to": [11.20663, 6.44246, 13.079],
"rotation": {"angle": -22.5, "axis": "x", "origin": [10.30663, 5.34246, 9.979]},
"faces": {
"north": {"uv": [11.75, 8, 12.5, 9], "rotation": 180, "texture": "#1"},
"east": {"uv": [10, 9, 11, 12], "rotation": 270, "texture": "#1"},
"south": {"uv": [11, 8, 11.75, 9], "texture": "#1"},
"west": {"uv": [11.75, 9, 12.5, 12], "rotation": 90, "texture": "#1"},
"up": {"uv": [11, 9, 11.75, 12], "rotation": 180, "texture": "#1"},
"down": {"uv": [12.5, 9, 13.5, 12], "texture": "#1"}
}
},
{
"name": "Totem",
"from": [6.5, 3, 7],
"to": [9.7, 6.2, 7.1],
"faces": {
"north": {"uv": [0, 0, 16, 16], "texture": "#2"},
"south": {"uv": [16, 0, 0, 16], "texture": "#2"}
}
},
{
"name": "Left Leg",
"from": [8, -0.1, 4],
"to": [10, 1.9, 10],
"rotation": {"angle": -22.5, "axis": "y", "origin": [8, 0, 11]},
"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.9, -0.2, 3.9],
"to": [10.1, 2, 10.1],
"rotation": {"angle": -22.5, "axis": "y", "origin": [8, 0, 11]},
"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": [6, -0.1, 4],
"to": [8, 1.9, 10],
"rotation": {"angle": 22.5, "axis": "y", "origin": [8, 0, 11]},
"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.9, -0.2, 3.9],
"to": [8.1, 2, 10.1],
"rotation": {"angle": 22.5, "axis": "y", "origin": [8, 0, 11]},
"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, 9.6],
"to": [10.4, 6, 12.4],
"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.1, 9.5],
"to": [10.5, 6.1, 12.5],
"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": [1, 1, 16],
"scale": [0.55, 0.55, 0.55]
},
"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.25, 0],
"scale": [0.5, 0.5, 0.5]
},
"gui": {
"rotation": [15, 150, 0],
"translation": [0, 0.5, 0],
"scale": [0.9, 0.9, 0.9]
},
"head": {
"translation": [11, 2, -1.25]
},
"fixed": {
"translation": [0, 0, -3.5]
}
}
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,222 @@
{
"format_version": "1.21.6",
"credit": "Made with _leng",
"texture_size": [32, 32],
"render_type": "translucent",
"textures": {
"0": "extendedae_plus:block/xbai",
"particle": "extendedae_plus:block/xbai"
},
"elements": [
{
"name": "Head",
"from": [4.35, 6, 7.25],
"to": [11.65, 13.3, 14.55],
"faces": {
"north": {"uv": [1, 1, 2, 2], "texture": "#0"},
"east": {"uv": [0, 1, 1, 2], "texture": "#0"},
"south": {"uv": [3, 1, 4, 2], "texture": "#0"},
"west": {"uv": [2, 1, 3, 2], "texture": "#0"},
"up": {"uv": [1, 1, 2, 0], "texture": "#0"},
"down": {"uv": [2, 0, 3, 1], "texture": "#0"}
}
},
{
"name": "Hat Layer",
"from": [4.1, 6, 7],
"to": [11.8, 13.6, 14.6],
"faces": {
"north": {"uv": [5, 1, 6, 2], "texture": "#0"},
"east": {"uv": [4, 1, 5, 2], "texture": "#0"},
"south": {"uv": [7, 1, 8, 2], "texture": "#0"},
"west": {"uv": [6, 1, 7, 2], "texture": "#0"},
"up": {"uv": [5, 1, 6, 0], "texture": "#0"},
"down": {"uv": [6, 0, 7, 1], "texture": "#0"}
}
},
{
"name": "Left Arm",
"from": [5.1, 4, 7.08248],
"to": [6.6, 6, 13.08248],
"rotation": {"angle": -22.5, "axis": "x", "origin": [8.04619, 5, 9.15224]},
"faces": {
"north": {"uv": [5, 6, 5.5, 6.5], "rotation": 180, "texture": "#0"},
"east": {"uv": [4, 6.5, 4.5, 8], "rotation": 270, "texture": "#0"},
"south": {"uv": [4.5, 6, 5, 6.5], "texture": "#0"},
"west": {"uv": [5, 6.5, 5.5, 8], "rotation": 90, "texture": "#0"},
"up": {"uv": [4.5, 6.5, 5, 8], "rotation": 180, "texture": "#0"},
"down": {"uv": [5.5, 6.5, 6, 8], "texture": "#0"}
}
},
{
"name": "Left Arm Layer",
"from": [5.0504, 3.9, 6.98248],
"to": [6.7504, 6.1, 13.18248],
"rotation": {"angle": -22.5, "axis": "x", "origin": [8.04619, 5, 9.15224]},
"faces": {
"north": {"uv": [7, 6, 7.5, 6.5], "rotation": 180, "texture": "#0"},
"east": {"uv": [6, 6.5, 6.5, 8], "rotation": 270, "texture": "#0"},
"south": {"uv": [6.875, 6, 6.5, 6.5], "texture": "#0"},
"west": {"uv": [7, 6.5, 7.5, 8], "rotation": 90, "texture": "#0"},
"up": {"uv": [6.5, 6.5, 6.875, 8], "rotation": 180, "texture": "#0"},
"down": {"uv": [7.5, 6.5, 7.875, 8], "texture": "#0"}
}
},
{
"name": "RightArm",
"from": [9.6, 4.34246, 6.979],
"to": [11.1, 6.34246, 12.979],
"rotation": {"angle": -22.5, "axis": "x", "origin": [10.25663, 5.34246, 9.979]},
"faces": {
"north": {"uv": [6, 2, 6.5, 2.5], "rotation": 180, "texture": "#0"},
"east": {"uv": [5, 2.5, 5.5, 4], "rotation": 270, "texture": "#0"},
"south": {"uv": [5.5, 2, 6, 2.5], "texture": "#0"},
"west": {"uv": [6, 2.5, 6.5, 4], "rotation": 90, "texture": "#0"},
"up": {"uv": [5.5, 2.5, 6, 4], "rotation": 180, "texture": "#0"},
"down": {"uv": [6.5, 2.5, 7, 4], "texture": "#0"}
}
},
{
"name": "Right Arm Layer",
"from": [9.45663, 4.24246, 6.879],
"to": [11.15663, 6.44246, 13.079],
"rotation": {"angle": -22.5, "axis": "x", "origin": [10.25663, 5.34246, 9.979]},
"faces": {
"north": {"uv": [5.875, 4, 6.25, 4.5], "rotation": 180, "texture": "#0"},
"east": {"uv": [5, 4.5, 5.5, 6], "rotation": 270, "texture": "#0"},
"south": {"uv": [5.875, 4, 5.5, 4.5], "texture": "#0"},
"west": {"uv": [5.875, 4.5, 6.25, 6], "rotation": 90, "texture": "#0"},
"up": {"uv": [5.5, 4.5, 5.875, 6], "rotation": 180, "texture": "#0"},
"down": {"uv": [6.375, 4.5, 6.75, 6], "texture": "#0"}
}
},
{
"name": "Totem",
"from": [6.5, 3, 7],
"to": [9.7, 6.2, 7.1],
"faces": {
"north": {"uv": [7, 2, 9, 4], "texture": "#0"},
"south": {"uv": [9, 2, 7, 4], "texture": "#0"}
}
},
{
"name": "Left Leg",
"from": [8, -0.1, 4],
"to": [10, 1.9, 10],
"rotation": {"angle": -22.5, "axis": "y", "origin": [8, 0, 11]},
"faces": {
"north": {"uv": [1, 2, 1.5, 2.5], "texture": "#0"},
"east": {"uv": [0, 4, 0.5, 2.5], "rotation": 90, "texture": "#0"},
"south": {"uv": [0.5, 2, 1, 2.5], "texture": "#0"},
"west": {"uv": [1, 2.5, 1.5, 4], "rotation": 90, "texture": "#0"},
"up": {"uv": [1, 4, 0.5, 2.5], "texture": "#0"},
"down": {"uv": [1.5, 2.5, 2, 4], "texture": "#0"}
}
},
{
"name": "Left Leg Layer",
"from": [7.9, -0.2, 3.9],
"to": [10.1, 2, 10.1],
"rotation": {"angle": -22.5, "axis": "y", "origin": [8, 0, 11]},
"faces": {
"north": {"uv": [1, 4, 1.5, 4.5], "texture": "#0"},
"east": {"uv": [0, 6, 0.5, 4.5], "rotation": 90, "texture": "#0"},
"south": {"uv": [0.5, 4, 1, 4.5], "texture": "#0"},
"west": {"uv": [1, 4.5, 1.5, 6], "rotation": 90, "texture": "#0"},
"up": {"uv": [1, 6, 0.5, 4.5], "texture": "#0"},
"down": {"uv": [1.5, 4.5, 2, 6], "texture": "#0"}
}
},
{
"name": "Right Leg",
"from": [6, -0.1, 4],
"to": [8, 1.9, 10],
"rotation": {"angle": 22.5, "axis": "y", "origin": [8, 0, 11]},
"faces": {
"north": {"uv": [3, 6, 3.5, 6.5], "texture": "#0"},
"east": {"uv": [2, 8, 2.5, 6.5], "rotation": 90, "texture": "#0"},
"south": {"uv": [2.5, 6, 3, 6.5], "texture": "#0"},
"west": {"uv": [3, 6.5, 3.5, 8], "rotation": 90, "texture": "#0"},
"up": {"uv": [3, 8, 2.5, 6.5], "texture": "#0"},
"down": {"uv": [3.5, 6.5, 4, 8], "texture": "#0"}
}
},
{
"name": "Right Leg Layer",
"from": [5.9, -0.2, 3.9],
"to": [8.1, 2, 10.1],
"rotation": {"angle": 22.5, "axis": "y", "origin": [8, 0, 11]},
"faces": {
"north": {"uv": [1, 6, 1.5, 6.5], "texture": "#0"},
"east": {"uv": [0, 8, 0.5, 6.5], "rotation": 90, "texture": "#0"},
"south": {"uv": [0.5, 6, 1, 6.5], "texture": "#0"},
"west": {"uv": [1, 6.5, 1.5, 8], "rotation": 90, "texture": "#0"},
"up": {"uv": [1, 8, 0.5, 6.5], "texture": "#0"},
"down": {"uv": [1.5, 6.5, 2, 8], "texture": "#0"}
}
},
{
"name": "Body",
"from": [5.6, 0, 9.6],
"to": [10.4, 6, 12.4],
"faces": {
"north": {"uv": [2.5, 2.5, 3.5, 4], "texture": "#0"},
"east": {"uv": [2, 2.5, 2.5, 4], "texture": "#0"},
"south": {"uv": [4, 2.5, 5, 4], "texture": "#0"},
"west": {"uv": [3.5, 2.5, 4, 4], "texture": "#0"},
"up": {"uv": [2.5, 2.5, 3.5, 2], "texture": "#0"},
"down": {"uv": [3.5, 2.5, 4.5, 2], "texture": "#0"}
}
},
{
"name": "Body Layer",
"from": [5.5, -0.1, 9.5],
"to": [10.5, 6.1, 12.5],
"faces": {
"north": {"uv": [2.5, 4.5, 3.5, 6], "texture": "#0"},
"east": {"uv": [2, 4.5, 2.5, 6], "texture": "#0"},
"south": {"uv": [4, 4.5, 5, 6], "texture": "#0"},
"west": {"uv": [3.5, 4.5, 4, 6], "texture": "#0"},
"up": {"uv": [2.5, 4.5, 3.5, 4], "texture": "#0"},
"down": {"uv": [3.5, 4.5, 4.5, 4], "texture": "#0"}
}
}
],
"display": {
"thirdperson_righthand": {
"rotation": [60, 0, 0],
"translation": [0.25, 4.25, 1.25],
"scale": [0.8, 0.8, 0.8]
},
"thirdperson_lefthand": {
"rotation": [60, 0, 0],
"translation": [0.25, 4.25, 1.25],
"scale": [0.8, 0.8, 0.8]
},
"firstperson_righthand": {
"rotation": [0, 120, 0],
"translation": [0.75, 3.5, 0],
"scale": [0.5, 0.5, 0.5]
},
"firstperson_lefthand": {
"rotation": [0, 123, 0],
"translation": [1, 3.5, 0],
"scale": [0.5, 0.5, 0.5]
},
"ground": {
"translation": [0, 5, 0],
"scale": [0.8, 0.8, 0.8]
},
"gui": {
"rotation": [15, 150, 0],
"translation": [-0.25, 0.5, 0],
"scale": [0.8, 0.8, 0.8]
},
"head": {
"translation": [11, 0.75, -2.25]
},
"fixed": {
"translation": [0, 0, -3.5]
}
}
}

View File

@ -0,0 +1,3 @@
{
"parent": "extendedae_plus:block/_feng"
}

View File

@ -0,0 +1,3 @@
{
"parent": "extendedae_plus:item/iava_skin_doll"
}

View File

@ -0,0 +1,3 @@
{
"parent": "extendedae_plus:block/fish_dan_"
}

View File

@ -0,0 +1,221 @@
{
"format_version": "1.21.6",
"credit": "Made with _leng",
"render_type": "cutout",
"textures": {
"1": "extendedae_plus:block/iava_user",
"2": "extendedae_plus:block/infinity_biginteger_cell"
},
"elements": [
{
"name": "Head",
"from": [4.35, 6, 7.35],
"to": [11.65, 13.3, 14.65],
"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": [2, 2, 4, 0], "texture": "#1"},
"down": {"uv": [4, 0, 6, 2], "texture": "#1"}
}
},
{
"name": "Hat Layer",
"from": [4.1, 6, 7],
"to": [11.8, 13.6, 14.675],
"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": [10, 2, 12, 0], "texture": "#1"},
"down": {"uv": [12, 0, 14, 2], "texture": "#1"}
}
},
{
"name": "Left Arm",
"from": [5, 4, 7.08248],
"to": [6.5, 6, 13.08248],
"rotation": {"angle": -22.5, "axis": "x", "origin": [8.04619, 5, 9.15224]},
"faces": {
"north": {"uv": [9.75, 12, 10.5, 13], "rotation": 180, "texture": "#1"},
"east": {"uv": [8, 13, 9, 16], "rotation": 270, "texture": "#1"},
"south": {"uv": [9, 12, 9.75, 13], "texture": "#1"},
"west": {"uv": [9.75, 13, 10.5, 16], "rotation": 90, "texture": "#1"},
"up": {"uv": [9, 13, 9.75, 16], "rotation": 180, "texture": "#1"},
"down": {"uv": [10.5, 13, 11.5, 16], "texture": "#1"}
}
},
{
"name": "Left Arm Layer",
"from": [4.9004, 3.9, 6.98248],
"to": [6.6004, 6.1, 13.18248],
"rotation": {"angle": -22.5, "axis": "x", "origin": [7.89619, 5, 9.15224]},
"faces": {
"north": {"uv": [13.75, 12, 14.5, 13], "rotation": 180, "texture": "#1"},
"east": {"uv": [12, 13, 13, 16], "rotation": 270, "texture": "#1"},
"south": {"uv": [13, 12, 13.75, 13], "texture": "#1"},
"west": {"uv": [13.75, 13, 14.5, 16], "rotation": 90, "texture": "#1"},
"up": {"uv": [13, 13, 13.75, 16], "rotation": 180, "texture": "#1"},
"down": {"uv": [14.5, 13, 15.5, 16], "texture": "#1"}
}
},
{
"name": "RightArm",
"from": [9.6, 4.34246, 6.979],
"to": [11.1, 6.34246, 12.979],
"rotation": {"angle": -22.5, "axis": "x", "origin": [10.25663, 5.34246, 9.979]},
"faces": {
"north": {"uv": [11.75, 4, 12.5, 5], "rotation": 180, "texture": "#1"},
"east": {"uv": [10, 5, 11, 8], "rotation": 270, "texture": "#1"},
"south": {"uv": [11, 4, 11.75, 5], "texture": "#1"},
"west": {"uv": [11.75, 5, 12.5, 8], "rotation": 90, "texture": "#1"},
"up": {"uv": [11, 5, 11.75, 8], "rotation": 180, "texture": "#1"},
"down": {"uv": [12.5, 5, 13.5, 8], "texture": "#1"}
}
},
{
"name": "Right Arm Layer",
"from": [9.50663, 4.24246, 6.879],
"to": [11.20663, 6.44246, 13.079],
"rotation": {"angle": -22.5, "axis": "x", "origin": [10.30663, 5.34246, 9.979]},
"faces": {
"north": {"uv": [11.75, 8, 12.5, 9], "rotation": 180, "texture": "#1"},
"east": {"uv": [10, 9, 11, 12], "rotation": 270, "texture": "#1"},
"south": {"uv": [11, 8, 11.75, 9], "texture": "#1"},
"west": {"uv": [11.75, 9, 12.5, 12], "rotation": 90, "texture": "#1"},
"up": {"uv": [11, 9, 11.75, 12], "rotation": 180, "texture": "#1"},
"down": {"uv": [12.5, 9, 13.5, 12], "texture": "#1"}
}
},
{
"name": "Totem",
"from": [6.5, 3, 7],
"to": [9.7, 6.2, 7.1],
"faces": {
"north": {"uv": [0, 0, 16, 16], "texture": "#2"},
"south": {"uv": [16, 0, 0, 16], "texture": "#2"}
}
},
{
"name": "Left Leg",
"from": [8, -0.1, 4],
"to": [10, 1.9, 10],
"rotation": {"angle": -22.5, "axis": "y", "origin": [8, 0, 11]},
"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.9, -0.2, 3.9],
"to": [10.1, 2, 10.1],
"rotation": {"angle": -22.5, "axis": "y", "origin": [8, 0, 11]},
"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": [6, -0.1, 4],
"to": [8, 1.9, 10],
"rotation": {"angle": 22.5, "axis": "y", "origin": [8, 0, 11]},
"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.9, -0.2, 3.9],
"to": [8.1, 2, 10.1],
"rotation": {"angle": 22.5, "axis": "y", "origin": [8, 0, 11]},
"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, 9.6],
"to": [10.4, 6, 12.4],
"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.1, 9.5],
"to": [10.5, 6.1, 12.5],
"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.8, 0.8, 0.8]
},
"thirdperson_lefthand": {
"rotation": [67.5, 0, 0],
"translation": [1.25, 1.25, 16],
"scale": [0.6, 0.6, 0.6]
},
"firstperson_righthand": {
"rotation": [0, 120, 0],
"translation": [0.75, 3.5, 0],
"scale": [0.5, 0.5, 0.5]
},
"firstperson_lefthand": {
"rotation": [0, 123, 0],
"translation": [1, 3.5, 0],
"scale": [0.5, 0.5, 0.5]
},
"ground": {
"translation": [0, 3.5, 0],
"scale": [0.8, 0.8, 0.8]
},
"gui": {
"rotation": [15, 150, 0],
"translation": [-0.25, 0.5, 0],
"scale": [0.8, 0.8, 0.8]
},
"head": {
"translation": [11, 0.75, -2.25]
},
"fixed": {
"translation": [0, 0, -3.5]
}
}
}

View File

@ -0,0 +1,3 @@
{
"parent": "extendedae_plus:block/xbai"
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 904 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 439 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

View File

@ -0,0 +1,19 @@
{
"type": "minecraft:block",
"pools": [
{
"rolls": 1,
"entries": [
{
"type": "minecraft:item",
"name": "extendedae_plus:_feng"
}
],
"conditions": [
{
"condition": "minecraft:survives_explosion"
}
]
}
]
}

View File

@ -0,0 +1,19 @@
{
"type": "minecraft:block",
"pools": [
{
"rolls": 1,
"entries": [
{
"type": "minecraft:item",
"name": "extendedae_plus:c-h716"
}
],
"conditions": [
{
"condition": "minecraft:survives_explosion"
}
]
}
]
}

View File

@ -0,0 +1,19 @@
{
"type": "minecraft:block",
"pools": [
{
"rolls": 1,
"entries": [
{
"type": "minecraft:item",
"name": "extendedae_plus:fish_dan_"
}
],
"conditions": [
{
"condition": "minecraft:survives_explosion"
}
]
}
]
}

View File

@ -0,0 +1,19 @@
{
"type": "minecraft:block",
"pools": [
{
"rolls": 1,
"entries": [
{
"type": "minecraft:item",
"name": "extendedae_plus:xbai"
}
],
"conditions": [
{
"condition": "minecraft:survives_explosion"
}
]
}
]
}