diff --git a/README.md b/README.md index 062148f..a0ed0d7 100644 --- a/README.md +++ b/README.md @@ -1,19 +1,12 @@ # WebDisplays for Minecraft 1.12.2 This is the unfinished port of the WebDisplays mod for Minecraft 1.12.2. The text below is my "TODO" list. -### Missing features -* Read config (see "Config elements" below) - ### TODO -* French translations -* Change mod name to WD2 -* Auto-find rotation for BOTTOM & TOP screens - -### Config elements -* RPMP (Real pixels per Minecraft pixels) -* Screen load/unload distance (max distance = 60.0) -* Disable ownership thief item -* Put a limit on screen resolution +* TESTING +* "Anti-9minecraft" +* Write wiki +* Update website +* Publish ### Delayed things * Plugin API @@ -22,5 +15,4 @@ This is the unfinished port of the WebDisplays mod for Minecraft 1.12.2. The tex * Center camera to screen when using keyboard * minePad management: check GuiContainer.draggedStack for minePad * In-game command to add/remove blacklisted domains - - +* Config: RPMP (Real pixels per Minecraft pixels) diff --git a/src/main/java/net/montoyo/wd/WebDisplays.java b/src/main/java/net/montoyo/wd/WebDisplays.java index 91b2ac9..e5cb39a 100644 --- a/src/main/java/net/montoyo/wd/WebDisplays.java +++ b/src/main/java/net/montoyo/wd/WebDisplays.java @@ -102,9 +102,16 @@ public class WebDisplays { public double padResX; public double padResY; private int lastPadId = 0; - public boolean doHardRecipe = true; + public boolean doHardRecipe; private boolean hasOC; private String[] blacklist; + public boolean disableOwnershipThief; + public double unloadDistance2; + public double loadDistance2; + public int maxResX; + public int maxResY; + public int miniservPort; + public long miniservQuota; @Mod.EventHandler public void onPreInit(FMLPreInitializationEvent ev) { @@ -115,16 +122,42 @@ public class WebDisplays { 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", 7680); + Property maxResY = cfg.get("main", "maxResolutionY", 4320); + Property miniservPort = cfg.get("main", "miniservPort", 25566); + Property miniservQuota = cfg.get("main", "miniservQuota", 1024); //It's stored as a string anyway + Property loadDistance = cfg.get("client", "loadDistance", 30.0); + Property unloadDistance = cfg.get("client", "unloadDistance", 32.0); 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)"); + + if(unloadDistance.getDouble() < loadDistance.getDouble() + 2.0) + unloadDistance.set(loadDistance.getDouble() + 2.0); + cfg.save(); this.blacklist = blacklist.getStringList(); - this.doHardRecipe = hardRecipe.getBoolean(); + doHardRecipe = hardRecipe.getBoolean(); this.homePage = homePage.getString(); + disableOwnershipThief = disableOT.getBoolean(); + unloadDistance2 = unloadDistance.getDouble() * unloadDistance.getDouble(); + loadDistance2 = loadDistance.getDouble() * loadDistance.getDouble(); + this.maxResX = maxResX.getInt(); + this.maxResY = maxResY.getInt(); + this.miniservPort = miniservPort.getInt(); + this.miniservQuota = miniservQuota.getLong() * 1024L; CREATIVE_TAB = new WDCreativeTab(); @@ -233,9 +266,12 @@ public class WebDisplays { } } - Server sv = Server.getInstance(); - sv.setDirectory(new File(worldDir, "wd_filehost")); - sv.start(); //TODO: Configure port + if(miniservPort != 0) { + Server sv = Server.getInstance(); + sv.setPort(miniservPort); + sv.setDirectory(new File(worldDir, "wd_filehost")); + sv.start(); + } } @SubscribeEvent @@ -295,7 +331,7 @@ public class WebDisplays { @SubscribeEvent public void onLogIn(PlayerEvent.PlayerLoggedInEvent ev) { if(!ev.player.world.isRemote && ev.player instanceof EntityPlayerMP) - WebDisplays.NET_HANDLER.sendTo(new CMessageServerInfo(25566), (EntityPlayerMP) ev.player); //TODO: Port config + WebDisplays.NET_HANDLER.sendTo(new CMessageServerInfo(miniservPort), (EntityPlayerMP) ev.player); } @SubscribeEvent diff --git a/src/main/java/net/montoyo/wd/client/ClientProxy.java b/src/main/java/net/montoyo/wd/client/ClientProxy.java index 13e7b61..2ef4dff 100644 --- a/src/main/java/net/montoyo/wd/client/ClientProxy.java +++ b/src/main/java/net/montoyo/wd/client/ClientProxy.java @@ -105,8 +105,6 @@ public class ClientProxy extends SharedProxy implements IResourceManagerReloadLi //Tracking private ArrayList screenTracking = new ArrayList<>(); - private double unloadDistance2 = 32.0 * 32.0; - private double loadDistance2 = 30.0 * 30.0; private int lastTracked = 0; //MinePads Management @@ -477,11 +475,11 @@ public class ClientProxy extends SharedProxy implements IResourceManagerReloadLi double dist2 = mc.player.getDistanceSq(tes.getPos()); if(tes.isLoaded()) { - if(dist2 > unloadDistance2) + if(dist2 > WebDisplays.INSTANCE.unloadDistance2) tes.unload(); else tes.updateTrackDistance(dist2); - } else if(dist2 <= loadDistance2) + } else if(dist2 <= WebDisplays.INSTANCE.loadDistance2) tes.load(); } diff --git a/src/main/java/net/montoyo/wd/client/gui/GuiScreenConfig.java b/src/main/java/net/montoyo/wd/client/gui/GuiScreenConfig.java index b92e39e..e769256 100644 --- a/src/main/java/net/montoyo/wd/client/gui/GuiScreenConfig.java +++ b/src/main/java/net/montoyo/wd/client/gui/GuiScreenConfig.java @@ -29,6 +29,7 @@ public class GuiScreenConfig extends WDScreen { private int friendRights; private int otherRights; private Rotation rotation = Rotation.ROT_0; + private float aspectRatio; //Autocomplete handling private boolean waitingAC; @@ -101,6 +102,9 @@ public class GuiScreenConfig extends WDScreen { @FillControl private Button btnChangeRot; + @FillControl + private CheckBox cbLockRatio; + private CheckBox[] friendBoxes; private CheckBox[] otherBoxes; @@ -138,6 +142,7 @@ public class GuiScreenConfig extends WDScreen { tfResX.setText("" + scr.resolution.x); tfResY.setText("" + scr.resolution.y); + aspectRatio = ((float) scr.resolution.x) / ((float) scr.resolution.y); //Hopefully upgrades have been synchronized... ugUpgrades.setUpgrades(scr.upgrades); @@ -242,6 +247,22 @@ public class GuiScreenConfig extends WDScreen { } } + if(cbLockRatio.isChecked()) { + if(ev.getSource() == tfResX) { + try { + float val = (float) Integer.parseInt(ev.getNewContent()); + val /= aspectRatio; + tfResY.setText("" + ((int) val)); + } catch(NumberFormatException ex) {} + } else { + try { + float val = (float) Integer.parseInt(ev.getNewContent()); + val *= aspectRatio; + tfResX.setText("" + ((int) val)); + } catch(NumberFormatException ex) {} + } + } + btnSetRes.setDisabled(false); } } @@ -270,6 +291,15 @@ public class GuiScreenConfig extends WDScreen { otherRights &= ~flag; requestSync(); + } else if(ev.getSource() == cbLockRatio && ev.isChecked()) { + try { + int x = Integer.parseInt(tfResX.getText()); + int y = Integer.parseInt(tfResY.getText()); + + aspectRatio = ((float) x) / ((float) y); + } catch(NumberFormatException ex) { + cbLockRatio.setChecked(false); + } } } @@ -445,6 +475,7 @@ public class GuiScreenConfig extends WDScreen { } public void updateResolution(Vector2i res) { + aspectRatio = ((float) res.x) / ((float) res.y); tfResX.setText("" + res.x); tfResY.setText("" + res.y); btnSetRes.setDisabled(true); diff --git a/src/main/java/net/montoyo/wd/client/gui/GuiServer.java b/src/main/java/net/montoyo/wd/client/gui/GuiServer.java index 3e8483e..eaa81e0 100644 --- a/src/main/java/net/montoyo/wd/client/gui/GuiServer.java +++ b/src/main/java/net/montoyo/wd/client/gui/GuiServer.java @@ -238,6 +238,9 @@ public class GuiServer extends WDScreen { updateUploadScreen(); } else startFileUpload(file, true); + } else if(keyCode == Keyboard.KEY_F5) { + uploadCD(uploadDir); + updateUploadScreen(); } } @@ -553,13 +556,13 @@ public class GuiServer extends WDScreen { private void updateUploadScreen() { lines.clear(); - lines.add("Choose a file to upload"); + lines.add(tr("upload.info")); lines.add(trimStringL(uploadDir.getPath())); lines.add(""); for(int i = uploadOffset; i < uploadFiles.size() && lines.size() < MAX_LINES; i++) { if(i == 0 && uploadFirstIsParent) - lines.add("[Parent directory]"); + lines.add(tr("upload.parent")); else lines.add(trimStringR(uploadFiles.get(i).getName())); } diff --git a/src/main/java/net/montoyo/wd/entity/TileEntityScreen.java b/src/main/java/net/montoyo/wd/entity/TileEntityScreen.java index f245627..28859e8 100644 --- a/src/main/java/net/montoyo/wd/entity/TileEntityScreen.java +++ b/src/main/java/net/montoyo/wd/entity/TileEntityScreen.java @@ -15,6 +15,7 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.*; import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.MathHelper; import net.minecraft.world.World; import net.minecraftforge.fml.common.network.NetworkRegistry; import net.montoyo.mcef.api.IBrowser; @@ -186,6 +187,20 @@ public class TileEntityScreen extends TileEntity { } } + public void clampResolution() { + if(resolution.x > WebDisplays.INSTANCE.maxResX) { + float newY = ((float) resolution.y) * ((float) WebDisplays.INSTANCE.maxResX) / ((float) resolution.x); + resolution.x = WebDisplays.INSTANCE.maxResX; + resolution.y = (int) newY; + } + + if(resolution.y > WebDisplays.INSTANCE.maxResY) { + float newX = ((float) resolution.x) * ((float) WebDisplays.INSTANCE.maxResY) / ((float) resolution.y); + resolution.x = (int) newX; + resolution.y = WebDisplays.INSTANCE.maxResY; + } + } + } private ArrayList screens = new ArrayList<>(); @@ -256,9 +271,23 @@ public class TileEntityScreen extends TileEntity { ret.otherRights = ScreenRights.DEFAULTS; ret.upgrades = new ArrayList<>(); - if(owner != null) + if(owner != null) { ret.owner = new NameUUIDPair(owner.getGameProfile()); + if(side == BlockSide.TOP || side == BlockSide.BOTTOM) { + int rot = MathHelper.floor(((double) (owner.rotationYaw * 4.0f / 360.0f)) + 2.5) & 3; + + if(side == BlockSide.TOP) { + if(rot == 1) + rot = 3; + else if(rot == 3) + rot = 1; + } + + ret.rotation = Rotation.values()[rot]; + } + } + if(resolution == null || resolution.x < 1 || resolution.y < 1) { float psx = ((float) size.x) * 16.f - 4.f; float psy = ((float) size.y) * 16.f - 4.f; @@ -269,6 +298,8 @@ public class TileEntityScreen extends TileEntity { } else ret.resolution = resolution; + ret.clampResolution(); + if(!world.isRemote) { ret.setupRedstoneStatus(world, pos); @@ -380,6 +411,7 @@ public class TileEntityScreen extends TileEntity { } scr.resolution = res; + scr.clampResolution(); if(world.isRemote) { WebDisplays.PROXY.screenUpdateResolutionInGui(new Vector3i(pos), side, res); diff --git a/src/main/java/net/montoyo/wd/entity/TileEntityServer.java b/src/main/java/net/montoyo/wd/entity/TileEntityServer.java index b72194a..f9acb36 100644 --- a/src/main/java/net/montoyo/wd/entity/TileEntityServer.java +++ b/src/main/java/net/montoyo/wd/entity/TileEntityServer.java @@ -8,6 +8,7 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; +import net.montoyo.wd.WebDisplays; import net.montoyo.wd.data.ServerData; import net.montoyo.wd.utilities.NameUUIDPair; import net.montoyo.wd.utilities.Util; @@ -40,10 +41,9 @@ public class TileEntityServer extends TileEntity { if(world.isRemote) return true; - //TODO: Check if miniserv is disabled - //Util.toast(ply, "noMiniserv"); - - if(owner != null && ply instanceof EntityPlayerMP) + if(WebDisplays.INSTANCE.miniservPort == 0) + Util.toast(ply, "noMiniserv"); + else if(owner != null && ply instanceof EntityPlayerMP) (new ServerData(owner)).sendTo((EntityPlayerMP) ply); return true; diff --git a/src/main/java/net/montoyo/wd/item/ItemOwnershipThief.java b/src/main/java/net/montoyo/wd/item/ItemOwnershipThief.java index 7945ae8..7d05d58 100644 --- a/src/main/java/net/montoyo/wd/item/ItemOwnershipThief.java +++ b/src/main/java/net/montoyo/wd/item/ItemOwnershipThief.java @@ -43,6 +43,11 @@ public class ItemOwnershipThief extends Item { if(world.isRemote) return EnumActionResult.SUCCESS; + if(WebDisplays.INSTANCE.disableOwnershipThief) { + Util.toast(player, "otDisabled"); + return EnumActionResult.SUCCESS; + } + ItemStack stack = player.getHeldItem(hand); if(stack.hasTagCompound()) { NBTTagCompound tag = stack.getTagCompound(); diff --git a/src/main/java/net/montoyo/wd/miniserv/server/Server.java b/src/main/java/net/montoyo/wd/miniserv/server/Server.java index 8906d55..a72c56f 100644 --- a/src/main/java/net/montoyo/wd/miniserv/server/Server.java +++ b/src/main/java/net/montoyo/wd/miniserv/server/Server.java @@ -4,6 +4,7 @@ package net.montoyo.wd.miniserv.server; +import net.montoyo.wd.WebDisplays; import net.montoyo.wd.utilities.Log; import net.montoyo.wd.utilities.Util; @@ -36,10 +37,13 @@ public class Server implements Runnable { private final ByteBuffer readBuffer = ByteBuffer.allocateDirect(8192); private final ClientManager clientMgr = new ClientManager(); private File directory; - private long maxQuota = 1024 * 1024; //1 MiB max private volatile boolean running; private volatile Thread thread; + public void setPort(int p) { + port = p; + } + public void start() { thread = new Thread(this); thread.setName("MiniServServer"); @@ -231,7 +235,7 @@ public class Server implements Runnable { } public long getMaxQuota() { - return maxQuota; + return WebDisplays.INSTANCE.miniservQuota; } } diff --git a/src/main/resources/assets/webdisplays/gui/screencfg.json b/src/main/resources/assets/webdisplays/gui/screencfg.json index 07fd00f..84e2383 100644 --- a/src/main/resources/assets/webdisplays/gui/screencfg.json +++ b/src/main/resources/assets/webdisplays/gui/screencfg.json @@ -180,17 +180,25 @@ "label": "$webdisplays.gui.screencfg.setres", "disabled": true }, + { + "type": "CheckBox", + "name": "cbLockRatio", + "x": 257, + "y": 99, + "label": "$webdisplays.gui.screencfg.lockratio", + "checked": true + }, { "type": "Label", "x": 258, - "y": 105, + "y": 117, "label": "$webdisplays.gui.screencfg.rotation" }, { "type": "Button", "name": "btnChangeRot", "x": 260, - "y": 117, + "y": 129, "width": 84 } ], diff --git a/src/main/resources/assets/webdisplays/lang/en_us.lang b/src/main/resources/assets/webdisplays/lang/en_us.lang index 9c56488..be9c912 100644 --- a/src/main/resources/assets/webdisplays/lang/en_us.lang +++ b/src/main/resources/assets/webdisplays/lang/en_us.lang @@ -51,6 +51,7 @@ webdisplays.message.upgradeError=Upgrade error :( Check logs... webdisplays.message.upgradeOk=Upgrade installed! webdisplays.message.linkAbort=Linker reset webdisplays.message.noMiniserv=Server block is disabled on this server +webdisplays.message.otDisabled=Ownership thief is disabled on this server webdisplays.gui.screencfg.owner=Screen owner: webdisplays.gui.screencfg.friends=Friends: webdisplays.gui.screencfg.permissions=Permissions: @@ -69,6 +70,7 @@ webdisplays.gui.screencfg.rot0=0° webdisplays.gui.screencfg.rot90=90° webdisplays.gui.screencfg.rot180=180° webdisplays.gui.screencfg.rot270=270° +webdisplays.gui.screencfg.lockratio=Lock ratio webdisplays.linker.selectScreen=Right click on a screen webdisplays.linker.selectPeripheral=Right click on a peripheral webdisplays.linker.posInfo=Screen pos: %d %d %d @@ -88,7 +90,7 @@ webdisplays.gui.keyboard.warning2=This means anyone can know what you're up to. webdisplays.gui.keyboard.warning3=NEVER write one of your passwords using this keyboard. webdisplays.gui.keyboard.gotcha=Got ya advancements.webdisplays.root.title=WebDisplays -advancements.webdisplays.root.description=The WebDisplays mod advancements +advancements.webdisplays.root.description=The WebDisplays mod advancements.webdisplays.screen.title=The internet is for... advancements.webdisplays.screen.description=Craft your first web display advancements.webdisplays.minepad.title=This is a revolution @@ -126,6 +128,8 @@ webdisplays.server.fnamearg=Missing file name argument webdisplays.server.nameerr=Invalid file name webdisplays.server.urlcopied=Copied URL to clipboard. webdisplays.server.notfound=File not found +webdisplays.server.upload.info=Choose a file to upload +webdisplays.server.upload.parent=[Parent directory] webdisplays.server.upload.uploading=Uploading... webdisplays.server.upload.done=Done webdisplays.server.upload.exists=Error: File exists diff --git a/src/main/resources/assets/webdisplays/lang/fr_fr.lang b/src/main/resources/assets/webdisplays/lang/fr_fr.lang new file mode 100644 index 0000000..f914432 --- /dev/null +++ b/src/main/resources/assets/webdisplays/lang/fr_fr.lang @@ -0,0 +1,147 @@ +itemGroup.webdisplays=§5Web Displays +tile.webdisplays.screen.name=Ecran +tile.webdisplays.peripheral.name=Périphérique +tile.webdisplays.peripheral.keyboard.name=Clavier +tile.webdisplays.peripheral.remotectrl.name=Télécommande +tile.webdisplays.peripheral.ccinterface.name=Interface ComputerCraft +tile.webdisplays.peripheral.cointerface.name=Interface OpenComputers +tile.webdisplays.peripheral.redstonectrl.name=Contrôleur +tile.webdisplays.peripheral.server.name=Serveur +item.webdisplays.screencfg.name=Gestionnaire d'écran +item.webdisplays.ownerthief.name=Voleur d'écran [ADMIN] +item.webdisplays.linker.name=Outil d'appairage +item.webdisplays.craftcomp.name=Composant de recette +item.webdisplays.craftcomp.stonekey.name=Touche en pierre +item.webdisplays.craftcomp.upgrade.name=Amélioration vide +item.webdisplays.craftcomp.peripheral.name=Base de périphérique +item.webdisplays.craftcomp.batcell.name=Cellule de batterie +item.webdisplays.craftcomp.batpack.name=Batterie +item.webdisplays.craftcomp.laserdiode.name=Diode laser 650nm +item.webdisplays.craftcomp.backlight.name=Rétroéclairage +item.webdisplays.craftcomp.extcard.name=Carte d'extension +item.webdisplays.craftcomp.badextcard.name=Carte d'extension ratée +item.webdisplays.minepad.name=minePad +item.webdisplays.minepad2.name=minePad 2 +item.webdisplays.upgrade.name=Amélioration d'écran +item.webdisplays.upgrade.lasermouse.name=Capteur de laser +item.webdisplays.upgrade.redinput.name=Port d'entrée Redstone +item.webdisplays.upgrade.redoutput.name=Port de sortie Redstone +item.webdisplays.upgrade.gps.name=Module GALILEO +item.webdisplays.laserpointer.name=Pointeur laser +item.webdisplays.advicon.name=Icone de progrès +item.webdisplays.advicon.wd.name=WebDisplays +item.webdisplays.advicon.brokenpad.name=minePad cassé +item.webdisplays.advicon.pigeon.name=Pigeon +webdisplays.message.tooSmall=Trop petit ! La taille minimale est de 2x2. +webdisplays.message.invalid=La structure est invalide; regardez vers %s. +webdisplays.message.turnOn=Vous devez d'abord allumer l'écran +webdisplays.message.screenSet=Ecran sélectionné ! Donnez l'item à quelqu'un... +webdisplays.message.newOwner=Vous êtes maintenant le propriétaire de cet écran +webdisplays.message.restrictions=Vous n'avez pas le droit de faire cela :( +webdisplays.message.peripheral=Ce n'est pas un périphérique! +webdisplays.message.linked=Appairé ! +webdisplays.message.linkError=Erreur d'appairage... :( vérifiez les logs +webdisplays.message.notAScreen=Vous devez d'abord sélectionner un écran +webdisplays.message.screenSet2=Ecran sélectionné! Maintenant, sélectionnez un périphérique... +webdisplays.message.chunkUnloaded=Le chunk dans lequel se trouve l'écran n'est pas chargé +webdisplays.message.notLinked=Ce périphérique n'a pas encore été appairé +webdisplays.message.missingCC=ComputerCraft non disponible. +webdisplays.message.missingOC=OpenComputers non disponible. +webdisplays.message.upgradeError=Erreur lors de l'amélioration, vérifiez les logs +webdisplays.message.upgradeOk=Amélioration installée ! +webdisplays.message.linkAbort=Outil d'appairage remis à zéro. +webdisplays.message.noMiniserv=Le bloc serveur est désactivé +webdisplays.message.otDisabled=Le voleur d'écran est désactivé sur ce serveur +webdisplays.gui.screencfg.owner=Propriétaire : +webdisplays.gui.screencfg.friends=Amis : +webdisplays.gui.screencfg.permissions=Permissions : +webdisplays.gui.screencfg.seturl=Changer l'URL +webdisplays.gui.screencfg.click=Cliquer & écrire +webdisplays.gui.screencfg.friendlist=Gérer les amis +webdisplays.gui.screencfg.otherrights=Gérer les autres +webdisplays.gui.screencfg.mupgrades=Améliorer & appairer +webdisplays.gui.screencfg.mres=Changer la résolution +webdisplays.gui.screencfg.others=Autres +webdisplays.gui.screencfg.upgrades=Améliorations : +webdisplays.gui.screencfg.resolution=Résolution : +webdisplays.gui.screencfg.setres=Déf. Resolution +webdisplays.gui.screencfg.rotation=Rotation +webdisplays.gui.screencfg.rot0=0° +webdisplays.gui.screencfg.rot90=90° +webdisplays.gui.screencfg.rot180=180° +webdisplays.gui.screencfg.rot270=270° +webdisplays.gui.screencfg.lockratio=Verrouiller le ratio +webdisplays.linker.selectScreen=Cliquez droit sur un écran +webdisplays.linker.selectPeripheral=Cliquez droit sur un périphérique +webdisplays.linker.posInfo=Pos. écran : %d %d %d +webdisplays.linker.sideInfo=Côté : %s +webdisplays.gui.seturl.url=URL: +webdisplays.gui.seturl.ok=OK +webdisplays.gui.seturl.cancel=Annuler +webdisplays.gui.seturl.shutdown=Eteindre +webdisplays.minepad.turnon=Pour allumer, s'accroupir et faire clique-droit +webdisplays.minepad2.info=PAS DE REMBOURSEMENT ! +webdisplays.extcard.cantcraft1=Vous n'avez pas assez de connaissances +webdisplays.extcard.cantcraft2=Vous ALLEZ RATER la fabrication de cet item +webdisplays.extcard.bad=Quelqu'un a raté la fabrication de cette carte +webdisplays.gui.keyboard.hooked=Clavier attaché. Appuyez sur Echap pour quitter. +webdisplays.gui.keyboard.warning1=ATTENTION ! Le texte que vous tapez ici est envoyé EN CLAIR au serveur. +webdisplays.gui.keyboard.warning2=Cela signifie que tout le monde peut voir ce que vous tapez. +webdisplays.gui.keyboard.warning3=Ne JAMAIS taper de mot de passe avec ce clavier. +webdisplays.gui.keyboard.gotcha=Je comprends +advancements.webdisplays.root.title=WebDisplays +advancements.webdisplays.root.description=Le mod WebDisplays +advancements.webdisplays.screen.title=The internet is for... +advancements.webdisplays.screen.description=Fabriquez votre premier écran +advancements.webdisplays.minepad.title=C'est une révolution +advancements.webdisplays.minepad.description=Essayez notre tout dernier bijoux technologique: le minePad ! +advancements.webdisplays.padbreak.title=Rétro-ingénierie +advancements.webdisplays.padbreak.description=Ces trucs là sont fragiles ! Ne les jetez pas de haut pour débloquer les recettes des améliorations ! +advancements.webdisplays.minepad2.title=Pigeon +advancements.webdisplays.minepad2.description=Fabriquez un minePad 2. Ecoutez, je sais que c'est très cher, mais ça veut dire que ce qu'il y'a de mieux non ? +advancements.webdisplays.linkperipheral.title=Sans fils ! +advancements.webdisplays.linkperipheral.description=Appairez un périphérique à un écran +advancements.webdisplays.keyboardcat.title=PU**IN DE CHATS +advancements.webdisplays.keyboardcat.description=Faites en sorte qu'un ocelot marche sur votre clavier +advancements.webdisplays.upgrade.title=Plus qu'un écran +advancements.webdisplays.upgrade.description=Installez votre première amélioration +advancements.webdisplays.laser.title=Ne pas viser les yeux +advancements.webdisplays.laser.description=Fabriquez un pointeur laser +webdisplays.side.bottom=Bas +webdisplays.side.top=Haut +webdisplays.side.north=Nord +webdisplays.side.south=Sud +webdisplays.side.west=Ouest +webdisplays.side.east=Est +webdisplays.server.info=Tapez "help" pour obtenir de l'aide +webdisplays.server.unknowncmd=Commande inconnue. +webdisplays.server.error=Erreur interne. Vérifiez les logs. +webdisplays.server.error2=Erreur interne %d. Vérifiez les logs. +webdisplays.server.argerror=Argument non reconnu +webdisplays.server.queryerr=Erreur de requête, essayez "reconnect". +webdisplays.server.errowner=Seul le propriétaire peut faire cela. +webdisplays.server.timeout=Le délai est dépaissé. Vérifiez les logs. +webdisplays.server.ownername=Nom du propriétaire : %s +webdisplays.server.owneruuid=UUID du propriétaire : +webdisplays.server.quota=%s/%s utilisés +webdisplays.server.fnamearg=Nom de fichier manquant +webdisplays.server.nameerr=Nom de fichier invalide +webdisplays.server.urlcopied=URL copié dans le presse-papier. +webdisplays.server.notfound=Fichier introuvable +webdisplays.server.upload.info=Choisissez un fichier +webdisplays.server.upload.parent=[Dossier parent] +webdisplays.server.upload.uploading=Mise en ligne... +webdisplays.server.upload.done=Terminé ! +webdisplays.server.upload.exists=Erreur : le fichier existe +webdisplays.server.upload.quota=Erreur : taille max atteinte +webdisplays.server.help.help=Affiche ce texte +webdisplays.server.help.clear=Efface l'écran +webdisplays.server.help.exit=Quitte la console +webdisplays.server.help.access=§kPas d'aide disponible +webdisplays.server.help.owner=Affiche le proprio. de ce serveur +webdisplays.server.help.quota=Affiche le quota de stockage +webdisplays.server.help.ls=Liste les fichiers de ce serveur +webdisplays.server.help.url=Copie l'URL d'un fichier +webdisplays.server.help.upload=Ouvre l'assitant de mise en ligne +webdisplays.server.help.rm=Supprime un fichier +webdisplays.server.help.reconnect=Se reco. à Miniserv [DEBUG]