From 4a24fca8c3f41b4528fbd167e5228d018e1dba55 Mon Sep 17 00:00:00 2001 From: Bartek Bok Date: Mon, 14 Mar 2016 20:01:33 +0100 Subject: [PATCH 01/54] Implement #758 --- OpenModsLib | 2 +- .../java/openblocks/common/block/BlockVacuumHopper.java | 6 +----- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/OpenModsLib b/OpenModsLib index 30ecdbe7..72358d4d 160000 --- a/OpenModsLib +++ b/OpenModsLib @@ -1 +1 @@ -Subproject commit 30ecdbe78e0cf342a4fd59c1ec9f228aa0b6965f +Subproject commit 72358d4dba88b9c1f8ef42cd142fcd294c186369 diff --git a/src/main/java/openblocks/common/block/BlockVacuumHopper.java b/src/main/java/openblocks/common/block/BlockVacuumHopper.java index 1a9389b4..3c9ed6be 100644 --- a/src/main/java/openblocks/common/block/BlockVacuumHopper.java +++ b/src/main/java/openblocks/common/block/BlockVacuumHopper.java @@ -14,6 +14,7 @@ public class BlockVacuumHopper extends OpenBlock { public BlockVacuumHopper() { super(Material.rock); setRenderMode(RenderMode.TESR_ONLY); + setBlockBounds(0.25f, 0.25f, 0.25f, 0.75f, 0.75f, 0.75f); } @Override @@ -39,9 +40,4 @@ public class BlockVacuumHopper extends OpenBlock { return false; } - @Override - public AxisAlignedBB getSelectedBoundingBoxFromPool(World par1World, int x, int y, int z) { - return AxisAlignedBB.getBoundingBox(x + 0.3, y + 0.3, z + 0.3, x + 0.7, y + 0.7, z + 0.7); - } - } From 301f1246850c98439a45ecfb1c24f8c3061e0be1 Mon Sep 17 00:00:00 2001 From: Bartek Bok Date: Mon, 14 Mar 2016 20:08:11 +0100 Subject: [PATCH 02/54] Remove outdated information from README Closes #756. --- README.md | 25 ++++--------------------- 1 file changed, 4 insertions(+), 21 deletions(-) diff --git a/README.md b/README.md index c6f85b06..b1e8ea38 100644 --- a/README.md +++ b/README.md @@ -1,31 +1,14 @@ OpenBlocks ========= -An open source random collection of blocks and miscellaneous cool stuff +An open source random collection of blocks and miscellaneous cool stuff. -Current Version -- -**1.4.0 for Minecraft 1.7.10** -You'll also need OpenModsLib 0.6. +For stable release downloads, click [here](https://www.openmods.info). -For stable release downloads, click [here](http://www.openmods.info/). -For snapshot versions, check the [Jenkins](http://www.openmods.info:8080/). +For snapshot versions, check the [Jenkins](https://builds.openmods.info). -FREQUENTLY ASKED QUESTIONS: ------------ -* "I dropped OpenBlocks into the mod folder and I **can't get it to work**!" - * OpenModsLib is required for versions past v.1.2.2. -* "I want to **disable** feature X!" - * Setting any block or item's ID to 0 will disable it. -* "How come my **elevators don't always work?**" - * Recently, we made a change to the way elevators work-- they now require XP. You can disable this change in the config. -* "Automatic enchantment tables won't enchant past a certain level!" - * They require bookshelves, just like their mundane counterparts. -* "Things like Thermal Expansion Fluiducts won't work with the automatic enchanter/anvil!" - * You need to select the relevant side on the GUI to allow input. The tab you're looking for is on the right. -* "How can I **contact** the OpenMods team?" - * We're often on EsperNet IRC at #OpenMods, but you can also open up a new issue on our GitHub or send a message to us on reddit. +**[FAQ](https://openmods.info/faq.html)** What does it contain? From 0e549d1b9e4bfe08b9568b61e6b998b50a666c17 Mon Sep 17 00:00:00 2001 From: Bartek Bok Date: Mon, 14 Mar 2016 20:11:53 +0100 Subject: [PATCH 03/54] Closes #426 --- src/main/java/openblocks/common/item/MetaPointer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/openblocks/common/item/MetaPointer.java b/src/main/java/openblocks/common/item/MetaPointer.java index 406988f5..6b8e49ba 100644 --- a/src/main/java/openblocks/common/item/MetaPointer.java +++ b/src/main/java/openblocks/common/item/MetaPointer.java @@ -34,7 +34,7 @@ public class MetaPointer extends MetaGeneric { @Override public ItemStack onItemRightClick(ItemStack itemStack, EntityPlayer player, World world) { - if (!world.isRemote) { + if (!world.isRemote && player.isSneaking()) { Vec3 posVec = Vec3.createVectorHelper(player.posX, player.posY + 1.62F, player.posZ); Vec3 lookVec = player.getLook(1.0f); Vec3 targetVec = posVec.addVector(lookVec.xCoord * 10f, lookVec.yCoord * 10f, lookVec.zCoord * 10f); From 8a6b9d6927e428d8f12bdb32de9bf4ef63a596c4 Mon Sep 17 00:00:00 2001 From: Bartek Bok Date: Mon, 14 Mar 2016 20:30:29 +0100 Subject: [PATCH 04/54] Trying to fix #760 --- src/main/java/openblocks/Config.java | 5 +++-- .../openblocks/common/item/ItemCursor.java | 18 +++++++++++------- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/src/main/java/openblocks/Config.java b/src/main/java/openblocks/Config.java index 013e6841..3a5ffb32 100644 --- a/src/main/java/openblocks/Config.java +++ b/src/main/java/openblocks/Config.java @@ -218,8 +218,9 @@ public class Config { @ConfigProperty(category = "features", name = "explosiveEnchantGrief", comment = "Explosive enchant can break blocks at level 3") public static boolean explosiveEnchantGrief = true; - @ConfigProperty(category = "cursor", name = "cursorMaxDamage", comment = "Amount of damage a cursor can take") - public static int cursorMaxDamage = 128; + // 64 blocks, since containers usually have 64 blocks usability range (IInventory.isUseableByPlayer) + @ConfigProperty(category = "cursor", name = "cursorMaxDistance", comment = "Maximum distance cursor can reach (warning: increasing may cause crashes)") + public static int cursorDistanceLimit = 64; @OnLineModifiable @ConfigProperty(category = "additional", name = "disableMobNames", comment = "List any mob names you want disabled on the server") diff --git a/src/main/java/openblocks/common/item/ItemCursor.java b/src/main/java/openblocks/common/item/ItemCursor.java index 82099190..17807da9 100644 --- a/src/main/java/openblocks/common/item/ItemCursor.java +++ b/src/main/java/openblocks/common/item/ItemCursor.java @@ -7,6 +7,7 @@ import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; +import openblocks.Config; import openblocks.OpenBlocks; import openmods.infobook.BookDocumentation; import openmods.utils.EnchantmentUtils; @@ -55,13 +56,16 @@ public class ItemCursor extends Item { private static void clickBlock(World world, EntityPlayer player, final int x, final int y, final int z, int side) { Block block = world.getBlock(x, y, z); if (block != Blocks.air) { - if (player.capabilities.isCreativeMode) block.onBlockActivated(world, x, y, z, player, side, 0, 0, 0); - else { - final int cost = (int)Math.max(0, getDistanceToLinkedBlock(player, x, y, z) - 10); - final int playerExperience = EnchantmentUtils.getPlayerXP(player); - if (cost <= playerExperience) { - block.onBlockActivated(world, x, y, z, player, side, 0, 0, 0); - EnchantmentUtils.addPlayerXP(player, -cost); + final double distanceToLinkedBlock = getDistanceToLinkedBlock(player, x, y, z); + if (distanceToLinkedBlock < Config.cursorDistanceLimit) { + if (player.capabilities.isCreativeMode) block.onBlockActivated(world, x, y, z, player, side, 0, 0, 0); + else { + final int cost = (int)Math.max(0, distanceToLinkedBlock - 10); + final int playerExperience = EnchantmentUtils.getPlayerXP(player); + if (cost <= playerExperience) { + block.onBlockActivated(world, x, y, z, player, side, 0, 0, 0); + EnchantmentUtils.addPlayerXP(player, -cost); + } } } } From 93dfc9a3122722aa4ec32ff39fa78f7a4f9e49ff Mon Sep 17 00:00:00 2001 From: Bartek Bok Date: Sat, 26 Mar 2016 12:59:20 +0100 Subject: [PATCH 05/54] Bump Forge and Gradle --- OpenModsLib | 2 +- build.gradle | 15 --------------- gradle.properties | 2 +- gradle/wrapper/gradle-wrapper.jar | Bin 50514 -> 50508 bytes gradle/wrapper/gradle-wrapper.properties | 4 ++-- 5 files changed, 4 insertions(+), 19 deletions(-) diff --git a/OpenModsLib b/OpenModsLib index 72358d4d..e9d0a93c 160000 --- a/OpenModsLib +++ b/OpenModsLib @@ -1 +1 @@ -Subproject commit 72358d4dba88b9c1f8ef42cd142fcd294c186369 +Subproject commit e9d0a93c34bba4dcf8ba9c07f87f2cbe90c860e4 diff --git a/build.gradle b/build.gradle index 9a474d92..d40e7310 100644 --- a/build.gradle +++ b/build.gradle @@ -27,21 +27,6 @@ buildscript { } } -repositories { - maven { - name 'Forge' - url 'http://files.minecraftforge.net/maven' - } - maven { - name 'MinecraftS3' - url 'http://s3.amazonaws.com/Minecraft.Download/libraries' - } - maven { - name "OpenMods" - url "http://repo.openmods.info/artifactory/openmods" - } -} - apply plugin: 'forge' //================================================ diff --git a/gradle.properties b/gradle.properties index 1ebd55d3..23721f45 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,4 +2,4 @@ mod_version=1.5.1 api_version=1.1 opc_api_version=3.3.2 mc_ver=1.7.10 -forge_ver=10.13.4.1492-1.7.10 \ No newline at end of file +forge_ver=10.13.4.1558-1.7.10 \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 667288ad6c2b3b87c990ece1267e56f0bcbf3622..d5c591c9c532da774b062aa6d7ab16405ff8700a 100644 GIT binary patch delta 1769 zcmZ8g4N#MH7=QN;7$2KLoFonfgoMguO(^9btoU=4_&A<~DK8jyM*cScy$NtXTJ=P&cdd-vY&d7qEp^ZAaJu`iXe zc}XI+jUz?b+f&!#3Y5Hc_81~|&$s$3L!_>^@BDg)rk=QrVV6d4HUnmVfIkHcAV1b5 zgK8)GAPtIRHdCOG*(Te8U~)PO7Ip42fh}n2UDG)rJX-bqau8m4j!R6T0mmId)4y5h z1j0h3l<d z0X#kS{8=7-Y7l!mqx=-_;;vki!1?;Dv~1;jo2tUzG)w9RN59zbZJvr$JmVgGZF))? z>zaFeb?k_2PwjAe;jZ{02jk86+nkln6)i61qTvUFcE*~bY~Dmcd42aQQI)6aKZ#zK zvDH&Mdg4Yw+rYbdVV)n&YODPHI`%c2qXH`nk8b!uSBkF?O{1cj5bi8#abZm7tM3!Ve9Z(A z#!ho=U9cqreQH=?pef4BmZH|9{30JTlgCwi)(;TB>4rHX+-N#N$TQD|+d#U8uSSSQ z-kL;w%fc6&>0aGs=0K9l10g$iT4R}bm3-GEg9Wbb42jB-CBBJjgcA-8QzE9{= z04MZ>N6?uK-_@P*OYV5KGt!fpmgQbq6txmJxcI0Psc2`HA2SzpsEf~%qMEKX@TKqK z)5j&~q0t@nN>(8U1J{co5@x<$*@UB~@$0|Hf>EU~q#}jMrz(wuG7Vgy$TjfkvuTVL zwHo{&yh5@uT#2`K3~w#WD*Q|aICdMk=u^E@gjqFR;t@;(%^a9j}{D$K*UtYKM}$J)lC)q{%diljUNb ztyT#S$iP`GTVvrE#~fehK^^$|EOmT;)t7q)7v03Bs7+QJV!0*ZXL1({Pi+sM-cf|+ z>eiyMo~K}V_pqv`7)=z1GP8#z#<%pk$Kuj#@bH)`U3^pugz|e+Ak5s$r?-{hiu}oCukG~apO{mysKJ@@nt zonS{!ur8{2)?oocj*jS)gb$4_D;x=Y^l0LH52GS^;hpKb(+uKEF8H#Xaxf6!X($Ic zK=2EP7ANKq14NO-Js@(0TSXA`In~07CC@cf2u#hw9byRnUAoc@f>puJbSX+!vH+NY zHF75iUTjFFKHK6&)Muyikl2MQ_TZY}=q(7L&3I~C>>|fat5l)#Eul?TdE{leT$Nwo z;))}ZWG>-EnsWH5e27S;I6ui(KbY6&Bk6jwGD%X({$+^YS6-)G`b;BOrr00~5$*VU z?o4jpAK!ImPAsl?Y>g8Sm@5lyiv6zcO}A}J?KWM}eN#p3w{EveX1y|Mcb&gc^y!^x z(n7EK?_!gvs{1&Qyu`(teIn6xkj8+hsPKh zgo=bXCOrV#?9O;um&C%Po?}2*orVPvM5cQ=LXed04_=m|xe6Mz=bMGFw7cL16{jBF zD+Xpre}gjBhB|7fEWYFpOE1f3DD$W34z1-?Tb$oz2ZVf`@ow4a_w8&fNv{l$4nUc03t*8gp7J)j9@4fI-jB5<0p4z-KEdr7@P4{I;jO8E(7wT& zyVLpM79g~Qobdn0Y|!9@jsPvE;W*Moc-&qiLK5^aMyp0>-+?Sy)`8u+oJ?6p&K{X6 zUcfA3>BoUfKK^JX?HEv^p})?Do!;qQ0=um0mNF>?gj&m~;7st5T{a0qD|ox8@mJlep_0;=)j3DW zojI`xt>tO@^>|z#g`<1umYaLX;S5koSx*@FYf9?X+3pApkzVuti23U* kBUEP-*bVoufKuka6vWD#XQ#5_EUPb$9FT~9v~nx|0h*^-6#xJL diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 9252dd92..f5ba3fdf 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Mon Mar 24 08:34:10 CDT 2014 +#Fri Mar 07 00:48:03 EST 2014 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=http\://services.gradle.org/distributions/gradle-1.11-bin.zip \ No newline at end of file +distributionUrl=http\://services.gradle.org/distributions/gradle-2.3-bin.zip From d2573b567f4ee7cdd1a676c803a6833ad1c3df73 Mon Sep 17 00:00:00 2001 From: RobinDeWalvis Date: Fri, 1 Apr 2016 16:07:10 +0200 Subject: [PATCH 06/54] add some directories and extensions to gitignore --- .gitignore | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 5dd2cf95..9da5ec1e 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,7 @@ *.class *.log *.pid +*.log.gz # Package Files *.jar @@ -34,4 +35,8 @@ Thumbs.db desktop.ini # Misc -download/ \ No newline at end of file +download/ +config/ +saves/ +usernamecache.json +options.txt \ No newline at end of file From 36f09da44719f802add2a7d2334f1809bc37814c Mon Sep 17 00:00:00 2001 From: RobinDeWalvis Date: Tue, 5 Apr 2016 17:09:17 +0200 Subject: [PATCH 07/54] Add instanced guide rendering --- .gitignore | 2 + .../java/openblocks/client/ClientProxy.java | 2 + .../tileentity/guide/ArraysHelper.java | 46 +++ .../renderer/tileentity/guide/CoordShape.java | 52 +++ .../tileentity/guide/FutureTesselator.java | 6 + .../guide/GuideAdvancedRenderer.java | 54 +++ .../tileentity/guide/GuideLegacyRenderer.java | 66 ++++ .../tileentity/guide/IGuideRenderer.java | 9 + .../tileentity/guide/MarkerRenderer.java | 128 +++++++ .../tileentity/guide/ShaderHelper.java | 321 ++++++++++++++++++ .../tileentity/guide/ShaderProgram.java | 165 +++++++++ .../TileEntityBuilderGuideRenderer.java | 2 +- .../{ => guide}/TileEntityGuideRenderer.java | 58 +--- .../tileentity/TileEntityBuilderGuide.java | 4 +- .../common/tileentity/TileEntityGuide.java | 24 +- .../assets/openblocks/shaders/shader.frag | 26 ++ .../assets/openblocks/shaders/shader.vert | 23 ++ .../openblocks/textures/blocks/guide.png | Bin 166 -> 166 bytes 18 files changed, 932 insertions(+), 56 deletions(-) create mode 100644 src/main/java/openblocks/client/renderer/tileentity/guide/ArraysHelper.java create mode 100644 src/main/java/openblocks/client/renderer/tileentity/guide/CoordShape.java create mode 100644 src/main/java/openblocks/client/renderer/tileentity/guide/FutureTesselator.java create mode 100644 src/main/java/openblocks/client/renderer/tileentity/guide/GuideAdvancedRenderer.java create mode 100644 src/main/java/openblocks/client/renderer/tileentity/guide/GuideLegacyRenderer.java create mode 100644 src/main/java/openblocks/client/renderer/tileentity/guide/IGuideRenderer.java create mode 100644 src/main/java/openblocks/client/renderer/tileentity/guide/MarkerRenderer.java create mode 100644 src/main/java/openblocks/client/renderer/tileentity/guide/ShaderHelper.java create mode 100644 src/main/java/openblocks/client/renderer/tileentity/guide/ShaderProgram.java rename src/main/java/openblocks/client/renderer/tileentity/{ => guide}/TileEntityBuilderGuideRenderer.java (98%) rename src/main/java/openblocks/client/renderer/tileentity/{ => guide}/TileEntityGuideRenderer.java (58%) create mode 100644 src/main/resources/assets/openblocks/shaders/shader.frag create mode 100644 src/main/resources/assets/openblocks/shaders/shader.vert diff --git a/.gitignore b/.gitignore index 9da5ec1e..c6babd23 100644 --- a/.gitignore +++ b/.gitignore @@ -38,5 +38,7 @@ desktop.ini download/ config/ saves/ +crash-reports/ +screenshots/ usernamecache.json options.txt \ No newline at end of file diff --git a/src/main/java/openblocks/client/ClientProxy.java b/src/main/java/openblocks/client/ClientProxy.java index b5223f93..348309a3 100644 --- a/src/main/java/openblocks/client/ClientProxy.java +++ b/src/main/java/openblocks/client/ClientProxy.java @@ -21,6 +21,8 @@ import openblocks.client.renderer.block.*; import openblocks.client.renderer.entity.*; import openblocks.client.renderer.item.*; import openblocks.client.renderer.tileentity.*; +import openblocks.client.renderer.tileentity.guide.TileEntityBuilderGuideRenderer; +import openblocks.client.renderer.tileentity.guide.TileEntityGuideRenderer; import openblocks.common.block.BlockGuide; import openblocks.common.entity.*; import openblocks.common.tileentity.*; diff --git a/src/main/java/openblocks/client/renderer/tileentity/guide/ArraysHelper.java b/src/main/java/openblocks/client/renderer/tileentity/guide/ArraysHelper.java new file mode 100644 index 00000000..0d3162e7 --- /dev/null +++ b/src/main/java/openblocks/client/renderer/tileentity/guide/ArraysHelper.java @@ -0,0 +1,46 @@ +package openblocks.client.renderer.tileentity.guide; + +import org.lwjgl.opengl.ARBDrawInstanced; +import org.lwjgl.opengl.ARBInstancedArrays; +import org.lwjgl.opengl.ContextCapabilities; +import org.lwjgl.opengl.GL31; +import org.lwjgl.opengl.GL33; +import org.lwjgl.opengl.GLContext; + +public class ArraysHelper { + + static { + initialize(); + } + + private static boolean GL33Supported; + private static boolean GL31Supported; + private static boolean ARBInstancedArraysSupported; + + static void initialize() { + ContextCapabilities caps = GLContext.getCapabilities(); + GL33Supported = caps.OpenGL33; + GL31Supported = caps.OpenGL31; + ARBInstancedArraysSupported = caps.GL_ARB_instanced_arrays; + } + + public static boolean supported() + { + return (GL33Supported || ARBInstancedArraysSupported) && GL31Supported; + } + + public static void glDrawArraysInstanced(int mode, int first, int count, int primcount) + { + if (GL31Supported) + GL31.glDrawArraysInstanced(mode, first, count, primcount); + else + ARBDrawInstanced.glDrawArraysInstancedARB(mode, first, count, primcount); + } + + public static void glVertexDivisor(int index, int divisor) { + if (GL33Supported) + GL33.glVertexAttribDivisor(index, divisor); + else if(ARBInstancedArraysSupported) + ARBInstancedArrays.glVertexAttribDivisorARB(index, divisor); + } +} diff --git a/src/main/java/openblocks/client/renderer/tileentity/guide/CoordShape.java b/src/main/java/openblocks/client/renderer/tileentity/guide/CoordShape.java new file mode 100644 index 00000000..b8cc2b5e --- /dev/null +++ b/src/main/java/openblocks/client/renderer/tileentity/guide/CoordShape.java @@ -0,0 +1,52 @@ +package openblocks.client.renderer.tileentity.guide; + +import java.nio.IntBuffer; +import java.util.List; + +import org.lwjgl.BufferUtils; +import org.lwjgl.opengl.GL15; + +import openmods.utils.Coord; + +public class CoordShape { + + int vbo; + List coords; + + public CoordShape(List coords) { + this.coords = coords; + vbo = 0; + } + + public int bindVBO() + { + if (vbo == 0) + { + IntBuffer ib = BufferUtils.createIntBuffer(coords.size() * 3); + for (Coord c : coords) + ib.put(c.x).put(c.y).put(c.z); + ib.flip(); + + vbo = GL15.glGenBuffers(); + GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo); + GL15.glBufferData(GL15.GL_ARRAY_BUFFER, ib, GL15.GL_STATIC_DRAW); + }else + GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo); + + return vbo; + } + + public List getCoords() { + return coords; + } + + public int size() { + return coords.size(); + } + + public void destroy() { + if (vbo != 0) + GL15.glDeleteBuffers(vbo); + vbo = 0; + } +} diff --git a/src/main/java/openblocks/client/renderer/tileentity/guide/FutureTesselator.java b/src/main/java/openblocks/client/renderer/tileentity/guide/FutureTesselator.java new file mode 100644 index 00000000..f15cf0b0 --- /dev/null +++ b/src/main/java/openblocks/client/renderer/tileentity/guide/FutureTesselator.java @@ -0,0 +1,6 @@ +package openblocks.client.renderer.tileentity.guide; + +public abstract class FutureTesselator +{ + public abstract void render(); +} diff --git a/src/main/java/openblocks/client/renderer/tileentity/guide/GuideAdvancedRenderer.java b/src/main/java/openblocks/client/renderer/tileentity/guide/GuideAdvancedRenderer.java new file mode 100644 index 00000000..2bbb08a1 --- /dev/null +++ b/src/main/java/openblocks/client/renderer/tileentity/guide/GuideAdvancedRenderer.java @@ -0,0 +1,54 @@ +package openblocks.client.renderer.tileentity.guide; + +import org.lwjgl.opengl.GL11; + +import openblocks.common.tileentity.TileEntityGuide; +import openmods.utils.TextureUtils; + +public class GuideAdvancedRenderer implements IGuideRenderer { + + static MarkerRenderer mr; + + public GuideAdvancedRenderer(FutureTesselator marker) + { + try { + if (mr == null) + mr = new MarkerRenderer(marker); + } catch (Exception e) { + e.printStackTrace(); + } + } + + @Override + public void renderShape(TileEntityGuide guide) { + + float scaleDelta = guide.getTimeSinceChange(); + renderShape(guide.getShape(), guide.getColor(), scaleDelta); + if (scaleDelta < 1.0) { + renderShape(guide.getPreviousShape(), guide.getColor(), 1.0f - scaleDelta); + } + CoordShape toDelete = guide.getAndDeleteShape(); + if (toDelete != null && mr != null) + mr.deleteShape(toDelete); + } + + private void renderShape(CoordShape shape, int color, float scale) { + if (shape == null) return; + + TextureUtils.bindDefaultTerrainTexture(); + + GL11.glEnable(GL11.GL_BLEND); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE); + GL11.glDisable(GL11.GL_LIGHTING); + + if (mr != null) + mr.drawInstanced(shape, color, scale); + + GL11.glEnable(GL11.GL_LIGHTING); + GL11.glDisable(GL11.GL_BLEND); + } + + @Override + public void onTextureChange() { + } +} diff --git a/src/main/java/openblocks/client/renderer/tileentity/guide/GuideLegacyRenderer.java b/src/main/java/openblocks/client/renderer/tileentity/guide/GuideLegacyRenderer.java new file mode 100644 index 00000000..9b33739e --- /dev/null +++ b/src/main/java/openblocks/client/renderer/tileentity/guide/GuideLegacyRenderer.java @@ -0,0 +1,66 @@ +package openblocks.client.renderer.tileentity.guide; + +import java.util.Collection; + +import org.lwjgl.opengl.GL11; + +import net.minecraft.client.renderer.Tessellator; +import openblocks.common.tileentity.TileEntityGuide; +import openmods.renderer.DisplayListWrapper; +import openmods.utils.Coord; +import openmods.utils.TextureUtils; + +public class GuideLegacyRenderer implements IGuideRenderer { + + private DisplayListWrapper wrapper; + + public GuideLegacyRenderer(final FutureTesselator marker) + { + wrapper = new DisplayListWrapper() { + @Override + public void compile() { + marker.render(); + Tessellator.instance.draw(); + } + }; + } + + @Override + public void onTextureChange() { + wrapper.reset(); + } + + @Override + public void renderShape(TileEntityGuide guide) { + float scaleDelta = guide.getTimeSinceChange(); + renderShape(guide.getShape().getCoords(), guide.getColor(), scaleDelta); + if (scaleDelta < 1.0) { + renderShape(guide.getPreviousShape().getCoords(), guide.getColor(), 1.0f - scaleDelta); + } + } + + private void renderShape(Collection shape, int color, float scale) { + if (shape == null) return; + + TextureUtils.bindDefaultTerrainTexture(); + + GL11.glColor3ub((byte)(color >> 16), (byte)(color >> 8), (byte)(color >> 0)); + GL11.glEnable(GL11.GL_BLEND); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE); + GL11.glDisable(GL11.GL_LIGHTING); + + for (Coord coord : shape) + renderMarkerAt(coord.x, coord.y, coord.z, scale); + + GL11.glEnable(GL11.GL_LIGHTING); + GL11.glDisable(GL11.GL_BLEND); + } + + private void renderMarkerAt(double x, double y, double z, float scale) { + GL11.glPushMatrix(); + GL11.glTranslated(x + 0.5F, y, z + 0.5F); + GL11.glScalef(scale, scale, scale); + wrapper.render(); + GL11.glPopMatrix(); + } +} diff --git a/src/main/java/openblocks/client/renderer/tileentity/guide/IGuideRenderer.java b/src/main/java/openblocks/client/renderer/tileentity/guide/IGuideRenderer.java new file mode 100644 index 00000000..dbc78a9d --- /dev/null +++ b/src/main/java/openblocks/client/renderer/tileentity/guide/IGuideRenderer.java @@ -0,0 +1,9 @@ +package openblocks.client.renderer.tileentity.guide; + +import openblocks.common.tileentity.TileEntityGuide; + +public interface IGuideRenderer { + void renderShape(TileEntityGuide guide); + + void onTextureChange(); +} diff --git a/src/main/java/openblocks/client/renderer/tileentity/guide/MarkerRenderer.java b/src/main/java/openblocks/client/renderer/tileentity/guide/MarkerRenderer.java new file mode 100644 index 00000000..d4ad5601 --- /dev/null +++ b/src/main/java/openblocks/client/renderer/tileentity/guide/MarkerRenderer.java @@ -0,0 +1,128 @@ +package openblocks.client.renderer.tileentity.guide; + +import java.nio.ByteBuffer; +import java.nio.IntBuffer; + +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL13; +import org.lwjgl.opengl.GL15; +import org.lwjgl.opengl.GL30; +import org.lwjgl.opengl.GL31; + +import net.minecraft.client.renderer.GLAllocation; +import net.minecraft.client.renderer.OpenGlHelper; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.shader.TesselatorVertexState; +import net.minecraft.util.ResourceLocation; + +public class MarkerRenderer { + + private static final ResourceLocation vertexSource = new ResourceLocation("openblocks:shaders/shader.vert"); + private static final ResourceLocation fragmentSource = new ResourceLocation("openblocks:shaders/shader.frag"); + private ShaderProgram shader; + + private static int nativeBufferSize = 0x200000; + private static ByteBuffer byteBuffer = GLAllocation.createDirectByteBuffer(nativeBufferSize * 4); + private static IntBuffer intBuffer = byteBuffer.asIntBuffer(); + + FutureTesselator model; + + private boolean initialized = false; + private int vertexCount, vao; + + public MarkerRenderer(FutureTesselator model) throws Exception { + shader = new ShaderProgram(); + shader.addShader(vertexSource, ShaderHelper.GL_VERTEX_SHADER); + shader.addShader(fragmentSource, ShaderHelper.GL_FRAGMENT_SHADER); + shader.compile(); + + this.model = model; + } + + public void createVAO() + { + model.render(); + TesselatorVertexState state = Tessellator.instance.getVertexState(0,0,0); + Tessellator.instance.draw(); // just discard the state this way. + + if (state.getRawBuffer().length > nativeBufferSize) + throw new UnsupportedOperationException("Big buffers not supported!"); + + vertexCount = state.getVertexCount(); + + { + intBuffer.clear(); + intBuffer.put(state.getRawBuffer(), 0, vertexCount * 8); + byteBuffer.position(0); + byteBuffer.limit(vertexCount * 32); + } + + vao = GL30.glGenVertexArrays(); + GL30.glBindVertexArray(vao); + + byteBuffer.position(0); + + int vbo = GL15.glGenBuffers(); + GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo); + GL15.glBufferData(GL15.GL_ARRAY_BUFFER, byteBuffer, GL15.GL_STATIC_DRAW); + + { + shader.attributePointer("aVertex", 3, GL11.GL_FLOAT, false, 32, 0); + shader.attributePointer("aTexCoord", 2, GL11.GL_FLOAT, false, 32, 12); + shader.attributePointer("aColor", 4, GL11.GL_UNSIGNED_BYTE, false, 32, 20); + shader.attributePointer("aBrightnessCoord", 2, GL11.GL_SHORT, false, 32, 28); + } + + GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); + + shader.uniform1f("uHasTexture", state.getHasTexture() ? 1f : 0f); // no conversions on the GPU this way. + shader.uniform1f("uHasColor", state.getHasColor() ? 1f : 0f); + shader.uniform1f("uHasBrightness", state.getHasBrightness() ? 1f : 0f); + shader.uniform1i("uDefaultTexture", OpenGlHelper.defaultTexUnit - GL13.GL_TEXTURE0); // should be 0 + shader.uniform1i("uLightmapTexture", OpenGlHelper.lightmapTexUnit - GL13.GL_TEXTURE0); // should be 1 + + byteBuffer.position(0); + GL30.glBindVertexArray(0); + + initialized = true; + } + + public void draw() { + shader.bind(); + if (!initialized) + createVAO(); + GL30.glBindVertexArray(vao); + GL11.glDrawArrays(GL11.GL_QUADS, 0, vertexCount); + GL30.glBindVertexArray(0); + shader.release(); + } + + public void drawInstanced(CoordShape shape, int color, float scale) { + shader.bind(); + if (!initialized) + createVAO(); + GL30.glBindVertexArray(vao); + + shape.bindVBO(); + shader.instanceAttributePointer("aPosition", 3, GL11.GL_INT, false, 0, 0); + GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); + + shader.uniform3f("uColor", ((color >> 16) & 0xFF) / 255f, ((color >> 8) & 0xFF) / 255f, (color & 0xFF) / 255f); + shader.uniform1f("uScale", scale); + + GL31.glDrawArraysInstanced(GL11.GL_QUADS, 0, vertexCount, shape.size()); + + GL30.glBindVertexArray(0); + shader.release(); + } + + public void deleteShape(CoordShape shape) + { + if (initialized) + { + GL30.glBindVertexArray(vao); + shape.destroy(); + GL30.glBindVertexArray(0); + } + } +} diff --git a/src/main/java/openblocks/client/renderer/tileentity/guide/ShaderHelper.java b/src/main/java/openblocks/client/renderer/tileentity/guide/ShaderHelper.java new file mode 100644 index 00000000..927f2bbe --- /dev/null +++ b/src/main/java/openblocks/client/renderer/tileentity/guide/ShaderHelper.java @@ -0,0 +1,321 @@ +package openblocks.client.renderer.tileentity.guide; + +import org.lwjgl.opengl.ARBShaderObjects; +import org.lwjgl.opengl.ARBVertexShader; +import org.lwjgl.opengl.ContextCapabilities; +import org.lwjgl.opengl.GL20; +import org.lwjgl.opengl.GLContext; + +public class ShaderHelper { + /** + * Class for shader functions, calling ARB methods if GL20 is not supported + * A lot of this is already implemented in OpenGlHelper, but it misses some + * methods and is confusing in general. + */ + + static { + initialize(); + } + + public static IShaderMethods methods; + + // these are the same constants for ARB and GL20 anyway... + public static final int GL_LINK_STATUS = GL20.GL_LINK_STATUS; + public static final int GL_VALIDATE_STATUS = GL20.GL_VALIDATE_STATUS; + public static final int GL_COMPILE_STATUS = GL20.GL_COMPILE_STATUS; + public static final int GL_INFO_LOG_LENGTH = GL20.GL_INFO_LOG_LENGTH; + public static final int GL_VERTEX_SHADER = GL20.GL_VERTEX_SHADER; + public static final int GL_FRAGMENT_SHADER = GL20.GL_FRAGMENT_SHADER; + + static void initialize() { + ContextCapabilities caps = GLContext.getCapabilities(); + + if (GL20ShaderMethods.isSupported(caps)) + methods = new GL20ShaderMethods(); + else if (ARBShaderMethods.isSupported(caps)) + methods = new ARBShaderMethods(); + } + + public static boolean isSupported() + { + return methods != null; + } + + public static IShaderMethods methods() + { + return methods; + } + + public static interface IShaderMethods + { + public int glCreateProgram(); + public int glCreateShader(int type); + public void glAttachShader(int program, int shader); + public void glDetachShader(int program, int shader); + public void glLinkProgram(int program); + public void glValidateProgram(int program); + public void glDeleteProgram(int program); + public void glDeleteShader(int shader); + public int glGetProgrami(int shader, int parameter); + public int glGetShaderi(int program, int parameter); + public String getProgramLogInfo(int program); + public String getShaderLogInfo(int shader); + public void glUseProgram(int program); + public void glShaderSource(int shader, String shaderSource); + public void glCompileShader(int shader); + public int glGetUniformLocation(int program, String uniform); + public void glUniform1i(int loc, int val); + public void glUniform1f(int loc, float val); + public void glUniform3f(int loc, float x, float y, float z); + public int glGetAttribLocation(int program, String attrib); + public void glEnableVertexAttribArray(int index); + public void glDisableVertexAttribArray(int index); + public void glVertexAttribPointer(int index, int size, int type, boolean normalized, int stride, long offset); + } + + private static class GL20ShaderMethods implements IShaderMethods + { + public static boolean isSupported(ContextCapabilities caps) + { + return caps.OpenGL20; + } + + @Override + public int glCreateProgram() { + return GL20.glCreateProgram(); + } + + @Override + public int glCreateShader(int type) { + return GL20.glCreateShader(type); + } + + @Override + public void glAttachShader(int program, int shader) { + GL20.glAttachShader(program, shader); + } + + @Override + public void glDetachShader(int program, int shader) { + GL20.glDetachShader(program, shader); + } + + @Override + public void glLinkProgram(int program) { + GL20.glLinkProgram(program); + } + + @Override + public void glValidateProgram(int program) { + GL20.glValidateProgram(program); + } + + @Override + public void glDeleteProgram(int program) { + GL20.glDeleteProgram(program); + } + + @Override + public void glDeleteShader(int shader) { + GL20.glDeleteShader(shader); + } + + @Override + public int glGetProgrami(int program, int parameter) { + return GL20.glGetProgrami(program, parameter); + } + + @Override + public int glGetShaderi(int shader, int parameter) { + return GL20.glGetShaderi(shader, parameter); + } + + @Override + public String getProgramLogInfo(int program) { + return GL20.glGetProgramInfoLog(program, glGetProgrami(program, GL_INFO_LOG_LENGTH)); + } + + @Override + public String getShaderLogInfo(int shader) { + return GL20.glGetShaderInfoLog(shader, glGetShaderi(shader, GL_INFO_LOG_LENGTH)); + } + + @Override + public void glUseProgram(int program) { + GL20.glUseProgram(program); + } + + @Override + public void glShaderSource(int shader, String shaderSource) { + GL20.glShaderSource(shader, shaderSource); + } + + @Override + public void glCompileShader(int shader) { + GL20.glCompileShader(shader); + } + + @Override + public int glGetUniformLocation(int program, String uniform) { + return GL20.glGetUniformLocation(program, uniform); + } + + @Override + public void glUniform1i(int loc, int val) { + GL20.glUniform1i(loc, val); + } + + @Override + public void glUniform1f(int loc, float val) { + GL20.glUniform1f(loc, val); + } + + @Override + public void glUniform3f(int loc, float x, float y, float z) { + GL20.glUniform3f(loc, x, y, z); + } + + @Override + public int glGetAttribLocation(int program, String attrib) { + return GL20.glGetAttribLocation(program, attrib); + } + + @Override + public void glEnableVertexAttribArray(int index) { + GL20.glEnableVertexAttribArray(index); + } + + @Override + public void glDisableVertexAttribArray(int index) { + GL20.glDisableVertexAttribArray(index); + } + + @Override + public void glVertexAttribPointer(int index, int size, int type, boolean normalized, int stride, long offset) { + GL20.glVertexAttribPointer(index, size, type, normalized, stride, offset); + } + } + + private static class ARBShaderMethods implements IShaderMethods + { + public static boolean isSupported(ContextCapabilities caps) + { + return caps.GL_ARB_shader_objects && caps.GL_ARB_vertex_shader && caps.GL_ARB_fragment_shader; + } + + @Override + public int glCreateProgram() { + return ARBShaderObjects.glCreateProgramObjectARB(); + } + + @Override + public int glCreateShader(int type) { + return ARBShaderObjects.glCreateShaderObjectARB(type); + } + + @Override + public void glAttachShader(int program, int shader) { + ARBShaderObjects.glAttachObjectARB(program, shader); + } + + @Override + public void glDetachShader(int program, int shader) { + ARBShaderObjects.glDetachObjectARB(program, shader); + } + + @Override + public void glLinkProgram(int program) { + ARBShaderObjects.glLinkProgramARB(program); + } + + @Override + public void glValidateProgram(int program) { + ARBShaderObjects.glValidateProgramARB(program); + } + + @Override + public void glDeleteProgram(int program) { + ARBShaderObjects.glDeleteObjectARB(program); + } + + @Override + public void glDeleteShader(int shader) { + ARBShaderObjects.glDeleteObjectARB(shader); + } + + @Override + public int glGetProgrami(int program, int parameter) { + return ARBShaderObjects.glGetObjectParameteriARB(program, parameter); + } + + @Override + public int glGetShaderi(int shader, int parameter) { + return ARBShaderObjects.glGetObjectParameteriARB(shader, parameter); + } + + @Override + public String getProgramLogInfo(int program) { + return ARBShaderObjects.glGetInfoLogARB(program, glGetProgrami(program, GL_INFO_LOG_LENGTH)); + } + + @Override + public String getShaderLogInfo(int shader) { + return ARBShaderObjects.glGetInfoLogARB(shader, glGetShaderi(shader, GL_INFO_LOG_LENGTH)); + } + + @Override + public void glUseProgram(int program) { + ARBShaderObjects.glUseProgramObjectARB(program); + } + + @Override + public void glShaderSource(int shader, String shaderSource) { + ARBShaderObjects.glShaderSourceARB(shader, shaderSource); + } + + @Override + public void glCompileShader(int shader) { + ARBShaderObjects.glCompileShaderARB(shader); + } + + @Override + public int glGetUniformLocation(int program, String uniform) { + return ARBShaderObjects.glGetUniformLocationARB(program, uniform); + } + + @Override + public void glUniform1i(int loc, int val) { + ARBShaderObjects.glUniform1iARB(loc, val); + } + + @Override + public void glUniform1f(int loc, float val) { + ARBShaderObjects.glUniform1fARB(loc, val); + } + + @Override + public void glUniform3f(int loc, float x, float y, float z) { + ARBShaderObjects.glUniform3fARB(loc, x, y, z); + } + + @Override + public int glGetAttribLocation(int program, String attrib) { + return ARBVertexShader.glGetAttribLocationARB(program, attrib); + } + + @Override + public void glEnableVertexAttribArray(int index) { + ARBVertexShader.glEnableVertexAttribArrayARB(index); + } + + @Override + public void glDisableVertexAttribArray(int index) { + ARBVertexShader.glDisableVertexAttribArrayARB(index); + } + + @Override + public void glVertexAttribPointer(int index, int size, int type, boolean normalized, int stride, long offset) { + ARBVertexShader.glVertexAttribPointerARB(index, size, type, normalized, stride, offset); + } + } +} diff --git a/src/main/java/openblocks/client/renderer/tileentity/guide/ShaderProgram.java b/src/main/java/openblocks/client/renderer/tileentity/guide/ShaderProgram.java new file mode 100644 index 00000000..cb989ab1 --- /dev/null +++ b/src/main/java/openblocks/client/renderer/tileentity/guide/ShaderProgram.java @@ -0,0 +1,165 @@ +package openblocks.client.renderer.tileentity.guide; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.util.ArrayList; +import java.util.HashMap; + +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.OpenGLException; + +import net.minecraft.client.Minecraft; +import net.minecraft.util.ResourceLocation; +import openmods.utils.io.FileLineReader; +import openmods.utils.io.ILineReadMethod; + +public class ShaderProgram { + protected ArrayList shaders; + protected int program; + protected boolean compiled; + + protected HashMap uniforms; + + public ShaderProgram() { + shaders = new ArrayList(); + compiled = false; + uniforms = new HashMap(); + } + + public void bind() { + if (compiled) + ShaderHelper.methods().glUseProgram(program); + } + + public void release() { + ShaderHelper.methods().glUseProgram(0); + } + + // See ShaderHelper.methods() for shader types + public void addShader(ResourceLocation source, int type) throws Exception { + if (compiled) + throw new UnsupportedOperationException("Shader already compiled"); + + int shader = createShader(source, type); + if (shader != 0) + shaders.add(shader); + } + + public void compile() { + if (compiled) + throw new UnsupportedOperationException("Shader already compiled"); + + program = ShaderHelper.methods().glCreateProgram(); + if (program == 0) + throw new OpenGLException("Error creating program object"); + + for (Integer shader : shaders) + ShaderHelper.methods().glAttachShader(program, shader); + ShaderHelper.methods().glLinkProgram(program); + if (ShaderHelper.methods().glGetProgrami(program, ShaderHelper.GL_LINK_STATUS) == GL11.GL_FALSE) + throw new OpenGLException("Shader link error: " + ShaderHelper.methods().getProgramLogInfo(program)); + + for (Integer shader : shaders) + ShaderHelper.methods().glDetachShader(program, shader); + ShaderHelper.methods().glValidateProgram(program); + if (ShaderHelper.methods().glGetProgrami(program, ShaderHelper.GL_VALIDATE_STATUS) == GL11.GL_FALSE) + throw new OpenGLException("Shader validate error: " + ShaderHelper.methods().getProgramLogInfo(program)); + + compiled = true; + } + + public void destroy() { + for (Integer shader : shaders) + ShaderHelper.methods().glDeleteShader(shader); + ShaderHelper.methods().glUseProgram(0); + ShaderHelper.methods().glDeleteProgram(program); + } + + private int createShader(ResourceLocation source, int type) throws Exception { + int shader = 0; + try { + shader = ShaderHelper.methods().glCreateShader(type); + + if (shader == 0) + throw new OpenGLException("Error creating shader object"); + + ShaderHelper.methods().glShaderSource(shader, readShaderSource(source)); + ShaderHelper.methods().glCompileShader(shader); + if (ShaderHelper.methods().glGetShaderi(shader, ShaderHelper.GL_COMPILE_STATUS) == GL11.GL_FALSE) + throw new OpenGLException("Shader compile error: " + ShaderHelper.methods().getShaderLogInfo(shader)); + + return shader; + } catch (Exception exc) { + ShaderHelper.methods().glDeleteShader(shader); + throw exc; + } + } + + private String readShaderSource(ResourceLocation source) throws IOException { + InputStream is = Minecraft.getMinecraft().getResourceManager().getResource(source).getInputStream(); + BufferedReader reader = new BufferedReader(new InputStreamReader(is)); + final StringBuilder out = new StringBuilder(); + + FileLineReader.readLineByLine(reader, new ILineReadMethod() { + @Override + public void read(String line) { + out.append(line).append('\n'); + } + }); + + return out.toString(); + } + + public int getUniformLocation(String uniform) { + Integer loc = uniforms.get(uniform); + if (loc == null) { + loc = ShaderHelper.methods().glGetUniformLocation(program, uniform); + uniforms.put(uniform, loc); + } + return loc; + } + + public void uniform1i(String name, int val) + { + ShaderHelper.methods().glUniform1i(getUniformLocation(name), val); + } + + public void uniform1f(String name, float val) + { + ShaderHelper.methods().glUniform1f(getUniformLocation(name), val); + } + + public void uniform3f(String name, float x, float y, float z) + { + ShaderHelper.methods().glUniform3f(getUniformLocation(name), x, y, z); + } + + public int getProgram() + { + return program; + } + + public void instanceAttributePointer(String attrib, int size, int type, boolean normalized, int stride, long offset) + { + instanceAttributePointer(ShaderHelper.methods().glGetAttribLocation(program, attrib), size, type, normalized, stride, offset); + } + + public void instanceAttributePointer(int index, int size, int type, boolean normalized, int stride, long offset) + { + attributePointer(index, size, type, normalized, stride, offset); + ArraysHelper.glVertexDivisor(index, 1); + } + + public void attributePointer(String attrib, int size, int type, boolean normalized, int stride, long offset) + { + attributePointer(ShaderHelper.methods().glGetAttribLocation(program, attrib), size, type, normalized, stride, offset); + } + + public void attributePointer(int index, int size, int type, boolean normalized, int stride, long offset) + { + ShaderHelper.methods().glVertexAttribPointer(index, size, type, normalized, stride, offset); + ShaderHelper.methods().glEnableVertexAttribArray(index); + } +} diff --git a/src/main/java/openblocks/client/renderer/tileentity/TileEntityBuilderGuideRenderer.java b/src/main/java/openblocks/client/renderer/tileentity/guide/TileEntityBuilderGuideRenderer.java similarity index 98% rename from src/main/java/openblocks/client/renderer/tileentity/TileEntityBuilderGuideRenderer.java rename to src/main/java/openblocks/client/renderer/tileentity/guide/TileEntityBuilderGuideRenderer.java index 7bad1362..f653428d 100644 --- a/src/main/java/openblocks/client/renderer/tileentity/TileEntityBuilderGuideRenderer.java +++ b/src/main/java/openblocks/client/renderer/tileentity/guide/TileEntityBuilderGuideRenderer.java @@ -1,4 +1,4 @@ -package openblocks.client.renderer.tileentity; +package openblocks.client.renderer.tileentity.guide; import net.minecraft.client.renderer.Tessellator; import net.minecraft.tileentity.TileEntity; diff --git a/src/main/java/openblocks/client/renderer/tileentity/TileEntityGuideRenderer.java b/src/main/java/openblocks/client/renderer/tileentity/guide/TileEntityGuideRenderer.java similarity index 58% rename from src/main/java/openblocks/client/renderer/tileentity/TileEntityGuideRenderer.java rename to src/main/java/openblocks/client/renderer/tileentity/guide/TileEntityGuideRenderer.java index a447539c..5986285b 100644 --- a/src/main/java/openblocks/client/renderer/tileentity/TileEntityGuideRenderer.java +++ b/src/main/java/openblocks/client/renderer/tileentity/guide/TileEntityGuideRenderer.java @@ -1,7 +1,8 @@ -package openblocks.client.renderer.tileentity; +package openblocks.client.renderer.tileentity.guide; -import java.util.Collection; +import org.lwjgl.opengl.GL11; +import cpw.mods.fml.common.eventhandler.SubscribeEvent; import net.minecraft.client.renderer.RenderBlocks; import net.minecraft.client.renderer.Tessellator; import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; @@ -11,19 +12,13 @@ import net.minecraftforge.common.MinecraftForge; import openblocks.OpenBlocks; import openblocks.common.block.BlockGuide.Icons; import openblocks.common.tileentity.TileEntityGuide; -import openmods.renderer.DisplayListWrapper; -import openmods.utils.Coord; import openmods.utils.TextureUtils; -import org.lwjgl.opengl.GL11; - -import cpw.mods.fml.common.eventhandler.SubscribeEvent; - public class TileEntityGuideRenderer extends TileEntitySpecialRenderer { - - private final DisplayListWrapper wrapper = new DisplayListWrapper() { + + private final FutureTesselator marker = new FutureTesselator(){ @Override - public void compile() { + public void render() { Tessellator t = Tessellator.instance; RenderBlocks renderBlocks = new RenderBlocks(); renderBlocks.setRenderBounds(0.05D, 0.05D, 0.05D, 0.95D, 0.95D, 0.95D); @@ -35,55 +30,26 @@ public class TileEntityGuideRenderer extends TileEntitySpecialRenderer { renderBlocks.renderFaceYPos(OpenBlocks.Blocks.guide, -0.5D, 0.0D, -0.5D, Icons.marker); renderBlocks.renderFaceZNeg(OpenBlocks.Blocks.guide, -0.5D, 0.0D, -0.5D, Icons.marker); renderBlocks.renderFaceZPos(OpenBlocks.Blocks.guide, -0.5D, 0.0D, -0.5D, Icons.marker); - t.draw(); + // important: don't draw! } }; - + + private final IGuideRenderer renderer = new GuideLegacyRenderer(marker); + public TileEntityGuideRenderer() { MinecraftForge.EVENT_BUS.register(this); } @SubscribeEvent public void onTextureChange(TextureStitchEvent evt) { - if (evt.map.getTextureType() == TextureUtils.TEXTURE_MAP_BLOCKS) wrapper.reset(); + if (evt.map.getTextureType() == TextureUtils.TEXTURE_MAP_BLOCKS) renderer.onTextureChange(); } @Override public void renderTileEntityAt(TileEntity tileentity, double x, double y, double z, float f) { - TileEntityGuide guide = (TileEntityGuide)tileentity; - GL11.glPushMatrix(); GL11.glTranslated(x, y, z); - float scaleDelta = guide.getTimeSinceChange(); - renderShape(guide.getShape(), guide.getColor(), scaleDelta); - if (scaleDelta < 1.0) { - renderShape(guide.getPreviousShape(), guide.getColor(), 1.0f - scaleDelta); - } - GL11.glPopMatrix(); - } - - private void renderShape(Collection shape, int color, float scale) { - if (shape == null) return; - - TextureUtils.bindDefaultTerrainTexture(); - - GL11.glColor3ub((byte)(color >> 16), (byte)(color >> 8), (byte)(color >> 0)); - GL11.glEnable(GL11.GL_BLEND); - GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE); - GL11.glDisable(GL11.GL_LIGHTING); - - for (Coord coord : shape) - renderMarkerAt(coord.x, coord.y, coord.z, scale); - - GL11.glEnable(GL11.GL_LIGHTING); - GL11.glDisable(GL11.GL_BLEND); - } - - private void renderMarkerAt(double x, double y, double z, float scale) { - GL11.glPushMatrix(); - GL11.glTranslated(x + 0.5F, y, z + 0.5F); - GL11.glScalef(scale, scale, scale); - wrapper.render(); + renderer.renderShape((TileEntityGuide) tileentity); GL11.glPopMatrix(); } } diff --git a/src/main/java/openblocks/common/tileentity/TileEntityBuilderGuide.java b/src/main/java/openblocks/common/tileentity/TileEntityBuilderGuide.java index 0a5faf51..c1f86bda 100644 --- a/src/main/java/openblocks/common/tileentity/TileEntityBuilderGuide.java +++ b/src/main/java/openblocks/common/tileentity/TileEntityBuilderGuide.java @@ -54,7 +54,7 @@ public class TileEntityBuilderGuide extends TileEntityGuide implements IGuideAni } private void creativeReplaceBlocks(Block block, int blockMeta) { - for (Coord coord : getShapeSafe()) + for (Coord coord : getShapeSafe().getCoords()) worldObj.setBlock(xCoord + coord.x, yCoord + coord.y, zCoord + coord.z, block, blockMeta, BlockNotifyFlags.ALL); } @@ -65,7 +65,7 @@ public class TileEntityBuilderGuide extends TileEntityGuide implements IGuideAni } private boolean survivalPlaceBlocks(EntityPlayerMP player, ItemStack heldItem, Block block, int blockMeta, int side, float hitX, float hitY, float hitZ) { - for (Coord relCoord : getShapeSafe()) { + for (Coord relCoord : getShapeSafe().getCoords()) { final int absX = relCoord.x + xCoord; final int absY = relCoord.y + yCoord; final int absZ = relCoord.z + zCoord; diff --git a/src/main/java/openblocks/common/tileentity/TileEntityGuide.java b/src/main/java/openblocks/common/tileentity/TileEntityGuide.java index 1bd7bba5..6f27dfed 100644 --- a/src/main/java/openblocks/common/tileentity/TileEntityGuide.java +++ b/src/main/java/openblocks/common/tileentity/TileEntityGuide.java @@ -9,6 +9,7 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.ChatComponentTranslation; import openblocks.Config; +import openblocks.client.renderer.tileentity.guide.CoordShape; import openblocks.common.item.ItemGuide; import openblocks.shapes.GuideShape; import openmods.api.IAddAwareTile; @@ -77,8 +78,9 @@ public class TileEntityGuide extends DroppableTileEntity implements ISyncListene } }; - private List shape; - private List previousShape; + private CoordShape shape; + private CoordShape previousShape; + private CoordShape toDeleteShape; private float timeSinceChange = 0; private AxisAlignedBB renderAABB; @@ -291,8 +293,9 @@ public class TileEntityGuide extends DroppableTileEntity implements ISyncListene } private void recreateShape() { + toDeleteShape = previousShape; previousShape = shape; - shape = generateShape(); + shape = new CoordShape(generateShape()); renderAABB = null; } @@ -329,13 +332,20 @@ public class TileEntityGuide extends DroppableTileEntity implements ISyncListene return true; } - public List getShape() { + public CoordShape getShape() { return shape; } - public List getPreviousShape() { + public CoordShape getPreviousShape() { return previousShape; } + + public CoordShape getAndDeleteShape() + { + CoordShape toDel = toDeleteShape; + toDeleteShape = null; + return toDel; + } @Override public void updateContainingBlockInfo() { @@ -355,7 +365,7 @@ public class TileEntityGuide extends DroppableTileEntity implements ISyncListene final AxisAlignedBB box = AxisAlignedBB.getBoundingBox(0, 0, 0, 1, 1, 1); if (shape != null) { - for (Coord c : shape) { + for (Coord c : shape.getCoords()) { if (box.maxX < c.x) box.maxX = c.x; if (box.maxY < c.y) box.maxY = c.y; if (box.maxZ < c.z) box.maxZ = c.z; @@ -442,7 +452,7 @@ public class TileEntityGuide extends DroppableTileEntity implements ISyncListene updateRedstone(); } - protected List getShapeSafe() { + protected CoordShape getShapeSafe() { if (shape == null) recreateShape(); return shape; } diff --git a/src/main/resources/assets/openblocks/shaders/shader.frag b/src/main/resources/assets/openblocks/shaders/shader.frag new file mode 100644 index 00000000..16c7bc26 --- /dev/null +++ b/src/main/resources/assets/openblocks/shaders/shader.frag @@ -0,0 +1,26 @@ +#version 150 + +uniform float uHasTexture; +uniform float uHasBrightness; +uniform float uHasColor; +uniform sampler2D uDefaultTexture; +uniform sampler2D uLightmapTexture; +uniform vec3 uColor; + +in vec2 vTexCoord; +in vec4 vColor; +in vec2 vBrightnessCoord; + +#define SCALE 1.0/256.0 +#define TRANSLATE 8.0 + +mat2 tex = mat2(SCALE + TRANSLATE, 0, SCALE + TRANSLATE, 0); + +void main() +{ + vec4 color = vec4(uColor, 1.0); + color *= 1.0 - (1.0 - texture2D(uDefaultTexture, vTexCoord)) * uHasTexture; + color *= 1.0 - (1.0 - vColor) * uHasColor; +// color *= vec4(1.0 - (1.0 - texture2D(uLightmapTexture, vec2(0.0, 1.0))).xyz) * uHasBrightness, 1.0); + gl_FragColor = color; +} \ No newline at end of file diff --git a/src/main/resources/assets/openblocks/shaders/shader.vert b/src/main/resources/assets/openblocks/shaders/shader.vert new file mode 100644 index 00000000..45907a90 --- /dev/null +++ b/src/main/resources/assets/openblocks/shaders/shader.vert @@ -0,0 +1,23 @@ +#version 150 + +in vec3 aVertex; +in vec2 aTexCoord; +in vec4 aColor; +in vec2 aBrightnessCoord; +in vec3 aPosition; + +uniform float uScale; + +out vec2 vTexCoord; +out vec4 vColor; +out vec2 vBrightnessCoord; + +const vec3 offset = vec3(0.5, 0, 0.5); + +void main() +{ + vTexCoord = aTexCoord; + vColor = aColor; + vBrightnessCoord = aBrightnessCoord; + gl_Position = gl_ModelViewProjectionMatrix * vec4(aVertex * uScale + aPosition + offset, 1); +} \ No newline at end of file diff --git a/src/main/resources/assets/openblocks/textures/blocks/guide.png b/src/main/resources/assets/openblocks/textures/blocks/guide.png index df53edfba42dd8bb84b0bda77ec2974d706e2303..faf3dc9dcf989e5aba04ea1b5a7594c8fb69c397 100644 GIT binary patch delta 29 lcmZ3+xQuav4c7q%2EGG~S=Tx_C%VbATILwn`Ay8S0RW2u30wdG delta 29 lcmZ3+xQuav4c9>i2EK!gJ0@noo#-adYMR<=lsYlX1^||63O@h< From 229e554740f13e16895aab12e59004d224890693 Mon Sep 17 00:00:00 2001 From: RobinDeWalvis Date: Tue, 5 Apr 2016 18:36:53 +0200 Subject: [PATCH 08/54] fallback & compat --- .../tileentity/guide/ArraysHelper.java | 98 ++++++++++++---- .../tileentity/guide/BufferHelper.java | 96 +++++++++++++++ .../renderer/tileentity/guide/CoordShape.java | 52 -------- .../tileentity/guide/FutureTesselator.java | 6 - .../guide/GuideAdvancedRenderer.java | 30 ++--- .../tileentity/guide/GuideLegacyRenderer.java | 18 +-- .../tileentity/guide/IGuideRenderer.java | 2 +- .../tileentity/guide/MarkerRenderer.java | 111 +++++++++--------- .../tileentity/guide/ShaderHelper.java | 83 +++++++------ .../tileentity/guide/ShaderProgram.java | 50 ++++---- .../guide/TileEntityGuideRenderer.java | 19 ++- .../common/tileentity/TileEntityGuide.java | 2 +- .../java/openblocks/shapes/CoordShape.java | 58 +++++++++ 13 files changed, 389 insertions(+), 236 deletions(-) create mode 100644 src/main/java/openblocks/client/renderer/tileentity/guide/BufferHelper.java delete mode 100644 src/main/java/openblocks/client/renderer/tileentity/guide/CoordShape.java delete mode 100644 src/main/java/openblocks/client/renderer/tileentity/guide/FutureTesselator.java create mode 100644 src/main/java/openblocks/shapes/CoordShape.java diff --git a/src/main/java/openblocks/client/renderer/tileentity/guide/ArraysHelper.java b/src/main/java/openblocks/client/renderer/tileentity/guide/ArraysHelper.java index 0d3162e7..60d687fd 100644 --- a/src/main/java/openblocks/client/renderer/tileentity/guide/ArraysHelper.java +++ b/src/main/java/openblocks/client/renderer/tileentity/guide/ArraysHelper.java @@ -2,45 +2,97 @@ package openblocks.client.renderer.tileentity.guide; import org.lwjgl.opengl.ARBDrawInstanced; import org.lwjgl.opengl.ARBInstancedArrays; +import org.lwjgl.opengl.ARBVertexArrayObject; import org.lwjgl.opengl.ContextCapabilities; +import org.lwjgl.opengl.GL30; import org.lwjgl.opengl.GL31; import org.lwjgl.opengl.GL33; import org.lwjgl.opengl.GLContext; public class ArraysHelper { - static { initialize(); } - private static boolean GL33Supported; - private static boolean GL31Supported; - private static boolean ARBInstancedArraysSupported; - + public static IArrayMethods methods; + static void initialize() { ContextCapabilities caps = GLContext.getCapabilities(); - GL33Supported = caps.OpenGL33; - GL31Supported = caps.OpenGL31; - ARBInstancedArraysSupported = caps.GL_ARB_instanced_arrays; + if (GLArrayMethods.isSupported(caps)) + methods = new GLArrayMethods(); + else if (ARBArrayMethods.isSupported(caps)) + methods = new ARBArrayMethods(); } - - public static boolean supported() - { - return (GL33Supported || ARBInstancedArraysSupported) && GL31Supported; + + public static boolean isSupported() { + return methods != null; } - - public static void glDrawArraysInstanced(int mode, int first, int count, int primcount) - { - if (GL31Supported) - GL31.glDrawArraysInstanced(mode, first, count, primcount); - else - ARBDrawInstanced.glDrawArraysInstancedARB(mode, first, count, primcount); + + public static IArrayMethods methods() { + return methods; } - - public static void glVertexDivisor(int index, int divisor) { - if (GL33Supported) + + public static interface IArrayMethods { + public int glGenVertexArrays(); + + public void glBindVertexArray(int array); + + public void glVertexAttribDivisor(int index, int divisor); + + public void glDrawArraysInstanced(int mode, int first, int count, int primcount); + } + + private static class GLArrayMethods implements IArrayMethods { + + public static boolean isSupported(ContextCapabilities caps) { + return caps.OpenGL33; + } + + @Override + public int glGenVertexArrays() { + return GL30.glGenVertexArrays(); + } + + @Override + public void glBindVertexArray(int array) { + GL30.glBindVertexArray(array); + } + + @Override + public void glVertexAttribDivisor(int index, int divisor) { GL33.glVertexAttribDivisor(index, divisor); - else if(ARBInstancedArraysSupported) + } + + @Override + public void glDrawArraysInstanced(int mode, int first, int count, int primcount) { + GL31.glDrawArraysInstanced(mode, first, count, primcount); + } + } + + private static class ARBArrayMethods implements IArrayMethods { + + public static boolean isSupported(ContextCapabilities caps) { + return caps.GL_ARB_instanced_arrays && caps.GL_ARB_vertex_array_object; + } + + @Override + public int glGenVertexArrays() { + return ARBVertexArrayObject.glGenVertexArrays(); + } + + @Override + public void glBindVertexArray(int array) { + ARBVertexArrayObject.glBindVertexArray(array); + } + + @Override + public void glVertexAttribDivisor(int index, int divisor) { ARBInstancedArrays.glVertexAttribDivisorARB(index, divisor); + } + + @Override + public void glDrawArraysInstanced(int mode, int first, int count, int primcount) { + ARBDrawInstanced.glDrawArraysInstancedARB(mode, first, count, primcount); + } } } diff --git a/src/main/java/openblocks/client/renderer/tileentity/guide/BufferHelper.java b/src/main/java/openblocks/client/renderer/tileentity/guide/BufferHelper.java new file mode 100644 index 00000000..e7d5373b --- /dev/null +++ b/src/main/java/openblocks/client/renderer/tileentity/guide/BufferHelper.java @@ -0,0 +1,96 @@ +package openblocks.client.renderer.tileentity.guide; + +import java.nio.ByteBuffer; + +import org.lwjgl.opengl.ARBBufferObject; +import org.lwjgl.opengl.ContextCapabilities; +import org.lwjgl.opengl.GL15; +import org.lwjgl.opengl.GLContext; + +public class BufferHelper { + static { + initialize(); + } + + public static IBufferMethods methods; + + static void initialize() { + ContextCapabilities caps = GLContext.getCapabilities(); + if (GLBufferMethods.isSupported(caps)) + methods = new GLBufferMethods(); + else if (ARBBufferMethods.isSupported(caps)) + methods = new ARBBufferMethods(); + } + + public static boolean isSupported() { + return methods != null; + } + + public static IBufferMethods methods() { + return methods; + } + + public static interface IBufferMethods { + public int glGenBuffers(); + + public void glBindBuffer(int target, int buffer); + + public void glBufferData(int target, ByteBuffer data, int usage); + + public void glDeleteBuffers(int buffer); + } + + private static class GLBufferMethods implements IBufferMethods { + + public static boolean isSupported(ContextCapabilities caps) { + return caps.OpenGL15; + } + + @Override + public int glGenBuffers() { + return GL15.glGenBuffers(); + } + + @Override + public void glBindBuffer(int target, int buffer) { + GL15.glBindBuffer(target, buffer); + } + + @Override + public void glBufferData(int target, ByteBuffer data, int usage) { + GL15.glBufferData(target, data, usage); + } + + @Override + public void glDeleteBuffers(int buffer) { + GL15.glDeleteBuffers(buffer); + } + } + + private static class ARBBufferMethods implements IBufferMethods { + + public static boolean isSupported(ContextCapabilities caps) { + return caps.OpenGL15; + } + + @Override + public int glGenBuffers() { + return ARBBufferObject.glGenBuffersARB(); + } + + @Override + public void glBindBuffer(int target, int buffer) { + ARBBufferObject.glBindBufferARB(target, buffer); + } + + @Override + public void glBufferData(int target, ByteBuffer data, int usage) { + ARBBufferObject.glBufferDataARB(target, data, usage); + } + + @Override + public void glDeleteBuffers(int buffer) { + ARBBufferObject.glDeleteBuffersARB(buffer); + } + } +} \ No newline at end of file diff --git a/src/main/java/openblocks/client/renderer/tileentity/guide/CoordShape.java b/src/main/java/openblocks/client/renderer/tileentity/guide/CoordShape.java deleted file mode 100644 index b8cc2b5e..00000000 --- a/src/main/java/openblocks/client/renderer/tileentity/guide/CoordShape.java +++ /dev/null @@ -1,52 +0,0 @@ -package openblocks.client.renderer.tileentity.guide; - -import java.nio.IntBuffer; -import java.util.List; - -import org.lwjgl.BufferUtils; -import org.lwjgl.opengl.GL15; - -import openmods.utils.Coord; - -public class CoordShape { - - int vbo; - List coords; - - public CoordShape(List coords) { - this.coords = coords; - vbo = 0; - } - - public int bindVBO() - { - if (vbo == 0) - { - IntBuffer ib = BufferUtils.createIntBuffer(coords.size() * 3); - for (Coord c : coords) - ib.put(c.x).put(c.y).put(c.z); - ib.flip(); - - vbo = GL15.glGenBuffers(); - GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo); - GL15.glBufferData(GL15.GL_ARRAY_BUFFER, ib, GL15.GL_STATIC_DRAW); - }else - GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo); - - return vbo; - } - - public List getCoords() { - return coords; - } - - public int size() { - return coords.size(); - } - - public void destroy() { - if (vbo != 0) - GL15.glDeleteBuffers(vbo); - vbo = 0; - } -} diff --git a/src/main/java/openblocks/client/renderer/tileentity/guide/FutureTesselator.java b/src/main/java/openblocks/client/renderer/tileentity/guide/FutureTesselator.java deleted file mode 100644 index f15cf0b0..00000000 --- a/src/main/java/openblocks/client/renderer/tileentity/guide/FutureTesselator.java +++ /dev/null @@ -1,6 +0,0 @@ -package openblocks.client.renderer.tileentity.guide; - -public abstract class FutureTesselator -{ - public abstract void render(); -} diff --git a/src/main/java/openblocks/client/renderer/tileentity/guide/GuideAdvancedRenderer.java b/src/main/java/openblocks/client/renderer/tileentity/guide/GuideAdvancedRenderer.java index 2bbb08a1..828ef4dc 100644 --- a/src/main/java/openblocks/client/renderer/tileentity/guide/GuideAdvancedRenderer.java +++ b/src/main/java/openblocks/client/renderer/tileentity/guide/GuideAdvancedRenderer.java @@ -3,37 +3,33 @@ package openblocks.client.renderer.tileentity.guide; import org.lwjgl.opengl.GL11; import openblocks.common.tileentity.TileEntityGuide; +import openblocks.shapes.CoordShape; import openmods.utils.TextureUtils; public class GuideAdvancedRenderer implements IGuideRenderer { static MarkerRenderer mr; - - public GuideAdvancedRenderer(FutureTesselator marker) - { - try { - if (mr == null) - mr = new MarkerRenderer(marker); - } catch (Exception e) { - e.printStackTrace(); - } + + public GuideAdvancedRenderer(Runnable marker) throws Exception { + if (mr == null) + mr = new MarkerRenderer(marker); } - + @Override public void renderShape(TileEntityGuide guide) { - + float scaleDelta = guide.getTimeSinceChange(); renderShape(guide.getShape(), guide.getColor(), scaleDelta); - if (scaleDelta < 1.0) { + if (scaleDelta < 1.0) renderShape(guide.getPreviousShape(), guide.getColor(), 1.0f - scaleDelta); - } CoordShape toDelete = guide.getAndDeleteShape(); if (toDelete != null && mr != null) mr.deleteShape(toDelete); } - + private void renderShape(CoordShape shape, int color, float scale) { - if (shape == null) return; + if (shape == null) + return; TextureUtils.bindDefaultTerrainTexture(); @@ -47,8 +43,8 @@ public class GuideAdvancedRenderer implements IGuideRenderer { GL11.glEnable(GL11.GL_LIGHTING); GL11.glDisable(GL11.GL_BLEND); } - + @Override - public void onTextureChange() { + public void onTextureChange() { } } diff --git a/src/main/java/openblocks/client/renderer/tileentity/guide/GuideLegacyRenderer.java b/src/main/java/openblocks/client/renderer/tileentity/guide/GuideLegacyRenderer.java index 9b33739e..1e3f0e5c 100644 --- a/src/main/java/openblocks/client/renderer/tileentity/guide/GuideLegacyRenderer.java +++ b/src/main/java/openblocks/client/renderer/tileentity/guide/GuideLegacyRenderer.java @@ -13,23 +13,22 @@ import openmods.utils.TextureUtils; public class GuideLegacyRenderer implements IGuideRenderer { private DisplayListWrapper wrapper; - - public GuideLegacyRenderer(final FutureTesselator marker) - { + + public GuideLegacyRenderer(final Runnable model) { wrapper = new DisplayListWrapper() { @Override public void compile() { - marker.render(); + model.run(); Tessellator.instance.draw(); } }; } - + @Override public void onTextureChange() { wrapper.reset(); } - + @Override public void renderShape(TileEntityGuide guide) { float scaleDelta = guide.getTimeSinceChange(); @@ -38,13 +37,14 @@ public class GuideLegacyRenderer implements IGuideRenderer { renderShape(guide.getPreviousShape().getCoords(), guide.getColor(), 1.0f - scaleDelta); } } - + private void renderShape(Collection shape, int color, float scale) { - if (shape == null) return; + if (shape == null) + return; TextureUtils.bindDefaultTerrainTexture(); - GL11.glColor3ub((byte)(color >> 16), (byte)(color >> 8), (byte)(color >> 0)); + GL11.glColor3ub((byte) (color >> 16), (byte) (color >> 8), (byte) (color >> 0)); GL11.glEnable(GL11.GL_BLEND); GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE); GL11.glDisable(GL11.GL_LIGHTING); diff --git a/src/main/java/openblocks/client/renderer/tileentity/guide/IGuideRenderer.java b/src/main/java/openblocks/client/renderer/tileentity/guide/IGuideRenderer.java index dbc78a9d..e67d8185 100644 --- a/src/main/java/openblocks/client/renderer/tileentity/guide/IGuideRenderer.java +++ b/src/main/java/openblocks/client/renderer/tileentity/guide/IGuideRenderer.java @@ -4,6 +4,6 @@ import openblocks.common.tileentity.TileEntityGuide; public interface IGuideRenderer { void renderShape(TileEntityGuide guide); - + void onTextureChange(); } diff --git a/src/main/java/openblocks/client/renderer/tileentity/guide/MarkerRenderer.java b/src/main/java/openblocks/client/renderer/tileentity/guide/MarkerRenderer.java index d4ad5601..742eb690 100644 --- a/src/main/java/openblocks/client/renderer/tileentity/guide/MarkerRenderer.java +++ b/src/main/java/openblocks/client/renderer/tileentity/guide/MarkerRenderer.java @@ -6,14 +6,14 @@ import java.nio.IntBuffer; import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL13; import org.lwjgl.opengl.GL15; -import org.lwjgl.opengl.GL30; -import org.lwjgl.opengl.GL31; +import org.lwjgl.opengl.GL20; import net.minecraft.client.renderer.GLAllocation; import net.minecraft.client.renderer.OpenGlHelper; import net.minecraft.client.renderer.Tessellator; import net.minecraft.client.shader.TesselatorVertexState; import net.minecraft.util.ResourceLocation; +import openblocks.shapes.CoordShape; public class MarkerRenderer { @@ -23,106 +23,103 @@ public class MarkerRenderer { private static int nativeBufferSize = 0x200000; private static ByteBuffer byteBuffer = GLAllocation.createDirectByteBuffer(nativeBufferSize * 4); - private static IntBuffer intBuffer = byteBuffer.asIntBuffer(); - - FutureTesselator model; - + private static IntBuffer intBuffer = byteBuffer.asIntBuffer(); + + Runnable model; + private boolean initialized = false; private int vertexCount, vao; - - public MarkerRenderer(FutureTesselator model) throws Exception { + + public MarkerRenderer(Runnable model) throws Exception { shader = new ShaderProgram(); - shader.addShader(vertexSource, ShaderHelper.GL_VERTEX_SHADER); - shader.addShader(fragmentSource, ShaderHelper.GL_FRAGMENT_SHADER); + shader.addShader(vertexSource, GL20.GL_VERTEX_SHADER); + shader.addShader(fragmentSource, GL20.GL_FRAGMENT_SHADER); shader.compile(); - + this.model = model; } - public void createVAO() - { - model.render(); - TesselatorVertexState state = Tessellator.instance.getVertexState(0,0,0); + public void createVAO() { + model.run(); + TesselatorVertexState state = Tessellator.instance.getVertexState(0, 0, 0); Tessellator.instance.draw(); // just discard the state this way. - + if (state.getRawBuffer().length > nativeBufferSize) throw new UnsupportedOperationException("Big buffers not supported!"); - + vertexCount = state.getVertexCount(); - + { intBuffer.clear(); - intBuffer.put(state.getRawBuffer(), 0, vertexCount * 8); - byteBuffer.position(0); - byteBuffer.limit(vertexCount * 32); + intBuffer.put(state.getRawBuffer(), 0, vertexCount * 8); + byteBuffer.position(0); + byteBuffer.limit(vertexCount * 32); } - - vao = GL30.glGenVertexArrays(); - GL30.glBindVertexArray(vao); - + + vao = ArraysHelper.methods().glGenVertexArrays(); + ArraysHelper.methods().glBindVertexArray(vao); + byteBuffer.position(0); - - int vbo = GL15.glGenBuffers(); - GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo); - GL15.glBufferData(GL15.GL_ARRAY_BUFFER, byteBuffer, GL15.GL_STATIC_DRAW); - + + int vbo = BufferHelper.methods().glGenBuffers(); + BufferHelper.methods().glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo); + BufferHelper.methods().glBufferData(GL15.GL_ARRAY_BUFFER, byteBuffer, GL15.GL_STATIC_DRAW); + { shader.attributePointer("aVertex", 3, GL11.GL_FLOAT, false, 32, 0); shader.attributePointer("aTexCoord", 2, GL11.GL_FLOAT, false, 32, 12); shader.attributePointer("aColor", 4, GL11.GL_UNSIGNED_BYTE, false, 32, 20); shader.attributePointer("aBrightnessCoord", 2, GL11.GL_SHORT, false, 32, 28); } - - GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); - - shader.uniform1f("uHasTexture", state.getHasTexture() ? 1f : 0f); // no conversions on the GPU this way. + + BufferHelper.methods().glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); + + shader.uniform1f("uHasTexture", state.getHasTexture() ? 1f : 0f); shader.uniform1f("uHasColor", state.getHasColor() ? 1f : 0f); shader.uniform1f("uHasBrightness", state.getHasBrightness() ? 1f : 0f); - shader.uniform1i("uDefaultTexture", OpenGlHelper.defaultTexUnit - GL13.GL_TEXTURE0); // should be 0 - shader.uniform1i("uLightmapTexture", OpenGlHelper.lightmapTexUnit - GL13.GL_TEXTURE0); // should be 1 + shader.uniform1i("uDefaultTexture", OpenGlHelper.defaultTexUnit - GL13.GL_TEXTURE0); + shader.uniform1i("uLightmapTexture", OpenGlHelper.lightmapTexUnit - GL13.GL_TEXTURE0); byteBuffer.position(0); - GL30.glBindVertexArray(0); - + ArraysHelper.methods().glBindVertexArray(0); + initialized = true; } - + public void draw() { shader.bind(); if (!initialized) createVAO(); - GL30.glBindVertexArray(vao); + ArraysHelper.methods().glBindVertexArray(vao); GL11.glDrawArrays(GL11.GL_QUADS, 0, vertexCount); - GL30.glBindVertexArray(0); + ArraysHelper.methods().glBindVertexArray(0); shader.release(); } - + public void drawInstanced(CoordShape shape, int color, float scale) { shader.bind(); if (!initialized) createVAO(); - GL30.glBindVertexArray(vao); - + ArraysHelper.methods().glBindVertexArray(vao); + shape.bindVBO(); shader.instanceAttributePointer("aPosition", 3, GL11.GL_INT, false, 0, 0); - GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); - + BufferHelper.methods().glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); + shader.uniform3f("uColor", ((color >> 16) & 0xFF) / 255f, ((color >> 8) & 0xFF) / 255f, (color & 0xFF) / 255f); shader.uniform1f("uScale", scale); - - GL31.glDrawArraysInstanced(GL11.GL_QUADS, 0, vertexCount, shape.size()); - - GL30.glBindVertexArray(0); + + ArraysHelper.methods().glDrawArraysInstanced(GL11.GL_QUADS, 0, vertexCount, shape.size()); + + ArraysHelper.methods().glBindVertexArray(0); shader.release(); } - - public void deleteShape(CoordShape shape) - { - if (initialized) - { - GL30.glBindVertexArray(vao); + + public void deleteShape(CoordShape shape) { + if (initialized) { + ArraysHelper.methods().glBindVertexArray(vao); shape.destroy(); - GL30.glBindVertexArray(0); + ArraysHelper.methods().glBindVertexArray(0); } } } diff --git a/src/main/java/openblocks/client/renderer/tileentity/guide/ShaderHelper.java b/src/main/java/openblocks/client/renderer/tileentity/guide/ShaderHelper.java index 927f2bbe..815e1a4a 100644 --- a/src/main/java/openblocks/client/renderer/tileentity/guide/ShaderHelper.java +++ b/src/main/java/openblocks/client/renderer/tileentity/guide/ShaderHelper.java @@ -18,68 +18,77 @@ public class ShaderHelper { } public static IShaderMethods methods; - - // these are the same constants for ARB and GL20 anyway... - public static final int GL_LINK_STATUS = GL20.GL_LINK_STATUS; - public static final int GL_VALIDATE_STATUS = GL20.GL_VALIDATE_STATUS; - public static final int GL_COMPILE_STATUS = GL20.GL_COMPILE_STATUS; - public static final int GL_INFO_LOG_LENGTH = GL20.GL_INFO_LOG_LENGTH; - public static final int GL_VERTEX_SHADER = GL20.GL_VERTEX_SHADER; - public static final int GL_FRAGMENT_SHADER = GL20.GL_FRAGMENT_SHADER; - static void initialize() { + static void initialize() { ContextCapabilities caps = GLContext.getCapabilities(); - + if (GL20ShaderMethods.isSupported(caps)) methods = new GL20ShaderMethods(); else if (ARBShaderMethods.isSupported(caps)) methods = new ARBShaderMethods(); } - public static boolean isSupported() - { + public static boolean isSupported() { return methods != null; } - - public static IShaderMethods methods() - { + + public static IShaderMethods methods() { return methods; } - - public static interface IShaderMethods - { + + public static interface IShaderMethods { public int glCreateProgram(); + public int glCreateShader(int type); + public void glAttachShader(int program, int shader); + public void glDetachShader(int program, int shader); + public void glLinkProgram(int program); + public void glValidateProgram(int program); + public void glDeleteProgram(int program); + public void glDeleteShader(int shader); + public int glGetProgrami(int shader, int parameter); + public int glGetShaderi(int program, int parameter); + public String getProgramLogInfo(int program); + public String getShaderLogInfo(int shader); + public void glUseProgram(int program); + public void glShaderSource(int shader, String shaderSource); + public void glCompileShader(int shader); + public int glGetUniformLocation(int program, String uniform); + public void glUniform1i(int loc, int val); + public void glUniform1f(int loc, float val); + public void glUniform3f(int loc, float x, float y, float z); + public int glGetAttribLocation(int program, String attrib); + public void glEnableVertexAttribArray(int index); + public void glDisableVertexAttribArray(int index); + public void glVertexAttribPointer(int index, int size, int type, boolean normalized, int stride, long offset); } - - private static class GL20ShaderMethods implements IShaderMethods - { - public static boolean isSupported(ContextCapabilities caps) - { + + private static class GL20ShaderMethods implements IShaderMethods { + public static boolean isSupported(ContextCapabilities caps) { return caps.OpenGL20; } - + @Override public int glCreateProgram() { return GL20.glCreateProgram(); @@ -129,15 +138,15 @@ public class ShaderHelper { public int glGetShaderi(int shader, int parameter) { return GL20.glGetShaderi(shader, parameter); } - + @Override public String getProgramLogInfo(int program) { - return GL20.glGetProgramInfoLog(program, glGetProgrami(program, GL_INFO_LOG_LENGTH)); + return GL20.glGetProgramInfoLog(program, glGetProgrami(program, GL20.GL_INFO_LOG_LENGTH)); } @Override public String getShaderLogInfo(int shader) { - return GL20.glGetShaderInfoLog(shader, glGetShaderi(shader, GL_INFO_LOG_LENGTH)); + return GL20.glGetShaderInfoLog(shader, glGetShaderi(shader, GL20.GL_INFO_LOG_LENGTH)); } @Override @@ -169,7 +178,7 @@ public class ShaderHelper { public void glUniform1f(int loc, float val) { GL20.glUniform1f(loc, val); } - + @Override public void glUniform3f(int loc, float x, float y, float z) { GL20.glUniform3f(loc, x, y, z); @@ -195,14 +204,12 @@ public class ShaderHelper { GL20.glVertexAttribPointer(index, size, type, normalized, stride, offset); } } - - private static class ARBShaderMethods implements IShaderMethods - { - public static boolean isSupported(ContextCapabilities caps) - { + + private static class ARBShaderMethods implements IShaderMethods { + public static boolean isSupported(ContextCapabilities caps) { return caps.GL_ARB_shader_objects && caps.GL_ARB_vertex_shader && caps.GL_ARB_fragment_shader; } - + @Override public int glCreateProgram() { return ARBShaderObjects.glCreateProgramObjectARB(); @@ -242,7 +249,7 @@ public class ShaderHelper { public void glDeleteShader(int shader) { ARBShaderObjects.glDeleteObjectARB(shader); } - + @Override public int glGetProgrami(int program, int parameter) { return ARBShaderObjects.glGetObjectParameteriARB(program, parameter); @@ -255,12 +262,12 @@ public class ShaderHelper { @Override public String getProgramLogInfo(int program) { - return ARBShaderObjects.glGetInfoLogARB(program, glGetProgrami(program, GL_INFO_LOG_LENGTH)); + return ARBShaderObjects.glGetInfoLogARB(program, glGetProgrami(program, GL20.GL_INFO_LOG_LENGTH)); } @Override public String getShaderLogInfo(int shader) { - return ARBShaderObjects.glGetInfoLogARB(shader, glGetShaderi(shader, GL_INFO_LOG_LENGTH)); + return ARBShaderObjects.glGetInfoLogARB(shader, glGetShaderi(shader, GL20.GL_INFO_LOG_LENGTH)); } @Override @@ -292,7 +299,7 @@ public class ShaderHelper { public void glUniform1f(int loc, float val) { ARBShaderObjects.glUniform1fARB(loc, val); } - + @Override public void glUniform3f(int loc, float x, float y, float z) { ARBShaderObjects.glUniform3fARB(loc, x, y, z); diff --git a/src/main/java/openblocks/client/renderer/tileentity/guide/ShaderProgram.java b/src/main/java/openblocks/client/renderer/tileentity/guide/ShaderProgram.java index cb989ab1..44c6a32d 100644 --- a/src/main/java/openblocks/client/renderer/tileentity/guide/ShaderProgram.java +++ b/src/main/java/openblocks/client/renderer/tileentity/guide/ShaderProgram.java @@ -8,6 +8,7 @@ import java.util.ArrayList; import java.util.HashMap; import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL20; import org.lwjgl.opengl.OpenGLException; import net.minecraft.client.Minecraft; @@ -37,7 +38,6 @@ public class ShaderProgram { ShaderHelper.methods().glUseProgram(0); } - // See ShaderHelper.methods() for shader types public void addShader(ResourceLocation source, int type) throws Exception { if (compiled) throw new UnsupportedOperationException("Shader already compiled"); @@ -58,13 +58,13 @@ public class ShaderProgram { for (Integer shader : shaders) ShaderHelper.methods().glAttachShader(program, shader); ShaderHelper.methods().glLinkProgram(program); - if (ShaderHelper.methods().glGetProgrami(program, ShaderHelper.GL_LINK_STATUS) == GL11.GL_FALSE) + if (ShaderHelper.methods().glGetProgrami(program, GL20.GL_LINK_STATUS) == GL11.GL_FALSE) throw new OpenGLException("Shader link error: " + ShaderHelper.methods().getProgramLogInfo(program)); for (Integer shader : shaders) ShaderHelper.methods().glDetachShader(program, shader); ShaderHelper.methods().glValidateProgram(program); - if (ShaderHelper.methods().glGetProgrami(program, ShaderHelper.GL_VALIDATE_STATUS) == GL11.GL_FALSE) + if (ShaderHelper.methods().glGetProgrami(program, GL20.GL_VALIDATE_STATUS) == GL11.GL_FALSE) throw new OpenGLException("Shader validate error: " + ShaderHelper.methods().getProgramLogInfo(program)); compiled = true; @@ -87,7 +87,7 @@ public class ShaderProgram { ShaderHelper.methods().glShaderSource(shader, readShaderSource(source)); ShaderHelper.methods().glCompileShader(shader); - if (ShaderHelper.methods().glGetShaderi(shader, ShaderHelper.GL_COMPILE_STATUS) == GL11.GL_FALSE) + if (ShaderHelper.methods().glGetShaderi(shader, GL20.GL_COMPILE_STATUS) == GL11.GL_FALSE) throw new OpenGLException("Shader compile error: " + ShaderHelper.methods().getShaderLogInfo(shader)); return shader; @@ -120,45 +120,37 @@ public class ShaderProgram { } return loc; } - - public void uniform1i(String name, int val) - { + + public void uniform1i(String name, int val) { ShaderHelper.methods().glUniform1i(getUniformLocation(name), val); } - - public void uniform1f(String name, float val) - { + + public void uniform1f(String name, float val) { ShaderHelper.methods().glUniform1f(getUniformLocation(name), val); } - - public void uniform3f(String name, float x, float y, float z) - { + + public void uniform3f(String name, float x, float y, float z) { ShaderHelper.methods().glUniform3f(getUniformLocation(name), x, y, z); } - - public int getProgram() - { + + public int getProgram() { return program; } - - public void instanceAttributePointer(String attrib, int size, int type, boolean normalized, int stride, long offset) - { + + public void instanceAttributePointer(String attrib, int size, int type, boolean normalized, int stride, long offset) { instanceAttributePointer(ShaderHelper.methods().glGetAttribLocation(program, attrib), size, type, normalized, stride, offset); } - - public void instanceAttributePointer(int index, int size, int type, boolean normalized, int stride, long offset) - { + + public void instanceAttributePointer(int index, int size, int type, boolean normalized, int stride, long offset) { attributePointer(index, size, type, normalized, stride, offset); - ArraysHelper.glVertexDivisor(index, 1); + ArraysHelper.methods().glVertexAttribDivisor(index, 1); } - - public void attributePointer(String attrib, int size, int type, boolean normalized, int stride, long offset) - { + + public void attributePointer(String attrib, int size, int type, boolean normalized, int stride, long offset) { attributePointer(ShaderHelper.methods().glGetAttribLocation(program, attrib), size, type, normalized, stride, offset); } - - public void attributePointer(int index, int size, int type, boolean normalized, int stride, long offset) - { + + public void attributePointer(int index, int size, int type, boolean normalized, int stride, long offset) { ShaderHelper.methods().glVertexAttribPointer(index, size, type, normalized, stride, offset); ShaderHelper.methods().glEnableVertexAttribArray(index); } diff --git a/src/main/java/openblocks/client/renderer/tileentity/guide/TileEntityGuideRenderer.java b/src/main/java/openblocks/client/renderer/tileentity/guide/TileEntityGuideRenderer.java index 5986285b..b484371f 100644 --- a/src/main/java/openblocks/client/renderer/tileentity/guide/TileEntityGuideRenderer.java +++ b/src/main/java/openblocks/client/renderer/tileentity/guide/TileEntityGuideRenderer.java @@ -12,13 +12,14 @@ import net.minecraftforge.common.MinecraftForge; import openblocks.OpenBlocks; import openblocks.common.block.BlockGuide.Icons; import openblocks.common.tileentity.TileEntityGuide; +import openmods.Log; import openmods.utils.TextureUtils; public class TileEntityGuideRenderer extends TileEntitySpecialRenderer { - private final FutureTesselator marker = new FutureTesselator(){ + private final Runnable marker = new Runnable(){ @Override - public void render() { + public void run() { Tessellator t = Tessellator.instance; RenderBlocks renderBlocks = new RenderBlocks(); renderBlocks.setRenderBounds(0.05D, 0.05D, 0.05D, 0.95D, 0.95D, 0.95D); @@ -34,10 +35,22 @@ public class TileEntityGuideRenderer extends TileEntitySpecialRenderer { } }; - private final IGuideRenderer renderer = new GuideLegacyRenderer(marker); + private IGuideRenderer renderer; public TileEntityGuideRenderer() { MinecraftForge.EVENT_BUS.register(this); + + if (!ShaderHelper.isSupported() || !BufferHelper.isSupported() || !ArraysHelper.isSupported()) { + renderer = new GuideLegacyRenderer(marker); // advanced renderer not supported :( + Log.info("Advanced guide renderer not supported, falling back to legacy renderer.", (Object[]) null); + } else { + try { + renderer = new GuideAdvancedRenderer(marker); // try to use the advanced renderer + } catch (Exception e) { + Log.info("Error trying to create advanced renderer, falling back to legacy renderer", (Object[]) null); + renderer = new GuideLegacyRenderer(marker); // fall back to the old renderer. + } + } } @SubscribeEvent diff --git a/src/main/java/openblocks/common/tileentity/TileEntityGuide.java b/src/main/java/openblocks/common/tileentity/TileEntityGuide.java index 6f27dfed..aacc66ff 100644 --- a/src/main/java/openblocks/common/tileentity/TileEntityGuide.java +++ b/src/main/java/openblocks/common/tileentity/TileEntityGuide.java @@ -9,8 +9,8 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.ChatComponentTranslation; import openblocks.Config; -import openblocks.client.renderer.tileentity.guide.CoordShape; import openblocks.common.item.ItemGuide; +import openblocks.shapes.CoordShape; import openblocks.shapes.GuideShape; import openmods.api.IAddAwareTile; import openmods.api.INeighbourAwareTile; diff --git a/src/main/java/openblocks/shapes/CoordShape.java b/src/main/java/openblocks/shapes/CoordShape.java new file mode 100644 index 00000000..0cfb03fa --- /dev/null +++ b/src/main/java/openblocks/shapes/CoordShape.java @@ -0,0 +1,58 @@ +package openblocks.shapes; + +import java.nio.ByteBuffer; +import java.util.List; + +import org.lwjgl.BufferUtils; +import org.lwjgl.opengl.GL15; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import openblocks.client.renderer.tileentity.guide.BufferHelper; +import openmods.utils.Coord; + +public class CoordShape { + + @SideOnly(Side.CLIENT) + int vbo; + List coords; + + public CoordShape(List coords) { + this.coords = coords; + vbo = 0; + } + + @SideOnly(Side.CLIENT) + public int bindVBO() + { + if (vbo == 0) + { + ByteBuffer data = BufferUtils.createByteBuffer(coords.size() * 3 * 4); + for (Coord c : coords) + data.putInt(c.x).putInt(c.y).putInt(c.z); + data.flip(); + + vbo = BufferHelper.methods().glGenBuffers(); + BufferHelper.methods().glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo); + BufferHelper.methods().glBufferData(GL15.GL_ARRAY_BUFFER, data, GL15.GL_STATIC_DRAW); + }else + BufferHelper.methods().glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo); + + return vbo; + } + + public List getCoords() { + return coords; + } + + public int size() { + return coords.size(); + } + + @SideOnly(Side.CLIENT) + public void destroy() { + if (vbo != 0) + BufferHelper.methods().glDeleteBuffers(vbo); + vbo = 0; + } +} From 006c7db8dfe1181cf08181a3be02c2e93f02919e Mon Sep 17 00:00:00 2001 From: RobinDeWalvis Date: Tue, 5 Apr 2016 19:10:04 +0200 Subject: [PATCH 09/54] Add config option to disable advanced renderer --- src/main/java/openblocks/Config.java | 4 ++++ .../tileentity/guide/GuideLegacyRenderer.java | 11 +++++------ .../tileentity/guide/TileEntityGuideRenderer.java | 10 +++++++--- 3 files changed, 16 insertions(+), 9 deletions(-) diff --git a/src/main/java/openblocks/Config.java b/src/main/java/openblocks/Config.java index 3a5ffb32..878a9e0b 100644 --- a/src/main/java/openblocks/Config.java +++ b/src/main/java/openblocks/Config.java @@ -304,6 +304,10 @@ public class Config { @OnLineModifiable @ConfigProperty(category = "guide", name = "renderDistanceSq", comment = "Square of guide maximum render distance") public static double guideRenderRangeSq = 256 * 256; + + @OnLineModifiable + @ConfigProperty(category = "guide", name = "useAdvancedRenderer", comment = "Try to use advanced OpenGL for performance improvement") + public static boolean useAdvancedRenderer = true; @OnLineModifiable @ConfigProperty(category = "scaffolding", name = "despawnRate", comment = "The rate at which scaffolding should break. 0 - fastest") diff --git a/src/main/java/openblocks/client/renderer/tileentity/guide/GuideLegacyRenderer.java b/src/main/java/openblocks/client/renderer/tileentity/guide/GuideLegacyRenderer.java index 1e3f0e5c..3beaf7aa 100644 --- a/src/main/java/openblocks/client/renderer/tileentity/guide/GuideLegacyRenderer.java +++ b/src/main/java/openblocks/client/renderer/tileentity/guide/GuideLegacyRenderer.java @@ -1,11 +1,10 @@ package openblocks.client.renderer.tileentity.guide; -import java.util.Collection; - import org.lwjgl.opengl.GL11; import net.minecraft.client.renderer.Tessellator; import openblocks.common.tileentity.TileEntityGuide; +import openblocks.shapes.CoordShape; import openmods.renderer.DisplayListWrapper; import openmods.utils.Coord; import openmods.utils.TextureUtils; @@ -32,13 +31,13 @@ public class GuideLegacyRenderer implements IGuideRenderer { @Override public void renderShape(TileEntityGuide guide) { float scaleDelta = guide.getTimeSinceChange(); - renderShape(guide.getShape().getCoords(), guide.getColor(), scaleDelta); + renderShape(guide.getShape(), guide.getColor(), scaleDelta); if (scaleDelta < 1.0) { - renderShape(guide.getPreviousShape().getCoords(), guide.getColor(), 1.0f - scaleDelta); + renderShape(guide.getPreviousShape(), guide.getColor(), 1.0f - scaleDelta); } } - private void renderShape(Collection shape, int color, float scale) { + private void renderShape(CoordShape shape, int color, float scale) { if (shape == null) return; @@ -49,7 +48,7 @@ public class GuideLegacyRenderer implements IGuideRenderer { GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE); GL11.glDisable(GL11.GL_LIGHTING); - for (Coord coord : shape) + for (Coord coord : shape.getCoords()) renderMarkerAt(coord.x, coord.y, coord.z, scale); GL11.glEnable(GL11.GL_LIGHTING); diff --git a/src/main/java/openblocks/client/renderer/tileentity/guide/TileEntityGuideRenderer.java b/src/main/java/openblocks/client/renderer/tileentity/guide/TileEntityGuideRenderer.java index b484371f..ffab950a 100644 --- a/src/main/java/openblocks/client/renderer/tileentity/guide/TileEntityGuideRenderer.java +++ b/src/main/java/openblocks/client/renderer/tileentity/guide/TileEntityGuideRenderer.java @@ -9,6 +9,7 @@ import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; import net.minecraft.tileentity.TileEntity; import net.minecraftforge.client.event.TextureStitchEvent; import net.minecraftforge.common.MinecraftForge; +import openblocks.Config; import openblocks.OpenBlocks; import openblocks.common.block.BlockGuide.Icons; import openblocks.common.tileentity.TileEntityGuide; @@ -39,15 +40,18 @@ public class TileEntityGuideRenderer extends TileEntitySpecialRenderer { public TileEntityGuideRenderer() { MinecraftForge.EVENT_BUS.register(this); - + if (!ShaderHelper.isSupported() || !BufferHelper.isSupported() || !ArraysHelper.isSupported()) { renderer = new GuideLegacyRenderer(marker); // advanced renderer not supported :( - Log.info("Advanced guide renderer not supported, falling back to legacy renderer.", (Object[]) null); + Log.debug("Advanced guide renderer not supported, falling back to legacy renderer.", (Object[]) null); + } else if (Config.useAdvancedRenderer == false){ + renderer = new GuideLegacyRenderer(marker); + Log.debug("Advanced guide renderer disabled, falling back to legacy renderer.", (Object[]) null); } else { try { renderer = new GuideAdvancedRenderer(marker); // try to use the advanced renderer } catch (Exception e) { - Log.info("Error trying to create advanced renderer, falling back to legacy renderer", (Object[]) null); + Log.debug("Error trying to create advanced renderer, falling back to legacy renderer", (Object[]) null); renderer = new GuideLegacyRenderer(marker); // fall back to the old renderer. } } From aa6e68e0eedd384fde77a9e7875b4ef6a1a1da28 Mon Sep 17 00:00:00 2001 From: Alex Ponebshek Date: Wed, 6 Apr 2016 14:03:41 -0500 Subject: [PATCH 10/54] added config option to require grave in inventory and consume it --- src/main/java/openblocks/Config.java | 4 +++ .../openblocks/common/PlayerDeathHandler.java | 32 +++++++++++++++++-- 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/src/main/java/openblocks/Config.java b/src/main/java/openblocks/Config.java index 3a5ffb32..f0c17592 100644 --- a/src/main/java/openblocks/Config.java +++ b/src/main/java/openblocks/Config.java @@ -194,6 +194,10 @@ public class Config { @ConfigProperty(category = "graves", name = "skeletonSpawnRate", comment = "Spawn rate, range: 0..1, default: about 1 per 50s") public static double skeletonSpawnRate = 0.002; + @OnLineModifiable + @ConfigProperty(category = "graves", name = "requiresGraveInInv", comment = "Require gravestone to be in a player's inventory (it is consumed)") + public static boolean requiresGraveInInv = false; + @OnLineModifiable @ConfigProperty(category = "graves", name = "specialActionFrequency", comment = "Frequency of special action on grave digging, 0..1") public static double graveSpecialAction = 0.03; diff --git a/src/main/java/openblocks/common/PlayerDeathHandler.java b/src/main/java/openblocks/common/PlayerDeathHandler.java index 04546cdb..28f79a1d 100644 --- a/src/main/java/openblocks/common/PlayerDeathHandler.java +++ b/src/main/java/openblocks/common/PlayerDeathHandler.java @@ -9,6 +9,7 @@ import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; import net.minecraft.inventory.IInventory; +import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; @@ -24,6 +25,7 @@ import openblocks.api.GraveDropsEvent; import openblocks.api.GraveSpawnEvent; import openblocks.common.GameRuleManager.GameRule; import openblocks.common.PlayerInventoryStore.ExtrasFiller; +import openblocks.common.block.BlockGrave; import openblocks.common.tileentity.TileEntityGrave; import openmods.Log; import openmods.inventory.GenericInventory; @@ -362,8 +364,6 @@ public class PlayerDeathHandler { return; } - drops.clear(); - final List graveLoot = Lists.newArrayList(); for (GraveDropsEvent.ItemAction entry : dropsEvent.drops) { @@ -383,9 +383,37 @@ public class PlayerDeathHandler { if (graveLoot.isEmpty()) { Log.log(debugLevel(), "No grave drops left for player '%s' after event filtering, grave will not be spawned'", player); + drops.clear(); return; } + if (Config.requiresGraveInInv) { + Iterator lootIter = graveLoot.iterator(); + while (lootIter.hasNext()) { + EntityItem drop = lootIter.next(); + ItemStack itemStack = drop.getEntityItem(); if (itemStack == null) continue; + if (itemStack.stackSize <= 0) continue; + Item item = itemStack.getItem(); if (item == null) continue; + if (Block.getBlockFromItem(item) instanceof BlockGrave) { // require grave + if (--itemStack.stackSize <= 0) { // and consume it + lootIter.remove(); + } else { + drop.setEntityItemStack(itemStack); + } + + lootIter = null; + break; + } + } + + if (lootIter != null) { + Log.log(debugLevel(), "No grave in drops for player '%s', grave will not be spawned'", player); + return; + } + } + + drops.clear(); + Log.log(debugLevel(), "Scheduling grave placement for player '%s':'%s' with %d item(s)", player, player.getGameProfile(), graveLoot.size()); DelayedActionTickHandler.INSTANCE.addTickCallback(world, new GraveCallable(world, player, graveLoot)); } From 33767849f7ab7238c36184c3889c2c2520441521 Mon Sep 17 00:00:00 2001 From: Bartek Bok Date: Fri, 8 Apr 2016 20:49:07 +0200 Subject: [PATCH 11/54] Cleanup + fixes --- .../openblocks/common/PlayerDeathHandler.java | 58 +++++++++++-------- 1 file changed, 33 insertions(+), 25 deletions(-) diff --git a/src/main/java/openblocks/common/PlayerDeathHandler.java b/src/main/java/openblocks/common/PlayerDeathHandler.java index 28f79a1d..5faec315 100644 --- a/src/main/java/openblocks/common/PlayerDeathHandler.java +++ b/src/main/java/openblocks/common/PlayerDeathHandler.java @@ -25,7 +25,6 @@ import openblocks.api.GraveDropsEvent; import openblocks.api.GraveSpawnEvent; import openblocks.common.GameRuleManager.GameRule; import openblocks.common.PlayerInventoryStore.ExtrasFiller; -import openblocks.common.block.BlockGrave; import openblocks.common.tileentity.TileEntityGrave; import openmods.Log; import openmods.inventory.GenericInventory; @@ -38,6 +37,7 @@ import openmods.world.DelayedActionTickHandler; import org.apache.logging.log4j.Level; import com.google.common.collect.ImmutableList; +import com.google.common.collect.Iterables; import com.google.common.collect.Lists; import com.mojang.authlib.GameProfile; @@ -365,6 +365,7 @@ public class PlayerDeathHandler { } final List graveLoot = Lists.newArrayList(); + drops.clear(); // will be rebuilt based from event for (GraveDropsEvent.ItemAction entry : dropsEvent.drops) { switch (entry.action) { @@ -383,39 +384,46 @@ public class PlayerDeathHandler { if (graveLoot.isEmpty()) { Log.log(debugLevel(), "No grave drops left for player '%s' after event filtering, grave will not be spawned'", player); - drops.clear(); return; } - if (Config.requiresGraveInInv) { - Iterator lootIter = graveLoot.iterator(); - while (lootIter.hasNext()) { - EntityItem drop = lootIter.next(); - ItemStack itemStack = drop.getEntityItem(); if (itemStack == null) continue; - if (itemStack.stackSize <= 0) continue; - Item item = itemStack.getItem(); if (item == null) continue; - if (Block.getBlockFromItem(item) instanceof BlockGrave) { // require grave - if (--itemStack.stackSize <= 0) { // and consume it - lootIter.remove(); - } else { - drop.setEntityItemStack(itemStack); - } + if (!tryConsumeGrave(player, Iterables.concat(graveLoot, drops))) { + Log.log(debugLevel(), "No grave in drops for player '%s', grave will not be spawned'", player); + return; + } - lootIter = null; - break; + Log.log(debugLevel(), "Scheduling grave placement for player '%s':'%s' with %d item(s) stored and %d item(s) dropped", + player, player.getGameProfile(), graveLoot.size(), drops.size()); + + DelayedActionTickHandler.INSTANCE.addTickCallback(world, new GraveCallable(world, player, graveLoot)); + } + + // TODO: candidate for scripting + private static boolean tryConsumeGrave(EntityPlayer player, Iterable graveLoot) { + if (!Config.requiresGraveInInv || player.capabilities.isCreativeMode) return true; + + final Item graveItem = Item.getItemFromBlock(OpenBlocks.Blocks.grave); + if (graveItem == null) return true; + + final Iterator lootIter = graveLoot.iterator(); + while (lootIter.hasNext()) { + final EntityItem drop = lootIter.next(); + final ItemStack itemStack = drop.getEntityItem(); + if (itemStack != null && + itemStack.getItem() == graveItem && + itemStack.stackSize > 0) { + + if (--itemStack.stackSize <= 0) { + lootIter.remove(); + } else { + drop.setEntityItemStack(itemStack); } - } - if (lootIter != null) { - Log.log(debugLevel(), "No grave in drops for player '%s', grave will not be spawned'", player); - return; + return true; } } - drops.clear(); - - Log.log(debugLevel(), "Scheduling grave placement for player '%s':'%s' with %d item(s)", player, player.getGameProfile(), graveLoot.size()); - DelayedActionTickHandler.INSTANCE.addTickCallback(world, new GraveCallable(world, player, graveLoot)); + return false; } private static void dumpDebugInfo(PlayerDropsEvent event) { From 99121bd3c6084ed119fe1aa8307c40a0c374e7f4 Mon Sep 17 00:00:00 2001 From: Bartek Bok Date: Sat, 9 Apr 2016 15:21:49 +0200 Subject: [PATCH 12/54] Use TranslationCheck plugin, update Gradle to 2.12 --- build.gradle | 20 +++ gradle/wrapper/gradle-wrapper.jar | Bin 50508 -> 52141 bytes gradle/wrapper/gradle-wrapper.properties | 4 +- gradlew | 2 +- gradlew.bat | 180 +++++++++++------------ 5 files changed, 113 insertions(+), 93 deletions(-) diff --git a/build.gradle b/build.gradle index d40e7310..d799d0dd 100644 --- a/build.gradle +++ b/build.gradle @@ -20,10 +20,17 @@ buildscript { name = "Sonatype Nexus" url = "https://oss.sonatype.org/content/repositories/snapshots/" } + + maven { + name 'OpenMods Third Party' + url 'http://repo.openmods.info/artifactory/simple/thirdparty' + } } + dependencies { classpath 'net.minecraftforge.gradle:ForgeGradle:1.2-SNAPSHOT' + classpath 'net.thesilkminer.gradle.translationchecker:TranslationChecker:1.1' } } @@ -182,3 +189,16 @@ artifacts { archives apiJar archives apiSrcJar } + +task updateTranslations(type: net.thesilkminer.gradle.plugin.translationchecker.tasks.TranslationCheckTask) { + modId = "openblocks" +} + +task checkTranslations(type: net.thesilkminer.gradle.plugin.translationchecker.tasks.TranslationCheckTask) { + modId = "openblocks" + dryRun = true +} + +task wrapper (type: Wrapper) { + gradleVersion = "2.12" +} diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index d5c591c9c532da774b062aa6d7ab16405ff8700a..085a1cdc27db1185342f15a00441734e74fe3735 100644 GIT binary patch delta 36271 zcmZ6yV{j$`w}l(qw(-WcZ5tEYcJfYa+qP|MCbn&R;z{m&-???`p7U$>kM6GOu2sFC z-fQitDDc{Ja3p0pa0oaM5EvK`GZtmZL?lYs|5THgXEmWjel^^oR=jiEN0)mSP>}y~ zW*G^@f3KLJ{-64X>Ay7@0J`_zTa506u3#jig4qFMBVkz-subjf?2W-K>paaI6CdiI zqV3u5pX5^tdy9lj3A|>Dn7_Bu87OQp%o~s!PeOu~93h(=`TQX8a z{s!eBInO)jjy)T*apCnLG5!TYB7Co*h7aJd`LDm4JfJl*IUr&l!cX3FF5&(-3-5Vh z+wTZ^ivIKxGE7z)QNVDVJO!CgDH{(~Niub9TUVXbq~wSYHU27=qw*H+s`E>OOlP2c z&Ag$72+(=tsdj-}wVLvL^z)ZRS- z2(R^f*k>A#YJ{r}XJ90GBI`XA9iRQhb|gMomkK!AWSBqu^(0i|4w z&FsuIT+Lmi9qrBK9UX1mofu8+j9p!0)%29`L@>T26MwAyQLO>Aw%O=G=&kEsYb=gT zRz<4AkiaULg~HY`cAM$geQNbm*w`$L3qDD42n?&z{R-~>-8t>q=Xx?Vbt@zk0H!@u z6{Irt+pB1gCQl}U2FA!hQvWp)1t{4-vfmk$0Md)%qavwlr7$E1D~FJ*_x}7YLTkA3 zyUwxnX+cDBHqB!(-!07PVvU=FeX^licg9tryK91ZJC@G8={zQH8e7iSC(+nyu@OJd z*cWox#^sclvAd6ViHKY5zR)Eq#@2MqA%#(BolFjDnikt+8Bcg^~VAc6sT}_ z(^%mZjEVVzVv%u{_aV910;JtChxxHs?G^30RG;<)U+oo-jPU450PTL)Fa3U(k=`4p zd{eW3k2h?T>WjNdigz1Biq-E=iPr1z+lz@L*E!*=!(TScYPyb@ekZa?0K{21?=T$a zX54pajDGuF#fR{3M3i+B<|vN!Q1Z4E5aW>RlY}&rTP!IVV_uqV0SFF{ZDgpI0QhZ0 z#~lYvp+WqUhM$6Ph@Gf4SxMLIiGA2V{fz16Z;(%@aAE~iUr2Cz0^25xn?tzdOqmx*ZBlMdZ~`*WR!ZWid1u`z)UHo`l-%7YJ}5&}Pg7Ya z%jhH-S8VmN5^WQeQ<-CfYH>XBi?B6dG21w+vVaoZ)g&UavK2GgU3u(w%Xn&TB2TS0 zVHU(`%0voO`0o^6=oV>F95mC)-O_6-$&6Y$9}i~M)MN(>Ns6V;Bq&77Fw9}) zKS76q#xW7{m5=)@Z1Bbrb17icOW(*Ou%P?198F`YF*Q6FP?t%Zv+LJ7Bj^KizfQL3 zMY5fkQfhx>d`EuTArk2m8r$-2yJWnJtN_KPH}UX8{O7BW5k?txmu_to#?vkS-1#q$ zx-Sf93~i{Gnisvr6J< z*Xy*fma?wYZ@K%1HpKuQSc!%dal0GTg7}4GahV2^8l3OV2x)A5G+WIuj3xmlF~I9a zt=X7gIM^Wo#$Oo&(E&Xahvq$G#*4BN>3fZ1=K3Sm0s2Yzcn0Z-18M<1q=yRfO@=pb zH#B%Aey2^Og{;?ct|J6dFa(ayPh@FTW?{>AX8QAXCb0;anr3yKA;V*w*g~!5wecUI;!~+v8^U`TTL&`p~oRNkP@{*LXFgfZcDxYB`o|LR@ ziV&m2XO$8i%u}ZR%!eHl@#fz-nnlufrSz&7s|&N#ww)(YTxqwBV&k9@^71Av*93uo zO$Al>P{XzHPJ}Tj1OpV)%PzC%rpf`on9-Wa`|LTBG{XEYtH7qB?G;LLPJ!2fn6;@y z9p1u=!&j&$RXqjOw3nB$MCggj63Nx(RbhLZQ1E32Ez9Up0#mp@7+3w9E3|y@&*G8O z`#Mrw>t9Y%hm8i(s;XrJC07_T{h^Ndkv_GhUco0&#yqY-cExx2VaO<`a!(U*JfuWT zF1eiSkL-W4ns3?Sm6LKfbOPa&Ot&>semJLi^4S>FZFV?FK_Y4`-Vv#i)!}6|U^^)e z#UAB^kR#8sToq$%dtJO1ri1=w1HT=(p-Gt?;9^D;iVvhw4++vQQ|3YJ?2g=`QO`{~ zFrYCAKwO>{q#=TV?vsLMYV8|i+Rs!M{EINnR)K2;SDQJu(ZO|i6-HU$IXYcoaa8v?S(*{-&{m3-zWdnr=2~+uCv^bVobDG%nh@ zz@eZTr`q3kMX7rwBhojZ@?taKQEGUgVteB$bB@mJ3f;~1Ck_}QJpF2KPUp$&kMODM z&UgX1t_{d@sW!nvX8`Ym`Ac89YKcGI94}B25_yBh6QtO7M}j*-H02La1X|~{zzmBC zcMHIG4*&rJi%+YOhF1Gn-tE6Xf_sF1e?<529sL!{t8hUEYw-)tdu|SbW)U-tPa2b* z(ab9cf1>9px0vvXc;zIbu8m>sCym1z>p|{ETO>_6WKKQec{88}d{fXEs9r>BK5e76 zG4#WfVhK!cAGVx%R@n6X>lgZAT<)P}Opw(TCv7$ivEbA)*Oa~SIqaLQyRao`tjk-Q zxD}fvQn<7%Bzs!pvY%iD50MK5A34>*TBpF=D@? zfT4J!BgCKJpT#k!ZHQ>v%?WvVuD3k-kF>zAuXn^f6s2V8JqxgOC%VAR3M!Rgdhs6- ze4<;aP9!3Ub4C&IGH2leH{f}T5-{>h4* z-EC!A<5i|GeB3de~jm1uk$L2)koDC zew=s48J{yGD&sx;7GLf~phHs6|EU8WHfG}Yq3-VE$A6qQrq>!84aClC2PjgkP??6A zXcLIBrL3Qas2-wgxsN>YrVP^Amv12bvA`3s4>Oz1bKLspS4j*t@N$2x#LhRtOi9{c`ue7Dpu25X<8i?peWYGitS5me9@EP?lx zRe|hBAJ*JifYaB70BVIVNq^;-ZtO^FmyH(ax8!3U?2j%QM$*hk^}2<^`TvETD>z@r zI4l85<~$*+$XNX56%7dxR{esdN)I4;NUee4l&&L}ePA_Nqmo7CnSJPqOoQfEP`1up z6D2k3L&(s1<0H#Y{0y`54_jmHfPgh$sAv4y?CO-J*e2kF3giQQ)c~1!+e<-?>rd~e zFQg0UQzZR>KieY69mbTsDV_w?EoL-*n)x`35l;8C)Yc2tf;AwQ-VUA&SR=?o-V@y{ z-66|slhR$1^J3^pUqD!};SF8j0F>Y^$c6G^_HNxBJb#1!Z)MK7Tt;C+gMc_7fq;Qf z{TD~{yAYEdI-vd`$(t#@7V6i^3Z{25ca-Z|Yp@A*Ed4r`j2b`&{cc&jw*H+~aihc5 zmfVr{wyV2(B+LaJ@Zt{vmhu6GtxGe~0vd1>57xK-L$8f?@fo_8>(+W_ii>SGyZ!rX z_AeJ`&RG8echnG3&ZsH@l*0&3FNv5+*fBtUz0IrJ~(vt1Iv%uS9A8m%TFA&l;|QHJvICCBN)GHLNJUt zh*t5V31b?c53L`$(@^=!LNLV6-bFdjX7Q6daU8$P#p%Nzf4TD?bfyj?9=Q|a@urUI zhC_X zHBHB$kaV!(YPC~ggI}k?V}?J)ydrFoA77UD)TB#ugZ!YP8qX&n%Gu# zHWS<%a9z?7if#xRuS8coQ+v&A>FBz0bLX~710-AJ6|&=yN<6x-96#W@y4i>yD}CDX z?ky#Kw*e`33U0HW{k5y;jxrrbcFx_HknYn1x!)_DFdy~5wv4Ok$;{5^v zYws0cDlEx#CTQY==Mo_yyDK|4bLtwc30UGf#^{jfrItOWrR@Rfj7Mk`+H>W3lNU?- zA*QNKl+z^pT*R1d_Kt+~=Qk`Swv)=JH$Ty6ygI_+IBniA2d1l+?x-5hp~Q}Z&ZyE| zR1_rrgY0S%4ghzw$D#VQ^6V2q$WpS2Hh{Dm{K$h?9D^PZ+dopk!ue5Z4#yc@oc45?O2f3#YyN^X8Gc}af+rROZuj*xkFP#9^lnyf0@a#>ld=Ki zs|?v8YIlLWi3Ws~$4-9*@8`a)EdmaId&i%UnezAgN_t+0v7EC8h#{1Al~PK|(s@sp zb~;^L{1nIg4ZTBFnbYqINUetF{BdhuaU;*PzQW*b+Y7;Y&lb4%_+k|%Kd7@0wVIeqbsS}9O)!0ZJ5eWll+m&2x7jz8U>WXaJ+3n{_YqAisr$78-!2KX)UBr6u*-RjiKRX(ITrGskSg=b+;J$g1v(>Z z1ov15?soH2Q-7e@zue6Ml2-&*7WE{@q2i`PBaQ_yDYBJPfX;sYZs0#$BhhQ-e?#XT zAJTiA#?}0BB@jkuVNd4GrT4&|WO$un?St81iKNN1GO;LQ5u^W+VtF5ft+0#rF6g%= zwo76N3A$jrgjLjPhK8K(d?EVrBZTcTbL^Q_b-9P4$12YxR?^BlrIYC8llpJ79+9ro z=p#z$m|EK!=ya+?TqLe^(3cjO(b04Qh>1VbW&PNfXKqkNZnYngtg3K zEScoXMq{I`r_GpXc2No^yue#u#oK?RUp;h}JMcT*TalGDMFvG=mT+XDzR*}8`RtG8 zwCIcYu7DYx*KJn{<(}UG`*|*EUH5V`>jHv`yy&3U&df z4J!A;1u6%8H1f<}8BZ>YPx8q-4vQ<1n`H{X-rKOx{><%VSzUyO`1~E;$DNnH53k*a z)?45k2ie99HZTaIoXhOh757Ut%rVvERSx${R`8ow+So^}(9t)d|1Fgyb;0xKiUIeF zN*X8!#4fpA*o8iaeTT;FE1wgBq7nb5DEO|K>ra{QU+AZKx&?hl4*g=2c7HMysVezS z`}++$_dW3mg!>Cj;9STSsVcagbOHxQpUD`6Oovz_2l5$&`on#I*FbQS;FpS29Ty;& zi)eah4jqfwlyZUh5U|ywWTZC1L3(4>Yj%k4bAajKmhg4bO8fHE+-;Dw!r%A$N&Q^i z4_=)_QS}l_;PoyZN+fZA90PHLyE_4KgmvLqO?lAVfeP&49B^k{g>Qwz#lv)fTQGJ= zD=dxC1A2EO@L}xWmWWW{dcf{EguVcJxTL8eILACELc7I}+DL8>J>Kk)AGUi81#c5I zx`$p^L%V&E+z_6L1QrPixqT=$c)ZwsD!!-oiXWX1|)Xt}=0Og{opVDCES(9Hu?CS*RS-aaS|bUhrgkh1dj3^rSclq9CV? zfeg;_%?NKZ4nEf`gJSrOD>FAQOeTAYO;dx26)}h@Qnz0ui zq)p^yu-k1bGg8gmR#=rSP09@0K0a%#s&x@N9mXOpm^X+y)Ve;P(R{Wi-9zfMr$~vA z4cCvA*Xh6HI>^9X%|P4TqiMXQ2+n)6%r%BXsIgsc70zS`oKh-B28!GUa1?AjfMW~T zbf%>5WK$ZY?%kHE#4~GTv&P$aTnpCoJUK?BZKk4V&>C-lXQqBdIGo>;cVT%JbJ~wj zBV4Jf2*3ZdjC2IERCO5Z`jdpPLmcCsA4;NSqO1Da zTq+6+vu)S^o?ht4o1+}6CCdUUNSfisMf^O7MtmK-!wG42g;?-kR%5AA-X|&4vf7_s>c|# zl}^yYGP;qm82jVrpfYoO(Bi`Kr>2^bm{Uz{-VF5b2~Q^6^9$zb#Gm#fepBjGmTRvp z;4f#63FRQCWyARIbLkwU1<}R0lqL`cp`voB(ZR zimG*vvLjGz#CTN$P1e!%I zkWAxub{}CcDVYFA{$9dqM_op?`RJrJ4ajtTLPpFTZJPl1Q^z4zf5RcR| zF_s+L#f7F78elnE2J+lqH_+S5>T4gPKY6DrJp|L{CoNkG7B8HN+YXYFXKM5`yrZa| zPtz{&qi!$#gy84rbSSd%dcN7IZ5k5`GS@!l9%d(}jgQ((g}*&!k%V%?UpR_#q~Or< zCnqmk#!~T)K}?+mV-cDXgQHd_vUDS|jlwo!$Bs(nh5*0;E-kI0E{Ih?U=ZxTm4t#CTens+wtqD6xEWnd|hdGQ}R@ zoHUGIv4|p7@=)>pwMz|)3^iYMQiX=L;ehJLr>~~8z#O4K=6>(80X?dAa#E z8=uzS;GdK2fO${-xsyxbl#A7-+0nS7Tfy=31e$O*EQ16OIc$J5#WAgi$OUBj@nbbN z*?{y*Ot~FD)?aeP20q7BiTK>)=)`4A-%3r4&dZhs>%*Lz4)_gpWOd4d`6BxFKQgNd za-{-jK$+aMVh5FBHH(sNS8pQeRxdx$zXZiz4tAaHTriAUKN}ettf>%R13RD=FE)x? z>M9u?ls!d3soDt6;cln@0O+voWw90z@GCX#5Tz15iYqgSu)Q&laz({~jWD_x}tzmG7ybw53rW>+yKB=xgc1Ve}TDl%Kz; zB5N-I+*4QbQ1eMR_Q6h~^a5VfXvMPuipFFQ#!J>A8It!JqNW&0;e0Ek-lKeMJG(P6 z2hKm9}KW32rIU=a+amjAF}ROFW~0JQ-fNqxLx=33IVjvb<3?_+dF)s9`FlZ<>A zb}_cUj3aQW>D5!GWG!&td1J)IYd*+q_OLa047hcqIa(fat;a!Y8gV7T%N ze+GMN4YQ}dEceS#HfZncvMbPS^x$Zz+CLATy^dYWgts66e&G!TA525ld@* zeG#egdm`Ps2m7KCF5;T7xz|u7i2S(3xA?WW>z2C0j8|QyQxy|h)w2p9cw|TF5w*2E zi@W6h0Syl1_3a7RZ#<>72Nc$b1M|TAcjND27|KD<98ewziWz+hgm?dXSH2VWt?T&X z?5G4~L!axs!`%6&l$0J^&A6`7B$hGR2G*NuGJ8%fjIAL^yc_*gz_z9?oBpd%e|_)s z{7UPGxq}T@P~YF2KSBN|x1N+x#UK8vR{tS7KKt>y5bMY>!_q$}@=7A_3xu1>4>O)o zrV|kNH1ZeEg*~a@R2;l8&Q^B|AOC0#AFAt zBQuaO;P*V`x%#X)#1RS;YU!#Qd_`2I8U508`pAkt>gAWiYz&)Q!QEIH|J$sN|7cj; zl|ij8gz^}M2W8SXW^F@|0W2)zbX?<8n6~e0aLm%pD`#+${-$pg)!7u|E3>8s@ifjV z+g@xrMI+28?QPWQVxzkAoL1gMxV9Y*_0aF=RzUr89p4IRP(IOs);0bo)XB&w>qa2p ze5`$Vg8d%^7jZDIGty6PnJWPoFV(fAKLIMLL?@S>#JkHU*8ysz*e_1}Eb2ST za|`>kJvxlPWWBaoJKLKm7rAA9NwZ0_A4#XBeg`l-?0IBw>!yf7-Ea>UIUxr|zZNtT z$qZan9U?!?l1d-RIxu#(Hupxv*vh^HXTSc$*7pi$Ul6|70QLL9zc|G51a{zVACDe; z+;+$t!REwVJN?$Q&ajO^n6#_PCSj0~ zZ|q8$hDe4Uc6z#=7bfGnWRJ>;xK`dkm6J$1nB~GvrS)IB^W4QBR(~Ebfkzj|sI#AS zeKba^(e7i5hqTX{@Dx%U1u03UarhS?_?=L$2tj|5+B8N}LguqhdER4j_2<9-1G=1RD9^^5)J^7uuLD;rc*!350HV zr1o8z?ZA5r82pUx&in(`)Yq{M*YVEbgP4UpWM3zyx8s+3Ho~*9Zs*{S<$FNJLD&0a zQ_v3zsStgA9}qQxpUsbn;(xXfdpn35hB|7Ag|%6YV;I`7YDFk5{<94)!Zi-0#2d@@ zOzTXG5csdIlKiCjj(y_&%d1T<)dO7qUG9yg1#!l8W~;+=0~!O}th)PiqH1bcy+7Eg zR*d-|XwK0Bmi9?cCl~OvscQf8!Sl?s8KB2JnW^pobPlP4-y<72-W8)@>bvUho$QYf z*)wpM4C~vioEUZNF1((dJn%FJ&2wBJ#u!$UNnmt9o+Vx&Hoq1!?4(SOCiC$bx5wbM;jT{%!edD+y8#g=klzOwx02U>^DZ{9ZRR(!xXjkBK6{6bgs< zpPWYsUP*P+KOssX?&7^!Sa#6Z5nOi{d03(N+dOb?v3WHkF)8}^jyqE9I($k%Hn?cmD z4|)2!$NO)u_bsB5;Nx8}$Vzl9ZQDL0CjK33XOBK(z4DzbCM23Z@TV3H_u+W;U$5A$ zUd_=O=J% zHG2%c z#>bvs8`wSaW5pyTP}u^4Vkid9J0W_@lhat*n8<0Pfg+pixZZ%14ove;e(?>Lu;#M} zgS;tYIc%Qi(i$sze(-b;-k$f$D@NBC53I4NMAXVF2?Le0CS)0{6H#78+{6@fwEi)8 zpc7}Bo9}pK1dF|5s33pNC3s+}dvh_1FEw~IuL(h{)=|Og>6lAmwL)9WLl-~0h`}VG z(N@C{@Gms4uhKZfUv)|2gI7~|y|-K$Tx^Z51xz+0iX=|SiBRuzEb&06lhF1 zV_9j~KjHc{@9+`(M{grs^$YgAXl>>!@xSBgD)wJqgTsUll;FN<_L*Mkl5I{zuNRVw zx8FO$`uA_~{$=27qz{k~%kS+Fv2N7wm=M3mfDmau9rbD}$J#O2Glvb^{J8O%@65J8 zfvzs9!;j9{PX}zx+nfrGO6`(*$ug!fm>i_{Uz4GX!nM#38a383(fGLe26FAOn4(K1&jz$1wc&2of?Nq$fmYropA>`2iWL3g(&7|lA>v6hElAS zcqEmqL?+n;N24?ZhDu?iY@;@+9J>l7up=Z5aDKr$1wsxuw0g&9&Qo`?kf@`!}0 z;jT(nWu&=D=Rg~$01;R1T!V;b3=67gVn&{P++uTKu?5*t6~4(S4531XX(3GZ7OH@C zh|Ma6ZMJ2p^=zW45)k_vBKIKsnFr=&+ zLPL5qoThZ4y2Q3fvSxlnSB0)2l7CAVJ!*55DusZHY`$2y6h zFab}#YEdT5wJEkJ=zPo}XNr$8UlHkE6uGLBV6TmyzQ-w1lm2pu#k=1#Dz567a7~KE zru01S81abrB+nI_)%E_yz9YH_Tz+wxy*EO_5?FM1i)&gsWMv{+POgniT*^RgXDrbT ztIvUrlax}0HK^h6Hs{*KS$}}Lsx<9e@rr}gG4q%=rNd*XxvJ9^*lv7)h8)c`g{aGt zD*kmaG|^EiXvq{_k+Mu%ZBW37ojz9AcLxwL_r`{HIERdM|co zA1l!}Ur(R=yfxktNnjr%(S-cqqBgD9WZ6dISF+Ry(EDk!ra4C%-qSRu7P1)2Kikt4 z%5Zw{*v&TyiAY56+I`DNr7VvmfjKn=uN3y?ZEo3;w`cFhS_o)PXIN@@zHl*HLL2jv zPcN1w`yD*({s>pR%B;l)6jIGHt_h4}&ASuow?l>KPkn^wL zF}j3k0jq01GwKA6i;zpvVsg~T z%qDa8sodgb@Wjo>2OGZN;XJPGZ~pDE47)$-e?@!P2wko}ncql?hqt~L?(m#EXMDCj zGEWdIoyQ7qjQ)aX0*%4jK<`K+{`o87eOcX*fP(;lZM_SS+17CAZ()r;4NZvOic@b~ z0`pM^A_lv>FuzeT!HKRFxYnLeT~;s%q13Bh2uxU{go$(5K@_a79~yiY9(7|wcC_Oy z23#1G^4bCX`+_o5a9@zr9YH`kDfbw7er5y}b1CX10%ZW4yFEGNr z<1N6nU?>(9Nx;&EU?~*Om@nsDwh%OOZ2< z@?MFuJulh=wM+$in^B<(%Nt}pxT+LCx>*n7)IjQ@3n;)vzp5cEToFGJNV%JY- za>u%V+QP9z4_WK82L9>1>S|uoFkid>bJNtFUYG21TQ?BK&ROPcjh9~9Xg%u>IL{h7 zDI9|Z>O04=>VoMltoa~UQ8GJ~-lE#!>#oi5MP8$Ot?+1NuE6TMucT=x?&{yzGzGE# zG#G+{xfY{*&*Tl3FRJziB3txm{Z819I!)-yk$KeTk9X?#W9aS@oJPUA^ZeNbwXtBe zyLbm7Yv<2PK| zaQe%ivTbf~;kW%WQ$z0W-Raxy=X%pwsCV>F+M*LmdQc7dl2rLoyfRmEfBdradZVRw zW_wRI;}>R~(pbclIcYh^^6Mtq)&oc{(tSEuf7E1cl;#W~uSUXRiW{fv9m{gYziTLf zAF`&q+ZAp}so8(62@(YJ#c$=0a<5tdq@ktq-&@R1$yiMwvkTdWVbGMon% zT=!-|NJl))wwK{Q}#ofcw!WInN;n=agnp+NIyPKKRxjN%N!NO5Y69#~bv z#*I=*VY6i>qKz%$y_^@K)%XRjhYtyA@s%2uafyxn7J|$9y*7d^AwGwr42rW=B!o&R z+ibgN8%SLAaW#jsa8KNug>f%OT1vL-bikrr>E!UG*R!mFPrC0ViG>^cJ2#4~E}Ox+ zO=Thlv?jXuPFt!bU3f%|DdM87L%EU*nr^v&blJt4+hN?GEYzmP)$LN@e{52dv}Uqw z{2q$1sQ6J?2)evck8rm$LEf`0IJ)4KYc7kR0RrYyZd{?6T}P2j>#R8wRAIponEngb zeuub%VJdSLNF*z7v4nXzl4`{PCPyG4n?rQdq9NC)5WO6ZaT#L6bMc6%5lgu_jVi{K zn(>oc{FfaYs!F&Rs}sHoi8LMN|){$MrP~Z;XR=$ZaFbkuyxi8 z!Oaky?My#d4)z7W$Cm+8S*yjPh@*-+N3HHOLP8kSJvEqch(gWisC#O97I;Udw%Z>BH=Ok zHTniWICEraMBh@iF7?_#B7X#yrIW*q5k-8PNIRC2boywnj~WN_Pq3g z%Yi1I@_FPznq`!muFDexrO6j7Nk}uHASoO8W6nUDTj zKr?)`PM7fx;8G=tEsym5)oIWY7P{n=7k_eW&z1S?v)y`iM=hIdtb?j*I##vRF2<2N zLZ|sn0-vj8!y6~H(FNn5F{<)vus39>07=~R^sG2M`+k~+iUQ(}1)jCoZ^Z5auaoOu zl65PWVvxuWf_l3AocH1GqW&)sXqv8?ARHL&mDoW+21ed)9Wea zmcA2@V?4tLe1n}PT}!AIg;{+zK~DjzA`c&LDj-%hvvE)CW|BTEXWi2h-;y=d*NE)4 zQn0etH3%!QVi2n_#S}Pr;dI)hv0`urV&|AiX-4EKT>-kr z!C=pvyLuOjOV0Lsz8G6z6(d?L5XCBqw&YTq<}7h@s#yc9e{fq}7o|AML_K8ziU6=q zf?0~*QT@Fj)Q@Ggdrd;?{4}Y>C#O}&Q_XE z#AraAhGsAPbHfOoLo_7HJww(zMb;~i8+$HfQhh30ePZ{X#KD;EOSBpQ9OqOC`FejE2Mxjt;(ciLz%6ElA1H>BqY+(x(D1K|1t{;r9 zYm@!hK#-o%YMv>hS{P&{g{LWkS^u6V6{=Tzj$iTW`OLd#QTb$=Iz9DhZvk6XbP9J5 zrW_UjUIt#~%?KgGMq~`o8aRI|M+iiHyWcS)@tqd88S^GquX>0N>AiTmmzn=<_n5G^ z($q#l&#q1@gy^eK*$)eaHYB-%_PcOy;^?r*HUf&nc+Z!Pido3cAk)&240CW?Ptj{}$5u({CT_a#LR$~tEU2vC9_2E|BVfWQL$ zHRDgCh?gfY{%TBDMtmbuh^xCP6&+5adE$Ycv*s~>|6WK<*oxl?15Zr2(u{rs$q^0t zE$8%#kD$YkNlK4g`3Ya~$tOhg$pYdf<`M~uK0H%pYRP;FnVwW6lFr=1lpgCXI5sBD zl)TuXg~-^v2J=zDPhwX56p-^p{$i)1H?-$tBromdN4?eyE7%EswHGO%wa)N*J(7$4 ziPi=7zk7a?sVqJ&3U%nw3d{#W4tRX3nVW_-fb-06G2sFA%nt!h z8b{9ZV?}U~;~F^w;Ix7v$k8X{CbPk`L_<>Me)41E8tjMYv{`pDn8=4}CU1*yL@NKr zPMYlbYWLoLBBR*%l=J*}Mc3mPembLCcO5bHw69rF)2}`tJG0{5L5>w(V7uz~3_0oz zYVv&yF*#^SYH)e#cZ86;8h1be$X%^Fa7d-!uZ2;IuZc0`=KSP`<7gxz(V1n&@fPmm zECjHG_vmr9^jGb*ImX?%!~18ik^4P-ju{SAmECC!h0fngM}%r02lwQ~o{CCa3?fl7 z+5$G2an;#3|2C`e5y@m>t0l|E$DS1kBgc`hi>>sULyT5r%Mo?gxgCJ(=YcJ?M$$0x#LMyL;5ys#$Rj`aOv^eM^jq!68VEhyoNdRZ zI(#W&#On_abzN6wyDTVPrD`#@xneElP09M1ZP%cm)@!g6QkR<9x^ht;ljd$`EHlOx z{t(=@VoleSmgBr2%1i=tCQBaM8d(Q-VDXBEnv-a0q}R|Gpe*rj2AK4$JWZ!YnDTI+1D}zP>%RI{XyJa1mz@ zA#s^(xTAx@D03E>V_|WbthwXik4{|_rTB$o)j2pvO0qcC?Dvv}o%t?+VCnsl|AWH-mkRi@0ZQ8^yUZ2``%(97l-N%1$oNfOGmo z21Lh0T1;R)IJ0qOGhQ{lV;2!$8&mnrqh4xPl~oji3GYIf-oZR9tX{D@t!c0Al1lrI zCfOaFhTa=*{cBA{-2M&6$&+6iw!5juVD>D|A zyK%bO@HE5}*^-c-wvBD-G@3U0a!(t&_>n91I;p@p+4r8`@v66wp*CY}8W19jBgeaq+5lXQ`Z`*8 zGut7-CLcFs^->l-FJjQE^=B?Fdh_R3V2fqtzj;`SH3cN$jJ{4!^AJ$fk{KN9Iye{GY+Jux4n6v|cOpSJjkutAhz`2v!u5FiYi;_Vjqm;Ux#o5j!PEA%fobCvYCarovC`lPe z-H>cXeaSsRbNyT#OIIsSRp>5K`DHtx(YF}v6kXfbc9--9s=!);w*`9Tw0jryk*9%w zT((X#ZJDZ4kmvpxCNKKz`@I=O7CELul+fIH1|C#@qiKFjr&ce7u;ZN36gV?`fht78 zTPe=jPNEH=CmMm;LP9-n}D&zkL64Gd@<2$X05k_}JXZGT9&+%bh<-M{WSHBv2dmR?IB ziVvY6Uq7DSO~{Bz@JE31f~;&mJ&iFvOvpVF(Qm0_yE|Eb&7*WW;V146hwK33AiN8c z(O(h~kvd;V)?Z=N-T=njG8X(24*X*5`II0`%7^^s^{O7BO{)Ok;HGxiFc1c*`06_x z3#Ww7n55a4g?M?U+wy!d2(O%OWVR@j>hajQTXA=Y0l2vA6^zLN8ci zvzmasYlSJY-+fsSetRj}^wPkBhSf~zZ?BGQ^*-vYVGpvcNsl?=8}uI}TTER>UczoJ zuW1&?=5|W#%GIQKcP}I8fzl*-Fp@#{Aq0tsu%%piR!Gl{r1l4=cX6i^mA7{UGjsR7 z@*-di{5w8G?(oQ+spD6Nq~cL!QGuyQ1bY_*YJ*Aw?u$F4cE(^Qz0o2xb&g@=LbWk_ zfN!uC4)F@fj2%I&yqa_aVyqr+c~J)0==ix?kSxsi4UvK6@Bf1oNPpGgk~h@F2%o2C z)tuxMRGHb;n3r~|5lT5lbtk3fqag` zBq%$#_39%0CRR{s4yjf2wOyK)+yrFcSVq-C{ffz3&%N%4c$PqeMd{^}B-kx`w*e*D-n+j8sVOGF7Z0yxa$FuLg$Za8vzB=Sh)B3#p~%6C;)D~J^aYt?T#jtW=E z$~6O^7K@aoTX)pei!AIOKW=2N{{7NDyuAf!_Y%itXGW=}^a*n{_5WMS`p-iqn`_b` z{pTRz*Haq*zfCMP$mBdtZlL-PM>G)(0dV+ey0!@W+TA(i<6^f>!AwzUn0YJFD%6FM zadX^Nd!uv&v0~uRZV?mv{0Q-0JnN25f^u5Rlkw>ekMC`#>&ecx5D@qUz2m1eT^^U=rg-zFJ>`ZJY6Wh+j#>BR5P2V{;r)0uODivC!Y+Lvwa3gKQY0frj+7phGEvWfw6U?g}PgpI+oCLw*5u~{D z_06IF)e`fTbW6N6qfyVa0LEQ^eM_C*$-W&(M%1p;#3Zar%AgBQzh(+^BL*GsI(Oan zZuZ%_5xa^ru58i}|LRLUbGH0(NGAfSs)O2a3(R&w=~7tH1p=6i9v5YT2GxJox=RxM zz1G2#&MQg6(C-qd9OC=%v-96YRY*EsVdG*jLbFjNNz8&2 z>;qS~q3&)LV5p4*WZa=E7ko%cl`v0asVHr;wrhJkHrP1flUt6FM|B02ql~godHM zzGVLNjIu0!dj6^im1(S7iu33@^qqIZIG=<%;`tfa(R-tnCTW!S@eUo}#`pEMpgPLO46r!yu zEb}+tAtF_CHQ9jQ;6$86Tv)_ceC9+RWcQaqd0uKyoabR-sYN9LVk>ImMK;?(9&cfZSZZL-m0IPip_-KGXGslI!nH0#hP`DfxVcNH! z9Uf><8CT+sb*mgc-4za--53x#X;LBL7zP8ruPp@hFlnkoWV6s8_9IMN{(~sog;vyD zbRJ%Q`RJLi7P+MBOIU-;ijV~_A%YYT8GT~kO`?g~om$Y^&t@YXcIDO0+6kS5A}8xd;0Xc- zQmzv(O3`oyAkTA0020-H7luMPMr3Hu6cE)qJ`^|>!_T$J5{SFZ7-DEG~F+8Tl zTwSi=oNq8`Qz}=oa=MlLNO-hzupjN&s9pw9a?T&US-`l>mH}p&_=v|6PqoH2j(ig( zlZL%zKObVY(mO>dc*wk|_)Qkryz>*N99LAmrx!5~QY*fY!HPXijTP)p3sj4`eOK_> zt?*X!WIC-(KR#?pb$S(-Ku1fC?JpAm>$UA1Ar zp1W?e@t$T!v@K^h++o=gFaClzV);P<7+I`|I6(Vks@8tMyj`J^7Ja~tz6lfmsRue8 zbHf3qV{?vc7CZ(!0k^+8djcnH(Tw=ya9}PStQe%YmP_RMAc2*f}Rs} zNC0|7kK845ubeNTUNOeWk=Uby)FYJ92MN?yR26r!-;K*Q*hmW7zl#Oqxm$(s$sH<2 zcj@LPh(kON&CBqJv!g zy1uJ41UvIa+8Ws9kfi3-md-4jif0|vx`&@6vS8<;PHq0b<$SsCC-*lV@3)q-`N0Qe(vq0I&jzOTvDO}6hmZbEC7*Oq{RKbyN;C( zu8vl*oCGF@mu@<8rLXLj_P4FG>@TRWc%>iWR$KU>#mlqC#KZFOE_=&fMSkATmFVFyTcXx`& zocm{ete9O>>Gubi4*Bu)IpX32;pz55!gMSsD0xR)<((@ zL)W`g8f?G}E1I-tRZX!AZ}mojz$BVg*j%RZU~|@zDtt*!0(gfs*;lb1VTUdA4cMPq z4f!$}SlEn{^|8W6yS}{#nnX83JYO5wUzhGJHfnzzcY{lJEik~hNbL%G+us|D=Cz(g zaC^8QqO(kecEcZAsdytCN=k%+m3o$JP+F6wzE4&I( zC)b$cNlhJ%9lHuwtbJ)Rrzgp@lzI?S(Wu__%Fat?XH7@i=}MRhyrnB|0W2yB`o=SB zo%$mYzEMQz7+C(@oo|FQ_00Aysl9j->(0i9`MwEsfDV`Y+PJqKv;l=4sLFWs89Qd? z@x{HF28S8UQ?6ZeN8@)DP`#pXQTQlr+=()FV9l+ps$j^L*~-@!8; zSLMhkpnhjpg6)P9TI` zsui4_+6`R@X4*i!Ke4wtpKiyJ-{{xIpZv>3bNZ;vthGZ+ml7(n{f$V8Bpxfw`e(xFiD|a{MGT_giVD!!Bz5Fdx z$LEZjNS{b2Rjm)vP<3Kl=mp!qRnUU=@?F-Cpp+GGw!$T>XzZ1QW_*&I!6g%756~KM zH^n|pnh)y_<^CP8MT4aBUF2<~)+f*>3%_X6=4jmFC2+f`iE{xEnF({k$6^e6Z@>0^ zKo^r4%i_8@ZHX1;Lg|7n{jDh8rKXzmqZOK)M>$NFEe%gz2FZ14NkxiI$|hFutOifF zFLzb2P8Jle=vG)DYn*$`Xx9GzvY=i^h1U^!RpD2qI(K)Y@CfN5Ot{|L%3KINYj@ z&rHDRGu9+SNBfw`)F2`3Sta`Ui4>014|Bj`OO9!iDC1@%pe0%QoUF*lv9He#5NFbE z2>h9k#wkbOQsva3uGov}pcU^5jXyt%#lEgW#c5*dXo|u0 z`uhrBm{Q-j*z5pRGT#8AXpS=w5N!IFE$H5C0kzQV0kwbbd=^zjxB{9w=kE8m@I_Lr z*&q+FI!`#&9VT0NLaSt^V3iwg)IRhhk_`E{8sC!v!LERnYZzqRQ4#)Na|lmp)z1** z=|B++hcu@94_8!pNUiy=aXTa9Q};@2x~S|R7Q0`nlezap!{(K;1Y-9w0BAbf%%OB- zxVYS=66TiGQG7%>0c5#^eT(Bc z77|i!KQq8m6YmB!a)z)ZN3}nb(_402s{g3EyYGLP&D)6y=(| zNM=utQkr(UQAYg9-0LB=1{Ava;!4P(8()q}EE=nydRDdPuBhC8;j+DHu>X6tBFLX} z#wK|3oe7dHwDmFO0#QYa?xop6@ysx}LsHQc>0R;K0nBW0;&%d-@kwV%|_^V zMuiB4RU^?UuIv)81E94;tS}JijM(2nkPT(HsdWY=>|1Lgr`%?{L4G6MDA0Ueb9P2- z0x}(3QtR_kpY>2|h6Lh2@xk|)b%MVGsD?)39s+uu<}hE>HzDMq%f)D+>SXGF|1xN- zD{JFY(q;p-HxWoBFurTNzB^-5FWW_2YPro-`>PMLFAzjI8vvtd7ow^U7p1p&0U2Df z$G~?^s?OQGhglsI8ME+=LiB}miD~Q&ZBs%|HJ~Q9Q{(q-&K*1=c>jN^Z~xP-;##8D zO(kerNCIqD=H$6BZ5409h2d~)jeQB>kTMO>F&NT_?hLV}XwEd|T?TXZ5cVQ;d&Lc2 zE@OzZH`p9&CHI6pXLwIIXWE`S8v)fmpAdh0qa#_4jUMk+5q?M_qlk4BhR_qpI+AK} zar^J6IudFJx6aTa&^X9C%ud#r$$QpJza3t^Apmto1m|$xXan=E8Bw5Hua$VIg;=Gl ztW%pSxB)jpMW^1ZTEUasb*8H-V>Y;!(Z_4Q0u-8QwkXrmFU|wi%2#EztGL(m$|_hF z{z7leRtn)CCmgr7GrK1gj1n$=;DNuzb_5aL(hQT_8}B!IxAih0-OT#a&uimAJY$#Q znghtwEi6>Dt30Chmm>V42o>Ad4z~N^bRNR9uzg_mHu{~*XNPIQp_P8UIMu0Bqq;AV z-GCUKR%1I$J*4v#Bz@yGonaNf)xhE0sjvUGXtQ9?O7AwjZ60+A%sE+vVLDa4h0sK9 z#!|UiMHWcj$e_lt-u+NS-ln41!*f2G5(F?>4F%JfSL-xuZ8^ZtaLjQV#tadnM(*+s zxM?kO*d*rJ-L$p3)a5$B3CR}~pvTz4QfX^H`xCO1eztjO;wU+9$G2>f>gi+J#Mq`g z75mZ&1PGYVDCb|!!K+S+MGZC0!JJepCeR!Db=!8a@OVEuqY~XF7i zLT&@VfCC<{_a$9|h~krgeD!(2a`>s_Pd~Co;~T3dGl}eh?_jyb?#bKfh_0qxN|%RV z3tzfDZG?FOyw<~)Bfu~iDQ2_4`eNE~8A9aS9-(4B6DoJ1B{m;8vkfA>N=^+9eut%5 zb8R);IuVQsc8bf*XyuzGXERfj#A&JGBKTJ6nM)&bJ`_pB2g1Ez1`S#^!st({IZf9C z=Zd8M?#Eq28GU~-pM1HX!Jp+4aFTpbyZSgS2;UQo|e2o556u0-}7;)8}RWu`EPgB!&5I zG{ddCXLK4M)J$5hcahs7+WYJww)IxNa1 z2A0TA%RP8yHt=6Ux?t=1H2F4Q1S!a->_<(i9T5Q%uhcvPbY-bWIdnWnW zad%DEK5_BjEk*TN$>wC$ps`Aej77=N3zP18{;XATcBpnU&7}FtYZ^(8O{n$yh_?JH zbU4}+_Q%cArpChbAp5OFvaL}Yx~S!WmE`qgcZdxDXD0Y8)a~6HGbHJlWeS| zjM)2vC6giuN16lq!ylaA*TqX-7iBn2O%6kPCIC%A+ZiRNf?Q|_r+L?`hJv%&8rD2% z^EvV{glM39aTE(f9H-bc|5Jx$C4v)%^mxV4gz7M9rvR zt^xbmk?%10deVLGFZ_b8hH^$;rMo0vlfRa=VlIrExtH=cV4n1Q{N--T{6PiZ;Bq3a zFdi9oEd_V<2VCddl)B!%j zq{!~E_e2&xV%)@9^v2nO<2*ten~IHp1b#m-FY^jC7RNPEhf1_M*n#6A;~U@vwGKXn zg-z0j!d3H|4_p=izTU#N*W(Tx5e&Sp3%^m@XCv^B>oe4X!;W~07&SVDBj9L*<92V- zK6%oPGgR$TUqWHT7{FTRWpPRG4FQR0)yh-$e`-`IvvN}`R5-5#r?`Nx>MUa&BPbHz zH*=NAFFJvg$w?Nwf)lb6EVaO)I1|v4+%8YhT$ez3GVQhhDNT7*)~}>ttK^+M*JV2l zbWWE*IYwgZFT|~d4qD_k^XCfjWW(xR--1YRY%PwxnaKX?cuD8v43M80%K_;0uQNN< zpJ^Xd>O4DAsMpaM4$!O|IuQe$s7TvZ&K{jaS17B?gQw^HlG%yQte$5ziK$U^i#XAJ4QOlc8B1)2a3PPzzb)< zEOuMaoPk!e;Aywr)owdDk#Bk$%{%71qe(!MceXa)TL>c?n1F9kELWGx zR`(*)6C^CvfhbG9t}1K~Y2ujXjlCUsCC#&{wtxMPLFj+|LI0D;Gp)2{N`QfYia~*Z zIDQg2RYIBzAJ}(6PhrD`i!U(Pf8J@(b+dr{pVJgz7WlsffXPa=S@H+21N$igqCemL zPKfCx#VJz!pJ@iO7tO9gT=R?iPW*U1YdtCfH}NzLLX)z zcl)qTnj3;&2CwyxIR`C0Hj$e2N-2qhorFqiY7!hW9P>Xqpm>?`(SNTIZ5!=KMO`H z(U{}at4O?+gm%7xr*OzZ$aI}ttniCd3FH7i_VIiKhF{gr`B@U&5j5}wVdtv1^oMpv z<}&Ama{FAb$GE=mhj}^B5}2ehPYGDdwZiD!hj+N*VFtn<{xmU(dKF0&lfbb3U`Tw0511}OA0&x_@0jfUd>mssLebYg zIW!JsJO8IIK>ab*{!chiKx->2Ap-%GQTbHQAt*5q?Dt9U+5GyS5rVUhBrCaEH|%T zIoEmD%slH@?|5EWUR;oU0#3HmCZ*}fo6m>h0dVaJy#!mHfx zl$o5P2LQ(FhjKv=_}R^4oh%<$-oh`ktn^gY=>>_D<$?r1fv0-8;!kW#Y{+}g(RSGa zPTdj^HWvImMWmR?6M3!JnS!>zd?jW)q9r)36upMd>AeRm_%#bgzrfx6KlqgSP=XBN zWmWGEf#l-i3|=$INEAVN;1%v4fo5i3oU*7=jR7ZV*eRz>ucdxIF+4NAiR8bd2 z8vsJh>R-3mah}$`^ocuB*fk4hO!{6(7~-~Ft@&CWN7%Mdw?p}=39?mQVUKJOZV76p z4bv(2=vnlJ%)Oc-$S(!zC+N)}n^Xzb*e%RR33W`^P5aJB%yG5I(uS(8WCL|(hD`X; z%}YaETvM%SkwdJ%m}SbCQI^Ne`oqck#{jpo)G485y*gQKHaH6}5&0Vhb=vZt4pCTg zYInnhX^kw~(RlP6V_JdcjT3f|it^qZalOk=R@R*|G6E^<%Y|qyVkp>RX~U&)j{SGS z^>voihvy6hw0gCh7C$_lO#3K9bI`?WrURAb?kwq7bx?6Qk_8Rvl1iNho1^n!S^#|0 zKkDYnGVKnTbqg@Mhp~P5coy6aFvPTD@X^w+v@B#H*ST35YE0nT);od1=7TQ zi?g-8z&2KczWuMEJu{BB#4$yM_UtiD49hxU_0Xl+rMji?8WcgRCaPsC(dCT0+7B0q zuCXVE!PGbC_OF>3WiMzG z9ijB*HEY6-wQR?iSBybII&NG{G$h1He4}q7XM0wxNUm9J;ccx;GVa>6PWN8Rv*o7L zylmX%?c9oSN5}9fh4G2%tN^QZeRs!keh3i1OmWFYQOJ9Hk1;|~8{ish(Tce3ssVTt zb~YVm{1EOgB}2J->O!#Gioj9+Od-5;j!_ePSqn@Sl7_%wyKbmTzvTt} zYm@Y3OM#W!tn7kWiBa^nvOSl{*6M8b$GgM!=?+?S(Lh?dF*RL`2;oYTBm0(E7hr0F zXlQ!}viPd)c6e#9XTYKn@m2UH?{0Wt5}nb9W`~C65cvV5b)(kQs7sXspHa>YC>%yg zn8Cy*Yy6l#)xR=kuB`C(wM{Eh?xK4BQrz_5#ZPs&!^sT@cR46y-HlA#zHk3 zRP@*B7*5H=paD~k(pD%Mh%RmM)2O;?H)actzPq{rwMk?M2*8$vE0&Y*HNz>aQ-y$T zA$KZSpBrwzT(7XZObf&{_HcS`7F_Oe+Yi;%oflfF!&5J%GF>Cz0 zj2pI7B9Fu}x6%YXL{p>M;VlT=Y1L3f&%=h4GLKP|nWn;|rJT7J$$*-DZ){!bTh`8< z-I@C)-`34qCculM7oK2l{rv95D@5@)5&INPt8vZD0a$6}rrTNk)Dgta=n9q>%8u17 z?FV>(?a_v>G3f+y(XXL+bz_K~XePU#66JXF9Dw_#F-X%Z0$b1aLp zS#{`$p?$y&a^48M?5bU%h(lW5iU6O{?bZirzzvenCSalk%Zp&g_7>Euqz_?!3*yh9 z?(&O%00ELs+b`TiGYEp?nnD92oOV*D?xdq#XZs2NfV5+{1{a)Gi7;n^q#0HCFYG_b z^9y|sr!EzwcqtDdV?57aCbtJ4!pT%kcdcu*B|*b-#0*s7@NeLs^SdR3zH$#p0Xci* zEI!M*Ie=UF08fYH5(LBmPtyHPW@P4kbwAUAhQ5&(jez$TPAeuM_c8*%L<+iOaEL$j zSRBiEp{zavr!fV5V-zz$jn*b$&Nix$(`Qcb(e)E5U2eybgOmGq`KytHubS-yfMnW=KSW(0ALncyE_B4i7VSuK&Mezoi1o8Acqq}Om`YtzutCdXxRh{`LkC|%YURwN^Xv0`ISHfJ4q9N?WUoQ1A&+KdTFc%Q5tU-^(o(oNWD zY(Tu(Xi7kkP(8;QNx$9x)@PWX`E^N;AUtHa+&vGYt(zU!X_GMh_56G%>V$JFjiR_^J7cSrTn|}L zQv%70d8Nl6tCeiXuV60%?Wcb!J~NQ{33WKHQGfZWCjcN{Rfy_i4U_$ z<3+UUUKUpcQHZi{Ad{WcAFh6YsJ&GjOUGNRK7~rTD36q0%}bI$GX1&;6G5} zw~y!voUpHQ$%yY4z{=w1CIAUIT#Q@AZ!HIZ=q}0u{7pd)Ddbd`^eKWL_~05^Q+J=p zKD0#i9+aZc!45!w0)3*JtD;tc-z4p^Y5L0=8l z>%jPDZ7)i_ij4(S&naz7kwhaS+|q)v&N+Bt_-o>2Nt#lB8Cv820szjoBoGWjydM$0 zu^gLc-NUKWRD2>upJq!-=B+*@JD0F3{moSbJW}!dKJ*_&E^2nag&rx~1Itc;UMUEy zIzN?W7v%~v#@7z5=5DDjoM1k4?a4l z|2?RHd-XV74ES&xRRwU=g^=MD`un7B{+23X!9Dh5(ApF#!7GH$g?r`aX$mP`dJ+1< zPygl5OPHDmWfJ5CF6D9hXwf614i=s!SP|5S=;KbWXem{DszpPk93iXNsFNcE(@d1} zM~3|fDhV&2_-{(U8{*NkA~>${D{-=K=`g)T$cHxzH3BfRiW}fH3ops(F?*mxR53AK zsI8_xr@Yt9WiJyyoqEvG^Ayg!WC={r51;FS5G@#l(wPWmi*Vop+iR&WKR31VO+W*v z>Q?G8UA@4xVG%FcBmJl|_)~z-YyW7V5w8BwIQ(LgpcqSNj8wSYVeKP$fMBNjG7lUL zSq>jfPOKDUCknuVzsDQJrbw$Td9r}6A(j#s2G}sCc2;E8mY{VaQ6H^U5mv|HmAZOF z4m#s*jPijgf2I^9kcZ65rHIMJj46=K7UphE-Pe+o$d=RI6z6s)x!Sj0oXT?IyeXo7 zfmk1inbq-u>xr4?(>kl!Q#Jq7BeZfC;>7zMZL|MpmKN}#+Me{Mc;n$`1I3ePtlrjW zaLxS6ZC60?tl=Yv2Lj2Ok#vAjFfXjS6&HMmOcD91#5|{8A^?WkKh~lm9bRuIcY(TS z<;;B6Jho2<$JeAMq$zvwM#CpMTVO`)=!1^NUP*y>CSzRa5kJ_gmF3npR&yk_XyGMg zQEaB~_!B@GDz7wSYFrUzN1qGG)N$fB#TWg3(8NUFOo;;og41&Cj|jT z9-y`fivHYQyBcBy7&Gb95wC^@gRyy>?|-`w9zR&pk!z|MRXy}Zq*Oo5&^)LSKT?sw zU(`+%!+Cl~?DId^az-pA0X$WzzH2It7QWo1F4-dS~X@{ zw{X*^{ip@@=?3%ZPz82CdAzvaQ_j#LY4aq; zP4S0_g0eDBm4mW?g}*FseRS3ppGI-ULv80KKIzynt@_dgO95;8=}Zi~_P38=VuF7C!G?|49sGf; z{ZGo{s+|aNDy`_C+kY7fpXY+`^KznmV*vsA@=oYyAINZ$?PK$fg$v_d%dM;` zkv^hx?82@QBfAwzzxC+M2}&or7daN1*iT4&PeGg=1G*DJU!T~zKzu=4Tyd=a9YDBb zAGqB^*y|I_@CLMZuNgS2i^xK-pjo-F;X7#S2;4PbI`8^I^G3Ha_uLw_eWd+}za#i( zSM^lvgX=SO2P6fx6OVuBHrW?V8(c3r7T(}S?9BRhx%U0)(b@xY?-f`Ea+No1ZHKtA zr$VLDuTl*0+NYcdC*NyzhnxB0ZN<;3ekW9A>w(sj>ITtl`P_IaLd zF^%(k|I5WcJ^ZkoryoA;aMLUoT~ZUeB!InjWn=F~)&_<=ELnYpgAAuoe*hZCLk7Fj zsQwBuFGB1O*}9Syh_2zcwFtgAv1jyPb-|e`Pz(Ta)(a^2RZhwOJ81lBrO}^HXz<<+*(vp#Zb4Jtmyquz(pwa0 z{Z(zGnRjPr_x_85TvN*^H{eWQU0MDxOY=Z+^xV-R?(d%_Hne6==v_-5(W@?0(I66u zZd%qJUe_-ukwGRrUR2)0*+B>MCr{wjmFIdeyO`DsiIT zcQnuuDb}do=NOjYFEH`%Q1sax{fwU3p+|O9BtQvoY6rGxTUr{vAs`d;GVjEGu`t&g zPBN0@JatM40;=&OuSZp&1Jb2iOP~V-vL6aMerr~^l}*`_h2Ks)*grqOfu8a!quw@cyG9`fqp+=+GFl7SEF%BL|$#FO?o zV%F!^m9yE;){{ASvp)!LICI-z?f-BKT|fH(|F3Bi?Ehd>x(Iyp1qr~(`~YjYg`b5M z-z_*7rw}+4p);`l{IH36`Js&RUQlDgC{AIWjINe=OVzBdB6lP&+FnFqlKEi-y$HrU zEfodzasG@l9y6TJn>(B*+m0JKJ>8!`e}}^%&=#=kQ_sjHR2eIXqTJ!h(3KLEX_yYr zeHzAiEB4*k2Hb`);2Vfqj{xf?Th5c@T8&ng&O4?-M2-`8nY(NQhfekH(n&;J=bB*j z;sb9k4JHvKoyYOUt@|r&nn(R{9!AoTnz9i@fD>cAh!I|qpWA|n?XZH%@1PlB~ z+z2c(BC`Dp$_s;po|-irU<`qcQ3fV$_n{q!g(IDTO{l;FRuvOAEP#R*i;;tN0vu>J zhEQp1Kf_}3hP*jbE;gHItmmL4U48`Z^G?kD%a@Eh|@ z(@D>RN9Ojbz9Q4GGXRbKUTs(=xXth%;lQPRbB_Mq%a#B;hr23Pal7ne?E@9*E2G!x z(#3b4{(jX<&6&$k5zZv-#g{ChTT;iy6A^(QmE_~lq+s)R?ImUWTka?y$pnx&f`p>k zZVxD|8knZhH4*vs%QRy>dgNIDbgo`hc`AapQkCdQ_a?%x6>T}4d!^xfNKLZ@qWc={&LM& zHaXp}aZJOJdgUvy^B11mn8NF*y}yQ&2MX*;!!moPF`dtrqraTHS@}VO_L|Kof_)Pq zP?sZ$95}5QN_SOYV=o7=;vVr9i7xdSSS(m`VCgmr6ug2l@6MM~o-T5^;LoCLj*bO` z(Z>jP=b;TIkk{VGf2(m9fBp_5W9#wmqutqfG&|x+H7OMut&hp&fEjlj7fl0api^e% zR%wVu4TrK-lykEoEA+yZt*1N!FU?pR9(|EIf18-+KzR-~{QU;N;r7hOXPV6X!|X93 z!f8{Gfp_*x@H(WAn|sq3^TM&M==pKny@PfWV(!W{mmJN!xa@f5AeiT~74CBxQzmg( zLPu6MZMkqfYBmF>$SfnDqe}e&)4stgG?3F3$|X0~5GFbInKKY zi+hiS(6UZ{Na$uU%8lU_H9s4@%7NY-U*HBJCI^I^TTdu_N^BQCUaUVa?WoOg@K^h8 zx_?F%2|4pD1Kt$>KxDe#qfMS~Yh1te=9#|eetVj^X{ro;#XRFAmF8e!dpzdWHLsQk zHoJLH+#BrwW(&BH?JMd1tUtttO_-@gOMvXB0sKgQU9pu>zkb0B-=dqGiNx-3j zz*jY!)3Qh|Eb5Jkl!cj7yZAzR!NFYe}i*eByoma?bH1G^#C9 z@88#YS~I<|1-xf^zZ}%)0wC?c|A=#hY!D}tW)9(PSBker$dOhOPnG1{&GABGRZ6Ih z0EQ9S?p_hQ`IFh7A#aPo5Sk%sc?0dehRC@)-3j-JcD}_2SBM?pz6y&ipO6FCan}qG zlcVy-8RF-hoV!%UDvrHLb;%?M4N(*ClMO7qwvl0;vP~GZW-v`Cb(oS2)T1!QHF%O* ztQ09%Gm7PvWi%D5j0+UxABovJtWF_+1C*w~2Gk^YRk$`w*VFTuBST2iypQ<9Qqa0k zXV#00Q^cM7i#)`d(5foYv5Gw^)xi}l)p2Ps->Oy0)4(`U`JkIY*NY7_0wYlNYPbx8 z*H$hPn&%w;QC*QS&7;H0z+l>R%yN)L;B_F&Fj+LKMAuL*2_Ft-GO4msK-0)b06g;X zZ77e@+ZAfk%Z)i>LAq8S%^U}vLdsZ3h3nw)BUj;u&yk{V@B);qP16W66HcdH2r>uG z@Alf3tJ0kYoTQRldy+f^tcg+Y;EmZUlAMNI>faA=9@a`WMk)KMpWsK=+TwOpVO@y# z(dEa_Q`{YkxC^e1_5s@cI;!;UfO0$Brv}j}no?KR?0z!%dJGFyHpB=h7(app8b&WU+VieYm4J;Zq%12t^R+jKKa zBg?xb^KzUM@F@t2KvwpTyPvSQ_ok}A_n{RC3WOeB_Rqq(sk^H_X!d)AO^S3X+Z-?#qgbgRTuOR2E@^Z{C~G%#8^j<1(v#O|O!4iIF7 zqki-GA{b|CCTq;6i|pr2Pfw;f7P}r_e|`M>g!FZwjLGx2^vFi9dh z{?pQVsYT#~QLRn!+hfXs=9_L{pv=y#)vLNc*Q(vwf{hfEyUJtEl z5a}mj>8J}9Q;g1A@`Y9BG4WsO_sx>d?kkSs)yB4yv_Q>YS4}LiftG_s`RQZoche6&KBX z6C3q=HzwXw^|D-&pvLG1wOPhcW-c2;rJ?+2Qkn|2xw>%H;Gn-pQKsFL%`|(jM=Gr1 z%y7@JQcc`&%;X0=JOtRO+kh*{U+Yaniqo+~-}I(s`}m-kWCN<)+&em3tw(t9E;Lpv zSP<@AU%OHCZb2Kg5A+jCXGQ1oC20>DQ;(gO{kYnjVJKQ6ZH4q-6G^;hYgW&tS=p96 zxFwNuI0_}MreFgOLw-&gbi5+@f6Zco&FW7^sgZ~!*{r2+0^$d~uR_L!>w zX75oAgJkoUE(o8{&g)PXI^yw;8lPWzl5lMsw*gyfM^co&^(`~ zb#aRDvjJP#U_EH%U*;e@`t7YdO^w7gfm=;^Pn{r?jR;*2zTYK+e)eMfzXO^aOdJmD zhoNEm6Ty`Kq1q+z4%E@PlSzttKWGKbuQ9)p!w_DEItt8m% zw-UeD5Wau_iLEkuUjY`Cr5cark zPsrJx`o%%?EE$EHatdcXjJzia@@yH5tk6a4Z4DQAg>2o`S;HZyA{(k`24M1Ne2I1Skk8R$FA$7M6@w)~w0_d4KZ0`==WNlFObnP2Y;X z3;yIUIJz1_k=6Fu7wcY6wEd8F+h(#opT7Rx*wOjM6^9}Ck{Cl}qBA2An>p@rTd>})ZvJ^V1?$t8 zY9uKQDY#Z>lxr<1syC=8Mr~!cq!CDde%ZG!%T zWK~v5-75{-hL$-H z>aX89VIM-|PK-5l+yT>k2R@Pl6TYe+>LyXTi{EXK`W)%B;%1f_6Gb=Xc3nyej=?~t z<~@PmeYxfMkmvTOk#9jf}h3Fte_eX{HiXpE6-9*l(?@Y(N#FR+RHCZqh72U! zF?hh84(6p@Y_^}!`4?bSCaLAG$GW9cO*(|GsUTXWLPK#p&4aevHn&chO4BdbHR}D( z2MFWUgO%M+gqNN{nan|I;>TQ=1@1`jfc(ydQG}e*r^jcH7!&rN(V9-!5Fm&iUGB2) zn|aFHEoXhfAWB<^KvU3Hdj!%5rU;Vl$_v4UAH*Ag_ilpP-9@A%V+W5#ljruv(&kXj= z@aRC0m%kc^8>d6GwRf3=iO)cqn0jt$_Gjz1_W)r%HU$QH<6lSEa{p06mL=5n~=^fKlq4+0*$yK8+_HE6 zvjX)?mJ$`#v3FC61%(}#f$iLj8B^wWdTOjSvJib=vCOblE z??o^=Q>T!J(}G zPgpbBowYJE?+A0KG|J7{IQ!f8Zv}lYm)V6iPEHO=`8SG8t!G~lcIypq*Gp7dYO)Ol z0<5~fG603`NmB;a)BUo*EKg)rvzYh#ddD~V?c|z}xKqvNKCo(NYKtP-D!>yn!pyFi z-p&}wUwyBK8uU|*;Smbp2JO1)pmr}ByZs4#fI|&o^<~nSFg{wBEeE1j4MN5&zz9KA zC(XZ}X>4|CLirExctw*TgK<(6Ilgyr9sAl3(+&^8U^j$9NHc-lHTXB-Y zkH&0tN@8CsdAP7D?eHEo=aDssB|8_ngg5G-#V*Adi;}NQf2a|kvmp4LhM+;1=pEyK z7ZA~AsAt}U@mdLh!opv~FIi2fLSRYoL2d)%T-ru(q*^yhWjX~4HIcdhr>}E?imC_$ z@D)&b>_HONg;+pQ-V!V?c?p67Ye1q%DlSOsx<0T4%s05ZricNdOp%5Pgi)Y^!n!QW z0?Vru1%)&dQjsDQ&8SQhmHO{2E)Jd3oHJ+H%Qyf3&)k3J-kp2rpH)RIZ`$jjNxw5w zsXN+&52B7HzZl5M>6`EUXraDIcz%=XPX$%Gw>?c2Y_F>IX&6a;Za6(Xxdy7`by6BT|va;WtMJKQAlS&?q%FXEY5rup2ewEODq;BXfIdVSqyW7g2235*AV zKkgoH&Ro%YcNeQaJj>-nh9tIwlVO&2>4GD2tT^(qTmFO-mU^N+$58M5Q{u3xwj7&; z*d~Uh`v*S!58u1od05b`C=qV@_LF%6n@{(J%P(8x7k6(}Cdjl>!)!uC*`E9xjIGi4 z^J+b>eCE+SRN7sZcjTeDaZhCtJG(S@_0Z30!TpbTAu*XMuP=O2)rv2pbhAQB-#)N$ zeO5rNdv%1T)loF(ndq9gb)jL0gYEo9_YZL^PCKmF@=szZSEZF*HnXTM@O|a6Aiunh zqp|thWhIN3Id%UQ%{Vd0jBi(Z|248~u*ohcg!Qt2<-NJ8)PR7i8C#lL2h7_acy&j9 zcRO;aetJMNld*sM-4X6?R`-U@zxc{Be4psV=LJo^=*taz;+>Nz7PWS+wKi*JD%wL| ziYM*Ju-#kGJFKK@t-;&{HBLzdh1uZu`Tr%UrwoZA~vbxQp7cwuvD8f(m3YV7aXYsvMhbBZ5Ni;IX}|Kemq z>t(|=(QGqtbY0=IuN~i-bX}#gRn8Mm9RR&cs`npsFy*X!{5Rb0le=#LCZuN zc5Q&ySI3tycvXO+OVp2+5Tv}fHj)3o1&sk6EliiZPsh!38n0>n-nHwB0lW@*CgfL1 zDq$m`%nHqw8BeDzYQ4SxdlRTc5>#NpD+oTN5=sjt$(C5q(7?mxTgu>I4`l1tA#_LP zjtQO8UAK53W-*9yCJ2{m)6g(nshBPN6s~YHKSC(nv^7b+T4%i3?7q03R+xbvhBkA5 zU5;e3E;?(>L}AslvE6GbB#H!3Xao_135601LkuRkOhy&eRv2EKX0f3kEHeYCu7uPJ zMi|zXJ7AF5shj|xGigwV-ncxs(FDV zRm8y-u<=v9@fGrSQQKH!t9C}`8dDvqB-{fZO>kjq^k}vSF{LO+LeI4T4Bz)*p-VMt zqsGE5k2|N5j)h9|b4C2|`GYCc0M` z@zgzVv_Gv$+(7gxy6{*qB#Pp^Dhr=dNgxkhtqsIxxUJ&nl)%AzknIVmEgmIpn~9bv zjWLL$-heGn!6E$#P__z#Un}h}I2LS#qUI8yd^La$sJ?L$gdbt!MGq*Tjy~BZ`S2e$ zx|F~|*>wyo28Vlq?aU9ra6pRj6<~co*4bkauNDQvdcd$bgg%}S>x-;s>(cFk7u_Y- zn}EJODOg1LW=kY)QR^dC-4SAxTd{Fd8%(i2VpRtL=I#d2S0izzM|zYa)Ie?o@A4C1 zP8vGf;DM!O26-mZH_-;*eZB$Cb%ZsU3@0LO_6`gQ!=f zR*RqILZdl=edIXAI)~%L1^?;xYUsTOqJsnIMJ;3XQcU=Ls342#08b;%xOQ(86tlB5Fks6#N{3u8}VH) zsBVLykZh*+Wmxr<7F%p1eHjl0N%V!wijb(IKmzHEX;I-5!RzVn&7q9mfXauNHxA(p;;-2$<&6Tk-BC+Pm9654~ znl#YqNKkkMX;3g|ARtIcpfxFH;RJY6sQ*O0r& ze}nxuPLu!N_(K2Rm_!ANO zvQPvw7#t4g9%ApPWI&0&O;H4YKY?jBcqN!5;~n4S^epq-bW@Wzzn|Y1e17y8*&;=H zy#hmh>Yyyj#j1oMbBO8HHd8~$2HCy?tPM{4P`uAEc<#DsIQIx>s0ghMRA@;jM)*ok zkuc%Tt#BTZ8?TMikH5714Pa~__}l|&=>7Y*(!Pa!s4ig&InjMA#B%O=xPYf@tSm&HD4T&VD`zALhDxRA+3J9??jh~tA6lTKZ2*Vv)=&pkdt;fFVzZysWr&Mpugb| z92b7to@R*F+dV$kd#(r2rPQV zD6S@K6kbVZNiE;~hJ*y@3r+IwBHkzPY&-TEqe80#0fI|d*e`s>%kLcrET=wIIpC@j zIe$WKl6M}9t|C5IOJDgSJJ3+tGQNbuVvJ_$kv?Hqc{7r4VpeWEVkD|+*Y;|u2}zMb zN;WIlH!NCgR^Kh^696uX^<$dmygn|YZ`EUXs>MlS2}VfB70NJQ5{hu@-$RDgeo?I& zMGzYu!Yl#!H^vSr#h9Z$!tYtRY@-3W^-)SCeTO};43p8n|K(WDlLkmD!L$}1F2mo8B6?~DfPyD1rxei=} z1F%jI4y@q{2C0&I)UqKD5c5HoWxP?%a^Od>gw)U;L5sy|`e>&|3}YZK%o7Goe?n5> z5e7r>c&J^;fRYO0iJ`3+*@~~Nt1)bxEIG*JlG%zOt4)QOZ;vkH3o}5DfaD@mQ>+zN zPG!Opm{2TVF+h{EjFb9zCRnNo&5#8X-VDAP9OdK6Md|e=8bu^4tEwyXYoZ!GoV0Rh zMayBR7fYA$6(bAQoK%%qnbpO8HpY84aE{(S<-U2taoTcN zi`dpY_M#i+&T-pSn(vfY9``FuRcwy&U&RPCzG;ytWya`9|j1a8jk=c(|)7 zb0goPvz#=y3%bE%>(Va6nDDTP#+hIMwER->!K1%bW@dsbF++^tI%J_f=MdI{6_$9L zjHak9nTwh&n@C1$rfE3b52)I2iUtq4)b+|WYdFu4TM_HhuhyB4B*`O1`LK*M$wh93 zHXk>8F#xmj*P4%e@Dm=MtG6YA)yjwL^28d8W$lf`H2wXyw^ho0A*YP61q0l5H1@ngY1?z}ITw z?@(Hh$!Qx@6T$oH%#Zx%BbOreB3<|)XfcP}9KeoUF$7w)lptEJ(k)9a)UGD@+@5E^ za@3P@em}nAEr=fME-5(u0UG$n0%kurc-=m$(w^L9Yc{3+6$>GFBzLzuZp(Wi^4Nus zqoTI*5~!BFi^wvbQOvWZn@eV!;*F;$9`*XzEmUUDo}eGIe;aCdj5|ns`L6D2^$kd! z0HCrLqyGb%FP@6^<*`@txdRNDB6{Li+N1TXqG}@P50#OsGl9B474119z4~w^I<}J^ z*3Knq{-D^@)qZPpn*E-@_PFe4zLX#b4 zXW29(su}h~1$nn4RZcfiA8$3*acW^(o403ZV^4fcuvO>fcHVYYVMVuvomr z4AtSxYqbicK>O1PEwR~!*veTT^CO{_>ujN()!zm@@MOkz)Mex^nIlUEgRN#3R;hAo zbFj0~)d^=24K~|02DR6>yY|;&-|3(s;RYyd!n=IA(1>Cg*?Z)dhD7xi{P%)-<9JQZ}t?y$ujO?;$!o z7D5(+QEPNmvVpQFKLa+|bq_SD#@Oh>8M@rY}MkgPF6A;;pQ+w>zieX%x1v?cy_U1JS+W|2;(@re8o(z7 zamT>4I-=N@W!#C6aSKVz&ftcu@1(XPK-@bD>=PCgy%U)?F9s(0IoPG|`GRxvy}Lz= zJE+eQ4Twh$u^=o|YY6O21Q3)>q~^5GmUE}C*vae?<_7)IpE>QKAjTm z3*c%jMFya(;hSj$@kiLxV`)U~+)>~QBQ*s2WG?QAe-%%yj!Ala|2>@WjoblA+uX@7 ze#b5ZN!yjyEnO8KK}P>W?8&JMGDdk-_{m}~mw0NvDKc5n6ubiphI6&>@jH{mjEr6w z{~O_d1CJ(Z_%e|HLXD=si1gt9#Ts@OzlX3PfPfs~fq=;Vi#7T%(EuOD8)|6Z$*ZYV z<+kUgaVCI5yod;G-XK zST=5!tI(h01mM}klx~-lHXj4(FM4_2v+lhQTf|=<{4YBo4%k154yYx(98s!J*me>u z-l<_s2xv%L_Bh=dD1f_cFeuV(Mo%+Q!-u7W-}_|tJNt&Z!=b@Juff6c_W<)dAJjbL zJ4>j%0rR5Q?BKZrnC@4iIlHJ=Wd1&yJxsmbJ!+y}s(ow4ZVE#ndeJ*qw(nmE^i6Z> z9?vrry(4q>;&(X|z0`Z&uY3pXC?g1kuY`Hs#QU}Wph=^VN`TyXnvFlHc-qV^z)o^2 zs?5r2G}0|#xE(y)Y>XMYne-;+X|*yZP0}G9Yny*efg2`pCS^%=)gF~P1>heSMS;DU zL+#cg?dT~?#nI~R&D`E2Y|Lu?tn?>TB28Vlm1d~LLTGu|GZXxDsH+Z%?$b-HpGkqQ zA_l;L3!)WCngCx(nYD79DW=QW%BfRSW9GLokrj9AJFsh2*ag>lEYnKsFe$yJRMys& z8M%s=%Z!tiLaAinT=5q0GYijYDqR_IB_i>4W!>ba-n!JBrGu>)5IcdEL=|o28cg=(%g&nf)F~GUcPQj=L_+cAw~-f%iIK(!E7^&)if3GmBUPfd|M%9Kg^oYsN-{h;?3j+CXVUOCNf8nsp)qQj ziO#Swksk?h6v5OhM{a6EIJv10n6gWnyI1NRN;j1;7PU*2wqi85R!4azliws8|Il1S zLUXkKtrcot@*Q>V7j_*q$HTVhET13oejAh7Er2BDx;TYTvgE=hKV7f4pmvqWkNn`} z6?E(CbC?qekbFn}sX0ofmvo2msVb1>T`aV>c%VgDwqX^a*f;yD$Rh|z9UK={A<#c} z^t!reLrZk)&fI>~VREG1ZuL$T*-mF^1(*9;(mdFAB^)Vpb7;q8b1XHwkD2&|Q^(vo z?q36B+eD79GjZ3Y!e4g9%w2erGM$N|XqthtV+czX(7iv71;ox8og?Z#_j1AXzJv~V2#3xVzd z<>sE4Um;d!SX(VPVjWW+aE!^AhpCv3eA^wtRaVOCnx=p*hcED_G`FvZ!caPP+lff`s-%5q6(`lA0DZQB zb!;n^LygOk;``B-@nDxRy8bk~9KKF?C39VFE(eO)5UMF^wh{~PgRxHxU*%1UJW}3& zEG$0}Yw!!o1m+wXf97Rom>W=`ZHjV2V3bEn_p@yMmxP&WjboWnJ< zc3%=}2xNETj^RIc<-&Xa?Iq7;1kn6SAl1*E`%xlE$Zboipjx+vJW3K~4K7O@s=y|~ z5Yk4(c&oF3^KSi3`*&WDx+Aiu!I#A)%%a=~0GER?xX}ucX=5zgdTmqgNYNM)6g6?} z;9eYBJLAR08$O?&ukx#bKoXZQl^Ju8t6{1__fB9%xhrO>SzK%2VO)`R9dPx_t$>ured@LHqqvBk#(3 zOl-PM;TJRMGdbmn+4l0p?K7@QV>*z59L8R@#%RNJ(dE$_X8vnkt}$|PBi@%=g-&a}Ou0i#=>mCJp=#Ty4&S6@VnxFt^}OdqsQv3wFMObs=fcYCCA zQI9*4oNej4ca;Q-M?}Y3v|`NYgmY;7Z0Fs<_L^5PosKJUxQQbi0l@i4HjmJcCaHQ& z9^sBLoxtcQyYr7Ya2Q+IyU?6Uf{h4|Ohy0|0omvqXlc?pZc!&&<)U)jdJrj(FykNx z*vN9E%u3jSv+60%SlkatjXhe?z zfARGM%kQEyDc(~Ruk>Jg;Lk0X4xe&-o#cp9CBVi zTdy5U;U9Z5c}vF8)3F!d2fUllzL#G6zWbpxebPeO&%58EXY$2wr2v+l#AA8sh0l!W zZypKP$5Nr4XGFlk({J!odXp>qk~g{d?ZTU1XWozMf?o08TA6){r}jZAf&g;uAH9N` zv<3coeyT@#;CJ(oZ&Hbv$2vhR*&nipAN>5E_-}r+_qyLTW$ZyJvOlylKN1h1njiWJ z`#&I$!WkWv43yKrbO5M&2$V~>MYCtg1BAxG042Jk{6SN}^I~?;>cSJW#s(cR>Y(mO zYSdblcBxi%2ut=AFiVU&wRScMZ_z+q9gJN>K93j{YP4QT3EpnCJy*f=gBD;tf?YUZ zc!+_EW2No!HUa8d1c#uo(~3@g_Dn1le{Z=l9vxrskRJG6dvZxPLQzmw6D4J&eJPh3UY-PK4>uZ?V2Mt6^yin$i2 z1ky@Li_y;k zNSn&2&`5uqFT`*)a-d{M=3IaX7@rYtGzhp=f2I9tD%`(-i0KJSO)WLMvXXd8(O9h4 zP{=?a50GFi8Dei0gn&VHZ6{nJa-$-IHrXkPu zA5F23N9K|uApH_+tR61B&lqMubis`7Bc07un%|B>DSz&e& zxVh4JM5&3KYS^b@m=ko;o+9$n$Ncp%*mlPBYi|`>oEuT-tC5Hi+v}r<`9(Xp3Y9qx~@i)*I!WRoR_LE4T8|ER}C7Wf=6cV_uEmt z8$(KcOna`ZlFZBY**yG-dgbkLDB$qe;m@C>yblYN#_Rs20gq))mOgnP`TJ8S5K;~X#; zW?Xl509D|mbmXn6>>+d{iLcC2xtLZw{)dh?uLKu=$<`u; zGHWkGXA4$7Lrq=dh%#604HfhEQ=YB{FJol&Uavh=y zXS^xsEb4W^%c)+PUw~~_LF(oJ%;mZgd(SP=I&1jTcsg=rbUHsbae593Oj9a1z3-6Z zqYzbGBm|jN{{Ga*b)na=>qr#E=!;arS$O2w&e$w~rbOQ;}T& z2ii+c#bu)H;V&Ia-~<|O4Cb>g<4+Uf$H{}fJmXXN0^EIU<}nL#0_eQ;T@P`JcCS2W zcU3ToNHMC?DgV|`IYEaa-%5~j{UvsL$Z3IXhzhi?kab}et%wcpMkUHA4Y$PBCv}OW zI+BZXEYX?B!GCdnq;421#%g{!pqAsi&)=Ev7La-%0w+o-L3=y`hwc?HouQ?Vuj_aM zSE}O>0nj#AIr>w;hF(-)UkW!P6=_qPO>-5Gm!c*xBO|S1MIe%5<`p!ZhCG>52>3m2 zXdhdSC_FqA8!7N@vdL3-bz7*rzA`DAurP|o=ce4yr5M^d1#I470-jzc*0e&4@Bk3 z(bwsAUV29SO;OMyjw@Qg7C%R7E^_#*t0HgwM=q>94W3(zwQI9U3y#~ViP;Mkkz!y1 z6!3`T1^b9k?y2PHbqqEAj{~E>3fK{^%fHbpeo6peX8?l;re9!lVMl1|>0G*4JFB`| z_Q)%A(2lXUPUAn!D~m~!u!VcmFVvPg9rq;A?|r}en|*tM7bw2BZjAVi&vC@zx(L;Y zcCcYNsJILC%%TMDi)-{@_=^6H^bR(=0$4EXl;DScvI|_y8yfvter-Gm{s;nZh7GRr$Hj8emQlr=AjwxqqQij41o90 z{J?ajU#y!Tx{jA{)kdeV0&;bBPrs;#+g>A$ba55s0=}KU9pics{5&A26U}UjIRu{>g~>WsX=SzZ8_uCO-Guh%fBUIXvqG ziJ5-s<4pDP6TR?++aZd>Ep*bM7jNK}MCKcjb-wJhtp5(ArYP^%4N&_QLSKE>DuDh5#_p2ZE#dF(fQ|w07srBOnW<;odh>SA)KNuoA1~^jmNs;(e z!S_h`m0R>Oz2ps{O$BjcS$=4F@0s_+lQn~#0v{(X;rE~c_jV4HSDYk^3vIbgbw5PU zCD|h4M68*jeT`By!!Fe?ksrlocR+JQFSysT~XgXE28F84(u z-{3+*E2r3 z#W%N>gXm^5(;7qPv7Y!I!$5(2{>{!I5wg8qq6o>Prb|Z$FZqy_Y+|Z^7m*ktrb~n0 zC&EfJN$rgTMECg2&fxJP3Kh6NP7L}l`spgj*3ywZyr=28$9SIrIRNaEoPG%!JrC7uuRR7U^+EY}g=^4HG<79={*e}<}`1Z@1z z5LOM)h^_w+p2M;u#~Dkt$)FJWJA^@Am_gh_{RsGDp1&v)R(bAqDTW1pD{t(5vj9Dp z<%`kZSd6n07p)%1dH~F&T7j;}`-?!R_!(ONP8KZ^uf`ZNTaE_7ShhfM!JxE0ENokT zre#9Tw!EUJbynH0N_m~$cVB-)WI-P$b?vR`KL2M^iY^K30V3GOr{CGYAmL`BHu?G` z`pzOY`SgOo6Q4MzD`)J#jX3we;K(z~M0L>ecZ%uD6gT5|l>jv<$LPtbfZF_byg=)F z=uV-&6tnVq^+h(t)3%a7{)ad7H>Hwp`Dv__8@>Brs_sG3h+%zFeQA7~DY1He%BoR$ zZbeIZXk#~#pj`UGwA4c6^!qzlIsEx`Wx5&`d5P4bP(3}qV9al$Kfk^V83{W$uB;&= z*7%*Ce;DIwBXFw0B;ULxMlXjUzQ6eY_er@)iXI01|MJk9EFsYU<)IO!^)Ijf-KA4w z0s&F|hlft=`IQ92j{<8od$VjwXggvv@cK}m7|S3@y|9i{*_g2WM+HL^J{ z$>=|C3~FlP^sko7YkjWmx%sGn@zwr!aMpZI$L;&}XMfoK z*#7D2yMc@2f7%@aqC@3YZQcuxWY8lITbbH}gWfJLRG~}TR|A0C-yg8?+od(JSG9xM zD>{@#N_FT*bRFJrQEf-IO`L6@bqk9^Y*PkolZJUucD&f3z3lTsZ&&U5`gQBq0t7~+ zd=v&G(X1WvB7a}2-}*KJLIhkE8s2BnQ%tF4PZ?QJfyC zkWZobd&vTNugBO?eU#6ggy47X56s>^TM2d)?{t0S2VTBj19(1#(f9}Bj&4!V_($eG zUpty1C;^0deKcjQeM+~*k%rl~2P^k)IQ)Lpd3`A5SAfg)B|cm%E{_obZ}Z}d-CKi| z{(&Cfk1jBf1nVbaFOFJrvcaHMG-;V;sA`I0?$s6kKU*u*3TuXBiLJTy;*TDah>&QC zZfP3Z~>D=X8VuG$EjlVG&QJvRg7ozZK@c0fmPbBnGX#7hebiS0_Xz=wk(!4q~hEUz=I7xL= z7^PPji8C8zrFsUY@QU747ISsS3P-!Mm)~DK3YO0@UIp#b4p--B;)dsM**|rM_;2OGe->};KgEXtcc@?W zh!-DEmT*5szK*zU79RMybx?%pl!YQFe2P@{i^Q#6rajSP;A);WZkggJj>-h)YJg5| zan^2F_64g#njM)3@^@G7M&1mTQjG%|$+GbQdW93g?krU@OJ|}lMvIHs!a|+$KZGlF zuzoKlQ$hua^=OgvEQ*xq)<#gg6qOX28j)EVt+l1zHERog=D;w_*@ntSDYkQ zT2G`k_fsumD{G^oRT9p>mW6taFrhh@)~%b5Q_S)~7RBn`Gx5U6lkvgF%z!MSV&sEE zr2|!c)&&wa>q5==T_Yotb76`-)Nlo-_3%;nvFJMm8b|C;bkSf|N8m!53VhOl+zSR} zo;3Rc&n%PI770^&m0@&Q8#D~Yhha8Ro$81yr8gO~*70eZ43~2|RYUKUVbZ|g5Du*L z*db88+R$`Ux}NAlDBL2{FaY`X5%3j}EECn4Vx~BF@>*$zu=iu_kzeRb&ZkADW?~0d zxm(|`h`tZY53sD&^q_i-733Q=5r2{s>gUL`(A8UChZ-W1MK^3|D(6Qg$Hmmob%NX?##Zb2ebCPd-!}chs3ykbfO_yd-CnB;p%_TBn&ZDF6s2s@h`%NzEo_ zuiU@>*c9y4@PDKP?lbp^!*F+Ne?EI|li6i{bK}lp8H8n2c zX@^s?nKq)$&78{4{N$?h<}yimjYcjH_JptlYdD!hs&YPG9qn~MPS6VIE|Ke=UA(I$ zMIue?%ho<>Hq3}^A25QZvr9(U*8HLr9_UT=Vy+kQo%qT)fP~!rb9KvhSScnBtn`%s31U;TC&_beL6{4l0ItjOZ8h1{$f`ES{mX&r*&@@N|_Y4z}i&A=3*3ftVT z=)=r!s2=D$7zNo6L7dKSb%oYW$6whOoDaaci1$;W2OR2yKF|?69H5SQ!bT1>&gkj~ z4B|7S{a|EoG~%!;iIHI=thY&o4lgw5qM2rjjd?+J?g01_V`d8LCvaa&iXuV%GvV8~ z6tGE%F&|)8hL}i}<^@ibL@P&Y%X*bXTBvvIrE)9UtdT`E(sG9unwWm#a=9Y1@nzGR z@BBVb^eOh8IJBm6TUvxv_E|y>wy+fA0M#ZA`(ITj^=34uc?0WM!N>Knuz$-OzXSEU z6h|D1eE_Q>vgh@fa2f$(R_no0^U=}^fpR+jkgdB?HYJq*^e9)K(3=6o79+Z=N2`bR zRqVCG+42O}zeNMxsK#m--de-Q$zMm(1)%QiN1y5?Tq$RAgJreF7=lrerp8MU#2sOw z-!6AoGy~aqg(7leP7tp;;JH3{-tLNM51J{E&;fUv;@UHYLmI{g2e522g|VfRG^|H7 zwB>#2`#@LarG#t+LyD#yFd-Q6tl4dr;%KUVw`Q1jQzDY!x+*u{xisM^yqpb6dm5m@ z?Tj!BxdqyLklA9OKiHtM0W+2?bNMBRcKYy}kuD*-(9nes$UqzZ1%kzr#gHfKnk%afi-N_ezZ;aUqPm-PW z$#Y1P*zG(q&$**x3TNX@8)$_=0qaU+;~xpN?sFyojv*v8JZu`khmE;DvR^yHsfHZ&PsETdFbfF@U4A z*p0TQ+@x88hE&REBK+uK?#Foku#H&JS&r|jI^gEqfAzFT_D$0{CAFk-~gD zxc&qX9!}}vaj$n2FL4ckLr8XPcHd1A&{Lslgo&i0CPeW*0xoR=m|YH7HH74W;E`WY zxw#ZUF(z2J#qC&+#^EF6UzpDas0aiIyHMLTF!J}6Wgx?MmIS$Xdzu8fC=>*LqP2!1 ztwsrX8+6%=`?JRxZ53cH)Y4C4Kum2=mXhSM>|mznW^8)sk4{qo9Xo7f=oyPpH#g_` zq9t;Dxz)O~^(01XcMh9>jY44&*0hKSuN=ZMTv&z-y2!Tv<{6a=SdK%_%AoZ&02U&>+F%Ra(wX}{kZF=)JBS>qt=G#bSO0{VU zl^I$z0@+7obgmW=ftLz$5}2MW>ldNGm>y}R5jQaG4I7HcPGbd^&b+5&XO4PKQq0)R zCiC^k9Y6kLVqwPL-g1`_^DNWc^4k29oh(~Uy98HyiPAC+u$XKuISbaNRFWxPZQW9v zjFnpPWX0L}#a4vcnx!}-b#CU9=JH;XjzC}Tfka>7^8L3`Bg6|0ZZo(+YlN#?22z<_ z!4W$P99_2YvUHI3U_+@BDXBG5{kAf4<(A8|Vt}i5A9ikK4-U**3 zURbCJ5A9|TP>pa?^$J9=7}}wNWCs@%^XecsBL1o|LjL+EY)-`|mR`jtqE5vp#@^>u zZN$^(WC$E>=K-Gow-9-iEcT)yVkJgou_*$|X54FpQ1cE?2|03gk<1DQI;GzzJzsQX zd$=@}pJ_6go9l!Ot8|KTI(@)77K&ImS(*%Lc>lgO;6~V|sPzx-nwTqDeZ%R*wd;r4 z6i?-tvI`<)i{m=yJ=i~nB39ZwZnSxm=x(7~87Dr3^!zy09&MEE?D7vpSyfrxxEd(! zBX=q_vIahl+sq*_QVSFBTI!TqC>`EkCEm09Y-t|t_r%l$r$hXiv$B4Rg>sq2k@n2m z(Q#XSfT!qYdbFx#^o98GQM)(C**GwfSqTM73X1eIVz97)5{?B;xY9G`9BRp%r~w5v zR4$eZPRdB(HuKpR_H(bL*v&;Gl{0zG9l9%@r{%jb%8=>6Ck7F}-Sm`viRe-D9CEsP zyz8ua?DP6hscyZ;J1Z}_zL59Dnz{e=wSn#(;H1E)GkI{Uj+FaIGEiY!CatI=*7ENT z{0t>u?a4^Y&j;7*Mi~8JZ_W5!+(p#lIj%FuVqGl^t(t>wJ49K~*=W=q5cWVGq{~<$8e!@sNw*R*oWA(kz`SX4@m?4F&j5A$(JY8%vTFICV#W_> zU&4exNu!%cDs?hNK437Czco&&j$?|9{^)A@!SfyQpw1nW5_517e}6)K&c3stKk5mY z{w+5mtQc34G)B@ac7(WLkEKdo)*mrK0G#XQb9+0>j5ZV}sVswJB~u+yr9wv=5XYrL zea0@zZd1Op2J0V@?$d=_{!-m`++6nl&cjirxpB)#Zf`}K+NvmXpv-Egu__A=eccf* zSSvP}PjTFo-qT*tE{QfvoQAp(ByE9%RD!Z8CJI;BM^H|Tjelk-xq~ga0kNz#1fbX{ zfY=ve0Su!c4XQN!(HkH)M7Xs^_?n~qY%s{{g<%Vcm4S30f&DTQcVtA53skA=L&Wqx zBWfP40|rUsY2)%&qil=OIA|&tGATQ=9tYcuxp{(l5V$3(b_Z+>J38S9eZxthCEZfn z6e2`7k%{d^N}p6uq6f{@oH-*jt)q>^rDKH>FT0>z_njC$<96m-AZhe zUZa963Dq=pMaHrEH23(N zOGd;-zzrEiRH(p=Y8}cNrpa^8*6k0NdMP>`K}7xXN9n;WMD4*I{2FzIct{$%tvt*hOGt(u$3V?p*MSCMT{*x8L^`q9KiFWr8J^9|<<%|q`=ZpY92+!g{*^d14%J0TI~a3OB0 z3;Y!JJr~_>VPqfx9!(Sv-3E`en*>7q+R@d6qN=@kzcH3gX8~zM6)$h-q~sk2ySMy6 zx}7YH{^Aw77d!BWeG8}HqR#TQGdArG4zF%E3tQ}PU)yP?O6k5b)ZW@dcF3K@M}6pp z#YcbWg32%dAk0H}B#X+gcz+B!zh6Q#)qxDU^a5I4Q2!lJc@eQ6ZJZW-a1=7NmQqDN zx!qXb?eq81MqJRv?0K5GDe3I-EyDbyRGwNv3EE9&HT5DRmE9hFvQV_NGT+tb`cK8g z+QZqOHOWZ$7HSJ->5{<54iW`+L%&aa(i05qI$!PZU-Gc)Zn~n zZO@zbK;a0$hwXLR;~X`l+$!g&Mb@OYQKya$;w;Ru&_JA(`OIMV+2K(q6|C2kXJNhj zq+6<38ZNUsVo@4iDN*)9(z9umK^7-j8@aW1)LTg-aqG}Q*;-rk ziJ9`U%ER+%g^%E?Wu+P231nJBk#-yMP_{!)x9SrBZ_BDmAg?e&Uksve89q zFt13x>yq-c_Q<*PGG!9K0K+U{J7_rk?Rp(Kh1DpcS|*hn#Pi(!@1?R@k!SRw$rSh! zigOk~lj>CJk-Z8n2W;6&Bn{^{Bqb?jy|bablIy(EOLFa63{A|YP0?d;f^JE3osL_R zu)r+DUadd;(fD_SBdEB;pMDf44&Xp^-RJH_2}!k(Y3&htxKCJqb%#%2w3eSA0xm3D z(Ghys?vOUs&&B?_TWiq10eiUYQAxBu=396`Z4(Ro9_~vAYKNGXgt+k&OQnhb&eR?P z)wjj2?&n0mW;QX{J#VNlh|1?$zrMqCzrLgJh%D&Mp8YSqep*LpX+L}j#EetwZ%sQ(hj?)= zo@b0TZiM#sM|8FwzqZ}omIPbEC?P!oYzTlL!yYJCl56|WJCTP{CHWewxd$=C8ZULl zdT;G;TD-EZj?k^p)#=Ez$;)O}y+WU>(9+`Fg3y=k^%}0M@HG&;KHpH}lhF_5m>Rp# zU^YfO#HC6S^=2zIJg~wlED@Hj%R^qLVkQf!BY>8VIC!rqg?7DeLkp2_*r7dO!7Y+( zhX)VS-nfn&Q z*wSk|!1nxci1J(J7wqkrpDrB0J+iB$mKwb?=$2PxCEqMr)xsUIVl3*Nk02!U>(OaG z&e&#E^?)M1U-CMY@1$M(+8(D;pf3MuBw(OG6?0?jX=w}SBnZy3ZF$jdh$Kn*bB);} zHI;HUD4A#M?QF(ik{@aW-s*3PB`FqmwShQOcc_IKoGq4^t-k1(3y%&!kOqq+G)IyZ zKiYL<8QN_$2+f6D7%yynrKK31vv5q3{-D9m*Zk1*A$+^W-B6wJepLI^ z2cgTD7wz&+bU&OAcSXxhjB3^UtM8@wdJp<}MEE6tL>TQ6enRR`j%JiHANdxL1(guzXKPpBd29_gPG27xuzVr5$# zP#U5Z;6lccJ{!DW;6jFrP{wSfBWvDV;8M!VGab+p-y0Nw!`lAw>CX(yBMrHDYOvUq z{>)eE6EBJIu^XtN#oura6Lw4aeTZd!)GPmCULB;zH>3%3rOYv>8Lu~br#UP1=oXIMP{=l|!CfDNxwO-j%b#)GGnRlS{}S7vBd zVW@9rVrpb+P;qdBQ)FObU^z~@)1pM~_-DRbcN5PX2Lb{@1O@`a1WKwMzy`3&ci9aw zAa2~KM`C($B=TBJsO66@7FrWdoQMRFVsWjVo~TQr*d5|Y&f6Mh%xb%6$V@^FY=zVz zCRD~$Aw^5izK#DHNcS*?+jWjE=#>|X%PdF}C)4F8Xju&3bgmoqbl@dOzG+FMAa6IT zoDgG)a|sm4o2Ye}S)O(y3|7zDx?)F%=ET}Qi~V8%&X{$d6PMVqC$8%{RUr=pRfiaC zG!AGv#Cf-(8Y8kXrp=mP@UFil+Z&VLAFA6Z4;uCgJN)|98mY z*Y^e||JU z;?tui_axz2s#ZOjf6sn^o^)ZDU^k9w_ByBKQI3M3lbM^Hd5*cMX+yuS?+2_twhD{B)wJ~-@>DwS$crjzK)Ixxaqx}0kA%R<5}(S!IMx78yud3U;3 z8Y{Tai7Fevk0bJdtN@b{R&B0XhK}(H1PP#f!rOx7C43tN##yO^?UQxA7VioJ#j`3SG|Rwj@D>2%*^!0e+NF^NCL}=pJShYPS!G`Wp1(vOWn(%QqWI(k_Ayj zZ>-Zv@K9L&7-;yo29%CCyAtji3=05%DD3GVoV}V z#}HzCI=>&)CR_ATD6&CIHWd)Ut(hg1-Z4cthiJaQ9d0cX zYt;)+T=Tl|;K{9I?ryqTd zrU;&h_KLf-o*w#=QY1-w#Lp=__9D6LMD9>qSHrlfobovmQ0S338^#HbTmvoQ8f49w zZ+E%DV9agK6MFKAdh$9yV~70XZlZ~=HN;U}>Zd1Gnuo#DKfwPFk^kqfVA3~@D^1$c zJAnF6X=h(lyd-HtUkd;=xorZAgg7s9M>-lomY%V@+*Fgnx}|KxUAXOW5aWkVPogN% zeGB?p5Pf1fwQ4Y7V7Zw4@R+^hDf{uVbHfiLrJ;-@EGLTl#vut_v8|HOU(G`;Wl0zL zMq$TD@we4lgD4U_Gyx;`GjSu<&c1VV8LPQW==8aB0#Do>6CE&_x<$ceqsRVaG{X{k zq1H4Z+G7K`^^(Q+OS6Q+I+S748&*0)5NHir*kr3xnQv&(p=i1K{Fz#h^~|K%X1QH+ zua)p=mtnt`m13*mB=i8YaF6(ABPPG{=v(vgu~0LrEDf|9ygKP*@-vf@MVIN1Y8zXqa|c1h%#>8UH4!~Dz z_qWOFhGtA4duQn-`yfqKD~}D00Fjq6QxZpPB?WlNX1aW{fxZ20Oj! zL*67}6FJ9wrt|2+HlVAt1~s{`U1uHOO5T!0n7ZVQi2&(BmiQDkT%T`(w^Zq+D-hE5~Y;F52@2(``v@U z4v=Ly#o~neTn;hqg%7T9m)gM!&TN?bsh^+d7en59`kl_|sL9i--o?#a~#F%RjhgR6?=7f>oz z|A%AYKj|8y#w?gLX(SC0{I`0eew%fg8g2x|>z5=SvrfHi(fnvqo-QC?CiaQi{cPGVNgS)%CySr1|wYY2h(>||!egB-3lbqz* zna%FrleuSSuOS_yTV6-{1)bjRUX4y4V`jkfk{4myXo;$+w3~CY(f%;ux#@FLxC!w3 z37s8K1QEnw+ASX*<&Fyj!9r6yFk6#9Yb4E;=v>YKYqe5|Yr{wa?f3$#Ilv8wfhAU1 zO`uO3VmW4!ZZh|R#Zhx)gR#aEx`z{h>YrJ2P6g^( zG(k0AEf{%D0mv+jQBK&~`nN%5ScT6SJxIJl{$e{2yc%%YP||JsD;h@Tnlb5JAAgB_ z9{N-PMl}qVKf=BW5@7&qQ7Mu6cqvXo@!9Hqj;1$+m-qyvt!Q6cwB{U483r31N!+Pj zE7zDw8Wz#bY`>Gni3-63>bW8><^Z3XL-jL-qTmgKqO-fj6?QPoFKa@kE!xawB;1?q zxQSXKx%cden*5;FNIf|B?4x;TJ7oJE8L!aeC1YeK(7Ob6vp2yZw0OIGO5sjfq!9;3 ziZ#L?6FyW_zKoYBRtTQfHM@W<$4JfX()17%HR064~|K3zt@ zulC@RIo8DBL|s<1G8AN!a1=l6@?@LR2=KLag=E(&L(W;S5h6}VR|3@6WUN( z8fUGrh}Z+AV4y>e09iwaS6BS}s8cB^>sGaCHobDcyc|1kGFDw}HkUgtH_>$=rlY#X zzWc4JPRGT}gfc=EMj+4(0!ZASpy}D@Khx9A6_G>)GZJoxL{Qr+2l=gHK3ibumUS;( z!I3=|%ItIvta6ihX$^XKu}55td=I)9d;H)tOwJ!?Pwq1wzz?-s6wy)!%HOx%zDB%# z=;f6jeUV@f`ykn@D~4On;M21y`4#WeZqh3+;jWrnj5&U3cVDw~FMzoGKmjUR(oI{S zCazLH1+3CKnHVXPV7wCt*4k56smT*5b@wPrz%t7?x<2Z=CQnY&Ad;A6G%H(S$`xPV z{DWm<-YRR$EBD7yZ#Ymj?SO?t!jrJ?IJF?*MMRl>5;Vq9Wi71%!2Yu|hVDNSP+4fOb&xLcvL`(-@V`_Va3WAw)e?C!7`GnqfcCgTMFr0v$yvmF;~7c6ut zl!^vv*A-;PRCLbRbQWY-fmgKi_=ikBn>l?R5j37yQ-EssDJr+mQ!uBeY%1O~$9NO9 zCCI6HWY(5zAwTTzRL4{e!;5WV?WB6lUsZb|n+1DdFcj?|gpmqAHljK|eeJWSD0>~x zp@w|RD<#OZ{sNr$`LT;ps)uDtI!@t+SO@JBd`Q}!zh&H>yQT73Y-vNem$g{6ZWh;B zsOgS$3;=-ZO1gvuud0LJ=x%ZEd>9k&!CyYJ-D&rOag)}26AIIzBt~4aKB<8eb5`kD zeMF`QpnZ=~Fy*k&mRs?N@Iq2c3q8V3Pr9u1dr*JWz3dF=f-WAQQt5$wOzT#`uTz6@ zqN#BnH`LStS!yrGBblyGhY+&$xSB;Trrx0T7Xt`aWGp(21~Eo*z1@S_&i8Z%s)$di z`W6+HPQMKHBDZqxM0vD&96P7*_aSJ8524$c&QF&i=L{8d$5xZoULf)=#%-S-5OtXu zJU*asG=DVRNXSWh6ThL|eKnBP z*bb=CtAR`&U1GE$&qzxe6c|((hwzVOQ{0TFL-fO|a3AN)6D7fy zeh)Np@;t=!6h3HZZN_9NI1;q(O z=r^2`W1h!MJnZ&pNs~DP6}wut^qM7@*8w%(d}hMZ^WfW53zy3&^`JTFM%q5Yo9{*Z zu%b@DVQMx|o4Wb+ZE{146JC&}kL?W zKk%Vox%XvuP4H%u^<$Ert1&4&HJ&Nd6rIyG=gNApVlRm7%phgF$N-B}Ufm}+xjcXs z^!`jCrNqnuWkB9S4rO_WDzYlynPhwBqBP-5$Pl*YI5O{+&X`T>T`a6O~-aSDpZ%mCQ{H&=J3isQ$85SzM?m`WUzSxAEq-u+1 z77vKoZVhdw$Wb+{IrR+As6BjS?F|5jKPxE)k)WlVv29H(FTocfB)PadIsG~}ES(*V z+pxoS?DCriQ`_lidcAK}$Q<9WL9v5}J+PV-q&0iZm1T2N?V{oM_DnOe z<1DKn+JY9WTS|C~oG_nHe?8LeOkQz3A}HRYVVla0nyulRjS-74D44-8zt$%sp@7@5 zzIv!&HXBo@Cd|w3$g&l3!X*drKa=}jYa>(^G6=MXvF@;rt}IdB+is!Re@5Ps#X&!0 zq@>#laD$NxX}a=tgTxPWy~4l38`$xl+Sb|oxf@^C7mr%d43=hx{5kFvp7N9KEz>K$ zG9_PBI{wGP@WF2SZIciwd0q>_5bHQndxX45*@=amlUnnTIhbCrt|DiHXt|^bDe&Op z&OpckKWHTccq$oRJmq9Rtqy2IvyXXS`5AcNg0Cp)M@DPlhU`#{yn;Hj;I20HhA4hW z+rfA%U=Dgb`#`?RtunrHk^JAl%x`CP7xPYN7HDfL1vp=vQQ*R`Rk{Qh8E4xV1rekm z;uxTz(_<3e8DdJ+m~F^E3*qm>??vzW7TbThtZOunF=d^``91$Jr{gg5CjD^D^XrOj zSC<#Ke0O62iV5lMwHo|^$hb5@HGw{&G!b67dScAp3rS{(`u-&=Vrhsoq8w)HBHY*| z8^%t{D*(@5z8>BwsIyl8m^<>h^SpiGUUn8X{;bsG+&rr1AxH6Y1Dj6R<6)TDs?2OD znnnD^Dp-(CBk>$XcEZ_Nh$hjxsBj+Vtb0D8)SM!q!gBEg{Ee8S_IgVDXbw||3P9ZV z>wYESC!Pf}kxr5HMtXD%vRvHMOYm09^{ua9`vBoHbtRdJQcBb*#`09G@1No(8ZcZR z;O|O{8Z93w4e$@>l>*spC_}Oxx{JccH3j!o(%PY7a@q{$X(lW$BNBf(&j*<%k8U!R zi<_GJ7Z-%B+m${y_N)@kq4`89jY;I`4l-MXeK$~V(U<V+wXS73M~l7lJ;Y zpay^$sK&&sEpG7`ac~}E<=IuYjpjx3jbZdlg56cn*lkt_>IF;<6oi8(7-F0#b6H#+ zHD=E)IMII+@?XgsYpNF%J*0J?&;dmY+FpDtlr)7t+F`+nzt?U7b~wIYbYBeZ&Fgzx zESL7AlZ!62=;7q>y>Y?&-Nt5YzPUhGumIE~WHJcvLjy1%j@JhgPPv0562U-%?6JK- zOGI*R#EGP*TY0?09ytSCPhmr+j#|GpGtU)jB2UKdy__#2ZllafGHcTBh`fUNpOV*} zCgD3%>V3|0IR1S8Os+A=8`pd&yf%dKWO8haFjZ+(N5B zjvqovAQDdT7NMS%oTa!W#xB5*_d|{N`9A>#$nCy9V2ncmH2>D%Qg0+SduwAIo?|g6 z;_qwVHEDd-5F7-g3-&iz%exm0kh60#x3!@&w941*;X4FhpAxa~o=l ziAd+4s?8Co zt63|My7JRlhIjm7VPYGJcP)~mb?&}p(J{HcDMj*>$|ZpFo+Bt6emHg+^w%wqnl#!SU&zJ93rg%N$| zR<%CnIXHNY8)_t!8pm@kWe~&x%15!Y@)*+H$&#JXTsxEfR1zCgfRp1FSJIVhcP4{+<-Q?3W(P+3bHe9NUgz3oVw?W@L zcEI3}xD+oe?X8R?=_4Lj6zr1Q*c2ctERd%zNK$GnP^~vP+Ev8`#Zkh@qL-JeJxa`y zH3(N{Bu}xbnXkmk0kSm_af>15EAXW)jYE*d3p)D+KS+%BWED`6He%X_slIRTFH!&^ ze_n-c$+0JTD#b+){@@}{^CbJpU(KU3{#}%uxDrFrvja|noTM~pcUXxz0lD%dkTf$_ zAOF70P1oOF80+&WAt5g~99|7X=~@<`BCT+112 zIB`4WzM)5vK1Orzu&KSn!+!N*mK;EJ7X7#moIPyyB}_taa3?)O?zXg7!M3Hl%dc=M zl|C;IdkrIPITT0i_KrZ#RlN(ax*K-7I`PN{MZw`qT?Dk&!Uq+4>H3*5*R1DEBzSj= z?(4#pF~!{e34oR*i9nQx>L}v|1~oYD{EfRlqh9r~wYm4YUtzU_Vo!NbfFJMG%&)M| zEiNOZa^oiMfo>^f3tSdyWSo+c9`!gi2Ak*{-Ccp6Pr>XV#mbo9DSR4cHpv22fAWp% zTJ+XMKQXsWa#A&@M@bt{pY3Agd;4W>&P0J6T80+MBLSwS*?ys%m3<=d8BA39NR7wZ z5*6e3V`yn6XN%Eg?i2MIeu~tqU-uSQJzIX(>&=p!h^2Vgu3!MiIk69{&XF*^Bc}kJ z@Sa29;z#1I1|oil!XcMg;dyJAhojUSl0HU(N*r)*i+t&XH+A)_lcZB+`|V%zoTDfT z$`xPZ7_|T-4fq}3;?+csd3JC$L6>*%ze;t5QTV;ONntwV-2mB01kwS6ew z`}*O>WeP?-*b>RyiO*+R%0t%Md`|H!;!N$n zMq9)$E)P}uo?MvggiA*9^US#&K31oU&nJd2?J=x?({co!pkO!f?5om`)s6Par6?>~^T4s9JnzI3v7!s@ zAypfux@zJ)UbBmH_4>zM}oPw;=j6R5wrKYv^1xg`?VqWAbjAs7e<$Gc@F0ZtB} z1CKmuKLT?33+phwzJ2)k8&{X%Z2|euJD9-f4}Yw>Oj$Rk$t8 zJX~~Thdd0GR@X)PZa^ReC?CwqIe*0i4koAgeOemy#e)));)mUUz(lta7$odSp@Z_Y zK}fbu>m$WL?&bV>n5YFK^A*|bzLcOP{*AGqm_8{!S}NW+$CTuU*CBc zWIkkTivTmq;tY@k!rLZZ6kiWV`-ccO&;?Bciw`NGYD;%`TVgJCUhuOv`DQv;bs)_x zGa*#o9-`omQQg7{xIx9MDakeS*^ntrVL3p|E{Y_YaA23goyn+ToS9hl?2HIqb##Z! zJzkL2W}D3*MNRqUi}DSv!7bQq!U;Ty#ch{>L*w;MAg7%IQDj>)dZGle9NyHocnXnz z`r&H{s7B4uHJoY!8H8 zRSQHAka3EC{>6!b9ifl_O;0^-;{<-wudW9Njk3aXF3{G(_$<+qb7)vAw<(FBfn)^` znnLckWG#|K8RG#hz(T>V1E68;+65~_@QB3(6jK2Rf(jy{2&f49@jHPxwFK_|=Boe_Rj^}7R#N$4W4nYpJ34UE1lsVa%%2c_} z<^GX1>Zm^K2kY13IV_uLx7fjOXU!pLCyN7M;1Nn>(uosSdv_#P1|@abqjF@@u~Q?1 z_N23*jh~uZV0k&LVwQvkY4ieD)po=6V)<1o)5_=%f3H-)Aokv!6Qa9V%oIuoJH!*s z6Q9|J~67Cw`eMq_5#^|hohvK{LZBbJRizL`~1vI%9P5_|5s)4M`z>xfm=wWz{e&vGH6 zLI+dV^G+B*a$y$wCaxT8f5w30c)m61s-ns0tQ$8;rguaGObS_>jBda3GE#$eh>L0( zkk?p7e zEHs_{otdSwDVdBEXXXb)9dnvXisyLHPi2=kUIdnH#>BfCy zNJ=zmA*r5Ac3(rn*MAF9+=XQ(yReZoFB#&;?t!EM$-?4XZsRgy-Bwrks2NYH=EPn_ z5JZsP`p+zZw>TrVguGOAVJxya=cPhkl*W4tGut?ekZyA(Oh z`Rc%=xa^PhH8x|C9oc&ftDb()SKozHNZ&K*{S1tcN3asD!G0G)uOOwEvdF|3HU<+A34!S*j!IRk$ZR>%uIz9 zD8O>6E3CATj*c$Q6O(1=k?Oxxgf!cjL&W%0!m2HX>07SR#tk4vJ`ba2(2A}DPEYHt zJU3=V!;=rxqTxYV%|LiO(Id~a$++d{j7=5h;`D2@)#D5J(Wq4tlP0T+TRv5O?3j}{ zvJU-eM9#(3b5$Zrg9Z)eZ=C2Nf#El;^{SaaZk!ijH;MOPk;)RaOdd}7y?26^Y?HyWT(GJWGVWv{wE$(S^ zYob5|iqk9YHj`&s`ct*-Vv)n1?@F_N!Lo83-SXK03!#>w_J_o9+bOAHcZ;DnEX7wd zvw5MZ<%>ej?(}&XD5EQ7estKdyhQaX=ux{`fVkMTL}<7@DGhvQhwys7Fa$Sje|7Xspvz}G_Vl}K;Q$$ zD+vE5!W)(N&ajwO6_what>FBV!dCyPL3o(ArD@<^y%ER~9&-?2qp=I!)UokGtZYB| zYlB{AM>ds(S_&hI*OHzJ`s8c#LW6w$V{7vhqCb8Dw3(*u;BKgL!t#Pj!tk=Cfh`a7 z-0}2xO6HVOtdK$%RoY_R>Pz9eq0oTAXv|j*V&a1cY!;Sv%OO&%hqw+eZM30Q+oU-4 z^CtU3Qv5d`Md(QY?k-tZJxe)N>-Qv0j=&|)!eQ~2fOyctCw{nj+_VkSA;%uC=`R`` zqUcVC$y$tybm%zWCV5*xAgAfUWwfRRG(*k?B2{GVvv>&MVY>yK$G2EIS`XAa)E+T1 zvW{3L-bN!5)=8a^b~gtGyJYB8XQ{#(x>HbPH{Cy|x*zNV)&i-+OnsfWW!n~3(iFQw zvahZO7KY+au$s;r+Lv%nV}95&CA37TsJ7h(q7T0xs`X(uK}Rs^1^0^-{rd9aox45% zV~w&0Zut$@h0B?`jJ@@~7MY~YQKq?jAfW5;`Q%x6sK1`UzV^AtPyy=U*l!cA-mHCW zg&N%wUuJ~@z_@W_lUi9Vp+Y*x)imv;ylk8i>NXlNcviQ+g2}K@fyl5k`hxKm?KEB@ za(}ILR{GqJM;*v#AmhD$ENGC}tx8}r;Hk*1lG^*hIMmIOC=*JrC3ifzM)3CLUZTn| zPV2md)aA2!G1*8sGy2FpQ0Df*Iy`JGOxrAG6PDxxfEJ{t!JP^y$+P$1Tg)xr`Vyf70EEEy$R*mtt-bXj_HgerBj)IBlWZ z5It0A^T&lL#4xf?S6UhPl%Q_TvqMiQ`ln$TX`s8^9_Mn1a|a8hHq^3sXGU< z>B*!A0GnsOj#uL2)U5f+qmY;%rMh()^QkOixj#9s_T3}Bcz5voR7LAD5{{OIEG!jQl#`L!ME z%(;(cTXKi76E&Mm)8CZ1xuRgVMB^&!2`{j)rlmX3R<>nM5f zIRFDLyNr^iSV?UMTW=prLxW8~VGi{}pf@o~#xX$`iLHL2?Mwt2!23JD$PoTsaNo}` zhSYcgq5LAxa9G3 zYZbx>l6V-kz&^Rf!u+0DZgrIpUh@CzUqG?i=ILJ~h+ z#SwC847SMj*x7}A;gmq#)*I9=7GfX1omB-G7Bi91S+)l!_E33+>cFJldL??K763Ah zTk4$wA@KO#KN%`~=`yvQ=Y9m6|8(q)nBv5ERw!*2<1(%C*c!`KT?9POqx0~i@rY_Y9-0^K%FVdN4x4SO z509F)$rNDB6zkvt?r4ibRpv-PDFdV&u$S926x+k^?eO6)QR|azvjsb|==#nazh&i9 zKVdtub_u*ZqP8af5?H#*I)d;Cw%LO}GT{?y^57|U7bMXSfUeK&9>#es3h!d8R-8}$8e|hzm z-~e=fTy9S7>Y#|rCjl=vxL}^QQwDeE?DI30g)P^w*v>D}*;0qs*tZm3X9Yvd2zkYs z!)2eobP z<{}1zzht+NAy70k%8Y59X#N0XS>L*2za{*X+T^7ek@^)^C_tj5C5vaJvz=r8@;1D= zL`+;CSJJTY0XbDQYcNj5k0F*&)BEu#t-+9!6LN!W|HjiC&7l61A@OSmIO1whv-UR* z9QkiJy&j@mRM%ZlnGiqSKkP5Cgn9F&%G@Akz36SD$$R-{_N-B*mKYqoQ=T$?cPHd6 zt7Z-v|3#*JV??|^&Qp~BX#E_ui+Evj36^?2mRB#<4WQks!>n$t#HDEVN&aG4F}3sK zll3=hv16y^^9VBCj%zVw2AZ?zq&?cRm~VXtGWvChRwzihJ5!?!oY*pKIkl|8(iAvS zj>}ZG<{^vVB3Rz8bLn=|060UjV({_LbEh@?$YDv*8~C49>-j{}2*Ih+iLG?AnFd}E z%u%%%wqb&MpFeqzQ{RTiAUMd^hfd_`2*e4RvrBKxu9zqI^b`#i9j%G+&k8rDtF;%< zw;7kY=?65HoJl=i#fIH@Psw|>fts;IS_{|XLeNGVowgtpDudqA0ZN;{Gmd77Z=6dz zIuze%p{+8bgV}3`YxR)dm zr%Nojk$-qh`%Kp%M?a1D{Ncwt&Gc2U_80mq%3G$Y0{klvk3i3(Aszw#ZLK4fpLB2O zU2c(XUMsgTWF5erQ*EBx}@ zlfFLiLRBEFv0w^5!)z#z<~-5~1AX5H@dRGOZ;=ifzvZO@^C#oMH@+6)6YdMY@^pYo z+z}ASP0MBbCM8~;-73|a@TuR!=1ZhV&ZPUz%-oo2@B%)|I|Gc~Kpj6vAJ+1G71lVp z&NFTO^@JWV?LUcCfcvR%c}Gj%cz2-59QqB@ z?(H*eURU?I>x@KuBt=)W*cMp*836ojGe%Op){YmP^DUc;i}w+&`F^WIr>6nEbG3A9 zCAb4wx$>DJ@N}~KE{8@NU#jnpu3zSQO$kqAZ9^u@4Gv>qb%%9R7`)?VHoa~#n!uls z?N{c{KI1w-Q}vb0=4)1E9B+Z-Pq4QcW9B3R%%2|Ao--vX)XlCq;vK>$kbEy&d>6aQ zFU2R24xH{sT__K~3Z+pOWph7PYUPfnU;tVCts*ERelXk{uKC-8V0NJI61aQ~y4vN- zpc`@nKQPsAN7_}vs2cPj9rVVi>Uo693cfdNN4s6Z*Kfyj(n>iF_MQF(_V0krKk*th zdGn}zAXT~m03bIffHBmy6zS~b4~Npf3F9XK6Q7eC!iXp@%rx^+2UG#Ls%qNMmRd>C z`EfHGAdwqqwgYo1ikbD}q}VE7PX@Sg!}G9q=$_ejxRTY?`35529|wU7#F|Y$A(d2P ztRM{4fFnClMo}4OHY&Br>k+Lmf(h5J-}7*;JHJW=7^bKUvEkcSnJ=i`dnaNjHd*Pv zG+_>s@2(e(!j7OeiCw0%l-sgXB|app;ncz=u2H#;uGJObVF7OIo z5~?gUZiSR;x~nmy0YqP69x{#`Jcxs3M=+KEDr>_Ai0qgqQ49XCb3@BMK~KA`kn3BI zI>yOI95a2BWeA5umpNKhzk-888+W=2R}qtJ7^)V|&mZyV9Zgrc_K4-hd^?lPhwt&@ zc|{fBQI<`Oj)~9s%%LMOGtLBOBIzYg<4Uu$Hr^zrM~ja1r?P7fhhwdq_oH~efcTOC zY9ca$7|=N|EK>BOS2Yt-f?s>30&?mxp*6mMM27c= z7#5?r2EUQ+;Zvm^jjI*ASC`_d?~Jyd6jwJ2A}A_kG6vEQH|{C@?x z&`LM9O`IFtDtLkZk|K&R+W~u&ALO1x&9Mf3eLoPG!TFHsXnOFFh2I6DT*LK^n!?;j z22LYhl%p&+SO0UOpF14%Xs>dhhP=I8x{mUtK#y<`34AJSO9SuESS`AT)I}2j3ddK+ zP{Q3N;-QCO4Hq7AP5orb`^+B`@r@XYtX=xduoaw{9i5viHU3RrLk*(jU6bpycpOAg zz!I}1D9l^9jj;m(x(cv2dvxyY`g#$d5%c( z56gwP9d^BqWBgS&Xm^;DiO)~~72>X4YPWunpe6KKcfPFBbkUu;b_NxFGz@6;9!A(} zkM+-eLeBP?TMav;3-3IP*3U13>psUJInj5@$;b$}YWhdR`s&F;TtRvWH&UWK$hgw# zCKwlVZ(f`B*e=<-l&Vf^{Ul&zN6o&H;8Pe>Nx74HuT@<&b*4+iLB}@$Q!(2Xia~3q zI^uQxet!zDLyP}@c3Zd=uJTo@j&_x;7?h5Ut8BFo4i z+kSF7v+KcR26xv>8?)>ER2Se4tQ*yfdK(srXd_`de6?LtN_{XaK&AX@+q3qF`MoW5fFXlr+=|AM zDkU9D`mkQzYqeIE)VeA~>?^CaY{Nn18^Bw1%C6}q$VWhGAzlAyv~)-;xXk^%DoM~> z?95)KLw3JISY~8_mC{_D(aH}-9eHcfu@cOnP6$WUm3i&x3UlGjnObll0lfH0kE)=S zl1#XrJ(1@1mn{9ufqNtCW-Z>S)`*DmRi`@zp(ZO)Ipo~RT{oD<#Bf?__gXVqbAX0U z4Q~J3-A&zBkM>l~Yofw2W#+Y8ku!lQ<(#wF?u5nzFa=! z2)HZ}Z79wdwU{?Rzuw02M{&lQJ>nunvCP7tALSjuK31VdYHq(gQUM16p;`+)HAD-I6l-l#s^h{?yQmM=F(XXKnrc#i!u8_sPXr+s((E;9 zFJ}egE_@P5#BpBXD$?W#-jvZ7^i-4umkt9A`$n=Ygxl=-0SYLzBu#^yKap0XVxsNB z^!H~GS1>z=h@81FGJ658I!CBN8Kh3K;Jv>1)2IddN1v)5Yp#eVXNU1W$J@24eS!>t zBn?hIY55qV`8L?}6>p)7mP+RZx#nE5%WnX?Hb+D-%FaxZ$V zW%O6J&C7b{&?>iO$tP*GhhRlHv_jJ@ZDLHKoh)QEo2`;*B0BP*szTw^ftU=+!{vPX)TeTyQuX>;COR)-@D@ zg8j)>54a(UO#yb7NCRw;6cBjPDPYD_s~aB`_$>-(t;{KtHD7WX*%ny{7d{Fr{?gGK zs2HnkX?thd;qwK&=7g#kBI9=lGffs~<$tJaxPq@^c05Smo?KghcP4+mJChzbP;2rz zgv42e%FijPjQ-_eI8NYoR4C(=$!ds0etx-rNW!`2^_puo@c`LXy<{5hTn#hmjp_)Y zbtahT7Q4v71N?C+;dxJ+)|9{xM|j#r@)EbH=4l%`LBY#9)m0Qn_OP%~xfH}LGqa0?hHj8newzdxT{yYY{O2y==yi2{j2GR3;aA`^^&2! zp2^hIwKC4}Vx5XiS2Dxii0$@Z%Ux16tqkfWmaNDv6n$YnyldTVO&I`hZB`<04s(#y zeNCeFoUL0vSK{VfGGd@(610_w+{hq|7)6Ctq-?oGfg%?2WDx@LihoT((66QRcEOi1 z)kU1Wc>#O^Tw4k@#GB5^FT=*sgfoT}P>Qn}(Sv4?mmm^NN@F~vs0}9-7xTS<$HMD$ zQtWB&d%ET7WKz)WLhoZ%8uT76_sK)5%<>byaaJ^c8eFS?|Fh~@lr1QTo9C5$tl>1E1-=(_=Vh1zChV$Jn zq&v!yk6ehzE?qC|@Vhi)(MBB!sGQ$8zB-y8 z0ic;_0M@cW9(u5Z|9YK5Q3H(FCB>qBSk^GvAfcU`d>H($xLZ=Hox^y88jU$F;)bS= z2MR-X=GGlKPmG6^W4XE~96~|GQipZSRqPI9GBJWRd=jDarLd4M0%B|{*8W8QYe+Ir zt@3`>{LbJ$GSQC5wvb(Gsy43Z^si_EJJpsIH+r*JM7px1CBbjm;Nex)gz8|@XDb$_ zB_5Dg4HiAEs;v+OMG0{JwIvC({REHzQl(u2x&@kdyV&NSRvq5&%lwfGTCYtHHz>{4OJwk2fbwa~2jqV;)H{Pp(`b#5}JVynX9bFM|~psaDPDj-eJi9HJ|R*jf#CIGXi! z1FMc(@oRCuMVNwYf|WFTX^YKR1p6J`W`9qWx(c06692PHp+9--ns1xH+)k%?>1Ma} z5HYSIsutttF*0-@vVs9fU*1EU)J8dA?n~=a=HwOGM4Ee$8UG7Le%x}svJ`Trf1XaV z23=Ex5(bbl3|@52SOQN{tn(=|Le`6NhZ@t^iczGUB;Fohm)VGyc%2y!^8h(doGFvb zOmYxY#!hvUu^;|(wSh{S^F(zOpGw1G5&xV6rg?#AtyptNnqzFq$lyGUupK>sKRh8g z)gt`yYmgswbTJc+2cG%cH?YY2uUkGPd^GJ^yhp(?*be)l2IenNxb+NxTbM5oque_1 z?|I(+)f;MvCl88}VWk$4Vl2$!Nk6plAKV8c7wYdcPYSP-(Wks2sNM-ZO*mF1=O*IW zJ-KB)VQbTSjQC+2MPf32y-$7u=A{!J*dc=`B+CgXKYqerTtw z2R)qJW$Rbq0iT!5nSJLV8e=!pr)nBL!c~e2M7-TS?8%T)+GPyBzU9Ov0DvLj!%2hA zr+qiSGd(@xdup#K#$>k-Gr?*Ynn;5IT`?{bLq1|==!%?Q<^&=xuj_PRlZ1x?`R#H~ z9a3?(#=-% zHt8CPcJlM8AN;2LuL^=U$iFQu5QIC$>)q16g4Su*4t#+7eP^TuiZ&1So*mW%q^su! z^w`V^Ab9V-SBp|i4XBUzBdGT!k;PWBp$Gv(l#oyeN0}G4#U66d;k2x`M|?#_rz5c6 z0(+$BFV9G<4@EH;$xK;KVZS&l2mE?^g6Ss2!PYok8P;cyZjB^&v&b>e5gqP;HA3hj zGD@vL_FE1Y!_)7;m$*1G;JKZLWQ27G6wF3zBW8X=J#uR`8#L_+kawe>?^p6y?{8Q4 zA}=WN$Vryr**Lu=-skQ_%A0mvW3cm>aiiIjaFzIR!o05|WKPow%NwQa^~(5}NbsSjF?hUih8=w~Io}g8}@_}vIe=~jT z*i2AVefWmvGnX~YizrUERgUm?T~RFR7gvssn z^XZwHu8nWYQhIE2@hD_h=h@H(-EdZ<-4E4p-i+tEHJ0RzUF<0fCdmrW z8nZF*MS=9+v6M6%2Np2-mZ|wPc!X#vJ=6Ctw%As!jogZSS?3PIAkJ&OF}l$TUjN6p zg!JKR;s*LQN&>zhD9r}ofi7OBR;OR> z@`D$=3`;S|Ab^Z73|>FIPAgm8!#C#fa6CPQb2B9+BZar?r`OA8f-qymi5P72&=50U znmDWJa6%pg2AVCxrHC*D2C}W#Z}x~^WkL|HM7ote*arbTencidh+}xf1*Ig^71qWo z?aO=tA`jj-=Gv05>gXtrw_6MjduY$GTKeg?R<%BLp*6bY4bv@ljc!R|U{eXhpwpb& zRFxe_8}o|CHRi`EIF!AYz4R75+CFEhAJWw-$i`>WqsUgv9mSbU-Fg4MAer+cZCV<+-naX~SG;3zhQSGHnL!nf|bb zZ+;;JSuvqKbf7R4cUcSW6ju&(GKwy1{`?&WAWIgB#U> zToVO|hkg)B#=G-BSJg~pECUd&m0#$8d0^_9Smpo214BhIIwd7bN7=YfMKwV^GA`S& z4+ zAAldaP=S2yP{8{(WP;xkqP1?L(B9S9y~o}}{v!bdB;WVvzrno!hyb+z7UA;oT?87i z_~U0_S3B$<5&x|}4+6scmk2%ZKl-#fX#M~Vt9)Da-gP0o)7R4e1#E=*1MKR81gd;S zrupBYQ1Hez-+%8Q=KGj3{MAtZ^Ph%K2)ID=p?|vbS3%>y!12icXu&}K5BR?|8$mz_ z{sLcPy@Tog^n1NqCba)ueFD_~_M3p}k3?&FETB)-RX()BmHZi|~(#zp7jO zrKg$mH}H3{3+!&(KiK~={DOcG{e?XfdB@@aow`w=e$U-MbdIsz$nW~ZrT@`~0SDBQ z$N2w7@V~@??;+N|WXj9_X~@_938<$C@t;ZkO@k!=4*c@|B>t7SgQvIJtzHhq*P;iI{Slf&82l$7c<-IQt?+cLUKd|46 zy;$=P@KYbfAK-6djM#Ue|9eJ0?_a63P6)} z5bA(w?ZN_J5GhTD1w42_5U6k!Fy2uU$hF0ACpe!}0-K656oX>wsbxULGN6$ec(@`) z70{Er?+UQV|4u@ZJEGgcz+j1D>clmZ6E<1HO@#MFfTf`kio%q2U=z=uk^{RF+$IIa z`zc_NX^oF$mfiMG@+|F$Q F@c>lp80i22 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index f5ba3fdf..760f6329 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Fri Mar 07 00:48:03 EST 2014 +#Sat Apr 09 15:15:19 CEST 2016 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=http\://services.gradle.org/distributions/gradle-2.3-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-2.12-bin.zip diff --git a/gradlew b/gradlew index 2ec45c60..91a7e269 100755 --- a/gradlew +++ b/gradlew @@ -161,4 +161,4 @@ function splitJvmOpts() { eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" -exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" \ No newline at end of file +exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" diff --git a/gradlew.bat b/gradlew.bat index d4552f3d..aec99730 100755 --- a/gradlew.bat +++ b/gradlew.bat @@ -1,90 +1,90 @@ -@if "%DEBUG%" == "" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS= - -set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto init - -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto init - -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:init -@rem Get command-line arguments, handling Windowz variants - -if not "%OS%" == "Windows_NT" goto win9xME_args -if "%@eval[2+2]" == "4" goto 4NT_args - -:win9xME_args -@rem Slurp the command line arguments. -set CMD_LINE_ARGS= -set _SKIP=2 - -:win9xME_args_slurp -if "x%~1" == "x" goto execute - -set CMD_LINE_ARGS=%* -goto execute - -:4NT_args -@rem Get arguments from the 4NT Shell from JP Software -set CMD_LINE_ARGS=%$ - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% - -:end -@rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega \ No newline at end of file +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windowz variants + +if not "%OS%" == "Windows_NT" goto win9xME_args +if "%@eval[2+2]" == "4" goto 4NT_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* +goto execute + +:4NT_args +@rem Get arguments from the 4NT Shell from JP Software +set CMD_LINE_ARGS=%$ + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega From fe81e313b77d29f2dab8831c06da4eb1fcd1c4dd Mon Sep 17 00:00:00 2001 From: Bartek Bok Date: Sat, 9 Apr 2016 15:55:56 +0200 Subject: [PATCH 13/54] Run translation checkup tasks --- .../assets/openblocks/lang/de_DE.lang | 12 +- .../assets/openblocks/lang/es_AR.lang | 26 +- .../assets/openblocks/lang/es_ES.lang | 26 +- .../assets/openblocks/lang/es_MX.lang | 26 +- .../assets/openblocks/lang/es_UY.lang | 26 +- .../assets/openblocks/lang/es_VE.lang | 26 +- .../assets/openblocks/lang/et_EE.lang | 295 +++++++++----- .../assets/openblocks/lang/fr_FR.lang | 280 ++++++++------ .../assets/openblocks/lang/it_IT.lang | 7 +- .../assets/openblocks/lang/ko_KR.lang | 183 +++++---- .../assets/openblocks/lang/nl_NL.lang | 366 +++++++++++++++++- .../assets/openblocks/lang/pl_PL.lang | 320 +++++++++++++-- .../assets/openblocks/lang/pt_BR.lang | 335 +++++++++++++++- .../assets/openblocks/lang/ru_RU.lang | 20 +- .../assets/openblocks/lang/zh_CN.lang | 21 +- 15 files changed, 1590 insertions(+), 379 deletions(-) diff --git a/src/main/resources/assets/openblocks/lang/de_DE.lang b/src/main/resources/assets/openblocks/lang/de_DE.lang index 82c46be8..dedd5d4e 100644 --- a/src/main/resources/assets/openblocks/lang/de_DE.lang +++ b/src/main/resources/assets/openblocks/lang/de_DE.lang @@ -92,6 +92,7 @@ openblocks.misc.page=Seite %d von %d openblocks.misc.oh_no_ceiling=Du kannst hier nicht schlafen. Die Decke beunruhigt dich zu sehr... openblocks.misc.oh_no_ground=Auf DEM Ding willst du schlafen?! openblocks.misc.sleeping_bag_broken=Item inaktiv wegen fehlerhafter Initialisierung +#openblocks.misc.inverted=Inverted ## NEEDS TRANSLATION ## openblocks.misc.grave_msg=%s (Tag: %.1f) @@ -121,7 +122,7 @@ openblocks.misc.pedometer.last_check_time=Zeit seit dem letzen Check: %d ticks openblocks.misc.pedometer.total_time=Gesamtdauer: %d ticks -openblocks.misc.shape=Form: % +openblocks.misc.shape=Form: %s openblocks.misc.shape.sphere=Kugel openblocks.misc.shape.cylinder=Zylinder openblocks.misc.shape.cuboid=Quader @@ -164,6 +165,8 @@ openblocks.misc.command.flim_flam_target=Jemand mag dich nicht. Jemand mit Macht openblocks.misc.command.flim_flam_failed=Der Blödsinn hat nicht funktioniert! openblocks.misc.command.luck_added=Glück von Spieler %s geändert, aktuell: %d openblocks.misc.command.luck_current=Glück von Spieler %s: %d + +#openblocks.misc.hidden_lore=§a§oHold ALT to see history§r ## NEEDS TRANSLATION ## openblocks.flim_flammed=Etwas seltsames geschieht um dich herum... openblocks.turtle.magnet=Magnet @@ -201,6 +204,9 @@ tile.openblocks.sponge.description=Der Schwamm ist ein Ersatz für den Vanilla-S item.openblocks.spongeonastick.name=Schwamm item.openblocks.spongeonastick.description=Der Schwamm am Stiel ist ein Werkzeug zum Enfernen von Flüssigkeiten. Funktioniert wie der Schwamm, ist aber mobil und wird mit der Zeit aufgebraucht. +#item.openblocks.epic_eraser.name=Epic Eraser ## NEEDS TRANSLATION ## +#item.openblocks.epic_eraser.description=Every item has its own history...\n\nDon't you hate it?\nWith this item you can scrub all traces of epic lore your loot has collected over the years and then sell it on black market without worrying about evidence. ## NEEDS TRANSLATION ## + tile.openblocks.cannon.name=Item-Kanone tile.openblocks.cannon.description=Wenn ein Redstone-Signal anliegt, wird die Item-Kannone Items, die es in einem benachbarten Inventar findet, schießen. Benutze den 'Zeiger', um die Kannone auszurichten. @@ -286,6 +292,7 @@ tile.openblocks.scaffolding.description=Wolltest du jemals irgendwo hochbauen, o tile.openblocks.goldenegg.name=Goldenes Ei tile.openblocks.digitalfuse.name=Digitalzünder + item.openblocks.cursor.name=Cursor item.openblocks.cursor.description=Der Cursor lässt dich aus der Ferne klicken.\nShift-klicke einfach auf einen Block um den Cursor zu verknüpfen, dann benutze ihn, wo immer du willst, um einen Klick auf das ausgewählte Ziel zu simulieren. Sei gewarnt, standardmäßig benutzt der Cursor XP abhängig davon, wie weit du vom Ziel entfernt bist. @@ -324,6 +331,9 @@ item.openblocks.crane_backpack.description="Magnet" in der Minecraftwelt ist ein item.openblocks.crane_control.name=Krankontrolle item.openblocks.crane_control.description=Dise drahtlose Hi-Tech-Fernbedienung wird für die Steuerung des Kranrucksacks verwendet.\n\nRechtsklick zum Anheben, Shift-Rechtsklick zum Absenken, Linksklick zum Aufheben/Fallenlassen.\nEine blinkende Leuchte signalisiert, das etwas unter dem Magneten ist. +#item.openblocks.wrench.name=Big Metal Bar ## NEEDS TRANSLATION ## +#item.openblocks.wrench.description=This is extremely sophisticated tool used to perform transformations of objects with octahedral symmetry.\n\n\nOr just big, dumb piece of metal you can use to rotate cubes and stuff.\n\nSo yeah, it's yet another wrench. I'm just trying to be original here, ok? ## NEEDS TRANSLATION ## + item.openblocks.stencil.name=Schablone item.openblocks.crayon.name=Magischer Buntstift item.openblocks.pencil.name=Magischer Bleistift diff --git a/src/main/resources/assets/openblocks/lang/es_AR.lang b/src/main/resources/assets/openblocks/lang/es_AR.lang index 70ded805..09494274 100644 --- a/src/main/resources/assets/openblocks/lang/es_AR.lang +++ b/src/main/resources/assets/openblocks/lang/es_AR.lang @@ -1,12 +1,9 @@ -//** OPENBLOCKS **// - -// Traducido al español por @SamerNieve - achievement.openblocks.droppedBrick=Zoinks! achievement.openblocks.droppedBrick.desc=Lo siento, simplemente ocurrió. stat.openblocks.bricksDropped=Se han caído los ladrillos achievement.openblocks.stackOverflow=Desbordamientos de montones achievement.openblocks.stackOverflow.desc=¡Está lleno de estrellas! + openblocks.keybind.category=OpenBlocks openblocks.keybind.drop_brick=Sé idiota @@ -41,7 +38,6 @@ openblocks.gui.drawingtable=Mesa de Dibujo openblocks.gui.digitalfuse=Detonador Digital openblocks.gui.xp_outputs=Salidas de XP openblocks.gui.item_outputs=Salidas de Objetos -openblocks.gui.watch_video=Ver vídeo openblocks.gui.max_level=Nivel máx.: %d openblocks.gui.save_folder=Guardar carpeta @@ -89,12 +85,14 @@ openblocks.misc.selected_cannon=Cañón seleccionado para apuntar openblocks.misc.pointed_cannon=Cañón apuntado a %s, %s, %s openblocks.misc.change_mode=Cambiando a modo %s openblocks.misc.change_size=Cambiando tamaño a %sx%sx%s +#openblocks.misc.change_box_size=Changing size to (%d,%d,%d):(%d,%d,%d) ## NEEDS TRANSLATION ## openblocks.misc.total_blocks=Número Total de Bloques: %d openblocks.misc.get_witched=¡Embrújate! openblocks.misc.page=Página %d de %d openblocks.misc.oh_no_ceiling=No puedes dormirte aquí, el techo te inquieta demasiado. openblocks.misc.oh_no_ground=¿¡Quieres dormir encima de ESO!? openblocks.misc.sleeping_bag_broken=Objeto inactivo debido a una fallo en la inicialización. +#openblocks.misc.inverted=Inverted ## NEEDS TRANSLATION ## openblocks.misc.grave_msg=%s (día: %.1f) @@ -128,12 +126,16 @@ openblocks.misc.shape=Forma: %s openblocks.misc.shape.sphere=Esfera openblocks.misc.shape.cylinder=Cilindro openblocks.misc.shape.cuboid=Cuboide +#openblocks.misc.shape.full_cuboid=Full Cuboid ## NEEDS TRANSLATION ## openblocks.misc.shape.dome=Cúpula openblocks.misc.shape.triangle=Triángulo openblocks.misc.shape.pentagon=Pentágono openblocks.misc.shape.hexagon=Hexágono openblocks.misc.shape.octagon=Octágono +#openblocks.misc.shape.axes=Axes ## NEEDS TRANSLATION ## +#openblocks.misc.shape.planes=Planes ## NEEDS TRANSLATION ## +#openblocks.misc.box=Dimensions: (%d,%d,%d):(%d,%d,%d) ## NEEDS TRANSLATION ## openblocks.misc.width=Anchura: %d openblocks.misc.height=Altura: %d openblocks.misc.depth=Profundidad: %d @@ -163,6 +165,8 @@ openblocks.misc.command.flim_flam_target=No le gustas a alguien. Alguien con pod openblocks.misc.command.flim_flam_failed=¡La estafa ha fallado! openblocks.misc.command.luck_added=Al jugador %s le ha cambiado la suerte, actualmente: %d openblocks.misc.command.luck_current=Suerte del jugador %s: %d + +#openblocks.misc.hidden_lore=§a§oHold ALT to see history§r ## NEEDS TRANSLATION ## openblocks.flim_flammed=Ha ocurrido algo extraño a tu alrededor openblocks.turtle.magnet=Imán @@ -170,12 +174,17 @@ openblocks.turtle.magnet=Imán tile.openblocks.elevator.name=Ascensor tile.openblocks.elevator.description=Coloca un ascensor justo arriba de 3 o más bloques arriba de otro sin ningún bloque entremedias y podrás saltar hacia arriba o agacharte para ir hacia abajo. Los ascensores pueden tintarse haciendo clic con un tinte, sin embargo, solo puedes teletransportarte entre ascensores del mismo color. +#tile.openblocks.elevator_rotating.name=Rotating Elevator ## NEEDS TRANSLATION ## + tile.openblocks.heal.name=Curador tile.openblocks.heal.description=El bloque curativo es un bloque creativo que proporciona un leve efecto de curación a través del tiempo. tile.openblocks.guide.name=Guía de Construcción tile.openblocks.guide.description=La guía de construcción te dará un contorno de bloques fantasma de diferentes formas y tamaños que te ayudará a planear tus habitaciones.\nPuedes hacer shift+clic para cambiar el forma, o puedes darle a loas diferentes cara para aumentar o disminuir el tamaño.\nCuando estás en modo creativo puedes colocar un bloque de obsidiana encima, y entonces golpear la guía de construcción con cualquier bloque que quieras para crear una forma automáticamente. +#tile.openblocks.builder_guide.name=Enhanced Building Guide ## NEEDS TRANSLATION ## +#tile.openblocks.builder_guide.description=This enhanced version of building guide not only displays ghost blocks to make building easier, but also allows you to place actual blocks. Just click central block with any block stack!\nWhen in creative mode you can place an obsidian block above, then hit the building guide with any block you like to automatically create the shape. ## NEEDS TRANSLATION ## + tile.openblocks.ladder.name=Escalera Cansina tile.openblocks.ladder.description=La escalera cansina soluciona ese irritante problema de saltar a través de una trampilla al final de la escalera. La escalera cansina actúa como una trampilla y una escalera al mismo tiempo. @@ -195,6 +204,9 @@ tile.openblocks.sponge.description=Esta esponja es un recambio de la esponja cor item.openblocks.spongeonastick.name=Palo con Esponja item.openblocks.spongeonastick.description=El palo con esponja es una herramienta para limpiar líquidos. Funciona como la Esponja, pero es más móvil a expensas de cansar más. +#item.openblocks.epic_eraser.name=Epic Eraser ## NEEDS TRANSLATION ## +#item.openblocks.epic_eraser.description=Every item has its own history...\n\nDon't you hate it?\nWith this item you can scrub all traces of epic lore your loot has collected over the years and then sell it on black market without worrying about evidence. ## NEEDS TRANSLATION ## + tile.openblocks.cannon.name=Cañón de Objetos tile.openblocks.cannon.description=Cuando se le aplique una señal de redstone, el cañon de objetos disparará los objetos que encuentre en un inventario adyacente. Usa el objeto 'apuntador' para apuntar el cañón. @@ -280,6 +292,7 @@ tile.openblocks.scaffolding.description=¿Has querido alguna vez subir hacia el tile.openblocks.goldenegg.name=Huevo Dorado tile.openblocks.digitalfuse.name=Detonador Digital + item.openblocks.cursor.name=Cursor item.openblocks.cursor.description=El cursor te permitirá hacer clic en bloques de forma remota.\nHaz shift+clic en un bloque para enlazarlo al cursor y luego usa el cursor donde quieras para acceder al bloque. Ve con cuidado, por defecto el cursor usa tu XP en relación a cuan lejos estás del bloque enlazado. @@ -318,6 +331,9 @@ item.openblocks.crane_backpack.description=En el mundo Minecraft "imán" es una item.openblocks.crane_control.name=Control de Grúa item.openblocks.crane_control.description=Este mando inalámbrico de alta tecnología se usa para controlar las grúas portatiles.\n\nClic derecho para subir, shift+clic-derecho para bajar y clic izquierdo para coger o soltar.\nLuces intermitentes señalan que algo está en el imán. +#item.openblocks.wrench.name=Big Metal Bar ## NEEDS TRANSLATION ## +#item.openblocks.wrench.description=This is extremely sophisticated tool used to perform transformations of objects with octahedral symmetry.\n\n\nOr just big, dumb piece of metal you can use to rotate cubes and stuff.\n\nSo yeah, it's yet another wrench. I'm just trying to be original here, ok? ## NEEDS TRANSLATION ## + item.openblocks.stencil.name=Plantilla item.openblocks.crayon.name=Cera Mágica item.openblocks.pencil.name=Lápiz Mágico diff --git a/src/main/resources/assets/openblocks/lang/es_ES.lang b/src/main/resources/assets/openblocks/lang/es_ES.lang index 70ded805..09494274 100644 --- a/src/main/resources/assets/openblocks/lang/es_ES.lang +++ b/src/main/resources/assets/openblocks/lang/es_ES.lang @@ -1,12 +1,9 @@ -//** OPENBLOCKS **// - -// Traducido al español por @SamerNieve - achievement.openblocks.droppedBrick=Zoinks! achievement.openblocks.droppedBrick.desc=Lo siento, simplemente ocurrió. stat.openblocks.bricksDropped=Se han caído los ladrillos achievement.openblocks.stackOverflow=Desbordamientos de montones achievement.openblocks.stackOverflow.desc=¡Está lleno de estrellas! + openblocks.keybind.category=OpenBlocks openblocks.keybind.drop_brick=Sé idiota @@ -41,7 +38,6 @@ openblocks.gui.drawingtable=Mesa de Dibujo openblocks.gui.digitalfuse=Detonador Digital openblocks.gui.xp_outputs=Salidas de XP openblocks.gui.item_outputs=Salidas de Objetos -openblocks.gui.watch_video=Ver vídeo openblocks.gui.max_level=Nivel máx.: %d openblocks.gui.save_folder=Guardar carpeta @@ -89,12 +85,14 @@ openblocks.misc.selected_cannon=Cañón seleccionado para apuntar openblocks.misc.pointed_cannon=Cañón apuntado a %s, %s, %s openblocks.misc.change_mode=Cambiando a modo %s openblocks.misc.change_size=Cambiando tamaño a %sx%sx%s +#openblocks.misc.change_box_size=Changing size to (%d,%d,%d):(%d,%d,%d) ## NEEDS TRANSLATION ## openblocks.misc.total_blocks=Número Total de Bloques: %d openblocks.misc.get_witched=¡Embrújate! openblocks.misc.page=Página %d de %d openblocks.misc.oh_no_ceiling=No puedes dormirte aquí, el techo te inquieta demasiado. openblocks.misc.oh_no_ground=¿¡Quieres dormir encima de ESO!? openblocks.misc.sleeping_bag_broken=Objeto inactivo debido a una fallo en la inicialización. +#openblocks.misc.inverted=Inverted ## NEEDS TRANSLATION ## openblocks.misc.grave_msg=%s (día: %.1f) @@ -128,12 +126,16 @@ openblocks.misc.shape=Forma: %s openblocks.misc.shape.sphere=Esfera openblocks.misc.shape.cylinder=Cilindro openblocks.misc.shape.cuboid=Cuboide +#openblocks.misc.shape.full_cuboid=Full Cuboid ## NEEDS TRANSLATION ## openblocks.misc.shape.dome=Cúpula openblocks.misc.shape.triangle=Triángulo openblocks.misc.shape.pentagon=Pentágono openblocks.misc.shape.hexagon=Hexágono openblocks.misc.shape.octagon=Octágono +#openblocks.misc.shape.axes=Axes ## NEEDS TRANSLATION ## +#openblocks.misc.shape.planes=Planes ## NEEDS TRANSLATION ## +#openblocks.misc.box=Dimensions: (%d,%d,%d):(%d,%d,%d) ## NEEDS TRANSLATION ## openblocks.misc.width=Anchura: %d openblocks.misc.height=Altura: %d openblocks.misc.depth=Profundidad: %d @@ -163,6 +165,8 @@ openblocks.misc.command.flim_flam_target=No le gustas a alguien. Alguien con pod openblocks.misc.command.flim_flam_failed=¡La estafa ha fallado! openblocks.misc.command.luck_added=Al jugador %s le ha cambiado la suerte, actualmente: %d openblocks.misc.command.luck_current=Suerte del jugador %s: %d + +#openblocks.misc.hidden_lore=§a§oHold ALT to see history§r ## NEEDS TRANSLATION ## openblocks.flim_flammed=Ha ocurrido algo extraño a tu alrededor openblocks.turtle.magnet=Imán @@ -170,12 +174,17 @@ openblocks.turtle.magnet=Imán tile.openblocks.elevator.name=Ascensor tile.openblocks.elevator.description=Coloca un ascensor justo arriba de 3 o más bloques arriba de otro sin ningún bloque entremedias y podrás saltar hacia arriba o agacharte para ir hacia abajo. Los ascensores pueden tintarse haciendo clic con un tinte, sin embargo, solo puedes teletransportarte entre ascensores del mismo color. +#tile.openblocks.elevator_rotating.name=Rotating Elevator ## NEEDS TRANSLATION ## + tile.openblocks.heal.name=Curador tile.openblocks.heal.description=El bloque curativo es un bloque creativo que proporciona un leve efecto de curación a través del tiempo. tile.openblocks.guide.name=Guía de Construcción tile.openblocks.guide.description=La guía de construcción te dará un contorno de bloques fantasma de diferentes formas y tamaños que te ayudará a planear tus habitaciones.\nPuedes hacer shift+clic para cambiar el forma, o puedes darle a loas diferentes cara para aumentar o disminuir el tamaño.\nCuando estás en modo creativo puedes colocar un bloque de obsidiana encima, y entonces golpear la guía de construcción con cualquier bloque que quieras para crear una forma automáticamente. +#tile.openblocks.builder_guide.name=Enhanced Building Guide ## NEEDS TRANSLATION ## +#tile.openblocks.builder_guide.description=This enhanced version of building guide not only displays ghost blocks to make building easier, but also allows you to place actual blocks. Just click central block with any block stack!\nWhen in creative mode you can place an obsidian block above, then hit the building guide with any block you like to automatically create the shape. ## NEEDS TRANSLATION ## + tile.openblocks.ladder.name=Escalera Cansina tile.openblocks.ladder.description=La escalera cansina soluciona ese irritante problema de saltar a través de una trampilla al final de la escalera. La escalera cansina actúa como una trampilla y una escalera al mismo tiempo. @@ -195,6 +204,9 @@ tile.openblocks.sponge.description=Esta esponja es un recambio de la esponja cor item.openblocks.spongeonastick.name=Palo con Esponja item.openblocks.spongeonastick.description=El palo con esponja es una herramienta para limpiar líquidos. Funciona como la Esponja, pero es más móvil a expensas de cansar más. +#item.openblocks.epic_eraser.name=Epic Eraser ## NEEDS TRANSLATION ## +#item.openblocks.epic_eraser.description=Every item has its own history...\n\nDon't you hate it?\nWith this item you can scrub all traces of epic lore your loot has collected over the years and then sell it on black market without worrying about evidence. ## NEEDS TRANSLATION ## + tile.openblocks.cannon.name=Cañón de Objetos tile.openblocks.cannon.description=Cuando se le aplique una señal de redstone, el cañon de objetos disparará los objetos que encuentre en un inventario adyacente. Usa el objeto 'apuntador' para apuntar el cañón. @@ -280,6 +292,7 @@ tile.openblocks.scaffolding.description=¿Has querido alguna vez subir hacia el tile.openblocks.goldenegg.name=Huevo Dorado tile.openblocks.digitalfuse.name=Detonador Digital + item.openblocks.cursor.name=Cursor item.openblocks.cursor.description=El cursor te permitirá hacer clic en bloques de forma remota.\nHaz shift+clic en un bloque para enlazarlo al cursor y luego usa el cursor donde quieras para acceder al bloque. Ve con cuidado, por defecto el cursor usa tu XP en relación a cuan lejos estás del bloque enlazado. @@ -318,6 +331,9 @@ item.openblocks.crane_backpack.description=En el mundo Minecraft "imán" es una item.openblocks.crane_control.name=Control de Grúa item.openblocks.crane_control.description=Este mando inalámbrico de alta tecnología se usa para controlar las grúas portatiles.\n\nClic derecho para subir, shift+clic-derecho para bajar y clic izquierdo para coger o soltar.\nLuces intermitentes señalan que algo está en el imán. +#item.openblocks.wrench.name=Big Metal Bar ## NEEDS TRANSLATION ## +#item.openblocks.wrench.description=This is extremely sophisticated tool used to perform transformations of objects with octahedral symmetry.\n\n\nOr just big, dumb piece of metal you can use to rotate cubes and stuff.\n\nSo yeah, it's yet another wrench. I'm just trying to be original here, ok? ## NEEDS TRANSLATION ## + item.openblocks.stencil.name=Plantilla item.openblocks.crayon.name=Cera Mágica item.openblocks.pencil.name=Lápiz Mágico diff --git a/src/main/resources/assets/openblocks/lang/es_MX.lang b/src/main/resources/assets/openblocks/lang/es_MX.lang index 70ded805..09494274 100644 --- a/src/main/resources/assets/openblocks/lang/es_MX.lang +++ b/src/main/resources/assets/openblocks/lang/es_MX.lang @@ -1,12 +1,9 @@ -//** OPENBLOCKS **// - -// Traducido al español por @SamerNieve - achievement.openblocks.droppedBrick=Zoinks! achievement.openblocks.droppedBrick.desc=Lo siento, simplemente ocurrió. stat.openblocks.bricksDropped=Se han caído los ladrillos achievement.openblocks.stackOverflow=Desbordamientos de montones achievement.openblocks.stackOverflow.desc=¡Está lleno de estrellas! + openblocks.keybind.category=OpenBlocks openblocks.keybind.drop_brick=Sé idiota @@ -41,7 +38,6 @@ openblocks.gui.drawingtable=Mesa de Dibujo openblocks.gui.digitalfuse=Detonador Digital openblocks.gui.xp_outputs=Salidas de XP openblocks.gui.item_outputs=Salidas de Objetos -openblocks.gui.watch_video=Ver vídeo openblocks.gui.max_level=Nivel máx.: %d openblocks.gui.save_folder=Guardar carpeta @@ -89,12 +85,14 @@ openblocks.misc.selected_cannon=Cañón seleccionado para apuntar openblocks.misc.pointed_cannon=Cañón apuntado a %s, %s, %s openblocks.misc.change_mode=Cambiando a modo %s openblocks.misc.change_size=Cambiando tamaño a %sx%sx%s +#openblocks.misc.change_box_size=Changing size to (%d,%d,%d):(%d,%d,%d) ## NEEDS TRANSLATION ## openblocks.misc.total_blocks=Número Total de Bloques: %d openblocks.misc.get_witched=¡Embrújate! openblocks.misc.page=Página %d de %d openblocks.misc.oh_no_ceiling=No puedes dormirte aquí, el techo te inquieta demasiado. openblocks.misc.oh_no_ground=¿¡Quieres dormir encima de ESO!? openblocks.misc.sleeping_bag_broken=Objeto inactivo debido a una fallo en la inicialización. +#openblocks.misc.inverted=Inverted ## NEEDS TRANSLATION ## openblocks.misc.grave_msg=%s (día: %.1f) @@ -128,12 +126,16 @@ openblocks.misc.shape=Forma: %s openblocks.misc.shape.sphere=Esfera openblocks.misc.shape.cylinder=Cilindro openblocks.misc.shape.cuboid=Cuboide +#openblocks.misc.shape.full_cuboid=Full Cuboid ## NEEDS TRANSLATION ## openblocks.misc.shape.dome=Cúpula openblocks.misc.shape.triangle=Triángulo openblocks.misc.shape.pentagon=Pentágono openblocks.misc.shape.hexagon=Hexágono openblocks.misc.shape.octagon=Octágono +#openblocks.misc.shape.axes=Axes ## NEEDS TRANSLATION ## +#openblocks.misc.shape.planes=Planes ## NEEDS TRANSLATION ## +#openblocks.misc.box=Dimensions: (%d,%d,%d):(%d,%d,%d) ## NEEDS TRANSLATION ## openblocks.misc.width=Anchura: %d openblocks.misc.height=Altura: %d openblocks.misc.depth=Profundidad: %d @@ -163,6 +165,8 @@ openblocks.misc.command.flim_flam_target=No le gustas a alguien. Alguien con pod openblocks.misc.command.flim_flam_failed=¡La estafa ha fallado! openblocks.misc.command.luck_added=Al jugador %s le ha cambiado la suerte, actualmente: %d openblocks.misc.command.luck_current=Suerte del jugador %s: %d + +#openblocks.misc.hidden_lore=§a§oHold ALT to see history§r ## NEEDS TRANSLATION ## openblocks.flim_flammed=Ha ocurrido algo extraño a tu alrededor openblocks.turtle.magnet=Imán @@ -170,12 +174,17 @@ openblocks.turtle.magnet=Imán tile.openblocks.elevator.name=Ascensor tile.openblocks.elevator.description=Coloca un ascensor justo arriba de 3 o más bloques arriba de otro sin ningún bloque entremedias y podrás saltar hacia arriba o agacharte para ir hacia abajo. Los ascensores pueden tintarse haciendo clic con un tinte, sin embargo, solo puedes teletransportarte entre ascensores del mismo color. +#tile.openblocks.elevator_rotating.name=Rotating Elevator ## NEEDS TRANSLATION ## + tile.openblocks.heal.name=Curador tile.openblocks.heal.description=El bloque curativo es un bloque creativo que proporciona un leve efecto de curación a través del tiempo. tile.openblocks.guide.name=Guía de Construcción tile.openblocks.guide.description=La guía de construcción te dará un contorno de bloques fantasma de diferentes formas y tamaños que te ayudará a planear tus habitaciones.\nPuedes hacer shift+clic para cambiar el forma, o puedes darle a loas diferentes cara para aumentar o disminuir el tamaño.\nCuando estás en modo creativo puedes colocar un bloque de obsidiana encima, y entonces golpear la guía de construcción con cualquier bloque que quieras para crear una forma automáticamente. +#tile.openblocks.builder_guide.name=Enhanced Building Guide ## NEEDS TRANSLATION ## +#tile.openblocks.builder_guide.description=This enhanced version of building guide not only displays ghost blocks to make building easier, but also allows you to place actual blocks. Just click central block with any block stack!\nWhen in creative mode you can place an obsidian block above, then hit the building guide with any block you like to automatically create the shape. ## NEEDS TRANSLATION ## + tile.openblocks.ladder.name=Escalera Cansina tile.openblocks.ladder.description=La escalera cansina soluciona ese irritante problema de saltar a través de una trampilla al final de la escalera. La escalera cansina actúa como una trampilla y una escalera al mismo tiempo. @@ -195,6 +204,9 @@ tile.openblocks.sponge.description=Esta esponja es un recambio de la esponja cor item.openblocks.spongeonastick.name=Palo con Esponja item.openblocks.spongeonastick.description=El palo con esponja es una herramienta para limpiar líquidos. Funciona como la Esponja, pero es más móvil a expensas de cansar más. +#item.openblocks.epic_eraser.name=Epic Eraser ## NEEDS TRANSLATION ## +#item.openblocks.epic_eraser.description=Every item has its own history...\n\nDon't you hate it?\nWith this item you can scrub all traces of epic lore your loot has collected over the years and then sell it on black market without worrying about evidence. ## NEEDS TRANSLATION ## + tile.openblocks.cannon.name=Cañón de Objetos tile.openblocks.cannon.description=Cuando se le aplique una señal de redstone, el cañon de objetos disparará los objetos que encuentre en un inventario adyacente. Usa el objeto 'apuntador' para apuntar el cañón. @@ -280,6 +292,7 @@ tile.openblocks.scaffolding.description=¿Has querido alguna vez subir hacia el tile.openblocks.goldenegg.name=Huevo Dorado tile.openblocks.digitalfuse.name=Detonador Digital + item.openblocks.cursor.name=Cursor item.openblocks.cursor.description=El cursor te permitirá hacer clic en bloques de forma remota.\nHaz shift+clic en un bloque para enlazarlo al cursor y luego usa el cursor donde quieras para acceder al bloque. Ve con cuidado, por defecto el cursor usa tu XP en relación a cuan lejos estás del bloque enlazado. @@ -318,6 +331,9 @@ item.openblocks.crane_backpack.description=En el mundo Minecraft "imán" es una item.openblocks.crane_control.name=Control de Grúa item.openblocks.crane_control.description=Este mando inalámbrico de alta tecnología se usa para controlar las grúas portatiles.\n\nClic derecho para subir, shift+clic-derecho para bajar y clic izquierdo para coger o soltar.\nLuces intermitentes señalan que algo está en el imán. +#item.openblocks.wrench.name=Big Metal Bar ## NEEDS TRANSLATION ## +#item.openblocks.wrench.description=This is extremely sophisticated tool used to perform transformations of objects with octahedral symmetry.\n\n\nOr just big, dumb piece of metal you can use to rotate cubes and stuff.\n\nSo yeah, it's yet another wrench. I'm just trying to be original here, ok? ## NEEDS TRANSLATION ## + item.openblocks.stencil.name=Plantilla item.openblocks.crayon.name=Cera Mágica item.openblocks.pencil.name=Lápiz Mágico diff --git a/src/main/resources/assets/openblocks/lang/es_UY.lang b/src/main/resources/assets/openblocks/lang/es_UY.lang index 70ded805..09494274 100644 --- a/src/main/resources/assets/openblocks/lang/es_UY.lang +++ b/src/main/resources/assets/openblocks/lang/es_UY.lang @@ -1,12 +1,9 @@ -//** OPENBLOCKS **// - -// Traducido al español por @SamerNieve - achievement.openblocks.droppedBrick=Zoinks! achievement.openblocks.droppedBrick.desc=Lo siento, simplemente ocurrió. stat.openblocks.bricksDropped=Se han caído los ladrillos achievement.openblocks.stackOverflow=Desbordamientos de montones achievement.openblocks.stackOverflow.desc=¡Está lleno de estrellas! + openblocks.keybind.category=OpenBlocks openblocks.keybind.drop_brick=Sé idiota @@ -41,7 +38,6 @@ openblocks.gui.drawingtable=Mesa de Dibujo openblocks.gui.digitalfuse=Detonador Digital openblocks.gui.xp_outputs=Salidas de XP openblocks.gui.item_outputs=Salidas de Objetos -openblocks.gui.watch_video=Ver vídeo openblocks.gui.max_level=Nivel máx.: %d openblocks.gui.save_folder=Guardar carpeta @@ -89,12 +85,14 @@ openblocks.misc.selected_cannon=Cañón seleccionado para apuntar openblocks.misc.pointed_cannon=Cañón apuntado a %s, %s, %s openblocks.misc.change_mode=Cambiando a modo %s openblocks.misc.change_size=Cambiando tamaño a %sx%sx%s +#openblocks.misc.change_box_size=Changing size to (%d,%d,%d):(%d,%d,%d) ## NEEDS TRANSLATION ## openblocks.misc.total_blocks=Número Total de Bloques: %d openblocks.misc.get_witched=¡Embrújate! openblocks.misc.page=Página %d de %d openblocks.misc.oh_no_ceiling=No puedes dormirte aquí, el techo te inquieta demasiado. openblocks.misc.oh_no_ground=¿¡Quieres dormir encima de ESO!? openblocks.misc.sleeping_bag_broken=Objeto inactivo debido a una fallo en la inicialización. +#openblocks.misc.inverted=Inverted ## NEEDS TRANSLATION ## openblocks.misc.grave_msg=%s (día: %.1f) @@ -128,12 +126,16 @@ openblocks.misc.shape=Forma: %s openblocks.misc.shape.sphere=Esfera openblocks.misc.shape.cylinder=Cilindro openblocks.misc.shape.cuboid=Cuboide +#openblocks.misc.shape.full_cuboid=Full Cuboid ## NEEDS TRANSLATION ## openblocks.misc.shape.dome=Cúpula openblocks.misc.shape.triangle=Triángulo openblocks.misc.shape.pentagon=Pentágono openblocks.misc.shape.hexagon=Hexágono openblocks.misc.shape.octagon=Octágono +#openblocks.misc.shape.axes=Axes ## NEEDS TRANSLATION ## +#openblocks.misc.shape.planes=Planes ## NEEDS TRANSLATION ## +#openblocks.misc.box=Dimensions: (%d,%d,%d):(%d,%d,%d) ## NEEDS TRANSLATION ## openblocks.misc.width=Anchura: %d openblocks.misc.height=Altura: %d openblocks.misc.depth=Profundidad: %d @@ -163,6 +165,8 @@ openblocks.misc.command.flim_flam_target=No le gustas a alguien. Alguien con pod openblocks.misc.command.flim_flam_failed=¡La estafa ha fallado! openblocks.misc.command.luck_added=Al jugador %s le ha cambiado la suerte, actualmente: %d openblocks.misc.command.luck_current=Suerte del jugador %s: %d + +#openblocks.misc.hidden_lore=§a§oHold ALT to see history§r ## NEEDS TRANSLATION ## openblocks.flim_flammed=Ha ocurrido algo extraño a tu alrededor openblocks.turtle.magnet=Imán @@ -170,12 +174,17 @@ openblocks.turtle.magnet=Imán tile.openblocks.elevator.name=Ascensor tile.openblocks.elevator.description=Coloca un ascensor justo arriba de 3 o más bloques arriba de otro sin ningún bloque entremedias y podrás saltar hacia arriba o agacharte para ir hacia abajo. Los ascensores pueden tintarse haciendo clic con un tinte, sin embargo, solo puedes teletransportarte entre ascensores del mismo color. +#tile.openblocks.elevator_rotating.name=Rotating Elevator ## NEEDS TRANSLATION ## + tile.openblocks.heal.name=Curador tile.openblocks.heal.description=El bloque curativo es un bloque creativo que proporciona un leve efecto de curación a través del tiempo. tile.openblocks.guide.name=Guía de Construcción tile.openblocks.guide.description=La guía de construcción te dará un contorno de bloques fantasma de diferentes formas y tamaños que te ayudará a planear tus habitaciones.\nPuedes hacer shift+clic para cambiar el forma, o puedes darle a loas diferentes cara para aumentar o disminuir el tamaño.\nCuando estás en modo creativo puedes colocar un bloque de obsidiana encima, y entonces golpear la guía de construcción con cualquier bloque que quieras para crear una forma automáticamente. +#tile.openblocks.builder_guide.name=Enhanced Building Guide ## NEEDS TRANSLATION ## +#tile.openblocks.builder_guide.description=This enhanced version of building guide not only displays ghost blocks to make building easier, but also allows you to place actual blocks. Just click central block with any block stack!\nWhen in creative mode you can place an obsidian block above, then hit the building guide with any block you like to automatically create the shape. ## NEEDS TRANSLATION ## + tile.openblocks.ladder.name=Escalera Cansina tile.openblocks.ladder.description=La escalera cansina soluciona ese irritante problema de saltar a través de una trampilla al final de la escalera. La escalera cansina actúa como una trampilla y una escalera al mismo tiempo. @@ -195,6 +204,9 @@ tile.openblocks.sponge.description=Esta esponja es un recambio de la esponja cor item.openblocks.spongeonastick.name=Palo con Esponja item.openblocks.spongeonastick.description=El palo con esponja es una herramienta para limpiar líquidos. Funciona como la Esponja, pero es más móvil a expensas de cansar más. +#item.openblocks.epic_eraser.name=Epic Eraser ## NEEDS TRANSLATION ## +#item.openblocks.epic_eraser.description=Every item has its own history...\n\nDon't you hate it?\nWith this item you can scrub all traces of epic lore your loot has collected over the years and then sell it on black market without worrying about evidence. ## NEEDS TRANSLATION ## + tile.openblocks.cannon.name=Cañón de Objetos tile.openblocks.cannon.description=Cuando se le aplique una señal de redstone, el cañon de objetos disparará los objetos que encuentre en un inventario adyacente. Usa el objeto 'apuntador' para apuntar el cañón. @@ -280,6 +292,7 @@ tile.openblocks.scaffolding.description=¿Has querido alguna vez subir hacia el tile.openblocks.goldenegg.name=Huevo Dorado tile.openblocks.digitalfuse.name=Detonador Digital + item.openblocks.cursor.name=Cursor item.openblocks.cursor.description=El cursor te permitirá hacer clic en bloques de forma remota.\nHaz shift+clic en un bloque para enlazarlo al cursor y luego usa el cursor donde quieras para acceder al bloque. Ve con cuidado, por defecto el cursor usa tu XP en relación a cuan lejos estás del bloque enlazado. @@ -318,6 +331,9 @@ item.openblocks.crane_backpack.description=En el mundo Minecraft "imán" es una item.openblocks.crane_control.name=Control de Grúa item.openblocks.crane_control.description=Este mando inalámbrico de alta tecnología se usa para controlar las grúas portatiles.\n\nClic derecho para subir, shift+clic-derecho para bajar y clic izquierdo para coger o soltar.\nLuces intermitentes señalan que algo está en el imán. +#item.openblocks.wrench.name=Big Metal Bar ## NEEDS TRANSLATION ## +#item.openblocks.wrench.description=This is extremely sophisticated tool used to perform transformations of objects with octahedral symmetry.\n\n\nOr just big, dumb piece of metal you can use to rotate cubes and stuff.\n\nSo yeah, it's yet another wrench. I'm just trying to be original here, ok? ## NEEDS TRANSLATION ## + item.openblocks.stencil.name=Plantilla item.openblocks.crayon.name=Cera Mágica item.openblocks.pencil.name=Lápiz Mágico diff --git a/src/main/resources/assets/openblocks/lang/es_VE.lang b/src/main/resources/assets/openblocks/lang/es_VE.lang index 70ded805..09494274 100644 --- a/src/main/resources/assets/openblocks/lang/es_VE.lang +++ b/src/main/resources/assets/openblocks/lang/es_VE.lang @@ -1,12 +1,9 @@ -//** OPENBLOCKS **// - -// Traducido al español por @SamerNieve - achievement.openblocks.droppedBrick=Zoinks! achievement.openblocks.droppedBrick.desc=Lo siento, simplemente ocurrió. stat.openblocks.bricksDropped=Se han caído los ladrillos achievement.openblocks.stackOverflow=Desbordamientos de montones achievement.openblocks.stackOverflow.desc=¡Está lleno de estrellas! + openblocks.keybind.category=OpenBlocks openblocks.keybind.drop_brick=Sé idiota @@ -41,7 +38,6 @@ openblocks.gui.drawingtable=Mesa de Dibujo openblocks.gui.digitalfuse=Detonador Digital openblocks.gui.xp_outputs=Salidas de XP openblocks.gui.item_outputs=Salidas de Objetos -openblocks.gui.watch_video=Ver vídeo openblocks.gui.max_level=Nivel máx.: %d openblocks.gui.save_folder=Guardar carpeta @@ -89,12 +85,14 @@ openblocks.misc.selected_cannon=Cañón seleccionado para apuntar openblocks.misc.pointed_cannon=Cañón apuntado a %s, %s, %s openblocks.misc.change_mode=Cambiando a modo %s openblocks.misc.change_size=Cambiando tamaño a %sx%sx%s +#openblocks.misc.change_box_size=Changing size to (%d,%d,%d):(%d,%d,%d) ## NEEDS TRANSLATION ## openblocks.misc.total_blocks=Número Total de Bloques: %d openblocks.misc.get_witched=¡Embrújate! openblocks.misc.page=Página %d de %d openblocks.misc.oh_no_ceiling=No puedes dormirte aquí, el techo te inquieta demasiado. openblocks.misc.oh_no_ground=¿¡Quieres dormir encima de ESO!? openblocks.misc.sleeping_bag_broken=Objeto inactivo debido a una fallo en la inicialización. +#openblocks.misc.inverted=Inverted ## NEEDS TRANSLATION ## openblocks.misc.grave_msg=%s (día: %.1f) @@ -128,12 +126,16 @@ openblocks.misc.shape=Forma: %s openblocks.misc.shape.sphere=Esfera openblocks.misc.shape.cylinder=Cilindro openblocks.misc.shape.cuboid=Cuboide +#openblocks.misc.shape.full_cuboid=Full Cuboid ## NEEDS TRANSLATION ## openblocks.misc.shape.dome=Cúpula openblocks.misc.shape.triangle=Triángulo openblocks.misc.shape.pentagon=Pentágono openblocks.misc.shape.hexagon=Hexágono openblocks.misc.shape.octagon=Octágono +#openblocks.misc.shape.axes=Axes ## NEEDS TRANSLATION ## +#openblocks.misc.shape.planes=Planes ## NEEDS TRANSLATION ## +#openblocks.misc.box=Dimensions: (%d,%d,%d):(%d,%d,%d) ## NEEDS TRANSLATION ## openblocks.misc.width=Anchura: %d openblocks.misc.height=Altura: %d openblocks.misc.depth=Profundidad: %d @@ -163,6 +165,8 @@ openblocks.misc.command.flim_flam_target=No le gustas a alguien. Alguien con pod openblocks.misc.command.flim_flam_failed=¡La estafa ha fallado! openblocks.misc.command.luck_added=Al jugador %s le ha cambiado la suerte, actualmente: %d openblocks.misc.command.luck_current=Suerte del jugador %s: %d + +#openblocks.misc.hidden_lore=§a§oHold ALT to see history§r ## NEEDS TRANSLATION ## openblocks.flim_flammed=Ha ocurrido algo extraño a tu alrededor openblocks.turtle.magnet=Imán @@ -170,12 +174,17 @@ openblocks.turtle.magnet=Imán tile.openblocks.elevator.name=Ascensor tile.openblocks.elevator.description=Coloca un ascensor justo arriba de 3 o más bloques arriba de otro sin ningún bloque entremedias y podrás saltar hacia arriba o agacharte para ir hacia abajo. Los ascensores pueden tintarse haciendo clic con un tinte, sin embargo, solo puedes teletransportarte entre ascensores del mismo color. +#tile.openblocks.elevator_rotating.name=Rotating Elevator ## NEEDS TRANSLATION ## + tile.openblocks.heal.name=Curador tile.openblocks.heal.description=El bloque curativo es un bloque creativo que proporciona un leve efecto de curación a través del tiempo. tile.openblocks.guide.name=Guía de Construcción tile.openblocks.guide.description=La guía de construcción te dará un contorno de bloques fantasma de diferentes formas y tamaños que te ayudará a planear tus habitaciones.\nPuedes hacer shift+clic para cambiar el forma, o puedes darle a loas diferentes cara para aumentar o disminuir el tamaño.\nCuando estás en modo creativo puedes colocar un bloque de obsidiana encima, y entonces golpear la guía de construcción con cualquier bloque que quieras para crear una forma automáticamente. +#tile.openblocks.builder_guide.name=Enhanced Building Guide ## NEEDS TRANSLATION ## +#tile.openblocks.builder_guide.description=This enhanced version of building guide not only displays ghost blocks to make building easier, but also allows you to place actual blocks. Just click central block with any block stack!\nWhen in creative mode you can place an obsidian block above, then hit the building guide with any block you like to automatically create the shape. ## NEEDS TRANSLATION ## + tile.openblocks.ladder.name=Escalera Cansina tile.openblocks.ladder.description=La escalera cansina soluciona ese irritante problema de saltar a través de una trampilla al final de la escalera. La escalera cansina actúa como una trampilla y una escalera al mismo tiempo. @@ -195,6 +204,9 @@ tile.openblocks.sponge.description=Esta esponja es un recambio de la esponja cor item.openblocks.spongeonastick.name=Palo con Esponja item.openblocks.spongeonastick.description=El palo con esponja es una herramienta para limpiar líquidos. Funciona como la Esponja, pero es más móvil a expensas de cansar más. +#item.openblocks.epic_eraser.name=Epic Eraser ## NEEDS TRANSLATION ## +#item.openblocks.epic_eraser.description=Every item has its own history...\n\nDon't you hate it?\nWith this item you can scrub all traces of epic lore your loot has collected over the years and then sell it on black market without worrying about evidence. ## NEEDS TRANSLATION ## + tile.openblocks.cannon.name=Cañón de Objetos tile.openblocks.cannon.description=Cuando se le aplique una señal de redstone, el cañon de objetos disparará los objetos que encuentre en un inventario adyacente. Usa el objeto 'apuntador' para apuntar el cañón. @@ -280,6 +292,7 @@ tile.openblocks.scaffolding.description=¿Has querido alguna vez subir hacia el tile.openblocks.goldenegg.name=Huevo Dorado tile.openblocks.digitalfuse.name=Detonador Digital + item.openblocks.cursor.name=Cursor item.openblocks.cursor.description=El cursor te permitirá hacer clic en bloques de forma remota.\nHaz shift+clic en un bloque para enlazarlo al cursor y luego usa el cursor donde quieras para acceder al bloque. Ve con cuidado, por defecto el cursor usa tu XP en relación a cuan lejos estás del bloque enlazado. @@ -318,6 +331,9 @@ item.openblocks.crane_backpack.description=En el mundo Minecraft "imán" es una item.openblocks.crane_control.name=Control de Grúa item.openblocks.crane_control.description=Este mando inalámbrico de alta tecnología se usa para controlar las grúas portatiles.\n\nClic derecho para subir, shift+clic-derecho para bajar y clic izquierdo para coger o soltar.\nLuces intermitentes señalan que algo está en el imán. +#item.openblocks.wrench.name=Big Metal Bar ## NEEDS TRANSLATION ## +#item.openblocks.wrench.description=This is extremely sophisticated tool used to perform transformations of objects with octahedral symmetry.\n\n\nOr just big, dumb piece of metal you can use to rotate cubes and stuff.\n\nSo yeah, it's yet another wrench. I'm just trying to be original here, ok? ## NEEDS TRANSLATION ## + item.openblocks.stencil.name=Plantilla item.openblocks.crayon.name=Cera Mágica item.openblocks.pencil.name=Lápiz Mágico diff --git a/src/main/resources/assets/openblocks/lang/et_EE.lang b/src/main/resources/assets/openblocks/lang/et_EE.lang index 52916352..62f5f0e1 100644 --- a/src/main/resources/assets/openblocks/lang/et_EE.lang +++ b/src/main/resources/assets/openblocks/lang/et_EE.lang @@ -1,13 +1,25 @@ achievement.openblocks.droppedBrick=Zoinks! achievement.openblocks.droppedBrick.desc=Vabandust, see just juhtus... stat.openblocks.bricksDropped=Telliseid maha visatud +#achievement.openblocks.stackOverflow=Stack Overflow ## NEEDS TRANSLATION ## +#achievement.openblocks.stackOverflow.desc=It's full of stars! ## NEEDS TRANSLATION ## +#openblocks.keybind.category=OpenBlocks ## NEEDS TRANSLATION ## openblocks.keybind.drop_brick=Ole rumal enchantment.openblocks.explosive=Ebastabiilne enchantment.openblocks.laststand=Last Stand enchantment.openblocks.flimflam=Flim Flam +openblocks.gui.blocks=Plokid +openblocks.gui.items=Asjad +openblocks.gui.misc=Muu +#openblocks.gui.changelogs=Changelogs ## NEEDS TRANSLATION ## + +#openblocks.gui.features=Features ## NEEDS TRANSLATION ## +#openblocks.gui.bugfixes=Bugfixes ## NEEDS TRANSLATION ## +#openblocks.gui.tweaks=Tweaks ## NEEDS TRANSLATION ## + openblocks.gui.luggage=Kohver openblocks.gui.sprinkler=Vihmuti openblocks.gui.vacuumhopper=Vaakum Püüdja @@ -23,31 +35,35 @@ openblocks.gui.itemdropper=Asjade Heitja openblocks.gui.blockplacer=Ploki Asetaja openblocks.gui.paintmixer=Värvi Segaja openblocks.gui.drawingtable=Joonistus Laud -openblocks.gui.blocks=Plokid -openblocks.gui.items=Asjad -openblocks.gui.misc=Muu openblocks.gui.digitalfuse=Digital Fuse +#openblocks.gui.xp_outputs=XP Outputs ## NEEDS TRANSLATION ## +#openblocks.gui.item_outputs=Item Outputs ## NEEDS TRANSLATION ## +#openblocks.gui.max_level=Max. Level: %d ## NEEDS TRANSLATION ## +#openblocks.gui.save_folder=Save folder ## NEEDS TRANSLATION ## openblocks.gui.welcome.title=Tere tulemast! -openblocks.gui.welcome.content=OpenBlocks is a new open source mod that introduces a variety of ideas into Minecraft, including hang gliders, elevators, tanks, graves, paints, cranes, liquid XP, cartographers, trophies and more! +#openblocks.gui.welcome.content=OpenBlocks is a new open source mod that introduces a variety of ideas into Minecraft, including hang gliders, elevators, tanks, graves, paints, cranes, liquid XP, cartographers, trophies and more! ## NEEDS TRANSLATION ## openblocks.gui.credits.title=Autorid -openblocks.gui.credits.content=§LBoq, Mikee and NeverCast§R - Juhtivad OpenBlocksi arendajad (are we allowed to credit ourselves?)\n\n§LSinZ and Yoshi2§R - members of the OpenMods team from the start.\n\n§LVexatos and crafteverywhere§R - Regularly translating the mods.\n\nEveryone else who has contributed to the code over the past year.\n\n§LDirewolf20 and the rest of ForgeCraft§R - for putting up with the bugs and crashes before we release.\n\nEveryone who's done spotlights, lets plays and generally supported the mod since we started! +#openblocks.gui.credits.content=§LBoq, Mikee and NeverCast§R - Leading developers of OpenBlocks (are we allowed to credit ourselves?)\n\n§LSinZ and Yoshi2§R - members of the OpenMods team from the start.\n\n§LVexatos and crafteverywhere§R - Regularly translating the mods.\n\nEveryone else who has contributed to the code over the past two years.\n\n§LDirewolf20 and the rest of ForgeCraft§R - for putting up with the bugs and crashes before we release.\n\nEveryone who's done spotlights, lets plays and generally supported the mod since we started! ## NEEDS TRANSLATION ## -openblocks.gui.config.title=Easy Config Editing -openblocks.gui.config.content=OpenMods allow for both client and server config options to be changed from chat commands. Some don't even require restart!\n\nServer config settings can be changed using '§L/om_config_s§R' (op needed) and client config settings can be changed using '§L/om_config_c§R'\n\nFor example:\n\n§L/om_config_s set OpenBlocks dropblock elevatorDrainsXP false§R\n§L/om_config_s save§R\n\nFor a full list of commands type: §L/help om_config_s§R or §L/help om_config_c§R +#openblocks.gui.config.title=Easy Config Editing ## NEEDS TRANSLATION ## +#openblocks.gui.config.content=OpenMods allow for both client and server config options to be changed from chat commands. Some don't even require restart!\n\nServer config settings can be changed using '§L/om_config_s§R' (op needed) and client config settings can be changed using '§L/om_config_c§R'\n\nFor example:\n\n§L/om_config_s set OpenBlocks dropblock elevatorDrainsXP false§R\n§L/om_config_s save§R\n\nFor a full list of commands type: §L/help om_config_s§R or §L/help om_config_c§R ## NEEDS TRANSLATION ## -openblocks.gui.bkey.title=The Infamous 'B' Key -openblocks.gui.bkey.content=The 'B' key is a very special key in OpenBlocks.\n\nEnabling the 'weAreSeriousPeople' config option in the 'tomfoolery' category of both the client and server config files will give you your very own digestive system.\n\nTry eating some of that tasty clay and press 'B' to digest! +#openblocks.gui.restore_inv.title=Inventory backup ## NEEDS TRANSLATION ## +#openblocks.gui.restore_inv.content=Everyone can make mistake. But with §L/ob_inventory§R command you can fix some of them. This command can be used to restore inventory. Backup is created when:\n - player dies\n - grave is spawned \n - player issued command §L/ob_inventory store§R\n\nTo restore inventory you need backup name. Go to folder below or to saves folder on server and look for files named §Linventory-*.dat§R. Then restore inventory with §L/ob_inventory restore §R - where id is either full filename or just middle part, without §Linventory-§R and §L.dat§R. You can also use tab completion. Backups are normal NBT files and can be opened with any editor. ## NEEDS TRANSLATION ## -openblocks.gui.unstable.title=Unstable Enchantment -openblocks.gui.unstable.content=We've had unconfirmed reports that this enchantment causes any gunpowder you're carrying to become unstable when you're attacked or when you jump off something.\n\nUse at your own risk! +#openblocks.gui.bkey.title=The Infamous 'B' Key ## NEEDS TRANSLATION ## +#openblocks.gui.bkey.content=The 'B' key is a very special key in OpenBlocks.\n\nEnabling the 'weAreSeriousPeople' config option in the 'tomfoolery' category of both the client and server config files will give you your very own digestive system.\n\nTry eating some of that tasty clay and press 'B' to digest! ## NEEDS TRANSLATION ## -openblocks.gui.flimflam.title=Flim Flam Enchantment -openblocks.gui.flimflam.content=Scientists have yet to discover the properties of this enchantment. +#openblocks.gui.unstable.title=Unstable Enchantment ## NEEDS TRANSLATION ## +#openblocks.gui.unstable.content=We've had unconfirmed reports that this enchantment causes any gunpowder you're carrying to become unstable when you're attacked or when you jump off something.\n\nUse at your own risk! ## NEEDS TRANSLATION ## -openblocks.gui.laststand.title=Last Stand Enchantment -openblocks.gui.laststand.content=The last stand enchantment uses your XP bar as a final protection against dying.\n\nWhen you reach 0.5 hearts, the game will take XP from you whenever you're damaged instead of killing you. The higher number of enchantments you have the cheaper the XP cost will be. +#openblocks.gui.flimflam.title=Flim Flam Enchantment ## NEEDS TRANSLATION ## +#openblocks.gui.flimflam.content=Scientists have yet to discover the properties of this enchantment. ## NEEDS TRANSLATION ## + +#openblocks.gui.laststand.title=Last Stand Enchantment ## NEEDS TRANSLATION ## +#openblocks.gui.laststand.content=The last stand enchantment uses your XP bar as a final protection against dying.\n\nWhen you reach 0.5 hearts, the game will take XP from you whenever you're damaged instead of killing you. The higher number of enchantments you have the cheaper the XP cost will be. ## NEEDS TRANSLATION ## openblocks.changelog.title=Mida uut on OpenBlocks %s openblocks.misc.url=URL: %s @@ -57,28 +73,72 @@ openblocks.misc.color=Värv: %06X openblocks.misc.mode=Placement mode: %s openblocks.misc.mode.block=Plokk openblocks.misc.mode.panel=Paneel -openblocks.misc.mode.half_panel=Half-height panel +#openblocks.misc.mode.half_panel=Half-height panel ## NEEDS TRANSLATION ## openblocks.misc.mode.stairs=Trepid -openblocks.misc.mode.inverted_block=Inverted Block -openblocks.misc.mode.inverted_panel=Inverted Panel -openblocks.misc.mode.inverted_half_panel=Inverted Half-height panel -openblocks.misc.mode.inverted_stairs=Inverted Stairs -openblocks.misc.structure_pos=Debug: found structure %s at (%d,%d,%d) +#openblocks.misc.mode.inverted_block=Inverted Block ## NEEDS TRANSLATION ## +#openblocks.misc.mode.inverted_panel=Inverted Panel ## NEEDS TRANSLATION ## +#openblocks.misc.mode.inverted_half_panel=Inverted Half-height panel ## NEEDS TRANSLATION ## +#openblocks.misc.mode.inverted_stairs=Inverted Stairs ## NEEDS TRANSLATION ## +#openblocks.misc.structure_pos=Debug: found structure %s at (%d,%d,%d) ## NEEDS TRANSLATION ## openblocks.misc.locked=Lukustatud -openblocks.misc.selected_cannon=Selected cannon for targeting -openblocks.misc.pointed_cannon=Pointed cannon at %s, %s, %s -openblocks.misc.change_mode=Changing to %s mode -openblocks.misc.change_size=Changing size to %sx%sx%s -openblocks.misc.get_witched=Get witched! +#openblocks.misc.selected_cannon=Selected cannon for targeting ## NEEDS TRANSLATION ## +#openblocks.misc.pointed_cannon=Pointed cannon at %s, %s, %s ## NEEDS TRANSLATION ## +#openblocks.misc.change_mode=Changing to %s mode ## NEEDS TRANSLATION ## +#openblocks.misc.change_size=Changing size to %sx%sx%s ## NEEDS TRANSLATION ## +#openblocks.misc.change_box_size=Changing size to (%d,%d,%d):(%d,%d,%d) ## NEEDS TRANSLATION ## +#openblocks.misc.total_blocks=Total block count: %d ## NEEDS TRANSLATION ## +#openblocks.misc.get_witched=Get witched! ## NEEDS TRANSLATION ## +#openblocks.misc.page=Page %d of %d ## NEEDS TRANSLATION ## +#openblocks.misc.oh_no_ceiling=You can't fall asleep here. Ceiling disturbs you too much... ## NEEDS TRANSLATION ## +#openblocks.misc.oh_no_ground=You want to sleep on THAT!? ## NEEDS TRANSLATION ## +#openblocks.misc.sleeping_bag_broken=Item inactive due to failed initialization ## NEEDS TRANSLATION ## +#openblocks.misc.inverted=Inverted ## NEEDS TRANSLATION ## +#openblocks.misc.grave_msg=%s (day: %.1f) ## NEEDS TRANSLATION ## + +#openblocks.misc.cant_restore_player=Can't restore inventory for player %s ## NEEDS TRANSLATION ## +#openblocks.misc.cant_restore_inventory=Can't restore inventory ## NEEDS TRANSLATION ## +#openblocks.misc.cant_store=Can't store player %s inventory ## NEEDS TRANSLATION ## +#openblocks.misc.invalid_sub_inventory=Can't restore sub inventory %s ## NEEDS TRANSLATION ## +#openblocks.misc.stored_inventory=Stored player inventory to %s ## NEEDS TRANSLATION ## +#openblocks.misc.restored_inventory=Restored inventory for player %s ## NEEDS TRANSLATION ## +#openblocks.misc.invalid_index=Invalid index ## NEEDS TRANSLATION ## +#openblocks.misc.empty_slot=No item in slot ## NEEDS TRANSLATION ## + +#openblocks.misc.pedometer.tracking_reset=Tracking reset ## NEEDS TRANSLATION ## +#openblocks.misc.pedometer.tracking_started=Tracking started ## NEEDS TRANSLATION ## + +#openblocks.misc.pedometer.start_point=Start point: %s ## NEEDS TRANSLATION ## +#openblocks.misc.pedometer.speed=Speed: %s ## NEEDS TRANSLATION ## +#openblocks.misc.pedometer.avg_speed=Average speed: %s ## NEEDS TRANSLATION ## +#openblocks.misc.pedometer.total_distance=Total distance: %s ## NEEDS TRANSLATION ## + +#openblocks.misc.pedometer.straght_line_distance=Straight line distance: %s ## NEEDS TRANSLATION ## +#openblocks.misc.pedometer.straigh_line_speed=Straight line speed: %s ## NEEDS TRANSLATION ## + +#openblocks.misc.pedometer.last_check_distance=Distance from last check: %s ## NEEDS TRANSLATION ## +#openblocks.misc.pedometer.last_check_speed=Last check speed: %s ## NEEDS TRANSLATION ## +#openblocks.misc.pedometer.last_check_time=Time from last check: %d ticks ## NEEDS TRANSLATION ## + +#openblocks.misc.pedometer.total_time=Total time: %d ticks ## NEEDS TRANSLATION ## + +#openblocks.misc.shape=Shape: %s ## NEEDS TRANSLATION ## openblocks.misc.shape.sphere=Kera openblocks.misc.shape.cylinder=Silinder openblocks.misc.shape.cuboid=Risttahukas +#openblocks.misc.shape.full_cuboid=Full Cuboid ## NEEDS TRANSLATION ## openblocks.misc.shape.dome=Kuppel openblocks.misc.shape.triangle=Kolmnurk openblocks.misc.shape.pentagon=Viisnurk openblocks.misc.shape.hexagon=Kuusnurk openblocks.misc.shape.octagon=Kaheksanurk +#openblocks.misc.shape.axes=Axes ## NEEDS TRANSLATION ## +#openblocks.misc.shape.planes=Planes ## NEEDS TRANSLATION ## + +#openblocks.misc.box=Dimensions: (%d,%d,%d):(%d,%d,%d) ## NEEDS TRANSLATION ## +#openblocks.misc.width=Width: %d ## NEEDS TRANSLATION ## +#openblocks.misc.height=Height: %d ## NEEDS TRANSLATION ## +#openblocks.misc.depth=Depth: %d ## NEEDS TRANSLATION ## openblocks.misc.radio.too_many=Liiga palju raadioid mängib juba openblocks.misc.radio.invalid_stream=Kehtetu ülekanne @@ -99,184 +159,207 @@ openblocks.misc.side.up=Ülemine külg openblocks.misc.side.down=Alumine külg openblocks.misc.command.invalid=Kehtetud käsu argumendid -openblocks.misc.command.no_flim_flam=Invalid flim-flam name -openblocks.misc.command.flim_flam_source=Player %s had been successfully flim-flammed with %s +#openblocks.misc.command.no_flim_flam=Invalid flim-flam name ## NEEDS TRANSLATION ## +#openblocks.misc.command.flim_flam_source=Player %s had been successfully flim-flammed with %s ## NEEDS TRANSLATION ## openblocks.misc.command.flim_flam_target=Sa ei meeldi kellelegi. Kellelegi kellel on võimu -openblocks.misc.command.flim_flam_failed=Flim-flamming failed! +#openblocks.misc.command.flim_flam_failed=Flim-flamming failed! ## NEEDS TRANSLATION ## openblocks.misc.command.luck_added=Luck changed for player %s, current: %d openblocks.misc.command.luck_current=Mängija %s luck: %d + +#openblocks.misc.hidden_lore=§a§oHold ALT to see history§r ## NEEDS TRANSLATION ## openblocks.flim_flammed=Midagi veidrat juhtub ümber sinu openblocks.turtle.magnet=Magnet -tile.openblocks.elevator.name=Lift -tile.openblocks.elevator.description=Place one elevator directly three or more blocks above another with no blocks inbetween and you'll be able to either 'jump' to move up, or 'crouch' to move down. Elevators can be dyed by clicking on them with dye, however, you can only teleport between elevators of the same color. +#tile.openblocks.elevator.name=Elevator ## NEEDS TRANSLATION ## +#tile.openblocks.elevator.description=Place one elevator directly three or more blocks above another with no blocks inbetween and you'll be able to either 'jump' to move up, or 'crouch' to move down. Elevators can be dyed by clicking on them with dye, however, you can only teleport between elevators of the same color. ## NEEDS TRANSLATION ## + +#tile.openblocks.elevator_rotating.name=Rotating Elevator ## NEEDS TRANSLATION ## tile.openblocks.heal.name=Tervendaja -tile.openblocks.heal.description=The healing block is a creative-mode only block that gives off a slight healing effect over time. +#tile.openblocks.heal.description=The healing block is a creative-mode only block that gives off a slight healing effect over time. ## NEEDS TRANSLATION ## tile.openblocks.guide.name=Ehitaja Juhend -tile.openblocks.guide.description=The building guide will give you an outline of ghost blocks in different shapes and sizes that'll help you plan out rooms.\nYou can shift-click the guide to change the shape, or you can whack the different sides to increase or decrease the size.\nWhen in creative mode you can place an obsdian block above, then hit the building guide with any block you like to automatically create the shape. +#tile.openblocks.guide.description=The building guide, once powered with redstone, will give you an outline of ghost blocks in different shapes and sizes that'll help you plan out rooms.\nUse touch-buttons on block to change outline dimensions and shapes.\nColor of markers can be changed by using dye on central block. ## NEEDS TRANSLATION ## -tile.openblocks.ladder.name=Jaded Ladder -tile.openblocks.ladder.description=The jaded ladder solves that annoying problem of jumping out of a trapdoor at the top of a ladder. The jaded ladder acts as both a trap door and a ladder at the same time. +#tile.openblocks.builder_guide.name=Enhanced Building Guide ## NEEDS TRANSLATION ## +#tile.openblocks.builder_guide.description=This enhanced version of building guide not only displays ghost blocks to make building easier, but also allows you to place actual blocks. Just click central block with any block stack!\nWhen in creative mode you can place an obsidian block above, then hit the building guide with any block you like to automatically create the shape. ## NEEDS TRANSLATION ## +#tile.openblocks.ladder.name=Jaded Ladder ## NEEDS TRANSLATION ## +#tile.openblocks.ladder.description=The jaded ladder solves that annoying problem of jumping out of a trapdoor at the top of a ladder. The jaded ladder acts as both a trap door and a ladder at the same time. ## NEEDS TRANSLATION ## + +#tile.openblocks.tank.filled.name=%s Tank ## NEEDS TRANSLATION ## tile.openblocks.tank.name=Paak -tile.openblocks.tank.description=Tanks can hold liquids. If you place tanks next to each other and they'll distribute their liquid between the tanks. You can place liquid into the tanks using buckets. If the tank contains XP Juice you can click on them with an empty hand to give yourself some of the XP. When broken tanks will retain their liquid. +#tile.openblocks.tank.description=Tanks can hold liquids. If you place tanks next to each other and they'll distribute their liquid between the tanks. You can place liquid into the tanks using buckets. If the tank contains XP Juice you can click on them with an empty hand to give yourself some of the XP. When broken tanks will retain their liquid. ## NEEDS TRANSLATION ## tile.openblocks.flag.name=Lipp -tile.openblocks.flag.description=Flags can be used for decoration or for marking the way back out of a cave you've ventured in to. The flag will point in the direction that you placed it, or you can put it on walls. If you shift-click with a flag in your hand it will change color. +#tile.openblocks.flag.description=Flags can be used for decoration or for marking the way back out of a cave you've ventured in to. The flag will point in the direction that you placed it, or you can put it on walls. If you shift-click with a flag in your hand it will change color. ## NEEDS TRANSLATION ## -tile.openblocks.beartrap.name=Bear Trap -tile.openblocks.beartrap.description=Place a bear trap and click on it to open it up. When a mob walks over the trap they'll be unable to move! +#tile.openblocks.beartrap.name=Bear Trap ## NEEDS TRANSLATION ## +#tile.openblocks.beartrap.description=Place a bear trap and click on it to open it up. When a mob walks over the trap they'll be unable to move! ## NEEDS TRANSLATION ## tile.openblocks.sponge.name=Käsn -tile.openblocks.sponge.description=The sponge is a replacement for the vanilla sponge. Perfect for removing small pockets of lava or water. Be careful when using it on large areas of liquid though as it'll start to get quite messy. +#tile.openblocks.sponge.description=The sponge is a replacement for the vanilla sponge. Perfect for removing small pockets of lava or water. Be careful when using it on large areas of liquid though as it'll start to get quite messy. ## NEEDS TRANSLATION ## -tile.openblocks.spongeonastick.name=Käsn -tile.openblocks.spongeonastick.description=The sponge on a stick is a tool for cleaning up liquids. Works just like the sponge, but is more mobile at the expense of wearing out. +item.openblocks.spongeonastick.name=Käsn +#item.openblocks.spongeonastick.description=The sponge on a stick is a tool for cleaning up liquids. Works just like the sponge, but is more mobile at the expense of wearing out. ## NEEDS TRANSLATION ## + +#item.openblocks.epic_eraser.name=Epic Eraser ## NEEDS TRANSLATION ## +#item.openblocks.epic_eraser.description=Every item has its own history...\n\nDon't you hate it?\nWith this item you can scrub all traces of epic lore your loot has collected over the years and then sell it on black market without worrying about evidence. ## NEEDS TRANSLATION ## tile.openblocks.cannon.name=Asjade Kahur -tile.openblocks.cannon.description=When given a redstone signal, the item cannon will shoot items that it finds in an adjacent inventory. Use the 'pointer' item to aim the cannon. +#tile.openblocks.cannon.description=When given a redstone signal, the item cannon will shoot items that it finds in an adjacent inventory. Use the 'pointer' item to aim the cannon. ## NEEDS TRANSLATION ## tile.openblocks.ropeladder.name=Köis Redel -tile.openblocks.ropeladder.description=When you place a rope ladder it'll roll out all the way to the ground. +#tile.openblocks.ropeladder.description=When you place a rope ladder it'll roll out all the way to the ground. For every created ladder block it will use one item from stack. ## NEEDS TRANSLATION ## tile.openblocks.sprinkler.name=Vihmuti -tile.openblocks.sprinkler.description=The sprinkler will help fertilize crops up to 4 blocks away. Simply place it above an OpenBlocks tank filled with water! You can also add bonemeal for an even faster rate of growth.\nIt also acts as a water source block! +#tile.openblocks.sprinkler.description=The sprinkler will help fertilize crops up to 4 blocks away. Simply place it above an OpenBlocks tank filled with water! You can also add bonemeal for an even faster rate of growth.\nIt also acts as a water source block! ## NEEDS TRANSLATION ## tile.openblocks.paintmixer.name=Värvi Segaja -tile.openblocks.paintmixer.description=The paint mixer can mix any colour of paint you want! Drop either an existing paint bucket or a bucket of milk into the top slot, then cyan, magenta, yellow and black dyes into the other four slots and click mix! +#tile.openblocks.paintmixer.description=The paint mixer can mix any colour of paint you want! Drop either an existing paint bucket or a bucket of milk into the top slot, then cyan, magenta, yellow and black dyes into the other four slots and click mix! ## NEEDS TRANSLATION ## tile.openblocks.canvas.name=Lõuend -tile.openblocks.canvas.description=The canvas is a perfectly white block that's perfect for painting. See the Paint Mixer for information about making paints. +#tile.openblocks.canvas.description=The canvas is a perfectly white block that's perfect for painting. See the Paint Mixer for information about making paints. ## NEEDS TRANSLATION ## tile.openblocks.fan.name=Ventilaator -tile.openblocks.fan.description=The fan will blow players, mobs or entities in the direction it's facing. +#tile.openblocks.fan.description=The fan will blow players, mobs or entities in the direction it's facing. ## NEEDS TRANSLATION ## tile.openblocks.target.name=Sihtmärk -tile.openblocks.target.description=The target will give out a redstone signal of a strength relative to the accuracy of the players aim. Give the target a redstone signal to make it pop up! +#tile.openblocks.target.description=The target will give out a redstone signal of a strength relative to the accuracy of the player's aim. Give the target a redstone signal to make it pop up! ## NEEDS TRANSLATION ## tile.openblocks.path.name=Tee tile.openblocks.path.description=Tee ei tee midagi. See näeb lihtsalt välja ilus! tile.openblocks.itemDropper.name=Asjade Heitja -tile.openblocks.itemDropper.description=The item dropper is similar to the vanilla dropper, except it drops items directly down in a straight line. +#tile.openblocks.itemDropper.description=The item dropper is similar to the vanilla dropper, except it drops items directly down in a straight line. ## NEEDS TRANSLATION ## tile.openblocks.bigbutton.name=Suur Nupp -tile.openblocks.bigbutton.description=The big button is a large button that can be placed on walls. If you shift-click on the button with an empty hand it will bring up an inventory with a single slot. You can put items into this slot to increase the length of time the button is pressed - one item increases the button press by one tick. +#tile.openblocks.bigbutton.description=The big button is a large button that can be placed on walls. If you shift-click on the button with an empty hand it will bring up an inventory with a single slot. You can put items into this slot to increase the length of time the button is pressed - one item increases the button press by one tick. ## NEEDS TRANSLATION ## tile.openblocks.xpdrain.name=XP Drain -tile.openblocks.xpdrain.description=Place the XP drain above an OpenBlocks tank and stand on it. Your XP will drain into the tank, which can then be used for blocks such as the auto enchantment table or the auto anvil. +#tile.openblocks.xpdrain.description=Place the XP drain above an OpenBlocks tank and stand on it. Your XP will drain into the tank, which can then be used for blocks such as the auto enchantment table or the auto anvil. ## NEEDS TRANSLATION ## tile.openblocks.vacuumhopper.name=Vaakum Püüdja -tile.openblocks.vacuumhopper.description=The vacuum hopper will suck up items and XP orbs around it. You can use the tabs on the right of the interface to select which sides to output to. +#tile.openblocks.vacuumhopper.description=The vacuum hopper will suck up items and XP orbs around it. You can use the tabs on the right of the interface to select which sides to output to. ## NEEDS TRANSLATION ## tile.openblocks.village_highlighter.name=Village Highlighter -tile.openblocks.village_highlighter.description=Drop the village highlighter down in a village and give it a redstone signal. It will outline the perimeter of the village and draw a box in the iron golem spawning area. Useful if you want to make sure villages don't merge into each other or you're making an iron farm! +#tile.openblocks.village_highlighter.description=Drop the village highlighter down in a village and give it a redstone signal. It will outline the perimeter of the village and draw a box in the iron golem spawning area. Useful if you want to make sure villages don't merge into each other or you're making an iron farm! ## NEEDS TRANSLATION ## tile.openblocks.donationStation.name=Annetus Jaam -tile.openblocks.donationStation.description=Love a block or item and want to show the mod developer some appreciation? Drop it into the donation station and if we know the authors donation page we'll give you a link. +#tile.openblocks.donationStation.description=Love a block or item and want to show the mod developer some appreciation? Drop it into the donation station and if we know the authors donation page we'll give you a link. ## NEEDS TRANSLATION ## tile.openblocks.blockPlacer.name=Ploki Asetaja -tile.openblocks.blockPlacer.description=When given a redstone pulse the block placer will place an item in the direction it's facing. +#tile.openblocks.blockPlacer.description=When given a redstone pulse the block placer will place an item in the direction it's facing. ## NEEDS TRANSLATION ## tile.openblocks.blockbreaker.name=Ploki Lõhkuja -tile.openblocks.blockbreaker.description=When given a redstone pulse the block breaker will break the block it's facing. +#tile.openblocks.blockbreaker.description=When given a redstone pulse the block breaker will break the block it's facing. ## NEEDS TRANSLATION ## -tile.openblocks.projector.name=Height Map Projector -tile.openblocks.projector.description=I'll let you write this one boq! +#tile.openblocks.projector.name=Height Map Projector ## NEEDS TRANSLATION ## +#tile.openblocks.projector.description=I'll let you write this one boq! ## NEEDS TRANSLATION ## tile.openblocks.autoenchantmenttable.name=Automaatne Loitsimislaud -tile.openblocks.autoenchantmenttable.description=The auto enchantment table works in a similar way to the vanilla enchantment table except it runs off XP juice. Use the tabs on the right side of the interface to select where items or xp can be pulled from. Just like with the vanilla table bookshelves are required for higher levels. +#tile.openblocks.autoenchantmenttable.description=The auto enchantment table works in a similar way to the vanilla enchantment table except it runs off XP juice. Use the tabs on the right side of the interface to select where items or xp can be pulled from. Just like with the vanilla table bookshelves are required for higher levels. ## NEEDS TRANSLATION ## tile.openblocks.xpbottler.name=XP Pudeldaja -tile.openblocks.xpbottler.description=The XP bottler will take XP juice and bottle it up into glass bottles to create bottles o' enchanting. +#tile.openblocks.xpbottler.description=The XP bottler will take XP juice and bottle it up into glass bottles to create bottles o' enchanting. ## NEEDS TRANSLATION ## tile.openblocks.autoanvil.name=Automaatne Alasi -tile.openblocks.autoanvil.description=The auto anvil works just like the vanilla anvil, except it runs from XP juice and can be fully automated.\n\nUse the tabs on the right of the GUI to select which sides of the anvil items or liquid can be inserted or extracted. Right click and drag the anvil in the tab to spin it around and select other sides! +#tile.openblocks.autoanvil.description=The auto anvil works just like the vanilla anvil, except it runs from XP juice and can be fully automated.\n\nUse the tabs on the right of the GUI to select which sides of the anvil items or liquid can be inserted or extracted. Right click and drag the anvil in the tab to spin it around and select other sides! ## NEEDS TRANSLATION ## tile.openblocks.drawingtable.name=Joonistus Laud -tile.openblocks.drawingtable.description=The drawing table is for creating stencils which can be used while painting. Insert an Unprepared Stencil into the drawing table then use the arrows to select which stencil you want! +#tile.openblocks.drawingtable.description=The drawing table is for creating stencils which can be used while painting. Insert an Unprepared Stencil into the drawing table then use the arrows to select which stencil you want! ## NEEDS TRANSLATION ## tile.openblocks.grave.name=Haud tile.openblocks.trophy.name=Trofee +#tile.openblocks.trophy.entity.name=%s Trophy ## NEEDS TRANSLATION ## tile.openblocks.canvasglass.name=Klaas Lõuend -tile.openblocks.paintcan.name=Paint Can +#tile.openblocks.paintcan.name=Paint Can ## NEEDS TRANSLATION ## -tile.openblocks.sky.normal.name=Sky Block -tile.openblocks.sky.normal.description=Bring the outside inside with the new Sky block! Just apply a redstone signal. We also offer an inverted version. -tile.openblocks.sky.inverted.name=Inverted Sky Block +#tile.openblocks.sky.normal.name=Sky Block ## NEEDS TRANSLATION ## +#tile.openblocks.sky.normal.description=Bring the outside inside with the new Sky block! Just apply a redstone signal. We also offer an inverted version. ## NEEDS TRANSLATION ## +#tile.openblocks.sky.inverted.name=Inverted Sky Block ## NEEDS TRANSLATION ## tile.openblocks.radio.name=Raadio -tile.openblocks.radio.description=The radio allows you to stream internet radio! First, you need some tuned crystals which you can find in dungeon chests or from a special villager. Place the crystal in the radio and supply it with a redstone signal to turn it on. The redstone strength controls the volume.\n\nYou can configure which radio stations are available in the servers config file. +#tile.openblocks.radio.description=The radio allows you to stream internet radio! First, you need some tuned crystals which you can find in dungeon chests or from a special villager. Place the crystal in the radio and supply it with a redstone signal to turn it on. The redstone strength controls the volume.\n\nYou can configure which radio stations are available in the servers config file. ## NEEDS TRANSLATION ## -tile.openblocks.xpshower.name=XP Shower -tile.openblocks.xpshower.description=Attach an XP shower to a tank of XP juice and it'll pour out XP orbs. These orbs can be collected by an XP Drain or an MFR Sewer. +#tile.openblocks.xpshower.name=XP Shower ## NEEDS TRANSLATION ## +#tile.openblocks.xpshower.description=Attach an XP shower to a tank of XP juice and it'll pour out XP orbs. These orbs can be collected by an XP Drain or an MFR Sewer. ## NEEDS TRANSLATION ## + +#tile.openblocks.scaffolding.name=Scaffolding ## NEEDS TRANSLATION ## +#tile.openblocks.scaffolding.description=Have you ever wanted to pillar up somewhere without leaving an ugly tower behind? Well, now you can! Simply build with scaffolding blocks and they will automatically despawn when you are done. ## NEEDS TRANSLATION ## tile.openblocks.goldenegg.name=Kuldne Muna -tile.openblocks.digitalfuse.name=Digital Fuse +#tile.openblocks.digitalfuse.name=Digital Fuse ## NEEDS TRANSLATION ## + item.openblocks.cursor.name=Kursor -item.openblocks.cursor.description=The cursor will let you click on blocks remotely.\nSimply shift-click onto a block to link the cursor, then use the cursor wherever you like to click on the target block. Be warned, by default the cursor uses up your XP relative to how far you are from the block you're clicking. +#item.openblocks.cursor.description=The cursor will let you click on blocks remotely.\nSimply shift-click onto a block to link the cursor, then use the cursor wherever you like to click on the target block. Be warned, by default the cursor uses up your XP relative to how far you are from the block you're clicking. ## NEEDS TRANSLATION ## -item.openblocks.devnull.name=/dev/null -item.openblocks.devnull.description=Click using /dev/null to open the inventory. There's a single inventory slot - put an item in there - dirt, for example. As you gather dirt from the ground this slot will fill up. Once it's full, any more dirt you pick up will be automatically discarded. You can shift-click with the item in your hand as though you were placing the block! +#item.openblocks.devnull.name=/dev/null ## NEEDS TRANSLATION ## +#item.openblocks.devnull.description=Click using /dev/null to open the inventory. There's a single inventory slot - put an item in there - dirt, for example. As you gather dirt from the ground this slot will fill up. Once it's full, any more dirt you pick up will be automatically discarded. You can shift-click with the item in your hand as though you were placing the block! ## NEEDS TRANSLATION ## -item.openblocks.slimalyzer.name=Slimalyzer -item.openblocks.slimalyzer.description=Walk around with the slimalyzer in your hand and it'll light up whenever you're in a slime spawning chunk. +#item.openblocks.slimalyzer.name=Slimalyzer ## NEEDS TRANSLATION ## +#item.openblocks.slimalyzer.description=Walk around with the slimalyzer in your hand and it'll light up whenever you're in a slime spawning chunk. ## NEEDS TRANSLATION ## item.openblocks.hangglider.name=Deltaplaan -item.openblocks.hangglider.description=The hang glider is self explanatory. Hold it in your hand and click to place it on your back. Now jump!\nTo increase your speed you can press shift while gliding, but watch out, you'll lose altitude faster! +#item.openblocks.hangglider.description=The hang glider is self explanatory. Hold it in your hand and click to place it on your back. Now jump!\nTo increase your speed you can press shift while gliding, but watch out, you'll lose altitude faster! ## NEEDS TRANSLATION ## item.openblocks.gliderwing.name=Deltaplaani Tiib item.openblocks.sleepingbag.name=Magamiskott -item.openblocks.sleepingbag.description=The sleeping bag lets you sleep out in the wilderness without having to reset your spawn location. To sleep, simply wear it on your back. +#item.openblocks.sleepingbag.description=The sleeping bag lets you sleep out in the wilderness without having to reset your spawn location. To sleep, simply wear it on your back. ## NEEDS TRANSLATION ## item.openblocks.luggage.name=Kohver -item.openblocks.luggage.description=Luggage is your new friend. He'll follow you around anywhere you go collecting any items he finds on the floor. Nom nom nom!\nTo dismantle him just shift-click on him and he'll turn into an item that you can carry around.\nIf he ever gets struck by lightning he'll be able to carry even more items! +#item.openblocks.luggage.description=Luggage is your new friend. He'll follow you around anywhere you go collecting any items he finds on the floor. Nom nom nom!\nTo dismantle him just shift-click on him and he'll turn into an item that you can carry around.\nIf he ever gets struck by lightning he'll be able to carry even more items! ## NEEDS TRANSLATION ## -item.openblocks.sonicglasses.name=Sonic Glasses -item.openblocks.sonicglasses.description=Introducing the fantabulous new Sonic Glasses!\nThis new and exciting technology from OpenMods Inc allow you see what you hear! +#item.openblocks.sonicglasses.name=Sonic Glasses ## NEEDS TRANSLATION ## +#item.openblocks.sonicglasses.description=Introducing the fantabulous new Sonic Glasses!\nThis new and exciting technology from OpenMods Inc allow you see what you hear! ## NEEDS TRANSLATION ## -item.openblocks.squeegee.name=Squeegee -item.openblocks.squeegee.description=The squeegee removes paint from any painted blocks. Just click on the side of the block you want to remove the paint from, or alternative shift-click the block to remove paint from all sides! +#item.openblocks.squeegee.name=Squeegee ## NEEDS TRANSLATION ## +#item.openblocks.squeegee.description=The squeegee removes paint from any painted blocks. Just click on the side of the block you want to remove the paint from, or alternative shift-click the block to remove paint from all sides! ## NEEDS TRANSLATION ## item.openblocks.paintbrush.name=Pintsel -item.openblocks.paintbrush.description=Paint brushes let you paint blocks in whatever color you like!\n\nDab your paint brush in a Paint Can made in the Paint Mixer then click on a block to paint it.\n\nCanvas blocks are perfect for painting, but you can also paint quite a few vanilla blocks and even some blocks from other mods. You can also place stencils on blocks and then paint over the stencil! +#item.openblocks.paintbrush.description=Paint brushes let you paint blocks in whatever color you like!\n\nDab your paint brush in a Paint Can made in the Paint Mixer then click on a block to paint it.\n\nCanvas blocks are perfect for painting, but you can also paint quite a few vanilla blocks and even some blocks from other mods. You can also place stencils on blocks and then paint over the stencil! ## NEEDS TRANSLATION ## -item.openblocks.unprepared_stencil.name=Unprepared Stencil -item.openblocks.unprepared_stencil.description="What are these pesky stencils I keep finding in chests?"\n\nStencils can be placed onto blocks and then painted over using paint brushes!\n\nYou can paint a block using multiple stencils and you can click on them with an empty hand to rotate them.\n\nPlace an Unprepared Stencil in a Drawing table to create different patterns. +#item.openblocks.unprepared_stencil.name=Unprepared Stencil ## NEEDS TRANSLATION ## +#item.openblocks.unprepared_stencil.description=Stencils can be placed onto blocks and then painted over using paint brushes!\n\nYou can paint a block using multiple stencils and you can click on them with an empty hand to rotate them.\n\nPlace an Unprepared Stencil in a Drawing table to create different patterns. ## NEEDS TRANSLATION ## -item.openblocks.stencil.name=Stencil -item.openblocks.crayon.name=Magic Crayon -item.openblocks.pencil.name=Magic Pencil -item.openblocks.glasses.pencil.name=Pencil Glasses -item.openblocks.glasses.crayon.name=Crayon Glasses -item.openblocks.glasses.technicolor.name=Amazing Technicolor Glasses -item.openblocks.glasses.admin.name=Badass Glasses -item.openblocks.crane_backpack.name=Crane Backpack -item.openblocks.crane_control.name=Crane Control -item.openblocks.crane_engine.name=Crane Engine -item.openblocks.crane_magnet.name=Crane Magnet -item.openblocks.beam.name=Beam +#item.openblocks.crane_backpack.name=Crane Backpack ## NEEDS TRANSLATION ## +#item.openblocks.crane_backpack.description=In Minecraft world "magnet" is ancient word for "how do this works?".\n\nThis particular piece of very equipment allows you to pick and carry mobs, players, items and blocks. Can be controlled with magnet control. ## NEEDS TRANSLATION ## + +#item.openblocks.crane_control.name=Crane Control ## NEEDS TRANSLATION ## +#item.openblocks.crane_control.description=This hi-tech wireless remote is used for controlling magnet backpacks.\n\nRight click to raise, Sneak + right click to lower, left click to pick/release.\nBlinking light signals something is under magnet. ## NEEDS TRANSLATION ## + +#item.openblocks.wrench.name=Big Metal Bar ## NEEDS TRANSLATION ## +#item.openblocks.wrench.description=This is extremely sophisticated tool used to perform transformations of objects with octahedral symmetry.\n\n\nOr just big, dumb piece of metal you can use to rotate cubes and stuff.\n\nSo yeah, it's yet another wrench. I'm just trying to be original here, ok? ## NEEDS TRANSLATION ## + +#item.openblocks.stencil.name=Stencil ## NEEDS TRANSLATION ## +#item.openblocks.crayon.name=Magic Crayon ## NEEDS TRANSLATION ## +#item.openblocks.pencil.name=Magic Pencil ## NEEDS TRANSLATION ## +#item.openblocks.glasses.pencil.name=Pencil Glasses ## NEEDS TRANSLATION ## +#item.openblocks.glasses.crayon.name=Crayon Glasses ## NEEDS TRANSLATION ## +#item.openblocks.glasses.technicolor.name=Amazing Technicolor Glasses ## NEEDS TRANSLATION ## +#item.openblocks.glasses.admin.name=Badass Glasses ## NEEDS TRANSLATION ## +#item.openblocks.crane_engine.name=Crane Engine ## NEEDS TRANSLATION ## +#item.openblocks.crane_magnet.name=Crane Magnet ## NEEDS TRANSLATION ## +#item.openblocks.beam.name=Beam ## NEEDS TRANSLATION ## item.openblocks.line.name=Joon -item.openblocks.miracle_magnet.name=§5Ime Magnet§r - +#item.openblocks.miracle_magnet.name=§5Miracle Magnet§r ## NEEDS TRANSLATION ## item.openblocks.info_book.name=Maailma valitsemine OpenBlocksiga item.openblocks.xpbucket.name=XP Ämber item.openblocks.height_map.name=Kõrguse Kaart item.openblocks.empty_map.name=Tühi Kaart -item.openblocks.map_controller.name=Map Controller Module -item.openblocks.map_memory.name=Map Memory Module +#item.openblocks.map_controller.name=Map Controller Module ## NEEDS TRANSLATION ## +#item.openblocks.map_memory.name=Map Memory Module ## NEEDS TRANSLATION ## item.openblocks.cartographer.name=Kartograaf -item.openblocks.assistant_base.name=Assistant's base -item.openblocks.sketching_pencil.name=Sketching Pencil +#item.openblocks.assistant_base.name=Assistant's base ## NEEDS TRANSLATION ## +#item.openblocks.sketching_pencil.name=Sketching Pencil ## NEEDS TRANSLATION ## item.openblocks.tasty_clay.name=Maitsev Savi item.openblocks.golden_eye.name=Kuldne silm item.openblocks.pointer.name=Osutaja -item.openblocks.tuned_crystal.name=Tuned Crystal +#item.openblocks.tuned_crystal.name=Tuned Crystal ## NEEDS TRANSLATION ## +#item.openblocks.pedometer.name=Pedometer ## NEEDS TRANSLATION ## item.openblocks.wallpaper.name=Tapeet @@ -284,7 +367,7 @@ itemGroup.tabOpenBlocks=OpenBlocks entity.OpenBlocks.Luggage.name=Kohver entity.OpenBlocks.Cartographer.name=Kartograaf -entity.OpenBlocks.Block.name=Floating Block +#entity.OpenBlocks.Block.name=Floating Block ## NEEDS TRANSLATION ## entity.OpenBlocks.MiniMe.name=Mini Mina fluid.OpenBlocks.xpjuice=Vedel XP diff --git a/src/main/resources/assets/openblocks/lang/fr_FR.lang b/src/main/resources/assets/openblocks/lang/fr_FR.lang index bf02825c..1f5c5159 100644 --- a/src/main/resources/assets/openblocks/lang/fr_FR.lang +++ b/src/main/resources/assets/openblocks/lang/fr_FR.lang @@ -38,7 +38,6 @@ openblocks.gui.drawingtable=Table à dessin openblocks.gui.digitalfuse=Fusible numérique openblocks.gui.xp_outputs=Sorties d'XP openblocks.gui.item_outputs=Sorties d'élément -openblocks.gui.watch_video=Regardez la vidéo openblocks.gui.max_level=Niveau maxi. : %d openblocks.gui.save_folder=Dossier de sauvegarde @@ -46,11 +45,14 @@ openblocks.gui.welcome.title=Bienvenu ! openblocks.gui.welcome.content=OpenBlocks est un nouveau mod open source qui introduit une variété d'idées dans Minecraft, dont les planneurs, les ascenceurs, les réservoir, les tombes, les paintures, Les grues, l'XP liquide, les cartographes, les trophées et plus ! openblocks.gui.credits.title=Crédits -openblocks.gui.credits.content=§LBoq, Mikee et NeverCast§R - Développeur principaux d'OpenBlocks (Nous nous permet-on ?)\n\n§LSinZ et Yoshi2§R - membres de OpenMods team depuis le début.\n\n§LVexatos et crafteverywhere§R - Traducteur réguliers du mod.\n\nTous les autres qui ont contribué au code au cours de l'année passée.\n\n§LDirewolf20 et le reste de ForgeCraft§R - Pour supporter les bogues et les accidents avant que nous ne sortions.\n\Tout le monde qui met en lumière, fait des présentation et, généralement, supporte le mod depuis que nous avons commencé ! +openblocks.gui.credits.content=§LBoq, Mikee et NeverCast§R - Développeur principaux d'OpenBlocks (Nous nous permet-on ?)\n\n§LSinZ et Yoshi2§R - membres de OpenMods team depuis le début.\n\n§LVexatos et crafteverywhere§R - Traducteur réguliers du mod.\n\nTous les autres qui ont contribué au code au cours de l'année passée.\n\n§LDirewolf20 et le reste de ForgeCraft§R - Pour supporter les bogues et les accidents avant que nous ne sortions.\nTout le monde qui met en lumière, fait des présentation et, généralement, supporte le mod depuis que nous avons commencé ! openblocks.gui.config.title=Easy Config Editing openblocks.gui.config.content=OpenMods allow for both client and server config options to be changed from chat commands. Some don't even require restart!\n\nServer config settings can be changed using '§L/om_config_s§R' (op needed) and client config settings can be changed using '§L/om_config_c§R'\n\nFor example:\n\n§L/om_config_s set OpenBlocks dropblock elevatorDrainsXP false§R\n§L/om_config_s save§R\n\nFor a full list of commands type: §L/help om_config_s§R or §L/help om_config_c§R +#openblocks.gui.restore_inv.title=Inventory backup ## NEEDS TRANSLATION ## +#openblocks.gui.restore_inv.content=Everyone can make mistake. But with §L/ob_inventory§R command you can fix some of them. This command can be used to restore inventory. Backup is created when:\n - player dies\n - grave is spawned \n - player issued command §L/ob_inventory store§R\n\nTo restore inventory you need backup name. Go to folder below or to saves folder on server and look for files named §Linventory-*.dat§R. Then restore inventory with §L/ob_inventory restore §R - where id is either full filename or just middle part, without §Linventory-§R and §L.dat§R. You can also use tab completion. Backups are normal NBT files and can be opened with any editor. ## NEEDS TRANSLATION ## + openblocks.gui.bkey.title=The Infamous 'B' Key openblocks.gui.bkey.content=The 'B' key is a very special key in OpenBlocks.\n\nEnabling the 'weAreSeriousPeople' config option in the 'tomfoolery' category of both the client and server config files will give you your very own digestive system.\n\nTry eating some of that tasty clay and press 'B' to digest! @@ -83,15 +85,25 @@ openblocks.misc.selected_cannon=Selected cannon for targeting openblocks.misc.pointed_cannon=Pointed cannon at %s, %s, %s openblocks.misc.change_mode=Changing to %s mode openblocks.misc.change_size=Changing size to %sx%sx%s +#openblocks.misc.change_box_size=Changing size to (%d,%d,%d):(%d,%d,%d) ## NEEDS TRANSLATION ## openblocks.misc.total_blocks=Total block count: %d openblocks.misc.get_witched=Get witched! openblocks.misc.page=Page %d of %d openblocks.misc.oh_no_ceiling=You can't fall asleep here. Ceiling disturbs you too much... +#openblocks.misc.oh_no_ground=You want to sleep on THAT!? ## NEEDS TRANSLATION ## +#openblocks.misc.sleeping_bag_broken=Item inactive due to failed initialization ## NEEDS TRANSLATION ## +#openblocks.misc.inverted=Inverted ## NEEDS TRANSLATION ## -openblocks.misc.cant_restore=Can't restore inventory for player %s +#openblocks.misc.grave_msg=%s (day: %.1f) ## NEEDS TRANSLATION ## + +#openblocks.misc.cant_restore_player=Can't restore inventory for player %s ## NEEDS TRANSLATION ## +#openblocks.misc.cant_restore_inventory=Can't restore inventory ## NEEDS TRANSLATION ## openblocks.misc.cant_store=Can't store player %s inventory +#openblocks.misc.invalid_sub_inventory=Can't restore sub inventory %s ## NEEDS TRANSLATION ## openblocks.misc.stored_inventory=Stored player inventory to %s openblocks.misc.restored_inventory=Restored inventory for player %s +#openblocks.misc.invalid_index=Invalid index ## NEEDS TRANSLATION ## +#openblocks.misc.empty_slot=No item in slot ## NEEDS TRANSLATION ## openblocks.misc.pedometer.tracking_reset=Tracking reset openblocks.misc.pedometer.tracking_started=Tracking started @@ -110,14 +122,23 @@ openblocks.misc.pedometer.last_check_time=Time from last check %d ticks openblocks.misc.pedometer.total_time=Total time: %d ticks +#openblocks.misc.shape=Shape: %s ## NEEDS TRANSLATION ## openblocks.misc.shape.sphere=Sphere openblocks.misc.shape.cylinder=Cylinder openblocks.misc.shape.cuboid=Cuboid +#openblocks.misc.shape.full_cuboid=Full Cuboid ## NEEDS TRANSLATION ## openblocks.misc.shape.dome=Dome openblocks.misc.shape.triangle=Triangle openblocks.misc.shape.pentagon=Pentagon openblocks.misc.shape.hexagon=Hexagon openblocks.misc.shape.octagon=Octagon +#openblocks.misc.shape.axes=Axes ## NEEDS TRANSLATION ## +#openblocks.misc.shape.planes=Planes ## NEEDS TRANSLATION ## + +#openblocks.misc.box=Dimensions: (%d,%d,%d):(%d,%d,%d) ## NEEDS TRANSLATION ## +#openblocks.misc.width=Width: %d ## NEEDS TRANSLATION ## +#openblocks.misc.height=Height: %d ## NEEDS TRANSLATION ## +#openblocks.misc.depth=Depth: %d ## NEEDS TRANSLATION ## openblocks.misc.radio.too_many=Too many radios already playing openblocks.misc.radio.invalid_stream=Invalid stream @@ -144,163 +165,186 @@ openblocks.misc.command.flim_flam_target=Someone doesn't like you. Someone with openblocks.misc.command.flim_flam_failed=Flim-flamming failed! openblocks.misc.command.luck_added=Luck changed for player %s, current: %d openblocks.misc.command.luck_current=Player %s luck: %d + +#openblocks.misc.hidden_lore=§a§oHold ALT to see history§r ## NEEDS TRANSLATION ## openblocks.flim_flammed=Something weird happens around you openblocks.turtle.magnet=Magnet -tile.openblocks.elevator.name=Elevator -tile.openblocks.elevator.description=Place one elevator directly three or more blocks above another with no blocks inbetween and you'll be able to either 'jump' to move up, or 'crouch' to move down. Elevators can be dyed by clicking on them with dye, however, you can only teleport between elevators of the same color. +#tile.openblocks.elevator.name=Elevator ## NEEDS TRANSLATION ## +#tile.openblocks.elevator.description=Place one elevator directly three or more blocks above another with no blocks inbetween and you'll be able to either 'jump' to move up, or 'crouch' to move down. Elevators can be dyed by clicking on them with dye, however, you can only teleport between elevators of the same color. ## NEEDS TRANSLATION ## -tile.openblocks.heal.name=Healer -tile.openblocks.heal.description=The healing block is a creative-mode only block that gives off a slight healing effect over time. +#tile.openblocks.elevator_rotating.name=Rotating Elevator ## NEEDS TRANSLATION ## -tile.openblocks.guide.name=Building Guide -tile.openblocks.guide.description=The building guide will give you an outline of ghost blocks in different shapes and sizes that'll help you plan out rooms.\nYou can shift-click the guide to change the shape, or you can whack the different sides to increase or decrease the size.\nWhen in creative mode you can place an obsdian block above, then hit the building guide with any block you like to automatically create the shape. +#tile.openblocks.heal.name=Healer ## NEEDS TRANSLATION ## +#tile.openblocks.heal.description=The healing block is a creative-mode only block that gives off a slight healing effect over time. ## NEEDS TRANSLATION ## -tile.openblocks.ladder.name=Jaded Ladder -tile.openblocks.ladder.description=The jaded ladder solves that annoying problem of jumping out of a trapdoor at the top of a ladder. The jaded ladder acts as both a trap door and a ladder at the same time. +#tile.openblocks.guide.name=Building Guide ## NEEDS TRANSLATION ## +#tile.openblocks.guide.description=The building guide, once powered with redstone, will give you an outline of ghost blocks in different shapes and sizes that'll help you plan out rooms.\nUse touch-buttons on block to change outline dimensions and shapes.\nColor of markers can be changed by using dye on central block. ## NEEDS TRANSLATION ## -tile.openblocks.tank.name=Tank -tile.openblocks.tank.description=Tanks can hold liquids. If you place tanks next to each other and they'll distribute their liquid between the tanks. You can place liquid into the tanks using buckets. If the tank contains XP Juice you can click on them with an empty hand to give yourself some of the XP. When broken tanks will retain their liquid. +#tile.openblocks.builder_guide.name=Enhanced Building Guide ## NEEDS TRANSLATION ## +#tile.openblocks.builder_guide.description=This enhanced version of building guide not only displays ghost blocks to make building easier, but also allows you to place actual blocks. Just click central block with any block stack!\nWhen in creative mode you can place an obsidian block above, then hit the building guide with any block you like to automatically create the shape. ## NEEDS TRANSLATION ## -tile.openblocks.flag.name=Flag -tile.openblocks.flag.description=Flags can be used for decoration or for marking the way back out of a cave you've ventured in to. The flag will point in the direction that you placed it, or you can put it on walls. If you shift-click with a flag in your hand it will change color. +#tile.openblocks.ladder.name=Jaded Ladder ## NEEDS TRANSLATION ## +#tile.openblocks.ladder.description=The jaded ladder solves that annoying problem of jumping out of a trapdoor at the top of a ladder. The jaded ladder acts as both a trap door and a ladder at the same time. ## NEEDS TRANSLATION ## -tile.openblocks.beartrap.name=Bear Trap -tile.openblocks.beartrap.description=Place a bear trap and click on it to open it up. When a mob walks over the trap they'll be unable to move! +#tile.openblocks.tank.filled.name=%s Tank ## NEEDS TRANSLATION ## +#tile.openblocks.tank.name=Tank ## NEEDS TRANSLATION ## +#tile.openblocks.tank.description=Tanks can hold liquids. If you place tanks next to each other and they'll distribute their liquid between the tanks. You can place liquid into the tanks using buckets. If the tank contains XP Juice you can click on them with an empty hand to give yourself some of the XP. When broken tanks will retain their liquid. ## NEEDS TRANSLATION ## -tile.openblocks.sponge.name=Sponge -tile.openblocks.sponge.description=The sponge is a replacement for the vanilla sponge. Perfect for removing small pockets of lava or water. Be careful when using it on large areas of liquid though as it'll start to get quite messy. +#tile.openblocks.flag.name=Flag ## NEEDS TRANSLATION ## +#tile.openblocks.flag.description=Flags can be used for decoration or for marking the way back out of a cave you've ventured in to. The flag will point in the direction that you placed it, or you can put it on walls. If you shift-click with a flag in your hand it will change color. ## NEEDS TRANSLATION ## -item.openblocks.spongeonastick.name=Sponge -item.openblocks.spongeonastick.description=The sponge on a stick is a tool for cleaning up liquids. Works just like the sponge, but is more mobile at the expense of wearing out. +#tile.openblocks.beartrap.name=Bear Trap ## NEEDS TRANSLATION ## +#tile.openblocks.beartrap.description=Place a bear trap and click on it to open it up. When a mob walks over the trap they'll be unable to move! ## NEEDS TRANSLATION ## -tile.openblocks.cannon.name=Item Cannon -tile.openblocks.cannon.description=When given a redstone signal, the item cannon will shoot items that it finds in an adjacent inventory. Use the 'pointer' item to aim the cannon. +#tile.openblocks.sponge.name=Sponge ## NEEDS TRANSLATION ## +#tile.openblocks.sponge.description=The sponge is a replacement for the vanilla sponge. Perfect for removing small pockets of lava or water. Be careful when using it on large areas of liquid though as it'll start to get quite messy. ## NEEDS TRANSLATION ## -tile.openblocks.ropeladder.name=Rope Ladder -tile.openblocks.ropeladder.description=When you place a rope ladder it'll roll out all the way to the ground. +#item.openblocks.spongeonastick.name=Sponge ## NEEDS TRANSLATION ## +#item.openblocks.spongeonastick.description=The sponge on a stick is a tool for cleaning up liquids. Works just like the sponge, but is more mobile at the expense of wearing out. ## NEEDS TRANSLATION ## -tile.openblocks.sprinkler.name=Sprinkler -tile.openblocks.sprinkler.description=The sprinkler will help fertilize crops up to 4 blocks away. Simply place it above an OpenBlocks tank filled with water! You can also add bonemeal for an even faster rate of growth.\nIt also acts as a water source block! +#item.openblocks.epic_eraser.name=Epic Eraser ## NEEDS TRANSLATION ## +#item.openblocks.epic_eraser.description=Every item has its own history...\n\nDon't you hate it?\nWith this item you can scrub all traces of epic lore your loot has collected over the years and then sell it on black market without worrying about evidence. ## NEEDS TRANSLATION ## -tile.openblocks.paintmixer.name=Paint Mixer -tile.openblocks.paintmixer.description=The paint mixer can mix any colour of paint you want! Drop either an existing paint bucket or a bucket of milk into the top slot, then cyan, magenta, yellow and black dyes into the other four slots and click mix! +#tile.openblocks.cannon.name=Item Cannon ## NEEDS TRANSLATION ## +#tile.openblocks.cannon.description=When given a redstone signal, the item cannon will shoot items that it finds in an adjacent inventory. Use the 'pointer' item to aim the cannon. ## NEEDS TRANSLATION ## -tile.openblocks.canvas.name=Canvas -tile.openblocks.canvas.description=The canvas is a perfectly white block that's perfect for painting. See the Paint Mixer for information about making paints. +#tile.openblocks.ropeladder.name=Rope Ladder ## NEEDS TRANSLATION ## +#tile.openblocks.ropeladder.description=When you place a rope ladder it'll roll out all the way to the ground. For every created ladder block it will use one item from stack. ## NEEDS TRANSLATION ## -tile.openblocks.fan.name=Fan -tile.openblocks.fan.description=The fan will blow players, mobs or entities in the direction it's facing. +#tile.openblocks.sprinkler.name=Sprinkler ## NEEDS TRANSLATION ## +#tile.openblocks.sprinkler.description=The sprinkler will help fertilize crops up to 4 blocks away. Simply place it above an OpenBlocks tank filled with water! You can also add bonemeal for an even faster rate of growth.\nIt also acts as a water source block! ## NEEDS TRANSLATION ## -tile.openblocks.target.name=Target -tile.openblocks.target.description=The target will give out a redstone signal of a strength relative to the accuracy of the players aim. Give the target a redstone signal to make it pop up! +#tile.openblocks.paintmixer.name=Paint Mixer ## NEEDS TRANSLATION ## +#tile.openblocks.paintmixer.description=The paint mixer can mix any colour of paint you want! Drop either an existing paint bucket or a bucket of milk into the top slot, then cyan, magenta, yellow and black dyes into the other four slots and click mix! ## NEEDS TRANSLATION ## -tile.openblocks.path.name=Path -tile.openblocks.path.description=The path doesn't do anything. It just looks nice! +#tile.openblocks.canvas.name=Canvas ## NEEDS TRANSLATION ## +#tile.openblocks.canvas.description=The canvas is a perfectly white block that's perfect for painting. See the Paint Mixer for information about making paints. ## NEEDS TRANSLATION ## -tile.openblocks.itemDropper.name=Item Dropper -tile.openblocks.itemDropper.description=The item dropper is similar to the vanilla dropper, except it drops items directly down in a straight line. +#tile.openblocks.fan.name=Fan ## NEEDS TRANSLATION ## +#tile.openblocks.fan.description=The fan will blow players, mobs or entities in the direction it's facing. ## NEEDS TRANSLATION ## -tile.openblocks.bigbutton.name=Big Button -tile.openblocks.bigbutton.description=The big button is a large button that can be placed on walls. If you shift-click on the button with an empty hand it will bring up an inventory with a single slot. You can put items into this slot to increase the length of time the button is pressed - one item increases the button press by one tick. +#tile.openblocks.target.name=Target ## NEEDS TRANSLATION ## +#tile.openblocks.target.description=The target will give out a redstone signal of a strength relative to the accuracy of the player's aim. Give the target a redstone signal to make it pop up! ## NEEDS TRANSLATION ## -tile.openblocks.xpdrain.name=XP Drain -tile.openblocks.xpdrain.description=Place the XP drain above an OpenBlocks tank and stand on it. Your XP will drain into the tank, which can then be used for blocks such as the auto enchantment table or the auto anvil. +#tile.openblocks.path.name=Path ## NEEDS TRANSLATION ## +#tile.openblocks.path.description=The path doesn't do anything. It just looks nice! ## NEEDS TRANSLATION ## -tile.openblocks.vacuumhopper.name=Vacuum Hopper -tile.openblocks.vacuumhopper.description=The vacuum hopper will suck up items and XP orbs around it. You can use the tabs on the right of the interface to select which sides to output to. +#tile.openblocks.itemDropper.name=Item Dropper ## NEEDS TRANSLATION ## +#tile.openblocks.itemDropper.description=The item dropper is similar to the vanilla dropper, except it drops items directly down in a straight line. ## NEEDS TRANSLATION ## -tile.openblocks.village_highlighter.name=Village Highlighter -tile.openblocks.village_highlighter.description=Drop the village highlighter down in a village and give it a redstone signal. It will outline the perimeter of the village and draw a box in the iron golem spawning area. Useful if you want to make sure villages don't merge into each other or you're making an iron farm! +#tile.openblocks.bigbutton.name=Big Button ## NEEDS TRANSLATION ## +#tile.openblocks.bigbutton.description=The big button is a large button that can be placed on walls. If you shift-click on the button with an empty hand it will bring up an inventory with a single slot. You can put items into this slot to increase the length of time the button is pressed - one item increases the button press by one tick. ## NEEDS TRANSLATION ## -tile.openblocks.donationStation.name=Donation Station -tile.openblocks.donationStation.description=Love a block or item and want to show the mod developer some appreciation? Drop it into the donation station and if we know the authors donation page we'll give you a link. +#tile.openblocks.xpdrain.name=XP Drain ## NEEDS TRANSLATION ## +#tile.openblocks.xpdrain.description=Place the XP drain above an OpenBlocks tank and stand on it. Your XP will drain into the tank, which can then be used for blocks such as the auto enchantment table or the auto anvil. ## NEEDS TRANSLATION ## -tile.openblocks.blockPlacer.name=Block Placer -tile.openblocks.blockPlacer.description=When given a redstone pulse the block placer will place an item in the direction it's facing. +#tile.openblocks.vacuumhopper.name=Vacuum Hopper ## NEEDS TRANSLATION ## +#tile.openblocks.vacuumhopper.description=The vacuum hopper will suck up items and XP orbs around it. You can use the tabs on the right of the interface to select which sides to output to. ## NEEDS TRANSLATION ## -tile.openblocks.blockbreaker.name=Block Breaker -tile.openblocks.blockbreaker.description=When given a redstone pulse the block breaker will break the block it's facing. +#tile.openblocks.village_highlighter.name=Village Highlighter ## NEEDS TRANSLATION ## +#tile.openblocks.village_highlighter.description=Drop the village highlighter down in a village and give it a redstone signal. It will outline the perimeter of the village and draw a box in the iron golem spawning area. Useful if you want to make sure villages don't merge into each other or you're making an iron farm! ## NEEDS TRANSLATION ## -tile.openblocks.projector.name=Height Map Projector -tile.openblocks.projector.description=I'll let you write this one boq! +#tile.openblocks.donationStation.name=Donation Station ## NEEDS TRANSLATION ## +#tile.openblocks.donationStation.description=Love a block or item and want to show the mod developer some appreciation? Drop it into the donation station and if we know the authors donation page we'll give you a link. ## NEEDS TRANSLATION ## -tile.openblocks.autoenchantmenttable.name=Auto Enchantment Table -tile.openblocks.autoenchantmenttable.description=The auto enchantment table works in a similar way to the vanilla enchantment table except it runs off XP juice. Use the tabs on the right side of the interface to select where items or xp can be pulled from. Just like with the vanilla table bookshelves are required for higher levels. +#tile.openblocks.blockPlacer.name=Block Placer ## NEEDS TRANSLATION ## +#tile.openblocks.blockPlacer.description=When given a redstone pulse the block placer will place an item in the direction it's facing. ## NEEDS TRANSLATION ## -tile.openblocks.xpbottler.name=XP Bottler -tile.openblocks.xpbottler.description=The XP bottler will take XP juice and bottle it up into glass bottles to create bottles o' enchanting. +#tile.openblocks.blockbreaker.name=Block Breaker ## NEEDS TRANSLATION ## +#tile.openblocks.blockbreaker.description=When given a redstone pulse the block breaker will break the block it's facing. ## NEEDS TRANSLATION ## -tile.openblocks.autoanvil.name=Auto Anvil -tile.openblocks.autoanvil.description=The auto anvil works just like the vanilla anvil, except it runs from XP juice and can be fully automated.\n\nUse the tabs on the right of the GUI to select which sides of the anvil items or liquid can be inserted or extracted. Right click and drag the anvil in the tab to spin it around and select other sides! +#tile.openblocks.projector.name=Height Map Projector ## NEEDS TRANSLATION ## +#tile.openblocks.projector.description=I'll let you write this one boq! ## NEEDS TRANSLATION ## -tile.openblocks.drawingtable.name=Drawing Table -tile.openblocks.drawingtable.description=The drawing table is for creating stencils which can be used while painting. Insert an Unprepared Stencil into the drawing table then use the arrows to select which stencil you want! +#tile.openblocks.autoenchantmenttable.name=Auto Enchantment Table ## NEEDS TRANSLATION ## +#tile.openblocks.autoenchantmenttable.description=The auto enchantment table works in a similar way to the vanilla enchantment table except it runs off XP juice. Use the tabs on the right side of the interface to select where items or xp can be pulled from. Just like with the vanilla table bookshelves are required for higher levels. ## NEEDS TRANSLATION ## -tile.openblocks.grave.name=Grave -tile.openblocks.trophy.name=Trophy -tile.openblocks.canvasglass.name=Glass Canvas -tile.openblocks.paintcan.name=Paint Can +#tile.openblocks.xpbottler.name=XP Bottler ## NEEDS TRANSLATION ## +#tile.openblocks.xpbottler.description=The XP bottler will take XP juice and bottle it up into glass bottles to create bottles o' enchanting. ## NEEDS TRANSLATION ## -tile.openblocks.sky.normal.name=Sky Block -tile.openblocks.sky.normal.description=Bring the outside inside with the new Sky block! Just apply a redstone signal. We also offer an inverted version. -tile.openblocks.sky.inverted.name=Inverted Sky Block +#tile.openblocks.autoanvil.name=Auto Anvil ## NEEDS TRANSLATION ## +#tile.openblocks.autoanvil.description=The auto anvil works just like the vanilla anvil, except it runs from XP juice and can be fully automated.\n\nUse the tabs on the right of the GUI to select which sides of the anvil items or liquid can be inserted or extracted. Right click and drag the anvil in the tab to spin it around and select other sides! ## NEEDS TRANSLATION ## -tile.openblocks.radio.name=Radio -tile.openblocks.radio.description=The radio allows you to stream internet radio! First, you need some tuned crystals which you can find in dungeon chests or from a special villager. Place the crystal in the radio and supply it with a redstone signal to turn it on. The redstone strength controls the volume.\n\nYou can configure which radio stations are available in the servers config file. +#tile.openblocks.drawingtable.name=Drawing Table ## NEEDS TRANSLATION ## +#tile.openblocks.drawingtable.description=The drawing table is for creating stencils which can be used while painting. Insert an Unprepared Stencil into the drawing table then use the arrows to select which stencil you want! ## NEEDS TRANSLATION ## -tile.openblocks.xpshower.name=XP Shower -tile.openblocks.xpshower.description=Attach an XP shower to a tank of XP juice and it'll pour out XP orbs. These orbs can be collected by an XP Drain or an MFR Sewer. +#tile.openblocks.grave.name=Grave ## NEEDS TRANSLATION ## +#tile.openblocks.trophy.name=Trophy ## NEEDS TRANSLATION ## +#tile.openblocks.trophy.entity.name=%s Trophy ## NEEDS TRANSLATION ## +#tile.openblocks.canvasglass.name=Glass Canvas ## NEEDS TRANSLATION ## +#tile.openblocks.paintcan.name=Paint Can ## NEEDS TRANSLATION ## -tile.openblocks.goldenegg.name=Golden Egg +#tile.openblocks.sky.normal.name=Sky Block ## NEEDS TRANSLATION ## +#tile.openblocks.sky.normal.description=Bring the outside inside with the new Sky block! Just apply a redstone signal. We also offer an inverted version. ## NEEDS TRANSLATION ## +#tile.openblocks.sky.inverted.name=Inverted Sky Block ## NEEDS TRANSLATION ## -tile.openblocks.digitalfuse.name=Digital Fuse -item.openblocks.cursor.name=Cursor -item.openblocks.cursor.description=The cursor will let you click on blocks remotely.\nSimply shift-click onto a block to link the cursor, then use the cursor wherever you like to click on the target block. Be warned, by default the cursor uses up your XP relative to how far you are from the block you're clicking. +#tile.openblocks.radio.name=Radio ## NEEDS TRANSLATION ## +#tile.openblocks.radio.description=The radio allows you to stream internet radio! First, you need some tuned crystals which you can find in dungeon chests or from a special villager. Place the crystal in the radio and supply it with a redstone signal to turn it on. The redstone strength controls the volume.\n\nYou can configure which radio stations are available in the servers config file. ## NEEDS TRANSLATION ## -item.openblocks.devnull.name=/dev/null -item.openblocks.devnull.description=Click using /dev/null to open the inventory. There's a single inventory slot - put an item in there - dirt, for example. As you gather dirt from the ground this slot will fill up. Once it's full, any more dirt you pick up will be automatically discarded. You can shift-click with the item in your hand as though you were placing the block! +#tile.openblocks.xpshower.name=XP Shower ## NEEDS TRANSLATION ## +#tile.openblocks.xpshower.description=Attach an XP shower to a tank of XP juice and it'll pour out XP orbs. These orbs can be collected by an XP Drain or an MFR Sewer. ## NEEDS TRANSLATION ## -item.openblocks.slimalyzer.name=Slimalyzer -item.openblocks.slimalyzer.description=Walk around with the slimalyzer in your hand and it'll light up whenever you're in a slime spawning chunk. +#tile.openblocks.scaffolding.name=Scaffolding ## NEEDS TRANSLATION ## +#tile.openblocks.scaffolding.description=Have you ever wanted to pillar up somewhere without leaving an ugly tower behind? Well, now you can! Simply build with scaffolding blocks and they will automatically despawn when you are done. ## NEEDS TRANSLATION ## -item.openblocks.hangglider.name=Hang Glider -item.openblocks.hangglider.description=The hang glider is self explanatory. Hold it in your hand and click to place it on your back. Now jump!\nTo increase your speed you can press shift while gliding, but watch out, you'll lose altitude faster! +#tile.openblocks.goldenegg.name=Golden Egg ## NEEDS TRANSLATION ## -item.openblocks.gliderwing.name=Glider Wing +#tile.openblocks.digitalfuse.name=Digital Fuse ## NEEDS TRANSLATION ## -item.openblocks.sleepingbag.name=Sleeping Bag -item.openblocks.sleepingbag.description=The sleeping bag lets you sleep out in the wilderness without having to reset your spawn location. To sleep, simply wear it on your back. +#item.openblocks.cursor.name=Cursor ## NEEDS TRANSLATION ## +#item.openblocks.cursor.description=The cursor will let you click on blocks remotely.\nSimply shift-click onto a block to link the cursor, then use the cursor wherever you like to click on the target block. Be warned, by default the cursor uses up your XP relative to how far you are from the block you're clicking. ## NEEDS TRANSLATION ## -item.openblocks.luggage.name=Luggage -item.openblocks.luggage.description=Luggage is your new friend. He'll follow you around anywhere you go collecting any items he finds on the floor. Nom nom nom!\nTo dismantle him just shift-click on him and he'll turn into an item that you can carry around.\nIf he ever gets struck by lightning he'll be able to carry even more items! +#item.openblocks.devnull.name=/dev/null ## NEEDS TRANSLATION ## +#item.openblocks.devnull.description=Click using /dev/null to open the inventory. There's a single inventory slot - put an item in there - dirt, for example. As you gather dirt from the ground this slot will fill up. Once it's full, any more dirt you pick up will be automatically discarded. You can shift-click with the item in your hand as though you were placing the block! ## NEEDS TRANSLATION ## -item.openblocks.sonicglasses.name=Sonic Glasses -item.openblocks.sonicglasses.description=Introducing the fantabulous new Sonic Glasses!\nThis new and exciting technology from OpenMods Inc allow you see what you hear! +#item.openblocks.slimalyzer.name=Slimalyzer ## NEEDS TRANSLATION ## +#item.openblocks.slimalyzer.description=Walk around with the slimalyzer in your hand and it'll light up whenever you're in a slime spawning chunk. ## NEEDS TRANSLATION ## -item.openblocks.squeegee.name=Squeegee -item.openblocks.squeegee.description=The squeegee removes paint from any painted blocks. Just click on the side of the block you want to remove the paint from, or alternative shift-click the block to remove paint from all sides! +#item.openblocks.hangglider.name=Hang Glider ## NEEDS TRANSLATION ## +#item.openblocks.hangglider.description=The hang glider is self explanatory. Hold it in your hand and click to place it on your back. Now jump!\nTo increase your speed you can press shift while gliding, but watch out, you'll lose altitude faster! ## NEEDS TRANSLATION ## -item.openblocks.paintbrush.name=Paint Brush -item.openblocks.paintbrush.description=Paint brushes let you paint blocks in whatever color you like!\n\nDab your paint brush in a Paint Can made in the Paint Mixer then click on a block to paint it.\n\nCanvas blocks are perfect for painting, but you can also paint quite a few vanilla blocks and even some blocks from other mods. You can also place stencils on blocks and then paint over the stencil! +#item.openblocks.gliderwing.name=Glider Wing ## NEEDS TRANSLATION ## -item.openblocks.unprepared_stencil.name=Unprepared Stencil -item.openblocks.unprepared_stencil.description="What are these pesky stencils I keep finding in chests?"\n\nStencils can be placed onto blocks and then painted over using paint brushes!\n\nYou can paint a block using multiple stencils and you can click on them with an empty hand to rotate them.\n\nPlace an Unprepared Stencil in a Drawing table to create different patterns. +#item.openblocks.sleepingbag.name=Sleeping Bag ## NEEDS TRANSLATION ## +#item.openblocks.sleepingbag.description=The sleeping bag lets you sleep out in the wilderness without having to reset your spawn location. To sleep, simply wear it on your back. ## NEEDS TRANSLATION ## -item.openblocks.stencil.name=Stencil -item.openblocks.crayon.name=Magic Crayon -item.openblocks.pencil.name=Magic Pencil -item.openblocks.glasses.pencil.name=Pencil Glasses -item.openblocks.glasses.crayon.name=Crayon Glasses -item.openblocks.glasses.technicolor.name=Amazing Technicolor Glasses -item.openblocks.glasses.admin.name=Badass Glasses -item.openblocks.crane_backpack.name=Crane Backpack -item.openblocks.crane_control.name=Crane Control -item.openblocks.crane_engine.name=Crane Engine -item.openblocks.crane_magnet.name=Crane Magnet -item.openblocks.beam.name=Beam -item.openblocks.line.name=Line +#item.openblocks.luggage.name=Luggage ## NEEDS TRANSLATION ## +#item.openblocks.luggage.description=Luggage is your new friend. He'll follow you around anywhere you go collecting any items he finds on the floor. Nom nom nom!\nTo dismantle him just shift-click on him and he'll turn into an item that you can carry around.\nIf he ever gets struck by lightning he'll be able to carry even more items! ## NEEDS TRANSLATION ## + +#item.openblocks.sonicglasses.name=Sonic Glasses ## NEEDS TRANSLATION ## +#item.openblocks.sonicglasses.description=Introducing the fantabulous new Sonic Glasses!\nThis new and exciting technology from OpenMods Inc allow you see what you hear! ## NEEDS TRANSLATION ## + +#item.openblocks.squeegee.name=Squeegee ## NEEDS TRANSLATION ## +#item.openblocks.squeegee.description=The squeegee removes paint from any painted blocks. Just click on the side of the block you want to remove the paint from, or alternative shift-click the block to remove paint from all sides! ## NEEDS TRANSLATION ## + +#item.openblocks.paintbrush.name=Paint Brush ## NEEDS TRANSLATION ## +#item.openblocks.paintbrush.description=Paint brushes let you paint blocks in whatever color you like!\n\nDab your paint brush in a Paint Can made in the Paint Mixer then click on a block to paint it.\n\nCanvas blocks are perfect for painting, but you can also paint quite a few vanilla blocks and even some blocks from other mods. You can also place stencils on blocks and then paint over the stencil! ## NEEDS TRANSLATION ## + +#item.openblocks.unprepared_stencil.name=Unprepared Stencil ## NEEDS TRANSLATION ## +#item.openblocks.unprepared_stencil.description=Stencils can be placed onto blocks and then painted over using paint brushes!\n\nYou can paint a block using multiple stencils and you can click on them with an empty hand to rotate them.\n\nPlace an Unprepared Stencil in a Drawing table to create different patterns. ## NEEDS TRANSLATION ## + +#item.openblocks.crane_backpack.name=Crane Backpack ## NEEDS TRANSLATION ## +#item.openblocks.crane_backpack.description=In Minecraft world "magnet" is ancient word for "how do this works?".\n\nThis particular piece of very equipment allows you to pick and carry mobs, players, items and blocks. Can be controlled with magnet control. ## NEEDS TRANSLATION ## + +#item.openblocks.crane_control.name=Crane Control ## NEEDS TRANSLATION ## +#item.openblocks.crane_control.description=This hi-tech wireless remote is used for controlling magnet backpacks.\n\nRight click to raise, Sneak + right click to lower, left click to pick/release.\nBlinking light signals something is under magnet. ## NEEDS TRANSLATION ## + +#item.openblocks.wrench.name=Big Metal Bar ## NEEDS TRANSLATION ## +#item.openblocks.wrench.description=This is extremely sophisticated tool used to perform transformations of objects with octahedral symmetry.\n\n\nOr just big, dumb piece of metal you can use to rotate cubes and stuff.\n\nSo yeah, it's yet another wrench. I'm just trying to be original here, ok? ## NEEDS TRANSLATION ## + +#item.openblocks.stencil.name=Stencil ## NEEDS TRANSLATION ## +#item.openblocks.crayon.name=Magic Crayon ## NEEDS TRANSLATION ## +#item.openblocks.pencil.name=Magic Pencil ## NEEDS TRANSLATION ## +#item.openblocks.glasses.pencil.name=Pencil Glasses ## NEEDS TRANSLATION ## +#item.openblocks.glasses.crayon.name=Crayon Glasses ## NEEDS TRANSLATION ## +#item.openblocks.glasses.technicolor.name=Amazing Technicolor Glasses ## NEEDS TRANSLATION ## +#item.openblocks.glasses.admin.name=Badass Glasses ## NEEDS TRANSLATION ## +#item.openblocks.crane_engine.name=Crane Engine ## NEEDS TRANSLATION ## +#item.openblocks.crane_magnet.name=Crane Magnet ## NEEDS TRANSLATION ## +#item.openblocks.beam.name=Beam ## NEEDS TRANSLATION ## +#item.openblocks.line.name=Line ## NEEDS TRANSLATION ## item.openblocks.miracle_magnet.name=§5Aimant de Miracle§r item.openblocks.info_book.name=Domination du monde avec OpenBlocks item.openblocks.xpbucket.name=XP Seau @@ -314,16 +358,16 @@ item.openblocks.sketching_pencil.name=Esquisse Crayon item.openblocks.tasty_clay.name=Savoureux Argile item.openblocks.golden_eye.name=D'or œil item.openblocks.pointer.name=Aiguille -item.openblocks.tuned_crystal.name=Tuned Crystal -item.openblocks.pedometer.name=Pedometer +#item.openblocks.tuned_crystal.name=Tuned Crystal ## NEEDS TRANSLATION ## +#item.openblocks.pedometer.name=Pedometer ## NEEDS TRANSLATION ## -item.openblocks.wallpaper.name=Wallpaper +#item.openblocks.wallpaper.name=Wallpaper ## NEEDS TRANSLATION ## itemGroup.tabOpenBlocks=OpenBlocks -entity.OpenBlocks.Luggage.name=Luggage -entity.OpenBlocks.Cartographer.name=Cartographer -entity.OpenBlocks.Block.name=Floating Block -entity.OpenBlocks.MiniMe.name=Mini Me +#entity.OpenBlocks.Luggage.name=Luggage ## NEEDS TRANSLATION ## +#entity.OpenBlocks.Cartographer.name=Cartographer ## NEEDS TRANSLATION ## +#entity.OpenBlocks.Block.name=Floating Block ## NEEDS TRANSLATION ## +#entity.OpenBlocks.MiniMe.name=Mini Me ## NEEDS TRANSLATION ## -fluid.OpenBlocks.xpjuice=Liquid XP +#fluid.OpenBlocks.xpjuice=Liquid XP ## NEEDS TRANSLATION ## diff --git a/src/main/resources/assets/openblocks/lang/it_IT.lang b/src/main/resources/assets/openblocks/lang/it_IT.lang index 5230c8cc..b01225f1 100644 --- a/src/main/resources/assets/openblocks/lang/it_IT.lang +++ b/src/main/resources/assets/openblocks/lang/it_IT.lang @@ -38,7 +38,6 @@ openblocks.gui.drawingtable=Tavolo da Disegno openblocks.gui.digitalfuse=Innesco digitale openblocks.gui.xp_outputs=Emissione di Punti Esperienza openblocks.gui.item_outputs=Emissione di Oggetti -openblocks.gui.watch_video=Guarda video openblocks.gui.max_level=Livello massimo: %d openblocks.gui.save_folder=Cartella di salvataggio @@ -52,7 +51,7 @@ openblocks.gui.config.title=Facili Modifiche della Configurazione openblocks.gui.config.content=OpenMods permette sia alle opzioni di configurazione del client sia a quelle del server di essere modificate da comandi in chat. Alcune non hanno nemmeno bisogno di un riavvio!\n\nLe impostazioni di configurazione del server possono essere modificate usando '§l/om_config_s§r' (OP necessario) e le impostazioni di configurazione del client possono essere modificate con '§l/om_config_c§r'\n\nPer esempio:\n\n§l/om_config_s set OpenBlocks dropblock elevatorDrainsXP false§r\n§l/om_config_s save§r\n\nPer una lista completa dei comandi scrivi: §l/help om_config_s§r or §l/help om_config_c§r openblocks.gui.restore_inv.title=Backup dell'Inventario -openblocks.gui.restore_inv.content=Ognuno può fare degli errori. Ma con il comando §l/ob_inventory§r si può rimediare ad alcuni. Questo comando può essere usato per ripristinare l'inventario. Il backup viene creato quando:\n - un giocatore muore\n - una tomba appare \n\ - un giocatore esegue il comando §l/ob_inventory store§r\n\nPer ripristinare l'inventario si ha bisogno del nome del backup. Vai nella cartella sotto o nella cartella dei salvataggi sul server e cerca dei file chiamati §linventory-*.dat§r. Poi ripristina l'inventario con §l/ob_inventory restore §r - dove id è o il nome del file completo o solo la parte centrale, senza §linventory-§r e §l.dat§r. Si può anche usare il completamento automatico (TAB). I backup sono dei normali file NBT e possono essere aperti con ogni editor. +openblocks.gui.restore_inv.content=Ognuno può fare degli errori. Ma con il comando §l/ob_inventory§r si può rimediare ad alcuni. Questo comando può essere usato per ripristinare l'inventario. Il backup viene creato quando:\n - un giocatore muore\n - una tomba appare \n - un giocatore esegue il comando §l/ob_inventory store§r\n\nPer ripristinare l'inventario si ha bisogno del nome del backup. Vai nella cartella sotto o nella cartella dei salvataggi sul server e cerca dei file chiamati §linventory-*.dat§r. Poi ripristina l'inventario con §l/ob_inventory restore §r - dove id è o il nome del file completo o solo la parte centrale, senza §linventory-§r e §l.dat§r. Si può anche usare il completamento automatico (TAB). I backup sono dei normali file NBT e possono essere aperti con ogni editor. openblocks.gui.bkey.title=L'infamante tasto 'B' openblocks.gui.bkey.content=Il tasto 'B' è un tasto molto speciale in OpenBlocks.\n\nL'abilitazione dell'opzione di configurazione 'weAreSeriousPeople' nella categoria 'tomfoolery' sia nel file di configurazione del client sia in quello del server ti darà il tuo personale sistema digestivo.\n\nProva a mangiare un po' di quella gustosa argilla e poi premi 'B' per digerire! @@ -93,6 +92,7 @@ openblocks.misc.page=Pagina %d di %d openblocks.misc.oh_no_ceiling=Non ti puoi addormentare lì. Il soffitto ti disturba troppo... openblocks.misc.oh_no_ground=Vuoi dormire su QUEL COSO!? openblocks.misc.sleeping_bag_broken=Oggetto disattivato in quanto l'inizializzazione è fallita +#openblocks.misc.inverted=Inverted ## NEEDS TRANSLATION ## openblocks.misc.grave_msg=%s (Giorno: %.1f) @@ -323,7 +323,7 @@ item.openblocks.paintbrush.name=Pennello item.openblocks.paintbrush.description=I pennelli ti permettono di dipingere i blocchi con ogni colore che vuoi!\n\nPicchietta il tuo pennello su una Lattina di Pittura fatta nel Miscelatore di Pittura, poi clicca su un blocco per dipingerlo.\n\nI blocchi di Tela sono perfetti per dipingere, ma puoi anche dipingere un bel po' di blocchi Vanilla e anche alcuni blocchi di altre mod. Puoi anche piazzare degli stampi sui blocchi e poi dipingere sullo stampo! item.openblocks.unprepared_stencil.name=Stampo non Preparato -item.openblocks.unprepared_stencil.description=Gli stampi possono essere piazzati sui blocchi e poi dipinti sui blocchi usando i pennello!\n\nPuoi dipingere un blocco usando stampi multipli e puoi cliccare su di essi con una mano vuota per ruotarli.\b\bPiazza uno Stampo non Preparato in un Tavolo da Disegno per creare diversi motivi. +item.openblocks.unprepared_stencil.description=Gli stampi possono essere piazzati sui blocchi e poi dipinti sui blocchi usando i pennello!\n\nPuoi dipingere un blocco usando stampi multipli e puoi cliccare su di essi con una mano vuota per ruotarli. Piazza uno Stampo non Preparato in un Tavolo da Disegno per creare diversi motivi. item.openblocks.crane_backpack.name=Zaino della Gru item.openblocks.crane_backpack.description=Nel mondo di Minecraft, "magnete" è un'antica parola per "questo come funzionano?".\n\nQuesto particolare pezzo di vero equipaggiamento ti permette di prendere e trasportare mob, giocatori, oggetti e blocchi. Può essere controllato con il controllore del magnete. @@ -334,7 +334,6 @@ item.openblocks.crane_control.description=Questo telecomando wireless ad alta te item.openblocks.wrench.name=Grande Barra di Metallo item.openblocks.wrench.description=Questo strumento estremamente sofisticato è usato per trasformare oggetti con simmetria ottaedra.\n\n\nO semplicemente un grande e stupido pezzo di metallo che puoi usare per ruotare cubi e altre cose.\n\nQuinfi sì, è semplicemente un'altra chiave inglese. Sto solo cercando di essere originale, ok? - item.openblocks.stencil.name=Stampo item.openblocks.crayon.name=Pastello Magico item.openblocks.pencil.name=Matita Magica diff --git a/src/main/resources/assets/openblocks/lang/ko_KR.lang b/src/main/resources/assets/openblocks/lang/ko_KR.lang index ec12ffb0..20782470 100644 --- a/src/main/resources/assets/openblocks/lang/ko_KR.lang +++ b/src/main/resources/assets/openblocks/lang/ko_KR.lang @@ -1,6 +1,8 @@ achievement.openblocks.droppedBrick=Zoinks! achievement.openblocks.droppedBrick.desc=Sorry, it just happened... stat.openblocks.bricksDropped=Bricks dropped +#achievement.openblocks.stackOverflow=Stack Overflow ## NEEDS TRANSLATION ## +#achievement.openblocks.stackOverflow.desc=It's full of stars! ## NEEDS TRANSLATION ## openblocks.keybind.category=오픈블럭 openblocks.keybind.drop_brick=바보 @@ -36,8 +38,8 @@ openblocks.gui.drawingtable=Drawing Table openblocks.gui.digitalfuse=Digital Fuse openblocks.gui.xp_outputs=경험치 추출 openblocks.gui.item_outputs=아이템 추출 -openblocks.gui.watch_video=비디오 보기 openblocks.gui.max_level=최대 레벨: %d +#openblocks.gui.save_folder=Save folder ## NEEDS TRANSLATION ## openblocks.gui.welcome.title=어서오세요! openblocks.gui.welcome.content=OpenBlocks는 행글라이더, 엘리베이터, 탱크, 무덤, 페인트, 크레인, 액체 XP, 지도, 트로피 등외에도 많은것들을 추가하는 오픈 소스 모드입니다! @@ -48,6 +50,9 @@ openblocks.gui.credits.content=§LBoq, Mikee and NeverCast§R - 오픈블럭 매 openblocks.gui.config.title=쉬운 설정 변경 openblocks.gui.config.content=OpenMods커맨드로 설정을 재로드 할수 있으며 마인크래프트를 재실행할 필요가 없습니다!\n\n서버 설정은 '§L/om_config_s§R'에서 할 수 있습니다 (op권한 필요) 클라이언트 설정은 '§L/om_config_c§R'에서 하실 수 있습니다.\n\n예제:\n\n§L/om_config_s set OpenBlocks dropblock elevatorDrainsXP false§R\n§L/om_config_s save§R\n\nFor a full list of commands type: §L/help om_config_s§R or §L/help om_config_c§R +#openblocks.gui.restore_inv.title=Inventory backup ## NEEDS TRANSLATION ## +#openblocks.gui.restore_inv.content=Everyone can make mistake. But with §L/ob_inventory§R command you can fix some of them. This command can be used to restore inventory. Backup is created when:\n - player dies\n - grave is spawned \n - player issued command §L/ob_inventory store§R\n\nTo restore inventory you need backup name. Go to folder below or to saves folder on server and look for files named §Linventory-*.dat§R. Then restore inventory with §L/ob_inventory restore §R - where id is either full filename or just middle part, without §Linventory-§R and §L.dat§R. You can also use tab completion. Backups are normal NBT files and can be opened with any editor. ## NEEDS TRANSLATION ## + openblocks.gui.bkey.title=특수키 'B(ㅠ)' openblocks.gui.bkey.content=오픈블럭에서 'B(ㅠ)'키는 정말 특별한 키입니다.\n\n모든 서버/클라이언트 설정파일의 'weAreSeriousPeople' 부분의 옵션을 'tomfoolery' 로 설정하실경우 자신에게 소화시스템을 제공합니다.\n\n점토를 먹은후 'B(ㅠ)'키를 눌러보세요! @@ -58,7 +63,7 @@ openblocks.gui.flimflam.title=허튼소리 마법부여 openblocks.gui.flimflam.content=과학자들은 마법부여의 속성을 발견하지 못하고있어요 openblocks.gui.laststand.title=최후의안정 마법부여 -openblocks.gui.laststand.content최후의안정 마법부여는 당신의 죽지 않도록 도와줍니다. 체력이 0.5하트이하 일때 당신의 XP를 사용하여 채력을 회복합니다. +openblocks.gui.laststand.content=최후의안정 마법부여는 당신의 죽지 않도록 도와줍니다. 체력이 0.5하트이하 일때 당신의 XP를 사용하여 채력을 회복합니다. openblocks.changelog.title=새로운 오픈블럭에는 무엇이 있을까? %s openblocks.misc.url=URL: %s @@ -80,15 +85,25 @@ openblocks.misc.selected_cannon=대포가 쏠 위치를 결정 openblocks.misc.pointed_cannon=대포의 발사위치 %s, %s, %s openblocks.misc.change_mode=%s 모드로 변경 openblocks.misc.change_size=%sx%sx%s크기로 변경 +#openblocks.misc.change_box_size=Changing size to (%d,%d,%d):(%d,%d,%d) ## NEEDS TRANSLATION ## openblocks.misc.total_blocks=총 블럭 갯수: %d openblocks.misc.get_witched=마녀를 얻었다! openblocks.misc.page=%d 중 %d 페이지 openblocks.misc.oh_no_ceiling=이곳에서 잠들 수 없습니다. 윗부분의 블럭이 방해합니다. +#openblocks.misc.oh_no_ground=You want to sleep on THAT!? ## NEEDS TRANSLATION ## +#openblocks.misc.sleeping_bag_broken=Item inactive due to failed initialization ## NEEDS TRANSLATION ## +#openblocks.misc.inverted=Inverted ## NEEDS TRANSLATION ## -openblocks.misc.cant_restore=플레이어의 인벤토리를 복원할 수 없습니다. : %s +#openblocks.misc.grave_msg=%s (day: %.1f) ## NEEDS TRANSLATION ## + +#openblocks.misc.cant_restore_player=Can't restore inventory for player %s ## NEEDS TRANSLATION ## +#openblocks.misc.cant_restore_inventory=Can't restore inventory ## NEEDS TRANSLATION ## openblocks.misc.cant_store=%s플레이어의 인벤토리를 복원할 수 없습니다. +#openblocks.misc.invalid_sub_inventory=Can't restore sub inventory %s ## NEEDS TRANSLATION ## openblocks.misc.stored_inventory=플레이어의 인벤토리를 복원했습니다. : %s openblocks.misc.restored_inventory=%s플레이어의 인벤토리를 복원했습니다. +#openblocks.misc.invalid_index=Invalid index ## NEEDS TRANSLATION ## +#openblocks.misc.empty_slot=No item in slot ## NEEDS TRANSLATION ## openblocks.misc.pedometer.tracking_reset=추적 리셋 openblocks.misc.pedometer.tracking_started=추적 시작 @@ -107,14 +122,23 @@ openblocks.misc.pedometer.last_check_time=%d틱 전에 마지막으로 속도를 openblocks.misc.pedometer.total_time=총 시간: %d 틱 +#openblocks.misc.shape=Shape: %s ## NEEDS TRANSLATION ## openblocks.misc.shape.sphere=구체 openblocks.misc.shape.cylinder=실린더 openblocks.misc.shape.cuboid=큐브 +#openblocks.misc.shape.full_cuboid=Full Cuboid ## NEEDS TRANSLATION ## openblocks.misc.shape.dome=돔 openblocks.misc.shape.triangle=삼각형 openblocks.misc.shape.pentagon=오각형 openblocks.misc.shape.hexagon=육각형 openblocks.misc.shape.octagon=8각형 +#openblocks.misc.shape.axes=Axes ## NEEDS TRANSLATION ## +#openblocks.misc.shape.planes=Planes ## NEEDS TRANSLATION ## + +#openblocks.misc.box=Dimensions: (%d,%d,%d):(%d,%d,%d) ## NEEDS TRANSLATION ## +#openblocks.misc.width=Width: %d ## NEEDS TRANSLATION ## +#openblocks.misc.height=Height: %d ## NEEDS TRANSLATION ## +#openblocks.misc.depth=Depth: %d ## NEEDS TRANSLATION ## openblocks.misc.radio.too_many=Too many radios already playing openblocks.misc.radio.invalid_stream=잘못된 스트림 @@ -141,6 +165,8 @@ openblocks.misc.command.flim_flam_target=Someone doesn't like you. Someone with openblocks.misc.command.flim_flam_failed=Flim-flamming failed! openblocks.misc.command.luck_added=Luck changed for player %s, current: %d openblocks.misc.command.luck_current=Player %s luck: %d + +#openblocks.misc.hidden_lore=§a§oHold ALT to see history§r ## NEEDS TRANSLATION ## openblocks.flim_flammed=Something weird happens around you openblocks.turtle.magnet=자석 @@ -148,171 +174,192 @@ openblocks.turtle.magnet=자석 tile.openblocks.elevator.name=엘레베이터 tile.openblocks.elevator.description=엘레베이터를 놓은 자리에서 위에 1블럭 아래1블럭이 없고 2블럭 이상(이하)에 엘레베이터 블럭이 있는경우 그곳으로 이동 할 수 있습니다. 올라가기위해선 '점프' 내려가기 위해선 '웅크리기'를 하시면 됩니다. +#tile.openblocks.elevator_rotating.name=Rotating Elevator ## NEEDS TRANSLATION ## + tile.openblocks.heal.name=힐러 -tile.openblocks.heal.description=The healing block is a creative-mode only block that gives off a slight healing effect over time. +#tile.openblocks.heal.description=The healing block is a creative-mode only block that gives off a slight healing effect over time. ## NEEDS TRANSLATION ## tile.openblocks.guide.name=건축 가이드 -tile.openblocks.guide.description=The building guide will give you an outline of ghost blocks in different shapes and sizes that'll help you plan out rooms.\nYou can shift-click the guide to change the shape, or you can whack the different sides to increase or decrease the size.\nWhen in creative mode you can place an obsdian block above, then hit the building guide with any block you like to automatically create the shape. +#tile.openblocks.guide.description=The building guide, once powered with redstone, will give you an outline of ghost blocks in different shapes and sizes that'll help you plan out rooms.\nUse touch-buttons on block to change outline dimensions and shapes.\nColor of markers can be changed by using dye on central block. ## NEEDS TRANSLATION ## + +#tile.openblocks.builder_guide.name=Enhanced Building Guide ## NEEDS TRANSLATION ## +#tile.openblocks.builder_guide.description=This enhanced version of building guide not only displays ghost blocks to make building easier, but also allows you to place actual blocks. Just click central block with any block stack!\nWhen in creative mode you can place an obsidian block above, then hit the building guide with any block you like to automatically create the shape. ## NEEDS TRANSLATION ## tile.openblocks.ladder.name=물린 사다리 -tile.openblocks.ladder.description=The jaded ladder solves that annoying problem of jumping out of a trapdoor at the top of a ladder. The jaded ladder acts as both a trap door and a ladder at the same time. +#tile.openblocks.ladder.description=The jaded ladder solves that annoying problem of jumping out of a trapdoor at the top of a ladder. The jaded ladder acts as both a trap door and a ladder at the same time. ## NEEDS TRANSLATION ## +#tile.openblocks.tank.filled.name=%s Tank ## NEEDS TRANSLATION ## tile.openblocks.tank.name=탱크 -tile.openblocks.tank.description=Tanks can hold liquids. If you place tanks next to each other and they'll distribute their liquid between the tanks. You can place liquid into the tanks using buckets. If the tank contains XP Juice you can click on them with an empty hand to give yourself some of the XP. When broken tanks will retain their liquid. +#tile.openblocks.tank.description=Tanks can hold liquids. If you place tanks next to each other and they'll distribute their liquid between the tanks. You can place liquid into the tanks using buckets. If the tank contains XP Juice you can click on them with an empty hand to give yourself some of the XP. When broken tanks will retain their liquid. ## NEEDS TRANSLATION ## tile.openblocks.flag.name=깃발 -tile.openblocks.flag.description=Flags can be used for decoration or for marking the way back out of a cave you've ventured in to. The flag will point in the direction that you placed it, or you can put it on walls. If you shift-click with a flag in your hand it will change color. +#tile.openblocks.flag.description=Flags can be used for decoration or for marking the way back out of a cave you've ventured in to. The flag will point in the direction that you placed it, or you can put it on walls. If you shift-click with a flag in your hand it will change color. ## NEEDS TRANSLATION ## tile.openblocks.beartrap.name=곰 덫 -tile.openblocks.beartrap.description=Place a bear trap and click on it to open it up. When a mob walks over the trap they'll be unable to move! +#tile.openblocks.beartrap.description=Place a bear trap and click on it to open it up. When a mob walks over the trap they'll be unable to move! ## NEEDS TRANSLATION ## tile.openblocks.sponge.name=스폰지 -tile.openblocks.sponge.description=The sponge is a replacement for the vanilla sponge. Perfect for removing small pockets of lava or water. Be careful when using it on large areas of liquid though as it'll start to get quite messy. +#tile.openblocks.sponge.description=The sponge is a replacement for the vanilla sponge. Perfect for removing small pockets of lava or water. Be careful when using it on large areas of liquid though as it'll start to get quite messy. ## NEEDS TRANSLATION ## item.openblocks.spongeonastick.name=스폰지 -item.openblocks.spongeonastick.description=The sponge on a stick is a tool for cleaning up liquids. Works just like the sponge, but is more mobile at the expense of wearing out. +#item.openblocks.spongeonastick.description=The sponge on a stick is a tool for cleaning up liquids. Works just like the sponge, but is more mobile at the expense of wearing out. ## NEEDS TRANSLATION ## + +#item.openblocks.epic_eraser.name=Epic Eraser ## NEEDS TRANSLATION ## +#item.openblocks.epic_eraser.description=Every item has its own history...\n\nDon't you hate it?\nWith this item you can scrub all traces of epic lore your loot has collected over the years and then sell it on black market without worrying about evidence. ## NEEDS TRANSLATION ## tile.openblocks.cannon.name=아이템 대포 -tile.openblocks.cannon.description=When given a redstone signal, the item cannon will shoot items that it finds in an adjacent inventory. Use the 'pointer' item to aim the cannon. +#tile.openblocks.cannon.description=When given a redstone signal, the item cannon will shoot items that it finds in an adjacent inventory. Use the 'pointer' item to aim the cannon. ## NEEDS TRANSLATION ## tile.openblocks.ropeladder.name=로프 사다리 -tile.openblocks.ropeladder.description=When you place a rope ladder it'll roll out all the way to the ground. +#tile.openblocks.ropeladder.description=When you place a rope ladder it'll roll out all the way to the ground. For every created ladder block it will use one item from stack. ## NEEDS TRANSLATION ## tile.openblocks.sprinkler.name=스프링쿨러 -tile.openblocks.sprinkler.description=The sprinkler will help fertilize crops up to 4 blocks away. Simply place it above an OpenBlocks tank filled with water! You can also add bonemeal for an even faster rate of growth.\nIt also acts as a water source block! +#tile.openblocks.sprinkler.description=The sprinkler will help fertilize crops up to 4 blocks away. Simply place it above an OpenBlocks tank filled with water! You can also add bonemeal for an even faster rate of growth.\nIt also acts as a water source block! ## NEEDS TRANSLATION ## tile.openblocks.paintmixer.name=패인트 믹서 -tile.openblocks.paintmixer.description=The paint mixer can mix any colour of paint you want! Drop either an existing paint bucket or a bucket of milk into the top slot, then cyan, magenta, yellow and black dyes into the other four slots and click mix! +#tile.openblocks.paintmixer.description=The paint mixer can mix any colour of paint you want! Drop either an existing paint bucket or a bucket of milk into the top slot, then cyan, magenta, yellow and black dyes into the other four slots and click mix! ## NEEDS TRANSLATION ## tile.openblocks.canvas.name=캔버스 -tile.openblocks.canvas.description=The canvas is a perfectly white block that's perfect for painting. See the Paint Mixer for information about making paints. +#tile.openblocks.canvas.description=The canvas is a perfectly white block that's perfect for painting. See the Paint Mixer for information about making paints. ## NEEDS TRANSLATION ## tile.openblocks.fan.name=선풍기 -tile.openblocks.fan.description=The fan will blow players, mobs or entities in the direction it's facing. +#tile.openblocks.fan.description=The fan will blow players, mobs or entities in the direction it's facing. ## NEEDS TRANSLATION ## -tile.openblocks.target.name=Target -tile.openblocks.target.description=The target will give out a redstone signal of a strength relative to the accuracy of the players aim. Give the target a redstone signal to make it pop up! +#tile.openblocks.target.name=Target ## NEEDS TRANSLATION ## +#tile.openblocks.target.description=The target will give out a redstone signal of a strength relative to the accuracy of the player's aim. Give the target a redstone signal to make it pop up! ## NEEDS TRANSLATION ## -tile.openblocks.path.name=Path -tile.openblocks.path.description=The path doesn't do anything. It just looks nice! +#tile.openblocks.path.name=Path ## NEEDS TRANSLATION ## +#tile.openblocks.path.description=The path doesn't do anything. It just looks nice! ## NEEDS TRANSLATION ## -tile.openblocks.itemDropper.name=Item Dropper -tile.openblocks.itemDropper.description=The item dropper is similar to the vanilla dropper, except it drops items directly down in a straight line. +#tile.openblocks.itemDropper.name=Item Dropper ## NEEDS TRANSLATION ## +#tile.openblocks.itemDropper.description=The item dropper is similar to the vanilla dropper, except it drops items directly down in a straight line. ## NEEDS TRANSLATION ## tile.openblocks.bigbutton.name=큰 버튼 -tile.openblocks.bigbutton.description=The big button is a large button that can be placed on walls. If you shift-click on the button with an empty hand it will bring up an inventory with a single slot. You can put items into this slot to increase the length of time the button is pressed - one item increases the button press by one tick. +#tile.openblocks.bigbutton.description=The big button is a large button that can be placed on walls. If you shift-click on the button with an empty hand it will bring up an inventory with a single slot. You can put items into this slot to increase the length of time the button is pressed - one item increases the button press by one tick. ## NEEDS TRANSLATION ## tile.openblocks.xpdrain.name=XP 흡수기 -tile.openblocks.xpdrain.description=Place the XP drain above an OpenBlocks tank and stand on it. Your XP will drain into the tank, which can then be used for blocks such as the auto enchantment table or the auto anvil. +#tile.openblocks.xpdrain.description=Place the XP drain above an OpenBlocks tank and stand on it. Your XP will drain into the tank, which can then be used for blocks such as the auto enchantment table or the auto anvil. ## NEEDS TRANSLATION ## tile.openblocks.vacuumhopper.name=진공 깔때기 -tile.openblocks.vacuumhopper.description=The vacuum hopper will suck up items and XP orbs around it. You can use the tabs on the right of the interface to select which sides to output to. +#tile.openblocks.vacuumhopper.description=The vacuum hopper will suck up items and XP orbs around it. You can use the tabs on the right of the interface to select which sides to output to. ## NEEDS TRANSLATION ## tile.openblocks.village_highlighter.name=마을 표시기 -tile.openblocks.village_highlighter.description=Drop the village highlighter down in a village and give it a redstone signal. It will outline the perimeter of the village and draw a box in the iron golem spawning area. Useful if you want to make sure villages don't merge into each other or you're making an iron farm! +#tile.openblocks.village_highlighter.description=Drop the village highlighter down in a village and give it a redstone signal. It will outline the perimeter of the village and draw a box in the iron golem spawning area. Useful if you want to make sure villages don't merge into each other or you're making an iron farm! ## NEEDS TRANSLATION ## -tile.openblocks.donationStation.name=Donation Station -tile.openblocks.donationStation.description=Love a block or item and want to show the mod developer some appreciation? Drop it into the donation station and if we know the authors donation page we'll give you a link. +#tile.openblocks.donationStation.name=Donation Station ## NEEDS TRANSLATION ## +#tile.openblocks.donationStation.description=Love a block or item and want to show the mod developer some appreciation? Drop it into the donation station and if we know the authors donation page we'll give you a link. ## NEEDS TRANSLATION ## tile.openblocks.blockPlacer.name=블럭 설치기 -tile.openblocks.blockPlacer.description=When given a redstone pulse the block placer will place an item in the direction it's facing. +#tile.openblocks.blockPlacer.description=When given a redstone pulse the block placer will place an item in the direction it's facing. ## NEEDS TRANSLATION ## tile.openblocks.blockbreaker.name=블럭 파괴기 -tile.openblocks.blockbreaker.description=When given a redstone pulse the block breaker will break the block it's facing. +#tile.openblocks.blockbreaker.description=When given a redstone pulse the block breaker will break the block it's facing. ## NEEDS TRANSLATION ## -tile.openblocks.projector.name=Height Map Projector -tile.openblocks.projector.description=I'll let you write this one boq! +#tile.openblocks.projector.name=Height Map Projector ## NEEDS TRANSLATION ## +#tile.openblocks.projector.description=I'll let you write this one boq! ## NEEDS TRANSLATION ## tile.openblocks.autoenchantmenttable.name=자동 인첸트테이블 -tile.openblocks.autoenchantmenttable.description=The auto enchantment table works in a similar way to the vanilla enchantment table except it runs off XP juice. Use the tabs on the right side of the interface to select where items or xp can be pulled from. Just like with the vanilla table bookshelves are required for higher levels. +#tile.openblocks.autoenchantmenttable.description=The auto enchantment table works in a similar way to the vanilla enchantment table except it runs off XP juice. Use the tabs on the right side of the interface to select where items or xp can be pulled from. Just like with the vanilla table bookshelves are required for higher levels. ## NEEDS TRANSLATION ## tile.openblocks.xpbottler.name=경험치병 제조기 -tile.openblocks.xpbottler.description=The XP bottler will take XP juice and bottle it up into glass bottles to create bottles o' enchanting. +#tile.openblocks.xpbottler.description=The XP bottler will take XP juice and bottle it up into glass bottles to create bottles o' enchanting. ## NEEDS TRANSLATION ## tile.openblocks.autoanvil.name=자동 모루 -tile.openblocks.autoanvil.description=The auto anvil works just like the vanilla anvil, except it runs from XP juice and can be fully automated.\n\nUse the tabs on the right of the GUI to select which sides of the anvil items or liquid can be inserted or extracted. Right click and drag the anvil in the tab to spin it around and select other sides! +#tile.openblocks.autoanvil.description=The auto anvil works just like the vanilla anvil, except it runs from XP juice and can be fully automated.\n\nUse the tabs on the right of the GUI to select which sides of the anvil items or liquid can be inserted or extracted. Right click and drag the anvil in the tab to spin it around and select other sides! ## NEEDS TRANSLATION ## tile.openblocks.drawingtable.name=제도용 책상 -tile.openblocks.drawingtable.description=The drawing table is for creating stencils which can be used while painting. Insert an Unprepared Stencil into the drawing table then use the arrows to select which stencil you want! +#tile.openblocks.drawingtable.description=The drawing table is for creating stencils which can be used while painting. Insert an Unprepared Stencil into the drawing table then use the arrows to select which stencil you want! ## NEEDS TRANSLATION ## tile.openblocks.grave.name=묘지 tile.openblocks.trophy.name=트로피 +#tile.openblocks.trophy.entity.name=%s Trophy ## NEEDS TRANSLATION ## tile.openblocks.canvasglass.name=유리 캔버스 tile.openblocks.paintcan.name=패인트 통 tile.openblocks.sky.normal.name=하늘 블럭 -tile.openblocks.sky.normal.description=Bring the outside inside with the new Sky block! Just apply a redstone signal. We also offer an inverted version. -tile.openblocks.sky.inverted.name=Inverted Sky Block +#tile.openblocks.sky.normal.description=Bring the outside inside with the new Sky block! Just apply a redstone signal. We also offer an inverted version. ## NEEDS TRANSLATION ## +#tile.openblocks.sky.inverted.name=Inverted Sky Block ## NEEDS TRANSLATION ## tile.openblocks.radio.name=라디오 -tile.openblocks.radio.description=The radio allows you to stream internet radio! First, you need some tuned crystals which you can find in dungeon chests or from a special villager. Place the crystal in the radio and supply it with a redstone signal to turn it on. The redstone strength controls the volume.\n\nYou can configure which radio stations are available in the servers config file. +#tile.openblocks.radio.description=The radio allows you to stream internet radio! First, you need some tuned crystals which you can find in dungeon chests or from a special villager. Place the crystal in the radio and supply it with a redstone signal to turn it on. The redstone strength controls the volume.\n\nYou can configure which radio stations are available in the servers config file. ## NEEDS TRANSLATION ## tile.openblocks.xpshower.name=XP 샤워기 -tile.openblocks.xpshower.description=Attach an XP shower to a tank of XP juice and it'll pour out XP orbs. These orbs can be collected by an XP Drain or an MFR Sewer. +#tile.openblocks.xpshower.description=Attach an XP shower to a tank of XP juice and it'll pour out XP orbs. These orbs can be collected by an XP Drain or an MFR Sewer. ## NEEDS TRANSLATION ## + +#tile.openblocks.scaffolding.name=Scaffolding ## NEEDS TRANSLATION ## +#tile.openblocks.scaffolding.description=Have you ever wanted to pillar up somewhere without leaving an ugly tower behind? Well, now you can! Simply build with scaffolding blocks and they will automatically despawn when you are done. ## NEEDS TRANSLATION ## tile.openblocks.goldenegg.name=금 알 -tile.openblocks.digitalfuse.name=Digital Fuse -item.openblocks.cursor.name=커서 -item.openblocks.cursor.description=The cursor will let you click on blocks remotely.\nSimply shift-click onto a block to link the cursor, then use the cursor wherever you like to click on the target block. Be warned, by default the cursor uses up your XP relative to how far you are from the block you're clicking. +#tile.openblocks.digitalfuse.name=Digital Fuse ## NEEDS TRANSLATION ## -item.openblocks.devnull.name=/dev/null -item.openblocks.devnull.description=Click using /dev/null to open the inventory. There's a single inventory slot - put an item in there - dirt, for example. As you gather dirt from the ground this slot will fill up. Once it's full, any more dirt you pick up will be automatically discarded. You can shift-click with the item in your hand as though you were placing the block! +item.openblocks.cursor.name=커서 +#item.openblocks.cursor.description=The cursor will let you click on blocks remotely.\nSimply shift-click onto a block to link the cursor, then use the cursor wherever you like to click on the target block. Be warned, by default the cursor uses up your XP relative to how far you are from the block you're clicking. ## NEEDS TRANSLATION ## + +#item.openblocks.devnull.name=/dev/null ## NEEDS TRANSLATION ## +#item.openblocks.devnull.description=Click using /dev/null to open the inventory. There's a single inventory slot - put an item in there - dirt, for example. As you gather dirt from the ground this slot will fill up. Once it's full, any more dirt you pick up will be automatically discarded. You can shift-click with the item in your hand as though you were placing the block! ## NEEDS TRANSLATION ## item.openblocks.slimalyzer.name=슬라임 탐지기 -item.openblocks.slimalyzer.description=Walk around with the slimalyzer in your hand and it'll light up whenever you're in a slime spawning chunk. +#item.openblocks.slimalyzer.description=Walk around with the slimalyzer in your hand and it'll light up whenever you're in a slime spawning chunk. ## NEEDS TRANSLATION ## item.openblocks.hangglider.name=행글라이더 -item.openblocks.hangglider.description=The hang glider is self explanatory. Hold it in your hand and click to place it on your back. Now jump!\nTo increase your speed you can press shift while gliding, but watch out, you'll lose altitude faster! +#item.openblocks.hangglider.description=The hang glider is self explanatory. Hold it in your hand and click to place it on your back. Now jump!\nTo increase your speed you can press shift while gliding, but watch out, you'll lose altitude faster! ## NEEDS TRANSLATION ## item.openblocks.gliderwing.name=행글라이더 날개 item.openblocks.sleepingbag.name=침낭 -item.openblocks.sleepingbag.description=The sleeping bag lets you sleep out in the wilderness without having to reset your spawn location. To sleep, simply wear it on your back. +#item.openblocks.sleepingbag.description=The sleeping bag lets you sleep out in the wilderness without having to reset your spawn location. To sleep, simply wear it on your back. ## NEEDS TRANSLATION ## item.openblocks.luggage.name=여행용 짐가방 -item.openblocks.luggage.description=Luggage is your new friend. He'll follow you around anywhere you go collecting any items he finds on the floor. Nom nom nom!\nTo dismantle him just shift-click on him and he'll turn into an item that you can carry around.\nIf he ever gets struck by lightning he'll be able to carry even more items! +#item.openblocks.luggage.description=Luggage is your new friend. He'll follow you around anywhere you go collecting any items he finds on the floor. Nom nom nom!\nTo dismantle him just shift-click on him and he'll turn into an item that you can carry around.\nIf he ever gets struck by lightning he'll be able to carry even more items! ## NEEDS TRANSLATION ## -item.openblocks.sonicglasses.name=Sonic Glasses -item.openblocks.sonicglasses.description=Introducing the fantabulous new Sonic Glasses!\nThis new and exciting technology from OpenMods Inc allow you see what you hear! +#item.openblocks.sonicglasses.name=Sonic Glasses ## NEEDS TRANSLATION ## +#item.openblocks.sonicglasses.description=Introducing the fantabulous new Sonic Glasses!\nThis new and exciting technology from OpenMods Inc allow you see what you hear! ## NEEDS TRANSLATION ## -item.openblocks.squeegee.name=Squeegee -item.openblocks.squeegee.description=The squeegee removes paint from any painted blocks. Just click on the side of the block you want to remove the paint from, or alternative shift-click the block to remove paint from all sides! +#item.openblocks.squeegee.name=Squeegee ## NEEDS TRANSLATION ## +#item.openblocks.squeegee.description=The squeegee removes paint from any painted blocks. Just click on the side of the block you want to remove the paint from, or alternative shift-click the block to remove paint from all sides! ## NEEDS TRANSLATION ## item.openblocks.paintbrush.name=패인트 붓 -item.openblocks.paintbrush.description=Paint brushes let you paint blocks in whatever color you like!\n\nDab your paint brush in a Paint Can made in the Paint Mixer then click on a block to paint it.\n\nCanvas blocks are perfect for painting, but you can also paint quite a few vanilla blocks and even some blocks from other mods. You can also place stencils on blocks and then paint over the stencil! +#item.openblocks.paintbrush.description=Paint brushes let you paint blocks in whatever color you like!\n\nDab your paint brush in a Paint Can made in the Paint Mixer then click on a block to paint it.\n\nCanvas blocks are perfect for painting, but you can also paint quite a few vanilla blocks and even some blocks from other mods. You can also place stencils on blocks and then paint over the stencil! ## NEEDS TRANSLATION ## -item.openblocks.unprepared_stencil.name=Unprepared Stencil -item.openblocks.unprepared_stencil.description="What are these pesky stencils I keep finding in chests?"\n\nStencils can be placed onto blocks and then painted over using paint brushes!\n\nYou can paint a block using multiple stencils and you can click on them with an empty hand to rotate them.\n\nPlace an Unprepared Stencil in a Drawing table to create different patterns. +#item.openblocks.unprepared_stencil.name=Unprepared Stencil ## NEEDS TRANSLATION ## +#item.openblocks.unprepared_stencil.description=Stencils can be placed onto blocks and then painted over using paint brushes!\n\nYou can paint a block using multiple stencils and you can click on them with an empty hand to rotate them.\n\nPlace an Unprepared Stencil in a Drawing table to create different patterns. ## NEEDS TRANSLATION ## + +item.openblocks.crane_backpack.name=크레인 가방 +#item.openblocks.crane_backpack.description=In Minecraft world "magnet" is ancient word for "how do this works?".\n\nThis particular piece of very equipment allows you to pick and carry mobs, players, items and blocks. Can be controlled with magnet control. ## NEEDS TRANSLATION ## + +item.openblocks.crane_control.name=크레인 조작기 +#item.openblocks.crane_control.description=This hi-tech wireless remote is used for controlling magnet backpacks.\n\nRight click to raise, Sneak + right click to lower, left click to pick/release.\nBlinking light signals something is under magnet. ## NEEDS TRANSLATION ## + +#item.openblocks.wrench.name=Big Metal Bar ## NEEDS TRANSLATION ## +#item.openblocks.wrench.description=This is extremely sophisticated tool used to perform transformations of objects with octahedral symmetry.\n\n\nOr just big, dumb piece of metal you can use to rotate cubes and stuff.\n\nSo yeah, it's yet another wrench. I'm just trying to be original here, ok? ## NEEDS TRANSLATION ## item.openblocks.stencil.name=형판 item.openblocks.crayon.name=마법의 크래용 item.openblocks.pencil.name=마법의 연필 item.openblocks.glasses.pencil.name=연필 안경 item.openblocks.glasses.crayon.name=크래용 안경 -item.openblocks.glasses.technicolor.name=Amazing Technicolor Glasses -item.openblocks.glasses.admin.name=Badass Glasses -item.openblocks.crane_backpack.name=크레인 가방 -item.openblocks.crane_control.name=크레인 조작기 +#item.openblocks.glasses.technicolor.name=Amazing Technicolor Glasses ## NEEDS TRANSLATION ## +#item.openblocks.glasses.admin.name=Badass Glasses ## NEEDS TRANSLATION ## item.openblocks.crane_engine.name=크레인 엔진 item.openblocks.crane_magnet.name=크레인 자석 -item.openblocks.beam.name=Beam -item.openblocks.line.name=Line +#item.openblocks.beam.name=Beam ## NEEDS TRANSLATION ## +#item.openblocks.line.name=Line ## NEEDS TRANSLATION ## item.openblocks.miracle_magnet.name=§5기적의 자석§r item.openblocks.info_book.name=Openblocks는 세계를 지배한다!! item.openblocks.xpbucket.name=XP 양동이 -item.openblocks.height_map.name=Height Map +#item.openblocks.height_map.name=Height Map ## NEEDS TRANSLATION ## item.openblocks.empty_map.name=비어있는 맵 item.openblocks.map_controller.name=맵 조작 모듈 item.openblocks.map_memory.name=맵 메모리 모듈 item.openblocks.cartographer.name=제작자 -item.openblocks.assistant_base.name=Assistant's base -item.openblocks.sketching_pencil.name=Sketching Pencil +#item.openblocks.assistant_base.name=Assistant's base ## NEEDS TRANSLATION ## +#item.openblocks.sketching_pencil.name=Sketching Pencil ## NEEDS TRANSLATION ## item.openblocks.tasty_clay.name=맛있는 점토 item.openblocks.golden_eye.name=금눈 item.openblocks.pointer.name=포인터 -item.openblocks.tuned_crystal.name=Tuned Crystal -item.openblocks.pedometer.name=Pedometer +#item.openblocks.tuned_crystal.name=Tuned Crystal ## NEEDS TRANSLATION ## +#item.openblocks.pedometer.name=Pedometer ## NEEDS TRANSLATION ## item.openblocks.wallpaper.name=달력 diff --git a/src/main/resources/assets/openblocks/lang/nl_NL.lang b/src/main/resources/assets/openblocks/lang/nl_NL.lang index 26b88caa..63031a3a 100644 --- a/src/main/resources/assets/openblocks/lang/nl_NL.lang +++ b/src/main/resources/assets/openblocks/lang/nl_NL.lang @@ -1,21 +1,373 @@ -#nl_NL +#achievement.openblocks.droppedBrick=Zoinks! ## NEEDS TRANSLATION ## +#achievement.openblocks.droppedBrick.desc=Sorry, it just happened... ## NEEDS TRANSLATION ## +#stat.openblocks.bricksDropped=Bricks dropped ## NEEDS TRANSLATION ## +#achievement.openblocks.stackOverflow=Stack Overflow ## NEEDS TRANSLATION ## +#achievement.openblocks.stackOverflow.desc=It's full of stars! ## NEEDS TRANSLATION ## + +#openblocks.keybind.category=OpenBlocks ## NEEDS TRANSLATION ## +#openblocks.keybind.drop_brick=Be silly ## NEEDS TRANSLATION ## + +#enchantment.openblocks.explosive=Unstable ## NEEDS TRANSLATION ## +#enchantment.openblocks.laststand=Last Stand ## NEEDS TRANSLATION ## +#enchantment.openblocks.flimflam=Flim Flam ## NEEDS TRANSLATION ## + +#openblocks.gui.blocks=Blocks ## NEEDS TRANSLATION ## +#openblocks.gui.items=Items ## NEEDS TRANSLATION ## +#openblocks.gui.misc=Miscellanea ## NEEDS TRANSLATION ## +#openblocks.gui.changelogs=Changelogs ## NEEDS TRANSLATION ## + +#openblocks.gui.features=Features ## NEEDS TRANSLATION ## +#openblocks.gui.bugfixes=Bugfixes ## NEEDS TRANSLATION ## +#openblocks.gui.tweaks=Tweaks ## NEEDS TRANSLATION ## + openblocks.gui.luggage=Bagage openblocks.gui.sprinkler=Sproeier +#openblocks.gui.vacuumhopper=Vacuum Hopper ## NEEDS TRANSLATION ## +#openblocks.gui.bigbutton=Big Button ## NEEDS TRANSLATION ## +#openblocks.gui.xpbottler=XP Bottler ## NEEDS TRANSLATION ## +#openblocks.gui.autoanvil=Auto Anvil ## NEEDS TRANSLATION ## +#openblocks.gui.autoeject=Auto eject ## NEEDS TRANSLATION ## +#openblocks.gui.autoextract=Auto extract ## NEEDS TRANSLATION ## +#openblocks.gui.autodrink=Auto drink ## NEEDS TRANSLATION ## +#openblocks.gui.autoenchantmenttable=Auto Enchantment Table ## NEEDS TRANSLATION ## +#openblocks.gui.donationstation=Donation Station ## NEEDS TRANSLATION ## +#openblocks.gui.itemdropper=Item Dropper ## NEEDS TRANSLATION ## +#openblocks.gui.blockplacer=Block Placer ## NEEDS TRANSLATION ## +#openblocks.gui.paintmixer=Paint Mixer ## NEEDS TRANSLATION ## +#openblocks.gui.drawingtable=Drawing Table ## NEEDS TRANSLATION ## +#openblocks.gui.digitalfuse=Digital Fuse ## NEEDS TRANSLATION ## +#openblocks.gui.xp_outputs=XP Outputs ## NEEDS TRANSLATION ## +#openblocks.gui.item_outputs=Item Outputs ## NEEDS TRANSLATION ## +#openblocks.gui.max_level=Max. Level: %d ## NEEDS TRANSLATION ## +#openblocks.gui.save_folder=Save folder ## NEEDS TRANSLATION ## + +#openblocks.gui.welcome.title=Welcome! ## NEEDS TRANSLATION ## +#openblocks.gui.welcome.content=OpenBlocks is a new open source mod that introduces a variety of ideas into Minecraft, including hang gliders, elevators, tanks, graves, paints, cranes, liquid XP, cartographers, trophies and more! ## NEEDS TRANSLATION ## + +#openblocks.gui.credits.title=Credits ## NEEDS TRANSLATION ## +#openblocks.gui.credits.content=§LBoq, Mikee and NeverCast§R - Leading developers of OpenBlocks (are we allowed to credit ourselves?)\n\n§LSinZ and Yoshi2§R - members of the OpenMods team from the start.\n\n§LVexatos and crafteverywhere§R - Regularly translating the mods.\n\nEveryone else who has contributed to the code over the past two years.\n\n§LDirewolf20 and the rest of ForgeCraft§R - for putting up with the bugs and crashes before we release.\n\nEveryone who's done spotlights, lets plays and generally supported the mod since we started! ## NEEDS TRANSLATION ## + +#openblocks.gui.config.title=Easy Config Editing ## NEEDS TRANSLATION ## +#openblocks.gui.config.content=OpenMods allow for both client and server config options to be changed from chat commands. Some don't even require restart!\n\nServer config settings can be changed using '§L/om_config_s§R' (op needed) and client config settings can be changed using '§L/om_config_c§R'\n\nFor example:\n\n§L/om_config_s set OpenBlocks dropblock elevatorDrainsXP false§R\n§L/om_config_s save§R\n\nFor a full list of commands type: §L/help om_config_s§R or §L/help om_config_c§R ## NEEDS TRANSLATION ## + +#openblocks.gui.restore_inv.title=Inventory backup ## NEEDS TRANSLATION ## +#openblocks.gui.restore_inv.content=Everyone can make mistake. But with §L/ob_inventory§R command you can fix some of them. This command can be used to restore inventory. Backup is created when:\n - player dies\n - grave is spawned \n - player issued command §L/ob_inventory store§R\n\nTo restore inventory you need backup name. Go to folder below or to saves folder on server and look for files named §Linventory-*.dat§R. Then restore inventory with §L/ob_inventory restore §R - where id is either full filename or just middle part, without §Linventory-§R and §L.dat§R. You can also use tab completion. Backups are normal NBT files and can be opened with any editor. ## NEEDS TRANSLATION ## + +#openblocks.gui.bkey.title=The Infamous 'B' Key ## NEEDS TRANSLATION ## +#openblocks.gui.bkey.content=The 'B' key is a very special key in OpenBlocks.\n\nEnabling the 'weAreSeriousPeople' config option in the 'tomfoolery' category of both the client and server config files will give you your very own digestive system.\n\nTry eating some of that tasty clay and press 'B' to digest! ## NEEDS TRANSLATION ## + +#openblocks.gui.unstable.title=Unstable Enchantment ## NEEDS TRANSLATION ## +#openblocks.gui.unstable.content=We've had unconfirmed reports that this enchantment causes any gunpowder you're carrying to become unstable when you're attacked or when you jump off something.\n\nUse at your own risk! ## NEEDS TRANSLATION ## + +#openblocks.gui.flimflam.title=Flim Flam Enchantment ## NEEDS TRANSLATION ## +#openblocks.gui.flimflam.content=Scientists have yet to discover the properties of this enchantment. ## NEEDS TRANSLATION ## + +#openblocks.gui.laststand.title=Last Stand Enchantment ## NEEDS TRANSLATION ## +#openblocks.gui.laststand.content=The last stand enchantment uses your XP bar as a final protection against dying.\n\nWhen you reach 0.5 hearts, the game will take XP from you whenever you're damaged instead of killing you. The higher number of enchantments you have the cheaper the XP cost will be. ## NEEDS TRANSLATION ## + +#openblocks.changelog.title=What's new in OpenBlocks %s ## NEEDS TRANSLATION ## +#openblocks.misc.url=URL: %s ## NEEDS TRANSLATION ## +#openblocks.misc.type=Type: %s ## NEEDS TRANSLATION ## +#openblocks.misc.uses=Uses: %.2f ## NEEDS TRANSLATION ## +#openblocks.misc.color=Color: %06X ## NEEDS TRANSLATION ## +#openblocks.misc.mode=Placement mode: %s ## NEEDS TRANSLATION ## +#openblocks.misc.mode.block=Block ## NEEDS TRANSLATION ## +#openblocks.misc.mode.panel=Panel ## NEEDS TRANSLATION ## +#openblocks.misc.mode.half_panel=Half-height panel ## NEEDS TRANSLATION ## +#openblocks.misc.mode.stairs=Stairs ## NEEDS TRANSLATION ## +#openblocks.misc.mode.inverted_block=Inverted Block ## NEEDS TRANSLATION ## +#openblocks.misc.mode.inverted_panel=Inverted Panel ## NEEDS TRANSLATION ## +#openblocks.misc.mode.inverted_half_panel=Inverted Half-height panel ## NEEDS TRANSLATION ## +#openblocks.misc.mode.inverted_stairs=Inverted Stairs ## NEEDS TRANSLATION ## +#openblocks.misc.structure_pos=Debug: found structure %s at (%d,%d,%d) ## NEEDS TRANSLATION ## +#openblocks.misc.locked=Locked ## NEEDS TRANSLATION ## +#openblocks.misc.selected_cannon=Selected cannon for targeting ## NEEDS TRANSLATION ## +#openblocks.misc.pointed_cannon=Pointed cannon at %s, %s, %s ## NEEDS TRANSLATION ## +#openblocks.misc.change_mode=Changing to %s mode ## NEEDS TRANSLATION ## +#openblocks.misc.change_size=Changing size to %sx%sx%s ## NEEDS TRANSLATION ## +#openblocks.misc.change_box_size=Changing size to (%d,%d,%d):(%d,%d,%d) ## NEEDS TRANSLATION ## +#openblocks.misc.total_blocks=Total block count: %d ## NEEDS TRANSLATION ## +#openblocks.misc.get_witched=Get witched! ## NEEDS TRANSLATION ## +#openblocks.misc.page=Page %d of %d ## NEEDS TRANSLATION ## +#openblocks.misc.oh_no_ceiling=You can't fall asleep here. Ceiling disturbs you too much... ## NEEDS TRANSLATION ## +#openblocks.misc.oh_no_ground=You want to sleep on THAT!? ## NEEDS TRANSLATION ## +#openblocks.misc.sleeping_bag_broken=Item inactive due to failed initialization ## NEEDS TRANSLATION ## +#openblocks.misc.inverted=Inverted ## NEEDS TRANSLATION ## + +#openblocks.misc.grave_msg=%s (day: %.1f) ## NEEDS TRANSLATION ## + +#openblocks.misc.cant_restore_player=Can't restore inventory for player %s ## NEEDS TRANSLATION ## +#openblocks.misc.cant_restore_inventory=Can't restore inventory ## NEEDS TRANSLATION ## +#openblocks.misc.cant_store=Can't store player %s inventory ## NEEDS TRANSLATION ## +#openblocks.misc.invalid_sub_inventory=Can't restore sub inventory %s ## NEEDS TRANSLATION ## +#openblocks.misc.stored_inventory=Stored player inventory to %s ## NEEDS TRANSLATION ## +#openblocks.misc.restored_inventory=Restored inventory for player %s ## NEEDS TRANSLATION ## +#openblocks.misc.invalid_index=Invalid index ## NEEDS TRANSLATION ## +#openblocks.misc.empty_slot=No item in slot ## NEEDS TRANSLATION ## + +#openblocks.misc.pedometer.tracking_reset=Tracking reset ## NEEDS TRANSLATION ## +#openblocks.misc.pedometer.tracking_started=Tracking started ## NEEDS TRANSLATION ## + +#openblocks.misc.pedometer.start_point=Start point: %s ## NEEDS TRANSLATION ## +#openblocks.misc.pedometer.speed=Speed: %s ## NEEDS TRANSLATION ## +#openblocks.misc.pedometer.avg_speed=Average speed: %s ## NEEDS TRANSLATION ## +#openblocks.misc.pedometer.total_distance=Total distance: %s ## NEEDS TRANSLATION ## + +#openblocks.misc.pedometer.straght_line_distance=Straight line distance: %s ## NEEDS TRANSLATION ## +#openblocks.misc.pedometer.straigh_line_speed=Straight line speed: %s ## NEEDS TRANSLATION ## + +#openblocks.misc.pedometer.last_check_distance=Distance from last check: %s ## NEEDS TRANSLATION ## +#openblocks.misc.pedometer.last_check_speed=Last check speed: %s ## NEEDS TRANSLATION ## +#openblocks.misc.pedometer.last_check_time=Time from last check: %d ticks ## NEEDS TRANSLATION ## + +#openblocks.misc.pedometer.total_time=Total time: %d ticks ## NEEDS TRANSLATION ## + +#openblocks.misc.shape=Shape: %s ## NEEDS TRANSLATION ## +#openblocks.misc.shape.sphere=Sphere ## NEEDS TRANSLATION ## +#openblocks.misc.shape.cylinder=Cylinder ## NEEDS TRANSLATION ## +#openblocks.misc.shape.cuboid=Cuboid ## NEEDS TRANSLATION ## +#openblocks.misc.shape.full_cuboid=Full Cuboid ## NEEDS TRANSLATION ## +#openblocks.misc.shape.dome=Dome ## NEEDS TRANSLATION ## +#openblocks.misc.shape.triangle=Triangle ## NEEDS TRANSLATION ## +#openblocks.misc.shape.pentagon=Pentagon ## NEEDS TRANSLATION ## +#openblocks.misc.shape.hexagon=Hexagon ## NEEDS TRANSLATION ## +#openblocks.misc.shape.octagon=Octagon ## NEEDS TRANSLATION ## +#openblocks.misc.shape.axes=Axes ## NEEDS TRANSLATION ## +#openblocks.misc.shape.planes=Planes ## NEEDS TRANSLATION ## + +#openblocks.misc.box=Dimensions: (%d,%d,%d):(%d,%d,%d) ## NEEDS TRANSLATION ## +#openblocks.misc.width=Width: %d ## NEEDS TRANSLATION ## +#openblocks.misc.height=Height: %d ## NEEDS TRANSLATION ## +#openblocks.misc.depth=Depth: %d ## NEEDS TRANSLATION ## + +#openblocks.misc.radio.too_many=Too many radios already playing ## NEEDS TRANSLATION ## +#openblocks.misc.radio.invalid_stream=Invalid stream ## NEEDS TRANSLATION ## +#openblocks.misc.radio.invalid_url=Invalid URL ## NEEDS TRANSLATION ## +#openblocks.misc.radio.url_not_found=URL not found ## NEEDS TRANSLATION ## +#openblocks.misc.radio.unknown_stream_type=Unknown stream type ## NEEDS TRANSLATION ## +#openblocks.misc.radio.malformed_data=Malformed data in stream ## NEEDS TRANSLATION ## +#openblocks.misc.radio.not_ready=Stream not ready, try again later ## NEEDS TRANSLATION ## +#openblocks.misc.radio.cant_connect=Can't connect ## NEEDS TRANSLATION ## +#openblocks.misc.radio.unknown_error=Unknown error ## NEEDS TRANSLATION ## +#openblocks.misc.radio.muted=Sounds are muted! ## NEEDS TRANSLATION ## + +#openblocks.misc.side.east=East side ## NEEDS TRANSLATION ## +#openblocks.misc.side.west=West side ## NEEDS TRANSLATION ## +#openblocks.misc.side.north=North side ## NEEDS TRANSLATION ## +#openblocks.misc.side.south=South side ## NEEDS TRANSLATION ## +#openblocks.misc.side.up=Top side ## NEEDS TRANSLATION ## +#openblocks.misc.side.down=Bottom side ## NEEDS TRANSLATION ## + +#openblocks.misc.command.invalid=Invalid command arguments ## NEEDS TRANSLATION ## +#openblocks.misc.command.no_flim_flam=Invalid flim-flam name ## NEEDS TRANSLATION ## +#openblocks.misc.command.flim_flam_source=Player %s had been successfully flim-flammed with %s ## NEEDS TRANSLATION ## +#openblocks.misc.command.flim_flam_target=Someone doesn't like you. Someone with power ## NEEDS TRANSLATION ## +#openblocks.misc.command.flim_flam_failed=Flim-flamming failed! ## NEEDS TRANSLATION ## +#openblocks.misc.command.luck_added=Luck changed for player %s, current: %d ## NEEDS TRANSLATION ## +#openblocks.misc.command.luck_current=Player %s luck: %d ## NEEDS TRANSLATION ## + +#openblocks.misc.hidden_lore=§a§oHold ALT to see history§r ## NEEDS TRANSLATION ## +#openblocks.flim_flammed=Something weird happens around you ## NEEDS TRANSLATION ## + +#openblocks.turtle.magnet=Magnet ## NEEDS TRANSLATION ## tile.openblocks.elevator.name=Lift +#tile.openblocks.elevator.description=Place one elevator directly three or more blocks above another with no blocks inbetween and you'll be able to either 'jump' to move up, or 'crouch' to move down. Elevators can be dyed by clicking on them with dye, however, you can only teleport between elevators of the same color. ## NEEDS TRANSLATION ## + +#tile.openblocks.elevator_rotating.name=Rotating Elevator ## NEEDS TRANSLATION ## + tile.openblocks.heal.name=Verbanddoos +#tile.openblocks.heal.description=The healing block is a creative-mode only block that gives off a slight healing effect over time. ## NEEDS TRANSLATION ## + tile.openblocks.guide.name=Bouwplanner +#tile.openblocks.guide.description=The building guide, once powered with redstone, will give you an outline of ghost blocks in different shapes and sizes that'll help you plan out rooms.\nUse touch-buttons on block to change outline dimensions and shapes.\nColor of markers can be changed by using dye on central block. ## NEEDS TRANSLATION ## + +#tile.openblocks.builder_guide.name=Enhanced Building Guide ## NEEDS TRANSLATION ## +#tile.openblocks.builder_guide.description=This enhanced version of building guide not only displays ghost blocks to make building easier, but also allows you to place actual blocks. Just click central block with any block stack!\nWhen in creative mode you can place an obsidian block above, then hit the building guide with any block you like to automatically create the shape. ## NEEDS TRANSLATION ## + tile.openblocks.ladder.name=Jaded Ladder +#tile.openblocks.ladder.description=The jaded ladder solves that annoying problem of jumping out of a trapdoor at the top of a ladder. The jaded ladder acts as both a trap door and a ladder at the same time. ## NEEDS TRANSLATION ## + +#tile.openblocks.tank.filled.name=%s Tank ## NEEDS TRANSLATION ## tile.openblocks.tank.name=Tank -tile.openblocks.target.name=Doel -tile.openblocks.grave.name=Graf +#tile.openblocks.tank.description=Tanks can hold liquids. If you place tanks next to each other and they'll distribute their liquid between the tanks. You can place liquid into the tanks using buckets. If the tank contains XP Juice you can click on them with an empty hand to give yourself some of the XP. When broken tanks will retain their liquid. ## NEEDS TRANSLATION ## + tile.openblocks.flag.name=Vlag -tile.openblocks.trophy.name=Troffee +#tile.openblocks.flag.description=Flags can be used for decoration or for marking the way back out of a cave you've ventured in to. The flag will point in the direction that you placed it, or you can put it on walls. If you shift-click with a flag in your hand it will change color. ## NEEDS TRANSLATION ## + tile.openblocks.beartrap.name=Berenval +#tile.openblocks.beartrap.description=Place a bear trap and click on it to open it up. When a mob walks over the trap they'll be unable to move! ## NEEDS TRANSLATION ## + +#tile.openblocks.sponge.name=Sponge ## NEEDS TRANSLATION ## +#tile.openblocks.sponge.description=The sponge is a replacement for the vanilla sponge. Perfect for removing small pockets of lava or water. Be careful when using it on large areas of liquid though as it'll start to get quite messy. ## NEEDS TRANSLATION ## + +#item.openblocks.spongeonastick.name=Sponge ## NEEDS TRANSLATION ## +#item.openblocks.spongeonastick.description=The sponge on a stick is a tool for cleaning up liquids. Works just like the sponge, but is more mobile at the expense of wearing out. ## NEEDS TRANSLATION ## + +#item.openblocks.epic_eraser.name=Epic Eraser ## NEEDS TRANSLATION ## +#item.openblocks.epic_eraser.description=Every item has its own history...\n\nDon't you hate it?\nWith this item you can scrub all traces of epic lore your loot has collected over the years and then sell it on black market without worrying about evidence. ## NEEDS TRANSLATION ## + +#tile.openblocks.cannon.name=Item Cannon ## NEEDS TRANSLATION ## +#tile.openblocks.cannon.description=When given a redstone signal, the item cannon will shoot items that it finds in an adjacent inventory. Use the 'pointer' item to aim the cannon. ## NEEDS TRANSLATION ## + +#tile.openblocks.ropeladder.name=Rope Ladder ## NEEDS TRANSLATION ## +#tile.openblocks.ropeladder.description=When you place a rope ladder it'll roll out all the way to the ground. For every created ladder block it will use one item from stack. ## NEEDS TRANSLATION ## + tile.openblocks.sprinkler.name=Sproeier +#tile.openblocks.sprinkler.description=The sprinkler will help fertilize crops up to 4 blocks away. Simply place it above an OpenBlocks tank filled with water! You can also add bonemeal for an even faster rate of growth.\nIt also acts as a water source block! ## NEEDS TRANSLATION ## + +#tile.openblocks.paintmixer.name=Paint Mixer ## NEEDS TRANSLATION ## +#tile.openblocks.paintmixer.description=The paint mixer can mix any colour of paint you want! Drop either an existing paint bucket or a bucket of milk into the top slot, then cyan, magenta, yellow and black dyes into the other four slots and click mix! ## NEEDS TRANSLATION ## + +#tile.openblocks.canvas.name=Canvas ## NEEDS TRANSLATION ## +#tile.openblocks.canvas.description=The canvas is a perfectly white block that's perfect for painting. See the Paint Mixer for information about making paints. ## NEEDS TRANSLATION ## + +#tile.openblocks.fan.name=Fan ## NEEDS TRANSLATION ## +#tile.openblocks.fan.description=The fan will blow players, mobs or entities in the direction it's facing. ## NEEDS TRANSLATION ## + +tile.openblocks.target.name=Doel +#tile.openblocks.target.description=The target will give out a redstone signal of a strength relative to the accuracy of the player's aim. Give the target a redstone signal to make it pop up! ## NEEDS TRANSLATION ## + +#tile.openblocks.path.name=Path ## NEEDS TRANSLATION ## +#tile.openblocks.path.description=The path doesn't do anything. It just looks nice! ## NEEDS TRANSLATION ## + +#tile.openblocks.itemDropper.name=Item Dropper ## NEEDS TRANSLATION ## +#tile.openblocks.itemDropper.description=The item dropper is similar to the vanilla dropper, except it drops items directly down in a straight line. ## NEEDS TRANSLATION ## + +#tile.openblocks.bigbutton.name=Big Button ## NEEDS TRANSLATION ## +#tile.openblocks.bigbutton.description=The big button is a large button that can be placed on walls. If you shift-click on the button with an empty hand it will bring up an inventory with a single slot. You can put items into this slot to increase the length of time the button is pressed - one item increases the button press by one tick. ## NEEDS TRANSLATION ## + +#tile.openblocks.xpdrain.name=XP Drain ## NEEDS TRANSLATION ## +#tile.openblocks.xpdrain.description=Place the XP drain above an OpenBlocks tank and stand on it. Your XP will drain into the tank, which can then be used for blocks such as the auto enchantment table or the auto anvil. ## NEEDS TRANSLATION ## + +#tile.openblocks.vacuumhopper.name=Vacuum Hopper ## NEEDS TRANSLATION ## +#tile.openblocks.vacuumhopper.description=The vacuum hopper will suck up items and XP orbs around it. You can use the tabs on the right of the interface to select which sides to output to. ## NEEDS TRANSLATION ## + +#tile.openblocks.village_highlighter.name=Village Highlighter ## NEEDS TRANSLATION ## +#tile.openblocks.village_highlighter.description=Drop the village highlighter down in a village and give it a redstone signal. It will outline the perimeter of the village and draw a box in the iron golem spawning area. Useful if you want to make sure villages don't merge into each other or you're making an iron farm! ## NEEDS TRANSLATION ## + +#tile.openblocks.donationStation.name=Donation Station ## NEEDS TRANSLATION ## +#tile.openblocks.donationStation.description=Love a block or item and want to show the mod developer some appreciation? Drop it into the donation station and if we know the authors donation page we'll give you a link. ## NEEDS TRANSLATION ## + +#tile.openblocks.blockPlacer.name=Block Placer ## NEEDS TRANSLATION ## +#tile.openblocks.blockPlacer.description=When given a redstone pulse the block placer will place an item in the direction it's facing. ## NEEDS TRANSLATION ## + +#tile.openblocks.blockbreaker.name=Block Breaker ## NEEDS TRANSLATION ## +#tile.openblocks.blockbreaker.description=When given a redstone pulse the block breaker will break the block it's facing. ## NEEDS TRANSLATION ## + +#tile.openblocks.projector.name=Height Map Projector ## NEEDS TRANSLATION ## +#tile.openblocks.projector.description=I'll let you write this one boq! ## NEEDS TRANSLATION ## + +#tile.openblocks.autoenchantmenttable.name=Auto Enchantment Table ## NEEDS TRANSLATION ## +#tile.openblocks.autoenchantmenttable.description=The auto enchantment table works in a similar way to the vanilla enchantment table except it runs off XP juice. Use the tabs on the right side of the interface to select where items or xp can be pulled from. Just like with the vanilla table bookshelves are required for higher levels. ## NEEDS TRANSLATION ## + +#tile.openblocks.xpbottler.name=XP Bottler ## NEEDS TRANSLATION ## +#tile.openblocks.xpbottler.description=The XP bottler will take XP juice and bottle it up into glass bottles to create bottles o' enchanting. ## NEEDS TRANSLATION ## + +#tile.openblocks.autoanvil.name=Auto Anvil ## NEEDS TRANSLATION ## +#tile.openblocks.autoanvil.description=The auto anvil works just like the vanilla anvil, except it runs from XP juice and can be fully automated.\n\nUse the tabs on the right of the GUI to select which sides of the anvil items or liquid can be inserted or extracted. Right click and drag the anvil in the tab to spin it around and select other sides! ## NEEDS TRANSLATION ## + +#tile.openblocks.drawingtable.name=Drawing Table ## NEEDS TRANSLATION ## +#tile.openblocks.drawingtable.description=The drawing table is for creating stencils which can be used while painting. Insert an Unprepared Stencil into the drawing table then use the arrows to select which stencil you want! ## NEEDS TRANSLATION ## + +tile.openblocks.grave.name=Graf +tile.openblocks.trophy.name=Troffee +#tile.openblocks.trophy.entity.name=%s Trophy ## NEEDS TRANSLATION ## +#tile.openblocks.canvasglass.name=Glass Canvas ## NEEDS TRANSLATION ## +#tile.openblocks.paintcan.name=Paint Can ## NEEDS TRANSLATION ## + +#tile.openblocks.sky.normal.name=Sky Block ## NEEDS TRANSLATION ## +#tile.openblocks.sky.normal.description=Bring the outside inside with the new Sky block! Just apply a redstone signal. We also offer an inverted version. ## NEEDS TRANSLATION ## +#tile.openblocks.sky.inverted.name=Inverted Sky Block ## NEEDS TRANSLATION ## + +#tile.openblocks.radio.name=Radio ## NEEDS TRANSLATION ## +#tile.openblocks.radio.description=The radio allows you to stream internet radio! First, you need some tuned crystals which you can find in dungeon chests or from a special villager. Place the crystal in the radio and supply it with a redstone signal to turn it on. The redstone strength controls the volume.\n\nYou can configure which radio stations are available in the servers config file. ## NEEDS TRANSLATION ## + +#tile.openblocks.xpshower.name=XP Shower ## NEEDS TRANSLATION ## +#tile.openblocks.xpshower.description=Attach an XP shower to a tank of XP juice and it'll pour out XP orbs. These orbs can be collected by an XP Drain or an MFR Sewer. ## NEEDS TRANSLATION ## + +#tile.openblocks.scaffolding.name=Scaffolding ## NEEDS TRANSLATION ## +#tile.openblocks.scaffolding.description=Have you ever wanted to pillar up somewhere without leaving an ugly tower behind? Well, now you can! Simply build with scaffolding blocks and they will automatically despawn when you are done. ## NEEDS TRANSLATION ## + +#tile.openblocks.goldenegg.name=Golden Egg ## NEEDS TRANSLATION ## + +#tile.openblocks.digitalfuse.name=Digital Fuse ## NEEDS TRANSLATION ## + +#item.openblocks.cursor.name=Cursor ## NEEDS TRANSLATION ## +#item.openblocks.cursor.description=The cursor will let you click on blocks remotely.\nSimply shift-click onto a block to link the cursor, then use the cursor wherever you like to click on the target block. Be warned, by default the cursor uses up your XP relative to how far you are from the block you're clicking. ## NEEDS TRANSLATION ## + +#item.openblocks.devnull.name=/dev/null ## NEEDS TRANSLATION ## +#item.openblocks.devnull.description=Click using /dev/null to open the inventory. There's a single inventory slot - put an item in there - dirt, for example. As you gather dirt from the ground this slot will fill up. Once it's full, any more dirt you pick up will be automatically discarded. You can shift-click with the item in your hand as though you were placing the block! ## NEEDS TRANSLATION ## + +#item.openblocks.slimalyzer.name=Slimalyzer ## NEEDS TRANSLATION ## +#item.openblocks.slimalyzer.description=Walk around with the slimalyzer in your hand and it'll light up whenever you're in a slime spawning chunk. ## NEEDS TRANSLATION ## item.openblocks.hangglider.name=Deltavlieger -item.openblocks.gliderwing.name=Vleugel -item.openblocks.luggage.name=Bagage +#item.openblocks.hangglider.description=The hang glider is self explanatory. Hold it in your hand and click to place it on your back. Now jump!\nTo increase your speed you can press shift while gliding, but watch out, you'll lose altitude faster! ## NEEDS TRANSLATION ## -itemGroup.tabOpenBlocks=OpenBlocks \ No newline at end of file +item.openblocks.gliderwing.name=Vleugel + +#item.openblocks.sleepingbag.name=Sleeping Bag ## NEEDS TRANSLATION ## +#item.openblocks.sleepingbag.description=The sleeping bag lets you sleep out in the wilderness without having to reset your spawn location. To sleep, simply wear it on your back. ## NEEDS TRANSLATION ## + +item.openblocks.luggage.name=Bagage +#item.openblocks.luggage.description=Luggage is your new friend. He'll follow you around anywhere you go collecting any items he finds on the floor. Nom nom nom!\nTo dismantle him just shift-click on him and he'll turn into an item that you can carry around.\nIf he ever gets struck by lightning he'll be able to carry even more items! ## NEEDS TRANSLATION ## + +#item.openblocks.sonicglasses.name=Sonic Glasses ## NEEDS TRANSLATION ## +#item.openblocks.sonicglasses.description=Introducing the fantabulous new Sonic Glasses!\nThis new and exciting technology from OpenMods Inc allow you see what you hear! ## NEEDS TRANSLATION ## + +#item.openblocks.squeegee.name=Squeegee ## NEEDS TRANSLATION ## +#item.openblocks.squeegee.description=The squeegee removes paint from any painted blocks. Just click on the side of the block you want to remove the paint from, or alternative shift-click the block to remove paint from all sides! ## NEEDS TRANSLATION ## + +#item.openblocks.paintbrush.name=Paint Brush ## NEEDS TRANSLATION ## +#item.openblocks.paintbrush.description=Paint brushes let you paint blocks in whatever color you like!\n\nDab your paint brush in a Paint Can made in the Paint Mixer then click on a block to paint it.\n\nCanvas blocks are perfect for painting, but you can also paint quite a few vanilla blocks and even some blocks from other mods. You can also place stencils on blocks and then paint over the stencil! ## NEEDS TRANSLATION ## + +#item.openblocks.unprepared_stencil.name=Unprepared Stencil ## NEEDS TRANSLATION ## +#item.openblocks.unprepared_stencil.description=Stencils can be placed onto blocks and then painted over using paint brushes!\n\nYou can paint a block using multiple stencils and you can click on them with an empty hand to rotate them.\n\nPlace an Unprepared Stencil in a Drawing table to create different patterns. ## NEEDS TRANSLATION ## + +#item.openblocks.crane_backpack.name=Crane Backpack ## NEEDS TRANSLATION ## +#item.openblocks.crane_backpack.description=In Minecraft world "magnet" is ancient word for "how do this works?".\n\nThis particular piece of very equipment allows you to pick and carry mobs, players, items and blocks. Can be controlled with magnet control. ## NEEDS TRANSLATION ## + +#item.openblocks.crane_control.name=Crane Control ## NEEDS TRANSLATION ## +#item.openblocks.crane_control.description=This hi-tech wireless remote is used for controlling magnet backpacks.\n\nRight click to raise, Sneak + right click to lower, left click to pick/release.\nBlinking light signals something is under magnet. ## NEEDS TRANSLATION ## + +#item.openblocks.wrench.name=Big Metal Bar ## NEEDS TRANSLATION ## +#item.openblocks.wrench.description=This is extremely sophisticated tool used to perform transformations of objects with octahedral symmetry.\n\n\nOr just big, dumb piece of metal you can use to rotate cubes and stuff.\n\nSo yeah, it's yet another wrench. I'm just trying to be original here, ok? ## NEEDS TRANSLATION ## + +#item.openblocks.stencil.name=Stencil ## NEEDS TRANSLATION ## +#item.openblocks.crayon.name=Magic Crayon ## NEEDS TRANSLATION ## +#item.openblocks.pencil.name=Magic Pencil ## NEEDS TRANSLATION ## +#item.openblocks.glasses.pencil.name=Pencil Glasses ## NEEDS TRANSLATION ## +#item.openblocks.glasses.crayon.name=Crayon Glasses ## NEEDS TRANSLATION ## +#item.openblocks.glasses.technicolor.name=Amazing Technicolor Glasses ## NEEDS TRANSLATION ## +#item.openblocks.glasses.admin.name=Badass Glasses ## NEEDS TRANSLATION ## +#item.openblocks.crane_engine.name=Crane Engine ## NEEDS TRANSLATION ## +#item.openblocks.crane_magnet.name=Crane Magnet ## NEEDS TRANSLATION ## +#item.openblocks.beam.name=Beam ## NEEDS TRANSLATION ## +#item.openblocks.line.name=Line ## NEEDS TRANSLATION ## +#item.openblocks.miracle_magnet.name=§5Miracle Magnet§r ## NEEDS TRANSLATION ## +#item.openblocks.info_book.name=World Domination with OpenBlocks ## NEEDS TRANSLATION ## +#item.openblocks.xpbucket.name=XP Bucket ## NEEDS TRANSLATION ## +#item.openblocks.height_map.name=Height Map ## NEEDS TRANSLATION ## +#item.openblocks.empty_map.name=Empty Map ## NEEDS TRANSLATION ## +#item.openblocks.map_controller.name=Map Controller Module ## NEEDS TRANSLATION ## +#item.openblocks.map_memory.name=Map Memory Module ## NEEDS TRANSLATION ## +#item.openblocks.cartographer.name=Cartographer ## NEEDS TRANSLATION ## +#item.openblocks.assistant_base.name=Assistant's base ## NEEDS TRANSLATION ## +#item.openblocks.sketching_pencil.name=Sketching Pencil ## NEEDS TRANSLATION ## +#item.openblocks.tasty_clay.name=Tasty Clay ## NEEDS TRANSLATION ## +#item.openblocks.golden_eye.name=Golden eye ## NEEDS TRANSLATION ## +#item.openblocks.pointer.name=Pointer ## NEEDS TRANSLATION ## +#item.openblocks.tuned_crystal.name=Tuned Crystal ## NEEDS TRANSLATION ## +#item.openblocks.pedometer.name=Pedometer ## NEEDS TRANSLATION ## + +#item.openblocks.wallpaper.name=Wallpaper ## NEEDS TRANSLATION ## + +itemGroup.tabOpenBlocks=OpenBlocks + +#entity.OpenBlocks.Luggage.name=Luggage ## NEEDS TRANSLATION ## +#entity.OpenBlocks.Cartographer.name=Cartographer ## NEEDS TRANSLATION ## +#entity.OpenBlocks.Block.name=Floating Block ## NEEDS TRANSLATION ## +#entity.OpenBlocks.MiniMe.name=Mini Me ## NEEDS TRANSLATION ## + +#fluid.OpenBlocks.xpjuice=Liquid XP ## NEEDS TRANSLATION ## diff --git a/src/main/resources/assets/openblocks/lang/pl_PL.lang b/src/main/resources/assets/openblocks/lang/pl_PL.lang index 44b1afc1..0fd3ffce 100644 --- a/src/main/resources/assets/openblocks/lang/pl_PL.lang +++ b/src/main/resources/assets/openblocks/lang/pl_PL.lang @@ -1,10 +1,24 @@ achievement.openblocks.droppedBrick=Zonk! achievement.openblocks.droppedBrick.desc=Przykro mi, tak się zdarza... stat.openblocks.bricksDropped=Rzucone cegły +#achievement.openblocks.stackOverflow=Stack Overflow ## NEEDS TRANSLATION ## +#achievement.openblocks.stackOverflow.desc=It's full of stars! ## NEEDS TRANSLATION ## +#openblocks.keybind.category=OpenBlocks ## NEEDS TRANSLATION ## openblocks.keybind.drop_brick=Bądź głupi enchantment.openblocks.explosive=Niestabilny +#enchantment.openblocks.laststand=Last Stand ## NEEDS TRANSLATION ## +#enchantment.openblocks.flimflam=Flim Flam ## NEEDS TRANSLATION ## + +#openblocks.gui.blocks=Blocks ## NEEDS TRANSLATION ## +#openblocks.gui.items=Items ## NEEDS TRANSLATION ## +#openblocks.gui.misc=Miscellanea ## NEEDS TRANSLATION ## +#openblocks.gui.changelogs=Changelogs ## NEEDS TRANSLATION ## + +#openblocks.gui.features=Features ## NEEDS TRANSLATION ## +#openblocks.gui.bugfixes=Bugfixes ## NEEDS TRANSLATION ## +#openblocks.gui.tweaks=Tweaks ## NEEDS TRANSLATION ## openblocks.gui.luggage=Bagaż openblocks.gui.sprinkler=Zraszacz @@ -21,7 +35,38 @@ openblocks.gui.itemdropper=Podajnik przedmiotów openblocks.gui.blockplacer=Wykładacz blokowy openblocks.gui.paintmixer=Mikser farby openblocks.gui.drawingtable=Stół do rysowania +#openblocks.gui.digitalfuse=Digital Fuse ## NEEDS TRANSLATION ## +#openblocks.gui.xp_outputs=XP Outputs ## NEEDS TRANSLATION ## +#openblocks.gui.item_outputs=Item Outputs ## NEEDS TRANSLATION ## +#openblocks.gui.max_level=Max. Level: %d ## NEEDS TRANSLATION ## +#openblocks.gui.save_folder=Save folder ## NEEDS TRANSLATION ## +#openblocks.gui.welcome.title=Welcome! ## NEEDS TRANSLATION ## +#openblocks.gui.welcome.content=OpenBlocks is a new open source mod that introduces a variety of ideas into Minecraft, including hang gliders, elevators, tanks, graves, paints, cranes, liquid XP, cartographers, trophies and more! ## NEEDS TRANSLATION ## + +#openblocks.gui.credits.title=Credits ## NEEDS TRANSLATION ## +#openblocks.gui.credits.content=§LBoq, Mikee and NeverCast§R - Leading developers of OpenBlocks (are we allowed to credit ourselves?)\n\n§LSinZ and Yoshi2§R - members of the OpenMods team from the start.\n\n§LVexatos and crafteverywhere§R - Regularly translating the mods.\n\nEveryone else who has contributed to the code over the past two years.\n\n§LDirewolf20 and the rest of ForgeCraft§R - for putting up with the bugs and crashes before we release.\n\nEveryone who's done spotlights, lets plays and generally supported the mod since we started! ## NEEDS TRANSLATION ## + +#openblocks.gui.config.title=Easy Config Editing ## NEEDS TRANSLATION ## +#openblocks.gui.config.content=OpenMods allow for both client and server config options to be changed from chat commands. Some don't even require restart!\n\nServer config settings can be changed using '§L/om_config_s§R' (op needed) and client config settings can be changed using '§L/om_config_c§R'\n\nFor example:\n\n§L/om_config_s set OpenBlocks dropblock elevatorDrainsXP false§R\n§L/om_config_s save§R\n\nFor a full list of commands type: §L/help om_config_s§R or §L/help om_config_c§R ## NEEDS TRANSLATION ## + +#openblocks.gui.restore_inv.title=Inventory backup ## NEEDS TRANSLATION ## +#openblocks.gui.restore_inv.content=Everyone can make mistake. But with §L/ob_inventory§R command you can fix some of them. This command can be used to restore inventory. Backup is created when:\n - player dies\n - grave is spawned \n - player issued command §L/ob_inventory store§R\n\nTo restore inventory you need backup name. Go to folder below or to saves folder on server and look for files named §Linventory-*.dat§R. Then restore inventory with §L/ob_inventory restore §R - where id is either full filename or just middle part, without §Linventory-§R and §L.dat§R. You can also use tab completion. Backups are normal NBT files and can be opened with any editor. ## NEEDS TRANSLATION ## + +#openblocks.gui.bkey.title=The Infamous 'B' Key ## NEEDS TRANSLATION ## +#openblocks.gui.bkey.content=The 'B' key is a very special key in OpenBlocks.\n\nEnabling the 'weAreSeriousPeople' config option in the 'tomfoolery' category of both the client and server config files will give you your very own digestive system.\n\nTry eating some of that tasty clay and press 'B' to digest! ## NEEDS TRANSLATION ## + +#openblocks.gui.unstable.title=Unstable Enchantment ## NEEDS TRANSLATION ## +#openblocks.gui.unstable.content=We've had unconfirmed reports that this enchantment causes any gunpowder you're carrying to become unstable when you're attacked or when you jump off something.\n\nUse at your own risk! ## NEEDS TRANSLATION ## + +#openblocks.gui.flimflam.title=Flim Flam Enchantment ## NEEDS TRANSLATION ## +#openblocks.gui.flimflam.content=Scientists have yet to discover the properties of this enchantment. ## NEEDS TRANSLATION ## + +#openblocks.gui.laststand.title=Last Stand Enchantment ## NEEDS TRANSLATION ## +#openblocks.gui.laststand.content=The last stand enchantment uses your XP bar as a final protection against dying.\n\nWhen you reach 0.5 hearts, the game will take XP from you whenever you're damaged instead of killing you. The higher number of enchantments you have the cheaper the XP cost will be. ## NEEDS TRANSLATION ## + +#openblocks.changelog.title=What's new in OpenBlocks %s ## NEEDS TRANSLATION ## +#openblocks.misc.url=URL: %s ## NEEDS TRANSLATION ## openblocks.misc.type=Typ: %s openblocks.misc.uses=Uses: %.2f openblocks.misc.color=Kolor: %06X @@ -36,76 +81,293 @@ openblocks.misc.mode.inverted_half_panel=Odwrócony połowiczny panel openblocks.misc.mode.inverted_stairs=Odwrócone schody openblocks.misc.structure_pos=Debug: znaleziono strukturę %s na koordynatach (%d,%d,%d) openblocks.misc.locked=Zablokowany +#openblocks.misc.selected_cannon=Selected cannon for targeting ## NEEDS TRANSLATION ## +#openblocks.misc.pointed_cannon=Pointed cannon at %s, %s, %s ## NEEDS TRANSLATION ## +#openblocks.misc.change_mode=Changing to %s mode ## NEEDS TRANSLATION ## +#openblocks.misc.change_size=Changing size to %sx%sx%s ## NEEDS TRANSLATION ## +#openblocks.misc.change_box_size=Changing size to (%d,%d,%d):(%d,%d,%d) ## NEEDS TRANSLATION ## +#openblocks.misc.total_blocks=Total block count: %d ## NEEDS TRANSLATION ## +#openblocks.misc.get_witched=Get witched! ## NEEDS TRANSLATION ## +#openblocks.misc.page=Page %d of %d ## NEEDS TRANSLATION ## +#openblocks.misc.oh_no_ceiling=You can't fall asleep here. Ceiling disturbs you too much... ## NEEDS TRANSLATION ## +#openblocks.misc.oh_no_ground=You want to sleep on THAT!? ## NEEDS TRANSLATION ## +#openblocks.misc.sleeping_bag_broken=Item inactive due to failed initialization ## NEEDS TRANSLATION ## +#openblocks.misc.inverted=Inverted ## NEEDS TRANSLATION ## + +#openblocks.misc.grave_msg=%s (day: %.1f) ## NEEDS TRANSLATION ## + +#openblocks.misc.cant_restore_player=Can't restore inventory for player %s ## NEEDS TRANSLATION ## +#openblocks.misc.cant_restore_inventory=Can't restore inventory ## NEEDS TRANSLATION ## +#openblocks.misc.cant_store=Can't store player %s inventory ## NEEDS TRANSLATION ## +#openblocks.misc.invalid_sub_inventory=Can't restore sub inventory %s ## NEEDS TRANSLATION ## +#openblocks.misc.stored_inventory=Stored player inventory to %s ## NEEDS TRANSLATION ## +#openblocks.misc.restored_inventory=Restored inventory for player %s ## NEEDS TRANSLATION ## +#openblocks.misc.invalid_index=Invalid index ## NEEDS TRANSLATION ## +#openblocks.misc.empty_slot=No item in slot ## NEEDS TRANSLATION ## + +#openblocks.misc.pedometer.tracking_reset=Tracking reset ## NEEDS TRANSLATION ## +#openblocks.misc.pedometer.tracking_started=Tracking started ## NEEDS TRANSLATION ## + +#openblocks.misc.pedometer.start_point=Start point: %s ## NEEDS TRANSLATION ## +#openblocks.misc.pedometer.speed=Speed: %s ## NEEDS TRANSLATION ## +#openblocks.misc.pedometer.avg_speed=Average speed: %s ## NEEDS TRANSLATION ## +#openblocks.misc.pedometer.total_distance=Total distance: %s ## NEEDS TRANSLATION ## + +#openblocks.misc.pedometer.straght_line_distance=Straight line distance: %s ## NEEDS TRANSLATION ## +#openblocks.misc.pedometer.straigh_line_speed=Straight line speed: %s ## NEEDS TRANSLATION ## + +#openblocks.misc.pedometer.last_check_distance=Distance from last check: %s ## NEEDS TRANSLATION ## +#openblocks.misc.pedometer.last_check_speed=Last check speed: %s ## NEEDS TRANSLATION ## +#openblocks.misc.pedometer.last_check_time=Time from last check: %d ticks ## NEEDS TRANSLATION ## + +#openblocks.misc.pedometer.total_time=Total time: %d ticks ## NEEDS TRANSLATION ## + +#openblocks.misc.shape=Shape: %s ## NEEDS TRANSLATION ## +#openblocks.misc.shape.sphere=Sphere ## NEEDS TRANSLATION ## +#openblocks.misc.shape.cylinder=Cylinder ## NEEDS TRANSLATION ## +#openblocks.misc.shape.cuboid=Cuboid ## NEEDS TRANSLATION ## +#openblocks.misc.shape.full_cuboid=Full Cuboid ## NEEDS TRANSLATION ## +#openblocks.misc.shape.dome=Dome ## NEEDS TRANSLATION ## +#openblocks.misc.shape.triangle=Triangle ## NEEDS TRANSLATION ## +#openblocks.misc.shape.pentagon=Pentagon ## NEEDS TRANSLATION ## +#openblocks.misc.shape.hexagon=Hexagon ## NEEDS TRANSLATION ## +#openblocks.misc.shape.octagon=Octagon ## NEEDS TRANSLATION ## +#openblocks.misc.shape.axes=Axes ## NEEDS TRANSLATION ## +#openblocks.misc.shape.planes=Planes ## NEEDS TRANSLATION ## + +#openblocks.misc.box=Dimensions: (%d,%d,%d):(%d,%d,%d) ## NEEDS TRANSLATION ## +#openblocks.misc.width=Width: %d ## NEEDS TRANSLATION ## +#openblocks.misc.height=Height: %d ## NEEDS TRANSLATION ## +#openblocks.misc.depth=Depth: %d ## NEEDS TRANSLATION ## + +#openblocks.misc.radio.too_many=Too many radios already playing ## NEEDS TRANSLATION ## +#openblocks.misc.radio.invalid_stream=Invalid stream ## NEEDS TRANSLATION ## +#openblocks.misc.radio.invalid_url=Invalid URL ## NEEDS TRANSLATION ## +#openblocks.misc.radio.url_not_found=URL not found ## NEEDS TRANSLATION ## +#openblocks.misc.radio.unknown_stream_type=Unknown stream type ## NEEDS TRANSLATION ## +#openblocks.misc.radio.malformed_data=Malformed data in stream ## NEEDS TRANSLATION ## +#openblocks.misc.radio.not_ready=Stream not ready, try again later ## NEEDS TRANSLATION ## +#openblocks.misc.radio.cant_connect=Can't connect ## NEEDS TRANSLATION ## +#openblocks.misc.radio.unknown_error=Unknown error ## NEEDS TRANSLATION ## +#openblocks.misc.radio.muted=Sounds are muted! ## NEEDS TRANSLATION ## + +#openblocks.misc.side.east=East side ## NEEDS TRANSLATION ## +#openblocks.misc.side.west=West side ## NEEDS TRANSLATION ## +#openblocks.misc.side.north=North side ## NEEDS TRANSLATION ## +#openblocks.misc.side.south=South side ## NEEDS TRANSLATION ## +#openblocks.misc.side.up=Top side ## NEEDS TRANSLATION ## +#openblocks.misc.side.down=Bottom side ## NEEDS TRANSLATION ## + +#openblocks.misc.command.invalid=Invalid command arguments ## NEEDS TRANSLATION ## +#openblocks.misc.command.no_flim_flam=Invalid flim-flam name ## NEEDS TRANSLATION ## +#openblocks.misc.command.flim_flam_source=Player %s had been successfully flim-flammed with %s ## NEEDS TRANSLATION ## +#openblocks.misc.command.flim_flam_target=Someone doesn't like you. Someone with power ## NEEDS TRANSLATION ## +#openblocks.misc.command.flim_flam_failed=Flim-flamming failed! ## NEEDS TRANSLATION ## +#openblocks.misc.command.luck_added=Luck changed for player %s, current: %d ## NEEDS TRANSLATION ## +#openblocks.misc.command.luck_current=Player %s luck: %d ## NEEDS TRANSLATION ## + +#openblocks.misc.hidden_lore=§a§oHold ALT to see history§r ## NEEDS TRANSLATION ## +#openblocks.flim_flammed=Something weird happens around you ## NEEDS TRANSLATION ## openblocks.turtle.magnet=magnesowy tile.openblocks.elevator.name=Winda +#tile.openblocks.elevator.description=Place one elevator directly three or more blocks above another with no blocks inbetween and you'll be able to either 'jump' to move up, or 'crouch' to move down. Elevators can be dyed by clicking on them with dye, however, you can only teleport between elevators of the same color. ## NEEDS TRANSLATION ## + +#tile.openblocks.elevator_rotating.name=Rotating Elevator ## NEEDS TRANSLATION ## + tile.openblocks.heal.name=Uzdrawiacz +#tile.openblocks.heal.description=The healing block is a creative-mode only block that gives off a slight healing effect over time. ## NEEDS TRANSLATION ## + tile.openblocks.guide.name=Pomocnik budowania +#tile.openblocks.guide.description=The building guide, once powered with redstone, will give you an outline of ghost blocks in different shapes and sizes that'll help you plan out rooms.\nUse touch-buttons on block to change outline dimensions and shapes.\nColor of markers can be changed by using dye on central block. ## NEEDS TRANSLATION ## + +#tile.openblocks.builder_guide.name=Enhanced Building Guide ## NEEDS TRANSLATION ## +#tile.openblocks.builder_guide.description=This enhanced version of building guide not only displays ghost blocks to make building easier, but also allows you to place actual blocks. Just click central block with any block stack!\nWhen in creative mode you can place an obsidian block above, then hit the building guide with any block you like to automatically create the shape. ## NEEDS TRANSLATION ## + tile.openblocks.ladder.name=Właz z drabiną +#tile.openblocks.ladder.description=The jaded ladder solves that annoying problem of jumping out of a trapdoor at the top of a ladder. The jaded ladder acts as both a trap door and a ladder at the same time. ## NEEDS TRANSLATION ## + +#tile.openblocks.tank.filled.name=%s Tank ## NEEDS TRANSLATION ## tile.openblocks.tank.name=Zbiornik -tile.openblocks.target.name=Tarcza strzelnicza -tile.openblocks.grave.name=Grób +#tile.openblocks.tank.description=Tanks can hold liquids. If you place tanks next to each other and they'll distribute their liquid between the tanks. You can place liquid into the tanks using buckets. If the tank contains XP Juice you can click on them with an empty hand to give yourself some of the XP. When broken tanks will retain their liquid. ## NEEDS TRANSLATION ## + tile.openblocks.flag.name=Flaga -tile.openblocks.trophy.name=Trofeum +#tile.openblocks.flag.description=Flags can be used for decoration or for marking the way back out of a cave you've ventured in to. The flag will point in the direction that you placed it, or you can put it on walls. If you shift-click with a flag in your hand it will change color. ## NEEDS TRANSLATION ## + tile.openblocks.beartrap.name=Pułapka na stworzenia -tile.openblocks.sprinkler.name=Zraszacz -tile.openblocks.vacuumhopper.name=Lej próżniowy +#tile.openblocks.beartrap.description=Place a bear trap and click on it to open it up. When a mob walks over the trap they'll be unable to move! ## NEEDS TRANSLATION ## + tile.openblocks.sponge.name=Gąbka +#tile.openblocks.sponge.description=The sponge is a replacement for the vanilla sponge. Perfect for removing small pockets of lava or water. Be careful when using it on large areas of liquid though as it'll start to get quite messy. ## NEEDS TRANSLATION ## + +#item.openblocks.spongeonastick.name=Sponge ## NEEDS TRANSLATION ## +#item.openblocks.spongeonastick.description=The sponge on a stick is a tool for cleaning up liquids. Works just like the sponge, but is more mobile at the expense of wearing out. ## NEEDS TRANSLATION ## + +#item.openblocks.epic_eraser.name=Epic Eraser ## NEEDS TRANSLATION ## +#item.openblocks.epic_eraser.description=Every item has its own history...\n\nDon't you hate it?\nWith this item you can scrub all traces of epic lore your loot has collected over the years and then sell it on black market without worrying about evidence. ## NEEDS TRANSLATION ## + tile.openblocks.cannon.name=Armatka przedmiotów -tile.openblocks.bigbutton.name=Duży przycisk -tile.openblocks.fan.name=Wiatrak -tile.openblocks.xpbottler.name=Rozlewnia XP -tile.openblocks.village_highlighter.name=Przyciągacz osadników -tile.openblocks.path.name=Ścieżka -tile.openblocks.autoanvil.name=Kowadło automatyczne -tile.openblocks.autoenchantmenttable.name=Automatyczny stół do zaklęć -tile.openblocks.xpdrain.name=Dren XP +#tile.openblocks.cannon.description=When given a redstone signal, the item cannon will shoot items that it finds in an adjacent inventory. Use the 'pointer' item to aim the cannon. ## NEEDS TRANSLATION ## + tile.openblocks.ropeladder.name=Drabina linowa -tile.openblocks.donationStation.name=Stacja darowizn -tile.openblocks.blockbreaker.name=Burzyciel blokowy -tile.openblocks.blockPlacer.name=Wykładacz blokowy -tile.openblocks.itemDropper.name=Podajnik przedmiotów -tile.openblocks.canvas.name=Płótno -tile.openblocks.canvasglass.name=Szklane płótno +#tile.openblocks.ropeladder.description=When you place a rope ladder it'll roll out all the way to the ground. For every created ladder block it will use one item from stack. ## NEEDS TRANSLATION ## + +tile.openblocks.sprinkler.name=Zraszacz +#tile.openblocks.sprinkler.description=The sprinkler will help fertilize crops up to 4 blocks away. Simply place it above an OpenBlocks tank filled with water! You can also add bonemeal for an even faster rate of growth.\nIt also acts as a water source block! ## NEEDS TRANSLATION ## + tile.openblocks.paintmixer.name=Mikser farby -tile.openblocks.paintcan.name=Puszka farby +#tile.openblocks.paintmixer.description=The paint mixer can mix any colour of paint you want! Drop either an existing paint bucket or a bucket of milk into the top slot, then cyan, magenta, yellow and black dyes into the other four slots and click mix! ## NEEDS TRANSLATION ## + +tile.openblocks.canvas.name=Płótno +#tile.openblocks.canvas.description=The canvas is a perfectly white block that's perfect for painting. See the Paint Mixer for information about making paints. ## NEEDS TRANSLATION ## + +tile.openblocks.fan.name=Wiatrak +#tile.openblocks.fan.description=The fan will blow players, mobs or entities in the direction it's facing. ## NEEDS TRANSLATION ## + +tile.openblocks.target.name=Tarcza strzelnicza +#tile.openblocks.target.description=The target will give out a redstone signal of a strength relative to the accuracy of the player's aim. Give the target a redstone signal to make it pop up! ## NEEDS TRANSLATION ## + +tile.openblocks.path.name=Ścieżka +#tile.openblocks.path.description=The path doesn't do anything. It just looks nice! ## NEEDS TRANSLATION ## + +tile.openblocks.itemDropper.name=Podajnik przedmiotów +#tile.openblocks.itemDropper.description=The item dropper is similar to the vanilla dropper, except it drops items directly down in a straight line. ## NEEDS TRANSLATION ## + +tile.openblocks.bigbutton.name=Duży przycisk +#tile.openblocks.bigbutton.description=The big button is a large button that can be placed on walls. If you shift-click on the button with an empty hand it will bring up an inventory with a single slot. You can put items into this slot to increase the length of time the button is pressed - one item increases the button press by one tick. ## NEEDS TRANSLATION ## + +tile.openblocks.xpdrain.name=Dren XP +#tile.openblocks.xpdrain.description=Place the XP drain above an OpenBlocks tank and stand on it. Your XP will drain into the tank, which can then be used for blocks such as the auto enchantment table or the auto anvil. ## NEEDS TRANSLATION ## + +tile.openblocks.vacuumhopper.name=Lej próżniowy +#tile.openblocks.vacuumhopper.description=The vacuum hopper will suck up items and XP orbs around it. You can use the tabs on the right of the interface to select which sides to output to. ## NEEDS TRANSLATION ## + +tile.openblocks.village_highlighter.name=Przyciągacz osadników +#tile.openblocks.village_highlighter.description=Drop the village highlighter down in a village and give it a redstone signal. It will outline the perimeter of the village and draw a box in the iron golem spawning area. Useful if you want to make sure villages don't merge into each other or you're making an iron farm! ## NEEDS TRANSLATION ## + +tile.openblocks.donationStation.name=Stacja darowizn +#tile.openblocks.donationStation.description=Love a block or item and want to show the mod developer some appreciation? Drop it into the donation station and if we know the authors donation page we'll give you a link. ## NEEDS TRANSLATION ## + +tile.openblocks.blockPlacer.name=Wykładacz blokowy +#tile.openblocks.blockPlacer.description=When given a redstone pulse the block placer will place an item in the direction it's facing. ## NEEDS TRANSLATION ## + +tile.openblocks.blockbreaker.name=Burzyciel blokowy +#tile.openblocks.blockbreaker.description=When given a redstone pulse the block breaker will break the block it's facing. ## NEEDS TRANSLATION ## + tile.openblocks.projector.name=Projektor mapy wysokościowej +#tile.openblocks.projector.description=I'll let you write this one boq! ## NEEDS TRANSLATION ## + +tile.openblocks.autoenchantmenttable.name=Automatyczny stół do zaklęć +#tile.openblocks.autoenchantmenttable.description=The auto enchantment table works in a similar way to the vanilla enchantment table except it runs off XP juice. Use the tabs on the right side of the interface to select where items or xp can be pulled from. Just like with the vanilla table bookshelves are required for higher levels. ## NEEDS TRANSLATION ## + +tile.openblocks.xpbottler.name=Rozlewnia XP +#tile.openblocks.xpbottler.description=The XP bottler will take XP juice and bottle it up into glass bottles to create bottles o' enchanting. ## NEEDS TRANSLATION ## + +tile.openblocks.autoanvil.name=Kowadło automatyczne +#tile.openblocks.autoanvil.description=The auto anvil works just like the vanilla anvil, except it runs from XP juice and can be fully automated.\n\nUse the tabs on the right of the GUI to select which sides of the anvil items or liquid can be inserted or extracted. Right click and drag the anvil in the tab to spin it around and select other sides! ## NEEDS TRANSLATION ## + tile.openblocks.drawingtable.name=Stół do rysowania +#tile.openblocks.drawingtable.description=The drawing table is for creating stencils which can be used while painting. Insert an Unprepared Stencil into the drawing table then use the arrows to select which stencil you want! ## NEEDS TRANSLATION ## + +tile.openblocks.grave.name=Grób +tile.openblocks.trophy.name=Trofeum +#tile.openblocks.trophy.entity.name=%s Trophy ## NEEDS TRANSLATION ## +tile.openblocks.canvasglass.name=Szklane płótno +tile.openblocks.paintcan.name=Puszka farby + +#tile.openblocks.sky.normal.name=Sky Block ## NEEDS TRANSLATION ## +#tile.openblocks.sky.normal.description=Bring the outside inside with the new Sky block! Just apply a redstone signal. We also offer an inverted version. ## NEEDS TRANSLATION ## +#tile.openblocks.sky.inverted.name=Inverted Sky Block ## NEEDS TRANSLATION ## + +#tile.openblocks.radio.name=Radio ## NEEDS TRANSLATION ## +#tile.openblocks.radio.description=The radio allows you to stream internet radio! First, you need some tuned crystals which you can find in dungeon chests or from a special villager. Place the crystal in the radio and supply it with a redstone signal to turn it on. The redstone strength controls the volume.\n\nYou can configure which radio stations are available in the servers config file. ## NEEDS TRANSLATION ## + +#tile.openblocks.xpshower.name=XP Shower ## NEEDS TRANSLATION ## +#tile.openblocks.xpshower.description=Attach an XP shower to a tank of XP juice and it'll pour out XP orbs. These orbs can be collected by an XP Drain or an MFR Sewer. ## NEEDS TRANSLATION ## + +#tile.openblocks.scaffolding.name=Scaffolding ## NEEDS TRANSLATION ## +#tile.openblocks.scaffolding.description=Have you ever wanted to pillar up somewhere without leaving an ugly tower behind? Well, now you can! Simply build with scaffolding blocks and they will automatically despawn when you are done. ## NEEDS TRANSLATION ## + +#tile.openblocks.goldenegg.name=Golden Egg ## NEEDS TRANSLATION ## + +#tile.openblocks.digitalfuse.name=Digital Fuse ## NEEDS TRANSLATION ## + +item.openblocks.cursor.name=Kursor +#item.openblocks.cursor.description=The cursor will let you click on blocks remotely.\nSimply shift-click onto a block to link the cursor, then use the cursor wherever you like to click on the target block. Be warned, by default the cursor uses up your XP relative to how far you are from the block you're clicking. ## NEEDS TRANSLATION ## + +#item.openblocks.devnull.name=/dev/null ## NEEDS TRANSLATION ## +#item.openblocks.devnull.description=Click using /dev/null to open the inventory. There's a single inventory slot - put an item in there - dirt, for example. As you gather dirt from the ground this slot will fill up. Once it's full, any more dirt you pick up will be automatically discarded. You can shift-click with the item in your hand as though you were placing the block! ## NEEDS TRANSLATION ## + +item.openblocks.slimalyzer.name=Szlamalizator +#item.openblocks.slimalyzer.description=Walk around with the slimalyzer in your hand and it'll light up whenever you're in a slime spawning chunk. ## NEEDS TRANSLATION ## item.openblocks.hangglider.name=Lotnia +#item.openblocks.hangglider.description=The hang glider is self explanatory. Hold it in your hand and click to place it on your back. Now jump!\nTo increase your speed you can press shift while gliding, but watch out, you'll lose altitude faster! ## NEEDS TRANSLATION ## + item.openblocks.gliderwing.name=Skrzydło lotnii + +item.openblocks.sleepingbag.name=Śpiwór +#item.openblocks.sleepingbag.description=The sleeping bag lets you sleep out in the wilderness without having to reset your spawn location. To sleep, simply wear it on your back. ## NEEDS TRANSLATION ## + item.openblocks.luggage.name=Bagaż +#item.openblocks.luggage.description=Luggage is your new friend. He'll follow you around anywhere you go collecting any items he finds on the floor. Nom nom nom!\nTo dismantle him just shift-click on him and he'll turn into an item that you can carry around.\nIf he ever gets struck by lightning he'll be able to carry even more items! ## NEEDS TRANSLATION ## + item.openblocks.sonicglasses.name=Okulary soniczne +#item.openblocks.sonicglasses.description=Introducing the fantabulous new Sonic Glasses!\nThis new and exciting technology from OpenMods Inc allow you see what you hear! ## NEEDS TRANSLATION ## + +item.openblocks.squeegee.name=Rakiel +#item.openblocks.squeegee.description=The squeegee removes paint from any painted blocks. Just click on the side of the block you want to remove the paint from, or alternative shift-click the block to remove paint from all sides! ## NEEDS TRANSLATION ## + +item.openblocks.paintbrush.name=Pędzel +#item.openblocks.paintbrush.description=Paint brushes let you paint blocks in whatever color you like!\n\nDab your paint brush in a Paint Can made in the Paint Mixer then click on a block to paint it.\n\nCanvas blocks are perfect for painting, but you can also paint quite a few vanilla blocks and even some blocks from other mods. You can also place stencils on blocks and then paint over the stencil! ## NEEDS TRANSLATION ## + +item.openblocks.unprepared_stencil.name=Nieprzygotowany szablon +#item.openblocks.unprepared_stencil.description=Stencils can be placed onto blocks and then painted over using paint brushes!\n\nYou can paint a block using multiple stencils and you can click on them with an empty hand to rotate them.\n\nPlace an Unprepared Stencil in a Drawing table to create different patterns. ## NEEDS TRANSLATION ## + +item.openblocks.crane_backpack.name=Plecak żurawia +#item.openblocks.crane_backpack.description=In Minecraft world "magnet" is ancient word for "how do this works?".\n\nThis particular piece of very equipment allows you to pick and carry mobs, players, items and blocks. Can be controlled with magnet control. ## NEEDS TRANSLATION ## + +item.openblocks.crane_control.name=Kontroler żurawia +#item.openblocks.crane_control.description=This hi-tech wireless remote is used for controlling magnet backpacks.\n\nRight click to raise, Sneak + right click to lower, left click to pick/release.\nBlinking light signals something is under magnet. ## NEEDS TRANSLATION ## + +#item.openblocks.wrench.name=Big Metal Bar ## NEEDS TRANSLATION ## +#item.openblocks.wrench.description=This is extremely sophisticated tool used to perform transformations of objects with octahedral symmetry.\n\n\nOr just big, dumb piece of metal you can use to rotate cubes and stuff.\n\nSo yeah, it's yet another wrench. I'm just trying to be original here, ok? ## NEEDS TRANSLATION ## + +item.openblocks.stencil.name=Szablon item.openblocks.crayon.name=Magiczna kredka item.openblocks.pencil.name=Magiczny ołówek item.openblocks.glasses.pencil.name=Szkła ołówkowe item.openblocks.glasses.crayon.name=Szkła kredowe item.openblocks.glasses.technicolor.name=Niesamowite szkła Technicolor item.openblocks.glasses.admin.name=Kujońskie okulary -item.openblocks.crane_backpack.name=Plecak żurawia -item.openblocks.crane_control.name=Kontroler żurawia item.openblocks.crane_engine.name=Silnik żurawia item.openblocks.crane_magnet.name=Magnes żurawia item.openblocks.beam.name=Wiązka item.openblocks.line.name=Linia item.openblocks.miracle_magnet.name=§5Cudowny magnes§r -item.openblocks.slimalyzer.name=Szlamalizator +#item.openblocks.info_book.name=World Domination with OpenBlocks ## NEEDS TRANSLATION ## item.openblocks.xpbucket.name=Wiadro XP -item.openblocks.sleepingbag.name=Śpiwór -item.openblocks.paintbrush.name=Pędzel -item.openblocks.stencil.name=Szablon item.openblocks.height_map.name=Mapa wysokościowa item.openblocks.empty_map.name=Pusta mapa item.openblocks.map_controller.name=Moduł kontrolera mapy item.openblocks.map_memory.name=Moduł pamięci mapy item.openblocks.cartographer.name=Kartograf item.openblocks.assistant_base.name=Baza asystenta -item.openblocks.cursor.name=Kursor -item.openblocks.squeegee.name=Rakiel -item.openblocks.unprepared_stencil.name=Nieprzygotowany szablon item.openblocks.sketching_pencil.name=Szkicujący ołówek item.openblocks.tasty_clay.name=Elegancka glina item.openblocks.golden_eye.name=Złote oko +#item.openblocks.pointer.name=Pointer ## NEEDS TRANSLATION ## +#item.openblocks.tuned_crystal.name=Tuned Crystal ## NEEDS TRANSLATION ## +#item.openblocks.pedometer.name=Pedometer ## NEEDS TRANSLATION ## + +#item.openblocks.wallpaper.name=Wallpaper ## NEEDS TRANSLATION ## itemGroup.tabOpenBlocks=OpenBlocks + +#entity.OpenBlocks.Luggage.name=Luggage ## NEEDS TRANSLATION ## +#entity.OpenBlocks.Cartographer.name=Cartographer ## NEEDS TRANSLATION ## +#entity.OpenBlocks.Block.name=Floating Block ## NEEDS TRANSLATION ## +#entity.OpenBlocks.MiniMe.name=Mini Me ## NEEDS TRANSLATION ## + +#fluid.OpenBlocks.xpjuice=Liquid XP ## NEEDS TRANSLATION ## diff --git a/src/main/resources/assets/openblocks/lang/pt_BR.lang b/src/main/resources/assets/openblocks/lang/pt_BR.lang index 7eb6c16c..17d41328 100644 --- a/src/main/resources/assets/openblocks/lang/pt_BR.lang +++ b/src/main/resources/assets/openblocks/lang/pt_BR.lang @@ -1,3 +1,25 @@ +#achievement.openblocks.droppedBrick=Zoinks! ## NEEDS TRANSLATION ## +#achievement.openblocks.droppedBrick.desc=Sorry, it just happened... ## NEEDS TRANSLATION ## +#stat.openblocks.bricksDropped=Bricks dropped ## NEEDS TRANSLATION ## +#achievement.openblocks.stackOverflow=Stack Overflow ## NEEDS TRANSLATION ## +#achievement.openblocks.stackOverflow.desc=It's full of stars! ## NEEDS TRANSLATION ## + +#openblocks.keybind.category=OpenBlocks ## NEEDS TRANSLATION ## +#openblocks.keybind.drop_brick=Be silly ## NEEDS TRANSLATION ## + +#enchantment.openblocks.explosive=Unstable ## NEEDS TRANSLATION ## +#enchantment.openblocks.laststand=Last Stand ## NEEDS TRANSLATION ## +#enchantment.openblocks.flimflam=Flim Flam ## NEEDS TRANSLATION ## + +#openblocks.gui.blocks=Blocks ## NEEDS TRANSLATION ## +#openblocks.gui.items=Items ## NEEDS TRANSLATION ## +#openblocks.gui.misc=Miscellanea ## NEEDS TRANSLATION ## +#openblocks.gui.changelogs=Changelogs ## NEEDS TRANSLATION ## + +#openblocks.gui.features=Features ## NEEDS TRANSLATION ## +#openblocks.gui.bugfixes=Bugfixes ## NEEDS TRANSLATION ## +#openblocks.gui.tweaks=Tweaks ## NEEDS TRANSLATION ## + openblocks.gui.luggage=Bagagem openblocks.gui.sprinkler=Borrifador openblocks.gui.vacuumhopper=Funil a vácuo @@ -8,7 +30,43 @@ openblocks.gui.autoeject=Ejetar automaticamente openblocks.gui.autoextract=Extrair automaticamente openblocks.gui.autodrink=Beber automaticamente openblocks.gui.autoenchantmenttable=Mesa de encantamentos automática +#openblocks.gui.donationstation=Donation Station ## NEEDS TRANSLATION ## +#openblocks.gui.itemdropper=Item Dropper ## NEEDS TRANSLATION ## +#openblocks.gui.blockplacer=Block Placer ## NEEDS TRANSLATION ## +#openblocks.gui.paintmixer=Paint Mixer ## NEEDS TRANSLATION ## +#openblocks.gui.drawingtable=Drawing Table ## NEEDS TRANSLATION ## +#openblocks.gui.digitalfuse=Digital Fuse ## NEEDS TRANSLATION ## +#openblocks.gui.xp_outputs=XP Outputs ## NEEDS TRANSLATION ## +#openblocks.gui.item_outputs=Item Outputs ## NEEDS TRANSLATION ## +#openblocks.gui.max_level=Max. Level: %d ## NEEDS TRANSLATION ## +#openblocks.gui.save_folder=Save folder ## NEEDS TRANSLATION ## +#openblocks.gui.welcome.title=Welcome! ## NEEDS TRANSLATION ## +#openblocks.gui.welcome.content=OpenBlocks is a new open source mod that introduces a variety of ideas into Minecraft, including hang gliders, elevators, tanks, graves, paints, cranes, liquid XP, cartographers, trophies and more! ## NEEDS TRANSLATION ## + +#openblocks.gui.credits.title=Credits ## NEEDS TRANSLATION ## +#openblocks.gui.credits.content=§LBoq, Mikee and NeverCast§R - Leading developers of OpenBlocks (are we allowed to credit ourselves?)\n\n§LSinZ and Yoshi2§R - members of the OpenMods team from the start.\n\n§LVexatos and crafteverywhere§R - Regularly translating the mods.\n\nEveryone else who has contributed to the code over the past two years.\n\n§LDirewolf20 and the rest of ForgeCraft§R - for putting up with the bugs and crashes before we release.\n\nEveryone who's done spotlights, lets plays and generally supported the mod since we started! ## NEEDS TRANSLATION ## + +#openblocks.gui.config.title=Easy Config Editing ## NEEDS TRANSLATION ## +#openblocks.gui.config.content=OpenMods allow for both client and server config options to be changed from chat commands. Some don't even require restart!\n\nServer config settings can be changed using '§L/om_config_s§R' (op needed) and client config settings can be changed using '§L/om_config_c§R'\n\nFor example:\n\n§L/om_config_s set OpenBlocks dropblock elevatorDrainsXP false§R\n§L/om_config_s save§R\n\nFor a full list of commands type: §L/help om_config_s§R or §L/help om_config_c§R ## NEEDS TRANSLATION ## + +#openblocks.gui.restore_inv.title=Inventory backup ## NEEDS TRANSLATION ## +#openblocks.gui.restore_inv.content=Everyone can make mistake. But with §L/ob_inventory§R command you can fix some of them. This command can be used to restore inventory. Backup is created when:\n - player dies\n - grave is spawned \n - player issued command §L/ob_inventory store§R\n\nTo restore inventory you need backup name. Go to folder below or to saves folder on server and look for files named §Linventory-*.dat§R. Then restore inventory with §L/ob_inventory restore §R - where id is either full filename or just middle part, without §Linventory-§R and §L.dat§R. You can also use tab completion. Backups are normal NBT files and can be opened with any editor. ## NEEDS TRANSLATION ## + +#openblocks.gui.bkey.title=The Infamous 'B' Key ## NEEDS TRANSLATION ## +#openblocks.gui.bkey.content=The 'B' key is a very special key in OpenBlocks.\n\nEnabling the 'weAreSeriousPeople' config option in the 'tomfoolery' category of both the client and server config files will give you your very own digestive system.\n\nTry eating some of that tasty clay and press 'B' to digest! ## NEEDS TRANSLATION ## + +#openblocks.gui.unstable.title=Unstable Enchantment ## NEEDS TRANSLATION ## +#openblocks.gui.unstable.content=We've had unconfirmed reports that this enchantment causes any gunpowder you're carrying to become unstable when you're attacked or when you jump off something.\n\nUse at your own risk! ## NEEDS TRANSLATION ## + +#openblocks.gui.flimflam.title=Flim Flam Enchantment ## NEEDS TRANSLATION ## +#openblocks.gui.flimflam.content=Scientists have yet to discover the properties of this enchantment. ## NEEDS TRANSLATION ## + +#openblocks.gui.laststand.title=Last Stand Enchantment ## NEEDS TRANSLATION ## +#openblocks.gui.laststand.content=The last stand enchantment uses your XP bar as a final protection against dying.\n\nWhen you reach 0.5 hearts, the game will take XP from you whenever you're damaged instead of killing you. The higher number of enchantments you have the cheaper the XP cost will be. ## NEEDS TRANSLATION ## + +#openblocks.changelog.title=What's new in OpenBlocks %s ## NEEDS TRANSLATION ## +#openblocks.misc.url=URL: %s ## NEEDS TRANSLATION ## openblocks.misc.type=Tipo: %s openblocks.misc.uses=Usa: %.2f openblocks.misc.color=Cor: %06X @@ -21,52 +79,295 @@ openblocks.misc.mode.inverted_block=Bloco invertido openblocks.misc.mode.inverted_panel=Painel invertido openblocks.misc.mode.inverted_half_panel=Painel ao meio invertido openblocks.misc.mode.inverted_stairs=Escadas invertidas +#openblocks.misc.structure_pos=Debug: found structure %s at (%d,%d,%d) ## NEEDS TRANSLATION ## +#openblocks.misc.locked=Locked ## NEEDS TRANSLATION ## +#openblocks.misc.selected_cannon=Selected cannon for targeting ## NEEDS TRANSLATION ## +#openblocks.misc.pointed_cannon=Pointed cannon at %s, %s, %s ## NEEDS TRANSLATION ## +#openblocks.misc.change_mode=Changing to %s mode ## NEEDS TRANSLATION ## +#openblocks.misc.change_size=Changing size to %sx%sx%s ## NEEDS TRANSLATION ## +#openblocks.misc.change_box_size=Changing size to (%d,%d,%d):(%d,%d,%d) ## NEEDS TRANSLATION ## +#openblocks.misc.total_blocks=Total block count: %d ## NEEDS TRANSLATION ## +#openblocks.misc.get_witched=Get witched! ## NEEDS TRANSLATION ## +#openblocks.misc.page=Page %d of %d ## NEEDS TRANSLATION ## +#openblocks.misc.oh_no_ceiling=You can't fall asleep here. Ceiling disturbs you too much... ## NEEDS TRANSLATION ## +#openblocks.misc.oh_no_ground=You want to sleep on THAT!? ## NEEDS TRANSLATION ## +#openblocks.misc.sleeping_bag_broken=Item inactive due to failed initialization ## NEEDS TRANSLATION ## +#openblocks.misc.inverted=Inverted ## NEEDS TRANSLATION ## + +#openblocks.misc.grave_msg=%s (day: %.1f) ## NEEDS TRANSLATION ## + +#openblocks.misc.cant_restore_player=Can't restore inventory for player %s ## NEEDS TRANSLATION ## +#openblocks.misc.cant_restore_inventory=Can't restore inventory ## NEEDS TRANSLATION ## +#openblocks.misc.cant_store=Can't store player %s inventory ## NEEDS TRANSLATION ## +#openblocks.misc.invalid_sub_inventory=Can't restore sub inventory %s ## NEEDS TRANSLATION ## +#openblocks.misc.stored_inventory=Stored player inventory to %s ## NEEDS TRANSLATION ## +#openblocks.misc.restored_inventory=Restored inventory for player %s ## NEEDS TRANSLATION ## +#openblocks.misc.invalid_index=Invalid index ## NEEDS TRANSLATION ## +#openblocks.misc.empty_slot=No item in slot ## NEEDS TRANSLATION ## + +#openblocks.misc.pedometer.tracking_reset=Tracking reset ## NEEDS TRANSLATION ## +#openblocks.misc.pedometer.tracking_started=Tracking started ## NEEDS TRANSLATION ## + +#openblocks.misc.pedometer.start_point=Start point: %s ## NEEDS TRANSLATION ## +#openblocks.misc.pedometer.speed=Speed: %s ## NEEDS TRANSLATION ## +#openblocks.misc.pedometer.avg_speed=Average speed: %s ## NEEDS TRANSLATION ## +#openblocks.misc.pedometer.total_distance=Total distance: %s ## NEEDS TRANSLATION ## + +#openblocks.misc.pedometer.straght_line_distance=Straight line distance: %s ## NEEDS TRANSLATION ## +#openblocks.misc.pedometer.straigh_line_speed=Straight line speed: %s ## NEEDS TRANSLATION ## + +#openblocks.misc.pedometer.last_check_distance=Distance from last check: %s ## NEEDS TRANSLATION ## +#openblocks.misc.pedometer.last_check_speed=Last check speed: %s ## NEEDS TRANSLATION ## +#openblocks.misc.pedometer.last_check_time=Time from last check: %d ticks ## NEEDS TRANSLATION ## + +#openblocks.misc.pedometer.total_time=Total time: %d ticks ## NEEDS TRANSLATION ## + +#openblocks.misc.shape=Shape: %s ## NEEDS TRANSLATION ## +#openblocks.misc.shape.sphere=Sphere ## NEEDS TRANSLATION ## +#openblocks.misc.shape.cylinder=Cylinder ## NEEDS TRANSLATION ## +#openblocks.misc.shape.cuboid=Cuboid ## NEEDS TRANSLATION ## +#openblocks.misc.shape.full_cuboid=Full Cuboid ## NEEDS TRANSLATION ## +#openblocks.misc.shape.dome=Dome ## NEEDS TRANSLATION ## +#openblocks.misc.shape.triangle=Triangle ## NEEDS TRANSLATION ## +#openblocks.misc.shape.pentagon=Pentagon ## NEEDS TRANSLATION ## +#openblocks.misc.shape.hexagon=Hexagon ## NEEDS TRANSLATION ## +#openblocks.misc.shape.octagon=Octagon ## NEEDS TRANSLATION ## +#openblocks.misc.shape.axes=Axes ## NEEDS TRANSLATION ## +#openblocks.misc.shape.planes=Planes ## NEEDS TRANSLATION ## + +#openblocks.misc.box=Dimensions: (%d,%d,%d):(%d,%d,%d) ## NEEDS TRANSLATION ## +#openblocks.misc.width=Width: %d ## NEEDS TRANSLATION ## +#openblocks.misc.height=Height: %d ## NEEDS TRANSLATION ## +#openblocks.misc.depth=Depth: %d ## NEEDS TRANSLATION ## + +#openblocks.misc.radio.too_many=Too many radios already playing ## NEEDS TRANSLATION ## +#openblocks.misc.radio.invalid_stream=Invalid stream ## NEEDS TRANSLATION ## +#openblocks.misc.radio.invalid_url=Invalid URL ## NEEDS TRANSLATION ## +#openblocks.misc.radio.url_not_found=URL not found ## NEEDS TRANSLATION ## +#openblocks.misc.radio.unknown_stream_type=Unknown stream type ## NEEDS TRANSLATION ## +#openblocks.misc.radio.malformed_data=Malformed data in stream ## NEEDS TRANSLATION ## +#openblocks.misc.radio.not_ready=Stream not ready, try again later ## NEEDS TRANSLATION ## +#openblocks.misc.radio.cant_connect=Can't connect ## NEEDS TRANSLATION ## +#openblocks.misc.radio.unknown_error=Unknown error ## NEEDS TRANSLATION ## +#openblocks.misc.radio.muted=Sounds are muted! ## NEEDS TRANSLATION ## + +#openblocks.misc.side.east=East side ## NEEDS TRANSLATION ## +#openblocks.misc.side.west=West side ## NEEDS TRANSLATION ## +#openblocks.misc.side.north=North side ## NEEDS TRANSLATION ## +#openblocks.misc.side.south=South side ## NEEDS TRANSLATION ## +#openblocks.misc.side.up=Top side ## NEEDS TRANSLATION ## +#openblocks.misc.side.down=Bottom side ## NEEDS TRANSLATION ## + +#openblocks.misc.command.invalid=Invalid command arguments ## NEEDS TRANSLATION ## +#openblocks.misc.command.no_flim_flam=Invalid flim-flam name ## NEEDS TRANSLATION ## +#openblocks.misc.command.flim_flam_source=Player %s had been successfully flim-flammed with %s ## NEEDS TRANSLATION ## +#openblocks.misc.command.flim_flam_target=Someone doesn't like you. Someone with power ## NEEDS TRANSLATION ## +#openblocks.misc.command.flim_flam_failed=Flim-flamming failed! ## NEEDS TRANSLATION ## +#openblocks.misc.command.luck_added=Luck changed for player %s, current: %d ## NEEDS TRANSLATION ## +#openblocks.misc.command.luck_current=Player %s luck: %d ## NEEDS TRANSLATION ## + +#openblocks.misc.hidden_lore=§a§oHold ALT to see history§r ## NEEDS TRANSLATION ## +#openblocks.flim_flammed=Something weird happens around you ## NEEDS TRANSLATION ## openblocks.turtle.magnet=Imã tile.openblocks.elevator.name=Elevador +#tile.openblocks.elevator.description=Place one elevator directly three or more blocks above another with no blocks inbetween and you'll be able to either 'jump' to move up, or 'crouch' to move down. Elevators can be dyed by clicking on them with dye, however, you can only teleport between elevators of the same color. ## NEEDS TRANSLATION ## + +#tile.openblocks.elevator_rotating.name=Rotating Elevator ## NEEDS TRANSLATION ## + tile.openblocks.heal.name=Curador +#tile.openblocks.heal.description=The healing block is a creative-mode only block that gives off a slight healing effect over time. ## NEEDS TRANSLATION ## + tile.openblocks.guide.name=Guia de construção +#tile.openblocks.guide.description=The building guide, once powered with redstone, will give you an outline of ghost blocks in different shapes and sizes that'll help you plan out rooms.\nUse touch-buttons on block to change outline dimensions and shapes.\nColor of markers can be changed by using dye on central block. ## NEEDS TRANSLATION ## + +#tile.openblocks.builder_guide.name=Enhanced Building Guide ## NEEDS TRANSLATION ## +#tile.openblocks.builder_guide.description=This enhanced version of building guide not only displays ghost blocks to make building easier, but also allows you to place actual blocks. Just click central block with any block stack!\nWhen in creative mode you can place an obsidian block above, then hit the building guide with any block you like to automatically create the shape. ## NEEDS TRANSLATION ## + tile.openblocks.ladder.name=Escada cansada +#tile.openblocks.ladder.description=The jaded ladder solves that annoying problem of jumping out of a trapdoor at the top of a ladder. The jaded ladder acts as both a trap door and a ladder at the same time. ## NEEDS TRANSLATION ## + +#tile.openblocks.tank.filled.name=%s Tank ## NEEDS TRANSLATION ## tile.openblocks.tank.name=Tanque -tile.openblocks.target.name=Alvo -tile.openblocks.grave.name=Túmulo +#tile.openblocks.tank.description=Tanks can hold liquids. If you place tanks next to each other and they'll distribute their liquid between the tanks. You can place liquid into the tanks using buckets. If the tank contains XP Juice you can click on them with an empty hand to give yourself some of the XP. When broken tanks will retain their liquid. ## NEEDS TRANSLATION ## + tile.openblocks.flag.name=Bandeira -tile.openblocks.trophy.name=Troféu +#tile.openblocks.flag.description=Flags can be used for decoration or for marking the way back out of a cave you've ventured in to. The flag will point in the direction that you placed it, or you can put it on walls. If you shift-click with a flag in your hand it will change color. ## NEEDS TRANSLATION ## + tile.openblocks.beartrap.name=Armadilha de ursos -tile.openblocks.sprinkler.name=Borrifador -tile.openblocks.vacuumhopper.name=Funil a vácuo +#tile.openblocks.beartrap.description=Place a bear trap and click on it to open it up. When a mob walks over the trap they'll be unable to move! ## NEEDS TRANSLATION ## + tile.openblocks.sponge.name=Esponja +#tile.openblocks.sponge.description=The sponge is a replacement for the vanilla sponge. Perfect for removing small pockets of lava or water. Be careful when using it on large areas of liquid though as it'll start to get quite messy. ## NEEDS TRANSLATION ## + +#item.openblocks.spongeonastick.name=Sponge ## NEEDS TRANSLATION ## +#item.openblocks.spongeonastick.description=The sponge on a stick is a tool for cleaning up liquids. Works just like the sponge, but is more mobile at the expense of wearing out. ## NEEDS TRANSLATION ## + +#item.openblocks.epic_eraser.name=Epic Eraser ## NEEDS TRANSLATION ## +#item.openblocks.epic_eraser.description=Every item has its own history...\n\nDon't you hate it?\nWith this item you can scrub all traces of epic lore your loot has collected over the years and then sell it on black market without worrying about evidence. ## NEEDS TRANSLATION ## + tile.openblocks.cannon.name=Canhão de itens -tile.openblocks.bigbutton.name=Grande botão -tile.openblocks.fan.name=Ventilador -tile.openblocks.xpbottler.name=Engarrafador de experiência -tile.openblocks.village_highlighter.name=Realçador de aldeões -tile.openblocks.path.name=Caminho -tile.openblocks.autoanvil.name=Bigorna automática -tile.openblocks.autoenchantmenttable.name=Mesa de encantamentos automática -tile.openblocks.xpdrain.name=Dreno de experiência +#tile.openblocks.cannon.description=When given a redstone signal, the item cannon will shoot items that it finds in an adjacent inventory. Use the 'pointer' item to aim the cannon. ## NEEDS TRANSLATION ## + tile.openblocks.ropeladder.name=Corda +#tile.openblocks.ropeladder.description=When you place a rope ladder it'll roll out all the way to the ground. For every created ladder block it will use one item from stack. ## NEEDS TRANSLATION ## + +tile.openblocks.sprinkler.name=Borrifador +#tile.openblocks.sprinkler.description=The sprinkler will help fertilize crops up to 4 blocks away. Simply place it above an OpenBlocks tank filled with water! You can also add bonemeal for an even faster rate of growth.\nIt also acts as a water source block! ## NEEDS TRANSLATION ## + +#tile.openblocks.paintmixer.name=Paint Mixer ## NEEDS TRANSLATION ## +#tile.openblocks.paintmixer.description=The paint mixer can mix any colour of paint you want! Drop either an existing paint bucket or a bucket of milk into the top slot, then cyan, magenta, yellow and black dyes into the other four slots and click mix! ## NEEDS TRANSLATION ## + +#tile.openblocks.canvas.name=Canvas ## NEEDS TRANSLATION ## +#tile.openblocks.canvas.description=The canvas is a perfectly white block that's perfect for painting. See the Paint Mixer for information about making paints. ## NEEDS TRANSLATION ## + +tile.openblocks.fan.name=Ventilador +#tile.openblocks.fan.description=The fan will blow players, mobs or entities in the direction it's facing. ## NEEDS TRANSLATION ## + +tile.openblocks.target.name=Alvo +#tile.openblocks.target.description=The target will give out a redstone signal of a strength relative to the accuracy of the player's aim. Give the target a redstone signal to make it pop up! ## NEEDS TRANSLATION ## + +tile.openblocks.path.name=Caminho +#tile.openblocks.path.description=The path doesn't do anything. It just looks nice! ## NEEDS TRANSLATION ## + +#tile.openblocks.itemDropper.name=Item Dropper ## NEEDS TRANSLATION ## +#tile.openblocks.itemDropper.description=The item dropper is similar to the vanilla dropper, except it drops items directly down in a straight line. ## NEEDS TRANSLATION ## + +tile.openblocks.bigbutton.name=Grande botão +#tile.openblocks.bigbutton.description=The big button is a large button that can be placed on walls. If you shift-click on the button with an empty hand it will bring up an inventory with a single slot. You can put items into this slot to increase the length of time the button is pressed - one item increases the button press by one tick. ## NEEDS TRANSLATION ## + +tile.openblocks.xpdrain.name=Dreno de experiência +#tile.openblocks.xpdrain.description=Place the XP drain above an OpenBlocks tank and stand on it. Your XP will drain into the tank, which can then be used for blocks such as the auto enchantment table or the auto anvil. ## NEEDS TRANSLATION ## + +tile.openblocks.vacuumhopper.name=Funil a vácuo +#tile.openblocks.vacuumhopper.description=The vacuum hopper will suck up items and XP orbs around it. You can use the tabs on the right of the interface to select which sides to output to. ## NEEDS TRANSLATION ## + +tile.openblocks.village_highlighter.name=Realçador de aldeões +#tile.openblocks.village_highlighter.description=Drop the village highlighter down in a village and give it a redstone signal. It will outline the perimeter of the village and draw a box in the iron golem spawning area. Useful if you want to make sure villages don't merge into each other or you're making an iron farm! ## NEEDS TRANSLATION ## + +#tile.openblocks.donationStation.name=Donation Station ## NEEDS TRANSLATION ## +#tile.openblocks.donationStation.description=Love a block or item and want to show the mod developer some appreciation? Drop it into the donation station and if we know the authors donation page we'll give you a link. ## NEEDS TRANSLATION ## + +#tile.openblocks.blockPlacer.name=Block Placer ## NEEDS TRANSLATION ## +#tile.openblocks.blockPlacer.description=When given a redstone pulse the block placer will place an item in the direction it's facing. ## NEEDS TRANSLATION ## + +#tile.openblocks.blockbreaker.name=Block Breaker ## NEEDS TRANSLATION ## +#tile.openblocks.blockbreaker.description=When given a redstone pulse the block breaker will break the block it's facing. ## NEEDS TRANSLATION ## + +#tile.openblocks.projector.name=Height Map Projector ## NEEDS TRANSLATION ## +#tile.openblocks.projector.description=I'll let you write this one boq! ## NEEDS TRANSLATION ## + +tile.openblocks.autoenchantmenttable.name=Mesa de encantamentos automática +#tile.openblocks.autoenchantmenttable.description=The auto enchantment table works in a similar way to the vanilla enchantment table except it runs off XP juice. Use the tabs on the right side of the interface to select where items or xp can be pulled from. Just like with the vanilla table bookshelves are required for higher levels. ## NEEDS TRANSLATION ## + +tile.openblocks.xpbottler.name=Engarrafador de experiência +#tile.openblocks.xpbottler.description=The XP bottler will take XP juice and bottle it up into glass bottles to create bottles o' enchanting. ## NEEDS TRANSLATION ## + +tile.openblocks.autoanvil.name=Bigorna automática +#tile.openblocks.autoanvil.description=The auto anvil works just like the vanilla anvil, except it runs from XP juice and can be fully automated.\n\nUse the tabs on the right of the GUI to select which sides of the anvil items or liquid can be inserted or extracted. Right click and drag the anvil in the tab to spin it around and select other sides! ## NEEDS TRANSLATION ## + +#tile.openblocks.drawingtable.name=Drawing Table ## NEEDS TRANSLATION ## +#tile.openblocks.drawingtable.description=The drawing table is for creating stencils which can be used while painting. Insert an Unprepared Stencil into the drawing table then use the arrows to select which stencil you want! ## NEEDS TRANSLATION ## + +tile.openblocks.grave.name=Túmulo +tile.openblocks.trophy.name=Troféu +#tile.openblocks.trophy.entity.name=%s Trophy ## NEEDS TRANSLATION ## +#tile.openblocks.canvasglass.name=Glass Canvas ## NEEDS TRANSLATION ## +#tile.openblocks.paintcan.name=Paint Can ## NEEDS TRANSLATION ## + +#tile.openblocks.sky.normal.name=Sky Block ## NEEDS TRANSLATION ## +#tile.openblocks.sky.normal.description=Bring the outside inside with the new Sky block! Just apply a redstone signal. We also offer an inverted version. ## NEEDS TRANSLATION ## +#tile.openblocks.sky.inverted.name=Inverted Sky Block ## NEEDS TRANSLATION ## + +#tile.openblocks.radio.name=Radio ## NEEDS TRANSLATION ## +#tile.openblocks.radio.description=The radio allows you to stream internet radio! First, you need some tuned crystals which you can find in dungeon chests or from a special villager. Place the crystal in the radio and supply it with a redstone signal to turn it on. The redstone strength controls the volume.\n\nYou can configure which radio stations are available in the servers config file. ## NEEDS TRANSLATION ## + +#tile.openblocks.xpshower.name=XP Shower ## NEEDS TRANSLATION ## +#tile.openblocks.xpshower.description=Attach an XP shower to a tank of XP juice and it'll pour out XP orbs. These orbs can be collected by an XP Drain or an MFR Sewer. ## NEEDS TRANSLATION ## + +#tile.openblocks.scaffolding.name=Scaffolding ## NEEDS TRANSLATION ## +#tile.openblocks.scaffolding.description=Have you ever wanted to pillar up somewhere without leaving an ugly tower behind? Well, now you can! Simply build with scaffolding blocks and they will automatically despawn when you are done. ## NEEDS TRANSLATION ## + +#tile.openblocks.goldenegg.name=Golden Egg ## NEEDS TRANSLATION ## + +#tile.openblocks.digitalfuse.name=Digital Fuse ## NEEDS TRANSLATION ## + +#item.openblocks.cursor.name=Cursor ## NEEDS TRANSLATION ## +#item.openblocks.cursor.description=The cursor will let you click on blocks remotely.\nSimply shift-click onto a block to link the cursor, then use the cursor wherever you like to click on the target block. Be warned, by default the cursor uses up your XP relative to how far you are from the block you're clicking. ## NEEDS TRANSLATION ## + +#item.openblocks.devnull.name=/dev/null ## NEEDS TRANSLATION ## +#item.openblocks.devnull.description=Click using /dev/null to open the inventory. There's a single inventory slot - put an item in there - dirt, for example. As you gather dirt from the ground this slot will fill up. Once it's full, any more dirt you pick up will be automatically discarded. You can shift-click with the item in your hand as though you were placing the block! ## NEEDS TRANSLATION ## + +item.openblocks.slimalyzer.name=Gosmalizador +#item.openblocks.slimalyzer.description=Walk around with the slimalyzer in your hand and it'll light up whenever you're in a slime spawning chunk. ## NEEDS TRANSLATION ## item.openblocks.hangglider.name=Planador +#item.openblocks.hangglider.description=The hang glider is self explanatory. Hold it in your hand and click to place it on your back. Now jump!\nTo increase your speed you can press shift while gliding, but watch out, you'll lose altitude faster! ## NEEDS TRANSLATION ## + item.openblocks.gliderwing.name=Asa do planador + +item.openblocks.sleepingbag.name=Saco de Dormir +#item.openblocks.sleepingbag.description=The sleeping bag lets you sleep out in the wilderness without having to reset your spawn location. To sleep, simply wear it on your back. ## NEEDS TRANSLATION ## + item.openblocks.luggage.name=Bagagem +#item.openblocks.luggage.description=Luggage is your new friend. He'll follow you around anywhere you go collecting any items he finds on the floor. Nom nom nom!\nTo dismantle him just shift-click on him and he'll turn into an item that you can carry around.\nIf he ever gets struck by lightning he'll be able to carry even more items! ## NEEDS TRANSLATION ## + item.openblocks.sonicglasses.name=Óculos sônicos +#item.openblocks.sonicglasses.description=Introducing the fantabulous new Sonic Glasses!\nThis new and exciting technology from OpenMods Inc allow you see what you hear! ## NEEDS TRANSLATION ## + +#item.openblocks.squeegee.name=Squeegee ## NEEDS TRANSLATION ## +#item.openblocks.squeegee.description=The squeegee removes paint from any painted blocks. Just click on the side of the block you want to remove the paint from, or alternative shift-click the block to remove paint from all sides! ## NEEDS TRANSLATION ## + +#item.openblocks.paintbrush.name=Paint Brush ## NEEDS TRANSLATION ## +#item.openblocks.paintbrush.description=Paint brushes let you paint blocks in whatever color you like!\n\nDab your paint brush in a Paint Can made in the Paint Mixer then click on a block to paint it.\n\nCanvas blocks are perfect for painting, but you can also paint quite a few vanilla blocks and even some blocks from other mods. You can also place stencils on blocks and then paint over the stencil! ## NEEDS TRANSLATION ## + +#item.openblocks.unprepared_stencil.name=Unprepared Stencil ## NEEDS TRANSLATION ## +#item.openblocks.unprepared_stencil.description=Stencils can be placed onto blocks and then painted over using paint brushes!\n\nYou can paint a block using multiple stencils and you can click on them with an empty hand to rotate them.\n\nPlace an Unprepared Stencil in a Drawing table to create different patterns. ## NEEDS TRANSLATION ## + +item.openblocks.crane_backpack.name=Mochila de guindaste +#item.openblocks.crane_backpack.description=In Minecraft world "magnet" is ancient word for "how do this works?".\n\nThis particular piece of very equipment allows you to pick and carry mobs, players, items and blocks. Can be controlled with magnet control. ## NEEDS TRANSLATION ## + +item.openblocks.crane_control.name=Controle do guindaste +#item.openblocks.crane_control.description=This hi-tech wireless remote is used for controlling magnet backpacks.\n\nRight click to raise, Sneak + right click to lower, left click to pick/release.\nBlinking light signals something is under magnet. ## NEEDS TRANSLATION ## + +#item.openblocks.wrench.name=Big Metal Bar ## NEEDS TRANSLATION ## +#item.openblocks.wrench.description=This is extremely sophisticated tool used to perform transformations of objects with octahedral symmetry.\n\n\nOr just big, dumb piece of metal you can use to rotate cubes and stuff.\n\nSo yeah, it's yet another wrench. I'm just trying to be original here, ok? ## NEEDS TRANSLATION ## + +#item.openblocks.stencil.name=Stencil ## NEEDS TRANSLATION ## item.openblocks.crayon.name=Giz de cera mágico item.openblocks.pencil.name=Lapis mágico item.openblocks.glasses.pencil.name=Óculos de lápis item.openblocks.glasses.crayon.name=Óculos de giz de cera item.openblocks.glasses.technicolor.name=Incríveis óculos technicolor item.openblocks.glasses.admin.name=Óculos Fodões -item.openblocks.crane_backpack.name=Mochila de guindaste -item.openblocks.crane_control.name=Controle do guindaste item.openblocks.crane_engine.name=Motor do guindaste item.openblocks.crane_magnet.name=Imã do guindaste item.openblocks.beam.name=Holofote item.openblocks.line.name=Linha item.openblocks.miracle_magnet.name=§5Imã milagroso§r -item.openblocks.slimalyzer.name=Gosmalizador +#item.openblocks.info_book.name=World Domination with OpenBlocks ## NEEDS TRANSLATION ## item.openblocks.xpbucket.name=Balde de experiência -item.openblocks.sleepingbag.name=Saco de Dormir +#item.openblocks.height_map.name=Height Map ## NEEDS TRANSLATION ## +#item.openblocks.empty_map.name=Empty Map ## NEEDS TRANSLATION ## +#item.openblocks.map_controller.name=Map Controller Module ## NEEDS TRANSLATION ## +#item.openblocks.map_memory.name=Map Memory Module ## NEEDS TRANSLATION ## +#item.openblocks.cartographer.name=Cartographer ## NEEDS TRANSLATION ## +#item.openblocks.assistant_base.name=Assistant's base ## NEEDS TRANSLATION ## +#item.openblocks.sketching_pencil.name=Sketching Pencil ## NEEDS TRANSLATION ## +#item.openblocks.tasty_clay.name=Tasty Clay ## NEEDS TRANSLATION ## +#item.openblocks.golden_eye.name=Golden eye ## NEEDS TRANSLATION ## +#item.openblocks.pointer.name=Pointer ## NEEDS TRANSLATION ## +#item.openblocks.tuned_crystal.name=Tuned Crystal ## NEEDS TRANSLATION ## +#item.openblocks.pedometer.name=Pedometer ## NEEDS TRANSLATION ## + +#item.openblocks.wallpaper.name=Wallpaper ## NEEDS TRANSLATION ## itemGroup.tabOpenBlocks=OpenBlocks + +#entity.OpenBlocks.Luggage.name=Luggage ## NEEDS TRANSLATION ## +#entity.OpenBlocks.Cartographer.name=Cartographer ## NEEDS TRANSLATION ## +#entity.OpenBlocks.Block.name=Floating Block ## NEEDS TRANSLATION ## +#entity.OpenBlocks.MiniMe.name=Mini Me ## NEEDS TRANSLATION ## + +#fluid.OpenBlocks.xpjuice=Liquid XP ## NEEDS TRANSLATION ## diff --git a/src/main/resources/assets/openblocks/lang/ru_RU.lang b/src/main/resources/assets/openblocks/lang/ru_RU.lang index ff21e92f..aff855af 100644 --- a/src/main/resources/assets/openblocks/lang/ru_RU.lang +++ b/src/main/resources/assets/openblocks/lang/ru_RU.lang @@ -38,7 +38,6 @@ openblocks.gui.drawingtable=Стол для рисования openblocks.gui.digitalfuse=Цифровой запал openblocks.gui.xp_outputs=Выходы опыта openblocks.gui.item_outputs=Выходы предметов -openblocks.gui.watch_video=Смотреть видео openblocks.gui.max_level=Макс. уровень: %d openblocks.gui.save_folder=Сохранить папку @@ -86,12 +85,14 @@ openblocks.misc.selected_cannon=Выбрана пушка для прицели openblocks.misc.pointed_cannon=Пушка направлена на %s, %s, %s openblocks.misc.change_mode=Изменение режима на %s openblocks.misc.change_size=Изменение размера на %sx%sx%s +#openblocks.misc.change_box_size=Changing size to (%d,%d,%d):(%d,%d,%d) ## NEEDS TRANSLATION ## openblocks.misc.total_blocks=Общее количество блоков: %d openblocks.misc.get_witched=Get witched! openblocks.misc.page=Страница %d из %d openblocks.misc.oh_no_ceiling=Вы не можете спать здесь. Вас беспокоит потолок... openblocks.misc.oh_no_ground=Вы хотите спать на ЭТОМ!? openblocks.misc.sleeping_bag_broken=Предмет недоступен из-за неудавшейся инициализации +#openblocks.misc.inverted=Inverted ## NEEDS TRANSLATION ## openblocks.misc.grave_msg=%s (день: %.1f) @@ -125,12 +126,16 @@ openblocks.misc.shape=Форма: %s openblocks.misc.shape.sphere=Сфера openblocks.misc.shape.cylinder=Цилиндр openblocks.misc.shape.cuboid=Куб +#openblocks.misc.shape.full_cuboid=Full Cuboid ## NEEDS TRANSLATION ## openblocks.misc.shape.dome=Купол openblocks.misc.shape.triangle=Треугольник openblocks.misc.shape.pentagon=Пятиугольник openblocks.misc.shape.hexagon=Шестиугольник openblocks.misc.shape.octagon=Восьмиугольник +#openblocks.misc.shape.axes=Axes ## NEEDS TRANSLATION ## +#openblocks.misc.shape.planes=Planes ## NEEDS TRANSLATION ## +#openblocks.misc.box=Dimensions: (%d,%d,%d):(%d,%d,%d) ## NEEDS TRANSLATION ## openblocks.misc.width=Ширина: %d openblocks.misc.height=Высота: %d openblocks.misc.depth=Глубина: %d @@ -159,7 +164,9 @@ openblocks.misc.command.flim_flam_source=Игрок %s успешно стал openblocks.misc.command.flim_flam_target=Кто-то не любит Вас. Кто-то, у кого есть сила openblocks.misc.command.flim_flam_failed=Не удалось стать братом! openblocks.misc.command.luck_added=Удача изменена для игрока %s, текущая: %d -openblocks.misc.command.luck_current=Удача: %d игрока %s +openblocks.misc.command.luck_current=Удача: %2$d игрока %1$s + +#openblocks.misc.hidden_lore=§a§oHold ALT to see history§r ## NEEDS TRANSLATION ## openblocks.flim_flammed=Что-то странное происходит вокруг Вас openblocks.turtle.magnet=Магнит @@ -197,6 +204,9 @@ tile.openblocks.sponge.description=Губка является заменой о item.openblocks.spongeonastick.name=Губка на палочке item.openblocks.spongeonastick.description=Губка на палочке - это инструмент для очистки жидкостей. Работает, как простая губка, но более мобильна за счёт изнашивания. +#item.openblocks.epic_eraser.name=Epic Eraser ## NEEDS TRANSLATION ## +#item.openblocks.epic_eraser.description=Every item has its own history...\n\nDon't you hate it?\nWith this item you can scrub all traces of epic lore your loot has collected over the years and then sell it on black market without worrying about evidence. ## NEEDS TRANSLATION ## + tile.openblocks.cannon.name=Предметная пушка tile.openblocks.cannon.description=Когда подан сигнал красного камня, предметная пушка будет выстреливать предметы, которые она найдёт в соседнем инвентаре. Используйте 'указатель', чтобы направить пушку. @@ -255,7 +265,7 @@ tile.openblocks.xpbottler.name=Разливщик опыта tile.openblocks.xpbottler.description=Разливщик опыта будет брать жидкий опыт и заливать его в стеклянные бутылки, создавая тем самым зелье опыта. tile.openblocks.autoanvil.name=Автоматическая наковальня -tile.openblocks.autoanvil.description=Автоматическая наковальня работает так же, как и обычная наковальня, но она требует жидкий опыт, и может быть полностью автоматизирована.n\n\В правой части интерфейса Вы можете выбрать, какие стороны наковальни будут использованы для извлечения/помещения жидкостей/предметов. +tile.openblocks.autoanvil.description=Автоматическая наковальня работает так же, как и обычная наковальня, но она требует жидкий опыт, и может быть полностью автоматизирована.n\nВ правой части интерфейса Вы можете выбрать, какие стороны наковальни будут использованы для извлечения/помещения жидкостей/предметов. tile.openblocks.drawingtable.name=Стол для рисования tile.openblocks.drawingtable.description=Стол для рисования нужен для создания трафаретов, которые можно использовать во время рисования. Вставьте неподготовленный трафарет в стол для рисования и выберете нужный Вам трафарет, используя стрелки для выбора! @@ -282,6 +292,7 @@ tile.openblocks.scaffolding.description=Вы когда-нибудь хотел tile.openblocks.goldenegg.name=Золотое яйцо tile.openblocks.digitalfuse.name=Цифровой запал + item.openblocks.cursor.name=Курсор item.openblocks.cursor.description=Курсор позволит Вам нажимать на блоки удалённо.\nПросто нажмите shift-ПКМ по блоку, чтобы соединить курсор, затем примените курсор туда, куда Вы хотите нажать. Будьте осторожны, по умолчанию курсор использует Ваш опыт, количество потребляемого опыта зависит от дальности блока, на который Вы нажимаете. @@ -320,6 +331,9 @@ item.openblocks.crane_backpack.description=В мире Minecraft "магнит" item.openblocks.crane_control.name=Крановое управление item.openblocks.crane_control.description=Этот высокотехнологичный беспроводной пульт используется для управления хранилищами.\n\nПКМ, чтобы поднять, ПКМ, присев, чтобы опустить, ЛКМ, чтобы поднять/отпустить.\nМигающие световые сигналы относятся к магниту. +#item.openblocks.wrench.name=Big Metal Bar ## NEEDS TRANSLATION ## +#item.openblocks.wrench.description=This is extremely sophisticated tool used to perform transformations of objects with octahedral symmetry.\n\n\nOr just big, dumb piece of metal you can use to rotate cubes and stuff.\n\nSo yeah, it's yet another wrench. I'm just trying to be original here, ok? ## NEEDS TRANSLATION ## + item.openblocks.stencil.name=Трафарет item.openblocks.crayon.name=Магический цветной карандаш item.openblocks.pencil.name=Магический карандаш diff --git a/src/main/resources/assets/openblocks/lang/zh_CN.lang b/src/main/resources/assets/openblocks/lang/zh_CN.lang index 80bbd68d..c9529943 100644 --- a/src/main/resources/assets/openblocks/lang/zh_CN.lang +++ b/src/main/resources/assets/openblocks/lang/zh_CN.lang @@ -38,7 +38,6 @@ openblocks.gui.drawingtable=绘图桌 openblocks.gui.digitalfuse=游标 openblocks.gui.xp_outputs=输出经验 openblocks.gui.item_outputs=输出物品 -openblocks.gui.watch_video=观看教学视频 openblocks.gui.max_level=最高附魔等级: %d openblocks.gui.save_folder=打开存档文件夹 @@ -86,12 +85,14 @@ openblocks.misc.selected_cannon=选择加农炮发射目标 openblocks.misc.pointed_cannon=加农炮已瞄准 %s, %s, %s openblocks.misc.change_mode=改变至%s模式 openblocks.misc.change_size=改变规模至 %s x %s x %s +#openblocks.misc.change_box_size=Changing size to (%d,%d,%d):(%d,%d,%d) ## NEEDS TRANSLATION ## openblocks.misc.total_blocks=搭建共需要: %d 个方块 openblocks.misc.get_witched=为之沉迷! openblocks.misc.page=%d / %d 页 openblocks.misc.oh_no_ceiling=你睡意全无,头顶空空荡荡,房子徒有四壁,令你坐立难安... openblocks.misc.oh_no_ground=你居然还想要睡在那上面!? openblocks.misc.sleeping_bag_broken=由于初始化错误,该物品无法生效 +#openblocks.misc.inverted=Inverted ## NEEDS TRANSLATION ## openblocks.misc.grave_msg=%s (天数: %.1f) @@ -125,12 +126,16 @@ openblocks.misc.shape=形状: %s openblocks.misc.shape.sphere=球体 openblocks.misc.shape.cylinder=圆柱 openblocks.misc.shape.cuboid=立方 +#openblocks.misc.shape.full_cuboid=Full Cuboid ## NEEDS TRANSLATION ## openblocks.misc.shape.dome=圆锥 openblocks.misc.shape.triangle=三角形 openblocks.misc.shape.pentagon=五边形 openblocks.misc.shape.hexagon=六边形 openblocks.misc.shape.octagon=八边形 +#openblocks.misc.shape.axes=Axes ## NEEDS TRANSLATION ## +#openblocks.misc.shape.planes=Planes ## NEEDS TRANSLATION ## +#openblocks.misc.box=Dimensions: (%d,%d,%d):(%d,%d,%d) ## NEEDS TRANSLATION ## openblocks.misc.width=宽度: %d openblocks.misc.height=高度: %d openblocks.misc.depth=深度: %d @@ -160,6 +165,8 @@ openblocks.misc.command.flim_flam_target=某个有权限的人不太喜欢你. openblocks.misc.command.flim_flam_failed=欺骗失败! openblocks.misc.command.luck_added=与玩家 %s 交换运气值,当前运气值为: %d openblocks.misc.command.luck_current=玩家 %s 的运气值: %d + +#openblocks.misc.hidden_lore=§a§oHold ALT to see history§r ## NEEDS TRANSLATION ## openblocks.flim_flammed=你周围发生了一些诡异的事. openblocks.turtle.magnet=磁铁 @@ -167,12 +174,17 @@ openblocks.turtle.magnet=磁铁 tile.openblocks.elevator.name=电梯 tile.openblocks.elevator.description=将一个电梯方块在另一个电梯方块正上方三格或以上的位置,中间不能有障碍物.玩家在电梯上跳跃时就会向上传送,蹲下时就向下传送.电梯可以用染料右键染色,相同颜色的电梯才能互相传送玩家. +#tile.openblocks.elevator_rotating.name=Rotating Elevator ## NEEDS TRANSLATION ## + tile.openblocks.heal.name=治愈方块 tile.openblocks.heal.description=只有在创造模式下才能得到治愈方块,它会为站在上方的玩家提供轻微的治疗效果. tile.openblocks.guide.name=建筑指导仪 tile.openblocks.guide.description=提供红石信号,建筑指导仪便会投影出方块轮廓.你可以通过Shift+右键它来改变形状,或者右键它的不同面来增大或减小轮廓.\n创造模式下将黑曜石放在建筑指导仪上,再拿着任何方块右键它,则会自动完成搭建. +#tile.openblocks.builder_guide.name=Enhanced Building Guide ## NEEDS TRANSLATION ## +#tile.openblocks.builder_guide.description=This enhanced version of building guide not only displays ghost blocks to make building easier, but also allows you to place actual blocks. Just click central block with any block stack!\nWhen in creative mode you can place an obsidian block above, then hit the building guide with any block you like to automatically create the shape. ## NEEDS TRANSLATION ## + tile.openblocks.ladder.name=梯子活板门 tile.openblocks.ladder.description=爬梯子遇上活板门时必须跳出去是件麻烦事,但梯子活板门解决了这个问题.梯子活板门可以在打开时起到梯子的作用,让玩家顺着活板门爬上去. @@ -192,6 +204,9 @@ tile.openblocks.sponge.description=这种海绵是原版海绵的重置版.它 item.openblocks.spongeonastick.name=海绵棒 item.openblocks.spongeonastick.description=类似海绵,海绵棒可用于清理一片范围内的液体.但它比海绵更方便,也很容易坏掉. +#item.openblocks.epic_eraser.name=Epic Eraser ## NEEDS TRANSLATION ## +#item.openblocks.epic_eraser.description=Every item has its own history...\n\nDon't you hate it?\nWith this item you can scrub all traces of epic lore your loot has collected over the years and then sell it on black market without worrying about evidence. ## NEEDS TRANSLATION ## + tile.openblocks.cannon.name=投掷加农炮 tile.openblocks.cannon.description=当投掷加农炮接收到红石信号时,投掷加农炮会向指定目标投掷出相邻容器内的物品.你可以使用'指针'工具来给加农炮定位投掷的目标. @@ -277,6 +292,7 @@ tile.openblocks.scaffolding.description=你是否想过通过向脚下垫方块 tile.openblocks.goldenegg.name=金蛋 tile.openblocks.digitalfuse.name=游标 + item.openblocks.cursor.name=游标 item.openblocks.cursor.description=游标可以让你远程控制方块.手持游标Shift右键一个方块就可以建立连接,之后用游标右键空气就控制连接的方块.\n默认设置下,使用游标与方块远程互动会消耗你的经验,距离越远,消耗越多. @@ -315,6 +331,9 @@ item.openblocks.crane_backpack.description=在Minecraft的世界里,磁铁是一 item.openblocks.crane_control.name=起重机控制器 item.openblocks.crane_control.description=这个高科技的无线遥控工具,能用来控制起重机背包.\n右键升起,Shift+右键降低,左键拾取/释放.\n当有光在闪烁时,表示物体正受到磁力影响. +#item.openblocks.wrench.name=Big Metal Bar ## NEEDS TRANSLATION ## +#item.openblocks.wrench.description=This is extremely sophisticated tool used to perform transformations of objects with octahedral symmetry.\n\n\nOr just big, dumb piece of metal you can use to rotate cubes and stuff.\n\nSo yeah, it's yet another wrench. I'm just trying to be original here, ok? ## NEEDS TRANSLATION ## + item.openblocks.stencil.name=模板 item.openblocks.crayon.name=魔法蜡笔 item.openblocks.pencil.name=魔法铅笔 From 644db7b510edb21558cbe8ee8119f7bc4f2102d8 Mon Sep 17 00:00:00 2001 From: Bartek Bok Date: Sat, 9 Apr 2016 22:30:45 +0200 Subject: [PATCH 14/54] Extracting OpenGL helpers to lib --- OpenModsLib | 2 +- src/main/java/openblocks/Config.java | 3 +- .../tileentity/guide/ArraysHelper.java | 98 ------ .../tileentity/guide/BufferHelper.java | 96 ----- .../guide/GuideAdvancedRenderer.java | 25 +- .../tileentity/guide/GuideLegacyRenderer.java | 9 +- .../guide/GuideRendererSelector.java | 60 ++++ .../tileentity/guide/MarkerRenderer.java | 78 ++--- .../tileentity/guide/ShaderHelper.java | 328 ------------------ .../tileentity/guide/ShaderProgram.java | 157 --------- .../guide/TileEntityGuideRenderer.java | 59 +--- .../common/tileentity/TileEntityGuide.java | 5 +- .../java/openblocks/shapes/CoordShape.java | 39 +-- .../assets/openblocks/shaders/shader.frag | 1 - .../assets/openblocks/shaders/shader.vert | 2 +- 15 files changed, 136 insertions(+), 826 deletions(-) delete mode 100644 src/main/java/openblocks/client/renderer/tileentity/guide/ArraysHelper.java delete mode 100644 src/main/java/openblocks/client/renderer/tileentity/guide/BufferHelper.java create mode 100644 src/main/java/openblocks/client/renderer/tileentity/guide/GuideRendererSelector.java delete mode 100644 src/main/java/openblocks/client/renderer/tileentity/guide/ShaderHelper.java delete mode 100644 src/main/java/openblocks/client/renderer/tileentity/guide/ShaderProgram.java diff --git a/OpenModsLib b/OpenModsLib index e9d0a93c..2f4979df 160000 --- a/OpenModsLib +++ b/OpenModsLib @@ -1 +1 @@ -Subproject commit e9d0a93c34bba4dcf8ba9c07f87f2cbe90c860e4 +Subproject commit 2f4979df4e49b1e8760810e08ea4a3a17444267a diff --git a/src/main/java/openblocks/Config.java b/src/main/java/openblocks/Config.java index 09614102..0b5bf884 100644 --- a/src/main/java/openblocks/Config.java +++ b/src/main/java/openblocks/Config.java @@ -308,8 +308,7 @@ public class Config { @OnLineModifiable @ConfigProperty(category = "guide", name = "renderDistanceSq", comment = "Square of guide maximum render distance") public static double guideRenderRangeSq = 256 * 256; - - @OnLineModifiable + @ConfigProperty(category = "guide", name = "useAdvancedRenderer", comment = "Try to use advanced OpenGL for performance improvement") public static boolean useAdvancedRenderer = true; diff --git a/src/main/java/openblocks/client/renderer/tileentity/guide/ArraysHelper.java b/src/main/java/openblocks/client/renderer/tileentity/guide/ArraysHelper.java deleted file mode 100644 index 60d687fd..00000000 --- a/src/main/java/openblocks/client/renderer/tileentity/guide/ArraysHelper.java +++ /dev/null @@ -1,98 +0,0 @@ -package openblocks.client.renderer.tileentity.guide; - -import org.lwjgl.opengl.ARBDrawInstanced; -import org.lwjgl.opengl.ARBInstancedArrays; -import org.lwjgl.opengl.ARBVertexArrayObject; -import org.lwjgl.opengl.ContextCapabilities; -import org.lwjgl.opengl.GL30; -import org.lwjgl.opengl.GL31; -import org.lwjgl.opengl.GL33; -import org.lwjgl.opengl.GLContext; - -public class ArraysHelper { - static { - initialize(); - } - - public static IArrayMethods methods; - - static void initialize() { - ContextCapabilities caps = GLContext.getCapabilities(); - if (GLArrayMethods.isSupported(caps)) - methods = new GLArrayMethods(); - else if (ARBArrayMethods.isSupported(caps)) - methods = new ARBArrayMethods(); - } - - public static boolean isSupported() { - return methods != null; - } - - public static IArrayMethods methods() { - return methods; - } - - public static interface IArrayMethods { - public int glGenVertexArrays(); - - public void glBindVertexArray(int array); - - public void glVertexAttribDivisor(int index, int divisor); - - public void glDrawArraysInstanced(int mode, int first, int count, int primcount); - } - - private static class GLArrayMethods implements IArrayMethods { - - public static boolean isSupported(ContextCapabilities caps) { - return caps.OpenGL33; - } - - @Override - public int glGenVertexArrays() { - return GL30.glGenVertexArrays(); - } - - @Override - public void glBindVertexArray(int array) { - GL30.glBindVertexArray(array); - } - - @Override - public void glVertexAttribDivisor(int index, int divisor) { - GL33.glVertexAttribDivisor(index, divisor); - } - - @Override - public void glDrawArraysInstanced(int mode, int first, int count, int primcount) { - GL31.glDrawArraysInstanced(mode, first, count, primcount); - } - } - - private static class ARBArrayMethods implements IArrayMethods { - - public static boolean isSupported(ContextCapabilities caps) { - return caps.GL_ARB_instanced_arrays && caps.GL_ARB_vertex_array_object; - } - - @Override - public int glGenVertexArrays() { - return ARBVertexArrayObject.glGenVertexArrays(); - } - - @Override - public void glBindVertexArray(int array) { - ARBVertexArrayObject.glBindVertexArray(array); - } - - @Override - public void glVertexAttribDivisor(int index, int divisor) { - ARBInstancedArrays.glVertexAttribDivisorARB(index, divisor); - } - - @Override - public void glDrawArraysInstanced(int mode, int first, int count, int primcount) { - ARBDrawInstanced.glDrawArraysInstancedARB(mode, first, count, primcount); - } - } -} diff --git a/src/main/java/openblocks/client/renderer/tileentity/guide/BufferHelper.java b/src/main/java/openblocks/client/renderer/tileentity/guide/BufferHelper.java deleted file mode 100644 index e7d5373b..00000000 --- a/src/main/java/openblocks/client/renderer/tileentity/guide/BufferHelper.java +++ /dev/null @@ -1,96 +0,0 @@ -package openblocks.client.renderer.tileentity.guide; - -import java.nio.ByteBuffer; - -import org.lwjgl.opengl.ARBBufferObject; -import org.lwjgl.opengl.ContextCapabilities; -import org.lwjgl.opengl.GL15; -import org.lwjgl.opengl.GLContext; - -public class BufferHelper { - static { - initialize(); - } - - public static IBufferMethods methods; - - static void initialize() { - ContextCapabilities caps = GLContext.getCapabilities(); - if (GLBufferMethods.isSupported(caps)) - methods = new GLBufferMethods(); - else if (ARBBufferMethods.isSupported(caps)) - methods = new ARBBufferMethods(); - } - - public static boolean isSupported() { - return methods != null; - } - - public static IBufferMethods methods() { - return methods; - } - - public static interface IBufferMethods { - public int glGenBuffers(); - - public void glBindBuffer(int target, int buffer); - - public void glBufferData(int target, ByteBuffer data, int usage); - - public void glDeleteBuffers(int buffer); - } - - private static class GLBufferMethods implements IBufferMethods { - - public static boolean isSupported(ContextCapabilities caps) { - return caps.OpenGL15; - } - - @Override - public int glGenBuffers() { - return GL15.glGenBuffers(); - } - - @Override - public void glBindBuffer(int target, int buffer) { - GL15.glBindBuffer(target, buffer); - } - - @Override - public void glBufferData(int target, ByteBuffer data, int usage) { - GL15.glBufferData(target, data, usage); - } - - @Override - public void glDeleteBuffers(int buffer) { - GL15.glDeleteBuffers(buffer); - } - } - - private static class ARBBufferMethods implements IBufferMethods { - - public static boolean isSupported(ContextCapabilities caps) { - return caps.OpenGL15; - } - - @Override - public int glGenBuffers() { - return ARBBufferObject.glGenBuffersARB(); - } - - @Override - public void glBindBuffer(int target, int buffer) { - ARBBufferObject.glBindBufferARB(target, buffer); - } - - @Override - public void glBufferData(int target, ByteBuffer data, int usage) { - ARBBufferObject.glBufferDataARB(target, data, usage); - } - - @Override - public void glDeleteBuffers(int buffer) { - ARBBufferObject.glDeleteBuffersARB(buffer); - } - } -} \ No newline at end of file diff --git a/src/main/java/openblocks/client/renderer/tileentity/guide/GuideAdvancedRenderer.java b/src/main/java/openblocks/client/renderer/tileentity/guide/GuideAdvancedRenderer.java index 828ef4dc..4fc80c58 100644 --- a/src/main/java/openblocks/client/renderer/tileentity/guide/GuideAdvancedRenderer.java +++ b/src/main/java/openblocks/client/renderer/tileentity/guide/GuideAdvancedRenderer.java @@ -1,35 +1,30 @@ package openblocks.client.renderer.tileentity.guide; -import org.lwjgl.opengl.GL11; - import openblocks.common.tileentity.TileEntityGuide; import openblocks.shapes.CoordShape; import openmods.utils.TextureUtils; +import org.lwjgl.opengl.GL11; + public class GuideAdvancedRenderer implements IGuideRenderer { - static MarkerRenderer mr; + private final MarkerRenderer mr; public GuideAdvancedRenderer(Runnable marker) throws Exception { - if (mr == null) - mr = new MarkerRenderer(marker); + this.mr = new MarkerRenderer(marker); } @Override public void renderShape(TileEntityGuide guide) { - float scaleDelta = guide.getTimeSinceChange(); renderShape(guide.getShape(), guide.getColor(), scaleDelta); - if (scaleDelta < 1.0) - renderShape(guide.getPreviousShape(), guide.getColor(), 1.0f - scaleDelta); + if (scaleDelta < 1.0) renderShape(guide.getPreviousShape(), guide.getColor(), 1.0f - scaleDelta); CoordShape toDelete = guide.getAndDeleteShape(); - if (toDelete != null && mr != null) - mr.deleteShape(toDelete); + if (toDelete != null && mr != null) mr.deleteShape(toDelete); } private void renderShape(CoordShape shape, int color, float scale) { - if (shape == null) - return; + if (shape == null) return; TextureUtils.bindDefaultTerrainTexture(); @@ -37,14 +32,12 @@ public class GuideAdvancedRenderer implements IGuideRenderer { GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE); GL11.glDisable(GL11.GL_LIGHTING); - if (mr != null) - mr.drawInstanced(shape, color, scale); + mr.drawInstanced(shape, color, scale); GL11.glEnable(GL11.GL_LIGHTING); GL11.glDisable(GL11.GL_BLEND); } @Override - public void onTextureChange() { - } + public void onTextureChange() {} } diff --git a/src/main/java/openblocks/client/renderer/tileentity/guide/GuideLegacyRenderer.java b/src/main/java/openblocks/client/renderer/tileentity/guide/GuideLegacyRenderer.java index 3beaf7aa..bd3a783c 100644 --- a/src/main/java/openblocks/client/renderer/tileentity/guide/GuideLegacyRenderer.java +++ b/src/main/java/openblocks/client/renderer/tileentity/guide/GuideLegacyRenderer.java @@ -1,7 +1,5 @@ package openblocks.client.renderer.tileentity.guide; -import org.lwjgl.opengl.GL11; - import net.minecraft.client.renderer.Tessellator; import openblocks.common.tileentity.TileEntityGuide; import openblocks.shapes.CoordShape; @@ -9,6 +7,8 @@ import openmods.renderer.DisplayListWrapper; import openmods.utils.Coord; import openmods.utils.TextureUtils; +import org.lwjgl.opengl.GL11; + public class GuideLegacyRenderer implements IGuideRenderer { private DisplayListWrapper wrapper; @@ -38,12 +38,11 @@ public class GuideLegacyRenderer implements IGuideRenderer { } private void renderShape(CoordShape shape, int color, float scale) { - if (shape == null) - return; + if (shape == null) return; TextureUtils.bindDefaultTerrainTexture(); - GL11.glColor3ub((byte) (color >> 16), (byte) (color >> 8), (byte) (color >> 0)); + GL11.glColor3ub((byte)(color >> 16), (byte)(color >> 8), (byte)(color >> 0)); GL11.glEnable(GL11.GL_BLEND); GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE); GL11.glDisable(GL11.GL_LIGHTING); diff --git a/src/main/java/openblocks/client/renderer/tileentity/guide/GuideRendererSelector.java b/src/main/java/openblocks/client/renderer/tileentity/guide/GuideRendererSelector.java new file mode 100644 index 00000000..99581788 --- /dev/null +++ b/src/main/java/openblocks/client/renderer/tileentity/guide/GuideRendererSelector.java @@ -0,0 +1,60 @@ +package openblocks.client.renderer.tileentity.guide; + +import net.minecraft.client.renderer.RenderBlocks; +import net.minecraft.client.renderer.Tessellator; +import openblocks.Config; +import openblocks.OpenBlocks; +import openblocks.common.block.BlockGuide.Icons; +import openmods.Log; +import openmods.renderer.shaders.ArraysHelper; +import openmods.renderer.shaders.BufferHelper; +import openmods.renderer.shaders.ShaderHelper; + +public class GuideRendererSelector { + + private static Runnable createMarkerRenderer() { + return new Runnable() { + @Override + public void run() { + Tessellator t = Tessellator.instance; + RenderBlocks renderBlocks = new RenderBlocks(); + renderBlocks.setRenderBounds(0.05D, 0.05D, 0.05D, 0.95D, 0.95D, 0.95D); + t.startDrawingQuads(); + t.setBrightness(200); + renderBlocks.renderFaceXNeg(OpenBlocks.Blocks.guide, -0.5D, 0.0D, -0.5D, Icons.marker); + renderBlocks.renderFaceXPos(OpenBlocks.Blocks.guide, -0.5D, 0.0D, -0.5D, Icons.marker); + renderBlocks.renderFaceYNeg(OpenBlocks.Blocks.guide, -0.5D, 0.0D, -0.5D, Icons.marker); + renderBlocks.renderFaceYPos(OpenBlocks.Blocks.guide, -0.5D, 0.0D, -0.5D, Icons.marker); + renderBlocks.renderFaceZNeg(OpenBlocks.Blocks.guide, -0.5D, 0.0D, -0.5D, Icons.marker); + renderBlocks.renderFaceZPos(OpenBlocks.Blocks.guide, -0.5D, 0.0D, -0.5D, Icons.marker); + // important: don't draw! + } + }; + } + + private static IGuideRenderer createRenderer() { + final Runnable marker = createMarkerRenderer(); + if (!ShaderHelper.isSupported() || !BufferHelper.isSupported() || !ArraysHelper.isSupported()) { + Log.debug("Advanced guide renderer not supported, falling back to legacy renderer."); + return new GuideLegacyRenderer(marker); // advanced renderer not supported :( + } else if (Config.useAdvancedRenderer == false) { + Log.debug("Advanced guide renderer disabled, falling back to legacy renderer."); + return new GuideLegacyRenderer(marker); + } else { + try { + return new GuideAdvancedRenderer(marker); // try to use the advanced renderer + } catch (Exception e) { + Log.warn(e, "Error trying to create advanced renderer, falling back to legacy renderer"); + return new GuideLegacyRenderer(marker); // fall back to the old renderer. + } + } + } + + private static IGuideRenderer renderer; + + public IGuideRenderer getRenderer() { + if (renderer == null) renderer = createRenderer(); + return renderer; + } + +} diff --git a/src/main/java/openblocks/client/renderer/tileentity/guide/MarkerRenderer.java b/src/main/java/openblocks/client/renderer/tileentity/guide/MarkerRenderer.java index 742eb690..fb4bf34d 100644 --- a/src/main/java/openblocks/client/renderer/tileentity/guide/MarkerRenderer.java +++ b/src/main/java/openblocks/client/renderer/tileentity/guide/MarkerRenderer.java @@ -3,40 +3,39 @@ package openblocks.client.renderer.tileentity.guide; import java.nio.ByteBuffer; import java.nio.IntBuffer; -import org.lwjgl.opengl.GL11; -import org.lwjgl.opengl.GL13; -import org.lwjgl.opengl.GL15; -import org.lwjgl.opengl.GL20; - import net.minecraft.client.renderer.GLAllocation; import net.minecraft.client.renderer.OpenGlHelper; import net.minecraft.client.renderer.Tessellator; import net.minecraft.client.shader.TesselatorVertexState; import net.minecraft.util.ResourceLocation; import openblocks.shapes.CoordShape; +import openmods.renderer.shaders.*; + +import org.lwjgl.opengl.*; public class MarkerRenderer { private static final ResourceLocation vertexSource = new ResourceLocation("openblocks:shaders/shader.vert"); private static final ResourceLocation fragmentSource = new ResourceLocation("openblocks:shaders/shader.frag"); - private ShaderProgram shader; + private final ShaderProgram shader; - private static int nativeBufferSize = 0x200000; - private static ByteBuffer byteBuffer = GLAllocation.createDirectByteBuffer(nativeBufferSize * 4); - private static IntBuffer intBuffer = byteBuffer.asIntBuffer(); + private static final int nativeBufferSize = 0x200000; + private static final ByteBuffer byteBuffer = GLAllocation.createDirectByteBuffer(nativeBufferSize * 4); + private static final IntBuffer intBuffer = byteBuffer.asIntBuffer(); - Runnable model; + private final Runnable model; private boolean initialized = false; - private int vertexCount, vao; + private int vertexCount; + private int vao; public MarkerRenderer(Runnable model) throws Exception { - shader = new ShaderProgram(); - shader.addShader(vertexSource, GL20.GL_VERTEX_SHADER); - shader.addShader(fragmentSource, GL20.GL_FRAGMENT_SHADER); - shader.compile(); - this.model = model; + + final ShaderProgramBuilder shaderProgramBuilder = new ShaderProgramBuilder(); + shaderProgramBuilder.addShader(vertexSource, GL20.GL_VERTEX_SHADER); + shaderProgramBuilder.addShader(fragmentSource, GL20.GL_FRAGMENT_SHADER); + this.shader = shaderProgramBuilder.build(); } public void createVAO() { @@ -44,17 +43,14 @@ public class MarkerRenderer { TesselatorVertexState state = Tessellator.instance.getVertexState(0, 0, 0); Tessellator.instance.draw(); // just discard the state this way. - if (state.getRawBuffer().length > nativeBufferSize) - throw new UnsupportedOperationException("Big buffers not supported!"); + if (state.getRawBuffer().length > nativeBufferSize) throw new UnsupportedOperationException("Big buffers not supported!"); vertexCount = state.getVertexCount(); - { - intBuffer.clear(); - intBuffer.put(state.getRawBuffer(), 0, vertexCount * 8); - byteBuffer.position(0); - byteBuffer.limit(vertexCount * 32); - } + intBuffer.clear(); + intBuffer.put(state.getRawBuffer(), 0, vertexCount * 8); + byteBuffer.position(0); + byteBuffer.limit(vertexCount * 32); vao = ArraysHelper.methods().glGenVertexArrays(); ArraysHelper.methods().glBindVertexArray(vao); @@ -65,50 +61,34 @@ public class MarkerRenderer { BufferHelper.methods().glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo); BufferHelper.methods().glBufferData(GL15.GL_ARRAY_BUFFER, byteBuffer, GL15.GL_STATIC_DRAW); - { - shader.attributePointer("aVertex", 3, GL11.GL_FLOAT, false, 32, 0); - shader.attributePointer("aTexCoord", 2, GL11.GL_FLOAT, false, 32, 12); - shader.attributePointer("aColor", 4, GL11.GL_UNSIGNED_BYTE, false, 32, 20); - shader.attributePointer("aBrightnessCoord", 2, GL11.GL_SHORT, false, 32, 28); - } + shader.attributePointer("aVertex", 3, GL11.GL_FLOAT, false, 32, 0); + shader.attributePointer("aTexCoord", 2, GL11.GL_FLOAT, false, 32, 12); + shader.attributePointer("aColor", 4, GL11.GL_UNSIGNED_BYTE, false, 32, 20); + shader.attributePointer("aBrightnessCoord", 2, GL11.GL_SHORT, false, 32, 28); BufferHelper.methods().glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); - shader.uniform1f("uHasTexture", state.getHasTexture() ? 1f : 0f); - shader.uniform1f("uHasColor", state.getHasColor() ? 1f : 0f); - shader.uniform1f("uHasBrightness", state.getHasBrightness() ? 1f : 0f); + shader.uniform1f("uHasTexture", state.getHasTexture()? 1f : 0f); + shader.uniform1f("uHasColor", state.getHasColor()? 1f : 0f); + shader.uniform1f("uHasBrightness", state.getHasBrightness()? 1f : 0f); shader.uniform1i("uDefaultTexture", OpenGlHelper.defaultTexUnit - GL13.GL_TEXTURE0); shader.uniform1i("uLightmapTexture", OpenGlHelper.lightmapTexUnit - GL13.GL_TEXTURE0); byteBuffer.position(0); - ArraysHelper.methods().glBindVertexArray(0); + ArraysHelper.methods().glBindVertexArray(0); initialized = true; } - public void draw() { - shader.bind(); - if (!initialized) - createVAO(); - ArraysHelper.methods().glBindVertexArray(vao); - GL11.glDrawArrays(GL11.GL_QUADS, 0, vertexCount); - ArraysHelper.methods().glBindVertexArray(0); - shader.release(); - } - public void drawInstanced(CoordShape shape, int color, float scale) { shader.bind(); - if (!initialized) - createVAO(); + if (!initialized) createVAO(); ArraysHelper.methods().glBindVertexArray(vao); - shape.bindVBO(); shader.instanceAttributePointer("aPosition", 3, GL11.GL_INT, false, 0, 0); BufferHelper.methods().glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); - shader.uniform3f("uColor", ((color >> 16) & 0xFF) / 255f, ((color >> 8) & 0xFF) / 255f, (color & 0xFF) / 255f); shader.uniform1f("uScale", scale); - ArraysHelper.methods().glDrawArraysInstanced(GL11.GL_QUADS, 0, vertexCount, shape.size()); ArraysHelper.methods().glBindVertexArray(0); diff --git a/src/main/java/openblocks/client/renderer/tileentity/guide/ShaderHelper.java b/src/main/java/openblocks/client/renderer/tileentity/guide/ShaderHelper.java deleted file mode 100644 index 815e1a4a..00000000 --- a/src/main/java/openblocks/client/renderer/tileentity/guide/ShaderHelper.java +++ /dev/null @@ -1,328 +0,0 @@ -package openblocks.client.renderer.tileentity.guide; - -import org.lwjgl.opengl.ARBShaderObjects; -import org.lwjgl.opengl.ARBVertexShader; -import org.lwjgl.opengl.ContextCapabilities; -import org.lwjgl.opengl.GL20; -import org.lwjgl.opengl.GLContext; - -public class ShaderHelper { - /** - * Class for shader functions, calling ARB methods if GL20 is not supported - * A lot of this is already implemented in OpenGlHelper, but it misses some - * methods and is confusing in general. - */ - - static { - initialize(); - } - - public static IShaderMethods methods; - - static void initialize() { - ContextCapabilities caps = GLContext.getCapabilities(); - - if (GL20ShaderMethods.isSupported(caps)) - methods = new GL20ShaderMethods(); - else if (ARBShaderMethods.isSupported(caps)) - methods = new ARBShaderMethods(); - } - - public static boolean isSupported() { - return methods != null; - } - - public static IShaderMethods methods() { - return methods; - } - - public static interface IShaderMethods { - public int glCreateProgram(); - - public int glCreateShader(int type); - - public void glAttachShader(int program, int shader); - - public void glDetachShader(int program, int shader); - - public void glLinkProgram(int program); - - public void glValidateProgram(int program); - - public void glDeleteProgram(int program); - - public void glDeleteShader(int shader); - - public int glGetProgrami(int shader, int parameter); - - public int glGetShaderi(int program, int parameter); - - public String getProgramLogInfo(int program); - - public String getShaderLogInfo(int shader); - - public void glUseProgram(int program); - - public void glShaderSource(int shader, String shaderSource); - - public void glCompileShader(int shader); - - public int glGetUniformLocation(int program, String uniform); - - public void glUniform1i(int loc, int val); - - public void glUniform1f(int loc, float val); - - public void glUniform3f(int loc, float x, float y, float z); - - public int glGetAttribLocation(int program, String attrib); - - public void glEnableVertexAttribArray(int index); - - public void glDisableVertexAttribArray(int index); - - public void glVertexAttribPointer(int index, int size, int type, boolean normalized, int stride, long offset); - } - - private static class GL20ShaderMethods implements IShaderMethods { - public static boolean isSupported(ContextCapabilities caps) { - return caps.OpenGL20; - } - - @Override - public int glCreateProgram() { - return GL20.glCreateProgram(); - } - - @Override - public int glCreateShader(int type) { - return GL20.glCreateShader(type); - } - - @Override - public void glAttachShader(int program, int shader) { - GL20.glAttachShader(program, shader); - } - - @Override - public void glDetachShader(int program, int shader) { - GL20.glDetachShader(program, shader); - } - - @Override - public void glLinkProgram(int program) { - GL20.glLinkProgram(program); - } - - @Override - public void glValidateProgram(int program) { - GL20.glValidateProgram(program); - } - - @Override - public void glDeleteProgram(int program) { - GL20.glDeleteProgram(program); - } - - @Override - public void glDeleteShader(int shader) { - GL20.glDeleteShader(shader); - } - - @Override - public int glGetProgrami(int program, int parameter) { - return GL20.glGetProgrami(program, parameter); - } - - @Override - public int glGetShaderi(int shader, int parameter) { - return GL20.glGetShaderi(shader, parameter); - } - - @Override - public String getProgramLogInfo(int program) { - return GL20.glGetProgramInfoLog(program, glGetProgrami(program, GL20.GL_INFO_LOG_LENGTH)); - } - - @Override - public String getShaderLogInfo(int shader) { - return GL20.glGetShaderInfoLog(shader, glGetShaderi(shader, GL20.GL_INFO_LOG_LENGTH)); - } - - @Override - public void glUseProgram(int program) { - GL20.glUseProgram(program); - } - - @Override - public void glShaderSource(int shader, String shaderSource) { - GL20.glShaderSource(shader, shaderSource); - } - - @Override - public void glCompileShader(int shader) { - GL20.glCompileShader(shader); - } - - @Override - public int glGetUniformLocation(int program, String uniform) { - return GL20.glGetUniformLocation(program, uniform); - } - - @Override - public void glUniform1i(int loc, int val) { - GL20.glUniform1i(loc, val); - } - - @Override - public void glUniform1f(int loc, float val) { - GL20.glUniform1f(loc, val); - } - - @Override - public void glUniform3f(int loc, float x, float y, float z) { - GL20.glUniform3f(loc, x, y, z); - } - - @Override - public int glGetAttribLocation(int program, String attrib) { - return GL20.glGetAttribLocation(program, attrib); - } - - @Override - public void glEnableVertexAttribArray(int index) { - GL20.glEnableVertexAttribArray(index); - } - - @Override - public void glDisableVertexAttribArray(int index) { - GL20.glDisableVertexAttribArray(index); - } - - @Override - public void glVertexAttribPointer(int index, int size, int type, boolean normalized, int stride, long offset) { - GL20.glVertexAttribPointer(index, size, type, normalized, stride, offset); - } - } - - private static class ARBShaderMethods implements IShaderMethods { - public static boolean isSupported(ContextCapabilities caps) { - return caps.GL_ARB_shader_objects && caps.GL_ARB_vertex_shader && caps.GL_ARB_fragment_shader; - } - - @Override - public int glCreateProgram() { - return ARBShaderObjects.glCreateProgramObjectARB(); - } - - @Override - public int glCreateShader(int type) { - return ARBShaderObjects.glCreateShaderObjectARB(type); - } - - @Override - public void glAttachShader(int program, int shader) { - ARBShaderObjects.glAttachObjectARB(program, shader); - } - - @Override - public void glDetachShader(int program, int shader) { - ARBShaderObjects.glDetachObjectARB(program, shader); - } - - @Override - public void glLinkProgram(int program) { - ARBShaderObjects.glLinkProgramARB(program); - } - - @Override - public void glValidateProgram(int program) { - ARBShaderObjects.glValidateProgramARB(program); - } - - @Override - public void glDeleteProgram(int program) { - ARBShaderObjects.glDeleteObjectARB(program); - } - - @Override - public void glDeleteShader(int shader) { - ARBShaderObjects.glDeleteObjectARB(shader); - } - - @Override - public int glGetProgrami(int program, int parameter) { - return ARBShaderObjects.glGetObjectParameteriARB(program, parameter); - } - - @Override - public int glGetShaderi(int shader, int parameter) { - return ARBShaderObjects.glGetObjectParameteriARB(shader, parameter); - } - - @Override - public String getProgramLogInfo(int program) { - return ARBShaderObjects.glGetInfoLogARB(program, glGetProgrami(program, GL20.GL_INFO_LOG_LENGTH)); - } - - @Override - public String getShaderLogInfo(int shader) { - return ARBShaderObjects.glGetInfoLogARB(shader, glGetShaderi(shader, GL20.GL_INFO_LOG_LENGTH)); - } - - @Override - public void glUseProgram(int program) { - ARBShaderObjects.glUseProgramObjectARB(program); - } - - @Override - public void glShaderSource(int shader, String shaderSource) { - ARBShaderObjects.glShaderSourceARB(shader, shaderSource); - } - - @Override - public void glCompileShader(int shader) { - ARBShaderObjects.glCompileShaderARB(shader); - } - - @Override - public int glGetUniformLocation(int program, String uniform) { - return ARBShaderObjects.glGetUniformLocationARB(program, uniform); - } - - @Override - public void glUniform1i(int loc, int val) { - ARBShaderObjects.glUniform1iARB(loc, val); - } - - @Override - public void glUniform1f(int loc, float val) { - ARBShaderObjects.glUniform1fARB(loc, val); - } - - @Override - public void glUniform3f(int loc, float x, float y, float z) { - ARBShaderObjects.glUniform3fARB(loc, x, y, z); - } - - @Override - public int glGetAttribLocation(int program, String attrib) { - return ARBVertexShader.glGetAttribLocationARB(program, attrib); - } - - @Override - public void glEnableVertexAttribArray(int index) { - ARBVertexShader.glEnableVertexAttribArrayARB(index); - } - - @Override - public void glDisableVertexAttribArray(int index) { - ARBVertexShader.glDisableVertexAttribArrayARB(index); - } - - @Override - public void glVertexAttribPointer(int index, int size, int type, boolean normalized, int stride, long offset) { - ARBVertexShader.glVertexAttribPointerARB(index, size, type, normalized, stride, offset); - } - } -} diff --git a/src/main/java/openblocks/client/renderer/tileentity/guide/ShaderProgram.java b/src/main/java/openblocks/client/renderer/tileentity/guide/ShaderProgram.java deleted file mode 100644 index 44c6a32d..00000000 --- a/src/main/java/openblocks/client/renderer/tileentity/guide/ShaderProgram.java +++ /dev/null @@ -1,157 +0,0 @@ -package openblocks.client.renderer.tileentity.guide; - -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.util.ArrayList; -import java.util.HashMap; - -import org.lwjgl.opengl.GL11; -import org.lwjgl.opengl.GL20; -import org.lwjgl.opengl.OpenGLException; - -import net.minecraft.client.Minecraft; -import net.minecraft.util.ResourceLocation; -import openmods.utils.io.FileLineReader; -import openmods.utils.io.ILineReadMethod; - -public class ShaderProgram { - protected ArrayList shaders; - protected int program; - protected boolean compiled; - - protected HashMap uniforms; - - public ShaderProgram() { - shaders = new ArrayList(); - compiled = false; - uniforms = new HashMap(); - } - - public void bind() { - if (compiled) - ShaderHelper.methods().glUseProgram(program); - } - - public void release() { - ShaderHelper.methods().glUseProgram(0); - } - - public void addShader(ResourceLocation source, int type) throws Exception { - if (compiled) - throw new UnsupportedOperationException("Shader already compiled"); - - int shader = createShader(source, type); - if (shader != 0) - shaders.add(shader); - } - - public void compile() { - if (compiled) - throw new UnsupportedOperationException("Shader already compiled"); - - program = ShaderHelper.methods().glCreateProgram(); - if (program == 0) - throw new OpenGLException("Error creating program object"); - - for (Integer shader : shaders) - ShaderHelper.methods().glAttachShader(program, shader); - ShaderHelper.methods().glLinkProgram(program); - if (ShaderHelper.methods().glGetProgrami(program, GL20.GL_LINK_STATUS) == GL11.GL_FALSE) - throw new OpenGLException("Shader link error: " + ShaderHelper.methods().getProgramLogInfo(program)); - - for (Integer shader : shaders) - ShaderHelper.methods().glDetachShader(program, shader); - ShaderHelper.methods().glValidateProgram(program); - if (ShaderHelper.methods().glGetProgrami(program, GL20.GL_VALIDATE_STATUS) == GL11.GL_FALSE) - throw new OpenGLException("Shader validate error: " + ShaderHelper.methods().getProgramLogInfo(program)); - - compiled = true; - } - - public void destroy() { - for (Integer shader : shaders) - ShaderHelper.methods().glDeleteShader(shader); - ShaderHelper.methods().glUseProgram(0); - ShaderHelper.methods().glDeleteProgram(program); - } - - private int createShader(ResourceLocation source, int type) throws Exception { - int shader = 0; - try { - shader = ShaderHelper.methods().glCreateShader(type); - - if (shader == 0) - throw new OpenGLException("Error creating shader object"); - - ShaderHelper.methods().glShaderSource(shader, readShaderSource(source)); - ShaderHelper.methods().glCompileShader(shader); - if (ShaderHelper.methods().glGetShaderi(shader, GL20.GL_COMPILE_STATUS) == GL11.GL_FALSE) - throw new OpenGLException("Shader compile error: " + ShaderHelper.methods().getShaderLogInfo(shader)); - - return shader; - } catch (Exception exc) { - ShaderHelper.methods().glDeleteShader(shader); - throw exc; - } - } - - private String readShaderSource(ResourceLocation source) throws IOException { - InputStream is = Minecraft.getMinecraft().getResourceManager().getResource(source).getInputStream(); - BufferedReader reader = new BufferedReader(new InputStreamReader(is)); - final StringBuilder out = new StringBuilder(); - - FileLineReader.readLineByLine(reader, new ILineReadMethod() { - @Override - public void read(String line) { - out.append(line).append('\n'); - } - }); - - return out.toString(); - } - - public int getUniformLocation(String uniform) { - Integer loc = uniforms.get(uniform); - if (loc == null) { - loc = ShaderHelper.methods().glGetUniformLocation(program, uniform); - uniforms.put(uniform, loc); - } - return loc; - } - - public void uniform1i(String name, int val) { - ShaderHelper.methods().glUniform1i(getUniformLocation(name), val); - } - - public void uniform1f(String name, float val) { - ShaderHelper.methods().glUniform1f(getUniformLocation(name), val); - } - - public void uniform3f(String name, float x, float y, float z) { - ShaderHelper.methods().glUniform3f(getUniformLocation(name), x, y, z); - } - - public int getProgram() { - return program; - } - - public void instanceAttributePointer(String attrib, int size, int type, boolean normalized, int stride, long offset) { - instanceAttributePointer(ShaderHelper.methods().glGetAttribLocation(program, attrib), size, type, normalized, stride, offset); - } - - public void instanceAttributePointer(int index, int size, int type, boolean normalized, int stride, long offset) { - attributePointer(index, size, type, normalized, stride, offset); - ArraysHelper.methods().glVertexAttribDivisor(index, 1); - } - - public void attributePointer(String attrib, int size, int type, boolean normalized, int stride, long offset) { - attributePointer(ShaderHelper.methods().glGetAttribLocation(program, attrib), size, type, normalized, stride, offset); - } - - public void attributePointer(int index, int size, int type, boolean normalized, int stride, long offset) { - ShaderHelper.methods().glVertexAttribPointer(index, size, type, normalized, stride, offset); - ShaderHelper.methods().glEnableVertexAttribArray(index); - } -} diff --git a/src/main/java/openblocks/client/renderer/tileentity/guide/TileEntityGuideRenderer.java b/src/main/java/openblocks/client/renderer/tileentity/guide/TileEntityGuideRenderer.java index ffab950a..9a362ae9 100644 --- a/src/main/java/openblocks/client/renderer/tileentity/guide/TileEntityGuideRenderer.java +++ b/src/main/java/openblocks/client/renderer/tileentity/guide/TileEntityGuideRenderer.java @@ -1,60 +1,23 @@ package openblocks.client.renderer.tileentity.guide; -import org.lwjgl.opengl.GL11; - -import cpw.mods.fml.common.eventhandler.SubscribeEvent; -import net.minecraft.client.renderer.RenderBlocks; -import net.minecraft.client.renderer.Tessellator; import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; import net.minecraft.tileentity.TileEntity; import net.minecraftforge.client.event.TextureStitchEvent; import net.minecraftforge.common.MinecraftForge; -import openblocks.Config; -import openblocks.OpenBlocks; -import openblocks.common.block.BlockGuide.Icons; import openblocks.common.tileentity.TileEntityGuide; -import openmods.Log; import openmods.utils.TextureUtils; -public class TileEntityGuideRenderer extends TileEntitySpecialRenderer { - - private final Runnable marker = new Runnable(){ - @Override - public void run() { - Tessellator t = Tessellator.instance; - RenderBlocks renderBlocks = new RenderBlocks(); - renderBlocks.setRenderBounds(0.05D, 0.05D, 0.05D, 0.95D, 0.95D, 0.95D); - t.startDrawingQuads(); - t.setBrightness(200); - renderBlocks.renderFaceXNeg(OpenBlocks.Blocks.guide, -0.5D, 0.0D, -0.5D, Icons.marker); - renderBlocks.renderFaceXPos(OpenBlocks.Blocks.guide, -0.5D, 0.0D, -0.5D, Icons.marker); - renderBlocks.renderFaceYNeg(OpenBlocks.Blocks.guide, -0.5D, 0.0D, -0.5D, Icons.marker); - renderBlocks.renderFaceYPos(OpenBlocks.Blocks.guide, -0.5D, 0.0D, -0.5D, Icons.marker); - renderBlocks.renderFaceZNeg(OpenBlocks.Blocks.guide, -0.5D, 0.0D, -0.5D, Icons.marker); - renderBlocks.renderFaceZPos(OpenBlocks.Blocks.guide, -0.5D, 0.0D, -0.5D, Icons.marker); - // important: don't draw! - } - }; - - private IGuideRenderer renderer; - - public TileEntityGuideRenderer() { - MinecraftForge.EVENT_BUS.register(this); +import org.lwjgl.opengl.GL11; - if (!ShaderHelper.isSupported() || !BufferHelper.isSupported() || !ArraysHelper.isSupported()) { - renderer = new GuideLegacyRenderer(marker); // advanced renderer not supported :( - Log.debug("Advanced guide renderer not supported, falling back to legacy renderer.", (Object[]) null); - } else if (Config.useAdvancedRenderer == false){ - renderer = new GuideLegacyRenderer(marker); - Log.debug("Advanced guide renderer disabled, falling back to legacy renderer.", (Object[]) null); - } else { - try { - renderer = new GuideAdvancedRenderer(marker); // try to use the advanced renderer - } catch (Exception e) { - Log.debug("Error trying to create advanced renderer, falling back to legacy renderer", (Object[]) null); - renderer = new GuideLegacyRenderer(marker); // fall back to the old renderer. - } - } +import cpw.mods.fml.common.eventhandler.SubscribeEvent; + +public class TileEntityGuideRenderer extends TileEntitySpecialRenderer { + + private final IGuideRenderer renderer; + + public TileEntityGuideRenderer() { + this.renderer = new GuideRendererSelector().getRenderer(); + MinecraftForge.EVENT_BUS.register(this); } @SubscribeEvent @@ -66,7 +29,7 @@ public class TileEntityGuideRenderer extends TileEntitySpecialRenderer { public void renderTileEntityAt(TileEntity tileentity, double x, double y, double z, float f) { GL11.glPushMatrix(); GL11.glTranslated(x, y, z); - renderer.renderShape((TileEntityGuide) tileentity); + renderer.renderShape((TileEntityGuide)tileentity); GL11.glPopMatrix(); } } diff --git a/src/main/java/openblocks/common/tileentity/TileEntityGuide.java b/src/main/java/openblocks/common/tileentity/TileEntityGuide.java index aacc66ff..e38e2742 100644 --- a/src/main/java/openblocks/common/tileentity/TileEntityGuide.java +++ b/src/main/java/openblocks/common/tileentity/TileEntityGuide.java @@ -339,9 +339,8 @@ public class TileEntityGuide extends DroppableTileEntity implements ISyncListene public CoordShape getPreviousShape() { return previousShape; } - - public CoordShape getAndDeleteShape() - { + + public CoordShape getAndDeleteShape() { CoordShape toDel = toDeleteShape; toDeleteShape = null; return toDel; diff --git a/src/main/java/openblocks/shapes/CoordShape.java b/src/main/java/openblocks/shapes/CoordShape.java index 0cfb03fa..c8ac682a 100644 --- a/src/main/java/openblocks/shapes/CoordShape.java +++ b/src/main/java/openblocks/shapes/CoordShape.java @@ -3,56 +3,53 @@ package openblocks.shapes; import java.nio.ByteBuffer; import java.util.List; +import openmods.renderer.shaders.BufferHelper; +import openmods.utils.Coord; + import org.lwjgl.BufferUtils; import org.lwjgl.opengl.GL15; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; -import openblocks.client.renderer.tileentity.guide.BufferHelper; -import openmods.utils.Coord; public class CoordShape { - + @SideOnly(Side.CLIENT) - int vbo; - List coords; - + private int vbo; + + private final List coords; + public CoordShape(List coords) { this.coords = coords; - vbo = 0; } - + @SideOnly(Side.CLIENT) - public int bindVBO() - { - if (vbo == 0) - { + public int bindVBO() { + if (vbo == 0) { ByteBuffer data = BufferUtils.createByteBuffer(coords.size() * 3 * 4); for (Coord c : coords) data.putInt(c.x).putInt(c.y).putInt(c.z); data.flip(); - + vbo = BufferHelper.methods().glGenBuffers(); BufferHelper.methods().glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo); BufferHelper.methods().glBufferData(GL15.GL_ARRAY_BUFFER, data, GL15.GL_STATIC_DRAW); - }else - BufferHelper.methods().glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo); - + } else BufferHelper.methods().glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo); + return vbo; } - + public List getCoords() { return coords; } - + public int size() { return coords.size(); } - + @SideOnly(Side.CLIENT) public void destroy() { - if (vbo != 0) - BufferHelper.methods().glDeleteBuffers(vbo); + if (vbo != 0) BufferHelper.methods().glDeleteBuffers(vbo); vbo = 0; } } diff --git a/src/main/resources/assets/openblocks/shaders/shader.frag b/src/main/resources/assets/openblocks/shaders/shader.frag index 16c7bc26..c10b5d29 100644 --- a/src/main/resources/assets/openblocks/shaders/shader.frag +++ b/src/main/resources/assets/openblocks/shaders/shader.frag @@ -21,6 +21,5 @@ void main() vec4 color = vec4(uColor, 1.0); color *= 1.0 - (1.0 - texture2D(uDefaultTexture, vTexCoord)) * uHasTexture; color *= 1.0 - (1.0 - vColor) * uHasColor; -// color *= vec4(1.0 - (1.0 - texture2D(uLightmapTexture, vec2(0.0, 1.0))).xyz) * uHasBrightness, 1.0); gl_FragColor = color; } \ No newline at end of file diff --git a/src/main/resources/assets/openblocks/shaders/shader.vert b/src/main/resources/assets/openblocks/shaders/shader.vert index 45907a90..db9a7922 100644 --- a/src/main/resources/assets/openblocks/shaders/shader.vert +++ b/src/main/resources/assets/openblocks/shaders/shader.vert @@ -1,4 +1,4 @@ -#version 150 +#version 150 compatibility in vec3 aVertex; in vec2 aTexCoord; From b58e9645968ebbfb69c4d289ac3afbd88bcd4f87 Mon Sep 17 00:00:00 2001 From: Robin Voetter Date: Sun, 10 Apr 2016 10:56:12 +0200 Subject: [PATCH 15/54] clean shaders and reset on texture change (#770) --- .../guide/GuideAdvancedRenderer.java | 5 +- .../tileentity/guide/MarkerRenderer.java | 82 +++++++++++-------- .../assets/openblocks/shaders/shader.frag | 8 -- .../assets/openblocks/shaders/shader.vert | 3 - 4 files changed, 52 insertions(+), 46 deletions(-) diff --git a/src/main/java/openblocks/client/renderer/tileentity/guide/GuideAdvancedRenderer.java b/src/main/java/openblocks/client/renderer/tileentity/guide/GuideAdvancedRenderer.java index 4fc80c58..136e81a7 100644 --- a/src/main/java/openblocks/client/renderer/tileentity/guide/GuideAdvancedRenderer.java +++ b/src/main/java/openblocks/client/renderer/tileentity/guide/GuideAdvancedRenderer.java @@ -39,5 +39,8 @@ public class GuideAdvancedRenderer implements IGuideRenderer { } @Override - public void onTextureChange() {} + public void onTextureChange() + { + mr.reset(); + } } diff --git a/src/main/java/openblocks/client/renderer/tileentity/guide/MarkerRenderer.java b/src/main/java/openblocks/client/renderer/tileentity/guide/MarkerRenderer.java index fb4bf34d..46c875ff 100644 --- a/src/main/java/openblocks/client/renderer/tileentity/guide/MarkerRenderer.java +++ b/src/main/java/openblocks/client/renderer/tileentity/guide/MarkerRenderer.java @@ -3,15 +3,19 @@ package openblocks.client.renderer.tileentity.guide; import java.nio.ByteBuffer; import java.nio.IntBuffer; +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL15; +import org.lwjgl.opengl.GL20; + import net.minecraft.client.renderer.GLAllocation; -import net.minecraft.client.renderer.OpenGlHelper; import net.minecraft.client.renderer.Tessellator; import net.minecraft.client.shader.TesselatorVertexState; import net.minecraft.util.ResourceLocation; import openblocks.shapes.CoordShape; -import openmods.renderer.shaders.*; - -import org.lwjgl.opengl.*; +import openmods.renderer.shaders.ArraysHelper; +import openmods.renderer.shaders.BufferHelper; +import openmods.renderer.shaders.ShaderProgram; +import openmods.renderer.shaders.ShaderProgramBuilder; public class MarkerRenderer { @@ -25,9 +29,9 @@ public class MarkerRenderer { private final Runnable model; - private boolean initialized = false; + private boolean initialized = false, hasTexture = false, hasColor = false, shouldRefresh = true; private int vertexCount; - private int vao; + private int vao = 0, vbo = 0; public MarkerRenderer(Runnable model) throws Exception { this.model = model; @@ -37,52 +41,62 @@ public class MarkerRenderer { shaderProgramBuilder.addShader(fragmentSource, GL20.GL_FRAGMENT_SHADER); this.shader = shaderProgramBuilder.build(); } - - public void createVAO() { + + public void reset() + { + shouldRefresh = true; + } + + private void createModel() + { model.run(); TesselatorVertexState state = Tessellator.instance.getVertexState(0, 0, 0); Tessellator.instance.draw(); // just discard the state this way. - + if (state.getRawBuffer().length > nativeBufferSize) throw new UnsupportedOperationException("Big buffers not supported!"); vertexCount = state.getVertexCount(); + byteBuffer.position(0); intBuffer.clear(); intBuffer.put(state.getRawBuffer(), 0, vertexCount * 8); byteBuffer.position(0); byteBuffer.limit(vertexCount * 32); + + hasTexture = state.getHasTexture(); + hasColor = state.getHasColor(); + } + + private void createVAO() { + if (initialized) { + createModel(); + + if (vao == 0) vao = ArraysHelper.methods().glGenVertexArrays(); + ArraysHelper.methods().glBindVertexArray(vao); + + if (vbo == 0) vbo = BufferHelper.methods().glGenBuffers(); + BufferHelper.methods().glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo); + BufferHelper.methods().glBufferData(GL15.GL_ARRAY_BUFFER, byteBuffer, GL15.GL_STATIC_DRAW); - vao = ArraysHelper.methods().glGenVertexArrays(); - ArraysHelper.methods().glBindVertexArray(vao); + shader.attributePointer("aVertex", 3, GL11.GL_FLOAT, false, 32, 0); + shader.attributePointer("aTexCoord", 2, GL11.GL_FLOAT, false, 32, 12); + shader.attributePointer("aColor", 4, GL11.GL_UNSIGNED_BYTE, false, 32, 20); - byteBuffer.position(0); + BufferHelper.methods().glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); - int vbo = BufferHelper.methods().glGenBuffers(); - BufferHelper.methods().glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo); - BufferHelper.methods().glBufferData(GL15.GL_ARRAY_BUFFER, byteBuffer, GL15.GL_STATIC_DRAW); - - shader.attributePointer("aVertex", 3, GL11.GL_FLOAT, false, 32, 0); - shader.attributePointer("aTexCoord", 2, GL11.GL_FLOAT, false, 32, 12); - shader.attributePointer("aColor", 4, GL11.GL_UNSIGNED_BYTE, false, 32, 20); - shader.attributePointer("aBrightnessCoord", 2, GL11.GL_SHORT, false, 32, 28); - - BufferHelper.methods().glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); - - shader.uniform1f("uHasTexture", state.getHasTexture()? 1f : 0f); - shader.uniform1f("uHasColor", state.getHasColor()? 1f : 0f); - shader.uniform1f("uHasBrightness", state.getHasBrightness()? 1f : 0f); - shader.uniform1i("uDefaultTexture", OpenGlHelper.defaultTexUnit - GL13.GL_TEXTURE0); - shader.uniform1i("uLightmapTexture", OpenGlHelper.lightmapTexUnit - GL13.GL_TEXTURE0); - - byteBuffer.position(0); - - ArraysHelper.methods().glBindVertexArray(0); - initialized = true; + shader.uniform1f("uHasTexture", hasTexture ? 1f : 0f); + shader.uniform1f("uHasColor", hasColor ? 1f : 0f); + shader.uniform1i("uDefaultTexture", 0); + + ArraysHelper.methods().glBindVertexArray(0); + shouldRefresh = false; + } } public void drawInstanced(CoordShape shape, int color, float scale) { shader.bind(); - if (!initialized) createVAO(); + initialized = true; + if (shouldRefresh) createVAO(); ArraysHelper.methods().glBindVertexArray(vao); shape.bindVBO(); shader.instanceAttributePointer("aPosition", 3, GL11.GL_INT, false, 0, 0); diff --git a/src/main/resources/assets/openblocks/shaders/shader.frag b/src/main/resources/assets/openblocks/shaders/shader.frag index c10b5d29..bbcc946b 100644 --- a/src/main/resources/assets/openblocks/shaders/shader.frag +++ b/src/main/resources/assets/openblocks/shaders/shader.frag @@ -1,20 +1,12 @@ #version 150 uniform float uHasTexture; -uniform float uHasBrightness; uniform float uHasColor; uniform sampler2D uDefaultTexture; -uniform sampler2D uLightmapTexture; uniform vec3 uColor; in vec2 vTexCoord; in vec4 vColor; -in vec2 vBrightnessCoord; - -#define SCALE 1.0/256.0 -#define TRANSLATE 8.0 - -mat2 tex = mat2(SCALE + TRANSLATE, 0, SCALE + TRANSLATE, 0); void main() { diff --git a/src/main/resources/assets/openblocks/shaders/shader.vert b/src/main/resources/assets/openblocks/shaders/shader.vert index db9a7922..93234e7e 100644 --- a/src/main/resources/assets/openblocks/shaders/shader.vert +++ b/src/main/resources/assets/openblocks/shaders/shader.vert @@ -3,14 +3,12 @@ in vec3 aVertex; in vec2 aTexCoord; in vec4 aColor; -in vec2 aBrightnessCoord; in vec3 aPosition; uniform float uScale; out vec2 vTexCoord; out vec4 vColor; -out vec2 vBrightnessCoord; const vec3 offset = vec3(0.5, 0, 0.5); @@ -18,6 +16,5 @@ void main() { vTexCoord = aTexCoord; vColor = aColor; - vBrightnessCoord = aBrightnessCoord; gl_Position = gl_ModelViewProjectionMatrix * vec4(aVertex * uScale + aPosition + offset, 1); } \ No newline at end of file From 5a12360abd96a5fa2260d78bb04cf2e24cf0630e Mon Sep 17 00:00:00 2001 From: Bartek Bok Date: Sun, 10 Apr 2016 11:21:37 +0200 Subject: [PATCH 16/54] Formatting --- OpenModsLib | 2 +- .../guide/GuideAdvancedRenderer.java | 5 +- .../guide/GuideRendererSelector.java | 2 +- .../tileentity/guide/MarkerRenderer.java | 60 ++++++++++--------- .../assets/openblocks/shaders/shader.vert | 2 +- 5 files changed, 36 insertions(+), 35 deletions(-) diff --git a/OpenModsLib b/OpenModsLib index 2f4979df..5f86b062 160000 --- a/OpenModsLib +++ b/OpenModsLib @@ -1 +1 @@ -Subproject commit 2f4979df4e49b1e8760810e08ea4a3a17444267a +Subproject commit 5f86b062f2320bb7838927cf8aff936b03fcd545 diff --git a/src/main/java/openblocks/client/renderer/tileentity/guide/GuideAdvancedRenderer.java b/src/main/java/openblocks/client/renderer/tileentity/guide/GuideAdvancedRenderer.java index 136e81a7..a7ddd103 100644 --- a/src/main/java/openblocks/client/renderer/tileentity/guide/GuideAdvancedRenderer.java +++ b/src/main/java/openblocks/client/renderer/tileentity/guide/GuideAdvancedRenderer.java @@ -10,7 +10,7 @@ public class GuideAdvancedRenderer implements IGuideRenderer { private final MarkerRenderer mr; - public GuideAdvancedRenderer(Runnable marker) throws Exception { + public GuideAdvancedRenderer(Runnable marker) { this.mr = new MarkerRenderer(marker); } @@ -39,8 +39,7 @@ public class GuideAdvancedRenderer implements IGuideRenderer { } @Override - public void onTextureChange() - { + public void onTextureChange() { mr.reset(); } } diff --git a/src/main/java/openblocks/client/renderer/tileentity/guide/GuideRendererSelector.java b/src/main/java/openblocks/client/renderer/tileentity/guide/GuideRendererSelector.java index 99581788..8107fb82 100644 --- a/src/main/java/openblocks/client/renderer/tileentity/guide/GuideRendererSelector.java +++ b/src/main/java/openblocks/client/renderer/tileentity/guide/GuideRendererSelector.java @@ -43,7 +43,7 @@ public class GuideRendererSelector { } else { try { return new GuideAdvancedRenderer(marker); // try to use the advanced renderer - } catch (Exception e) { + } catch (Throwable e) { Log.warn(e, "Error trying to create advanced renderer, falling back to legacy renderer"); return new GuideLegacyRenderer(marker); // fall back to the old renderer. } diff --git a/src/main/java/openblocks/client/renderer/tileentity/guide/MarkerRenderer.java b/src/main/java/openblocks/client/renderer/tileentity/guide/MarkerRenderer.java index 46c875ff..13727d07 100644 --- a/src/main/java/openblocks/client/renderer/tileentity/guide/MarkerRenderer.java +++ b/src/main/java/openblocks/client/renderer/tileentity/guide/MarkerRenderer.java @@ -3,19 +3,16 @@ package openblocks.client.renderer.tileentity.guide; import java.nio.ByteBuffer; import java.nio.IntBuffer; -import org.lwjgl.opengl.GL11; -import org.lwjgl.opengl.GL15; -import org.lwjgl.opengl.GL20; - import net.minecraft.client.renderer.GLAllocation; import net.minecraft.client.renderer.Tessellator; import net.minecraft.client.shader.TesselatorVertexState; import net.minecraft.util.ResourceLocation; import openblocks.shapes.CoordShape; -import openmods.renderer.shaders.ArraysHelper; -import openmods.renderer.shaders.BufferHelper; -import openmods.renderer.shaders.ShaderProgram; -import openmods.renderer.shaders.ShaderProgramBuilder; +import openmods.renderer.shaders.*; + +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL15; +import org.lwjgl.opengl.GL20; public class MarkerRenderer { @@ -24,16 +21,23 @@ public class MarkerRenderer { private final ShaderProgram shader; private static final int nativeBufferSize = 0x200000; - private static final ByteBuffer byteBuffer = GLAllocation.createDirectByteBuffer(nativeBufferSize * 4); - private static final IntBuffer intBuffer = byteBuffer.asIntBuffer(); + private final ByteBuffer byteBuffer = GLAllocation.createDirectByteBuffer(nativeBufferSize * 4); + private final IntBuffer intBuffer = byteBuffer.asIntBuffer(); private final Runnable model; - private boolean initialized = false, hasTexture = false, hasColor = false, shouldRefresh = true; - private int vertexCount; - private int vao = 0, vbo = 0; + private boolean initialized; + private boolean hasTexture; + private boolean hasColor; - public MarkerRenderer(Runnable model) throws Exception { + private boolean shouldRefresh = true; + + private int vertexCount; + + private int vao; + private int vbo; + + public MarkerRenderer(Runnable model) { this.model = model; final ShaderProgramBuilder shaderProgramBuilder = new ShaderProgramBuilder(); @@ -41,18 +45,16 @@ public class MarkerRenderer { shaderProgramBuilder.addShader(fragmentSource, GL20.GL_FRAGMENT_SHADER); this.shader = shaderProgramBuilder.build(); } - - public void reset() - { + + public void reset() { shouldRefresh = true; } - - private void createModel() - { + + private void createModel() { model.run(); TesselatorVertexState state = Tessellator.instance.getVertexState(0, 0, 0); Tessellator.instance.draw(); // just discard the state this way. - + if (state.getRawBuffer().length > nativeBufferSize) throw new UnsupportedOperationException("Big buffers not supported!"); vertexCount = state.getVertexCount(); @@ -62,18 +64,18 @@ public class MarkerRenderer { intBuffer.put(state.getRawBuffer(), 0, vertexCount * 8); byteBuffer.position(0); byteBuffer.limit(vertexCount * 32); - + hasTexture = state.getHasTexture(); hasColor = state.getHasColor(); } - + private void createVAO() { if (initialized) { createModel(); - + if (vao == 0) vao = ArraysHelper.methods().glGenVertexArrays(); ArraysHelper.methods().glBindVertexArray(vao); - + if (vbo == 0) vbo = BufferHelper.methods().glGenBuffers(); BufferHelper.methods().glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo); BufferHelper.methods().glBufferData(GL15.GL_ARRAY_BUFFER, byteBuffer, GL15.GL_STATIC_DRAW); @@ -84,10 +86,10 @@ public class MarkerRenderer { BufferHelper.methods().glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); - shader.uniform1f("uHasTexture", hasTexture ? 1f : 0f); - shader.uniform1f("uHasColor", hasColor ? 1f : 0f); - shader.uniform1i("uDefaultTexture", 0); - + shader.uniform1f("uHasTexture", hasTexture? 1f : 0f); + shader.uniform1f("uHasColor", hasColor? 1f : 0f); + shader.uniform1i("uDefaultTexture", 0); + ArraysHelper.methods().glBindVertexArray(0); shouldRefresh = false; } diff --git a/src/main/resources/assets/openblocks/shaders/shader.vert b/src/main/resources/assets/openblocks/shaders/shader.vert index 93234e7e..0ad4668b 100644 --- a/src/main/resources/assets/openblocks/shaders/shader.vert +++ b/src/main/resources/assets/openblocks/shaders/shader.vert @@ -16,5 +16,5 @@ void main() { vTexCoord = aTexCoord; vColor = aColor; - gl_Position = gl_ModelViewProjectionMatrix * vec4(aVertex * uScale + aPosition + offset, 1); + gl_Position = gl_ModelViewProjectionMatrix * vec4(aVertex * uScale + aPosition + offset, 1); } \ No newline at end of file From 217b9e5b6a94de57a42aa07e32160b1a45bad342 Mon Sep 17 00:00:00 2001 From: Bartek Bok Date: Sun, 17 Apr 2016 21:32:39 +0200 Subject: [PATCH 17/54] Trying to correctly orient blocks placed by block placer --- OpenModsLib | 2 +- .../tileentity/TileEntityBlockPlacer.java | 47 ++++++++++--------- 2 files changed, 26 insertions(+), 23 deletions(-) diff --git a/OpenModsLib b/OpenModsLib index 5f86b062..167e4a14 160000 --- a/OpenModsLib +++ b/OpenModsLib @@ -1 +1 @@ -Subproject commit 5f86b062f2320bb7838927cf8aff936b03fcd545 +Subproject commit 167e4a144499cf1bc337e3027f8746aa7937d8dc diff --git a/src/main/java/openblocks/common/tileentity/TileEntityBlockPlacer.java b/src/main/java/openblocks/common/tileentity/TileEntityBlockPlacer.java index e0588902..a4e35eed 100644 --- a/src/main/java/openblocks/common/tileentity/TileEntityBlockPlacer.java +++ b/src/main/java/openblocks/common/tileentity/TileEntityBlockPlacer.java @@ -13,8 +13,7 @@ import openblocks.common.container.ContainerBlockPlacer; import openmods.api.IHasGui; import openmods.api.INeighbourAwareTile; import openmods.fakeplayer.FakePlayerPool; -import openmods.fakeplayer.FakePlayerPool.PlayerUser; -import openmods.fakeplayer.OpenModsFakePlayer; +import openmods.fakeplayer.UseItemAction; import openmods.include.IncludeInterface; import openmods.inventory.GenericInventory; import openmods.inventory.IInventoryProvider; @@ -63,35 +62,39 @@ public class TileEntityBlockPlacer extends OpenTileEntity implements INeighbourA return false; } - private void placeBlock(final int slotId) { + private void placeBlock(int slotId) { if (!(worldObj instanceof WorldServer)) return; final ItemStack stack = inventory.getStackInSlot(slotId); if (stack == null || stack.stackSize <= 0) return; final ForgeDirection direction = getOrientation().up(); - final int x = xCoord + direction.offsetX; - final int y = yCoord + direction.offsetY; - final int z = zCoord + direction.offsetZ; + final int targetX = xCoord + direction.offsetX; + final int targetY = yCoord + direction.offsetY; + final int targetZ = zCoord + direction.offsetZ; - final boolean blockExists; + if (worldObj.blockExists(targetX, targetY, targetZ)) { + final Block block = worldObj.getBlock(targetX, targetY, targetZ); + if (!block.isAir(worldObj, targetX, targetY, targetZ) + && !block.isReplaceable(worldObj, targetX, targetY, targetZ)) return; + } - if (worldObj.blockExists(x, y, z)) { - Block block = worldObj.getBlock(x, y, z); - blockExists = !block.isAir(worldObj, x, y, z) && !block.isReplaceable(worldObj, x, y, z); - } else blockExists = false; + // this logic is tuned for vanilla blocks (like pistons), which places blocks with front facing player + // so to place object pointing in the same direction as placer, we need configuration player-target-placer + // * 2, since some blocks may take into account player height, so distance must be greater than that + final int playerX = targetX + 2 * direction.offsetX; + final int playerY = targetY + 2 * direction.offsetY; + final int playerZ = targetZ + 2 * direction.offsetZ; - FakePlayerPool.instance.executeOnPlayer((WorldServer)worldObj, new PlayerUser() { - @Override - public void usePlayer(OpenModsFakePlayer fakePlayer) { - ItemStack newStack = fakePlayer.equipWithAndRightClick(stack, - Vec3.createVectorHelper(xCoord, yCoord, zCoord), - Vec3.createVectorHelper(x, y - 1, z), - direction.getOpposite(), - blockExists); - inventory.setInventorySlotContents(slotId, newStack); - } - }); + final ItemStack result = FakePlayerPool.instance.executeOnPlayer((WorldServer)worldObj, new UseItemAction( + stack, + Vec3.createVectorHelper(playerX, playerY, playerZ), + Vec3.createVectorHelper(targetX, targetY, targetZ), + Vec3.createVectorHelper(targetX + 0.5, targetY + 0.5, targetZ + 0.5), + direction.getOpposite() + )); + + inventory.setInventorySlotContents(slotId, result); } @Override From 19177e2377b192caffcdc1ac60e93ab1c0897ebe Mon Sep 17 00:00:00 2001 From: Bartek Bok Date: Sun, 17 Apr 2016 21:37:40 +0200 Subject: [PATCH 18/54] Mark OP adapters with FeatureGroup annotations --- gradle.properties | 2 +- src/main/java/openblocks/integration/AdapterCannon.java | 2 ++ .../java/openblocks/integration/AdapterDonationStation.java | 2 ++ src/main/java/openblocks/integration/AdapterProjector.java | 2 ++ .../java/openblocks/integration/AdapterVillageHighlighter.java | 2 ++ 5 files changed, 9 insertions(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 23721f45..bdb5997c 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,5 +1,5 @@ mod_version=1.5.1 api_version=1.1 -opc_api_version=3.3.2 +opc_api_version=3.4.1 mc_ver=1.7.10 forge_ver=10.13.4.1558-1.7.10 \ No newline at end of file diff --git a/src/main/java/openblocks/integration/AdapterCannon.java b/src/main/java/openblocks/integration/AdapterCannon.java index 21ebdfb2..a581c809 100644 --- a/src/main/java/openblocks/integration/AdapterCannon.java +++ b/src/main/java/openblocks/integration/AdapterCannon.java @@ -4,7 +4,9 @@ import openblocks.common.tileentity.TileEntityCannon; import openperipheral.api.adapter.IPeripheralAdapter; import openperipheral.api.adapter.method.Arg; import openperipheral.api.adapter.method.ScriptCallable; +import openperipheral.api.architecture.FeatureGroup; +@FeatureGroup("openblocks-cannon") public class AdapterCannon implements IPeripheralAdapter { @Override diff --git a/src/main/java/openblocks/integration/AdapterDonationStation.java b/src/main/java/openblocks/integration/AdapterDonationStation.java index 0ec5b91d..639f1095 100644 --- a/src/main/java/openblocks/integration/AdapterDonationStation.java +++ b/src/main/java/openblocks/integration/AdapterDonationStation.java @@ -5,8 +5,10 @@ import openperipheral.api.adapter.IPeripheralAdapter; import openperipheral.api.adapter.method.IMultiReturn; import openperipheral.api.adapter.method.ReturnType; import openperipheral.api.adapter.method.ScriptCallable; +import openperipheral.api.architecture.FeatureGroup; import openperipheral.api.helpers.MultiReturn; +@FeatureGroup("openblocks-donation-station") public class AdapterDonationStation implements IPeripheralAdapter { @Override diff --git a/src/main/java/openblocks/integration/AdapterProjector.java b/src/main/java/openblocks/integration/AdapterProjector.java index 8bde04af..dcd46073 100644 --- a/src/main/java/openblocks/integration/AdapterProjector.java +++ b/src/main/java/openblocks/integration/AdapterProjector.java @@ -9,6 +9,7 @@ import openblocks.common.tileentity.TileEntityProjector; import openperipheral.api.adapter.Asynchronous; import openperipheral.api.adapter.IPeripheralAdapter; import openperipheral.api.adapter.method.*; +import openperipheral.api.architecture.FeatureGroup; import openperipheral.api.helpers.MultiReturn; import org.apache.commons.lang3.ArrayUtils; @@ -17,6 +18,7 @@ import com.google.common.base.Preconditions; import com.google.common.collect.Maps; import com.google.common.primitives.UnsignedBytes; +@FeatureGroup("openblocks-projector") public class AdapterProjector implements IPeripheralAdapter { @Override diff --git a/src/main/java/openblocks/integration/AdapterVillageHighlighter.java b/src/main/java/openblocks/integration/AdapterVillageHighlighter.java index 365ab336..9985ecac 100644 --- a/src/main/java/openblocks/integration/AdapterVillageHighlighter.java +++ b/src/main/java/openblocks/integration/AdapterVillageHighlighter.java @@ -8,9 +8,11 @@ import openblocks.common.tileentity.TileEntityVillageHighlighter; import openperipheral.api.adapter.IPeripheralAdapter; import openperipheral.api.adapter.method.ReturnType; import openperipheral.api.adapter.method.ScriptCallable; +import openperipheral.api.architecture.FeatureGroup; import com.google.common.collect.Maps; +@FeatureGroup("openblocks-village-highlighter") public class AdapterVillageHighlighter implements IPeripheralAdapter { @Override From 43caa5193884cf0adc08d66dc9402e12e6c17a19 Mon Sep 17 00:00:00 2001 From: Bartek Bok Date: Tue, 10 May 2016 21:25:23 +0200 Subject: [PATCH 19/54] Remove old, broken fix (fixes #773) --- .../common/tileentity/TileEntitySprinkler.java | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/src/main/java/openblocks/common/tileentity/TileEntitySprinkler.java b/src/main/java/openblocks/common/tileentity/TileEntitySprinkler.java index 23c270aa..35a3941f 100644 --- a/src/main/java/openblocks/common/tileentity/TileEntitySprinkler.java +++ b/src/main/java/openblocks/common/tileentity/TileEntitySprinkler.java @@ -21,7 +21,9 @@ import openblocks.Config; import openblocks.OpenBlocks; import openblocks.client.gui.GuiSprinkler; import openblocks.common.container.ContainerSprinkler; -import openmods.api.*; +import openmods.api.IHasGui; +import openmods.api.INeighbourAwareTile; +import openmods.api.ISurfaceAttachment; import openmods.fakeplayer.FakePlayerPool; import openmods.fakeplayer.FakePlayerPool.PlayerUser; import openmods.fakeplayer.OpenModsFakePlayer; @@ -35,9 +37,8 @@ import openmods.liquids.GenericFluidHandler; import openmods.sync.SyncableFlags; import openmods.sync.SyncableTank; import openmods.tileentity.SyncedTileEntity; -import openmods.utils.BlockUtils; -public class TileEntitySprinkler extends SyncedTileEntity implements IBreakAwareTile, ISurfaceAttachment, IInventoryProvider, IHasGui, INeighbourAwareTile { +public class TileEntitySprinkler extends SyncedTileEntity implements ISurfaceAttachment, IInventoryProvider, IHasGui, INeighbourAwareTile { private static final ItemStack BONEMEAL = new ItemStack(Items.dye, 1, 15); @@ -207,13 +208,6 @@ public class TileEntitySprinkler extends SyncedTileEntity implements IBreakAware return ForgeDirection.DOWN; } - @Override - public void onBlockBroken() { - if (!worldObj.isRemote && !worldObj.isAirBlock(xCoord, yCoord, zCoord)) { - BlockUtils.dropItemStackInWorld(worldObj, xCoord, yCoord, zCoord, new ItemStack(OpenBlocks.Blocks.sprinkler)); - } - } - /** * Get spray direction of Sprinkler particles * From a72b34fb230ad1360fc8978c9cb94f0054382504 Mon Sep 17 00:00:00 2001 From: Bartek Bok Date: Mon, 16 May 2016 21:26:19 +0200 Subject: [PATCH 20/54] Fix #765 --- OpenModsLib | 2 +- src/main/java/openblocks/OpenBlocksGuiHandler.java | 8 ++++---- .../openblocks/common/container/ContainerDevNull.java | 9 ++++++--- src/main/java/openblocks/common/item/ItemDevNull.java | 4 ++-- 4 files changed, 13 insertions(+), 10 deletions(-) diff --git a/OpenModsLib b/OpenModsLib index 167e4a14..90c79bcb 160000 --- a/OpenModsLib +++ b/OpenModsLib @@ -1 +1 @@ -Subproject commit 167e4a144499cf1bc337e3027f8746aa7937d8dc +Subproject commit 90c79bcb675889653a4cf293f579e7aac7156774 diff --git a/src/main/java/openblocks/OpenBlocksGuiHandler.java b/src/main/java/openblocks/OpenBlocksGuiHandler.java index c18565cd..291bd03a 100644 --- a/src/main/java/openblocks/OpenBlocksGuiHandler.java +++ b/src/main/java/openblocks/OpenBlocksGuiHandler.java @@ -21,8 +21,8 @@ public class OpenBlocksGuiHandler implements IGuiHandler { public static final GuiId[] VALUES = GuiId.values(); } - private static ContainerDevNull createDevNullContainer(EntityPlayer player) { - return new ContainerDevNull(player.inventory, new ItemDevNull.DevNullInventory(player)); + private static ContainerDevNull createDevNullContainer(EntityPlayer player, int protectedSlot) { + return new ContainerDevNull(player.inventory, new ItemDevNull.DevNullInventory(player, protectedSlot), protectedSlot); } private static ContainerLuggage createLuggageContainer(EntityPlayer player, World world, int entityId) { @@ -43,7 +43,7 @@ public class OpenBlocksGuiHandler implements IGuiHandler { return createLuggageContainer(player, world, x); case devNull: if (player.inventory.getCurrentItem() == null) return null; - return createDevNullContainer(player); + return createDevNullContainer(player, x); default: return null; } @@ -60,7 +60,7 @@ public class OpenBlocksGuiHandler implements IGuiHandler { return container != null? new GuiLuggage(container) : null; } case devNull: - return new GuiDevNull(createDevNullContainer(player)); + return new GuiDevNull(createDevNullContainer(player, x)); default: return null; } diff --git a/src/main/java/openblocks/common/container/ContainerDevNull.java b/src/main/java/openblocks/common/container/ContainerDevNull.java index 9c519f8d..29d4feb0 100644 --- a/src/main/java/openblocks/common/container/ContainerDevNull.java +++ b/src/main/java/openblocks/common/container/ContainerDevNull.java @@ -11,16 +11,19 @@ public class ContainerDevNull extends ContainerBase { private InventoryPlayer playerInventory; - public ContainerDevNull(IInventory playerInventory, IInventory ownerInventory) { + private final int protectedSlot; + + public ContainerDevNull(IInventory playerInventory, IInventory ownerInventory, int protectedSlot) { super(playerInventory, ownerInventory, null); this.playerInventory = (InventoryPlayer)playerInventory; + this.protectedSlot = protectedSlot; addInventoryGrid(80, 22, 1); addPlayerInventorySlots(55); } @Override public ItemStack slotClick(int slotId, int key, int modifier, EntityPlayer player) { - if (modifier == 2 && key == player.inventory.currentItem) return null; + if (modifier == 2 && key == protectedSlot) return null; return super.slotClick(slotId, key, modifier, player); } @@ -40,7 +43,7 @@ public class ContainerDevNull extends ContainerBase { addSlotToContainer(new Slot(playerInventory, slot, offsetX + slot * 18, offsetY + 58) { @Override public boolean canTakeStack(EntityPlayer par1EntityPlayer) { - return currentSlot != playerInventory.currentItem; + return currentSlot != protectedSlot; } }); diff --git a/src/main/java/openblocks/common/item/ItemDevNull.java b/src/main/java/openblocks/common/item/ItemDevNull.java index 9aa19a34..f9bba106 100644 --- a/src/main/java/openblocks/common/item/ItemDevNull.java +++ b/src/main/java/openblocks/common/item/ItemDevNull.java @@ -38,8 +38,8 @@ public class ItemDevNull extends Item { private final EntityPlayer player; - public DevNullInventory(EntityPlayer player) { - super(player, 1); + public DevNullInventory(EntityPlayer player, int protectedSlot) { + super(player, 1, protectedSlot); this.player = player; } From fd792289caecfab58dd476b30331f39b1e6dfc54 Mon Sep 17 00:00:00 2001 From: Bartek Bok Date: Tue, 31 May 2016 21:56:07 +0200 Subject: [PATCH 21/54] Add option for Last Stand xp cost --- OpenModsLib | 2 +- src/main/java/openblocks/Config.java | 4 ++ .../LastStandEnchantmentsHandler.java | 69 ++++++++++++++++--- 3 files changed, 64 insertions(+), 11 deletions(-) diff --git a/OpenModsLib b/OpenModsLib index 90c79bcb..7ff95c69 160000 --- a/OpenModsLib +++ b/OpenModsLib @@ -1 +1 @@ -Subproject commit 90c79bcb675889653a4cf293f579e7aac7156774 +Subproject commit 7ff95c69ea5260f8036c5e18e0ceb3e2a476b4e1 diff --git a/src/main/java/openblocks/Config.java b/src/main/java/openblocks/Config.java index 0b5bf884..85b92362 100644 --- a/src/main/java/openblocks/Config.java +++ b/src/main/java/openblocks/Config.java @@ -222,6 +222,10 @@ public class Config { @ConfigProperty(category = "features", name = "explosiveEnchantGrief", comment = "Explosive enchant can break blocks at level 3") public static boolean explosiveEnchantGrief = true; + @OnLineModifiable + @ConfigProperty(category = "features", name = "lastStandFormula", comment = "Formula for XP cost (variables: hp,dmg,ench,xp). Note: calculation only triggers when hp - dmg < 1.") + public static String lastStandEnchantmentFormula = "max(1, 50*(1-(hp-dmg))/ench)"; + // 64 blocks, since containers usually have 64 blocks usability range (IInventory.isUseableByPlayer) @ConfigProperty(category = "cursor", name = "cursorMaxDistance", comment = "Maximum distance cursor can reach (warning: increasing may cause crashes)") public static int cursorDistanceLimit = 64; diff --git a/src/main/java/openblocks/enchantments/LastStandEnchantmentsHandler.java b/src/main/java/openblocks/enchantments/LastStandEnchantmentsHandler.java index 28e7da57..1401604f 100644 --- a/src/main/java/openblocks/enchantments/LastStandEnchantmentsHandler.java +++ b/src/main/java/openblocks/enchantments/LastStandEnchantmentsHandler.java @@ -6,36 +6,85 @@ import net.minecraft.enchantment.EnchantmentHelper; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraftforge.event.entity.living.LivingHurtEvent; +import openblocks.Config; import openblocks.OpenBlocks.Enchantments; +import openmods.Log; +import openmods.calc.*; +import openmods.calc.Calculator.ExprType; +import openmods.calc.types.fp.DoubleCalculator; +import openmods.config.properties.ConfigurationChange; import openmods.utils.EnchantmentUtils; import cpw.mods.fml.common.eventhandler.EventPriority; import cpw.mods.fml.common.eventhandler.SubscribeEvent; public class LastStandEnchantmentsHandler { + private static final String VAR_ENCH_LEVEL = "ench"; + private static final String VAR_PLAYER_XP = "xp"; + private static final String VAR_PLAYER_HP = "hp"; + private static final String VAR_DAMAGE = "dmg"; + + private final Calculator reductionCalculator = new DoubleCalculator(); + + private boolean useBuiltIn; + private IExecutable formula; + + @SubscribeEvent + public void onConfigChange(ConfigurationChange.Post evt) { + if (evt.check("features", "lastStandFormula")) { + useBuiltIn = false; + formula = null; + } + } + + private static float builtInFormula(float healthAvailable, float enchantmentLevels) { + float xpRequired = 1f - healthAvailable; + + xpRequired *= 50; + xpRequired /= enchantmentLevels; + xpRequired = Math.max(1, xpRequired); + return xpRequired; + } + @SubscribeEvent(priority = EventPriority.LOW) public void onHurt(LivingHurtEvent e) { if (e.entityLiving instanceof EntityPlayer) { - EntityPlayer player = (EntityPlayer)e.entityLiving; - int enchantmentLevels = countLastStandEnchantmentLevels(player); + final int enchantmentLevels = countLastStandEnchantmentLevels(player); if (enchantmentLevels > 0) { - - float healthAvailable = player.getHealth(); - healthAvailable -= e.ammount; + final float playerHealth = player.getHealth(); + final float healthAvailable = playerHealth - e.ammount; if (healthAvailable < 1f) { + final int xpAvailable = EnchantmentUtils.getPlayerXP(player); - int xpAvailable = EnchantmentUtils.getPlayerXP(player); + float xpRequired = builtInFormula(healthAvailable, enchantmentLevels); - float xpRequired = 1f - healthAvailable; + if (!useBuiltIn) { + if (formula == null) { + try { + formula = reductionCalculator.compile(ExprType.INFIX, Config.lastStandEnchantmentFormula); + } catch (Exception ex) { + useBuiltIn = true; + Log.warn(ex, "Failed to compile formula %s", Config.lastStandEnchantmentFormula); + } + } - xpRequired *= 50; - xpRequired /= enchantmentLevels; - xpRequired = Math.max(1, xpRequired); + reductionCalculator.setGlobalSymbol(VAR_ENCH_LEVEL, Constant.create(Double.valueOf(enchantmentLevels))); + reductionCalculator.setGlobalSymbol(VAR_PLAYER_XP, Constant.create(Double.valueOf(xpAvailable))); + reductionCalculator.setGlobalSymbol(VAR_PLAYER_HP, Constant.create(Double.valueOf(playerHealth))); + reductionCalculator.setGlobalSymbol(VAR_DAMAGE, Constant.create(Double.valueOf(e.ammount))); + + try { + xpRequired = reductionCalculator.executeAndPop(formula).floatValue(); + } catch (Exception ex) { + useBuiltIn = true; + Log.warn(ex, "Failed to execute formula %s", Config.lastStandEnchantmentFormula); + } + } if (xpAvailable >= xpRequired) { player.setHealth(1f); From ff0c2f64976137d41233c3b00ad9030a76757db1 Mon Sep 17 00:00:00 2001 From: Bartek Bok Date: Sat, 11 Jun 2016 19:25:57 +0200 Subject: [PATCH 22/54] Sort imports alphabetically, expand wildchars --- OpenModsLib | 2 +- src/main/java/openblocks/ApiSetup.java | 2 +- src/main/java/openblocks/Config.java | 33 ++- .../java/openblocks/NEIOpenBlocksConfig.java | 6 +- src/main/java/openblocks/OpenBlocks.java | 197 ++++++++++++++++-- .../java/openblocks/OpenBlocksCorePlugin.java | 7 +- .../java/openblocks/OpenBlocksGuiHandler.java | 2 +- src/main/java/openblocks/api/ApiHolder.java | 5 +- .../java/openblocks/api/GraveDropsEvent.java | 9 +- .../java/openblocks/api/GraveSpawnEvent.java | 3 +- .../java/openblocks/api/InventoryEvent.java | 12 +- .../openblocks/api/SleepingBagUseEvent.java | 4 +- .../openblocks/asm/EntityPlayerVisitor.java | 6 +- .../asm/OpenBlocksClassTransformer.java | 1 - .../openblocks/client/ChangelogBuilder.java | 10 +- .../java/openblocks/client/ClientProxy.java | 89 ++++++-- .../openblocks/client/ClientTickHandler.java | 6 +- .../client/GliderPlayerRenderHandler.java | 4 +- src/main/java/openblocks/client/Icons.java | 4 +- .../java/openblocks/client/ModGuiFactory.java | 7 +- .../client/SleepingBagRenderHandler.java | 2 +- .../openblocks/client/SoundEventsManager.java | 10 +- .../openblocks/client/SoundIconRegistry.java | 11 +- .../openblocks/client/StencilSkyRenderer.java | 5 +- .../client/bindings/KeyInputHandler.java | 12 +- .../openblocks/client/gui/ChangelogPage.java | 8 +- .../openblocks/client/gui/GuiAutoAnvil.java | 11 +- .../client/gui/GuiAutoEnchantmentTable.java | 9 +- .../client/gui/GuiDonationStation.java | 6 +- .../client/gui/GuiDrawingTable.java | 5 +- .../openblocks/client/gui/GuiInfoBook.java | 9 +- .../openblocks/client/gui/GuiLuggage.java | 3 +- .../openblocks/client/gui/GuiPaintMixer.java | 16 +- .../openblocks/client/gui/GuiProjector.java | 6 +- .../client/gui/GuiVacuumHopper.java | 7 +- .../openblocks/client/gui/GuiXPBottler.java | 9 +- .../client/model/ModelCartographer.java | 4 +- .../client/model/ModelCraneBackpack.java | 4 +- .../client/model/ModelSonicGlasses.java | 1 - .../client/renderer/HeightMapRenderer.java | 9 +- .../renderer/block/BlockCanvasRenderer.java | 2 - .../renderer/block/BlockPathRenderer.java | 2 - .../renderer/block/BlockTankRenderer.java | 9 +- .../entity/EntityCartographerRenderer.java | 2 - .../entity/EntityGoldenEyeRenderer.java | 1 - .../entity/EntityHangGliderRenderer.java | 1 - .../entity/EntityLuggageRenderer.java | 4 +- .../renderer/entity/EntityMagnetRenderer.java | 1 - .../entity/EntitySelectionHandler.java | 9 +- .../renderer/item/ItemRendererDevNull.java | 4 +- .../renderer/item/ItemRendererHangGlider.java | 1 - .../renderer/item/ItemRendererLuggage.java | 1 - .../renderer/item/ItemRendererPaintCan.java | 2 - .../renderer/item/ItemRendererTank.java | 1 - .../renderer/item/ItemRendererTrophy.java | 1 - .../TileEntityAutoAnvilRenderer.java | 1 - ...ileEntityAutoEnchantmentTableRenderer.java | 1 - .../TileEntityBearTrapRenderer.java | 1 - .../tileentity/TileEntityCannonRenderer.java | 1 - .../TileEntityDonationStationRenderer.java | 1 - .../tileentity/TileEntityFanRenderer.java | 1 - .../tileentity/TileEntityFlagRenderer.java | 1 - .../TileEntityGoldenEggRenderer.java | 2 - .../tileentity/TileEntityGraveRenderer.java | 1 - .../TileEntityImaginaryRenderer.java | 6 +- .../TileEntityPaintMixerRenderer.java | 2 - .../TileEntityProjectorRenderer.java | 1 - .../tileentity/TileEntitySkyRenderer.java | 1 - .../TileEntitySprinklerRenderer.java | 1 - .../tileentity/TileEntityTankRenderer.java | 1 - .../tileentity/TileEntityTargetRenderer.java | 1 - .../tileentity/TileEntityTrophyRenderer.java | 1 - .../TileEntityVacuumHopperRenderer.java | 1 - .../TileEntityVillageHighlighterRenderer.java | 1 - .../TileEntityXPShowerRenderer.java | 1 - .../guide/GuideAdvancedRenderer.java | 1 - .../tileentity/guide/GuideLegacyRenderer.java | 1 - .../tileentity/guide/MarkerRenderer.java | 7 +- .../guide/TileEntityBuilderGuideRenderer.java | 1 - .../guide/TileEntityGuideRenderer.java | 4 +- .../tileentity/tank/DiagonalConnection.java | 13 +- .../tileentity/tank/TankRenderLogic.java | 4 +- .../openblocks/common/CommandInventory.java | 9 +- .../java/openblocks/common/CraneRegistry.java | 4 +- .../openblocks/common/DonationUrlManager.java | 1 - .../common/ElevatorActionHandler.java | 10 +- .../openblocks/common/ElevatorBlockRules.java | 15 +- .../openblocks/common/EntityEventHandler.java | 7 +- .../openblocks/common/GameRuleManager.java | 2 +- .../openblocks/common/GuiOpenHandler.java | 4 +- .../java/openblocks/common/HeightMapData.java | 1 - .../openblocks/common/LuggageDropHandler.java | 2 +- .../openblocks/common/MagnetWhitelists.java | 24 ++- .../openblocks/common/MapDataBuilder.java | 15 +- .../openblocks/common/MapDataManager.java | 18 +- .../openblocks/common/PlayerDeathHandler.java | 31 +-- .../common/PlayerInventoryStore.java | 27 ++- .../common/RadioVillagerTradeManager.java | 3 +- .../openblocks/common/ServerTickHandler.java | 6 +- src/main/java/openblocks/common/Stencil.java | 4 +- .../java/openblocks/common/TrophyHandler.java | 23 +- .../block/BlockAutoEnchantmentTable.java | 5 +- .../common/block/BlockBlockBreaker.java | 4 +- .../common/block/BlockBlockPlacer.java | 4 +- .../common/block/BlockBuilderGuide.java | 5 +- .../openblocks/common/block/BlockCanvas.java | 4 +- .../common/block/BlockCanvasGlass.java | 1 - .../common/block/BlockDrawingTable.java | 4 +- .../common/block/BlockElevator.java | 9 +- .../common/block/BlockElevatorRotating.java | 4 +- .../openblocks/common/block/BlockFlag.java | 4 +- .../openblocks/common/block/BlockGrave.java | 2 - .../openblocks/common/block/BlockGuide.java | 12 +- .../common/block/BlockImaginary.java | 14 +- .../common/block/BlockItemDropper.java | 4 +- .../openblocks/common/block/BlockLadder.java | 4 +- .../common/block/BlockPaintCan.java | 4 +- .../common/block/BlockProjector.java | 4 +- .../common/block/BlockRopeLadder.java | 5 +- .../common/block/BlockScaffolding.java | 5 +- .../openblocks/common/block/BlockSky.java | 5 +- .../openblocks/common/block/BlockSponge.java | 1 - .../openblocks/common/block/BlockTank.java | 5 +- .../common/block/BlockXPBottler.java | 4 +- .../common/block/BlockXPShower.java | 4 +- .../common/entity/EntityAssistant.java | 14 +- .../common/entity/EntityCartographer.java | 17 +- .../common/entity/EntityGoldenEye.java | 4 +- .../common/entity/EntityHangGlider.java | 12 +- .../common/entity/EntityItemProjectile.java | 1 - .../common/entity/EntityLuggage.java | 6 +- .../common/entity/EntityMagnet.java | 8 +- .../common/entity/EntityMiniMe.java | 36 ++-- .../common/entity/EntitySmoothMove.java | 4 +- .../common/entity/ai/EntityAIBreakBlock.java | 1 - .../common/entity/ai/EntityAICollectItem.java | 1 - .../entity/ai/EntityAIPickupPlayer.java | 4 +- .../common/item/ItemCartographer.java | 5 +- .../common/item/ItemCraneBackpack.java | 4 +- .../common/item/ItemCraneControl.java | 9 +- .../openblocks/common/item/ItemDevNull.java | 10 +- .../openblocks/common/item/ItemElevator.java | 5 +- .../openblocks/common/item/ItemEmptyMap.java | 5 +- .../openblocks/common/item/ItemGoldenEye.java | 9 +- .../openblocks/common/item/ItemGuide.java | 1 - .../common/item/ItemHangGlider.java | 4 +- .../openblocks/common/item/ItemHeightMap.java | 5 +- .../openblocks/common/item/ItemImaginary.java | 19 +- .../common/item/ItemImaginationGlasses.java | 5 +- .../openblocks/common/item/ItemInfoBook.java | 2 +- .../common/item/ItemPaintBrush.java | 5 +- .../openblocks/common/item/ItemPaintCan.java | 1 - .../openblocks/common/item/ItemPedometer.java | 4 +- .../openblocks/common/item/ItemSkyBlock.java | 5 +- .../common/item/ItemSleepingBag.java | 12 +- .../common/item/ItemSlimalyzer.java | 4 +- .../common/item/ItemSonicGlasses.java | 4 +- .../openblocks/common/item/ItemStencil.java | 9 +- .../openblocks/common/item/ItemTankBlock.java | 10 +- .../common/item/ItemTrophyBlock.java | 1 - .../openblocks/common/item/ItemWrench.java | 20 +- .../common/item/MetaMiracleMagnet.java | 5 +- .../openblocks/common/item/MetaPointer.java | 4 +- .../openblocks/common/item/MetasGeneric.java | 6 +- .../common/recipe/CrayonGlassesRecipe.java | 4 +- .../common/sync/SyncableBlockLayers.java | 9 +- .../tileentity/TileEntityAutoAnvil.java | 16 +- .../TileEntityAutoEnchantmentTable.java | 17 +- .../common/tileentity/TileEntityBearTrap.java | 12 +- .../tileentity/TileEntityBigButton.java | 5 +- .../tileentity/TileEntityBlockBreaker.java | 5 +- .../tileentity/TileEntityBuilderGuide.java | 1 - .../common/tileentity/TileEntityCannon.java | 4 +- .../common/tileentity/TileEntityCanvas.java | 1 - .../tileentity/TileEntityDonationStation.java | 3 +- .../TileEntityElevatorRotating.java | 6 +- .../common/tileentity/TileEntityFan.java | 1 - .../common/tileentity/TileEntityFlag.java | 4 +- .../tileentity/TileEntityGoldenEgg.java | 13 +- .../common/tileentity/TileEntityGrave.java | 14 +- .../common/tileentity/TileEntityGuide.java | 41 ++-- .../tileentity/TileEntityHealBlock.java | 1 - .../tileentity/TileEntityImaginary.java | 9 +- .../tileentity/TileEntityPaintMixer.java | 5 +- .../tileentity/TileEntityProjector.java | 10 +- .../common/tileentity/TileEntitySky.java | 2 +- .../tileentity/TileEntitySprinkler.java | 1 - .../common/tileentity/TileEntityTank.java | 21 +- .../common/tileentity/TileEntityTarget.java | 11 +- .../common/tileentity/TileEntityTrophy.java | 6 +- .../tileentity/TileEntityVacuumHopper.java | 14 +- .../TileEntityVillageHighlighter.java | 5 +- .../tileentity/TileEntityXPBottler.java | 16 +- .../common/tileentity/TileEntityXPDrain.java | 1 - .../ExplosiveEnchantmentsHandler.java | 16 +- .../FlimFlamEnchantmentsHandler.java | 13 +- .../LastStandEnchantmentsHandler.java | 9 +- .../flimflams/DummyCreepersFlimFlam.java | 4 +- .../flimflams/EffectFlimFlam.java | 4 +- .../flimflams/FlimFlamRegistry.java | 20 +- .../flimflams/InventoryShuffleFlimFlam.java | 1 - .../flimflams/InvisibleMobsFlimFlam.java | 1 - .../flimflams/ItemDropFlimFlam.java | 1 - .../enchantments/flimflams/LoreFlimFlam.java | 22 +- .../enchantments/flimflams/MountFlimFlam.java | 1 - .../flimflams/RenameFlimFlam.java | 5 +- .../flimflams/SheepDyeFlimFlam.java | 1 - .../flimflams/SnowballsFlimFlam.java | 1 - .../enchantments/flimflams/SoundFlimFlam.java | 4 +- .../enchantments/flimflams/SquidFilmFlam.java | 4 +- .../flimflams/UselessToolFlimFlam.java | 1 - .../events/ElevatorActionEvent.java | 1 - .../openblocks/events/PlayerActionEvent.java | 1 - .../integration/AdapterProjector.java | 15 +- .../AdapterVillageHighlighter.java | 4 +- .../integration/MagnetControlAdapter.java | 15 +- .../integration/MagnetTurtleUpgrade.java | 11 +- .../integration/ModuleAdapters.java | 1 + .../openblocks/integration/ModuleTurtles.java | 7 +- .../openblocks/integration/TurtleUtils.java | 3 +- .../java/openblocks/rubbish/BrickManager.java | 2 +- .../openblocks/rubbish/CommandFlimFlam.java | 10 +- .../java/openblocks/rubbish/CommandLuck.java | 9 +- .../openblocks/rubbish/LoreGenerator.java | 20 +- .../java/openblocks/shapes/CoordShape.java | 15 +- .../java/openblocks/shapes/GuideShape.java | 8 +- .../openblocks/trophy/ItemDropBehavior.java | 3 +- 227 files changed, 982 insertions(+), 768 deletions(-) diff --git a/OpenModsLib b/OpenModsLib index 7ff95c69..f372200f 160000 --- a/OpenModsLib +++ b/OpenModsLib @@ -1 +1 @@ -Subproject commit 7ff95c69ea5260f8036c5e18e0ceb3e2a476b4e1 +Subproject commit f372200faa621c3b832786da01b7e33f6fdc555c diff --git a/src/main/java/openblocks/ApiSetup.java b/src/main/java/openblocks/ApiSetup.java index 2d5e1cb7..783f2560 100644 --- a/src/main/java/openblocks/ApiSetup.java +++ b/src/main/java/openblocks/ApiSetup.java @@ -1,5 +1,6 @@ package openblocks; +import cpw.mods.fml.common.discovery.ASMDataTable; import openblocks.api.ApiHolder; import openblocks.api.IApiInterface; import openblocks.api.OpenBlocksApi; @@ -8,7 +9,6 @@ import openmods.Log; import openmods.access.ApiFactory; import openmods.access.ApiProviderBase; import openmods.access.ApiProviderRegistry; -import cpw.mods.fml.common.discovery.ASMDataTable; public class ApiSetup { diff --git a/src/main/java/openblocks/Config.java b/src/main/java/openblocks/Config.java index 85b92362..d96b06e6 100644 --- a/src/main/java/openblocks/Config.java +++ b/src/main/java/openblocks/Config.java @@ -1,8 +1,10 @@ package openblocks; +import cpw.mods.fml.common.IFuelHandler; +import cpw.mods.fml.common.registry.GameRegistry; +import cpw.mods.fml.common.registry.RegistryDelegate; import java.util.Arrays; import java.util.List; - import net.minecraft.enchantment.EnchantmentData; import net.minecraft.init.Blocks; import net.minecraft.init.Items; @@ -13,20 +15,35 @@ import net.minecraft.item.crafting.IRecipe; import net.minecraft.util.WeightedRandomChestContent; import net.minecraftforge.common.ChestGenHooks; import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.oredict.*; +import net.minecraftforge.oredict.OreDictionary; +import net.minecraftforge.oredict.RecipeSorter; +import net.minecraftforge.oredict.ShapedOreRecipe; +import net.minecraftforge.oredict.ShapelessOreRecipe; import openblocks.OpenBlocks.Enchantments; import openblocks.common.Stencil; import openblocks.common.TrophyHandler; -import openblocks.common.item.*; -import openblocks.common.recipe.*; -import openblocks.enchantments.*; +import openblocks.common.item.ItemGoldenEye; +import openblocks.common.item.ItemImaginary; +import openblocks.common.item.ItemPaintBrush; +import openblocks.common.item.MetasBucket; +import openblocks.common.item.MetasGeneric; +import openblocks.common.item.MetasGenericUnstackable; +import openblocks.common.recipe.CrayonGlassesRecipe; +import openblocks.common.recipe.CrayonMixingRecipe; +import openblocks.common.recipe.EpicEraserRecipe; +import openblocks.common.recipe.GoldenEyeRechargeRecipe; +import openblocks.common.recipe.MapCloneRecipe; +import openblocks.common.recipe.MapResizeRecipe; +import openblocks.enchantments.EnchantmentExplosive; +import openblocks.enchantments.EnchantmentFlimFlam; +import openblocks.enchantments.EnchantmentLastStand; +import openblocks.enchantments.ExplosiveEnchantmentsHandler; +import openblocks.enchantments.FlimFlamEnchantmentsHandler; +import openblocks.enchantments.LastStandEnchantmentsHandler; import openmods.config.properties.ConfigProperty; import openmods.config.properties.OnLineModifiable; import openmods.utils.ColorUtils; import openmods.utils.ColorUtils.ColorMeta; -import cpw.mods.fml.common.IFuelHandler; -import cpw.mods.fml.common.registry.GameRegistry; -import cpw.mods.fml.common.registry.RegistryDelegate; public class Config { diff --git a/src/main/java/openblocks/NEIOpenBlocksConfig.java b/src/main/java/openblocks/NEIOpenBlocksConfig.java index cfd1f619..eb6c8e85 100644 --- a/src/main/java/openblocks/NEIOpenBlocksConfig.java +++ b/src/main/java/openblocks/NEIOpenBlocksConfig.java @@ -1,13 +1,11 @@ package openblocks; +import codechicken.nei.api.IConfigureNEI; +import com.google.common.base.Throwables; import java.lang.reflect.Method; - import net.minecraft.item.ItemStack; import net.minecraftforge.oredict.OreDictionary; import openblocks.OpenBlocks.Items; -import codechicken.nei.api.IConfigureNEI; - -import com.google.common.base.Throwables; public class NEIOpenBlocksConfig implements IConfigureNEI { diff --git a/src/main/java/openblocks/OpenBlocks.java b/src/main/java/openblocks/OpenBlocks.java index b1ec4687..8f1d7f5b 100644 --- a/src/main/java/openblocks/OpenBlocks.java +++ b/src/main/java/openblocks/OpenBlocks.java @@ -1,7 +1,24 @@ package openblocks; +import com.google.common.base.Objects; +import cpw.mods.fml.common.FMLCommonHandler; +import cpw.mods.fml.common.Mod; +import cpw.mods.fml.common.Mod.EventHandler; +import cpw.mods.fml.common.Mod.Instance; +import cpw.mods.fml.common.SidedProxy; +import cpw.mods.fml.common.event.FMLConstructionEvent; +import cpw.mods.fml.common.event.FMLInitializationEvent; +import cpw.mods.fml.common.event.FMLInterModComms; +import cpw.mods.fml.common.event.FMLMissingMappingsEvent; +import cpw.mods.fml.common.event.FMLPostInitializationEvent; +import cpw.mods.fml.common.event.FMLPreInitializationEvent; +import cpw.mods.fml.common.event.FMLServerStartingEvent; +import cpw.mods.fml.common.network.NetworkRegistry; +import cpw.mods.fml.common.registry.EntityRegistry; +import cpw.mods.fml.common.registry.VillagerRegistry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import java.util.List; - import net.minecraft.block.Block; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.enchantment.Enchantment; @@ -17,18 +34,165 @@ import net.minecraftforge.common.config.Configuration; import net.minecraftforge.fluids.Fluid; import net.minecraftforge.fluids.FluidRegistry; import net.minecraftforge.oredict.OreDictionary; -import openblocks.common.*; -import openblocks.common.block.*; -import openblocks.common.entity.*; -import openblocks.common.item.*; +import openblocks.common.CommandInventory; +import openblocks.common.DonationUrlManager; +import openblocks.common.ElevatorActionHandler; +import openblocks.common.ElevatorBlockRules; +import openblocks.common.EntityEventHandler; +import openblocks.common.GameRuleManager; +import openblocks.common.GuiOpenHandler; +import openblocks.common.LuggageDropHandler; +import openblocks.common.MagnetWhitelists; +import openblocks.common.MapDataManager; +import openblocks.common.PlayerDeathHandler; +import openblocks.common.PlayerInventoryStore; +import openblocks.common.RadioVillagerTradeManager; +import openblocks.common.ServerTickHandler; +import openblocks.common.block.BlockAutoAnvil; +import openblocks.common.block.BlockAutoEnchantmentTable; +import openblocks.common.block.BlockBearTrap; +import openblocks.common.block.BlockBigButton; +import openblocks.common.block.BlockBlockBreaker; +import openblocks.common.block.BlockBlockPlacer; +import openblocks.common.block.BlockBuilderGuide; +import openblocks.common.block.BlockCannon; +import openblocks.common.block.BlockCanvas; +import openblocks.common.block.BlockCanvasGlass; +import openblocks.common.block.BlockDonationStation; +import openblocks.common.block.BlockDrawingTable; +import openblocks.common.block.BlockElevator; +import openblocks.common.block.BlockElevatorRotating; +import openblocks.common.block.BlockFan; +import openblocks.common.block.BlockFlag; +import openblocks.common.block.BlockGoldenEgg; +import openblocks.common.block.BlockGrave; +import openblocks.common.block.BlockGuide; +import openblocks.common.block.BlockHeal; +import openblocks.common.block.BlockImaginary; +import openblocks.common.block.BlockItemDropper; +import openblocks.common.block.BlockLadder; +import openblocks.common.block.BlockPaintCan; +import openblocks.common.block.BlockPaintMixer; +import openblocks.common.block.BlockPath; +import openblocks.common.block.BlockProjector; +import openblocks.common.block.BlockRopeLadder; +import openblocks.common.block.BlockScaffolding; +import openblocks.common.block.BlockSky; +import openblocks.common.block.BlockSponge; +import openblocks.common.block.BlockSprinkler; +import openblocks.common.block.BlockTank; +import openblocks.common.block.BlockTarget; +import openblocks.common.block.BlockTrophy; +import openblocks.common.block.BlockVacuumHopper; +import openblocks.common.block.BlockVillageHighlighter; +import openblocks.common.block.BlockXPBottler; +import openblocks.common.block.BlockXPDrain; +import openblocks.common.block.BlockXPShower; +import openblocks.common.entity.EntityCartographer; +import openblocks.common.entity.EntityGoldenEye; +import openblocks.common.entity.EntityHangGlider; +import openblocks.common.entity.EntityItemProjectile; +import openblocks.common.entity.EntityLuggage; +import openblocks.common.entity.EntityMagnet; +import openblocks.common.entity.EntityMiniMe; +import openblocks.common.entity.EntityMountedBlock; +import openblocks.common.entity.EntityXPOrbNoFly; +import openblocks.common.item.ItemCartographer; +import openblocks.common.item.ItemCraneBackpack; +import openblocks.common.item.ItemCraneControl; +import openblocks.common.item.ItemCursor; +import openblocks.common.item.ItemDevNull; +import openblocks.common.item.ItemElevator; +import openblocks.common.item.ItemEmptyMap; +import openblocks.common.item.ItemEpicEraser; +import openblocks.common.item.ItemFilledBucket; +import openblocks.common.item.ItemFlagBlock; +import openblocks.common.item.ItemGoldenEye; +import openblocks.common.item.ItemGuide; +import openblocks.common.item.ItemHangGlider; +import openblocks.common.item.ItemHeightMap; +import openblocks.common.item.ItemImaginary; +import openblocks.common.item.ItemImaginationGlasses; import openblocks.common.item.ItemImaginationGlasses.ItemCrayonGlasses; -import openblocks.common.tileentity.*; -import openblocks.enchantments.flimflams.*; +import openblocks.common.item.ItemInfoBook; +import openblocks.common.item.ItemLuggage; +import openblocks.common.item.ItemOBGeneric; +import openblocks.common.item.ItemOBGenericUnstackable; +import openblocks.common.item.ItemPaintBrush; +import openblocks.common.item.ItemPaintCan; +import openblocks.common.item.ItemPedometer; +import openblocks.common.item.ItemSkyBlock; +import openblocks.common.item.ItemSleepingBag; +import openblocks.common.item.ItemSlimalyzer; +import openblocks.common.item.ItemSonicGlasses; +import openblocks.common.item.ItemSpongeOnAStick; +import openblocks.common.item.ItemSqueegee; +import openblocks.common.item.ItemStencil; +import openblocks.common.item.ItemTankBlock; +import openblocks.common.item.ItemTastyClay; +import openblocks.common.item.ItemTrophyBlock; +import openblocks.common.item.ItemWrench; +import openblocks.common.tileentity.TileEntityAutoAnvil; +import openblocks.common.tileentity.TileEntityAutoEnchantmentTable; +import openblocks.common.tileentity.TileEntityBearTrap; +import openblocks.common.tileentity.TileEntityBigButton; +import openblocks.common.tileentity.TileEntityBlockBreaker; +import openblocks.common.tileentity.TileEntityBlockPlacer; +import openblocks.common.tileentity.TileEntityBuilderGuide; +import openblocks.common.tileentity.TileEntityCannon; +import openblocks.common.tileentity.TileEntityCanvas; +import openblocks.common.tileentity.TileEntityDonationStation; +import openblocks.common.tileentity.TileEntityDrawingTable; +import openblocks.common.tileentity.TileEntityElevatorRotating; +import openblocks.common.tileentity.TileEntityFan; +import openblocks.common.tileentity.TileEntityFlag; +import openblocks.common.tileentity.TileEntityGoldenEgg; +import openblocks.common.tileentity.TileEntityGrave; +import openblocks.common.tileentity.TileEntityGuide; +import openblocks.common.tileentity.TileEntityHealBlock; +import openblocks.common.tileentity.TileEntityImaginary; +import openblocks.common.tileentity.TileEntityItemDropper; +import openblocks.common.tileentity.TileEntityPaintCan; +import openblocks.common.tileentity.TileEntityPaintMixer; +import openblocks.common.tileentity.TileEntityProjector; +import openblocks.common.tileentity.TileEntitySky; +import openblocks.common.tileentity.TileEntitySprinkler; +import openblocks.common.tileentity.TileEntityTank; +import openblocks.common.tileentity.TileEntityTarget; +import openblocks.common.tileentity.TileEntityTrophy; +import openblocks.common.tileentity.TileEntityVacuumHopper; +import openblocks.common.tileentity.TileEntityVillageHighlighter; +import openblocks.common.tileentity.TileEntityXPBottler; +import openblocks.common.tileentity.TileEntityXPDrain; +import openblocks.common.tileentity.TileEntityXPShower; +import openblocks.enchantments.flimflams.BaneFlimFlam; +import openblocks.enchantments.flimflams.DummyCreepersFlimFlam; +import openblocks.enchantments.flimflams.EffectFlimFlam; +import openblocks.enchantments.flimflams.EncaseFlimFlam; +import openblocks.enchantments.flimflams.FlimFlamRegistry; +import openblocks.enchantments.flimflams.InventoryShuffleFlimFlam; +import openblocks.enchantments.flimflams.InvisibleMobsFlimFlam; +import openblocks.enchantments.flimflams.ItemDropFlimFlam; +import openblocks.enchantments.flimflams.LoreFlimFlam; +import openblocks.enchantments.flimflams.MountFlimFlam; +import openblocks.enchantments.flimflams.RenameFlimFlam; +import openblocks.enchantments.flimflams.SheepDyeFlimFlam; +import openblocks.enchantments.flimflams.SkyblockFlimFlam; +import openblocks.enchantments.flimflams.SnowballsFlimFlam; +import openblocks.enchantments.flimflams.SoundFlimFlam; +import openblocks.enchantments.flimflams.SquidFilmFlam; +import openblocks.enchantments.flimflams.TeleportFlimFlam; +import openblocks.enchantments.flimflams.UselessToolFlimFlam; import openblocks.events.ElevatorActionEvent; import openblocks.events.PlayerActionEvent; import openblocks.integration.ModuleAdapters; import openblocks.integration.ModuleTurtles; -import openblocks.rpc.*; +import openblocks.rpc.IColorChanger; +import openblocks.rpc.IGuideAnimationTrigger; +import openblocks.rpc.ILevelChanger; +import openblocks.rpc.IRotatable; +import openblocks.rpc.IStencilCrafter; +import openblocks.rpc.ITriggerable; import openblocks.rubbish.BrickManager; import openblocks.rubbish.CommandFlimFlam; import openblocks.rubbish.CommandLuck; @@ -36,7 +200,10 @@ import openmods.Mods; import openmods.OpenMods; import openmods.config.BlockInstances; import openmods.config.ItemInstances; -import openmods.config.game.*; +import openmods.config.game.FactoryRegistry; +import openmods.config.game.ModStartupHelper; +import openmods.config.game.RegisterBlock; +import openmods.config.game.RegisterItem; import openmods.config.properties.ConfigProcessing; import openmods.integration.Integration; import openmods.liquids.BucketFillHandler; @@ -44,18 +211,6 @@ import openmods.network.event.NetworkEventManager; import openmods.network.rpc.RpcCallDispatcher; import openmods.utils.EnchantmentUtils; -import com.google.common.base.Objects; - -import cpw.mods.fml.common.*; -import cpw.mods.fml.common.Mod.EventHandler; -import cpw.mods.fml.common.Mod.Instance; -import cpw.mods.fml.common.event.*; -import cpw.mods.fml.common.network.NetworkRegistry; -import cpw.mods.fml.common.registry.EntityRegistry; -import cpw.mods.fml.common.registry.VillagerRegistry; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - @Mod(modid = OpenBlocks.MODID, name = OpenBlocks.NAME, version = OpenBlocks.VERSION, dependencies = OpenBlocks.DEPENDENCIES, guiFactory = "openblocks.client.ModGuiFactory") public class OpenBlocks { public static final String MODID = "OpenBlocks"; diff --git a/src/main/java/openblocks/OpenBlocksCorePlugin.java b/src/main/java/openblocks/OpenBlocksCorePlugin.java index 58953895..9b8292fb 100644 --- a/src/main/java/openblocks/OpenBlocksCorePlugin.java +++ b/src/main/java/openblocks/OpenBlocksCorePlugin.java @@ -1,11 +1,10 @@ package openblocks; -import java.util.Map; - -import net.minecraft.launchwrapper.Launch; -import openmods.core.OpenModsCorePlugin; import cpw.mods.fml.relauncher.IFMLLoadingPlugin; import cpw.mods.fml.relauncher.IFMLLoadingPlugin.SortingIndex; +import java.util.Map; +import net.minecraft.launchwrapper.Launch; +import openmods.core.OpenModsCorePlugin; //must be higher than one in openmodslib @SortingIndex(32) diff --git a/src/main/java/openblocks/OpenBlocksGuiHandler.java b/src/main/java/openblocks/OpenBlocksGuiHandler.java index 291bd03a..d7ef57a9 100644 --- a/src/main/java/openblocks/OpenBlocksGuiHandler.java +++ b/src/main/java/openblocks/OpenBlocksGuiHandler.java @@ -1,5 +1,6 @@ package openblocks; +import cpw.mods.fml.common.network.IGuiHandler; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.world.World; @@ -10,7 +11,6 @@ import openblocks.common.container.ContainerLuggage; import openblocks.common.entity.EntityLuggage; import openblocks.common.item.ItemDevNull; import openmods.Log; -import cpw.mods.fml.common.network.IGuiHandler; public class OpenBlocksGuiHandler implements IGuiHandler { diff --git a/src/main/java/openblocks/api/ApiHolder.java b/src/main/java/openblocks/api/ApiHolder.java index 9ced5310..3aeb5c1c 100644 --- a/src/main/java/openblocks/api/ApiHolder.java +++ b/src/main/java/openblocks/api/ApiHolder.java @@ -1,6 +1,9 @@ package openblocks.api; -import java.lang.annotation.*; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; /** * Static variables marked with this annotation will be filled with instance diff --git a/src/main/java/openblocks/api/GraveDropsEvent.java b/src/main/java/openblocks/api/GraveDropsEvent.java index 0a252fdb..423fec49 100644 --- a/src/main/java/openblocks/api/GraveDropsEvent.java +++ b/src/main/java/openblocks/api/GraveDropsEvent.java @@ -1,15 +1,12 @@ package openblocks.api; -import java.util.List; - -import net.minecraft.entity.item.EntityItem; -import net.minecraft.entity.player.EntityPlayer; - import com.google.common.base.Preconditions; import com.google.common.collect.Lists; - import cpw.mods.fml.common.eventhandler.Cancelable; import cpw.mods.fml.common.eventhandler.Event; +import java.util.List; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.entity.player.EntityPlayer; @Cancelable public class GraveDropsEvent extends Event { diff --git a/src/main/java/openblocks/api/GraveSpawnEvent.java b/src/main/java/openblocks/api/GraveSpawnEvent.java index 2ae9c519..1620a72f 100644 --- a/src/main/java/openblocks/api/GraveSpawnEvent.java +++ b/src/main/java/openblocks/api/GraveSpawnEvent.java @@ -1,12 +1,11 @@ package openblocks.api; +import cpw.mods.fml.common.eventhandler.Cancelable; import java.util.List; - import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.util.IChatComponent; import net.minecraftforge.event.entity.player.PlayerEvent; -import cpw.mods.fml.common.eventhandler.Cancelable; @Cancelable public class GraveSpawnEvent extends PlayerEvent { diff --git a/src/main/java/openblocks/api/InventoryEvent.java b/src/main/java/openblocks/api/InventoryEvent.java index 4f9b3ad4..88ea1004 100644 --- a/src/main/java/openblocks/api/InventoryEvent.java +++ b/src/main/java/openblocks/api/InventoryEvent.java @@ -1,15 +1,13 @@ package openblocks.api; -import java.util.HashMap; -import java.util.Map; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; -import net.minecraftforge.event.entity.player.PlayerEvent; - import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Maps; +import java.util.HashMap; +import java.util.Map; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraftforge.event.entity.player.PlayerEvent; public class InventoryEvent extends PlayerEvent { diff --git a/src/main/java/openblocks/api/SleepingBagUseEvent.java b/src/main/java/openblocks/api/SleepingBagUseEvent.java index d9dde718..dee0e2e6 100644 --- a/src/main/java/openblocks/api/SleepingBagUseEvent.java +++ b/src/main/java/openblocks/api/SleepingBagUseEvent.java @@ -1,10 +1,10 @@ package openblocks.api; +import cpw.mods.fml.common.eventhandler.Event; +import cpw.mods.fml.common.eventhandler.Event.HasResult; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.util.IChatComponent; import net.minecraftforge.event.entity.player.PlayerEvent; -import cpw.mods.fml.common.eventhandler.Event; -import cpw.mods.fml.common.eventhandler.Event.HasResult; /** * Event triggered before player uses sleeping bag. diff --git a/src/main/java/openblocks/asm/EntityPlayerVisitor.java b/src/main/java/openblocks/asm/EntityPlayerVisitor.java index 04d20aa6..e7465301 100644 --- a/src/main/java/openblocks/asm/EntityPlayerVisitor.java +++ b/src/main/java/openblocks/asm/EntityPlayerVisitor.java @@ -2,8 +2,10 @@ package openblocks.asm; import openmods.Log; import openmods.asm.MethodMatcher; - -import org.objectweb.asm.*; +import org.objectweb.asm.ClassVisitor; +import org.objectweb.asm.Label; +import org.objectweb.asm.MethodVisitor; +import org.objectweb.asm.Opcodes; public class EntityPlayerVisitor extends ClassVisitor { diff --git a/src/main/java/openblocks/asm/OpenBlocksClassTransformer.java b/src/main/java/openblocks/asm/OpenBlocksClassTransformer.java index dbcfb319..b825be0f 100644 --- a/src/main/java/openblocks/asm/OpenBlocksClassTransformer.java +++ b/src/main/java/openblocks/asm/OpenBlocksClassTransformer.java @@ -4,7 +4,6 @@ import net.minecraft.launchwrapper.IClassTransformer; import openmods.Log; import openmods.asm.VisitorHelper; import openmods.asm.VisitorHelper.TransformProvider; - import org.objectweb.asm.ClassVisitor; import org.objectweb.asm.ClassWriter; diff --git a/src/main/java/openblocks/client/ChangelogBuilder.java b/src/main/java/openblocks/client/ChangelogBuilder.java index 7e84a733..33d76616 100644 --- a/src/main/java/openblocks/client/ChangelogBuilder.java +++ b/src/main/java/openblocks/client/ChangelogBuilder.java @@ -1,22 +1,20 @@ package openblocks.client; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.Lists; +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; import java.io.InputStream; import java.io.InputStreamReader; import java.io.Reader; import java.lang.reflect.Type; import java.util.ArrayList; import java.util.List; - import net.minecraft.client.Minecraft; import net.minecraft.client.resources.IResource; import net.minecraft.util.ResourceLocation; import openmods.Log; -import com.google.common.collect.ImmutableList; -import com.google.common.collect.Lists; -import com.google.gson.Gson; -import com.google.gson.reflect.TypeToken; - public class ChangelogBuilder { private static final ResourceLocation CHANGELOG = new ResourceLocation("openblocks", "changelog.json"); diff --git a/src/main/java/openblocks/client/ClientProxy.java b/src/main/java/openblocks/client/ClientProxy.java index 348309a3..8c4e8671 100644 --- a/src/main/java/openblocks/client/ClientProxy.java +++ b/src/main/java/openblocks/client/ClientProxy.java @@ -1,5 +1,10 @@ package openblocks.client; +import cpw.mods.fml.client.registry.ClientRegistry; +import cpw.mods.fml.client.registry.RenderingRegistry; +import cpw.mods.fml.common.FMLCommonHandler; +import cpw.mods.fml.common.eventhandler.SubscribeEvent; +import cpw.mods.fml.common.registry.VillagerRegistry; import net.minecraft.client.Minecraft; import net.minecraft.client.particle.EntityFX; import net.minecraft.item.Item; @@ -17,24 +22,84 @@ import openblocks.OpenBlocks; import openblocks.client.bindings.KeyInputHandler; import openblocks.client.fx.FXLiquidSpray; import openblocks.client.model.ModelCraneBackpack; -import openblocks.client.renderer.block.*; -import openblocks.client.renderer.entity.*; -import openblocks.client.renderer.item.*; -import openblocks.client.renderer.tileentity.*; +import openblocks.client.renderer.block.BlockCanvasRenderer; +import openblocks.client.renderer.block.BlockGuideRenderer; +import openblocks.client.renderer.block.BlockPaintCanRenderer; +import openblocks.client.renderer.block.BlockPathRenderer; +import openblocks.client.renderer.block.BlockRopeLadderRenderer; +import openblocks.client.renderer.block.BlockSkyRenderer; +import openblocks.client.renderer.block.BlockTankRenderer; +import openblocks.client.renderer.entity.EntityCartographerRenderer; +import openblocks.client.renderer.entity.EntityGoldenEyeRenderer; +import openblocks.client.renderer.entity.EntityHangGliderRenderer; +import openblocks.client.renderer.entity.EntityLuggageRenderer; +import openblocks.client.renderer.entity.EntityMagnetRenderer; +import openblocks.client.renderer.entity.EntityMiniMeRenderer; +import openblocks.client.renderer.entity.EntitySelectionHandler; +import openblocks.client.renderer.item.ItemRendererDevNull; +import openblocks.client.renderer.item.ItemRendererHangGlider; +import openblocks.client.renderer.item.ItemRendererLuggage; +import openblocks.client.renderer.item.ItemRendererPaintCan; +import openblocks.client.renderer.item.ItemRendererTank; +import openblocks.client.renderer.item.ItemRendererTrophy; +import openblocks.client.renderer.tileentity.TileEntityAutoAnvilRenderer; +import openblocks.client.renderer.tileentity.TileEntityAutoEnchantmentTableRenderer; +import openblocks.client.renderer.tileentity.TileEntityBearTrapRenderer; +import openblocks.client.renderer.tileentity.TileEntityCannonRenderer; +import openblocks.client.renderer.tileentity.TileEntityDonationStationRenderer; +import openblocks.client.renderer.tileentity.TileEntityFanRenderer; +import openblocks.client.renderer.tileentity.TileEntityFlagRenderer; +import openblocks.client.renderer.tileentity.TileEntityGoldenEggRenderer; +import openblocks.client.renderer.tileentity.TileEntityGraveRenderer; +import openblocks.client.renderer.tileentity.TileEntityImaginaryRenderer; +import openblocks.client.renderer.tileentity.TileEntityPaintMixerRenderer; +import openblocks.client.renderer.tileentity.TileEntityProjectorRenderer; +import openblocks.client.renderer.tileentity.TileEntitySkyRenderer; +import openblocks.client.renderer.tileentity.TileEntitySprinklerRenderer; +import openblocks.client.renderer.tileentity.TileEntityTankRenderer; +import openblocks.client.renderer.tileentity.TileEntityTargetRenderer; +import openblocks.client.renderer.tileentity.TileEntityTrophyRenderer; +import openblocks.client.renderer.tileentity.TileEntityVacuumHopperRenderer; +import openblocks.client.renderer.tileentity.TileEntityVillageHighlighterRenderer; +import openblocks.client.renderer.tileentity.TileEntityXPShowerRenderer; import openblocks.client.renderer.tileentity.guide.TileEntityBuilderGuideRenderer; import openblocks.client.renderer.tileentity.guide.TileEntityGuideRenderer; import openblocks.common.block.BlockGuide; -import openblocks.common.entity.*; -import openblocks.common.tileentity.*; +import openblocks.common.entity.EntityCartographer; +import openblocks.common.entity.EntityGoldenEye; +import openblocks.common.entity.EntityHangGlider; +import openblocks.common.entity.EntityLuggage; +import openblocks.common.entity.EntityMagnet; +import openblocks.common.entity.EntityMiniMe; +import openblocks.common.tileentity.TileEntityAutoAnvil; +import openblocks.common.tileentity.TileEntityAutoEnchantmentTable; +import openblocks.common.tileentity.TileEntityBearTrap; +import openblocks.common.tileentity.TileEntityBuilderGuide; +import openblocks.common.tileentity.TileEntityCannon; +import openblocks.common.tileentity.TileEntityDonationStation; +import openblocks.common.tileentity.TileEntityFan; +import openblocks.common.tileentity.TileEntityFlag; +import openblocks.common.tileentity.TileEntityGoldenEgg; +import openblocks.common.tileentity.TileEntityGrave; +import openblocks.common.tileentity.TileEntityGuide; +import openblocks.common.tileentity.TileEntityImaginary; +import openblocks.common.tileentity.TileEntityPaintMixer; +import openblocks.common.tileentity.TileEntityProjector; +import openblocks.common.tileentity.TileEntitySky; +import openblocks.common.tileentity.TileEntitySprinkler; +import openblocks.common.tileentity.TileEntityTank; +import openblocks.common.tileentity.TileEntityTarget; +import openblocks.common.tileentity.TileEntityTrophy; +import openblocks.common.tileentity.TileEntityVacuumHopper; +import openblocks.common.tileentity.TileEntityVillageHighlighter; +import openblocks.common.tileentity.TileEntityXPShower; import openblocks.enchantments.flimflams.LoreFlimFlam; import openmods.entity.EntityBlock; import openmods.entity.renderer.EntityBlockRenderer; -import openmods.renderer.*; -import cpw.mods.fml.client.registry.ClientRegistry; -import cpw.mods.fml.client.registry.RenderingRegistry; -import cpw.mods.fml.common.FMLCommonHandler; -import cpw.mods.fml.common.eventhandler.SubscribeEvent; -import cpw.mods.fml.common.registry.VillagerRegistry; +import openmods.renderer.BlockRenderingHandler; +import openmods.renderer.BlockRenderingValidator; +import openmods.renderer.IBlockRenderer; +import openmods.renderer.RotatedBlockRenderer; public class ClientProxy implements IOpenBlocksProxy { diff --git a/src/main/java/openblocks/client/ClientTickHandler.java b/src/main/java/openblocks/client/ClientTickHandler.java index 0adc9bd1..89ef1baf 100644 --- a/src/main/java/openblocks/client/ClientTickHandler.java +++ b/src/main/java/openblocks/client/ClientTickHandler.java @@ -1,11 +1,11 @@ package openblocks.client; -import net.minecraft.client.Minecraft; -import net.minecraft.world.World; -import openblocks.common.entity.EntityHangGlider; import cpw.mods.fml.common.eventhandler.SubscribeEvent; import cpw.mods.fml.common.gameevent.TickEvent; import cpw.mods.fml.common.gameevent.TickEvent.Phase; +import net.minecraft.client.Minecraft; +import net.minecraft.world.World; +import openblocks.common.entity.EntityHangGlider; public class ClientTickHandler { diff --git a/src/main/java/openblocks/client/GliderPlayerRenderHandler.java b/src/main/java/openblocks/client/GliderPlayerRenderHandler.java index 62f8164e..3cd8ce09 100644 --- a/src/main/java/openblocks/client/GliderPlayerRenderHandler.java +++ b/src/main/java/openblocks/client/GliderPlayerRenderHandler.java @@ -1,13 +1,11 @@ package openblocks.client; +import cpw.mods.fml.common.eventhandler.SubscribeEvent; import net.minecraft.client.entity.AbstractClientPlayer; import openblocks.common.entity.EntityHangGlider; import openmods.renderer.PlayerBodyRenderEvent; - import org.lwjgl.opengl.GL11; -import cpw.mods.fml.common.eventhandler.SubscribeEvent; - public class GliderPlayerRenderHandler { @SubscribeEvent diff --git a/src/main/java/openblocks/client/Icons.java b/src/main/java/openblocks/client/Icons.java index 7594c417..faa6a520 100644 --- a/src/main/java/openblocks/client/Icons.java +++ b/src/main/java/openblocks/client/Icons.java @@ -1,16 +1,14 @@ package openblocks.client; +import com.google.common.base.Preconditions; import net.minecraft.client.renderer.Tessellator; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.client.renderer.texture.TextureManager; import net.minecraft.util.IIcon; import net.minecraft.util.MathHelper; import openmods.utils.TextureUtils; - import org.lwjgl.opengl.GL11; -import com.google.common.base.Preconditions; - public class Icons { public static void renderQuad(Tessellator tes, double scale, IIcon icon) { diff --git a/src/main/java/openblocks/client/ModGuiFactory.java b/src/main/java/openblocks/client/ModGuiFactory.java index de682775..05746c90 100644 --- a/src/main/java/openblocks/client/ModGuiFactory.java +++ b/src/main/java/openblocks/client/ModGuiFactory.java @@ -1,16 +1,13 @@ package openblocks.client; +import com.google.common.collect.ImmutableSet; +import cpw.mods.fml.client.IModGuiFactory; import java.util.Set; - import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiScreen; import openblocks.OpenBlocks; import openmods.config.gui.OpenModsConfigScreen; -import com.google.common.collect.ImmutableSet; - -import cpw.mods.fml.client.IModGuiFactory; - public class ModGuiFactory implements IModGuiFactory { public static class ConfigScreen extends OpenModsConfigScreen { diff --git a/src/main/java/openblocks/client/SleepingBagRenderHandler.java b/src/main/java/openblocks/client/SleepingBagRenderHandler.java index bdb9fb88..c86e076b 100644 --- a/src/main/java/openblocks/client/SleepingBagRenderHandler.java +++ b/src/main/java/openblocks/client/SleepingBagRenderHandler.java @@ -1,10 +1,10 @@ package openblocks.client; +import cpw.mods.fml.common.eventhandler.SubscribeEvent; import net.minecraft.client.entity.EntityOtherPlayerMP; import net.minecraft.entity.player.EntityPlayer; import net.minecraftforge.client.event.RenderPlayerEvent; import openblocks.common.item.ItemSleepingBag; -import cpw.mods.fml.common.eventhandler.SubscribeEvent; public class SleepingBagRenderHandler { diff --git a/src/main/java/openblocks/client/SoundEventsManager.java b/src/main/java/openblocks/client/SoundEventsManager.java index 32ef20b4..b722dabf 100644 --- a/src/main/java/openblocks/client/SoundEventsManager.java +++ b/src/main/java/openblocks/client/SoundEventsManager.java @@ -1,8 +1,10 @@ package openblocks.client; +import com.google.common.collect.Lists; +import cpw.mods.fml.client.FMLClientHandler; +import cpw.mods.fml.common.eventhandler.SubscribeEvent; import java.util.Iterator; import java.util.List; - import net.minecraft.client.Minecraft; import net.minecraft.client.audio.ISound; import net.minecraft.client.audio.SoundHandler; @@ -22,14 +24,8 @@ import openmods.config.properties.ConfigurationChange; import openmods.renderer.ManualDisplayList; import openmods.renderer.ManualDisplayList.Renderer; import openmods.utils.render.RenderUtils; - import org.lwjgl.opengl.GL11; -import com.google.common.collect.Lists; - -import cpw.mods.fml.client.FMLClientHandler; -import cpw.mods.fml.common.eventhandler.SubscribeEvent; - public class SoundEventsManager { private SoundEventsManager() {} diff --git a/src/main/java/openblocks/client/SoundIconRegistry.java b/src/main/java/openblocks/client/SoundIconRegistry.java index a3cde1fe..bba33126 100644 --- a/src/main/java/openblocks/client/SoundIconRegistry.java +++ b/src/main/java/openblocks/client/SoundIconRegistry.java @@ -3,10 +3,13 @@ package openblocks.client; import static openblocks.client.Icons.blockIcon; import static openblocks.client.Icons.itemIcon; +import com.google.common.base.Preconditions; +import com.google.common.base.Splitter; +import com.google.common.collect.Maps; +import cpw.mods.fml.common.eventhandler.SubscribeEvent; import java.util.Iterator; import java.util.Map; import java.util.NoSuchElementException; - import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.client.renderer.texture.TextureMap; import net.minecraft.entity.EntityList; @@ -17,12 +20,6 @@ import openblocks.client.Icons.ComposedIcon; import openblocks.client.Icons.IDrawableIcon; import openmods.Log; -import com.google.common.base.Preconditions; -import com.google.common.base.Splitter; -import com.google.common.collect.Maps; - -import cpw.mods.fml.common.eventhandler.SubscribeEvent; - public class SoundIconRegistry { private final static String ICON_FRAME = "openblocks:sound_frame"; diff --git a/src/main/java/openblocks/client/StencilSkyRenderer.java b/src/main/java/openblocks/client/StencilSkyRenderer.java index 6fb41ca8..a495881b 100644 --- a/src/main/java/openblocks/client/StencilSkyRenderer.java +++ b/src/main/java/openblocks/client/StencilSkyRenderer.java @@ -1,18 +1,15 @@ package openblocks.client; +import cpw.mods.fml.relauncher.ReflectionHelper; import java.lang.reflect.Method; - import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.EntityRenderer; import net.minecraft.client.renderer.RenderGlobal; import openmods.Log; import openmods.renderer.StencilRendererHandler; - import org.apache.commons.lang3.ArrayUtils; import org.lwjgl.opengl.GL11; -import cpw.mods.fml.relauncher.ReflectionHelper; - public class StencilSkyRenderer extends StencilRendererHandler { private final Method setupFogMethod; diff --git a/src/main/java/openblocks/client/bindings/KeyInputHandler.java b/src/main/java/openblocks/client/bindings/KeyInputHandler.java index a96ff023..d61fa796 100644 --- a/src/main/java/openblocks/client/bindings/KeyInputHandler.java +++ b/src/main/java/openblocks/client/bindings/KeyInputHandler.java @@ -1,16 +1,14 @@ package openblocks.client.bindings; -import net.minecraft.client.Minecraft; -import net.minecraft.client.settings.KeyBinding; -import openblocks.Config; -import openblocks.events.PlayerActionEvent; - -import org.lwjgl.input.Keyboard; - import cpw.mods.fml.client.registry.ClientRegistry; import cpw.mods.fml.common.FMLCommonHandler; import cpw.mods.fml.common.eventhandler.SubscribeEvent; import cpw.mods.fml.common.gameevent.InputEvent; +import net.minecraft.client.Minecraft; +import net.minecraft.client.settings.KeyBinding; +import openblocks.Config; +import openblocks.events.PlayerActionEvent; +import org.lwjgl.input.Keyboard; public class KeyInputHandler { diff --git a/src/main/java/openblocks/client/gui/ChangelogPage.java b/src/main/java/openblocks/client/gui/ChangelogPage.java index d327bda6..72b1c2f7 100644 --- a/src/main/java/openblocks/client/gui/ChangelogPage.java +++ b/src/main/java/openblocks/client/gui/ChangelogPage.java @@ -1,7 +1,9 @@ package openblocks.client.gui; +import com.google.common.base.Function; +import com.google.common.base.Joiner; +import com.google.common.collect.Iterables; import java.util.List; - import net.minecraft.client.Minecraft; import net.minecraft.client.gui.FontRenderer; import net.minecraft.util.StatCollector; @@ -10,10 +12,6 @@ import openmods.gui.component.GuiComponentLabel; import openmods.gui.component.page.BookScaleConfig; import openmods.gui.component.page.PageBase; -import com.google.common.base.Function; -import com.google.common.base.Joiner; -import com.google.common.collect.Iterables; - public class ChangelogPage extends PageBase { private static final Function BULLET_TRANSFORMER = new Function() { diff --git a/src/main/java/openblocks/client/gui/GuiAutoAnvil.java b/src/main/java/openblocks/client/gui/GuiAutoAnvil.java index e4ac23e3..cb210c07 100644 --- a/src/main/java/openblocks/client/gui/GuiAutoAnvil.java +++ b/src/main/java/openblocks/client/gui/GuiAutoAnvil.java @@ -1,5 +1,6 @@ package openblocks.client.gui; +import com.google.common.collect.ImmutableList; import net.minecraft.block.Block; import net.minecraft.enchantment.Enchantment; import net.minecraft.init.Items; @@ -9,12 +10,16 @@ import openblocks.common.container.ContainerAutoAnvil; import openblocks.common.tileentity.TileEntityAutoAnvil; import openblocks.common.tileentity.TileEntityAutoAnvil.AutoSlots; import openmods.gui.GuiConfigurableSlots; -import openmods.gui.component.*; +import openmods.gui.component.BaseComponent; +import openmods.gui.component.BaseComposite; +import openmods.gui.component.GuiComponentLabel; +import openmods.gui.component.GuiComponentSideSelector; +import openmods.gui.component.GuiComponentSprite; +import openmods.gui.component.GuiComponentTab; +import openmods.gui.component.GuiComponentTankLevel; import openmods.gui.logic.ValueCopyAction; import openmods.utils.MiscUtils; -import com.google.common.collect.ImmutableList; - public class GuiAutoAnvil extends GuiConfigurableSlots { public GuiAutoAnvil(ContainerAutoAnvil container) { diff --git a/src/main/java/openblocks/client/gui/GuiAutoEnchantmentTable.java b/src/main/java/openblocks/client/gui/GuiAutoEnchantmentTable.java index 9b102173..02afc79a 100644 --- a/src/main/java/openblocks/client/gui/GuiAutoEnchantmentTable.java +++ b/src/main/java/openblocks/client/gui/GuiAutoEnchantmentTable.java @@ -1,5 +1,6 @@ package openblocks.client.gui; +import com.google.common.collect.ImmutableList; import net.minecraft.enchantment.Enchantment; import net.minecraft.init.Items; import net.minecraft.item.ItemStack; @@ -10,13 +11,15 @@ import openblocks.common.tileentity.TileEntityAutoEnchantmentTable.AutoSlots; import openblocks.rpc.ILevelChanger; import openmods.api.IValueReceiver; import openmods.gui.GuiConfigurableSlots; -import openmods.gui.component.*; +import openmods.gui.component.BaseComposite; +import openmods.gui.component.GuiComponentLabel; +import openmods.gui.component.GuiComponentSlider; +import openmods.gui.component.GuiComponentTab; +import openmods.gui.component.GuiComponentTankLevel; import openmods.gui.listener.IValueChangedListener; import openmods.gui.logic.ValueCopyAction; import openmods.utils.MiscUtils; -import com.google.common.collect.ImmutableList; - public class GuiAutoEnchantmentTable extends GuiConfigurableSlots { public GuiAutoEnchantmentTable(ContainerAutoEnchantmentTable container) { diff --git a/src/main/java/openblocks/client/gui/GuiDonationStation.java b/src/main/java/openblocks/client/gui/GuiDonationStation.java index 29f357de..e52f993e 100644 --- a/src/main/java/openblocks/client/gui/GuiDonationStation.java +++ b/src/main/java/openblocks/client/gui/GuiDonationStation.java @@ -1,10 +1,11 @@ package openblocks.client.gui; +import com.google.common.base.Joiner; +import com.google.common.base.Strings; import java.awt.Desktop; import java.io.IOException; import java.net.URI; import java.util.List; - import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiConfirmOpenLink; import net.minecraft.client.gui.GuiYesNoCallback; @@ -17,9 +18,6 @@ import openmods.gui.component.GuiComponentLabel; import openmods.gui.component.GuiComponentTextButton; import openmods.gui.listener.IMouseDownListener; -import com.google.common.base.Joiner; -import com.google.common.base.Strings; - public class GuiDonationStation extends BaseGuiContainer implements GuiYesNoCallback { private final int PROMPT_REPLY_ACTION = 0; diff --git a/src/main/java/openblocks/client/gui/GuiDrawingTable.java b/src/main/java/openblocks/client/gui/GuiDrawingTable.java index a71bfa26..c5c56e08 100644 --- a/src/main/java/openblocks/client/gui/GuiDrawingTable.java +++ b/src/main/java/openblocks/client/gui/GuiDrawingTable.java @@ -7,7 +7,10 @@ import openblocks.common.Stencil; import openblocks.common.container.ContainerDrawingTable; import openblocks.rpc.IStencilCrafter; import openmods.gui.BaseGuiContainer; -import openmods.gui.component.*; +import openmods.gui.component.BaseComponent; +import openmods.gui.component.GuiComponentIconButton; +import openmods.gui.component.GuiComponentSprite; +import openmods.gui.component.GuiComponentTextButton; import openmods.gui.listener.IMouseDownListener; import openmods.utils.render.FakeIcon; diff --git a/src/main/java/openblocks/client/gui/GuiInfoBook.java b/src/main/java/openblocks/client/gui/GuiInfoBook.java index c303251c..f99a8b64 100644 --- a/src/main/java/openblocks/client/gui/GuiInfoBook.java +++ b/src/main/java/openblocks/client/gui/GuiInfoBook.java @@ -1,8 +1,8 @@ package openblocks.client.gui; +import com.google.common.collect.Lists; import java.io.File; import java.util.List; - import net.minecraft.client.Minecraft; import net.minecraft.server.MinecraftServer; import net.minecraft.util.StatCollector; @@ -19,15 +19,14 @@ import openmods.gui.DummyContainer; import openmods.gui.component.BaseComposite; import openmods.gui.component.GuiComponentBook; import openmods.gui.component.GuiComponentLabel; -import openmods.gui.component.page.*; +import openmods.gui.component.page.PageBase; import openmods.gui.component.page.PageBase.ActionIcon; +import openmods.gui.component.page.SectionPage; +import openmods.gui.component.page.TitledPage; import openmods.infobook.PageBuilder; - import org.lwjgl.input.Keyboard; import org.lwjgl.opengl.GL11; -import com.google.common.collect.Lists; - public class GuiInfoBook extends ComponentGui { private GuiComponentBook book; diff --git a/src/main/java/openblocks/client/gui/GuiLuggage.java b/src/main/java/openblocks/client/gui/GuiLuggage.java index 89de3343..24f3be17 100644 --- a/src/main/java/openblocks/client/gui/GuiLuggage.java +++ b/src/main/java/openblocks/client/gui/GuiLuggage.java @@ -1,11 +1,10 @@ package openblocks.client.gui; +import com.google.common.base.Strings; import openblocks.common.container.ContainerLuggage; import openblocks.common.entity.EntityLuggage; import openmods.gui.BaseGuiContainer; -import com.google.common.base.Strings; - public class GuiLuggage extends BaseGuiContainer { private static String getInventoryName(EntityLuggage owner) { diff --git a/src/main/java/openblocks/client/gui/GuiPaintMixer.java b/src/main/java/openblocks/client/gui/GuiPaintMixer.java index 313d7d4c..24879676 100644 --- a/src/main/java/openblocks/client/gui/GuiPaintMixer.java +++ b/src/main/java/openblocks/client/gui/GuiPaintMixer.java @@ -1,7 +1,8 @@ package openblocks.client.gui; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.Lists; import java.util.List; - import net.minecraft.util.StatCollector; import openblocks.common.container.ContainerPaintMixer; import openblocks.common.tileentity.TileEntityPaintMixer; @@ -9,8 +10,16 @@ import openblocks.common.tileentity.TileEntityPaintMixer.DyeSlot; import openblocks.rpc.IColorChanger; import openmods.api.IValueProvider; import openmods.gui.SyncedGuiContainer; -import openmods.gui.component.*; +import openmods.gui.component.BaseComponent; +import openmods.gui.component.GuiComponentColorPicker; +import openmods.gui.component.GuiComponentLevel; +import openmods.gui.component.GuiComponentPalettePicker; import openmods.gui.component.GuiComponentPalettePicker.PaletteEntry; +import openmods.gui.component.GuiComponentProgress; +import openmods.gui.component.GuiComponentRect; +import openmods.gui.component.GuiComponentSlider; +import openmods.gui.component.GuiComponentTextButton; +import openmods.gui.component.GuiComponentTextbox; import openmods.gui.listener.IMouseDownListener; import openmods.gui.listener.IValueChangedListener; import openmods.gui.logic.IValueUpdateAction; @@ -18,9 +27,6 @@ import openmods.gui.logic.ValueCopyAction; import openmods.utils.ColorUtils; import openmods.utils.ColorUtils.ColorMeta; -import com.google.common.collect.ImmutableList; -import com.google.common.collect.Lists; - public class GuiPaintMixer extends SyncedGuiContainer { private static final int CYAN = 0xFF4B9FC1; diff --git a/src/main/java/openblocks/client/gui/GuiProjector.java b/src/main/java/openblocks/client/gui/GuiProjector.java index 71f68a4d..a1587645 100644 --- a/src/main/java/openblocks/client/gui/GuiProjector.java +++ b/src/main/java/openblocks/client/gui/GuiProjector.java @@ -9,12 +9,14 @@ import openblocks.common.MapDataManager; import openblocks.common.container.ContainerProjector; import openblocks.rpc.IRotatable; import openmods.gui.BaseGuiContainer; -import openmods.gui.component.*; +import openmods.gui.component.BaseComponent; +import openmods.gui.component.BaseComposite; +import openmods.gui.component.EmptyComposite; +import openmods.gui.component.GuiComponentIconButton; import openmods.gui.listener.IMouseDownListener; import openmods.gui.misc.Trackball.TrackballWrapper; import openmods.utils.MathUtils; import openmods.utils.render.FakeIcon; - import org.lwjgl.input.Mouse; import org.lwjgl.opengl.GL11; diff --git a/src/main/java/openblocks/client/gui/GuiVacuumHopper.java b/src/main/java/openblocks/client/gui/GuiVacuumHopper.java index fd30384f..d6e4b9e5 100644 --- a/src/main/java/openblocks/client/gui/GuiVacuumHopper.java +++ b/src/main/java/openblocks/client/gui/GuiVacuumHopper.java @@ -8,8 +8,13 @@ import net.minecraftforge.common.util.ForgeDirection; import openblocks.common.container.ContainerVacuumHopper; import openblocks.common.tileentity.TileEntityVacuumHopper; import openmods.gui.SyncedGuiContainer; -import openmods.gui.component.*; +import openmods.gui.component.BaseComposite; +import openmods.gui.component.GuiComponentLabel; +import openmods.gui.component.GuiComponentSideSelector; import openmods.gui.component.GuiComponentSideSelector.ISideSelectedListener; +import openmods.gui.component.GuiComponentTab; +import openmods.gui.component.GuiComponentTabWrapper; +import openmods.gui.component.GuiComponentTankLevel; import openmods.gui.logic.ValueCopyAction; import openmods.utils.bitmap.IReadableBitMap; import openmods.utils.bitmap.IWriteableBitMap; diff --git a/src/main/java/openblocks/client/gui/GuiXPBottler.java b/src/main/java/openblocks/client/gui/GuiXPBottler.java index d43c4017..dcca0683 100644 --- a/src/main/java/openblocks/client/gui/GuiXPBottler.java +++ b/src/main/java/openblocks/client/gui/GuiXPBottler.java @@ -1,5 +1,6 @@ package openblocks.client.gui; +import com.google.common.collect.ImmutableList; import net.minecraft.init.Items; import net.minecraft.item.ItemStack; import net.minecraft.util.StatCollector; @@ -7,12 +8,14 @@ import openblocks.common.container.ContainerXPBottler; import openblocks.common.tileentity.TileEntityXPBottler; import openblocks.common.tileentity.TileEntityXPBottler.AutoSlots; import openmods.gui.GuiConfigurableSlots; -import openmods.gui.component.*; +import openmods.gui.component.BaseComposite; +import openmods.gui.component.GuiComponentLabel; +import openmods.gui.component.GuiComponentProgress; +import openmods.gui.component.GuiComponentTab; +import openmods.gui.component.GuiComponentTankLevel; import openmods.gui.logic.ValueCopyAction; import openmods.utils.MiscUtils; -import com.google.common.collect.ImmutableList; - public class GuiXPBottler extends GuiConfigurableSlots { public GuiXPBottler(ContainerXPBottler container) { diff --git a/src/main/java/openblocks/client/model/ModelCartographer.java b/src/main/java/openblocks/client/model/ModelCartographer.java index 538b8305..ca52d2f9 100644 --- a/src/main/java/openblocks/client/model/ModelCartographer.java +++ b/src/main/java/openblocks/client/model/ModelCartographer.java @@ -1,5 +1,6 @@ package openblocks.client.model; +import cpw.mods.fml.common.eventhandler.SubscribeEvent; import net.minecraft.client.model.ModelBase; import net.minecraft.client.model.ModelRenderer; import net.minecraft.client.renderer.ItemRenderer; @@ -10,11 +11,8 @@ import net.minecraftforge.client.event.TextureStitchEvent; import net.minecraftforge.common.MinecraftForge; import openmods.renderer.DisplayListWrapper; import openmods.utils.TextureUtils; - import org.lwjgl.opengl.GL11; -import cpw.mods.fml.common.eventhandler.SubscribeEvent; - public class ModelCartographer extends ModelBase { private static final float SCALE = 1.0f / 16.0f; private final ModelRenderer body; diff --git a/src/main/java/openblocks/client/model/ModelCraneBackpack.java b/src/main/java/openblocks/client/model/ModelCraneBackpack.java index 64d465b0..01306134 100644 --- a/src/main/java/openblocks/client/model/ModelCraneBackpack.java +++ b/src/main/java/openblocks/client/model/ModelCraneBackpack.java @@ -1,5 +1,6 @@ package openblocks.client.model; +import cpw.mods.fml.common.eventhandler.SubscribeEvent; import net.minecraft.client.Minecraft; import net.minecraft.client.entity.EntityOtherPlayerMP; import net.minecraft.client.model.ModelBiped; @@ -16,11 +17,8 @@ import net.minecraftforge.common.MinecraftForge; import openblocks.common.CraneRegistry; import openblocks.common.entity.EntityMagnet; import openblocks.common.item.ItemCraneBackpack; - import org.lwjgl.opengl.GL11; -import cpw.mods.fml.common.eventhandler.SubscribeEvent; - public class ModelCraneBackpack extends ModelBiped { public static final ModelCraneBackpack instance = new ModelCraneBackpack(); diff --git a/src/main/java/openblocks/client/model/ModelSonicGlasses.java b/src/main/java/openblocks/client/model/ModelSonicGlasses.java index 4460d290..4379818b 100644 --- a/src/main/java/openblocks/client/model/ModelSonicGlasses.java +++ b/src/main/java/openblocks/client/model/ModelSonicGlasses.java @@ -3,7 +3,6 @@ package openblocks.client.model; import net.minecraft.client.model.ModelBiped; import net.minecraft.client.model.ModelRenderer; import net.minecraft.entity.Entity; - import org.lwjgl.opengl.GL11; public class ModelSonicGlasses extends ModelBiped { diff --git a/src/main/java/openblocks/client/renderer/HeightMapRenderer.java b/src/main/java/openblocks/client/renderer/HeightMapRenderer.java index 3a332c11..856f7c6a 100644 --- a/src/main/java/openblocks/client/renderer/HeightMapRenderer.java +++ b/src/main/java/openblocks/client/renderer/HeightMapRenderer.java @@ -1,8 +1,10 @@ package openblocks.client.renderer; +import com.google.common.base.Preconditions; +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; import java.util.List; import java.util.Map; - import net.minecraft.block.material.MapColor; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.Tessellator; @@ -10,13 +12,8 @@ import net.minecraft.client.renderer.texture.TextureManager; import openblocks.common.HeightMapData; import openmods.renderer.DynamicTextureAtlas; import openmods.renderer.DynamicTextureAtlas.AtlasCell; - import org.lwjgl.opengl.GL11; -import com.google.common.base.Preconditions; -import com.google.common.collect.Lists; -import com.google.common.collect.Maps; - public class HeightMapRenderer { public static final HeightMapRenderer instance = new HeightMapRenderer(); diff --git a/src/main/java/openblocks/client/renderer/block/BlockCanvasRenderer.java b/src/main/java/openblocks/client/renderer/block/BlockCanvasRenderer.java index 479dc41a..5fad738d 100644 --- a/src/main/java/openblocks/client/renderer/block/BlockCanvasRenderer.java +++ b/src/main/java/openblocks/client/renderer/block/BlockCanvasRenderer.java @@ -1,7 +1,6 @@ package openblocks.client.renderer.block; import java.util.List; - import net.minecraft.client.renderer.RenderBlocks; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.IBlockAccess; @@ -12,7 +11,6 @@ import openblocks.common.tileentity.TileEntityCanvas; import openmods.renderer.FixedRenderBlocks; import openmods.renderer.IBlockRenderer; import openmods.utils.render.RenderUtils; - import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL12; diff --git a/src/main/java/openblocks/client/renderer/block/BlockPathRenderer.java b/src/main/java/openblocks/client/renderer/block/BlockPathRenderer.java index efe722f7..e756a2b3 100644 --- a/src/main/java/openblocks/client/renderer/block/BlockPathRenderer.java +++ b/src/main/java/openblocks/client/renderer/block/BlockPathRenderer.java @@ -3,14 +3,12 @@ package openblocks.client.renderer.block; import java.util.HashSet; import java.util.Random; import java.util.Set; - import net.minecraft.client.renderer.RenderBlocks; import net.minecraft.util.AxisAlignedBB; import net.minecraft.world.IBlockAccess; import openblocks.common.block.BlockPath; import openmods.renderer.IBlockRenderer; import openmods.tileentity.renderer.OpenRenderHelper; - import org.lwjgl.opengl.GL11; public class BlockPathRenderer implements IBlockRenderer { diff --git a/src/main/java/openblocks/client/renderer/block/BlockTankRenderer.java b/src/main/java/openblocks/client/renderer/block/BlockTankRenderer.java index a691bcc6..7e1b0a7b 100644 --- a/src/main/java/openblocks/client/renderer/block/BlockTankRenderer.java +++ b/src/main/java/openblocks/client/renderer/block/BlockTankRenderer.java @@ -1,6 +1,12 @@ package openblocks.client.renderer.block; -import static openblocks.client.renderer.tileentity.tank.INeighbourMap.*; +import static openblocks.client.renderer.tileentity.tank.INeighbourMap.DIR_DOWN; +import static openblocks.client.renderer.tileentity.tank.INeighbourMap.DIR_EAST; +import static openblocks.client.renderer.tileentity.tank.INeighbourMap.DIR_NORTH; +import static openblocks.client.renderer.tileentity.tank.INeighbourMap.DIR_SOUTH; +import static openblocks.client.renderer.tileentity.tank.INeighbourMap.DIR_UP; +import static openblocks.client.renderer.tileentity.tank.INeighbourMap.DIR_WEST; + import net.minecraft.client.renderer.RenderBlocks; import net.minecraft.client.renderer.Tessellator; import net.minecraft.tileentity.TileEntity; @@ -12,7 +18,6 @@ import openblocks.common.tileentity.TileEntityTank; import openmods.renderer.DisplayListWrapper; import openmods.renderer.IBlockRenderer; import openmods.utils.render.RenderUtils; - import org.lwjgl.opengl.GL11; public class BlockTankRenderer implements IBlockRenderer { diff --git a/src/main/java/openblocks/client/renderer/entity/EntityCartographerRenderer.java b/src/main/java/openblocks/client/renderer/entity/EntityCartographerRenderer.java index 8cac1a43..c4824920 100644 --- a/src/main/java/openblocks/client/renderer/entity/EntityCartographerRenderer.java +++ b/src/main/java/openblocks/client/renderer/entity/EntityCartographerRenderer.java @@ -1,7 +1,6 @@ package openblocks.client.renderer.entity; import java.util.Random; - import net.minecraft.client.Minecraft; import net.minecraft.client.gui.FontRenderer; import net.minecraft.client.renderer.RenderGlobal; @@ -20,7 +19,6 @@ import openblocks.common.entity.EntityCartographer.MapJobs; import openmods.renderer.DisplayListWrapper; import openmods.utils.BlockUtils; import openmods.utils.render.RenderUtils; - import org.lwjgl.opengl.GL11; public class EntityCartographerRenderer extends Render { diff --git a/src/main/java/openblocks/client/renderer/entity/EntityGoldenEyeRenderer.java b/src/main/java/openblocks/client/renderer/entity/EntityGoldenEyeRenderer.java index 5386ea95..d3f6220e 100644 --- a/src/main/java/openblocks/client/renderer/entity/EntityGoldenEyeRenderer.java +++ b/src/main/java/openblocks/client/renderer/entity/EntityGoldenEyeRenderer.java @@ -9,7 +9,6 @@ import net.minecraft.util.IIcon; import net.minecraft.util.ResourceLocation; import openblocks.OpenBlocks.Items; import openmods.utils.render.RenderUtils; - import org.lwjgl.opengl.GL11; public class EntityGoldenEyeRenderer extends Render { diff --git a/src/main/java/openblocks/client/renderer/entity/EntityHangGliderRenderer.java b/src/main/java/openblocks/client/renderer/entity/EntityHangGliderRenderer.java index 5f723bc4..e2211681 100644 --- a/src/main/java/openblocks/client/renderer/entity/EntityHangGliderRenderer.java +++ b/src/main/java/openblocks/client/renderer/entity/EntityHangGliderRenderer.java @@ -7,7 +7,6 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.util.ResourceLocation; import openblocks.common.entity.EntityHangGlider; import openmods.renderer.DisplayListWrapper; - import org.lwjgl.opengl.GL11; public class EntityHangGliderRenderer extends Render { diff --git a/src/main/java/openblocks/client/renderer/entity/EntityLuggageRenderer.java b/src/main/java/openblocks/client/renderer/entity/EntityLuggageRenderer.java index 19ad0028..e22fb592 100644 --- a/src/main/java/openblocks/client/renderer/entity/EntityLuggageRenderer.java +++ b/src/main/java/openblocks/client/renderer/entity/EntityLuggageRenderer.java @@ -1,5 +1,6 @@ package openblocks.client.renderer.entity; +import com.google.common.base.Strings; import net.minecraft.client.model.ModelBase; import net.minecraft.client.renderer.entity.RenderLiving; import net.minecraft.entity.Entity; @@ -7,11 +8,8 @@ import net.minecraft.entity.EntityLivingBase; import net.minecraft.util.ResourceLocation; import openblocks.client.model.ModelLuggage; import openblocks.common.entity.EntityLuggage; - import org.lwjgl.opengl.GL11; -import com.google.common.base.Strings; - public class EntityLuggageRenderer extends RenderLiving { private static ModelBase luggageModel = new ModelLuggage(); diff --git a/src/main/java/openblocks/client/renderer/entity/EntityMagnetRenderer.java b/src/main/java/openblocks/client/renderer/entity/EntityMagnetRenderer.java index a21063b4..9208b2b3 100644 --- a/src/main/java/openblocks/client/renderer/entity/EntityMagnetRenderer.java +++ b/src/main/java/openblocks/client/renderer/entity/EntityMagnetRenderer.java @@ -6,7 +6,6 @@ import net.minecraft.client.renderer.entity.Render; import net.minecraft.entity.Entity; import net.minecraft.util.ResourceLocation; import openblocks.common.entity.EntityMagnet; - import org.lwjgl.opengl.GL11; public class EntityMagnetRenderer extends Render { diff --git a/src/main/java/openblocks/client/renderer/entity/EntitySelectionHandler.java b/src/main/java/openblocks/client/renderer/entity/EntitySelectionHandler.java index 3d238cb7..13515c64 100644 --- a/src/main/java/openblocks/client/renderer/entity/EntitySelectionHandler.java +++ b/src/main/java/openblocks/client/renderer/entity/EntitySelectionHandler.java @@ -1,7 +1,9 @@ package openblocks.client.renderer.entity; +import com.google.common.collect.Maps; +import cpw.mods.fml.common.eventhandler.Event; +import cpw.mods.fml.common.eventhandler.SubscribeEvent; import java.util.Map; - import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.RenderGlobal; import net.minecraft.entity.Entity; @@ -9,11 +11,6 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraftforge.client.event.RenderWorldLastEvent; import net.minecraftforge.common.MinecraftForge; -import com.google.common.collect.Maps; - -import cpw.mods.fml.common.eventhandler.Event; -import cpw.mods.fml.common.eventhandler.SubscribeEvent; - public class EntitySelectionHandler { public interface ISelectAware {} diff --git a/src/main/java/openblocks/client/renderer/item/ItemRendererDevNull.java b/src/main/java/openblocks/client/renderer/item/ItemRendererDevNull.java index ef8ac4d8..65008602 100644 --- a/src/main/java/openblocks/client/renderer/item/ItemRendererDevNull.java +++ b/src/main/java/openblocks/client/renderer/item/ItemRendererDevNull.java @@ -1,5 +1,6 @@ package openblocks.client.renderer.item; +import cpw.mods.fml.common.eventhandler.SubscribeEvent; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.FontRenderer; import net.minecraft.client.renderer.RenderBlocks; @@ -20,12 +21,9 @@ import openmods.inventory.ItemInventory; import openmods.renderer.DisplayListWrapper; import openmods.utils.TextureUtils; import openmods.utils.render.RenderUtils; - import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL12; -import cpw.mods.fml.common.eventhandler.SubscribeEvent; - public class ItemRendererDevNull implements IItemRenderer { protected static RenderItem itemRenderer = new RenderItem(); diff --git a/src/main/java/openblocks/client/renderer/item/ItemRendererHangGlider.java b/src/main/java/openblocks/client/renderer/item/ItemRendererHangGlider.java index 13e05cbc..98c6e6d1 100644 --- a/src/main/java/openblocks/client/renderer/item/ItemRendererHangGlider.java +++ b/src/main/java/openblocks/client/renderer/item/ItemRendererHangGlider.java @@ -8,7 +8,6 @@ import net.minecraft.util.IIcon; import net.minecraftforge.client.IItemRenderer; import openblocks.common.entity.EntityHangGlider; import openmods.utils.TextureUtils; - import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL12; diff --git a/src/main/java/openblocks/client/renderer/item/ItemRendererLuggage.java b/src/main/java/openblocks/client/renderer/item/ItemRendererLuggage.java index 949b8937..f2d8dc72 100644 --- a/src/main/java/openblocks/client/renderer/item/ItemRendererLuggage.java +++ b/src/main/java/openblocks/client/renderer/item/ItemRendererLuggage.java @@ -8,7 +8,6 @@ import net.minecraftforge.client.IItemRenderer; import openblocks.common.entity.EntityLuggage; import openmods.utils.LazyValue; import openmods.utils.render.RenderUtils; - import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL12; diff --git a/src/main/java/openblocks/client/renderer/item/ItemRendererPaintCan.java b/src/main/java/openblocks/client/renderer/item/ItemRendererPaintCan.java index fe63219f..50483e19 100644 --- a/src/main/java/openblocks/client/renderer/item/ItemRendererPaintCan.java +++ b/src/main/java/openblocks/client/renderer/item/ItemRendererPaintCan.java @@ -2,7 +2,6 @@ package openblocks.client.renderer.item; import java.util.EnumSet; import java.util.Set; - import net.minecraft.client.renderer.RenderBlocks; import net.minecraft.item.ItemStack; import net.minecraftforge.client.IItemRenderer; @@ -10,7 +9,6 @@ import net.minecraftforge.common.util.ForgeDirection; import openblocks.OpenBlocks; import openblocks.common.item.ItemPaintCan; import openmods.utils.render.RenderUtils; - import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL12; diff --git a/src/main/java/openblocks/client/renderer/item/ItemRendererTank.java b/src/main/java/openblocks/client/renderer/item/ItemRendererTank.java index 1963ecfa..3deb0eb6 100644 --- a/src/main/java/openblocks/client/renderer/item/ItemRendererTank.java +++ b/src/main/java/openblocks/client/renderer/item/ItemRendererTank.java @@ -11,7 +11,6 @@ import openblocks.client.renderer.tileentity.TileEntityTankRenderer; import openblocks.client.renderer.tileentity.tank.ITankRenderFluidData; import openblocks.common.tileentity.TileEntityTank; import openmods.utils.Diagonal; - import org.lwjgl.opengl.GL11; public class ItemRendererTank implements IItemRenderer { diff --git a/src/main/java/openblocks/client/renderer/item/ItemRendererTrophy.java b/src/main/java/openblocks/client/renderer/item/ItemRendererTrophy.java index 259340e2..8387d11e 100644 --- a/src/main/java/openblocks/client/renderer/item/ItemRendererTrophy.java +++ b/src/main/java/openblocks/client/renderer/item/ItemRendererTrophy.java @@ -8,7 +8,6 @@ import openblocks.client.renderer.tileentity.TileEntityTrophyRenderer; import openblocks.common.TrophyHandler.Trophy; import openblocks.common.item.ItemTrophyBlock; import openmods.utils.render.RenderUtils; - import org.lwjgl.opengl.GL11; public class ItemRendererTrophy implements IItemRenderer { diff --git a/src/main/java/openblocks/client/renderer/tileentity/TileEntityAutoAnvilRenderer.java b/src/main/java/openblocks/client/renderer/tileentity/TileEntityAutoAnvilRenderer.java index 9e46af49..8e9f8cac 100644 --- a/src/main/java/openblocks/client/renderer/tileentity/TileEntityAutoAnvilRenderer.java +++ b/src/main/java/openblocks/client/renderer/tileentity/TileEntityAutoAnvilRenderer.java @@ -6,7 +6,6 @@ import net.minecraft.util.ResourceLocation; import openblocks.client.model.ModelAutoAnvil; import openblocks.common.tileentity.TileEntityAutoAnvil; import openmods.utils.BlockUtils; - import org.lwjgl.opengl.GL11; public class TileEntityAutoAnvilRenderer extends TileEntitySpecialRenderer { diff --git a/src/main/java/openblocks/client/renderer/tileentity/TileEntityAutoEnchantmentTableRenderer.java b/src/main/java/openblocks/client/renderer/tileentity/TileEntityAutoEnchantmentTableRenderer.java index a7be8cb5..9df26a5f 100644 --- a/src/main/java/openblocks/client/renderer/tileentity/TileEntityAutoEnchantmentTableRenderer.java +++ b/src/main/java/openblocks/client/renderer/tileentity/TileEntityAutoEnchantmentTableRenderer.java @@ -7,7 +7,6 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.MathHelper; import net.minecraft.util.ResourceLocation; import openblocks.common.tileentity.TileEntityAutoEnchantmentTable; - import org.lwjgl.opengl.GL11; public class TileEntityAutoEnchantmentTableRenderer extends TileEntitySpecialRenderer { diff --git a/src/main/java/openblocks/client/renderer/tileentity/TileEntityBearTrapRenderer.java b/src/main/java/openblocks/client/renderer/tileentity/TileEntityBearTrapRenderer.java index 74d85a1c..c630955e 100644 --- a/src/main/java/openblocks/client/renderer/tileentity/TileEntityBearTrapRenderer.java +++ b/src/main/java/openblocks/client/renderer/tileentity/TileEntityBearTrapRenderer.java @@ -6,7 +6,6 @@ import net.minecraft.util.ResourceLocation; import openblocks.client.model.ModelBearTrap; import openblocks.common.tileentity.TileEntityBearTrap; import openmods.utils.BlockUtils; - import org.lwjgl.opengl.GL11; public class TileEntityBearTrapRenderer extends TileEntitySpecialRenderer { diff --git a/src/main/java/openblocks/client/renderer/tileentity/TileEntityCannonRenderer.java b/src/main/java/openblocks/client/renderer/tileentity/TileEntityCannonRenderer.java index 0faf22ab..7029247b 100644 --- a/src/main/java/openblocks/client/renderer/tileentity/TileEntityCannonRenderer.java +++ b/src/main/java/openblocks/client/renderer/tileentity/TileEntityCannonRenderer.java @@ -10,7 +10,6 @@ import openblocks.client.model.ModelCannon; import openblocks.common.item.MetasGenericUnstackable; import openblocks.common.tileentity.TileEntityCannon; import openmods.OpenMods; - import org.lwjgl.opengl.GL11; public class TileEntityCannonRenderer extends TileEntitySpecialRenderer { diff --git a/src/main/java/openblocks/client/renderer/tileentity/TileEntityDonationStationRenderer.java b/src/main/java/openblocks/client/renderer/tileentity/TileEntityDonationStationRenderer.java index a8fab798..8a5688e4 100644 --- a/src/main/java/openblocks/client/renderer/tileentity/TileEntityDonationStationRenderer.java +++ b/src/main/java/openblocks/client/renderer/tileentity/TileEntityDonationStationRenderer.java @@ -6,7 +6,6 @@ import net.minecraft.util.ResourceLocation; import openblocks.client.model.ModelPiggy; import openblocks.common.tileentity.TileEntityDonationStation; import openmods.utils.BlockUtils; - import org.lwjgl.opengl.GL11; public class TileEntityDonationStationRenderer extends diff --git a/src/main/java/openblocks/client/renderer/tileentity/TileEntityFanRenderer.java b/src/main/java/openblocks/client/renderer/tileentity/TileEntityFanRenderer.java index 57deb68e..3a8095cb 100644 --- a/src/main/java/openblocks/client/renderer/tileentity/TileEntityFanRenderer.java +++ b/src/main/java/openblocks/client/renderer/tileentity/TileEntityFanRenderer.java @@ -5,7 +5,6 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.ResourceLocation; import openblocks.client.model.ModelFan; import openblocks.common.tileentity.TileEntityFan; - import org.lwjgl.opengl.GL11; public class TileEntityFanRenderer extends TileEntitySpecialRenderer { diff --git a/src/main/java/openblocks/client/renderer/tileentity/TileEntityFlagRenderer.java b/src/main/java/openblocks/client/renderer/tileentity/TileEntityFlagRenderer.java index be3eed73..f127c955 100644 --- a/src/main/java/openblocks/client/renderer/tileentity/TileEntityFlagRenderer.java +++ b/src/main/java/openblocks/client/renderer/tileentity/TileEntityFlagRenderer.java @@ -9,7 +9,6 @@ import openblocks.client.model.ModelFlag; import openblocks.common.tileentity.TileEntityFlag; import openmods.renderer.DisplayListWrapper; import openmods.utils.ColorUtils.RGB; - import org.lwjgl.opengl.GL11; public class TileEntityFlagRenderer extends TileEntitySpecialRenderer { diff --git a/src/main/java/openblocks/client/renderer/tileentity/TileEntityGoldenEggRenderer.java b/src/main/java/openblocks/client/renderer/tileentity/TileEntityGoldenEggRenderer.java index 92e419b5..216cb2ba 100644 --- a/src/main/java/openblocks/client/renderer/tileentity/TileEntityGoldenEggRenderer.java +++ b/src/main/java/openblocks/client/renderer/tileentity/TileEntityGoldenEggRenderer.java @@ -1,7 +1,6 @@ package openblocks.client.renderer.tileentity; import java.util.Random; - import net.minecraft.client.renderer.RenderHelper; import net.minecraft.client.renderer.Tessellator; import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; @@ -10,7 +9,6 @@ import net.minecraft.util.ResourceLocation; import openblocks.client.model.ModelEgg; import openblocks.common.tileentity.TileEntityGoldenEgg; import openblocks.common.tileentity.TileEntityGoldenEgg.State; - import org.lwjgl.opengl.GL11; public class TileEntityGoldenEggRenderer extends TileEntitySpecialRenderer { diff --git a/src/main/java/openblocks/client/renderer/tileentity/TileEntityGraveRenderer.java b/src/main/java/openblocks/client/renderer/tileentity/TileEntityGraveRenderer.java index dc07225d..ece1a4a4 100644 --- a/src/main/java/openblocks/client/renderer/tileentity/TileEntityGraveRenderer.java +++ b/src/main/java/openblocks/client/renderer/tileentity/TileEntityGraveRenderer.java @@ -7,7 +7,6 @@ import net.minecraft.util.ResourceLocation; import openblocks.client.model.ModelGrave; import openblocks.common.tileentity.TileEntityGrave; import openmods.utils.BlockUtils; - import org.lwjgl.opengl.GL11; public class TileEntityGraveRenderer extends TileEntitySpecialRenderer { diff --git a/src/main/java/openblocks/client/renderer/tileentity/TileEntityImaginaryRenderer.java b/src/main/java/openblocks/client/renderer/tileentity/TileEntityImaginaryRenderer.java index c9c0d531..5f9a6e93 100644 --- a/src/main/java/openblocks/client/renderer/tileentity/TileEntityImaginaryRenderer.java +++ b/src/main/java/openblocks/client/renderer/tileentity/TileEntityImaginaryRenderer.java @@ -1,5 +1,6 @@ package openblocks.client.renderer.tileentity; +import cpw.mods.fml.common.eventhandler.SubscribeEvent; import net.minecraft.client.renderer.Tessellator; import net.minecraft.client.renderer.texture.TextureMap; import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; @@ -9,16 +10,13 @@ import net.minecraftforge.client.event.TextureStitchEvent; import net.minecraftforge.common.MinecraftForge; import openblocks.Config; import openblocks.OpenBlocks.Blocks; -import openblocks.common.tileentity.*; +import openblocks.common.tileentity.TileEntityImaginary; import openblocks.common.tileentity.TileEntityImaginary.ICollisionData; import openblocks.common.tileentity.TileEntityImaginary.PanelData; import openblocks.common.tileentity.TileEntityImaginary.Property; import openblocks.common.tileentity.TileEntityImaginary.StairsData; - import org.lwjgl.opengl.GL11; -import cpw.mods.fml.common.eventhandler.SubscribeEvent; - public class TileEntityImaginaryRenderer extends TileEntitySpecialRenderer { private abstract static class ElementDisplay { diff --git a/src/main/java/openblocks/client/renderer/tileentity/TileEntityPaintMixerRenderer.java b/src/main/java/openblocks/client/renderer/tileentity/TileEntityPaintMixerRenderer.java index 06fbaeef..96edb622 100644 --- a/src/main/java/openblocks/client/renderer/tileentity/TileEntityPaintMixerRenderer.java +++ b/src/main/java/openblocks/client/renderer/tileentity/TileEntityPaintMixerRenderer.java @@ -1,7 +1,6 @@ package openblocks.client.renderer.tileentity; import java.util.EnumSet; - import net.minecraft.client.renderer.RenderBlocks; import net.minecraft.client.renderer.texture.TextureMap; import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; @@ -14,7 +13,6 @@ import openblocks.common.tileentity.TileEntityPaintMixer; import openmods.utils.BlockUtils; import openmods.utils.ColorUtils; import openmods.utils.render.RenderUtils; - import org.lwjgl.opengl.GL11; public class TileEntityPaintMixerRenderer extends TileEntitySpecialRenderer { diff --git a/src/main/java/openblocks/client/renderer/tileentity/TileEntityProjectorRenderer.java b/src/main/java/openblocks/client/renderer/tileentity/TileEntityProjectorRenderer.java index b603748f..ab463909 100644 --- a/src/main/java/openblocks/client/renderer/tileentity/TileEntityProjectorRenderer.java +++ b/src/main/java/openblocks/client/renderer/tileentity/TileEntityProjectorRenderer.java @@ -11,7 +11,6 @@ import openblocks.common.HeightMapData; import openblocks.common.MapDataManager; import openblocks.common.tileentity.TileEntityProjector; import openmods.OpenMods; - import org.lwjgl.opengl.GL11; public class TileEntityProjectorRenderer extends TileEntitySpecialRenderer { diff --git a/src/main/java/openblocks/client/renderer/tileentity/TileEntitySkyRenderer.java b/src/main/java/openblocks/client/renderer/tileentity/TileEntitySkyRenderer.java index 66af685f..b326837b 100644 --- a/src/main/java/openblocks/client/renderer/tileentity/TileEntitySkyRenderer.java +++ b/src/main/java/openblocks/client/renderer/tileentity/TileEntitySkyRenderer.java @@ -12,7 +12,6 @@ import openmods.stencil.StencilBitAllocation; import openmods.stencil.StencilPoolManager; import openmods.utils.ColorUtils.RGB; import openmods.utils.render.RenderUtils; - import org.lwjgl.opengl.GL11; public class TileEntitySkyRenderer extends TileEntitySpecialRenderer { diff --git a/src/main/java/openblocks/client/renderer/tileentity/TileEntitySprinklerRenderer.java b/src/main/java/openblocks/client/renderer/tileentity/TileEntitySprinklerRenderer.java index 91c8a692..e3666101 100644 --- a/src/main/java/openblocks/client/renderer/tileentity/TileEntitySprinklerRenderer.java +++ b/src/main/java/openblocks/client/renderer/tileentity/TileEntitySprinklerRenderer.java @@ -6,7 +6,6 @@ import net.minecraft.util.ResourceLocation; import openblocks.client.model.ModelSprinkler; import openblocks.common.tileentity.TileEntitySprinkler; import openmods.utils.BlockUtils; - import org.lwjgl.opengl.GL11; public class TileEntitySprinklerRenderer extends TileEntitySpecialRenderer { diff --git a/src/main/java/openblocks/client/renderer/tileentity/TileEntityTankRenderer.java b/src/main/java/openblocks/client/renderer/tileentity/TileEntityTankRenderer.java index c55c6b2b..93d006d6 100644 --- a/src/main/java/openblocks/client/renderer/tileentity/TileEntityTankRenderer.java +++ b/src/main/java/openblocks/client/renderer/tileentity/TileEntityTankRenderer.java @@ -17,7 +17,6 @@ import openmods.renderer.TessellatorPool; import openmods.renderer.TessellatorPool.TessellatorUser; import openmods.utils.Diagonal; import openmods.utils.TextureUtils; - import org.lwjgl.opengl.GL11; public class TileEntityTankRenderer extends TileEntitySpecialRenderer { diff --git a/src/main/java/openblocks/client/renderer/tileentity/TileEntityTargetRenderer.java b/src/main/java/openblocks/client/renderer/tileentity/TileEntityTargetRenderer.java index 69109648..c818ff10 100644 --- a/src/main/java/openblocks/client/renderer/tileentity/TileEntityTargetRenderer.java +++ b/src/main/java/openblocks/client/renderer/tileentity/TileEntityTargetRenderer.java @@ -6,7 +6,6 @@ import net.minecraft.util.ResourceLocation; import openblocks.client.model.ModelTarget; import openblocks.common.tileentity.TileEntityTarget; import openmods.utils.BlockUtils; - import org.lwjgl.opengl.GL11; public class TileEntityTargetRenderer extends TileEntitySpecialRenderer { diff --git a/src/main/java/openblocks/client/renderer/tileentity/TileEntityTrophyRenderer.java b/src/main/java/openblocks/client/renderer/tileentity/TileEntityTrophyRenderer.java index 756105c2..be0a56cf 100644 --- a/src/main/java/openblocks/client/renderer/tileentity/TileEntityTrophyRenderer.java +++ b/src/main/java/openblocks/client/renderer/tileentity/TileEntityTrophyRenderer.java @@ -10,7 +10,6 @@ import openblocks.common.TrophyHandler.Trophy; import openblocks.common.tileentity.TileEntityTrophy; import openmods.utils.BlockUtils; import openmods.utils.render.RenderUtils; - import org.lwjgl.opengl.GL11; public class TileEntityTrophyRenderer extends TileEntitySpecialRenderer { diff --git a/src/main/java/openblocks/client/renderer/tileentity/TileEntityVacuumHopperRenderer.java b/src/main/java/openblocks/client/renderer/tileentity/TileEntityVacuumHopperRenderer.java index 0df353ca..f5d7b82a 100644 --- a/src/main/java/openblocks/client/renderer/tileentity/TileEntityVacuumHopperRenderer.java +++ b/src/main/java/openblocks/client/renderer/tileentity/TileEntityVacuumHopperRenderer.java @@ -5,7 +5,6 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.ResourceLocation; import openblocks.client.model.ModelVacuumHopper; import openblocks.common.tileentity.TileEntityVacuumHopper; - import org.lwjgl.opengl.GL11; public class TileEntityVacuumHopperRenderer extends TileEntitySpecialRenderer { diff --git a/src/main/java/openblocks/client/renderer/tileentity/TileEntityVillageHighlighterRenderer.java b/src/main/java/openblocks/client/renderer/tileentity/TileEntityVillageHighlighterRenderer.java index 8365e958..46622b38 100644 --- a/src/main/java/openblocks/client/renderer/tileentity/TileEntityVillageHighlighterRenderer.java +++ b/src/main/java/openblocks/client/renderer/tileentity/TileEntityVillageHighlighterRenderer.java @@ -9,7 +9,6 @@ import openblocks.client.model.ModelVillage; import openblocks.common.tileentity.TileEntityVillageHighlighter; import openmods.sync.SyncableIntArray; import openmods.utils.BlockUtils; - import org.lwjgl.opengl.GL11; public class TileEntityVillageHighlighterRenderer extends diff --git a/src/main/java/openblocks/client/renderer/tileentity/TileEntityXPShowerRenderer.java b/src/main/java/openblocks/client/renderer/tileentity/TileEntityXPShowerRenderer.java index 01e6c3e7..1452abbf 100644 --- a/src/main/java/openblocks/client/renderer/tileentity/TileEntityXPShowerRenderer.java +++ b/src/main/java/openblocks/client/renderer/tileentity/TileEntityXPShowerRenderer.java @@ -6,7 +6,6 @@ import net.minecraft.util.ResourceLocation; import openblocks.client.model.ModelXPShower; import openblocks.common.tileentity.TileEntityXPShower; import openmods.utils.BlockUtils; - import org.lwjgl.opengl.GL11; public class TileEntityXPShowerRenderer extends TileEntitySpecialRenderer { diff --git a/src/main/java/openblocks/client/renderer/tileentity/guide/GuideAdvancedRenderer.java b/src/main/java/openblocks/client/renderer/tileentity/guide/GuideAdvancedRenderer.java index a7ddd103..b7c9ec90 100644 --- a/src/main/java/openblocks/client/renderer/tileentity/guide/GuideAdvancedRenderer.java +++ b/src/main/java/openblocks/client/renderer/tileentity/guide/GuideAdvancedRenderer.java @@ -3,7 +3,6 @@ package openblocks.client.renderer.tileentity.guide; import openblocks.common.tileentity.TileEntityGuide; import openblocks.shapes.CoordShape; import openmods.utils.TextureUtils; - import org.lwjgl.opengl.GL11; public class GuideAdvancedRenderer implements IGuideRenderer { diff --git a/src/main/java/openblocks/client/renderer/tileentity/guide/GuideLegacyRenderer.java b/src/main/java/openblocks/client/renderer/tileentity/guide/GuideLegacyRenderer.java index bd3a783c..e111603d 100644 --- a/src/main/java/openblocks/client/renderer/tileentity/guide/GuideLegacyRenderer.java +++ b/src/main/java/openblocks/client/renderer/tileentity/guide/GuideLegacyRenderer.java @@ -6,7 +6,6 @@ import openblocks.shapes.CoordShape; import openmods.renderer.DisplayListWrapper; import openmods.utils.Coord; import openmods.utils.TextureUtils; - import org.lwjgl.opengl.GL11; public class GuideLegacyRenderer implements IGuideRenderer { diff --git a/src/main/java/openblocks/client/renderer/tileentity/guide/MarkerRenderer.java b/src/main/java/openblocks/client/renderer/tileentity/guide/MarkerRenderer.java index 13727d07..2074c6fa 100644 --- a/src/main/java/openblocks/client/renderer/tileentity/guide/MarkerRenderer.java +++ b/src/main/java/openblocks/client/renderer/tileentity/guide/MarkerRenderer.java @@ -2,14 +2,15 @@ package openblocks.client.renderer.tileentity.guide; import java.nio.ByteBuffer; import java.nio.IntBuffer; - import net.minecraft.client.renderer.GLAllocation; import net.minecraft.client.renderer.Tessellator; import net.minecraft.client.shader.TesselatorVertexState; import net.minecraft.util.ResourceLocation; import openblocks.shapes.CoordShape; -import openmods.renderer.shaders.*; - +import openmods.renderer.shaders.ArraysHelper; +import openmods.renderer.shaders.BufferHelper; +import openmods.renderer.shaders.ShaderProgram; +import openmods.renderer.shaders.ShaderProgramBuilder; import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL15; import org.lwjgl.opengl.GL20; diff --git a/src/main/java/openblocks/client/renderer/tileentity/guide/TileEntityBuilderGuideRenderer.java b/src/main/java/openblocks/client/renderer/tileentity/guide/TileEntityBuilderGuideRenderer.java index f653428d..022ee265 100644 --- a/src/main/java/openblocks/client/renderer/tileentity/guide/TileEntityBuilderGuideRenderer.java +++ b/src/main/java/openblocks/client/renderer/tileentity/guide/TileEntityBuilderGuideRenderer.java @@ -6,7 +6,6 @@ import net.minecraft.util.MathHelper; import net.minecraftforge.client.MinecraftForgeClient; import openblocks.common.tileentity.TileEntityBuilderGuide; import openmods.renderer.DisplayListWrapper; - import org.lwjgl.opengl.GL11; public class TileEntityBuilderGuideRenderer extends TileEntityGuideRenderer { diff --git a/src/main/java/openblocks/client/renderer/tileentity/guide/TileEntityGuideRenderer.java b/src/main/java/openblocks/client/renderer/tileentity/guide/TileEntityGuideRenderer.java index 9a362ae9..85e63826 100644 --- a/src/main/java/openblocks/client/renderer/tileentity/guide/TileEntityGuideRenderer.java +++ b/src/main/java/openblocks/client/renderer/tileentity/guide/TileEntityGuideRenderer.java @@ -1,16 +1,14 @@ package openblocks.client.renderer.tileentity.guide; +import cpw.mods.fml.common.eventhandler.SubscribeEvent; import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; import net.minecraft.tileentity.TileEntity; import net.minecraftforge.client.event.TextureStitchEvent; import net.minecraftforge.common.MinecraftForge; import openblocks.common.tileentity.TileEntityGuide; import openmods.utils.TextureUtils; - import org.lwjgl.opengl.GL11; -import cpw.mods.fml.common.eventhandler.SubscribeEvent; - public class TileEntityGuideRenderer extends TileEntitySpecialRenderer { private final IGuideRenderer renderer; diff --git a/src/main/java/openblocks/client/renderer/tileentity/tank/DiagonalConnection.java b/src/main/java/openblocks/client/renderer/tileentity/tank/DiagonalConnection.java index 7584924b..40bfe0a4 100644 --- a/src/main/java/openblocks/client/renderer/tileentity/tank/DiagonalConnection.java +++ b/src/main/java/openblocks/client/renderer/tileentity/tank/DiagonalConnection.java @@ -1,13 +1,14 @@ package openblocks.client.renderer.tileentity.tank; -import java.util.*; - -import net.minecraftforge.fluids.FluidStack; -import openblocks.common.tileentity.TileEntityTank; -import openmods.utils.Diagonal; - import com.google.common.collect.Lists; import com.google.common.collect.Maps; +import java.util.EnumSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import net.minecraftforge.fluids.FluidStack; +import openblocks.common.tileentity.TileEntityTank; +import openmods.utils.Diagonal; public class DiagonalConnection extends RenderConnection { diff --git a/src/main/java/openblocks/client/renderer/tileentity/tank/TankRenderLogic.java b/src/main/java/openblocks/client/renderer/tileentity/tank/TankRenderLogic.java index 363aa834..4dda6e18 100644 --- a/src/main/java/openblocks/client/renderer/tileentity/tank/TankRenderLogic.java +++ b/src/main/java/openblocks/client/renderer/tileentity/tank/TankRenderLogic.java @@ -1,7 +1,7 @@ package openblocks.client.renderer.tileentity.tank; +import com.google.common.collect.Maps; import java.util.Map; - import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; @@ -10,8 +10,6 @@ import openblocks.common.tileentity.TileEntityTank; import openmods.liquids.GenericTank; import openmods.utils.Diagonal; -import com.google.common.collect.Maps; - public class TankRenderLogic implements ITankConnections, ITankRenderFluidData { private int x; diff --git a/src/main/java/openblocks/common/CommandInventory.java b/src/main/java/openblocks/common/CommandInventory.java index 0401bc51..2b12ae0e 100644 --- a/src/main/java/openblocks/common/CommandInventory.java +++ b/src/main/java/openblocks/common/CommandInventory.java @@ -4,10 +4,13 @@ import static openmods.utils.CommandUtils.filterPrefixes; import static openmods.utils.CommandUtils.fiterPlayerNames; import static openmods.utils.CommandUtils.getPlayer; +import com.google.common.collect.Lists; import java.io.File; import java.util.List; - -import net.minecraft.command.*; +import net.minecraft.command.CommandException; +import net.minecraft.command.ICommand; +import net.minecraft.command.ICommandSender; +import net.minecraft.command.SyntaxErrorException; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.inventory.IInventory; import net.minecraft.item.ItemStack; @@ -19,8 +22,6 @@ import openmods.Log; import openmods.utils.BlockUtils; import openmods.utils.InventoryUtils; -import com.google.common.collect.Lists; - public class CommandInventory implements ICommand { private static final String COMMAND_RESTORE = "restore"; diff --git a/src/main/java/openblocks/common/CraneRegistry.java b/src/main/java/openblocks/common/CraneRegistry.java index 37d07d73..8cdf7498 100644 --- a/src/main/java/openblocks/common/CraneRegistry.java +++ b/src/main/java/openblocks/common/CraneRegistry.java @@ -1,13 +1,11 @@ package openblocks.common; +import com.google.common.collect.MapMaker; import java.util.Map; - import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; import openblocks.common.entity.EntityMagnet; -import com.google.common.collect.MapMaker; - public class CraneRegistry { private static final double MIN_LENGTH = 0.25; private static final double MAX_LENGTH = 10; diff --git a/src/main/java/openblocks/common/DonationUrlManager.java b/src/main/java/openblocks/common/DonationUrlManager.java index 8746a94f..98b31038 100644 --- a/src/main/java/openblocks/common/DonationUrlManager.java +++ b/src/main/java/openblocks/common/DonationUrlManager.java @@ -1,7 +1,6 @@ package openblocks.common; import java.util.HashMap; - import openmods.Mods; public class DonationUrlManager { diff --git a/src/main/java/openblocks/common/ElevatorActionHandler.java b/src/main/java/openblocks/common/ElevatorActionHandler.java index 32ce5c7a..5f76c5aa 100644 --- a/src/main/java/openblocks/common/ElevatorActionHandler.java +++ b/src/main/java/openblocks/common/ElevatorActionHandler.java @@ -1,5 +1,9 @@ package openblocks.common; +import com.google.common.base.Preconditions; +import cpw.mods.fml.common.eventhandler.SubscribeEvent; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.Block; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.util.AxisAlignedBB; @@ -13,12 +17,6 @@ import openblocks.events.ElevatorActionEvent; import openmods.movement.PlayerMovementEvent; import openmods.utils.EnchantmentUtils; -import com.google.common.base.Preconditions; - -import cpw.mods.fml.common.eventhandler.SubscribeEvent; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - public class ElevatorActionHandler { private static class SearchResult { diff --git a/src/main/java/openblocks/common/ElevatorBlockRules.java b/src/main/java/openblocks/common/ElevatorBlockRules.java index a16e88e6..7f9fdc10 100644 --- a/src/main/java/openblocks/common/ElevatorBlockRules.java +++ b/src/main/java/openblocks/common/ElevatorBlockRules.java @@ -1,19 +1,16 @@ package openblocks.common; -import java.util.Locale; -import java.util.Map; - -import net.minecraft.block.Block; -import openblocks.Config; -import openmods.Log; -import openmods.config.properties.ConfigurationChange; - import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Maps; - import cpw.mods.fml.common.eventhandler.SubscribeEvent; import cpw.mods.fml.common.registry.GameRegistry; +import java.util.Locale; +import java.util.Map; +import net.minecraft.block.Block; +import openblocks.Config; +import openmods.Log; +import openmods.config.properties.ConfigurationChange; public class ElevatorBlockRules { diff --git a/src/main/java/openblocks/common/EntityEventHandler.java b/src/main/java/openblocks/common/EntityEventHandler.java index aac0cfe9..b0f440fb 100644 --- a/src/main/java/openblocks/common/EntityEventHandler.java +++ b/src/main/java/openblocks/common/EntityEventHandler.java @@ -1,7 +1,8 @@ package openblocks.common; +import com.google.common.collect.Sets; +import cpw.mods.fml.common.eventhandler.SubscribeEvent; import java.util.Set; - import net.minecraft.entity.Entity; import net.minecraft.entity.EntityList; import net.minecraft.entity.player.EntityPlayer; @@ -15,10 +16,6 @@ import openmods.config.properties.ConfigurationChange; import openmods.utils.BlockUtils; import openmods.utils.PlayerUtils; -import com.google.common.collect.Sets; - -import cpw.mods.fml.common.eventhandler.SubscribeEvent; - public class EntityEventHandler { public static final String OPENBLOCKS_PERSIST_TAG = "OpenBlocks"; diff --git a/src/main/java/openblocks/common/GameRuleManager.java b/src/main/java/openblocks/common/GameRuleManager.java index 3f96a2cd..9b09935f 100644 --- a/src/main/java/openblocks/common/GameRuleManager.java +++ b/src/main/java/openblocks/common/GameRuleManager.java @@ -1,8 +1,8 @@ package openblocks.common; +import cpw.mods.fml.common.eventhandler.SubscribeEvent; import net.minecraft.world.GameRules; import net.minecraftforge.event.world.WorldEvent; -import cpw.mods.fml.common.eventhandler.SubscribeEvent; public class GameRuleManager { diff --git a/src/main/java/openblocks/common/GuiOpenHandler.java b/src/main/java/openblocks/common/GuiOpenHandler.java index 7b7fefcf..f834f097 100644 --- a/src/main/java/openblocks/common/GuiOpenHandler.java +++ b/src/main/java/openblocks/common/GuiOpenHandler.java @@ -1,10 +1,10 @@ package openblocks.common; +import cpw.mods.fml.common.eventhandler.Event.Result; +import cpw.mods.fml.common.eventhandler.SubscribeEvent; import net.minecraft.item.ItemStack; import net.minecraftforge.event.entity.player.PlayerOpenContainerEvent; import openblocks.OpenBlocks.Items; -import cpw.mods.fml.common.eventhandler.Event.Result; -import cpw.mods.fml.common.eventhandler.SubscribeEvent; public class GuiOpenHandler { diff --git a/src/main/java/openblocks/common/HeightMapData.java b/src/main/java/openblocks/common/HeightMapData.java index 2451a8ee..62da0213 100644 --- a/src/main/java/openblocks/common/HeightMapData.java +++ b/src/main/java/openblocks/common/HeightMapData.java @@ -3,7 +3,6 @@ package openblocks.common; import java.io.DataInput; import java.io.DataOutput; import java.io.IOException; - import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import net.minecraft.world.WorldSavedData; diff --git a/src/main/java/openblocks/common/LuggageDropHandler.java b/src/main/java/openblocks/common/LuggageDropHandler.java index 596ddc56..930ccda5 100644 --- a/src/main/java/openblocks/common/LuggageDropHandler.java +++ b/src/main/java/openblocks/common/LuggageDropHandler.java @@ -1,5 +1,6 @@ package openblocks.common; +import cpw.mods.fml.common.eventhandler.SubscribeEvent; import net.minecraft.entity.Entity; import net.minecraft.entity.item.EntityItem; import net.minecraft.item.ItemStack; @@ -7,7 +8,6 @@ import net.minecraftforge.event.entity.EntityJoinWorldEvent; import net.minecraftforge.event.entity.item.ItemExpireEvent; import openblocks.common.item.ItemLuggage; import openmods.utils.EntityUtils; -import cpw.mods.fml.common.eventhandler.SubscribeEvent; public class LuggageDropHandler { diff --git a/src/main/java/openblocks/common/MagnetWhitelists.java b/src/main/java/openblocks/common/MagnetWhitelists.java index ef4d23fc..1c98d31c 100644 --- a/src/main/java/openblocks/common/MagnetWhitelists.java +++ b/src/main/java/openblocks/common/MagnetWhitelists.java @@ -1,19 +1,35 @@ package openblocks.common; -import net.minecraft.block.*; +import cpw.mods.fml.common.eventhandler.Event; +import net.minecraft.block.Block; +import net.minecraft.block.BlockContainer; +import net.minecraft.block.BlockFence; +import net.minecraft.block.BlockFenceGate; import net.minecraft.block.BlockJukebox.TileEntityJukebox; +import net.minecraft.block.BlockSand; +import net.minecraft.block.BlockStairs; import net.minecraft.entity.Entity; import net.minecraft.entity.item.EntityBoat; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.item.EntityMinecart; import net.minecraft.init.Blocks; -import net.minecraft.tileentity.*; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.tileentity.TileEntityBeacon; +import net.minecraft.tileentity.TileEntityBrewingStand; +import net.minecraft.tileentity.TileEntityChest; +import net.minecraft.tileentity.TileEntityCommandBlock; +import net.minecraft.tileentity.TileEntityDispenser; +import net.minecraft.tileentity.TileEntityEnchantmentTable; +import net.minecraft.tileentity.TileEntityEnderChest; +import net.minecraft.tileentity.TileEntityFurnace; +import net.minecraft.tileentity.TileEntityHopper; +import net.minecraft.tileentity.TileEntityNote; import net.minecraft.world.World; import net.minecraftforge.common.MinecraftForge; -import openmods.utils.*; +import openmods.utils.ITester; +import openmods.utils.ObjectTester; import openmods.utils.ObjectTester.ClassNameTester; import openmods.utils.ObjectTester.ClassTester; -import cpw.mods.fml.common.eventhandler.Event; public class MagnetWhitelists { public final static MagnetWhitelists instance = new MagnetWhitelists(); diff --git a/src/main/java/openblocks/common/MapDataBuilder.java b/src/main/java/openblocks/common/MapDataBuilder.java index 3b0bbbf6..22f2c325 100644 --- a/src/main/java/openblocks/common/MapDataBuilder.java +++ b/src/main/java/openblocks/common/MapDataBuilder.java @@ -1,7 +1,13 @@ package openblocks.common; -import java.util.*; - +import com.google.common.base.Preconditions; +import com.google.common.collect.Maps; +import com.google.common.collect.Queues; +import com.google.common.collect.Sets; +import java.util.Collection; +import java.util.Map; +import java.util.PriorityQueue; +import java.util.Set; import net.minecraft.block.Block; import net.minecraft.block.material.MapColor; import net.minecraft.item.Item; @@ -15,11 +21,6 @@ import openblocks.common.item.ItemEmptyMap; import openblocks.common.item.ItemHeightMap; import openmods.utils.BitSet; -import com.google.common.base.Preconditions; -import com.google.common.collect.Maps; -import com.google.common.collect.Queues; -import com.google.common.collect.Sets; - public class MapDataBuilder { private static final int LAYER_TERRAIN = 0; private static final int LAYER_LIQUIDS = 1; diff --git a/src/main/java/openblocks/common/MapDataManager.java b/src/main/java/openblocks/common/MapDataManager.java index a2a81ac7..e94ea60f 100644 --- a/src/main/java/openblocks/common/MapDataManager.java +++ b/src/main/java/openblocks/common/MapDataManager.java @@ -1,16 +1,21 @@ package openblocks.common; +import com.google.common.base.Preconditions; +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; +import com.google.common.collect.Sets; +import cpw.mods.fml.common.Loader; +import cpw.mods.fml.common.eventhandler.SubscribeEvent; +import cpw.mods.fml.common.registry.GameRegistry; import gnu.trove.procedure.TIntProcedure; import gnu.trove.set.TIntSet; import gnu.trove.set.hash.TIntHashSet; - import java.io.DataInput; import java.io.DataOutput; import java.io.IOException; import java.util.List; import java.util.Map; import java.util.Set; - import net.minecraft.block.Block; import net.minecraft.init.Blocks; import net.minecraft.server.MinecraftServer; @@ -24,15 +29,6 @@ import openmods.network.event.NetworkEvent; import openmods.network.event.NetworkEventMeta; import openmods.utils.ByteUtils; -import com.google.common.base.Preconditions; -import com.google.common.collect.Lists; -import com.google.common.collect.Maps; -import com.google.common.collect.Sets; - -import cpw.mods.fml.common.Loader; -import cpw.mods.fml.common.eventhandler.SubscribeEvent; -import cpw.mods.fml.common.registry.GameRegistry; - public class MapDataManager { public abstract static class MapIdRequest extends NetworkEvent { diff --git a/src/main/java/openblocks/common/PlayerDeathHandler.java b/src/main/java/openblocks/common/PlayerDeathHandler.java index 5faec315..6b3e0b49 100644 --- a/src/main/java/openblocks/common/PlayerDeathHandler.java +++ b/src/main/java/openblocks/common/PlayerDeathHandler.java @@ -1,9 +1,21 @@ package openblocks.common; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.Iterables; +import com.google.common.collect.Lists; +import com.mojang.authlib.GameProfile; +import cpw.mods.fml.common.eventhandler.ASMEventHandler; +import cpw.mods.fml.common.eventhandler.EventPriority; +import cpw.mods.fml.common.eventhandler.IEventListener; +import cpw.mods.fml.common.eventhandler.ListenerList; +import cpw.mods.fml.common.eventhandler.SubscribeEvent; +import cpw.mods.fml.relauncher.ReflectionHelper; import java.io.File; import java.lang.ref.WeakReference; -import java.util.*; - +import java.util.Collections; +import java.util.Comparator; +import java.util.Iterator; +import java.util.List; import net.minecraft.block.Block; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; @@ -13,7 +25,11 @@ import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.*; +import net.minecraft.util.ChatComponentText; +import net.minecraft.util.ChatComponentTranslation; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.IChatComponent; +import net.minecraft.util.MathHelper; import net.minecraft.world.GameRules; import net.minecraft.world.World; import net.minecraftforge.common.MinecraftForge; @@ -33,17 +49,8 @@ import openmods.utils.BlockNotifyFlags; import openmods.utils.Coord; import openmods.utils.TagUtils; import openmods.world.DelayedActionTickHandler; - import org.apache.logging.log4j.Level; -import com.google.common.collect.ImmutableList; -import com.google.common.collect.Iterables; -import com.google.common.collect.Lists; -import com.mojang.authlib.GameProfile; - -import cpw.mods.fml.common.eventhandler.*; -import cpw.mods.fml.relauncher.ReflectionHelper; - public class PlayerDeathHandler { private static final Comparator SEARCH_COMPARATOR = new Comparator() { diff --git a/src/main/java/openblocks/common/PlayerInventoryStore.java b/src/main/java/openblocks/common/PlayerInventoryStore.java index 992cea69..310d505c 100644 --- a/src/main/java/openblocks/common/PlayerInventoryStore.java +++ b/src/main/java/openblocks/common/PlayerInventoryStore.java @@ -1,12 +1,25 @@ package openblocks.common; -import java.io.*; +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; +import com.mojang.authlib.GameProfile; +import cpw.mods.fml.common.eventhandler.EventPriority; +import cpw.mods.fml.common.eventhandler.SubscribeEvent; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.FilenameFilter; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; import java.text.DateFormat; import java.text.SimpleDateFormat; -import java.util.*; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; - import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.entity.player.InventoryPlayer; @@ -27,16 +40,8 @@ import openmods.Log; import openmods.inventory.GenericInventory; import openmods.utils.ItemUtils; import openmods.utils.TagUtils; - import org.apache.commons.lang3.StringUtils; -import com.google.common.collect.Lists; -import com.google.common.collect.Maps; -import com.mojang.authlib.GameProfile; - -import cpw.mods.fml.common.eventhandler.EventPriority; -import cpw.mods.fml.common.eventhandler.SubscribeEvent; - public class PlayerInventoryStore { public static final String TAG_PLAYER_UUID = "PlayerUUID"; diff --git a/src/main/java/openblocks/common/RadioVillagerTradeManager.java b/src/main/java/openblocks/common/RadioVillagerTradeManager.java index 2dad4a44..9198f4c1 100644 --- a/src/main/java/openblocks/common/RadioVillagerTradeManager.java +++ b/src/main/java/openblocks/common/RadioVillagerTradeManager.java @@ -1,7 +1,7 @@ package openblocks.common; +import cpw.mods.fml.common.registry.VillagerRegistry.IVillageTradeHandler; import java.util.Random; - import net.minecraft.entity.passive.EntityVillager; import net.minecraft.init.Blocks; import net.minecraft.init.Items; @@ -11,7 +11,6 @@ import net.minecraft.village.MerchantRecipe; import net.minecraft.village.MerchantRecipeList; import net.minecraftforge.oredict.OreDictionary; import openblocks.Config; -import cpw.mods.fml.common.registry.VillagerRegistry.IVillageTradeHandler; public class RadioVillagerTradeManager implements IVillageTradeHandler { diff --git a/src/main/java/openblocks/common/ServerTickHandler.java b/src/main/java/openblocks/common/ServerTickHandler.java index ab8e7522..c1d865f2 100644 --- a/src/main/java/openblocks/common/ServerTickHandler.java +++ b/src/main/java/openblocks/common/ServerTickHandler.java @@ -1,12 +1,12 @@ package openblocks.common; -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.server.MinecraftServer; -import openblocks.enchantments.FlimFlamEnchantmentsHandler; import cpw.mods.fml.common.FMLCommonHandler; import cpw.mods.fml.common.eventhandler.SubscribeEvent; import cpw.mods.fml.common.gameevent.TickEvent; import cpw.mods.fml.common.gameevent.TickEvent.Phase; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.server.MinecraftServer; +import openblocks.enchantments.FlimFlamEnchantmentsHandler; public class ServerTickHandler { diff --git a/src/main/java/openblocks/common/Stencil.java b/src/main/java/openblocks/common/Stencil.java index eeaa6e52..f5882383 100644 --- a/src/main/java/openblocks/common/Stencil.java +++ b/src/main/java/openblocks/common/Stencil.java @@ -1,9 +1,9 @@ package openblocks.common; -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.util.IIcon; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.util.IIcon; public enum Stencil { diff --git a/src/main/java/openblocks/common/TrophyHandler.java b/src/main/java/openblocks/common/TrophyHandler.java index e38af103..13a650fc 100644 --- a/src/main/java/openblocks/common/TrophyHandler.java +++ b/src/main/java/openblocks/common/TrophyHandler.java @@ -1,8 +1,11 @@ package openblocks.common; +import com.google.common.base.Strings; +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.Maps; +import cpw.mods.fml.common.eventhandler.SubscribeEvent; import java.util.Map; import java.util.Random; - import net.minecraft.entity.Entity; import net.minecraft.entity.EntityList; import net.minecraft.entity.EntityLiving; @@ -17,16 +20,20 @@ import openblocks.Config; import openblocks.OpenBlocks; import openblocks.common.item.ItemTrophyBlock; import openblocks.common.tileentity.TileEntityTrophy; -import openblocks.trophy.*; +import openblocks.trophy.BlazeBehavior; +import openblocks.trophy.CaveSpiderBehavior; +import openblocks.trophy.CreeperBehavior; +import openblocks.trophy.EndermanBehavior; +import openblocks.trophy.ITrophyBehavior; +import openblocks.trophy.ItemDropBehavior; +import openblocks.trophy.MooshroomBehavior; +import openblocks.trophy.SkeletonBehavior; +import openblocks.trophy.SnowmanBehavior; +import openblocks.trophy.SquidBehavior; +import openblocks.trophy.WitchBehavior; import openmods.Log; import openmods.reflection.ReflectionHelper; -import com.google.common.base.Strings; -import com.google.common.collect.ImmutableMap; -import com.google.common.collect.Maps; - -import cpw.mods.fml.common.eventhandler.SubscribeEvent; - public class TrophyHandler { private static final Random DROP_RAND = new Random(); diff --git a/src/main/java/openblocks/common/block/BlockAutoEnchantmentTable.java b/src/main/java/openblocks/common/block/BlockAutoEnchantmentTable.java index 96256459..060466bd 100644 --- a/src/main/java/openblocks/common/block/BlockAutoEnchantmentTable.java +++ b/src/main/java/openblocks/common/block/BlockAutoEnchantmentTable.java @@ -1,7 +1,8 @@ package openblocks.common.block; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import java.util.Random; - import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.init.Blocks; @@ -9,8 +10,6 @@ import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; import openmods.infobook.BookDocumentation; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; @BookDocumentation public class BlockAutoEnchantmentTable extends OpenBlock { diff --git a/src/main/java/openblocks/common/block/BlockBlockBreaker.java b/src/main/java/openblocks/common/block/BlockBlockBreaker.java index c47439d3..3e5fc695 100644 --- a/src/main/java/openblocks/common/block/BlockBlockBreaker.java +++ b/src/main/java/openblocks/common/block/BlockBlockBreaker.java @@ -1,5 +1,7 @@ package openblocks.common.block; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.util.IIcon; @@ -8,8 +10,6 @@ import net.minecraftforge.common.util.ForgeDirection; import openblocks.common.tileentity.TileEntityBlockBreaker; import openmods.block.BlockRotationMode; import openmods.infobook.BookDocumentation; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; @BookDocumentation public class BlockBlockBreaker extends OpenBlock { diff --git a/src/main/java/openblocks/common/block/BlockBlockPlacer.java b/src/main/java/openblocks/common/block/BlockBlockPlacer.java index 25898c74..ee59e429 100644 --- a/src/main/java/openblocks/common/block/BlockBlockPlacer.java +++ b/src/main/java/openblocks/common/block/BlockBlockPlacer.java @@ -1,13 +1,13 @@ package openblocks.common.block; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.util.IIcon; import net.minecraftforge.common.util.ForgeDirection; import openmods.block.BlockRotationMode; import openmods.infobook.BookDocumentation; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; @BookDocumentation public class BlockBlockPlacer extends OpenBlock { diff --git a/src/main/java/openblocks/common/block/BlockBuilderGuide.java b/src/main/java/openblocks/common/block/BlockBuilderGuide.java index 26fed984..691689dc 100644 --- a/src/main/java/openblocks/common/block/BlockBuilderGuide.java +++ b/src/main/java/openblocks/common/block/BlockBuilderGuide.java @@ -1,7 +1,8 @@ package openblocks.common.block; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import java.util.Random; - import net.minecraft.client.Minecraft; import net.minecraft.client.particle.EntityFX; import net.minecraft.entity.player.EntityPlayer; @@ -9,8 +10,6 @@ import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; import net.minecraft.world.World; import openmods.infobook.BookDocumentation; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; @BookDocumentation(hasVideo = true) public class BlockBuilderGuide extends BlockGuide { diff --git a/src/main/java/openblocks/common/block/BlockCanvas.java b/src/main/java/openblocks/common/block/BlockCanvas.java index a784c376..082d748a 100644 --- a/src/main/java/openblocks/common/block/BlockCanvas.java +++ b/src/main/java/openblocks/common/block/BlockCanvas.java @@ -1,5 +1,7 @@ package openblocks.common.block; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IIconRegister; @@ -15,8 +17,6 @@ import openblocks.common.tileentity.TileEntityCanvas; import openmods.infobook.BookDocumentation; import openmods.utils.ColorUtils; import openmods.utils.ColorUtils.ColorMeta; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; @BookDocumentation(hasVideo = true) public class BlockCanvas extends OpenBlock implements IPaintableBlock { diff --git a/src/main/java/openblocks/common/block/BlockCanvasGlass.java b/src/main/java/openblocks/common/block/BlockCanvasGlass.java index 5856c259..beccae11 100644 --- a/src/main/java/openblocks/common/block/BlockCanvasGlass.java +++ b/src/main/java/openblocks/common/block/BlockCanvasGlass.java @@ -1,7 +1,6 @@ package openblocks.common.block; import java.util.List; - import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.creativetab.CreativeTabs; diff --git a/src/main/java/openblocks/common/block/BlockDrawingTable.java b/src/main/java/openblocks/common/block/BlockDrawingTable.java index 3fc9fd37..6ac7d9be 100644 --- a/src/main/java/openblocks/common/block/BlockDrawingTable.java +++ b/src/main/java/openblocks/common/block/BlockDrawingTable.java @@ -1,13 +1,13 @@ package openblocks.common.block; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.util.IIcon; import net.minecraftforge.common.util.ForgeDirection; import openmods.block.BlockRotationMode; import openmods.infobook.BookDocumentation; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; @BookDocumentation(hasVideo = true) public class BlockDrawingTable extends OpenBlock { diff --git a/src/main/java/openblocks/common/block/BlockElevator.java b/src/main/java/openblocks/common/block/BlockElevator.java index 1f8399b4..3d1f7fa3 100644 --- a/src/main/java/openblocks/common/block/BlockElevator.java +++ b/src/main/java/openblocks/common/block/BlockElevator.java @@ -1,7 +1,8 @@ package openblocks.common.block; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import java.util.Set; - import net.minecraft.block.material.Material; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; @@ -10,10 +11,10 @@ import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; import openblocks.api.IElevatorBlock; import openmods.infobook.BookDocumentation; -import openmods.utils.*; +import openmods.utils.BlockNotifyFlags; +import openmods.utils.CollectionUtils; +import openmods.utils.ColorUtils; import openmods.utils.ColorUtils.ColorMeta; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; @BookDocumentation(hasVideo = true) public class BlockElevator extends OpenBlock implements IElevatorBlock { diff --git a/src/main/java/openblocks/common/block/BlockElevatorRotating.java b/src/main/java/openblocks/common/block/BlockElevatorRotating.java index 944c3eaf..c1f6f0ce 100644 --- a/src/main/java/openblocks/common/block/BlockElevatorRotating.java +++ b/src/main/java/openblocks/common/block/BlockElevatorRotating.java @@ -1,5 +1,7 @@ package openblocks.common.block; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.world.IBlockAccess; @@ -9,8 +11,6 @@ import openblocks.api.IElevatorBlock; import openblocks.common.tileentity.TileEntityElevatorRotating; import openmods.block.BlockRotationMode; import openmods.utils.ColorUtils; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; public class BlockElevatorRotating extends OpenBlock implements IElevatorBlock { diff --git a/src/main/java/openblocks/common/block/BlockFlag.java b/src/main/java/openblocks/common/block/BlockFlag.java index 5cbe8e86..5c9cf6de 100644 --- a/src/main/java/openblocks/common/block/BlockFlag.java +++ b/src/main/java/openblocks/common/block/BlockFlag.java @@ -1,5 +1,7 @@ package openblocks.common.block; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IIconRegister; @@ -14,8 +16,6 @@ import openblocks.common.tileentity.TileEntityFlag; import openmods.block.BlockRotationMode; import openmods.geometry.Orientation; import openmods.utils.ColorUtils.RGB; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; public class BlockFlag extends OpenBlock { diff --git a/src/main/java/openblocks/common/block/BlockGrave.java b/src/main/java/openblocks/common/block/BlockGrave.java index 8cacde2f..90de7d3d 100644 --- a/src/main/java/openblocks/common/block/BlockGrave.java +++ b/src/main/java/openblocks/common/block/BlockGrave.java @@ -1,7 +1,6 @@ package openblocks.common.block; import java.util.Random; - import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.entity.Entity; @@ -12,7 +11,6 @@ import net.minecraft.world.World; import openblocks.Config; import openmods.Log; import openmods.block.BlockRotationMode; - import org.apache.logging.log4j.Level; public class BlockGrave extends OpenBlock { diff --git a/src/main/java/openblocks/common/block/BlockGuide.java b/src/main/java/openblocks/common/block/BlockGuide.java index 2cd09fdd..42649501 100644 --- a/src/main/java/openblocks/common/block/BlockGuide.java +++ b/src/main/java/openblocks/common/block/BlockGuide.java @@ -1,9 +1,10 @@ package openblocks.common.block; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import java.util.Map; import java.util.Map.Entry; import java.util.Random; - import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.entity.player.EntityPlayer; @@ -19,10 +20,13 @@ import net.minecraftforge.common.util.ForgeDirection; import openblocks.common.tileentity.TileEntityGuide; import openmods.api.ISelectionAware; import openmods.block.BlockRotationMode; -import openmods.geometry.*; +import openmods.geometry.AabbUtils; +import openmods.geometry.BlockSpaceTransform; +import openmods.geometry.BlockTextureTransform; +import openmods.geometry.BoundingBoxMap; +import openmods.geometry.HalfAxis; +import openmods.geometry.Orientation; import openmods.infobook.BookDocumentation; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; @BookDocumentation(hasVideo = true) public class BlockGuide extends OpenBlock implements ISelectionAware { diff --git a/src/main/java/openblocks/common/block/BlockImaginary.java b/src/main/java/openblocks/common/block/BlockImaginary.java index cfc78203..4b6f5065 100644 --- a/src/main/java/openblocks/common/block/BlockImaginary.java +++ b/src/main/java/openblocks/common/block/BlockImaginary.java @@ -1,24 +1,24 @@ package openblocks.common.block; +import com.google.common.collect.Lists; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import java.util.ArrayList; import java.util.List; - import net.minecraft.block.material.MapColor; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.entity.Entity; import net.minecraft.item.ItemStack; -import net.minecraft.util.*; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.IIcon; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.util.Vec3; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import openblocks.common.tileentity.TileEntityImaginary; import openblocks.common.tileentity.TileEntityImaginary.Property; -import com.google.common.collect.Lists; - -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - public class BlockImaginary extends OpenBlock { public IIcon texturePencilBlock; diff --git a/src/main/java/openblocks/common/block/BlockItemDropper.java b/src/main/java/openblocks/common/block/BlockItemDropper.java index aa738799..c1f73fae 100644 --- a/src/main/java/openblocks/common/block/BlockItemDropper.java +++ b/src/main/java/openblocks/common/block/BlockItemDropper.java @@ -1,12 +1,12 @@ package openblocks.common.block; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraftforge.common.util.ForgeDirection; import openmods.block.BlockRotationMode; import openmods.infobook.BookDocumentation; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; @BookDocumentation public class BlockItemDropper extends OpenBlock { diff --git a/src/main/java/openblocks/common/block/BlockLadder.java b/src/main/java/openblocks/common/block/BlockLadder.java index 56a482b3..ea3795ab 100644 --- a/src/main/java/openblocks/common/block/BlockLadder.java +++ b/src/main/java/openblocks/common/block/BlockLadder.java @@ -1,5 +1,7 @@ package openblocks.common.block; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.BlockTrapDoor; import net.minecraft.block.material.Material; import net.minecraft.entity.EntityLivingBase; @@ -8,8 +10,6 @@ import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import openblocks.OpenBlocks; import openmods.infobook.BookDocumentation; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; @BookDocumentation(hasVideo = true) public class BlockLadder extends BlockTrapDoor { diff --git a/src/main/java/openblocks/common/block/BlockPaintCan.java b/src/main/java/openblocks/common/block/BlockPaintCan.java index 779616f1..5b972713 100644 --- a/src/main/java/openblocks/common/block/BlockPaintCan.java +++ b/src/main/java/openblocks/common/block/BlockPaintCan.java @@ -1,5 +1,7 @@ package openblocks.common.block; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.util.IIcon; @@ -7,8 +9,6 @@ import net.minecraft.world.IBlockAccess; import net.minecraftforge.common.util.ForgeDirection; import openblocks.common.tileentity.TileEntityPaintCan; import openmods.block.BlockRotationMode; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; public class BlockPaintCan extends OpenBlock { diff --git a/src/main/java/openblocks/common/block/BlockProjector.java b/src/main/java/openblocks/common/block/BlockProjector.java index 90d3faf0..0fbe5319 100644 --- a/src/main/java/openblocks/common/block/BlockProjector.java +++ b/src/main/java/openblocks/common/block/BlockProjector.java @@ -1,11 +1,11 @@ package openblocks.common.block; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.util.IIcon; import net.minecraft.world.IBlockAccess; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; public class BlockProjector extends OpenBlock { diff --git a/src/main/java/openblocks/common/block/BlockRopeLadder.java b/src/main/java/openblocks/common/block/BlockRopeLadder.java index 345ad41f..06947f6e 100644 --- a/src/main/java/openblocks/common/block/BlockRopeLadder.java +++ b/src/main/java/openblocks/common/block/BlockRopeLadder.java @@ -1,8 +1,9 @@ package openblocks.common.block; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import java.util.List; import java.util.Random; - import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.entity.Entity; @@ -21,8 +22,6 @@ import openmods.geometry.Orientation; import openmods.infobook.BookDocumentation; import openmods.utils.BlockManipulator; import openmods.utils.BlockUtils; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; @BookDocumentation public class BlockRopeLadder extends OpenBlock { diff --git a/src/main/java/openblocks/common/block/BlockScaffolding.java b/src/main/java/openblocks/common/block/BlockScaffolding.java index 0e655104..a0521dd6 100644 --- a/src/main/java/openblocks/common/block/BlockScaffolding.java +++ b/src/main/java/openblocks/common/block/BlockScaffolding.java @@ -1,15 +1,14 @@ package openblocks.common.block; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import java.util.Random; - import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import openblocks.Config; import openmods.infobook.BookDocumentation; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; @BookDocumentation public class BlockScaffolding extends OpenBlock { diff --git a/src/main/java/openblocks/common/block/BlockSky.java b/src/main/java/openblocks/common/block/BlockSky.java index 8c75b7c8..7f5a1867 100644 --- a/src/main/java/openblocks/common/block/BlockSky.java +++ b/src/main/java/openblocks/common/block/BlockSky.java @@ -1,7 +1,8 @@ package openblocks.common.block; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import java.util.Random; - import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.util.AxisAlignedBB; @@ -9,8 +10,6 @@ import net.minecraft.world.World; import openmods.infobook.BookDocumentation; import openmods.utils.BlockNotifyFlags; import openmods.utils.render.RenderUtils; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; @BookDocumentation(customName = "sky.normal") public class BlockSky extends OpenBlock { diff --git a/src/main/java/openblocks/common/block/BlockSponge.java b/src/main/java/openblocks/common/block/BlockSponge.java index afece401..3c647630 100644 --- a/src/main/java/openblocks/common/block/BlockSponge.java +++ b/src/main/java/openblocks/common/block/BlockSponge.java @@ -1,7 +1,6 @@ package openblocks.common.block; import java.util.Random; - import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.entity.player.EntityPlayer; diff --git a/src/main/java/openblocks/common/block/BlockTank.java b/src/main/java/openblocks/common/block/BlockTank.java index 585d6ea4..153f3d40 100644 --- a/src/main/java/openblocks/common/block/BlockTank.java +++ b/src/main/java/openblocks/common/block/BlockTank.java @@ -1,7 +1,8 @@ package openblocks.common.block; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import java.util.List; - import net.minecraft.block.material.Material; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.item.Item; @@ -22,8 +23,6 @@ import openblocks.common.tileentity.TileEntityTank; import openmods.Log; import openmods.infobook.BookDocumentation; import openmods.utils.ItemUtils; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; @BookDocumentation(hasVideo = true) public class BlockTank extends OpenBlock { diff --git a/src/main/java/openblocks/common/block/BlockXPBottler.java b/src/main/java/openblocks/common/block/BlockXPBottler.java index 69b7fad5..7d268d3b 100644 --- a/src/main/java/openblocks/common/block/BlockXPBottler.java +++ b/src/main/java/openblocks/common/block/BlockXPBottler.java @@ -1,13 +1,13 @@ package openblocks.common.block; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.util.IIcon; import net.minecraftforge.common.util.ForgeDirection; import openmods.block.BlockRotationMode; import openmods.infobook.BookDocumentation; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; @BookDocumentation public class BlockXPBottler extends OpenBlock { diff --git a/src/main/java/openblocks/common/block/BlockXPShower.java b/src/main/java/openblocks/common/block/BlockXPShower.java index 9943e463..40a9db4d 100644 --- a/src/main/java/openblocks/common/block/BlockXPShower.java +++ b/src/main/java/openblocks/common/block/BlockXPShower.java @@ -1,5 +1,7 @@ package openblocks.common.block; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.material.Material; import net.minecraft.util.AxisAlignedBB; import net.minecraft.world.IBlockAccess; @@ -9,8 +11,6 @@ import openmods.block.BlockRotationMode; import openmods.geometry.BlockSpaceTransform; import openmods.geometry.Orientation; import openmods.infobook.BookDocumentation; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; @BookDocumentation public class BlockXPShower extends OpenBlock { diff --git a/src/main/java/openblocks/common/entity/EntityAssistant.java b/src/main/java/openblocks/common/entity/EntityAssistant.java index c56782b3..1a9e8ba2 100644 --- a/src/main/java/openblocks/common/entity/EntityAssistant.java +++ b/src/main/java/openblocks/common/entity/EntityAssistant.java @@ -1,9 +1,12 @@ package openblocks.common.entity; +import com.google.common.base.Strings; +import cpw.mods.fml.common.network.ByteBufUtils; +import cpw.mods.fml.common.registry.IEntityAdditionalSpawnData; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import io.netty.buffer.ByteBuf; - import java.lang.ref.WeakReference; - import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; @@ -12,13 +15,6 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.DamageSource; import net.minecraft.world.World; -import com.google.common.base.Strings; - -import cpw.mods.fml.common.network.ByteBufUtils; -import cpw.mods.fml.common.registry.IEntityAdditionalSpawnData; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - public abstract class EntityAssistant extends EntitySmoothMove implements IEntityAdditionalSpawnData { private String owner; diff --git a/src/main/java/openblocks/common/entity/EntityCartographer.java b/src/main/java/openblocks/common/entity/EntityCartographer.java index f7969ff9..18a143af 100644 --- a/src/main/java/openblocks/common/entity/EntityCartographer.java +++ b/src/main/java/openblocks/common/entity/EntityCartographer.java @@ -1,11 +1,13 @@ package openblocks.common.entity; +import com.google.common.collect.ImmutableSet; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.util.Random; import java.util.Set; - import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.item.Item; @@ -22,16 +24,17 @@ import openblocks.common.item.ItemEmptyMap; import openblocks.common.item.ItemHeightMap; import openmods.Log; import openmods.api.VisibleForDocumentation; -import openmods.sync.*; +import openmods.sync.ISyncMapProvider; +import openmods.sync.SyncMap; +import openmods.sync.SyncMapEntity; +import openmods.sync.SyncObjectScanner; +import openmods.sync.SyncableBoolean; +import openmods.sync.SyncableInt; +import openmods.sync.SyncableObjectBase; import openmods.utils.BitSet; import openmods.utils.ByteUtils; import openmods.utils.ItemUtils; -import com.google.common.collect.ImmutableSet; - -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - @VisibleForDocumentation public class EntityCartographer extends EntityAssistant implements ISelectAware, ISyncMapProvider { diff --git a/src/main/java/openblocks/common/entity/EntityGoldenEye.java b/src/main/java/openblocks/common/entity/EntityGoldenEye.java index 4dd0a58f..584e5763 100644 --- a/src/main/java/openblocks/common/entity/EntityGoldenEye.java +++ b/src/main/java/openblocks/common/entity/EntityGoldenEye.java @@ -1,5 +1,7 @@ package openblocks.common.entity; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.entity.Entity; import net.minecraft.entity.item.EntityItem; import net.minecraft.item.ItemStack; @@ -7,8 +9,6 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.ChunkPosition; import net.minecraft.world.World; import openmods.utils.ItemUtils; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; public class EntityGoldenEye extends EntitySmoothMove { diff --git a/src/main/java/openblocks/common/entity/EntityHangGlider.java b/src/main/java/openblocks/common/entity/EntityHangGlider.java index 668cf8e1..623856e4 100644 --- a/src/main/java/openblocks/common/entity/EntityHangGlider.java +++ b/src/main/java/openblocks/common/entity/EntityHangGlider.java @@ -1,9 +1,11 @@ package openblocks.common.entity; +import com.google.common.collect.MapMaker; +import cpw.mods.fml.common.registry.IEntityAdditionalSpawnData; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import io.netty.buffer.ByteBuf; - import java.util.Map; - import net.minecraft.client.entity.EntityPlayerSP; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; @@ -13,12 +15,6 @@ import net.minecraft.world.World; import openblocks.common.item.ItemHangGlider; import openmods.Log; -import com.google.common.collect.MapMaker; - -import cpw.mods.fml.common.registry.IEntityAdditionalSpawnData; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - public class EntityHangGlider extends Entity implements IEntityAdditionalSpawnData { private static final int PROPERTY_DEPLOYED = 17; diff --git a/src/main/java/openblocks/common/entity/EntityItemProjectile.java b/src/main/java/openblocks/common/entity/EntityItemProjectile.java index 83c327a8..d22e84a9 100644 --- a/src/main/java/openblocks/common/entity/EntityItemProjectile.java +++ b/src/main/java/openblocks/common/entity/EntityItemProjectile.java @@ -1,7 +1,6 @@ package openblocks.common.entity; import java.util.Iterator; - import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.entity.item.EntityItem; diff --git a/src/main/java/openblocks/common/entity/EntityLuggage.java b/src/main/java/openblocks/common/entity/EntityLuggage.java index 2cd0fb46..506ea76b 100644 --- a/src/main/java/openblocks/common/entity/EntityLuggage.java +++ b/src/main/java/openblocks/common/entity/EntityLuggage.java @@ -1,5 +1,7 @@ package openblocks.common.entity; +import com.google.common.base.Strings; +import cpw.mods.fml.common.registry.IEntityAdditionalSpawnData; import io.netty.buffer.ByteBuf; import net.minecraft.block.Block; import net.minecraft.entity.EntityAgeable; @@ -22,10 +24,6 @@ import openmods.inventory.GenericInventory; import openmods.inventory.IInventoryProvider; import openmods.inventory.legacy.ItemDistribution; -import com.google.common.base.Strings; - -import cpw.mods.fml.common.registry.IEntityAdditionalSpawnData; - @VisibleForDocumentation public class EntityLuggage extends EntityTameable implements IInventoryProvider, IEntityAdditionalSpawnData { diff --git a/src/main/java/openblocks/common/entity/EntityMagnet.java b/src/main/java/openblocks/common/entity/EntityMagnet.java index bb369f75..e0f53cdf 100644 --- a/src/main/java/openblocks/common/entity/EntityMagnet.java +++ b/src/main/java/openblocks/common/entity/EntityMagnet.java @@ -1,12 +1,13 @@ package openblocks.common.entity; +import cpw.mods.fml.common.registry.IEntityAdditionalSpawnData; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import io.netty.buffer.ByteBuf; - import java.lang.ref.WeakReference; import java.util.Iterator; import java.util.List; import java.util.Random; - import net.minecraft.command.IEntitySelector; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; @@ -24,9 +25,6 @@ import openblocks.common.item.ItemCraneBackpack; import openmods.entity.DelayedEntityLoadManager; import openmods.entity.EntityBlock; import openmods.entity.IEntityLoadListener; -import cpw.mods.fml.common.registry.IEntityAdditionalSpawnData; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; public class EntityMagnet extends EntitySmoothMove implements IEntityAdditionalSpawnData, IEntitySelector { diff --git a/src/main/java/openblocks/common/entity/EntityMiniMe.java b/src/main/java/openblocks/common/entity/EntityMiniMe.java index 7cf6ea70..c4f8a76c 100644 --- a/src/main/java/openblocks/common/entity/EntityMiniMe.java +++ b/src/main/java/openblocks/common/entity/EntityMiniMe.java @@ -1,21 +1,33 @@ package openblocks.common.entity; +import com.google.common.base.Objects; +import com.google.common.base.Throwables; +import com.google.common.collect.Iterables; +import com.mojang.authlib.GameProfile; +import com.mojang.authlib.minecraft.MinecraftProfileTexture; +import com.mojang.authlib.minecraft.MinecraftProfileTexture.Type; +import com.mojang.authlib.properties.Property; +import cpw.mods.fml.common.eventhandler.SubscribeEvent; +import cpw.mods.fml.common.registry.IEntityAdditionalSpawnData; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufInputStream; import io.netty.buffer.ByteBufOutputStream; - import java.io.DataInput; import java.io.DataOutput; import java.io.IOException; import java.util.Map; import java.util.UUID; - import net.minecraft.client.Minecraft; import net.minecraft.client.entity.AbstractClientPlayer; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityCreature; import net.minecraft.entity.SharedMonsterAttributes; -import net.minecraft.entity.ai.*; +import net.minecraft.entity.ai.EntityAILookIdle; +import net.minecraft.entity.ai.EntityAISwimming; +import net.minecraft.entity.ai.EntityAIWander; +import net.minecraft.entity.ai.EntityAIWatchClosest; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTUtil; @@ -27,23 +39,13 @@ import openblocks.common.entity.ai.EntityAIBreakBlock; import openblocks.common.entity.ai.EntityAIPickupPlayer; import openmods.Log; import openmods.api.VisibleForDocumentation; -import openmods.network.event.*; +import openmods.network.event.EventDirection; +import openmods.network.event.NetworkEvent; +import openmods.network.event.NetworkEventManager; +import openmods.network.event.NetworkEventMeta; import openmods.utils.ByteUtils; import openmods.utils.io.GameProfileSerializer; -import com.google.common.base.Objects; -import com.google.common.base.Throwables; -import com.google.common.collect.Iterables; -import com.mojang.authlib.GameProfile; -import com.mojang.authlib.minecraft.MinecraftProfileTexture; -import com.mojang.authlib.minecraft.MinecraftProfileTexture.Type; -import com.mojang.authlib.properties.Property; - -import cpw.mods.fml.common.eventhandler.SubscribeEvent; -import cpw.mods.fml.common.registry.IEntityAdditionalSpawnData; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - @VisibleForDocumentation public class EntityMiniMe extends EntityCreature implements IEntityAdditionalSpawnData { diff --git a/src/main/java/openblocks/common/entity/EntitySmoothMove.java b/src/main/java/openblocks/common/entity/EntitySmoothMove.java index d36b77b1..5cdabf05 100644 --- a/src/main/java/openblocks/common/entity/EntitySmoothMove.java +++ b/src/main/java/openblocks/common/entity/EntitySmoothMove.java @@ -1,10 +1,10 @@ package openblocks.common.entity; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.entity.Entity; import net.minecraft.util.Vec3; import net.minecraft.world.World; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; public abstract class EntitySmoothMove extends Entity { diff --git a/src/main/java/openblocks/common/entity/ai/EntityAIBreakBlock.java b/src/main/java/openblocks/common/entity/ai/EntityAIBreakBlock.java index 1664196a..3e2b15c8 100644 --- a/src/main/java/openblocks/common/entity/ai/EntityAIBreakBlock.java +++ b/src/main/java/openblocks/common/entity/ai/EntityAIBreakBlock.java @@ -1,7 +1,6 @@ package openblocks.common.entity.ai; import java.util.Random; - import net.minecraft.block.Block; import net.minecraft.entity.EntityLiving; import net.minecraft.entity.ai.EntityAIBase; diff --git a/src/main/java/openblocks/common/entity/ai/EntityAICollectItem.java b/src/main/java/openblocks/common/entity/ai/EntityAICollectItem.java index 33bd876c..3c0d0484 100644 --- a/src/main/java/openblocks/common/entity/ai/EntityAICollectItem.java +++ b/src/main/java/openblocks/common/entity/ai/EntityAICollectItem.java @@ -1,7 +1,6 @@ package openblocks.common.entity.ai; import java.util.List; - import net.minecraft.entity.ai.EntityAIBase; import net.minecraft.entity.item.EntityItem; import net.minecraft.item.ItemFood; diff --git a/src/main/java/openblocks/common/entity/ai/EntityAIPickupPlayer.java b/src/main/java/openblocks/common/entity/ai/EntityAIPickupPlayer.java index 982162c9..cf0f15e0 100644 --- a/src/main/java/openblocks/common/entity/ai/EntityAIPickupPlayer.java +++ b/src/main/java/openblocks/common/entity/ai/EntityAIPickupPlayer.java @@ -1,7 +1,7 @@ package openblocks.common.entity.ai; +import com.mojang.authlib.GameProfile; import java.util.List; - import net.minecraft.entity.ai.EntityAIBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.pathfinding.PathNavigate; @@ -9,8 +9,6 @@ import net.minecraft.world.World; import openblocks.common.entity.EntityMiniMe; import openmods.utils.WorldUtils; -import com.mojang.authlib.GameProfile; - public class EntityAIPickupPlayer extends EntityAIBase { private EntityMiniMe minime; diff --git a/src/main/java/openblocks/common/item/ItemCartographer.java b/src/main/java/openblocks/common/item/ItemCartographer.java index f816206e..2bdb0ab7 100644 --- a/src/main/java/openblocks/common/item/ItemCartographer.java +++ b/src/main/java/openblocks/common/item/ItemCartographer.java @@ -1,7 +1,8 @@ package openblocks.common.item; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import java.util.List; - import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.player.EntityPlayer; @@ -12,8 +13,6 @@ import net.minecraft.world.World; import openblocks.OpenBlocks; import openblocks.common.entity.EntityAssistant; import openblocks.common.entity.EntityCartographer; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; public class ItemCartographer extends Item { diff --git a/src/main/java/openblocks/common/item/ItemCraneBackpack.java b/src/main/java/openblocks/common/item/ItemCraneBackpack.java index a14b4e6c..f96cde83 100644 --- a/src/main/java/openblocks/common/item/ItemCraneBackpack.java +++ b/src/main/java/openblocks/common/item/ItemCraneBackpack.java @@ -1,5 +1,7 @@ package openblocks.common.item; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.client.model.ModelBiped; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; @@ -14,8 +16,6 @@ import openblocks.OpenBlocks; import openblocks.client.model.ModelCraneBackpack; import openblocks.common.CraneRegistry; import openmods.infobook.BookDocumentation; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; @BookDocumentation(customName = "crane_backpack", hasVideo = true) public class ItemCraneBackpack extends ItemArmor { diff --git a/src/main/java/openblocks/common/item/ItemCraneControl.java b/src/main/java/openblocks/common/item/ItemCraneControl.java index c8c5c87f..c08bd3e6 100644 --- a/src/main/java/openblocks/common/item/ItemCraneControl.java +++ b/src/main/java/openblocks/common/item/ItemCraneControl.java @@ -1,7 +1,9 @@ package openblocks.common.item; +import com.google.common.collect.MapMaker; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import java.util.Map; - import net.minecraft.block.Block; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.entity.Entity; @@ -19,11 +21,6 @@ import openblocks.common.entity.EntityMagnet; import openmods.OpenMods; import openmods.infobook.BookDocumentation; -import com.google.common.collect.MapMaker; - -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - @BookDocumentation(customName = "crane_control", hasVideo = true) public class ItemCraneControl extends Item { diff --git a/src/main/java/openblocks/common/item/ItemDevNull.java b/src/main/java/openblocks/common/item/ItemDevNull.java index f9bba106..2a370378 100644 --- a/src/main/java/openblocks/common/item/ItemDevNull.java +++ b/src/main/java/openblocks/common/item/ItemDevNull.java @@ -1,5 +1,8 @@ package openblocks.common.item; +import cpw.mods.fml.common.eventhandler.SubscribeEvent; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.Block; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.entity.player.EntityPlayer; @@ -16,12 +19,11 @@ import openblocks.Config; import openblocks.OpenBlocks; import openblocks.OpenBlocksGuiHandler; import openmods.infobook.BookDocumentation; -import openmods.inventory.*; +import openmods.inventory.ItemInventory; +import openmods.inventory.PlayerItemInventory; +import openmods.inventory.StackEqualityTesterBuilder; import openmods.inventory.StackEqualityTesterBuilder.IEqualityTester; import openmods.inventory.legacy.ItemDistribution; -import cpw.mods.fml.common.eventhandler.SubscribeEvent; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; @BookDocumentation public class ItemDevNull extends Item { diff --git a/src/main/java/openblocks/common/item/ItemElevator.java b/src/main/java/openblocks/common/item/ItemElevator.java index a4158efa..0eb33375 100644 --- a/src/main/java/openblocks/common/item/ItemElevator.java +++ b/src/main/java/openblocks/common/item/ItemElevator.java @@ -1,14 +1,13 @@ package openblocks.common.item; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import java.util.List; - import net.minecraft.block.Block; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import openmods.item.ItemOpenBlock; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; public class ItemElevator extends ItemOpenBlock { diff --git a/src/main/java/openblocks/common/item/ItemEmptyMap.java b/src/main/java/openblocks/common/item/ItemEmptyMap.java index 9e513976..cf56acf3 100644 --- a/src/main/java/openblocks/common/item/ItemEmptyMap.java +++ b/src/main/java/openblocks/common/item/ItemEmptyMap.java @@ -1,7 +1,8 @@ package openblocks.common.item; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import java.util.List; - import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; @@ -12,8 +13,6 @@ import openblocks.OpenBlocks; import openblocks.OpenBlocks.Items; import openblocks.common.MapDataManager; import openmods.utils.ItemUtils; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; public class ItemEmptyMap extends Item { diff --git a/src/main/java/openblocks/common/item/ItemGoldenEye.java b/src/main/java/openblocks/common/item/ItemGoldenEye.java index 72cd959b..ddfd4be5 100644 --- a/src/main/java/openblocks/common/item/ItemGoldenEye.java +++ b/src/main/java/openblocks/common/item/ItemGoldenEye.java @@ -1,8 +1,10 @@ package openblocks.common.item; +import com.google.common.base.Strings; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import java.util.List; import java.util.Map; - import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; @@ -21,11 +23,6 @@ import openmods.Log; import openmods.utils.ItemUtils; import openmods.world.StructureRegistry; -import com.google.common.base.Strings; - -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - public class ItemGoldenEye extends Item { public static final int MAX_DAMAGE = 100; diff --git a/src/main/java/openblocks/common/item/ItemGuide.java b/src/main/java/openblocks/common/item/ItemGuide.java index e016fa95..fe2206ea 100644 --- a/src/main/java/openblocks/common/item/ItemGuide.java +++ b/src/main/java/openblocks/common/item/ItemGuide.java @@ -1,7 +1,6 @@ package openblocks.common.item; import java.util.List; - import net.minecraft.block.Block; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; diff --git a/src/main/java/openblocks/common/item/ItemHangGlider.java b/src/main/java/openblocks/common/item/ItemHangGlider.java index abe70ce5..bf4c18af 100644 --- a/src/main/java/openblocks/common/item/ItemHangGlider.java +++ b/src/main/java/openblocks/common/item/ItemHangGlider.java @@ -1,7 +1,7 @@ package openblocks.common.item; +import com.google.common.collect.MapMaker; import java.util.Map; - import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; @@ -10,8 +10,6 @@ import openblocks.OpenBlocks; import openblocks.common.entity.EntityHangGlider; import openmods.infobook.BookDocumentation; -import com.google.common.collect.MapMaker; - @BookDocumentation(hasVideo = true) public class ItemHangGlider extends Item { diff --git a/src/main/java/openblocks/common/item/ItemHeightMap.java b/src/main/java/openblocks/common/item/ItemHeightMap.java index 171bce57..084a245c 100644 --- a/src/main/java/openblocks/common/item/ItemHeightMap.java +++ b/src/main/java/openblocks/common/item/ItemHeightMap.java @@ -1,15 +1,14 @@ package openblocks.common.item; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import java.util.List; - import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import openblocks.common.HeightMapData; import openblocks.common.MapDataManager; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; public class ItemHeightMap extends Item { diff --git a/src/main/java/openblocks/common/item/ItemImaginary.java b/src/main/java/openblocks/common/item/ItemImaginary.java index 757b61c2..a292fc14 100644 --- a/src/main/java/openblocks/common/item/ItemImaginary.java +++ b/src/main/java/openblocks/common/item/ItemImaginary.java @@ -1,33 +1,34 @@ package openblocks.common.item; +import com.google.common.base.Objects; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import java.util.List; - import net.minecraft.block.Block; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; -import net.minecraft.nbt.*; +import net.minecraft.nbt.NBTBase; import net.minecraft.nbt.NBTBase.NBTPrimitive; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagInt; import net.minecraft.util.ChatComponentTranslation; import net.minecraft.util.IIcon; import net.minecraft.util.StatCollector; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; import openblocks.Config; -import openblocks.common.tileentity.*; +import openblocks.common.tileentity.TileEntityImaginary; import openblocks.common.tileentity.TileEntityImaginary.ICollisionData; import openblocks.common.tileentity.TileEntityImaginary.PanelData; import openblocks.common.tileentity.TileEntityImaginary.StairsData; import openmods.item.ItemOpenBlock; -import openmods.utils.*; +import openmods.utils.BlockUtils; +import openmods.utils.ColorUtils; import openmods.utils.ColorUtils.ColorMeta; - -import com.google.common.base.Objects; - -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; +import openmods.utils.ItemUtils; public class ItemImaginary extends ItemOpenBlock { diff --git a/src/main/java/openblocks/common/item/ItemImaginationGlasses.java b/src/main/java/openblocks/common/item/ItemImaginationGlasses.java index cd2afbb7..9555921b 100644 --- a/src/main/java/openblocks/common/item/ItemImaginationGlasses.java +++ b/src/main/java/openblocks/common/item/ItemImaginationGlasses.java @@ -1,7 +1,8 @@ package openblocks.common.item; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import java.util.List; - import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; @@ -17,8 +18,6 @@ import openblocks.common.tileentity.TileEntityImaginary.Property; import openmods.utils.ColorUtils; import openmods.utils.ColorUtils.ColorMeta; import openmods.utils.ItemUtils; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; public class ItemImaginationGlasses extends ItemArmor { diff --git a/src/main/java/openblocks/common/item/ItemInfoBook.java b/src/main/java/openblocks/common/item/ItemInfoBook.java index 39195e58..c205dabc 100644 --- a/src/main/java/openblocks/common/item/ItemInfoBook.java +++ b/src/main/java/openblocks/common/item/ItemInfoBook.java @@ -1,12 +1,12 @@ package openblocks.common.item; +import cpw.mods.fml.common.FMLCommonHandler; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.world.World; import openblocks.OpenBlocks; import openblocks.client.gui.GuiInfoBook; -import cpw.mods.fml.common.FMLCommonHandler; public class ItemInfoBook extends Item { diff --git a/src/main/java/openblocks/common/item/ItemPaintBrush.java b/src/main/java/openblocks/common/item/ItemPaintBrush.java index 4c99a258..7dc47a3b 100644 --- a/src/main/java/openblocks/common/item/ItemPaintBrush.java +++ b/src/main/java/openblocks/common/item/ItemPaintBrush.java @@ -1,7 +1,8 @@ package openblocks.common.item; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import java.util.List; - import net.minecraft.block.Block; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.creativetab.CreativeTabs; @@ -20,8 +21,6 @@ import openmods.utils.ColorUtils; import openmods.utils.ColorUtils.ColorMeta; import openmods.utils.ItemUtils; import openmods.utils.render.PaintUtils; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; @BookDocumentation(customName = "paintbrush", hasVideo = true) public class ItemPaintBrush extends Item { diff --git a/src/main/java/openblocks/common/item/ItemPaintCan.java b/src/main/java/openblocks/common/item/ItemPaintCan.java index acb555a5..ce340a49 100644 --- a/src/main/java/openblocks/common/item/ItemPaintCan.java +++ b/src/main/java/openblocks/common/item/ItemPaintCan.java @@ -1,7 +1,6 @@ package openblocks.common.item; import java.util.List; - import net.minecraft.block.Block; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.player.EntityPlayer; diff --git a/src/main/java/openblocks/common/item/ItemPedometer.java b/src/main/java/openblocks/common/item/ItemPedometer.java index f6bbf22d..3c2be7d4 100644 --- a/src/main/java/openblocks/common/item/ItemPedometer.java +++ b/src/main/java/openblocks/common/item/ItemPedometer.java @@ -1,5 +1,7 @@ package openblocks.common.item; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; @@ -15,8 +17,6 @@ import openblocks.common.PedometerHandler.PedometerData; import openblocks.common.PedometerHandler.PedometerState; import openmods.utils.Units.DistanceUnit; import openmods.utils.Units.SpeedUnit; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; public class ItemPedometer extends Item { diff --git a/src/main/java/openblocks/common/item/ItemSkyBlock.java b/src/main/java/openblocks/common/item/ItemSkyBlock.java index 34b5b90b..2fdcaeae 100644 --- a/src/main/java/openblocks/common/item/ItemSkyBlock.java +++ b/src/main/java/openblocks/common/item/ItemSkyBlock.java @@ -1,7 +1,8 @@ package openblocks.common.item; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import java.util.List; - import net.minecraft.block.Block; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.player.EntityPlayer; @@ -11,8 +12,6 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.StatCollector; import openblocks.common.block.BlockSky; import openmods.utils.render.RenderUtils; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; public class ItemSkyBlock extends ItemBlock { diff --git a/src/main/java/openblocks/common/item/ItemSleepingBag.java b/src/main/java/openblocks/common/item/ItemSleepingBag.java index 114d04b3..6f6cd728 100644 --- a/src/main/java/openblocks/common/item/ItemSleepingBag.java +++ b/src/main/java/openblocks/common/item/ItemSleepingBag.java @@ -1,7 +1,8 @@ package openblocks.common.item; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import java.util.List; - import net.minecraft.block.Block; import net.minecraft.client.model.ModelBiped; import net.minecraft.entity.Entity; @@ -15,7 +16,12 @@ import net.minecraft.item.ItemArmor; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.network.play.server.S0APacketUseBed; -import net.minecraft.util.*; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.ChatComponentTranslation; +import net.minecraft.util.ChunkCoordinates; +import net.minecraft.util.IChatComponent; +import net.minecraft.util.MathHelper; +import net.minecraft.util.Vec3; import net.minecraft.world.World; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.common.util.Constants; @@ -29,8 +35,6 @@ import openmods.reflection.FieldAccess; import openmods.utils.BlockUtils; import openmods.utils.ItemUtils; import openmods.utils.TagUtils; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; @BookDocumentation(customName = "sleepingbag") public class ItemSleepingBag extends ItemArmor { diff --git a/src/main/java/openblocks/common/item/ItemSlimalyzer.java b/src/main/java/openblocks/common/item/ItemSlimalyzer.java index c6daec7c..f785d1d7 100644 --- a/src/main/java/openblocks/common/item/ItemSlimalyzer.java +++ b/src/main/java/openblocks/common/item/ItemSlimalyzer.java @@ -1,5 +1,7 @@ package openblocks.common.item; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.entity.Entity; import net.minecraft.item.Item; @@ -10,8 +12,6 @@ import net.minecraft.world.World; import net.minecraft.world.chunk.Chunk; import openblocks.OpenBlocks; import openmods.infobook.BookDocumentation; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; @BookDocumentation public class ItemSlimalyzer extends Item { diff --git a/src/main/java/openblocks/common/item/ItemSonicGlasses.java b/src/main/java/openblocks/common/item/ItemSonicGlasses.java index 73f8ec8d..bc094b50 100644 --- a/src/main/java/openblocks/common/item/ItemSonicGlasses.java +++ b/src/main/java/openblocks/common/item/ItemSonicGlasses.java @@ -1,5 +1,7 @@ package openblocks.common.item; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.client.model.ModelBiped; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; @@ -9,8 +11,6 @@ import net.minecraft.util.IIcon; import openblocks.OpenBlocks; import openblocks.client.model.ModelSonicGlasses; import openmods.infobook.BookDocumentation; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; @BookDocumentation public class ItemSonicGlasses extends ItemArmor { diff --git a/src/main/java/openblocks/common/item/ItemStencil.java b/src/main/java/openblocks/common/item/ItemStencil.java index 7457b2cb..b33b4619 100644 --- a/src/main/java/openblocks/common/item/ItemStencil.java +++ b/src/main/java/openblocks/common/item/ItemStencil.java @@ -1,7 +1,9 @@ package openblocks.common.item; +import com.google.common.base.Objects; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import java.util.List; - import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; @@ -15,11 +17,6 @@ import openblocks.common.block.BlockCanvas; import openblocks.common.tileentity.TileEntityCanvas; import openmods.utils.render.PaintUtils; -import com.google.common.base.Objects; - -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - public class ItemStencil extends Item { public ItemStencil() { diff --git a/src/main/java/openblocks/common/item/ItemTankBlock.java b/src/main/java/openblocks/common/item/ItemTankBlock.java index 38adcae2..9063b4eb 100644 --- a/src/main/java/openblocks/common/item/ItemTankBlock.java +++ b/src/main/java/openblocks/common/item/ItemTankBlock.java @@ -1,21 +1,23 @@ package openblocks.common.item; +import com.google.common.base.Strings; import java.util.List; - import net.minecraft.block.Block; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.StatCollector; -import net.minecraftforge.fluids.*; +import net.minecraftforge.fluids.Fluid; +import net.minecraftforge.fluids.FluidRegistry; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.FluidTank; +import net.minecraftforge.fluids.IFluidContainerItem; import openblocks.OpenBlocks; import openblocks.common.tileentity.TileEntityTank; import openmods.item.ItemOpenBlock; import openmods.utils.ItemUtils; -import com.google.common.base.Strings; - public class ItemTankBlock extends ItemOpenBlock implements IFluidContainerItem { public static final String TANK_TAG = "tank"; diff --git a/src/main/java/openblocks/common/item/ItemTrophyBlock.java b/src/main/java/openblocks/common/item/ItemTrophyBlock.java index 0d32d203..9a77474f 100644 --- a/src/main/java/openblocks/common/item/ItemTrophyBlock.java +++ b/src/main/java/openblocks/common/item/ItemTrophyBlock.java @@ -1,7 +1,6 @@ package openblocks.common.item; import java.util.List; - import net.minecraft.block.Block; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.item.Item; diff --git a/src/main/java/openblocks/common/item/ItemWrench.java b/src/main/java/openblocks/common/item/ItemWrench.java index 5aa860f5..29b1e448 100644 --- a/src/main/java/openblocks/common/item/ItemWrench.java +++ b/src/main/java/openblocks/common/item/ItemWrench.java @@ -1,10 +1,16 @@ package openblocks.common.item; +import com.google.common.base.Predicate; +import com.google.common.collect.Iterables; +import com.google.common.collect.Sets; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import java.util.Set; - import javax.annotation.Nullable; - -import net.minecraft.block.*; +import net.minecraft.block.Block; +import net.minecraft.block.BlockButton; +import net.minecraft.block.BlockChest; +import net.minecraft.block.BlockLever; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; @@ -12,16 +18,8 @@ import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; import openblocks.OpenBlocks; import openmods.infobook.BookDocumentation; - import org.apache.commons.lang3.ArrayUtils; -import com.google.common.base.Predicate; -import com.google.common.collect.Iterables; -import com.google.common.collect.Sets; - -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - @BookDocumentation public class ItemWrench extends Item { diff --git a/src/main/java/openblocks/common/item/MetaMiracleMagnet.java b/src/main/java/openblocks/common/item/MetaMiracleMagnet.java index 7bae3fd2..209c1778 100644 --- a/src/main/java/openblocks/common/item/MetaMiracleMagnet.java +++ b/src/main/java/openblocks/common/item/MetaMiracleMagnet.java @@ -1,15 +1,14 @@ package openblocks.common.item; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import java.util.List; - import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import openblocks.Config; import openblocks.integration.TurtleIds; import openblocks.integration.TurtleUtils; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; public class MetaMiracleMagnet extends MetaGeneric { public MetaMiracleMagnet(String name, Object... recipes) { diff --git a/src/main/java/openblocks/common/item/MetaPointer.java b/src/main/java/openblocks/common/item/MetaPointer.java index 6b8e49ba..9a3b95d5 100644 --- a/src/main/java/openblocks/common/item/MetaPointer.java +++ b/src/main/java/openblocks/common/item/MetaPointer.java @@ -1,5 +1,7 @@ package openblocks.common.item; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; @@ -11,8 +13,6 @@ import net.minecraft.util.Vec3; import net.minecraft.world.World; import openblocks.api.IPointable; import openmods.utils.ItemUtils; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; /** * Pointer item is used for.. pointing diff --git a/src/main/java/openblocks/common/item/MetasGeneric.java b/src/main/java/openblocks/common/item/MetasGeneric.java index eee6cd56..9c79d3b0 100644 --- a/src/main/java/openblocks/common/item/MetasGeneric.java +++ b/src/main/java/openblocks/common/item/MetasGeneric.java @@ -1,5 +1,7 @@ package openblocks.common.item; +import com.google.common.collect.ImmutableList; +import cpw.mods.fml.common.Loader; import net.minecraft.init.Items; import net.minecraft.item.ItemStack; import net.minecraftforge.oredict.OreDictionary; @@ -9,10 +11,6 @@ import openblocks.OpenBlocks; import openmods.infobook.ICustomBookEntryProvider; import openmods.item.IMetaItem; -import com.google.common.collect.ImmutableList; - -import cpw.mods.fml.common.Loader; - public enum MetasGeneric { gliderWing { @Override diff --git a/src/main/java/openblocks/common/recipe/CrayonGlassesRecipe.java b/src/main/java/openblocks/common/recipe/CrayonGlassesRecipe.java index 948b264a..5e97dcb0 100644 --- a/src/main/java/openblocks/common/recipe/CrayonGlassesRecipe.java +++ b/src/main/java/openblocks/common/recipe/CrayonGlassesRecipe.java @@ -1,7 +1,7 @@ package openblocks.common.recipe; +import com.google.common.collect.Lists; import java.util.List; - import net.minecraft.init.Items; import net.minecraft.inventory.InventoryCrafting; import net.minecraft.item.ItemStack; @@ -12,8 +12,6 @@ import openblocks.OpenBlocks; import openblocks.common.item.ItemImaginary; import openmods.utils.ItemUtils; -import com.google.common.collect.Lists; - public class CrayonGlassesRecipe extends ShapelessRecipes { private static List createFakeIngredientsList() { diff --git a/src/main/java/openblocks/common/sync/SyncableBlockLayers.java b/src/main/java/openblocks/common/sync/SyncableBlockLayers.java index 90ded040..86cf0301 100644 --- a/src/main/java/openblocks/common/sync/SyncableBlockLayers.java +++ b/src/main/java/openblocks/common/sync/SyncableBlockLayers.java @@ -1,15 +1,16 @@ package openblocks.common.sync; -import java.io.*; +import com.google.common.collect.Lists; +import java.io.DataInput; +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; import java.util.LinkedList; import java.util.List; - import net.minecraft.nbt.NBTTagCompound; import openblocks.common.Stencil; import openmods.sync.SyncableObjectBase; -import com.google.common.collect.Lists; - public class SyncableBlockLayers extends SyncableObjectBase { public static class Layer { diff --git a/src/main/java/openblocks/common/tileentity/TileEntityAutoAnvil.java b/src/main/java/openblocks/common/tileentity/TileEntityAutoAnvil.java index afea3a54..6a63b2cf 100644 --- a/src/main/java/openblocks/common/tileentity/TileEntityAutoAnvil.java +++ b/src/main/java/openblocks/common/tileentity/TileEntityAutoAnvil.java @@ -1,7 +1,6 @@ package openblocks.common.tileentity; import java.util.Set; - import net.minecraft.block.Block; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Items; @@ -18,7 +17,10 @@ import openblocks.client.gui.GuiAutoAnvil; import openblocks.common.LiquidXpUtils; import openblocks.common.container.ContainerAutoAnvil; import openblocks.common.tileentity.TileEntityAutoAnvil.AutoSlots; -import openmods.api.*; +import openmods.api.IHasGui; +import openmods.api.INeighbourAwareTile; +import openmods.api.IValueProvider; +import openmods.api.IValueReceiver; import openmods.gui.misc.IConfigurableGuiSlots; import openmods.include.IncludeInterface; import openmods.include.IncludeOverride; @@ -31,8 +33,14 @@ import openmods.sync.SyncableFlags; import openmods.sync.SyncableSides; import openmods.sync.SyncableTank; import openmods.tileentity.SyncedTileEntity; -import openmods.utils.*; -import openmods.utils.bitmap.*; +import openmods.utils.EnchantmentUtils; +import openmods.utils.MiscUtils; +import openmods.utils.SidedInventoryAdapter; +import openmods.utils.VanillaAnvilLogic; +import openmods.utils.bitmap.BitMapUtils; +import openmods.utils.bitmap.IRpcDirectionBitMap; +import openmods.utils.bitmap.IRpcIntBitMap; +import openmods.utils.bitmap.IWriteableBitMap; public class TileEntityAutoAnvil extends SyncedTileEntity implements IHasGui, IInventoryProvider, IConfigurableGuiSlots, INeighbourAwareTile { diff --git a/src/main/java/openblocks/common/tileentity/TileEntityAutoEnchantmentTable.java b/src/main/java/openblocks/common/tileentity/TileEntityAutoEnchantmentTable.java index 52ef3ab7..f22e5e54 100644 --- a/src/main/java/openblocks/common/tileentity/TileEntityAutoEnchantmentTable.java +++ b/src/main/java/openblocks/common/tileentity/TileEntityAutoEnchantmentTable.java @@ -2,7 +2,6 @@ package openblocks.common.tileentity; import java.util.Random; import java.util.Set; - import net.minecraft.block.Block; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.IInventory; @@ -19,7 +18,11 @@ import openblocks.common.LiquidXpUtils; import openblocks.common.container.ContainerAutoEnchantmentTable; import openblocks.common.tileentity.TileEntityAutoEnchantmentTable.AutoSlots; import openblocks.rpc.ILevelChanger; -import openmods.api.*; +import openmods.api.IHasGui; +import openmods.api.IInventoryCallback; +import openmods.api.INeighbourAwareTile; +import openmods.api.IValueProvider; +import openmods.api.IValueReceiver; import openmods.gui.misc.IConfigurableGuiSlots; import openmods.include.IncludeInterface; import openmods.include.IncludeOverride; @@ -28,12 +31,18 @@ import openmods.inventory.IInventoryProvider; import openmods.inventory.TileEntityInventory; import openmods.inventory.legacy.ItemDistribution; import openmods.liquids.SidedFluidHandler; -import openmods.sync.*; +import openmods.sync.SyncableFlags; +import openmods.sync.SyncableInt; +import openmods.sync.SyncableSides; +import openmods.sync.SyncableTank; import openmods.tileentity.SyncedTileEntity; import openmods.utils.EnchantmentUtils; import openmods.utils.MiscUtils; import openmods.utils.SidedInventoryAdapter; -import openmods.utils.bitmap.*; +import openmods.utils.bitmap.BitMapUtils; +import openmods.utils.bitmap.IRpcDirectionBitMap; +import openmods.utils.bitmap.IRpcIntBitMap; +import openmods.utils.bitmap.IWriteableBitMap; public class TileEntityAutoEnchantmentTable extends SyncedTileEntity implements IInventoryProvider, IHasGui, IConfigurableGuiSlots, ILevelChanger, IInventoryCallback, INeighbourAwareTile { diff --git a/src/main/java/openblocks/common/tileentity/TileEntityBearTrap.java b/src/main/java/openblocks/common/tileentity/TileEntityBearTrap.java index 427ade5f..170c961f 100644 --- a/src/main/java/openblocks/common/tileentity/TileEntityBearTrap.java +++ b/src/main/java/openblocks/common/tileentity/TileEntityBearTrap.java @@ -3,14 +3,20 @@ package openblocks.common.tileentity; import java.util.List; import java.util.Set; import java.util.UUID; - import net.minecraft.block.Block; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityCreature; import net.minecraft.entity.player.EntityPlayer; import net.minecraftforge.common.util.ForgeDirection; -import openmods.api.*; -import openmods.sync.*; +import openmods.api.IActivateAwareTile; +import openmods.api.IAddAwareTile; +import openmods.api.INeighbourAwareTile; +import openmods.api.ISurfaceAttachment; +import openmods.sync.ISyncListener; +import openmods.sync.ISyncableObject; +import openmods.sync.SyncableBoolean; +import openmods.sync.SyncableFlags; +import openmods.sync.SyncableUUID; import openmods.tileentity.SyncedTileEntity; public class TileEntityBearTrap extends SyncedTileEntity implements IActivateAwareTile, ISurfaceAttachment, INeighbourAwareTile, IAddAwareTile { diff --git a/src/main/java/openblocks/common/tileentity/TileEntityBigButton.java b/src/main/java/openblocks/common/tileentity/TileEntityBigButton.java index 10e394df..eb162a0a 100644 --- a/src/main/java/openblocks/common/tileentity/TileEntityBigButton.java +++ b/src/main/java/openblocks/common/tileentity/TileEntityBigButton.java @@ -1,7 +1,8 @@ package openblocks.common.tileentity; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import java.util.Set; - import net.minecraft.block.Block; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.IInventory; @@ -22,8 +23,6 @@ import openmods.sync.ISyncListener; import openmods.sync.ISyncableObject; import openmods.sync.SyncableFlags; import openmods.tileentity.SyncedTileEntity; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; public class TileEntityBigButton extends SyncedTileEntity implements IActivateAwareTile, ISurfaceAttachment, IHasGui, IInventoryProvider, ISyncListener { diff --git a/src/main/java/openblocks/common/tileentity/TileEntityBlockBreaker.java b/src/main/java/openblocks/common/tileentity/TileEntityBlockBreaker.java index b1fe27f2..4e3e1f71 100644 --- a/src/main/java/openblocks/common/tileentity/TileEntityBlockBreaker.java +++ b/src/main/java/openblocks/common/tileentity/TileEntityBlockBreaker.java @@ -1,7 +1,8 @@ package openblocks.common.tileentity; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import java.util.List; - import net.minecraft.block.Block; import net.minecraft.entity.item.EntityItem; import net.minecraft.init.Blocks; @@ -19,8 +20,6 @@ import openmods.inventory.GenericInventory; import openmods.inventory.legacy.ItemDistribution; import openmods.sync.SyncableBoolean; import openmods.tileentity.SyncedTileEntity; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; public class TileEntityBlockBreaker extends SyncedTileEntity implements INeighbourAwareTile { diff --git a/src/main/java/openblocks/common/tileentity/TileEntityBuilderGuide.java b/src/main/java/openblocks/common/tileentity/TileEntityBuilderGuide.java index c1f86bda..64ec409e 100644 --- a/src/main/java/openblocks/common/tileentity/TileEntityBuilderGuide.java +++ b/src/main/java/openblocks/common/tileentity/TileEntityBuilderGuide.java @@ -1,7 +1,6 @@ package openblocks.common.tileentity; import java.util.Random; - import net.minecraft.block.Block; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.init.Blocks; diff --git a/src/main/java/openblocks/common/tileentity/TileEntityCannon.java b/src/main/java/openblocks/common/tileentity/TileEntityCannon.java index 3c3c3eeb..db004b06 100644 --- a/src/main/java/openblocks/common/tileentity/TileEntityCannon.java +++ b/src/main/java/openblocks/common/tileentity/TileEntityCannon.java @@ -1,5 +1,7 @@ package openblocks.common.tileentity; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.Block; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; @@ -19,8 +21,6 @@ import openmods.sync.SyncableDouble; import openmods.tileentity.SyncedTileEntity; import openmods.utils.InventoryUtils; import openmods.utils.render.GeometryUtils; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; public class TileEntityCannon extends SyncedTileEntity implements IPointable, ISurfaceAttachment, ITriggerable { diff --git a/src/main/java/openblocks/common/tileentity/TileEntityCanvas.java b/src/main/java/openblocks/common/tileentity/TileEntityCanvas.java index 06a981be..4176d563 100644 --- a/src/main/java/openblocks/common/tileentity/TileEntityCanvas.java +++ b/src/main/java/openblocks/common/tileentity/TileEntityCanvas.java @@ -2,7 +2,6 @@ package openblocks.common.tileentity; import java.util.List; import java.util.Random; - import net.minecraft.block.Block; import net.minecraft.enchantment.EnchantmentHelper; import net.minecraft.entity.player.EntityPlayer; diff --git a/src/main/java/openblocks/common/tileentity/TileEntityDonationStation.java b/src/main/java/openblocks/common/tileentity/TileEntityDonationStation.java index 3f8dc37b..880a09e6 100644 --- a/src/main/java/openblocks/common/tileentity/TileEntityDonationStation.java +++ b/src/main/java/openblocks/common/tileentity/TileEntityDonationStation.java @@ -1,7 +1,7 @@ package openblocks.common.tileentity; +import cpw.mods.fml.common.ModContainer; import java.util.List; - import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.IInventory; import net.minecraft.item.ItemStack; @@ -16,7 +16,6 @@ import openmods.inventory.IInventoryProvider; import openmods.inventory.TileEntityInventory; import openmods.tileentity.OpenTileEntity; import openmods.utils.ModIdentifier; -import cpw.mods.fml.common.ModContainer; public class TileEntityDonationStation extends OpenTileEntity implements IHasGui, IInventoryProvider { diff --git a/src/main/java/openblocks/common/tileentity/TileEntityElevatorRotating.java b/src/main/java/openblocks/common/tileentity/TileEntityElevatorRotating.java index 59a3adad..bca7dec0 100644 --- a/src/main/java/openblocks/common/tileentity/TileEntityElevatorRotating.java +++ b/src/main/java/openblocks/common/tileentity/TileEntityElevatorRotating.java @@ -2,12 +2,14 @@ package openblocks.common.tileentity; import java.util.List; import java.util.Set; - import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import openblocks.OpenBlocks.Blocks; -import openmods.api.*; +import openmods.api.IActivateAwareTile; +import openmods.api.ICustomHarvestDrops; +import openmods.api.ICustomPickItem; +import openmods.api.IPlacerAwareTile; import openmods.sync.SyncableEnum; import openmods.tileentity.SyncedTileEntity; import openmods.utils.CollectionUtils; diff --git a/src/main/java/openblocks/common/tileentity/TileEntityFan.java b/src/main/java/openblocks/common/tileentity/TileEntityFan.java index 9e90288c..c8fc9fd1 100644 --- a/src/main/java/openblocks/common/tileentity/TileEntityFan.java +++ b/src/main/java/openblocks/common/tileentity/TileEntityFan.java @@ -1,7 +1,6 @@ package openblocks.common.tileentity; import java.util.List; - import net.minecraft.block.Block; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; diff --git a/src/main/java/openblocks/common/tileentity/TileEntityFlag.java b/src/main/java/openblocks/common/tileentity/TileEntityFlag.java index 5a7d0945..7d4b2b8e 100644 --- a/src/main/java/openblocks/common/tileentity/TileEntityFlag.java +++ b/src/main/java/openblocks/common/tileentity/TileEntityFlag.java @@ -1,5 +1,7 @@ package openblocks.common.tileentity; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.Block; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; @@ -14,8 +16,6 @@ import openmods.sync.SyncableFloat; import openmods.tileentity.SyncedTileEntity; import openmods.utils.BlockUtils; import openmods.utils.ColorUtils.RGB; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; public class TileEntityFlag extends SyncedTileEntity implements IPlaceAwareTile, IActivateAwareTile { diff --git a/src/main/java/openblocks/common/tileentity/TileEntityGoldenEgg.java b/src/main/java/openblocks/common/tileentity/TileEntityGoldenEgg.java index 03ccfc23..0f746418 100644 --- a/src/main/java/openblocks/common/tileentity/TileEntityGoldenEgg.java +++ b/src/main/java/openblocks/common/tileentity/TileEntityGoldenEgg.java @@ -1,9 +1,13 @@ package openblocks.common.tileentity; +import com.google.common.base.Objects; +import com.google.common.collect.Lists; +import com.mojang.authlib.GameProfile; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import java.util.List; import java.util.Random; import java.util.UUID; - import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; @@ -26,13 +30,6 @@ import openmods.fakeplayer.OpenModsFakePlayer; import openmods.sync.SyncableEnum; import openmods.tileentity.SyncedTileEntity; -import com.google.common.base.Objects; -import com.google.common.collect.Lists; -import com.mojang.authlib.GameProfile; - -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - public class TileEntityGoldenEgg extends SyncedTileEntity implements IPlacerAwareTile, IBreakAwareTile { private static final float SPEED_CHANGE_RATE = 0.1f; diff --git a/src/main/java/openblocks/common/tileentity/TileEntityGrave.java b/src/main/java/openblocks/common/tileentity/TileEntityGrave.java index fb9a3649..0633c979 100644 --- a/src/main/java/openblocks/common/tileentity/TileEntityGrave.java +++ b/src/main/java/openblocks/common/tileentity/TileEntityGrave.java @@ -1,7 +1,9 @@ package openblocks.common.tileentity; +import com.google.common.base.Strings; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import java.util.List; - import net.minecraft.block.Block; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLiving; @@ -20,7 +22,10 @@ import net.minecraft.world.EnumDifficulty; import net.minecraft.world.storage.WorldInfo; import net.minecraftforge.common.util.FakePlayer; import openblocks.Config; -import openmods.api.*; +import openmods.api.IActivateAwareTile; +import openmods.api.IAddAwareTile; +import openmods.api.INeighbourAwareTile; +import openmods.api.IPlacerAwareTile; import openmods.inventory.GenericInventory; import openmods.inventory.IInventoryProvider; import openmods.sync.SyncableBoolean; @@ -28,11 +33,6 @@ import openmods.sync.SyncableString; import openmods.tileentity.SyncedTileEntity; import openmods.utils.BlockUtils; -import com.google.common.base.Strings; - -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - public class TileEntityGrave extends SyncedTileEntity implements IPlacerAwareTile, IInventoryProvider, INeighbourAwareTile, IActivateAwareTile, IAddAwareTile { private static final String TAG_MESSAGE = "Message"; diff --git a/src/main/java/openblocks/common/tileentity/TileEntityGuide.java b/src/main/java/openblocks/common/tileentity/TileEntityGuide.java index e38e2742..532d1e1e 100644 --- a/src/main/java/openblocks/common/tileentity/TileEntityGuide.java +++ b/src/main/java/openblocks/common/tileentity/TileEntityGuide.java @@ -1,7 +1,19 @@ package openblocks.common.tileentity; -import java.util.*; - +import com.google.common.base.Preconditions; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; +import com.google.common.collect.Sets; +import com.google.common.primitives.Doubles; +import com.google.common.primitives.Ints; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; +import java.util.Map; +import java.util.Set; import net.minecraft.block.Block; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; @@ -18,24 +30,27 @@ import openmods.geometry.HalfAxis; import openmods.geometry.Orientation; import openmods.shapes.IShapeGenerator; import openmods.shapes.IShapeable; -import openmods.sync.*; +import openmods.sync.ISyncListener; +import openmods.sync.ISyncableObject; +import openmods.sync.SyncableBoolean; +import openmods.sync.SyncableEnum; +import openmods.sync.SyncableInt; +import openmods.sync.SyncableVarInt; import openmods.sync.drops.DroppableTileEntity; import openmods.sync.drops.StoreOnDrop; -import openmods.utils.*; +import openmods.utils.CollectionUtils; +import openmods.utils.ColorUtils; import openmods.utils.ColorUtils.ColorMeta; +import openmods.utils.Coord; +import openmods.utils.MathUtils; import openperipheral.api.adapter.Asynchronous; -import openperipheral.api.adapter.method.*; +import openperipheral.api.adapter.method.Alias; +import openperipheral.api.adapter.method.Arg; +import openperipheral.api.adapter.method.ReturnType; +import openperipheral.api.adapter.method.ScriptCallable; import openperipheral.api.struct.ScriptStruct; import openperipheral.api.struct.StructField; -import com.google.common.base.Preconditions; -import com.google.common.collect.*; -import com.google.common.primitives.Doubles; -import com.google.common.primitives.Ints; - -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - public class TileEntityGuide extends DroppableTileEntity implements ISyncListener, INeighbourAwareTile, IAddAwareTile { private static final Comparator COORD_COMPARATOR = new Comparator() { diff --git a/src/main/java/openblocks/common/tileentity/TileEntityHealBlock.java b/src/main/java/openblocks/common/tileentity/TileEntityHealBlock.java index f4706e95..0fa8eac2 100644 --- a/src/main/java/openblocks/common/tileentity/TileEntityHealBlock.java +++ b/src/main/java/openblocks/common/tileentity/TileEntityHealBlock.java @@ -1,7 +1,6 @@ package openblocks.common.tileentity; import java.util.List; - import net.minecraft.entity.player.EntityPlayer; import net.minecraft.potion.Potion; import net.minecraft.potion.PotionEffect; diff --git a/src/main/java/openblocks/common/tileentity/TileEntityImaginary.java b/src/main/java/openblocks/common/tileentity/TileEntityImaginary.java index deac4bbc..29c9d181 100644 --- a/src/main/java/openblocks/common/tileentity/TileEntityImaginary.java +++ b/src/main/java/openblocks/common/tileentity/TileEntityImaginary.java @@ -1,7 +1,9 @@ package openblocks.common.tileentity; +import com.google.common.base.Preconditions; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import java.util.List; - import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; @@ -15,11 +17,6 @@ import openmods.OpenMods; import openmods.api.ICustomPickItem; import openmods.tileentity.SimpleNetTileEntity; -import com.google.common.base.Preconditions; - -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - public class TileEntityImaginary extends SimpleNetTileEntity implements ICustomPickItem { public static final double PANEL_HEIGHT = 0.1; diff --git a/src/main/java/openblocks/common/tileentity/TileEntityPaintMixer.java b/src/main/java/openblocks/common/tileentity/TileEntityPaintMixer.java index cdb931e8..16987d6f 100644 --- a/src/main/java/openblocks/common/tileentity/TileEntityPaintMixer.java +++ b/src/main/java/openblocks/common/tileentity/TileEntityPaintMixer.java @@ -1,7 +1,7 @@ package openblocks.common.tileentity; +import com.google.common.collect.Maps; import java.util.EnumMap; - import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Items; import net.minecraft.inventory.IInventory; @@ -28,11 +28,8 @@ import openmods.sync.drops.DroppableTileEntity; import openmods.sync.drops.StoreOnDrop; import openmods.utils.ColorUtils; import openmods.utils.MiscUtils; - import org.apache.commons.lang3.ArrayUtils; -import com.google.common.collect.Maps; - public class TileEntityPaintMixer extends DroppableTileEntity implements IInventoryProvider, IHasGui, IInventoryCallback, IColorChanger { private static final ItemStack PAINT_CAN = new ItemStack(OpenBlocks.Blocks.paintCan); diff --git a/src/main/java/openblocks/common/tileentity/TileEntityProjector.java b/src/main/java/openblocks/common/tileentity/TileEntityProjector.java index 8fa3cab7..30c42788 100644 --- a/src/main/java/openblocks/common/tileentity/TileEntityProjector.java +++ b/src/main/java/openblocks/common/tileentity/TileEntityProjector.java @@ -1,7 +1,8 @@ package openblocks.common.tileentity; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import java.util.Set; - import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.IInventory; import net.minecraft.item.Item; @@ -20,10 +21,11 @@ import openmods.include.IncludeInterface; import openmods.inventory.GenericInventory; import openmods.inventory.IInventoryProvider; import openmods.inventory.TileEntityInventory; -import openmods.sync.*; +import openmods.sync.ISyncListener; +import openmods.sync.ISyncableObject; +import openmods.sync.SyncableByte; +import openmods.sync.SyncableInt; import openmods.tileentity.SyncedTileEntity; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; public class TileEntityProjector extends SyncedTileEntity implements IHasGui, IInventoryProvider, ISyncListener, IRotatable { diff --git a/src/main/java/openblocks/common/tileentity/TileEntitySky.java b/src/main/java/openblocks/common/tileentity/TileEntitySky.java index 8330e0ff..c3ce0163 100644 --- a/src/main/java/openblocks/common/tileentity/TileEntitySky.java +++ b/src/main/java/openblocks/common/tileentity/TileEntitySky.java @@ -1,8 +1,8 @@ package openblocks.common.tileentity; -import openmods.tileentity.OpenTileEntity; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import openmods.tileentity.OpenTileEntity; public class TileEntitySky extends OpenTileEntity { diff --git a/src/main/java/openblocks/common/tileentity/TileEntitySprinkler.java b/src/main/java/openblocks/common/tileentity/TileEntitySprinkler.java index 35a3941f..2bf5551a 100644 --- a/src/main/java/openblocks/common/tileentity/TileEntitySprinkler.java +++ b/src/main/java/openblocks/common/tileentity/TileEntitySprinkler.java @@ -1,7 +1,6 @@ package openblocks.common.tileentity; import java.util.Random; - import net.minecraft.block.Block; import net.minecraft.client.Minecraft; import net.minecraft.entity.player.EntityPlayer; diff --git a/src/main/java/openblocks/common/tileentity/TileEntityTank.java b/src/main/java/openblocks/common/tileentity/TileEntityTank.java index fd7c40fe..5d63d64d 100644 --- a/src/main/java/openblocks/common/tileentity/TileEntityTank.java +++ b/src/main/java/openblocks/common/tileentity/TileEntityTank.java @@ -1,8 +1,8 @@ package openblocks.common.tileentity; +import com.google.common.collect.Lists; import java.util.List; import java.util.Set; - import net.minecraft.block.Block; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; @@ -11,13 +11,24 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.chunk.Chunk; import net.minecraftforge.common.util.ForgeDirection; -import net.minecraftforge.fluids.*; +import net.minecraftforge.fluids.Fluid; +import net.minecraftforge.fluids.FluidContainerRegistry; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.IFluidHandler; +import net.minecraftforge.fluids.IFluidTank; import openblocks.Config; import openblocks.OpenBlocks; -import openblocks.client.renderer.tileentity.tank.*; +import openblocks.client.renderer.tileentity.tank.INeighbourMap; +import openblocks.client.renderer.tileentity.tank.ITankConnections; +import openblocks.client.renderer.tileentity.tank.ITankRenderFluidData; +import openblocks.client.renderer.tileentity.tank.NeighbourMap; +import openblocks.client.renderer.tileentity.tank.TankRenderLogic; import openblocks.common.LiquidXpUtils; import openblocks.common.item.ItemTankBlock; -import openmods.api.*; +import openmods.api.IActivateAwareTile; +import openmods.api.ICustomHarvestDrops; +import openmods.api.INeighbourAwareTile; +import openmods.api.IPlacerAwareTile; import openmods.include.IncludeInterface; import openmods.include.IncludeOverride; import openmods.liquids.GenericFluidHandler; @@ -28,8 +39,6 @@ import openmods.tileentity.SyncedTileEntity; import openmods.utils.EnchantmentUtils; import openmods.utils.ItemUtils; -import com.google.common.collect.Lists; - public class TileEntityTank extends SyncedTileEntity implements IActivateAwareTile, IPlacerAwareTile, INeighbourAwareTile, ICustomHarvestDrops { private class RenderUpdateListeners implements ISyncListener { diff --git a/src/main/java/openblocks/common/tileentity/TileEntityTarget.java b/src/main/java/openblocks/common/tileentity/TileEntityTarget.java index 5ed7f808..a30fff85 100644 --- a/src/main/java/openblocks/common/tileentity/TileEntityTarget.java +++ b/src/main/java/openblocks/common/tileentity/TileEntityTarget.java @@ -1,8 +1,11 @@ package openblocks.common.tileentity; +import com.google.common.collect.Lists; +import com.google.common.collect.Sets; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import java.util.List; import java.util.Set; - import net.minecraft.block.Block; import net.minecraft.command.IEntitySelector; import net.minecraft.entity.Entity; @@ -29,12 +32,6 @@ import openmods.tileentity.SyncedTileEntity; import openmods.utils.BlockUtils; import openmods.utils.EntityUtils; -import com.google.common.collect.Lists; -import com.google.common.collect.Sets; - -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - public class TileEntityTarget extends SyncedTileEntity implements ISurfaceAttachment, INeighbourAwareTile, IAddAwareTile { private int strength = 0; diff --git a/src/main/java/openblocks/common/tileentity/TileEntityTrophy.java b/src/main/java/openblocks/common/tileentity/TileEntityTrophy.java index 9dde311c..cbeaea4e 100644 --- a/src/main/java/openblocks/common/tileentity/TileEntityTrophy.java +++ b/src/main/java/openblocks/common/tileentity/TileEntityTrophy.java @@ -1,14 +1,16 @@ package openblocks.common.tileentity; import java.util.List; - import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import openblocks.common.TrophyHandler.Trophy; import openblocks.common.item.ItemTrophyBlock; -import openmods.api.*; +import openmods.api.IActivateAwareTile; +import openmods.api.ICustomHarvestDrops; +import openmods.api.ICustomPickItem; +import openmods.api.IPlacerAwareTile; import openmods.sync.SyncableEnum; import openmods.tileentity.SyncedTileEntity; import openmods.utils.ItemUtils; diff --git a/src/main/java/openblocks/common/tileentity/TileEntityVacuumHopper.java b/src/main/java/openblocks/common/tileentity/TileEntityVacuumHopper.java index 6a996af0..3b8be191 100644 --- a/src/main/java/openblocks/common/tileentity/TileEntityVacuumHopper.java +++ b/src/main/java/openblocks/common/tileentity/TileEntityVacuumHopper.java @@ -1,8 +1,8 @@ package openblocks.common.tileentity; +import com.google.common.collect.Lists; import java.util.Collections; import java.util.List; - import net.minecraft.block.Block; import net.minecraft.command.IEntitySelector; import net.minecraft.entity.Entity; @@ -23,7 +23,10 @@ import openblocks.common.LiquidXpUtils; import openblocks.common.container.ContainerVacuumHopper; import openblocks.common.entity.EntityItemProjectile; import openmods.OpenMods; -import openmods.api.*; +import openmods.api.IActivateAwareTile; +import openmods.api.IHasGui; +import openmods.api.INeighbourAwareTile; +import openmods.api.IValueProvider; import openmods.include.IncludeInterface; import openmods.inventory.GenericInventory; import openmods.inventory.IInventoryProvider; @@ -36,9 +39,10 @@ import openmods.sync.SyncableTank; import openmods.tileentity.SyncedTileEntity; import openmods.utils.EnchantmentUtils; import openmods.utils.SidedInventoryAdapter; -import openmods.utils.bitmap.*; - -import com.google.common.collect.Lists; +import openmods.utils.bitmap.BitMapUtils; +import openmods.utils.bitmap.IReadableBitMap; +import openmods.utils.bitmap.IRpcDirectionBitMap; +import openmods.utils.bitmap.IWriteableBitMap; public class TileEntityVacuumHopper extends SyncedTileEntity implements IInventoryProvider, IActivateAwareTile, IHasGui, IEntitySelector, INeighbourAwareTile { diff --git a/src/main/java/openblocks/common/tileentity/TileEntityVillageHighlighter.java b/src/main/java/openblocks/common/tileentity/TileEntityVillageHighlighter.java index f83f5764..12bb597a 100644 --- a/src/main/java/openblocks/common/tileentity/TileEntityVillageHighlighter.java +++ b/src/main/java/openblocks/common/tileentity/TileEntityVillageHighlighter.java @@ -1,17 +1,16 @@ package openblocks.common.tileentity; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; import java.util.ArrayList; import java.util.Iterator; import java.util.List; - import net.minecraft.util.AxisAlignedBB; import net.minecraft.village.Village; import openblocks.OpenBlocks; import openmods.OpenMods; import openmods.sync.SyncableIntArray; import openmods.tileentity.SyncedTileEntity; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; public class TileEntityVillageHighlighter extends SyncedTileEntity { diff --git a/src/main/java/openblocks/common/tileentity/TileEntityXPBottler.java b/src/main/java/openblocks/common/tileentity/TileEntityXPBottler.java index c27fbf86..bc30efcb 100644 --- a/src/main/java/openblocks/common/tileentity/TileEntityXPBottler.java +++ b/src/main/java/openblocks/common/tileentity/TileEntityXPBottler.java @@ -1,7 +1,6 @@ package openblocks.common.tileentity; import java.util.Set; - import net.minecraft.block.Block; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Items; @@ -18,7 +17,10 @@ import openblocks.client.gui.GuiXPBottler; import openblocks.common.LiquidXpUtils; import openblocks.common.container.ContainerXPBottler; import openblocks.common.tileentity.TileEntityXPBottler.AutoSlots; -import openmods.api.*; +import openmods.api.IHasGui; +import openmods.api.INeighbourAwareTile; +import openmods.api.IValueProvider; +import openmods.api.IValueReceiver; import openmods.gamelogic.WorkerLogic; import openmods.gui.misc.IConfigurableGuiSlots; import openmods.include.IncludeInterface; @@ -28,11 +30,17 @@ import openmods.inventory.IInventoryProvider; import openmods.inventory.TileEntityInventory; import openmods.inventory.legacy.ItemDistribution; import openmods.liquids.SidedFluidHandler; -import openmods.sync.*; +import openmods.sync.SyncableFlags; +import openmods.sync.SyncableInt; +import openmods.sync.SyncableSides; +import openmods.sync.SyncableTank; import openmods.tileentity.SyncedTileEntity; import openmods.utils.MiscUtils; import openmods.utils.SidedInventoryAdapter; -import openmods.utils.bitmap.*; +import openmods.utils.bitmap.BitMapUtils; +import openmods.utils.bitmap.IRpcDirectionBitMap; +import openmods.utils.bitmap.IRpcIntBitMap; +import openmods.utils.bitmap.IWriteableBitMap; public class TileEntityXPBottler extends SyncedTileEntity implements IInventoryProvider, IHasGui, IConfigurableGuiSlots, INeighbourAwareTile { diff --git a/src/main/java/openblocks/common/tileentity/TileEntityXPDrain.java b/src/main/java/openblocks/common/tileentity/TileEntityXPDrain.java index 56a9c081..becb0f8d 100644 --- a/src/main/java/openblocks/common/tileentity/TileEntityXPDrain.java +++ b/src/main/java/openblocks/common/tileentity/TileEntityXPDrain.java @@ -2,7 +2,6 @@ package openblocks.common.tileentity; import java.lang.ref.WeakReference; import java.util.List; - import net.minecraft.block.Block; import net.minecraft.entity.item.EntityXPOrb; import net.minecraft.entity.player.EntityPlayer; diff --git a/src/main/java/openblocks/enchantments/ExplosiveEnchantmentsHandler.java b/src/main/java/openblocks/enchantments/ExplosiveEnchantmentsHandler.java index 78e9f6c6..e1045ddf 100644 --- a/src/main/java/openblocks/enchantments/ExplosiveEnchantmentsHandler.java +++ b/src/main/java/openblocks/enchantments/ExplosiveEnchantmentsHandler.java @@ -1,7 +1,13 @@ package openblocks.enchantments; -import java.util.*; - +import com.google.common.collect.ImmutableSet; +import com.google.common.collect.Lists; +import com.google.common.collect.MapMaker; +import cpw.mods.fml.common.eventhandler.SubscribeEvent; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.Set; import net.minecraft.client.Minecraft; import net.minecraft.client.settings.KeyBinding; import net.minecraft.enchantment.EnchantmentHelper; @@ -21,12 +27,6 @@ import openblocks.Config; import openblocks.OpenBlocks.Enchantments; import openmods.OpenMods; -import com.google.common.collect.ImmutableSet; -import com.google.common.collect.Lists; -import com.google.common.collect.MapMaker; - -import cpw.mods.fml.common.eventhandler.SubscribeEvent; - public class ExplosiveEnchantmentsHandler { public static final int ARMOR_HELMET = 3; diff --git a/src/main/java/openblocks/enchantments/FlimFlamEnchantmentsHandler.java b/src/main/java/openblocks/enchantments/FlimFlamEnchantmentsHandler.java index bb25b154..2c6870ba 100644 --- a/src/main/java/openblocks/enchantments/FlimFlamEnchantmentsHandler.java +++ b/src/main/java/openblocks/enchantments/FlimFlamEnchantmentsHandler.java @@ -1,7 +1,12 @@ package openblocks.enchantments; -import java.util.*; - +import com.google.common.collect.Lists; +import cpw.mods.fml.common.eventhandler.SubscribeEvent; +import java.util.Collections; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Random; import net.minecraft.enchantment.EnchantmentHelper; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; @@ -18,10 +23,6 @@ import openblocks.api.IFlimFlamDescription; import openblocks.enchantments.flimflams.FlimFlamRegistry; import openmods.Log; -import com.google.common.collect.Lists; - -import cpw.mods.fml.common.eventhandler.SubscribeEvent; - public class FlimFlamEnchantmentsHandler { public static final String LUCK_PROPERTY = "OpenBlocks-Luck"; diff --git a/src/main/java/openblocks/enchantments/LastStandEnchantmentsHandler.java b/src/main/java/openblocks/enchantments/LastStandEnchantmentsHandler.java index 1401604f..c17e6c19 100644 --- a/src/main/java/openblocks/enchantments/LastStandEnchantmentsHandler.java +++ b/src/main/java/openblocks/enchantments/LastStandEnchantmentsHandler.java @@ -1,7 +1,8 @@ package openblocks.enchantments; +import cpw.mods.fml.common.eventhandler.EventPriority; +import cpw.mods.fml.common.eventhandler.SubscribeEvent; import java.util.Map; - import net.minecraft.enchantment.EnchantmentHelper; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; @@ -9,13 +10,13 @@ import net.minecraftforge.event.entity.living.LivingHurtEvent; import openblocks.Config; import openblocks.OpenBlocks.Enchantments; import openmods.Log; -import openmods.calc.*; +import openmods.calc.Calculator; import openmods.calc.Calculator.ExprType; +import openmods.calc.Constant; +import openmods.calc.IExecutable; import openmods.calc.types.fp.DoubleCalculator; import openmods.config.properties.ConfigurationChange; import openmods.utils.EnchantmentUtils; -import cpw.mods.fml.common.eventhandler.EventPriority; -import cpw.mods.fml.common.eventhandler.SubscribeEvent; public class LastStandEnchantmentsHandler { diff --git a/src/main/java/openblocks/enchantments/flimflams/DummyCreepersFlimFlam.java b/src/main/java/openblocks/enchantments/flimflams/DummyCreepersFlimFlam.java index 5dfcb102..3db26fa4 100644 --- a/src/main/java/openblocks/enchantments/flimflams/DummyCreepersFlimFlam.java +++ b/src/main/java/openblocks/enchantments/flimflams/DummyCreepersFlimFlam.java @@ -1,15 +1,13 @@ package openblocks.enchantments.flimflams; +import com.google.common.base.Throwables; import java.util.Random; - import net.minecraft.entity.DataWatcher; import net.minecraft.entity.monster.EntityCreeper; import net.minecraft.entity.player.EntityPlayerMP; import openblocks.api.IFlimFlamAction; import openmods.reflection.FieldAccess; -import com.google.common.base.Throwables; - public class DummyCreepersFlimFlam implements IFlimFlamAction { private static final Random random = new Random(); diff --git a/src/main/java/openblocks/enchantments/flimflams/EffectFlimFlam.java b/src/main/java/openblocks/enchantments/flimflams/EffectFlimFlam.java index ceefdb00..b6da4e2c 100644 --- a/src/main/java/openblocks/enchantments/flimflams/EffectFlimFlam.java +++ b/src/main/java/openblocks/enchantments/flimflams/EffectFlimFlam.java @@ -1,16 +1,14 @@ package openblocks.enchantments.flimflams; +import com.google.common.collect.Lists; import java.util.Collections; import java.util.List; import java.util.Random; - import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.potion.Potion; import net.minecraft.potion.PotionEffect; import openblocks.api.IFlimFlamAction; -import com.google.common.collect.Lists; - public class EffectFlimFlam implements IFlimFlamAction { private static final Random RANDOM = new Random(); diff --git a/src/main/java/openblocks/enchantments/flimflams/FlimFlamRegistry.java b/src/main/java/openblocks/enchantments/flimflams/FlimFlamRegistry.java index da05fb19..dfebdb6b 100644 --- a/src/main/java/openblocks/enchantments/flimflams/FlimFlamRegistry.java +++ b/src/main/java/openblocks/enchantments/flimflams/FlimFlamRegistry.java @@ -1,18 +1,24 @@ package openblocks.enchantments.flimflams; -import java.util.*; - +import com.google.common.collect.ImmutableList; +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; +import com.google.common.collect.Sets; +import cpw.mods.fml.common.eventhandler.SubscribeEvent; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.Set; import net.minecraftforge.common.MinecraftForge; import openblocks.Config; -import openblocks.api.*; +import openblocks.api.FlimFlamDescriptionSimple; +import openblocks.api.IFlimFlamAction; +import openblocks.api.IFlimFlamDescription; +import openblocks.api.IFlimFlamRegistry; import openmods.Log; import openmods.access.ApiSingleton; import openmods.config.properties.ConfigurationChange; -import com.google.common.collect.*; - -import cpw.mods.fml.common.eventhandler.SubscribeEvent; - @ApiSingleton public class FlimFlamRegistry implements IFlimFlamRegistry { diff --git a/src/main/java/openblocks/enchantments/flimflams/InventoryShuffleFlimFlam.java b/src/main/java/openblocks/enchantments/flimflams/InventoryShuffleFlimFlam.java index 83781e79..4f9cf033 100644 --- a/src/main/java/openblocks/enchantments/flimflams/InventoryShuffleFlimFlam.java +++ b/src/main/java/openblocks/enchantments/flimflams/InventoryShuffleFlimFlam.java @@ -3,7 +3,6 @@ package openblocks.enchantments.flimflams; import java.util.Arrays; import java.util.Collections; import java.util.List; - import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.inventory.ContainerPlayer; import net.minecraft.item.ItemStack; diff --git a/src/main/java/openblocks/enchantments/flimflams/InvisibleMobsFlimFlam.java b/src/main/java/openblocks/enchantments/flimflams/InvisibleMobsFlimFlam.java index 106c9073..a9d87a80 100644 --- a/src/main/java/openblocks/enchantments/flimflams/InvisibleMobsFlimFlam.java +++ b/src/main/java/openblocks/enchantments/flimflams/InvisibleMobsFlimFlam.java @@ -2,7 +2,6 @@ package openblocks.enchantments.flimflams; import java.util.List; import java.util.Random; - import net.minecraft.entity.EntityLiving; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.potion.Potion; diff --git a/src/main/java/openblocks/enchantments/flimflams/ItemDropFlimFlam.java b/src/main/java/openblocks/enchantments/flimflams/ItemDropFlimFlam.java index 0e7ea123..baad1284 100644 --- a/src/main/java/openblocks/enchantments/flimflams/ItemDropFlimFlam.java +++ b/src/main/java/openblocks/enchantments/flimflams/ItemDropFlimFlam.java @@ -1,7 +1,6 @@ package openblocks.enchantments.flimflams; import java.util.Random; - import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.item.ItemStack; diff --git a/src/main/java/openblocks/enchantments/flimflams/LoreFlimFlam.java b/src/main/java/openblocks/enchantments/flimflams/LoreFlimFlam.java index 25876325..dc748651 100644 --- a/src/main/java/openblocks/enchantments/flimflams/LoreFlimFlam.java +++ b/src/main/java/openblocks/enchantments/flimflams/LoreFlimFlam.java @@ -1,11 +1,22 @@ package openblocks.enchantments.flimflams; +import com.google.common.base.Joiner; +import com.google.common.base.Splitter; +import com.google.common.collect.Lists; +import cpw.mods.fml.common.eventhandler.SubscribeEvent; import java.util.Collections; import java.util.List; - import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.item.*; +import net.minecraft.item.Item; +import net.minecraft.item.ItemArmor; +import net.minecraft.item.ItemAxe; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemBucket; +import net.minecraft.item.ItemPickaxe; +import net.minecraft.item.ItemShears; +import net.minecraft.item.ItemSpade; +import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import net.minecraft.nbt.NBTTagString; @@ -17,15 +28,8 @@ import openblocks.Config; import openblocks.api.IFlimFlamAction; import openblocks.rubbish.LoreGenerator; import openmods.utils.ItemUtils; - import org.lwjgl.input.Keyboard; -import com.google.common.base.Joiner; -import com.google.common.base.Splitter; -import com.google.common.collect.Lists; - -import cpw.mods.fml.common.eventhandler.SubscribeEvent; - public class LoreFlimFlam implements IFlimFlamAction { public static final String TAG_NAME = "SillyLore"; diff --git a/src/main/java/openblocks/enchantments/flimflams/MountFlimFlam.java b/src/main/java/openblocks/enchantments/flimflams/MountFlimFlam.java index b89f4bd1..2549114e 100644 --- a/src/main/java/openblocks/enchantments/flimflams/MountFlimFlam.java +++ b/src/main/java/openblocks/enchantments/flimflams/MountFlimFlam.java @@ -1,7 +1,6 @@ package openblocks.enchantments.flimflams; import java.util.List; - import net.minecraft.command.IEntitySelector; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityCreature; diff --git a/src/main/java/openblocks/enchantments/flimflams/RenameFlimFlam.java b/src/main/java/openblocks/enchantments/flimflams/RenameFlimFlam.java index c47cd635..7eeef6de 100644 --- a/src/main/java/openblocks/enchantments/flimflams/RenameFlimFlam.java +++ b/src/main/java/openblocks/enchantments/flimflams/RenameFlimFlam.java @@ -1,8 +1,8 @@ package openblocks.enchantments.flimflams; +import com.google.common.base.Strings; import java.util.Collections; import java.util.List; - import net.minecraft.entity.EntityLiving; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.util.AxisAlignedBB; @@ -10,11 +10,8 @@ import net.minecraft.world.World; import openblocks.api.IFlimFlamAction; import openblocks.rubbish.LoreGenerator; import openmods.utils.WorldUtils; - import org.apache.commons.lang3.StringUtils; -import com.google.common.base.Strings; - public class RenameFlimFlam implements IFlimFlamAction { @Override diff --git a/src/main/java/openblocks/enchantments/flimflams/SheepDyeFlimFlam.java b/src/main/java/openblocks/enchantments/flimflams/SheepDyeFlimFlam.java index 7d1aa218..031accf5 100644 --- a/src/main/java/openblocks/enchantments/flimflams/SheepDyeFlimFlam.java +++ b/src/main/java/openblocks/enchantments/flimflams/SheepDyeFlimFlam.java @@ -2,7 +2,6 @@ package openblocks.enchantments.flimflams; import java.util.List; import java.util.Random; - import net.minecraft.entity.passive.EntitySheep; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.util.AxisAlignedBB; diff --git a/src/main/java/openblocks/enchantments/flimflams/SnowballsFlimFlam.java b/src/main/java/openblocks/enchantments/flimflams/SnowballsFlimFlam.java index 80ac4a67..c69c35fe 100644 --- a/src/main/java/openblocks/enchantments/flimflams/SnowballsFlimFlam.java +++ b/src/main/java/openblocks/enchantments/flimflams/SnowballsFlimFlam.java @@ -1,7 +1,6 @@ package openblocks.enchantments.flimflams; import java.util.Random; - import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.entity.projectile.EntitySnowball; import net.minecraft.world.World; diff --git a/src/main/java/openblocks/enchantments/flimflams/SoundFlimFlam.java b/src/main/java/openblocks/enchantments/flimflams/SoundFlimFlam.java index 76c49a4d..9ba96e9b 100644 --- a/src/main/java/openblocks/enchantments/flimflams/SoundFlimFlam.java +++ b/src/main/java/openblocks/enchantments/flimflams/SoundFlimFlam.java @@ -1,14 +1,12 @@ package openblocks.enchantments.flimflams; +import com.google.common.collect.ImmutableList; import java.util.List; - import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.network.play.server.S29PacketSoundEffect; import openblocks.api.IFlimFlamAction; import openmods.utils.CollectionUtils; -import com.google.common.collect.ImmutableList; - public class SoundFlimFlam implements IFlimFlamAction { private static final List sounds = ImmutableList.of( diff --git a/src/main/java/openblocks/enchantments/flimflams/SquidFilmFlam.java b/src/main/java/openblocks/enchantments/flimflams/SquidFilmFlam.java index 19e34f30..ee34f9b9 100644 --- a/src/main/java/openblocks/enchantments/flimflams/SquidFilmFlam.java +++ b/src/main/java/openblocks/enchantments/flimflams/SquidFilmFlam.java @@ -1,14 +1,12 @@ package openblocks.enchantments.flimflams; +import com.google.common.collect.ImmutableList; import java.util.List; import java.util.Random; - import net.minecraft.entity.passive.EntitySquid; import net.minecraft.entity.player.EntityPlayerMP; import openblocks.api.IFlimFlamAction; -import com.google.common.collect.ImmutableList; - public class SquidFilmFlam implements IFlimFlamAction { private static final Random random = new Random(); diff --git a/src/main/java/openblocks/enchantments/flimflams/UselessToolFlimFlam.java b/src/main/java/openblocks/enchantments/flimflams/UselessToolFlimFlam.java index c5c3a4fa..4853d9fa 100644 --- a/src/main/java/openblocks/enchantments/flimflams/UselessToolFlimFlam.java +++ b/src/main/java/openblocks/enchantments/flimflams/UselessToolFlimFlam.java @@ -2,7 +2,6 @@ package openblocks.enchantments.flimflams; import java.util.Map; import java.util.Random; - import net.minecraft.enchantment.EnchantmentData; import net.minecraft.enchantment.EnchantmentHelper; import net.minecraft.entity.player.EntityPlayerMP; diff --git a/src/main/java/openblocks/events/ElevatorActionEvent.java b/src/main/java/openblocks/events/ElevatorActionEvent.java index 6e142269..4a4995ff 100644 --- a/src/main/java/openblocks/events/ElevatorActionEvent.java +++ b/src/main/java/openblocks/events/ElevatorActionEvent.java @@ -3,7 +3,6 @@ package openblocks.events; import java.io.DataInput; import java.io.DataOutput; import java.io.IOException; - import openmods.events.network.BlockEventPacket; import openmods.movement.PlayerMovementEvent; import openmods.network.event.EventDirection; diff --git a/src/main/java/openblocks/events/PlayerActionEvent.java b/src/main/java/openblocks/events/PlayerActionEvent.java index 3bc92ea7..45b6f030 100644 --- a/src/main/java/openblocks/events/PlayerActionEvent.java +++ b/src/main/java/openblocks/events/PlayerActionEvent.java @@ -2,7 +2,6 @@ package openblocks.events; import java.io.DataInput; import java.io.DataOutput; - import openmods.network.event.EventDirection; import openmods.network.event.NetworkEvent; import openmods.network.event.NetworkEventMeta; diff --git a/src/main/java/openblocks/integration/AdapterProjector.java b/src/main/java/openblocks/integration/AdapterProjector.java index dcd46073..0952253d 100644 --- a/src/main/java/openblocks/integration/AdapterProjector.java +++ b/src/main/java/openblocks/integration/AdapterProjector.java @@ -1,23 +1,24 @@ package openblocks.integration; +import com.google.common.base.Preconditions; +import com.google.common.collect.Maps; +import com.google.common.primitives.UnsignedBytes; import java.util.Map; - import net.minecraft.block.material.MapColor; import openblocks.common.HeightMapData; import openblocks.common.HeightMapData.LayerData; import openblocks.common.tileentity.TileEntityProjector; import openperipheral.api.adapter.Asynchronous; import openperipheral.api.adapter.IPeripheralAdapter; -import openperipheral.api.adapter.method.*; +import openperipheral.api.adapter.method.Arg; +import openperipheral.api.adapter.method.ArgType; +import openperipheral.api.adapter.method.IMultiReturn; +import openperipheral.api.adapter.method.ReturnType; +import openperipheral.api.adapter.method.ScriptCallable; import openperipheral.api.architecture.FeatureGroup; import openperipheral.api.helpers.MultiReturn; - import org.apache.commons.lang3.ArrayUtils; -import com.google.common.base.Preconditions; -import com.google.common.collect.Maps; -import com.google.common.primitives.UnsignedBytes; - @FeatureGroup("openblocks-projector") public class AdapterProjector implements IPeripheralAdapter { diff --git a/src/main/java/openblocks/integration/AdapterVillageHighlighter.java b/src/main/java/openblocks/integration/AdapterVillageHighlighter.java index 9985ecac..24180118 100644 --- a/src/main/java/openblocks/integration/AdapterVillageHighlighter.java +++ b/src/main/java/openblocks/integration/AdapterVillageHighlighter.java @@ -1,8 +1,8 @@ package openblocks.integration; +import com.google.common.collect.Maps; import java.util.List; import java.util.Map; - import net.minecraft.village.Village; import openblocks.common.tileentity.TileEntityVillageHighlighter; import openperipheral.api.adapter.IPeripheralAdapter; @@ -10,8 +10,6 @@ import openperipheral.api.adapter.method.ReturnType; import openperipheral.api.adapter.method.ScriptCallable; import openperipheral.api.architecture.FeatureGroup; -import com.google.common.collect.Maps; - @FeatureGroup("openblocks-village-highlighter") public class AdapterVillageHighlighter implements IPeripheralAdapter { diff --git a/src/main/java/openblocks/integration/MagnetControlAdapter.java b/src/main/java/openblocks/integration/MagnetControlAdapter.java index 4563adfb..1a372e97 100644 --- a/src/main/java/openblocks/integration/MagnetControlAdapter.java +++ b/src/main/java/openblocks/integration/MagnetControlAdapter.java @@ -1,7 +1,9 @@ package openblocks.integration; +import com.google.common.base.Preconditions; +import dan200.computercraft.api.turtle.ITurtleAccess; +import dan200.computercraft.api.turtle.TurtleSide; import java.lang.ref.WeakReference; - import net.minecraft.util.ChunkCoordinates; import net.minecraft.util.MathHelper; import net.minecraft.util.Vec3; @@ -17,18 +19,17 @@ import openmods.fakeplayer.FakePlayerPool; import openmods.fakeplayer.FakePlayerPool.PlayerUserReturning; import openmods.fakeplayer.OpenModsFakePlayer; import openperipheral.api.adapter.IWorldProvider; -import openperipheral.api.adapter.method.*; +import openperipheral.api.adapter.method.Alias; +import openperipheral.api.adapter.method.Arg; +import openperipheral.api.adapter.method.IMultiReturn; +import openperipheral.api.adapter.method.ReturnType; +import openperipheral.api.adapter.method.ScriptCallable; import openperipheral.api.architecture.IArchitectureAccess; import openperipheral.api.architecture.IAttachable; import openperipheral.api.helpers.MultiReturn; import openperipheral.api.peripheral.ExposeInterface; import openperipheral.api.peripheral.PeripheralTypeId; -import com.google.common.base.Preconditions; - -import dan200.computercraft.api.turtle.ITurtleAccess; -import dan200.computercraft.api.turtle.TurtleSide; - @PeripheralTypeId("openblocks_magnet") @ExposeInterface({ ITickingTurtle.class, IAttachable.class }) public class MagnetControlAdapter implements ITickingTurtle, IWorldProvider, IAttachable { diff --git a/src/main/java/openblocks/integration/MagnetTurtleUpgrade.java b/src/main/java/openblocks/integration/MagnetTurtleUpgrade.java index 2a80900c..bfc7f570 100644 --- a/src/main/java/openblocks/integration/MagnetTurtleUpgrade.java +++ b/src/main/java/openblocks/integration/MagnetTurtleUpgrade.java @@ -1,5 +1,13 @@ package openblocks.integration; +import cpw.mods.fml.common.eventhandler.SubscribeEvent; +import dan200.computercraft.api.peripheral.IPeripheral; +import dan200.computercraft.api.turtle.ITurtleAccess; +import dan200.computercraft.api.turtle.ITurtleUpgrade; +import dan200.computercraft.api.turtle.TurtleCommandResult; +import dan200.computercraft.api.turtle.TurtleSide; +import dan200.computercraft.api.turtle.TurtleUpgradeType; +import dan200.computercraft.api.turtle.TurtleVerb; import net.minecraft.item.ItemStack; import net.minecraft.util.IIcon; import net.minecraftforge.client.event.TextureStitchEvent; @@ -7,9 +15,6 @@ import openblocks.common.item.MetasGeneric; import openmods.utils.TextureUtils; import openperipheral.api.ApiAccess; import openperipheral.api.architecture.cc.IComputerCraftObjectsFactory; -import cpw.mods.fml.common.eventhandler.SubscribeEvent; -import dan200.computercraft.api.peripheral.IPeripheral; -import dan200.computercraft.api.turtle.*; public class MagnetTurtleUpgrade implements ITurtleUpgrade { diff --git a/src/main/java/openblocks/integration/ModuleAdapters.java b/src/main/java/openblocks/integration/ModuleAdapters.java index 9fa95959..95e90395 100644 --- a/src/main/java/openblocks/integration/ModuleAdapters.java +++ b/src/main/java/openblocks/integration/ModuleAdapters.java @@ -1,6 +1,7 @@ package openblocks.integration; import static openmods.integration.Conditions.modLoaded; + import openmods.Mods; import openmods.integration.IntegrationModule; import openperipheral.api.ApiHolder; diff --git a/src/main/java/openblocks/integration/ModuleTurtles.java b/src/main/java/openblocks/integration/ModuleTurtles.java index aa9f3dc7..3c3f5d0d 100644 --- a/src/main/java/openblocks/integration/ModuleTurtles.java +++ b/src/main/java/openblocks/integration/ModuleTurtles.java @@ -3,12 +3,13 @@ package openblocks.integration; import static openmods.conditions.Conditions.all; import static openmods.integration.Conditions.classExists; import static openmods.integration.Conditions.modLoaded; -import net.minecraftforge.common.MinecraftForge; -import openmods.Mods; -import openmods.integration.IntegrationModule; + import cpw.mods.fml.common.FMLCommonHandler; import cpw.mods.fml.relauncher.Side; import dan200.computercraft.api.ComputerCraftAPI; +import net.minecraftforge.common.MinecraftForge; +import openmods.Mods; +import openmods.integration.IntegrationModule; public class ModuleTurtles extends IntegrationModule { diff --git a/src/main/java/openblocks/integration/TurtleUtils.java b/src/main/java/openblocks/integration/TurtleUtils.java index 2784017d..f3fbc5db 100644 --- a/src/main/java/openblocks/integration/TurtleUtils.java +++ b/src/main/java/openblocks/integration/TurtleUtils.java @@ -1,11 +1,10 @@ package openblocks.integration; +import cpw.mods.fml.common.registry.GameRegistry; import java.util.List; - import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import openmods.Mods; -import cpw.mods.fml.common.registry.GameRegistry; public class TurtleUtils { diff --git a/src/main/java/openblocks/rubbish/BrickManager.java b/src/main/java/openblocks/rubbish/BrickManager.java index 50acd370..56143264 100644 --- a/src/main/java/openblocks/rubbish/BrickManager.java +++ b/src/main/java/openblocks/rubbish/BrickManager.java @@ -1,5 +1,6 @@ package openblocks.rubbish; +import cpw.mods.fml.common.eventhandler.SubscribeEvent; import net.minecraft.entity.Entity; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; @@ -14,7 +15,6 @@ import openblocks.OpenBlocks; import openblocks.events.PlayerActionEvent; import openblocks.events.PlayerActionEvent.Type; import openmods.utils.ItemUtils; -import cpw.mods.fml.common.eventhandler.SubscribeEvent; public class BrickManager { diff --git a/src/main/java/openblocks/rubbish/CommandFlimFlam.java b/src/main/java/openblocks/rubbish/CommandFlimFlam.java index e54a3545..39eb6faf 100644 --- a/src/main/java/openblocks/rubbish/CommandFlimFlam.java +++ b/src/main/java/openblocks/rubbish/CommandFlimFlam.java @@ -1,9 +1,13 @@ package openblocks.rubbish; -import static openmods.utils.CommandUtils.*; +import static openmods.utils.CommandUtils.error; +import static openmods.utils.CommandUtils.filterPrefixes; +import static openmods.utils.CommandUtils.fiterPlayerNames; +import static openmods.utils.CommandUtils.getPlayer; +import static openmods.utils.CommandUtils.respond; +import com.google.common.collect.Lists; import java.util.List; - import net.minecraft.command.ICommand; import net.minecraft.command.ICommandSender; import net.minecraft.entity.player.EntityPlayerMP; @@ -11,8 +15,6 @@ import openblocks.api.IFlimFlamDescription; import openblocks.enchantments.flimflams.FlimFlamRegistry; import openmods.utils.CollectionUtils; -import com.google.common.collect.Lists; - public class CommandFlimFlam implements ICommand { private static final String NAME = "flimflam"; diff --git a/src/main/java/openblocks/rubbish/CommandLuck.java b/src/main/java/openblocks/rubbish/CommandLuck.java index 6447c338..eb275e9f 100644 --- a/src/main/java/openblocks/rubbish/CommandLuck.java +++ b/src/main/java/openblocks/rubbish/CommandLuck.java @@ -1,16 +1,17 @@ package openblocks.rubbish; -import static openmods.utils.CommandUtils.*; +import static openmods.utils.CommandUtils.error; +import static openmods.utils.CommandUtils.fiterPlayerNames; +import static openmods.utils.CommandUtils.getPlayer; +import static openmods.utils.CommandUtils.respond; +import com.google.common.collect.Lists; import java.util.List; - import net.minecraft.command.ICommand; import net.minecraft.command.ICommandSender; import net.minecraft.entity.player.EntityPlayer; import openblocks.enchantments.FlimFlamEnchantmentsHandler; -import com.google.common.collect.Lists; - public class CommandLuck implements ICommand { private static final String NAME = "luck"; diff --git a/src/main/java/openblocks/rubbish/LoreGenerator.java b/src/main/java/openblocks/rubbish/LoreGenerator.java index 1ddb1c1c..0e8133d5 100644 --- a/src/main/java/openblocks/rubbish/LoreGenerator.java +++ b/src/main/java/openblocks/rubbish/LoreGenerator.java @@ -1,15 +1,19 @@ package openblocks.rubbish; -import static openmods.words.Words.*; - -import java.util.Map; -import java.util.Random; - -import openmods.words.IGenerator; - -import org.apache.commons.lang3.StringUtils; +import static openmods.words.Words.alt; +import static openmods.words.Words.capitalize; +import static openmods.words.Words.capitalizeFully; +import static openmods.words.Words.opt; +import static openmods.words.Words.range; +import static openmods.words.Words.seq; +import static openmods.words.Words.sub; +import static openmods.words.Words.word; import com.google.common.collect.Maps; +import java.util.Map; +import java.util.Random; +import openmods.words.IGenerator; +import org.apache.commons.lang3.StringUtils; public class LoreGenerator { diff --git a/src/main/java/openblocks/shapes/CoordShape.java b/src/main/java/openblocks/shapes/CoordShape.java index c8ac682a..a15707f0 100644 --- a/src/main/java/openblocks/shapes/CoordShape.java +++ b/src/main/java/openblocks/shapes/CoordShape.java @@ -1,16 +1,13 @@ package openblocks.shapes; -import java.nio.ByteBuffer; -import java.util.List; - -import openmods.renderer.shaders.BufferHelper; -import openmods.utils.Coord; - -import org.lwjgl.BufferUtils; -import org.lwjgl.opengl.GL15; - import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import java.nio.ByteBuffer; +import java.util.List; +import openmods.renderer.shaders.BufferHelper; +import openmods.utils.Coord; +import org.lwjgl.BufferUtils; +import org.lwjgl.opengl.GL15; public class CoordShape { diff --git a/src/main/java/openblocks/shapes/GuideShape.java b/src/main/java/openblocks/shapes/GuideShape.java index c0908983..191629d2 100644 --- a/src/main/java/openblocks/shapes/GuideShape.java +++ b/src/main/java/openblocks/shapes/GuideShape.java @@ -1,7 +1,13 @@ package openblocks.shapes; import net.minecraft.util.StatCollector; -import openmods.shapes.*; +import openmods.shapes.IShapeGenerator; +import openmods.shapes.ShapeAxesGenerator; +import openmods.shapes.ShapeCuboidGenerator; +import openmods.shapes.ShapeCylinderGenerator; +import openmods.shapes.ShapeEquilateral2dGenerator; +import openmods.shapes.ShapePlanesGenerator; +import openmods.shapes.ShapeSphereGenerator; import openmods.utils.render.GeometryUtils.Octant; public enum GuideShape { diff --git a/src/main/java/openblocks/trophy/ItemDropBehavior.java b/src/main/java/openblocks/trophy/ItemDropBehavior.java index 1ef99716..f9131461 100644 --- a/src/main/java/openblocks/trophy/ItemDropBehavior.java +++ b/src/main/java/openblocks/trophy/ItemDropBehavior.java @@ -1,11 +1,10 @@ package openblocks.trophy; +import com.google.common.base.Strings; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import openblocks.common.tileentity.TileEntityTrophy; -import com.google.common.base.Strings; - public class ItemDropBehavior implements ITrophyBehavior { private final int minTicks; From f6bf07f6039b2161793d14b3c07093e3ea5c1a81 Mon Sep 17 00:00:00 2001 From: Bartek Bok Date: Sat, 11 Jun 2016 19:47:25 +0200 Subject: [PATCH 23/54] Tweak autoformatter --- .../java/openblocks/api/package-info.java | 1 - .../client/gui/GuiDrawingTable.java | 4 +-- .../client/model/ModelCartographer.java | 3 +- .../client/model/ModelPaintMixer.java | 6 ++-- .../openblocks/client/model/ModelPiggy.java | 3 +- .../client/model/ModelXPShower.java | 6 ++-- .../entity/EntityGoldenEyeRenderer.java | 3 +- .../block/BlockAutoEnchantmentTable.java | 12 +++---- .../common/block/BlockRopeLadder.java | 3 +- .../common/entity/EntityAssistant.java | 3 +- .../common/entity/EntityCartographer.java | 3 +- .../common/entity/EntityMagnet.java | 19 ++++++----- .../common/entity/EntitySmoothMove.java | 6 ++-- .../common/entity/EntityXPOrbNoFly.java | 3 +- .../common/entity/ai/EntityAIBreakBlock.java | 3 +- .../common/item/ItemCraneBackpack.java | 6 ++-- .../openblocks/common/item/MetasGeneric.java | 33 +++++++------------ .../common/recipe/CrayonGlassesRecipe.java | 4 +-- .../common/recipe/CrayonMixingRecipe.java | 8 +++-- .../common/recipe/MapResizeRecipe.java | 3 +- .../tileentity/TileEntityBlockPlacer.java | 6 ++-- .../common/tileentity/TileEntityCannon.java | 13 +++----- .../tileentity/TileEntitySprinkler.java | 2 +- .../enchantments/flimflams/SoundFlimFlam.java | 3 +- .../openblocks/integration/package-info.java | 1 - 25 files changed, 63 insertions(+), 94 deletions(-) diff --git a/src/main/java/openblocks/api/package-info.java b/src/main/java/openblocks/api/package-info.java index 414e9b86..8a159963 100644 --- a/src/main/java/openblocks/api/package-info.java +++ b/src/main/java/openblocks/api/package-info.java @@ -2,4 +2,3 @@ package openblocks.api; import cpw.mods.fml.common.API; - diff --git a/src/main/java/openblocks/client/gui/GuiDrawingTable.java b/src/main/java/openblocks/client/gui/GuiDrawingTable.java index c5c56e08..a3dd9569 100644 --- a/src/main/java/openblocks/client/gui/GuiDrawingTable.java +++ b/src/main/java/openblocks/client/gui/GuiDrawingTable.java @@ -53,8 +53,8 @@ public class GuiDrawingTable extends BaseGuiContainer { }); root.addComponent(buttonDraw); - (iconDisplay = new GuiComponentSprite(80, 34, Stencil.values()[0].getBlockIcon(), TextureMap.locationBlocksTexture) - .setColor(0f, 0f, 0f)) + (iconDisplay = new GuiComponentSprite(80, 34, Stencil.values()[0].getBlockIcon(), TextureMap.locationBlocksTexture)) + .setColor(0f, 0f, 0f) .setOverlayMode(true) .setEnabled(inventorySlots.getSlot(0).getStack() != null); root.addComponent(iconDisplay); diff --git a/src/main/java/openblocks/client/model/ModelCartographer.java b/src/main/java/openblocks/client/model/ModelCartographer.java index ca52d2f9..9073dbd0 100644 --- a/src/main/java/openblocks/client/model/ModelCartographer.java +++ b/src/main/java/openblocks/client/model/ModelCartographer.java @@ -34,8 +34,7 @@ public class ModelCartographer extends ModelBase { icon.getInterpolatedU(15), icon.getInterpolatedV(2), icon.getInterpolatedU(2), icon.getInterpolatedV(15), 13, 13, - 0.5f - ); + 0.5f); } }; diff --git a/src/main/java/openblocks/client/model/ModelPaintMixer.java b/src/main/java/openblocks/client/model/ModelPaintMixer.java index 4f57cecc..d492328f 100644 --- a/src/main/java/openblocks/client/model/ModelPaintMixer.java +++ b/src/main/java/openblocks/client/model/ModelPaintMixer.java @@ -4,8 +4,7 @@ import net.minecraft.client.model.ModelBase; import net.minecraft.client.model.ModelRenderer; import net.minecraft.tileentity.TileEntity; -public class ModelPaintMixer extends ModelBase -{ +public class ModelPaintMixer extends ModelBase { // fields ModelRenderer controls; ModelRenderer right; @@ -15,8 +14,7 @@ public class ModelPaintMixer extends ModelBase ModelRenderer bottom; ModelRenderer bottom2; - public ModelPaintMixer() - { + public ModelPaintMixer() { textureWidth = 64; textureHeight = 64; diff --git a/src/main/java/openblocks/client/model/ModelPiggy.java b/src/main/java/openblocks/client/model/ModelPiggy.java index a6ce10aa..71a0066e 100644 --- a/src/main/java/openblocks/client/model/ModelPiggy.java +++ b/src/main/java/openblocks/client/model/ModelPiggy.java @@ -17,8 +17,7 @@ public class ModelPiggy extends ModelBase { ModelRenderer leg3; ModelRenderer tail; - public ModelPiggy() - { + public ModelPiggy() { textureWidth = 64; textureHeight = 64; diff --git a/src/main/java/openblocks/client/model/ModelXPShower.java b/src/main/java/openblocks/client/model/ModelXPShower.java index 9adf141c..51541fbf 100644 --- a/src/main/java/openblocks/client/model/ModelXPShower.java +++ b/src/main/java/openblocks/client/model/ModelXPShower.java @@ -4,13 +4,11 @@ import net.minecraft.client.model.ModelBase; import net.minecraft.client.model.ModelRenderer; import net.minecraft.tileentity.TileEntity; -public class ModelXPShower extends ModelBase -{ +public class ModelXPShower extends ModelBase { ModelRenderer end; ModelRenderer main; - public ModelXPShower() - { + public ModelXPShower() { textureWidth = 32; textureHeight = 32; diff --git a/src/main/java/openblocks/client/renderer/entity/EntityGoldenEyeRenderer.java b/src/main/java/openblocks/client/renderer/entity/EntityGoldenEyeRenderer.java index d3f6220e..779c7abe 100644 --- a/src/main/java/openblocks/client/renderer/entity/EntityGoldenEyeRenderer.java +++ b/src/main/java/openblocks/client/renderer/entity/EntityGoldenEyeRenderer.java @@ -34,8 +34,7 @@ public class EntityGoldenEyeRenderer extends Render { icon.getInterpolatedU(15), icon.getInterpolatedV(2), icon.getInterpolatedU(2), icon.getInterpolatedV(15), 13, 13, - 1.0f / 16.0f - ); + 1.0f / 16.0f); GL11.glPopMatrix(); } diff --git a/src/main/java/openblocks/common/block/BlockAutoEnchantmentTable.java b/src/main/java/openblocks/common/block/BlockAutoEnchantmentTable.java index 060466bd..19936242 100644 --- a/src/main/java/openblocks/common/block/BlockAutoEnchantmentTable.java +++ b/src/main/java/openblocks/common/block/BlockAutoEnchantmentTable.java @@ -39,15 +39,15 @@ public class BlockAutoEnchantmentTable extends OpenBlock { if (rand.nextInt(16) == 0) { for (int j1 = y; j1 <= y + 1; ++j1) { if (world.getBlock(l, j1, i1) == Blocks.bookshelf) { - if (!world.isAirBlock((l - x) / 2 + x, j1, (i1 - z) - / 2 + z)) { + if (!world.isAirBlock((l - x) / 2 + x, j1, (i1 - z) / 2 + z)) { break; } - world.spawnParticle("enchantmenttable", x + 0.5D, y + 2.0D, z + 0.5D, l - - x + rand.nextFloat() - 0.5D, j1 - y - - rand.nextFloat() - 1.0F, i1 - z - + rand.nextFloat() - 0.5D); + world.spawnParticle("enchantmenttable", + x + 0.5D, y + 2.0D, z + 0.5D, + l - x + rand.nextFloat() - 0.5D, + j1 - y - rand.nextFloat() - 1.0F, + i1 - z + rand.nextFloat() - 0.5D); } } } diff --git a/src/main/java/openblocks/common/block/BlockRopeLadder.java b/src/main/java/openblocks/common/block/BlockRopeLadder.java index 06947f6e..326a05a8 100644 --- a/src/main/java/openblocks/common/block/BlockRopeLadder.java +++ b/src/main/java/openblocks/common/block/BlockRopeLadder.java @@ -135,8 +135,7 @@ public class BlockRopeLadder extends OpenBlock { final BlockManipulator manipulator = new BlockManipulator(world, player, x, y, z); if (world.isAirBlock(x, y, z) && manipulator.place(this, blockMeta)) { if (!Config.infiniteLadder) stack.stackSize--; - } - else return; + } else return; } } diff --git a/src/main/java/openblocks/common/entity/EntityAssistant.java b/src/main/java/openblocks/common/entity/EntityAssistant.java index 1a9e8ba2..747f0c2b 100644 --- a/src/main/java/openblocks/common/entity/EntityAssistant.java +++ b/src/main/java/openblocks/common/entity/EntityAssistant.java @@ -60,8 +60,7 @@ public abstract class EntityAssistant extends EntitySmoothMove implements IEntit if (owner != null) smoother.setTarget( owner.posX + ownerOffsetX, owner.posY + owner.getEyeHeight() + ownerOffsetY, - owner.posZ + ownerOffsetZ - ); + owner.posZ + ownerOffsetZ); } diff --git a/src/main/java/openblocks/common/entity/EntityCartographer.java b/src/main/java/openblocks/common/entity/EntityCartographer.java index 18a143af..e3884316 100644 --- a/src/main/java/openblocks/common/entity/EntityCartographer.java +++ b/src/main/java/openblocks/common/entity/EntityCartographer.java @@ -97,8 +97,7 @@ public class EntityCartographer extends EntityAssistant implements ISelectAware, MapDataBuilder builder = new MapDataBuilder(mapId); builder.loadMap(world); - builder.resizeIfNeeded(bits); // better to lost progress than to - // break world + builder.resizeIfNeeded(bits); // better to lost progress than to break world size = builder.size(); jobs = builder.createJobs(bits); diff --git a/src/main/java/openblocks/common/entity/EntityMagnet.java b/src/main/java/openblocks/common/entity/EntityMagnet.java index e0f53cdf..223b2926 100644 --- a/src/main/java/openblocks/common/entity/EntityMagnet.java +++ b/src/main/java/openblocks/common/entity/EntityMagnet.java @@ -64,11 +64,8 @@ public class EntityMagnet extends EntitySmoothMove implements IEntityAdditionalS EntityPlayer player = owner.get(); if (player == null) return null; - double posX = player.posX + CraneRegistry.ARM_RADIUS - * MathHelper.cos((player.rotationYaw + 90) * (float)Math.PI / 180); - double posZ = player.posZ - + CraneRegistry.ARM_RADIUS - * MathHelper.sin((player.rotationYaw + 90) * (float)Math.PI / 180); + double posX = player.posX + CraneRegistry.ARM_RADIUS * MathHelper.cos((player.rotationYaw + 90) * (float)Math.PI / 180); + double posZ = player.posZ + CraneRegistry.ARM_RADIUS * MathHelper.sin((player.rotationYaw + 90) * (float)Math.PI / 180); double posY = player.posY + player.height - CraneRegistry.instance.getCraneMagnetDistance(player); @@ -196,9 +193,12 @@ public class EntityMagnet extends EntitySmoothMove implements IEntityAdditionalS isAboveTarget = !detectEntityTargets().isEmpty(); - if (isMagic && worldObj.isRemote && RANDOM.nextDouble() < 0.2) worldObj.spawnParticle("portal", posX - + RANDOM.nextDouble() * 0.1, posY - RANDOM.nextDouble() * 0.2, posZ - + RANDOM.nextDouble() * 0.1, RANDOM.nextGaussian(), -Math.abs(RANDOM.nextGaussian()), RANDOM.nextGaussian()); + if (isMagic && worldObj.isRemote && RANDOM.nextDouble() < 0.2) worldObj.spawnParticle("portal", + posX + RANDOM.nextDouble() * 0.1, + posY - RANDOM.nextDouble() * 0.2, posZ + RANDOM.nextDouble() * 0.1, + RANDOM.nextGaussian(), + -Math.abs(RANDOM.nextGaussian()), + RANDOM.nextGaussian()); } protected void fixSize() { @@ -248,7 +248,8 @@ public class EntityMagnet extends EntitySmoothMove implements IEntityAdditionalS final Entity tmp = riddenByEntity; if (tmp instanceof IMagnetAware - && !((IMagnetAware)tmp).canRelease()) return false; + && !((IMagnetAware)tmp).canRelease()) + return false; // default unmount position is above entity and it // looks strange, so we hack around that double tmpPosY = tmp.posY; diff --git a/src/main/java/openblocks/common/entity/EntitySmoothMove.java b/src/main/java/openblocks/common/entity/EntitySmoothMove.java index 5cdabf05..c48f73b7 100644 --- a/src/main/java/openblocks/common/entity/EntitySmoothMove.java +++ b/src/main/java/openblocks/common/entity/EntitySmoothMove.java @@ -44,8 +44,7 @@ public abstract class EntitySmoothMove extends Entity { if (lenSq > panicLengthSq || lenSq < minimalLengthSq) { setPosition(targetX, targetY, targetZ); motionX = motionY = motionZ = 0; - } - else { + } else { if (lenSq > cutoff * cutoff) { double scale = cutoff / Math.sqrt(lenSq); dx *= scale; @@ -66,8 +65,7 @@ public abstract class EntitySmoothMove extends Entity { } protected MoveSmoother createSmoother(boolean isRemote) { - return isRemote? new MoveSmoother(0.25, 1.0, 8.0, 0.01) : - new MoveSmoother(0.5, 5.0, 128.0, 0.01); + return isRemote? new MoveSmoother(0.25, 1.0, 8.0, 0.01) : new MoveSmoother(0.5, 5.0, 128.0, 0.01); } @Override diff --git a/src/main/java/openblocks/common/entity/EntityXPOrbNoFly.java b/src/main/java/openblocks/common/entity/EntityXPOrbNoFly.java index 4b8f1167..77529135 100644 --- a/src/main/java/openblocks/common/entity/EntityXPOrbNoFly.java +++ b/src/main/java/openblocks/common/entity/EntityXPOrbNoFly.java @@ -23,8 +23,7 @@ public class EntityXPOrbNoFly extends EntityXPOrb { } @Override - public void onUpdate() - { + public void onUpdate() { super.onEntityUpdate(); if (this.field_70532_c > 0) { diff --git a/src/main/java/openblocks/common/entity/ai/EntityAIBreakBlock.java b/src/main/java/openblocks/common/entity/ai/EntityAIBreakBlock.java index 3e2b15c8..929b0b75 100644 --- a/src/main/java/openblocks/common/entity/ai/EntityAIBreakBlock.java +++ b/src/main/java/openblocks/common/entity/ai/EntityAIBreakBlock.java @@ -46,8 +46,7 @@ public class EntityAIBreakBlock extends EntityAIBase { blockCoord = new Coord( (int)(x + entity.posX), (int)(y + entity.posY), - (int)(z + entity.posZ) - ); + (int)(z + entity.posZ)); if (canHarvestBlock(blockCoord)) { return true; } blockCoord = null; } diff --git a/src/main/java/openblocks/common/item/ItemCraneBackpack.java b/src/main/java/openblocks/common/item/ItemCraneBackpack.java index f96cde83..9a36b72d 100644 --- a/src/main/java/openblocks/common/item/ItemCraneBackpack.java +++ b/src/main/java/openblocks/common/item/ItemCraneBackpack.java @@ -46,12 +46,10 @@ public class ItemCraneBackpack extends ItemArmor { private static boolean isPointInBlock(World world, EntityPlayer player, double radius) { double posX = player.posX - + radius - * MathHelper.cos((player.rotationYaw + 90) * (float)Math.PI / 180); + + radius * MathHelper.cos((player.rotationYaw + 90) * (float)Math.PI / 180); double posY = player.posY + player.getEyeHeight() + 0.2; double posZ = player.posZ - + radius - * MathHelper.sin((player.rotationYaw + 90) * (float)Math.PI / 180); + + radius * MathHelper.sin((player.rotationYaw + 90) * (float)Math.PI / 180); AxisAlignedBB aabb = AxisAlignedBB.getBoundingBox(posX - 0.1, posY - 0.1, posZ - 0.1, posX + 0.1, posY + 0.1, posZ + 0.1); return !world.getCollidingBoundingBoxes(player, aabb).isEmpty(); diff --git a/src/main/java/openblocks/common/item/MetasGeneric.java b/src/main/java/openblocks/common/item/MetasGeneric.java index 9c79d3b0..83ec59d7 100644 --- a/src/main/java/openblocks/common/item/MetasGeneric.java +++ b/src/main/java/openblocks/common/item/MetasGeneric.java @@ -18,8 +18,7 @@ public enum MetasGeneric { ItemStack result = newItemStack(); return new MetaGeneric("gliderwing", new ShapedOreRecipe(result, " sl", "sll", "lll", 's', "stickWood", 'l', Items.leather), - new ShapedOreRecipe(result, "ls ", "lls", "lll", 's', "stickWood", 'l', Items.leather) - ); + new ShapedOreRecipe(result, "ls ", "lls", "lll", 's', "stickWood", 'l', Items.leather)); } }, beam { @@ -28,8 +27,7 @@ public enum MetasGeneric { ItemStack result = newItemStack(2); return new MetaGeneric("beam", new ShapedOreRecipe(result, "iii", "b y", "iii", 'i', "ingotIron", 'b', "dyeBlack", 'y', "dyeYellow"), - new ShapedOreRecipe(result, "iii", "y b", "iii", 'i', "ingotIron", 'b', "dyeBlack", 'y', "dyeYellow") - ); + new ShapedOreRecipe(result, "iii", "y b", "iii", 'i', "ingotIron", 'b', "dyeBlack", 'y', "dyeYellow")); } }, craneEngine { @@ -37,8 +35,7 @@ public enum MetasGeneric { public IMetaItem createMetaItem() { ItemStack result = newItemStack(); return new MetaGeneric("crane_engine", - new ShapedOreRecipe(result, "iii", "isi", "iri", 'i', "ingotIron", 's', "stickWood", 'r', "dustRedstone") - ); + new ShapedOreRecipe(result, "iii", "isi", "iri", 'i', "ingotIron", 's', "stickWood", 'r', "dustRedstone")); } }, craneMagnet { @@ -47,8 +44,7 @@ public enum MetasGeneric { ItemStack result = newItemStack(); return new MetaGeneric("crane_magnet", new ShapedOreRecipe(result, "biy", "iri", 'i', "ingotIron", 'r', "dustRedstone", 'b', "dyeBlack", 'y', "dyeYellow"), - new ShapedOreRecipe(result, "yib", "iri", 'i', "ingotIron", 'r', "dustRedstone", 'b', "dyeBlack", 'y', "dyeYellow") - ); + new ShapedOreRecipe(result, "yib", "iri", 'i', "ingotIron", 'r', "dustRedstone", 'b', "dyeBlack", 'y', "dyeYellow")); } }, miracleMagnet { @@ -58,8 +54,7 @@ public enum MetasGeneric { ItemStack magnet = craneMagnet.newItemStack(); return new MetaMiracleMagnet("miracle_magnet", new ShapedOreRecipe(result, "rer", "eme", "rer", 'r', "dustRedstone", 'e', Items.ender_pearl, 'm', magnet), - new ShapedOreRecipe(result, "ere", "rmr", "ere", 'r', "dustRedstone", 'e', Items.ender_pearl, 'm', magnet) - ); + new ShapedOreRecipe(result, "ere", "rmr", "ere", 'r', "dustRedstone", 'e', Items.ender_pearl, 'm', magnet)); } @Override @@ -72,8 +67,7 @@ public enum MetasGeneric { public IMetaItem createMetaItem() { ItemStack result = newItemStack(2); return new MetaGeneric("line", - new ShapedOreRecipe(result, "sss", "bbb", "sss", 's', Items.string, 'b', "slimeball") - ); + new ShapedOreRecipe(result, "sss", "bbb", "sss", 's', Items.string, 'b', "slimeball")); } }, mapController { @@ -81,8 +75,7 @@ public enum MetasGeneric { public IMetaItem createMetaItem() { ItemStack result = newItemStack(1); return new MetaGeneric("map_controller", - new ShapedOreRecipe(result, " r ", "rgr", " r ", 'r', "dustRedstone", 'g', "ingotGold") - ); + new ShapedOreRecipe(result, " r ", "rgr", " r ", 'r', "dustRedstone", 'g', "ingotGold")); } }, mapMemory { @@ -90,8 +83,7 @@ public enum MetasGeneric { public IMetaItem createMetaItem() { ItemStack result = newItemStack(1); return new MetaGeneric("map_memory", - new ShapedOreRecipe(result, "rg", "rg", "rg", 'g', "nuggetGold", 'r', "dustRedstone") - ); + new ShapedOreRecipe(result, "rg", "rg", "rg", 'g', "nuggetGold", 'r', "dustRedstone")); } }, /** @@ -115,8 +107,7 @@ public enum MetasGeneric { public IMetaItem createMetaItem() { ItemStack result = newItemStack(); return new MetaGeneric("assistant_base", - new ShapedOreRecipe(result, "iei", "iri", 'i', "ingotIron", 'e', Items.ender_pearl, 'r', "dustRedstone") - ); + new ShapedOreRecipe(result, "iei", "iri", 'i', "ingotIron", 'e', Items.ender_pearl, 'r', "dustRedstone")); } }, unpreparedStencil { @@ -124,8 +115,7 @@ public enum MetasGeneric { public IMetaItem createMetaItem() { ItemStack result = newItemStack(); return new MetaGeneric("unprepared_stencil", - new ShapedOreRecipe(result, " p ", "pip", " p ", 'p', Items.paper, 'i', "ingotIron") - ); + new ShapedOreRecipe(result, " p ", "pip", " p ", 'p', Items.paper, 'i', "ingotIron")); } }, sketchingPencil { @@ -133,8 +123,7 @@ public enum MetasGeneric { public IMetaItem createMetaItem() { ItemStack result = newItemStack(); return new MetaGeneric("sketching_pencil", - new ShapedOreRecipe(result, "c ", " s ", " s", 'c', new ItemStack(Items.coal, 1, OreDictionary.WILDCARD_VALUE), 's', "stickWood") - ); + new ShapedOreRecipe(result, "c ", " s ", " s", 'c', new ItemStack(Items.coal, 1, OreDictionary.WILDCARD_VALUE), 's', "stickWood")); } }; diff --git a/src/main/java/openblocks/common/recipe/CrayonGlassesRecipe.java b/src/main/java/openblocks/common/recipe/CrayonGlassesRecipe.java index 5e97dcb0..264a4506 100644 --- a/src/main/java/openblocks/common/recipe/CrayonGlassesRecipe.java +++ b/src/main/java/openblocks/common/recipe/CrayonGlassesRecipe.java @@ -37,9 +37,7 @@ public class CrayonGlassesRecipe extends ShapelessRecipes { ItemStack stack = inv.getStackInSlot(i); if (stack != null) { if (stack.getItem() instanceof ItemImaginary) { - if (gotCrayon - || ItemImaginary.getUses(stack) < ItemImaginary.CRAFTING_COST) return false; - + if (gotCrayon || ItemImaginary.getUses(stack) < ItemImaginary.CRAFTING_COST) return false; gotCrayon = true; } else if (stack.getItem() == Items.paper) { if (gotPaper) return false; diff --git a/src/main/java/openblocks/common/recipe/CrayonMixingRecipe.java b/src/main/java/openblocks/common/recipe/CrayonMixingRecipe.java index f4f07331..0ae096e6 100644 --- a/src/main/java/openblocks/common/recipe/CrayonMixingRecipe.java +++ b/src/main/java/openblocks/common/recipe/CrayonMixingRecipe.java @@ -16,8 +16,9 @@ public class CrayonMixingRecipe implements IRecipe { for (int i = 0; i < inv.getSizeInventory(); i++) { ItemStack stack = inv.getStackInSlot(i); if (stack == null) continue; - if ((!(stack.getItem() instanceof ItemImaginary)) - || !ItemImaginary.isCrayon(stack)) return false; + if (!(stack.getItem() instanceof ItemImaginary) + || !ItemImaginary.isCrayon(stack)) + return false; if (ItemImaginary.getUses(stack) < ItemImaginary.CRAFTING_COST) continue; count++; } @@ -31,7 +32,8 @@ public class CrayonMixingRecipe implements IRecipe { for (int i = 0; i < inv.getSizeInventory(); i++) { ItemStack stack = inv.getStackInSlot(i); if (stack == null - || (ItemImaginary.getUses(stack) < ItemImaginary.CRAFTING_COST)) continue; + || (ItemImaginary.getUses(stack) < ItemImaginary.CRAFTING_COST)) + continue; count++; int color = ItemUtils.getInt(stack, ItemImaginary.TAG_COLOR); diff --git a/src/main/java/openblocks/common/recipe/MapResizeRecipe.java b/src/main/java/openblocks/common/recipe/MapResizeRecipe.java index 22a8ed4f..f1bb51c0 100644 --- a/src/main/java/openblocks/common/recipe/MapResizeRecipe.java +++ b/src/main/java/openblocks/common/recipe/MapResizeRecipe.java @@ -23,7 +23,8 @@ public class MapResizeRecipe extends ShapedOreRecipe { if (inventory.getStackInRowAndColumn(0, 0) != null || inventory.getStackInRowAndColumn(0, 2) != null || inventory.getStackInRowAndColumn(2, 0) != null || - inventory.getStackInRowAndColumn(2, 2) != null) return false; + inventory.getStackInRowAndColumn(2, 2) != null) + return false; for (int i = 0; i < 3; i++) { ItemStack left = inventory.getStackInRowAndColumn(0, i); diff --git a/src/main/java/openblocks/common/tileentity/TileEntityBlockPlacer.java b/src/main/java/openblocks/common/tileentity/TileEntityBlockPlacer.java index a4e35eed..c267ce5a 100644 --- a/src/main/java/openblocks/common/tileentity/TileEntityBlockPlacer.java +++ b/src/main/java/openblocks/common/tileentity/TileEntityBlockPlacer.java @@ -76,7 +76,8 @@ public class TileEntityBlockPlacer extends OpenTileEntity implements INeighbourA if (worldObj.blockExists(targetX, targetY, targetZ)) { final Block block = worldObj.getBlock(targetX, targetY, targetZ); if (!block.isAir(worldObj, targetX, targetY, targetZ) - && !block.isReplaceable(worldObj, targetX, targetY, targetZ)) return; + && !block.isReplaceable(worldObj, targetX, targetY, targetZ)) + return; } // this logic is tuned for vanilla blocks (like pistons), which places blocks with front facing player @@ -91,8 +92,7 @@ public class TileEntityBlockPlacer extends OpenTileEntity implements INeighbourA Vec3.createVectorHelper(playerX, playerY, playerZ), Vec3.createVectorHelper(targetX, targetY, targetZ), Vec3.createVectorHelper(targetX + 0.5, targetY + 0.5, targetZ + 0.5), - direction.getOpposite() - )); + direction.getOpposite())); inventory.setInventorySlotContents(slotId, result); } diff --git a/src/main/java/openblocks/common/tileentity/TileEntityCannon.java b/src/main/java/openblocks/common/tileentity/TileEntityCannon.java index db004b06..8bbb2fe4 100644 --- a/src/main/java/openblocks/common/tileentity/TileEntityCannon.java +++ b/src/main/java/openblocks/common/tileentity/TileEntityCannon.java @@ -204,10 +204,9 @@ public class TileEntityCannon extends SyncedTileEntity implements IPointable, IS final double distVertical = Math.max((target.yCoord - projectileOrigin.yCoord) * KNOB_LOB_VERTICAL_MUL, 0); // Calculate the arc of the trajectory - final float lobScale = (float) - Math.min(KNOB_LOB_MAXIMUM_VALUE, - Math.max(KNOB_LOB_MINIMUM_VALUE, - KNOB_LOB_BONUS + distHorizontal + distVertical)); + final float lobScale = (float)Math.min(KNOB_LOB_MAXIMUM_VALUE, + Math.max(KNOB_LOB_MINIMUM_VALUE, + KNOB_LOB_BONUS + distHorizontal + distVertical)); // Calculate the velocity of the projectile final Vec3 velocity = TileEntityCannonLogic.calculateTrajectory(projectileOrigin, target, lobScale); @@ -322,8 +321,7 @@ public class TileEntityCannon extends SyncedTileEntity implements IPointable, IS final Vec3 scaledAcceleration = Vec3.createVectorHelper( PHYS_GRAVITY_VECTOR_SQUARE_PARTIAL.xCoord * accelerationMultiplier, PHYS_GRAVITY_VECTOR_SQUARE_PARTIAL.yCoord * accelerationMultiplier, - PHYS_GRAVITY_VECTOR_SQUARE_PARTIAL.zCoord * accelerationMultiplier - ); + PHYS_GRAVITY_VECTOR_SQUARE_PARTIAL.zCoord * accelerationMultiplier); // -1 /n * Phys = -Phys / n final double velocityMultiplier = -PHYS_STEPS_PER_SECOND / n; @@ -331,8 +329,7 @@ public class TileEntityCannon extends SyncedTileEntity implements IPointable, IS final Vec3 velocity = Vec3.createVectorHelper( (start.xCoord + scaledAcceleration.xCoord - target.xCoord) * velocityMultiplier, (start.yCoord + scaledAcceleration.yCoord - target.yCoord) * velocityMultiplier, - (start.zCoord + scaledAcceleration.zCoord - target.zCoord) * velocityMultiplier - ); + (start.zCoord + scaledAcceleration.zCoord - target.zCoord) * velocityMultiplier); return velocity; } diff --git a/src/main/java/openblocks/common/tileentity/TileEntitySprinkler.java b/src/main/java/openblocks/common/tileentity/TileEntitySprinkler.java index 2bf5551a..7f10b87d 100644 --- a/src/main/java/openblocks/common/tileentity/TileEntitySprinkler.java +++ b/src/main/java/openblocks/common/tileentity/TileEntitySprinkler.java @@ -93,7 +93,7 @@ public class TileEntitySprinkler extends SyncedTileEntity implements ISurfaceAtt int y = yCoord + i; if (ItemDye.applyBonemeal(BONEMEAL.copy(), worldObj, x, y, z, fakePlayer)) - break; + break; } } diff --git a/src/main/java/openblocks/enchantments/flimflams/SoundFlimFlam.java b/src/main/java/openblocks/enchantments/flimflams/SoundFlimFlam.java index 9ba96e9b..007dd21a 100644 --- a/src/main/java/openblocks/enchantments/flimflams/SoundFlimFlam.java +++ b/src/main/java/openblocks/enchantments/flimflams/SoundFlimFlam.java @@ -21,8 +21,7 @@ public class SoundFlimFlam implements IFlimFlamAction { "mob.endermen.stare", "mob.ghast.charge", "mob.zombiepig.zpigangry", - "mob.creeper.say" - ); + "mob.creeper.say"); @Override public boolean execute(EntityPlayerMP target) { diff --git a/src/main/java/openblocks/integration/package-info.java b/src/main/java/openblocks/integration/package-info.java index 6a0f83f3..0710b2aa 100644 --- a/src/main/java/openblocks/integration/package-info.java +++ b/src/main/java/openblocks/integration/package-info.java @@ -1,2 +1 @@ package openblocks.integration; - From f9d41c8bb3565487ef5fff217524a6ad1a760425 Mon Sep 17 00:00:00 2001 From: TheSilkMiner Date: Sat, 23 Apr 2016 09:22:32 +0200 Subject: [PATCH 24/54] Projector enhancements: more futuristic Look&Feel This commit makes the projector emit light and render a translucent cone when displaying a height map. All the various functionality can be disabled in the config. Originated from discussion in IRC channel. * Make the Projector emit light when displaying a map * Add holographic translucent cone rendering This comes with a configurable cone brightness level, too. This because some people may not like the default value and the subsequent color change during the day cycle. With the configuration option, the value can be fixed to a certain value and that one will be used "all day long". Very low values may turn the color to a greenish one from the original blue, though. See also: http://prnt.sc/azhm2h * Remove Working Projector and other blocks from NEI view * Add grid to the Projector's cone If the configuration option is enabled, the cone attempts to render a grid instead of a simple cone of "light". In-between two cones there is a little gap, that is caused by calculations on the texture side (0.25 does not correspond exactly to 16 pixels, nor does 0.75). See also: http://i.imgur.com/TxPtI8e.png Signed-off by TheSilkMiner --- src/main/java/openblocks/Config.java | 24 ++++ .../java/openblocks/NEIOpenBlocksConfig.java | 35 +++-- src/main/java/openblocks/OpenBlocks.java | 4 + .../java/openblocks/client/ClientProxy.java | 13 +- .../openblocks/client/gui/GuiProjector.java | 2 +- .../block/BlockWorkingProjectorRenderer.java | 132 ++++++++++++++++++ .../TileEntityProjectorRenderer.java | 28 ++-- .../common/block/BlockProjector.java | 30 +++- .../common/block/BlockWorkingProjector.java | 72 ++++++++++ .../tileentity/TileEntityProjector.java | 33 ++++- .../assets/openblocks/lang/de_DE.lang | 1 + .../assets/openblocks/lang/en_US.lang | 1 + .../assets/openblocks/lang/es_AR.lang | 1 + .../assets/openblocks/lang/es_ES.lang | 1 + .../assets/openblocks/lang/es_MX.lang | 1 + .../assets/openblocks/lang/es_UY.lang | 1 + .../assets/openblocks/lang/es_VE.lang | 1 + .../assets/openblocks/lang/et_EE.lang | 1 + .../assets/openblocks/lang/fr_FR.lang | 1 + .../assets/openblocks/lang/it_IT.lang | 1 + .../assets/openblocks/lang/ko_KR.lang | 1 + .../assets/openblocks/lang/nl_NL.lang | 1 + .../assets/openblocks/lang/pl_PL.lang | 1 + .../assets/openblocks/lang/pt_BR.lang | 1 + .../assets/openblocks/lang/ru_RU.lang | 1 + .../assets/openblocks/lang/zh_CN.lang | 1 + .../textures/blocks/projector_cone.png | Bin 0 -> 184 bytes .../textures/blocks/projector_cone_grid.png | Bin 0 -> 713 bytes 28 files changed, 362 insertions(+), 27 deletions(-) create mode 100644 src/main/java/openblocks/client/renderer/block/BlockWorkingProjectorRenderer.java create mode 100644 src/main/java/openblocks/common/block/BlockWorkingProjector.java create mode 100644 src/main/resources/assets/openblocks/textures/blocks/projector_cone.png create mode 100644 src/main/resources/assets/openblocks/textures/blocks/projector_cone_grid.png diff --git a/src/main/java/openblocks/Config.java b/src/main/java/openblocks/Config.java index d96b06e6..0c4a29d6 100644 --- a/src/main/java/openblocks/Config.java +++ b/src/main/java/openblocks/Config.java @@ -295,6 +295,25 @@ public class Config { @ConfigProperty(category = "sponge", name = "spongeRange", comment = "Sponge block range (distance from center)") public static int spongeStickRange = 3; + @ConfigProperty(category = "projector", name = "lightUpWhenWorking", comment = "Projector will light up whenever it is displaying a map") + public static boolean litWhenDisplayingMap = true; + + @ConfigProperty(category = "projector", name = "renderHolographicCone", comment = "Projector will render a holographic cone whenever active") + public static boolean renderHoloCone = true; + + @ConfigProperty(category = "projector", name = "brightness", comment = "The projector's cone will use the specified brightness value to render.\n" + + "Value must be between 0 and 255 inclusive. To use the default world brightness set -1 as the value.\n" + + "Keep in mind that default brightness means that the cone will render as light blue during the day and dark blue during the night.") + public static int coneBrightness = -1; + + @ConfigProperty(category = "projector", name = "lightLevel", comment = "Level of light emitted by the active projector. Defaults to 10. Must be at maximum 15 and positive") + public static int projectorLightLevelValue = 10; + + @ConfigProperty(category = "projector", name = "renderHolographicGrid", comment = "The holographic cone will display a grid.\n" + + "The grid texture may look a bit pixelated and there may be a little gap between two corners.\n" + + "This is not an error and it is only a texture calculation problem (e.g. 0.25 does not correctly correspond to 16 pixels in a 64x64 texture)") + public static boolean renderHoloGrid = false; + @OnLineModifiable @ConfigProperty(category = "loot", name = "donationStation") public static boolean donationStationLoot = false; @@ -733,5 +752,10 @@ public class Config { } } + + // Avoid crashes whenever lit projector is deactivated - TSM + if (OpenBlocks.Blocks.workingProjector == null) { + Config.litWhenDisplayingMap = false; + } } } diff --git a/src/main/java/openblocks/NEIOpenBlocksConfig.java b/src/main/java/openblocks/NEIOpenBlocksConfig.java index eb6c8e85..d448ef89 100644 --- a/src/main/java/openblocks/NEIOpenBlocksConfig.java +++ b/src/main/java/openblocks/NEIOpenBlocksConfig.java @@ -5,21 +5,30 @@ import com.google.common.base.Throwables; import java.lang.reflect.Method; import net.minecraft.item.ItemStack; import net.minecraftforge.oredict.OreDictionary; -import openblocks.OpenBlocks.Items; +import openmods.Log; public class NEIOpenBlocksConfig implements IConfigureNEI { + private static final String API = "codechicken.nei.api.API"; + private static final String HIDE_ITEM = "hideItem"; + + private Method hideItem; + @Override public void loadConfig() { - try { - // I have no idea how to link with NEI API - Class cls = Class.forName("codechicken.nei.api.API"); - Method hide = cls.getMethod("hideItem", ItemStack.class); - - if (Items.heightMap != null) hide.invoke(null, new ItemStack(Items.heightMap, 1, OreDictionary.WILDCARD_VALUE)); - } catch (Throwable t) { - Throwables.propagate(t); + if (OpenBlocks.Blocks.canvasGlass != null) { + this.API$hideItem(new ItemStack(OpenBlocks.Blocks.canvasGlass)); } + + if (OpenBlocks.Blocks.workingProjector != null) { + this.API$hideItem(new ItemStack(OpenBlocks.Blocks.workingProjector)); + } + + if (OpenBlocks.Items.heightMap != null) { + this.API$hideItem(new ItemStack(OpenBlocks.Items.heightMap, 1, OreDictionary.WILDCARD_VALUE)); + } + + Log.info("OpenBlocks NEI Integration loaded successfully"); } @Override @@ -32,4 +41,12 @@ public class NEIOpenBlocksConfig implements IConfigureNEI { return "0.0"; } + private void API$hideItem(final ItemStack stack) { + try { + if (this.hideItem == null) this.hideItem = Class.forName(API).getMethod(HIDE_ITEM, ItemStack.class); + this.hideItem.invoke(null, stack); + } catch (final Throwable thr) { + Throwables.propagate(thr); + } + } } diff --git a/src/main/java/openblocks/OpenBlocks.java b/src/main/java/openblocks/OpenBlocks.java index 8f1d7f5b..514c2739 100644 --- a/src/main/java/openblocks/OpenBlocks.java +++ b/src/main/java/openblocks/OpenBlocks.java @@ -85,6 +85,7 @@ import openblocks.common.block.BlockTarget; import openblocks.common.block.BlockTrophy; import openblocks.common.block.BlockVacuumHopper; import openblocks.common.block.BlockVillageHighlighter; +import openblocks.common.block.BlockWorkingProjector; import openblocks.common.block.BlockXPBottler; import openblocks.common.block.BlockXPDrain; import openblocks.common.block.BlockXPShower; @@ -345,6 +346,9 @@ public class OpenBlocks { @RegisterBlock(name = "projector", tileEntity = TileEntityProjector.class, textureName = RegisterBlock.NONE) public static BlockProjector projector; + @RegisterBlock(name = "projector.working", tileEntity = TileEntityProjector.class, textureName = RegisterBlock.NONE) + public static BlockWorkingProjector workingProjector; + @RegisterBlock(name = "drawingtable", tileEntity = TileEntityDrawingTable.class) public static BlockDrawingTable drawingTable; diff --git a/src/main/java/openblocks/client/ClientProxy.java b/src/main/java/openblocks/client/ClientProxy.java index 8c4e8671..fdb31195 100644 --- a/src/main/java/openblocks/client/ClientProxy.java +++ b/src/main/java/openblocks/client/ClientProxy.java @@ -29,6 +29,7 @@ import openblocks.client.renderer.block.BlockPathRenderer; import openblocks.client.renderer.block.BlockRopeLadderRenderer; import openblocks.client.renderer.block.BlockSkyRenderer; import openblocks.client.renderer.block.BlockTankRenderer; +import openblocks.client.renderer.block.BlockWorkingProjectorRenderer; import openblocks.client.renderer.entity.EntityCartographerRenderer; import openblocks.client.renderer.entity.EntityGoldenEyeRenderer; import openblocks.client.renderer.entity.EntityHangGliderRenderer; @@ -155,9 +156,13 @@ public class ClientProxy implements IOpenBlocksProxy { final BlockRenderingHandler blockRenderingHandler = new BlockRenderingHandler(OpenBlocks.renderIdFull, true); blockRenderingHandler.addRenderer(OpenBlocks.Blocks.path, new BlockPathRenderer()); - BlockCanvasRenderer canvasRenderer = new BlockCanvasRenderer(); - blockRenderingHandler.addRenderer(OpenBlocks.Blocks.canvas, canvasRenderer); - blockRenderingHandler.addRenderer(OpenBlocks.Blocks.canvasGlass, canvasRenderer); + + { + final BlockCanvasRenderer canvasRenderer = new BlockCanvasRenderer(); + blockRenderingHandler.addRenderer(OpenBlocks.Blocks.canvas, canvasRenderer); + blockRenderingHandler.addRenderer(OpenBlocks.Blocks.canvasGlass, canvasRenderer); + } + blockRenderingHandler.addRenderer(OpenBlocks.Blocks.paintCan, new BlockPaintCanRenderer()); blockRenderingHandler.addRenderer(OpenBlocks.Blocks.sky, new BlockSkyRenderer()); blockRenderingHandler.addRenderer(OpenBlocks.Blocks.tank, new BlockTankRenderer()); @@ -168,6 +173,8 @@ public class ClientProxy implements IOpenBlocksProxy { blockRenderingHandler.addRenderer(OpenBlocks.Blocks.builderGuide, guideBlockRenderer); } + blockRenderingHandler.addRenderer(OpenBlocks.Blocks.workingProjector, new BlockWorkingProjectorRenderer()); + RenderingRegistry.registerBlockHandler(blockRenderingHandler); } diff --git a/src/main/java/openblocks/client/gui/GuiProjector.java b/src/main/java/openblocks/client/gui/GuiProjector.java index a1587645..bc99551f 100644 --- a/src/main/java/openblocks/client/gui/GuiProjector.java +++ b/src/main/java/openblocks/client/gui/GuiProjector.java @@ -61,7 +61,7 @@ public class GuiProjector extends BaseGuiContainer { @Override protected void drawGuiContainerBackgroundLayer(float partialTickTime, int mouseX, int mouseY) { - if (isInitialized == false || Mouse.isButtonDown(2)) { + if (!isInitialized || Mouse.isButtonDown(2)) { trackball.setTransform(MathUtils.createEntityRotateMatrix(Minecraft.getMinecraft().renderViewEntity)); isInitialized = true; } diff --git a/src/main/java/openblocks/client/renderer/block/BlockWorkingProjectorRenderer.java b/src/main/java/openblocks/client/renderer/block/BlockWorkingProjectorRenderer.java new file mode 100644 index 00000000..fd7b0c96 --- /dev/null +++ b/src/main/java/openblocks/client/renderer/block/BlockWorkingProjectorRenderer.java @@ -0,0 +1,132 @@ +package openblocks.client.renderer.block; + +import net.minecraft.client.renderer.RenderBlocks; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.util.IIcon; +import net.minecraft.world.IBlockAccess; +import openblocks.Config; +import openblocks.common.block.BlockWorkingProjector; +import openmods.renderer.IBlockRenderer; + +public class BlockWorkingProjectorRenderer implements IBlockRenderer { + + public static int renderPass = 0; + + private static final float TO_BLOCK_CENTRE = 0.5F; + private static final int BRIGHTNESS_LEVEL_MAX = 255; + private static final int BRIGHTNESS_LEVEL_MIN = 0; + private static final int BRIGHTNESS_LEVEL_DEF = -1; + + private static final float CONE_BEGIN = Config.renderHoloGrid ? 0F : 0.25F; + private static final float CONE_END = Config.renderHoloGrid ? 1F : 0.75F; + + @Override + public void renderInventoryBlock(final BlockWorkingProjector block, + final int metadata, + final int modelID, + final RenderBlocks renderer) { + // Do nothing: Working Projector cannot be obtained in inventory + } + + @Override + public boolean renderWorldBlock(final IBlockAccess world, + final int x, + final int y, + final int z, + final BlockWorkingProjector block, + final int modelId, + final RenderBlocks renderer) { + if (renderPass == 0) { + renderer.renderStandardBlock(block, x, y, z); + return true; + } + + if (!Config.renderHoloCone) return false; + if (renderPass != 1) return false; // Just in case something breaks + + final Tessellator tex = Tessellator.instance; + tex.addTranslation(x, y + TO_BLOCK_CENTRE, z); + + if (Config.coneBrightness != BRIGHTNESS_LEVEL_DEF) { + tex.setBrightness(Math.max(BRIGHTNESS_LEVEL_MIN, Math.min(Config.coneBrightness, BRIGHTNESS_LEVEL_MAX))); + } + + this.renderCoreWithTex(block.getIcon(world, x, y, z, -1), tex); + + tex.addTranslation(-x, -(y + TO_BLOCK_CENTRE), -z); + + return true; + } + + private void renderCoreWithTex(final IIcon cone, final Tessellator tex) { + final float minU = cone.getMinU(); + final float minV = cone.getMinV(); + final float maxU = cone.getMaxU(); + final float maxV = cone.getMaxV(); + + this.renderNorthFace(tex, minU, minV, maxU, maxV); + this.renderWestFace(tex, minU, minV, maxU, maxV); + this.renderSouthFace(tex, minU, minV, maxU, maxV); + this.renderEastFace(tex, minU, minV, maxU, maxV); + } + + private void renderNorthFace(final Tessellator tex, + final float minU, + final float minV, + final float maxU, + final float maxV) { + tex.addVertexWithUV(CONE_END, 0, 0.25, maxU, maxV); + tex.addVertexWithUV(1, 1, 0, maxU, minV); + tex.addVertexWithUV(0, 1, 0, minU, minV); + tex.addVertexWithUV(CONE_BEGIN, 0, 0.25, minU, maxV); + tex.addVertexWithUV(CONE_END, 0, 0.25, maxU, maxV); + tex.addVertexWithUV(CONE_BEGIN, 0, 0.25, minU, maxV); + tex.addVertexWithUV(0, 1, 0, minU, minV); + tex.addVertexWithUV(1, 1, 0, maxU, minV); + } + + private void renderWestFace(final Tessellator tex, + final float minU, + final float minV, + final float maxU, + final float maxV) { + tex.addVertexWithUV(0.25, 0, CONE_END, maxU, maxV); + tex.addVertexWithUV(0, 1, 1, maxU, minV); + tex.addVertexWithUV(0, 1, 0, minU, minV); + tex.addVertexWithUV(0.25, 0, CONE_BEGIN, minU, maxV); + tex.addVertexWithUV(0.25, 0, CONE_END, maxU, maxV); + tex.addVertexWithUV(0.25, 0, CONE_BEGIN, minU, maxV); + tex.addVertexWithUV(0, 1, 0, minU, minV); + tex.addVertexWithUV(0, 1, 1, maxU, minV); + } + + private void renderEastFace(final Tessellator tex, + final float minU, + final float minV, + final float maxU, + final float maxV) { + tex.addVertexWithUV(0.75, 0, CONE_END, maxU, maxV); + tex.addVertexWithUV(1, 1, 1, maxU, minV); + tex.addVertexWithUV(1, 1, 0, minU, minV); + tex.addVertexWithUV(0.75, 0, CONE_BEGIN, minU, maxV); + tex.addVertexWithUV(0.75, 0, CONE_END, maxU, maxV); + tex.addVertexWithUV(0.75, 0, CONE_BEGIN, minU, maxV); + tex.addVertexWithUV(1, 1, 0, minU, minV); + tex.addVertexWithUV(1, 1, 1, maxU, minV); + } + + private void renderSouthFace(final Tessellator tex, + final float minU, + final float minV, + final float maxU, + final float maxV) { + tex.addVertexWithUV(CONE_END, 0, 0.75, maxU, maxV); + tex.addVertexWithUV(1, 1, 1, maxU, minV); + tex.addVertexWithUV(0, 1, 1, minU, minV); + tex.addVertexWithUV(CONE_BEGIN, 0, 0.75, minU, maxV); + tex.addVertexWithUV(CONE_END, 0, 0.75, maxU, maxV); + tex.addVertexWithUV(CONE_BEGIN, 0, 0.75, minU, maxV); + tex.addVertexWithUV(0, 1, 1, minU, minV); + tex.addVertexWithUV(1, 1, 1, maxU, minV); + } +} diff --git a/src/main/java/openblocks/client/renderer/tileentity/TileEntityProjectorRenderer.java b/src/main/java/openblocks/client/renderer/tileentity/TileEntityProjectorRenderer.java index ab463909..44bd0b0b 100644 --- a/src/main/java/openblocks/client/renderer/tileentity/TileEntityProjectorRenderer.java +++ b/src/main/java/openblocks/client/renderer/tileentity/TileEntityProjectorRenderer.java @@ -15,32 +15,38 @@ import org.lwjgl.opengl.GL11; public class TileEntityProjectorRenderer extends TileEntitySpecialRenderer { - private final static ResourceLocation texture = new ResourceLocation("openblocks:textures/models/projector.png"); + private final static ResourceLocation TEXTURE = new ResourceLocation("openblocks", "textures/models/projector.png"); + private static final float BLOCK_CENTRE_TRANSLATION = 0.5F; private static ModelProjector model = new ModelProjector(); + @SuppressWarnings("unused") public static void reload() { model = new ModelProjector(); } @Override - public void renderTileEntityAt(TileEntity te, double x, double y, double z, float partialTickTime) { + public void renderTileEntityAt(final TileEntity te, final double x, final double y, final double z, final float partialTickTime) { int pass = MinecraftForgeClient.getRenderPass(); final TileEntityProjector projector = (TileEntityProjector)te; GL11.glPushMatrix(); - GL11.glTranslated(x + 0.5, y, z + 0.5); + GL11.glTranslated(x + BLOCK_CENTRE_TRANSLATION, y, z + BLOCK_CENTRE_TRANSLATION); GL11.glRotated(90 * projector.rotation(), 0, 1, 0); - GL11.glTranslated(-0.5, 0, -0.5); + GL11.glTranslated(-BLOCK_CENTRE_TRANSLATION, 0, -BLOCK_CENTRE_TRANSLATION); GL11.glColor3f(1, 1, 1); int mapId = projector.mapId(); - if (pass <= 0) renderProjector(projector, partialTickTime, mapId >= 0); - else renderMap(projector, mapId); + if (pass <= 0) { + renderProjector(projector, partialTickTime, mapId >= 0); + } + else { + renderMap(projector, mapId); + } GL11.glPopMatrix(); } - private static void renderMap(final TileEntityProjector projector, int mapId) { + private void renderMap(final TileEntityProjector projector, final int mapId) { if (projector.getWorldObj() != null) { HeightMapData data = MapDataManager.getMapData(projector.getWorldObj(), mapId); if (data.isValid()) { @@ -50,9 +56,10 @@ public class TileEntityProjectorRenderer extends TileEntitySpecialRenderer { } } - private void renderProjector(TileEntityProjector projector, float partialTickTime, boolean active) { - GL11.glTranslated(0.25, 0.5, 0.25); - bindTexture(texture); + @SuppressWarnings("unused") + private void renderProjector(final TileEntityProjector projector, final float partialTickTime, final boolean active) { + GL11.glTranslated(BLOCK_CENTRE_TRANSLATION / 2, BLOCK_CENTRE_TRANSLATION, BLOCK_CENTRE_TRANSLATION / 2); + bindTexture(TEXTURE); if (active) { long ticks = OpenMods.proxy.getTicks(projector.getWorldObj()); model.render(ticks * 0.01f, ticks * 0.3f, 0.25f * MathHelper.sin(ticks * 0.005f) + 0.25f); @@ -60,5 +67,4 @@ public class TileEntityProjectorRenderer extends TileEntitySpecialRenderer { model.render(0, 0, 0); } } - } diff --git a/src/main/java/openblocks/common/block/BlockProjector.java b/src/main/java/openblocks/common/block/BlockProjector.java index 0fbe5319..1d94e610 100644 --- a/src/main/java/openblocks/common/block/BlockProjector.java +++ b/src/main/java/openblocks/common/block/BlockProjector.java @@ -2,19 +2,29 @@ package openblocks.common.block; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.util.IIcon; import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import openblocks.Config; +import openblocks.OpenBlocks; +import openblocks.common.tileentity.TileEntityProjector; +import openmods.utils.BlockNotifyFlags; public class BlockProjector extends OpenBlock { + private static final float SLAB_HEIGHT = 0.5F; + + private static boolean changingState; + @SideOnly(Side.CLIENT) private IIcon sideIcon; public BlockProjector() { super(Material.iron); - setBlockBounds(0, 0, 0, 1, 0.5f, 1); + setBlockBounds(0, 0, 0, 1, SLAB_HEIGHT, 1); setRenderMode(RenderMode.BOTH); } @@ -35,7 +45,7 @@ public class BlockProjector extends OpenBlock { @Override @SideOnly(Side.CLIENT) - public void registerBlockIcons(IIconRegister registry) { + public void registerBlockIcons(final IIconRegister registry) { sideIcon = registry.registerIcon("stone_slab_side"); blockIcon = registry.registerIcon("stone_slab_top"); } @@ -45,4 +55,20 @@ public class BlockProjector extends OpenBlock { public IIcon getIcon(IBlockAccess world, int x, int y, int z, int side) { return (side < 2)? blockIcon : sideIcon; } + + @Override + public void breakBlock(final World world, final int x, final int y, final int z, final Block block, final int meta) { + if (!changingState) super.breakBlock(world, x, y, z, block, meta); + } + + public static void update(final boolean lit, final World world, final int x, final int y, final int z) { + final int meta = world.getBlockMetadata(x, y, z); + if (getTileEntity(world, x, y, z, TileEntityProjector.class) == null) return; + changingState = true; + final Block block = lit && Config.litWhenDisplayingMap? + OpenBlocks.Blocks.workingProjector : + OpenBlocks.Blocks.projector; + world.setBlock(x, y, z, block, meta, BlockNotifyFlags.ALL); + changingState = false; + } } diff --git a/src/main/java/openblocks/common/block/BlockWorkingProjector.java b/src/main/java/openblocks/common/block/BlockWorkingProjector.java new file mode 100644 index 00000000..fb0bab77 --- /dev/null +++ b/src/main/java/openblocks/common/block/BlockWorkingProjector.java @@ -0,0 +1,72 @@ +package openblocks.common.block; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import java.util.List; +import java.util.Random; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.item.Item; +import net.minecraft.util.IIcon; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import openblocks.Config; +import openblocks.OpenBlocks; + +public class BlockWorkingProjector extends BlockProjector { + + private static final int MIN_LIGHT_LEVEL = 0; + private static final int MAX_LIGHT_LEVEL = 15; + private static final String CONE_ICON = "openblocks:projector_cone" + (Config.renderHoloGrid ? "_grid" : ""); + + @SideOnly(Side.CLIENT) + private IIcon coneIcon; + + public BlockWorkingProjector() { + super(); + } + + @Override + public int getLightValue() { + return Math.min(Math.max(MIN_LIGHT_LEVEL, Config.projectorLightLevelValue), MAX_LIGHT_LEVEL); + } + + @Override + @SuppressWarnings("rawtypes") + public void getSubBlocks(final Item item, final CreativeTabs tab, final List list) { + // Don't add anything: We don't want it to show blocks + } + + @Override + public Item getItemDropped(final int metadata, final Random random, final int fortune) { + return Item.getItemFromBlock(OpenBlocks.Blocks.projector); + } + + @Override + public Item getItem(World world, int x, int y, int z) { + return this.getItemDropped(0, null, 0); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(final IIconRegister registry) { + super.registerBlockIcons(registry); + this.coneIcon = registry.registerIcon(CONE_ICON); + } + + @Override + public IIcon getIcon(final IBlockAccess world, final int x, final int y, final int z, final int side) { + return side >= 0? super.getIcon(world, x, y, z, side) : this.coneIcon; + } + + @Override + public int getRenderBlockPass() { + return 1; + } + + @Override + public boolean canRenderInPass(final int pass) { + openblocks.client.renderer.block.BlockWorkingProjectorRenderer.renderPass = pass; + return true; + } +} diff --git a/src/main/java/openblocks/common/tileentity/TileEntityProjector.java b/src/main/java/openblocks/common/tileentity/TileEntityProjector.java index 30c42788..38b048e6 100644 --- a/src/main/java/openblocks/common/tileentity/TileEntityProjector.java +++ b/src/main/java/openblocks/common/tileentity/TileEntityProjector.java @@ -3,15 +3,19 @@ package openblocks.common.tileentity; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import java.util.Set; +import net.minecraft.block.Block; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.IInventory; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.AxisAlignedBB; +import net.minecraft.world.World; +import openblocks.OpenBlocks; import openblocks.client.gui.GuiProjector; import openblocks.common.HeightMapData; import openblocks.common.MapDataManager; +import openblocks.common.block.BlockProjector; import openblocks.common.container.ContainerProjector; import openblocks.common.item.ItemEmptyMap; import openblocks.common.item.ItemHeightMap; @@ -29,7 +33,9 @@ import openmods.tileentity.SyncedTileEntity; public class TileEntityProjector extends SyncedTileEntity implements IHasGui, IInventoryProvider, ISyncListener, IRotatable { - private GenericInventory inventory = new TileEntityInventory(this, "openblocks.projector", false, 1) { + private int prevId = -1; + + private final GenericInventory inventory = new TileEntityInventory(this, "openblocks.projector", false, 1) { @Override public boolean isItemValidForSlot(int i, ItemStack stack) { if (stack == null) return false; @@ -60,6 +66,15 @@ public class TileEntityProjector extends SyncedTileEntity implements IHasGui, II } else TileEntityProjector.this.mapId.set(-1); } else TileEntityProjector.this.mapId.set(-1); sync(); + + if (TileEntityProjector.this.prevId != TileEntityProjector.this.mapId()) { + BlockProjector.update(TileEntityProjector.this.mapId() != -1, + TileEntityProjector.this.worldObj, + TileEntityProjector.this.xCoord, + TileEntityProjector.this.yCoord, + TileEntityProjector.this.zCoord); + } + TileEntityProjector.this.prevId = TileEntityProjector.this.mapId(); } markUpdated(); @@ -89,6 +104,7 @@ public class TileEntityProjector extends SyncedTileEntity implements IHasGui, II @Override public void validate() { super.validate(); + this.prevId = this.mapId(); inventory.onInventoryChanged(0); } @@ -139,6 +155,20 @@ public class TileEntityProjector extends SyncedTileEntity implements IHasGui, II sync(); } + @Override + public boolean shouldRefresh(final Block oldBlock, + final Block newBlock, + final int oldMeta, + final int newMeta, + final World world, + final int x, + final int y, + final int z) { + + return !((oldBlock == OpenBlocks.Blocks.projector && newBlock == OpenBlocks.Blocks.workingProjector) + || (oldBlock == OpenBlocks.Blocks.workingProjector && newBlock == OpenBlocks.Blocks.projector)); + } + public byte rotation() { return rotation.get(); } @@ -159,6 +189,7 @@ public class TileEntityProjector extends SyncedTileEntity implements IHasGui, II if (worldObj != null || mapId < 0) MapDataManager.instance.markDataUpdated(worldObj, mapId); } + @SuppressWarnings("unused") public void fetchMap() { int mapId = this.mapId.get(); if (worldObj != null && mapId >= 0) MapDataManager.getMapData(worldObj, mapId); diff --git a/src/main/resources/assets/openblocks/lang/de_DE.lang b/src/main/resources/assets/openblocks/lang/de_DE.lang index dedd5d4e..3df85643 100644 --- a/src/main/resources/assets/openblocks/lang/de_DE.lang +++ b/src/main/resources/assets/openblocks/lang/de_DE.lang @@ -257,6 +257,7 @@ tile.openblocks.blockbreaker.description=Wenn er ein Redstone-Signal bekommt, br tile.openblocks.projector.name=Höhenkartenprojektor tile.openblocks.projector.description=Ich überlasse es boq, das hier zu schreiben! +#tile.openblocks.projector.working.name=Height Map Projector ## NEEDS TRANSLATION ## tile.openblocks.autoenchantmenttable.name=Auto-Zaubertisch tile.openblocks.autoenchantmenttable.description=Der Auto-Zaubertisch funktioniert ähnlich wie der Vanilla-Zaubertisch, außer dass er mit flüssigen XP arbeitet. Benutze die Tabs auf der rechten Seite des Interfaces, um auszuwählen, von wo Items und XP genommen werden sollen. Genau wie beim Vanilla-Zaubertisch brauchst du Bücherregale, wenn du mit höhere Leveln verzaubern willst. diff --git a/src/main/resources/assets/openblocks/lang/en_US.lang b/src/main/resources/assets/openblocks/lang/en_US.lang index 4ae298ee..9ab174cf 100644 --- a/src/main/resources/assets/openblocks/lang/en_US.lang +++ b/src/main/resources/assets/openblocks/lang/en_US.lang @@ -257,6 +257,7 @@ tile.openblocks.blockbreaker.description=When given a redstone pulse the block b tile.openblocks.projector.name=Height Map Projector tile.openblocks.projector.description=I'll let you write this one boq! +tile.openblocks.projector.working.name=Height Map Projector tile.openblocks.autoenchantmenttable.name=Auto Enchantment Table tile.openblocks.autoenchantmenttable.description=The auto enchantment table works in a similar way to the vanilla enchantment table except it runs off XP juice. Use the tabs on the right side of the interface to select where items or xp can be pulled from. Just like with the vanilla table bookshelves are required for higher levels. diff --git a/src/main/resources/assets/openblocks/lang/es_AR.lang b/src/main/resources/assets/openblocks/lang/es_AR.lang index 09494274..6e4ec668 100644 --- a/src/main/resources/assets/openblocks/lang/es_AR.lang +++ b/src/main/resources/assets/openblocks/lang/es_AR.lang @@ -257,6 +257,7 @@ tile.openblocks.blockbreaker.description=Cuando se le aplique un pulso de redsto tile.openblocks.projector.name=Proyector de Mapas Topográficos tile.openblocks.projector.description=¡Te dejo escribir esta, boq! +#tile.openblocks.projector.working.name=Height Map Projector ## NEEDS TRANSLATION ## tile.openblocks.autoenchantmenttable.name=Mesa de Encantamiento Automática tile.openblocks.autoenchantmenttable.description=La mesa de encantamiento automática funciona de forma similar a la mesa de encantamiento corriente excepto por que funciona con XP líquida. Usa las pestañas en la parte derecha de la interfaz para seleccionar de donde se cogen los objetos o la XP. Se necesitan librerías para conseguir mejores encantamientos, justo como con la mesa corriente. diff --git a/src/main/resources/assets/openblocks/lang/es_ES.lang b/src/main/resources/assets/openblocks/lang/es_ES.lang index 09494274..6e4ec668 100644 --- a/src/main/resources/assets/openblocks/lang/es_ES.lang +++ b/src/main/resources/assets/openblocks/lang/es_ES.lang @@ -257,6 +257,7 @@ tile.openblocks.blockbreaker.description=Cuando se le aplique un pulso de redsto tile.openblocks.projector.name=Proyector de Mapas Topográficos tile.openblocks.projector.description=¡Te dejo escribir esta, boq! +#tile.openblocks.projector.working.name=Height Map Projector ## NEEDS TRANSLATION ## tile.openblocks.autoenchantmenttable.name=Mesa de Encantamiento Automática tile.openblocks.autoenchantmenttable.description=La mesa de encantamiento automática funciona de forma similar a la mesa de encantamiento corriente excepto por que funciona con XP líquida. Usa las pestañas en la parte derecha de la interfaz para seleccionar de donde se cogen los objetos o la XP. Se necesitan librerías para conseguir mejores encantamientos, justo como con la mesa corriente. diff --git a/src/main/resources/assets/openblocks/lang/es_MX.lang b/src/main/resources/assets/openblocks/lang/es_MX.lang index 09494274..6e4ec668 100644 --- a/src/main/resources/assets/openblocks/lang/es_MX.lang +++ b/src/main/resources/assets/openblocks/lang/es_MX.lang @@ -257,6 +257,7 @@ tile.openblocks.blockbreaker.description=Cuando se le aplique un pulso de redsto tile.openblocks.projector.name=Proyector de Mapas Topográficos tile.openblocks.projector.description=¡Te dejo escribir esta, boq! +#tile.openblocks.projector.working.name=Height Map Projector ## NEEDS TRANSLATION ## tile.openblocks.autoenchantmenttable.name=Mesa de Encantamiento Automática tile.openblocks.autoenchantmenttable.description=La mesa de encantamiento automática funciona de forma similar a la mesa de encantamiento corriente excepto por que funciona con XP líquida. Usa las pestañas en la parte derecha de la interfaz para seleccionar de donde se cogen los objetos o la XP. Se necesitan librerías para conseguir mejores encantamientos, justo como con la mesa corriente. diff --git a/src/main/resources/assets/openblocks/lang/es_UY.lang b/src/main/resources/assets/openblocks/lang/es_UY.lang index 09494274..6e4ec668 100644 --- a/src/main/resources/assets/openblocks/lang/es_UY.lang +++ b/src/main/resources/assets/openblocks/lang/es_UY.lang @@ -257,6 +257,7 @@ tile.openblocks.blockbreaker.description=Cuando se le aplique un pulso de redsto tile.openblocks.projector.name=Proyector de Mapas Topográficos tile.openblocks.projector.description=¡Te dejo escribir esta, boq! +#tile.openblocks.projector.working.name=Height Map Projector ## NEEDS TRANSLATION ## tile.openblocks.autoenchantmenttable.name=Mesa de Encantamiento Automática tile.openblocks.autoenchantmenttable.description=La mesa de encantamiento automática funciona de forma similar a la mesa de encantamiento corriente excepto por que funciona con XP líquida. Usa las pestañas en la parte derecha de la interfaz para seleccionar de donde se cogen los objetos o la XP. Se necesitan librerías para conseguir mejores encantamientos, justo como con la mesa corriente. diff --git a/src/main/resources/assets/openblocks/lang/es_VE.lang b/src/main/resources/assets/openblocks/lang/es_VE.lang index 09494274..6e4ec668 100644 --- a/src/main/resources/assets/openblocks/lang/es_VE.lang +++ b/src/main/resources/assets/openblocks/lang/es_VE.lang @@ -257,6 +257,7 @@ tile.openblocks.blockbreaker.description=Cuando se le aplique un pulso de redsto tile.openblocks.projector.name=Proyector de Mapas Topográficos tile.openblocks.projector.description=¡Te dejo escribir esta, boq! +#tile.openblocks.projector.working.name=Height Map Projector ## NEEDS TRANSLATION ## tile.openblocks.autoenchantmenttable.name=Mesa de Encantamiento Automática tile.openblocks.autoenchantmenttable.description=La mesa de encantamiento automática funciona de forma similar a la mesa de encantamiento corriente excepto por que funciona con XP líquida. Usa las pestañas en la parte derecha de la interfaz para seleccionar de donde se cogen los objetos o la XP. Se necesitan librerías para conseguir mejores encantamientos, justo como con la mesa corriente. diff --git a/src/main/resources/assets/openblocks/lang/et_EE.lang b/src/main/resources/assets/openblocks/lang/et_EE.lang index 62f5f0e1..839f5e0a 100644 --- a/src/main/resources/assets/openblocks/lang/et_EE.lang +++ b/src/main/resources/assets/openblocks/lang/et_EE.lang @@ -257,6 +257,7 @@ tile.openblocks.blockbreaker.name=Ploki Lõhkuja #tile.openblocks.projector.name=Height Map Projector ## NEEDS TRANSLATION ## #tile.openblocks.projector.description=I'll let you write this one boq! ## NEEDS TRANSLATION ## +#tile.openblocks.projector.working.name=Height Map Projector ## NEEDS TRANSLATION ## tile.openblocks.autoenchantmenttable.name=Automaatne Loitsimislaud #tile.openblocks.autoenchantmenttable.description=The auto enchantment table works in a similar way to the vanilla enchantment table except it runs off XP juice. Use the tabs on the right side of the interface to select where items or xp can be pulled from. Just like with the vanilla table bookshelves are required for higher levels. ## NEEDS TRANSLATION ## diff --git a/src/main/resources/assets/openblocks/lang/fr_FR.lang b/src/main/resources/assets/openblocks/lang/fr_FR.lang index 1f5c5159..d72f2ed4 100644 --- a/src/main/resources/assets/openblocks/lang/fr_FR.lang +++ b/src/main/resources/assets/openblocks/lang/fr_FR.lang @@ -257,6 +257,7 @@ openblocks.turtle.magnet=Magnet #tile.openblocks.projector.name=Height Map Projector ## NEEDS TRANSLATION ## #tile.openblocks.projector.description=I'll let you write this one boq! ## NEEDS TRANSLATION ## +#tile.openblocks.projector.working.name=Height Map Projector ## NEEDS TRANSLATION ## #tile.openblocks.autoenchantmenttable.name=Auto Enchantment Table ## NEEDS TRANSLATION ## #tile.openblocks.autoenchantmenttable.description=The auto enchantment table works in a similar way to the vanilla enchantment table except it runs off XP juice. Use the tabs on the right side of the interface to select where items or xp can be pulled from. Just like with the vanilla table bookshelves are required for higher levels. ## NEEDS TRANSLATION ## diff --git a/src/main/resources/assets/openblocks/lang/it_IT.lang b/src/main/resources/assets/openblocks/lang/it_IT.lang index b01225f1..76cded4c 100644 --- a/src/main/resources/assets/openblocks/lang/it_IT.lang +++ b/src/main/resources/assets/openblocks/lang/it_IT.lang @@ -257,6 +257,7 @@ tile.openblocks.blockbreaker.description=Quando gli viene fornito un impulso di tile.openblocks.projector.name=Proiettore della Mappa di Altitudine tile.openblocks.projector.description=Ti lascio scrivere questa, boq! +#tile.openblocks.projector.working.name=Height Map Projector ## NEEDS TRANSLATION ## tile.openblocks.autoenchantmenttable.name=Tavolo da Incantamento Automatico tile.openblocks.autoenchantmenttable.description=Il tavolo da incantamento automatico funziona in una maniera simile al tavolo da incantamento Vanilla, eccetto che funziona con l'Esperienza Liquida. Usa le schede sul lato destro dell'interfaccia per selezionare dove gli oggetti o i punti esperienza verranno presi. Esattamente come il tavolo da incantamento Vanilla, sono richieste le librerie per avere livelli di incantamento maggiori. diff --git a/src/main/resources/assets/openblocks/lang/ko_KR.lang b/src/main/resources/assets/openblocks/lang/ko_KR.lang index 20782470..619c9742 100644 --- a/src/main/resources/assets/openblocks/lang/ko_KR.lang +++ b/src/main/resources/assets/openblocks/lang/ko_KR.lang @@ -257,6 +257,7 @@ tile.openblocks.blockbreaker.name=블럭 파괴기 #tile.openblocks.projector.name=Height Map Projector ## NEEDS TRANSLATION ## #tile.openblocks.projector.description=I'll let you write this one boq! ## NEEDS TRANSLATION ## +#tile.openblocks.projector.working.name=Height Map Projector ## NEEDS TRANSLATION ## tile.openblocks.autoenchantmenttable.name=자동 인첸트테이블 #tile.openblocks.autoenchantmenttable.description=The auto enchantment table works in a similar way to the vanilla enchantment table except it runs off XP juice. Use the tabs on the right side of the interface to select where items or xp can be pulled from. Just like with the vanilla table bookshelves are required for higher levels. ## NEEDS TRANSLATION ## diff --git a/src/main/resources/assets/openblocks/lang/nl_NL.lang b/src/main/resources/assets/openblocks/lang/nl_NL.lang index 63031a3a..999c1cb6 100644 --- a/src/main/resources/assets/openblocks/lang/nl_NL.lang +++ b/src/main/resources/assets/openblocks/lang/nl_NL.lang @@ -257,6 +257,7 @@ tile.openblocks.target.name=Doel #tile.openblocks.projector.name=Height Map Projector ## NEEDS TRANSLATION ## #tile.openblocks.projector.description=I'll let you write this one boq! ## NEEDS TRANSLATION ## +#tile.openblocks.projector.working.name=Height Map Projector ## NEEDS TRANSLATION ## #tile.openblocks.autoenchantmenttable.name=Auto Enchantment Table ## NEEDS TRANSLATION ## #tile.openblocks.autoenchantmenttable.description=The auto enchantment table works in a similar way to the vanilla enchantment table except it runs off XP juice. Use the tabs on the right side of the interface to select where items or xp can be pulled from. Just like with the vanilla table bookshelves are required for higher levels. ## NEEDS TRANSLATION ## diff --git a/src/main/resources/assets/openblocks/lang/pl_PL.lang b/src/main/resources/assets/openblocks/lang/pl_PL.lang index 0fd3ffce..d9bb05c1 100644 --- a/src/main/resources/assets/openblocks/lang/pl_PL.lang +++ b/src/main/resources/assets/openblocks/lang/pl_PL.lang @@ -257,6 +257,7 @@ tile.openblocks.blockbreaker.name=Burzyciel blokowy tile.openblocks.projector.name=Projektor mapy wysokościowej #tile.openblocks.projector.description=I'll let you write this one boq! ## NEEDS TRANSLATION ## +#tile.openblocks.projector.working.name=Height Map Projector ## NEEDS TRANSLATION ## tile.openblocks.autoenchantmenttable.name=Automatyczny stół do zaklęć #tile.openblocks.autoenchantmenttable.description=The auto enchantment table works in a similar way to the vanilla enchantment table except it runs off XP juice. Use the tabs on the right side of the interface to select where items or xp can be pulled from. Just like with the vanilla table bookshelves are required for higher levels. ## NEEDS TRANSLATION ## diff --git a/src/main/resources/assets/openblocks/lang/pt_BR.lang b/src/main/resources/assets/openblocks/lang/pt_BR.lang index 17d41328..adba2a09 100644 --- a/src/main/resources/assets/openblocks/lang/pt_BR.lang +++ b/src/main/resources/assets/openblocks/lang/pt_BR.lang @@ -257,6 +257,7 @@ tile.openblocks.village_highlighter.name=Realçador de aldeões #tile.openblocks.projector.name=Height Map Projector ## NEEDS TRANSLATION ## #tile.openblocks.projector.description=I'll let you write this one boq! ## NEEDS TRANSLATION ## +#tile.openblocks.projector.working.name=Height Map Projector ## NEEDS TRANSLATION ## tile.openblocks.autoenchantmenttable.name=Mesa de encantamentos automática #tile.openblocks.autoenchantmenttable.description=The auto enchantment table works in a similar way to the vanilla enchantment table except it runs off XP juice. Use the tabs on the right side of the interface to select where items or xp can be pulled from. Just like with the vanilla table bookshelves are required for higher levels. ## NEEDS TRANSLATION ## diff --git a/src/main/resources/assets/openblocks/lang/ru_RU.lang b/src/main/resources/assets/openblocks/lang/ru_RU.lang index aff855af..d23fdaa3 100644 --- a/src/main/resources/assets/openblocks/lang/ru_RU.lang +++ b/src/main/resources/assets/openblocks/lang/ru_RU.lang @@ -257,6 +257,7 @@ tile.openblocks.blockbreaker.description=Когда будет подан сиг tile.openblocks.projector.name=Прожектор карты высот tile.openblocks.projector.description=Пусть boq напишет описание для него! +#tile.openblocks.projector.working.name=Height Map Projector ## NEEDS TRANSLATION ## tile.openblocks.autoenchantmenttable.name=Автоматический стол зачаровывания tile.openblocks.autoenchantmenttable.description=Автоматический стол зачаровывания работает так же, как и обычный стол зачаровывания, но он требует жидкий опыт. В правой части интерфейса Вы можете выбрать, какие стороны стола будут использованы для извлечения/помещения жидкого опыта/предметов. Так же, книжные полки будут влиять на уровень зачарования. diff --git a/src/main/resources/assets/openblocks/lang/zh_CN.lang b/src/main/resources/assets/openblocks/lang/zh_CN.lang index c9529943..dcc97eb4 100644 --- a/src/main/resources/assets/openblocks/lang/zh_CN.lang +++ b/src/main/resources/assets/openblocks/lang/zh_CN.lang @@ -257,6 +257,7 @@ tile.openblocks.blockbreaker.description=为方块采掘器通入红石信号, tile.openblocks.projector.name=高度图投影仪 tile.openblocks.projector.description=用于显示由制图机器人制作的高度图.将高度图放入投影仪内,将在其上方显示3D的全息地图. +#tile.openblocks.projector.working.name=Height Map Projector ## NEEDS TRANSLATION ## tile.openblocks.autoenchantmenttable.name=自动附魔台 tile.openblocks.autoenchantmenttable.description=自动附魔台的使用方法类似于普通附魔台,但它可以通过消耗经验来自动工作.\n在操作界面右边的设定栏可以调整输入经验或工具的面.自动附魔台也需要书架来提升自己的附魔等级上限. diff --git a/src/main/resources/assets/openblocks/textures/blocks/projector_cone.png b/src/main/resources/assets/openblocks/textures/blocks/projector_cone.png new file mode 100644 index 0000000000000000000000000000000000000000..1c2fe10049cd5da3c01572a0f3d034d1b31a1c96 GIT binary patch literal 184 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzmUKs7M+SzC{oH>NS%G}c0*}aI z1_r(ZAk3I`t&;DCKY&`s{yNxN1k{%LIk OiF>;GxvXN2bZe?^J zG%heMIczh2P5=M`M@d9MRCr$Pl38+tFc1ZO*c{tuu~Uzr3Jk5$NNfh{qh0WjX6fYd zc)gxq&G_)sz#jLGpJn*rk0tIQ;QfBLO1Qd!=dgPh&@MnUHHIv)bv=)TfTNmwcaEAt z{0ms|UvO0c!}47~7cdcUpoA?2tXh89dG^v+5HgRC7jS!KJI`MJ4v;mEt?nGwd$#lR zWeDnvUP-`g`C;Eh&`=bz61Nf{ss{;X9!+yD_FV*xg(36!TmeJ4|1f6=SS&y6is1pn z1T&8=05Xrb0HF(}K#7|3YXxkwyueWCk||Q63xF)gWdz&?+EHMb7%!7iV(r=8deLqP z3=_I+ig|p!01-XEMnLsUv|9qhgf5$6CGI6asDLTx@o56wct&_KDD}B`_>8Hl)9T#XC3s7CqJ$NTXMojkqxyjO)>00000NkvXXu0mjf!igo# literal 0 HcmV?d00001 From e10b002d4694a1e9c3b151d41a26fba2e1dcac02 Mon Sep 17 00:00:00 2001 From: Bartek Bok Date: Sun, 12 Jun 2016 13:57:12 +0200 Subject: [PATCH 25/54] Remove separate 'renderPass' variable, autoformat --- .../java/openblocks/NEIOpenBlocksConfig.java | 6 +- .../block/BlockWorkingProjectorRenderer.java | 60 ++++++------------- .../TileEntityProjectorRenderer.java | 11 +--- .../common/block/BlockProjector.java | 4 +- .../common/block/BlockWorkingProjector.java | 13 ++-- .../tileentity/TileEntityProjector.java | 18 +----- 6 files changed, 31 insertions(+), 81 deletions(-) diff --git a/src/main/java/openblocks/NEIOpenBlocksConfig.java b/src/main/java/openblocks/NEIOpenBlocksConfig.java index d448ef89..08bee7c2 100644 --- a/src/main/java/openblocks/NEIOpenBlocksConfig.java +++ b/src/main/java/openblocks/NEIOpenBlocksConfig.java @@ -17,15 +17,15 @@ public class NEIOpenBlocksConfig implements IConfigureNEI { @Override public void loadConfig() { if (OpenBlocks.Blocks.canvasGlass != null) { - this.API$hideItem(new ItemStack(OpenBlocks.Blocks.canvasGlass)); + API$hideItem(new ItemStack(OpenBlocks.Blocks.canvasGlass)); } if (OpenBlocks.Blocks.workingProjector != null) { - this.API$hideItem(new ItemStack(OpenBlocks.Blocks.workingProjector)); + API$hideItem(new ItemStack(OpenBlocks.Blocks.workingProjector)); } if (OpenBlocks.Items.heightMap != null) { - this.API$hideItem(new ItemStack(OpenBlocks.Items.heightMap, 1, OreDictionary.WILDCARD_VALUE)); + API$hideItem(new ItemStack(OpenBlocks.Items.heightMap, 1, OreDictionary.WILDCARD_VALUE)); } Log.info("OpenBlocks NEI Integration loaded successfully"); diff --git a/src/main/java/openblocks/client/renderer/block/BlockWorkingProjectorRenderer.java b/src/main/java/openblocks/client/renderer/block/BlockWorkingProjectorRenderer.java index fd7b0c96..4840178a 100644 --- a/src/main/java/openblocks/client/renderer/block/BlockWorkingProjectorRenderer.java +++ b/src/main/java/openblocks/client/renderer/block/BlockWorkingProjectorRenderer.java @@ -4,45 +4,35 @@ import net.minecraft.client.renderer.RenderBlocks; import net.minecraft.client.renderer.Tessellator; import net.minecraft.util.IIcon; import net.minecraft.world.IBlockAccess; +import net.minecraftforge.client.ForgeHooksClient; import openblocks.Config; import openblocks.common.block.BlockWorkingProjector; import openmods.renderer.IBlockRenderer; public class BlockWorkingProjectorRenderer implements IBlockRenderer { - public static int renderPass = 0; - private static final float TO_BLOCK_CENTRE = 0.5F; private static final int BRIGHTNESS_LEVEL_MAX = 255; private static final int BRIGHTNESS_LEVEL_MIN = 0; private static final int BRIGHTNESS_LEVEL_DEF = -1; - private static final float CONE_BEGIN = Config.renderHoloGrid ? 0F : 0.25F; - private static final float CONE_END = Config.renderHoloGrid ? 1F : 0.75F; + private static final float CONE_BEGIN = Config.renderHoloGrid? 0F : 0.25F; + private static final float CONE_END = Config.renderHoloGrid? 1F : 0.75F; @Override - public void renderInventoryBlock(final BlockWorkingProjector block, - final int metadata, - final int modelID, - final RenderBlocks renderer) { + public void renderInventoryBlock(BlockWorkingProjector block, int metadata, int modelID, RenderBlocks renderer) { // Do nothing: Working Projector cannot be obtained in inventory } @Override - public boolean renderWorldBlock(final IBlockAccess world, - final int x, - final int y, - final int z, - final BlockWorkingProjector block, - final int modelId, - final RenderBlocks renderer) { - if (renderPass == 0) { + public boolean renderWorldBlock(final IBlockAccess world, int x, int y, int z, BlockWorkingProjector block, int modelId, RenderBlocks renderer) { + if (ForgeHooksClient.getWorldRenderPass() == 0) { renderer.renderStandardBlock(block, x, y, z); return true; } if (!Config.renderHoloCone) return false; - if (renderPass != 1) return false; // Just in case something breaks + if (ForgeHooksClient.getWorldRenderPass() != 1) return false; // Just in case something breaks final Tessellator tex = Tessellator.instance; tex.addTranslation(x, y + TO_BLOCK_CENTRE, z); @@ -51,30 +41,26 @@ public class BlockWorkingProjectorRenderer implements IBlockRenderer= 0); - } - else { + } else { renderMap(projector, mapId); } GL11.glPopMatrix(); } - private void renderMap(final TileEntityProjector projector, final int mapId) { + private static void renderMap(final TileEntityProjector projector, final int mapId) { if (projector.getWorldObj() != null) { HeightMapData data = MapDataManager.getMapData(projector.getWorldObj(), mapId); if (data.isValid()) { @@ -56,7 +50,6 @@ public class TileEntityProjectorRenderer extends TileEntitySpecialRenderer { } } - @SuppressWarnings("unused") private void renderProjector(final TileEntityProjector projector, final float partialTickTime, final boolean active) { GL11.glTranslated(BLOCK_CENTRE_TRANSLATION / 2, BLOCK_CENTRE_TRANSLATION, BLOCK_CENTRE_TRANSLATION / 2); bindTexture(TEXTURE); diff --git a/src/main/java/openblocks/common/block/BlockProjector.java b/src/main/java/openblocks/common/block/BlockProjector.java index 1d94e610..7e477df7 100644 --- a/src/main/java/openblocks/common/block/BlockProjector.java +++ b/src/main/java/openblocks/common/block/BlockProjector.java @@ -65,9 +65,7 @@ public class BlockProjector extends OpenBlock { final int meta = world.getBlockMetadata(x, y, z); if (getTileEntity(world, x, y, z, TileEntityProjector.class) == null) return; changingState = true; - final Block block = lit && Config.litWhenDisplayingMap? - OpenBlocks.Blocks.workingProjector : - OpenBlocks.Blocks.projector; + final Block block = lit && Config.litWhenDisplayingMap? OpenBlocks.Blocks.workingProjector : OpenBlocks.Blocks.projector; world.setBlock(x, y, z, block, meta, BlockNotifyFlags.ALL); changingState = false; } diff --git a/src/main/java/openblocks/common/block/BlockWorkingProjector.java b/src/main/java/openblocks/common/block/BlockWorkingProjector.java index fb0bab77..a0f3b3bd 100644 --- a/src/main/java/openblocks/common/block/BlockWorkingProjector.java +++ b/src/main/java/openblocks/common/block/BlockWorkingProjector.java @@ -17,7 +17,7 @@ public class BlockWorkingProjector extends BlockProjector { private static final int MIN_LIGHT_LEVEL = 0; private static final int MAX_LIGHT_LEVEL = 15; - private static final String CONE_ICON = "openblocks:projector_cone" + (Config.renderHoloGrid ? "_grid" : ""); + private static final String CONE_ICON = "openblocks:projector_cone" + (Config.renderHoloGrid? "_grid" : ""); @SideOnly(Side.CLIENT) private IIcon coneIcon; @@ -44,19 +44,19 @@ public class BlockWorkingProjector extends BlockProjector { @Override public Item getItem(World world, int x, int y, int z) { - return this.getItemDropped(0, null, 0); + return getItemDropped(0, null, 0); } @Override @SideOnly(Side.CLIENT) - public void registerBlockIcons(final IIconRegister registry) { + public void registerBlockIcons(IIconRegister registry) { super.registerBlockIcons(registry); this.coneIcon = registry.registerIcon(CONE_ICON); } @Override - public IIcon getIcon(final IBlockAccess world, final int x, final int y, final int z, final int side) { - return side >= 0? super.getIcon(world, x, y, z, side) : this.coneIcon; + public IIcon getIcon(IBlockAccess world, int x, int y, int z, int side) { + return side >= 0? super.getIcon(world, x, y, z, side) : this.coneIcon; } @Override @@ -65,8 +65,7 @@ public class BlockWorkingProjector extends BlockProjector { } @Override - public boolean canRenderInPass(final int pass) { - openblocks.client.renderer.block.BlockWorkingProjectorRenderer.renderPass = pass; + public boolean canRenderInPass(int pass) { return true; } } diff --git a/src/main/java/openblocks/common/tileentity/TileEntityProjector.java b/src/main/java/openblocks/common/tileentity/TileEntityProjector.java index 38b048e6..169ea05c 100644 --- a/src/main/java/openblocks/common/tileentity/TileEntityProjector.java +++ b/src/main/java/openblocks/common/tileentity/TileEntityProjector.java @@ -104,7 +104,7 @@ public class TileEntityProjector extends SyncedTileEntity implements IHasGui, II @Override public void validate() { super.validate(); - this.prevId = this.mapId(); + this.prevId = mapId(); inventory.onInventoryChanged(0); } @@ -156,15 +156,7 @@ public class TileEntityProjector extends SyncedTileEntity implements IHasGui, II } @Override - public boolean shouldRefresh(final Block oldBlock, - final Block newBlock, - final int oldMeta, - final int newMeta, - final World world, - final int x, - final int y, - final int z) { - + public boolean shouldRefresh(Block oldBlock, Block newBlock, int oldMeta, int newMeta, World world, int x, int y, int z) { return !((oldBlock == OpenBlocks.Blocks.projector && newBlock == OpenBlocks.Blocks.workingProjector) || (oldBlock == OpenBlocks.Blocks.workingProjector && newBlock == OpenBlocks.Blocks.projector)); } @@ -189,12 +181,6 @@ public class TileEntityProjector extends SyncedTileEntity implements IHasGui, II if (worldObj != null || mapId < 0) MapDataManager.instance.markDataUpdated(worldObj, mapId); } - @SuppressWarnings("unused") - public void fetchMap() { - int mapId = this.mapId.get(); - if (worldObj != null && mapId >= 0) MapDataManager.getMapData(worldObj, mapId); - } - @Override @IncludeInterface public IInventory getInventory() { From 76c34c146ae1b115f61e8d1631f3df4abce5d972 Mon Sep 17 00:00:00 2001 From: TheSilkMiner Date: Sun, 12 Jun 2016 11:53:59 +0200 Subject: [PATCH 26/54] Update mcmod.info to 1.7.X/1.8 format Now authors show up in the mod view. Signed-off by TheSilkMiner --- src/main/resources/mcmod.info | 49 ++++++++++++++++++++++------------- 1 file changed, 31 insertions(+), 18 deletions(-) diff --git a/src/main/resources/mcmod.info b/src/main/resources/mcmod.info index aa79c416..d53ceda2 100644 --- a/src/main/resources/mcmod.info +++ b/src/main/resources/mcmod.info @@ -1,20 +1,33 @@ -[ { - "modid" : "OpenBlocks", - "name" : "OpenBlocks", - "version" : "${version}", - "url" : "http://www.openperipheral.info", - "credits" : "", - "authors": [ - "Mikee", - "NeverCast", - "boq", - "Lyqyd" - ], - "description": "All the things you never thought you will ever need", - "logoFile" : "", - "updateUrl" : "", - "parent" : "", - "screenshots": [ + "modListVersion": "2", + "modList": + [ + { + "modid": "OpenBlocks", + "name": "OpenBlocks", + "description": "All the things you never thought you will ever need", + "version": "${version}", + "mcversion": "${MCVersion}", + "url": "http://openmods.info/", + "updateUrl": "", + "authorList": [ + "Mikee", + "NeverCast", + "boq", + "Lyqyd" + ], + "credits": "", + "logoFile": "", + "screenshots": [ + ], + "parent": "", + "requiredMods": [ + ], + "dependencies": [ + ], + "dependants": [ + ], + "useDependencyInformation": "false" + } ] -}] +} From 29e4f1a5dc3498abe08079fbd47bfa41d5eb912e Mon Sep 17 00:00:00 2001 From: Bartek Bok Date: Mon, 13 Jun 2016 20:07:41 +0200 Subject: [PATCH 27/54] Remove not needed fields from mcinfo, tweak build script --- build.gradle | 11 ++++++----- gradle.properties | 4 ++-- src/main/resources/mcmod.info | 11 ++--------- 3 files changed, 10 insertions(+), 16 deletions(-) diff --git a/build.gradle b/build.gradle index d799d0dd..2c1c8778 100644 --- a/build.gradle +++ b/build.gradle @@ -51,7 +51,7 @@ dependencies { // Grab system env ext.env = System.getenv() -version = mc_ver + "-" + mod_version +version = mc_version + "-" + mod_version ext.in_jenkins = false // Get Jenkins metadata @@ -95,14 +95,14 @@ if (env.BUILD_NUMBER != null) { // Get Git metadata (if in Jenkins) ext.gitManifest = manifest { - if (env.GIT_BRANCH != null) { + if (branch != null) { attributes("Git-Branch": branch, "Git-Hash": hash) } } // Setup Forge plugin minecraft { - version = mc_ver + "-" + forge_ver + version = mc_version + "-" + forge_version runDir = "eclipse/assets" replaceIn 'openblocks/OpenBlocks.java' @@ -116,12 +116,13 @@ minecraft { } processResources { - inputs.property "version", rootProject.mod_version + inputs.property "version", mod_version + inputs.property "mc_version", mc_version // Process mcmod.info from(sourceSets.main.resources.srcDirs) { include '**/*.info' - expand 'version':mod_version,'MCVersion':mc_ver + expand 'version':mod_version, 'mc_version':mc_version } // Copy anything else directly diff --git a/gradle.properties b/gradle.properties index bdb5997c..0c5976c2 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,5 +1,5 @@ mod_version=1.5.1 api_version=1.1 opc_api_version=3.4.1 -mc_ver=1.7.10 -forge_ver=10.13.4.1558-1.7.10 \ No newline at end of file +mc_version=1.7.10 +forge_version=10.13.4.1558-1.7.10 \ No newline at end of file diff --git a/src/main/resources/mcmod.info b/src/main/resources/mcmod.info index d53ceda2..8832f46b 100644 --- a/src/main/resources/mcmod.info +++ b/src/main/resources/mcmod.info @@ -7,7 +7,7 @@ "name": "OpenBlocks", "description": "All the things you never thought you will ever need", "version": "${version}", - "mcversion": "${MCVersion}", + "mcversion": "${mc_version}", "url": "http://openmods.info/", "updateUrl": "", "authorList": [ @@ -20,14 +20,7 @@ "logoFile": "", "screenshots": [ ], - "parent": "", - "requiredMods": [ - ], - "dependencies": [ - ], - "dependants": [ - ], - "useDependencyInformation": "false" + "parent": "" } ] } From e87f263f4cc298300f2da744d3dc21528067f5d9 Mon Sep 17 00:00:00 2001 From: Bartek Bok Date: Fri, 19 Aug 2016 20:32:45 +0200 Subject: [PATCH 28/54] Actually fix #555 --- OpenModsLib | 2 +- .../LastStandEnchantmentsHandler.java | 69 +++++++++---------- 2 files changed, 32 insertions(+), 39 deletions(-) diff --git a/OpenModsLib b/OpenModsLib index f372200f..9602042b 160000 --- a/OpenModsLib +++ b/OpenModsLib @@ -1 +1 @@ -Subproject commit f372200faa621c3b832786da01b7e33f6fdc555c +Subproject commit 9602042b4def67e2bccfd6bb88e88877df01370a diff --git a/src/main/java/openblocks/enchantments/LastStandEnchantmentsHandler.java b/src/main/java/openblocks/enchantments/LastStandEnchantmentsHandler.java index c17e6c19..ce78ee52 100644 --- a/src/main/java/openblocks/enchantments/LastStandEnchantmentsHandler.java +++ b/src/main/java/openblocks/enchantments/LastStandEnchantmentsHandler.java @@ -1,12 +1,10 @@ package openblocks.enchantments; -import cpw.mods.fml.common.eventhandler.EventPriority; import cpw.mods.fml.common.eventhandler.SubscribeEvent; import java.util.Map; import net.minecraft.enchantment.EnchantmentHelper; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; -import net.minecraftforge.event.entity.living.LivingHurtEvent; import openblocks.Config; import openblocks.OpenBlocks.Enchantments; import openmods.Log; @@ -16,6 +14,7 @@ import openmods.calc.Constant; import openmods.calc.IExecutable; import openmods.calc.types.fp.DoubleCalculator; import openmods.config.properties.ConfigurationChange; +import openmods.entity.PlayerDamageEvent; import openmods.utils.EnchantmentUtils; public class LastStandEnchantmentsHandler { @@ -47,55 +46,49 @@ public class LastStandEnchantmentsHandler { return xpRequired; } - @SubscribeEvent(priority = EventPriority.LOW) - public void onHurt(LivingHurtEvent e) { + @SubscribeEvent + public void onHurt(PlayerDamageEvent e) { + final int enchantmentLevels = countLastStandEnchantmentLevels(e.player); - if (e.entityLiving instanceof EntityPlayer) { - EntityPlayer player = (EntityPlayer)e.entityLiving; + if (enchantmentLevels > 0) { + final float playerHealth = e.player.getHealth(); + final float healthAvailable = playerHealth - e.amount; - final int enchantmentLevels = countLastStandEnchantmentLevels(player); + if (healthAvailable < 1f) { + final int xpAvailable = EnchantmentUtils.getPlayerXP(e.player); - if (enchantmentLevels > 0) { - final float playerHealth = player.getHealth(); - final float healthAvailable = playerHealth - e.ammount; - - if (healthAvailable < 1f) { - final int xpAvailable = EnchantmentUtils.getPlayerXP(player); - - float xpRequired = builtInFormula(healthAvailable, enchantmentLevels); - - if (!useBuiltIn) { - if (formula == null) { - try { - formula = reductionCalculator.compile(ExprType.INFIX, Config.lastStandEnchantmentFormula); - } catch (Exception ex) { - useBuiltIn = true; - Log.warn(ex, "Failed to compile formula %s", Config.lastStandEnchantmentFormula); - } - } - - reductionCalculator.setGlobalSymbol(VAR_ENCH_LEVEL, Constant.create(Double.valueOf(enchantmentLevels))); - reductionCalculator.setGlobalSymbol(VAR_PLAYER_XP, Constant.create(Double.valueOf(xpAvailable))); - reductionCalculator.setGlobalSymbol(VAR_PLAYER_HP, Constant.create(Double.valueOf(playerHealth))); - reductionCalculator.setGlobalSymbol(VAR_DAMAGE, Constant.create(Double.valueOf(e.ammount))); + float xpRequired = builtInFormula(healthAvailable, enchantmentLevels); + if (!useBuiltIn) { + if (formula == null) { try { - xpRequired = reductionCalculator.executeAndPop(formula).floatValue(); + formula = reductionCalculator.compile(ExprType.INFIX, Config.lastStandEnchantmentFormula); } catch (Exception ex) { useBuiltIn = true; - Log.warn(ex, "Failed to execute formula %s", Config.lastStandEnchantmentFormula); + Log.warn(ex, "Failed to compile formula %s", Config.lastStandEnchantmentFormula); } } - if (xpAvailable >= xpRequired) { - player.setHealth(1f); - EnchantmentUtils.addPlayerXP(player, -(int)xpRequired); - e.ammount = 0; - e.setCanceled(true); + reductionCalculator.setGlobalSymbol(VAR_ENCH_LEVEL, Constant.create(Double.valueOf(enchantmentLevels))); + reductionCalculator.setGlobalSymbol(VAR_PLAYER_XP, Constant.create(Double.valueOf(xpAvailable))); + reductionCalculator.setGlobalSymbol(VAR_PLAYER_HP, Constant.create(Double.valueOf(playerHealth))); + reductionCalculator.setGlobalSymbol(VAR_DAMAGE, Constant.create(Double.valueOf(e.amount))); + + try { + xpRequired = reductionCalculator.executeAndPop(formula).floatValue(); + } catch (Exception ex) { + useBuiltIn = true; + Log.warn(ex, "Failed to execute formula %s", Config.lastStandEnchantmentFormula); } } - } + if (xpAvailable >= xpRequired) { + e.player.setHealth(1f); + EnchantmentUtils.addPlayerXP(e.player, -(int)xpRequired); + e.amount = 0; + e.setCanceled(true); + } + } } } From a15ef1b7665603614eccdf4929c24a6dee09076a Mon Sep 17 00:00:00 2001 From: Bartek Bok Date: Sun, 21 Aug 2016 14:01:32 +0200 Subject: [PATCH 29/54] Small align to lib --- OpenModsLib | 2 +- src/main/java/openblocks/common/entity/EntityMiniMe.java | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/OpenModsLib b/OpenModsLib index 9602042b..9fafa7b9 160000 --- a/OpenModsLib +++ b/OpenModsLib @@ -1 +1 @@ -Subproject commit 9602042b4def67e2bccfd6bb88e88877df01370a +Subproject commit 9fafa7b9b16e1ec0d81e773443196c7bbead207c diff --git a/src/main/java/openblocks/common/entity/EntityMiniMe.java b/src/main/java/openblocks/common/entity/EntityMiniMe.java index c4f8a76c..5c9b2373 100644 --- a/src/main/java/openblocks/common/entity/EntityMiniMe.java +++ b/src/main/java/openblocks/common/entity/EntityMiniMe.java @@ -41,7 +41,6 @@ import openmods.Log; import openmods.api.VisibleForDocumentation; import openmods.network.event.EventDirection; import openmods.network.event.NetworkEvent; -import openmods.network.event.NetworkEventManager; import openmods.network.event.NetworkEventMeta; import openmods.utils.ByteUtils; import openmods.utils.io.GameProfileSerializer; @@ -179,7 +178,7 @@ public class EntityMiniMe extends EntityCreature implements IEntityAdditionalSpa } private void propagateOwnerChange() { - NetworkEventManager.INSTANCE.dispatcher().senders.entity.sendMessage(new OwnerChangeEvent(getEntityId(), owner), this); + new OwnerChangeEvent(getEntityId(), owner).sendToEntity(this); } private ResourceLocation getResourceLocation() { From 386715163ffb6c578a20f21325f221a2c9e269a0 Mon Sep 17 00:00:00 2001 From: Bartek Bok Date: Sat, 31 Dec 2016 17:08:20 +0100 Subject: [PATCH 30/54] Align to lib --- OpenModsLib | 2 +- .../LastStandEnchantmentsHandler.java | 19 +++++++++---------- 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/OpenModsLib b/OpenModsLib index 9fafa7b9..6e0bcc38 160000 --- a/OpenModsLib +++ b/OpenModsLib @@ -1 +1 @@ -Subproject commit 9fafa7b9b16e1ec0d81e773443196c7bbead207c +Subproject commit 6e0bcc385801693464d6871a4ebe97e9b265582b diff --git a/src/main/java/openblocks/enchantments/LastStandEnchantmentsHandler.java b/src/main/java/openblocks/enchantments/LastStandEnchantmentsHandler.java index ce78ee52..a832cb90 100644 --- a/src/main/java/openblocks/enchantments/LastStandEnchantmentsHandler.java +++ b/src/main/java/openblocks/enchantments/LastStandEnchantmentsHandler.java @@ -9,10 +9,9 @@ import openblocks.Config; import openblocks.OpenBlocks.Enchantments; import openmods.Log; import openmods.calc.Calculator; -import openmods.calc.Calculator.ExprType; -import openmods.calc.Constant; +import openmods.calc.ExprType; import openmods.calc.IExecutable; -import openmods.calc.types.fp.DoubleCalculator; +import openmods.calc.types.fp.DoubleCalculatorFactory; import openmods.config.properties.ConfigurationChange; import openmods.entity.PlayerDamageEvent; import openmods.utils.EnchantmentUtils; @@ -24,7 +23,7 @@ public class LastStandEnchantmentsHandler { private static final String VAR_PLAYER_HP = "hp"; private static final String VAR_DAMAGE = "dmg"; - private final Calculator reductionCalculator = new DoubleCalculator(); + private final Calculator reductionCalculator = DoubleCalculatorFactory.createSimple(); private boolean useBuiltIn; private IExecutable formula; @@ -62,20 +61,20 @@ public class LastStandEnchantmentsHandler { if (!useBuiltIn) { if (formula == null) { try { - formula = reductionCalculator.compile(ExprType.INFIX, Config.lastStandEnchantmentFormula); + formula = reductionCalculator.compilers.compile(ExprType.INFIX, Config.lastStandEnchantmentFormula); } catch (Exception ex) { useBuiltIn = true; Log.warn(ex, "Failed to compile formula %s", Config.lastStandEnchantmentFormula); } } - reductionCalculator.setGlobalSymbol(VAR_ENCH_LEVEL, Constant.create(Double.valueOf(enchantmentLevels))); - reductionCalculator.setGlobalSymbol(VAR_PLAYER_XP, Constant.create(Double.valueOf(xpAvailable))); - reductionCalculator.setGlobalSymbol(VAR_PLAYER_HP, Constant.create(Double.valueOf(playerHealth))); - reductionCalculator.setGlobalSymbol(VAR_DAMAGE, Constant.create(Double.valueOf(e.amount))); + reductionCalculator.environment.setGlobalSymbol(VAR_ENCH_LEVEL, Double.valueOf(enchantmentLevels)); + reductionCalculator.environment.setGlobalSymbol(VAR_PLAYER_XP, Double.valueOf(xpAvailable)); + reductionCalculator.environment.setGlobalSymbol(VAR_PLAYER_HP, Double.valueOf(playerHealth)); + reductionCalculator.environment.setGlobalSymbol(VAR_DAMAGE, Double.valueOf(e.amount)); try { - xpRequired = reductionCalculator.executeAndPop(formula).floatValue(); + xpRequired = reductionCalculator.environment.executeAndPop(formula).floatValue(); } catch (Exception ex) { useBuiltIn = true; Log.warn(ex, "Failed to execute formula %s", Config.lastStandEnchantmentFormula); From 7f93b92e7d6f100bda5ecb95b848ad23d0c23943 Mon Sep 17 00:00:00 2001 From: Bartek Bok Date: Sat, 21 Jan 2017 18:54:30 +0100 Subject: [PATCH 31/54] Reorganize tank render logic to prevent null world crash --- OpenModsLib | 2 +- .../tileentity/TileEntityTankRenderer.java | 4 +- .../tileentity/tank/DoubledCoords.java | 4 +- .../tileentity/tank/RenderConnection.java | 8 +- .../tileentity/tank/TankRenderLogic.java | 364 ++++++++++-------- .../common/tileentity/TileEntityTank.java | 10 +- 6 files changed, 222 insertions(+), 170 deletions(-) diff --git a/OpenModsLib b/OpenModsLib index 6e0bcc38..d512b40a 160000 --- a/OpenModsLib +++ b/OpenModsLib @@ -1 +1 @@ -Subproject commit 6e0bcc385801693464d6871a4ebe97e9b265582b +Subproject commit d512b40a98b377b8a908c16ffe24c20da8de1bed diff --git a/src/main/java/openblocks/client/renderer/tileentity/TileEntityTankRenderer.java b/src/main/java/openblocks/client/renderer/tileentity/TileEntityTankRenderer.java index 93d006d6..c4c54a30 100644 --- a/src/main/java/openblocks/client/renderer/tileentity/TileEntityTankRenderer.java +++ b/src/main/java/openblocks/client/renderer/tileentity/TileEntityTankRenderer.java @@ -29,9 +29,9 @@ public class TileEntityTankRenderer extends TileEntitySpecialRenderer { if (tankTile.isInvalid()) return; - ITankRenderFluidData data = tankTile.getRenderFluidData(); + final ITankRenderFluidData data = tankTile.getRenderFluidData(); - if (data.hasFluid()) { + if (data != null && data.hasFluid()) { bindTexture(TextureMap.locationBlocksTexture); GL11.glPushMatrix(); GL11.glTranslated(x, y, z); diff --git a/src/main/java/openblocks/client/renderer/tileentity/tank/DoubledCoords.java b/src/main/java/openblocks/client/renderer/tileentity/tank/DoubledCoords.java index 93f1ef04..bba8f873 100644 --- a/src/main/java/openblocks/client/renderer/tileentity/tank/DoubledCoords.java +++ b/src/main/java/openblocks/client/renderer/tileentity/tank/DoubledCoords.java @@ -22,13 +22,13 @@ public class DoubledCoords { this(2 * baseX + dir.offsetX, 2 * baseY + dir.offsetY, 2 * baseZ + dir.offsetZ); } - public boolean check(int baseX, int baseY, int baseZ, ForgeDirection dir) { + public boolean isSameAs(int baseX, int baseY, int baseZ, ForgeDirection dir) { return (x == 2 * baseX + dir.offsetX) && (y == 2 * baseY + dir.offsetY) && (z == 2 * baseZ + dir.offsetZ); } - public boolean check(int baseX, int baseY, int baseZ, Diagonal dir) { + public boolean isSameAs(int baseX, int baseY, int baseZ, Diagonal dir) { return (x == 2 * baseX + dir.offsetX) && (y == 2 * baseY + dir.offsetY) && (z == 2 * baseZ + dir.offsetZ); diff --git a/src/main/java/openblocks/client/renderer/tileentity/tank/RenderConnection.java b/src/main/java/openblocks/client/renderer/tileentity/tank/RenderConnection.java index 5aca7476..35c7889d 100644 --- a/src/main/java/openblocks/client/renderer/tileentity/tank/RenderConnection.java +++ b/src/main/java/openblocks/client/renderer/tileentity/tank/RenderConnection.java @@ -10,11 +10,11 @@ public class RenderConnection { this.coords = coords; } - public boolean check(int baseX, int baseY, int baseZ, ForgeDirection dir) { - return coords.check(baseX, baseY, baseZ, dir); + public boolean isPositionEqualTo(int baseX, int baseY, int baseZ, ForgeDirection dir) { + return coords.isSameAs(baseX, baseY, baseZ, dir); } - public boolean check(int baseX, int baseY, int baseZ, Diagonal dir) { - return coords.check(baseX, baseY, baseZ, dir); + public boolean isPositionEqualTo(int baseX, int baseY, int baseZ, Diagonal dir) { + return coords.isSameAs(baseX, baseY, baseZ, dir); } } \ No newline at end of file diff --git a/src/main/java/openblocks/client/renderer/tileentity/tank/TankRenderLogic.java b/src/main/java/openblocks/client/renderer/tileentity/tank/TankRenderLogic.java index 4dda6e18..029e8f6d 100644 --- a/src/main/java/openblocks/client/renderer/tileentity/tank/TankRenderLogic.java +++ b/src/main/java/openblocks/client/renderer/tileentity/tank/TankRenderLogic.java @@ -10,7 +10,167 @@ import openblocks.common.tileentity.TileEntityTank; import openmods.liquids.GenericTank; import openmods.utils.Diagonal; -public class TankRenderLogic implements ITankConnections, ITankRenderFluidData { +public class TankRenderLogic { + + private static class TankConnections implements ITankConnections { + + private final GenericTank tank; + + private final Map diagonalConnections; + + private final Map horizontalConnections; + + private final VerticalConnection topConnection; + + private final VerticalConnection bottomConnection; + + public TankConnections(GenericTank tank, Map diagonalConnections, Map horizontalConnections, VerticalConnection topConnection, VerticalConnection bottomConnection) { + this.tank = tank; + this.diagonalConnections = diagonalConnections; + this.horizontalConnections = horizontalConnections; + this.topConnection = topConnection; + this.bottomConnection = bottomConnection; + } + + @Override + public VerticalConnection getTopConnection() { + return topConnection; + } + + @Override + public VerticalConnection getBottomConnection() { + return bottomConnection; + } + + @Override + public HorizontalConnection getHorizontalConnection(ForgeDirection dir) { + return horizontalConnections.get(dir); + } + + @Override + public DiagonalConnection getDiagonalConnection(Diagonal dir) { + return diagonalConnections.get(dir); + } + + public void updateFluid(FluidStack fluidStack) { + for (Map.Entry e : diagonalConnections.entrySet()) + e.getValue().updateFluid(e.getKey().getOpposite(), fluidStack); + + for (Map.Entry e : horizontalConnections.entrySet()) + e.getValue().updateFluid(e.getKey().getOpposite(), fluidStack); + + topConnection.updateBottomFluid(fluidStack, tank.getSpace() == 0); + bottomConnection.updateTopFluid(fluidStack); + } + + private static boolean checkConsistency(RenderConnection connection, int x, int y, int z, ForgeDirection dir) { + return connection != null && connection.isPositionEqualTo(x, y, z, dir); + } + + private static boolean checkConsistency(RenderConnection connection, int x, int y, int z, Diagonal dir) { + return connection != null && connection.isPositionEqualTo(x, y, z, dir); + } + + private boolean checkHorizontalConsistency(int x, int y, int z, ForgeDirection dir) { + return checkConsistency(horizontalConnections.get(dir), x, y, z, dir); + } + + private boolean checkDiagonalConsistency(int x, int y, int z, Diagonal dir) { + return checkConsistency(diagonalConnections.get(dir), x, y, z, dir); + } + + public boolean checkConsistency(int x, int y, int z) { + return checkConsistency(topConnection, x, y, z, ForgeDirection.UP) && + checkConsistency(bottomConnection, x, y, z, ForgeDirection.DOWN) && + checkHorizontalConsistency(x, y, z, ForgeDirection.NORTH) && + checkHorizontalConsistency(x, y, z, ForgeDirection.SOUTH) && + checkHorizontalConsistency(x, y, z, ForgeDirection.EAST) && + checkHorizontalConsistency(x, y, z, ForgeDirection.WEST) && + checkDiagonalConsistency(x, y, z, Diagonal.NE) && + checkDiagonalConsistency(x, y, z, Diagonal.NW) && + checkDiagonalConsistency(x, y, z, Diagonal.SE) && + checkDiagonalConsistency(x, y, z, Diagonal.SW); + } + + public void detach() { + for (Map.Entry e : diagonalConnections.entrySet()) + e.getValue().clearFluid(e.getKey().getOpposite()); + + for (Map.Entry e : horizontalConnections.entrySet()) + e.getValue().clearFluid(e.getKey().getOpposite()); + + if (topConnection != null) { + topConnection.clearBottomFluid(); + } + + if (bottomConnection != null) { + bottomConnection.clearTopFluid(); + } + } + + } + + private static class TankRenderFluidData implements ITankRenderFluidData { + + private final TankConnections connections; + + private final GenericTank tank; + + private final float phase; + + public TankRenderFluidData(TankConnections connections, GenericTank tank, float phase) { + this.connections = connections; + this.tank = tank; + this.phase = phase; + } + + private static boolean isConnected(GridConnection connection) { + return connection != null? connection.isConnected() : false; + } + + @Override + public boolean shouldRenderFluidWall(ForgeDirection side) { + switch (side) { + case DOWN: + return !isConnected(connections.getBottomConnection()); + case UP: + return !isConnected(connections.getTopConnection()); + case EAST: + case WEST: + case NORTH: + case SOUTH: { + return !isConnected(connections.getHorizontalConnection(side)); + } + default: + return true; + } + } + + @Override + public boolean hasFluid() { + return tank.getFluidAmount() > 0; + } + + @Override + public FluidStack getFluid() { + return tank.getFluid(); + } + + @Override + public float getCenterFluidLevel(float time) { + final float raw = (float)tank.getFluidAmount() / tank.getCapacity(); + final float waving = TankRenderUtils.calculateWaveAmplitude(time, phase) + raw; + return TankRenderUtils.clampLevel(waving); + } + + @Override + public float getCornerFluidLevel(Diagonal corner, float time) { + final DiagonalConnection diagonal = connections.getDiagonalConnection(corner); + return diagonal != null? diagonal.getRenderHeight(corner.getOpposite(), time) : getCenterFluidLevel(time); + } + } + + private final GenericTank tank; private int x; @@ -20,26 +180,14 @@ public class TankRenderLogic implements ITankConnections, ITankRenderFluidData { private World world; - private final GenericTank tank; + private TankConnections connections; - private final Map diagonalConnections = Maps.newEnumMap(Diagonal.class); - - private final Map horizontalConnections = Maps.newEnumMap(ForgeDirection.class); - - private VerticalConnection topConnection; - - private VerticalConnection bottomConnection; - - private float phase; + private TankRenderFluidData renderData; public TankRenderLogic(GenericTank tank) { this.tank = tank; } - private static boolean isConnected(GridConnection connection) { - return connection != null? connection.isConnected() : false; - } - private DoubledCoords createCoords(ForgeDirection dir) { return new DoubledCoords(x, y, z, dir); } @@ -50,7 +198,7 @@ public class TankRenderLogic implements ITankConnections, ITankRenderFluidData { private ITankConnections getNeighbourTank(int x, int y, int z) { TileEntity te = TankRenderUtils.getTileEntitySafe(world, x, y, z); - return (te instanceof TileEntityTank)? ((TileEntityTank)te).getRenderConnectionsData() : null; + return (te instanceof TileEntityTank)? ((TileEntityTank)te).getTankConnections() : null; } private ITankConnections getNeighbourTank(ForgeDirection dir) { @@ -76,25 +224,25 @@ public class TankRenderLogic implements ITankConnections, ITankRenderFluidData { return new DiagonalConnection(TankRenderUtils.calculatePhase(x, y, z, start), createCoords(start)); } - private void tryCornerConnection(ITankConnections tankCW, ITankConnections tankD, ITankConnections tankCCW, Diagonal dir) { + private void tryCornerConnection(Map diagonalConnections, ITankConnections tankCW, ITankConnections tankD, ITankConnections tankCCW, Diagonal dir) { final DiagonalConnection connection = selectDiagonalConnection(tankCW, tankD, tankCCW, dir); diagonalConnections.put(dir, connection); } - private void tryHorizontalConnection(ITankConnections neighbour, ForgeDirection dir) { + private void tryHorizontalConnection(Map horizontalConnections, ITankConnections neighbour, ForgeDirection dir) { final HorizontalConnection connection = (neighbour != null)? neighbour.getHorizontalConnection(dir.getOpposite()) : new HorizontalConnection(createCoords(dir)); horizontalConnections.put(dir, connection); } - private void tryBottomConnection(ITankConnections neighbour) { - bottomConnection = neighbour != null? neighbour.getTopConnection() : new VerticalConnection(createCoords(ForgeDirection.DOWN)); + private VerticalConnection tryBottomConnection(ITankConnections neighbour) { + return neighbour != null? neighbour.getTopConnection() : new VerticalConnection(createCoords(ForgeDirection.DOWN)); } - private void tryTopConnection(ITankConnections neighbour) { - topConnection = neighbour != null? neighbour.getBottomConnection() : new VerticalConnection(createCoords(ForgeDirection.UP)); + private VerticalConnection tryTopConnection(ITankConnections neighbour) { + return neighbour != null? neighbour.getBottomConnection() : new VerticalConnection(createCoords(ForgeDirection.UP)); } - public void updateConnections() { + private TankConnections updateConnections() { final ITankConnections tankN = getNeighbourTank(ForgeDirection.NORTH); final ITankConnections tankS = getNeighbourTank(ForgeDirection.SOUTH); final ITankConnections tankW = getNeighbourTank(ForgeDirection.WEST); @@ -108,161 +256,65 @@ public class TankRenderLogic implements ITankConnections, ITankRenderFluidData { final ITankConnections tankT = getNeighbourTank(ForgeDirection.UP); final ITankConnections tankB = getNeighbourTank(ForgeDirection.DOWN); - tryTopConnection(tankT); - tryBottomConnection(tankB); + final VerticalConnection topConnection = tryTopConnection(tankT); + final VerticalConnection bottomConnection = tryBottomConnection(tankB); - tryHorizontalConnection(tankN, ForgeDirection.NORTH); - tryHorizontalConnection(tankS, ForgeDirection.SOUTH); - tryHorizontalConnection(tankW, ForgeDirection.WEST); - tryHorizontalConnection(tankE, ForgeDirection.EAST); + final Map diagonalConnections = Maps.newEnumMap(Diagonal.class); - tryCornerConnection(tankN, tankNW, tankW, Diagonal.NW); - tryCornerConnection(tankW, tankSW, tankS, Diagonal.SW); - tryCornerConnection(tankE, tankNE, tankN, Diagonal.NE); - tryCornerConnection(tankS, tankSE, tankE, Diagonal.SE); + final Map horizontalConnections = Maps.newEnumMap(ForgeDirection.class); + + tryHorizontalConnection(horizontalConnections, tankN, ForgeDirection.NORTH); + tryHorizontalConnection(horizontalConnections, tankS, ForgeDirection.SOUTH); + tryHorizontalConnection(horizontalConnections, tankW, ForgeDirection.WEST); + tryHorizontalConnection(horizontalConnections, tankE, ForgeDirection.EAST); + + tryCornerConnection(diagonalConnections, tankN, tankNW, tankW, Diagonal.NW); + tryCornerConnection(diagonalConnections, tankW, tankSW, tankS, Diagonal.SW); + tryCornerConnection(diagonalConnections, tankE, tankNE, tankN, Diagonal.NE); + tryCornerConnection(diagonalConnections, tankS, tankSE, tankE, Diagonal.SE); + + return new TankConnections(tank, diagonalConnections, horizontalConnections, topConnection, bottomConnection); } public void initialize(World world, int x, int y, int z) { - this.phase = TankRenderUtils.calculatePhase(x, y, z); - this.world = world; this.x = x; this.y = y; this.z = z; - updateConnections(); - } + if (this.connections != null) connections.detach(); - public void clearConnections() { - for (Map.Entry e : diagonalConnections.entrySet()) - e.getValue().clearFluid(e.getKey().getOpposite()); - - diagonalConnections.clear(); - - for (Map.Entry e : horizontalConnections.entrySet()) - e.getValue().clearFluid(e.getKey().getOpposite()); - - horizontalConnections.clear(); - - if (topConnection != null) { - topConnection.clearBottomFluid(); - topConnection = null; - } - - if (bottomConnection != null) { - bottomConnection.clearTopFluid(); - bottomConnection = null; + if (world == null) { + this.connections = null; + this.renderData = null; + } else { + float phase = TankRenderUtils.calculatePhase(x, y, z); + this.connections = updateConnections(); + this.renderData = new TankRenderFluidData(connections, tank, phase); } } - private boolean checkConnection(RenderConnection connection, ForgeDirection dir) { - return connection == null || !connection.check(x, y, z, dir); + public void validateConnections(World world, int x, int y, int z) { + if (world != this.world || connections == null || !connections.checkConsistency(x, y, z)) + initialize(world, x, y, z); } - private boolean checkConnection(RenderConnection connection, Diagonal dir) { - return connection == null || !connection.check(x, y, z, dir); + public void invalidateConnections() { + if (this.connections != null) connections.detach(); + this.connections = null; + this.renderData = null; } - private boolean checkHorizontalConnection(ForgeDirection dir) { - return checkConnection(horizontalConnections.get(dir), dir); + public void updateFluid(FluidStack stack) { + if (connections != null) connections.updateFluid(stack); } - private boolean checkDiagonalConnection(Diagonal dir) { - return checkConnection(diagonalConnections.get(dir), dir); + public ITankRenderFluidData getTankRenderData() { + return renderData; } - private boolean checkConnections() { - return checkConnection(topConnection, ForgeDirection.UP) || - checkConnection(bottomConnection, ForgeDirection.DOWN) || - checkConnection(topConnection, ForgeDirection.UP) || - checkHorizontalConnection(ForgeDirection.NORTH) || - checkHorizontalConnection(ForgeDirection.SOUTH) || - checkHorizontalConnection(ForgeDirection.EAST) || - checkHorizontalConnection(ForgeDirection.WEST) || - checkDiagonalConnection(Diagonal.NE) || - checkDiagonalConnection(Diagonal.NW) || - checkDiagonalConnection(Diagonal.SE) || - checkDiagonalConnection(Diagonal.SW); - - } - - public void validateConnections() { - if (checkConnections()) { - clearConnections(); - updateConnections(); - } - } - - public void updateFluid(FluidStack fluidStack) { - for (Map.Entry e : diagonalConnections.entrySet()) - e.getValue().updateFluid(e.getKey().getOpposite(), fluidStack); - - for (Map.Entry e : horizontalConnections.entrySet()) - e.getValue().updateFluid(e.getKey().getOpposite(), fluidStack); - - topConnection.updateBottomFluid(fluidStack, tank.getSpace() == 0); - bottomConnection.updateTopFluid(fluidStack); - } - - @Override - public boolean shouldRenderFluidWall(ForgeDirection side) { - switch (side) { - case DOWN: - return !isConnected(bottomConnection); - case UP: - return !isConnected(topConnection); - case EAST: - case WEST: - case NORTH: - case SOUTH: { - return !isConnected(horizontalConnections.get(side)); - } - default: - return true; - } - } - - @Override - public boolean hasFluid() { - return tank.getFluidAmount() > 0; - } - - @Override - public FluidStack getFluid() { - return tank.getFluid(); - } - - @Override - public float getCenterFluidLevel(float time) { - final float raw = (float)tank.getFluidAmount() / tank.getCapacity(); - final float waving = TankRenderUtils.calculateWaveAmplitude(time, phase) + raw; - return TankRenderUtils.clampLevel(waving); - } - - @Override - public float getCornerFluidLevel(Diagonal corner, float time) { - final DiagonalConnection diagonal = diagonalConnections.get(corner); - return diagonal != null? diagonal.getRenderHeight(corner.getOpposite(), time) : getCenterFluidLevel(time); - } - - @Override - public VerticalConnection getTopConnection() { - return topConnection; - } - - @Override - public VerticalConnection getBottomConnection() { - return bottomConnection; - } - - @Override - public HorizontalConnection getHorizontalConnection(ForgeDirection dir) { - return horizontalConnections.get(dir); - } - - @Override - public DiagonalConnection getDiagonalConnection(Diagonal dir) { - return diagonalConnections.get(dir); + public ITankConnections getTankConnections() { + return connections; } } diff --git a/src/main/java/openblocks/common/tileentity/TileEntityTank.java b/src/main/java/openblocks/common/tileentity/TileEntityTank.java index 5d63d64d..daafa567 100644 --- a/src/main/java/openblocks/common/tileentity/TileEntityTank.java +++ b/src/main/java/openblocks/common/tileentity/TileEntityTank.java @@ -86,7 +86,7 @@ public class TileEntityTank extends SyncedTileEntity implements IActivateAwareTi @Override public void invalidate() { super.invalidate(); - if (worldObj.isRemote) renderLogic.clearConnections(); + if (worldObj.isRemote) renderLogic.invalidateConnections(); } protected TileEntityTank getNeighourTank(final int x, final int y, final int z) { @@ -156,11 +156,11 @@ public class TileEntityTank extends SyncedTileEntity implements IActivateAwareTi } public ITankRenderFluidData getRenderFluidData() { - return renderLogic; + return renderLogic.getTankRenderData(); } - public ITankConnections getRenderConnectionsData() { - return renderLogic; + public ITankConnections getTankConnections() { + return renderLogic.getTankConnections(); } public boolean accepts(FluidStack liquid) { @@ -306,7 +306,7 @@ public class TileEntityTank extends SyncedTileEntity implements IActivateAwareTi worldObj.notifyBlocksOfNeighborChange(xCoord, yCoord, zCoord, getBlockType()); } - if (worldObj.isRemote) renderLogic.validateConnections(); + if (worldObj.isRemote) renderLogic.validateConnections(worldObj, xCoord, yCoord, zCoord); } private void tryGetNeighbor(List result, FluidStack fluid, ForgeDirection side) { From 6ce7d61ae312c75a6afebf3f3ee3edf8caee9b39 Mon Sep 17 00:00:00 2001 From: Bartek Bok Date: Sat, 21 Jan 2017 18:59:05 +0100 Subject: [PATCH 32/54] Fix few issues from static analysis --- OpenModsLib | 2 +- src/main/java/openblocks/client/model/ModelPaintMixer.java | 2 +- src/main/java/openblocks/client/model/ModelSleepingBag.java | 2 +- src/main/java/openblocks/client/model/ModelTarget.java | 4 ++-- src/main/java/openblocks/common/CommandInventory.java | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/OpenModsLib b/OpenModsLib index d512b40a..a08dd513 160000 --- a/OpenModsLib +++ b/OpenModsLib @@ -1 +1 @@ -Subproject commit d512b40a98b377b8a908c16ffe24c20da8de1bed +Subproject commit a08dd513bca0ad9446414e65f3b88e336c26d6f2 diff --git a/src/main/java/openblocks/client/model/ModelPaintMixer.java b/src/main/java/openblocks/client/model/ModelPaintMixer.java index d492328f..23157924 100644 --- a/src/main/java/openblocks/client/model/ModelPaintMixer.java +++ b/src/main/java/openblocks/client/model/ModelPaintMixer.java @@ -29,7 +29,7 @@ public class ModelPaintMixer extends ModelBase { right.setRotationPoint(0F, 0F, 0F); right.setTextureSize(64, 64); right.mirror = true; - setRotation(right, 0F, 3.141593F, 0F); + setRotation(right, 0F, (float)Math.PI, 0F); left = new ModelRenderer(this, 0, 36); left.addBox(-6F, 0F, -6F, 1, 16, 12); left.setRotationPoint(0F, 0F, 0F); diff --git a/src/main/java/openblocks/client/model/ModelSleepingBag.java b/src/main/java/openblocks/client/model/ModelSleepingBag.java index baa35a1e..58534f9f 100644 --- a/src/main/java/openblocks/client/model/ModelSleepingBag.java +++ b/src/main/java/openblocks/client/model/ModelSleepingBag.java @@ -27,7 +27,7 @@ public class ModelSleepingBag extends ModelBiped { pillow.setRotationPoint(0F, 0F, 3F); pillow.setTextureSize(128, 64); pillow.mirror = true; - setRotation(pillow, 0F, 0F, 1.570796F); + setRotation(pillow, 0F, 0F, (float)(Math.PI / 2)); } private static void setRotation(ModelRenderer model, float x, float y, float z) { diff --git a/src/main/java/openblocks/client/model/ModelTarget.java b/src/main/java/openblocks/client/model/ModelTarget.java index b2d40fc2..8a49a0a8 100644 --- a/src/main/java/openblocks/client/model/ModelTarget.java +++ b/src/main/java/openblocks/client/model/ModelTarget.java @@ -20,7 +20,7 @@ public class ModelTarget extends ModelBase { stand1.setRotationPoint(0F, 15F, 0F); stand1.setTextureSize(64, 32); stand1.mirror = true; - setRotation(stand1, 0F, 1.570796F, 0F); + setRotation(stand1, 0F, (float)(Math.PI / 2), 0F); target = new ModelRenderer(this, 0, 0); target.addBox(-8F, -15F, -1F, 16, 15, 1); target.setRotationPoint(0F, 15F, -7F); @@ -32,7 +32,7 @@ public class ModelTarget extends ModelBase { stand2.setRotationPoint(0F, 15F, 0F); stand2.setTextureSize(64, 32); stand2.mirror = true; - setRotation(stand2, 0F, 1.570796F, 0F); + setRotation(stand2, 0F, (float)(Math.PI / 2), 0F); } public void render(TileEntity te, float f) { diff --git a/src/main/java/openblocks/common/CommandInventory.java b/src/main/java/openblocks/common/CommandInventory.java index 2b12ae0e..2e76d0c5 100644 --- a/src/main/java/openblocks/common/CommandInventory.java +++ b/src/main/java/openblocks/common/CommandInventory.java @@ -99,7 +99,7 @@ public class CommandInventory implements ICommand { if (args.length != 2 && args.length != 3 && args.length != 4) throw new SyntaxErrorException(); final String id = args[1]; - final String target = (args.length > 1)? args[2] : ID_MAIN_INVENTORY; + final String target = (args.length > 2)? args[2] : ID_MAIN_INVENTORY; LoadedInventories loadedInventories = loadInventories(sender, id); if (loadedInventories == null) throw new CommandException("openblocks.misc.cant_restore_inventory"); From 767b3f2c44d5972fc394f7deb97b565d51dacd40 Mon Sep 17 00:00:00 2001 From: Bartek Bok Date: Sat, 21 Jan 2017 19:24:12 +0100 Subject: [PATCH 33/54] Limit grave spawn height to prevent spawning in bedrock --- src/main/java/openblocks/Config.java | 8 ++++++-- src/main/java/openblocks/common/PlayerDeathHandler.java | 6 +++--- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/main/java/openblocks/Config.java b/src/main/java/openblocks/Config.java index 0c4a29d6..67e5e3aa 100644 --- a/src/main/java/openblocks/Config.java +++ b/src/main/java/openblocks/Config.java @@ -224,8 +224,12 @@ public class Config { public static boolean graveBase = true; @OnLineModifiable - @ConfigProperty(category = "graves", name = "voidFix", comment = "Should grave try to spawn when player died by falling into void? (false -> legacy behaviour)") - public static boolean voidGraves = true; + @ConfigProperty(category = "graves", name = "minimalPosY", comment = "Minimal height where grave should be spawned (default value selected to prevent spawning in bedrock)") + public static int minGraveY = 6; + + @OnLineModifiable + @ConfigProperty(category = "graves", name = "maximalPosY", comment = "Maximal height where grave should be spawned (default value selected to prevent spawning in bedrock)") + public static int maxGraveY = 255 - 6; @ConfigProperty(category = "features", name = "explosiveEnchantmentId", comment = "Id of explosive enchantment") public static int explosiveEnchantmentId = 211; diff --git a/src/main/java/openblocks/common/PlayerDeathHandler.java b/src/main/java/openblocks/common/PlayerDeathHandler.java index 6b3e0b49..98ba56a5 100644 --- a/src/main/java/openblocks/common/PlayerDeathHandler.java +++ b/src/main/java/openblocks/common/PlayerDeathHandler.java @@ -255,13 +255,13 @@ public class PlayerDeathHandler { } private Coord findLocation(World world, EntityPlayer player, GravePlacementChecker checker) { - final int correctedY = Config.voidGraves? Math.max(posY, 1) : posY; - + final int limitedPosY = Math.min(Math.max(posY, Config.minGraveY), Config.maxGraveY); final int searchSize = Config.graveSpawnRange / 2; for (Coord c : getSearchOrder(searchSize)) { + final int y = limitedPosY + c.y; + if (y > Config.maxGraveY || y < Config.minGraveY) continue; final int x = posX + c.x; - final int y = correctedY + c.y; final int z = posZ + c.z; if (checker.canPlace(world, player, x, y, z)) return new Coord(x, y, z); } From 940569f998bc4e6b32423a02753f4fcf16519736 Mon Sep 17 00:00:00 2001 From: Bartek Bok Date: Sat, 21 Jan 2017 21:08:15 +0100 Subject: [PATCH 34/54] More protection for luggage --- src/main/java/openblocks/common/entity/EntityLuggage.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/openblocks/common/entity/EntityLuggage.java b/src/main/java/openblocks/common/entity/EntityLuggage.java index 506ea76b..227075ff 100644 --- a/src/main/java/openblocks/common/entity/EntityLuggage.java +++ b/src/main/java/openblocks/common/entity/EntityLuggage.java @@ -216,6 +216,11 @@ public class EntityLuggage extends EntityTameable implements IInventoryProvider, return true; } + @Override + public void setHealth(float health) { + // NO-OP + } + @Override protected boolean canDespawn() { return false; From 3d723ab6c7a1b968085e2c6922f3e331c646b3f0 Mon Sep 17 00:00:00 2001 From: Bartek Bok Date: Sat, 21 Jan 2017 22:52:25 +0100 Subject: [PATCH 35/54] Change projector rendering (less glitches and simpler porting) --- OpenModsLib | 2 +- src/main/java/openblocks/Config.java | 5 -- .../java/openblocks/NEIOpenBlocksConfig.java | 4 -- src/main/java/openblocks/OpenBlocks.java | 4 -- .../java/openblocks/client/ClientProxy.java | 4 +- ...derer.java => BlockProjectorRenderer.java} | 33 +++++++-- .../common/block/BlockProjector.java | 51 ++++++++----- .../common/block/BlockWorkingProjector.java | 71 ------------------- .../tileentity/TileEntityProjector.java | 33 +++------ 9 files changed, 72 insertions(+), 135 deletions(-) rename src/main/java/openblocks/client/renderer/block/{BlockWorkingProjectorRenderer.java => BlockProjectorRenderer.java} (73%) delete mode 100644 src/main/java/openblocks/common/block/BlockWorkingProjector.java diff --git a/OpenModsLib b/OpenModsLib index a08dd513..5479dc24 160000 --- a/OpenModsLib +++ b/OpenModsLib @@ -1 +1 @@ -Subproject commit a08dd513bca0ad9446414e65f3b88e336c26d6f2 +Subproject commit 5479dc24b72f185001ffdfdcffa54650b03c8d12 diff --git a/src/main/java/openblocks/Config.java b/src/main/java/openblocks/Config.java index 67e5e3aa..593c034b 100644 --- a/src/main/java/openblocks/Config.java +++ b/src/main/java/openblocks/Config.java @@ -756,10 +756,5 @@ public class Config { } } - - // Avoid crashes whenever lit projector is deactivated - TSM - if (OpenBlocks.Blocks.workingProjector == null) { - Config.litWhenDisplayingMap = false; - } } } diff --git a/src/main/java/openblocks/NEIOpenBlocksConfig.java b/src/main/java/openblocks/NEIOpenBlocksConfig.java index 08bee7c2..0b6db9d2 100644 --- a/src/main/java/openblocks/NEIOpenBlocksConfig.java +++ b/src/main/java/openblocks/NEIOpenBlocksConfig.java @@ -20,10 +20,6 @@ public class NEIOpenBlocksConfig implements IConfigureNEI { API$hideItem(new ItemStack(OpenBlocks.Blocks.canvasGlass)); } - if (OpenBlocks.Blocks.workingProjector != null) { - API$hideItem(new ItemStack(OpenBlocks.Blocks.workingProjector)); - } - if (OpenBlocks.Items.heightMap != null) { API$hideItem(new ItemStack(OpenBlocks.Items.heightMap, 1, OreDictionary.WILDCARD_VALUE)); } diff --git a/src/main/java/openblocks/OpenBlocks.java b/src/main/java/openblocks/OpenBlocks.java index 514c2739..8f1d7f5b 100644 --- a/src/main/java/openblocks/OpenBlocks.java +++ b/src/main/java/openblocks/OpenBlocks.java @@ -85,7 +85,6 @@ import openblocks.common.block.BlockTarget; import openblocks.common.block.BlockTrophy; import openblocks.common.block.BlockVacuumHopper; import openblocks.common.block.BlockVillageHighlighter; -import openblocks.common.block.BlockWorkingProjector; import openblocks.common.block.BlockXPBottler; import openblocks.common.block.BlockXPDrain; import openblocks.common.block.BlockXPShower; @@ -346,9 +345,6 @@ public class OpenBlocks { @RegisterBlock(name = "projector", tileEntity = TileEntityProjector.class, textureName = RegisterBlock.NONE) public static BlockProjector projector; - @RegisterBlock(name = "projector.working", tileEntity = TileEntityProjector.class, textureName = RegisterBlock.NONE) - public static BlockWorkingProjector workingProjector; - @RegisterBlock(name = "drawingtable", tileEntity = TileEntityDrawingTable.class) public static BlockDrawingTable drawingTable; diff --git a/src/main/java/openblocks/client/ClientProxy.java b/src/main/java/openblocks/client/ClientProxy.java index fdb31195..e34af6bc 100644 --- a/src/main/java/openblocks/client/ClientProxy.java +++ b/src/main/java/openblocks/client/ClientProxy.java @@ -26,10 +26,10 @@ import openblocks.client.renderer.block.BlockCanvasRenderer; import openblocks.client.renderer.block.BlockGuideRenderer; import openblocks.client.renderer.block.BlockPaintCanRenderer; import openblocks.client.renderer.block.BlockPathRenderer; +import openblocks.client.renderer.block.BlockProjectorRenderer; import openblocks.client.renderer.block.BlockRopeLadderRenderer; import openblocks.client.renderer.block.BlockSkyRenderer; import openblocks.client.renderer.block.BlockTankRenderer; -import openblocks.client.renderer.block.BlockWorkingProjectorRenderer; import openblocks.client.renderer.entity.EntityCartographerRenderer; import openblocks.client.renderer.entity.EntityGoldenEyeRenderer; import openblocks.client.renderer.entity.EntityHangGliderRenderer; @@ -173,7 +173,7 @@ public class ClientProxy implements IOpenBlocksProxy { blockRenderingHandler.addRenderer(OpenBlocks.Blocks.builderGuide, guideBlockRenderer); } - blockRenderingHandler.addRenderer(OpenBlocks.Blocks.workingProjector, new BlockWorkingProjectorRenderer()); + blockRenderingHandler.addRenderer(OpenBlocks.Blocks.projector, new BlockProjectorRenderer()); RenderingRegistry.registerBlockHandler(blockRenderingHandler); } diff --git a/src/main/java/openblocks/client/renderer/block/BlockWorkingProjectorRenderer.java b/src/main/java/openblocks/client/renderer/block/BlockProjectorRenderer.java similarity index 73% rename from src/main/java/openblocks/client/renderer/block/BlockWorkingProjectorRenderer.java rename to src/main/java/openblocks/client/renderer/block/BlockProjectorRenderer.java index 4840178a..a1a63c8c 100644 --- a/src/main/java/openblocks/client/renderer/block/BlockWorkingProjectorRenderer.java +++ b/src/main/java/openblocks/client/renderer/block/BlockProjectorRenderer.java @@ -2,14 +2,20 @@ package openblocks.client.renderer.block; import net.minecraft.client.renderer.RenderBlocks; import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; +import net.minecraft.tileentity.TileEntity; import net.minecraft.util.IIcon; import net.minecraft.world.IBlockAccess; import net.minecraftforge.client.ForgeHooksClient; import openblocks.Config; -import openblocks.common.block.BlockWorkingProjector; +import openblocks.common.block.BlockProjector; import openmods.renderer.IBlockRenderer; +import openmods.tileentity.OpenTileEntity; +import openmods.utils.ByteUtils; +import openmods.utils.render.RenderUtils; +import org.lwjgl.opengl.GL11; -public class BlockWorkingProjectorRenderer implements IBlockRenderer { +public class BlockProjectorRenderer implements IBlockRenderer { private static final float TO_BLOCK_CENTRE = 0.5F; private static final int BRIGHTNESS_LEVEL_MAX = 255; @@ -19,13 +25,27 @@ public class BlockWorkingProjectorRenderer implements IBlockRenderer= 0? super.getIcon(world, x, y, z, side) : this.coneIcon; - } - - @Override - public int getRenderBlockPass() { - return 1; - } - - @Override - public boolean canRenderInPass(int pass) { - return true; - } -} diff --git a/src/main/java/openblocks/common/tileentity/TileEntityProjector.java b/src/main/java/openblocks/common/tileentity/TileEntityProjector.java index 169ea05c..3285c963 100644 --- a/src/main/java/openblocks/common/tileentity/TileEntityProjector.java +++ b/src/main/java/openblocks/common/tileentity/TileEntityProjector.java @@ -3,15 +3,12 @@ package openblocks.common.tileentity; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import java.util.Set; -import net.minecraft.block.Block; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.IInventory; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.AxisAlignedBB; -import net.minecraft.world.World; -import openblocks.OpenBlocks; import openblocks.client.gui.GuiProjector; import openblocks.common.HeightMapData; import openblocks.common.MapDataManager; @@ -30,11 +27,11 @@ import openmods.sync.ISyncableObject; import openmods.sync.SyncableByte; import openmods.sync.SyncableInt; import openmods.tileentity.SyncedTileEntity; +import openmods.utils.BlockNotifyFlags; +import openmods.utils.ByteUtils; public class TileEntityProjector extends SyncedTileEntity implements IHasGui, IInventoryProvider, ISyncListener, IRotatable { - private int prevId = -1; - private final GenericInventory inventory = new TileEntityInventory(this, "openblocks.projector", false, 1) { @Override public boolean isItemValidForSlot(int i, ItemStack stack) { @@ -67,14 +64,13 @@ public class TileEntityProjector extends SyncedTileEntity implements IHasGui, II } else TileEntityProjector.this.mapId.set(-1); sync(); - if (TileEntityProjector.this.prevId != TileEntityProjector.this.mapId()) { - BlockProjector.update(TileEntityProjector.this.mapId() != -1, - TileEntityProjector.this.worldObj, - TileEntityProjector.this.xCoord, - TileEntityProjector.this.yCoord, - TileEntityProjector.this.zCoord); + final int meta = worldObj.getBlockMetadata(xCoord, yCoord, zCoord); + final boolean isActive = TileEntityProjector.this.mapId() >= 0; + final int newMeta = ByteUtils.set(meta, BlockProjector.META_BIT_ACTIVE, isActive); + if (newMeta != meta) { + worldObj.setBlockMetadataWithNotify(xCoord, yCoord, zCoord, newMeta, BlockNotifyFlags.ALL); + worldObj.func_147451_t(xCoord, yCoord, zCoord); } - TileEntityProjector.this.prevId = TileEntityProjector.this.mapId(); } markUpdated(); @@ -101,13 +97,6 @@ public class TileEntityProjector extends SyncedTileEntity implements IHasGui, II return AxisAlignedBB.getBoundingBox(xCoord, yCoord, zCoord, xCoord + 1, yCoord + 5, zCoord + 1); } - @Override - public void validate() { - super.validate(); - this.prevId = mapId(); - inventory.onInventoryChanged(0); - } - @Override public boolean shouldRenderInPass(int pass) { return pass == 0 || pass == 1; @@ -155,12 +144,6 @@ public class TileEntityProjector extends SyncedTileEntity implements IHasGui, II sync(); } - @Override - public boolean shouldRefresh(Block oldBlock, Block newBlock, int oldMeta, int newMeta, World world, int x, int y, int z) { - return !((oldBlock == OpenBlocks.Blocks.projector && newBlock == OpenBlocks.Blocks.workingProjector) - || (oldBlock == OpenBlocks.Blocks.workingProjector && newBlock == OpenBlocks.Blocks.projector)); - } - public byte rotation() { return rotation.get(); } From 63325bebaa2dfe06ffe0663084142eb3615adb6e Mon Sep 17 00:00:00 2001 From: Felix Emmert Date: Wed, 8 Feb 2017 00:23:35 +0100 Subject: [PATCH 36/54] Fix server lags caused by constantly ticking tanks. This is achieved by ignoring small differences when balancing neighbouring tanks. --- src/main/java/openblocks/common/tileentity/TileEntityTank.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/openblocks/common/tileentity/TileEntityTank.java b/src/main/java/openblocks/common/tileentity/TileEntityTank.java index daafa567..8aab8958 100644 --- a/src/main/java/openblocks/common/tileentity/TileEntityTank.java +++ b/src/main/java/openblocks/common/tileentity/TileEntityTank.java @@ -329,6 +329,8 @@ public class TileEntityTank extends SyncedTileEntity implements IActivateAwareTi sum += n.tank.getFluidAmount(); final int suggestedAmount = sum / (count + 1); + if (Math.abs(suggestedAmount - contents.amount) < 5) return; // Don't balance small amounts to reduce server load + FluidStack suggestedStack = contents.copy(); suggestedStack.amount = suggestedAmount; From 6ed4c303ba73eb16763a321903c6235697066578 Mon Sep 17 00:00:00 2001 From: Felix Emmert Date: Wed, 8 Feb 2017 00:21:30 +0100 Subject: [PATCH 37/54] Add new optional thermal lift subsystem to make hanggliders great again. Includes an optional acoustic variometer. --- src/main/java/openblocks/Config.java | 4 + .../client/GliderPlayerRenderHandler.java | 2 +- .../client/bindings/KeyInputHandler.java | 33 +++ .../entity/EntityHangGliderRenderer.java | 8 +- .../java/openblocks/common/BeepGenerator.java | 221 ++++++++++++++++++ .../common/entity/EntityHangGlider.java | 152 +++++++++++- .../assets/openblocks/lang/de_DE.lang | 5 +- .../assets/openblocks/lang/en_US.lang | 3 + 8 files changed, 414 insertions(+), 14 deletions(-) create mode 100644 src/main/java/openblocks/common/BeepGenerator.java diff --git a/src/main/java/openblocks/Config.java b/src/main/java/openblocks/Config.java index 593c034b..4ce3df11 100644 --- a/src/main/java/openblocks/Config.java +++ b/src/main/java/openblocks/Config.java @@ -380,6 +380,10 @@ public class Config { @ConfigProperty(category = "devnull", name = "sneakClickToGui", comment = "If true, /dev/null will require sneaking in addition to clicking air to open gui") public static boolean devNullSneakGui = true; + @OnLineModifiable + @ConfigProperty(category = "hangglider", name = "enableThermal", comment = "Enable a whole new level of hanggliding experience through thermal lift. See keybindings for acoustic vario controls") + public static boolean hanggliderEnableThermal = true; + public static void register() { @SuppressWarnings("unchecked") final List recipeList = CraftingManager.getInstance().getRecipeList(); diff --git a/src/main/java/openblocks/client/GliderPlayerRenderHandler.java b/src/main/java/openblocks/client/GliderPlayerRenderHandler.java index 3cd8ce09..809620d3 100644 --- a/src/main/java/openblocks/client/GliderPlayerRenderHandler.java +++ b/src/main/java/openblocks/client/GliderPlayerRenderHandler.java @@ -11,7 +11,7 @@ public class GliderPlayerRenderHandler { @SubscribeEvent public void onPlayerBodyRender(PlayerBodyRenderEvent evt) { final AbstractClientPlayer player = evt.player; - if (!EntityHangGlider.isGliderDeployed(player)) { + if (EntityHangGlider.isGliderDeployed(player)) { player.limbSwing = 0f; player.prevLimbSwingAmount = 0f; player.limbSwingAmount = 0f; diff --git a/src/main/java/openblocks/client/bindings/KeyInputHandler.java b/src/main/java/openblocks/client/bindings/KeyInputHandler.java index d61fa796..18bb06f9 100644 --- a/src/main/java/openblocks/client/bindings/KeyInputHandler.java +++ b/src/main/java/openblocks/client/bindings/KeyInputHandler.java @@ -7,20 +7,35 @@ import cpw.mods.fml.common.gameevent.InputEvent; import net.minecraft.client.Minecraft; import net.minecraft.client.settings.KeyBinding; import openblocks.Config; +import openblocks.common.entity.EntityHangGlider; import openblocks.events.PlayerActionEvent; import org.lwjgl.input.Keyboard; public class KeyInputHandler { private KeyBinding brickBinding; + private KeyBinding varioSwitchBinding; + private KeyBinding varioVolUpBinding; + private KeyBinding varioVolDownBinding; private boolean brickKeyPressed; + private boolean varioSwitchKeyPressed; + private boolean varioVolUpKeyPressed; + private boolean varioVolDownKeyPressed; public void setup() { if (!Config.soSerious) { brickBinding = new KeyBinding("openblocks.keybind.drop_brick", Keyboard.KEY_B, "openblocks.keybind.category"); ClientRegistry.registerKeyBinding(brickBinding); } + if (Config.hanggliderEnableThermal) { + varioSwitchBinding = new KeyBinding("openblocks.keybind.vario_switch", Keyboard.KEY_V, "openblocks.keybind.category"); + varioVolUpBinding = new KeyBinding("openblocks.keybind.vario_vol_up", Keyboard.KEY_NONE, "openblocks.keybind.category"); + varioVolDownBinding = new KeyBinding("openblocks.keybind.vario_vol_down", Keyboard.KEY_NONE, "openblocks.keybind.category"); + ClientRegistry.registerKeyBinding(varioSwitchBinding); + ClientRegistry.registerKeyBinding(varioVolUpBinding); + ClientRegistry.registerKeyBinding(varioVolDownBinding); + } FMLCommonHandler.instance().bus().register(this); } @@ -36,6 +51,24 @@ public class KeyInputHandler { brickKeyPressed = true; } } else brickKeyPressed = false; + if (varioSwitchBinding != null && varioSwitchBinding.isPressed()) { + if (!varioSwitchKeyPressed) { + EntityHangGlider.toggleVario(); + varioSwitchKeyPressed = true; + } + } else varioSwitchKeyPressed = false; + if (varioVolUpBinding != null && varioVolUpBinding.isPressed()) { + if (!varioVolUpKeyPressed) { + EntityHangGlider.incVarioVol(); + varioVolUpKeyPressed = true; + } + } else varioVolUpKeyPressed = false; + if (varioVolDownBinding != null && varioVolDownBinding.isPressed()) { + if (!varioVolDownKeyPressed) { + EntityHangGlider.decVarioVol(); + varioVolDownKeyPressed = true; + } + } else varioVolDownKeyPressed = false; } } diff --git a/src/main/java/openblocks/client/renderer/entity/EntityHangGliderRenderer.java b/src/main/java/openblocks/client/renderer/entity/EntityHangGliderRenderer.java index e2211681..fec1583c 100644 --- a/src/main/java/openblocks/client/renderer/entity/EntityHangGliderRenderer.java +++ b/src/main/java/openblocks/client/renderer/entity/EntityHangGliderRenderer.java @@ -52,7 +52,7 @@ public class EntityHangGliderRenderer extends Render { final boolean isFpp = minecraft.gameSettings.thirdPersonView == 0; final boolean isDeployed = glider.isDeployed(); - if (isLocalPlayer && isFpp && isDeployed) return; + if (isLocalPlayer && isFpp && !isDeployed) return; final float rotation = interpolateRotation(glider.prevRotationYaw, glider.rotationYaw, f1); @@ -62,7 +62,7 @@ public class EntityHangGliderRenderer extends Render { GL11.glRotatef(180.0F - rotation, 0.0F, 1.0F, 0.0F); if (isLocalPlayer) { - if (isDeployed) { + if (!isDeployed) { // move up and closer to back GL11.glTranslated(0, -0.2, +0.3); } else { @@ -75,7 +75,7 @@ public class EntityHangGliderRenderer extends Render { } } } else { - if (isDeployed) { + if (!isDeployed) { // move up little bit (other player center is lower) GL11.glTranslated(0, +0.2, +0.3); } else { @@ -84,7 +84,7 @@ public class EntityHangGliderRenderer extends Render { } } - if (isDeployed) { + if (!isDeployed) { GL11.glRotatef(ONGROUND_ROTATION, 1, 0, 0); GL11.glScalef(0.4f, 1f, 0.4f); } diff --git a/src/main/java/openblocks/common/BeepGenerator.java b/src/main/java/openblocks/common/BeepGenerator.java new file mode 100644 index 00000000..bd558b73 --- /dev/null +++ b/src/main/java/openblocks/common/BeepGenerator.java @@ -0,0 +1,221 @@ +package openblocks.common; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.audio.SoundCategory; +import javax.sound.sampled.AudioFormat; +import javax.sound.sampled.AudioSystem; +import javax.sound.sampled.LineUnavailableException; +import javax.sound.sampled.SourceDataLine; + +public class BeepGenerator { + + private static final int SAMPLE_RATE = 128 * 1024; + private static final int MIN_BUFFER_AVAILABLE = (int) (SAMPLE_RATE * 64 / 1000); + private static final int TIMEOUT_SECONDS = 1; + + private static byte volume = 8; + + public static byte getVolume() { + return volume; + } + + public static void setVolume(byte volume) { + BeepGenerator.volume = volume; + } + + private byte[] buffer; + private int bufferSize; + private boolean currentlyBeeping; + private boolean running; + + private double toneFrequency; + private double lastToneFrequency; + private double beepFrequency; + private int samplesSinceLastBeepChange; + private int timeout; + + private SourceDataLine line; + + private Thread writer; + + public BeepGenerator() { + running = false; + } + + public void start() { + running = true; + timeout = TIMEOUT_SECONDS * 10; + + AudioFormat af = new AudioFormat(SAMPLE_RATE, 8, 1, true, true); + try { + this.line = AudioSystem.getSourceDataLine(af); + this.line.open(af, SAMPLE_RATE); + } catch (LineUnavailableException e) { + e.printStackTrace(); + } + bufferSize = this.line.getBufferSize(); + + startWriter(); + startTimeout(); + } + + public void stop() { + timeout = 0; + setToneFrequency(0d); + setBeepFrequency(0d); + } + + public void keepAlive() { + timeout = TIMEOUT_SECONDS * 10; + } + + public boolean isRunning() { + return running; + } + + private void startWriter() { + new Thread(new Runnable() { + + @Override + public void run() { + long t; + + writeSample(); + writeSample(); + + BeepGenerator.this.line.start(); + + int kill = 5; + + while (BeepGenerator.this.running) { + + writeSample(); + + // Calculate sleep in ms from buffer-surplus + int bufferAvailable = bufferSize - BeepGenerator.this.line.available(); + int ms = (int) ((double) (bufferAvailable - MIN_BUFFER_AVAILABLE) / ((double) (SAMPLE_RATE) / 1000d)); + + if (ms <= 8) + continue; + + // Fixes a weird bug (BeepGenerator.this.line.available() returning 0) + if (bufferAvailable == bufferSize) { + BeepGenerator.this.line.stop(); + while (bufferAvailable == bufferSize || bufferAvailable <= MIN_BUFFER_AVAILABLE) { + writeSample(); + bufferAvailable = bufferSize - BeepGenerator.this.line.available(); + } + BeepGenerator.this.line.start(); + continue; + } + + if (ms < 100) + kill = 5; + + if (kill == 0) { + stop(); + } else { + kill--; + } + + try { + Thread.sleep(ms); + } catch (InterruptedException e) { + e.printStackTrace(); + } + + } + BeepGenerator.this.line.close(); + } + }).start(); + } + + private void startTimeout() { + new Thread(new Runnable() { + + @Override + public void run() { + while (BeepGenerator.this.running) { + BeepGenerator.this.timeout--; + try { + Thread.sleep(100); + } catch (InterruptedException e) { + e.printStackTrace(); + } + if (BeepGenerator.this.timeout <= 0) + BeepGenerator.this.running = false; + } + } + }).start(); + } + + private void writeSample() { + if (this.lastToneFrequency == 0d || this.getToneFrequency() == 0d) + this.lastToneFrequency = this.getToneFrequency(); + else if (this.lastToneFrequency < this.getToneFrequency()) + this.lastToneFrequency += Math.min(5d, this.getToneFrequency() - this.lastToneFrequency); + else if (this.lastToneFrequency > this.getToneFrequency()) + this.lastToneFrequency -= Math.min(5d, this.lastToneFrequency - this.getToneFrequency()); + + BeepGenerator.this.generateSample(this.lastToneFrequency); + line.write(BeepGenerator.this.buffer, 0, this.buffer.length); + } + + private void generateSample(double frequency) { + + final int samples = (int) (SAMPLE_RATE * 16 / 1000); + final float soundLevel = Minecraft.getMinecraft().gameSettings.getSoundLevel(SoundCategory.MASTER); + + if (frequency == 0.0) { + this.buffer = new byte[samples]; + return; + } + + double sinLength = (SAMPLE_RATE/frequency); + + int sinSmooth = (int) (sinLength - (int)(samples % sinLength)); + + this.buffer = new byte[samples + sinSmooth]; + + final int samplesPerBeep; + float vol; + if (getBeepFrequency() > 0) { + samplesPerBeep = (int) ((double) SAMPLE_RATE / getBeepFrequency()); + vol = (byte) (this.currentlyBeeping ? this.volume : 0); + } else { + samplesPerBeep = 0; + vol = this.volume; + this.currentlyBeeping = true; + } + + vol = (soundLevel != 0 ? Math.max((vol * soundLevel), 2) : 0); + + for (int i = 0; i < this.buffer.length; i++) { + this.buffer[i] = (byte) (Math.sin((2.0 * Math.PI * i) / sinLength) * vol); + samplesSinceLastBeepChange++; + if (samplesPerBeep > 0 && samplesSinceLastBeepChange >= samplesPerBeep) { + this.currentlyBeeping = !this.currentlyBeeping; + if (soundLevel == 0) this.currentlyBeeping = false; + vol = (this.currentlyBeeping ? Math.max(((float) this.volume * soundLevel), 2) : 0); + samplesSinceLastBeepChange = 0; + } + } + } + + public double getToneFrequency() { + return toneFrequency; + } + + public void setToneFrequency(double frequency) { + this.toneFrequency = frequency; + } + + public double getBeepFrequency() { + return beepFrequency; + } + + public void setBeepFrequency(double beepFrequency) { + this.beepFrequency = beepFrequency; + } + +} diff --git a/src/main/java/openblocks/common/entity/EntityHangGlider.java b/src/main/java/openblocks/common/entity/EntityHangGlider.java index 623856e4..a8d2142c 100644 --- a/src/main/java/openblocks/common/entity/EntityHangGlider.java +++ b/src/main/java/openblocks/common/entity/EntityHangGlider.java @@ -5,17 +5,43 @@ import cpw.mods.fml.common.registry.IEntityAdditionalSpawnData; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import io.netty.buffer.ByteBuf; +import java.util.GregorianCalendar; import java.util.Map; +import java.util.Random; import net.minecraft.client.entity.EntityPlayerSP; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; +import net.minecraft.world.gen.NoiseGeneratorPerlin; +import openblocks.Config; import openblocks.common.item.ItemHangGlider; +import openblocks.common.BeepGenerator; import openmods.Log; +import openmods.OpenMods; public class EntityHangGlider extends Entity implements IEntityAdditionalSpawnData { + // Vario Config + public static boolean varioActive = false; + public static int varioVolume = 8; + public static final int VOL_MIN = 2; + public static final int VOL_MAX = 20; + public static final int FREQ_MIN = 300; + public static final int FREQ_AVG = 600; + public static final int FREQ_MAX = 2000; + public static final int BEEP_RATE_AVG = 4; + public static final int BEEP_RATE_MAX = 24; + public static final int TICKS_PER_VARIO_UPDATE = 4; + public static final int THERMAL_HEIGTH_MIN = 70; + public static final int THERMAL_HEIGTH_OPT = 110; + public static final int THERMAL_HEIGTH_MAX = 136; + public static final int THERMAL_STRONG_BONUS_HEIGTH = 100; + public static final double VSPEED_NORMAL = -0.052; + public static final double VSPEED_FAST = -0.176; + public static final double VSPEED_MIN = -0.32; + public static final double VSPEED_MAX = 0.4; + private static final int PROPERTY_DEPLOYED = 17; private static Map gliderMap = new MapMaker().weakKeys().weakValues().makeMap(); @@ -27,7 +53,7 @@ public class EntityHangGlider extends Entity implements IEntityAdditionalSpawnDa public static boolean isGliderDeployed(Entity player) { EntityHangGlider glider = gliderMap.get(player); - return glider == null || glider.isDeployed(); + return glider != null && glider.isDeployed(); } private static boolean isGliderValid(EntityPlayer player, EntityHangGlider glider) { @@ -49,10 +75,35 @@ public class EntityHangGlider extends Entity implements IEntityAdditionalSpawnDa } } + public static void toggleVario() { + if (!varioActive) { + varioActive = true; + } else { + varioActive = false; + } + } + + public static void incVarioVol() { + varioVolume = Math.min((varioVolume + 2), VOL_MAX); + BeepGenerator.setVolume((byte) varioVolume); + } + + public static void decVarioVol() { + varioVolume = Math.max((varioVolume - 2), VOL_MIN); + BeepGenerator.setVolume((byte) varioVolume); + } + private EntityPlayer player; + private NoiseGeneratorPerlin noiseGen; + private BeepGenerator beeper; + private int ticksSinceLastVarioUpdate = 0; + private double avgVspeed = 0; + private double lastMotionY = 0; public EntityHangGlider(World world) { super(world); + this.noiseGen = new NoiseGeneratorPerlin(new Random(world.getCurrentDate().get(GregorianCalendar.DAY_OF_YEAR)), 2); + BeepGenerator.setVolume((byte) varioVolume); } public EntityHangGlider(World world, EntityPlayer player) { @@ -104,44 +155,94 @@ public class EntityHangGlider extends Entity implements IEntityAdditionalSpawnDa return; } - boolean isDeployed = player.onGround || player.isInWater(); + boolean isDeployed = !player.onGround && !player.isInWater(); if (!worldObj.isRemote) { this.dataWatcher.updateObject(PROPERTY_DEPLOYED, (byte)(isDeployed? 1 : 0)); fixPositions(player, false); } - if (!isDeployed && player.motionY < 0) { + if (isLocalPlayer() && Config.hanggliderEnableThermal && beeper == null) + beeper = new BeepGenerator(); + + if (isDeployed && player.motionY < lastMotionY) { final double horizontalSpeed; final double verticalSpeed; + final double noise; + + if (Config.hanggliderEnableThermal) + noise = getNoise(); + else + noise = 0; + + final double vspeed = (noise >= 0 ? VSPEED_MAX : -VSPEED_MIN); if (player.isSneaking()) { horizontalSpeed = 0.1; - verticalSpeed = 0.7; + verticalSpeed = Math.max((VSPEED_FAST + noise * vspeed), VSPEED_MIN); } else { horizontalSpeed = 0.03; - verticalSpeed = 0.4; + verticalSpeed = Math.max((VSPEED_NORMAL + noise * vspeed), VSPEED_MIN); + } + + player.motionY = verticalSpeed; + motionY = verticalSpeed; + lastMotionY = verticalSpeed; + + if (isLocalPlayer()) { + if (varioActive) { + ticksSinceLastVarioUpdate++; + avgVspeed += verticalSpeed / (double) TICKS_PER_VARIO_UPDATE; + if (ticksSinceLastVarioUpdate > TICKS_PER_VARIO_UPDATE) { + vario(avgVspeed); + ticksSinceLastVarioUpdate = 0; + avgVspeed = 0; + } + } else { + stopVario(); + } } - player.motionY *= verticalSpeed; - motionY *= verticalSpeed; double x = Math.cos(Math.toRadians(player.rotationYawHead + 90)) * horizontalSpeed; double z = Math.sin(Math.toRadians(player.rotationYawHead + 90)) * horizontalSpeed; player.motionX += x; player.motionZ += z; player.fallDistance = 0f; /* Don't like getting hurt :( */ + } else if (isLocalPlayer() && varioActive) { + stopVario(); } - } public EntityPlayer getPlayer() { return player; } + public double getNoise() { + double noise = (double) noiseGen.func_151601_a((float) player.posX / 20f,(float) player.posZ / 20f) / 4d; + final boolean strong = (noise > 0.7 ? true : false); + final int bonus = (strong ? THERMAL_STRONG_BONUS_HEIGTH : 0); + final int biomeRain = worldObj.getBiomeGenForCoords((int) player.posX, (int) player.posZ).getIntRainfall(); + + noise *= Math.min((Math.max((player.posY - (double) THERMAL_HEIGTH_MIN), 0d) / (double) (THERMAL_HEIGTH_OPT - THERMAL_HEIGTH_MIN)), 1d); + noise *= Math.min((Math.max(((double) (THERMAL_HEIGTH_MAX + bonus) - player.posY), 0d) / (double) (THERMAL_HEIGTH_MAX - THERMAL_HEIGTH_OPT + bonus / 4)), 1d); + + int worldTime = (int) (worldObj.getWorldTime() % 24000); + noise *= Math.min(((double) worldTime / 1000d), 1); + noise *= Math.min(((double) Math.max((12000 - worldTime), 0) / 1000d), 1); + + if (player.dimension != 0) + noise = 0; + else if (worldObj.isRaining() && !strong) + noise = (biomeRain > 0 ? -0.5 : 0); + return noise; + } + @Override public void setDead() { super.setDead(); gliderMap.remove(player); + if (isLocalPlayer()) + stopVario(); } private void fixPositions(EntityPlayer thePlayer, boolean localPlayer) { @@ -171,6 +272,41 @@ public class EntityHangGlider extends Entity implements IEntityAdditionalSpawnDa this.motionZ = this.posZ - this.prevPosZ; } + private boolean isLocalPlayer() { + return worldObj.isRemote && OpenMods.proxy.isClientPlayer(player); + } + + @SideOnly(Side.CLIENT) + private void vario(double vspeed) { + if (vspeed <= 0){ + vspeed = Math.max(VSPEED_MIN, vspeed); + double freq = (vspeed - VSPEED_MIN) / Math.abs(VSPEED_MIN) * (double) (FREQ_AVG - FREQ_MIN) + (double) FREQ_MIN; + beeper.setToneFrequency(freq); + beeper.setBeepFrequency(0d); + } else { + vspeed = Math.min(VSPEED_MAX, vspeed); + double freq = vspeed / Math.abs(VSPEED_MAX) * (double) (FREQ_MAX - FREQ_AVG) + (double) FREQ_AVG; + double beepfreq = vspeed / Math.abs(VSPEED_MAX) * (double) (BEEP_RATE_MAX - BEEP_RATE_AVG) + (double) BEEP_RATE_AVG; + beeper.setToneFrequency(freq); + beeper.setBeepFrequency(beepfreq); + } + if (beeper.isRunning()) { + beeper.keepAlive(); + } else { + beeper.start(); + } + } + + @SideOnly(Side.CLIENT) + private void stopVario() { + if (beeper != null) { + beeper.stop(); + beeper = null; + } + ticksSinceLastVarioUpdate = 0; + avgVspeed = 0; + } + @Override protected void readEntityFromNBT(NBTTagCompound nbttagcompound) {} diff --git a/src/main/resources/assets/openblocks/lang/de_DE.lang b/src/main/resources/assets/openblocks/lang/de_DE.lang index 3df85643..90685a5d 100644 --- a/src/main/resources/assets/openblocks/lang/de_DE.lang +++ b/src/main/resources/assets/openblocks/lang/de_DE.lang @@ -6,6 +6,9 @@ achievement.openblocks.stackOverflow.desc=Es ist voller Sterne! openblocks.keybind.category=OpenBlocks openblocks.keybind.drop_brick=Sei albern +openblocks.keybind.vario_switch=Vario Ein/Aus +openblocks.keybind.vario_vol_up=Vario lauter +openblocks.keybind.vario_vol_down=Vario leiser enchantment.openblocks.explosive=Instabil enchantment.openblocks.laststand=Letzte Rettung @@ -92,7 +95,7 @@ openblocks.misc.page=Seite %d von %d openblocks.misc.oh_no_ceiling=Du kannst hier nicht schlafen. Die Decke beunruhigt dich zu sehr... openblocks.misc.oh_no_ground=Auf DEM Ding willst du schlafen?! openblocks.misc.sleeping_bag_broken=Item inaktiv wegen fehlerhafter Initialisierung -#openblocks.misc.inverted=Inverted ## NEEDS TRANSLATION ## +openblocks.misc.inverted=Invertiert openblocks.misc.grave_msg=%s (Tag: %.1f) diff --git a/src/main/resources/assets/openblocks/lang/en_US.lang b/src/main/resources/assets/openblocks/lang/en_US.lang index 9ab174cf..16e07217 100644 --- a/src/main/resources/assets/openblocks/lang/en_US.lang +++ b/src/main/resources/assets/openblocks/lang/en_US.lang @@ -6,6 +6,9 @@ achievement.openblocks.stackOverflow.desc=It's full of stars! openblocks.keybind.category=OpenBlocks openblocks.keybind.drop_brick=Be silly +openblocks.keybind.vario_switch=Vario on/off +openblocks.keybind.vario_vol_up=Vario volume up +openblocks.keybind.vario_vol_down=Vario volume down enchantment.openblocks.explosive=Unstable enchantment.openblocks.laststand=Last Stand From 8eff0a57570cc456b1eb1efdc6a47bcb3b2ca20d Mon Sep 17 00:00:00 2001 From: Bartek Bok Date: Thu, 9 Feb 2017 20:23:08 +0100 Subject: [PATCH 38/54] Autoformat and autostupid --- .../java/openblocks/common/BeepGenerator.java | 42 ++++++++---------- .../common/entity/EntityHangGlider.java | 44 +++++++++---------- 2 files changed, 41 insertions(+), 45 deletions(-) diff --git a/src/main/java/openblocks/common/BeepGenerator.java b/src/main/java/openblocks/common/BeepGenerator.java index bd558b73..26da75f4 100644 --- a/src/main/java/openblocks/common/BeepGenerator.java +++ b/src/main/java/openblocks/common/BeepGenerator.java @@ -1,16 +1,16 @@ package openblocks.common; -import net.minecraft.client.Minecraft; -import net.minecraft.client.audio.SoundCategory; import javax.sound.sampled.AudioFormat; import javax.sound.sampled.AudioSystem; import javax.sound.sampled.LineUnavailableException; import javax.sound.sampled.SourceDataLine; +import net.minecraft.client.Minecraft; +import net.minecraft.client.audio.SoundCategory; public class BeepGenerator { private static final int SAMPLE_RATE = 128 * 1024; - private static final int MIN_BUFFER_AVAILABLE = (int) (SAMPLE_RATE * 64 / 1000); + private static final int MIN_BUFFER_AVAILABLE = SAMPLE_RATE * 64 / 1000; private static final int TIMEOUT_SECONDS = 1; private static byte volume = 8; @@ -36,8 +36,6 @@ public class BeepGenerator { private SourceDataLine line; - private Thread writer; - public BeepGenerator() { running = false; } @@ -78,8 +76,6 @@ public class BeepGenerator { @Override public void run() { - long t; - writeSample(); writeSample(); @@ -93,7 +89,7 @@ public class BeepGenerator { // Calculate sleep in ms from buffer-surplus int bufferAvailable = bufferSize - BeepGenerator.this.line.available(); - int ms = (int) ((double) (bufferAvailable - MIN_BUFFER_AVAILABLE) / ((double) (SAMPLE_RATE) / 1000d)); + int ms = (int)((bufferAvailable - MIN_BUFFER_AVAILABLE) / ((SAMPLE_RATE) / 1000d)); if (ms <= 8) continue; @@ -150,12 +146,12 @@ public class BeepGenerator { } private void writeSample() { - if (this.lastToneFrequency == 0d || this.getToneFrequency() == 0d) - this.lastToneFrequency = this.getToneFrequency(); - else if (this.lastToneFrequency < this.getToneFrequency()) - this.lastToneFrequency += Math.min(5d, this.getToneFrequency() - this.lastToneFrequency); - else if (this.lastToneFrequency > this.getToneFrequency()) - this.lastToneFrequency -= Math.min(5d, this.lastToneFrequency - this.getToneFrequency()); + if (this.lastToneFrequency == 0d || getToneFrequency() == 0d) + this.lastToneFrequency = getToneFrequency(); + else if (this.lastToneFrequency < getToneFrequency()) + this.lastToneFrequency += Math.min(5d, getToneFrequency() - this.lastToneFrequency); + else if (this.lastToneFrequency > getToneFrequency()) + this.lastToneFrequency -= Math.min(5d, this.lastToneFrequency - getToneFrequency()); BeepGenerator.this.generateSample(this.lastToneFrequency); line.write(BeepGenerator.this.buffer, 0, this.buffer.length); @@ -163,7 +159,7 @@ public class BeepGenerator { private void generateSample(double frequency) { - final int samples = (int) (SAMPLE_RATE * 16 / 1000); + final int samples = SAMPLE_RATE * 16 / 1000; final float soundLevel = Minecraft.getMinecraft().gameSettings.getSoundLevel(SoundCategory.MASTER); if (frequency == 0.0) { @@ -171,32 +167,32 @@ public class BeepGenerator { return; } - double sinLength = (SAMPLE_RATE/frequency); + double sinLength = (SAMPLE_RATE / frequency); - int sinSmooth = (int) (sinLength - (int)(samples % sinLength)); + int sinSmooth = (int)(sinLength - (int)(samples % sinLength)); this.buffer = new byte[samples + sinSmooth]; final int samplesPerBeep; float vol; if (getBeepFrequency() > 0) { - samplesPerBeep = (int) ((double) SAMPLE_RATE / getBeepFrequency()); - vol = (byte) (this.currentlyBeeping ? this.volume : 0); + samplesPerBeep = (int)(SAMPLE_RATE / getBeepFrequency()); + vol = this.currentlyBeeping? BeepGenerator.volume : 0; } else { samplesPerBeep = 0; - vol = this.volume; + vol = BeepGenerator.volume; this.currentlyBeeping = true; } - vol = (soundLevel != 0 ? Math.max((vol * soundLevel), 2) : 0); + vol = (soundLevel != 0? Math.max((vol * soundLevel), 2) : 0); for (int i = 0; i < this.buffer.length; i++) { - this.buffer[i] = (byte) (Math.sin((2.0 * Math.PI * i) / sinLength) * vol); + this.buffer[i] = (byte)(Math.sin((2.0 * Math.PI * i) / sinLength) * vol); samplesSinceLastBeepChange++; if (samplesPerBeep > 0 && samplesSinceLastBeepChange >= samplesPerBeep) { this.currentlyBeeping = !this.currentlyBeeping; if (soundLevel == 0) this.currentlyBeeping = false; - vol = (this.currentlyBeeping ? Math.max(((float) this.volume * soundLevel), 2) : 0); + vol = (this.currentlyBeeping? Math.max((BeepGenerator.volume * soundLevel), 2) : 0); samplesSinceLastBeepChange = 0; } } diff --git a/src/main/java/openblocks/common/entity/EntityHangGlider.java b/src/main/java/openblocks/common/entity/EntityHangGlider.java index a8d2142c..e6477ef9 100644 --- a/src/main/java/openblocks/common/entity/EntityHangGlider.java +++ b/src/main/java/openblocks/common/entity/EntityHangGlider.java @@ -5,7 +5,7 @@ import cpw.mods.fml.common.registry.IEntityAdditionalSpawnData; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import io.netty.buffer.ByteBuf; -import java.util.GregorianCalendar; +import java.util.Calendar; import java.util.Map; import java.util.Random; import net.minecraft.client.entity.EntityPlayerSP; @@ -16,8 +16,8 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; import net.minecraft.world.gen.NoiseGeneratorPerlin; import openblocks.Config; -import openblocks.common.item.ItemHangGlider; import openblocks.common.BeepGenerator; +import openblocks.common.item.ItemHangGlider; import openmods.Log; import openmods.OpenMods; @@ -85,12 +85,12 @@ public class EntityHangGlider extends Entity implements IEntityAdditionalSpawnDa public static void incVarioVol() { varioVolume = Math.min((varioVolume + 2), VOL_MAX); - BeepGenerator.setVolume((byte) varioVolume); + BeepGenerator.setVolume((byte)varioVolume); } public static void decVarioVol() { varioVolume = Math.max((varioVolume - 2), VOL_MIN); - BeepGenerator.setVolume((byte) varioVolume); + BeepGenerator.setVolume((byte)varioVolume); } private EntityPlayer player; @@ -102,8 +102,8 @@ public class EntityHangGlider extends Entity implements IEntityAdditionalSpawnDa public EntityHangGlider(World world) { super(world); - this.noiseGen = new NoiseGeneratorPerlin(new Random(world.getCurrentDate().get(GregorianCalendar.DAY_OF_YEAR)), 2); - BeepGenerator.setVolume((byte) varioVolume); + this.noiseGen = new NoiseGeneratorPerlin(new Random(world.getCurrentDate().get(Calendar.DAY_OF_YEAR)), 2); + BeepGenerator.setVolume((byte)varioVolume); } public EntityHangGlider(World world, EntityPlayer player) { @@ -175,7 +175,7 @@ public class EntityHangGlider extends Entity implements IEntityAdditionalSpawnDa else noise = 0; - final double vspeed = (noise >= 0 ? VSPEED_MAX : -VSPEED_MIN); + final double vspeed = (noise >= 0? VSPEED_MAX : -VSPEED_MIN); if (player.isSneaking()) { horizontalSpeed = 0.1; @@ -192,7 +192,7 @@ public class EntityHangGlider extends Entity implements IEntityAdditionalSpawnDa if (isLocalPlayer()) { if (varioActive) { ticksSinceLastVarioUpdate++; - avgVspeed += verticalSpeed / (double) TICKS_PER_VARIO_UPDATE; + avgVspeed += verticalSpeed / TICKS_PER_VARIO_UPDATE; if (ticksSinceLastVarioUpdate > TICKS_PER_VARIO_UPDATE) { vario(avgVspeed); ticksSinceLastVarioUpdate = 0; @@ -218,22 +218,22 @@ public class EntityHangGlider extends Entity implements IEntityAdditionalSpawnDa } public double getNoise() { - double noise = (double) noiseGen.func_151601_a((float) player.posX / 20f,(float) player.posZ / 20f) / 4d; - final boolean strong = (noise > 0.7 ? true : false); - final int bonus = (strong ? THERMAL_STRONG_BONUS_HEIGTH : 0); - final int biomeRain = worldObj.getBiomeGenForCoords((int) player.posX, (int) player.posZ).getIntRainfall(); + double noise = noiseGen.func_151601_a((float)player.posX / 20f, (float)player.posZ / 20f) / 4d; + final boolean strong = (noise > 0.7? true : false); + final int bonus = (strong? THERMAL_STRONG_BONUS_HEIGTH : 0); + final int biomeRain = worldObj.getBiomeGenForCoords((int)player.posX, (int)player.posZ).getIntRainfall(); - noise *= Math.min((Math.max((player.posY - (double) THERMAL_HEIGTH_MIN), 0d) / (double) (THERMAL_HEIGTH_OPT - THERMAL_HEIGTH_MIN)), 1d); - noise *= Math.min((Math.max(((double) (THERMAL_HEIGTH_MAX + bonus) - player.posY), 0d) / (double) (THERMAL_HEIGTH_MAX - THERMAL_HEIGTH_OPT + bonus / 4)), 1d); + noise *= Math.min((Math.max((player.posY - THERMAL_HEIGTH_MIN), 0d) / (THERMAL_HEIGTH_OPT - THERMAL_HEIGTH_MIN)), 1d); + noise *= Math.min((Math.max((THERMAL_HEIGTH_MAX + bonus - player.posY), 0d) / (THERMAL_HEIGTH_MAX - THERMAL_HEIGTH_OPT + bonus / 4)), 1d); - int worldTime = (int) (worldObj.getWorldTime() % 24000); - noise *= Math.min(((double) worldTime / 1000d), 1); - noise *= Math.min(((double) Math.max((12000 - worldTime), 0) / 1000d), 1); + int worldTime = (int)(worldObj.getWorldTime() % 24000); + noise *= Math.min((worldTime / 1000d), 1); + noise *= Math.min((Math.max((12000 - worldTime), 0) / 1000d), 1); if (player.dimension != 0) noise = 0; else if (worldObj.isRaining() && !strong) - noise = (biomeRain > 0 ? -0.5 : 0); + noise = (biomeRain > 0? -0.5 : 0); return noise; } @@ -278,15 +278,15 @@ public class EntityHangGlider extends Entity implements IEntityAdditionalSpawnDa @SideOnly(Side.CLIENT) private void vario(double vspeed) { - if (vspeed <= 0){ + if (vspeed <= 0) { vspeed = Math.max(VSPEED_MIN, vspeed); - double freq = (vspeed - VSPEED_MIN) / Math.abs(VSPEED_MIN) * (double) (FREQ_AVG - FREQ_MIN) + (double) FREQ_MIN; + double freq = (vspeed - VSPEED_MIN) / Math.abs(VSPEED_MIN) * (FREQ_AVG - FREQ_MIN) + FREQ_MIN; beeper.setToneFrequency(freq); beeper.setBeepFrequency(0d); } else { vspeed = Math.min(VSPEED_MAX, vspeed); - double freq = vspeed / Math.abs(VSPEED_MAX) * (double) (FREQ_MAX - FREQ_AVG) + (double) FREQ_AVG; - double beepfreq = vspeed / Math.abs(VSPEED_MAX) * (double) (BEEP_RATE_MAX - BEEP_RATE_AVG) + (double) BEEP_RATE_AVG; + double freq = vspeed / Math.abs(VSPEED_MAX) * (FREQ_MAX - FREQ_AVG) + FREQ_AVG; + double beepfreq = vspeed / Math.abs(VSPEED_MAX) * (BEEP_RATE_MAX - BEEP_RATE_AVG) + BEEP_RATE_AVG; beeper.setToneFrequency(freq); beeper.setBeepFrequency(beepfreq); } From e55d0a15958a9cbe6b23d84cdd7ad0b2ccf89fb6 Mon Sep 17 00:00:00 2001 From: Bartek Bok Date: Sat, 11 Feb 2017 18:22:13 +0100 Subject: [PATCH 39/54] Trying to decouple vario logic --- .../client/bindings/KeyInputHandler.java | 8 +- .../java/openblocks/common/BeepGenerator.java | 79 +++---- .../openblocks/common/IVarioController.java | 34 ++++ src/main/java/openblocks/common/Vario.java | 136 +++++++++++++ .../common/entity/EntityHangGlider.java | 192 ++++++++---------- 5 files changed, 279 insertions(+), 170 deletions(-) create mode 100644 src/main/java/openblocks/common/IVarioController.java create mode 100644 src/main/java/openblocks/common/Vario.java diff --git a/src/main/java/openblocks/client/bindings/KeyInputHandler.java b/src/main/java/openblocks/client/bindings/KeyInputHandler.java index 18bb06f9..0ce999d5 100644 --- a/src/main/java/openblocks/client/bindings/KeyInputHandler.java +++ b/src/main/java/openblocks/client/bindings/KeyInputHandler.java @@ -7,7 +7,7 @@ import cpw.mods.fml.common.gameevent.InputEvent; import net.minecraft.client.Minecraft; import net.minecraft.client.settings.KeyBinding; import openblocks.Config; -import openblocks.common.entity.EntityHangGlider; +import openblocks.common.Vario; import openblocks.events.PlayerActionEvent; import org.lwjgl.input.Keyboard; @@ -53,19 +53,19 @@ public class KeyInputHandler { } else brickKeyPressed = false; if (varioSwitchBinding != null && varioSwitchBinding.isPressed()) { if (!varioSwitchKeyPressed) { - EntityHangGlider.toggleVario(); + Vario.instance.toggle(); varioSwitchKeyPressed = true; } } else varioSwitchKeyPressed = false; if (varioVolUpBinding != null && varioVolUpBinding.isPressed()) { if (!varioVolUpKeyPressed) { - EntityHangGlider.incVarioVol(); + Vario.instance.incVolume(); varioVolUpKeyPressed = true; } } else varioVolUpKeyPressed = false; if (varioVolDownBinding != null && varioVolDownBinding.isPressed()) { if (!varioVolDownKeyPressed) { - EntityHangGlider.decVarioVol(); + Vario.instance.decVolume(); varioVolDownKeyPressed = true; } } else varioVolDownKeyPressed = false; diff --git a/src/main/java/openblocks/common/BeepGenerator.java b/src/main/java/openblocks/common/BeepGenerator.java index 26da75f4..880d3d61 100644 --- a/src/main/java/openblocks/common/BeepGenerator.java +++ b/src/main/java/openblocks/common/BeepGenerator.java @@ -6,21 +6,21 @@ import javax.sound.sampled.LineUnavailableException; import javax.sound.sampled.SourceDataLine; import net.minecraft.client.Minecraft; import net.minecraft.client.audio.SoundCategory; +import openmods.Log; public class BeepGenerator { private static final int SAMPLE_RATE = 128 * 1024; private static final int MIN_BUFFER_AVAILABLE = SAMPLE_RATE * 64 / 1000; - private static final int TIMEOUT_SECONDS = 1; - private static byte volume = 8; + private byte volume = 8; - public static byte getVolume() { + public byte getVolume() { return volume; } - public static void setVolume(byte volume) { - BeepGenerator.volume = volume; + public void setVolume(byte volume) { + this.volume = volume; } private byte[] buffer; @@ -32,7 +32,6 @@ public class BeepGenerator { private double lastToneFrequency; private double beepFrequency; private int samplesSinceLastBeepChange; - private int timeout; private SourceDataLine line; @@ -42,31 +41,24 @@ public class BeepGenerator { public void start() { running = true; - timeout = TIMEOUT_SECONDS * 10; - AudioFormat af = new AudioFormat(SAMPLE_RATE, 8, 1, true, true); try { this.line = AudioSystem.getSourceDataLine(af); this.line.open(af, SAMPLE_RATE); } catch (LineUnavailableException e) { - e.printStackTrace(); + Log.warn(e, "Failed to initialize beeper"); } - bufferSize = this.line.getBufferSize(); + bufferSize = this.line.getBufferSize(); startWriter(); - startTimeout(); } public void stop() { - timeout = 0; + running = false; setToneFrequency(0d); setBeepFrequency(0d); } - public void keepAlive() { - timeout = TIMEOUT_SECONDS * 10; - } - public boolean isRunning() { return running; } @@ -79,16 +71,15 @@ public class BeepGenerator { writeSample(); writeSample(); - BeepGenerator.this.line.start(); + line.start(); int kill = 5; - while (BeepGenerator.this.running) { - + while (running) { writeSample(); // Calculate sleep in ms from buffer-surplus - int bufferAvailable = bufferSize - BeepGenerator.this.line.available(); + int bufferAvailable = bufferSize - line.available(); int ms = (int)((bufferAvailable - MIN_BUFFER_AVAILABLE) / ((SAMPLE_RATE) / 1000d)); if (ms <= 8) @@ -96,12 +87,12 @@ public class BeepGenerator { // Fixes a weird bug (BeepGenerator.this.line.available() returning 0) if (bufferAvailable == bufferSize) { - BeepGenerator.this.line.stop(); + line.stop(); while (bufferAvailable == bufferSize || bufferAvailable <= MIN_BUFFER_AVAILABLE) { writeSample(); bufferAvailable = bufferSize - BeepGenerator.this.line.available(); } - BeepGenerator.this.line.start(); + line.start(); continue; } @@ -117,48 +108,28 @@ public class BeepGenerator { try { Thread.sleep(ms); } catch (InterruptedException e) { - e.printStackTrace(); + running = false; } } - BeepGenerator.this.line.close(); - } - }).start(); - } - - private void startTimeout() { - new Thread(new Runnable() { - - @Override - public void run() { - while (BeepGenerator.this.running) { - BeepGenerator.this.timeout--; - try { - Thread.sleep(100); - } catch (InterruptedException e) { - e.printStackTrace(); - } - if (BeepGenerator.this.timeout <= 0) - BeepGenerator.this.running = false; - } + line.close(); } }).start(); } private void writeSample() { if (this.lastToneFrequency == 0d || getToneFrequency() == 0d) - this.lastToneFrequency = getToneFrequency(); - else if (this.lastToneFrequency < getToneFrequency()) - this.lastToneFrequency += Math.min(5d, getToneFrequency() - this.lastToneFrequency); - else if (this.lastToneFrequency > getToneFrequency()) - this.lastToneFrequency -= Math.min(5d, this.lastToneFrequency - getToneFrequency()); + this.lastToneFrequency = toneFrequency; + else if (this.lastToneFrequency < toneFrequency) + this.lastToneFrequency += Math.min(5d, toneFrequency - this.lastToneFrequency); + else if (this.lastToneFrequency > toneFrequency) + this.lastToneFrequency -= Math.min(5d, this.lastToneFrequency - toneFrequency); - BeepGenerator.this.generateSample(this.lastToneFrequency); - line.write(BeepGenerator.this.buffer, 0, this.buffer.length); + generateSample(this.lastToneFrequency); + line.write(buffer, 0, buffer.length); } private void generateSample(double frequency) { - final int samples = SAMPLE_RATE * 16 / 1000; final float soundLevel = Minecraft.getMinecraft().gameSettings.getSoundLevel(SoundCategory.MASTER); @@ -177,10 +148,10 @@ public class BeepGenerator { float vol; if (getBeepFrequency() > 0) { samplesPerBeep = (int)(SAMPLE_RATE / getBeepFrequency()); - vol = this.currentlyBeeping? BeepGenerator.volume : 0; + vol = this.currentlyBeeping? volume : 0; } else { samplesPerBeep = 0; - vol = BeepGenerator.volume; + vol = volume; this.currentlyBeeping = true; } @@ -192,7 +163,7 @@ public class BeepGenerator { if (samplesPerBeep > 0 && samplesSinceLastBeepChange >= samplesPerBeep) { this.currentlyBeeping = !this.currentlyBeeping; if (soundLevel == 0) this.currentlyBeeping = false; - vol = (this.currentlyBeeping? Math.max((BeepGenerator.volume * soundLevel), 2) : 0); + vol = (this.currentlyBeeping? Math.max((volume * soundLevel), 2) : 0); samplesSinceLastBeepChange = 0; } } diff --git a/src/main/java/openblocks/common/IVarioController.java b/src/main/java/openblocks/common/IVarioController.java new file mode 100644 index 00000000..f46a5b0a --- /dev/null +++ b/src/main/java/openblocks/common/IVarioController.java @@ -0,0 +1,34 @@ +package openblocks.common; + +public interface IVarioController { + + public static final IVarioController NULL = new IVarioController() { + + @Override + public void setFrequencies(double toneFrequency, double beepFrequency) {} + + @Override + public void release() {} + + @Override + public void kill() {} + + @Override + public void keepAlive() {} + + @Override + public boolean isValid() { + return false; + } + }; + + public void setFrequencies(double toneFrequency, double beepFrequency); + + public void keepAlive(); + + public void kill(); + + public boolean isValid(); + + public void release(); +} \ No newline at end of file diff --git a/src/main/java/openblocks/common/Vario.java b/src/main/java/openblocks/common/Vario.java new file mode 100644 index 00000000..9dd82636 --- /dev/null +++ b/src/main/java/openblocks/common/Vario.java @@ -0,0 +1,136 @@ +package openblocks.common; + +public class Vario { + + private static final int WATCHDOG_PERIOD = 1000 / 20; // nominal game tick + + private static final int WATCHDOG_TIMEOUT_TICKS = 10; + + private static final int VOL_MIN = 2; + private static final int VOL_MAX = 20; + + public static final Vario instance = new Vario(); + + private int varioVolume = 8; + + private boolean isAlive; + + private IVarioController activeController = IVarioController.NULL; + + private int watchdogMissedTicks; + + private Thread watchdogThread; + + private final BeepGenerator beeper = new BeepGenerator(); + + private class Controller implements IVarioController { + + private boolean isValid = true; + + @Override + public void setFrequencies(double toneFrequency, double beepFrequency) { + if (isValid) { + beeper.setToneFrequency(toneFrequency); + beeper.setBeepFrequency(beepFrequency); + } + } + + @Override + public void keepAlive() { + if (isValid) + watchdogMissedTicks = 0; + } + + @Override + public void kill() { + if (isValid) { + isAlive = false; + } + } + + @Override + public boolean isValid() { + return isValid; + } + + @Override + public void release() { + isValid = false; + } + } + + public void incVolume() { + varioVolume = Math.min((varioVolume + 2), VOL_MAX); + beeper.setVolume((byte)varioVolume); + } + + public void decVolume() { + varioVolume = Math.max((varioVolume - 2), VOL_MIN); + beeper.setVolume((byte)varioVolume); + } + + public void enable() { + // no point in activating, if nothing feeds us data + if (activeController.isValid()) { + isAlive = true; + watchdogMissedTicks = 0; + + if (watchdogThread == null || !watchdogThread.isAlive()) + watchdogThread = startWatchdog(); + } + } + + public void disable() { + isAlive = false; + } + + public boolean isEnabled() { + return isAlive; + } + + public void toggle() { + if (isAlive) { + disable(); + } else { + enable(); + } + } + + public IVarioController acquire() { + if (activeController.isValid()) + activeController.release(); + + return (activeController = new Controller()); + } + + private Thread startWatchdog() { + final Thread watchdogThread = new Thread(new Runnable() { + @Override + public void run() { + beeper.start(); + + try { + while (isAlive) { + if (watchdogMissedTicks++ > WATCHDOG_TIMEOUT_TICKS) + break; + + try { + Thread.sleep(WATCHDOG_PERIOD); + } catch (InterruptedException e) { + break; + } + } + } finally { + beeper.stop(); + isAlive = false; + } + } + }); + + watchdogThread.setName("Vario watchdog"); + watchdogThread.setDaemon(true); + watchdogThread.start(); + + return watchdogThread; + } +} diff --git a/src/main/java/openblocks/common/entity/EntityHangGlider.java b/src/main/java/openblocks/common/entity/EntityHangGlider.java index e6477ef9..a9916d36 100644 --- a/src/main/java/openblocks/common/entity/EntityHangGlider.java +++ b/src/main/java/openblocks/common/entity/EntityHangGlider.java @@ -16,36 +16,39 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; import net.minecraft.world.gen.NoiseGeneratorPerlin; import openblocks.Config; -import openblocks.common.BeepGenerator; +import openblocks.common.IVarioController; +import openblocks.common.Vario; import openblocks.common.item.ItemHangGlider; import openmods.Log; import openmods.OpenMods; public class EntityHangGlider extends Entity implements IEntityAdditionalSpawnData { - // Vario Config - public static boolean varioActive = false; - public static int varioVolume = 8; - public static final int VOL_MIN = 2; - public static final int VOL_MAX = 20; - public static final int FREQ_MIN = 300; - public static final int FREQ_AVG = 600; - public static final int FREQ_MAX = 2000; - public static final int BEEP_RATE_AVG = 4; - public static final int BEEP_RATE_MAX = 24; - public static final int TICKS_PER_VARIO_UPDATE = 4; + public static final int THERMAL_HEIGTH_MIN = 70; public static final int THERMAL_HEIGTH_OPT = 110; public static final int THERMAL_HEIGTH_MAX = 136; public static final int THERMAL_STRONG_BONUS_HEIGTH = 100; + public static final double VSPEED_NORMAL = -0.052; public static final double VSPEED_FAST = -0.176; public static final double VSPEED_MIN = -0.32; public static final double VSPEED_MAX = 0.4; + private static final int TICKS_PER_VARIO_UPDATE = 4; + + public static final int FREQ_MIN = 300; + public static final int FREQ_AVG = 600; + public static final int FREQ_MAX = 2000; + + public static final int BEEP_RATE_AVG = 4; + public static final int BEEP_RATE_MAX = 24; + private static final int PROPERTY_DEPLOYED = 17; private static Map gliderMap = new MapMaker().weakKeys().weakValues().makeMap(); + private IVarioController varioControl = IVarioController.NULL; + public static boolean isEntityHoldingGlider(Entity player) { EntityHangGlider glider = gliderMap.get(player); return glider != null; @@ -75,35 +78,15 @@ public class EntityHangGlider extends Entity implements IEntityAdditionalSpawnDa } } - public static void toggleVario() { - if (!varioActive) { - varioActive = true; - } else { - varioActive = false; - } - } - - public static void incVarioVol() { - varioVolume = Math.min((varioVolume + 2), VOL_MAX); - BeepGenerator.setVolume((byte)varioVolume); - } - - public static void decVarioVol() { - varioVolume = Math.max((varioVolume - 2), VOL_MIN); - BeepGenerator.setVolume((byte)varioVolume); - } - private EntityPlayer player; private NoiseGeneratorPerlin noiseGen; - private BeepGenerator beeper; private int ticksSinceLastVarioUpdate = 0; - private double avgVspeed = 0; + private double verticalMotionSinceLastVarioUpdate = 0; private double lastMotionY = 0; public EntityHangGlider(World world) { super(world); this.noiseGen = new NoiseGeneratorPerlin(new Random(world.getCurrentDate().get(Calendar.DAY_OF_YEAR)), 2); - BeepGenerator.setVolume((byte)varioVolume); } public EntityHangGlider(World world, EntityPlayer player) { @@ -120,6 +103,10 @@ public class EntityHangGlider extends Entity implements IEntityAdditionalSpawnDa if (e instanceof EntityPlayer) { player = (EntityPlayer)e; gliderMap.put(player, this); + + if (OpenMods.proxy.isClientPlayer(player)) + varioControl = Vario.instance.acquire(); + } else { setDead(); } @@ -155,6 +142,8 @@ public class EntityHangGlider extends Entity implements IEntityAdditionalSpawnDa return; } + varioControl.keepAlive(); + boolean isDeployed = !player.onGround && !player.isInWater(); if (!worldObj.isRemote) { @@ -162,54 +151,63 @@ public class EntityHangGlider extends Entity implements IEntityAdditionalSpawnDa fixPositions(player, false); } - if (isLocalPlayer() && Config.hanggliderEnableThermal && beeper == null) - beeper = new BeepGenerator(); + if (isDeployed) { + if (player.motionY < lastMotionY) { - if (isDeployed && player.motionY < lastMotionY) { - final double horizontalSpeed; - final double verticalSpeed; - final double noise; + final double noise = Config.hanggliderEnableThermal? getNoise() : 0; - if (Config.hanggliderEnableThermal) - noise = getNoise(); - else - noise = 0; + final double vspeed = (noise >= 0? VSPEED_MAX : -VSPEED_MIN); - final double vspeed = (noise >= 0? VSPEED_MAX : -VSPEED_MIN); - - if (player.isSneaking()) { - horizontalSpeed = 0.1; - verticalSpeed = Math.max((VSPEED_FAST + noise * vspeed), VSPEED_MIN); - } else { - horizontalSpeed = 0.03; - verticalSpeed = Math.max((VSPEED_NORMAL + noise * vspeed), VSPEED_MIN); - } - - player.motionY = verticalSpeed; - motionY = verticalSpeed; - lastMotionY = verticalSpeed; - - if (isLocalPlayer()) { - if (varioActive) { - ticksSinceLastVarioUpdate++; - avgVspeed += verticalSpeed / TICKS_PER_VARIO_UPDATE; - if (ticksSinceLastVarioUpdate > TICKS_PER_VARIO_UPDATE) { - vario(avgVspeed); - ticksSinceLastVarioUpdate = 0; - avgVspeed = 0; - } + final double horizontalSpeed; + final double verticalSpeed; + if (player.isSneaking()) { + horizontalSpeed = 0.1; + verticalSpeed = Math.max((VSPEED_FAST + noise * vspeed), VSPEED_MIN); } else { - stopVario(); + horizontalSpeed = 0.03; + verticalSpeed = Math.max((VSPEED_NORMAL + noise * vspeed), VSPEED_MIN); } - } - double x = Math.cos(Math.toRadians(player.rotationYawHead + 90)) * horizontalSpeed; - double z = Math.sin(Math.toRadians(player.rotationYawHead + 90)) * horizontalSpeed; - player.motionX += x; - player.motionZ += z; - player.fallDistance = 0f; /* Don't like getting hurt :( */ - } else if (isLocalPlayer() && varioActive) { - stopVario(); + player.motionY = verticalSpeed; + motionY = verticalSpeed; + lastMotionY = verticalSpeed; + + if (varioControl.isValid()) { + ticksSinceLastVarioUpdate++; + verticalMotionSinceLastVarioUpdate += verticalSpeed; // * 1 tick, for unit freaks + if (ticksSinceLastVarioUpdate > TICKS_PER_VARIO_UPDATE) { + updateVario(verticalMotionSinceLastVarioUpdate / TICKS_PER_VARIO_UPDATE); + ticksSinceLastVarioUpdate = 0; + verticalMotionSinceLastVarioUpdate = 0; + } + } + + double x = Math.cos(Math.toRadians(player.rotationYawHead + 90)) * horizontalSpeed; + double z = Math.sin(Math.toRadians(player.rotationYawHead + 90)) * horizontalSpeed; + player.motionX += x; + player.motionZ += z; + player.fallDistance = 0f; // Don't like getting hurt :( -- Mikee, probably + } + } else { + if (varioControl.isValid()) { + updateVario(0); // well, our vertical velocity is zero, right? + ticksSinceLastVarioUpdate = 0; + verticalMotionSinceLastVarioUpdate = 0; + } + } + + } + + private void updateVario(double vspeed) { + if (vspeed <= 0) { + vspeed = Math.max(VSPEED_MIN, vspeed); + double freq = (vspeed - VSPEED_MIN) / Math.abs(VSPEED_MIN) * (FREQ_AVG - FREQ_MIN) + FREQ_MIN; + varioControl.setFrequencies(freq, 0); + } else { + vspeed = Math.min(VSPEED_MAX, vspeed); + double freq = vspeed / Math.abs(VSPEED_MAX) * (FREQ_MAX - FREQ_AVG) + FREQ_AVG; + double beepfreq = vspeed / Math.abs(VSPEED_MAX) * (BEEP_RATE_MAX - BEEP_RATE_AVG) + BEEP_RATE_AVG; + varioControl.setFrequencies(freq, beepfreq); } } @@ -241,8 +239,13 @@ public class EntityHangGlider extends Entity implements IEntityAdditionalSpawnDa public void setDead() { super.setDead(); gliderMap.remove(player); - if (isLocalPlayer()) - stopVario(); + + if (varioControl.isValid()) { + varioControl.kill(); + varioControl.release(); + ticksSinceLastVarioUpdate = 0; + verticalMotionSinceLastVarioUpdate = 0; + } } private void fixPositions(EntityPlayer thePlayer, boolean localPlayer) { @@ -272,41 +275,6 @@ public class EntityHangGlider extends Entity implements IEntityAdditionalSpawnDa this.motionZ = this.posZ - this.prevPosZ; } - private boolean isLocalPlayer() { - return worldObj.isRemote && OpenMods.proxy.isClientPlayer(player); - } - - @SideOnly(Side.CLIENT) - private void vario(double vspeed) { - if (vspeed <= 0) { - vspeed = Math.max(VSPEED_MIN, vspeed); - double freq = (vspeed - VSPEED_MIN) / Math.abs(VSPEED_MIN) * (FREQ_AVG - FREQ_MIN) + FREQ_MIN; - beeper.setToneFrequency(freq); - beeper.setBeepFrequency(0d); - } else { - vspeed = Math.min(VSPEED_MAX, vspeed); - double freq = vspeed / Math.abs(VSPEED_MAX) * (FREQ_MAX - FREQ_AVG) + FREQ_AVG; - double beepfreq = vspeed / Math.abs(VSPEED_MAX) * (BEEP_RATE_MAX - BEEP_RATE_AVG) + BEEP_RATE_AVG; - beeper.setToneFrequency(freq); - beeper.setBeepFrequency(beepfreq); - } - if (beeper.isRunning()) { - beeper.keepAlive(); - } else { - beeper.start(); - } - } - - @SideOnly(Side.CLIENT) - private void stopVario() { - if (beeper != null) { - beeper.stop(); - beeper = null; - } - ticksSinceLastVarioUpdate = 0; - avgVspeed = 0; - } - @Override protected void readEntityFromNBT(NBTTagCompound nbttagcompound) {} From c31a2186f8488329749b7a34d8379622d443a13b Mon Sep 17 00:00:00 2001 From: Bartek Bok Date: Sat, 11 Feb 2017 22:12:00 +0100 Subject: [PATCH 40/54] Rewrite beeper to fix artifacts --- .../java/openblocks/common/BeepGenerator.java | 208 +++++++++--------- src/main/java/openblocks/common/Vario.java | 12 +- 2 files changed, 118 insertions(+), 102 deletions(-) diff --git a/src/main/java/openblocks/common/BeepGenerator.java b/src/main/java/openblocks/common/BeepGenerator.java index 880d3d61..5b036445 100644 --- a/src/main/java/openblocks/common/BeepGenerator.java +++ b/src/main/java/openblocks/common/BeepGenerator.java @@ -10,30 +10,29 @@ import openmods.Log; public class BeepGenerator { - private static final int SAMPLE_RATE = 128 * 1024; - private static final int MIN_BUFFER_AVAILABLE = SAMPLE_RATE * 64 / 1000; + private static final int SAMPLE_RATE = 44100; - private byte volume = 8; + private static final int SAMPLES_PER_BUFFER = SAMPLE_RATE / 8; - public byte getVolume() { - return volume; - } + private static final int BYTES_PER_SAMPLE = 2; - public void setVolume(byte volume) { - this.volume = volume; - } + private static final int BYTES_PER_BUFFER = BYTES_PER_SAMPLE * SAMPLES_PER_BUFFER; + + private final byte[] scratchBuffer = new byte[BYTES_PER_BUFFER]; + + private static final byte[] ZERO_BUFFER = new byte[BYTES_PER_BUFFER]; + + private short volume = 2560; - private byte[] buffer; - private int bufferSize; - private boolean currentlyBeeping; private boolean running; + private double wavePhase; + private int beepPhase; + private double toneFrequency; private double lastToneFrequency; private double beepFrequency; - private int samplesSinceLastBeepChange; - - private SourceDataLine line; + private int samplesPerBeep; public BeepGenerator() { running = false; @@ -41,16 +40,17 @@ public class BeepGenerator { public void start() { running = true; - AudioFormat af = new AudioFormat(SAMPLE_RATE, 8, 1, true, true); + wavePhase = 0; + beepPhase = 0; + + AudioFormat af = new AudioFormat(SAMPLE_RATE, 8 * BYTES_PER_SAMPLE, 1, true, true); try { - this.line = AudioSystem.getSourceDataLine(af); - this.line.open(af, SAMPLE_RATE); + SourceDataLine line = AudioSystem.getSourceDataLine(af); + line.open(af, SAMPLE_RATE); + startWriter(line); } catch (LineUnavailableException e) { Log.warn(e, "Failed to initialize beeper"); } - - bufferSize = this.line.getBufferSize(); - startWriter(); } public void stop() { @@ -63,110 +63,112 @@ public class BeepGenerator { return running; } - private void startWriter() { - new Thread(new Runnable() { + private void startWriter(final SourceDataLine line) { + final Thread writerThread = new Thread(new Runnable() { @Override public void run() { - writeSample(); - writeSample(); - line.start(); - int kill = 5; + try { + while (running) { + final int available = line.available(); - while (running) { - writeSample(); + if (available >= SAMPLES_PER_BUFFER) + writeSample(line); - // Calculate sleep in ms from buffer-surplus - int bufferAvailable = bufferSize - line.available(); - int ms = (int)((bufferAvailable - MIN_BUFFER_AVAILABLE) / ((SAMPLE_RATE) / 1000d)); - - if (ms <= 8) - continue; - - // Fixes a weird bug (BeepGenerator.this.line.available() returning 0) - if (bufferAvailable == bufferSize) { - line.stop(); - while (bufferAvailable == bufferSize || bufferAvailable <= MIN_BUFFER_AVAILABLE) { - writeSample(); - bufferAvailable = bufferSize - BeepGenerator.this.line.available(); + try { + Thread.sleep(100); // has to be lower than SAMPLES_PER_BUFFER / SAMPLE_RATE + } catch (InterruptedException e) { + running = false; } - line.start(); - continue; + } - - if (ms < 100) - kill = 5; - - if (kill == 0) { - stop(); - } else { - kill--; - } - - try { - Thread.sleep(ms); - } catch (InterruptedException e) { - running = false; - } - + } finally { + line.close(); } - line.close(); } - }).start(); + }); + writerThread.setDaemon(true); + writerThread.setName("Beeper thread"); + writerThread.start(); } - private void writeSample() { - if (this.lastToneFrequency == 0d || getToneFrequency() == 0d) - this.lastToneFrequency = toneFrequency; - else if (this.lastToneFrequency < toneFrequency) - this.lastToneFrequency += Math.min(5d, toneFrequency - this.lastToneFrequency); - else if (this.lastToneFrequency > toneFrequency) - this.lastToneFrequency -= Math.min(5d, this.lastToneFrequency - toneFrequency); - - generateSample(this.lastToneFrequency); + private void writeSample(SourceDataLine line) { + byte[] buffer = generateSamplesWithSweep(this.lastToneFrequency, this.toneFrequency); + this.lastToneFrequency = this.toneFrequency; line.write(buffer, 0, buffer.length); } - private void generateSample(double frequency) { - final int samples = SAMPLE_RATE * 16 / 1000; - final float soundLevel = Minecraft.getMinecraft().gameSettings.getSoundLevel(SoundCategory.MASTER); + private byte[] generateSamplesWithSweep(double f0, double f1) { + if (f0 == 0.0 && f1 == 0.0) + return ZERO_BUFFER; - if (frequency == 0.0) { - this.buffer = new byte[samples]; - return; - } + final float masterSoundLevel = Minecraft.getMinecraft().gameSettings.getSoundLevel(SoundCategory.MASTER); - double sinLength = (SAMPLE_RATE / frequency); + if (masterSoundLevel == 0) + return ZERO_BUFFER; - int sinSmooth = (int)(sinLength - (int)(samples % sinLength)); + final float amplitude = Math.max(volume * masterSoundLevel, 2); - this.buffer = new byte[samples + sinSmooth]; + // trying to spread frequency sweep over whole sample + final double sweepDuration = (double)SAMPLES_PER_BUFFER / SAMPLE_RATE; - final int samplesPerBeep; - float vol; - if (getBeepFrequency() > 0) { - samplesPerBeep = (int)(SAMPLE_RATE / getBeepFrequency()); - vol = this.currentlyBeeping? volume : 0; - } else { - samplesPerBeep = 0; - vol = volume; - this.currentlyBeeping = true; - } + // see 'chirp' on wiki for explanation of constants + final double k = (f1 - f0) / sweepDuration; - vol = (soundLevel != 0? Math.max((vol * soundLevel), 2) : 0); + int sampleCount = 0; - for (int i = 0; i < this.buffer.length; i++) { - this.buffer[i] = (byte)(Math.sin((2.0 * Math.PI * i) / sinLength) * vol); - samplesSinceLastBeepChange++; - if (samplesPerBeep > 0 && samplesSinceLastBeepChange >= samplesPerBeep) { - this.currentlyBeeping = !this.currentlyBeeping; - if (soundLevel == 0) this.currentlyBeeping = false; - vol = (this.currentlyBeeping? Math.max((volume * soundLevel), 2) : 0); - samplesSinceLastBeepChange = 0; + if (samplesPerBeep == 0) { + for (int i = 0; i < BYTES_PER_BUFFER; i += BYTES_PER_SAMPLE, sampleCount++) { + final short v = (short)calculateSample(amplitude, wavePhase, f0, k, sampleToRealTime(sampleCount)); + writeShortSample(scratchBuffer, i, v); } + } else { + int beepSample = beepPhase; + for (int i = 0; i < BYTES_PER_BUFFER; i += BYTES_PER_SAMPLE, sampleCount++) { + if (beepSample < samplesPerBeep) { + final short v = (short)calculateSample(amplitude, wavePhase, f0, k, sampleToRealTime(sampleCount)); + writeShortSample(scratchBuffer, i, v); + } else { + scratchBuffer[i] = 0; + scratchBuffer[i + 1] = 0; + } + + if (beepSample++ >= 2 * samplesPerBeep) + beepSample = 0; + } + beepPhase = beepSample; } + + wavePhase = phase(wavePhase, f0, k, sampleToRealTime(sampleCount)) % (2 * Math.PI); + return scratchBuffer; + + } + + private static void writeShortSample(byte[] buf, int i, final short v) { + buf[i] = (byte)(v >> 8); + buf[i + 1] = (byte)(v); + } + + private static double sampleToRealTime(int sampleCount) { + return (double)sampleCount / SAMPLE_RATE; + } + + private static double calculateSample(float amplitude, double phase0, double f0, double k, double t) { + return (short)(amplitude * Math.sin(phase(phase0, f0, k, t))); + } + + private static double phase(double phase0, double f0, double k, double t) { + return phase0 + 2.0 * Math.PI * (f0 + k / 2.0 * t) * t; + } + + public short getVolume() { + return volume; + } + + public void setVolume(short volume) { + this.volume = volume; } public double getToneFrequency() { @@ -183,6 +185,12 @@ public class BeepGenerator { public void setBeepFrequency(double beepFrequency) { this.beepFrequency = beepFrequency; + + if (beepFrequency == 0) { + samplesPerBeep = 0; + } else { + samplesPerBeep = (int)(SAMPLE_RATE / beepFrequency); + } } } diff --git a/src/main/java/openblocks/common/Vario.java b/src/main/java/openblocks/common/Vario.java index 9dd82636..fe73ca22 100644 --- a/src/main/java/openblocks/common/Vario.java +++ b/src/main/java/openblocks/common/Vario.java @@ -23,6 +23,10 @@ public class Vario { private final BeepGenerator beeper = new BeepGenerator(); + { + setVolume(varioVolume); + } + private class Controller implements IVarioController { private boolean isValid = true; @@ -61,12 +65,16 @@ public class Vario { public void incVolume() { varioVolume = Math.min((varioVolume + 2), VOL_MAX); - beeper.setVolume((byte)varioVolume); + setVolume(varioVolume); } public void decVolume() { varioVolume = Math.max((varioVolume - 2), VOL_MIN); - beeper.setVolume((byte)varioVolume); + setVolume(varioVolume); + } + + private void setVolume(int volume) { + beeper.setVolume((short)(varioVolume << 8)); } public void enable() { From 463c165c9968f7b7c83224166b102b8227833eee Mon Sep 17 00:00:00 2001 From: Bartek Bok Date: Sun, 12 Feb 2017 11:53:20 +0100 Subject: [PATCH 41/54] Manually merge #813 --- .../java/openblocks/common/BeepGenerator.java | 40 ++++++++++++++---- src/main/java/openblocks/common/Vario.java | 42 ++++++++++--------- .../common/entity/EntityHangGlider.java | 2 +- 3 files changed, 55 insertions(+), 29 deletions(-) diff --git a/src/main/java/openblocks/common/BeepGenerator.java b/src/main/java/openblocks/common/BeepGenerator.java index 5b036445..e17c503f 100644 --- a/src/main/java/openblocks/common/BeepGenerator.java +++ b/src/main/java/openblocks/common/BeepGenerator.java @@ -18,6 +18,10 @@ public class BeepGenerator { private static final int BYTES_PER_BUFFER = BYTES_PER_SAMPLE * SAMPLES_PER_BUFFER; + private static final double BUFFER_DURATION = (double)SAMPLES_PER_BUFFER / SAMPLE_RATE; + + private static final double FREQUENCY_MAX_CHANGE_PER_BUFFER_DURATION = 50.0; + private final byte[] scratchBuffer = new byte[BYTES_PER_BUFFER]; private static final byte[] ZERO_BUFFER = new byte[BYTES_PER_BUFFER]; @@ -30,7 +34,7 @@ public class BeepGenerator { private int beepPhase; private double toneFrequency; - private double lastToneFrequency; + private double targetToneFrequency; private double beepFrequency; private int samplesPerBeep; @@ -55,7 +59,7 @@ public class BeepGenerator { public void stop() { running = false; - setToneFrequency(0d); + setTargetToneFrequency(0d); setBeepFrequency(0d); } @@ -95,11 +99,28 @@ public class BeepGenerator { } private void writeSample(SourceDataLine line) { - byte[] buffer = generateSamplesWithSweep(this.lastToneFrequency, this.toneFrequency); - this.lastToneFrequency = this.toneFrequency; + final double lastToneFrequency; + + if (this.toneFrequency == 0d || this.targetToneFrequency == 0d) { + lastToneFrequency = this.targetToneFrequency; + this.toneFrequency = this.targetToneFrequency; + } else { + lastToneFrequency = this.toneFrequency; + final double delta = this.targetToneFrequency - this.toneFrequency; + this.toneFrequency += limit(delta, FREQUENCY_MAX_CHANGE_PER_BUFFER_DURATION); + } + + byte[] buffer = generateSamplesWithSweep(lastToneFrequency, this.toneFrequency); line.write(buffer, 0, buffer.length); } + private static double limit(double value, double limit) { + if (value < 0) + return Math.max(value, -limit); + else + return Math.min(value, limit); + } + private byte[] generateSamplesWithSweep(double f0, double f1) { if (f0 == 0.0 && f1 == 0.0) return ZERO_BUFFER; @@ -111,8 +132,7 @@ public class BeepGenerator { final float amplitude = Math.max(volume * masterSoundLevel, 2); - // trying to spread frequency sweep over whole sample - final double sweepDuration = (double)SAMPLES_PER_BUFFER / SAMPLE_RATE; + final double sweepDuration = BUFFER_DURATION; // see 'chirp' on wiki for explanation of constants final double k = (f1 - f0) / sweepDuration; @@ -175,8 +195,12 @@ public class BeepGenerator { return toneFrequency; } - public void setToneFrequency(double frequency) { - this.toneFrequency = frequency; + public double getTargetToneFrequency() { + return this.targetToneFrequency; + } + + public void setTargetToneFrequency(double frequency) { + this.targetToneFrequency = frequency; } public double getBeepFrequency() { diff --git a/src/main/java/openblocks/common/Vario.java b/src/main/java/openblocks/common/Vario.java index fe73ca22..fd019d6c 100644 --- a/src/main/java/openblocks/common/Vario.java +++ b/src/main/java/openblocks/common/Vario.java @@ -15,6 +15,8 @@ public class Vario { private boolean isAlive; + private boolean isEnabled; + private IVarioController activeController = IVarioController.NULL; private int watchdogMissedTicks; @@ -34,7 +36,7 @@ public class Vario { @Override public void setFrequencies(double toneFrequency, double beepFrequency) { if (isValid) { - beeper.setToneFrequency(toneFrequency); + beeper.setTargetToneFrequency(toneFrequency); beeper.setBeepFrequency(beepFrequency); } } @@ -42,14 +44,13 @@ public class Vario { @Override public void keepAlive() { if (isValid) - watchdogMissedTicks = 0; + resetWatchdog(); } @Override public void kill() { - if (isValid) { + if (isValid) isAlive = false; - } } @Override @@ -78,30 +79,19 @@ public class Vario { } public void enable() { - // no point in activating, if nothing feeds us data - if (activeController.isValid()) { - isAlive = true; - watchdogMissedTicks = 0; - - if (watchdogThread == null || !watchdogThread.isAlive()) - watchdogThread = startWatchdog(); - } + isEnabled = true; } public void disable() { - isAlive = false; + isEnabled = false; } public boolean isEnabled() { - return isAlive; + return isEnabled; } public void toggle() { - if (isAlive) { - disable(); - } else { - enable(); - } + isEnabled = !isEnabled; } public IVarioController acquire() { @@ -111,14 +101,26 @@ public class Vario { return (activeController = new Controller()); } + private void resetWatchdog() { + if (isEnabled) { + watchdogMissedTicks = 0; + + if (watchdogThread == null || !watchdogThread.isAlive()) { + watchdogThread = startWatchdog(); + } + } + } + private Thread startWatchdog() { + isAlive = true; + final Thread watchdogThread = new Thread(new Runnable() { @Override public void run() { beeper.start(); try { - while (isAlive) { + while (isAlive && isEnabled) { if (watchdogMissedTicks++ > WATCHDOG_TIMEOUT_TICKS) break; diff --git a/src/main/java/openblocks/common/entity/EntityHangGlider.java b/src/main/java/openblocks/common/entity/EntityHangGlider.java index a9916d36..9f90a3c4 100644 --- a/src/main/java/openblocks/common/entity/EntityHangGlider.java +++ b/src/main/java/openblocks/common/entity/EntityHangGlider.java @@ -190,7 +190,7 @@ public class EntityHangGlider extends Entity implements IEntityAdditionalSpawnDa } } else { if (varioControl.isValid()) { - updateVario(0); // well, our vertical velocity is zero, right? + varioControl.setFrequencies(0, 0); ticksSinceLastVarioUpdate = 0; verticalMotionSinceLastVarioUpdate = 0; } From 7d386a6b1a068319c991e198859c5634cbe24b27 Mon Sep 17 00:00:00 2001 From: Bartek Bok Date: Sun, 12 Feb 2017 16:05:10 +0100 Subject: [PATCH 42/54] Fix race conditions in vario --- .../java/openblocks/common/BeepGenerator.java | 114 ++++++++++-------- src/main/java/openblocks/common/Vario.java | 101 +++++++++------- 2 files changed, 119 insertions(+), 96 deletions(-) diff --git a/src/main/java/openblocks/common/BeepGenerator.java b/src/main/java/openblocks/common/BeepGenerator.java index e17c503f..3640084d 100644 --- a/src/main/java/openblocks/common/BeepGenerator.java +++ b/src/main/java/openblocks/common/BeepGenerator.java @@ -28,8 +28,6 @@ public class BeepGenerator { private short volume = 2560; - private boolean running; - private double wavePhase; private int beepPhase; @@ -38,64 +36,78 @@ public class BeepGenerator { private double beepFrequency; private int samplesPerBeep; - public BeepGenerator() { - running = false; - } + private class WriterThread extends Thread { - public void start() { - running = true; - wavePhase = 0; - beepPhase = 0; + private final SourceDataLine line; - AudioFormat af = new AudioFormat(SAMPLE_RATE, 8 * BYTES_PER_SAMPLE, 1, true, true); - try { - SourceDataLine line = AudioSystem.getSourceDataLine(af); - line.open(af, SAMPLE_RATE); - startWriter(line); - } catch (LineUnavailableException e) { - Log.warn(e, "Failed to initialize beeper"); + private boolean running = true; + + public WriterThread(SourceDataLine line) { + this.line = line; + setDaemon(true); + setName("Beeper thread"); + } + + @Override + public void run() { + line.start(); + + try { + while (running) { + final int available = line.available(); + + if (available >= SAMPLES_PER_BUFFER) + writeSample(line); + + try { + Thread.sleep(100); // has to be lower than SAMPLES_PER_BUFFER / SAMPLE_RATE + } catch (InterruptedException e) { + running = false; + } + } + } finally { + running = false; + line.close(); + } + } + + public boolean isShuttingDown() { + return !running; + } + + public void shutdown() { + running = false; } } - public void stop() { - running = false; + private WriterThread writerThread; + + public synchronized void start() { + wavePhase = 0; + beepPhase = 0; + + if (!isRunning()) { + final AudioFormat af = new AudioFormat(SAMPLE_RATE, 8 * BYTES_PER_SAMPLE, 1, true, true); + try { + SourceDataLine line = AudioSystem.getSourceDataLine(af); + line.open(af, SAMPLE_RATE); + writerThread = new WriterThread(line); + writerThread.start(); + } catch (LineUnavailableException e) { + Log.warn(e, "Failed to initialize beeper"); + if (writerThread != null) writerThread.shutdown(); + } + } + } + + public synchronized void stop() { + if (writerThread != null) writerThread.shutdown(); setTargetToneFrequency(0d); setBeepFrequency(0d); } - public boolean isRunning() { - return running; - } - - private void startWriter(final SourceDataLine line) { - final Thread writerThread = new Thread(new Runnable() { - - @Override - public void run() { - line.start(); - - try { - while (running) { - final int available = line.available(); - - if (available >= SAMPLES_PER_BUFFER) - writeSample(line); - - try { - Thread.sleep(100); // has to be lower than SAMPLES_PER_BUFFER / SAMPLE_RATE - } catch (InterruptedException e) { - running = false; - } - - } - } finally { - line.close(); - } - } - }); - writerThread.setDaemon(true); - writerThread.setName("Beeper thread"); - writerThread.start(); + public synchronized boolean isRunning() { + return writerThread != null && writerThread.isAlive() && !writerThread.isShuttingDown(); } private void writeSample(SourceDataLine line) { diff --git a/src/main/java/openblocks/common/Vario.java b/src/main/java/openblocks/common/Vario.java index fd019d6c..c3c3afb2 100644 --- a/src/main/java/openblocks/common/Vario.java +++ b/src/main/java/openblocks/common/Vario.java @@ -13,15 +13,11 @@ public class Vario { private int varioVolume = 8; - private boolean isAlive; - private boolean isEnabled; private IVarioController activeController = IVarioController.NULL; - private int watchdogMissedTicks; - - private Thread watchdogThread; + private WatchdogThread watchdogThread; private final BeepGenerator beeper = new BeepGenerator(); @@ -42,15 +38,15 @@ public class Vario { } @Override - public void keepAlive() { + public synchronized void keepAlive() { if (isValid) resetWatchdog(); } @Override - public void kill() { + public synchronized void kill() { if (isValid) - isAlive = false; + if (watchdogThread != null) watchdogThread.shutdown(); } @Override @@ -64,6 +60,53 @@ public class Vario { } } + private class WatchdogThread extends Thread { + + private boolean isAlive = true; + private int watchdogMissedTicks; + + public WatchdogThread() { + setName("Vario watchdog"); + setDaemon(true); + } + + @Override + public void run() { + try { + while (isAlive && isEnabled) { + if (watchdogMissedTicks++ > WATCHDOG_TIMEOUT_TICKS) { + isAlive = false; + break; + } + + if (!beeper.isRunning()) beeper.start(); + + try { + Thread.sleep(WATCHDOG_PERIOD); + } catch (InterruptedException e) { + isAlive = false; + break; + } + } + } finally { + beeper.stop(); + isAlive = false; + } + } + + public boolean isShuttingDown() { + return !isAlive || !isEnabled; + } + + public void shutdown() { + isAlive = false; + } + + public void ping() { + watchdogMissedTicks = 0; + } + } + public void incVolume() { varioVolume = Math.min((varioVolume + 2), VOL_MAX); setVolume(varioVolume); @@ -103,44 +146,12 @@ public class Vario { private void resetWatchdog() { if (isEnabled) { - watchdogMissedTicks = 0; - - if (watchdogThread == null || !watchdogThread.isAlive()) { - watchdogThread = startWatchdog(); + if (watchdogThread == null || !watchdogThread.isAlive() || watchdogThread.isShuttingDown()) { + watchdogThread = new WatchdogThread(); + watchdogThread.start(); + } else if (watchdogThread != null) { + watchdogThread.ping(); } } } - - private Thread startWatchdog() { - isAlive = true; - - final Thread watchdogThread = new Thread(new Runnable() { - @Override - public void run() { - beeper.start(); - - try { - while (isAlive && isEnabled) { - if (watchdogMissedTicks++ > WATCHDOG_TIMEOUT_TICKS) - break; - - try { - Thread.sleep(WATCHDOG_PERIOD); - } catch (InterruptedException e) { - break; - } - } - } finally { - beeper.stop(); - isAlive = false; - } - } - }); - - watchdogThread.setName("Vario watchdog"); - watchdogThread.setDaemon(true); - watchdogThread.start(); - - return watchdogThread; - } } From c9e885323c438d576b6bd0a8c1e5ab3f57a71a43 Mon Sep 17 00:00:00 2001 From: Bartek Bok Date: Sat, 18 Feb 2017 20:54:48 +0100 Subject: [PATCH 43/54] Extract refactor last stand calculations --- OpenModsLib | 2 +- .../LastStandEnchantmentsHandler.java | 75 ++++++++----------- 2 files changed, 34 insertions(+), 43 deletions(-) diff --git a/OpenModsLib b/OpenModsLib index 5479dc24..6ef4d543 160000 --- a/OpenModsLib +++ b/OpenModsLib @@ -1 +1 @@ -Subproject commit 5479dc24b72f185001ffdfdcffa54650b03c8d12 +Subproject commit 6ef4d543ccfb148c18a281d1e153de2ac69779c4 diff --git a/src/main/java/openblocks/enchantments/LastStandEnchantmentsHandler.java b/src/main/java/openblocks/enchantments/LastStandEnchantmentsHandler.java index a832cb90..38167bc6 100644 --- a/src/main/java/openblocks/enchantments/LastStandEnchantmentsHandler.java +++ b/src/main/java/openblocks/enchantments/LastStandEnchantmentsHandler.java @@ -1,5 +1,6 @@ package openblocks.enchantments; +import com.google.common.base.Supplier; import cpw.mods.fml.common.eventhandler.SubscribeEvent; import java.util.Map; import net.minecraft.enchantment.EnchantmentHelper; @@ -7,10 +8,10 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import openblocks.Config; import openblocks.OpenBlocks.Enchantments; -import openmods.Log; -import openmods.calc.Calculator; +import openmods.calc.Environment; import openmods.calc.ExprType; -import openmods.calc.IExecutable; +import openmods.calc.SingleExprEvaluator; +import openmods.calc.SingleExprEvaluator.EnvironmentConfigurator; import openmods.calc.types.fp.DoubleCalculatorFactory; import openmods.config.properties.ConfigurationChange; import openmods.entity.PlayerDamageEvent; @@ -23,30 +24,24 @@ public class LastStandEnchantmentsHandler { private static final String VAR_PLAYER_HP = "hp"; private static final String VAR_DAMAGE = "dmg"; - private final Calculator reductionCalculator = DoubleCalculatorFactory.createSimple(); + private final SingleExprEvaluator reductionCalculator = SingleExprEvaluator.create(DoubleCalculatorFactory.createDefault()); - private boolean useBuiltIn; - private IExecutable formula; + { + updateReductionFormula(); + } @SubscribeEvent public void onConfigChange(ConfigurationChange.Post evt) { - if (evt.check("features", "lastStandFormula")) { - useBuiltIn = false; - formula = null; - } + if (evt.check("features", "lastStandFormula")) + updateReductionFormula(); } - private static float builtInFormula(float healthAvailable, float enchantmentLevels) { - float xpRequired = 1f - healthAvailable; - - xpRequired *= 50; - xpRequired /= enchantmentLevels; - xpRequired = Math.max(1, xpRequired); - return xpRequired; + private void updateReductionFormula() { + reductionCalculator.setExpr(ExprType.INFIX, Config.lastStandEnchantmentFormula); } @SubscribeEvent - public void onHurt(PlayerDamageEvent e) { + public void onHurt(final PlayerDamageEvent e) { final int enchantmentLevels = countLastStandEnchantmentLevels(e.player); if (enchantmentLevels > 0) { @@ -56,30 +51,26 @@ public class LastStandEnchantmentsHandler { if (healthAvailable < 1f) { final int xpAvailable = EnchantmentUtils.getPlayerXP(e.player); - float xpRequired = builtInFormula(healthAvailable, enchantmentLevels); - - if (!useBuiltIn) { - if (formula == null) { - try { - formula = reductionCalculator.compilers.compile(ExprType.INFIX, Config.lastStandEnchantmentFormula); - } catch (Exception ex) { - useBuiltIn = true; - Log.warn(ex, "Failed to compile formula %s", Config.lastStandEnchantmentFormula); - } - } - - reductionCalculator.environment.setGlobalSymbol(VAR_ENCH_LEVEL, Double.valueOf(enchantmentLevels)); - reductionCalculator.environment.setGlobalSymbol(VAR_PLAYER_XP, Double.valueOf(xpAvailable)); - reductionCalculator.environment.setGlobalSymbol(VAR_PLAYER_HP, Double.valueOf(playerHealth)); - reductionCalculator.environment.setGlobalSymbol(VAR_DAMAGE, Double.valueOf(e.amount)); - - try { - xpRequired = reductionCalculator.environment.executeAndPop(formula).floatValue(); - } catch (Exception ex) { - useBuiltIn = true; - Log.warn(ex, "Failed to execute formula %s", Config.lastStandEnchantmentFormula); - } - } + float xpRequired = reductionCalculator.evaluate( + new EnvironmentConfigurator() { + @Override + public void accept(Environment env) { + env.setGlobalSymbol(VAR_ENCH_LEVEL, Double.valueOf(enchantmentLevels)); + env.setGlobalSymbol(VAR_PLAYER_XP, Double.valueOf(xpAvailable)); + env.setGlobalSymbol(VAR_PLAYER_HP, Double.valueOf(playerHealth)); + env.setGlobalSymbol(VAR_DAMAGE, Double.valueOf(e.amount)); + } + }, + new Supplier() { + @Override + public Double get() { + float xpRequired = 1f - healthAvailable; + xpRequired *= 50; + xpRequired /= enchantmentLevels; + xpRequired = Math.max(1, xpRequired); + return Double.valueOf(xpRequired); + } + }).floatValue(); if (xpAvailable >= xpRequired) { e.player.setHealth(1f); From 94f467da5d735548a6b035588966b634bbd6c8a4 Mon Sep 17 00:00:00 2001 From: Bartek Bok Date: Sat, 18 Feb 2017 22:13:01 +0100 Subject: [PATCH 44/54] Make trophy drops calculations more customizable, tweak defaults --- OpenModsLib | 2 +- src/main/java/openblocks/Config.java | 8 ++- .../java/openblocks/common/TrophyHandler.java | 71 +++++++++++++++---- 3 files changed, 66 insertions(+), 15 deletions(-) diff --git a/OpenModsLib b/OpenModsLib index 6ef4d543..789169a4 160000 --- a/OpenModsLib +++ b/OpenModsLib @@ -1 +1 @@ -Subproject commit 6ef4d543ccfb148c18a281d1e153de2ac69779c4 +Subproject commit 789169a4036b5db1b6b7a7efb3351ce28ab2b9b5 diff --git a/src/main/java/openblocks/Config.java b/src/main/java/openblocks/Config.java index c3a6e51d..19ec3110 100644 --- a/src/main/java/openblocks/Config.java +++ b/src/main/java/openblocks/Config.java @@ -88,12 +88,16 @@ public class Config { @OnLineModifiable @ConfigProperty(category = "tanks", name = "fluidDifferenceUpdateThreshold", comment = "Minimal difference in fluid level between neigbors required for tank update (can be used for performance finetuning") - public static final int tankFluidUpdateThreshold = 0; + public static int tankFluidUpdateThreshold = 0; @OnLineModifiable - @ConfigProperty(category = "trophy", name = "trophyDropChance", comment = "The chance (from 0 to 1) of a trophy drop. for example, 0.001 for 1/1000") + @ConfigProperty(category = "trophy", name = "trophyDropChance", comment = "Legacy value. For actual configuration, see 'trophyDropChanceFormula'") public static double trophyDropChance = 0.001; + @OnLineModifiable + @ConfigProperty(category = "trophy", name = "trophyDropChanceFormula", comment = "Formula for calculating trophy drop chance. Trophy drops when result is positive.") + public static String trophyDropChanceFormula = "let([bias=rand()/4, selection=rand()], (looting + bias) * chance - selection)"; + @OnLineModifiable @ConfigProperty(category = "dropblock", name = "irregularBlocksArePassable", comment = "The elevator will try to pass through blocks that have custom collision boxes") public static boolean irregularBlocksArePassable = true; diff --git a/src/main/java/openblocks/common/TrophyHandler.java b/src/main/java/openblocks/common/TrophyHandler.java index 13a650fc..d2323e6d 100644 --- a/src/main/java/openblocks/common/TrophyHandler.java +++ b/src/main/java/openblocks/common/TrophyHandler.java @@ -1,6 +1,7 @@ package openblocks.common; import com.google.common.base.Strings; +import com.google.common.base.Supplier; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Maps; import cpw.mods.fml.common.eventhandler.SubscribeEvent; @@ -32,14 +33,36 @@ import openblocks.trophy.SnowmanBehavior; import openblocks.trophy.SquidBehavior; import openblocks.trophy.WitchBehavior; import openmods.Log; +import openmods.calc.Environment; +import openmods.calc.ExprType; +import openmods.calc.SingleExprEvaluator; +import openmods.calc.SingleExprEvaluator.EnvironmentConfigurator; +import openmods.calc.types.fp.DoubleCalculatorFactory; +import openmods.config.properties.ConfigurationChange; import openmods.reflection.ReflectionHelper; public class TrophyHandler { - private static final Random DROP_RAND = new Random(); - private static final Map ENTITY_CACHE = Maps.newHashMap(); + private final Random fallbackDropChance = new Random(); + + private final SingleExprEvaluator dropChangeCalculator = SingleExprEvaluator.create(DoubleCalculatorFactory.createDefault()); + + { + updateDropChanceFormula(); + } + + @SubscribeEvent + public void onConfigChange(ConfigurationChange.Post evt) { + if (evt.check("trophy", "trophyDropChanceFormula")) + updateDropChanceFormula(); + } + + private void updateDropChanceFormula() { + dropChangeCalculator.setExpr(ExprType.INFIX, Config.trophyDropChanceFormula); + } + public static Entity getEntityFromCache(Trophy trophy) { Entity entity = ENTITY_CACHE.get(trophy); if (entity == null) { @@ -204,19 +227,43 @@ public class TrophyHandler { } @SubscribeEvent - public void onLivingDrops(LivingDropsEvent event) { - if (event.recentlyHit && DROP_RAND.nextDouble() < Config.trophyDropChance * event.lootingLevel) { - final Entity entity = event.entity; - String entityName = EntityList.getEntityString(entity); - if (!Strings.isNullOrEmpty(entityName)) { - Trophy mobTrophy = Trophy.TYPES.get(entityName); - if (mobTrophy != null) { - EntityItem drop = new EntityItem(entity.worldObj, entity.posX, entity.posY, entity.posZ, mobTrophy.getItemStack()); - drop.delayBeforeCanPickup = 10; - event.drops.add(drop); + public void onLivingDrops(final LivingDropsEvent event) { + final Entity entity = event.entity; + if (event.recentlyHit && canDrop(entity)) { + final Double result = dropChangeCalculator.evaluate( + new EnvironmentConfigurator() { + @Override + public void accept(Environment env) { + env.setGlobalSymbol("looting", Double.valueOf(event.lootingLevel)); + env.setGlobalSymbol("specialDrop", Double.valueOf(event.specialDropValue)); + env.setGlobalSymbol("chance", Config.trophyDropChance); + } + }, new Supplier() { + @Override + public Double get() { + final double bias = fallbackDropChance.nextDouble() / 4; + final double selection = fallbackDropChance.nextDouble(); + return (event.lootingLevel + bias) * Config.trophyDropChance - selection; + } + }); + + if (result > 0) { + final String entityName = EntityList.getEntityString(entity); + if (!Strings.isNullOrEmpty(entityName)) { + Trophy mobTrophy = Trophy.TYPES.get(entityName); + if (mobTrophy != null) { + EntityItem drop = new EntityItem(entity.worldObj, entity.posX, entity.posY, entity.posZ, mobTrophy.getItemStack()); + drop.delayBeforeCanPickup = 10; + event.drops.add(drop); + } } } } } + private static boolean canDrop(Entity entity) { + final World world = entity.worldObj; + return world != null && world.getGameRules().getGameRuleBooleanValue("doMobLoot"); + } + } From 8fd06fb522c6f8a255b1ecda4e89d957af0d2d38 Mon Sep 17 00:00:00 2001 From: Bartek Bok Date: Sun, 19 Feb 2017 12:00:53 +0100 Subject: [PATCH 45/54] Add page numbers to info book TOC --- .../openblocks/client/gui/GuiInfoBook.java | 60 +++++--------- .../java/openblocks/client/gui/TocPage.java | 79 +++++++++++++++++++ 2 files changed, 97 insertions(+), 42 deletions(-) create mode 100644 src/main/java/openblocks/client/gui/TocPage.java diff --git a/src/main/java/openblocks/client/gui/GuiInfoBook.java b/src/main/java/openblocks/client/gui/GuiInfoBook.java index f99a8b64..c2ef9c38 100644 --- a/src/main/java/openblocks/client/gui/GuiInfoBook.java +++ b/src/main/java/openblocks/client/gui/GuiInfoBook.java @@ -5,7 +5,6 @@ import java.io.File; import java.util.List; import net.minecraft.client.Minecraft; import net.minecraft.server.MinecraftServer; -import net.minecraft.util.StatCollector; import net.minecraft.world.World; import openblocks.OpenBlocks; import openblocks.client.ChangelogBuilder; @@ -18,7 +17,6 @@ import openmods.gui.ComponentGui; import openmods.gui.DummyContainer; import openmods.gui.component.BaseComposite; import openmods.gui.component.GuiComponentBook; -import openmods.gui.component.GuiComponentLabel; import openmods.gui.component.page.PageBase; import openmods.gui.component.page.PageBase.ActionIcon; import openmods.gui.component.page.SectionPage; @@ -35,10 +33,6 @@ public class GuiInfoBook extends ComponentGui { super(new DummyContainer(), 0, 0); } - private static void setupBookmark(GuiComponentLabel label, GuiComponentBook book, int index) { - label.setListener(book.createBookmarkListener(index)); - } - @Override public void initGui() { // Nothing can change this value, otherwise client will crash when player picks item @@ -56,12 +50,6 @@ public class GuiInfoBook extends ComponentGui { return index; } - private static int tocLine(int index) { - final int tocStartHeight = 70; - final int tocLineHeight = 15; - return tocStartHeight + index * tocLineHeight; - } - @Override public void handleKeyboardInput() { super.handleKeyboardInput(); @@ -87,30 +75,16 @@ public class GuiInfoBook extends ComponentGui { @Override protected BaseComposite createRoot() { book = new GuiComponentBook(); - PageBase contentsPage = new TitledPage("openblocks.gui.welcome.title", "openblocks.gui.welcome.content"); - - GuiComponentLabel lblBlocks = new GuiComponentLabel(27, tocLine(0), "- " + StatCollector.translateToLocal("openblocks.gui.blocks")); - contentsPage.addComponent(lblBlocks); - - GuiComponentLabel lblItems = new GuiComponentLabel(27, tocLine(1), "- " + StatCollector.translateToLocal("openblocks.gui.items")); - contentsPage.addComponent(lblItems); - - GuiComponentLabel lblMisc = new GuiComponentLabel(27, tocLine(2), "- " + StatCollector.translateToLocal("openblocks.gui.misc")); - contentsPage.addComponent(lblMisc); - - GuiComponentLabel lblChangelogs = new GuiComponentLabel(27, tocLine(3), "- " + StatCollector.translateToLocal("openblocks.gui.changelogs")); - contentsPage.addComponent(lblChangelogs); book.addPage(PageBase.BLANK_PAGE); book.addPage(new IntroPage()); book.addPage(new TitledPage("openblocks.gui.credits.title", "openblocks.gui.credits.content")); + + final TocPage contentsPage = new TocPage(book, Minecraft.getMinecraft().fontRenderer); book.addPage(contentsPage); { - int blocksIndex = alignToEven(book); - setupBookmark(lblBlocks, book, blocksIndex); - book.addPage(PageBase.BLANK_PAGE); - book.addPage(new SectionPage("openblocks.gui.blocks")); + addSectionPage(book, contentsPage, "openblocks.gui.blocks"); PageBuilder builder = new PageBuilder(); builder.includeModId(OpenBlocks.MODID); @@ -121,10 +95,7 @@ public class GuiInfoBook extends ComponentGui { } { - int itemsIndex = alignToEven(book); - setupBookmark(lblItems, book, itemsIndex); - book.addPage(PageBase.BLANK_PAGE); - book.addPage(new SectionPage("openblocks.gui.items")); + addSectionPage(book, contentsPage, "openblocks.gui.items"); PageBuilder builder = new PageBuilder(); builder.includeModId(OpenBlocks.MODID); @@ -135,10 +106,8 @@ public class GuiInfoBook extends ComponentGui { } { - int miscIndex = alignToEven(book); - setupBookmark(lblMisc, book, miscIndex); - book.addPage(PageBase.BLANK_PAGE); - book.addPage(new SectionPage("openblocks.gui.misc")); + addSectionPage(book, contentsPage, "openblocks.gui.misc"); + book.addPage(new TitledPage("openblocks.gui.config.title", "openblocks.gui.config.content")); book.addPage(new TitledPage("openblocks.gui.restore_inv.title", "openblocks.gui.restore_inv.content") .addActionButton(10, 133, getSavePath(), ActionIcon.FOLDER.icon, "openblocks.gui.save_folder")); @@ -150,12 +119,11 @@ public class GuiInfoBook extends ComponentGui { } - int changelogsIndex = alignToEven(book); - book.addPage(PageBase.BLANK_PAGE); - setupBookmark(lblChangelogs, book, changelogsIndex); - book.addPage(new SectionPage("openblocks.gui.changelogs")); + { + addSectionPage(book, contentsPage, "openblocks.gui.changelogs"); - createChangelogPages(book); + createChangelogPages(book); + } book.enablePages(); @@ -165,6 +133,14 @@ public class GuiInfoBook extends ComponentGui { return book; } + private static void addSectionPage(GuiComponentBook book, TocPage contentsPage, String sectionLabel) { + final int startIndex = alignToEven(book); + + book.addPage(PageBase.BLANK_PAGE); + book.addPage(new SectionPage(sectionLabel)); + contentsPage.addTocEntry(sectionLabel, startIndex, startIndex + 2); + } + private static File getSavePath() { try { MinecraftServer server = MinecraftServer.getServer(); diff --git a/src/main/java/openblocks/client/gui/TocPage.java b/src/main/java/openblocks/client/gui/TocPage.java new file mode 100644 index 00000000..32175ff6 --- /dev/null +++ b/src/main/java/openblocks/client/gui/TocPage.java @@ -0,0 +1,79 @@ +package openblocks.client.gui; + +import net.minecraft.client.gui.FontRenderer; +import net.minecraft.util.StatCollector; +import openmods.gui.component.GuiComponentBook; +import openmods.gui.component.GuiComponentLabel; +import openmods.gui.component.page.TitledPage; +import openmods.gui.listener.IMouseDownListener; + +public class TocPage extends TitledPage { + + private static final int TOC_LINE_LEFT_MARGIN = 20; + private static final int TOC_TOTAL_LINE_WIDTH = 140; + private static final int TOC_START_HEIGHT = 70; + private static final int TOC_LINE_HEIGHT = 15; + + private final GuiComponentBook book; + + private final FontRenderer fontRenderer; + + private int nextTocEntry; + + public TocPage(GuiComponentBook book, FontRenderer fontRenderer) { + super("openblocks.gui.welcome.title", "openblocks.gui.welcome.content"); + this.book = book; + this.fontRenderer = fontRenderer; + } + + private static int tocLine(int index) { + return TOC_START_HEIGHT + index * TOC_LINE_HEIGHT; + } + + public void addTocEntry(String untranslatedLabel, int pageIndex, int displayedPage) { + int lineWidthBudget = TOC_TOTAL_LINE_WIDTH; + + final String translatedLabel = StatCollector.translateToLocal(untranslatedLabel); + + final String pageNumber = Integer.toString(displayedPage); + + final int labelWidth = fontRenderer.getStringWidth(translatedLabel); + lineWidthBudget -= labelWidth; + + final int pageNumberWidth = fontRenderer.getStringWidth(pageNumber); + lineWidthBudget -= pageNumberWidth; + + final int spaceWidth = fontRenderer.getCharWidth(' '); + lineWidthBudget -= 2 * spaceWidth; + + final int dotWidth = fontRenderer.getCharWidth('.'); + final StringBuilder paddedPageNumberBuilder = new StringBuilder(); + + while (lineWidthBudget - dotWidth > 0) { + paddedPageNumberBuilder.append('.'); + lineWidthBudget -= dotWidth; + } + + paddedPageNumberBuilder.append(' '); + paddedPageNumberBuilder.append(pageNumber); + + String paddedPageNumber = paddedPageNumberBuilder.toString(); + + final IMouseDownListener pageJumpListener = book.createBookmarkListener(pageIndex); + + { + final GuiComponentLabel label = new GuiComponentLabel(TOC_LINE_LEFT_MARGIN, tocLine(nextTocEntry), translatedLabel); + label.setListener(pageJumpListener); + addComponent(label); + } + + { + final int pos = TOC_LINE_LEFT_MARGIN + labelWidth + lineWidthBudget; + final GuiComponentLabel label = new GuiComponentLabel(pos, tocLine(nextTocEntry), paddedPageNumber); + label.setListener(pageJumpListener); + addComponent(label); + } + + nextTocEntry++; + } +} From 160e11b94d3246eaee37e7cd21e2081a5f956ed4 Mon Sep 17 00:00:00 2001 From: Bartek Bok Date: Sun, 19 Feb 2017 12:53:24 +0100 Subject: [PATCH 46/54] Fix #798 --- OpenModsLib | 2 +- src/main/java/openblocks/common/block/BlockGuide.java | 4 ++-- src/main/java/openblocks/shapes/GuideShape.java | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/OpenModsLib b/OpenModsLib index 789169a4..0d238448 160000 --- a/OpenModsLib +++ b/OpenModsLib @@ -1 +1 @@ -Subproject commit 789169a4036b5db1b6b7a7efb3351ce28ab2b9b5 +Subproject commit 0d23844869dfa11f495b543d14e68e8c4c56427e diff --git a/src/main/java/openblocks/common/block/BlockGuide.java b/src/main/java/openblocks/common/block/BlockGuide.java index 42649501..6f886b35 100644 --- a/src/main/java/openblocks/common/block/BlockGuide.java +++ b/src/main/java/openblocks/common/block/BlockGuide.java @@ -126,8 +126,8 @@ public class BlockGuide extends OpenBlock implements ISelectionAware { final BoundingBoxMap subBoxes = BoundingBoxMap.create(); - subBoxes.addBox(addButton(face, transform, 1, 7, 4, 7), createRotationManipulator(HalfAxis.NEG_Y)); - subBoxes.addBox(addButton(face, transform, 11, 7, 4, 7), createRotationManipulator(HalfAxis.POS_Y)); + subBoxes.addBox(addButton(face, transform, 1, 3, 4, 11), createRotationManipulator(HalfAxis.NEG_Y)); + subBoxes.addBox(addButton(face, transform, 11, 3, 4, 11), createRotationManipulator(HalfAxis.POS_Y)); subBoxes.addBox(addButton(face, transform, 5, 2, 6, 3), new IShapeManipulator() { @Override diff --git a/src/main/java/openblocks/shapes/GuideShape.java b/src/main/java/openblocks/shapes/GuideShape.java index 191629d2..e905897e 100644 --- a/src/main/java/openblocks/shapes/GuideShape.java +++ b/src/main/java/openblocks/shapes/GuideShape.java @@ -15,7 +15,7 @@ public enum GuideShape { Cylinder(new ShapeCylinderGenerator(), "cylinder"), Cuboid(new ShapeCuboidGenerator(ShapeCuboidGenerator.Elements.EDGES), "cuboid"), FullCuboid(new ShapeCuboidGenerator(ShapeCuboidGenerator.Elements.WALLS), "full_cuboid"), - Dome(new ShapeSphereGenerator(Octant.TOP), "dome"), + Dome(new ShapeSphereGenerator(Octant.SOUTH), "dome"), Triangle(new ShapeEquilateral2dGenerator(3), "triangle"), Pentagon(new ShapeEquilateral2dGenerator(5), "pentagon"), Hexagon(new ShapeEquilateral2dGenerator(6), "hexagon"), From 8a67a7f9d872c54376acac6fda4bcd9ddd1a1392 Mon Sep 17 00:00:00 2001 From: Felix Emmert Date: Thu, 23 Feb 2017 02:35:54 +0100 Subject: [PATCH 47/54] Add a hint about thermals to the book. Also better german translation for the hangglider (the old name was simply wrong). --- src/main/resources/assets/openblocks/lang/de_DE.lang | 6 +++--- src/main/resources/assets/openblocks/lang/en_US.lang | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/resources/assets/openblocks/lang/de_DE.lang b/src/main/resources/assets/openblocks/lang/de_DE.lang index 90685a5d..63dd9320 100644 --- a/src/main/resources/assets/openblocks/lang/de_DE.lang +++ b/src/main/resources/assets/openblocks/lang/de_DE.lang @@ -306,10 +306,10 @@ item.openblocks.devnull.description=Klicke mit /dev/null, um das Inventar zu öf item.openblocks.slimalyzer.name=Schleimalysierer item.openblocks.slimalyzer.description=Renne mit einem Schleimalysierer in deiner Hand herum, und er wird jedes Mal aufleuchten, wenn du dich in einem Schleime spawnenden Chunk befindest. -item.openblocks.hangglider.name=Gleitschirm -item.openblocks.hangglider.description=Der Gleitschirm ist selbsterklärend. Halte ihn in deiner Hand und klicke, um ihn auf deinem Rücken zu platzieren. Und jetzt spring!\nUm deine Geschwindigkeit zu erhöhen, kannst du Shift drücken, während du gleitest, aber pass auf, du wirst schneller sinken! +item.openblocks.hangglider.name=Hängegleiter +item.openblocks.hangglider.description=Der Hängegleiter ist selbsterklärend. Halte ihn in deiner Hand und klicke, um ihn auf deinem Rücken zu platzieren. Jetzt spring!\nDrücke Shift um während des Gleitens deine Geschwindigkeit zu erhöhen, doch pass auf, du wirst schneller sinken!\n\nDein Hängegleiter ist außerdem mit einem Variometer zur akustischen Indikation vertikaler Luftbewegungen ausgerüstet. Drücke V und bleibe für immer oben (oder bis die Sonne untergeht)! -item.openblocks.gliderwing.name=Gleitschirmflügel +item.openblocks.gliderwing.name=Gleiterflügel item.openblocks.sleepingbag.name=Schlafsack item.openblocks.sleepingbag.description=Mit dem Schlafsack kannst du in der Wildnis schlafen, ohne deine Spawn-Position zurückzusetzen. Um zu schlafen, trage ihn einfach auf dem Rücken. diff --git a/src/main/resources/assets/openblocks/lang/en_US.lang b/src/main/resources/assets/openblocks/lang/en_US.lang index 16e07217..b05d71f7 100644 --- a/src/main/resources/assets/openblocks/lang/en_US.lang +++ b/src/main/resources/assets/openblocks/lang/en_US.lang @@ -307,7 +307,7 @@ item.openblocks.slimalyzer.name=Slimalyzer item.openblocks.slimalyzer.description=Walk around with the slimalyzer in your hand and it'll light up whenever you're in a slime spawning chunk. item.openblocks.hangglider.name=Hang Glider -item.openblocks.hangglider.description=The hang glider is self explanatory. Hold it in your hand and click to place it on your back. Now jump!\nTo increase your speed you can press shift while gliding, but watch out, you'll lose altitude faster! +item.openblocks.hangglider.description=The hang glider is self explanatory. Hold it in your hand and click to place it on your back. Now jump!\nTo increase your speed you can press shift while gliding, but watch out, you'll lose altitude faster!\n\nYour hang glider now also includes an acoustic variometer indicating vertical air movement. Press V to activate it and stay up forever (or until the sun goes down)! item.openblocks.gliderwing.name=Glider Wing From 5323edbd1e513593751708ea1f281ea6f5bc9c11 Mon Sep 17 00:00:00 2001 From: Bartek Bok Date: Sun, 26 Feb 2017 14:48:39 +0100 Subject: [PATCH 48/54] Fix #782 --- .../java/openblocks/IOpenBlocksProxy.java | 2 + .../java/openblocks/client/ClientProxy.java | 5 ++ .../java/openblocks/common/ServerProxy.java | 5 ++ .../tileentity/TileEntitySprinkler.java | 3 +- .../common/tileentity/TileEntityXPShower.java | 75 +++++++++++-------- 5 files changed, 56 insertions(+), 34 deletions(-) diff --git a/src/main/java/openblocks/IOpenBlocksProxy.java b/src/main/java/openblocks/IOpenBlocksProxy.java index 54fad3d2..b8000660 100644 --- a/src/main/java/openblocks/IOpenBlocksProxy.java +++ b/src/main/java/openblocks/IOpenBlocksProxy.java @@ -7,6 +7,8 @@ import net.minecraftforge.fluids.Fluid; import openmods.api.IProxy; public interface IOpenBlocksProxy extends IProxy { + public int getParticleSettings(); + public void spawnLiquidSpray(World worldObj, Fluid fluid, double x, double y, double z, float scale, float gravity, Vec3 velocity); public void spawnParticleSpray(World worldObj, IIcon icon, double x, double y, double z, float scale, float gravity, Vec3 velocity); diff --git a/src/main/java/openblocks/client/ClientProxy.java b/src/main/java/openblocks/client/ClientProxy.java index e34af6bc..71105b22 100644 --- a/src/main/java/openblocks/client/ClientProxy.java +++ b/src/main/java/openblocks/client/ClientProxy.java @@ -267,6 +267,11 @@ public class ClientProxy implements IOpenBlocksProxy { new BlockRenderingValidator().verifyBlocks(OpenBlocks.Blocks.class); } + @Override + public int getParticleSettings() { + return Minecraft.getMinecraft().gameSettings.particleSetting; + } + private static void spawnParticle(EntityFX spray) { Minecraft.getMinecraft().effectRenderer.addEffect(spray); } diff --git a/src/main/java/openblocks/common/ServerProxy.java b/src/main/java/openblocks/common/ServerProxy.java index 9c037914..95ac84ee 100644 --- a/src/main/java/openblocks/common/ServerProxy.java +++ b/src/main/java/openblocks/common/ServerProxy.java @@ -26,4 +26,9 @@ public class ServerProxy implements IOpenBlocksProxy { @Override public void spawnParticleSpray(World worldObj, IIcon icon, double x, double y, double z, float scale, float gravity, Vec3 velocity) {} + @Override + public int getParticleSettings() { + return 3; // really no particles + } + } diff --git a/src/main/java/openblocks/common/tileentity/TileEntitySprinkler.java b/src/main/java/openblocks/common/tileentity/TileEntitySprinkler.java index 7f10b87d..dba3db27 100644 --- a/src/main/java/openblocks/common/tileentity/TileEntitySprinkler.java +++ b/src/main/java/openblocks/common/tileentity/TileEntitySprinkler.java @@ -2,7 +2,6 @@ package openblocks.common.tileentity; import java.util.Random; import net.minecraft.block.Block; -import net.minecraft.client.Minecraft; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Items; import net.minecraft.inventory.IInventory; @@ -121,7 +120,7 @@ public class TileEntitySprinkler extends SyncedTileEntity implements ISurfaceAtt private void sprayParticles() { if (tank.getFluidAmount() > 0) { // 0 = All, 1 = Decreased, 2 = Minimal - final int particleSetting = Minecraft.getMinecraft().gameSettings.particleSetting; + final int particleSetting = OpenBlocks.proxy.getParticleSettings(); if (particleSetting > 2) return; final int fillFactor = SPRINKER_MOD[particleSetting]; diff --git a/src/main/java/openblocks/common/tileentity/TileEntityXPShower.java b/src/main/java/openblocks/common/tileentity/TileEntityXPShower.java index 7c15811e..1887cbbb 100644 --- a/src/main/java/openblocks/common/tileentity/TileEntityXPShower.java +++ b/src/main/java/openblocks/common/tileentity/TileEntityXPShower.java @@ -21,13 +21,14 @@ public class TileEntityXPShower extends SyncedTileEntity implements INeighbourAw private GenericTank bufferTank = new GenericTank(FluidContainerRegistry.BUCKET_VOLUME, OpenBlocks.Fluids.xpJuice); - private int drainedCountdown = 0; private SyncableBoolean isOn; - private boolean isPowered = false; + private SyncableBoolean particleSpawnerActive; + private int particleSpawnTimer = 0; @Override protected void createSyncedFields() { isOn = new SyncableBoolean(); + particleSpawnerActive = new SyncableBoolean(); } @Override @@ -35,44 +36,53 @@ public class TileEntityXPShower extends SyncedTileEntity implements INeighbourAw super.updateEntity(); if (!worldObj.isRemote) { + trySpawnXpOrbs(); + } else { + trySpawnParticles(); + } + } - if (!isPowered && OpenMods.proxy.getTicks(worldObj) % 3 == 0) { - bufferTank.fillFromSide(DRAIN_PER_CYCLE, worldObj, getPosition(), getOrientation().north()); + private void trySpawnXpOrbs() { + boolean hasSpawnedParticle = false; + if (isOn.get() && OpenMods.proxy.getTicks(worldObj) % 3 == 0) { + bufferTank.fillFromSide(DRAIN_PER_CYCLE, worldObj, getPosition(), getOrientation().north()); - int amountInTank = bufferTank.getFluidAmount(); + int amountInTank = bufferTank.getFluidAmount(); - if (amountInTank > 0) { + if (amountInTank > 0) { + int xpInTank = LiquidXpUtils.liquidToXpRatio(amountInTank); + int drainable = LiquidXpUtils.xpToLiquidRatio(xpInTank); - int xpInTank = LiquidXpUtils.liquidToXpRatio(amountInTank); - int drainable = LiquidXpUtils.xpToLiquidRatio(xpInTank); - - if (drainable > 0) { - - bufferTank.drain(drainable, true); - - drainedCountdown = 10; - - while (xpInTank > 0) { - int xpAmount = EntityXPOrb.getXPSplit(xpInTank); - xpInTank -= xpAmount; - worldObj.spawnEntityInWorld(new EntityXPOrbNoFly(worldObj, xCoord + 0.5D, yCoord, zCoord + 0.5D, xpAmount)); - } + if (drainable > 0) { + bufferTank.drain(drainable, true); + while (xpInTank > 0) { + hasSpawnedParticle = true; + int xpAmount = EntityXPOrb.getXPSplit(xpInTank); + xpInTank -= xpAmount; + worldObj.spawnEntityInWorld(new EntityXPOrbNoFly(worldObj, xCoord + 0.5D, yCoord, zCoord + 0.5D, xpAmount)); } } } - - isOn.set(drainedCountdown-- > 0 && !isPowered); - sync(); - - } else if (isOn.get()) { - Vec3 vec = Vec3.createVectorHelper( - (worldObj.rand.nextDouble() - 0.5) * 0.05, - 0, - (worldObj.rand.nextDouble() - 0.5) * 0.05); - OpenBlocks.proxy.spawnLiquidSpray(worldObj, OpenBlocks.Fluids.xpJuice, xCoord + 0.5d, yCoord + 0.4d, zCoord + 0.5d, 0.4f, 0.7f, vec); - } + particleSpawnerActive.set(hasSpawnedParticle); + sync(); + } + + private void trySpawnParticles() { + final int particleLevel = OpenBlocks.proxy.getParticleSettings(); + + if (particleLevel == 0 || (particleLevel == 1 && worldObj.rand.nextInt(3) == 0)) { + particleSpawnTimer = particleSpawnerActive.get()? 10 : particleSpawnTimer - 1; + + if (particleSpawnTimer > 0) { + Vec3 vec = Vec3.createVectorHelper( + (worldObj.rand.nextDouble() - 0.5) * 0.05, + 0, + (worldObj.rand.nextDouble() - 0.5) * 0.05); + OpenBlocks.proxy.spawnLiquidSpray(worldObj, OpenBlocks.Fluids.xpJuice, xCoord + 0.5d, yCoord + 0.4d, zCoord + 0.5d, 0.4f, 0.7f, vec); + } + } } @Override @@ -86,7 +96,8 @@ public class TileEntityXPShower extends SyncedTileEntity implements INeighbourAw } public void updateState() { - isPowered = worldObj.isBlockIndirectlyGettingPowered(xCoord, yCoord, zCoord); + final boolean isPowered = worldObj.isBlockIndirectlyGettingPowered(xCoord, yCoord, zCoord); + isOn.set(!isPowered); } @Override From e184342d164bd177e69577e39f368696ece5957a Mon Sep 17 00:00:00 2001 From: Bartek Bok Date: Sun, 26 Feb 2017 14:55:12 +0100 Subject: [PATCH 49/54] Fix #672 --- src/main/java/openblocks/common/entity/EntityHangGlider.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/openblocks/common/entity/EntityHangGlider.java b/src/main/java/openblocks/common/entity/EntityHangGlider.java index 9f90a3c4..4dbc9e18 100644 --- a/src/main/java/openblocks/common/entity/EntityHangGlider.java +++ b/src/main/java/openblocks/common/entity/EntityHangGlider.java @@ -144,7 +144,7 @@ public class EntityHangGlider extends Entity implements IEntityAdditionalSpawnDa varioControl.keepAlive(); - boolean isDeployed = !player.onGround && !player.isInWater(); + boolean isDeployed = !player.onGround && !player.isInWater() && !player.isPlayerSleeping(); if (!worldObj.isRemote) { this.dataWatcher.updateObject(PROPERTY_DEPLOYED, (byte)(isDeployed? 1 : 0)); From a4874f5cb67e5000d1b6f1356b4864e95f9c7918 Mon Sep 17 00:00:00 2001 From: Bartek Bok Date: Sun, 26 Feb 2017 17:29:56 +0100 Subject: [PATCH 50/54] Fix few projector rendering glitches --- OpenModsLib | 2 +- .../block/BlockProjectorRenderer.java | 15 +++++++-------- .../common/block/BlockProjector.java | 19 ++++++------------- 3 files changed, 14 insertions(+), 22 deletions(-) diff --git a/OpenModsLib b/OpenModsLib index 0d238448..c67fc025 160000 --- a/OpenModsLib +++ b/OpenModsLib @@ -1 +1 @@ -Subproject commit 0d23844869dfa11f495b543d14e68e8c4c56427e +Subproject commit c67fc0257aab7788a29123b39275ddfed311bd3c diff --git a/src/main/java/openblocks/client/renderer/block/BlockProjectorRenderer.java b/src/main/java/openblocks/client/renderer/block/BlockProjectorRenderer.java index a1a63c8c..d2ff6f3e 100644 --- a/src/main/java/openblocks/client/renderer/block/BlockProjectorRenderer.java +++ b/src/main/java/openblocks/client/renderer/block/BlockProjectorRenderer.java @@ -14,6 +14,7 @@ import openmods.tileentity.OpenTileEntity; import openmods.utils.ByteUtils; import openmods.utils.render.RenderUtils; import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL12; public class BlockProjectorRenderer implements IBlockRenderer { @@ -29,19 +30,17 @@ public class BlockProjectorRenderer implements IBlockRenderer { @Override public void renderInventoryBlock(BlockProjector block, int metadata, int modelID, RenderBlocks renderer) { + + GL11.glEnable(GL12.GL_RESCALE_NORMAL); + RenderUtils.renderInventoryBlock(renderer, block, 0); + if (block.shouldRenderTesrInInventory()) { // duplication with default renderer, but I don't care - this code is going to die soon if (renderTe == null) renderTe = block.createTileEntityForRender(); if (renderTe instanceof OpenTileEntity) ((OpenTileEntity)renderTe).prepareForInventoryRender(block, metadata); - GL11.glPushAttrib(GL11.GL_TEXTURE_BIT); - GL11.glPushMatrix(); - GL11.glTranslated(-0.5, -0.5, -0.5); - TileEntityRendererDispatcher.instance.renderTileEntityAt(renderTe, 0.0D, 0.0D, 0.0D, 0.0F); - GL11.glPopMatrix(); - GL11.glPopAttrib(); + TileEntityRendererDispatcher.instance.renderTileEntityAt(renderTe, -0.5, -0.5, -0.5, 0.0F); } - RenderUtils.renderInventoryBlock(renderer, block, 0); } @Override @@ -64,7 +63,7 @@ public class BlockProjectorRenderer implements IBlockRenderer { tex.setBrightness(Math.max(BRIGHTNESS_LEVEL_MIN, Math.min(Config.coneBrightness, BRIGHTNESS_LEVEL_MAX))); } - renderCoreWithTex(block.getIcon(world, x, y, z, -1), tex); + renderCoreWithTex(block.coneIcon, tex); tex.addTranslation(-x, -(y + TO_BLOCK_CENTRE), -z); diff --git a/src/main/java/openblocks/common/block/BlockProjector.java b/src/main/java/openblocks/common/block/BlockProjector.java index 5540eb0b..eca6a009 100644 --- a/src/main/java/openblocks/common/block/BlockProjector.java +++ b/src/main/java/openblocks/common/block/BlockProjector.java @@ -6,6 +6,7 @@ import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.util.IIcon; import net.minecraft.world.IBlockAccess; +import net.minecraftforge.common.util.ForgeDirection; import openblocks.Config; import openmods.utils.ByteUtils; @@ -20,7 +21,7 @@ public class BlockProjector extends OpenBlock { private static final String CONE_ICON = "openblocks:projector_cone" + (Config.renderHoloGrid? "_grid" : ""); @SideOnly(Side.CLIENT) - private IIcon coneIcon; + public IIcon coneIcon; @SideOnly(Side.CLIENT) private IIcon sideIcon; @@ -65,19 +66,11 @@ public class BlockProjector extends OpenBlock { this.sideIcon = registry.registerIcon("stone_slab_side"); this.blockIcon = registry.registerIcon("stone_slab_top"); this.coneIcon = registry.registerIcon(CONE_ICON); - } - @Override - @SideOnly(Side.CLIENT) - public IIcon getIcon(IBlockAccess world, int x, int y, int z, int side) { - if (side < 0) return this.coneIcon; - if (side < 2) return blockIcon; - return sideIcon; - } - - @Override - public int getRenderBlockPass() { - return 1; + setTexture(ForgeDirection.NORTH, this.sideIcon); + setTexture(ForgeDirection.SOUTH, this.sideIcon); + setTexture(ForgeDirection.EAST, this.sideIcon); + setTexture(ForgeDirection.WEST, this.sideIcon); } @Override From c8e8396f375b872901397b20d85c42c5459412dc Mon Sep 17 00:00:00 2001 From: Bartek Bok Date: Sun, 26 Feb 2017 17:38:22 +0100 Subject: [PATCH 51/54] Trying to improve inventory store logs --- .../java/openblocks/common/PlayerInventoryStore.java | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/main/java/openblocks/common/PlayerInventoryStore.java b/src/main/java/openblocks/common/PlayerInventoryStore.java index 310d505c..2c32ac8e 100644 --- a/src/main/java/openblocks/common/PlayerInventoryStore.java +++ b/src/main/java/openblocks/common/PlayerInventoryStore.java @@ -169,14 +169,17 @@ public class PlayerInventoryStore { stream.close(); } } catch (IOException e) { - Log.warn("Failed to dump data for player %s, file %s", name, dumpFile.getAbsoluteFile()); + Log.warn(e, "Failed to dump data for player %s, file %s", name, dumpFile.getAbsoluteFile()); } return dumpFile; } private static IInventory loadInventory(NBTTagCompound rootTag) { - if (!rootTag.hasKey(TAG_INVENTORY, Constants.NBT.TAG_COMPOUND)) return null; + if (!rootTag.hasKey(TAG_INVENTORY, Constants.NBT.TAG_COMPOUND)) { + Log.debug("No main inventory found"); + return null; + } NBTTagCompound invTag = rootTag.getCompoundTag(TAG_INVENTORY); GenericInventory result = new GenericInventory("tmp", false, 0); @@ -225,7 +228,7 @@ public class PlayerInventoryStore { stream.close(); } } catch (IOException e) { - Log.warn("Failed to read data from file %s", file.getAbsoluteFile()); + Log.warn(e, "Failed to read data from file %s", file.getAbsoluteFile()); return null; } } @@ -274,7 +277,8 @@ public class PlayerInventoryStore { } public boolean restoreInventory(EntityPlayer player, String fileId) { - LoadedInventories inventories = loadInventories(player.worldObj, fileId); + final LoadedInventories inventories = loadInventories(player.worldObj, fileId); + if (inventories == null) return false; final IInventory main = inventories.mainInventory; if (main != null) { From f4d07ba95080b3c8c248b454244ccdaa81deb159 Mon Sep 17 00:00:00 2001 From: Bartek Bok Date: Sun, 26 Feb 2017 19:24:14 +0100 Subject: [PATCH 52/54] Update changelog --- .../assets/openblocks/changelog.json | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/src/main/resources/assets/openblocks/changelog.json b/src/main/resources/assets/openblocks/changelog.json index 79af8b7f..d8f782c0 100644 --- a/src/main/resources/assets/openblocks/changelog.json +++ b/src/main/resources/assets/openblocks/changelog.json @@ -1,4 +1,39 @@ [ + { + version : "1.6", + sections : + [ + { + title : "openblocks.gui.features", + lines : + [ + "Improve building guide rendering", + "More realistic hang glider mechanics", + "Vertical speed indication for hang-glider (variometer)" + ] + }, + { + title : "openblocks.gui.bugfixes", + lines : + [ + "Last Stand takes into account armor damage reduction", + "Block placers now properly orient placed blocks", + "XP shower no longer ignores redstone after game restart", + "/dev/null and sprinkler item duplications", + "Graves no longer spawn in bedrock layer (configurable)" + ] + }, + { + title : "openblocks.gui.tweaks", + lines : + [ + "Fancify map projector", + "This book now has page numbers in Table of Contents", + "Builder guide dome shape rotated to allow more orientations" + ] + } + ] + }, { version : "1.5.1", sections : From 3cf364e9cea5d66e251418e237fd33ec996a8d4f Mon Sep 17 00:00:00 2001 From: Bartek Bok Date: Sun, 26 Feb 2017 19:26:46 +0100 Subject: [PATCH 53/54] Bump version to 1.6 --- OpenModsLib | 2 +- gradle.properties | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/OpenModsLib b/OpenModsLib index c67fc025..753cde45 160000 --- a/OpenModsLib +++ b/OpenModsLib @@ -1 +1 @@ -Subproject commit c67fc0257aab7788a29123b39275ddfed311bd3c +Subproject commit 753cde45e749c600bf82bc6f5384e878cef40f3a diff --git a/gradle.properties b/gradle.properties index 0c5976c2..52e232f2 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,4 +1,4 @@ -mod_version=1.5.1 +mod_version=1.6 api_version=1.1 opc_api_version=3.4.1 mc_version=1.7.10 From 44be1ac9cb3d7eabc53efd15b1dbe90b1cbe6b76 Mon Sep 17 00:00:00 2001 From: Bartek Bok Date: Sun, 26 Feb 2017 20:00:55 +0100 Subject: [PATCH 54/54] More fixes for projector --- .../client/renderer/block/BlockProjectorRenderer.java | 9 ++++++++- .../java/openblocks/common/block/BlockProjector.java | 5 +++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/main/java/openblocks/client/renderer/block/BlockProjectorRenderer.java b/src/main/java/openblocks/client/renderer/block/BlockProjectorRenderer.java index d2ff6f3e..eacc059f 100644 --- a/src/main/java/openblocks/client/renderer/block/BlockProjectorRenderer.java +++ b/src/main/java/openblocks/client/renderer/block/BlockProjectorRenderer.java @@ -30,8 +30,13 @@ public class BlockProjectorRenderer implements IBlockRenderer { @Override public void renderInventoryBlock(BlockProjector block, int metadata, int modelID, RenderBlocks renderer) { - GL11.glEnable(GL12.GL_RESCALE_NORMAL); + + // Block.getRenderBlockPass causes this be false, but only in some codepaths + final boolean depthMaskState = GL11.glGetBoolean(GL11.GL_DEPTH_WRITEMASK); + if (!depthMaskState) + GL11.glDepthMask(true); + RenderUtils.renderInventoryBlock(renderer, block, 0); if (block.shouldRenderTesrInInventory()) { @@ -41,6 +46,8 @@ public class BlockProjectorRenderer implements IBlockRenderer { TileEntityRendererDispatcher.instance.renderTileEntityAt(renderTe, -0.5, -0.5, -0.5, 0.0F); } + if (!depthMaskState) + GL11.glDepthMask(false); } @Override diff --git a/src/main/java/openblocks/common/block/BlockProjector.java b/src/main/java/openblocks/common/block/BlockProjector.java index eca6a009..3970925b 100644 --- a/src/main/java/openblocks/common/block/BlockProjector.java +++ b/src/main/java/openblocks/common/block/BlockProjector.java @@ -77,4 +77,9 @@ public class BlockProjector extends OpenBlock { public boolean canRenderInPass(int pass) { return true; } + + @Override + public int getRenderBlockPass() { + return 1; + } }