Sfoglia il codice sorgente

Merge branch '1.14-dev' into 1.14

Unknown 6 anni fa
parent
commit
6a50549825

+ 4 - 0
CHANGELOG.md

@@ -1,4 +1,8 @@
 View full changelog [here](https://github.com/shedaniel/RoughlyEnoughItems/blob/1.14/CHANGELOG.md).
+## v2.8.0+build.100
+- Fixed [#76](https://github.com/shedaniel/RoughlyEnoughItems/issues/76): Laggy Changing Pages
+- New: Better Server Support (You can now drop REI into server mods)
+- New: Better Cheat Mode Button
 ## v2.7.11.97
 - Fixed [#72](https://github.com/shedaniel/RoughlyEnoughItems/issues/72): Crash on clicking craftable items filter
 - New: Load REI Plugins via entry points, old way works too but support will be dropped

+ 1 - 6
README.md

@@ -11,12 +11,7 @@ Roughly Enough Items is a mod to view Items and Recipes for Minecraft 1.13 - 1.1
 
 ![](https://cdn.discordapp.com/attachments/472670263234920449/536198766118830081/unknown.png)
 
-This mod is completely client side. It is **impossible** to install this mod on a server.  
-However 1 feature will be disabled:
-- Item Deletion
-
-One feature will be limited:
-- Item Cheating (nbts are limited to 256 char = no long nbts)
+This mod is client sided and server sided.
 
 ### Currently Supported Languages:
 - English

+ 10 - 0
build.gradle

@@ -51,10 +51,20 @@ dependencies {
     mappings "net.fabricmc:yarn:${project.yarn_version}"
     modCompile "net.fabricmc:fabric-loader:${project.fabricloader_version}"
     modCompile "net.fabricmc:fabric:${project.fabric_version}"
+//    modCompile "net.fabricmc.fabric-api:fabric-keybindings:${project.fabric_keybindings}"
+//    modCompile "net.fabricmc.fabric-api:fabric-lib:${project.fabric_lib}"
+//    modCompile "net.fabricmc.fabric-api:fabric-networking:${project.fabric_networking}"
+//    modCompile "net.fabricmc.fabric-api:fabric-events-lifecycle:${project.fabric_events_lifecycle}"
+//    modCompile "net.fabricmc.fabric-api:fabric-resource-loader:${project.fabric_resource_loader}"
     modCompile "cloth:ClothEvents:${cloth_events_version}"
     modCompile "cloth-config:ClothConfig:${cloth_config_version}"
     if (includeDep) {
         include "net.fabricmc:fabric:${project.fabric_version}"
+//        include "net.fabricmc.fabric-api:fabric-keybindings:${project.fabric_keybindings}"
+//        include "net.fabricmc.fabric-api:fabric-lib:${project.fabric_lib}"
+//        include "net.fabricmc.fabric-api:fabric-networking:${project.fabric_networking}"
+//        include "net.fabricmc.fabric-api:fabric-events-lifecycle:${project.fabric_events_lifecycle}"
+//        include "net.fabricmc.fabric-api:fabric-resource-loader:${project.fabric_resource_loader}"
         include "cloth:ClothEvents:${cloth_events_version}"
         include "cloth-config:ClothConfig:${cloth_config_version}"
     }

+ 12 - 6
gradle.properties

@@ -1,9 +1,15 @@
-mod_version=2.7.11+build.97
-minecraft_version=1.14 Pre-Release 4
-yarn_version=1.14 Pre-Release 4+build.2
-fabric_version=0.2.7+build.123
-fabricloader_version=0.4.1+build.126
+mod_version=2.8.0+build.100
+minecraft_version=1.14
+yarn_version=1.14+build.5
+fabricloader_version=0.4.6+build.141
 jankson_version=1.1.0
 cloth_events_version=0.3.1.23
-cloth_config_version=0.1.3.7
+cloth_config_version=0.2.1.14
 modmenu_version=1.4.0-71
+fabric_version=0.2.7+build.127
+
+fabric_keybindings=0.1.0
+fabric_lib=0.1.0
+fabric_networking=0.1.0
+fabric_events_lifecycle=0.1.0
+fabric_resource_loader=0.1.0

+ 14 - 1
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<Identifier, REIPluginEntry> 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();

+ 5 - 17
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();
-                }
-            }
-        });
     }
     
 }

+ 1 - 1
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.canUsePackets()) {
             try {
                 ClientSidePacketRegistry.INSTANCE.sendToServer(RoughlyEnoughItemsNetwork.CREATE_ITEMS_PACKET, new PacketByteBuf(Unpooled.buffer()).writeItemStack(cheatedStack.copy()));
                 return true;

+ 23 - 15
src/main/java/me/shedaniel/rei/gui/ContainerScreenOverlay.java

@@ -61,7 +61,7 @@ public class ContainerScreenOverlay extends AbstractParentElement implements Dra
         this.rectangle = RoughlyEnoughItemsCore.getConfigManager().getConfig().mirrorItemPanel ? boundsHandler.getLeftBounds(MinecraftClient.getInstance().currentScreen) : boundsHandler.getRightBounds(MinecraftClient.getInstance().currentScreen);
         this.lastLeft = getLeft();
         widgets.add(itemListOverlay = new ItemListOverlay(page));
-        itemListOverlay.updateList(boundsHandler, boundsHandler.getItemListArea(rectangle), page, searchTerm);
+        itemListOverlay.updateList(boundsHandler, boundsHandler.getItemListArea(rectangle), page, searchTerm, false);
         
         widgets.add(buttonLeft = new ButtonWidget(rectangle.x, rectangle.y + 5, 16, 16, new TranslatableTextComponent("text.rei.left_arrow")) {
             @Override
@@ -69,7 +69,7 @@ public class ContainerScreenOverlay extends AbstractParentElement implements Dra
                 page--;
                 if (page < 0)
                     page = getTotalPage();
-                itemListOverlay.updateList(boundsHandler, boundsHandler.getItemListArea(rectangle), page, searchTerm);
+                itemListOverlay.updateList(boundsHandler, boundsHandler.getItemListArea(rectangle), page, searchTerm, false);
             }
             
             @Override
@@ -88,7 +88,7 @@ public class ContainerScreenOverlay extends AbstractParentElement implements Dra
                 page++;
                 if (page > getTotalPage())
                     page = 0;
-                itemListOverlay.updateList(boundsHandler, boundsHandler.getItemListArea(rectangle), page, searchTerm);
+                itemListOverlay.updateList(boundsHandler, boundsHandler.getItemListArea(rectangle), page, searchTerm, false);
             }
             
             @Override
@@ -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);
             }
             
@@ -208,7 +216,7 @@ public class ContainerScreenOverlay extends AbstractParentElement implements Dra
             public void onLabelClicked() {
                 MinecraftClient.getInstance().getSoundManager().play(PositionedSoundInstance.master(SoundEvents.UI_BUTTON_CLICK, 1.0F));
                 page = 0;
-                itemListOverlay.updateList(boundsHandler, boundsHandler.getItemListArea(rectangle), page, searchTerm);
+                itemListOverlay.updateList(boundsHandler, boundsHandler.getItemListArea(rectangle), page, searchTerm, false);
             }
             
             @Override
@@ -219,19 +227,19 @@ public class ContainerScreenOverlay extends AbstractParentElement implements Dra
         buttonLeft.enabled = buttonRight.enabled = getTotalPage() > 0;
         if (ScreenHelper.searchField == null)
             ScreenHelper.searchField = new SearchFieldWidget(0, 0, 0, 0);
-        ScreenHelper.searchField.setChangedListener(s -> {
-            searchTerm = s;
-            itemListOverlay.updateList(boundsHandler, boundsHandler.getItemListArea(rectangle), page, searchTerm);
-        });
         ScreenHelper.searchField.getBounds().setBounds(getTextFieldArea());
         this.widgets.add(ScreenHelper.searchField);
         ScreenHelper.searchField.setText(searchTerm);
+        ScreenHelper.searchField.setChangedListener(s -> {
+            searchTerm = s;
+            itemListOverlay.updateList(boundsHandler, boundsHandler.getItemListArea(rectangle), page, searchTerm, true);
+        });
         if (RoughlyEnoughItemsCore.getConfigManager().getConfig().enableCraftableOnlyButton)
             this.widgets.add(toggleButtonWidget = new CraftableToggleButtonWidget(getCraftableToggleArea()) {
                 @Override
                 public void onPressed() {
                     RoughlyEnoughItemsCore.getConfigManager().toggleCraftableOnly();
-                    itemListOverlay.updateList(boundsHandler, boundsHandler.getItemListArea(rectangle), page, searchTerm);
+                    itemListOverlay.updateList(boundsHandler, boundsHandler.getItemListArea(rectangle), page, searchTerm, true);
                 }
                 
                 @Override
@@ -242,7 +250,7 @@ public class ContainerScreenOverlay extends AbstractParentElement implements Dra
             });
         else
             toggleButtonWidget = null;
-        this.itemListOverlay.updateList(boundsHandler, boundsHandler.getItemListArea(rectangle), page, searchTerm);
+        this.itemListOverlay.updateList(boundsHandler, boundsHandler.getItemListArea(rectangle), page, searchTerm, false);
     }
     
     private Weather getNextWeather() {
@@ -324,7 +332,7 @@ public class ContainerScreenOverlay extends AbstractParentElement implements Dra
         else if (RoughlyEnoughItemsCore.getConfigManager().isCraftableOnlyEnabled() && (!hasSameListContent(new LinkedList<>(ScreenHelper.inventoryStacks), currentStacks) || (currentStacks.size() != ScreenHelper.inventoryStacks.size()))) {
             ScreenHelper.inventoryStacks = ClientHelper.getInventoryItemsTypes();
             DisplayHelper.DisplayBoundsHandler boundsHandler = RoughlyEnoughItemsCore.getDisplayHelper().getResponsibleBoundsHandler(MinecraftClient.getInstance().currentScreen.getClass());
-            itemListOverlay.updateList(boundsHandler, boundsHandler.getItemListArea(rectangle), page, searchTerm);
+            itemListOverlay.updateList(boundsHandler, boundsHandler.getItemListArea(rectangle), page, searchTerm, true);
         }
         GlStateManager.color4f(1.0F, 1.0F, 1.0F, 1.0F);
         GuiLighting.disable();

+ 7 - 8
src/main/java/me/shedaniel/rei/gui/credits/CreditsEntryListWidget.java

@@ -1,30 +1,29 @@
 package me.shedaniel.rei.gui.credits;
 
 import net.minecraft.client.MinecraftClient;
-import net.minecraft.client.gui.menu.AlwaysSelectedItemListWidget;
+import net.minecraft.client.gui.menu.AlwaysSelectedEntryListWidget;
 import net.minecraft.text.TextComponent;
 
-public class CreditsEntryListWidget extends AlwaysSelectedItemListWidget<CreditsEntryListWidget.CreditsItem> {
+public class CreditsEntryListWidget extends AlwaysSelectedEntryListWidget<CreditsEntryListWidget.CreditsItem> {
     
     public CreditsEntryListWidget(MinecraftClient client, int width, int height, int startY, int endY, int entryHeight) {
         super(client, width, height, startY, endY, entryHeight);
-        visible = false; // showSelection
     }
     
     public void creditsClearEntries() {
-        clearItems();
+        clearEntries();
     }
     
-    private CreditsItem getEntry(int int_1) {
+    private CreditsItem rei_getEntry(int int_1) {
         return this.children().get(int_1);
     }
     
     public void creditsAddEntry(CreditsItem entry) {
-        addItem(entry);
+        addEntry(entry);
     }
     
     @Override
-    public int getItemWidth() {
+    public int getRowWidth() {
         return width - 80;
     }
     
@@ -33,7 +32,7 @@ public class CreditsEntryListWidget extends AlwaysSelectedItemListWidget<Credits
         return width - 40;
     }
     
-    public static class CreditsItem extends AlwaysSelectedItemListWidget.Item<CreditsItem> {
+    public static class CreditsItem extends AlwaysSelectedEntryListWidget.Entry<CreditsItem> {
         private String text;
         
         public CreditsItem(TextComponent textComponent) {

+ 10 - 7
src/main/java/me/shedaniel/rei/gui/widget/ItemListOverlay.java

@@ -34,10 +34,10 @@ import java.util.stream.Collectors;
 public class ItemListOverlay extends Widget {
     
     private static List<Item> searchBlacklisted = Lists.newArrayList();
+    private final List<ItemStack> currentDisplayed;
     private List<Widget> widgets;
     private int width, height, page;
     private Rectangle rectangle, listArea;
-    private List<ItemStack> currentDisplayed;
     
     public ItemListOverlay(int page) {
         this.currentDisplayed = Lists.newArrayList();
@@ -82,16 +82,19 @@ 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")));
     }
     
-    public void updateList(DisplayHelper.DisplayBoundsHandler boundsHandler, Rectangle rectangle, int page, String searchTerm) {
+    public void updateList(DisplayHelper.DisplayBoundsHandler boundsHandler, Rectangle rectangle, int page, String searchTerm, boolean processSearchTerm) {
         this.rectangle = rectangle;
         this.page = page;
         this.widgets = Lists.newLinkedList();
         calculateListSize(rectangle);
-        currentDisplayed = processSearchTerm(searchTerm, RoughlyEnoughItemsCore.getItemRegisterer().getItemList(), ScreenHelper.inventoryStacks);
+        if (currentDisplayed.isEmpty() || processSearchTerm) {
+            currentDisplayed.clear();
+            currentDisplayed.addAll(processSearchTerm(searchTerm, RoughlyEnoughItemsCore.getItemRegisterer().getItemList(), ScreenHelper.inventoryStacks));
+        }
         int startX = (int) rectangle.getCenterX() - width * 9;
         int startY = (int) rectangle.getCenterY() - height * 9;
         this.listArea = new Rectangle((int) startX, (int) startY, width * 18, height * 18);
@@ -182,7 +185,7 @@ public class ItemListOverlay extends Widget {
     }
     
     private List<ItemStack> processSearchTerm(String searchTerm, List<ItemStack> ol, List<ItemStack> inventoryItems) {
-        List<ItemStack> os = new LinkedList<>(ol), stacks = Lists.newArrayList(), finalStacks = Lists.newArrayList();
+        List<ItemStack> os = Lists.newArrayList(ol), stacks = Lists.newArrayList(), finalStacks = Lists.newArrayList();
         List<ItemGroup> itemGroups = Lists.newArrayList(ItemGroup.GROUPS);
         itemGroups.add(null);
         ItemListOrdering ordering = RoughlyEnoughItemsCore.getConfigManager().getConfig().itemListOrdering;
@@ -276,11 +279,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))

+ 0 - 25
src/main/java/me/shedaniel/rei/mixin/MixinClientConnection.java

@@ -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;
-    }
-    
-}

+ 0 - 19
src/main/java/me/shedaniel/rei/mixin/MixinClientPlayNetworkHandler.java

@@ -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;
-    }
-    
-}

+ 0 - 21
src/main/java/me/shedaniel/rei/mixin/MixinPlayerManager.java

@@ -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()));
-    }
-}

+ 5 - 0
src/main/resources/assets/roughlyenoughitems/lang/en_us.json

@@ -7,6 +7,11 @@
   "text.rei.config.action": "Action",
   "text.rei.config.cheating": "Cheating:",
   "text.rei.cheating": "Cheating",
+  "text.rei.cheating_disabled": "§7Cheating Disabled",
+  "text.rei.cheating_enabled": "§cCheating Enabled",
+  "text.rei.cheating_limited_enabled": "§bCheating Enabled (Using Commands)",
+  "text.rei.cheating_enabled_no_perms": "§7Cheating §cEnabled §7(No Permission)",
+  "text.rei.no_permission_cheat": "Operator permissions are required to cheat items",
   "category.rei.crafting": "Crafting",
   "category.rei.smelting": "Smelting",
   "category.rei.smelting.fuel": "§eFuel",

+ 0 - 2
src/main/resources/fabric.mod.json

@@ -14,7 +14,6 @@
   },
   "license": "MIT",
   "icon": "pack.png",
-  "environment": "client",
   "entrypoints": {
     "client": [
       "me.shedaniel.rei.RoughlyEnoughItemsCore",
@@ -33,7 +32,6 @@
   },
   "requires": {
     "fabricloader": ">=0.4.0",
-    "fabric": "^0.2.6",
     "cloth": "*"
   },
   "recommends": {

+ 2 - 6
src/main/resources/roughlyenoughitems.mixins.json

@@ -3,16 +3,12 @@
   "package": "me.shedaniel.rei.mixin",
   "minVersion": "0.7.11",
   "compatibilityLevel": "JAVA_8",
-  "mixins": [
-    "MixinPlayerManager"
-  ],
+  "mixins": [],
   "client": [
     "MixinContainerScreen",
     "MixinBrewingRecipeRegistry",
     "MixinRecipeBookGui",
-    "MixinCreativePlayerInventoryScreen",
-    "MixinClientPlayNetworkHandler",
-    "MixinClientConnection"
+    "MixinCreativePlayerInventoryScreen"
   ],
   "injectors": {
     "defaultRequire": 1