From 3aea53dfb2a73dd78c4ca6ce674ddc65e444bb34 Mon Sep 17 00:00:00 2001 From: Unknown Date: Mon, 29 Apr 2019 23:06:05 +0800 Subject: Server Support --- .../me/shedaniel/rei/RoughlyEnoughItemsCore.java | 15 ++++++++++++- .../shedaniel/rei/RoughlyEnoughItemsNetwork.java | 22 +++++-------------- .../java/me/shedaniel/rei/client/ClientHelper.java | 2 +- .../shedaniel/rei/gui/ContainerScreenOverlay.java | 16 ++++++++++---- .../shedaniel/rei/gui/widget/ItemListOverlay.java | 6 +++--- .../shedaniel/rei/mixin/MixinClientConnection.java | 25 ---------------------- .../rei/mixin/MixinClientPlayNetworkHandler.java | 19 ---------------- .../me/shedaniel/rei/mixin/MixinPlayerManager.java | 21 ------------------ 8 files changed, 35 insertions(+), 91 deletions(-) delete mode 100644 src/main/java/me/shedaniel/rei/mixin/MixinClientConnection.java delete mode 100644 src/main/java/me/shedaniel/rei/mixin/MixinClientPlayNetworkHandler.java delete mode 100644 src/main/java/me/shedaniel/rei/mixin/MixinPlayerManager.java (limited to 'src/main/java') diff --git a/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java b/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java index 155ea0ae1..e2cf44c0f 100644 --- a/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java +++ b/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java @@ -12,9 +12,11 @@ import me.shedaniel.rei.gui.ContainerScreenOverlay; import me.shedaniel.rei.listeners.CreativePlayerInventoryScreenHooks; import me.shedaniel.rei.listeners.RecipeBookGuiHooks; import net.fabricmc.api.ClientModInitializer; +import net.fabricmc.fabric.api.network.ClientSidePacketRegistry; import net.fabricmc.loader.api.FabricLoader; import net.fabricmc.loader.api.ModContainer; import net.fabricmc.loader.api.metadata.ModMetadata; +import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.ContainerScreen; import net.minecraft.client.gui.Element; import net.minecraft.client.gui.ingame.CreativePlayerInventoryScreen; @@ -43,7 +45,6 @@ public class RoughlyEnoughItemsCore implements ClientModInitializer { private static final ItemRegistry ITEM_REGISTRY = new ItemRegistryImpl(); private static final DisplayHelper DISPLAY_HELPER = new DisplayHelperImpl(); private static final Map plugins = Maps.newHashMap(); - public static boolean reiIsOnServer = false; private static ConfigManagerImpl configManager; static { @@ -88,6 +89,18 @@ public class RoughlyEnoughItemsCore implements ClientModInitializer { return Optional.empty(); } + public static boolean hasPermissionToUsePackets() { + return hasOperatorPermission() && canUsePackets(); + } + + public static boolean hasOperatorPermission() { + return MinecraftClient.getInstance().getNetworkHandler().getCommandSource().hasPermissionLevel(1); + } + + public static boolean canUsePackets() { + return ClientSidePacketRegistry.INSTANCE.canServerReceive(RoughlyEnoughItemsNetwork.CREATE_ITEMS_PACKET) && ClientSidePacketRegistry.INSTANCE.canServerReceive(RoughlyEnoughItemsNetwork.DELETE_ITEMS_PACKET); + } + @Override public void onInitializeClient() { configManager = new ConfigManagerImpl(); diff --git a/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsNetwork.java b/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsNetwork.java index 3a8dcf54c..362479612 100644 --- a/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsNetwork.java +++ b/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsNetwork.java @@ -1,15 +1,13 @@ package me.shedaniel.rei; import me.shedaniel.rei.gui.widget.ItemListOverlay; -import net.fabricmc.api.EnvType; import net.fabricmc.api.ModInitializer; -import net.fabricmc.fabric.api.network.ClientSidePacketRegistry; import net.fabricmc.fabric.api.network.ServerSidePacketRegistry; -import net.fabricmc.loader.api.FabricLoader; import net.minecraft.client.resource.language.I18n; import net.minecraft.item.ItemStack; import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.text.StringTextComponent; +import net.minecraft.text.TextFormat; import net.minecraft.text.TranslatableTextComponent; import net.minecraft.util.Identifier; @@ -17,7 +15,6 @@ public class RoughlyEnoughItemsNetwork implements ModInitializer { public static final Identifier DELETE_ITEMS_PACKET = new Identifier("roughlyenoughitems", "delete_item"); public static final Identifier CREATE_ITEMS_PACKET = new Identifier("roughlyenoughitems", "create_item"); - public static final Identifier REI_ON_SERVER_PACKET = new Identifier("roughlyenoughitems", "rei_on_server"); @Override public void onInitialize() { @@ -29,24 +26,15 @@ public class RoughlyEnoughItemsNetwork implements ModInitializer { ServerSidePacketRegistry.INSTANCE.register(CREATE_ITEMS_PACKET, (packetContext, packetByteBuf) -> { ServerPlayerEntity player = (ServerPlayerEntity) packetContext.getPlayer(); ItemStack stack = packetByteBuf.readItemStack(); + if (!player.getServer().getCommandSource().hasPermissionLevel(1)) { + player.addChatMessage(new TranslatableTextComponent("text.rei.no_permission_cheat").applyFormat(TextFormat.RED), false); + return; + } if (player.inventory.insertStack(stack.copy())) player.addChatMessage(new StringTextComponent(I18n.translate("text.rei.cheat_items").replaceAll("\\{item_name}", ItemListOverlay.tryGetItemStackName(stack.copy())).replaceAll("\\{item_count}", stack.copy().getAmount() + "").replaceAll("\\{player_name}", player.getEntityName())), false); else player.addChatMessage(new TranslatableTextComponent("text.rei.failed_cheat_items"), false); }); - ClientSidePacketRegistry.INSTANCE.register(REI_ON_SERVER_PACKET, (packetContext, packetByteBuf) -> { - if (FabricLoader.getInstance().getEnvironmentType() == EnvType.CLIENT) { - try { - Class.forName("me.shedaniel.rei.RoughlyEnoughItemsCore").getDeclaredField("reiIsOnServer").set(null, true); - } catch (IllegalAccessException e) { - e.printStackTrace(); - } catch (NoSuchFieldException e) { - e.printStackTrace(); - } catch (ClassNotFoundException e) { - e.printStackTrace(); - } - } - }); } } diff --git a/src/main/java/me/shedaniel/rei/client/ClientHelper.java b/src/main/java/me/shedaniel/rei/client/ClientHelper.java index 1e274241d..b30fc2326 100644 --- a/src/main/java/me/shedaniel/rei/client/ClientHelper.java +++ b/src/main/java/me/shedaniel/rei/client/ClientHelper.java @@ -94,7 +94,7 @@ public class ClientHelper implements ClientModInitializer { } public static boolean tryCheatingStack(ItemStack cheatedStack) { - if (MinecraftClient.getInstance().isInSingleplayer()) { + if (RoughlyEnoughItemsCore.hasPermissionToUsePackets()) { try { ClientSidePacketRegistry.INSTANCE.sendToServer(RoughlyEnoughItemsNetwork.CREATE_ITEMS_PACKET, new PacketByteBuf(Unpooled.buffer()).writeItemStack(cheatedStack.copy())); return true; diff --git a/src/main/java/me/shedaniel/rei/gui/ContainerScreenOverlay.java b/src/main/java/me/shedaniel/rei/gui/ContainerScreenOverlay.java index 9ca770d5c..577f0fc72 100644 --- a/src/main/java/me/shedaniel/rei/gui/ContainerScreenOverlay.java +++ b/src/main/java/me/shedaniel/rei/gui/ContainerScreenOverlay.java @@ -119,8 +119,12 @@ public class ContainerScreenOverlay extends AbstractParentElement implements Dra public void render(int mouseX, int mouseY, float delta) { super.render(mouseX, mouseY, delta); GuiLighting.disable(); - if (ClientHelper.isCheating()) - fill(getBounds().x, getBounds().y, getBounds().x + 20, getBounds().y + 20, new Color(255, 0, 0, 42).getRGB()); + if (ClientHelper.isCheating() && RoughlyEnoughItemsCore.hasOperatorPermission()) { + if (RoughlyEnoughItemsCore.hasPermissionToUsePackets()) + fill(getBounds().x, getBounds().y, getBounds().x + 20, getBounds().y + 20, 721354752); + else + fill(getBounds().x, getBounds().y, getBounds().x + 20, getBounds().y + 20, 1476440063); + } MinecraftClient.getInstance().getTextureManager().bindTexture(CHEST_GUI_TEXTURE); GlStateManager.color4f(1.0F, 1.0F, 1.0F, 1.0F); blit(getBounds().x + 3, getBounds().y + 3, 0, 0, 14, 14); @@ -131,9 +135,13 @@ public class ContainerScreenOverlay extends AbstractParentElement implements Dra String tooltips = I18n.translate("text.rei.config_tooltip"); tooltips += "\n "; if (!ClientHelper.isCheating()) - tooltips += "\n§c§m" + I18n.translate("text.rei.cheating"); + tooltips += "\n" + I18n.translate("text.rei.cheating_disabled"); + else if (!RoughlyEnoughItemsCore.hasOperatorPermission()) + tooltips += "\n" + I18n.translate("text.rei.cheating_enabled_no_perms"); + else if (RoughlyEnoughItemsCore.hasPermissionToUsePackets()) + tooltips += "\n" + I18n.translate("text.rei.cheating_enabled"); else - tooltips += "\n§a" + I18n.translate("text.rei.cheating"); + tooltips += "\n" + I18n.translate("text.rei.cheating_limited_enabled"); return Optional.ofNullable(tooltips); } diff --git a/src/main/java/me/shedaniel/rei/gui/widget/ItemListOverlay.java b/src/main/java/me/shedaniel/rei/gui/widget/ItemListOverlay.java index 5122d0fd1..7b8e3b353 100644 --- a/src/main/java/me/shedaniel/rei/gui/widget/ItemListOverlay.java +++ b/src/main/java/me/shedaniel/rei/gui/widget/ItemListOverlay.java @@ -82,7 +82,7 @@ public class ItemListOverlay extends Widget { GuiLighting.disable(); widgets.forEach(widget -> widget.render(int_1, int_2, float_1)); ClientPlayerEntity player = minecraft.player; - if (rectangle.contains(ClientUtils.getMouseLocation()) && ClientHelper.isCheating() && !player.inventory.getCursorStack().isEmpty() && minecraft.isInSingleplayer()) + if (rectangle.contains(ClientUtils.getMouseLocation()) && ClientHelper.isCheating() && !player.inventory.getCursorStack().isEmpty() && RoughlyEnoughItemsCore.hasPermissionToUsePackets()) ScreenHelper.getLastOverlay().addTooltip(QueuedTooltip.create(I18n.translate("text.rei.delete_items"))); } @@ -276,11 +276,11 @@ public class ItemListOverlay extends Widget { public boolean mouseClicked(double double_1, double double_2, int int_1) { if (rectangle.contains(double_1, double_2)) { ClientPlayerEntity player = minecraft.player; - if (ClientHelper.isCheating() && !player.inventory.getCursorStack().isEmpty() && minecraft.isInSingleplayer()) { + if (ClientHelper.isCheating() && !player.inventory.getCursorStack().isEmpty() && RoughlyEnoughItemsCore.hasPermissionToUsePackets()) { ClientHelper.sendDeletePacket(); return true; } - if (!player.inventory.getCursorStack().isEmpty() && minecraft.isInSingleplayer()) + if (!player.inventory.getCursorStack().isEmpty() && RoughlyEnoughItemsCore.hasPermissionToUsePackets()) return false; for(Widget widget : children()) if (widget.mouseClicked(double_1, double_2, int_1)) diff --git a/src/main/java/me/shedaniel/rei/mixin/MixinClientConnection.java b/src/main/java/me/shedaniel/rei/mixin/MixinClientConnection.java deleted file mode 100644 index 8b137aff7..000000000 --- a/src/main/java/me/shedaniel/rei/mixin/MixinClientConnection.java +++ /dev/null @@ -1,25 +0,0 @@ -package me.shedaniel.rei.mixin; - -import io.netty.channel.Channel; -import me.shedaniel.rei.RoughlyEnoughItemsCore; -import net.minecraft.network.ClientConnection; -import net.minecraft.text.TextComponent; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -@Mixin(ClientConnection.class) -public class MixinClientConnection { - - @Shadow - private Channel channel; - - @Inject(method = "disconnect", at = @At("HEAD")) - public void disconnect(TextComponent reason, CallbackInfo callback) { - if (channel.isOpen()) - RoughlyEnoughItemsCore.reiIsOnServer = false; - } - -} diff --git a/src/main/java/me/shedaniel/rei/mixin/MixinClientPlayNetworkHandler.java b/src/main/java/me/shedaniel/rei/mixin/MixinClientPlayNetworkHandler.java deleted file mode 100644 index 6543a6a97..000000000 --- a/src/main/java/me/shedaniel/rei/mixin/MixinClientPlayNetworkHandler.java +++ /dev/null @@ -1,19 +0,0 @@ -package me.shedaniel.rei.mixin; - -import me.shedaniel.rei.RoughlyEnoughItemsCore; -import net.minecraft.client.network.ClientPlayNetworkHandler; -import net.minecraft.client.network.packet.GameJoinS2CPacket; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -@Mixin(ClientPlayNetworkHandler.class) -public class MixinClientPlayNetworkHandler { - - @Inject(method = "onGameJoin", at = @At("HEAD")) - public void onGameJoin(GameJoinS2CPacket packet, CallbackInfo callbackInfo) { - RoughlyEnoughItemsCore.reiIsOnServer = false; - } - -} diff --git a/src/main/java/me/shedaniel/rei/mixin/MixinPlayerManager.java b/src/main/java/me/shedaniel/rei/mixin/MixinPlayerManager.java deleted file mode 100644 index ff1fade39..000000000 --- a/src/main/java/me/shedaniel/rei/mixin/MixinPlayerManager.java +++ /dev/null @@ -1,21 +0,0 @@ -package me.shedaniel.rei.mixin; - -import io.netty.buffer.Unpooled; -import me.shedaniel.rei.RoughlyEnoughItemsNetwork; -import net.fabricmc.fabric.api.network.ServerSidePacketRegistry; -import net.minecraft.network.ClientConnection; -import net.minecraft.server.PlayerManager; -import net.minecraft.server.network.ServerPlayerEntity; -import net.minecraft.util.PacketByteBuf; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -@Mixin(PlayerManager.class) -public class MixinPlayerManager { - @Inject(method = "onPlayerConnect", at = @At("TAIL")) - public void onPlayerConnect(ClientConnection connection, ServerPlayerEntity player, CallbackInfo callback) { - ServerSidePacketRegistry.INSTANCE.sendToPlayer(player, RoughlyEnoughItemsNetwork.REI_ON_SERVER_PACKET, new PacketByteBuf(Unpooled.buffer())); - } -} -- cgit