Fixed ClientProxy

This commit is contained in:
Waterpicker 2022-06-22 23:24:42 -05:00
parent edeea5e604
commit bf1167098f
7 changed files with 232 additions and 237 deletions

View File

@ -9,6 +9,7 @@ import net.minecraft.core.BlockPos;
import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceKey;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.minecraft.server.MinecraftServer; import net.minecraft.server.MinecraftServer;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.level.Level; import net.minecraft.world.level.Level;
import net.minecraft.world.level.dimension.DimensionType; import net.minecraft.world.level.dimension.DimensionType;
import net.minecraftforge.server.ServerLifecycleHooks; import net.minecraftforge.server.ServerLifecycleHooks;
@ -23,7 +24,7 @@ import javax.annotation.Nonnull;
import static net.minecraftforge.api.distmarker.Dist.CLIENT; import static net.minecraftforge.api.distmarker.Dist.CLIENT;
public abstract class SharedProxy { public class SharedProxy {
public void preInit() { public void preInit() {
} }
@ -51,7 +52,9 @@ public abstract class SharedProxy {
public void onAutocompleteResult(NameUUIDPair pairs[]) { public void onAutocompleteResult(NameUUIDPair pairs[]) {
} }
public abstract GameProfile[] getOnlineGameProfiles(); public GameProfile[] getOnlineGameProfiles() {
return ServerLifecycleHooks.getCurrentServer().getPlayerList().getPlayers().stream().map(Player::getGameProfile).toArray(GameProfile[]::new);
}
public void screenUpdateResolutionInGui(Vector3i pos, BlockSide side, Vector2i res) { public void screenUpdateResolutionInGui(Vector3i pos, BlockSide side, Vector2i res) {
} }

View File

@ -13,6 +13,7 @@ import net.minecraft.block.properties.PropertyInteger;
import net.minecraft.block.state.BlockStateContainer; import net.minecraft.block.state.BlockStateContainer;
import net.minecraft.block.state.IBlockState; import net.minecraft.block.state.IBlockState;
import net.minecraft.client.util.ITooltipFlag; import net.minecraft.client.util.ITooltipFlag;
import net.minecraft.core.BlockPos;
import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.entity.player.EntityPlayerMP;

View File

@ -8,8 +8,9 @@ import net.minecraft.block.BlockContainer;
import net.minecraft.block.material.MapColor; import net.minecraft.block.material.MapColor;
import net.minecraft.block.material.Material; import net.minecraft.block.material.Material;
import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemBlock;
import net.minecraft.world.level.block.entity.BaseContainerBlockEntity;
public abstract class WDBlockContainer extends BlockContainer { public abstract class WDBlockContainer extends BaseContainerBlockEntity {
protected ItemBlock itemBlock; protected ItemBlock itemBlock;

View File

@ -5,45 +5,37 @@
package net.montoyo.wd.client; package net.montoyo.wd.client;
import com.mojang.authlib.GameProfile; import com.mojang.authlib.GameProfile;
import com.mojang.blaze3d.platform.InputConstants;
import net.minecraft.advancements.Advancement; import net.minecraft.advancements.Advancement;
import net.minecraft.advancements.AdvancementProgress; import net.minecraft.advancements.AdvancementProgress;
import net.minecraft.block.Block;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.GuiScreen;
import net.minecraft.client.gui.inventory.GuiContainer;
import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.gui.screens.Screen;
import net.minecraft.client.multiplayer.ClientAdvancementManager; import net.minecraft.client.gui.screens.inventory.ContainerScreen;
import net.minecraft.client.multiplayer.ClientAdvancements; import net.minecraft.client.multiplayer.ClientAdvancements;
import net.minecraft.client.renderer.block.model.ModelResourceLocation;
import net.minecraft.client.renderer.texture.TextureAtlas;
import net.minecraft.client.renderer.texture.TextureMap;
import net.minecraft.client.resources.IResourceManager;
import net.minecraft.client.resources.SimpleReloadableResourceManager;
import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos;
import net.minecraft.entity.player.EntityPlayer; import net.minecraft.core.NonNullList;
import net.minecraft.inventory.Slot; import net.minecraft.nbt.CompoundTag;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.minecraft.server.MinecraftServer; import net.minecraft.server.MinecraftServer;
import net.minecraft.server.packs.resources.ReloadableResourceManager;
import net.minecraft.server.packs.resources.ResourceManager; import net.minecraft.server.packs.resources.ResourceManager;
import net.minecraft.util.EnumHand; import net.minecraft.server.packs.resources.ResourceManagerReloadListener;
import net.minecraft.util.EnumHandSide; import net.minecraft.world.InteractionHand;
import net.minecraft.util.NonNullList; import net.minecraft.world.entity.HumanoidArm;
import net.minecraft.util.ResourceLocation; import net.minecraft.world.entity.player.Player;
import net.minecraft.util.math.BlockPos; import net.minecraft.world.inventory.Slot;
import net.minecraft.util.math.RayTraceResult; import net.minecraft.world.item.Item;
import net.minecraft.util.math.Vec3d; import net.minecraft.world.item.ItemStack;
import net.minecraft.world.World; import net.minecraft.world.level.ClipContext;
import net.minecraft.world.level.Level;
import net.minecraft.world.phys.BlockHitResult;
import net.minecraft.world.phys.HitResult;
import net.minecraft.world.phys.Vec3;
import net.minecraftforge.client.ClientRegistry; import net.minecraftforge.client.ClientRegistry;
import net.minecraftforge.client.event.ModelBakeEvent;
import net.minecraftforge.client.event.ModelRegistryEvent; import net.minecraftforge.client.event.ModelRegistryEvent;
import net.minecraftforge.client.event.TextureStitchEvent; import net.minecraftforge.client.event.RenderHandEvent;
import net.minecraftforge.client.model.ModelLoader;
import net.minecraftforge.client.resource.IResourceType;
import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.common.data.ExistingFileHelper; import net.minecraftforge.event.TickEvent;
import net.minecraftforge.event.world.WorldEvent; import net.minecraftforge.event.world.WorldEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.montoyo.mcef.api.*; import net.montoyo.mcef.api.*;
@ -52,28 +44,30 @@ import net.montoyo.wd.WebDisplays;
import net.montoyo.wd.block.BlockScreen; import net.montoyo.wd.block.BlockScreen;
import net.montoyo.wd.client.gui.*; import net.montoyo.wd.client.gui.*;
import net.montoyo.wd.client.gui.loading.GuiLoader; import net.montoyo.wd.client.gui.loading.GuiLoader;
import net.montoyo.wd.client.renderers.*; import net.montoyo.wd.client.renderers.IItemRenderer;
import net.montoyo.wd.client.renderers.LaserPointerRenderer;
import net.montoyo.wd.client.renderers.MinePadRenderer;
import net.montoyo.wd.client.renderers.ScreenRenderer;
import net.montoyo.wd.core.DefaultUpgrade; import net.montoyo.wd.core.DefaultUpgrade;
import net.montoyo.wd.core.HasAdvancement; import net.montoyo.wd.core.HasAdvancement;
import net.montoyo.wd.core.JSServerRequest; import net.montoyo.wd.core.JSServerRequest;
import net.montoyo.wd.data.GuiData; import net.montoyo.wd.data.GuiData;
import net.montoyo.wd.entity.TileEntityScreen; import net.montoyo.wd.entity.TileEntityScreen;
import net.montoyo.wd.item.ItemMulti;
import net.montoyo.wd.item.WDItem; import net.montoyo.wd.item.WDItem;
import net.montoyo.wd.miniserv.client.Client; import net.montoyo.wd.miniserv.client.Client;
import net.montoyo.wd.net.Messages; import net.montoyo.wd.net.Messages;
import net.montoyo.wd.net.server.SMessagePadCtrl; import net.montoyo.wd.net.server.SMessagePadCtrl;
import net.montoyo.wd.net.server.SMessageScreenCtrl; import net.montoyo.wd.net.server.SMessageScreenCtrl;
import net.montoyo.wd.utilities.*; import net.montoyo.wd.utilities.*;
import org.lwjgl.glfw.GLFW;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.net.InetSocketAddress; import java.net.InetSocketAddress;
import java.net.SocketAddress; import java.net.SocketAddress;
import java.util.*; import java.util.*;
import java.util.function.Predicate;
public class ClientProxy extends SharedProxy implements IDisplayHandler, IJSQueryHandler { public class ClientProxy extends SharedProxy implements IDisplayHandler, IJSQueryHandler, ResourceManagerReloadListener {
public class PadData { public class PadData {
@ -129,7 +123,7 @@ public class ClientProxy extends SharedProxy implements IDisplayHandler, IJSQuer
public void preInit() { public void preInit() {
mc = Minecraft.getInstance(); mc = Minecraft.getInstance();
MinecraftForge.EVENT_BUS.register(this); MinecraftForge.EVENT_BUS.register(this);
registerCustomBlockBaker(new ScreenBaker(), WebDisplays.INSTANCE.blockScreen); // registerCustomBlockBaker(new ScreenBaker(), WebDisplays.INSTANCE.blockScreen);
mcef = MCEFApi.getAPI(); mcef = MCEFApi.getAPI();
if(mcef != null) if(mcef != null)
@ -146,7 +140,7 @@ public class ClientProxy extends SharedProxy implements IDisplayHandler, IJSQuer
@Override @Override
public void postInit() { public void postInit() {
((SimpleReloadableResourceManager) mc.getResourceManager()).registerReloadListener(this); ((ReloadableResourceManager) mc.getResourceManager()).registerReloadListener(this);
if(mcef == null) if(mcef == null)
throw new RuntimeException("MCEF is missing"); throw new RuntimeException("MCEF is missing");
@ -157,12 +151,12 @@ public class ClientProxy extends SharedProxy implements IDisplayHandler, IJSQuer
} }
@Override @Override
public World getWorld(int dim) { public Level getWorld(ResourceLocation dim) {
World ret = mc.world; Level ret = mc.level;
if(dim == CURRENT_DIMENSION) // if(dim == CURRENT_DIMENSION)
return ret; // return ret;
if(ret.provider.getDimension() != dim) if(!ret.dimension().location().equals(dim))
throw new RuntimeException("Can't get non-current dimension " + dim + " from client."); throw new RuntimeException("Can't get non-current dimension " + dim + " from client.");
return ret; return ret;
@ -170,14 +164,14 @@ public class ClientProxy extends SharedProxy implements IDisplayHandler, IJSQuer
@Override @Override
public void enqueue(Runnable r) { public void enqueue(Runnable r) {
mc.addScheduledTask(r); mc.submit(r);
} }
@Override @Override
public void displayGui(GuiData data) { public void displayGui(GuiData data) {
GuiScreen gui = data.createGui(mc.currentScreen, mc.world); Screen gui = data.createGui(mc.screen, mc.level);
if(gui != null) if(gui != null)
mc.displayGuiScreen(gui); mc.setScreen(gui);
} }
@Override @Override
@ -199,11 +193,11 @@ public class ClientProxy extends SharedProxy implements IDisplayHandler, IJSQuer
@Override @Override
public void onAutocompleteResult(NameUUIDPair[] pairs) { public void onAutocompleteResult(NameUUIDPair[] pairs) {
if(mc.currentScreen != null && mc.currentScreen instanceof WDScreen) { if(mc.screen != null && mc.screen instanceof WDScreen screen) {
if(pairs.length == 0) if(pairs.length == 0)
((WDScreen) mc.currentScreen).onAutocompleteFailure(); (screen).onAutocompleteFailure();
else else
((WDScreen) mc.currentScreen).onAutocompleteResult(pairs); (screen).onAutocompleteResult(pairs);
} }
} }
@ -214,9 +208,7 @@ public class ClientProxy extends SharedProxy implements IDisplayHandler, IJSQuer
@Override @Override
public void screenUpdateResolutionInGui(Vector3i pos, BlockSide side, Vector2i res) { public void screenUpdateResolutionInGui(Vector3i pos, BlockSide side, Vector2i res) {
if(mc.currentScreen != null && mc.currentScreen instanceof GuiScreenConfig) { if(mc.screen != null && mc.screen instanceof GuiScreenConfig gsc) {
GuiScreenConfig gsc = (GuiScreenConfig) mc.currentScreen;
if(gsc.isForBlock(pos.toBlock(), side)) if(gsc.isForBlock(pos.toBlock(), side))
gsc.updateResolution(res); gsc.updateResolution(res);
} }
@ -224,9 +216,7 @@ public class ClientProxy extends SharedProxy implements IDisplayHandler, IJSQuer
@Override @Override
public void screenUpdateRotationInGui(Vector3i pos, BlockSide side, Rotation rot) { public void screenUpdateRotationInGui(Vector3i pos, BlockSide side, Rotation rot) {
if(mc.currentScreen != null && mc.currentScreen instanceof GuiScreenConfig) { if(mc.screen != null && mc.screen instanceof GuiScreenConfig gsc) {
GuiScreenConfig gsc = (GuiScreenConfig) mc.currentScreen;
if(gsc.isForBlock(pos.toBlock(), side)) if(gsc.isForBlock(pos.toBlock(), side))
gsc.updateRotation(rot); gsc.updateRotation(rot);
} }
@ -234,9 +224,7 @@ public class ClientProxy extends SharedProxy implements IDisplayHandler, IJSQuer
@Override @Override
public void screenUpdateAutoVolumeInGui(Vector3i pos, BlockSide side, boolean av) { public void screenUpdateAutoVolumeInGui(Vector3i pos, BlockSide side, boolean av) {
if(mc.currentScreen != null && mc.currentScreen instanceof GuiScreenConfig) { if(mc.screen != null && mc.screen instanceof GuiScreenConfig gsc) {
GuiScreenConfig gsc = (GuiScreenConfig) mc.currentScreen;
if(gsc.isForBlock(pos.toBlock(), side)) if(gsc.isForBlock(pos.toBlock(), side))
gsc.updateAutoVolume(av); gsc.updateAutoVolume(av);
} }
@ -244,7 +232,7 @@ public class ClientProxy extends SharedProxy implements IDisplayHandler, IJSQuer
@Override @Override
public void displaySetPadURLGui(String padURL) { public void displaySetPadURLGui(String padURL) {
mc.displayGuiScreen(new GuiSetURL2(padURL)); mc.setScreen(new GuiSetURL2(padURL));
} }
@Override @Override
@ -252,15 +240,15 @@ public class ClientProxy extends SharedProxy implements IDisplayHandler, IJSQuer
PadData pd = padMap.get(padId); PadData pd = padMap.get(padId);
if(pd != null && pd.view != null) if(pd != null && pd.view != null)
mc.displayGuiScreen(new GuiMinePad(pd)); mc.setScreen(new GuiMinePad(pd));
} }
@Override @Override
@Nonnull @Nonnull
public HasAdvancement hasClientPlayerAdvancement(@Nonnull ResourceLocation rl) { public HasAdvancement hasClientPlayerAdvancement(@Nonnull ResourceLocation rl) {
if(advancementToProgressField != null && mc.player != null && mc.player.connection != null) { if(advancementToProgressField != null && mc.player != null && mc.player.connection != null) {
ClientAdvancementManager cam = mc.player.connection.getAdvancementManager(); ClientAdvancements cam = mc.player.connection.getAdvancements();
Advancement adv = cam.getAdvancementList().getAdvancement(rl); Advancement adv = cam.getAdvancements().get(rl);
if(adv == null) if(adv == null)
return HasAdvancement.DONT_KNOW; return HasAdvancement.DONT_KNOW;
@ -375,13 +363,14 @@ public class ClientProxy extends SharedProxy implements IDisplayHandler, IJSQuer
@Override @Override
public boolean isShiftDown() { public boolean isShiftDown() {
return Keyboard.isKeyDown(Keyboard.KEY_LSHIFT) || Keyboard.isKeyDown(Keyboard.KEY_RSHIFT); return Screen.hasShiftDown();
} }
/**************************************** RESOURCE MANAGER METHODS ****************************************/ /**************************************** RESOURCE MANAGER METHODS ****************************************/
@Override @Override
public void onResourceManagerReload(ResourceManager resourceManager, Predicate<ExistingFileHelper.ResourceType> resourcePredicate) { public void onResourceManagerReload(ResourceManager resourceManager) {
Log.info("Resource manager reload: clearing GUI cache..."); Log.info("Resource manager reload: clearing GUI cache...");
GuiLoader.clearCache(); GuiLoader.clearCache();
} }
@ -465,61 +454,61 @@ public class ClientProxy extends SharedProxy implements IDisplayHandler, IJSQuer
/**************************************** EVENT METHODS ****************************************/ /**************************************** EVENT METHODS ****************************************/
@SubscribeEvent // @SubscribeEvent TODO: CHeck if we need this at all
public void onStitchTextures(TextureStitchEvent.Pre ev) { // public void onStitchTextures(TextureStitchEvent.Pre ev) {
TextureAtlas texMap = ev.getAtlas(); // TextureAtlas texMap = ev.getAtlas();
//
if(texMap == mc.getTextureAtlas()) { // if(texMap == mc.getTextureManager()..getTextureAtlas()) {
for(ResourceModelPair pair : modelBakers) // for(ResourceModelPair pair : modelBakers)
pair.getModel().loadTextures(texMap); // pair.getModel().loadTextures(texMap);
} // }
} // }
//
@SubscribeEvent // @SubscribeEvent
public void onBakeModel(ModelBakeEvent ev) { // public void onBakeModel(ModelBakeEvent ev) {
for(ResourceModelPair pair : modelBakers) // for(ResourceModelPair pair : modelBakers)
ev.getModelRegistry().putObject(pair.getResourceLocation(), pair.getModel()); // ev.getModelRegistry().put(pair.getResourceLocation(), pair.getModel());
} // }
@SubscribeEvent @SubscribeEvent
public void onRegisterModels(ModelRegistryEvent ev) { public void onRegisterModels(ModelRegistryEvent ev) {
final WebDisplays wd = WebDisplays.INSTANCE; final WebDisplays wd = WebDisplays.INSTANCE;
//I hope I'm doing this right because it doesn't seem like it... //I hope I'm doing this right because it doesn't seem like it...
registerItemModel(wd.blockScreen.getItem(), 0, "inventory"); // registerItemModel(wd.blockScreen.getItem(), 0, "inventory");
ModelLoader.setCustomModelResourceLocation(wd.blockPeripheral.getItem(), 0, new ModelResourceLocation("webdisplays:kb_inv", "normal")); // ModelLoaderRegistry.setCustomModelResourceLocation(wd.blockPeripheral.getItem(), 0, new ModelResourceLocation("webdisplays:kb_inv", "normal"));
registerItemModel(wd.blockPeripheral.getItem(), 1, "facing=2,type=ccinterface"); // registerItemModel(wd.blockPeripheral.getItem(), 1, "facing=2,type=ccinterface");
registerItemModel(wd.blockPeripheral.getItem(), 2, "facing=2,type=cointerface"); // registerItemModel(wd.blockPeripheral.getItem(), 2, "facing=2,type=cointerface");
registerItemModel(wd.blockPeripheral.getItem(), 3, "facing=0,type=remotectrl"); // registerItemModel(wd.blockPeripheral.getItem(), 3, "facing=0,type=remotectrl");
registerItemModel(wd.blockPeripheral.getItem(), 7, "facing=0,type=redstonectrl"); // registerItemModel(wd.blockPeripheral.getItem(), 7, "facing=0,type=redstonectrl");
registerItemModel(wd.blockPeripheral.getItem(), 11, "facing=0,type=server"); // registerItemModel(wd.blockPeripheral.getItem(), 11, "facing=0,type=server");
registerItemModel(wd.itemScreenCfg, 0, "normal"); // registerItemModel(wd.itemScreenCfg, 0, "normal");
registerItemModel(wd.itemOwnerThief, 0, "normal"); // registerItemModel(wd.itemOwnerThief, 0, "normal");
registerItemModel(wd.itemLinker, 0, "normal"); // registerItemModel(wd.itemLinker, 0, "normal");
registerItemModel(wd.itemMinePad, 0, "normal"); // registerItemModel(wd.itemMinePad, 0, "normal");
registerItemModel(wd.itemMinePad, 1, "normal"); // registerItemModel(wd.itemMinePad, 1, "normal");
registerItemModel(wd.itemLaserPointer, 0, "normal"); // registerItemModel(wd.itemLaserPointer, 0, "normal");
registerItemMultiModels(wd.itemUpgrade); // registerItemMultiModels(wd.itemUpgrade);
registerItemMultiModels(wd.itemCraftComp); // registerItemMultiModels(wd.itemCraftComp);
registerItemMultiModels(wd.itemAdvIcon); // registerItemMultiModels(wd.itemAdvIcon);
} }
@SubscribeEvent @SubscribeEvent
public void onTick(TickEvent.ClientTickEvent ev) { public void onTick(TickEvent.ClientTickEvent ev) {
if(ev.phase == TickEvent.Phase.END) { if(ev.phase == TickEvent.Phase.END) {
//Help //Help
if(Keyboard.isKeyDown(Keyboard.KEY_F1)) { if(InputConstants.isKeyDown(Minecraft.getInstance().getWindow().getWindow(), GLFW.GLFW_KEY_F1)) {
if(!isF1Down) { if(!isF1Down) {
isF1Down = true; isF1Down = true;
String wikiName = null; String wikiName = null;
if(mc.currentScreen instanceof WDScreen) if(mc.screen instanceof WDScreen)
wikiName = ((WDScreen) mc.currentScreen).getWikiPageName(); wikiName = ((WDScreen) mc.screen).getWikiPageName();
else if(mc.currentScreen instanceof GuiContainer) { else if(mc.screen instanceof ContainerScreen) {
Slot slot = ((GuiContainer) mc.currentScreen).getSlotUnderMouse(); Slot slot = ((ContainerScreen) mc.screen).getSlotUnderMouse();
if(slot != null && slot.getHasStack() && slot.getStack().getItem() instanceof WDItem) if(slot != null && slot.hasItem() && slot.getItem().getItem() instanceof WDItem)
wikiName = ((WDItem) slot.getStack().getItem()).getWikiName(slot.getStack()); wikiName = ((WDItem) slot.getItem().getItem()).getWikiName(slot.getItem());
} }
if(wikiName != null) if(wikiName != null)
@ -529,8 +518,8 @@ public class ClientProxy extends SharedProxy implements IDisplayHandler, IJSQuer
isF1Down = false; isF1Down = false;
//Workaround cuz chat sux //Workaround cuz chat sux
if(nextScreen != null && mc.currentScreen == null) { if(nextScreen != null && mc.screen == null) {
mc.displayGuiScreen(nextScreen); mc.setScreen(nextScreen);
nextScreen = null; nextScreen = null;
} }
@ -540,7 +529,7 @@ public class ClientProxy extends SharedProxy implements IDisplayHandler, IJSQuer
lastTracked++; lastTracked++;
TileEntityScreen tes = screenTracking.get(id); TileEntityScreen tes = screenTracking.get(id);
double dist2 = mc.player.getDistanceSq(tes.getPos()); double dist2 = mc.player.distanceToSqr(tes.getBlockPos().getX(), tes.getBlockPos().getY(), tes.getBlockPos().getZ());
if(tes.isLoaded()) { if(tes.isLoaded()) {
if(dist2 > WebDisplays.INSTANCE.unloadDistance2) if(dist2 > WebDisplays.INSTANCE.unloadDistance2)
@ -554,14 +543,14 @@ public class ClientProxy extends SharedProxy implements IDisplayHandler, IJSQuer
//Load/unload minePads depending on which item is in the player's hand //Load/unload minePads depending on which item is in the player's hand
if(++minePadTickCounter >= 10) { if(++minePadTickCounter >= 10) {
minePadTickCounter = 0; minePadTickCounter = 0;
EntityPlayer ep = mc.player; Player ep = mc.player;
for(PadData pd: padList) for(PadData pd: padList)
pd.isInHotbar = false; pd.isInHotbar = false;
if(ep != null) { if(ep != null) {
updateInventory(ep.inventory.mainInventory, ep.getHeldItem(EnumHand.MAIN_HAND), 9); updateInventory(ep.getInventory().items, ep.getItemInHand(InteractionHand.MAIN_HAND), 9);
updateInventory(ep.inventory.offHandInventory, ep.getHeldItem(EnumHand.OFF_HAND), 1); //Is this okay? updateInventory(ep.getInventory().offhand, ep.getItemInHand(InteractionHand.OFF_HAND), 1); //Is this okay?
} }
//TODO: Check for GuiContainer.draggedStack //TODO: Check for GuiContainer.draggedStack
@ -581,36 +570,34 @@ public class ClientProxy extends SharedProxy implements IDisplayHandler, IJSQuer
//Laser pointer raycast //Laser pointer raycast
boolean raycastHit = false; boolean raycastHit = false;
if(mc.player != null && mc.world != null && mc.player.getHeldItem(EnumHand.MAIN_HAND).getItem() == WebDisplays.INSTANCE.itemLaserPointer if(mc.player != null && mc.level != null && mc.player.getItemInHand(InteractionHand.MAIN_HAND).getItem() == WebDisplays.INSTANCE.itemLaserPointer
&& mc.gameSettings.keyBindUseItem.isKeyDown() && mc.options.keyUse.isDown()
&& (mc.objectMouseOver == null || mc.objectMouseOver.typeOfHit != RayTraceResult.Type.BLOCK)) { && (mc.hitResult == null || mc.hitResult.getType() != HitResult.Type.BLOCK)) {
laserPointerRenderer.isOn = true; laserPointerRenderer.isOn = true;
RayTraceResult result = raycast(64.0); //TODO: Make that distance configurable BlockHitResult result = raycast(64.0); //TODO: Make that distance configurable
if(result != null) { BlockPos bpos = result.getBlockPos();
BlockPos bpos = result.getBlockPos();
if(result.typeOfHit == RayTraceResult.Type.BLOCK && mc.world.getBlockState(bpos).getBlock() == WebDisplays.INSTANCE.blockScreen) { if(result.getType() == HitResult.Type.BLOCK && mc.level.getBlockState(bpos).getBlock() == WebDisplays.INSTANCE.blockScreen) {
Vector3i pos = new Vector3i(result.getBlockPos()); Vector3i pos = new Vector3i(result.getBlockPos());
BlockSide side = BlockSide.values()[result.sideHit.ordinal()]; BlockSide side = BlockSide.values()[result.getDirection().ordinal()];
Multiblock.findOrigin(mc.world, pos, side, null); Multiblock.findOrigin(mc.level, pos, side, null);
TileEntityScreen te = (TileEntityScreen) mc.world.getTileEntity(pos.toBlock()); TileEntityScreen te = (TileEntityScreen) mc.level.getBlockEntity(pos.toBlock());
if(te != null && te.hasUpgrade(side, DefaultUpgrade.LASER_MOUSE)) { //hasUpgrade returns false is there's no screen on side 'side' if(te != null && te.hasUpgrade(side, DefaultUpgrade.LASER_MOUSE)) { //hasUpgrade returns false is there's no screen on side 'side'
//Since rights aren't synchronized, let the server check them for us... //Since rights aren't synchronized, let the server check them for us...
TileEntityScreen.Screen scr = te.getScreen(side); TileEntityScreen.Screen scr = te.getScreen(side);
if(scr.browser != null) { if(scr.browser != null) {
float hitX = ((float) result.hitVec.x) - (float) bpos.getX(); float hitX = ((float) result.getLocation().x) - (float) bpos.getX();
float hitY = ((float) result.hitVec.y) - (float) bpos.getY(); float hitY = ((float) result.getLocation().y) - (float) bpos.getY();
float hitZ = ((float) result.hitVec.z) - (float) bpos.getZ(); float hitZ = ((float) result.getLocation().z) - (float) bpos.getZ();
Vector2i tmp = new Vector2i(); Vector2i tmp = new Vector2i();
if(BlockScreen.hit2pixels(side, bpos, pos, scr, hitX, hitY, hitZ, tmp)) { if(BlockScreen.hit2pixels(side, bpos, pos, scr, hitX, hitY, hitZ, tmp)) {
laserClick(te, side, scr, tmp); laserClick(te, side, scr, tmp);
raycastHit = true; raycastHit = true;
}
} }
} }
} }
@ -633,7 +620,7 @@ public class ClientProxy extends SharedProxy implements IDisplayHandler, IJSQuer
} }
@SubscribeEvent @SubscribeEvent
public void onRenderPlayerHand(RenderSpecificHandEvent ev) { public void onRenderPlayerHand(RenderHandEvent ev) {
Item item = ev.getItemStack().getItem(); Item item = ev.getItemStack().getItem();
IItemRenderer renderer; IItemRenderer renderer;
@ -644,22 +631,23 @@ public class ClientProxy extends SharedProxy implements IDisplayHandler, IJSQuer
else else
return; return;
EnumHandSide handSide = mc.player.getPrimaryHand(); HumanoidArm handSide = mc.player.getMainArm();
if(ev.getHand() == EnumHand.OFF_HAND) if(ev.getHand() == InteractionHand.OFF_HAND)
handSide = handSide.opposite(); handSide = handSide.getOpposite();
renderer.render(ev.getItemStack(), (handSide == EnumHandSide.RIGHT) ? 1.0f : -1.0f, ev.getSwingProgress(), ev.getEquipProgress()); renderer.render(ev.getItemStack(), (handSide == HumanoidArm.RIGHT) ? 1.0f : -1.0f, ev.getSwingProgress(), ev.getEquipProgress());
ev.setCanceled(true); ev.setCanceled(true);
} }
@SubscribeEvent @SubscribeEvent
public void onWorldUnload(WorldEvent.Unload ev) { public void onWorldUnload(WorldEvent.Unload ev) {
Log.info("World unloaded; killing screens..."); Log.info("World unloaded; killing screens...");
int dim = ev.getWorld().provider.getDimension(); if(ev.getWorld() instanceof Level level) {
ResourceLocation dim = level.dimension().location();
for(int i = screenTracking.size() - 1; i >= 0; i--) { for(int i = screenTracking.size() - 1; i >= 0; i--) {
if(screenTracking.get(i).getWorld().provider.getDimension() == dim) //Could be world == ev.getWorld() if(screenTracking.get(i).getLevel().dimension().location().equals(dim)) //Could be world == ev.getWorld()
screenTracking.remove(i).unload(); screenTracking.remove(i).unload();
}
} }
} }
@ -671,30 +659,30 @@ public class ClientProxy extends SharedProxy implements IDisplayHandler, IJSQuer
if(t - lastPointPacket >= 100) { if(t - lastPointPacket >= 100) {
lastPointPacket = t; lastPointPacket = t;
WebDisplays.NET_HANDLER.sendToServer(SMessageScreenCtrl.vec2(tes, side, SMessageScreenCtrl.CTRL_LASER_MOVE, hit)); Messages.INSTANCE.sendToServer(SMessageScreenCtrl.vec2(tes, side, SMessageScreenCtrl.CTRL_LASER_MOVE, hit));
} }
} else { } else {
deselectScreen(); deselectScreen();
pointedScreen = tes; pointedScreen = tes;
pointedScreenSide = side; pointedScreenSide = side;
WebDisplays.NET_HANDLER.sendToServer(SMessageScreenCtrl.vec2(tes, side, SMessageScreenCtrl.CTRL_LASER_DOWN, hit)); Messages.INSTANCE.sendToServer(SMessageScreenCtrl.vec2(tes, side, SMessageScreenCtrl.CTRL_LASER_DOWN, hit));
} }
} }
private void deselectScreen() { private void deselectScreen() {
if(pointedScreen != null && pointedScreenSide != null) { if(pointedScreen != null && pointedScreenSide != null) {
WebDisplays.NET_HANDLER.sendToServer(SMessageScreenCtrl.laserUp(pointedScreen, pointedScreenSide)); Messages.INSTANCE.sendToServer(SMessageScreenCtrl.laserUp(pointedScreen, pointedScreenSide));
pointedScreen = null; pointedScreen = null;
pointedScreenSide = null; pointedScreenSide = null;
} }
} }
private RayTraceResult raycast(double dist) { private BlockHitResult raycast(double dist) {
Vec3d start = mc.player.getPositionEyes(1.0f); Vec3 start = mc.player.getEyePosition(1.0f);
Vec3d lookVec = mc.player.getLook(1.0f); Vec3 lookVec = mc.player.getLookAngle();
Vec3d end = start.addVector(lookVec.x * dist, lookVec.y * dist, lookVec.z * dist); Vec3 end = start.add(lookVec.x * dist, lookVec.y * dist, lookVec.z * dist);
return mc.world.rayTraceBlocks(start, end, true, true, false); return mc.level.clip(new ClipContext(start, end, ClipContext.Block.COLLIDER, ClipContext.Fluid.ANY, null));
} }
private void updateInventory(NonNullList<ItemStack> inv, ItemStack heldStack, int cnt) { private void updateInventory(NonNullList<ItemStack> inv, ItemStack heldStack, int cnt) {
@ -702,38 +690,38 @@ public class ClientProxy extends SharedProxy implements IDisplayHandler, IJSQuer
ItemStack item = inv.get(i); ItemStack item = inv.get(i);
if(item.getItem() == WebDisplays.INSTANCE.itemMinePad) { if(item.getItem() == WebDisplays.INSTANCE.itemMinePad) {
NBTTagCompound tag = item.getTagCompound(); CompoundTag tag = item.getTag();
if(tag != null && tag.hasKey("PadID")) if(tag != null && tag.contains("PadID"))
updatePad(tag.getInteger("PadID"), tag, item == heldStack); updatePad(tag.getInt("PadID"), tag, item == heldStack);
} }
} }
} }
private void registerCustomBlockBaker(IModelBaker baker, Block block0) { // private void registerCustomBlockBaker(IModelBaker baker, Block block0) {
ModelResourceLocation normalLoc = new ModelResourceLocation(block0.getRegistryName(), "normal"); // ModelResourceLocation normalLoc = new ModelResourceLocation(block0.getRegistryName(), "normal");
ResourceModelPair pair = new ResourceModelPair(normalLoc, baker); // ResourceModelPair pair = new ResourceModelPair(normalLoc, baker);
modelBakers.add(pair); // modelBakers.add(pair);
ModelLoader.setCustomStateMapper(block0, new StaticStateMapper(normalLoc)); // ModelLoader.setCustomStateMapper(block0, new StaticStateMapper(normalLoc));
} // }
//
// private void registerItemModel(Item item, int meta, String variant) {
// ModelLoader.setCustomModelResourceLocation(item, meta, new ModelResourceLocation(item.getRegistryName(), variant));
// }
//
// private void registerItemMultiModels(ItemMulti item) {
// Enum[] values = item.getEnumValues();
//
// for(int i = 0; i < values.length; i++)
// ModelLoader.setCustomModelResourceLocation(item, i, new ModelResourceLocation(item.getRegistryName().toString() + '_' + values[i], "normal"));
// }
private void registerItemModel(Item item, int meta, String variant) { private void updatePad(int id, CompoundTag tag, boolean isSelected) {
ModelLoader.setCustomModelResourceLocation(item, meta, new ModelResourceLocation(item.getRegistryName(), variant));
}
private void registerItemMultiModels(ItemMulti item) {
Enum[] values = item.getEnumValues();
for(int i = 0; i < values.length; i++)
ModelLoader.setCustomModelResourceLocation(item, i, new ModelResourceLocation(item.getRegistryName().toString() + '_' + values[i], "normal"));
}
private void updatePad(int id, NBTTagCompound tag, boolean isSelected) {
PadData pd = padMap.get(id); PadData pd = padMap.get(id);
if(pd != null) if(pd != null)
pd.isInHotbar = true; pd.isInHotbar = true;
else if(isSelected && tag.hasKey("PadURL")) { else if(isSelected && tag.contains("PadURL")) {
pd = new PadData(tag.getString("PadURL"), id); pd = new PadData(tag.getString("PadURL"), id);
padMap.put(id, pd); padMap.put(id, pd);
padList.add(pd); padList.add(pd);
@ -776,7 +764,7 @@ public class ClientProxy extends SharedProxy implements IDisplayHandler, IJSQuer
} }
private static Field findAdvancementToProgressField() { private static Field findAdvancementToProgressField() {
Field[] fields = ClientAdvancementManager.class.getDeclaredFields(); Field[] fields = ClientAdvancements.class.getDeclaredFields();
Optional<Field> result = Arrays.stream(fields).filter(f -> f.getType() == Map.class).findAny(); Optional<Field> result = Arrays.stream(fields).filter(f -> f.getType() == Map.class).findAny();
if(result.isPresent()) { if(result.isPresent()) {

View File

@ -4,46 +4,40 @@
package net.montoyo.wd.client.gui; package net.montoyo.wd.client.gui;
import net.minecraft.client.gui.GuiScreen; import com.mojang.blaze3d.platform.Lighting;
import net.minecraft.client.renderer.GlStateManager; import com.mojang.blaze3d.systems.RenderSystem;
import net.minecraft.client.renderer.RenderHelper; import com.mojang.blaze3d.vertex.PoseStack;
import net.minecraft.client.renderer.RenderItem; import net.minecraft.client.gui.screens.Screen;
import net.minecraft.client.renderer.texture.TextureUtil; import net.minecraft.client.renderer.entity.ItemRenderer;
import net.minecraft.client.resources.I18n; import net.minecraft.client.resources.language.I18n;
import net.minecraft.item.ItemStack; import net.minecraft.core.NonNullList;
import net.minecraft.item.crafting.CraftingManager; import net.minecraft.network.chat.Component;
import net.minecraft.item.crafting.IRecipe;
import net.minecraft.item.crafting.Ingredient;
import net.minecraft.item.crafting.ShapedRecipes;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.minecraft.util.NonNullList;
import net.minecraft.util.ResourceLocation;
import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ItemStack;
import net.minecraftforge.fml.relauncher.Side; import net.minecraft.world.item.crafting.Ingredient;
import net.minecraftforge.fml.relauncher.SideOnly; import net.minecraft.world.item.crafting.Recipe;
import net.minecraft.world.item.crafting.ShapedRecipe;
import net.minecraftforge.api.distmarker.OnlyIn;
import net.montoyo.wd.utilities.Log; import net.montoyo.wd.utilities.Log;
import org.lwjgl.BufferUtils;
import org.lwjgl.opengl.EXTBgra;
import javax.imageio.ImageIO; import java.nio.ByteBuffer;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.nio.IntBuffer;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.stream.IntStream; import java.util.stream.IntStream;
import static org.lwjgl.opengl.GL11.*; import static net.minecraftforge.api.distmarker.Dist.CLIENT;
@SideOnly(Side.CLIENT) @OnlyIn(CLIENT)
public class RenderRecipe extends GuiScreen { public class RenderRecipe extends Screen {
public RenderRecipe() {
super(Component.nullToEmpty(null));
}
private static class NameRecipePair { private static class NameRecipePair {
private final String name; private final String name;
private final ShapedRecipes recipe; private final ShapedRecipe recipe;
private NameRecipePair(String n, ShapedRecipes r) { private NameRecipePair(String n, ShapedRecipe r) {
this.name = n; this.name = n;
this.recipe = r; this.recipe = r;
} }
@ -55,26 +49,26 @@ public class RenderRecipe extends GuiScreen {
private static final int SIZE_Y = 166; private static final int SIZE_Y = 166;
private int x; private int x;
private int y; private int y;
private RenderItem renderItem; private ItemRenderer renderItem;
private final ItemStack[] recipe = new ItemStack[3 * 3]; private final ItemStack[] recipe = new ItemStack[3 * 3];
private ItemStack recipeResult; private ItemStack recipeResult;
private String recipeName; private String recipeName;
private final ArrayList<NameRecipePair> recipes = new ArrayList<>(); private final ArrayList<NameRecipePair> recipes = new ArrayList<>();
private IntBuffer buffer; private ByteBuffer buffer;
private int[] array; private int[] array;
@Override @Override
public void initGui() { public void init() {
x = (width - SIZE_X) / 2; x = (width - SIZE_X) / 2;
y = (height - SIZE_Y) / 2; y = (height - SIZE_Y) / 2;
renderItem = mc.getRenderItem(); renderItem = minecraft.getItemRenderer();
for(IRecipe recipe: CraftingManager.REGISTRY) { for(Recipe recipe : minecraft.level.getRecipeManager().getRecipes()) {
ResourceLocation regName = recipe.getRegistryName(); ResourceLocation regName = recipe.getId();
if(regName != null && regName.getResourceDomain().equals("webdisplays")) { if(regName != null && regName.getNamespace().equals("webdisplays")) {
if(recipe instanceof ShapedRecipes) if(recipe instanceof ShapedRecipe)
recipes.add(new NameRecipePair(regName.getResourcePath(), (ShapedRecipes) recipe)); recipes.add(new NameRecipePair(regName.getPath(), (ShapedRecipe) recipe));
else else
Log.warning("Found non-shaped recipe %s", regName.toString()); Log.warning("Found non-shaped recipe %s", regName.toString());
} }
@ -85,15 +79,16 @@ public class RenderRecipe extends GuiScreen {
} }
@Override @Override
public void drawScreen(int mouseX, int mouseY, float partialTicks) { public void render(PoseStack poseStack, int mouseX, int mouseY, float partialTick) {
drawDefaultBackground(); renderBackground(poseStack);
GlStateManager.color(1.0f, 1.0f, 1.0f);
mc.getTextureManager().bindTexture(CRAFTING_TABLE_GUI_TEXTURES);
drawTexturedModalRect(x, y, 0, 0, SIZE_X, SIZE_Y);
fontRenderer.drawString(I18n.format("container.crafting"), x + 28, y + 6, 0x404040);
RenderHelper.enableGUIStandardItemLighting(); RenderSystem.setShaderColor(1.0f, 1.0f, 1.0f, 1.0f);
GlStateManager.disableLighting(); RenderSystem.setShaderTexture(0, CRAFTING_TABLE_GUI_TEXTURES);
blit(poseStack, x, y, 0, 0, SIZE_X, SIZE_Y);
font.draw(poseStack, I18n.get("container.crafting"), x + 28, y + 6, 0x404040);
Lighting.setupForFlatItems();
// RenderSystem.disableLighting(); //TODO: Need this?
for(int sy = 0; sy < 3; sy++) { for(int sy = 0; sy < 3; sy++) {
for(int sx = 0; sx < 3; sx++) { for(int sx = 0; sx < 3; sx++) {
@ -103,41 +98,41 @@ public class RenderRecipe extends GuiScreen {
int x = this.x + 30 + sx * 18; int x = this.x + 30 + sx * 18;
int y = this.y + 17 + sy * 18; int y = this.y + 17 + sy * 18;
renderItem.renderItemAndEffectIntoGUI(mc.player, is, x, y); renderItem.renderAndDecorateItem(minecraft.player, is, x, y, 0);
renderItem.renderItemOverlayIntoGUI(fontRenderer, is, x, y, null); renderItem.renderGuiItemDecorations(font, is, x, y, null);
} }
} }
} }
if(recipeResult != null) { if(recipeResult != null) {
renderItem.renderItemAndEffectIntoGUI(mc.player, recipeResult, x + 124, y + 35); renderItem.renderAndDecorateItem(minecraft.player, recipeResult, x + 124, y + 35, 0);
renderItem.renderItemOverlayIntoGUI(fontRenderer, recipeResult, x + 124, y + 35, null); renderItem.renderGuiItemDecorations(font, recipeResult, x + 124, y + 35, null);
} }
GlStateManager.enableLighting(); // GlStateManager.enableLighting();
RenderHelper.disableStandardItemLighting(); Lighting.setupFor3DItems();
} }
private void setRecipe(ShapedRecipes recipe) { private void setRecipe(ShapedRecipe recipe) {
IntStream.range(0, this.recipe.length).forEach(i -> this.recipe[i] = null); IntStream.range(0, this.recipe.length).forEach(i -> this.recipe[i] = null);
NonNullList<Ingredient> ingredients = recipe.getIngredients(); NonNullList<Ingredient> ingredients = recipe.getIngredients();
int pos = 0; int pos = 0;
for(int y = 0; y < recipe.getRecipeHeight(); y++) { for(int y = 0; y < recipe.getRecipeHeight(); y++) {
for(int x = 0; x < recipe.getRecipeWidth(); x++) { for(int x = 0; x < recipe.getRecipeWidth(); x++) {
ItemStack[] stacks = ingredients.get(pos++).getMatchingStacks(); ItemStack[] stacks = ingredients.get(pos++).getItems();
if(stacks.length > 0) if(stacks.length > 0)
this.recipe[y * 3 + x] = stacks[0]; this.recipe[y * 3 + x] = stacks[0];
} }
} }
recipeResult = recipe.getRecipeOutput(); recipeResult = recipe.getResultItem();
} }
private void nextRecipe() { private void nextRecipe() {
if(recipes.isEmpty()) if(recipes.isEmpty())
mc.displayGuiScreen(null); minecraft.setScreen(null);
else { else {
NameRecipePair pair = recipes.remove(0); NameRecipePair pair = recipes.remove(0);
setRecipe(pair.recipe); setRecipe(pair.recipe);
@ -146,39 +141,40 @@ public class RenderRecipe extends GuiScreen {
} }
private int screen2DisplayX(int x) { private int screen2DisplayX(int x) {
double ret = ((double) x) / ((double) width) * ((double) mc.displayWidth); double ret = ((double) x) / ((double) width) * ((double) minecraft.getWindow().getWidth());
return (int) ret; return (int) ret;
} }
private int screen2DisplayY(int y) { private int screen2DisplayY(int y) {
double ret = ((double) y) / ((double) height) * ((double) mc.displayHeight); double ret = ((double) y) / ((double) height) * ((double) minecraft.getWindow().getHeight());
return (int) ret; return (int) ret;
} }
private void takeScreenshot() throws Throwable { private void takeScreenshot() throws Throwable { //TODO: Figure out how to do this.
/*
int x = screen2DisplayX(this.x + 27); int x = screen2DisplayX(this.x + 27);
int y = mc.displayHeight - screen2DisplayY(this.y + 4); int y = minecraft.getWindow().getHeight() - screen2DisplayY(this.y + 4);
int w = screen2DisplayX(120); int w = screen2DisplayX(120);
int h = screen2DisplayY(68); int h = screen2DisplayY(68);
y -= h; y -= h;
if(buffer == null) if(buffer == null)
buffer = BufferUtils.createIntBuffer(w * h); buffer = BufferUtils.createByteBuffer(w * h);
int oldPack = glGetInteger(GL_PACK_ALIGNMENT); int oldPack = glGetInteger(GL_PACK_ALIGNMENT);
glPixelStorei(GL_PACK_ALIGNMENT, 1); RenderSystem.pixelStore(GL_PACK_ALIGNMENT, 1);
buffer.clear(); buffer.clear();
glReadPixels(x, y, w, h, EXTBgra.GL_BGRA_EXT, GL_UNSIGNED_BYTE, buffer); RenderSystem.readPixels(x, y, w, h, EXTBGRA.GL_BGRA_EXT, GL_UNSIGNED_BYTE, buffer);
glPixelStorei(GL_PACK_ALIGNMENT, oldPack); RenderSystem.pixelStore(GL_PACK_ALIGNMENT, oldPack);
if(array == null) if(array == null)
array = new int[w * h]; array = new int[w * h];
buffer.clear(); buffer.clear();
buffer.get(array); buffer.asIntBuffer().get(array);
TextureUtil.processPixelValues(array, w, h); TextureUtil.processPixelValues(array, w, h);
File f = new File(mc.mcDataDir, "wd_recipes"); File f = new File(minecraft.gameDirectory, "wd_recipes");
if(!f.exists()) if(!f.exists())
f.mkdir(); f.mkdir();
@ -187,17 +183,18 @@ public class RenderRecipe extends GuiScreen {
BufferedImage bi = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB); BufferedImage bi = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
bi.setRGB(0, 0, w, h, array, 0, w); bi.setRGB(0, 0, w, h, array, 0, w);
ImageIO.write(bi, "PNG", f); ImageIO.write(bi, "PNG", f);
*/
} }
@Override @Override
public void updateScreen() { public void tick() {
if(recipeName != null) { if(recipeName != null) {
try { try {
takeScreenshot(); takeScreenshot();
nextRecipe(); nextRecipe();
} catch(Throwable t) { } catch(Throwable t) {
t.printStackTrace(); t.printStackTrace();
mc.displayGuiScreen(null); minecraft.setScreen(null);
} }
} }
} }

View File

@ -8,6 +8,8 @@ import net.minecraft.client.util.ITooltipFlag;
import net.minecraft.item.Item; import net.minecraft.item.Item;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack;
import net.montoyo.wd.WebDisplays; import net.montoyo.wd.WebDisplays;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
@ -33,5 +35,4 @@ public class ItemLaserPointer extends Item implements WDItem {
public String getWikiName(@Nonnull ItemStack is) { public String getWikiName(@Nonnull ItemStack is) {
return "Laser_Pointer"; return "Laser_Pointer";
} }
} }

View File

@ -6,8 +6,10 @@ package net.montoyo.wd.item;
import net.minecraft.ChatFormatting; import net.minecraft.ChatFormatting;
import net.minecraft.client.resources.language.I18n; import net.minecraft.client.resources.language.I18n;
import net.minecraft.world.item.ItemStack;
import net.montoyo.wd.WebDisplays; import net.montoyo.wd.WebDisplays;
import javax.annotation.Nonnull;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import java.util.List; import java.util.List;
@ -18,4 +20,6 @@ public interface WDItem {
tt.add("" + ChatFormatting.GRAY + I18n.get("item.webdisplays.wiki")); tt.add("" + ChatFormatting.GRAY + I18n.get("item.webdisplays.wiki"));
} }
public String getWikiName(@Nonnull ItemStack is);
} }