添加扳手调整无线收发器频率
This commit is contained in:
parent
7060d78e5d
commit
3fffc27b03
|
|
@ -0,0 +1,122 @@
|
||||||
|
package com.extendedae_plus.client.ui;
|
||||||
|
|
||||||
|
import com.extendedae_plus.init.ModNetwork;
|
||||||
|
import com.extendedae_plus.network.SetWirelessFrequencyC2SPacket;
|
||||||
|
import net.minecraft.client.Minecraft;
|
||||||
|
import net.minecraft.client.gui.components.Button;
|
||||||
|
import net.minecraft.client.gui.components.EditBox;
|
||||||
|
import net.minecraft.client.gui.screens.Screen;
|
||||||
|
import net.minecraft.core.BlockPos;
|
||||||
|
import net.minecraft.network.chat.Component;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 频率输入界面
|
||||||
|
* 用于通过输入框设置无线收发器的频率
|
||||||
|
*/
|
||||||
|
public class FrequencyInputScreen extends Screen {
|
||||||
|
private final BlockPos pos;
|
||||||
|
private final long currentFrequency;
|
||||||
|
private EditBox frequencyInput;
|
||||||
|
|
||||||
|
public FrequencyInputScreen(BlockPos pos, long currentFrequency) {
|
||||||
|
super(Component.translatable("extendedae_plus.screen.frequency_input.title"));
|
||||||
|
this.pos = pos;
|
||||||
|
this.currentFrequency = currentFrequency;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void init() {
|
||||||
|
int centerX = this.width / 2;
|
||||||
|
int centerY = this.height / 2;
|
||||||
|
|
||||||
|
// 频率输入框
|
||||||
|
this.frequencyInput = new EditBox(this.font, centerX - 100, centerY - 10, 200, 20,
|
||||||
|
Component.translatable("extendedae_plus.screen.frequency_input.field"));
|
||||||
|
this.frequencyInput.setValue(String.valueOf(currentFrequency));
|
||||||
|
this.frequencyInput.setMaxLength(19); // long最大值是19位
|
||||||
|
this.frequencyInput.setFilter(text -> {
|
||||||
|
// 只允许输入数字
|
||||||
|
if (text.isEmpty()) return true;
|
||||||
|
try {
|
||||||
|
Long.parseLong(text);
|
||||||
|
return true;
|
||||||
|
} catch (NumberFormatException e) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
this.addRenderableWidget(this.frequencyInput);
|
||||||
|
this.setInitialFocus(this.frequencyInput);
|
||||||
|
|
||||||
|
// 确认按钮
|
||||||
|
Button confirmButton = Button.builder(Component.translatable("extendedae_plus.screen.frequency_input.confirm"),
|
||||||
|
button -> onConfirm())
|
||||||
|
.bounds(centerX - 105, centerY + 20, 100, 20)
|
||||||
|
.build();
|
||||||
|
this.addRenderableWidget(confirmButton);
|
||||||
|
|
||||||
|
// 取消按钮
|
||||||
|
Button cancelButton = Button.builder(Component.translatable("gui.cancel"),
|
||||||
|
button -> onClose())
|
||||||
|
.bounds(centerX + 5, centerY + 20, 100, 20)
|
||||||
|
.build();
|
||||||
|
this.addRenderableWidget(cancelButton);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void onConfirm() {
|
||||||
|
try {
|
||||||
|
String text = this.frequencyInput.getValue();
|
||||||
|
if (text.isEmpty()) {
|
||||||
|
// 空值视为0
|
||||||
|
text = "0";
|
||||||
|
}
|
||||||
|
long frequency = Long.parseLong(text);
|
||||||
|
if (frequency < 0) {
|
||||||
|
frequency = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 发送数据包到服务端
|
||||||
|
ModNetwork.CHANNEL.sendToServer(new SetWirelessFrequencyC2SPacket(pos, frequency));
|
||||||
|
this.onClose();
|
||||||
|
} catch (NumberFormatException e) {
|
||||||
|
// 输入无效,不做处理
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void render(net.minecraft.client.gui.GuiGraphics guiGraphics, int mouseX, int mouseY, float partialTicks) {
|
||||||
|
this.renderBackground(guiGraphics);
|
||||||
|
super.render(guiGraphics, mouseX, mouseY, partialTicks);
|
||||||
|
|
||||||
|
// 绘制标题
|
||||||
|
guiGraphics.drawCenteredString(this.font, this.title, this.width / 2, this.height / 2 - 40, 0xFFFFFF);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isPauseScreen() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean keyPressed(int keyCode, int scanCode, int modifiers) {
|
||||||
|
// 按回车键确认
|
||||||
|
if (keyCode == 257 || keyCode == 335) { // ENTER or NUMPAD_ENTER
|
||||||
|
onConfirm();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
// 按ESC键取消
|
||||||
|
if (keyCode == 256) { // ESC
|
||||||
|
onClose();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return super.keyPressed(keyCode, scanCode, modifiers);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void tick() {
|
||||||
|
super.tick();
|
||||||
|
if (this.frequencyInput != null) {
|
||||||
|
this.frequencyInput.tick();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
@ -2,9 +2,11 @@ package com.extendedae_plus.hooks;
|
||||||
|
|
||||||
import appeng.util.InteractionUtil;
|
import appeng.util.InteractionUtil;
|
||||||
import com.extendedae_plus.ExtendedAEPlus;
|
import com.extendedae_plus.ExtendedAEPlus;
|
||||||
|
import com.extendedae_plus.client.ui.FrequencyInputScreen;
|
||||||
import com.extendedae_plus.content.wireless.WirelessTransceiverBlockEntity;
|
import com.extendedae_plus.content.wireless.WirelessTransceiverBlockEntity;
|
||||||
import appeng.block.crafting.CraftingUnitBlock;
|
import appeng.block.crafting.CraftingUnitBlock;
|
||||||
import appeng.blockentity.crafting.CraftingBlockEntity;
|
import appeng.blockentity.crafting.CraftingBlockEntity;
|
||||||
|
import net.minecraft.client.Minecraft;
|
||||||
import net.minecraft.network.chat.Component;
|
import net.minecraft.network.chat.Component;
|
||||||
import net.minecraft.sounds.SoundEvents;
|
import net.minecraft.sounds.SoundEvents;
|
||||||
import net.minecraft.sounds.SoundSource;
|
import net.minecraft.sounds.SoundSource;
|
||||||
|
|
@ -14,6 +16,8 @@ import net.minecraft.world.item.ItemStack;
|
||||||
import net.minecraft.world.level.block.Block;
|
import net.minecraft.world.level.block.Block;
|
||||||
import net.minecraft.world.level.block.entity.BlockEntity;
|
import net.minecraft.world.level.block.entity.BlockEntity;
|
||||||
import net.minecraft.world.level.block.state.BlockState;
|
import net.minecraft.world.level.block.state.BlockState;
|
||||||
|
import net.minecraftforge.api.distmarker.Dist;
|
||||||
|
import net.minecraftforge.api.distmarker.OnlyIn;
|
||||||
import net.minecraftforge.event.entity.player.PlayerInteractEvent;
|
import net.minecraftforge.event.entity.player.PlayerInteractEvent;
|
||||||
import net.minecraftforge.eventbus.api.Event;
|
import net.minecraftforge.eventbus.api.Event;
|
||||||
import net.minecraftforge.eventbus.api.SubscribeEvent;
|
import net.minecraftforge.eventbus.api.SubscribeEvent;
|
||||||
|
|
@ -86,19 +90,24 @@ public final class WrenchHook {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (!InteractionUtil.isInAlternateUseMode(player) && InteractionUtil.canWrenchRotate(stack)) {
|
} else if (!InteractionUtil.isInAlternateUseMode(player) && InteractionUtil.canWrenchRotate(stack)) {
|
||||||
// 未潜行 + 扳手:切换锁定状态
|
// 未潜行 + 扳手:打开频率输入界面
|
||||||
BlockEntity be = level.getBlockEntity(hit.getBlockPos());
|
BlockEntity be = level.getBlockEntity(hit.getBlockPos());
|
||||||
if (be instanceof WirelessTransceiverBlockEntity te) {
|
if (be instanceof WirelessTransceiverBlockEntity te) {
|
||||||
boolean newLocked = !te.isLocked();
|
if (level.isClientSide) {
|
||||||
te.setLocked(newLocked);
|
// 客户端打开GUI
|
||||||
// 提示玩家
|
openFrequencyInputScreen(hit.getBlockPos(), te.getFrequency());
|
||||||
player.displayClientMessage(Component.literal(newLocked ? "已锁定收发器" : "已解锁收发器"), true);
|
}
|
||||||
// 轻微反馈音效
|
// 轻微反馈音效
|
||||||
level.playSound(player, hit.getBlockPos(), SoundEvents.LEVER_CLICK, SoundSource.BLOCKS, 0.5F, newLocked ? 0.6F : 0.9F);
|
level.playSound(player, hit.getBlockPos(), SoundEvents.UI_BUTTON_CLICK.get(), SoundSource.BLOCKS, 0.5F, 1.0F);
|
||||||
|
|
||||||
event.setCanceled(true);
|
event.setCanceled(true);
|
||||||
event.setCancellationResult(InteractionResult.sidedSuccess(level.isClientSide));
|
event.setCancellationResult(InteractionResult.sidedSuccess(level.isClientSide));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@OnlyIn(Dist.CLIENT)
|
||||||
|
private static void openFrequencyInputScreen(net.minecraft.core.BlockPos pos, long currentFrequency) {
|
||||||
|
Minecraft.getInstance().setScreen(new FrequencyInputScreen(pos, currentFrequency));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -131,6 +131,12 @@ public class ModNetwork {
|
||||||
.decoder(ChannelCardBindPacket::decode)
|
.decoder(ChannelCardBindPacket::decode)
|
||||||
.consumerNetworkThread(ChannelCardBindPacket::handle)
|
.consumerNetworkThread(ChannelCardBindPacket::handle)
|
||||||
.add();
|
.add();
|
||||||
|
|
||||||
|
CHANNEL.messageBuilder(SetWirelessFrequencyC2SPacket.class, nextId(), NetworkDirection.PLAY_TO_SERVER)
|
||||||
|
.encoder(SetWirelessFrequencyC2SPacket::encode)
|
||||||
|
.decoder(SetWirelessFrequencyC2SPacket::decode)
|
||||||
|
.consumerNetworkThread(SetWirelessFrequencyC2SPacket::handle)
|
||||||
|
.add();
|
||||||
}
|
}
|
||||||
|
|
||||||
private static int nextId() { return id++; }
|
private static int nextId() { return id++; }
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,80 @@
|
||||||
|
package com.extendedae_plus.network;
|
||||||
|
|
||||||
|
import com.extendedae_plus.content.wireless.WirelessTransceiverBlockEntity;
|
||||||
|
import net.minecraft.core.BlockPos;
|
||||||
|
import net.minecraft.network.FriendlyByteBuf;
|
||||||
|
import net.minecraft.network.chat.Component;
|
||||||
|
import net.minecraft.server.level.ServerPlayer;
|
||||||
|
import net.minecraftforge.network.NetworkEvent;
|
||||||
|
|
||||||
|
import java.util.function.Supplier;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设置无线收发器频率的网络数据包
|
||||||
|
* 客户端发送到服务端,用于通过输入框设置频率
|
||||||
|
*/
|
||||||
|
public class SetWirelessFrequencyC2SPacket {
|
||||||
|
|
||||||
|
private final BlockPos pos;
|
||||||
|
private final long frequency;
|
||||||
|
|
||||||
|
public SetWirelessFrequencyC2SPacket(BlockPos pos, long frequency) {
|
||||||
|
this.pos = pos;
|
||||||
|
this.frequency = frequency;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void encode(SetWirelessFrequencyC2SPacket packet, FriendlyByteBuf buf) {
|
||||||
|
buf.writeBlockPos(packet.pos);
|
||||||
|
buf.writeLong(packet.frequency);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static SetWirelessFrequencyC2SPacket decode(FriendlyByteBuf buf) {
|
||||||
|
BlockPos pos = buf.readBlockPos();
|
||||||
|
long frequency = buf.readLong();
|
||||||
|
return new SetWirelessFrequencyC2SPacket(pos, frequency);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void handle(SetWirelessFrequencyC2SPacket packet, Supplier<NetworkEvent.Context> ctx) {
|
||||||
|
ctx.get().enqueueWork(() -> {
|
||||||
|
ServerPlayer player = ctx.get().getSender();
|
||||||
|
if (player == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 检查方块实体是否存在
|
||||||
|
var level = player.serverLevel();
|
||||||
|
if (!level.hasChunkAt(packet.pos)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var blockEntity = level.getBlockEntity(packet.pos);
|
||||||
|
if (!(blockEntity instanceof WirelessTransceiverBlockEntity te)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 检查是否锁定
|
||||||
|
if (te.isLocked()) {
|
||||||
|
player.displayClientMessage(
|
||||||
|
Component.literal("收发器已锁定,无法修改频道"),
|
||||||
|
true
|
||||||
|
);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 设置频率
|
||||||
|
long newFreq = packet.frequency;
|
||||||
|
if (newFreq < 0) {
|
||||||
|
newFreq = 0;
|
||||||
|
}
|
||||||
|
te.setFrequency(newFreq);
|
||||||
|
|
||||||
|
// 发送反馈消息
|
||||||
|
player.displayClientMessage(
|
||||||
|
Component.literal("频道已设置为:" + te.getFrequency()),
|
||||||
|
true
|
||||||
|
);
|
||||||
|
});
|
||||||
|
ctx.get().setPacketHandled(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
@ -114,6 +114,11 @@
|
||||||
"extendedae_plus.tooltip.owner.unset": "Owner: Unset",
|
"extendedae_plus.tooltip.owner.unset": "Owner: Unset",
|
||||||
"extendedae_plus.tooltip.owner.public": "Owner: Public",
|
"extendedae_plus.tooltip.owner.public": "Owner: Public",
|
||||||
|
|
||||||
|
"extendedae_plus.screen.frequency_input.title": "Set Frequency",
|
||||||
|
"extendedae_plus.screen.frequency_input.current": "Current Frequency: %s",
|
||||||
|
"extendedae_plus.screen.frequency_input.field": "Frequency",
|
||||||
|
"extendedae_plus.screen.frequency_input.confirm": "Confirm",
|
||||||
|
|
||||||
"group.pattern_provider.name": "Pattern Provider",
|
"group.pattern_provider.name": "Pattern Provider",
|
||||||
"group.entity_ticker.name": "Entity Accelerator",
|
"group.entity_ticker.name": "Entity Accelerator",
|
||||||
"group.storage.name": "StorageBus"
|
"group.storage.name": "StorageBus"
|
||||||
|
|
|
||||||
|
|
@ -115,6 +115,11 @@
|
||||||
"extendedae_plus.tooltip.owner.unset": "所有者: 未设置",
|
"extendedae_plus.tooltip.owner.unset": "所有者: 未设置",
|
||||||
"extendedae_plus.tooltip.owner.public": "所有者: 公共",
|
"extendedae_plus.tooltip.owner.public": "所有者: 公共",
|
||||||
|
|
||||||
|
"extendedae_plus.screen.frequency_input.title": "设置频率",
|
||||||
|
"extendedae_plus.screen.frequency_input.current": "当前频率:%s",
|
||||||
|
"extendedae_plus.screen.frequency_input.field": "频率",
|
||||||
|
"extendedae_plus.screen.frequency_input.confirm": "确认",
|
||||||
|
|
||||||
"group.pattern_provider.name": "样板供应器",
|
"group.pattern_provider.name": "样板供应器",
|
||||||
"group.entity_ticker.name": "实体加速器",
|
"group.entity_ticker.name": "实体加速器",
|
||||||
"group.storage.name": "存储总线"
|
"group.storage.name": "存储总线"
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user