基本实现
This commit is contained in:
parent
044a0c39f7
commit
f6a86ad4ac
|
|
@ -56,7 +56,9 @@ public class LabeledWirelessTransceiverScreen extends AbstractContainerScreen<La
|
|||
private int selectedIndex = -1;
|
||||
private String lastSelectedLabel = "";
|
||||
private String currentLabel = "";
|
||||
private long currentChannel = 0L;
|
||||
private String currentOwner = "";
|
||||
private int usedChannels = 0;
|
||||
private int maxChannels = 0;
|
||||
|
||||
public LabeledWirelessTransceiverScreen(LabeledWirelessTransceiverMenu menu, Inventory inv, Component title) {
|
||||
super(menu, inv, title);
|
||||
|
|
@ -202,9 +204,13 @@ public class LabeledWirelessTransceiverScreen extends AbstractContainerScreen<La
|
|||
int infoX = this.leftPos + 124;
|
||||
int infoY = this.topPos + 36;
|
||||
String labelLine = Component.translatable("gui.extendedae_plus.labeled_wireless.current_label").getString() + ": " + (currentLabel == null || currentLabel.isEmpty() ? "-" : currentLabel);
|
||||
String channelLine = Component.translatable("gui.extendedae_plus.labeled_wireless.current_channel").getString() + ": " + currentChannel;
|
||||
String ownerLine = Component.translatable("gui.extendedae_plus.labeled_wireless.current_owner").getString() + ": " + (currentOwner == null || currentOwner.isEmpty() ? Component.translatable("extendedae_plus.jade.owner.public").getString() : currentOwner);
|
||||
Component channelComp = maxChannels <= 0
|
||||
? Component.translatable("extendedae_plus.jade.channels", usedChannels)
|
||||
: Component.translatable("extendedae_plus.jade.channels_of", usedChannels, maxChannels);
|
||||
gfx.drawString(this.font, labelLine, infoX, infoY, 0x404040, false);
|
||||
gfx.drawString(this.font, channelLine, infoX, infoY + 12, 0x404040, false);
|
||||
gfx.drawString(this.font, ownerLine, infoX, infoY + 12, 0x404040, false);
|
||||
gfx.drawString(this.font, channelComp, infoX, infoY + 24, 0x404040, false);
|
||||
}
|
||||
|
||||
private void renderScrollBar(GuiGraphics gfx) {
|
||||
|
|
@ -308,14 +314,16 @@ public class LabeledWirelessTransceiverScreen extends AbstractContainerScreen<La
|
|||
return "";
|
||||
}
|
||||
|
||||
public void updateList(List<LabelNetworkRegistry.LabelNetworkSnapshot> list, String currentLabel, long currentChannel) {
|
||||
public void updateList(List<LabelNetworkRegistry.LabelNetworkSnapshot> list, String currentLabel, String ownerName, int usedChannels, int maxChannels) {
|
||||
String prevSelected = getSelectedLabel();
|
||||
this.entries.clear();
|
||||
for (LabelNetworkRegistry.LabelNetworkSnapshot s : list) {
|
||||
this.entries.add(new LabelEntry(s.label(), s.channel()));
|
||||
}
|
||||
this.currentLabel = currentLabel == null ? "" : currentLabel;
|
||||
this.currentChannel = currentChannel;
|
||||
this.currentOwner = ownerName == null ? "" : ownerName;
|
||||
this.usedChannels = usedChannels;
|
||||
this.maxChannels = maxChannels;
|
||||
if (prevSelected != null && !prevSelected.isEmpty()) {
|
||||
this.lastSelectedLabel = prevSelected;
|
||||
} else if (this.currentLabel != null && !this.currentLabel.isEmpty()) {
|
||||
|
|
|
|||
|
|
@ -79,18 +79,6 @@ public class LabeledWirelessTransceiverBlock extends Block implements EntityBloc
|
|||
super.onRemove(state, level, pos, newState, isMoving);
|
||||
}
|
||||
|
||||
@Override
|
||||
public float getDestroyProgress(BlockState state, Player player, BlockGetter level, BlockPos pos) {
|
||||
// 与旧收发器保持一致:锁定时降低挖掘速度
|
||||
float baseProgress = super.getDestroyProgress(state, player, level, pos);
|
||||
if (level.getBlockEntity(pos) instanceof LabeledWirelessTransceiverBlockEntity te) {
|
||||
if (te.isLocked()) {
|
||||
return baseProgress * 0.1f;
|
||||
}
|
||||
}
|
||||
return baseProgress;
|
||||
}
|
||||
|
||||
@Override
|
||||
public <T extends BlockEntity> BlockEntityTicker<T> getTicker(Level level, BlockState state, BlockEntityType<T> type) {
|
||||
if (level.isClientSide) return null;
|
||||
|
|
|
|||
|
|
@ -44,7 +44,6 @@ public class LabeledWirelessTransceiverBlockEntity extends AEBaseBlockEntity imp
|
|||
private long frequency = 0L;
|
||||
@Nullable
|
||||
private String labelForDisplay;
|
||||
private boolean locked = false;
|
||||
private boolean beingRemoved = false;
|
||||
|
||||
@Nullable
|
||||
|
|
@ -131,16 +130,6 @@ public class LabeledWirelessTransceiverBlockEntity extends AEBaseBlockEntity imp
|
|||
return labelForDisplay;
|
||||
}
|
||||
|
||||
public boolean isLocked() {
|
||||
return locked;
|
||||
}
|
||||
|
||||
public void setLocked(boolean locked) {
|
||||
if (this.locked == locked) return;
|
||||
this.locked = locked;
|
||||
setChanged();
|
||||
}
|
||||
|
||||
/**
|
||||
* 应用/切换标签。空或非法标签将清空并断开。
|
||||
*/
|
||||
|
|
@ -290,7 +279,6 @@ public class LabeledWirelessTransceiverBlockEntity extends AEBaseBlockEntity imp
|
|||
public void saveAdditional(CompoundTag tag) {
|
||||
super.saveAdditional(tag);
|
||||
tag.putLong("frequency", frequency);
|
||||
tag.putBoolean("locked", locked);
|
||||
if (labelForDisplay != null) {
|
||||
tag.putString("label", labelForDisplay);
|
||||
}
|
||||
|
|
@ -309,7 +297,6 @@ public class LabeledWirelessTransceiverBlockEntity extends AEBaseBlockEntity imp
|
|||
public void loadTag(CompoundTag tag) {
|
||||
super.loadTag(tag);
|
||||
this.frequency = tag.getLong("frequency");
|
||||
this.locked = tag.getBoolean("locked");
|
||||
if (tag.contains("label")) {
|
||||
this.labelForDisplay = tag.getString("label");
|
||||
} else {
|
||||
|
|
|
|||
|
|
@ -12,10 +12,30 @@ public enum LabeledWirelessTransceiverComponents implements IBlockComponentProvi
|
|||
@Override
|
||||
protected void add(BlockAccessor accessor, ITooltip tooltip, IPluginConfig config, net.minecraft.nbt.CompoundTag data) {
|
||||
String label = data.contains("label") ? data.getString("label") : "";
|
||||
long channel = data.contains("channel") ? data.getLong("channel") : 0L;
|
||||
tooltip.add(Component.translatable("extendedae_plus.jade.label", label.isEmpty() ? "-" : label));
|
||||
tooltip.add(Component.translatable("extendedae_plus.jade.frequency", channel));
|
||||
|
||||
// 所有者
|
||||
if (data.contains("ownerName")) {
|
||||
tooltip.add(Component.translatable("extendedae_plus.jade.owner", data.getString("ownerName")));
|
||||
} else if (data.contains("placerId")) {
|
||||
java.util.UUID placerId = data.getUUID("placerId");
|
||||
tooltip.add(Component.translatable("extendedae_plus.jade.owner", placerId.toString().substring(0, 8) + "..."));
|
||||
} else {
|
||||
tooltip.add(Component.translatable("extendedae_plus.jade.owner.public"));
|
||||
}
|
||||
|
||||
// 频道占用
|
||||
if (data.contains("usedChannels") && data.contains("maxChannels")) {
|
||||
int used = data.getInt("usedChannels");
|
||||
int max = data.getInt("maxChannels");
|
||||
if (max <= 0) {
|
||||
tooltip.add(Component.translatable("extendedae_plus.jade.channels", used));
|
||||
} else {
|
||||
tooltip.add(Component.translatable("extendedae_plus.jade.channels_of", used, max));
|
||||
}
|
||||
}
|
||||
|
||||
// 网络在线
|
||||
if (data.contains("networkUsable")) {
|
||||
boolean online = data.getBoolean("networkUsable");
|
||||
tooltip.add(Component.translatable(online ? "extendedae_plus.jade.online" : "extendedae_plus.jade.offline"));
|
||||
|
|
|
|||
|
|
@ -3,14 +3,14 @@ package com.extendedae_plus.integration.jade;
|
|||
import appeng.api.networking.IGrid;
|
||||
import appeng.api.networking.IGridNode;
|
||||
import com.extendedae_plus.content.wireless.LabeledWirelessTransceiverBlockEntity;
|
||||
import com.extendedae_plus.util.wireless.WirelessTeamUtil;
|
||||
import net.minecraft.nbt.CompoundTag;
|
||||
import net.minecraft.resources.ResourceLocation;
|
||||
import snownee.jade.api.BlockAccessor;
|
||||
import snownee.jade.api.IServerDataProvider;
|
||||
|
||||
/**
|
||||
* 标签无线收发器:服务端数据同步。
|
||||
* 仅包含标签名、频道、网络在线状态。
|
||||
* 标签无线收发器:服务端数据同步(无主从)。
|
||||
*/
|
||||
public enum LabeledWirelessTransceiverProvider implements IServerDataProvider<BlockAccessor> {
|
||||
INSTANCE;
|
||||
|
|
@ -29,11 +29,31 @@ public enum LabeledWirelessTransceiverProvider implements IServerDataProvider<Bl
|
|||
if (label != null) {
|
||||
data.putString("label", label);
|
||||
}
|
||||
data.putLong("channel", be.getFrequency());
|
||||
// 所有者
|
||||
var placerId = be.getPlacerId();
|
||||
if (placerId != null && be.getServerLevel() != null) {
|
||||
data.putUUID("placerId", placerId);
|
||||
data.putString("ownerName", WirelessTeamUtil.getNetworkOwnerName(be.getServerLevel(), placerId).getString());
|
||||
}
|
||||
|
||||
IGridNode node = be.getGridNode();
|
||||
IGrid grid = node == null ? null : node.getGrid();
|
||||
boolean networkUsable = false;
|
||||
int usedChannels = 0;
|
||||
int maxChannels = 0;
|
||||
if (node != null && node.isActive()) {
|
||||
for (var connection : node.getConnections()) {
|
||||
usedChannels = Math.max(connection.getUsedChannels(), usedChannels);
|
||||
}
|
||||
if (node instanceof appeng.me.GridNode gridNode) {
|
||||
var channelMode = gridNode.getGrid().getPathingService().getChannelMode();
|
||||
if (channelMode == appeng.api.networking.pathing.ChannelMode.INFINITE) {
|
||||
maxChannels = -1;
|
||||
} else {
|
||||
maxChannels = gridNode.getMaxChannels();
|
||||
}
|
||||
}
|
||||
}
|
||||
if (grid != null) {
|
||||
try {
|
||||
networkUsable = grid.getEnergyService().isNetworkPowered();
|
||||
|
|
@ -41,6 +61,8 @@ public enum LabeledWirelessTransceiverProvider implements IServerDataProvider<Bl
|
|||
networkUsable = false;
|
||||
}
|
||||
}
|
||||
data.putInt("usedChannels", usedChannels);
|
||||
data.putInt("maxChannels", maxChannels);
|
||||
data.putBoolean("networkUsable", networkUsable);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2,6 +2,7 @@ package com.extendedae_plus.network;
|
|||
|
||||
import com.extendedae_plus.ae.wireless.LabelNetworkRegistry;
|
||||
import com.extendedae_plus.content.wireless.LabeledWirelessTransceiverBlockEntity;
|
||||
import com.extendedae_plus.util.wireless.WirelessTeamUtil;
|
||||
import net.minecraft.core.BlockPos;
|
||||
import net.minecraft.network.FriendlyByteBuf;
|
||||
import net.minecraft.server.level.ServerPlayer;
|
||||
|
|
@ -39,8 +40,27 @@ public class LabelNetworkListC2SPacket {
|
|||
|
||||
var list = LabelNetworkRegistry.get(level).listNetworks(level, te.getPlacerId());
|
||||
String currentLabel = te.getLabelForDisplay();
|
||||
long currentChannel = te.getFrequency();
|
||||
LabelNetworkListS2CPacket rsp = new LabelNetworkListS2CPacket(pkt.pos, list, currentLabel, currentChannel);
|
||||
String ownerName = te.getPlacerId() != null ? WirelessTeamUtil.getNetworkOwnerName(level, te.getPlacerId()).getString() : "";
|
||||
|
||||
// 计算频道占用信息(与 Jade 显示一致)
|
||||
int usedChannels = 0;
|
||||
int maxChannels = 0;
|
||||
var node = te.getGridNode();
|
||||
if (node != null && node.isActive()) {
|
||||
for (var connection : node.getConnections()) {
|
||||
usedChannels = Math.max(connection.getUsedChannels(), usedChannels);
|
||||
}
|
||||
if (node instanceof appeng.me.GridNode gridNode) {
|
||||
var channelMode = gridNode.getGrid().getPathingService().getChannelMode();
|
||||
if (channelMode == appeng.api.networking.pathing.ChannelMode.INFINITE) {
|
||||
maxChannels = -1;
|
||||
} else {
|
||||
maxChannels = gridNode.getMaxChannels();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
LabelNetworkListS2CPacket rsp = new LabelNetworkListS2CPacket(pkt.pos, list, currentLabel, ownerName, usedChannels, maxChannels);
|
||||
com.extendedae_plus.init.ModNetwork.CHANNEL.send(PacketDistributor.PLAYER.with(() -> player), rsp);
|
||||
});
|
||||
ctx.get().setPacketHandled(true);
|
||||
|
|
|
|||
|
|
@ -20,19 +20,25 @@ public class LabelNetworkListS2CPacket {
|
|||
private final BlockPos pos;
|
||||
private final List<LabelNetworkRegistry.LabelNetworkSnapshot> list;
|
||||
private final String currentLabel;
|
||||
private final long currentChannel;
|
||||
private final String ownerName;
|
||||
private final int usedChannels;
|
||||
private final int maxChannels;
|
||||
|
||||
public LabelNetworkListS2CPacket(BlockPos pos, List<LabelNetworkRegistry.LabelNetworkSnapshot> list, String currentLabel, long currentChannel) {
|
||||
public LabelNetworkListS2CPacket(BlockPos pos, List<LabelNetworkRegistry.LabelNetworkSnapshot> list, String currentLabel, String ownerName, int usedChannels, int maxChannels) {
|
||||
this.pos = pos;
|
||||
this.list = list;
|
||||
this.currentLabel = currentLabel;
|
||||
this.currentChannel = currentChannel;
|
||||
this.ownerName = ownerName;
|
||||
this.usedChannels = usedChannels;
|
||||
this.maxChannels = maxChannels;
|
||||
}
|
||||
|
||||
public static void encode(LabelNetworkListS2CPacket pkt, FriendlyByteBuf buf) {
|
||||
buf.writeBlockPos(pkt.pos);
|
||||
buf.writeUtf(pkt.currentLabel == null ? "" : pkt.currentLabel, 128);
|
||||
buf.writeLong(pkt.currentChannel);
|
||||
buf.writeUtf(pkt.ownerName == null ? "" : pkt.ownerName, 128);
|
||||
buf.writeVarInt(pkt.usedChannels);
|
||||
buf.writeVarInt(pkt.maxChannels);
|
||||
buf.writeVarInt(pkt.list.size());
|
||||
for (LabelNetworkRegistry.LabelNetworkSnapshot s : pkt.list) {
|
||||
buf.writeUtf(s.label(), 128);
|
||||
|
|
@ -43,7 +49,9 @@ public class LabelNetworkListS2CPacket {
|
|||
public static LabelNetworkListS2CPacket decode(FriendlyByteBuf buf) {
|
||||
BlockPos pos = buf.readBlockPos();
|
||||
String curLabel = buf.readUtf(128);
|
||||
long curChannel = buf.readLong();
|
||||
String ownerName = buf.readUtf(128);
|
||||
int usedChannels = buf.readVarInt();
|
||||
int maxChannels = buf.readVarInt();
|
||||
int size = buf.readVarInt();
|
||||
List<LabelNetworkRegistry.LabelNetworkSnapshot> list = new ArrayList<>(size);
|
||||
for (int i = 0; i < size; i++) {
|
||||
|
|
@ -51,7 +59,7 @@ public class LabelNetworkListS2CPacket {
|
|||
long channel = buf.readLong();
|
||||
list.add(new LabelNetworkRegistry.LabelNetworkSnapshot(label, channel));
|
||||
}
|
||||
return new LabelNetworkListS2CPacket(pos, list, curLabel, curChannel);
|
||||
return new LabelNetworkListS2CPacket(pos, list, curLabel, ownerName, usedChannels, maxChannels);
|
||||
}
|
||||
|
||||
public static void handle(LabelNetworkListS2CPacket pkt, Supplier<NetworkEvent.Context> ctx) {
|
||||
|
|
@ -63,7 +71,7 @@ public class LabelNetworkListS2CPacket {
|
|||
private static void handleClient(LabelNetworkListS2CPacket pkt) {
|
||||
Minecraft mc = Minecraft.getInstance();
|
||||
if (mc.screen instanceof LabeledWirelessTransceiverScreen screen && screen.isFor(pkt.pos)) {
|
||||
screen.updateList(pkt.list, pkt.currentLabel, pkt.currentChannel);
|
||||
screen.updateList(pkt.list, pkt.currentLabel, pkt.ownerName, pkt.usedChannels, pkt.maxChannels);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -104,7 +104,7 @@
|
|||
"gui.extendedae_plus.labeled_wireless.button.set": "Set Current",
|
||||
"gui.extendedae_plus.labeled_wireless.button.refresh": "Disconnect",
|
||||
"gui.extendedae_plus.labeled_wireless.current_label": "Current Label",
|
||||
"gui.extendedae_plus.labeled_wireless.current_channel": "Current Channel",
|
||||
"gui.extendedae_plus.labeled_wireless.current_owner": "Owner",
|
||||
|
||||
"extendedae_plus.screen.reload_mapping": "Reload Mapping",
|
||||
"extendedae_plus.screen.reload_mapping_success": "Overloading mapping successful",
|
||||
|
|
|
|||
|
|
@ -103,7 +103,7 @@
|
|||
"gui.extendedae_plus.labeled_wireless.button.set": "设为当前",
|
||||
"gui.extendedae_plus.labeled_wireless.button.refresh": "断开连接",
|
||||
"gui.extendedae_plus.labeled_wireless.current_label": "当前标签",
|
||||
"gui.extendedae_plus.labeled_wireless.current_channel": "当前频道",
|
||||
"gui.extendedae_plus.labeled_wireless.current_owner": "所有者",
|
||||
|
||||
"extendedae_plus.screen.reload_mapping": "重载映射",
|
||||
"extendedae_plus.screen.reload_mapping_success": "重载映射成功",
|
||||
|
|
|
|||
Binary file not shown.
|
Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 1.3 KiB |
Loading…
Reference in New Issue
Block a user