start of minepad stuff

This commit is contained in:
GiantLuigi4 2023-05-31 15:31:14 -04:00
parent bc16cf9769
commit 3719448331
8 changed files with 273 additions and 217 deletions

View File

@ -10,6 +10,7 @@ import net.minecraft.resources.ResourceKey;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.minecraft.server.MinecraftServer; import net.minecraft.server.MinecraftServer;
import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.BlockGetter;
import net.minecraft.world.level.Level; import net.minecraft.world.level.Level;
import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.common.MinecraftForge;
@ -75,7 +76,7 @@ public class SharedProxy {
public void screenUpdateAutoVolumeInGui(Vector3i pos, BlockSide side, boolean av) { public void screenUpdateAutoVolumeInGui(Vector3i pos, BlockSide side, boolean av) {
} }
public void displaySetPadURLGui(String padURL) { public void displaySetPadURLGui(ItemStack is, String padURL) {
Log.error("Called SharedProxy.displaySetPadURLGui() on server side..."); Log.error("Called SharedProxy.displaySetPadURLGui() on server side...");
} }

View File

@ -85,10 +85,10 @@ public class ClientProxy extends SharedProxy implements IDisplayHandler, IJSQuer
public IBrowser view; public IBrowser view;
private boolean isInHotbar; private boolean isInHotbar;
private final int id; private final UUID id;
private long lastURLSent; private long lastURLSent;
private PadData(String url, int id) { private PadData(String url, UUID id) {
String webUrl; String webUrl;
try { try {
webUrl = TileEntityScreen.url(url); webUrl = TileEntityScreen.url(url);
@ -130,7 +130,7 @@ public class ClientProxy extends SharedProxy implements IDisplayHandler, IJSQuer
private int lastTracked = 0; private int lastTracked = 0;
//MinePads Management //MinePads Management
private final HashMap<Integer, PadData> padMap = new HashMap<>(); private final HashMap<UUID, PadData> padMap = new HashMap<>();
private final ArrayList<PadData> padList = new ArrayList<>(); private final ArrayList<PadData> padList = new ArrayList<>();
private int minePadTickCounter = 0; private int minePadTickCounter = 0;
@ -268,8 +268,8 @@ public class ClientProxy extends SharedProxy implements IDisplayHandler, IJSQuer
} }
@Override @Override
public void displaySetPadURLGui(String padURL) { public void displaySetPadURLGui(ItemStack is, String padURL) {
mc.setScreen(new GuiSetURL2(padURL)); mc.setScreen(new GuiSetURL2(is, padURL));
} }
@Override @Override
@ -729,13 +729,13 @@ public class ClientProxy extends SharedProxy implements IDisplayHandler, IJSQuer
CompoundTag tag = item.getTag(); CompoundTag tag = item.getTag();
if (tag != null && tag.contains("PadID")) if (tag != null && tag.contains("PadID"))
updatePad(tag.getInt("PadID"), tag, item == heldStack); updatePad(tag.getUUID("PadID"), tag, item == heldStack);
} }
} }
} }
} }
private void updatePad(int id, CompoundTag tag, boolean isSelected) { private void updatePad(UUID id, CompoundTag tag, boolean isSelected) {
PadData pd = padMap.get(id); PadData pd = padMap.get(id);
if(pd != null) if(pd != null)
@ -751,7 +751,7 @@ public class ClientProxy extends SharedProxy implements IDisplayHandler, IJSQuer
return minePadRenderer; return minePadRenderer;
} }
public PadData getPadByID(int id) { public PadData getPadByID(UUID id) {
return padMap.get(id); return padMap.get(id);
} }

View File

@ -7,7 +7,6 @@ package net.montoyo.wd.client.gui;
import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos;
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.world.InteractionHand;
import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ItemStack;
import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.Mod;
@ -17,120 +16,138 @@ import net.montoyo.wd.client.gui.controls.Button;
import net.montoyo.wd.client.gui.controls.TextField; import net.montoyo.wd.client.gui.controls.TextField;
import net.montoyo.wd.client.gui.loading.FillControl; import net.montoyo.wd.client.gui.loading.FillControl;
import net.montoyo.wd.entity.TileEntityScreen; import net.montoyo.wd.entity.TileEntityScreen;
import net.montoyo.wd.init.ItemInit; import net.montoyo.wd.item.ItemMinePad2;
import net.montoyo.wd.net.WDNetworkRegistry; import net.montoyo.wd.net.WDNetworkRegistry;
import net.montoyo.wd.net.server_bound.C2SMessageScreenCtrl; import net.montoyo.wd.net.server_bound.C2SMessageScreenCtrl;
import net.montoyo.wd.net.server_bound.C2SMinepadUrl;
import net.montoyo.wd.utilities.BlockSide; import net.montoyo.wd.utilities.BlockSide;
import net.montoyo.wd.utilities.Util; import net.montoyo.wd.utilities.Util;
import net.montoyo.wd.utilities.Vector3i; import net.montoyo.wd.utilities.Vector3i;
import java.io.IOException; import java.io.IOException;
import java.util.Map; import java.util.Map;
import java.util.UUID;
@Mod.EventBusSubscriber(Dist.CLIENT) @Mod.EventBusSubscriber(Dist.CLIENT)
public class GuiSetURL2 extends WDScreen { public class GuiSetURL2 extends WDScreen {
//Screen data //Screen data
private TileEntityScreen tileEntity; private TileEntityScreen tileEntity;
private BlockSide screenSide; private BlockSide screenSide;
private Vector3i remoteLocation; private Vector3i remoteLocation;
//Pad data //Pad data
private final boolean isPad; private ItemStack stack;
private final boolean isPad;
//Common
private final String screenURL; //Common
private final String screenURL;
@FillControl
private TextField tfURL; @FillControl
private TextField tfURL;
@FillControl
private Button btnShutDown; @FillControl
private Button btnShutDown;
@FillControl
private Button btnCancel; @FillControl
private Button btnCancel;
@FillControl
private Button btnOk; @FillControl
private Button btnOk;
public GuiSetURL2(TileEntityScreen tes, BlockSide side, String url, Vector3i rl) {
super(Component.nullToEmpty(null)); public GuiSetURL2(TileEntityScreen tes, BlockSide side, String url, Vector3i rl) {
tileEntity = tes; super(Component.nullToEmpty(null));
screenSide = side; tileEntity = tes;
remoteLocation = rl; screenSide = side;
isPad = false; remoteLocation = rl;
screenURL = url; isPad = false;
} screenURL = url;
}
public GuiSetURL2(String url) {
super(Component.nullToEmpty(null)); public GuiSetURL2(ItemStack is, String url) {
isPad = true; super(Component.nullToEmpty(null));
screenURL = url; isPad = true;
} stack = is;
screenURL = url;
@Override }
public void init() {
super.init(); @Override
loadFrom(new ResourceLocation("webdisplays", "gui/seturl.json")); public void init() {
tfURL.setText(screenURL); super.init();
} loadFrom(new ResourceLocation("webdisplays", "gui/seturl.json"));
tfURL.setText(screenURL);
@Override }
protected void addLoadCustomVariables(Map<String, Double> vars) {
vars.put("isPad", isPad ? 1.0 : 0.0); @Override
} protected void addLoadCustomVariables(Map<String, Double> vars) {
vars.put("isPad", isPad ? 1.0 : 0.0);
@GuiSubscribe }
public void onButtonClicked(Button.ClickEvent ev) {
if(ev.getSource() == btnCancel) protected UUID getUUID() {
minecraft.setScreen(null); if (stack == null || !(stack.getItem() instanceof ItemMinePad2))
else if(ev.getSource() == btnOk) throw new RuntimeException("Get UUID is being called for a non-minepad UI");
validate(tfURL.getText()); if (!stack.hasTag())
else if(ev.getSource() == btnShutDown) { stack.getOrCreateTag().putUUID("PadID", UUID.randomUUID());
// if(isPad)
// WDNetworkRegistry.INSTANCE.sendToServer(new SMessagePadCtrl("")); return stack.getTag().getUUID("PadID");
}
minecraft.setScreen(null);
} @GuiSubscribe
} public void onButtonClicked(Button.ClickEvent ev) {
if (ev.getSource() == btnCancel)
@GuiSubscribe minecraft.setScreen(null);
public void onEnterPressed(TextField.EnterPressedEvent ev) { else if (ev.getSource() == btnOk)
validate(ev.getText()); validate(tfURL.getText());
} else if (ev.getSource() == btnShutDown) {
if (isPad) {
private void validate(String url) { WDNetworkRegistry.INSTANCE.sendToServer(new C2SMinepadUrl(
if(!url.isEmpty()) { getUUID(),
""
try { ));
TileEntityScreen.url(url); stack.getTag().remove("PadURL");
} catch (IOException e) { }
throw new RuntimeException(e);
} minecraft.setScreen(null);
}
url = Util.addProtocol(url); }
url = ((ClientProxy) WebDisplays.PROXY).getMCEF().punycode(url);
@GuiSubscribe
if(isPad) { public void onEnterPressed(TextField.EnterPressedEvent ev) {
// WDNetworkRegistry.INSTANCE.sendToServer(new SMessagePadCtrl(url)); validate(ev.getText());
ItemStack held = minecraft.player.getItemInHand(InteractionHand.MAIN_HAND); }
if(held.getItem().equals(ItemInit.itemMinePad.get()) && held.getTag() != null && held.getTag().contains("PadID")) { private void validate(String url) {
ClientProxy.PadData pd = ((ClientProxy) WebDisplays.PROXY).getPadByID(held.getTag().getInt("PadID")); if (!url.isEmpty()) {
if(pd != null && pd.view != null) { try {
pd.view.loadURL(WebDisplays.applyBlacklist(url)); TileEntityScreen.url(url);
} } catch (IOException e) {
} throw new RuntimeException(e);
} else WDNetworkRegistry.INSTANCE.sendToServer(C2SMessageScreenCtrl.setURL(tileEntity, screenSide, url, remoteLocation)); }
}
url = Util.addProtocol(url);
minecraft.setScreen(null); url = ((ClientProxy) WebDisplays.PROXY).getMCEF().punycode(url);
}
if (isPad) {
@Override UUID uuid = getUUID();
public boolean isForBlock(BlockPos bp, BlockSide side) { WDNetworkRegistry.INSTANCE.sendToServer(new C2SMinepadUrl(uuid, url));
return (remoteLocation != null && remoteLocation.equalsBlockPos(bp)) || (bp.equals(tileEntity.getBlockPos()) && side == screenSide); stack.getTag().putString("PadURL", url);
}
ClientProxy.PadData pd = ((ClientProxy) WebDisplays.PROXY).getPadByID(uuid);
if (pd != null && pd.view != null) {
pd.view.loadURL(WebDisplays.applyBlacklist(url));
}
} else
WDNetworkRegistry.INSTANCE.sendToServer(C2SMessageScreenCtrl.setURL(tileEntity, screenSide, url, remoteLocation));
}
minecraft.setScreen(null);
}
@Override
public boolean isForBlock(BlockPos bp, BlockSide side) {
return (remoteLocation != null && remoteLocation.equalsBlockPos(bp)) || (bp.equals(tileEntity.getBlockPos()) && side == screenSide);
}
} }

View File

@ -6,11 +6,8 @@ package net.montoyo.wd.client.renderers;
import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.systems.RenderSystem;
import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.PoseStack;
import com.mojang.math.Matrix3f;
import com.mojang.math.Matrix4f;
import com.mojang.math.Vector3f; import com.mojang.math.Vector3f;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.player.AbstractClientPlayer;
import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.MultiBufferSource;
import net.minecraft.client.renderer.entity.player.PlayerRenderer; import net.minecraft.client.renderer.entity.player.PlayerRenderer;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
@ -20,8 +17,6 @@ import net.minecraftforge.api.distmarker.OnlyIn;
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.GL12.GL_RESCALE_NORMAL;
@OnlyIn(Dist.CLIENT) @OnlyIn(Dist.CLIENT)
public final class MinePadRenderer implements IItemRenderer { public final class MinePadRenderer implements IItemRenderer {
@ -94,7 +89,7 @@ public final class MinePadRenderer implements IItemRenderer {
//Render web view //Render web view
if(is.getTag() != null && is.getTag().contains("PadID")) { if(is.getTag() != null && is.getTag().contains("PadID")) {
ClientProxy.PadData pd = clientProxy.getPadByID(is.getTag().getInt("PadID")); ClientProxy.PadData pd = clientProxy.getPadByID(is.getTag().getUUID("PadID"));
if(pd != null) { if(pd != null) {
stack.translate(0.063f, 0.28f, 0.001f); stack.translate(0.063f, 0.28f, 0.001f);

View File

@ -25,85 +25,85 @@ import javax.annotation.Nullable;
import java.util.UUID; import java.util.UUID;
public class ItemMinePad2 extends Item implements WDItem { public class ItemMinePad2 extends Item implements WDItem {
public ItemMinePad2(Properties properties) { public ItemMinePad2(Properties properties) {
super(properties super(properties
//setRegistryName("minepad"); //setRegistryName("minepad");
.stacksTo(1) .stacksTo(1)
//TODO what is Full3D(); //TODO what is Full3D();
.defaultDurability(0) .defaultDurability(0)
.tab(WebDisplays.CREATIVE_TAB)); .tab(WebDisplays.CREATIVE_TAB));
} }
private static String getURL(ItemStack is) { private static String getURL(ItemStack is) {
if(is.getTag() == null || !is.getTag().contains("PadURL")) if (is.getTag() == null || !is.getTag().contains("PadURL"))
return WebDisplays.INSTANCE.homePage; return WebDisplays.INSTANCE.homePage;
else else
return is.getTag().getString("PadURL"); return is.getTag().getString("PadURL");
} }
@Override @Override
@Nonnull @Nonnull
public InteractionResultHolder<ItemStack> use(Level world, Player ply, @Nonnull InteractionHand hand) { public InteractionResultHolder<ItemStack> use(Level world, Player ply, @Nonnull InteractionHand hand) {
ItemStack is = ply.getItemInHand(hand); ItemStack is = ply.getItemInHand(hand);
boolean ok; boolean ok;
if(ply.isShiftKeyDown()) { if (ply.isShiftKeyDown()) {
if(world.isClientSide) if (world.isClientSide)
WebDisplays.PROXY.displaySetPadURLGui(getURL(is)); WebDisplays.PROXY.displaySetPadURLGui(is, getURL(is));
ok = true; ok = true;
} else if(is.getTag() != null && is.getTag().contains("PadID")) { } else if (is.getTag() != null && is.getTag().contains("PadID")) {
if(world.isClientSide) if (world.isClientSide)
WebDisplays.PROXY.openMinePadGui(is.getTag().getInt("PadID")); WebDisplays.PROXY.openMinePadGui(is.getTag().getInt("PadID"));
ok = true; ok = true;
} else } else
ok = false; ok = false;
return new InteractionResultHolder<>(ok ? InteractionResult.SUCCESS : InteractionResult.PASS, is); return new InteractionResultHolder<>(ok ? InteractionResult.SUCCESS : InteractionResult.PASS, is);
} }
@Override @Override
public boolean onEntityItemUpdate(ItemStack stack, ItemEntity ent) { public boolean onEntityItemUpdate(ItemStack stack, ItemEntity ent) {
if(ent.isOnGround() && !ent.getLevel().isClientSide) { if (ent.isOnGround() && !ent.getLevel().isClientSide) {
CompoundTag tag = ent.getItem().getTag(); CompoundTag tag = ent.getItem().getTag();
if(tag != null && tag.contains("ThrowHeight")) { if (tag != null && tag.contains("ThrowHeight")) {
//Delete it, it touched the ground //Delete it, it touched the ground
double height = tag.getDouble("ThrowHeight"); double height = tag.getDouble("ThrowHeight");
UUID thrower = null; UUID thrower = null;
if(tag.contains("ThrowerMSB") && tag.contains("ThrowerLSB")) if (tag.contains("ThrowerMSB") && tag.contains("ThrowerLSB"))
thrower = new UUID(tag.getLong("ThrowerMSB"), tag.getLong("ThrowerLSB")); thrower = new UUID(tag.getLong("ThrowerMSB"), tag.getLong("ThrowerLSB"));
if(tag.contains("PadID") || tag.contains("PadURL")) { if (tag.contains("PadID") || tag.contains("PadURL")) {
tag.remove("ThrowerMSB"); tag.remove("ThrowerMSB");
tag.remove("ThrowerLSB"); tag.remove("ThrowerLSB");
tag.remove("ThrowHeight"); tag.remove("ThrowHeight");
} else //We can delete the whole tag } else //We can delete the whole tag
ent.getItem().setTag(null); ent.getItem().setTag(null);
if(thrower != null && height - ent.getBlockY() >= 20.0) { if (thrower != null && height - ent.getBlockY() >= 20.0) {
ent.getLevel().playSound(null, ent.getBlockX(), ent.getBlockY(), ent.getBlockZ(), SoundEvents.GLASS_BREAK, SoundSource.BLOCKS, 4.0f, 1.0f); ent.getLevel().playSound(null, ent.getBlockX(), ent.getBlockY(), ent.getBlockZ(), SoundEvents.GLASS_BREAK, SoundSource.BLOCKS, 4.0f, 1.0f);
ent.getLevel().addFreshEntity(new ItemEntity(ent.getLevel(), ent.getBlockX(), ent.getBlockY(), ent.getBlockZ(), CraftComponent.EXTCARD.makeItemStack())); ent.getLevel().addFreshEntity(new ItemEntity(ent.getLevel(), ent.getBlockX(), ent.getBlockY(), ent.getBlockZ(), CraftComponent.EXTCARD.makeItemStack()));
ent.setRemoved(Entity.RemovalReason.CHANGED_DIMENSION); ent.setRemoved(Entity.RemovalReason.CHANGED_DIMENSION);
Player ply = ent.getLevel().getPlayerByUUID(thrower); Player ply = ent.getLevel().getPlayerByUUID(thrower);
if(ply != null && ply instanceof ServerPlayer) if (ply != null && ply instanceof ServerPlayer)
WebDisplays.INSTANCE.criterionPadBreak.trigger(((ServerPlayer) ply).getAdvancements()); WebDisplays.INSTANCE.criterionPadBreak.trigger(((ServerPlayer) ply).getAdvancements());
} }
} }
} }
return false; return false;
} }
@Nullable @Nullable
@Override @Override
public String getWikiName(@Nonnull ItemStack is) { public String getWikiName(@Nonnull ItemStack is) {
return is.getItem().getName(is).getString(); return is.getItem().getName(is).getString();
} }
} }

View File

@ -4,10 +4,7 @@ import net.minecraft.resources.ResourceLocation;
import net.minecraftforge.network.NetworkRegistry; import net.minecraftforge.network.NetworkRegistry;
import net.minecraftforge.network.simple.SimpleChannel; import net.minecraftforge.network.simple.SimpleChannel;
import net.montoyo.wd.net.client_bound.*; import net.montoyo.wd.net.client_bound.*;
import net.montoyo.wd.net.server_bound.C2SMessageACQuery; import net.montoyo.wd.net.server_bound.*;
import net.montoyo.wd.net.server_bound.C2SMessageMiniservConnect;
import net.montoyo.wd.net.server_bound.C2SMessageRedstoneCtrl;
import net.montoyo.wd.net.server_bound.C2SMessageScreenCtrl;
import java.util.ArrayList; import java.util.ArrayList;
@ -53,6 +50,9 @@ public class WDNetworkRegistry {
// jsquery // jsquery
entries.add(new NetworkEntry<>(S2CMessageJSResponse.class, S2CMessageJSResponse::new)); entries.add(new NetworkEntry<>(S2CMessageJSResponse.class, S2CMessageJSResponse::new));
// minepad
entries.add(new NetworkEntry<>(C2SMinepadUrl.class, C2SMinepadUrl::new));
for (int i = 0; i < entries.size(); i++) entries.get(i).register(i, INSTANCE); for (int i = 0; i < entries.size(); i++) entries.get(i).register(i, INSTANCE);
} }

View File

@ -0,0 +1,43 @@
package net.montoyo.wd.net.server_bound;
import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.world.InteractionHand;
import net.minecraft.world.item.ItemStack;
import net.minecraftforge.network.NetworkEvent;
import net.montoyo.wd.item.ItemMinePad2;
import net.montoyo.wd.net.Packet;
import java.util.UUID;
public class C2SMinepadUrl extends Packet {
UUID id;
String url;
public C2SMinepadUrl(UUID id, String url) {
this.id = id;
this.url = url;
}
public C2SMinepadUrl(FriendlyByteBuf buf) {
super(buf);
this.id = buf.readUUID();
this.url = buf.readUtf();
}
@Override
public void write(FriendlyByteBuf buf) {
buf.writeUUID(id);
buf.writeUtf(url);
}
@Override
public void handle(NetworkEvent.Context ctx) {
for (InteractionHand value : InteractionHand.values()) {
ItemStack stack = ctx.getSender().getItemInHand(value);
if (stack.getItem() instanceof ItemMinePad2 pad) {
stack.getOrCreateTag().putUUID("PadID", id);
stack.getOrCreateTag().putString("PadURL", url);
}
}
}
}

View File

@ -12,15 +12,15 @@
"item.webdisplays.ownerthief": "Ownership Thief [ADMIN]", "item.webdisplays.ownerthief": "Ownership Thief [ADMIN]",
"item.webdisplays.linker": "Linking Tool", "item.webdisplays.linker": "Linking Tool",
"item.webdisplays.craftcomp": "Craft Component", "item.webdisplays.craftcomp": "Craft Component",
"item.webdisplays.craftcomp.stonekey": "Stone Key", "item.webdisplays.craftcomp_stonekey": "Stone Key",
"item.webdisplays.craftcomp.upgrade": "Blank Upgrade", "item.webdisplays.craftcomp_upgrade": "Blank Upgrade",
"item.webdisplays.craftcomp.peripheral": "Peripheral Base", "item.webdisplays.craftcomp_peripheral": "Peripheral Base",
"item.webdisplays.craftcomp.batcell": "Battery Cell", "item.webdisplays.craftcomp_batcell": "Battery Cell",
"item.webdisplays.craftcomp.batpack": "Battery Pack", "item.webdisplays.craftcomp_batpack": "Battery Pack",
"item.webdisplays.craftcomp.laserdiode": "650nm Laser Diode", "item.webdisplays.craftcomp_laserdiode": "650nm Laser Diode",
"item.webdisplays.craftcomp.backlight": "Backlight", "item.webdisplays.craftcomp_backlight": "Backlight",
"item.webdisplays.craftcomp.extcard": "Extension Card", "item.webdisplays.craftcomp_extcard": "Extension Card",
"item.webdisplays.craftcomp.badextcard": "Bad Extension Card", "item.webdisplays.craftcomp_badextcard": "Bad Extension Card",
"item.webdisplays.minepad": "minePad", "item.webdisplays.minepad": "minePad",
"item.webdisplays.minepad2": "minePad 2", "item.webdisplays.minepad2": "minePad 2",
"item.webdisplays.upgrade": "Screen Upgrade", "item.webdisplays.upgrade": "Screen Upgrade",
@ -45,7 +45,7 @@
"webdisplays.message.linked": "Linked!", "webdisplays.message.linked": "Linked!",
"webdisplays.message.linkError": "Link error :( Check logs...", "webdisplays.message.linkError": "Link error :( Check logs...",
"webdisplays.message.notAScreen": "Please right click on the screen first...", "webdisplays.message.notAScreen": "Please right click on the screen first...",
"webdisplays.message.screenSet2": "Screen set! Now right click on the periphe,ral...", "webdisplays.message.screenSet2": "Screen set! Now right click on the peripheral...",
"webdisplays.message.chunkUnloaded": "The chunk the screen is placed in is no,t loaded!", "webdisplays.message.chunkUnloaded": "The chunk the screen is placed in is no,t loaded!",
"webdisplays.message.notLinked": "This peripheral has not been linked yet.", "webdisplays.message.notLinked": "This peripheral has not been linked yet.",
"webdisplays.message.missingCC": "ComputerCraft is not available.", "webdisplays.message.missingCC": "ComputerCraft is not available.",
@ -108,7 +108,7 @@
"advancements.webdisplays.minepad2.title": "Pigeon", "advancements.webdisplays.minepad2.title": "Pigeon",
"advancements.webdisplays.minepad2.description": "Craft a minePad 2. Look, I know it's expensive, but that means it's better than anything else, right? ...right?", "advancements.webdisplays.minepad2.description": "Craft a minePad 2. Look, I know it's expensive, but that means it's better than anything else, right? ...right?",
"advancements.webdisplays.linkperipheral.title": "It's wireless!", "advancements.webdisplays.linkperipheral.title": "It's wireless!",
"advancements.webdisplays.linkperipheral.description": "Link a peripheral to ,a screen", "advancements.webdisplays.linkperipheral.description": "Link a peripheral to a screen",
"advancements.webdisplays.keyboardcat.title": "DAMN CATS", "advancements.webdisplays.keyboardcat.title": "DAMN CATS",
"advancements.webdisplays.keyboardcat.description": "Have an ocelot walk on y,our keyboard", "advancements.webdisplays.keyboardcat.description": "Have an ocelot walk on y,our keyboard",
"advancements.webdisplays.upgrade.title": "More than a screen", "advancements.webdisplays.upgrade.title": "More than a screen",