fixed more stuff

This commit is contained in:
Mysticpasta1 2022-06-22 05:14:10 -05:00
parent 75734fa631
commit ca41720a9c
26 changed files with 617 additions and 800 deletions

View File

@ -6,8 +6,11 @@ package net.montoyo.wd;
import com.mojang.authlib.GameProfile; import com.mojang.authlib.GameProfile;
import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos;
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.level.Level;
import net.minecraft.world.level.dimension.DimensionType;
import net.minecraftforge.server.ServerLifecycleHooks; import net.minecraftforge.server.ServerLifecycleHooks;
import net.montoyo.wd.utilities.Log; import net.montoyo.wd.utilities.Log;
import net.montoyo.wd.core.HasAdvancement; import net.montoyo.wd.core.HasAdvancement;
@ -20,10 +23,7 @@ import javax.annotation.Nonnull;
import static net.minecraftforge.api.distmarker.Dist.CLIENT; import static net.minecraftforge.api.distmarker.Dist.CLIENT;
public class SharedProxy { public abstract class SharedProxy {
public static final int CURRENT_DIMENSION = Integer.MAX_VALUE;
public void preInit() { public void preInit() {
} }
@ -33,11 +33,8 @@ public class SharedProxy {
public void postInit() { public void postInit() {
} }
public World getWorld(int dim) { public Level getWorld(ResourceKey<Level> dim) {
if(dim == CURRENT_DIMENSION) return getServer().getLevel(dim);
throw new RuntimeException("Current dimension not available server side...");
return DimensionManager.getWorld(dim);
} }
public void enqueue(Runnable r) { public void enqueue(Runnable r) {
@ -54,9 +51,7 @@ public class SharedProxy {
public void onAutocompleteResult(NameUUIDPair pairs[]) { public void onAutocompleteResult(NameUUIDPair pairs[]) {
} }
public GameProfile[] getOnlineGameProfiles() { public abstract GameProfile[] getOnlineGameProfiles();
return FMLServerHandler.instance().getServer().getOnlinePlayerProfiles();
}
public void screenUpdateResolutionInGui(Vector3i pos, BlockSide side, Vector2i res) { public void screenUpdateResolutionInGui(Vector3i pos, BlockSide side, Vector2i res) {
} }
@ -89,7 +84,7 @@ public class SharedProxy {
} }
public MinecraftServer getServer() { public MinecraftServer getServer() {
return ServerLifecycleHooks.getCurrentServer();CLIENT return ServerLifecycleHooks.getCurrentServer();
} }
public void setMiniservClientPort(int port) { public void setMiniservClientPort(int port) {

View File

@ -11,6 +11,8 @@ import me.shedaniel.autoconfig.serializer.Toml4jConfigSerializer;
import net.minecraft.ChatFormatting; import net.minecraft.ChatFormatting;
import net.minecraft.advancements.Advancement; import net.minecraft.advancements.Advancement;
import net.minecraft.advancements.CriteriaTriggers; import net.minecraft.advancements.CriteriaTriggers;
import net.minecraft.core.Registry;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.minecraft.server.MinecraftServer; import net.minecraft.server.MinecraftServer;
import net.minecraft.server.level.ServerPlayer; import net.minecraft.server.level.ServerPlayer;
@ -20,10 +22,11 @@ import net.minecraft.sounds.SoundSource;
import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.Item; import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Block;
import net.minecraftforge.client.event.ClientChatEvent; import net.minecraftforge.client.event.ClientChatEvent;
import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.common.capabilities.CapabilityManager;
import net.minecraftforge.event.AttachCapabilitiesEvent; import net.minecraftforge.event.AttachCapabilitiesEvent;
import net.minecraftforge.event.RegistryEvent; import net.minecraftforge.event.RegistryEvent;
import net.minecraftforge.event.ServerChatEvent; import net.minecraftforge.event.ServerChatEvent;
@ -53,8 +56,8 @@ import net.montoyo.wd.utilities.Util;
import java.io.*; import java.io.*;
import java.net.MalformedURLException; import java.net.MalformedURLException;
import java.net.URL; import java.net.URL;
import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.Objects;
import java.util.UUID; import java.util.UUID;
@Mod("webdisplays") @Mod("webdisplays")
@ -66,7 +69,6 @@ public class WebDisplays {
public static SharedProxy PROXY = DistExecutor.<SharedProxy>runForDist(() -> ClientProxy::new, () -> SharedProxy::new); public static SharedProxy PROXY = DistExecutor.<SharedProxy>runForDist(() -> ClientProxy::new, () -> SharedProxy::new);
public static SimpleNetworkWrapper NET_HANDLER;
public static WDCreativeTab CREATIVE_TAB; public static WDCreativeTab CREATIVE_TAB;
public static final ResourceLocation ADV_PAD_BREAK = new ResourceLocation("webdisplays", "webdisplays/pad_break"); public static final ResourceLocation ADV_PAD_BREAK = new ResourceLocation("webdisplays", "webdisplays/pad_break");
public static final String BLACKLIST_URL = "mod://webdisplays/blacklisted.html"; public static final String BLACKLIST_URL = "mod://webdisplays/blacklisted.html";
@ -129,65 +131,6 @@ public class WebDisplays {
public WebDisplays() { public WebDisplays() {
AutoConfig.register(ModConfig.class, Toml4jConfigSerializer::new); AutoConfig.register(ModConfig.class, Toml4jConfigSerializer::new);
ConfigHolder<ModConfig> configHolder = AutoConfig.getConfigHolder(ModConfig.class); ConfigHolder<ModConfig> configHolder = AutoConfig.getConfigHolder(ModConfig.class);
// Configuration cfg = new Configuration();
// cfg.load();
//
// //CAT: Main
// Property blacklist = cfg.get("main", "blacklist", new String[0]);
// Property padHeight = cfg.get("main", "padHeight", 480);
// Property hardRecipe = cfg.get("main", "hardRecipes", true);
// Property homePage = cfg.get("main", "homepage", "mod://webdisplays/main.html");
// Property disableOT = cfg.get("main", "disableOwnershipThief", false);
// Property maxResX = cfg.get("main", "maxResolutionX", 1920);
// Property maxResY = cfg.get("main", "maxResolutionY", 1080);
// Property miniservPort = cfg.get("main", "miniservPort", 25566);
// Property miniservQuota = cfg.get("main", "miniservQuota", 1024); //It's stored as a string anyway
// Property maxScreenX = cfg.get("main", "maxScreenSizeX", 16);
// Property maxScreenY = cfg.get("main", "maxScreenSizeY", 16);
//
// //CAT: Client options
// Property loadDistance = cfg.get("client", "loadDistance", 30.0);
// Property unloadDistance = cfg.get("client", "unloadDistance", 32.0);
//
// //CAT: Auto volume config (client-side)
// Property enableAutoVol = cfg.get("clientAutoVolume", "enableAutoVolume", true);
// Property ytVolume = cfg.get("clientAutoVolume", "ytVolume", 100.0);
// Property dist100 = cfg.get("clientAutoVolume", "dist100", 10.0);
// Property dist0 = cfg.get("clientAutoVolume", "dist0", 30.0);
//
//
// //Comments & shit
// blacklist.setComment("An array of domain names you don't want to load.");
// padHeight.setComment("The minePad Y resolution in pixels. padWidth = padHeight * " + PAD_RATIO);
// hardRecipe.setComment("If true, breaking the minePad is required to craft upgrades.");
// homePage.setComment("The URL that will be loaded each time you create a screen");
// disableOT.setComment("If true, the ownership thief item will be disabled");
// loadDistance.setComment("All screens outside this range will be unloaded");
// unloadDistance.setComment("All unloaded screens inside this range will be loaded");
// maxResX.setComment("Maximum horizontal screen resolution, in pixels");
// maxResY.setComment("Maximum vertical screen resolution, in pixels");
// miniservPort.setComment("The port used by miniserv. 0 to disable.");
// miniservPort.setMaxValue(Short.MAX_VALUE);
// miniservQuota.setComment("The amount of data that can be uploaded to miniserv, in KiB (so 1024 = 1 MiO)");
// maxScreenX.setComment("Maximum screen width, in blocks. Resolution will be clamped by maxResolutionX.");
// maxScreenY.setComment("Maximum screen height, in blocks. Resolution will be clamped by maxResolutionY.");
// enableAutoVol.setComment("If true, the volume of YouTube videos will change depending on how far you are");
// ytVolume.setComment("Volume for YouTube videos. This will have no effect if enableSoundDistance is set to false");
// ytVolume.setMinValue(0.0);
// ytVolume.setMaxValue(100.0);
// dist100.setComment("Distance after which the sound starts dropping (in blocks)");
// dist100.setMinValue(0.0);
// dist0.setComment("Distance after which you can't hear anything (in blocks)");
// dist0.setMinValue(0.0);
//
// if(unloadDistance.getDouble() < loadDistance.getDouble() + 2.0)
// unloadDistance.set(loadDistance.getDouble() + 2.0);
//
// if(dist0.getDouble() < dist100.getDouble() + 0.1)
// dist0.set(dist100.getDouble() + 0.1);
//
// cfg.save();
ModConfig config = configHolder.getConfig(); ModConfig config = configHolder.getConfig();
configHolder.save(); configHolder.save();
@ -246,23 +189,20 @@ public class WebDisplays {
MinecraftForge.EVENT_BUS.register(this); MinecraftForge.EVENT_BUS.register(this);
//Register tile entities //Register tile entities
GameRegistry.registerTileEntity(TileEntityScreen.class, new ResourceLocation("webdisplays", "screen")); Registry.register(Registry.BLOCK_ENTITY_TYPE, TileEntityScreen.class, new ResourceLocation("webdisplays", "screen"));
for(DefaultPeripheral dp: DefaultPeripheral.values()) { for(DefaultPeripheral dp: DefaultPeripheral.values()) {
if(dp.getTEClass() != null) if(dp.getTEClass() != null)
GameRegistry.registerTileEntity(dp.getTEClass(), new ResourceLocation("webdisplays", dp.getName())); GameRegistry.registerTileEntity(dp.getTEClass(), new ResourceLocation("webdisplays", dp.getName()));
} }
//Other things //Other things
CapabilityManager.INSTANCE.register(IWDDCapability.class, new WDDCapability.Storage(), new WDDCapability.Factory());
PROXY.init(); PROXY.init();
NET_HANDLER = NetworkRegistry.INSTANCE.newSimpleChannel("webdisplays");
Messages.registerAll(NET_HANDLER);
PROXY.postInit(); PROXY.postInit();
hasOC = ModList.get().isLoaded("opencomputers"); hasOC = ModList.get().isLoaded("opencomputers");
hasCC = ModList.get().isLoaded("computercraft"); hasCC = ModList.get().isLoaded("computercraft");
if(hasCC) { /* if(hasCC) {
try { try {
//We have to do this because the "register" method might be stripped out if CC isn't loaded //We have to do this because the "register" method might be stripped out if CC isn't loaded
CCPeripheralProvider.class.getMethod("register").invoke(null); CCPeripheralProvider.class.getMethod("register").invoke(null);
@ -270,6 +210,13 @@ public class WebDisplays {
Log.error("ComputerCraft was found, but WebDisplays wasn't able to register its CC Interface Peripheral"); Log.error("ComputerCraft was found, but WebDisplays wasn't able to register its CC Interface Peripheral");
t.printStackTrace(); t.printStackTrace();
} }
} */
}
@SubscribeEvent
public static void onAttachPlayerCap(AttachCapabilitiesEvent<Entity> event) {
if (event.getObject() instanceof Player && !event.getObject().getCapability(WDDCapability.Provider.cap).isPresent()) {
event.addCapability(new ResourceLocation("webdisplays", "wddcapability"), new WDDCapability.Provider());
} }
} }
@ -296,84 +243,87 @@ public class WebDisplays {
@SubscribeEvent @SubscribeEvent
public void onWorldLoad(WorldEvent.Load ev) { public void onWorldLoad(WorldEvent.Load ev) {
if(ev.getWorld().isClientSide() || ev.getWorld().provider.getDimension() != 0) if (ev.getWorld() instanceof Level level) {
return; if (ev.getWorld().isClientSide() || level.dimension() != Level.OVERWORLD)
return;
File worldDir = ev.getWorld().getSaveHandler().getWorldDirectory(); File worldDir = Objects.requireNonNull(ev.getWorld().getServer()).getServerDirectory();
File f = new File(worldDir, "wd_next.txt"); File f = new File(worldDir, "wd_next.txt");
if(f.exists()) { if (f.exists()) {
try { try {
BufferedReader br = new BufferedReader(new FileReader(f)); BufferedReader br = new BufferedReader(new FileReader(f));
String idx = br.readLine(); String idx = br.readLine();
Util.silentClose(br); Util.silentClose(br);
if(idx == null) if (idx == null)
throw new RuntimeException("Seems like the file is empty (1)"); throw new RuntimeException("Seems like the file is empty (1)");
idx = idx.trim(); idx = idx.trim();
if(idx.isEmpty()) if (idx.isEmpty())
throw new RuntimeException("Seems like the file is empty (2)"); throw new RuntimeException("Seems like the file is empty (2)");
lastPadId = Integer.parseInt(idx); //This will throw NumberFormatException if it goes wrong lastPadId = Integer.parseInt(idx); //This will throw NumberFormatException if it goes wrong
} catch(Throwable t) { } catch (Throwable t) {
Log.warningEx("Could not read last minePad ID from %s. I'm afraid this might break all minePads.", t, f.getAbsolutePath()); Log.warningEx("Could not read last minePad ID from %s. I'm afraid this might break all minePads.", t, f.getAbsolutePath());
}
} }
}
if(miniservPort != 0) { if (miniservPort != 0) {
Server sv = Server.getInstance(); Server sv = Server.getInstance();
sv.setPort(miniservPort); sv.setPort(miniservPort);
sv.setDirectory(new File(worldDir, "wd_filehost")); sv.setDirectory(new File(worldDir, "wd_filehost"));
sv.start(); sv.start();
}
} }
} }
@SubscribeEvent @SubscribeEvent
public void onWorldSave(WorldEvent.Save ev) { public void onWorldSave(WorldEvent.Save ev) {
if(ev.getWorld().isClientSide() || ev.getWorld().provider.getDimension() != 0) if(ev.getWorld() instanceof Level level) {
return; if (ev.getWorld().isClientSide() || level.dimension() != Level.OVERWORLD)
return;
File f = new File(Objects.requireNonNull(ev.getWorld().getServer()).getServerDirectory(), "wd_next.txt");
File f = new File(ev.getWorld().getSaveHandler().getWorldDirectory(), "wd_next.txt"); try {
BufferedWriter bw = new BufferedWriter(new FileWriter(f));
try { bw.write("" + lastPadId + "\n");
BufferedWriter bw = new BufferedWriter(new FileWriter(f)); Util.silentClose(bw);
bw.write("" + lastPadId + "\n"); } catch (Throwable t) {
Util.silentClose(bw); Log.warningEx("Could not save last minePad ID (%d) to %s. I'm afraid this might break all minePads.", t, lastPadId, f.getAbsolutePath());
} catch(Throwable t) { }
Log.warningEx("Could not save last minePad ID (%d) to %s. I'm afraid this might break all minePads.", t, lastPadId, f.getAbsolutePath());
} }
} }
@SubscribeEvent @SubscribeEvent
public void onToss(ItemTossEvent ev) { public void onToss(ItemTossEvent ev) {
if(!ev.getEntityItem().world.isRemote) { if(!ev.getEntityItem().getLevel().isClientSide) {
ItemStack is = ev.getEntityItem().getItem(); ItemStack is = ev.getEntityItem().getItem();
if(is.getItem() == itemMinePad) { if(is.getItem() == itemMinePad) {
NBTTagCompound tag = is.getTagCompound(); CompoundTag tag = is.getTag();
if(tag == null) { if(tag == null) {
tag = new NBTTagCompound(); tag = new CompoundTag();
is.setTagCompound(tag); is.setTag(tag);
} }
UUID thrower = ev.getPlayer().getGameProfile().getId(); UUID thrower = ev.getPlayer().getGameProfile().getId();
tag.setLong("ThrowerMSB", thrower.getMostSignificantBits()); tag.putLong("ThrowerMSB", thrower.getMostSignificantBits());
tag.setLong("ThrowerLSB", thrower.getLeastSignificantBits()); tag.putLong("ThrowerLSB", thrower.getLeastSignificantBits());
tag.setDouble("ThrowHeight", ev.getPlayer().getY() + ev.getPlayer().getEyeHeight()); tag.putDouble("ThrowHeight", ev.getPlayer().getY() + ev.getPlayer().getEyeHeight());
} }
} }
} }
@SubscribeEvent @SubscribeEvent
public void onPlayerCraft(PlayerEvent.ItemCraftedEvent ev) { public void onPlayerCraft(PlayerEvent.ItemCraftedEvent ev) {
if(doHardRecipe && ev.getCrafting().getItem() == itemCraftComp && ev.getCrafting().is(CraftComponent.EXTENSION_CARD.makeItemStack()) { if(doHardRecipe && ev.getCrafting().getItem() == itemCraftComp && (CraftComponent.EXTENSION_CARD.makeItemStack().is(ev.getCrafting().getItem()))) {
if((ev.getCrafting() instanceof ServerPlayer && !hasPlayerAdvancement((ServerPlayer) ev.getPlayer(), ADV_PAD_BREAK)) || PROXY.hasClientPlayerAdvancement(ADV_PAD_BREAK) != HasAdvancement.YES) { if((ev.getPlayer() instanceof ServerPlayer && !hasPlayerAdvancement((ServerPlayer) ev.getPlayer(), ADV_PAD_BREAK)) || PROXY.hasClientPlayerAdvancement(ADV_PAD_BREAK) != HasAdvancement.YES) {
ev.getCrafting().setDamageValue(CraftComponent.BAD_EXTENSION_CARD.ordinal()); ev.getCrafting().setDamageValue(CraftComponent.BAD_EXTENSION_CARD.ordinal());
if(!ev.getPlayer().getLevel().isClientSide) if(!ev.getPlayer().getLevel().isClientSide)
ev.getPlayer().getLevel().playSound(null, ev.getPlayer().getX(), ev.getPlayer().getY(), ev.getPlayer().getZ(), SoundEvents.ENTITY_ITEM_BREAK, SoundSource.MASTER, 1.0f, 1.0f); ev.getPlayer().getLevel().playSound(null, ev.getPlayer().getX(), ev.getPlayer().getY(), ev.getPlayer().getZ(), SoundEvents.ITEM_BREAK, SoundSource.MASTER, 1.0f, 1.0f);
} }
} }
} }
@ -387,7 +337,7 @@ public class WebDisplays {
public void onLogIn(PlayerEvent.PlayerLoggedInEvent ev) { public void onLogIn(PlayerEvent.PlayerLoggedInEvent ev) {
if(!ev.getPlayer().getLevel().isClientSide && ev.getPlayer() instanceof ServerPlayer) { if(!ev.getPlayer().getLevel().isClientSide && ev.getPlayer() instanceof ServerPlayer) {
WebDisplays.NET_HANDLER.sendTo(new CMessageServerInfo(miniservPort), (ServerPlayer) ev.getPlayer()); WebDisplays.NET_HANDLER.sendTo(new CMessageServerInfo(miniservPort), (ServerPlayer) ev.getPlayer());
IWDDCapability cap = ev.getPlayer().getCapability(WDDCapability.INSTANCE, null); IWDDCapability cap = (IWDDCapability) ev.getPlayer().getCapability(WDDCapability.Provider.cap, null);
if(cap == null) if(cap == null)
Log.warning("Player %s (%s) has null IWDDCapability!", ev.getPlayer().getName(), ev.getPlayer().getGameProfile().getId().toString()); Log.warning("Player %s (%s) has null IWDDCapability!", ev.getPlayer().getName(), ev.getPlayer().getGameProfile().getId().toString());
@ -415,8 +365,8 @@ public class WebDisplays {
@SubscribeEvent @SubscribeEvent
public void onPlayerClone(net.minecraftforge.event.entity.player.PlayerEvent.Clone ev) { public void onPlayerClone(net.minecraftforge.event.entity.player.PlayerEvent.Clone ev) {
IWDDCapability src = ev.getOriginal().getCapability(WDDCapability.INSTANCE, null); IWDDCapability src = (IWDDCapability) ev.getOriginal().getCapability(WDDCapability.Provider.cap, null);
IWDDCapability dst = ev.getPlayer().getCapability(WDDCapability.INSTANCE, null); IWDDCapability dst = (IWDDCapability) ev.getPlayer().getCapability(WDDCapability.Provider.cap, null);
if(src == null) { if(src == null) {
Log.error("src is null"); Log.error("src is null");
@ -492,7 +442,7 @@ public class WebDisplays {
public static boolean isSiteBlacklisted(String url) { public static boolean isSiteBlacklisted(String url) {
try { try {
URL url2 = new URL(Util.addProtocol(url)); URL url2 = new URL(Util.addProtocol(url));
return Arrays.stream(INSTANCE.blacklist).anyMatch(str -> str.equalsIgnoreCase(url2.getHost())); return INSTANCE.blacklist.stream().anyMatch(str -> str.equalsIgnoreCase(url2.getHost()));
} catch(MalformedURLException ex) { } catch(MalformedURLException ex) {
return false; return false;
} }

View File

@ -13,16 +13,21 @@ import net.minecraft.client.gui.GuiScreen;
import net.minecraft.client.gui.inventory.GuiContainer; 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.multiplayer.ClientAdvancementManager;
import net.minecraft.client.multiplayer.ClientAdvancements;
import net.minecraft.client.renderer.block.model.ModelResourceLocation; 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.renderer.texture.TextureMap;
import net.minecraft.client.resources.IResourceManager; import net.minecraft.client.resources.IResourceManager;
import net.minecraft.client.resources.SimpleReloadableResourceManager; import net.minecraft.client.resources.SimpleReloadableResourceManager;
import net.minecraft.core.BlockPos;
import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.Slot; import net.minecraft.inventory.Slot;
import net.minecraft.item.Item; import net.minecraft.item.Item;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.server.MinecraftServer; import net.minecraft.server.MinecraftServer;
import net.minecraft.server.packs.resources.ResourceManager;
import net.minecraft.util.EnumHand; import net.minecraft.util.EnumHand;
import net.minecraft.util.EnumHandSide; import net.minecraft.util.EnumHandSide;
import net.minecraft.util.NonNullList; import net.minecraft.util.NonNullList;
@ -31,15 +36,16 @@ import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.RayTraceResult; import net.minecraft.util.math.RayTraceResult;
import net.minecraft.util.math.Vec3d; import net.minecraft.util.math.Vec3d;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.minecraftforge.client.event.*; import net.minecraftforge.client.ClientRegistry;
import net.minecraftforge.client.event.ModelBakeEvent;
import net.minecraftforge.client.event.ModelRegistryEvent;
import net.minecraftforge.client.event.TextureStitchEvent;
import net.minecraftforge.client.model.ModelLoader; import net.minecraftforge.client.model.ModelLoader;
import net.minecraftforge.client.resource.IResourceType; import net.minecraftforge.client.resource.IResourceType;
import net.minecraftforge.client.resource.ISelectiveResourceReloadListener;
import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.common.data.ExistingFileHelper;
import net.minecraftforge.event.world.WorldEvent; import net.minecraftforge.event.world.WorldEvent;
import net.minecraftforge.fml.client.registry.ClientRegistry; import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import net.minecraftforge.fml.common.gameevent.TickEvent;
import net.montoyo.mcef.api.*; import net.montoyo.mcef.api.*;
import net.montoyo.wd.SharedProxy; import net.montoyo.wd.SharedProxy;
import net.montoyo.wd.WebDisplays; import net.montoyo.wd.WebDisplays;
@ -55,11 +61,10 @@ import net.montoyo.wd.entity.TileEntityScreen;
import net.montoyo.wd.item.ItemMulti; 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.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.input.Keyboard;
import paulscode.sound.SoundSystemConfig;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import java.lang.reflect.Field; import java.lang.reflect.Field;
@ -68,7 +73,7 @@ import java.net.SocketAddress;
import java.util.*; import java.util.*;
import java.util.function.Predicate; import java.util.function.Predicate;
public class ClientProxy extends SharedProxy implements ISelectiveResourceReloadListener, IDisplayHandler, IJSQueryHandler { public class ClientProxy extends SharedProxy implements IDisplayHandler, IJSQueryHandler {
public class PadData { public class PadData {
@ -101,7 +106,7 @@ public class ClientProxy extends SharedProxy implements ISelectiveResourceReload
//Client-side advancement hack //Client-side advancement hack
private final Field advancementToProgressField = findAdvancementToProgressField(); private final Field advancementToProgressField = findAdvancementToProgressField();
private ClientAdvancementManager lastAdvMgr; private ClientAdvancements lastAdvMgr;
private Map advancementToProgress; private Map advancementToProgress;
//Laser pointer //Laser pointer
@ -122,7 +127,7 @@ public class ClientProxy extends SharedProxy implements ISelectiveResourceReload
@Override @Override
public void preInit() { public void preInit() {
mc = Minecraft.getMinecraft(); 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);
@ -293,7 +298,7 @@ public class ClientProxy extends SharedProxy implements ISelectiveResourceReload
@Override @Override
public MinecraftServer getServer() { public MinecraftServer getServer() {
return mc.getIntegratedServer(); return mc.getSingleplayerServer();
} }
@Override @Override
@ -337,7 +342,7 @@ public class ClientProxy extends SharedProxy implements ISelectiveResourceReload
return; return;
} }
SocketAddress saddr = mc.player.connection.getNetworkManager().channel().remoteAddress(); SocketAddress saddr = mc.player.connection.getConnection().channel().remoteAddress();
if(saddr == null || !(saddr instanceof InetSocketAddress)) { if(saddr == null || !(saddr instanceof InetSocketAddress)) {
Log.warning("Miniserv client: remote address is not inet, assuming local address"); Log.warning("Miniserv client: remote address is not inet, assuming local address");
saddr = new InetSocketAddress("127.0.0.1", 1234); saddr = new InetSocketAddress("127.0.0.1", 1234);
@ -355,11 +360,11 @@ public class ClientProxy extends SharedProxy implements ISelectiveResourceReload
@Override @Override
public void closeGui(BlockPos bp, BlockSide bs) { public void closeGui(BlockPos bp, BlockSide bs) {
if(mc.currentScreen instanceof WDScreen) { if(mc.screen instanceof WDScreen) {
WDScreen scr = (WDScreen) mc.currentScreen; WDScreen scr = (WDScreen) mc.screen;
if(scr.isForBlock(bp, bs)) if(scr.isForBlock(bp, bs))
mc.displayGuiScreen(null); mc.setScreen(null);
} }
} }
@ -376,7 +381,7 @@ public class ClientProxy extends SharedProxy implements ISelectiveResourceReload
/**************************************** RESOURCE MANAGER METHODS ****************************************/ /**************************************** RESOURCE MANAGER METHODS ****************************************/
@Override @Override
public void onResourceManagerReload(IResourceManager resourceManager, Predicate<IResourceType> resourcePredicate) { public void onResourceManagerReload(ResourceManager resourceManager, Predicate<ExistingFileHelper.ResourceType> resourcePredicate) {
Log.info("Resource manager reload: clearing GUI cache..."); Log.info("Resource manager reload: clearing GUI cache...");
GuiLoader.clearCache(); GuiLoader.clearCache();
} }
@ -394,7 +399,7 @@ public class ClientProxy extends SharedProxy implements ISelectiveResourceReload
pd.view.loadURL(WebDisplays.BLACKLIST_URL); pd.view.loadURL(WebDisplays.BLACKLIST_URL);
else { else {
pd.lastURLSent = t; //Avoid spamming the server with porn URLs pd.lastURLSent = t; //Avoid spamming the server with porn URLs
WebDisplays.NET_HANDLER.sendToServer(new SMessagePadCtrl(pd.id, url)); Messages.INSTANCE.sendToServer(new SMessagePadCtrl(pd.id, url));
} }
break; break;
@ -462,9 +467,9 @@ public class ClientProxy extends SharedProxy implements ISelectiveResourceReload
@SubscribeEvent @SubscribeEvent
public void onStitchTextures(TextureStitchEvent.Pre ev) { public void onStitchTextures(TextureStitchEvent.Pre ev) {
TextureMap texMap = ev.getMap(); TextureAtlas texMap = ev.getAtlas();
if(texMap == mc.getTextureMapBlocks()) { if(texMap == mc.getTextureAtlas()) {
for(ResourceModelPair pair : modelBakers) for(ResourceModelPair pair : modelBakers)
pair.getModel().loadTextures(texMap); pair.getModel().loadTextures(texMap);
} }

View File

@ -15,8 +15,10 @@ import net.minecraft.item.crafting.CraftingManager;
import net.minecraft.item.crafting.IRecipe; import net.minecraft.item.crafting.IRecipe;
import net.minecraft.item.crafting.Ingredient; import net.minecraft.item.crafting.Ingredient;
import net.minecraft.item.crafting.ShapedRecipes; import net.minecraft.item.crafting.ShapedRecipes;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.util.NonNullList; import net.minecraft.util.NonNullList;
import net.minecraft.util.ResourceLocation; import net.minecraft.util.ResourceLocation;
import net.minecraft.world.item.ItemStack;
import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly; import net.minecraftforge.fml.relauncher.SideOnly;
import net.montoyo.wd.utilities.Log; import net.montoyo.wd.utilities.Log;

View File

@ -9,20 +9,15 @@ import com.google.gson.JsonElement;
import com.google.gson.JsonObject; import com.google.gson.JsonObject;
import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.PoseStack;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.GuiScreen;
import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.gui.screens.Screen;
import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos;
import net.minecraft.item.ItemStack;
import net.minecraft.network.chat.Component; import net.minecraft.network.chat.Component;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.minecraft.util.ResourceLocation;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ItemStack;
import net.montoyo.wd.WebDisplays; import net.montoyo.wd.WebDisplays;
import net.montoyo.wd.client.gui.controls.Container; import net.montoyo.wd.client.gui.controls.Container;
import net.montoyo.wd.client.gui.controls.Control; import net.montoyo.wd.client.gui.controls.Control;
import net.montoyo.wd.client.gui.controls.Event; import net.montoyo.wd.client.gui.controls.Event;
import net.montoyo.wd.client.gui.controls.List;
import net.montoyo.wd.client.gui.loading.FillControl; import net.montoyo.wd.client.gui.loading.FillControl;
import net.montoyo.wd.client.gui.loading.GuiLoader; import net.montoyo.wd.client.gui.loading.GuiLoader;
import net.montoyo.wd.client.gui.loading.JsonOWrapper; import net.montoyo.wd.client.gui.loading.JsonOWrapper;
@ -31,10 +26,8 @@ import net.montoyo.wd.utilities.BlockSide;
import net.montoyo.wd.utilities.Bounds; import net.montoyo.wd.utilities.Bounds;
import net.montoyo.wd.utilities.Log; import net.montoyo.wd.utilities.Log;
import net.montoyo.wd.utilities.NameUUIDPair; import net.montoyo.wd.utilities.NameUUIDPair;
import org.lwjgl.input.Keyboard; import org.lwjgl.glfw.GLFW;
import org.lwjgl.input.Mouse;
import javax.annotation.Nonnull;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import java.io.IOException; import java.io.IOException;
import java.lang.reflect.Field; import java.lang.reflect.Field;
@ -86,7 +79,7 @@ public abstract class WDScreen extends Screen {
} }
public int screen2DisplayY(int y) { public int screen2DisplayY(int y) {
double ret = ((double) y) / ((double) height) * ((double) minecraft.getWindow().getHeight(); double ret = ((double) y) / ((double) height) * ((double) minecraft.getWindow().getHeight());
return (int) ret; return (int) ret;
} }
@ -131,7 +124,7 @@ public abstract class WDScreen extends Screen {
@Override @Override
public boolean charTyped(char codePoint, int modifiers) { public boolean charTyped(char codePoint, int modifiers) {
if(quitOnEscape && codePoint == Keyboard.KEY_ESCAPE) { if(quitOnEscape && codePoint == GLFW.GLFW_KEY_ESCAPE) {
minecraft.setScreen(null); minecraft.setScreen(null);
return false; return false;
} }

View File

@ -4,7 +4,7 @@
package net.montoyo.wd.client.renderers; package net.montoyo.wd.client.renderers;
import net.minecraft.item.ItemStack; import net.minecraft.world.item.ItemStack;
public interface IItemRenderer { public interface IItemRenderer {

View File

@ -4,11 +4,11 @@
package net.montoyo.wd.client.renderers; package net.montoyo.wd.client.renderers;
import net.minecraft.client.renderer.block.model.IBakedModel; import net.minecraft.client.renderer.texture.TextureAtlas;
import net.minecraft.client.renderer.texture.TextureMap; import net.minecraft.client.resources.model.BakedModel;
public interface IModelBaker extends IBakedModel { public interface IModelBaker extends BakedModel {
void loadTextures(TextureMap texMap); void loadTextures(TextureAtlas texMap);
} }

View File

@ -4,24 +4,25 @@
package net.montoyo.wd.client.renderers; package net.montoyo.wd.client.renderers;
import net.minecraft.client.renderer.*; import com.mojang.blaze3d.platform.GlStateManager;
import net.minecraft.client.renderer.vertex.DefaultVertexFormats; import com.mojang.blaze3d.systems.RenderSystem;
import net.minecraft.item.ItemStack; import com.mojang.blaze3d.vertex.*;
import net.minecraft.util.math.MathHelper; import net.minecraft.world.item.ItemStack;
import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.fml.relauncher.SideOnly; import net.minecraftforge.api.distmarker.OnlyIn;
import org.lwjgl.BufferUtils; import org.lwjgl.BufferUtils;
import java.nio.FloatBuffer; import java.nio.FloatBuffer;
import static org.lwjgl.opengl.GL11.*; import static org.lwjgl.opengl.GL11.*;
@SideOnly(Side.CLIENT) @OnlyIn(Dist.CLIENT)
public final class LaserPointerRenderer implements IItemRenderer { public final class LaserPointerRenderer implements IItemRenderer {
private static final float PI = (float) Math.PI; private static final float PI = (float) Math.PI;
private final Tessellator t = Tessellator.getInstance(); private final Tesselator t = Tesselator.getInstance();
private final BufferBuilder bb = t.getBuffer(); private final BufferBuilder bb = t.getBuilder();
private final VertexBuffer vb = new VertexBuffer();
private final FloatBuffer matrix1 = BufferUtils.createFloatBuffer(16); private final FloatBuffer matrix1 = BufferUtils.createFloatBuffer(16);
private final FloatBuffer renderBuffer = BufferUtils.createFloatBuffer(8); private final FloatBuffer renderBuffer = BufferUtils.createFloatBuffer(8);
@ -37,18 +38,17 @@ public final class LaserPointerRenderer implements IItemRenderer {
@Override @Override
public final void render(ItemStack is, float handSideSign, float swingProgress, float equipProgress) { public final void render(ItemStack is, float handSideSign, float swingProgress, float equipProgress) {
//This whole method is a fucking hack //This whole method is a fucking hack
float sqrtSwingProg = (float) Math.sqrt((double) swingProgress); float sqrtSwingProg = (float) Math.sqrt(swingProgress);
float sinSqrtSwingProg1 = MathHelper.sin(sqrtSwingProg * PI); float sinSqrtSwingProg1 = (float) Math.sin(sqrtSwingProg * PI);
GlStateManager.disableCull(); RenderSystem.disableCull();
GlStateManager.disableTexture2D(); RenderSystem.disableTexture();
GlStateManager.enableRescaleNormal();
//Laser pointer //Laser pointer
glPushMatrix(); glPushMatrix();
glTranslatef(handSideSign * -0.4f * sinSqrtSwingProg1, 0.2f * MathHelper.sin(sqrtSwingProg * PI * 2.0f), -0.2f * MathHelper.sin(swingProgress * PI)); glTranslatef(handSideSign * -0.4f * sinSqrtSwingProg1, (float) (0.2f * Math.sin(sqrtSwingProg * PI * 2.0f)), (float) (-0.2f * Math.sin(swingProgress * PI)));
glTranslatef(handSideSign * 0.56f, -0.52f - equipProgress * 0.6f, -0.72f); glTranslatef(handSideSign * 0.56f, -0.52f - equipProgress * 0.6f, -0.72f);
glRotatef(handSideSign * (45.0f - MathHelper.sin(swingProgress * swingProgress * PI) * 20.0f), 0.0f, 1.0f, 0.0f); glRotatef((float) (handSideSign * (45.0f - Math.sin(swingProgress * swingProgress * PI) * 20.0f)), 0.0f, 1.0f, 0.0f);
glRotatef(handSideSign * sinSqrtSwingProg1 * -20.0f, 0.0f, 0.0f, 1.0f); glRotatef(handSideSign * sinSqrtSwingProg1 * -20.0f, 0.0f, 0.0f, 1.0f);
glRotatef(sinSqrtSwingProg1 * -80.0f, 1.0f, 0.0f, 0.0f); glRotatef(sinSqrtSwingProg1 * -80.0f, 1.0f, 0.0f, 0.0f);
glRotatef(handSideSign * -30.0f, 0.0f, 1.0f, 0.0f); glRotatef(handSideSign * -30.0f, 0.0f, 1.0f, 0.0f);
@ -57,49 +57,44 @@ public final class LaserPointerRenderer implements IItemRenderer {
glScalef(1.0f / 16.0f, 1.0f / 16.0f, 1.0f / 16.0f); glScalef(1.0f / 16.0f, 1.0f / 16.0f, 1.0f / 16.0f);
glColor4f(0.5f, 0.5f, 0.5f, 1.0f); glColor4f(0.5f, 0.5f, 0.5f, 1.0f);
bb.begin(GL_QUADS, DefaultVertexFormats.POSITION_NORMAL); bb.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION);
bb.pos(0.0, 0.0, 0.0).normal(0.0f, 1.0f, 0.0f).endVertex(); bb.vertex(0.0, 0.0, 0.0).endVertex();
bb.pos(1.0, 0.0, 0.0).normal(0.0f, 1.0f, 0.0f).endVertex(); bb.vertex(1.0, 0.0, 0.0).endVertex();
bb.pos(1.0, 0.0, 4.0).normal(0.0f, 1.0f, 0.0f).endVertex(); bb.vertex(1.0, 0.0, 4.0).endVertex();
bb.pos(0.0, 0.0, 4.0).normal(0.0f, 1.0f, 0.0f).endVertex(); bb.vertex(0.0, 0.0, 4.0).endVertex();
bb.pos(0.0, 0.0, 0.0).normal(-1.0f, 0.0f, 0.0f).endVertex(); bb.vertex(0.0, 0.0, 0.0).endVertex();
bb.pos(0.0, -1.0, 0.0).normal(-1.0f, 0.0f, 0.0f).endVertex(); bb.vertex(0.0, -1.0, 0.0).endVertex();
bb.pos(0.0, -1.0, 4.0).normal(-1.0f, 0.0f, 0.0f).endVertex(); bb.vertex(0.0, -1.0, 4.0).endVertex();
bb.pos(0.0, 0.0, 4.0).normal(-1.0f, 0.0f, 0.0f).endVertex(); bb.vertex(0.0, 0.0, 4.0).endVertex();
bb.pos(1.0, 0.0, 0.0).normal(1.0f, 0.0f, 0.0f).endVertex(); bb.vertex(1.0, 0.0, 0.0).endVertex();
bb.pos(1.0, -1.0, 0.0).normal(1.0f, 0.0f, 0.0f).endVertex(); bb.vertex(1.0, -1.0, 0.0).endVertex();
bb.pos(1.0, -1.0, 4.0).normal(1.0f, 0.0f, 0.0f).endVertex(); bb.vertex(1.0, -1.0, 4.0).endVertex();
bb.pos(1.0, 0.0, 4.0).normal(1.0f, 0.0f, 0.0f).endVertex(); bb.vertex(1.0, 0.0, 4.0).endVertex();
bb.pos(0.0, -1.0, 4.0).normal(0.0f, 0.0f, 1.0f).endVertex(); bb.vertex(0.0, -1.0, 4.0).endVertex();
bb.pos(1.0, -1.0, 4.0).normal(0.0f, 0.0f, 1.0f).endVertex(); bb.vertex(1.0, -1.0, 4.0).endVertex();
bb.pos(1.0, 0.0, 4.0).normal(0.0f, 0.0f, 1.0f).endVertex(); bb.vertex(1.0, 0.0, 4.0).endVertex();
bb.pos(0.0, 0.0, 4.0).normal(0.0f, 0.0f, 1.0f).endVertex(); bb.vertex(0.0, 0.0, 4.0).endVertex();
t.draw(); vb.draw();
if(isOn) { if(isOn) {
glTranslatef(0.5f, -0.5f, 0.0f); glTranslatef(0.5f, -0.5f, 0.0f);
matrix1.position(0); matrix1.position(0);
glGetFloat(GL_MODELVIEW_MATRIX, matrix1); //Hax to get that damn position glGetFloat(GL_MODELVIEW_MATRIX); //Hax to get that damn position
} }
glPopMatrix(); glPopMatrix();
if(isOn) { if(isOn) {
RenderHelper.disableStandardItemLighting();
GlStateManager.setActiveTexture(OpenGlHelper.lightmapTexUnit);
GlStateManager.disableTexture2D();
GlStateManager.setActiveTexture(OpenGlHelper.defaultTexUnit);
//Actual laser //Actual laser
glPushMatrix(); glPushMatrix();
glLoadIdentity(); glLoadIdentity();
GlStateManager.enableBlend(); RenderSystem.enableBlend();
GlStateManager.tryBlendFuncSeparate(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA, GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.DST_ALPHA); RenderSystem.blendFunc(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.DST_ALPHA);
glColor4f(1.0f, 0.0f, 0.0f, 0.5f); glColor4f(1.0f, 0.0f, 0.0f, 0.5f);
GlStateManager.glLineWidth(3.0f); RenderSystem.lineWidth(3.0f);
matrix1.position(12); matrix1.position(12);
renderBuffer.put(matrix1.get()); renderBuffer.put(matrix1.get());
@ -107,14 +102,14 @@ public final class LaserPointerRenderer implements IItemRenderer {
renderBuffer.put(matrix1.get() - 0.02f); //I know this is stupid, but it's the only thing that worked... renderBuffer.put(matrix1.get() - 0.02f); //I know this is stupid, but it's the only thing that worked...
renderBuffer.put(matrix1.get()); renderBuffer.put(matrix1.get());
renderBuffer.position(0); renderBuffer.position(0);
glVertexPointer(4, 0, renderBuffer); glVertexPointer(4, 0, 0 , renderBuffer);
glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_VERTEX_ARRAY);
glDrawArrays(GL_LINES, 0, 2); glDrawArrays(GL_LINES, 0, 2);
glDisableClientState(GL_VERTEX_ARRAY); glDisableClientState(GL_VERTEX_ARRAY);
glPopMatrix(); glPopMatrix();
} }
GlStateManager.enableTexture2D(); //Fix for shitty minecraft fire RenderSystem.enableTexture(); //Fix for shitty minecraft fire
} }
} }

View File

@ -5,26 +5,21 @@
package net.montoyo.wd.client.renderers; package net.montoyo.wd.client.renderers;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.entity.AbstractClientPlayer; import net.minecraft.resources.ResourceLocation;
import net.minecraft.client.renderer.OpenGlHelper; import net.minecraft.world.item.ItemStack;
import net.minecraft.client.renderer.RenderHelper; import net.minecraftforge.api.distmarker.Dist;
import net.minecraft.client.renderer.entity.RenderPlayer; import net.minecraftforge.api.distmarker.OnlyIn;
import net.minecraft.item.ItemStack;
import net.minecraft.util.ResourceLocation;
import net.minecraft.util.math.MathHelper;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import net.montoyo.wd.WebDisplays; import net.montoyo.wd.WebDisplays;
import net.montoyo.wd.client.ClientProxy; import net.montoyo.wd.client.ClientProxy;
import static org.lwjgl.opengl.GL11.*; import static org.lwjgl.opengl.GL11.*;
import static org.lwjgl.opengl.GL12.GL_RESCALE_NORMAL; import static org.lwjgl.opengl.GL12.GL_RESCALE_NORMAL;
@SideOnly(Side.CLIENT) @OnlyIn(Dist.CLIENT)
public final class MinePadRenderer implements IItemRenderer { public final class MinePadRenderer implements IItemRenderer {
private static final float PI = (float) Math.PI; private static final float PI = (float) Math.PI;
private final Minecraft mc = Minecraft.getMinecraft(); private final Minecraft mc = Minecraft.getInstance();
private final ResourceLocation tex = new ResourceLocation("webdisplays", "textures/models/minepad.png"); private final ResourceLocation tex = new ResourceLocation("webdisplays", "textures/models/minepad.png");
private final ModelMinePad model = new ModelMinePad(); private final ModelMinePad model = new ModelMinePad();
private final ClientProxy clientProxy = (ClientProxy) WebDisplays.PROXY; private final ClientProxy clientProxy = (ClientProxy) WebDisplays.PROXY;
@ -50,11 +45,11 @@ public final class MinePadRenderer implements IItemRenderer {
@Override @Override
public final void render(ItemStack is, float handSideSign, float swingProgress, float equipProgress) { public final void render(ItemStack is, float handSideSign, float swingProgress, float equipProgress) {
//Pre-compute values //Pre-compute values
float sqrtSwingProg = (float) Math.sqrt((double) swingProgress); float sqrtSwingProg = (float) Math.sqrt(swingProgress);
sinSqrtSwingProg1 = MathHelper.sin(sqrtSwingProg * PI); sinSqrtSwingProg1 = (float) Math.sin(sqrtSwingProg * PI);
sinSqrtSwingProg2 = MathHelper.sin(sqrtSwingProg * PI * 2.0f); sinSqrtSwingProg2 = (float) Math.sin(sqrtSwingProg * PI * 2.0f);
sinSwingProg1 = MathHelper.sin(swingProgress * PI); sinSwingProg1 = (float) Math.sin(swingProgress * PI);
sinSwingProg2 = MathHelper.sin(swingProgress * swingProgress * PI); sinSwingProg2 = (float) Math.sin(swingProgress * swingProgress * PI);
glDisable(GL_CULL_FACE); glDisable(GL_CULL_FACE);
glEnable(GL_RESCALE_NORMAL); glEnable(GL_RESCALE_NORMAL);
@ -86,20 +81,17 @@ public final class MinePadRenderer implements IItemRenderer {
glPushMatrix(); glPushMatrix();
glRotatef(-90.0f, 1.0f, 0.0f, 0.0f); glRotatef(-90.0f, 1.0f, 0.0f, 0.0f);
glColor4f(1.0f, 1.0f, 1.0f, 1.0f); glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
mc.renderEngine.bindTexture(tex); //TODO mc.renderEngine.bindTexture(tex);
model.render(1.f / 16.f); model.render(1.f / 16.f);
glPopMatrix(); glPopMatrix();
//Render web view //Render web view
if(is.getTagCompound() != null && is.getTagCompound().hasKey("PadID")) { if(is.getTag() != null && is.getTag().contains("PadID")) {
ClientProxy.PadData pd = clientProxy.getPadByID(is.getTagCompound().getInteger("PadID")); ClientProxy.PadData pd = clientProxy.getPadByID(is.getTag().getInt("PadID"));
if(pd != null) { if(pd != null) {
glTranslatef(0.063f, 0.28f, 0.001f); glTranslatef(0.063f, 0.28f, 0.001f);
RenderHelper.disableStandardItemLighting();
OpenGlHelper.setActiveTexture(OpenGlHelper.lightmapTexUnit);
glDisable(GL_TEXTURE_2D); glDisable(GL_TEXTURE_2D);
OpenGlHelper.setActiveTexture(OpenGlHelper.defaultTexUnit);
pd.view.draw(0.0, 0.0, 27.65 / 32.0 + 0.01, 14.0 / 32.0 + 0.002); pd.view.draw(0.0, 0.0, 27.65 / 32.0 + 0.01, 14.0 / 32.0 + 0.002);
} }
} }
@ -124,13 +116,13 @@ public final class MinePadRenderer implements IItemRenderer {
glRotatef(handSideSign * -135.0f, 0.0f, 1.0f, 0.0f); glRotatef(handSideSign * -135.0f, 0.0f, 1.0f, 0.0f);
glTranslatef(handSideSign * 5.6f, 0.0f, 0.0f); glTranslatef(handSideSign * 5.6f, 0.0f, 0.0f);
RenderPlayer playerRenderer = (RenderPlayer) mc.getRenderManager().<AbstractClientPlayer>getEntityRenderObject(mc.player); /*RenderPlayer playerRenderer = (RenderPlayer) mc.getRenderManager().<AbstractClientPlayer>getEntityRenderObject(mc.player);
mc.getTextureManager().bindTexture(mc.player.getLocationSkin()); mc.getTextureManager().bindTexture(mc.player.getLocationSkin());
if(handSideSign >= 0.0f) if(handSideSign >= 0.0f)
playerRenderer.renderRightArm(mc.player); playerRenderer.renderRightArm(mc.player);
else else
playerRenderer.renderLeftArm(mc.player); playerRenderer.renderLeftArm(mc.player);*/
} }
} }

View File

@ -4,24 +4,26 @@
package net.montoyo.wd.client.renderers; package net.montoyo.wd.client.renderers;
import net.minecraft.client.model.ModelBase; import com.mojang.blaze3d.vertex.PoseStack;
import net.minecraft.client.model.ModelRenderer; import com.mojang.blaze3d.vertex.VertexConsumer;
import net.minecraftforge.fml.relauncher.Side; import net.minecraft.client.model.Model;
import net.minecraftforge.fml.relauncher.SideOnly; import net.minecraft.client.model.geom.ModelPart;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
@SideOnly(Side.CLIENT) @OnlyIn(Dist.CLIENT)
public final class ModelMinePad extends ModelBase { public final class ModelMinePad extends Model {
// fields // fields
private final ModelRenderer base; private final ModelPart base;
private final ModelRenderer left; private final ModelPart left;
private final ModelRenderer right; private final ModelPart right;
public ModelMinePad() { public ModelMinePad() {
textureWidth = 64; textureWidth = 64;
textureHeight = 32; textureHeight = 32;
base = new ModelRenderer(this, 0, 0); base = new ModelPart(this, 0, 0);
base.addBox(0F, 0F, 0F, 14, 1, 9); base.addBox(0F, 0F, 0F, 14, 1, 9);
base.setRotationPoint(1F, 0F, 3.5F); base.setRotationPoint(1F, 0F, 3.5F);
base.setTextureSize(64, 32); base.setTextureSize(64, 32);
@ -47,10 +49,14 @@ public final class ModelMinePad extends ModelBase {
right.render(f5); right.render(f5);
} }
private void clearRotation(ModelRenderer model) { private void clearRotation(ModelPart model) {
model.rotateAngleX = 0.0f; model.rotateAngleX = 0.0f;
model.rotateAngleY = 0.0f; model.rotateAngleY = 0.0f;
model.rotateAngleZ = 0.0f; model.rotateAngleZ = 0.0f;
} }
@Override
public void renderToBuffer(PoseStack poseStack, VertexConsumer buffer, int packedLight, int packedOverlay, float red, float green, float blue, float alpha) {
}
} }

View File

@ -5,15 +5,20 @@
package net.montoyo.wd.client.renderers; package net.montoyo.wd.client.renderers;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
import com.mojang.blaze3d.vertex.DefaultVertexFormat;
import net.minecraft.block.state.IBlockState; import net.minecraft.block.state.IBlockState;
import net.minecraft.client.renderer.block.model.BakedQuad; import net.minecraft.client.renderer.block.model.BakedQuad;
import net.minecraft.client.renderer.block.model.ItemCameraTransforms; import net.minecraft.client.renderer.block.model.ItemCameraTransforms;
import net.minecraft.client.renderer.block.model.ItemOverrideList; import net.minecraft.client.renderer.block.model.ItemOverrideList;
import net.minecraft.client.renderer.texture.TextureAtlas;
import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.client.renderer.texture.TextureAtlasSprite;
import net.minecraft.client.renderer.texture.TextureMap; import net.minecraft.client.renderer.texture.TextureMap;
import net.minecraft.client.renderer.vertex.DefaultVertexFormats; import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
import net.minecraft.core.Direction;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.util.EnumFacing; import net.minecraft.util.EnumFacing;
import net.minecraft.util.ResourceLocation; import net.minecraft.util.ResourceLocation;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraftforge.common.property.IExtendedBlockState; import net.minecraftforge.common.property.IExtendedBlockState;
import net.montoyo.wd.block.BlockScreen; import net.montoyo.wd.block.BlockScreen;
import net.montoyo.wd.utilities.BlockSide; import net.montoyo.wd.utilities.BlockSide;
@ -30,12 +35,12 @@ public class ScreenBaker implements IModelBaker {
private static final List<BakedQuad> noQuads = ImmutableList.of(); private static final List<BakedQuad> noQuads = ImmutableList.of();
private final TextureAtlasSprite[] texs = new TextureAtlasSprite[16]; private final TextureAtlasSprite[] texs = new TextureAtlasSprite[16];
private final BlockSide[] blockSides = BlockSide.values(); private final BlockSide[] blockSides = BlockSide.values();
private final EnumFacing[] blockFacings = EnumFacing.values(); private final Direction[] blockFacings = Direction.values();
@Override @Override
public void loadTextures(TextureMap texMap) { public void loadTextures(TextureAtlas texMap) {
for(int i = 0; i < texs.length; i++) for(int i = 0; i < texs.length; i++)
texs[i] = texMap.registerSprite(new ResourceLocation("webdisplays", "blocks/screen" + i)); texs[i] = texMap.getSprite(new ResourceLocation("webdisplays", "blocks/screen" + i));
} }
private void putVertex(int[] buf, int pos, Vector3f vpos, TextureAtlasSprite tex, Vector3f uv, Vector3i normal) { private void putVertex(int[] buf, int pos, Vector3f vpos, TextureAtlasSprite tex, Vector3f uv, Vector3i normal) {
@ -43,8 +48,8 @@ public class ScreenBaker implements IModelBaker {
buf[pos * 7 + 1] = Float.floatToRawIntBits(vpos.y); buf[pos * 7 + 1] = Float.floatToRawIntBits(vpos.y);
buf[pos * 7 + 2] = Float.floatToRawIntBits(vpos.z); buf[pos * 7 + 2] = Float.floatToRawIntBits(vpos.z);
buf[pos * 7 + 3] = 0xFFFFFFFF; //Color, let this white... buf[pos * 7 + 3] = 0xFFFFFFFF; //Color, let this white...
buf[pos * 7 + 4] = Float.floatToRawIntBits(tex.getInterpolatedU(uv.x)); buf[pos * 7 + 4] = Float.floatToRawIntBits(tex.getU(uv.x));
buf[pos * 7 + 5] = Float.floatToRawIntBits(tex.getInterpolatedV(uv.y)); buf[pos * 7 + 5] = Float.floatToRawIntBits(tex.getV(uv.y));
int nx = (normal.x * 127) & 0xFF; int nx = (normal.x * 127) & 0xFF;
int ny = (normal.y * 127) & 0xFF; int ny = (normal.y * 127) & 0xFF;
@ -86,16 +91,14 @@ public class ScreenBaker implements IModelBaker {
putVertex(data, 1, rotateVec(new Vector3f(1.0f, 0.0f, 1.0f), side), tex, rotateTex(side, 16.0f, 16.0f), side.backward); putVertex(data, 1, rotateVec(new Vector3f(1.0f, 0.0f, 1.0f), side), tex, rotateTex(side, 16.0f, 16.0f), side.backward);
putVertex(data, 0, rotateVec(new Vector3f(1.0f, 0.0f, 0.0f), side), tex, rotateTex(side, 16.0f, 0.0f ), side.backward); putVertex(data, 0, rotateVec(new Vector3f(1.0f, 0.0f, 0.0f), side), tex, rotateTex(side, 16.0f, 0.0f ), side.backward);
return new BakedQuad(data, 0xFFFFFFFF, blockFacings[side.ordinal()], tex, true, DefaultVertexFormats.ITEM); return new BakedQuad(data, 0xFFFFFFFF, blockFacings[side.ordinal()], tex, true, DefaultVertexFormat.ITEM);
} }
@Override
@Nonnull @Nonnull
public List<BakedQuad> getQuads(@Nullable IBlockState state, @Nullable EnumFacing side, long rand) { public List<BakedQuad> getQuads(@Nullable BlockState state, @Nullable Direction side, long rand) {
if(side == null) if(side == null)
return noQuads; return noQuads;
BlockState bs = state;
IExtendedBlockState bs = (IExtendedBlockState) state;
List<BakedQuad> ret = new ArrayList<>(); List<BakedQuad> ret = new ArrayList<>();
int sid = BlockSide.reverse(side.ordinal()); int sid = BlockSide.reverse(side.ordinal());

View File

@ -6,6 +6,8 @@ package net.montoyo.wd.core;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.CompoundTag;
import net.minecraft.tags.TagKey;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ItemStack;
import net.montoyo.wd.WebDisplays; import net.montoyo.wd.WebDisplays;
@ -34,8 +36,8 @@ public enum CraftComponent {
return name; return name;
} }
public ItemStack makeItemStack(CompoundTag compoundTag) { public ItemStack makeItemStack() {
return new ItemStack(WebDisplays.INSTANCE.itemCraftComp, 1, compoundTag); return new ItemStack(WebDisplays.INSTANCE.itemCraftComp, 1);
} }
} }

View File

@ -4,78 +4,61 @@
package net.montoyo.wd.core; package net.montoyo.wd.core;
import net.minecraft.nbt.NBTBase; import net.minecraft.core.Direction;
import net.minecraft.nbt.NBTTagByte; import net.minecraft.nbt.CompoundTag;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.EnumFacing;
import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.capabilities.Capability;
import net.minecraftforge.common.capabilities.CapabilityInject; import net.minecraftforge.common.capabilities.CapabilityManager;
import net.minecraftforge.common.capabilities.CapabilityToken;
import net.minecraftforge.common.capabilities.ICapabilitySerializable; import net.minecraftforge.common.capabilities.ICapabilitySerializable;
import net.minecraftforge.common.util.LazyOptional;
import org.jetbrains.annotations.NotNull;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import java.util.concurrent.Callable; import java.util.concurrent.Callable;
public class WDDCapability implements IWDDCapability { public class WDDCapability implements IWDDCapability {
@CapabilityInject(IWDDCapability.class)
public static final Capability<IWDDCapability> INSTANCE = null;
public static class Storage implements Capability.IStorage<IWDDCapability> {
@Nullable
@Override
public NBTBase writeNBT(Capability<IWDDCapability> cap, IWDDCapability inst, EnumFacing side) {
NBTTagCompound tag = new NBTTagCompound();
tag.setBoolean("FirstRun", inst.isFirstRun());
return tag;
}
@Override
public void readNBT(Capability<IWDDCapability> cap, IWDDCapability inst, EnumFacing side, NBTBase nbt) {
if(nbt instanceof NBTTagCompound) {
NBTTagCompound tag = (NBTTagCompound) nbt;
if(tag.hasKey("FirstRun") && tag.getTag("FirstRun") instanceof NBTTagByte && !tag.getBoolean("FirstRun"))
inst.clearFirstRun();
}
}
}
public static class Factory implements Callable<IWDDCapability> { public static class Factory implements Callable<IWDDCapability> {
@Override @Override
public IWDDCapability call() throws Exception { public IWDDCapability call() {
return new WDDCapability(); return new WDDCapability();
} }
} }
public static class Provider implements ICapabilitySerializable<NBTBase> { public static class Provider implements ICapabilitySerializable<CompoundTag> {
private IWDDCapability cap = INSTANCE.getDefaultInstance(); public static Capability<IWDDCapability> cap = CapabilityManager.get(new CapabilityToken<>(){});
private final LazyOptional<IWDDCapability> INSTANCE = LazyOptional.of(this::createWDDCapability);
@NotNull
@Override @Override
public boolean hasCapability(@Nonnull Capability<?> cap, @Nullable EnumFacing f) { public <T> LazyOptional<T> getCapability(@NotNull Capability<T> capability, @org.jetbrains.annotations.Nullable Direction arg) {
return cap == INSTANCE; return cap == capability ? INSTANCE.cast() : LazyOptional.empty();
}
@Nullable
@Override
public <T> T getCapability(@Nonnull Capability<T> cap, @Nullable EnumFacing f) {
return cap == INSTANCE ? INSTANCE.cast(this.cap) : null;
} }
@Override @Override
public NBTBase serializeNBT() { public CompoundTag serializeNBT() {
return INSTANCE.getStorage().writeNBT(INSTANCE, cap, null); CompoundTag tag = new CompoundTag();
if (INSTANCE.isPresent()) {
INSTANCE.ifPresent(cap -> tag.put("Tag", tag));
}
return tag;
} }
@Override @Override
public void deserializeNBT(NBTBase nbt) { public void deserializeNBT(CompoundTag tag) {
INSTANCE.getStorage().readNBT(INSTANCE, cap, null, nbt); if (INSTANCE.isPresent()) {
INSTANCE.ifPresent(cap -> {
tag.get("Tag");
});
}
}
@Nonnull
private IWDDCapability createWDDCapability() {
return cap == null ? new WDDCapability() : (IWDDCapability) cap;
} }
} }

View File

@ -4,21 +4,25 @@
package net.montoyo.wd.entity; package net.montoyo.wd.entity;
import net.minecraft.block.state.IBlockState; import net.minecraft.client.renderer.blockentity.BlockEntityRenderers;
import net.minecraft.entity.item.EntityItem; import net.minecraft.core.BlockPos;
import net.minecraft.entity.player.EntityPlayer; import net.minecraft.core.Direction;
import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.nbt.CompoundTag;
import net.minecraft.item.ItemStack; import net.minecraft.nbt.ListTag;
import net.minecraft.nbt.NBTTagCompound; import net.minecraft.resources.ResourceLocation;
import net.minecraft.nbt.NBTTagList; import net.minecraft.server.level.ServerPlayer;
import net.minecraft.tileentity.TileEntity; import net.minecraft.sounds.SoundEvent;
import net.minecraft.util.*; import net.minecraft.sounds.SoundSource;
import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.world.InteractionHand;
import net.minecraft.util.math.BlockPos; import net.minecraft.world.entity.item.ItemEntity;
import net.minecraft.util.math.MathHelper; import net.minecraft.world.entity.player.Player;
import net.minecraft.world.World; import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.ItemLike;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraftforge.fml.common.network.NetworkRegistry; import net.minecraft.world.level.block.entity.BlockEntityType;
import net.minecraft.world.level.block.state.BlockState;
import net.montoyo.mcef.api.IBrowser; import net.montoyo.mcef.api.IBrowser;
import net.montoyo.wd.WebDisplays; import net.montoyo.wd.WebDisplays;
import net.montoyo.wd.block.BlockScreen; import net.montoyo.wd.block.BlockScreen;
@ -27,20 +31,26 @@ import net.montoyo.wd.core.IUpgrade;
import net.montoyo.wd.core.JSServerRequest; import net.montoyo.wd.core.JSServerRequest;
import net.montoyo.wd.core.ScreenRights; import net.montoyo.wd.core.ScreenRights;
import net.montoyo.wd.data.ScreenConfigData; import net.montoyo.wd.data.ScreenConfigData;
import net.montoyo.wd.net.Messages;
import net.montoyo.wd.net.client.CMessageAddScreen; import net.montoyo.wd.net.client.CMessageAddScreen;
import net.montoyo.wd.net.client.CMessageCloseGui; import net.montoyo.wd.net.client.CMessageCloseGui;
import net.montoyo.wd.net.client.CMessageJSResponse; import net.montoyo.wd.net.client.CMessageJSResponse;
import net.montoyo.wd.net.client.CMessageScreenUpdate; import net.montoyo.wd.net.client.CMessageScreenUpdate;
import net.montoyo.wd.net.server.SMessageRequestTEData; import net.montoyo.wd.net.server.SMessageRequestTEData;
import net.montoyo.wd.utilities.*; import net.montoyo.wd.utilities.*;
import net.montoyo.wd.utilities.Rotation;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import java.util.*; import java.util.ArrayList;
import java.util.Collections;
import java.util.UUID;
import java.util.function.Consumer; import java.util.function.Consumer;
public class TileEntityScreen extends BlockEntity { public class TileEntityScreen extends BlockEntity{
public TileEntityScreen(BlockEntityType<?> arg, BlockPos arg2, BlockState arg3) {
super(arg, arg2, arg3);
}
public static class Screen { public static class Screen {
@ -58,16 +68,16 @@ public class TileEntityScreen extends BlockEntity {
public ArrayList<ItemStack> upgrades; public ArrayList<ItemStack> upgrades;
public boolean doTurnOnAnim; public boolean doTurnOnAnim;
public long turnOnTime; public long turnOnTime;
public EntityPlayer laserUser; public Player laserUser;
public final Vector2i lastMousePos = new Vector2i(); public final Vector2i lastMousePos = new Vector2i();
public NibbleArray redstoneStatus; //null on client public NibbleArray redstoneStatus; //null on client
public boolean autoVolume = true; public boolean autoVolume = true;
public static Screen deserialize(NBTTagCompound tag) { public static Screen deserialize(CompoundTag tag) {
Screen ret = new Screen(); Screen ret = new Screen();
ret.side = BlockSide.values()[tag.getByte("Side")]; ret.side = BlockSide.values()[tag.getByte("Side")];
ret.size = new Vector2i(tag.getInteger("Width"), tag.getInteger("Height")); ret.size = new Vector2i(tag.getInt("Width"), tag.getInt("Height"));
ret.resolution = new Vector2i(tag.getInteger("ResolutionX"), tag.getInteger("ResolutionY")); ret.resolution = new Vector2i(tag.getInt("ResolutionX"), tag.getInt("ResolutionY"));
ret.rotation = Rotation.values()[tag.getByte("Rotation")]; ret.rotation = Rotation.values()[tag.getByte("Rotation")];
ret.url = tag.getString("URL"); ret.url = tag.getString("URL");
ret.videoType = VideoType.getTypeFromURL(ret.url); ret.videoType = VideoType.getTypeFromURL(ret.url);
@ -82,76 +92,76 @@ public class TileEntityScreen extends BlockEntity {
ret.resolution.y = (int) psy; ret.resolution.y = (int) psy;
} }
if(tag.hasKey("OwnerName")) { if(tag.contains("OwnerName")) {
String name = tag.getString("OwnerName"); String name = tag.getString("OwnerName");
UUID uuid = tag.getUniqueId("OwnerUUID"); UUID uuid = tag.getUUID("OwnerUUID");
ret.owner = new NameUUIDPair(name, uuid); ret.owner = new NameUUIDPair(name, uuid);
} }
NBTTagList friends = tag.getTagList("Friends", 10); ListTag friends = tag.getList("Friends", 10);
ret.friends = new ArrayList<>(friends.tagCount()); ret.friends = new ArrayList<>(friends.size());
for(int i = 0; i < friends.tagCount(); i++) { for(int i = 0; i < friends.size(); i++) {
NBTTagCompound nf = friends.getCompoundTagAt(i); CompoundTag nf = friends.getCompound(i);
NameUUIDPair pair = new NameUUIDPair(nf.getString("Name"), nf.getUniqueId("UUID")); NameUUIDPair pair = new NameUUIDPair(nf.getString("Name"), nf.getUUID("UUID"));
ret.friends.add(pair); ret.friends.add(pair);
} }
ret.friendRights = tag.getByte("FriendRights"); ret.friendRights = tag.getByte("FriendRights");
ret.otherRights = tag.getByte("OtherRights"); ret.otherRights = tag.getByte("OtherRights");
NBTTagList upgrades = tag.getTagList("Upgrades", 10); ListTag upgrades = tag.getList("Upgrades", 10);
ret.upgrades = new ArrayList<>(); ret.upgrades = new ArrayList<>();
for(int i = 0; i < upgrades.tagCount(); i++) for(int i = 0; i < upgrades.size(); i++)
ret.upgrades.add(new ItemStack(upgrades.getCompoundTagAt(i))); ret.upgrades.add(new ItemStack((ItemLike) upgrades.getCompound(i)));
if(tag.hasKey("AutoVolume")) if(tag.contains("AutoVolume"))
ret.autoVolume = tag.getBoolean("AutoVolume"); ret.autoVolume = tag.getBoolean("AutoVolume");
return ret; return ret;
} }
public NBTTagCompound serialize() { public CompoundTag serialize() {
NBTTagCompound tag = new NBTTagCompound(); CompoundTag tag = new CompoundTag();
tag.setByte("Side", (byte) side.ordinal()); tag.putByte("Side", (byte) side.ordinal());
tag.setInteger("Width", size.x); tag.putInt("Width", size.x);
tag.setInteger("Height", size.y); tag.putInt("Height", size.y);
tag.setInteger("ResolutionX", resolution.x); tag.putInt("ResolutionX", resolution.x);
tag.setInteger("ResolutionY", resolution.y); tag.putInt("ResolutionY", resolution.y);
tag.setByte("Rotation", (byte) rotation.ordinal()); tag.putByte("Rotation", (byte) rotation.ordinal());
tag.setString("URL", url); tag.putString("URL", url);
if(owner == null) if(owner == null)
Log.warning("Found TES with NO OWNER!!"); Log.warning("Found TES with NO OWNER!!");
else { else {
tag.setString("OwnerName", owner.name); tag.putString("OwnerName", owner.name);
tag.setUniqueId("OwnerUUID", owner.uuid); tag.putUUID("OwnerUUID", owner.uuid);
} }
NBTTagList list = new NBTTagList(); ListTag list = new ListTag();
for(NameUUIDPair f: friends) { for(NameUUIDPair f: friends) {
NBTTagCompound nf = new NBTTagCompound(); CompoundTag nf = new CompoundTag();
nf.setString("Name", f.name); nf.putString("Name", f.name);
nf.setUniqueId("UUID", f.uuid); nf.putUUID("UUID", f.uuid);
list.appendTag(nf); list.add(nf);
} }
tag.setTag("Friends", list); tag.put("Friends", list);
tag.setByte("FriendRights", (byte) friendRights); tag.putByte("FriendRights", (byte) friendRights);
tag.setByte("OtherRights", (byte) otherRights); tag.putByte("OtherRights", (byte) otherRights);
list = new NBTTagList(); list = new ListTag();
for(ItemStack is: upgrades) for(ItemStack is: upgrades)
list.appendTag(is.writeToNBT(new NBTTagCompound())); list.add(is.save(new CompoundTag()));
tag.setTag("Upgrades", list); tag.put("Upgrades", list);
tag.setBoolean("AutoVolume", autoVolume); tag.putBoolean("AutoVolume", autoVolume);
return tag; return tag;
} }
public int rightsFor(EntityPlayer ply) { public int rightsFor(Player ply) {
return rightsFor(ply.getGameProfile().getId()); return rightsFor(ply.getGameProfile().getId());
} }
@ -162,8 +172,8 @@ public class TileEntityScreen extends BlockEntity {
return friends.stream().anyMatch(f -> f.uuid.equals(uuid)) ? friendRights : otherRights; return friends.stream().anyMatch(f -> f.uuid.equals(uuid)) ? friendRights : otherRights;
} }
public void setupRedstoneStatus(World world, BlockPos start) { public void setupRedstoneStatus(Level world, BlockPos start) {
if(world.isRemote) { if(world.isClientSide()) {
Log.warning("Called Screen.setupRedstoneStatus() on client."); Log.warning("Called Screen.setupRedstoneStatus() on client.");
return; return;
} }
@ -173,16 +183,19 @@ public class TileEntityScreen extends BlockEntity {
return; return;
} }
Direction[] VALUES = Direction.values();
redstoneStatus = new NibbleArray(size.x * size.y); redstoneStatus = new NibbleArray(size.x * size.y);
final EnumFacing facing = EnumFacing.VALUES[side.reverse().ordinal()]; final Direction facing = VALUES[side.reverse().ordinal()];
final ScreenIterator it = new ScreenIterator(start, side, size); final ScreenIterator it = new ScreenIterator(start, side, size);
while(it.hasNext()) { while(it.hasNext()) {
int idx = it.getIndex(); int idx = it.getIndex();
redstoneStatus.set(idx, world.getRedstonePower(it.next(), facing)); redstoneStatus.set(idx, world.getSignal(it.next(), facing));
} }
} }
public void clampResolution() { public void clampResolution() {
if(resolution.x > WebDisplays.INSTANCE.maxResX) { if(resolution.x > WebDisplays.INSTANCE.maxResX) {
float newY = ((float) resolution.y) * ((float) WebDisplays.INSTANCE.maxResX) / ((float) resolution.x); float newY = ((float) resolution.y) * ((float) WebDisplays.INSTANCE.maxResX) / ((float) resolution.x);
@ -203,7 +216,7 @@ public class TileEntityScreen extends BlockEntity {
Screen scr = getScreen(side); Screen scr = getScreen(side);
if(scr != null) { if(scr != null) {
ScreenIterator it = new ScreenIterator(pos, side, scr.size); ScreenIterator it = new ScreenIterator(getBlockPos(), side, scr.size);
while(it.hasNext()) while(it.hasNext())
func.accept(it.next()); func.accept(it.next());
@ -211,7 +224,7 @@ public class TileEntityScreen extends BlockEntity {
} }
private final ArrayList<Screen> screens = new ArrayList<>(); private final ArrayList<Screen> screens = new ArrayList<>();
private AxisAlignedBB renderBB = new AxisAlignedBB(0.0, 0.0, 0.0, 1.0, 1.0, 1.0); private net.minecraft.world.phys.AABB renderBB = new net.minecraft.world.phys.AABB(0.0, 0.0, 0.0, 1.0, 1.0, 1.0);
private boolean loaded = true; private boolean loaded = true;
public float ytVolume = Float.POSITIVE_INFINITY; public float ytVolume = Float.POSITIVE_INFINITY;
@ -235,36 +248,33 @@ public class TileEntityScreen extends BlockEntity {
} }
@Override @Override
public void readFromNBT(NBTTagCompound tag) { public void deserializeNBT(CompoundTag tag) {
super.readFromNBT(tag); super.deserializeNBT(tag);
NBTTagList list = tag.getTagList("WDScreens", 10); ListTag list = tag.getList("WDScreens", 10);
if(list.hasNoTags()) if(list.isEmpty())
return; return;
screens.clear(); screens.clear();
for(int i = 0; i < list.tagCount(); i++) for(int i = 0; i < list.size(); i++)
screens.add(Screen.deserialize(list.getCompoundTagAt(i))); screens.add(Screen.deserialize(list.getCompound(i)));
} }
@Override @Override
@Nonnull @Nonnull
public NBTTagCompound writeToNBT(NBTTagCompound tag) { public CompoundTag serializeNBT() {
super.writeToNBT(tag); CompoundTag tag = new CompoundTag();
super.serializeNBT();
NBTTagList list = new NBTTagList(); ListTag list = new ListTag();
for(Screen scr: screens) for(Screen scr: screens)
list.appendTag(scr.serialize()); list.add(scr.serialize());
tag.setTag("WDScreens", list); tag.put("WDScreens", list);
return tag; return tag;
} }
private NetworkRegistry.TargetPoint point() { public Screen addScreen(BlockSide side, Vector2i size, @Nullable Vector2i resolution, @Nullable Player owner, boolean sendUpdate) {
return new NetworkRegistry.TargetPoint(world.provider.getDimension(), (double) pos.getX(), (double) pos.getY(), (double) pos.getZ(), 64.0);
}
public Screen addScreen(BlockSide side, Vector2i size, @Nullable Vector2i resolution, @Nullable EntityPlayer owner, boolean sendUpdate) {
for(Screen scr: screens) { for(Screen scr: screens) {
if(scr.side == side) if(scr.side == side)
return scr; return scr;
@ -283,7 +293,7 @@ public class TileEntityScreen extends BlockEntity {
ret.owner = new NameUUIDPair(owner.getGameProfile()); ret.owner = new NameUUIDPair(owner.getGameProfile());
if(side == BlockSide.TOP || side == BlockSide.BOTTOM) { if(side == BlockSide.TOP || side == BlockSide.BOTTOM) {
int rot = MathHelper.floor(((double) (owner.rotationYaw * 4.0f / 360.0f)) + 2.5) & 3; int rot = (int) Math.floor(((double) (owner.getYRot() * 4.0f / 360.0f)) + 2.5) & 3;
if(side == BlockSide.TOP) { if(side == BlockSide.TOP) {
if(rot == 1) if(rot == 1)
@ -308,16 +318,16 @@ public class TileEntityScreen extends BlockEntity {
ret.clampResolution(); ret.clampResolution();
if(!world.isRemote) { if(!level.isClientSide) {
ret.setupRedstoneStatus(world, pos); ret.setupRedstoneStatus(level, getBlockPos());
if(sendUpdate) if(sendUpdate)
WebDisplays.NET_HANDLER.sendToAllAround(new CMessageAddScreen(this, ret), point()); Messages.INSTANCE.sendTo(new CMessageAddScreen(this, ret), point());
} }
screens.add(ret); screens.add(ret);
if(world.isRemote) if(level.isClientSide)
updateAABB(); updateAABB();
else else
markDirty(); markDirty();
@ -345,13 +355,13 @@ public class TileEntityScreen extends BlockEntity {
public void clear() { public void clear() {
screens.clear(); screens.clear();
if(!world.isRemote) if(!level.isClientSide)
markDirty(); markDirty();
} }
public void requestData(EntityPlayerMP ep) { public void requestData(ServerPlayer ep) {
if(!world.isRemote) if(!level.isClientSide)
WebDisplays.NET_HANDLER.sendTo(new CMessageAddScreen(this), ep); Messages.INSTANCE.sendTo(new CMessageAddScreen(this), ep);
} }
public void setScreenURL(BlockSide side, String url) { public void setScreenURL(BlockSide side, String url) {
@ -365,11 +375,11 @@ public class TileEntityScreen extends BlockEntity {
scr.url = url; scr.url = url;
scr.videoType = VideoType.getTypeFromURL(url); scr.videoType = VideoType.getTypeFromURL(url);
if(world.isRemote) { if(level.isClientSide) {
if(scr.browser != null) if(scr.browser != null)
scr.browser.loadURL(url); scr.browser.loadURL(url);
} else { } else {
WebDisplays.NET_HANDLER.sendToAllAround(CMessageScreenUpdate.setURL(this, side, url), point()); Messages.INSTANCE.sendTo(CMessageScreenUpdate.setURL(this, side, url), point());
markDirty(); markDirty();
} }
} }
@ -388,19 +398,19 @@ public class TileEntityScreen extends BlockEntity {
return; return;
} }
if(world.isRemote) { if(level.isClientSide) {
if(screens.get(idx).browser != null) { if(screens.get(idx).browser != null) {
screens.get(idx).browser.close(); screens.get(idx).browser.close();
screens.get(idx).browser = null; screens.get(idx).browser = null;
} }
} else } else
WebDisplays.NET_HANDLER.sendToAllAround(new CMessageScreenUpdate(this, side), point()); //Delete the screen Messages.INSTANCE(new CMessageScreenUpdate(this, side), point()); //Delete the screen
screens.remove(idx); screens.remove(idx);
if(!world.isRemote) { if(!level.isClientSide) {
if(screens.isEmpty()) //No more screens: remove tile entity if(screens.isEmpty()) //No more screens: remove tile entity
world.setBlockState(pos, WebDisplays.INSTANCE.blockScreen.getDefaultState().withProperty(BlockScreen.hasTE, false)); level.setBlock(getBlockPos(), WebDisplays.INSTANCE.blockScreen.getDefaultInstance().withProperty(BlockScreen.hasTE, false));
else else
markDirty(); markDirty();
} }
@ -421,22 +431,22 @@ public class TileEntityScreen extends BlockEntity {
scr.resolution = res; scr.resolution = res;
scr.clampResolution(); scr.clampResolution();
if(world.isRemote) { if(level.isClientSide) {
WebDisplays.PROXY.screenUpdateResolutionInGui(new Vector3i(pos), side, res); WebDisplays.PROXY.screenUpdateResolutionInGui(new Vector3i(getBlockPos()), side, res);
if(scr.browser != null) { if(scr.browser != null) {
scr.browser.close(); scr.browser.close();
scr.browser = null; //Will be re-created by renderer scr.browser = null; //Will be re-created by renderer
} }
} else { } else {
WebDisplays.NET_HANDLER.sendToAllAround(CMessageScreenUpdate.setResolution(this, side, res), point()); Messages.INSTANCE.sendTo(CMessageScreenUpdate.setResolution(this, side, res), point());
markDirty(); markDirty();
} }
} }
private static EntityPlayer getLaserUser(Screen scr) { private static Player getLaserUser(Screen scr) {
if(scr.laserUser != null) { if(scr.laserUser != null) {
if(scr.laserUser.isDead || scr.laserUser.getHeldItem(EnumHand.MAIN_HAND).getItem() != WebDisplays.INSTANCE.itemLaserPointer) if(scr.laserUser.isRemoved() || scr.laserUser.getItemInHand(InteractionHand.MAIN_HAND).getItem() != WebDisplays.INSTANCE.itemLaserPointer)
scr.laserUser = null; scr.laserUser = null;
} }
@ -462,16 +472,16 @@ public class TileEntityScreen extends BlockEntity {
return; return;
} }
if(world.isRemote) if(level.isClientSide)
Log.warning("TileEntityScreen.click() from client side is useless..."); Log.warning("TileEntityScreen.click() from client side is useless...");
else if(getLaserUser(scr) == null) else if(getLaserUser(scr) == null)
WebDisplays.NET_HANDLER.sendToAllAround(CMessageScreenUpdate.click(this, side, CMessageScreenUpdate.MOUSE_CLICK, vec), point()); Messages.INSTANCE.sendTo(CMessageScreenUpdate.click(this, side, CMessageScreenUpdate.MOUSE_CLICK, vec), point());
} }
void clickUnsafe(BlockSide side, int action, int x, int y) { void clickUnsafe(BlockSide side, int action, int x, int y) {
if(world.isRemote) { if(level.isClientSide) {
Vector2i vec = (action == CMessageScreenUpdate.MOUSE_UP) ? null : new Vector2i(x, y); Vector2i vec = (action == CMessageScreenUpdate.MOUSE_UP) ? null : new Vector2i(x, y);
WebDisplays.NET_HANDLER.sendToAllAround(CMessageScreenUpdate.click(this, side, action, vec), point()); Messages.INSTANCE.sendTo(CMessageScreenUpdate.click(this, side, action, vec), point());
} }
} }
@ -509,14 +519,14 @@ public class TileEntityScreen extends BlockEntity {
return; return;
} }
if(world.isRemote) { if(level.isClientSide) {
if(scr.browser != null) if(scr.browser != null)
scr.browser.runJS("if(typeof webdisplaysRedstoneCallback == \"function\") webdisplaysRedstoneCallback(" + vec.x + ", " + vec.y + ", " + redstoneLevel + ");", ""); scr.browser.runJS("if(typeof webdisplaysRedstoneCallback == \"function\") webdisplaysRedstoneCallback(" + vec.x + ", " + vec.y + ", " + redstoneLevel + ");", "");
} else { } else {
boolean sendMsg = false; boolean sendMsg = false;
if(scr.redstoneStatus == null) { if(scr.redstoneStatus == null) {
scr.setupRedstoneStatus(world, pos); scr.setupRedstoneStatus(level, getBlockPos());
sendMsg = true; sendMsg = true;
} else { } else {
int idx = vec.y * scr.size.x + vec.x; int idx = vec.y * scr.size.x + vec.x;
@ -528,12 +538,12 @@ public class TileEntityScreen extends BlockEntity {
} }
if(sendMsg) if(sendMsg)
WebDisplays.NET_HANDLER.sendToAllAround(CMessageScreenUpdate.jsRedstone(this, side, vec, redstoneLevel), point()); Messages.INSTANCE.sendTo(CMessageScreenUpdate.jsRedstone(this, side, vec, redstoneLevel), point());
} }
} }
public void handleJSRequest(EntityPlayerMP src, BlockSide side, int reqId, JSServerRequest req, Object[] data) { public void handleJSRequest(ServerPlayer src, BlockSide side, int reqId, JSServerRequest req, Object[] data) {
if(world.isRemote) { if(level.isClientSide) {
Log.error("Called handleJSRequest client-side"); Log.error("Called handleJSRequest client-side");
return; return;
} }
@ -541,24 +551,24 @@ public class TileEntityScreen extends BlockEntity {
Screen scr = getScreen(side); Screen scr = getScreen(side);
if(scr == null) { if(scr == null) {
Log.error("Called handleJSRequest on non-existing side %s", side.toString()); Log.error("Called handleJSRequest on non-existing side %s", side.toString());
WebDisplays.NET_HANDLER.sendTo(new CMessageJSResponse(reqId, req, 403, "Invalid side"), src); Messages.INSTANCE.sendTo(new CMessageJSResponse(reqId, req, 403, "Invalid side"), src);
return; return;
} }
if(!scr.owner.uuid.equals(src.getGameProfile().getId())) { if(!scr.owner.uuid.equals(src.getGameProfile().getId())) {
Log.warning("Player %s (UUID %s) tries to use the redstone output API on a screen he doesn't own!", src.getName(), src.getGameProfile().getId().toString()); Log.warning("Player %s (UUID %s) tries to use the redstone output API on a screen he doesn't own!", src.getName(), src.getGameProfile().getId().toString());
WebDisplays.NET_HANDLER.sendTo(new CMessageJSResponse(reqId, req, 403, "Only the owner can do that"), src); Messages.INSTANCE.sendTo(new CMessageJSResponse(reqId, req, 403, "Only the owner can do that"), src);
return; return;
} }
if(scr.upgrades.stream().noneMatch(DefaultUpgrade.REDSTONE_OUTPUT::matches)) { if(scr.upgrades.stream().noneMatch(DefaultUpgrade.REDSTONE_OUTPUT::matches)) {
WebDisplays.NET_HANDLER.sendTo(new CMessageJSResponse(reqId, req, 403, "Missing upgrade"), src); Messages.INSTANCE.sendTo(new CMessageJSResponse(reqId, req, 403, "Missing upgrade"), src);
return; return;
} }
if(req == JSServerRequest.CLEAR_REDSTONE) { if(req == JSServerRequest.CLEAR_REDSTONE) {
final BlockPos.MutableBlockPos mbp = new BlockPos.MutableBlockPos(); final BlockPos.MutableBlockPos mbp = new BlockPos.MutableBlockPos();
final Vector3i vec1 = new Vector3i(pos); final Vector3i vec1 = new Vector3i(getBlockPos());
final Vector3i vec2 = new Vector3i(); final Vector3i vec2 = new Vector3i();
for(int y = 0; y < scr.size.y; y++) { for(int y = 0; y < scr.size.y; y++) {
@ -567,9 +577,9 @@ public class TileEntityScreen extends BlockEntity {
for(int x = 0; x < scr.size.x; x++) { for(int x = 0; x < scr.size.x; x++) {
vec2.toBlock(mbp); vec2.toBlock(mbp);
IBlockState bs = world.getBlockState(mbp); BlockState bs = level.getBlockState(mbp);
if(bs.getValue(BlockScreen.emitting)) if(bs.getValue(BlockScreen.emitting))
world.setBlockState(mbp, bs.withProperty(BlockScreen.emitting, false)); level.setBlock(mbp, bs.setValue(BlockScreen.emitting, false), Block.UPDATE_ALL_IMMEDIATE);
vec2.add(side.right.x, side.right.y, side.right.z); vec2.add(side.right.x, side.right.y, side.right.z);
} }
@ -577,38 +587,38 @@ public class TileEntityScreen extends BlockEntity {
vec1.add(side.up.x, side.up.y, side.up.z); vec1.add(side.up.x, side.up.y, side.up.z);
} }
WebDisplays.NET_HANDLER.sendTo(new CMessageJSResponse(reqId, req, new byte[0]), src); Messages.INSTANCE.sendTo(new CMessageJSResponse(reqId, req, new byte[0]), src);
} else if(req == JSServerRequest.SET_REDSTONE_AT) { } else if(req == JSServerRequest.SET_REDSTONE_AT) {
int x = (Integer) data[0]; int x = (Integer) data[0];
int y = (Integer) data[1]; int y = (Integer) data[1];
boolean state = (Boolean) data[2]; boolean state = (Boolean) data[2];
if(x < 0 || x >= scr.size.x || y < 0 || y >= scr.size.y) if(x < 0 || x >= scr.size.x || y < 0 || y >= scr.size.y)
WebDisplays.NET_HANDLER.sendTo(new CMessageJSResponse(reqId, req, 403, "Out of range"), src); Messages.INSTANCE.sendTo(new CMessageJSResponse(reqId, req, 403, "Out of range"), src);
else { else {
BlockPos bp = (new Vector3i(pos)).addMul(side.right, x).addMul(side.up, y).toBlock(); BlockPos bp = (new Vector3i(getBlockPos())).addMul(side.right, x).addMul(side.up, y).toBlock();
IBlockState bs = world.getBlockState(bp); BlockState bs = level.getBlockState(bp);
if(bs.getValue(BlockScreen.emitting) != state) if(!bs.getValue(BlockScreen.emitting).equals(state))
world.setBlockState(bp, bs.withProperty(BlockScreen.emitting, state)); level.setBlock(bp, bs.setValue(BlockScreen.emitting, state));
WebDisplays.NET_HANDLER.sendTo(new CMessageJSResponse(reqId, req, new byte[0]), src); Messages.INSTANCE.sendTo(new CMessageJSResponse(reqId, req, new byte[0]), src);
} }
} else } else
WebDisplays.NET_HANDLER.sendTo(new CMessageJSResponse(reqId, req, 400, "Invalid request"), src); Messages.INSTANCE.sendTo(new CMessageJSResponse(reqId, req, 400, "Invalid request"), src);
} }
@Override @Override
public void onLoad() { public void onLoad() {
if(world.isRemote) { if(level.isClientSide) {
WebDisplays.NET_HANDLER.sendToServer(new SMessageRequestTEData(this)); Messages.INSTANCE.sendToServer(new SMessageRequestTEData(this));
WebDisplays.PROXY.trackScreen(this, true); WebDisplays.PROXY.trackScreen(this, true);
} }
} }
@Override @Override
public void onChunkUnload() { public void onChunkUnloaded() {
if(world.isRemote) { if(level.isClientSide) {
WebDisplays.PROXY.trackScreen(this, false); WebDisplays.PROXY.trackScreen(this, false);
for(Screen scr: screens) { for(Screen scr: screens) {
@ -621,7 +631,7 @@ public class TileEntityScreen extends BlockEntity {
} }
private void updateAABB() { private void updateAABB() {
Vector3i origin = new Vector3i(pos); Vector3i origin = new Vector3i(getBlockPos());
Vector3i tmp = new Vector3i(); Vector3i tmp = new Vector3i();
AABB aabb = new AABB(origin); AABB aabb = new AABB(origin);
@ -634,12 +644,12 @@ public class TileEntityScreen extends BlockEntity {
aabb.expand(tmp); aabb.expand(tmp);
} }
renderBB = aabb.toMc().expand(0.1, 0.1, 0.1); renderBB = aabb.toMc().expandTowards(0.1, 0.1, 0.1);
} }
@Override @Override
@Nonnull @Nonnull
public AxisAlignedBB getRenderBoundingBox() { public net.minecraft.world.phys.AABB getRenderBoundingBox() {
return renderBB; return renderBB;
} }
@ -694,15 +704,15 @@ public class TileEntityScreen extends BlockEntity {
} }
@Override @Override
public void invalidate() { public void invalidateCaps() {
super.invalidate(); super.invalidateCaps();
if(world.isRemote) if(level.isClientSide)
onChunkUnload(); onChunkUnloaded();
} }
public void addFriend(EntityPlayerMP ply, BlockSide side, NameUUIDPair pair) { public void addFriend(ServerPlayer ply, BlockSide side, NameUUIDPair pair) {
if(!world.isRemote) { if(!level.isClientSide) {
Screen scr = getScreen(side); Screen scr = getScreen(side);
if(scr == null) { if(scr == null) {
Log.error("Tried to add friend to invalid screen side %s", side.toString()); Log.error("Tried to add friend to invalid screen side %s", side.toString());
@ -711,14 +721,14 @@ public class TileEntityScreen extends BlockEntity {
if(!scr.friends.contains(pair)) { if(!scr.friends.contains(pair)) {
scr.friends.add(pair); scr.friends.add(pair);
(new ScreenConfigData(new Vector3i(pos), side, scr)).updateOnly().sendTo(point()); (new ScreenConfigData(new Vector3i(getBlockPos()), side, scr)).updateOnly().sendTo(point());
markDirty(); markDirty();
} }
} }
} }
public void removeFriend(EntityPlayerMP ply, BlockSide side, NameUUIDPair pair) { public void removeFriend(ServerPlayer ply, BlockSide side, NameUUIDPair pair) {
if(!world.isRemote) { if(!level.isClientSide) {
Screen scr = getScreen(side); Screen scr = getScreen(side);
if(scr == null) { if(scr == null) {
Log.error("Tried to remove friend from invalid screen side %s", side.toString()); Log.error("Tried to remove friend from invalid screen side %s", side.toString());
@ -727,14 +737,14 @@ public class TileEntityScreen extends BlockEntity {
if(scr.friends.remove(pair)) { if(scr.friends.remove(pair)) {
checkLaserUserRights(scr); checkLaserUserRights(scr);
(new ScreenConfigData(new Vector3i(pos), side, scr)).updateOnly().sendTo(point()); (new ScreenConfigData(new Vector3i(getBlockPos()), side, scr)).updateOnly().sendTo(point());
markDirty(); markDirty();
} }
} }
} }
public void setRights(EntityPlayerMP ply, BlockSide side, int fr, int or) { public void setRights(ServerPlayer ply, BlockSide side, int fr, int or) {
if(!world.isRemote) { if(!level.isClientSide) {
Screen scr = getScreen(side); Screen scr = getScreen(side);
if(scr == null) { if(scr == null) {
Log.error("Tried to change rights of invalid screen on side %s", side.toString()); Log.error("Tried to change rights of invalid screen on side %s", side.toString());
@ -745,7 +755,7 @@ public class TileEntityScreen extends BlockEntity {
scr.otherRights = or; scr.otherRights = or;
checkLaserUserRights(scr); checkLaserUserRights(scr);
(new ScreenConfigData(new Vector3i(pos), side, scr)).updateOnly().sendTo(point()); (new ScreenConfigData(new Vector3i(getBlockPos()), side, scr)).updateOnly().sendTo(point());
markDirty(); markDirty();
} }
} }
@ -757,7 +767,7 @@ public class TileEntityScreen extends BlockEntity {
return; return;
} }
if(world.isRemote) { if(level.isClientSide) {
if(scr.browser != null) { if(scr.browser != null) {
try { try {
if(text.startsWith("t")) { if(text.startsWith("t")) {
@ -795,7 +805,7 @@ public class TileEntityScreen extends BlockEntity {
} }
} }
} else { } else {
WebDisplays.NET_HANDLER.sendToAllAround(CMessageScreenUpdate.type(this, side, text), point()); Messages.INSTANCE.sendTo(CMessageScreenUpdate.type(this, side, text), point());
if(soundPos != null) if(soundPos != null)
playSoundAt(WebDisplays.INSTANCE.soundTyping, soundPos, 0.25f, 1.f); playSoundAt(WebDisplays.INSTANCE.soundTyping, soundPos, 0.25f, 1.f);
@ -803,11 +813,11 @@ public class TileEntityScreen extends BlockEntity {
} }
private void playSoundAt(SoundEvent snd, BlockPos at, float vol, float pitch) { private void playSoundAt(SoundEvent snd, BlockPos at, float vol, float pitch) {
double x = (double) at.getX(); double x = at.getX();
double y = (double) at.getY(); double y = at.getY();
double z = (double) at.getZ(); double z = at.getZ();
world.playSound(null, x + 0.5, y + 0.5, z + 0.5, snd, SoundCategory.BLOCKS, vol, pitch); level.playSound(null, x + 0.5, y + 0.5, z + 0.5, snd, SoundSource.BLOCKS, vol, pitch);
} }
public void updateUpgrades(BlockSide side, ItemStack[] upgrades) { public void updateUpgrades(BlockSide side, ItemStack[] upgrades) {
@ -835,8 +845,8 @@ public class TileEntityScreen extends BlockEntity {
} }
//If equal is null, no duplicate check is preformed //If equal is null, no duplicate check is preformed
public boolean addUpgrade(BlockSide side, ItemStack is, @Nullable EntityPlayer player, boolean abortIfExisting) { public boolean addUpgrade(BlockSide side, ItemStack is, @Nullable Player player, boolean abortIfExisting) {
if(world.isRemote) if(level.isClientSide)
return false; return false;
Screen scr = getScreen(side); Screen scr = getScreen(side);
@ -863,9 +873,9 @@ public class TileEntityScreen extends BlockEntity {
isCopy.setCount(1); isCopy.setCount(1);
scr.upgrades.add(isCopy); scr.upgrades.add(isCopy);
WebDisplays.NET_HANDLER.sendToAllAround(CMessageScreenUpdate.upgrade(this, side), point()); Messages.INSTANCE.sendTo(CMessageScreenUpdate.upgrade(this, side), point());
itemAsUpgrade.onInstall(this, side, player, isCopy); itemAsUpgrade.onInstall(this, side, player, isCopy);
playSoundAt(WebDisplays.INSTANCE.soundUpgradeAdd, pos, 1.0f, 1.0f); playSoundAt(WebDisplays.INSTANCE.soundUpgradeAdd, getBlockPos(), 1.0f, 1.0f);
markDirty(); markDirty();
return true; return true;
} }
@ -887,8 +897,8 @@ public class TileEntityScreen extends BlockEntity {
return scr != null && scr.upgrades.stream().anyMatch(du::matches); return scr != null && scr.upgrades.stream().anyMatch(du::matches);
} }
public void removeUpgrade(BlockSide side, ItemStack is, @Nullable EntityPlayer player) { public void removeUpgrade(BlockSide side, ItemStack is, @Nullable Player player) {
if(world.isRemote) if(level.isClientSide)
return; return;
Screen scr = getScreen(side); Screen scr = getScreen(side);
@ -915,33 +925,35 @@ public class TileEntityScreen extends BlockEntity {
if(idxToRemove >= 0) { if(idxToRemove >= 0) {
dropUpgrade(scr.upgrades.get(idxToRemove), side, player); dropUpgrade(scr.upgrades.get(idxToRemove), side, player);
scr.upgrades.remove(idxToRemove); scr.upgrades.remove(idxToRemove);
WebDisplays.NET_HANDLER.sendToAllAround(CMessageScreenUpdate.upgrade(this, side), point()); Messages.INSTANCE.sendTo(CMessageScreenUpdate.upgrade(this, side), point());
playSoundAt(WebDisplays.INSTANCE.soundUpgradeDel, pos, 1.0f, 1.0f); playSoundAt(WebDisplays.INSTANCE.soundUpgradeDel, getBlockPos(), 1.0f, 1.0f);
markDirty(); markDirty();
} else } else
Log.warning("Tried to remove non-existing upgrade %s to screen %s at %s", safeName(is), side.toString(), pos.toString()); Log.warning("Tried to remove non-existing upgrade %s to screen %s at %s", safeName(is), side.toString(), pos.toString());
} }
private void dropUpgrade(ItemStack is, BlockSide side, @Nullable EntityPlayer ply) { private void dropUpgrade(ItemStack is, BlockSide side, @Nullable Player ply) {
if(!((IUpgrade) is.getItem()).onRemove(this, side, ply, is)) { //Drop upgrade item if(!((IUpgrade) is.getItem()).onRemove(this, side, ply, is)) { //Drop upgrade item
boolean spawnDrop = true; boolean spawnDrop = true;
if(ply != null) { if(ply != null) {
if(ply.isCreative() || ply.addItemStackToInventory(is)) if(ply.isCreative() || ply.addItem(is))
spawnDrop = false; //If in creative or if the item was added to the player's inventory, don't spawn drop entity spawnDrop = false; //If in creative or if the item was added to the player's inventory, don't spawn drop entity
} }
if(spawnDrop) { if(spawnDrop) {
Vector3f pos = new Vector3f((float) this.pos.getX(), (float) this.pos.getY(), (float) this.pos.getZ()); Vector3f pos = new Vector3f((float) this.getBlockPos().getX(), (float) this.getBlockPos().getY(), (float) this.getBlockPos().getZ());
pos.addMul(side.backward.toFloat(), 1.5f); pos.addMul(side.backward.toFloat(), 1.5f);
world.spawnEntity(new EntityItem(world, (double) pos.x, (double) pos.y, (double) pos.z, is)); if(level != null) {
level.addFreshEntity(new ItemEntity(level, pos.x, pos.y, pos.z, is));
}
} }
} }
} }
private Screen getScreenForLaserOp(BlockSide side, EntityPlayer ply) { private Screen getScreenForLaserOp(BlockSide side, Player ply) {
if(world.isRemote) if(level.isClientSide)
return null; return null;
Screen scr = getScreen(side); Screen scr = getScreen(side);
@ -961,7 +973,7 @@ public class TileEntityScreen extends BlockEntity {
return scr; //Okay, go for it... return scr; //Okay, go for it...
} }
public void laserDownMove(BlockSide side, EntityPlayer ply, Vector2i pos, boolean down) { public void laserDownMove(BlockSide side, Player ply, Vector2i pos, boolean down) {
Screen scr = getScreenForLaserOp(side, ply); Screen scr = getScreenForLaserOp(side, ply);
if(scr != null) { if(scr != null) {
@ -969,35 +981,35 @@ public class TileEntityScreen extends BlockEntity {
//Try to acquire laser lock //Try to acquire laser lock
if(getLaserUser(scr) == null) { if(getLaserUser(scr) == null) {
scr.laserUser = ply; scr.laserUser = ply;
WebDisplays.NET_HANDLER.sendToAllAround(CMessageScreenUpdate.click(this, side, CMessageScreenUpdate.MOUSE_DOWN, pos), point()); Messages.INSTANCE.sendTo(CMessageScreenUpdate.click(this, side, CMessageScreenUpdate.MOUSE_DOWN, pos), point());
} }
} else if(getLaserUser(scr) == ply) } else if(getLaserUser(scr) == ply)
WebDisplays.NET_HANDLER.sendToAllAround(CMessageScreenUpdate.click(this, side, CMessageScreenUpdate.MOUSE_MOVE, pos), point()); Messages.INSTANCE.sendTo(CMessageScreenUpdate.click(this, side, CMessageScreenUpdate.MOUSE_MOVE, pos), point());
} }
} }
public void laserUp(BlockSide side, EntityPlayer ply) { public void laserUp(BlockSide side, Player ply) {
Screen scr = getScreenForLaserOp(side, ply); Screen scr = getScreenForLaserOp(side, ply);
if(scr != null) { if(scr != null) {
if(getLaserUser(scr) == ply) { if(getLaserUser(scr) == ply) {
scr.laserUser = null; scr.laserUser = null;
WebDisplays.NET_HANDLER.sendToAllAround(CMessageScreenUpdate.click(this, side, CMessageScreenUpdate.MOUSE_UP, null), point()); Messages.INSTANCE.sendTo(CMessageScreenUpdate.click(this, side, CMessageScreenUpdate.MOUSE_UP, null), point());
} }
} }
} }
public void onDestroy(@Nullable EntityPlayer ply) { public void onDestroy(@Nullable Player ply) {
for(Screen scr: screens) { for(Screen scr: screens) {
scr.upgrades.forEach(is -> dropUpgrade(is, scr.side, ply)); scr.upgrades.forEach(is -> dropUpgrade(is, scr.side, ply));
scr.upgrades.clear(); scr.upgrades.clear();
} }
WebDisplays.NET_HANDLER.sendToAllAround(new CMessageCloseGui(pos), point()); Messages.INSTANCE.sendTo(new CMessageCloseGui(getBlockPos()), point());
} }
public void setOwner(BlockSide side, EntityPlayer newOwner) { public void setOwner(BlockSide side, Player newOwner) {
if(world.isRemote) { if(level.isClientSide) {
Log.error("Called TileEntityScreen.setOwner() on client..."); Log.error("Called TileEntityScreen.setOwner() on client...");
return; return;
} }
@ -1014,7 +1026,7 @@ public class TileEntityScreen extends BlockEntity {
} }
scr.owner = new NameUUIDPair(newOwner.getGameProfile()); scr.owner = new NameUUIDPair(newOwner.getGameProfile());
WebDisplays.NET_HANDLER.sendToAllAround(CMessageScreenUpdate.owner(this, side, scr.owner), point()); Messages.INSTANCE.sendTo(CMessageScreenUpdate.owner(this, side, scr.owner), point());
checkLaserUserRights(scr); checkLaserUserRights(scr);
markDirty(); markDirty();
} }
@ -1026,11 +1038,11 @@ public class TileEntityScreen extends BlockEntity {
return; return;
} }
if(world.isRemote) { if(level.isClientSide) {
boolean oldWasVertical = scr.rotation.isVertical; boolean oldWasVertical = scr.rotation.isVertical;
scr.rotation = rot; scr.rotation = rot;
WebDisplays.PROXY.screenUpdateRotationInGui(new Vector3i(pos), side, rot); WebDisplays.PROXY.screenUpdateRotationInGui(new Vector3i(getBlockPos()), side, rot);
if(scr.browser != null && oldWasVertical != rot.isVertical) { if(scr.browser != null && oldWasVertical != rot.isVertical) {
scr.browser.close(); scr.browser.close();
@ -1038,7 +1050,7 @@ public class TileEntityScreen extends BlockEntity {
} }
} else { } else {
scr.rotation = rot; scr.rotation = rot;
WebDisplays.NET_HANDLER.sendToAllAround(CMessageScreenUpdate.rotation(this, side, rot), point()); Messages.INSTANCE.sendTo(CMessageScreenUpdate.rotation(this, side, rot), point());
markDirty(); markDirty();
} }
} }
@ -1050,11 +1062,11 @@ public class TileEntityScreen extends BlockEntity {
return; return;
} }
if(world.isRemote) { if(level.isClientSide) {
if(scr.browser != null) if(scr.browser != null)
scr.browser.runJS(code, ""); scr.browser.runJS(code, "");
} else } else
WebDisplays.NET_HANDLER.sendToAllAround(CMessageScreenUpdate.js(this, side, code), point()); Messages.INSTANCE.sendTo(CMessageScreenUpdate.js(this, side, code), point());
} }
public void setAutoVolume(BlockSide side, boolean av) { public void setAutoVolume(BlockSide side, boolean av) {
@ -1066,16 +1078,17 @@ public class TileEntityScreen extends BlockEntity {
scr.autoVolume = av; scr.autoVolume = av;
if(world.isRemote) if(level.isClientSide)
WebDisplays.PROXY.screenUpdateAutoVolumeInGui(new Vector3i(pos), side, av); WebDisplays.PROXY.screenUpdateAutoVolumeInGui(new Vector3i(getBlockPos()), side, av);
else { else {
WebDisplays.NET_HANDLER.sendToAllAround(CMessageScreenUpdate.autoVolume(this, side, av), point()); Messages.INSTANCE.sendTo(CMessageScreenUpdate.autoVolume(this, side, av), point());
markDirty(); markDirty();
} }
} }
@Override @Override
public boolean shouldRefresh(World world, BlockPos pos, @Nonnull IBlockState oldState, @Nonnull IBlockState newState) { public boolean shouldRefresh(Level world, BlockPos pos, @Nonnull BlockState oldState, @Nonnull BlockState newState) {
if(oldState.getBlock() != WebDisplays.INSTANCE.blockScreen || newState.getBlock() != WebDisplays.INSTANCE.blockScreen) if(oldState.getBlock() != WebDisplays.INSTANCE.blockScreen || newState.getBlock() != WebDisplays.INSTANCE.blockScreen)
return true; return true;

View File

@ -1,20 +0,0 @@
/*
* Copyright (C) 2018 BARBOTIN Nicolas
*/
package net.montoyo.wd.net;
import net.minecraftforge.fml.common.network.simpleimpl.IMessage;
import net.minecraftforge.fml.common.network.simpleimpl.IMessageHandler;
import net.minecraftforge.fml.common.network.simpleimpl.MessageContext;
import net.montoyo.wd.WebDisplays;
public class DefaultHandler implements IMessageHandler<IMessage, IMessage> {
@Override
public IMessage onMessage(IMessage message, MessageContext ctx) {
WebDisplays.PROXY.enqueue((Runnable) message);
return null;
}
}

View File

@ -1,21 +0,0 @@
/*
* Copyright (C) 2018 BARBOTIN Nicolas
*/
package net.montoyo.wd.net;
import net.minecraftforge.fml.relauncher.Side;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Message {
int messageId();
Side side();
}

View File

@ -4,71 +4,36 @@
package net.montoyo.wd.net; package net.montoyo.wd.net;
import net.minecraftforge.fml.common.network.simpleimpl.IMessage; import net.minecraft.resources.ResourceLocation;
import net.minecraftforge.fml.common.network.simpleimpl.IMessageHandler; import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.fml.common.network.simpleimpl.SimpleNetworkWrapper; import net.minecraftforge.api.distmarker.OnlyIn;
import net.montoyo.wd.net.client.*; import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.montoyo.wd.net.server.*; import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent;
import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent;
import net.minecraftforge.network.NetworkRegistry;
import net.minecraftforge.network.simple.SimpleChannel;
import net.montoyo.wd.net.client.CMessageACResult;
import java.lang.reflect.Modifier; public class Messages {
import java.util.ArrayList;
public abstract class Messages { private static final String PROTOCOL_VERSION = "1";
private static int index = 0;
public static final SimpleChannel INSTANCE = NetworkRegistry.newSimpleChannel(
new ResourceLocation("webdisplays", "packetsystem"),
() -> PROTOCOL_VERSION,
PROTOCOL_VERSION::equals,
PROTOCOL_VERSION::equals
);
private static final DefaultHandler DEFAULT_HANDLER = new DefaultHandler(); @OnlyIn(Dist.CLIENT)
private static final Class<? extends IMessage>[] MESSAGES; @SubscribeEvent
static { public static void registryNetworkPackets (FMLClientSetupEvent event) {
ArrayList<Class<? extends IMessage>> l = new ArrayList<>(); INSTANCE.registerMessage(index++, CMessageACResult.class, CMessageACResult::encode, CMessageACResult::decode, CMessageACResult::handle);
l.add(CMessageAddScreen.class);
l.add(SMessageRequestTEData.class);
l.add(SMessageScreenCtrl.class);
l.add(CMessageOpenGui.class);
l.add(CMessageScreenUpdate.class);
l.add(SMessageACQuery.class);
l.add(CMessageACResult.class);
l.add(SMessagePadCtrl.class);
l.add(SMessageRedstoneCtrl.class);
l.add(CMessageJSResponse.class);
l.add(SMessageMiniservConnect.class);
l.add(CMessageMiniservKey.class);
l.add(CMessageServerInfo.class);
l.add(CMessageCloseGui.class);
MESSAGES = l.toArray(new Class[0]);
} }
public static void registerAll(SimpleNetworkWrapper wrapper) { @SubscribeEvent
for(Class<? extends IMessage> md: MESSAGES) { public static void registryNetworkPackets (FMLCommonSetupEvent event) {
Message data = md.getAnnotation(Message.class);
if(data == null)
throw new RuntimeException("Missing @Message annotation for message class " + md.getSimpleName());
Class<?>[] classes = md.getClasses();
Class<? extends IMessageHandler> handler = null;
for(Class<?> cls: classes) {
if(cls.getSimpleName().equals("Handler") && Modifier.isStatic(cls.getModifiers()) && IMessageHandler.class.isAssignableFrom(cls)) {
handler = (Class<? extends IMessageHandler>) cls;
break;
}
}
IMessageHandler handlerInst;
if(handler == null) {
if(Runnable.class.isAssignableFrom(md))
handlerInst = DEFAULT_HANDLER;
else
throw new RuntimeException("Could not find message handler for message " + md.getSimpleName());
} else {
try {
handlerInst = handler.newInstance();
} catch(Throwable t) {
throw new RuntimeException("Could not instantiate message handler for message " + md.getSimpleName());
}
}
wrapper.registerMessage(handlerInst, md, data.messageId(), data.side());
}
} }
} }

View File

@ -4,45 +4,42 @@
package net.montoyo.wd.net.client; package net.montoyo.wd.net.client;
import io.netty.buffer.ByteBuf; import net.minecraft.network.FriendlyByteBuf;
import net.minecraftforge.fml.common.network.simpleimpl.IMessage; import net.minecraftforge.network.NetworkEvent;
import net.minecraftforge.fml.relauncher.Side;
import net.montoyo.wd.WebDisplays; import net.montoyo.wd.WebDisplays;
import net.montoyo.wd.net.Message;
import net.montoyo.wd.utilities.NameUUIDPair; import net.montoyo.wd.utilities.NameUUIDPair;
@Message(messageId = 6, side = Side.CLIENT) import java.util.function.Supplier;
public class CMessageACResult implements IMessage, Runnable {
private NameUUIDPair[] result; public class CMessageACResult {
public CMessageACResult() { private static NameUUIDPair[] result;
}
public CMessageACResult(NameUUIDPair[] pairs) { public CMessageACResult(NameUUIDPair[] pairs) {
result = pairs; result = pairs;
} }
@Override public static CMessageACResult decode(FriendlyByteBuf buf) {
public void fromBytes(ByteBuf buf) {
int cnt = buf.readByte(); int cnt = buf.readByte();
result = new NameUUIDPair[cnt]; result = new NameUUIDPair[cnt];
for(int i = 0; i < cnt; i++) for(int i = 0; i < cnt; i++)
result[i] = new NameUUIDPair(buf); result[i] = new NameUUIDPair(buf);
return new CMessageACResult(result);
} }
@Override public void encode(FriendlyByteBuf buf) {
public void toBytes(ByteBuf buf) {
buf.writeByte(result.length); buf.writeByte(result.length);
for(NameUUIDPair pair : result) for(NameUUIDPair pair : result)
pair.writeTo(buf); pair.writeTo(buf);
} }
@Override public void handle(Supplier<NetworkEvent.Context> contextSupplier) {
public void run() { contextSupplier.get().enqueueWork(() -> {
WebDisplays.PROXY.onAutocompleteResult(result); WebDisplays.PROXY.onAutocompleteResult(result);
});
} }
} }

View File

@ -4,112 +4,106 @@
package net.montoyo.wd.net.client; package net.montoyo.wd.net.client;
import io.netty.buffer.ByteBuf; import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.item.ItemStack; import net.minecraft.world.item.ItemStack;
import net.minecraft.tileentity.TileEntity; import net.minecraft.world.level.Level;
import net.minecraftforge.fml.common.network.ByteBufUtils; import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraftforge.fml.common.network.simpleimpl.IMessage; import net.minecraftforge.network.NetworkEvent;
import net.minecraftforge.fml.relauncher.Side;
import net.montoyo.wd.SharedProxy;
import net.montoyo.wd.WebDisplays; import net.montoyo.wd.WebDisplays;
import net.montoyo.wd.entity.TileEntityScreen; import net.montoyo.wd.entity.TileEntityScreen;
import net.montoyo.wd.net.Message;
import net.montoyo.wd.utilities.*; import net.montoyo.wd.utilities.*;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.function.Supplier;
@Message(messageId = 0, side = Side.CLIENT) public class CMessageAddScreen {
public class CMessageAddScreen implements IMessage, Runnable {
private boolean clear; private boolean clear;
private Vector3i pos; private Vector3i pos;
private TileEntityScreen.Screen[] screens; private TileEntityScreen.Screen[] screens;
public CMessageAddScreen() {
}
public CMessageAddScreen(TileEntityScreen tes) { public CMessageAddScreen(TileEntityScreen tes) {
clear = true; clear = true;
pos = new Vector3i(tes.getPos()); pos = new Vector3i(tes.getBlockPos());
screens = new TileEntityScreen.Screen[tes.screenCount()]; screens = new TileEntityScreen.Screen[tes.screenCount()];
for(int i = 0; i < tes.screenCount(); i++) for (int i = 0; i < tes.screenCount(); i++)
screens[i] = tes.getScreen(i); screens[i] = tes.getScreen(i);
} }
public CMessageAddScreen(TileEntityScreen tes, TileEntityScreen.Screen ... toSend) { public CMessageAddScreen(TileEntityScreen tes, TileEntityScreen.Screen... toSend) {
clear = false; clear = false;
pos = new Vector3i(tes.getPos()); pos = new Vector3i(tes.getBlockPos());
screens = toSend; screens = toSend;
} }
@Override public void decode(FriendlyByteBuf buf) {
public void fromBytes(ByteBuf buf) {
clear = buf.readBoolean(); clear = buf.readBoolean();
pos = new Vector3i(buf); pos = new Vector3i(buf);
int cnt = buf.readByte() & 7; int cnt = buf.readByte() & 7;
screens = new TileEntityScreen.Screen[cnt]; screens = new TileEntityScreen.Screen[cnt];
for(int i = 0; i < cnt; i++) { for (int i = 0; i < cnt; i++) {
screens[i] = new TileEntityScreen.Screen(); screens[i] = new TileEntityScreen.Screen();
screens[i].side = BlockSide.values()[buf.readByte()]; screens[i].side = BlockSide.values()[buf.readByte()];
screens[i].size = new Vector2i(buf); screens[i].size = new Vector2i(buf);
screens[i].url = ByteBufUtils.readUTF8String(buf); screens[i].url = buf.readUtf();
screens[i].resolution = new Vector2i(buf); screens[i].resolution = new Vector2i(buf);
screens[i].rotation = Rotation.values()[buf.readByte() & 3]; screens[i].rotation = Rotation.values()[buf.readByte() & 3];
screens[i].owner = new NameUUIDPair(buf); screens[i].owner = new NameUUIDPair(buf);
screens[i].upgrades = new ArrayList<>(); screens[i].upgrades = new ArrayList<>();
int numUpgrades = buf.readByte(); int numUpgrades = buf.readByte();
for(int j = 0; j < numUpgrades; j++) for (int j = 0; j < numUpgrades; j++)
screens[i].upgrades.add(ByteBufUtils.readItemStack(buf)); screens[i].upgrades.add(buf.readItem());
} }
} }
@Override public CMessageAddScreen encode(FriendlyByteBuf buf) {
public void toBytes(ByteBuf buf) {
buf.writeBoolean(clear); buf.writeBoolean(clear);
pos.writeTo(buf); pos.writeTo(buf);
buf.writeByte(screens.length); buf.writeByte(screens.length);
for(TileEntityScreen.Screen scr: screens) { for (TileEntityScreen.Screen scr : screens) {
buf.writeByte(scr.side.ordinal()); buf.writeByte(scr.side.ordinal());
scr.size.writeTo(buf); scr.size.writeTo(buf);
ByteBufUtils.writeUTF8String(buf, scr.url); buf.writeUtf(scr.url);
scr.resolution.writeTo(buf); scr.resolution.writeTo(buf);
buf.writeByte(scr.rotation.ordinal()); buf.writeByte(scr.rotation.ordinal());
scr.owner.writeTo(buf); scr.owner.writeTo(buf);
buf.writeByte(scr.upgrades.size()); buf.writeByte(scr.upgrades.size());
for(ItemStack is: scr.upgrades) for (ItemStack is : scr.upgrades)
ByteBufUtils.writeItemStack(buf, is); buf.writeItem(is);
} }
return this;
} }
@Override public void handle(Supplier<NetworkEvent.Context> contextSupplier) {
public void run() { contextSupplier.get().enqueueWork(() -> {
TileEntity te = WebDisplays.PROXY.getWorld(SharedProxy.CURRENT_DIMENSION).getTileEntity(pos.toBlock()); BlockEntity te = WebDisplays.PROXY.getWorld(Level.OVERWORLD).getBlockEntity(pos.toBlock());
if(te == null || !(te instanceof TileEntityScreen)) { if (!(te instanceof TileEntityScreen)) {
if(clear) if (clear)
Log.error("CMessageAddScreen: Can't add screen to invalid tile entity at %s", pos.toString()); Log.error("CMessageAddScreen: Can't add screen to invalid tile entity at %s", pos.toString());
return; return;
} }
TileEntityScreen tes = (TileEntityScreen) te; TileEntityScreen tes = (TileEntityScreen) te;
if(clear) if (clear)
tes.clear(); tes.clear();
for(TileEntityScreen.Screen entry: screens) { for (TileEntityScreen.Screen entry : screens) {
TileEntityScreen.Screen scr = tes.addScreen(entry.side, entry.size, entry.resolution, null, false); TileEntityScreen.Screen scr = tes.addScreen(entry.side, entry.size, entry.resolution, null, false);
scr.rotation = entry.rotation; scr.rotation = entry.rotation;
scr.url = entry.url; scr.url = entry.url;
scr.owner = entry.owner; scr.owner = entry.owner;
scr.upgrades = entry.upgrades; scr.upgrades = entry.upgrades;
if(scr.browser != null) if (scr.browser != null)
scr.browser.loadURL(entry.url); scr.browser.loadURL(entry.url);
} }
});
} }
} }

View File

@ -4,25 +4,20 @@
package net.montoyo.wd.net.client; package net.montoyo.wd.net.client;
import io.netty.buffer.ByteBuf; import net.minecraft.core.BlockPos;
import net.minecraft.util.math.BlockPos; import net.minecraft.network.FriendlyByteBuf;
import net.minecraftforge.fml.common.network.simpleimpl.IMessage; import net.minecraftforge.network.NetworkEvent;
import net.minecraftforge.fml.relauncher.Side;
import net.montoyo.wd.WebDisplays; import net.montoyo.wd.WebDisplays;
import net.montoyo.wd.net.Message;
import net.montoyo.wd.utilities.BlockSide; import net.montoyo.wd.utilities.BlockSide;
import java.util.Arrays; import java.util.Arrays;
import java.util.function.Supplier;
@Message(messageId = 13, side = Side.CLIENT) public class CMessageCloseGui {
public class CMessageCloseGui implements IMessage, Runnable {
private BlockPos blockPos; private BlockPos blockPos;
private BlockSide blockSide; private BlockSide blockSide;
public CMessageCloseGui() {
}
public CMessageCloseGui(BlockPos bp) { public CMessageCloseGui(BlockPos bp) {
blockPos = bp; blockPos = bp;
blockSide = null; blockSide = null;
@ -33,8 +28,7 @@ public class CMessageCloseGui implements IMessage, Runnable {
blockSide = side; blockSide = side;
} }
@Override public void decode(FriendlyByteBuf buf) {
public void fromBytes(ByteBuf buf) {
int x, y, z, side; int x, y, z, side;
x = buf.readInt(); x = buf.readInt();
y = buf.readInt(); y = buf.readInt();
@ -48,24 +42,26 @@ public class CMessageCloseGui implements IMessage, Runnable {
blockSide = BlockSide.values()[side - 1]; blockSide = BlockSide.values()[side - 1];
} }
@Override public CMessageCloseGui encode(FriendlyByteBuf buf) {
public void toBytes(ByteBuf buf) {
buf.writeInt(blockPos.getX()); buf.writeInt(blockPos.getX());
buf.writeInt(blockPos.getY()); buf.writeInt(blockPos.getY());
buf.writeInt(blockPos.getZ()); buf.writeInt(blockPos.getZ());
if(blockSide == null) if(blockSide == null) {
buf.writeByte(0); buf.writeByte(0);
else } else {
buf.writeByte(blockSide.ordinal() + 1); buf.writeByte(blockSide.ordinal() + 1);
}
return this;
} }
@Override public void handle(Supplier<NetworkEvent.Context> contextSupplier) {
public void run() { contextSupplier.get().enqueueWork(() -> {
if(blockSide == null) if (blockSide == null)
Arrays.stream(BlockSide.values()).forEach(s -> WebDisplays.PROXY.closeGui(blockPos, s)); Arrays.stream(BlockSide.values()).forEach(s -> WebDisplays.PROXY.closeGui(blockPos, s));
else else
WebDisplays.PROXY.closeGui(blockPos, blockSide); WebDisplays.PROXY.closeGui(blockPos, blockSide);
});
} }
} }

View File

@ -4,17 +4,15 @@
package net.montoyo.wd.net.client; package net.montoyo.wd.net.client;
import io.netty.buffer.ByteBuf; import net.minecraft.network.FriendlyByteBuf;
import net.minecraftforge.fml.common.network.ByteBufUtils; import net.minecraftforge.network.NetworkEvent;
import net.minecraftforge.fml.common.network.simpleimpl.IMessage;
import net.minecraftforge.fml.relauncher.Side;
import net.montoyo.wd.WebDisplays; import net.montoyo.wd.WebDisplays;
import net.montoyo.wd.core.JSServerRequest; import net.montoyo.wd.core.JSServerRequest;
import net.montoyo.wd.net.Message;
import net.montoyo.wd.utilities.Log; import net.montoyo.wd.utilities.Log;
@Message(messageId = 9, side = Side.CLIENT) import java.util.function.Supplier;
public class CMessageJSResponse implements IMessage, Runnable {
public class CMessageJSResponse {
private int id; private int id;
private JSServerRequest type; private JSServerRequest type;
@ -23,9 +21,6 @@ public class CMessageJSResponse implements IMessage, Runnable {
private int errCode; private int errCode;
private String errString; private String errString;
public CMessageJSResponse() {
}
public CMessageJSResponse(int id, JSServerRequest t, byte[] d) { public CMessageJSResponse(int id, JSServerRequest t, byte[] d) {
this.id = id; this.id = id;
type = t; type = t;
@ -41,8 +36,7 @@ public class CMessageJSResponse implements IMessage, Runnable {
errString = err; errString = err;
} }
@Override public void decode(FriendlyByteBuf buf) {
public void fromBytes(ByteBuf buf) {
id = buf.readInt(); id = buf.readInt();
type = JSServerRequest.fromID(buf.readByte()); type = JSServerRequest.fromID(buf.readByte());
success = buf.readBoolean(); success = buf.readBoolean();
@ -52,12 +46,11 @@ public class CMessageJSResponse implements IMessage, Runnable {
buf.readBytes(data); buf.readBytes(data);
} else { } else {
errCode = buf.readInt(); errCode = buf.readInt();
errString = ByteBufUtils.readUTF8String(buf); errString = buf.readUtf();
} }
} }
@Override public CMessageJSResponse encode(FriendlyByteBuf buf) {
public void toBytes(ByteBuf buf) {
buf.writeInt(id); buf.writeInt(id);
buf.writeByte(type.ordinal()); buf.writeByte(type.ordinal());
buf.writeBoolean(success); buf.writeBoolean(success);
@ -67,20 +60,21 @@ public class CMessageJSResponse implements IMessage, Runnable {
buf.writeBytes(data); //TODO: Eventually compress this data buf.writeBytes(data); //TODO: Eventually compress this data
} else { } else {
buf.writeInt(errCode); buf.writeInt(errCode);
ByteBufUtils.writeUTF8String(buf, errString); buf.writeUtf(errString);
} }
return this;
} }
@Override public void handle(Supplier<NetworkEvent.Context> contextSupplier) {
public void run() { contextSupplier.get().enqueueWork(() -> {
try { try {
if(success) if (success)
WebDisplays.PROXY.handleJSResponseSuccess(id, type, data); WebDisplays.PROXY.handleJSResponseSuccess(id, type, data);
else else
WebDisplays.PROXY.handleJSResponseError(id, type, errCode, errString); WebDisplays.PROXY.handleJSResponseError(id, type, errCode, errString);
} catch(Throwable t) { } catch (Throwable t) {
Log.warningEx("Could not handle JS response", t); Log.warningEx("Could not handle JS response", t);
} }
});
} }
} }

View File

@ -5,43 +5,39 @@
package net.montoyo.wd.net.client; package net.montoyo.wd.net.client;
import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBuf;
import net.minecraftforge.fml.common.network.simpleimpl.IMessage; import net.minecraft.network.FriendlyByteBuf;
import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.network.NetworkEvent;
import net.montoyo.wd.WebDisplays; import net.montoyo.wd.WebDisplays;
import net.montoyo.wd.miniserv.client.Client; import net.montoyo.wd.miniserv.client.Client;
import net.montoyo.wd.net.Message;
import net.montoyo.wd.utilities.Log; import net.montoyo.wd.utilities.Log;
@Message(messageId = 11, side = Side.CLIENT) import java.util.function.Supplier;
public class CMessageMiniservKey implements IMessage, Runnable {
public class CMessageMiniservKey {
private byte[] encryptedKey; private byte[] encryptedKey;
public CMessageMiniservKey() {
}
public CMessageMiniservKey(byte[] key) { public CMessageMiniservKey(byte[] key) {
encryptedKey = key; encryptedKey = key;
} }
@Override public void decode(FriendlyByteBuf buf) {
public void fromBytes(ByteBuf buf) {
encryptedKey = new byte[buf.readShort() & 0xFFFF]; encryptedKey = new byte[buf.readShort() & 0xFFFF];
buf.readBytes(encryptedKey); buf.readBytes(encryptedKey);
} }
@Override public CMessageMiniservKey encode(FriendlyByteBuf buf) {
public void toBytes(ByteBuf buf) {
buf.writeShort(encryptedKey.length); buf.writeShort(encryptedKey.length);
buf.writeBytes(encryptedKey); buf.writeBytes(encryptedKey);
return new CMessageMiniservKey(encryptedKey);
} }
@Override public void handle(Supplier<NetworkEvent.Context> contextSupplier) {
public void run() { contextSupplier.get().enqueueWork(() -> {
if(Client.getInstance().decryptKey(encryptedKey)) { if (Client.getInstance().decryptKey(encryptedKey)) {
Log.info("Successfully received and decrypted key, starting miniserv client..."); Log.info("Successfully received and decrypted key, starting miniserv client...");
WebDisplays.PROXY.startMiniservClient(); WebDisplays.PROXY.startMiniservClient();
} }
});
} }
} }

View File

@ -4,31 +4,22 @@
package net.montoyo.wd.net.client; package net.montoyo.wd.net.client;
import io.netty.buffer.ByteBuf; import net.minecraft.network.FriendlyByteBuf;
import net.minecraftforge.fml.common.network.ByteBufUtils;
import net.minecraftforge.fml.common.network.simpleimpl.IMessage;
import net.minecraftforge.fml.relauncher.Side;
import net.montoyo.wd.utilities.Log; import net.montoyo.wd.utilities.Log;
import net.montoyo.wd.WebDisplays; import net.montoyo.wd.WebDisplays;
import net.montoyo.wd.data.GuiData; import net.montoyo.wd.data.GuiData;
import net.montoyo.wd.net.Message;
import net.montoyo.wd.utilities.Util; import net.montoyo.wd.utilities.Util;
@Message(messageId = 3, side = Side.CLIENT) public class CMessageOpenGui {
public class CMessageOpenGui implements IMessage, Runnable {
private GuiData data; private GuiData data;
public CMessageOpenGui() {
}
public CMessageOpenGui(GuiData data) { public CMessageOpenGui(GuiData data) {
this.data = data; this.data = data;
} }
@Override public void decode(FriendlyByteBuf buf) {
public void fromBytes(ByteBuf buf) { String name = buf.readUtf();
String name = ByteBufUtils.readUTF8String(buf);
Class<? extends GuiData> cls = GuiData.classOf(name); Class<? extends GuiData> cls = GuiData.classOf(name);
if(cls == null) { if(cls == null) {
@ -40,7 +31,7 @@ public class CMessageOpenGui implements IMessage, Runnable {
} }
@Override @Override
public void toBytes(ByteBuf buf) { public CMessageOpenGui encode(FriendlyByteBuf buf) {
ByteBufUtils.writeUTF8String(buf, data.getName()); ByteBufUtils.writeUTF8String(buf, data.getName());
Util.serialize(buf, data); Util.serialize(buf, data);
} }

View File

@ -4,23 +4,20 @@
package net.montoyo.wd.net.client; package net.montoyo.wd.net.client;
import io.netty.buffer.ByteBuf; import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.item.ItemStack; import net.minecraft.world.item.ItemStack;
import net.minecraft.tileentity.TileEntity; import net.minecraft.world.level.Level;
import net.minecraftforge.fml.common.network.ByteBufUtils; import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraftforge.fml.common.network.simpleimpl.IMessage; import net.minecraftforge.network.NetworkEvent;
import net.minecraftforge.fml.relauncher.Side;
import net.montoyo.wd.SharedProxy;
import net.montoyo.wd.WebDisplays; import net.montoyo.wd.WebDisplays;
import net.montoyo.wd.entity.TileEntityScreen; import net.montoyo.wd.entity.TileEntityScreen;
import net.montoyo.wd.net.Message;
import net.montoyo.wd.utilities.*; import net.montoyo.wd.utilities.*;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.function.Supplier;
@Message(messageId = 4, side = Side.CLIENT) public class CMessageScreenUpdate {
public class CMessageScreenUpdate implements IMessage, Runnable {
public static final int UPDATE_URL = 0; public static final int UPDATE_URL = 0;
public static final int UPDATE_RESOLUTION = 1; public static final int UPDATE_RESOLUTION = 1;
@ -56,7 +53,7 @@ public class CMessageScreenUpdate implements IMessage, Runnable {
public static CMessageScreenUpdate setURL(TileEntityScreen tes, BlockSide side, String url) { public static CMessageScreenUpdate setURL(TileEntityScreen tes, BlockSide side, String url) {
CMessageScreenUpdate ret = new CMessageScreenUpdate(); CMessageScreenUpdate ret = new CMessageScreenUpdate();
ret.pos = new Vector3i(tes.getPos()); ret.pos = new Vector3i(tes.getBlockPos());
ret.side = side; ret.side = side;
ret.action = UPDATE_URL; ret.action = UPDATE_URL;
ret.string = url; ret.string = url;
@ -66,7 +63,7 @@ public class CMessageScreenUpdate implements IMessage, Runnable {
public static CMessageScreenUpdate setResolution(TileEntityScreen tes, BlockSide side, Vector2i res) { public static CMessageScreenUpdate setResolution(TileEntityScreen tes, BlockSide side, Vector2i res) {
CMessageScreenUpdate ret = new CMessageScreenUpdate(); CMessageScreenUpdate ret = new CMessageScreenUpdate();
ret.pos = new Vector3i(tes.getPos()); ret.pos = new Vector3i(tes.getBlockPos());
ret.side = side; ret.side = side;
ret.action = UPDATE_RESOLUTION; ret.action = UPDATE_RESOLUTION;
ret.vec2i = res; ret.vec2i = res;
@ -76,7 +73,7 @@ public class CMessageScreenUpdate implements IMessage, Runnable {
public static CMessageScreenUpdate click(TileEntityScreen tes, BlockSide side, int mouseEvent, @Nullable Vector2i pos) { public static CMessageScreenUpdate click(TileEntityScreen tes, BlockSide side, int mouseEvent, @Nullable Vector2i pos) {
CMessageScreenUpdate ret = new CMessageScreenUpdate(); CMessageScreenUpdate ret = new CMessageScreenUpdate();
ret.pos = new Vector3i(tes.getPos()); ret.pos = new Vector3i(tes.getBlockPos());
ret.side = side; ret.side = side;
ret.action = UPDATE_MOUSE; ret.action = UPDATE_MOUSE;
ret.mouseEvent = mouseEvent; ret.mouseEvent = mouseEvent;
@ -86,14 +83,14 @@ public class CMessageScreenUpdate implements IMessage, Runnable {
} }
public CMessageScreenUpdate(TileEntityScreen tes, BlockSide side) { public CMessageScreenUpdate(TileEntityScreen tes, BlockSide side) {
pos = new Vector3i(tes.getPos()); pos = new Vector3i(tes.getBlockPos());
this.side = side; this.side = side;
action = UPDATE_DELETE; action = UPDATE_DELETE;
} }
public static CMessageScreenUpdate type(TileEntityScreen tes, BlockSide side, String text) { public static CMessageScreenUpdate type(TileEntityScreen tes, BlockSide side, String text) {
CMessageScreenUpdate ret = new CMessageScreenUpdate(); CMessageScreenUpdate ret = new CMessageScreenUpdate();
ret.pos = new Vector3i(tes.getPos()); ret.pos = new Vector3i(tes.getBlockPos());
ret.side = side; ret.side = side;
ret.string = text; ret.string = text;
ret.action = UPDATE_TYPE; ret.action = UPDATE_TYPE;
@ -103,7 +100,7 @@ public class CMessageScreenUpdate implements IMessage, Runnable {
public static CMessageScreenUpdate js(TileEntityScreen tes, BlockSide side, String code) { public static CMessageScreenUpdate js(TileEntityScreen tes, BlockSide side, String code) {
CMessageScreenUpdate ret = new CMessageScreenUpdate(); CMessageScreenUpdate ret = new CMessageScreenUpdate();
ret.pos = new Vector3i(tes.getPos()); ret.pos = new Vector3i(tes.getBlockPos());
ret.side = side; ret.side = side;
ret.string = code; ret.string = code;
ret.action = UPDATE_RUN_JS; ret.action = UPDATE_RUN_JS;
@ -113,7 +110,7 @@ public class CMessageScreenUpdate implements IMessage, Runnable {
public static CMessageScreenUpdate upgrade(TileEntityScreen tes, BlockSide side) { public static CMessageScreenUpdate upgrade(TileEntityScreen tes, BlockSide side) {
CMessageScreenUpdate ret = new CMessageScreenUpdate(); CMessageScreenUpdate ret = new CMessageScreenUpdate();
ret.pos = new Vector3i(tes.getPos()); ret.pos = new Vector3i(tes.getBlockPos());
ret.side = side; ret.side = side;
ret.action = UPDATE_UPGRADES; ret.action = UPDATE_UPGRADES;
@ -128,7 +125,7 @@ public class CMessageScreenUpdate implements IMessage, Runnable {
public static CMessageScreenUpdate jsRedstone(TileEntityScreen tes, BlockSide side, Vector2i vec, int level) { public static CMessageScreenUpdate jsRedstone(TileEntityScreen tes, BlockSide side, Vector2i vec, int level) {
CMessageScreenUpdate ret = new CMessageScreenUpdate(); CMessageScreenUpdate ret = new CMessageScreenUpdate();
ret.pos = new Vector3i(tes.getPos()); ret.pos = new Vector3i(tes.getBlockPos());
ret.side = side; ret.side = side;
ret.action = UPDATE_JS_REDSTONE; ret.action = UPDATE_JS_REDSTONE;
ret.vec2i = vec; ret.vec2i = vec;
@ -139,7 +136,7 @@ public class CMessageScreenUpdate implements IMessage, Runnable {
public static CMessageScreenUpdate owner(TileEntityScreen tes, BlockSide side, NameUUIDPair owner) { public static CMessageScreenUpdate owner(TileEntityScreen tes, BlockSide side, NameUUIDPair owner) {
CMessageScreenUpdate ret = new CMessageScreenUpdate(); CMessageScreenUpdate ret = new CMessageScreenUpdate();
ret.pos = new Vector3i(tes.getPos()); ret.pos = new Vector3i(tes.getBlockPos());
ret.side = side; ret.side = side;
ret.action = UPDATE_OWNER; ret.action = UPDATE_OWNER;
ret.owner = owner; ret.owner = owner;
@ -149,7 +146,7 @@ public class CMessageScreenUpdate implements IMessage, Runnable {
public static CMessageScreenUpdate rotation(TileEntityScreen tes, BlockSide side, Rotation rot) { public static CMessageScreenUpdate rotation(TileEntityScreen tes, BlockSide side, Rotation rot) {
CMessageScreenUpdate ret = new CMessageScreenUpdate(); CMessageScreenUpdate ret = new CMessageScreenUpdate();
ret.pos = new Vector3i(tes.getPos()); ret.pos = new Vector3i(tes.getBlockPos());
ret.side = side; ret.side = side;
ret.action = UPDATE_ROTATION; ret.action = UPDATE_ROTATION;
ret.rotation = rot; ret.rotation = rot;
@ -159,7 +156,7 @@ public class CMessageScreenUpdate implements IMessage, Runnable {
public static CMessageScreenUpdate autoVolume(TileEntityScreen tes, BlockSide side, boolean av) { public static CMessageScreenUpdate autoVolume(TileEntityScreen tes, BlockSide side, boolean av) {
CMessageScreenUpdate ret = new CMessageScreenUpdate(); CMessageScreenUpdate ret = new CMessageScreenUpdate();
ret.pos = new Vector3i(tes.getPos()); ret.pos = new Vector3i(tes.getBlockPos());
ret.side = side; ret.side = side;
ret.action = UPDATE_AUTO_VOL; ret.action = UPDATE_AUTO_VOL;
ret.autoVolume = av; ret.autoVolume = av;
@ -167,14 +164,13 @@ public class CMessageScreenUpdate implements IMessage, Runnable {
return ret; return ret;
} }
@Override public void decode(FriendlyByteBuf buf) {
public void fromBytes(ByteBuf buf) {
pos = new Vector3i(buf); pos = new Vector3i(buf);
side = BlockSide.values()[buf.readByte()]; side = BlockSide.values()[buf.readByte()];
action = buf.readByte(); action = buf.readByte();
if(action == UPDATE_URL || action == UPDATE_TYPE || action == UPDATE_RUN_JS) if(action == UPDATE_URL || action == UPDATE_TYPE || action == UPDATE_RUN_JS)
string = ByteBufUtils.readUTF8String(buf); string = buf.readUtf();
else if(action == UPDATE_MOUSE) { else if(action == UPDATE_MOUSE) {
mouseEvent = buf.readByte(); mouseEvent = buf.readByte();
@ -186,7 +182,7 @@ public class CMessageScreenUpdate implements IMessage, Runnable {
upgrades = new ItemStack[buf.readByte()]; upgrades = new ItemStack[buf.readByte()];
for(int i = 0; i < upgrades.length; i++) for(int i = 0; i < upgrades.length; i++)
upgrades[i] = ByteBufUtils.readItemStack(buf); upgrades[i] = buf.readItem();
} else if(action == UPDATE_JS_REDSTONE) { } else if(action == UPDATE_JS_REDSTONE) {
vec2i = new Vector2i(buf); vec2i = new Vector2i(buf);
redstoneLevel = buf.readByte(); redstoneLevel = buf.readByte();
@ -198,14 +194,14 @@ public class CMessageScreenUpdate implements IMessage, Runnable {
autoVolume = buf.readBoolean(); autoVolume = buf.readBoolean();
} }
@Override
public void toBytes(ByteBuf buf) { public CMessageScreenUpdate encode(FriendlyByteBuf buf) {
pos.writeTo(buf); pos.writeTo(buf);
buf.writeByte(side.ordinal()); buf.writeByte(side.ordinal());
buf.writeByte(action); buf.writeByte(action);
if(action == UPDATE_URL || action == UPDATE_TYPE || action == UPDATE_RUN_JS) if(action == UPDATE_URL || action == UPDATE_TYPE || action == UPDATE_RUN_JS)
ByteBufUtils.writeUTF8String(buf, string); buf.writeUtf(string);
else if(action == UPDATE_MOUSE) { else if(action == UPDATE_MOUSE) {
buf.writeByte(mouseEvent); buf.writeByte(mouseEvent);
@ -217,7 +213,7 @@ public class CMessageScreenUpdate implements IMessage, Runnable {
buf.writeByte(upgrades.length); buf.writeByte(upgrades.length);
for(ItemStack is: upgrades) for(ItemStack is: upgrades)
ByteBufUtils.writeItemStack(buf, is); buf.writeItem(is);
} else if(action == UPDATE_JS_REDSTONE) { } else if(action == UPDATE_JS_REDSTONE) {
vec2i.writeTo(buf); vec2i.writeTo(buf);
buf.writeByte(redstoneLevel); buf.writeByte(redstoneLevel);
@ -227,22 +223,18 @@ public class CMessageScreenUpdate implements IMessage, Runnable {
buf.writeByte(rotation.ordinal()); buf.writeByte(rotation.ordinal());
else if(action == UPDATE_AUTO_VOL) else if(action == UPDATE_AUTO_VOL)
buf.writeBoolean(autoVolume); buf.writeBoolean(autoVolume);
return new CMessageScreenUpdate();
} }
@Override public void handle(Supplier<NetworkEvent.Context> contextSupplier) {
public void run() { contextSupplier.get().enqueueWork(() -> {
TileEntity te = WebDisplays.PROXY.getWorld(SharedProxy.CURRENT_DIMENSION).getTileEntity(pos.toBlock()); BlockEntity te = WebDisplays.PROXY.getWorld(Level.OVERWORLD).getBlockEntity(pos.toBlock());
if(te == null || !(te instanceof TileEntityScreen)) { if(!(te instanceof TileEntityScreen)) {
Log.error("CMessageScreenUpdate: TileEntity at %s is not a screen!", pos.toString()); Log.error("CMessageScreenUpdate: TileEntity at %s is not a screen!", pos.toString());
return; return;
} }
TileEntityScreen tes = (TileEntityScreen) te; TileEntityScreen tes = (TileEntityScreen) te;
/*TileEntityScreen.Screen scr = tes.getScreen(side);
if(scr == null) {
Log.error("CMessageScreenUpdate: No screen on side %s at %s", side.toString(), pos.toString());
return;
}*/
if(action == UPDATE_URL) if(action == UPDATE_URL)
tes.setScreenURL(side, string); tes.setScreenURL(side, string);
@ -271,6 +263,6 @@ public class CMessageScreenUpdate implements IMessage, Runnable {
tes.setAutoVolume(side, autoVolume); tes.setAutoVolume(side, autoVolume);
else else
Log.warning("Caught invalid CMessageScreenUpdate with action ID %d", action); Log.warning("Caught invalid CMessageScreenUpdate with action ID %d", action);
});
} }
} }

View File

@ -4,41 +4,37 @@
package net.montoyo.wd.net.client; package net.montoyo.wd.net.client;
import io.netty.buffer.ByteBuf; import net.minecraft.network.FriendlyByteBuf;
import net.minecraftforge.fml.common.network.simpleimpl.IMessage; import net.minecraftforge.network.NetworkEvent;
import net.minecraftforge.fml.relauncher.Side;
import net.montoyo.wd.WebDisplays; import net.montoyo.wd.WebDisplays;
import net.montoyo.wd.miniserv.client.Client; import net.montoyo.wd.miniserv.client.Client;
import net.montoyo.wd.net.Message; import net.montoyo.wd.net.Messages;
@Message(messageId = 12, side = Side.CLIENT) import java.util.function.Supplier;
public class CMessageServerInfo implements IMessage, Runnable {
public class CMessageServerInfo {
private int miniservPort; private int miniservPort;
public CMessageServerInfo() {
}
public CMessageServerInfo(int msPort) { public CMessageServerInfo(int msPort) {
miniservPort = msPort; miniservPort = msPort;
} }
@Override public void decode(FriendlyByteBuf buf) {
public void fromBytes(ByteBuf buf) {
miniservPort = buf.readShort() & 0xFFFF; miniservPort = buf.readShort() & 0xFFFF;
} }
@Override public CMessageServerInfo encode(FriendlyByteBuf buf) {
public void toBytes(ByteBuf buf) {
buf.writeShort(miniservPort); buf.writeShort(miniservPort);
return new CMessageServerInfo(miniservPort);
} }
@Override public void handle(Supplier<NetworkEvent.Context> contextSupplier) {
public void run() { contextSupplier.get().enqueueWork(() -> {
WebDisplays.PROXY.setMiniservClientPort(miniservPort); WebDisplays.PROXY.setMiniservClientPort(miniservPort);
if(miniservPort > 0) if (miniservPort > 0)
WebDisplays.NET_HANDLER.sendToServer(Client.getInstance().beginConnection()); Messages.INSTANCE.sendToServer(Client.getInstance().beginConnection());
});
} }
} }

View File

@ -7,6 +7,9 @@ package net.montoyo.wd.net.server;
import com.mojang.authlib.GameProfile; import com.mojang.authlib.GameProfile;
import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBuf;
import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.server.MinecraftServer;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.WorldServer; import net.minecraft.world.WorldServer;
import net.minecraftforge.fml.common.network.ByteBufUtils; import net.minecraftforge.fml.common.network.ByteBufUtils;
import net.minecraftforge.fml.common.network.simpleimpl.IMessage; import net.minecraftforge.fml.common.network.simpleimpl.IMessage;
@ -20,36 +23,31 @@ import net.montoyo.wd.utilities.NameUUIDPair;
import java.util.Arrays; import java.util.Arrays;
@Message(messageId = 5, side = Side.SERVER) public class SMessageACQuery {
public class SMessageACQuery implements IMessage, Runnable {
private EntityPlayerMP player; private ServerPlayer player;
private String beginning; private String beginning;
private boolean matchExact; private boolean matchExact;
public SMessageACQuery() {
}
public SMessageACQuery(String beg, boolean exact) { public SMessageACQuery(String beg, boolean exact) {
beginning = beg; beginning = beg;
matchExact = exact; matchExact = exact;
} }
@Override public void decode(FriendlyByteBuf buf) {
public void fromBytes(ByteBuf buf) { beginning = buf.readUtf();
beginning = ByteBufUtils.readUTF8String(buf);
matchExact = buf.readBoolean(); matchExact = buf.readBoolean();
} }
@Override public SMessageACQuery encode(FriendlyByteBuf buf) {
public void toBytes(ByteBuf buf) { buf.writeUtf(beginning);
ByteBufUtils.writeUTF8String(buf, beginning);
buf.writeBoolean(matchExact); buf.writeBoolean(matchExact);
return new SMessageACQuery(beginning, matchExact);
} }
@Override @Override
public void run() { public void run() {
GameProfile[] profiles = WebDisplays.PROXY.getOnlineGameProfiles(); GameProfile[] profiles = ;
NameUUIDPair[] result; NameUUIDPair[] result;
if(matchExact) if(matchExact)