From 9ba03314045e2403d0dfb25c460e32c8afc271cf Mon Sep 17 00:00:00 2001 From: Marcel Konrad Date: Mon, 5 Feb 2018 17:31:55 +0100 Subject: [PATCH] 2.0 --- build.gradle | 83 ++ .../worldhandler/builder/CommandBuilder.java | 262 +++++++ .../builder/CommandBuilderNBT.java | 66 ++ .../worldhandler/builder/ICommandBuilder.java | 17 + .../builder/ICommandBuilderNBT.java | 11 + .../builder/ICommandBuilderSyntax.java | 18 + .../worldhandler/builder/Syntax.java | 93 +++ .../builder/component/IBuilderComponent.java | 15 + .../component/abstr/ComponentAttribute.java | 32 + .../component/abstr/ComponentPotion.java | 182 +++++ .../component/abstr/PotionMetadata.java | 137 ++++ .../impl/ComponentAttributeItem.java | 61 ++ .../component/impl/ComponentAttributeMob.java | 56 ++ .../component/impl/ComponentDisplay.java | 98 +++ .../component/impl/ComponentEnchantment.java | 64 ++ .../component/impl/ComponentPotionItem.java | 15 + .../component/impl/ComponentPotionMob.java | 15 + .../component/impl/ComponentSummon.java | 302 ++++++++ .../builder/component/impl/ComponentTag.java | 144 ++++ .../builder/impl/BuilderAdvancement.java | 122 +++ .../builder/impl/BuilderBlockdata.java | 37 + .../builder/impl/BuilderButcher.java | 65 ++ .../builder/impl/BuilderClone.java | 144 ++++ .../builder/impl/BuilderCustomItem.java | 81 ++ .../builder/impl/BuilderDifficulty.java | 53 ++ .../builder/impl/BuilderEnchantment.java | 60 ++ .../builder/impl/BuilderExperience.java | 67 ++ .../builder/impl/BuilderFill.java | 165 ++++ .../builder/impl/BuilderGamemode.java | 65 ++ .../builder/impl/BuilderGamerule.java | 64 ++ .../builder/impl/BuilderGeneric.java | 29 + .../builder/impl/BuilderGive.java | 104 +++ .../builder/impl/BuilderMultiCommand.java | 24 + .../builder/impl/BuilderNoteEditor.java | 39 + .../builder/impl/BuilderPlayer.java | 44 ++ .../builder/impl/BuilderPlayerReason.java | 55 ++ .../builder/impl/BuilderPotionEffect.java | 165 ++++ .../builder/impl/BuilderPotionItem.java | 92 +++ .../impl/BuilderScoreboardObjectives.java | 170 +++++ .../impl/BuilderScoreboardPlayers.java | 231 ++++++ .../builder/impl/BuilderScoreboardTeams.java | 256 +++++++ .../builder/impl/BuilderSetblock.java | 81 ++ .../builder/impl/BuilderSignEditor.java | 72 ++ .../builder/impl/BuilderSpawnpoint.java | 58 ++ .../builder/impl/BuilderSummon.java | 407 ++++++++++ .../builder/impl/BuilderTime.java | 64 ++ .../worldhandler/builder/impl/BuilderWH.java | 27 + .../builder/impl/BuilderWeather.java | 64 ++ .../builder/impl/BuilderWhitelist.java | 93 +++ .../builder/impl/BuilderWorldHandler.java | 27 + .../builder/impl/abstr/BuilderBlockPos.java | 80 ++ .../impl/abstr/BuilderDoubleBlockPos.java | 176 +++++ .../builder/impl/abstr/BuilderScoreboard.java | 15 + .../builder/impl/abstr/EnumAttributes.java | 125 +++ .../builder/types/Coordinate.java | 63 ++ .../worldhandler/builder/types/Level.java | 49 ++ .../builder/types/TargetSelector.java | 56 ++ .../worldhandler/builder/types/Type.java | 67 ++ .../worldhandler/command/CommandWH.java | 231 ++++++ .../command/CommandWorldHandler.java | 100 +++ .../command/FakeCommandHandler.java | 45 ++ .../worldhandler/config/ConfigButcher.java | 45 ++ .../worldhandler/config/ConfigSettings.java | 129 ++++ .../worldhandler/config/ConfigSkin.java | 127 ++++ .../worldhandler/event/EventHandler.java | 103 +++ .../worldhandler/format/EnumColor.java | 67 ++ .../worldhandler/format/TextFormatting.java | 169 +++++ .../format/text/ColoredString.java | 127 ++++ .../format/text/FormattedString.java | 86 +++ .../format/text/JsonClickEvent.java | 42 + .../format/text/JsonSignLine.java | 47 ++ .../format/text/JsonSignLineSerializer.java | 63 ++ .../worldhandler/format/text/SignText.java | 70 ++ .../worldhandler/gui/button/EnumIcon.java | 49 ++ .../worldhandler/gui/button/EnumTooltip.java | 15 + .../gui/button/GuiButtonItem.java | 46 ++ .../gui/button/GuiButtonKeyboard.java | 172 +++++ .../gui/button/GuiButtonList.java | 139 ++++ .../worldhandler/gui/button/GuiButtonTab.java | 36 + .../gui/button/GuiButtonWorldHandler.java | 219 ++++++ .../worldhandler/gui/button/GuiSlider.java | 189 +++++ .../gui/button/GuiTextFieldTooltip.java | 261 +++++++ .../button/logic/ColorListButtonLogic.java | 46 ++ .../gui/button/logic/IListButtonLogic.java | 31 + .../gui/button/logic/ISliderResponder.java | 11 + .../button/responder/AttributeResponder.java | 27 + .../gui/button/responder/SimpleResponder.java | 35 + .../gui/button/storage/ButtonStorage.java | 41 + .../gui/button/storage/SliderStorage.java | 39 + .../worldhandler/gui/category/Categories.java | 41 + .../worldhandler/gui/category/Category.java | 81 ++ .../gui/config/GuiConfigWorldHandler.java | 54 ++ .../gui/config/GuiFactoryWorldHandler.java | 37 + .../worldhandler/gui/container/Container.java | 29 + .../gui/container/IContainer.java | 16 + .../impl/GuiWorldHandlerContainer.java | 718 ++++++++++++++++++ .../worldhandler/gui/content/Content.java | 111 +++ .../worldhandler/gui/content/Contents.java | 87 +++ .../worldhandler/gui/content/IContent.java | 81 ++ .../gui/content/element/Element.java | 23 + .../gui/content/element/IElement.java | 25 + .../element/impl/ElementClickList.java | 207 +++++ .../element/impl/ElementColorMenu.java | 152 ++++ .../content/element/impl/ElementPageList.java | 142 ++++ .../element/logic/ILogicClickList.java | 24 + .../element/logic/ILogicColorMenu.java | 22 + .../content/element/logic/ILogicPageList.java | 19 + .../gui/content/impl/ContentAdvancements.java | 205 +++++ .../gui/content/impl/ContentButcher.java | 115 +++ .../gui/content/impl/ContentChangeWorld.java | 48 ++ .../gui/content/impl/ContentContainers.java | 136 ++++ .../gui/content/impl/ContentContinue.java | 120 +++ .../gui/content/impl/ContentCustomItem.java | 359 +++++++++ .../gui/content/impl/ContentEditBlocks.java | 408 ++++++++++ .../gui/content/impl/ContentEnchantment.java | 143 ++++ .../gui/content/impl/ContentExperience.java | 117 +++ .../gui/content/impl/ContentGamerules.java | 198 +++++ .../gui/content/impl/ContentMain.java | 134 ++++ .../gui/content/impl/ContentMultiplayer.java | 349 +++++++++ .../gui/content/impl/ContentNoteEditor.java | 304 ++++++++ .../gui/content/impl/ContentPlayer.java | 232 ++++++ .../gui/content/impl/ContentPotions.java | 242 ++++++ .../impl/ContentScoreboardObjectives.java | 249 ++++++ .../impl/ContentScoreboardPlayers.java | 243 ++++++ .../content/impl/ContentScoreboardTeams.java | 237 ++++++ .../gui/content/impl/ContentSignEditor.java | 254 +++++++ .../gui/content/impl/ContentSummon.java | 653 ++++++++++++++++ .../gui/content/impl/ContentWorldInfo.java | 233 ++++++ .../gui/content/impl/abstr/ContentChild.java | 58 ++ .../content/impl/abstr/ContentScoreboard.java | 34 + .../helper/AdvancementHelper.java | 38 + .../worldhandler/helper/BlockHelper.java | 223 ++++++ .../worldhandler/helper/EntityHelper.java | 80 ++ .../worldhandler/helper/EnumHelper.java | 20 + .../exopandora/worldhandler/helper/Node.java | 280 +++++++ .../worldhandler/helper/ResourceHelper.java | 88 +++ .../worldhandler/helper/ScoreboardHelper.java | 117 +++ .../worldhandler/hud/BiomeIndicator.java | 94 +++ .../installer/ChangeFolderListener.java | 49 ++ .../worldhandler/installer/ForumListener.java | 31 + .../installer/InstallListener.java | 104 +++ .../worldhandler/installer/Window.java | 194 +++++ .../exopandora/worldhandler/main/Main.java | 57 ++ .../worldhandler/main/WorldHandler.java | 155 ++++ .../worldhandler/proxy/ClientProxy.java | 10 + .../worldhandler/proxy/CommonProxy.java | 6 + .../worldhandler/util/UtilPlayer.java | 17 + .../worldhandler/util/UtilRender.java | 54 ++ .../worldhandler/installer/icon/icon128.png | Bin 0 -> 1827 bytes .../worldhandler/installer/icon/icon16.png | Bin 0 -> 349 bytes .../worldhandler/installer/icon/icon256.png | Bin 0 -> 2704 bytes .../worldhandler/installer/icon/icon32.png | Bin 0 -> 777 bytes .../worldhandler/installer/icon/icon64.png | Bin 0 -> 952 bytes .../assets/worldhandler/installer/logo.png | Bin 0 -> 2255 bytes .../assets/worldhandler/lang/de_de.lang | 429 +++++++++++ .../assets/worldhandler/lang/en_us.lang | 429 +++++++++++ .../assets/worldhandler/lang/zh_cn.lang | 429 +++++++++++ .../worldhandler/textures/icons/icons16.png | Bin 0 -> 2308 bytes .../worldhandler/textures/icons/icons32.png | Bin 0 -> 7157 bytes .../worldhandler/textures/icons/icons64.png | Bin 0 -> 21448 bytes .../assets/worldhandler/textures/logo.png | Bin 0 -> 2624 bytes .../worldhandler/textures/misc/note.png | Bin 0 -> 1698 bytes .../textures/skins/vanilla/vanilla.png | Bin 0 -> 1639 bytes .../skins/vanilla/vanilla_buttons.png | Bin 0 -> 6657 bytes src/main/resources/mcmod.info | 40 + src/main/resources/pack.mcmeta | 7 + version.json | 15 +- 167 files changed, 18034 insertions(+), 6 deletions(-) create mode 100644 build.gradle create mode 100644 src/main/java/exopandora/worldhandler/builder/CommandBuilder.java create mode 100644 src/main/java/exopandora/worldhandler/builder/CommandBuilderNBT.java create mode 100644 src/main/java/exopandora/worldhandler/builder/ICommandBuilder.java create mode 100644 src/main/java/exopandora/worldhandler/builder/ICommandBuilderNBT.java create mode 100644 src/main/java/exopandora/worldhandler/builder/ICommandBuilderSyntax.java create mode 100644 src/main/java/exopandora/worldhandler/builder/Syntax.java create mode 100644 src/main/java/exopandora/worldhandler/builder/component/IBuilderComponent.java create mode 100644 src/main/java/exopandora/worldhandler/builder/component/abstr/ComponentAttribute.java create mode 100644 src/main/java/exopandora/worldhandler/builder/component/abstr/ComponentPotion.java create mode 100644 src/main/java/exopandora/worldhandler/builder/component/abstr/PotionMetadata.java create mode 100644 src/main/java/exopandora/worldhandler/builder/component/impl/ComponentAttributeItem.java create mode 100644 src/main/java/exopandora/worldhandler/builder/component/impl/ComponentAttributeMob.java create mode 100644 src/main/java/exopandora/worldhandler/builder/component/impl/ComponentDisplay.java create mode 100644 src/main/java/exopandora/worldhandler/builder/component/impl/ComponentEnchantment.java create mode 100644 src/main/java/exopandora/worldhandler/builder/component/impl/ComponentPotionItem.java create mode 100644 src/main/java/exopandora/worldhandler/builder/component/impl/ComponentPotionMob.java create mode 100644 src/main/java/exopandora/worldhandler/builder/component/impl/ComponentSummon.java create mode 100644 src/main/java/exopandora/worldhandler/builder/component/impl/ComponentTag.java create mode 100644 src/main/java/exopandora/worldhandler/builder/impl/BuilderAdvancement.java create mode 100644 src/main/java/exopandora/worldhandler/builder/impl/BuilderBlockdata.java create mode 100644 src/main/java/exopandora/worldhandler/builder/impl/BuilderButcher.java create mode 100644 src/main/java/exopandora/worldhandler/builder/impl/BuilderClone.java create mode 100644 src/main/java/exopandora/worldhandler/builder/impl/BuilderCustomItem.java create mode 100644 src/main/java/exopandora/worldhandler/builder/impl/BuilderDifficulty.java create mode 100644 src/main/java/exopandora/worldhandler/builder/impl/BuilderEnchantment.java create mode 100644 src/main/java/exopandora/worldhandler/builder/impl/BuilderExperience.java create mode 100644 src/main/java/exopandora/worldhandler/builder/impl/BuilderFill.java create mode 100644 src/main/java/exopandora/worldhandler/builder/impl/BuilderGamemode.java create mode 100644 src/main/java/exopandora/worldhandler/builder/impl/BuilderGamerule.java create mode 100644 src/main/java/exopandora/worldhandler/builder/impl/BuilderGeneric.java create mode 100644 src/main/java/exopandora/worldhandler/builder/impl/BuilderGive.java create mode 100644 src/main/java/exopandora/worldhandler/builder/impl/BuilderMultiCommand.java create mode 100644 src/main/java/exopandora/worldhandler/builder/impl/BuilderNoteEditor.java create mode 100644 src/main/java/exopandora/worldhandler/builder/impl/BuilderPlayer.java create mode 100644 src/main/java/exopandora/worldhandler/builder/impl/BuilderPlayerReason.java create mode 100644 src/main/java/exopandora/worldhandler/builder/impl/BuilderPotionEffect.java create mode 100644 src/main/java/exopandora/worldhandler/builder/impl/BuilderPotionItem.java create mode 100644 src/main/java/exopandora/worldhandler/builder/impl/BuilderScoreboardObjectives.java create mode 100644 src/main/java/exopandora/worldhandler/builder/impl/BuilderScoreboardPlayers.java create mode 100644 src/main/java/exopandora/worldhandler/builder/impl/BuilderScoreboardTeams.java create mode 100644 src/main/java/exopandora/worldhandler/builder/impl/BuilderSetblock.java create mode 100644 src/main/java/exopandora/worldhandler/builder/impl/BuilderSignEditor.java create mode 100644 src/main/java/exopandora/worldhandler/builder/impl/BuilderSpawnpoint.java create mode 100644 src/main/java/exopandora/worldhandler/builder/impl/BuilderSummon.java create mode 100644 src/main/java/exopandora/worldhandler/builder/impl/BuilderTime.java create mode 100644 src/main/java/exopandora/worldhandler/builder/impl/BuilderWH.java create mode 100644 src/main/java/exopandora/worldhandler/builder/impl/BuilderWeather.java create mode 100644 src/main/java/exopandora/worldhandler/builder/impl/BuilderWhitelist.java create mode 100644 src/main/java/exopandora/worldhandler/builder/impl/BuilderWorldHandler.java create mode 100644 src/main/java/exopandora/worldhandler/builder/impl/abstr/BuilderBlockPos.java create mode 100644 src/main/java/exopandora/worldhandler/builder/impl/abstr/BuilderDoubleBlockPos.java create mode 100644 src/main/java/exopandora/worldhandler/builder/impl/abstr/BuilderScoreboard.java create mode 100644 src/main/java/exopandora/worldhandler/builder/impl/abstr/EnumAttributes.java create mode 100644 src/main/java/exopandora/worldhandler/builder/types/Coordinate.java create mode 100644 src/main/java/exopandora/worldhandler/builder/types/Level.java create mode 100644 src/main/java/exopandora/worldhandler/builder/types/TargetSelector.java create mode 100644 src/main/java/exopandora/worldhandler/builder/types/Type.java create mode 100644 src/main/java/exopandora/worldhandler/command/CommandWH.java create mode 100644 src/main/java/exopandora/worldhandler/command/CommandWorldHandler.java create mode 100644 src/main/java/exopandora/worldhandler/command/FakeCommandHandler.java create mode 100644 src/main/java/exopandora/worldhandler/config/ConfigButcher.java create mode 100644 src/main/java/exopandora/worldhandler/config/ConfigSettings.java create mode 100644 src/main/java/exopandora/worldhandler/config/ConfigSkin.java create mode 100644 src/main/java/exopandora/worldhandler/event/EventHandler.java create mode 100644 src/main/java/exopandora/worldhandler/format/EnumColor.java create mode 100644 src/main/java/exopandora/worldhandler/format/TextFormatting.java create mode 100644 src/main/java/exopandora/worldhandler/format/text/ColoredString.java create mode 100644 src/main/java/exopandora/worldhandler/format/text/FormattedString.java create mode 100644 src/main/java/exopandora/worldhandler/format/text/JsonClickEvent.java create mode 100644 src/main/java/exopandora/worldhandler/format/text/JsonSignLine.java create mode 100644 src/main/java/exopandora/worldhandler/format/text/JsonSignLineSerializer.java create mode 100644 src/main/java/exopandora/worldhandler/format/text/SignText.java create mode 100644 src/main/java/exopandora/worldhandler/gui/button/EnumIcon.java create mode 100644 src/main/java/exopandora/worldhandler/gui/button/EnumTooltip.java create mode 100644 src/main/java/exopandora/worldhandler/gui/button/GuiButtonItem.java create mode 100644 src/main/java/exopandora/worldhandler/gui/button/GuiButtonKeyboard.java create mode 100644 src/main/java/exopandora/worldhandler/gui/button/GuiButtonList.java create mode 100644 src/main/java/exopandora/worldhandler/gui/button/GuiButtonTab.java create mode 100644 src/main/java/exopandora/worldhandler/gui/button/GuiButtonWorldHandler.java create mode 100644 src/main/java/exopandora/worldhandler/gui/button/GuiSlider.java create mode 100644 src/main/java/exopandora/worldhandler/gui/button/GuiTextFieldTooltip.java create mode 100644 src/main/java/exopandora/worldhandler/gui/button/logic/ColorListButtonLogic.java create mode 100644 src/main/java/exopandora/worldhandler/gui/button/logic/IListButtonLogic.java create mode 100644 src/main/java/exopandora/worldhandler/gui/button/logic/ISliderResponder.java create mode 100644 src/main/java/exopandora/worldhandler/gui/button/responder/AttributeResponder.java create mode 100644 src/main/java/exopandora/worldhandler/gui/button/responder/SimpleResponder.java create mode 100644 src/main/java/exopandora/worldhandler/gui/button/storage/ButtonStorage.java create mode 100644 src/main/java/exopandora/worldhandler/gui/button/storage/SliderStorage.java create mode 100644 src/main/java/exopandora/worldhandler/gui/category/Categories.java create mode 100644 src/main/java/exopandora/worldhandler/gui/category/Category.java create mode 100644 src/main/java/exopandora/worldhandler/gui/config/GuiConfigWorldHandler.java create mode 100644 src/main/java/exopandora/worldhandler/gui/config/GuiFactoryWorldHandler.java create mode 100644 src/main/java/exopandora/worldhandler/gui/container/Container.java create mode 100644 src/main/java/exopandora/worldhandler/gui/container/IContainer.java create mode 100644 src/main/java/exopandora/worldhandler/gui/container/impl/GuiWorldHandlerContainer.java create mode 100644 src/main/java/exopandora/worldhandler/gui/content/Content.java create mode 100644 src/main/java/exopandora/worldhandler/gui/content/Contents.java create mode 100644 src/main/java/exopandora/worldhandler/gui/content/IContent.java create mode 100644 src/main/java/exopandora/worldhandler/gui/content/element/Element.java create mode 100644 src/main/java/exopandora/worldhandler/gui/content/element/IElement.java create mode 100644 src/main/java/exopandora/worldhandler/gui/content/element/impl/ElementClickList.java create mode 100644 src/main/java/exopandora/worldhandler/gui/content/element/impl/ElementColorMenu.java create mode 100644 src/main/java/exopandora/worldhandler/gui/content/element/impl/ElementPageList.java create mode 100644 src/main/java/exopandora/worldhandler/gui/content/element/logic/ILogicClickList.java create mode 100644 src/main/java/exopandora/worldhandler/gui/content/element/logic/ILogicColorMenu.java create mode 100644 src/main/java/exopandora/worldhandler/gui/content/element/logic/ILogicPageList.java create mode 100644 src/main/java/exopandora/worldhandler/gui/content/impl/ContentAdvancements.java create mode 100644 src/main/java/exopandora/worldhandler/gui/content/impl/ContentButcher.java create mode 100644 src/main/java/exopandora/worldhandler/gui/content/impl/ContentChangeWorld.java create mode 100644 src/main/java/exopandora/worldhandler/gui/content/impl/ContentContainers.java create mode 100644 src/main/java/exopandora/worldhandler/gui/content/impl/ContentContinue.java create mode 100644 src/main/java/exopandora/worldhandler/gui/content/impl/ContentCustomItem.java create mode 100644 src/main/java/exopandora/worldhandler/gui/content/impl/ContentEditBlocks.java create mode 100644 src/main/java/exopandora/worldhandler/gui/content/impl/ContentEnchantment.java create mode 100644 src/main/java/exopandora/worldhandler/gui/content/impl/ContentExperience.java create mode 100644 src/main/java/exopandora/worldhandler/gui/content/impl/ContentGamerules.java create mode 100644 src/main/java/exopandora/worldhandler/gui/content/impl/ContentMain.java create mode 100644 src/main/java/exopandora/worldhandler/gui/content/impl/ContentMultiplayer.java create mode 100644 src/main/java/exopandora/worldhandler/gui/content/impl/ContentNoteEditor.java create mode 100644 src/main/java/exopandora/worldhandler/gui/content/impl/ContentPlayer.java create mode 100644 src/main/java/exopandora/worldhandler/gui/content/impl/ContentPotions.java create mode 100644 src/main/java/exopandora/worldhandler/gui/content/impl/ContentScoreboardObjectives.java create mode 100644 src/main/java/exopandora/worldhandler/gui/content/impl/ContentScoreboardPlayers.java create mode 100644 src/main/java/exopandora/worldhandler/gui/content/impl/ContentScoreboardTeams.java create mode 100644 src/main/java/exopandora/worldhandler/gui/content/impl/ContentSignEditor.java create mode 100644 src/main/java/exopandora/worldhandler/gui/content/impl/ContentSummon.java create mode 100644 src/main/java/exopandora/worldhandler/gui/content/impl/ContentWorldInfo.java create mode 100644 src/main/java/exopandora/worldhandler/gui/content/impl/abstr/ContentChild.java create mode 100644 src/main/java/exopandora/worldhandler/gui/content/impl/abstr/ContentScoreboard.java create mode 100644 src/main/java/exopandora/worldhandler/helper/AdvancementHelper.java create mode 100644 src/main/java/exopandora/worldhandler/helper/BlockHelper.java create mode 100644 src/main/java/exopandora/worldhandler/helper/EntityHelper.java create mode 100644 src/main/java/exopandora/worldhandler/helper/EnumHelper.java create mode 100644 src/main/java/exopandora/worldhandler/helper/Node.java create mode 100644 src/main/java/exopandora/worldhandler/helper/ResourceHelper.java create mode 100644 src/main/java/exopandora/worldhandler/helper/ScoreboardHelper.java create mode 100644 src/main/java/exopandora/worldhandler/hud/BiomeIndicator.java create mode 100644 src/main/java/exopandora/worldhandler/installer/ChangeFolderListener.java create mode 100644 src/main/java/exopandora/worldhandler/installer/ForumListener.java create mode 100644 src/main/java/exopandora/worldhandler/installer/InstallListener.java create mode 100644 src/main/java/exopandora/worldhandler/installer/Window.java create mode 100644 src/main/java/exopandora/worldhandler/main/Main.java create mode 100644 src/main/java/exopandora/worldhandler/main/WorldHandler.java create mode 100644 src/main/java/exopandora/worldhandler/proxy/ClientProxy.java create mode 100644 src/main/java/exopandora/worldhandler/proxy/CommonProxy.java create mode 100644 src/main/java/exopandora/worldhandler/util/UtilPlayer.java create mode 100644 src/main/java/exopandora/worldhandler/util/UtilRender.java create mode 100644 src/main/resources/assets/worldhandler/installer/icon/icon128.png create mode 100644 src/main/resources/assets/worldhandler/installer/icon/icon16.png create mode 100644 src/main/resources/assets/worldhandler/installer/icon/icon256.png create mode 100644 src/main/resources/assets/worldhandler/installer/icon/icon32.png create mode 100644 src/main/resources/assets/worldhandler/installer/icon/icon64.png create mode 100644 src/main/resources/assets/worldhandler/installer/logo.png create mode 100644 src/main/resources/assets/worldhandler/lang/de_de.lang create mode 100644 src/main/resources/assets/worldhandler/lang/en_us.lang create mode 100644 src/main/resources/assets/worldhandler/lang/zh_cn.lang create mode 100644 src/main/resources/assets/worldhandler/textures/icons/icons16.png create mode 100644 src/main/resources/assets/worldhandler/textures/icons/icons32.png create mode 100644 src/main/resources/assets/worldhandler/textures/icons/icons64.png create mode 100644 src/main/resources/assets/worldhandler/textures/logo.png create mode 100644 src/main/resources/assets/worldhandler/textures/misc/note.png create mode 100644 src/main/resources/assets/worldhandler/textures/skins/vanilla/vanilla.png create mode 100644 src/main/resources/assets/worldhandler/textures/skins/vanilla/vanilla_buttons.png create mode 100644 src/main/resources/mcmod.info create mode 100644 src/main/resources/pack.mcmeta diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000..28ca043 --- /dev/null +++ b/build.gradle @@ -0,0 +1,83 @@ +buildscript { + repositories { + jcenter() + maven { url = "http://files.minecraftforge.net/maven" } + } + dependencies { + classpath 'net.minecraftforge.gradle:ForgeGradle:2.3-SNAPSHOT' + } +} +apply plugin: 'net.minecraftforge.gradle.forge' +//Only edit below this line, the above code adds and enables the necessary things for Forge to be setup. + + +version = "1.12.2-2.0" +group = "src.worldhandler.main.WorldHandler" // http://maven.apache.org/guides/mini/guide-naming-conventions.html +archivesBaseName = "WorldHandler" + +sourceCompatibility = targetCompatibility = '1.8' // Need this here so eclipse task generates correctly. +compileJava { + sourceCompatibility = targetCompatibility = '1.8' +} + +jar { + manifest { + attributes 'Main-Class': 'exopandora.worldhandler.main.Main' + } +} + +minecraft { + version = "1.12.2-14.23.2.2611" + runDir = "run" + + // the mappings can be changed at any time, and must be in the following format. + // snapshot_YYYYMMDD snapshot are built nightly. + // stable_# stables are built at the discretion of the MCP team. + // Use non-default mappings at your own risk. they may not always work. + // simply re-run your setup task after changing the mappings to update your workspace. + mappings = "snapshot_20171003" + // makeObfSourceJar = false // an Srg named sources jar is made by default. uncomment this to disable. +} + +dependencies { + // you may put jars on which you depend on in ./libs + // or you may define them like so.. + //compile "some.group:artifact:version:classifier" + //compile "some.group:artifact:version" + + // real examples + //compile 'com.mod-buildcraft:buildcraft:6.0.8:dev' // adds buildcraft to the dev env + //compile 'com.googlecode.efficient-java-matrix-library:ejml:0.24' // adds ejml to the dev env + + // the 'provided' configuration is for optional dependencies that exist at compile-time but might not at runtime. + //provided 'com.mod-buildcraft:buildcraft:6.0.8:dev' + + // the deobf configurations: 'deobfCompile' and 'deobfProvided' are the same as the normal compile and provided, + // except that these dependencies get remapped to your current MCP mappings + //deobfCompile 'com.mod-buildcraft:buildcraft:6.0.8:dev' + //deobfProvided 'com.mod-buildcraft:buildcraft:6.0.8:dev' + + // for more info... + // http://www.gradle.org/docs/current/userguide/artifact_dependencies_tutorial.html + // http://www.gradle.org/docs/current/userguide/dependency_management.html + +} + +processResources { + // this will ensure that this task is redone when the versions change. + inputs.property "version", project.version + inputs.property "mcversion", project.minecraft.version + + // replace stuff in mcmod.info, nothing else + from(sourceSets.main.resources.srcDirs) { + include 'mcmod.info' + + // replace version and mcversion + expand 'version':project.version, 'mcversion':project.minecraft.version + } + + // copy everything else except the mcmod.info + from(sourceSets.main.resources.srcDirs) { + exclude 'mcmod.info' + } +} diff --git a/src/main/java/exopandora/worldhandler/builder/CommandBuilder.java b/src/main/java/exopandora/worldhandler/builder/CommandBuilder.java new file mode 100644 index 0000000..cc52194 --- /dev/null +++ b/src/main/java/exopandora/worldhandler/builder/CommandBuilder.java @@ -0,0 +1,262 @@ +package exopandora.worldhandler.builder; + +import java.util.AbstractMap; +import java.util.ArrayList; +import java.util.List; +import java.util.Map.Entry; +import java.util.stream.Collectors; + +import javax.annotation.Nullable; + +import exopandora.worldhandler.builder.Syntax.SyntaxEntry; +import exopandora.worldhandler.builder.types.Coordinate; +import exopandora.worldhandler.builder.types.Level; +import exopandora.worldhandler.builder.types.TargetSelector; +import exopandora.worldhandler.builder.types.Type; +import exopandora.worldhandler.main.WorldHandler; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public abstract class CommandBuilder implements ICommandBuilderSyntax +{ + private List> command; + + public CommandBuilder() + { + this.updateSyntax(this.getSyntax()); + } + + protected void setNode(int index, String node) + { + this.set(index, node != null ? (node.isEmpty() ? null : node) : null, Type.STRING); + } + + protected void setNode(int index, boolean node) + { + this.set(index, node, Type.BOOLEAN); + } + + protected void setNode(int index, short node) + { + this.set(index, node, Type.SHORT); + } + + protected void setNode(int index, byte node) + { + this.set(index, node, Type.BYTE); + } + + protected void setNode(int index, int node) + { + this.set(index, node, Type.INT); + } + + protected void setNode(int index, float node) + { + this.set(index, node, Type.FLOAT); + } + + protected void setNode(int index, double node) + { + this.set(index, node, Type.DOUBLE); + } + + protected void setNode(int index, long node) + { + this.set(index, node, Type.LONG); + } + + protected void setNode(int index, ResourceLocation node) + { + this.set(index, node, Type.RESOURCE_LOCATION); + } + + protected void setNode(int index, NBTTagCompound nbt) + { + this.set(index, nbt, Type.NBT); + } + + protected void setNode(int index, Coordinate coordinate) + { + this.set(index, coordinate, Type.COORDINATE); + } + + protected void setNode(int index, TargetSelector target) + { + this.set(index, target, Type.TARGET_SELECTOR); + } + + protected void setNode(int index, Level level) + { + this.set(index, level, Type.LEVEL); + } + + private void set(int index, Object value, Type type) + { + if(index < this.command.size()) + { + SyntaxEntry entry = this.command.get(index).getKey(); + Type expected = entry.getType(); + boolean flag = expected.equals(type); + + if(value != null && flag) + { + this.command.get(index).setValue(value.toString()); + } + else + { + this.command.get(index).setValue(entry.toString()); + + if(!flag) + { + this.warn("set", expected, type, index); + } + } + } + else + { + WorldHandler.LOGGER.warn("Tried to set invalid index \"" + index + "\" for command \"" + this.getCommandName() + "\""); + } + } + + @Nullable + protected String getNodeAsString(int index) + { + return this.get(index, Type.STRING); + } + + protected boolean getNodeAsBoolean(int index) + { + return this.get(index, Type.BOOLEAN); + } + + protected short getNodeAsShort(int index) + { + return this.get(index, Type.SHORT); + } + + protected byte getNodeAsByte(int index) + { + return this.get(index, Type.BYTE); + } + + protected int getNodeAsInt(int index) + { + return this.get(index, Type.INT); + } + + protected float getNodeAsFloat(int index) + { + return this.get(index, Type.FLOAT); + } + + protected double getNodeAsDouble(int index) + { + return this.get(index, Type.DOUBLE); + } + + protected long getNodeAsLong(int index) + { + return this.get(index, Type.LONG); + } + + protected Coordinate getNodeAsCoordinate(int index) + { + return this.get(index, Type.COORDINATE); + } + + @Nullable + protected ResourceLocation getNodeAsResourceLocation(int index) + { + return this.get(index, Type.RESOURCE_LOCATION); + } + + protected TargetSelector getNodeAsTargetSelector(int index) + { + return this.get(index, Type.TARGET_SELECTOR); + } + + @Nullable + protected Level getNodeAsLevel(int index) + { + return this.get(index, Type.LEVEL); + } + + @Nullable + protected NBTTagCompound getNodeAsNBT(int index) + { + return this.get(index, Type.NBT); + } + + @Nullable + private T get(int index, Type type) + { + if(index < this.command.size()) + { + Entry entry = this.command.get(index); + Type expected = entry.getKey().getType(); + String value = entry.getValue(); + + if(expected.equals(type)) + { + if(value.equals(entry.getKey().toString())) + { + return null; + } + + return expected.parse(value); + } + + this.warn("get", expected, type, index); + + return type.parse(value); + } + + return null; + } + + private void warn(String function, Type expected, Type type, int index) + { + WorldHandler.LOGGER.warn("[" + function.toUpperCase() + "] Expected \"" + expected + "\" instead of \"" + type + "\" at index \"" + index + "\" for command \"" + this.getCommandName() + "\""); + } + + private boolean isDefaultEntry(Entry entry) + { + return entry.getKey().getDefault() != null ? entry.getValue().equals(entry.getKey().getDefault().toString()) : false; + } + + protected void updateSyntax(Syntax syntax) + { + if(syntax != null) + { + this.command = syntax.getSyntaxEntries().stream().map(entry -> new AbstractMap.SimpleEntry(entry, entry.toString())).collect(Collectors.toList()); + } + } + + @Override + public String toCommand() + { + return "/" + this.getCommandName() + " " + String.join(" ", this.command.stream().map(entry -> this.isDefaultEntry(entry) ? entry.getKey().toString() : entry.getValue()).collect(Collectors.toList())); + } + + @Override + public String toActualCommand() + { + List command = new ArrayList(); + + for(Entry entry : this.command) + { + if(!entry.getKey().isRequired() && (entry.getKey().toString().equals(entry.getValue()) || this.isDefaultEntry(entry))) + { + break; + } + + command.add(entry.getValue()); + } + + return "/" + this.getCommandName() + " " + String.join(" ", command); + } +} diff --git a/src/main/java/exopandora/worldhandler/builder/CommandBuilderNBT.java b/src/main/java/exopandora/worldhandler/builder/CommandBuilderNBT.java new file mode 100644 index 0000000..053d69f --- /dev/null +++ b/src/main/java/exopandora/worldhandler/builder/CommandBuilderNBT.java @@ -0,0 +1,66 @@ +package exopandora.worldhandler.builder; + +import java.util.ArrayList; +import java.util.List; + +import exopandora.worldhandler.builder.component.IBuilderComponent; +import net.minecraft.nbt.NBTBase; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public abstract class CommandBuilderNBT extends CommandBuilder implements ICommandBuilderNBT +{ + private final List TAG_TO_COMPONENT = new ArrayList(); + + @Override + public String toCommand() + { + this.setNBT(this.buildNBT()); + return super.toCommand(); + } + + @Override + public String toActualCommand() + { + this.setNBT(this.buildNBT()); + return super.toActualCommand(); + } + + private NBTTagCompound buildNBT() + { + NBTTagCompound nbt = new NBTTagCompound(); + + for(IBuilderComponent component : this.TAG_TO_COMPONENT) + { + NBTBase serialized = component.serialize(); + + if(serialized != null) + { + if(!nbt.hasKey(component.getTag())) + { + nbt.setTag(component.getTag(), serialized); + } + } + } + + if(nbt.hasNoTags()) + { + return null; + } + + return nbt; + } + + protected T registerNBTComponent(T component, String id) + { + this.TAG_TO_COMPONENT.add(component); + return component; + } + + protected T registerNBTComponent(T component) + { + return this.registerNBTComponent(component, component.getTag()); + } +} diff --git a/src/main/java/exopandora/worldhandler/builder/ICommandBuilder.java b/src/main/java/exopandora/worldhandler/builder/ICommandBuilder.java new file mode 100644 index 0000000..41d3038 --- /dev/null +++ b/src/main/java/exopandora/worldhandler/builder/ICommandBuilder.java @@ -0,0 +1,17 @@ +package exopandora.worldhandler.builder; + +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public interface ICommandBuilder +{ + static final int MAX_COMMAND_LENGTH = 256; + + String toCommand(); + + default boolean needsCommandBlock() + { + return this.toCommand().length() > MAX_COMMAND_LENGTH; + } +} diff --git a/src/main/java/exopandora/worldhandler/builder/ICommandBuilderNBT.java b/src/main/java/exopandora/worldhandler/builder/ICommandBuilderNBT.java new file mode 100644 index 0000000..63476cc --- /dev/null +++ b/src/main/java/exopandora/worldhandler/builder/ICommandBuilderNBT.java @@ -0,0 +1,11 @@ +package exopandora.worldhandler.builder; + +import net.minecraft.nbt.NBTTagCompound; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public interface ICommandBuilderNBT extends ICommandBuilder +{ + void setNBT(NBTTagCompound nbt); +} diff --git a/src/main/java/exopandora/worldhandler/builder/ICommandBuilderSyntax.java b/src/main/java/exopandora/worldhandler/builder/ICommandBuilderSyntax.java new file mode 100644 index 0000000..8539b65 --- /dev/null +++ b/src/main/java/exopandora/worldhandler/builder/ICommandBuilderSyntax.java @@ -0,0 +1,18 @@ +package exopandora.worldhandler.builder; + +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public interface ICommandBuilderSyntax extends ICommandBuilder +{ + String getCommandName(); + String toActualCommand(); + Syntax getSyntax(); + + @Override + default boolean needsCommandBlock() + { + return this.toActualCommand().length() > MAX_COMMAND_LENGTH; + } +} diff --git a/src/main/java/exopandora/worldhandler/builder/Syntax.java b/src/main/java/exopandora/worldhandler/builder/Syntax.java new file mode 100644 index 0000000..c08403f --- /dev/null +++ b/src/main/java/exopandora/worldhandler/builder/Syntax.java @@ -0,0 +1,93 @@ +package exopandora.worldhandler.builder; + +import java.util.ArrayList; +import java.util.List; + +import exopandora.worldhandler.builder.types.Type; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public class Syntax +{ + private List syntax = new ArrayList(); + + public Syntax addRequired(String key, Type type) + { + this.syntax.add(new SyntaxEntry(key, type, true, null)); + return this; + } + + public Syntax addRequired(String key, Type type, Object def) + { + this.syntax.add(new SyntaxEntry(key, type, true, def)); + return this; + } + + public Syntax addOptional(String key, Type type) + { + this.syntax.add(new SyntaxEntry(key, type, false, null)); + return this; + } + + public Syntax addOptional(String key, Type type, Object def) + { + this.syntax.add(new SyntaxEntry(key, type, false, def)); + return this; + } + + public List getSyntaxEntries() + { + return this.syntax; + } + + @SideOnly(Side.CLIENT) + public static class SyntaxEntry + { + private final String key; + private final Type type; + private final boolean required; + private final Object def; + + public SyntaxEntry(String key, Type type, boolean required, Object def) + { + this.key = key; + this.type = type; + this.required = required; + this.def = def; + } + + public String getKey() + { + return this.key; + } + + public Type getType() + { + return this.type; + } + + public boolean isRequired() + { + return this.required; + } + + public Object getDefault() + { + return this.def; + } + + @Override + public String toString() + { + if(this.required) + { + return "<" + this.key + ">"; + } + else + { + return "[" + this.key + "]"; + } + } + } +} diff --git a/src/main/java/exopandora/worldhandler/builder/component/IBuilderComponent.java b/src/main/java/exopandora/worldhandler/builder/component/IBuilderComponent.java new file mode 100644 index 0000000..f5dd611 --- /dev/null +++ b/src/main/java/exopandora/worldhandler/builder/component/IBuilderComponent.java @@ -0,0 +1,15 @@ +package exopandora.worldhandler.builder.component; + +import javax.annotation.Nullable; + +import net.minecraft.nbt.NBTBase; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public interface IBuilderComponent +{ + @Nullable + NBTBase serialize(); + String getTag(); +} diff --git a/src/main/java/exopandora/worldhandler/builder/component/abstr/ComponentAttribute.java b/src/main/java/exopandora/worldhandler/builder/component/abstr/ComponentAttribute.java new file mode 100644 index 0000000..2279b9f --- /dev/null +++ b/src/main/java/exopandora/worldhandler/builder/component/abstr/ComponentAttribute.java @@ -0,0 +1,32 @@ +package exopandora.worldhandler.builder.component.abstr; + +import java.util.HashMap; +import java.util.Map; +import java.util.function.Function; + +import exopandora.worldhandler.builder.component.IBuilderComponent; +import exopandora.worldhandler.builder.impl.abstr.EnumAttributes; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public abstract class ComponentAttribute implements IBuilderComponent +{ + protected Map attributes = new HashMap(); + protected Function applyable; + + public ComponentAttribute(Function applyable) + { + this.applyable = applyable; + } + + public void set(EnumAttributes attribute, float ammount) + { + this.attributes.put(attribute, ammount); + } + + public void remove(EnumAttributes attribute) + { + this.attributes.remove(attribute); + } +} diff --git a/src/main/java/exopandora/worldhandler/builder/component/abstr/ComponentPotion.java b/src/main/java/exopandora/worldhandler/builder/component/abstr/ComponentPotion.java new file mode 100644 index 0000000..5a21f33 --- /dev/null +++ b/src/main/java/exopandora/worldhandler/builder/component/abstr/ComponentPotion.java @@ -0,0 +1,182 @@ +package exopandora.worldhandler.builder.component.abstr; + +import java.util.Map; +import java.util.Map.Entry; +import java.util.stream.Collectors; + +import javax.annotation.Nullable; + +import exopandora.worldhandler.builder.component.IBuilderComponent; +import net.minecraft.nbt.NBTBase; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraft.potion.Potion; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public abstract class ComponentPotion implements IBuilderComponent +{ + protected final Map potions = Potion.REGISTRY.getKeys().stream().collect(Collectors.toMap(Potion.REGISTRY::getObject, key -> new PotionMetadata())); + + @Override + @Nullable + public NBTBase serialize() + { + NBTTagList list = new NBTTagList(); + + for(Entry entry : this.potions.entrySet()) + { + PotionMetadata potion = entry.getValue(); + + if(potion.getAmplifier() > 0) + { + NBTTagCompound compound = new NBTTagCompound(); + + compound.setByte("Id", (byte) Potion.getIdFromPotion(entry.getKey())); + compound.setByte("Amplifier", (byte) (potion.getAmplifier() - 1)); + compound.setInteger("Duration", potion.getDuration() > 0 ? Math.min(potion.getDuration(), 1000000) : 1000000); + compound.setBoolean("Ambient", potion.getAmbient()); + compound.setBoolean("ShowParticles", potion.getShowParticles()); + + list.appendTag(compound); + } + } + + if(!list.hasNoTags()) + { + return list; + } + + return null; + } + + public void set(Potion potion, PotionMetadata metadata) + { + this.potions.put(potion, metadata); + } + + public void set(Potion potion, byte amplifier, int seconds, int minutes, int hours, boolean showParticles, boolean ambient) + { + this.set(potion, new PotionMetadata(amplifier, seconds, minutes, hours, showParticles, ambient)); + } + + public void setAmplifier(Potion potion, byte amplifier) + { + if(this.potions.containsKey(potion)) + { + this.potions.get(potion).setAmplifier(amplifier); + } + } + + public byte getAmplifier(Potion potion) + { + if(this.potions.containsKey(potion)) + { + return this.potions.get(potion).getAmplifier(); + } + + return 0; + } + + public void setSeconds(Potion potion, int seconds) + { + if(this.potions.containsKey(potion)) + { + this.potions.get(potion).setSeconds(seconds);; + } + } + + public int getSeconds(Potion potion) + { + if(this.potions.containsKey(potion)) + { + return this.potions.get(potion).getSeconds(); + } + + return 0; + } + + public void setMinutes(Potion potion, int minutes) + { + if(this.potions.containsKey(potion)) + { + this.potions.get(potion).setSeconds(minutes);; + } + } + + public int getMinutes(Potion potion) + { + if(this.potions.containsKey(potion)) + { + return this.potions.get(potion).getMinutes(); + } + + return 0; + } + + public void setHours(Potion potion, int hours) + { + if(this.potions.containsKey(potion)) + { + this.potions.get(potion).setSeconds(hours);; + } + } + + public int getHours(Potion potion) + { + if(this.potions.containsKey(potion)) + { + return this.potions.get(potion).getHours(); + } + + return 0; + } + + public void setShowParticles(Potion potion, boolean showParticles) + { + if(this.potions.containsKey(potion)) + { + this.potions.get(potion).setShowParticles(showParticles); + } + } + + public boolean getShowParticles(Potion potion) + { + if(this.potions.containsKey(potion)) + { + return this.potions.get(potion).getShowParticles(); + } + + return true; + } + + public void setAmbient(Potion potion, boolean ambient) + { + if(this.potions.containsKey(potion)) + { + this.potions.get(potion).setAmbient(ambient); + } + } + + public boolean getAmbient(Potion potion) + { + if(this.potions.containsKey(potion)) + { + return this.potions.get(potion).getAmbient(); + } + + return false; + } + + @Nullable + public PotionMetadata get(Potion potion) + { + return this.potions.get(potion); + } + + public void remove(Potion potion) + { + this.potions.remove(potion); + } +} diff --git a/src/main/java/exopandora/worldhandler/builder/component/abstr/PotionMetadata.java b/src/main/java/exopandora/worldhandler/builder/component/abstr/PotionMetadata.java new file mode 100644 index 0000000..4a5a502 --- /dev/null +++ b/src/main/java/exopandora/worldhandler/builder/component/abstr/PotionMetadata.java @@ -0,0 +1,137 @@ +package exopandora.worldhandler.builder.component.abstr; + +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public class PotionMetadata +{ + private byte amplifier; + private int seconds; + private int minutes; + private int hours; + private boolean showParticles; + private boolean ambient; + + public PotionMetadata() + { + this((byte) 0, 0, 0, 0, true, false); + } + + public PotionMetadata(byte amplifier, int seconds, int minutes, int hours, boolean showParticles, boolean ambient) + { + this.amplifier = amplifier; + this.seconds = seconds; + this.minutes = minutes; + this.hours = hours; + this.showParticles = showParticles; + this.ambient = ambient; + } + + public byte getAmplifier() + { + return this.amplifier; + } + + public void setAmplifier(byte amplifier) + { + this.amplifier = amplifier; + } + + public int getSeconds() + { + return this.seconds; + } + + public void setSeconds(int seconds) + { + this.seconds = seconds; + } + + public int getMinutes() + { + return this.minutes; + } + + public void setMinutes(int minutes) + { + this.minutes = minutes; + } + + public int getHours() + { + return this.hours; + } + + public void setHours(int hours) + { + this.hours = hours; + } + + public boolean getShowParticles() + { + return this.showParticles; + } + + public void setShowParticles(boolean showParticles) + { + this.showParticles = showParticles; + } + + public boolean getAmbient() + { + return this.ambient; + } + + public void setAmbient(boolean ambient) + { + this.ambient = ambient; + } + + public int getDuration() + { + return PotionMetadata.getDuration(this.seconds, this.minutes, this.hours); + } + + public static int getDuration(int seconds, int minutes, int hours) + { + return seconds * 20 + minutes * 1200 + hours * 72000; + } + + public PotionMetadata withAmplifier(byte amplifier) + { + this.amplifier = amplifier; + return this; + } + + public PotionMetadata withShowParticles(boolean showParticles) + { + this.showParticles = showParticles; + return this; + } + + public PotionMetadata withSeconds(int seconds) + { + this.seconds = seconds; + return this; + } + + public PotionMetadata withMinutes(int minutes) + { + this.minutes = minutes; + return this; + } + + public PotionMetadata withHours(int hours) + { + this.hours = hours; + return this; + } + + public PotionMetadata withAmbient(boolean ambient) + { + this.ambient = ambient; + return this; + } +} + diff --git a/src/main/java/exopandora/worldhandler/builder/component/impl/ComponentAttributeItem.java b/src/main/java/exopandora/worldhandler/builder/component/impl/ComponentAttributeItem.java new file mode 100644 index 0000000..1a01317 --- /dev/null +++ b/src/main/java/exopandora/worldhandler/builder/component/impl/ComponentAttributeItem.java @@ -0,0 +1,61 @@ +package exopandora.worldhandler.builder.component.impl; + +import java.util.Map.Entry; +import java.util.UUID; +import java.util.function.Function; + +import javax.annotation.Nullable; + +import exopandora.worldhandler.builder.component.abstr.ComponentAttribute; +import exopandora.worldhandler.builder.impl.abstr.EnumAttributes; +import net.minecraft.nbt.NBTBase; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public class ComponentAttributeItem extends ComponentAttribute +{ + public ComponentAttributeItem(Function applyable) + { + super(applyable); + } + + @Override + @Nullable + public NBTBase serialize() + { + NBTTagList attributes = new NBTTagList(); + + for(Entry entry : this.attributes.entrySet()) + { + if(this.applyable.apply(entry.getKey()) && entry.getValue() != 0) + { + NBTTagCompound attribute = new NBTTagCompound(); + + attribute.setString("AttributeName", entry.getKey().getAttribute()); + attribute.setString("Name", entry.getKey().getAttribute()); + attribute.setDouble("Amount", entry.getKey().calculate(entry.getValue())); + attribute.setInteger("Operation", entry.getKey().getOperation().ordinal()); + attribute.setLong("UUIDLeast", UUID.nameUUIDFromBytes(entry.getKey().getAttribute().getBytes()).getLeastSignificantBits()); + attribute.setLong("UUIDMost", UUID.nameUUIDFromBytes(entry.getKey().getAttribute().getBytes()).getMostSignificantBits()); + + attributes.appendTag(attribute); + } + } + + if(!attributes.hasNoTags()) + { + return attributes; + } + + return null; + } + + @Override + public String getTag() + { + return "AttributeModifiers"; + } +} diff --git a/src/main/java/exopandora/worldhandler/builder/component/impl/ComponentAttributeMob.java b/src/main/java/exopandora/worldhandler/builder/component/impl/ComponentAttributeMob.java new file mode 100644 index 0000000..5cca8da --- /dev/null +++ b/src/main/java/exopandora/worldhandler/builder/component/impl/ComponentAttributeMob.java @@ -0,0 +1,56 @@ +package exopandora.worldhandler.builder.component.impl; + +import java.util.Map.Entry; +import java.util.function.Function; + +import javax.annotation.Nullable; + +import exopandora.worldhandler.builder.component.abstr.ComponentAttribute; +import exopandora.worldhandler.builder.impl.abstr.EnumAttributes; +import net.minecraft.nbt.NBTBase; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public class ComponentAttributeMob extends ComponentAttribute +{ + public ComponentAttributeMob(Function applyable) + { + super(applyable); + } + + @Override + @Nullable + public NBTBase serialize() + { + NBTTagList attributes = new NBTTagList(); + + for(Entry entry : this.attributes.entrySet()) + { + if(this.applyable.apply(entry.getKey()) && entry.getValue() != 0) + { + NBTTagCompound attribute = new NBTTagCompound(); + + attribute.setString("Name", entry.getKey().getAttribute()); + attribute.setDouble("Base", entry.getKey().calculate(entry.getValue())); + + attributes.appendTag(attribute); + } + } + + if(!attributes.hasNoTags()) + { + return attributes; + } + + return null; + } + + @Override + public String getTag() + { + return "Attributes"; + } +} diff --git a/src/main/java/exopandora/worldhandler/builder/component/impl/ComponentDisplay.java b/src/main/java/exopandora/worldhandler/builder/component/impl/ComponentDisplay.java new file mode 100644 index 0000000..1dfcc1c --- /dev/null +++ b/src/main/java/exopandora/worldhandler/builder/component/impl/ComponentDisplay.java @@ -0,0 +1,98 @@ +package exopandora.worldhandler.builder.component.impl; + +import exopandora.worldhandler.builder.component.IBuilderComponent; +import exopandora.worldhandler.format.text.ColoredString; +import net.minecraft.nbt.NBTBase; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraft.nbt.NBTTagString; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public class ComponentDisplay implements IBuilderComponent +{ + private ColoredString name = new ColoredString(); + private String[] lore = new String[2]; + + @Override + public NBTBase serialize() + { + NBTTagCompound display = new NBTTagCompound(); + + String name = this.name.getText(); + + if(name != null && !name.isEmpty()) + { + display.setString("Name", this.name.toString()); + } + + NBTTagList lore = new NBTTagList(); + + for(int x = 0; x < this.lore.length; x++) + { + if(this.lore[x] != null && !this.lore[x].isEmpty()) + { + lore.appendTag(new NBTTagString(this.lore[x])); + } + } + + if(!lore.hasNoTags()) + { + display.setTag("Lore", lore); + } + + if(!display.hasNoTags()) + { + return display; + } + + return null; + } + + public void setName(ColoredString name) + { + this.name = name; + } + + public ColoredString getName() + { + return this.name; + } + + public void setLore(String[] lore) + { + this.lore = lore; + } + + public String[] getLore() + { + return this.lore; + } + + public void setLore1(String lore) + { + this.lore[0] = lore; + } + + public String getLore1() + { + return this.lore[0]; + } + + public void setLore2(String lore) + { + this.lore[1] = lore; + } + + public String getLore2() + { + return this.lore[1]; + } + + @Override + public String getTag() + { + return "display"; + } +} diff --git a/src/main/java/exopandora/worldhandler/builder/component/impl/ComponentEnchantment.java b/src/main/java/exopandora/worldhandler/builder/component/impl/ComponentEnchantment.java new file mode 100644 index 0000000..d37b06b --- /dev/null +++ b/src/main/java/exopandora/worldhandler/builder/component/impl/ComponentEnchantment.java @@ -0,0 +1,64 @@ +package exopandora.worldhandler.builder.component.impl; + +import java.util.Map; +import java.util.Map.Entry; +import java.util.stream.Collectors; + +import javax.annotation.Nullable; + +import exopandora.worldhandler.builder.component.IBuilderComponent; +import net.minecraft.enchantment.Enchantment; +import net.minecraft.nbt.NBTBase; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public class ComponentEnchantment implements IBuilderComponent +{ + private Map enchantments = Enchantment.REGISTRY.getKeys().stream().collect(Collectors.toMap(Enchantment.REGISTRY::getObject, key -> (short) 0)); + + @Override + @Nullable + public NBTBase serialize() + { + NBTTagList enchantments = new NBTTagList(); + + for(Entry entry : this.enchantments.entrySet()) + { + if(entry.getValue() > 0) + { + NBTTagCompound enchantment = new NBTTagCompound(); + + enchantment.setShort("id", (short) Enchantment.getEnchantmentID(entry.getKey())); + enchantment.setShort("lvl", entry.getValue()); + + enchantments.appendTag(enchantment); + } + } + + if(!enchantments.hasNoTags()) + { + return enchantments; + } + + return null; + } + + public void setLevel(Enchantment enchantment, short level) + { + this.enchantments.put(enchantment, level); + } + + public int getLevel(Enchantment enchantment) + { + return this.enchantments.get(enchantment); + } + + @Override + public String getTag() + { + return "ench"; + } +} diff --git a/src/main/java/exopandora/worldhandler/builder/component/impl/ComponentPotionItem.java b/src/main/java/exopandora/worldhandler/builder/component/impl/ComponentPotionItem.java new file mode 100644 index 0000000..2a0c609 --- /dev/null +++ b/src/main/java/exopandora/worldhandler/builder/component/impl/ComponentPotionItem.java @@ -0,0 +1,15 @@ +package exopandora.worldhandler.builder.component.impl; + +import exopandora.worldhandler.builder.component.abstr.ComponentPotion; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public class ComponentPotionItem extends ComponentPotion +{ + @Override + public String getTag() + { + return "CustomPotionEffects"; + } +} diff --git a/src/main/java/exopandora/worldhandler/builder/component/impl/ComponentPotionMob.java b/src/main/java/exopandora/worldhandler/builder/component/impl/ComponentPotionMob.java new file mode 100644 index 0000000..c5b0e06 --- /dev/null +++ b/src/main/java/exopandora/worldhandler/builder/component/impl/ComponentPotionMob.java @@ -0,0 +1,15 @@ +package exopandora.worldhandler.builder.component.impl; + +import exopandora.worldhandler.builder.component.abstr.ComponentPotion; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public class ComponentPotionMob extends ComponentPotion +{ + @Override + public String getTag() + { + return "ActiveEffects"; + } +} diff --git a/src/main/java/exopandora/worldhandler/builder/component/impl/ComponentSummon.java b/src/main/java/exopandora/worldhandler/builder/component/impl/ComponentSummon.java new file mode 100644 index 0000000..cfaf5b5 --- /dev/null +++ b/src/main/java/exopandora/worldhandler/builder/component/impl/ComponentSummon.java @@ -0,0 +1,302 @@ +package exopandora.worldhandler.builder.component.impl; + +import java.util.Random; + +import javax.annotation.Nullable; + +import org.apache.commons.lang3.StringUtils; + +import exopandora.worldhandler.builder.component.IBuilderComponent; +import exopandora.worldhandler.helper.EntityHelper; +import net.minecraft.client.resources.I18n; +import net.minecraft.entity.EntityList; +import net.minecraft.entity.boss.EntityDragon; +import net.minecraft.entity.boss.EntityWither; +import net.minecraft.entity.item.EntityMinecart; +import net.minecraft.entity.item.EntityMinecartChest; +import net.minecraft.entity.item.EntityMinecartCommandBlock; +import net.minecraft.entity.item.EntityMinecartFurnace; +import net.minecraft.entity.item.EntityMinecartHopper; +import net.minecraft.entity.item.EntityMinecartMobSpawner; +import net.minecraft.entity.item.EntityMinecartTNT; +import net.minecraft.entity.monster.EntityEvoker; +import net.minecraft.entity.monster.EntityGhast; +import net.minecraft.entity.monster.EntityIronGolem; +import net.minecraft.entity.monster.EntityMagmaCube; +import net.minecraft.entity.monster.EntityPigZombie; +import net.minecraft.entity.monster.EntitySkeleton; +import net.minecraft.entity.monster.EntitySnowman; +import net.minecraft.entity.monster.EntitySpider; +import net.minecraft.entity.monster.EntityVindicator; +import net.minecraft.entity.monster.EntityZombie; +import net.minecraft.entity.passive.EntityChicken; +import net.minecraft.entity.passive.EntityHorse; +import net.minecraft.entity.passive.EntityMooshroom; +import net.minecraft.entity.passive.EntityOcelot; +import net.minecraft.entity.passive.EntitySquid; +import net.minecraft.entity.passive.EntityVillager; +import net.minecraft.entity.passive.EntityWolf; +import net.minecraft.nbt.NBTBase; +import net.minecraft.nbt.NBTTagByte; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagInt; +import net.minecraft.nbt.NBTTagList; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public class ComponentSummon implements IBuilderComponent +{ + private final Random random = new Random(); + + private String tag; + private String name; + private ResourceLocation entity; + private boolean hasPassenger; + + public void setEntity(ResourceLocation entityName) + { + this.entity = entityName; + } + + public ResourceLocation getEntity() + { + return this.entity; + } + + public void setHasPassenger(boolean hasPassenger) + { + this.hasPassenger = hasPassenger; + } + + public boolean hasPassenger() + { + return this.hasPassenger; + } + + public String getName() + { + return this.name; + } + + public void setName(String name) + { + this.name = name; + } + + @Override + public NBTBase serialize() + { + if(this.name != null) + { + if(this.name.equalsIgnoreCase("Cat")) + { + this.tag = "CatType"; + return new NBTTagInt(this.random.nextInt(3) + 1); + } + else if(this.name.equalsIgnoreCase("Farmer") || this.name.equalsIgnoreCase("Fisherman") || this.name.equalsIgnoreCase("Shepherd") || this.name.equalsIgnoreCase("Fletcher")) + { + this.tag = "Profession"; + return new NBTTagInt(0); + } + else if(this.name.equalsIgnoreCase("Librarian") || this.name.equalsIgnoreCase("Carthographer")) + { + this.tag = "Profession"; + return new NBTTagInt(1); + } + else if(this.name.equalsIgnoreCase("Cleric") || this.name.equalsIgnoreCase("Priest")) + { + this.tag = "Profession"; + return new NBTTagInt(2); + } + else if(this.name.equalsIgnoreCase("Armorer") || this.name.equalsIgnoreCase("Blacksmith") || this.name.equalsIgnoreCase("WeaponSmith") || this.name.equalsIgnoreCase("ToolSmith")) + { + this.tag = "Profession"; + return new NBTTagInt(3); + } + else if(this.name.equalsIgnoreCase("Butcher") || this.name.equalsIgnoreCase("Leatherworker")) + { + this.tag = "Profession"; + return new NBTTagInt(4); + } + else if(this.name.equalsIgnoreCase("Nitwit")) + { + this.tag = "Profession"; + return new NBTTagInt(5); + } + + if(this.entity != null) + { + if(this.entity.equals(EntityHelper.getResourceLocation(EntityZombie.class))) + { + if(StringUtils.containsIgnoreCase(this.name, "Baby")) + { + this.tag = "IsBaby"; + return new NBTTagByte((byte) 1); + } + } + else if(this.entity.equals(EntityHelper.getResourceLocation(EntityChicken.class))) + { + if(StringUtils.containsIgnoreCase(this.name, "Jockey") && !this.hasPassenger) + { + NBTTagCompound passenger = new NBTTagCompound(); + NBTTagList list = new NBTTagList(); + + passenger.setString("id", EntityHelper.getResourceLocation(EntityZombie.class).toString()); + passenger.setBoolean("IsBaby", true); + list.appendTag(passenger); + + this.tag = "Passengers"; + return list; + } + } + else if(this.entity.equals(EntityHelper.getResourceLocation(EntitySpider.class))) + { + if(StringUtils.containsIgnoreCase(this.name, "Jockey") && !this.hasPassenger) + { + NBTTagCompound passenger = new NBTTagCompound(); + NBTTagList list = new NBTTagList(); + + passenger.setString("id", EntityHelper.getResourceLocation(EntitySkeleton.class).toString()); + list.appendTag(passenger); + + this.tag = "Passengers"; + return list; + } + } + } + } + + return null; + } + + @Override + public String getTag() + { + return this.tag; + } + + @Nullable + public static ResourceLocation resolve(String entityName) + { + String entity = entityName.replaceAll("_| ", ""); + + for(ResourceLocation location : EntityList.ENTITY_EGGS.keySet()) + { + if(entityName.equalsIgnoreCase(I18n.format("entity." + EntityHelper.getEntityName(location) + ".name"))) + { + entity = location.getResourcePath(); + break; + } + } + + if(entity.equalsIgnoreCase("RedCow")) + { + return EntityHelper.getResourceLocation(EntityMooshroom.class); + } + else if(entity.equalsIgnoreCase("ChickenJockey")) + { + return EntityHelper.getResourceLocation(EntityChicken.class); + } + else if(entity.equalsIgnoreCase("Pigman") || entity.equalsIgnoreCase("ZombiePig") || entity.equalsIgnoreCase("ZombiePigman")) + { + return EntityHelper.getResourceLocation(EntityPigZombie.class); + } + else if(entity.equalsIgnoreCase("Wither")) + { + return EntityHelper.getResourceLocation(EntityWither.class); + } + else if(entity.equalsIgnoreCase("Dog")) + { + return EntityHelper.getResourceLocation(EntityWolf.class); + } + else if(entity.equalsIgnoreCase("Dragon")) + { + return EntityHelper.getResourceLocation(EntityDragon.class); + } + else if(entity.equalsIgnoreCase("minecraft:SnowGolem")) + { + return EntityHelper.getResourceLocation(EntitySnowman.class); + } + else if(entity.equalsIgnoreCase("Horse") || entity.equalsIgnoreCase("ZombieHorse") || entity.equalsIgnoreCase("SkeletonHorse")) + { + return EntityHelper.getResourceLocation(EntityHorse.class); + } + else if(entity.equalsIgnoreCase("LavaCube")|| entity.equalsIgnoreCase("MagmaSlime") || entity.equalsIgnoreCase("MagmaCube")) + { + return EntityHelper.getResourceLocation(EntityMagmaCube.class); + } + else if(entity.equalsIgnoreCase("SpiderJockey")) + { + return EntityHelper.getResourceLocation(EntitySpider.class); + } + else if(entity.equalsIgnoreCase("IronGolem")) + { + return EntityHelper.getResourceLocation(EntityIronGolem.class); + } + else if(entity.equalsIgnoreCase("Ozelot") || entity.equals("Ocelot") || entity.equalsIgnoreCase("Cat") || entity.equalsIgnoreCase("Kitty") || entity.equalsIgnoreCase("Kitten")) + { + return EntityHelper.getResourceLocation(EntityOcelot.class); + } + else if(entity.equalsIgnoreCase("TESTIFICATE") || entity.equalsIgnoreCase("Blacksmith") || entity.equalsIgnoreCase("Farmer") || entity.equalsIgnoreCase("Fisherman") || entity.equalsIgnoreCase("Shepherd") || entity.equalsIgnoreCase("Fletcher") || entity.equalsIgnoreCase("Librarian") || entity.equalsIgnoreCase("Cleric") || entity.equalsIgnoreCase("Priest") || entity.equalsIgnoreCase("Armorer") || entity.equalsIgnoreCase("WeaponSmith") || entity.equalsIgnoreCase("ToolSmith") || entity.equalsIgnoreCase("Butcher") || entity.equalsIgnoreCase("Leatherworker") || entity.equalsIgnoreCase("Carthographer") || entity.equalsIgnoreCase("Nitwit")) + { + return EntityHelper.getResourceLocation(EntityVillager.class); + } + else if(entity.equalsIgnoreCase("Octopus") || entity.equalsIgnoreCase("Kraken")) + { + return EntityHelper.getResourceLocation(EntitySquid.class); + } + else if(entity.equalsIgnoreCase("Exwife")) + { + return EntityHelper.getResourceLocation(EntityGhast.class); + } + else if(entity.equalsIgnoreCase("TNTMinecart")) + { + return EntityHelper.getResourceLocation(EntityMinecartTNT.class); + } + else if(entity.equalsIgnoreCase("Minecart")) + { + return EntityHelper.getResourceLocation(EntityMinecart.class); + } + else if(entity.equalsIgnoreCase("HopperMinecart")) + { + return EntityHelper.getResourceLocation(EntityMinecartHopper.class); + } + else if(entity.equalsIgnoreCase("ChestMinecart")) + { + return EntityHelper.getResourceLocation(EntityMinecartChest.class); + } + else if(entity.equalsIgnoreCase("SpawnerMinecart")) + { + return EntityHelper.getResourceLocation(EntityMinecartMobSpawner.class); + } + else if(entity.equalsIgnoreCase("FurnaceMinecart")) + { + return EntityHelper.getResourceLocation(EntityMinecartFurnace.class); + } + else if(entity.equalsIgnoreCase("CommandBlockMinecart") || entity.equalsIgnoreCase("MinecartCommand") || entity.equalsIgnoreCase("CommandMinecart")) + { + return EntityHelper.getResourceLocation(EntityMinecartCommandBlock.class); + } + else if(entity.equalsIgnoreCase("Wizard")) + { + return EntityHelper.getResourceLocation(EntityEvoker.class); + } + else if(entity.equalsIgnoreCase("Johnny")) + { + return EntityHelper.getResourceLocation(EntityVindicator.class); + } + else if(entity.equalsIgnoreCase("BabyZombie")) + { + return EntityHelper.getResourceLocation(EntityZombie.class); + } + + if(entity == null || entity.isEmpty()) + { + return null; + } + + return new ResourceLocation(entity); + } +} diff --git a/src/main/java/exopandora/worldhandler/builder/component/impl/ComponentTag.java b/src/main/java/exopandora/worldhandler/builder/component/impl/ComponentTag.java new file mode 100644 index 0000000..057e79a --- /dev/null +++ b/src/main/java/exopandora/worldhandler/builder/component/impl/ComponentTag.java @@ -0,0 +1,144 @@ +package exopandora.worldhandler.builder.component.impl; + +import java.util.function.Function; + +import javax.annotation.Nullable; + +import exopandora.worldhandler.builder.component.IBuilderComponent; +import exopandora.worldhandler.main.WorldHandler; +import net.minecraft.nbt.NBTBase; +import net.minecraft.nbt.NBTTagByte; +import net.minecraft.nbt.NBTTagByteArray; +import net.minecraft.nbt.NBTTagDouble; +import net.minecraft.nbt.NBTTagFloat; +import net.minecraft.nbt.NBTTagInt; +import net.minecraft.nbt.NBTTagIntArray; +import net.minecraft.nbt.NBTTagLong; +import net.minecraft.nbt.NBTTagLongArray; +import net.minecraft.nbt.NBTTagString; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public class ComponentTag implements IBuilderComponent +{ + private final Function serializer; + private final String tag; + private T value; + + public ComponentTag(String tag, T value, Function serializer) + { + this.tag = tag; + this.value = value; + this.serializer = serializer; + } + + public ComponentTag(String tag, Function serializer) + { + this(tag, null, serializer); + } + + public ComponentTag(String tag, T value) + { + this(tag, value, null); + } + + public ComponentTag(String tag) + { + this(tag, null, null); + } + + public void setValue(T value) + { + this.value = value; + } + + @Nullable + public T getValue() + { + return this.value; + } + + @Override + @Nullable + public NBTBase serialize() + { + if(this.value != null) + { + if(this.serializer != null) + { + return this.serializer.apply(this.value); + } + else if(this.value instanceof String) + { + String string = (String) this.value; + + if(string.isEmpty()) + { + return null; + } + + return new NBTTagString(string); + } + else if(this.value instanceof NBTBase) + { + NBTBase base = (NBTBase) this.value; + + if(base.hasNoTags()) + { + return null; + } + + return (NBTBase) this.value; + } + else if(this.value instanceof Integer) + { + return new NBTTagInt((Integer) this.value); + } + else if(this.value instanceof Byte) + { + return new NBTTagByte((Byte) this.value); + } + else if(this.value instanceof Float) + { + return new NBTTagFloat((Float) this.value); + } + else if(this.value instanceof Double) + { + return new NBTTagDouble((Double) this.value); + } + else if(this.value instanceof Long) + { + return new NBTTagLong((Long) this.value); + } + else if(this.value instanceof Short) + { + return new NBTTagLong((Short) this.value); + } + else if(this.value instanceof Byte[]) + { + return new NBTTagByteArray((byte[]) this.value); + } + else if(this.value instanceof Integer[]) + { + return new NBTTagIntArray((int[]) this.value); + } + else if(this.value instanceof Long[]) + { + return new NBTTagLongArray((long[]) this.value); + } + else + { + WorldHandler.LOGGER.warn("Tag \"" + this.tag + "\" has no serializer"); + } + } + + return null; + } + + @Override + public String getTag() + { + return this.tag; + } +} diff --git a/src/main/java/exopandora/worldhandler/builder/impl/BuilderAdvancement.java b/src/main/java/exopandora/worldhandler/builder/impl/BuilderAdvancement.java new file mode 100644 index 0000000..0f9868b --- /dev/null +++ b/src/main/java/exopandora/worldhandler/builder/impl/BuilderAdvancement.java @@ -0,0 +1,122 @@ +package exopandora.worldhandler.builder.impl; + +import exopandora.worldhandler.builder.CommandBuilder; +import exopandora.worldhandler.builder.Syntax; +import exopandora.worldhandler.builder.types.Type; +import exopandora.worldhandler.helper.EnumHelper; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public class BuilderAdvancement extends CommandBuilder +{ + public BuilderAdvancement(EnumMode mode) + { + this.setMode(mode); + } + + public BuilderAdvancement(EnumActionType action, String player, EnumMode mode, ResourceLocation advancement) + { + this(mode); + this.setActionType(action); + this.setPlayer(player); + this.setAdvancement(advancement); + } + + public void setActionType(EnumActionType action) + { + this.setNode(0, action != null ? action.toString() : null); + } + + public EnumActionType getActionType() + { + return EnumHelper.valueOf(EnumActionType.class, this.getNodeAsString(1)); + } + + public void setPlayer(String player) + { + this.setNode(1, player); + } + + public String getPlayer() + { + return this.getNodeAsString(1); + } + + public void setMode(EnumMode mode) + { + this.setNode(2, mode != null ? mode.toString() : null); + } + + public EnumMode getMode() + { + return EnumHelper.valueOf(EnumMode.class, this.getNodeAsString(2)); + } + + public void setAdvancement(ResourceLocation advancement) + { + this.setNode(3, advancement); + } + + public ResourceLocation getAdvancement() + { + return this.getNodeAsResourceLocation(3); + } + + public BuilderAdvancement getBuilderForAction(EnumActionType action) + { + return this.getBuilder(action, this.getMode()); + } + + public BuilderAdvancement getBuilder(EnumActionType action, EnumMode mode) + { + return new BuilderAdvancement(action, this.getPlayer(), mode, (mode != null && !mode.equals(EnumMode.EVERYTHING)) ? this.getAdvancement() : null); + } + + @Override + public String getCommandName() + { + return "advancement"; + } + + @Override + public final Syntax getSyntax() + { + Syntax syntax = new Syntax(); + + syntax.addRequired("grant|revoke|test", Type.STRING); + syntax.addRequired("player", Type.STRING); + syntax.addRequired("only|until|from|through|everything", Type.STRING); + syntax.addOptional("advancement", Type.RESOURCE_LOCATION); + + return syntax; + } + + public static enum EnumActionType + { + GRANT, + REVOKE; + + @Override + public String toString() + { + return this.name().toLowerCase(); + } + } + + public static enum EnumMode + { + ONLY, + UNTIL, + FROM, + THROUGH, + EVERYTHING; + + @Override + public String toString() + { + return this.name().toLowerCase(); + } + } +} diff --git a/src/main/java/exopandora/worldhandler/builder/impl/BuilderBlockdata.java b/src/main/java/exopandora/worldhandler/builder/impl/BuilderBlockdata.java new file mode 100644 index 0000000..c7dc1b7 --- /dev/null +++ b/src/main/java/exopandora/worldhandler/builder/impl/BuilderBlockdata.java @@ -0,0 +1,37 @@ +package exopandora.worldhandler.builder.impl; + +import exopandora.worldhandler.builder.Syntax; +import exopandora.worldhandler.builder.impl.abstr.BuilderBlockPos; +import exopandora.worldhandler.builder.types.Type; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public class BuilderBlockdata extends BuilderBlockPos +{ + @Override + public void setNBT(NBTTagCompound nbt) + { + this.setNode(3, nbt); + } + + @Override + public String getCommandName() + { + return "blockdata"; + } + + @Override + public final Syntax getSyntax() + { + Syntax syntax = new Syntax(); + + syntax.addRequired("x", Type.COORDINATE); + syntax.addRequired("y", Type.COORDINATE); + syntax.addRequired("z", Type.COORDINATE); + syntax.addRequired("nbt", Type.NBT); + + return syntax; + } +} diff --git a/src/main/java/exopandora/worldhandler/builder/impl/BuilderButcher.java b/src/main/java/exopandora/worldhandler/builder/impl/BuilderButcher.java new file mode 100644 index 0000000..fd4e1d3 --- /dev/null +++ b/src/main/java/exopandora/worldhandler/builder/impl/BuilderButcher.java @@ -0,0 +1,65 @@ +package exopandora.worldhandler.builder.impl; + +import exopandora.worldhandler.builder.CommandBuilder; +import exopandora.worldhandler.builder.Syntax; +import exopandora.worldhandler.builder.types.TargetSelector; +import exopandora.worldhandler.builder.types.Type; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public class BuilderButcher extends CommandBuilder +{ + private final TargetSelector targetSelector; + + public BuilderButcher() + { + this(new ResourceLocation(""), 0); + } + + public BuilderButcher(ResourceLocation entity, int radius) + { + this.targetSelector = new TargetSelector(); + this.setEntity(entity); + this.setRadius(radius); + } + + public void setRadius(int radius) + { + this.targetSelector.set("r", radius); + this.setNode(0, this.targetSelector); + } + + public int getRadius() + { + return this.targetSelector.get("r"); + } + + public void setEntity(ResourceLocation entity) + { + this.targetSelector.set("type", entity.toString()); + this.setNode(0, this.targetSelector); + } + + public ResourceLocation getEntity() + { + return this.targetSelector.get("type"); + } + + @Override + public String getCommandName() + { + return "kill"; + } + + @Override + public Syntax getSyntax() + { + Syntax syntax = new Syntax(); + + syntax.addRequired("entity_name", Type.TARGET_SELECTOR); + + return syntax; + } +} diff --git a/src/main/java/exopandora/worldhandler/builder/impl/BuilderClone.java b/src/main/java/exopandora/worldhandler/builder/impl/BuilderClone.java new file mode 100644 index 0000000..44b6c17 --- /dev/null +++ b/src/main/java/exopandora/worldhandler/builder/impl/BuilderClone.java @@ -0,0 +1,144 @@ +package exopandora.worldhandler.builder.impl; + +import exopandora.worldhandler.builder.Syntax; +import exopandora.worldhandler.builder.impl.abstr.BuilderDoubleBlockPos; +import exopandora.worldhandler.builder.types.Coordinate; +import exopandora.worldhandler.builder.types.Type; +import exopandora.worldhandler.helper.EnumHelper; +import net.minecraft.util.math.BlockPos; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public class BuilderClone extends BuilderDoubleBlockPos +{ + public BuilderClone() + { + this.setX(new Coordinate()); + this.setY(new Coordinate()); + this.setZ(new Coordinate()); + this.setMask(EnumMask.values()[0]); + this.setNode(10, "force"); + } + + public void setPosition(BlockPos pos) + { + this.setX(pos.getX()); + this.setY(pos.getY()); + this.setZ(pos.getZ()); + } + + public void setX(float x) + { + this.setX(new Coordinate(x)); + } + + public void setY(float y) + { + this.setY(new Coordinate(y)); + } + + public void setZ(float z) + { + this.setZ(new Coordinate(z)); + } + + public void setX(Coordinate x) + { + this.setNode(6, x); + } + + public void setY(Coordinate y) + { + this.setNode(7, y); + } + + public void setZ(Coordinate z) + { + this.setNode(8, z); + } + + public Coordinate getXCoordiante() + { + return this.getNodeAsCoordinate(6); + } + + public Coordinate getYCoordiante() + { + return this.getNodeAsCoordinate(7); + } + + public Coordinate getZCoordiante() + { + return this.getNodeAsCoordinate(8); + } + + public double getX() + { + return this.getXCoordiante().getValue(); + } + + public double getY() + { + return this.getYCoordiante().getValue(); + } + + public double getZ() + { + return this.getZCoordiante().getValue(); + } + + public BlockPos getBlockPos() + { + return new BlockPos(this.getX(), this.getY(), this.getZ()); + } + + public void setMask(EnumMask mask) + { + this.setNode(9, mask != null ? mask.toString() : null); + } + + public EnumMask getMask() + { + return EnumHelper.valueOf(EnumMask.class, this.getNodeAsString(9)); + } + + @Override + public String getCommandName() + { + return "clone"; + } + + @Override + public final Syntax getSyntax() + { + Syntax syntax = new Syntax(); + + syntax.addRequired("x1", Type.COORDINATE); + syntax.addRequired("y1", Type.COORDINATE); + syntax.addRequired("z1", Type.COORDINATE); + syntax.addRequired("x2", Type.COORDINATE); + syntax.addRequired("y2", Type.COORDINATE); + syntax.addRequired("z2", Type.COORDINATE); + syntax.addRequired("x", Type.COORDINATE); + syntax.addRequired("y", Type.COORDINATE); + syntax.addRequired("z", Type.COORDINATE); + syntax.addOptional("mask_mode", Type.STRING); + syntax.addOptional("clone_mode", Type.STRING); + + return syntax; + } + + public static enum EnumMask + { + REPLACE, + MASKED, + FILTERED; + + @Override + public String toString() + { + return this.name().toLowerCase(); + } + } +} diff --git a/src/main/java/exopandora/worldhandler/builder/impl/BuilderCustomItem.java b/src/main/java/exopandora/worldhandler/builder/impl/BuilderCustomItem.java new file mode 100644 index 0000000..7ebdba1 --- /dev/null +++ b/src/main/java/exopandora/worldhandler/builder/impl/BuilderCustomItem.java @@ -0,0 +1,81 @@ +package exopandora.worldhandler.builder.impl; + +import exopandora.worldhandler.builder.component.impl.ComponentAttributeItem; +import exopandora.worldhandler.builder.component.impl.ComponentDisplay; +import exopandora.worldhandler.builder.component.impl.ComponentEnchantment; +import exopandora.worldhandler.builder.impl.abstr.EnumAttributes; +import exopandora.worldhandler.builder.impl.abstr.EnumAttributes.Applyable; +import exopandora.worldhandler.format.text.ColoredString; +import net.minecraft.enchantment.Enchantment; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public class BuilderCustomItem extends BuilderGive +{ + private final ComponentAttributeItem attribute; + private final ComponentDisplay display; + private final ComponentEnchantment enchantment; + + public BuilderCustomItem() + { + this(null, null); + } + + public BuilderCustomItem(String username, ResourceLocation item) + { + this.setPlayer(username); + this.setItem(item); + this.setAmount(1); + this.setMetadata(0); + this.attribute = this.registerNBTComponent(new ComponentAttributeItem(attribute -> attribute.getApplyable().equals(Applyable.BOTH) || attribute.getApplyable().equals(Applyable.PLAYER))); + this.display = this.registerNBTComponent(new ComponentDisplay()); + this.enchantment = this.registerNBTComponent(new ComponentEnchantment()); + } + + public void setEnchantment(Enchantment enchantment, short level) + { + this.enchantment.setLevel(enchantment, level); + } + + public void setAttribute(EnumAttributes attribute, float ammount) + { + this.attribute.set(attribute, ammount); + } + + public void removeAttribute(EnumAttributes attribute) + { + this.attribute.remove(attribute); + } + + public void setName(ColoredString name) + { + this.display.setName(name); + } + + public ColoredString getName() + { + return this.display.getName(); + } + + public void setLore1(String lore) + { + this.display.setLore1(lore); + } + + public String getLore1() + { + return this.display.getLore1(); + } + + public void setLore2(String lore) + { + this.display.setLore2(lore); + } + + public String getLore2() + { + return this.display.getLore2(); + } +} diff --git a/src/main/java/exopandora/worldhandler/builder/impl/BuilderDifficulty.java b/src/main/java/exopandora/worldhandler/builder/impl/BuilderDifficulty.java new file mode 100644 index 0000000..348a31a --- /dev/null +++ b/src/main/java/exopandora/worldhandler/builder/impl/BuilderDifficulty.java @@ -0,0 +1,53 @@ +package exopandora.worldhandler.builder.impl; + +import exopandora.worldhandler.builder.CommandBuilder; +import exopandora.worldhandler.builder.Syntax; +import exopandora.worldhandler.builder.types.Type; + +public class BuilderDifficulty extends CommandBuilder +{ + public BuilderDifficulty() + { + + } + + public BuilderDifficulty(EnumDifficulty difficulty) + { + this.setDifficulty(difficulty); + } + + public void setDifficulty(EnumDifficulty difficulty) + { + this.setNode(0, difficulty.toString()); + } + + @Override + public String getCommandName() + { + return "difficulty"; + } + + @Override + public final Syntax getSyntax() + { + Syntax syntax = new Syntax(); + + syntax.addRequired("peaceful|easy|normal|hard", Type.STRING); + + return syntax; + } + + public static enum EnumDifficulty + { + PEACEFUL, + EASY, + NORMAL, + HARD; + + @Override + public String toString() + { + return this.name().toLowerCase(); + } + } +} diff --git a/src/main/java/exopandora/worldhandler/builder/impl/BuilderEnchantment.java b/src/main/java/exopandora/worldhandler/builder/impl/BuilderEnchantment.java new file mode 100644 index 0000000..d12e3d1 --- /dev/null +++ b/src/main/java/exopandora/worldhandler/builder/impl/BuilderEnchantment.java @@ -0,0 +1,60 @@ +package exopandora.worldhandler.builder.impl; + +import exopandora.worldhandler.builder.CommandBuilder; +import exopandora.worldhandler.builder.Syntax; +import exopandora.worldhandler.builder.types.Type; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public class BuilderEnchantment extends CommandBuilder +{ + public void getPlayer(String player) + { + this.getNodeAsString(0); + } + + public void setPlayer(String player) + { + this.setNode(0, player); + } + + public ResourceLocation getEnchantment() + { + return this.getNodeAsResourceLocation(1); + } + + public void setEnchantment(ResourceLocation enchantment) + { + this.setNode(1, enchantment); + } + + public void setLevel(int level) + { + this.setNode(2, level); + } + + public int getLevel() + { + return this.getNodeAsInt(2); + } + + @Override + public String getCommandName() + { + return "enchant"; + } + + @Override + public Syntax getSyntax() + { + Syntax syntax = new Syntax(); + + syntax.addRequired("player", Type.STRING); + syntax.addRequired("enchantment", Type.RESOURCE_LOCATION); + syntax.addOptional("level", Type.INT, 1); + + return syntax; + } +} diff --git a/src/main/java/exopandora/worldhandler/builder/impl/BuilderExperience.java b/src/main/java/exopandora/worldhandler/builder/impl/BuilderExperience.java new file mode 100644 index 0000000..e4122db --- /dev/null +++ b/src/main/java/exopandora/worldhandler/builder/impl/BuilderExperience.java @@ -0,0 +1,67 @@ +package exopandora.worldhandler.builder.impl; + +import exopandora.worldhandler.builder.CommandBuilder; +import exopandora.worldhandler.builder.Syntax; +import exopandora.worldhandler.builder.types.Level; +import exopandora.worldhandler.builder.types.Type; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public class BuilderExperience extends CommandBuilder +{ + public BuilderExperience() + { + + } + + public BuilderExperience(int level, String player) + { + this.setLevel(level); + this.setPlayer(player); + } + + public void setLevel(int level) + { + this.setNode(0, new Level(level)); + } + + public int getLevel() + { + Level level = this.getNodeAsLevel(0); + + if(level != null) + { + return level.getLevel(); + } + + return 0; + } + + public void setPlayer(String player) + { + this.setNode(1, player); + } + + public String getPlayer() + { + return this.getNodeAsString(1); + } + + @Override + public String getCommandName() + { + return "xp"; + } + + @Override + public Syntax getSyntax() + { + Syntax syntax = new Syntax(); + + syntax.addRequired("amount", Type.LEVEL, new Level(0)); + syntax.addOptional("player", Type.STRING); + + return syntax; + } +} diff --git a/src/main/java/exopandora/worldhandler/builder/impl/BuilderFill.java b/src/main/java/exopandora/worldhandler/builder/impl/BuilderFill.java new file mode 100644 index 0000000..1fca3af --- /dev/null +++ b/src/main/java/exopandora/worldhandler/builder/impl/BuilderFill.java @@ -0,0 +1,165 @@ +package exopandora.worldhandler.builder.impl; + +import javax.annotation.Nullable; + +import exopandora.worldhandler.builder.Syntax; +import exopandora.worldhandler.builder.impl.abstr.BuilderDoubleBlockPos; +import exopandora.worldhandler.builder.types.Type; +import exopandora.worldhandler.helper.BlockHelper; +import exopandora.worldhandler.helper.EnumHelper; +import exopandora.worldhandler.helper.ResourceHelper; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public class BuilderFill extends BuilderDoubleBlockPos +{ + public BuilderFill(ResourceLocation block1, EnumBlockHandling handling, ResourceLocation block2) + { + this.setPosition1(BlockHelper.getPos1()); + this.setPosition2(BlockHelper.getPos2()); + this.setBlock1(block1); + this.setMeta1(0); + this.setBlockHandling(handling); + this.setBlock2(block2); + } + + public BuilderFill() + { + this.init(); + } + + private void init() + { + this.setMeta1(0); + } + + @Deprecated + public void setMeta1(int meta) + { + this.setNode(7, meta); + } + + @Deprecated + public void setMeta2(int meta) + { + this.setNode(10, meta); + } + + public void setBlock1(String block) + { + this.setBlock1(ResourceHelper.stringToResourceLocationNullable(block, ResourceHelper::isRegisteredBlock)); + } + + public void setBlock1(ResourceLocation location) + { + this.setNode(6, location); + } + + public ResourceLocation getBlock1() + { + return this.getNodeAsResourceLocation(6); + } + + public String getBlock1String() + { + ResourceLocation location = this.getBlock1(); + + if(location != null) + { + return location.toString(); + } + + return null; + } + + public void setBlockHandling(EnumBlockHandling blockHandling) + { + this.setNode(8, blockHandling != null ? blockHandling.toString() : null); + } + + public void setBlock2(String block) + { + this.setBlock2(ResourceHelper.stringToResourceLocationNullable(block, ResourceHelper::isRegisteredBlock)); + } + + public void setBlock2(ResourceLocation location) + { + this.setNode(9, location); + } + + public String getBlock2String() + { + ResourceLocation location = this.getBlock2(); + + if(location != null) + { + return location.toString(); + } + + return null; + } + + public ResourceLocation getBlock2() + { + return this.getNodeAsResourceLocation(9); + } + + @Nullable + public EnumBlockHandling getBlockHandling() + { + return EnumHelper.valueOf(EnumBlockHandling.class, this.getNodeAsString(8)); + } + + public BuilderFill getBuilderForFill() + { + return new BuilderFill(this.getBlock1(), null, null); + } + + public BuilderFill getBuilderForReplace() + { + return new BuilderFill(this.getBlock2(), EnumBlockHandling.REPLACE, this.getBlock1()); + } + + @Override + public String getCommandName() + { + return "fill"; + } + + @Override + public final Syntax getSyntax() + { + Syntax syntax = new Syntax(); + + syntax.addRequired("x1", Type.COORDINATE); + syntax.addRequired("y1", Type.COORDINATE); + syntax.addRequired("z1", Type.COORDINATE); + syntax.addRequired("x2", Type.COORDINATE); + syntax.addRequired("y2", Type.COORDINATE); + syntax.addRequired("z2", Type.COORDINATE); + syntax.addRequired("block", Type.RESOURCE_LOCATION); + syntax.addOptional("data_value", Type.INT); + syntax.addOptional("old_block_handling", Type.STRING); + syntax.addOptional("block_2|nbt", Type.RESOURCE_LOCATION, "block_2|nbt"); + syntax.addOptional("data_value", Type.INT, "data_value"); + + return syntax; + } + + public static enum EnumBlockHandling + { + REPLACE, + DESTROY, + KEEP, + HOLLOW, + OUTLINE; + + @Override + public String toString() + { + return this.name().toLowerCase(); + } + } +} diff --git a/src/main/java/exopandora/worldhandler/builder/impl/BuilderGamemode.java b/src/main/java/exopandora/worldhandler/builder/impl/BuilderGamemode.java new file mode 100644 index 0000000..b2a57e6 --- /dev/null +++ b/src/main/java/exopandora/worldhandler/builder/impl/BuilderGamemode.java @@ -0,0 +1,65 @@ +package exopandora.worldhandler.builder.impl; + +import exopandora.worldhandler.builder.CommandBuilder; +import exopandora.worldhandler.builder.Syntax; +import exopandora.worldhandler.builder.types.Type; + +public class BuilderGamemode extends CommandBuilder +{ + public BuilderGamemode() + { + + } + + public BuilderGamemode(EnumGamemode mode) + { + this.setMode(mode); + } + + public BuilderGamemode(EnumGamemode mode, String player) + { + this(mode); + this.setPlayer(player); + } + + public void setMode(EnumGamemode mode) + { + this.setNode(0, mode.toString()); + } + + public void setPlayer(String player) + { + this.setNode(1, player); + } + + @Override + public String getCommandName() + { + return "gamemode"; + } + + @Override + public final Syntax getSyntax() + { + Syntax syntax = new Syntax(); + + syntax.addRequired("mode", Type.STRING); + syntax.addOptional("player", Type.STRING); + + return syntax; + } + + public static enum EnumGamemode + { + SURVIVAL, + CREATIVE, + ADVENTURE, + SPECTATOR; + + @Override + public String toString() + { + return this.name().toLowerCase(); + } + } +} diff --git a/src/main/java/exopandora/worldhandler/builder/impl/BuilderGamerule.java b/src/main/java/exopandora/worldhandler/builder/impl/BuilderGamerule.java new file mode 100644 index 0000000..2e138a8 --- /dev/null +++ b/src/main/java/exopandora/worldhandler/builder/impl/BuilderGamerule.java @@ -0,0 +1,64 @@ +package exopandora.worldhandler.builder.impl; + +import exopandora.worldhandler.builder.CommandBuilder; +import exopandora.worldhandler.builder.Syntax; +import exopandora.worldhandler.builder.types.Type; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public class BuilderGamerule extends CommandBuilder +{ + public BuilderGamerule() + { + + } + + public BuilderGamerule(String rule, String value) + { + this.setRule(rule); + this.setValue(value); + } + + public void setRule(String rule) + { + this.setNode(0, rule); + } + + public String getRule() + { + return this.getNodeAsString(0); + } + + public void setValue(String value) + { + this.setNode(1, value); + } + + public String getValue() + { + return this.getNodeAsString(1); + } + + public BuilderGamerule getBuilderForValue(String value) + { + return new BuilderGamerule(this.getRule(), value); + } + + @Override + public String getCommandName() + { + return "gamerule"; + } + + @Override + public final Syntax getSyntax() + { + Syntax syntax = new Syntax(); + + syntax.addOptional("rule", Type.STRING); + syntax.addOptional("true|false|value", Type.STRING); + + return syntax; + } +} diff --git a/src/main/java/exopandora/worldhandler/builder/impl/BuilderGeneric.java b/src/main/java/exopandora/worldhandler/builder/impl/BuilderGeneric.java new file mode 100644 index 0000000..739c145 --- /dev/null +++ b/src/main/java/exopandora/worldhandler/builder/impl/BuilderGeneric.java @@ -0,0 +1,29 @@ +package exopandora.worldhandler.builder.impl; + +import exopandora.worldhandler.builder.ICommandBuilder; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public class BuilderGeneric implements ICommandBuilder +{ + private final String command; + private final String[] arguments; + + public BuilderGeneric(String command, String... arguments) + { + this.command = command; + this.arguments = arguments; + } + + @Override + public String toCommand() + { + return "/" + this.command + " " + String.join(" ", this.arguments); + } + + public String toActualCommand() + { + return this.toCommand(); + } +} diff --git a/src/main/java/exopandora/worldhandler/builder/impl/BuilderGive.java b/src/main/java/exopandora/worldhandler/builder/impl/BuilderGive.java new file mode 100644 index 0000000..2c0aa17 --- /dev/null +++ b/src/main/java/exopandora/worldhandler/builder/impl/BuilderGive.java @@ -0,0 +1,104 @@ +package exopandora.worldhandler.builder.impl; + +import exopandora.worldhandler.builder.CommandBuilderNBT; +import exopandora.worldhandler.builder.Syntax; +import exopandora.worldhandler.builder.types.Type; +import exopandora.worldhandler.helper.ResourceHelper; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public class BuilderGive extends CommandBuilderNBT +{ + public BuilderGive(String player, ResourceLocation item) + { + this.setPlayer(player); + this.setItem(item); + this.setMetadata(0); + } + + public BuilderGive() + { + this(null, null); + } + + public void setPlayer(String username) + { + this.setNode(0, username); + } + + public String getPlayer() + { + return this.getNodeAsString(0); + } + + public void setItem(String item) + { + this.setItem(ResourceHelper.stringToResourceLocationNullable(item, ResourceHelper::isRegisteredItem)); + } + + public void setItem(ResourceLocation item) + { + this.setNode(1, item); + } + + public ResourceLocation getItem() + { + return this.getNodeAsResourceLocation(1); + } + + public void setAmount(int ammount) + { + this.setNode(2, ammount); + } + + public int getAmount() + { + return this.getNodeAsInt(2); + } + + @Deprecated + public void setMetadata(int metadata) + { + this.setNode(3, metadata); + } + + @Deprecated + public int getMetadata() + { + return this.getNodeAsInt(3); + } + + @Override + public void setNBT(NBTTagCompound nbt) + { + this.setNode(4, nbt); + } + + public NBTTagCompound getNBT() + { + return this.getNodeAsNBT(4); + } + + @Override + public String getCommandName() + { + return "give"; + } + + @Override + public final Syntax getSyntax() + { + Syntax syntax = new Syntax(); + + syntax.addRequired("player", Type.STRING); + syntax.addRequired("item", Type.RESOURCE_LOCATION); + syntax.addRequired("amount", Type.INT); + syntax.addRequired("data_value", Type.INT); + syntax.addOptional("nbt", Type.NBT); + + return syntax; + } +} diff --git a/src/main/java/exopandora/worldhandler/builder/impl/BuilderMultiCommand.java b/src/main/java/exopandora/worldhandler/builder/impl/BuilderMultiCommand.java new file mode 100644 index 0000000..d7a2947 --- /dev/null +++ b/src/main/java/exopandora/worldhandler/builder/impl/BuilderMultiCommand.java @@ -0,0 +1,24 @@ +package exopandora.worldhandler.builder.impl; + +import java.util.Arrays; + +import exopandora.worldhandler.builder.ICommandBuilder; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public class BuilderMultiCommand implements ICommandBuilder +{ + private final ICommandBuilder[] builders; + + public BuilderMultiCommand(ICommandBuilder... builder) + { + this.builders = builder; + } + + @Override + public String toCommand() + { + return String.join(" | ", Arrays.stream(this.builders).map(ICommandBuilder::toCommand).toArray(String[]::new)); + } +} diff --git a/src/main/java/exopandora/worldhandler/builder/impl/BuilderNoteEditor.java b/src/main/java/exopandora/worldhandler/builder/impl/BuilderNoteEditor.java new file mode 100644 index 0000000..5aabd4c --- /dev/null +++ b/src/main/java/exopandora/worldhandler/builder/impl/BuilderNoteEditor.java @@ -0,0 +1,39 @@ +package exopandora.worldhandler.builder.impl; + +import exopandora.worldhandler.builder.component.impl.ComponentTag; +import net.minecraft.util.math.BlockPos; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public class BuilderNoteEditor extends BuilderBlockdata +{ + private final ComponentTag note; + + public BuilderNoteEditor() + { + this.note = this.registerNBTComponent(new ComponentTag("note")); + } + + public BuilderNoteEditor(byte note) + { + this(); + this.setNote(note); + } + + public BuilderNoteEditor(byte note, BlockPos pos) + { + this(note); + this.setPosition(pos); + } + + public void setNote(byte note) + { + this.note.setValue(note); + } + + public BuilderNoteEditor getBuilderForNote(byte note) + { + return new BuilderNoteEditor(note, this.getBlockPos()); + } +} diff --git a/src/main/java/exopandora/worldhandler/builder/impl/BuilderPlayer.java b/src/main/java/exopandora/worldhandler/builder/impl/BuilderPlayer.java new file mode 100644 index 0000000..8edfa5e --- /dev/null +++ b/src/main/java/exopandora/worldhandler/builder/impl/BuilderPlayer.java @@ -0,0 +1,44 @@ +package exopandora.worldhandler.builder.impl; + +import exopandora.worldhandler.builder.CommandBuilder; +import exopandora.worldhandler.builder.Syntax; +import exopandora.worldhandler.builder.types.Type; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public class BuilderPlayer extends CommandBuilder +{ + private final String command; + + public BuilderPlayer(String command) + { + this.command = command; + } + + public void setPlayer(String player) + { + this.setNode(0, player); + } + + public String getPlayer() + { + return this.getNodeAsString(0); + } + + @Override + public String getCommandName() + { + return this.command; + } + + @Override + public final Syntax getSyntax() + { + Syntax syntax = new Syntax(); + + syntax.addRequired("player", Type.STRING); + + return syntax; + } +} diff --git a/src/main/java/exopandora/worldhandler/builder/impl/BuilderPlayerReason.java b/src/main/java/exopandora/worldhandler/builder/impl/BuilderPlayerReason.java new file mode 100644 index 0000000..2920bcb --- /dev/null +++ b/src/main/java/exopandora/worldhandler/builder/impl/BuilderPlayerReason.java @@ -0,0 +1,55 @@ +package exopandora.worldhandler.builder.impl; + +import exopandora.worldhandler.builder.CommandBuilder; +import exopandora.worldhandler.builder.Syntax; +import exopandora.worldhandler.builder.types.Type; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public class BuilderPlayerReason extends CommandBuilder +{ + private final String command; + + public BuilderPlayerReason(String command) + { + this.command = command; + } + + public void setPlayer(String player) + { + this.setNode(0, player); + } + + public String getPlayer() + { + return this.getNodeAsString(0); + } + + public void setReason(String reason) + { + this.setNode(1, reason); + } + + public String getReason() + { + return this.getNodeAsString(1); + } + + @Override + public String getCommandName() + { + return this.command; + } + + @Override + public final Syntax getSyntax() + { + Syntax syntax = new Syntax(); + + syntax.addRequired("player", Type.STRING); + syntax.addOptional("reason", Type.STRING); + + return syntax; + } +} diff --git a/src/main/java/exopandora/worldhandler/builder/impl/BuilderPotionEffect.java b/src/main/java/exopandora/worldhandler/builder/impl/BuilderPotionEffect.java new file mode 100644 index 0000000..6f56ef4 --- /dev/null +++ b/src/main/java/exopandora/worldhandler/builder/impl/BuilderPotionEffect.java @@ -0,0 +1,165 @@ +package exopandora.worldhandler.builder.impl; + +import javax.annotation.Nullable; + +import exopandora.worldhandler.builder.CommandBuilder; +import exopandora.worldhandler.builder.Syntax; +import exopandora.worldhandler.builder.component.abstr.PotionMetadata; +import exopandora.worldhandler.builder.types.Type; +import net.minecraft.potion.Potion; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public class BuilderPotionEffect extends CommandBuilder +{ + private int seconds; + private int minutes; + private int hours; + + public BuilderPotionEffect() + { + this(null, null); + } + + public BuilderPotionEffect(String player, ResourceLocation effect) + { + this(player, effect, 0, (byte) 0, false); + } + + public BuilderPotionEffect(String player, ResourceLocation effect, int duration, byte amplifier, boolean hideParticles) + { + this.setPlayer(player); + this.setEffect(effect); + this.setDuration(duration); + this.setAmplifier(amplifier); + this.setHideParticles(hideParticles); + } + + public void setPlayer(String player) + { + this.setNode(0, player); + } + + public String getPlayer() + { + return this.getNodeAsString(0); + } + + public void setEffect(ResourceLocation effect) + { + this.setNode(1, effect); + } + + @Nullable + public Potion getEffectAsPotion() + { + ResourceLocation location = this.getNodeAsResourceLocation(1); + + if(location != null) + { + return Potion.getPotionFromResourceLocation(location.toString()); + } + + return null; + } + + public ResourceLocation getEffect() + { + return this.getNodeAsResourceLocation(1); + } + + public void setDuration(int duration) + { + this.setNode(2, Math.min(duration, 1000000)); + } + + public int getDuration() + { + return this.getNodeAsInt(2); + } + + public void setAmplifier(byte amplifier) + { + this.setNode(3, (byte) (amplifier - 1)); + } + + public int getAmplifier() + { + return this.getNodeAsByte(3); + } + + public void setHideParticles(boolean hideParticles) + { + this.setNode(4, hideParticles); + } + + public boolean getHideParticles() + { + return this.getNodeAsBoolean(4); + } + + public int getSeconds() + { + return this.seconds; + } + + public void setSeconds(int seconds) + { + this.seconds = seconds; + this.setDuration(PotionMetadata.getDuration(this.seconds, this.minutes, this.hours)); + } + + public int getMinutes() + { + return this.minutes; + } + + public void setMinutes(int minutes) + { + this.minutes = minutes; + this.setDuration(PotionMetadata.getDuration(this.seconds, this.minutes, this.hours)); + } + + public int getHours() + { + return this.hours; + } + + public void setHours(int hours) + { + this.hours = hours; + this.setDuration(PotionMetadata.getDuration(this.seconds, this.minutes, this.hours)); + } + + public BuilderGeneric getRemoveCommand() + { + return new BuilderGeneric(this.getCommandName(), this.getPlayer(), this.getEffect().toString(), "0"); + } + + public BuilderGeneric getClearCommand() + { + return new BuilderGeneric(this.getCommandName(), this.getPlayer(), "clear"); + } + + @Override + public String getCommandName() + { + return "effect"; + } + + @Override + public final Syntax getSyntax() + { + Syntax syntax = new Syntax(); + + syntax.addRequired("player", Type.STRING); + syntax.addRequired("effect", Type.RESOURCE_LOCATION); + syntax.addOptional("seconds", Type.INT, 0); + syntax.addOptional("amplifier", Type.BYTE, (byte) -1); + syntax.addOptional("hideParticles", Type.BOOLEAN, false); + + return syntax; + } +} diff --git a/src/main/java/exopandora/worldhandler/builder/impl/BuilderPotionItem.java b/src/main/java/exopandora/worldhandler/builder/impl/BuilderPotionItem.java new file mode 100644 index 0000000..4af6842 --- /dev/null +++ b/src/main/java/exopandora/worldhandler/builder/impl/BuilderPotionItem.java @@ -0,0 +1,92 @@ +package exopandora.worldhandler.builder.impl; + +import exopandora.worldhandler.builder.component.impl.ComponentPotionItem; +import net.minecraft.item.Item; +import net.minecraft.potion.Potion; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public class BuilderPotionItem extends BuilderGive +{ + private final ComponentPotionItem potion; + + public BuilderPotionItem() + { + this(null, null, new ComponentPotionItem()); + } + + public BuilderPotionItem(ResourceLocation item, String player, ComponentPotionItem potion) + { + this.setItem(item); + this.setPlayer(player); + this.setAmount(1); + this.potion = this.registerNBTComponent(potion); + } + + public void setAmplifier(Potion potion, byte amplifier) + { + this.potion.get(potion).setAmplifier(amplifier); + } + + public void setSeconds(Potion potion, int seconds) + { + this.potion.get(potion).setSeconds(seconds); + } + + public void setMinutes(Potion potion, int minutes) + { + this.potion.get(potion).setMinutes(minutes); + } + + public void setHours(Potion potion, int hours) + { + this.potion.get(potion).setHours(hours); + } + + public void setShowParticles(Potion potion, boolean showParticles) + { + this.potion.get(potion).setShowParticles(showParticles); + } + + public void setAmbient(Potion potion, boolean ambient) + { + this.potion.get(potion).setAmbient(ambient); + } + + public byte getAmplifier(Potion potion) + { + return this.potion.get(potion).getAmplifier(); + } + + public int getSeconds(Potion potion) + { + return this.potion.get(potion).getSeconds(); + } + + public int getMinutes(Potion potion) + { + return this.potion.get(potion).getMinutes(); + } + + public int getHours(Potion potion) + { + return this.potion.get(potion).getHours(); + } + + public boolean getShowParticles(Potion potion) + { + return this.potion.get(potion).getShowParticles(); + } + + public boolean getAmbient(Potion potion) + { + return this.potion.get(potion).getAmbient(); + } + + public BuilderPotionItem getBuilderForPotion(Item item) + { + return new BuilderPotionItem(item.getRegistryName(), this.getPlayer(), this.potion); + } +} diff --git a/src/main/java/exopandora/worldhandler/builder/impl/BuilderScoreboardObjectives.java b/src/main/java/exopandora/worldhandler/builder/impl/BuilderScoreboardObjectives.java new file mode 100644 index 0000000..7d8a3d1 --- /dev/null +++ b/src/main/java/exopandora/worldhandler/builder/impl/BuilderScoreboardObjectives.java @@ -0,0 +1,170 @@ +package exopandora.worldhandler.builder.impl; + +import javax.annotation.Nullable; + +import exopandora.worldhandler.builder.Syntax; +import exopandora.worldhandler.builder.impl.abstr.BuilderScoreboard; +import exopandora.worldhandler.builder.types.Type; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public class BuilderScoreboardObjectives extends BuilderScoreboard +{ + public BuilderScoreboardObjectives() + { + this.init(); + } + + private void init() + { + this.setNode(0, "objectives"); + } + + public void setMode(String mode) + { + String objective = this.getObjective(); + + if(mode.equals("add") || mode.equals("remove") || mode.equals("setdisplay")) + { + this.updateSyntax(this.getSyntax(mode)); + this.setNode(1, mode); + + if(objective != null) + { + this.setObjective(objective); + } + + this.init(); + } + } + + public String getMode() + { + return this.getNodeAsString(1); + } + + public void setObjective(String name) + { + String mode = this.getMode(); + String objective = name != null ? name.replaceAll(" ", "_") : null; + + if(mode != null) + { + if(mode.equals("add") || mode.equals("remove")) + { + this.setNode(2, objective); + + if(mode.equals("add")) + { + this.setNode(4, name); + } + } + else if(mode.equals("setdisplay")) + { + this.setNode(3, objective); + } + } + } + + public void setCriteria(String criteria) + { + if(this.getMode() == null || !this.getMode().equals("add")) + { + this.setMode("add"); + } + this.setNode(3, criteria.replaceAll("[:]", ".")); + } + + public void setSlot(String slot) + { + if(this.getMode() == null || !this.getMode().equals("setdisplay")) + { + this.setMode("setdisplay"); + } + this.setNode(2, slot); + } + + @Nullable + public String getSlot() + { + if(this.getMode() != null && this.getMode().equals("setdisplay")) + { + return this.getNodeAsString(2); + } + + return null; + } + + @Nullable + public String getObjective() + { + String mode = this.getMode(); + + if(mode != null) + { + if(mode.equals("add") || mode.equals("remove")) + { + return this.getNodeAsString(2); + } + else if(mode.equals("setdisplay")) + { + return this.getNodeAsString(3); + } + } + + return null; + } + + @Nullable + private Syntax getSyntax(String mode) + { + if(mode.equals("add")) + { + Syntax syntax = new Syntax(); + + syntax.addRequired("objectives", Type.STRING); + syntax.addRequired("add", Type.STRING); + syntax.addRequired("name", Type.STRING); + syntax.addRequired("criteria_type", Type.STRING); + syntax.addOptional("display_name...", Type.STRING); + + return syntax; + } + else if(mode.equals("remove")) + { + Syntax syntax = new Syntax(); + + syntax.addRequired("objectives", Type.STRING); + syntax.addRequired("remove", Type.STRING); + syntax.addRequired("name", Type.STRING); + + return syntax; + } + else if(mode.equals("setdisplay")) + { + Syntax syntax = new Syntax(); + + syntax.addRequired("objectives", Type.STRING); + syntax.addRequired("setdisplay", Type.STRING); + syntax.addRequired("slot", Type.STRING); + syntax.addOptional("objective", Type.STRING); + + return syntax; + } + + return null; + } + + @Override + public final Syntax getSyntax() + { + Syntax syntax = new Syntax(); + + syntax.addRequired("objectives", Type.STRING); + syntax.addRequired("list|add|remove|setdisplay", Type.STRING); + syntax.addOptional("...", Type.STRING); + + return syntax; + } +} diff --git a/src/main/java/exopandora/worldhandler/builder/impl/BuilderScoreboardPlayers.java b/src/main/java/exopandora/worldhandler/builder/impl/BuilderScoreboardPlayers.java new file mode 100644 index 0000000..61d3877 --- /dev/null +++ b/src/main/java/exopandora/worldhandler/builder/impl/BuilderScoreboardPlayers.java @@ -0,0 +1,231 @@ +package exopandora.worldhandler.builder.impl; + +import exopandora.worldhandler.builder.Syntax; +import exopandora.worldhandler.builder.impl.abstr.BuilderScoreboard; +import exopandora.worldhandler.builder.types.Type; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public class BuilderScoreboardPlayers extends BuilderScoreboard +{ + public BuilderScoreboardPlayers() + { + this.init(); + } + + public String getMode() + { + return this.getNodeAsString(1); + } + + public void setMode(String mode) + { + String objective = this.getObjective(); + String player = this.getPlayer(); + String tag = this.getTag(); + int points = this.getPoints(); + + if(mode.equals("add|set|remove") || mode.equals("tag") || mode.equals("enable")) + { + this.updateSyntax(this.getSyntax(mode)); + this.setNode(1, mode); + this.setNode(2, player); + + if(mode.equals("add|set|remove") || mode.equals("enable")) + { + this.setObjective(objective); + } + + if(mode.equals("add|set|remove")) + { + this.setPoints(points); + } + else if(mode.equals("tag")) + { + this.setTag(tag); + } + + this.init(); + } + } + + private void init() + { + this.setNode(0, "players"); + } + + public void setPlayer(String player) + { + this.setNode(2, player); + } + + public String getPlayer() + { + return this.getNodeAsString(2); + } + + public void setObjective(String name) + { + String mode = this.getMode(); + String objective = name != null ? name.replaceAll(" ", "_") : null; + + if(mode != null) + { + if(mode.equals("add|set|remove") || mode.equals("enable")) + { + this.setNode(3, objective); + } + } + } + + public String getObjective() + { + String mode = this.getMode(); + + if(mode != null) + { + if(mode.equals("add|set|remove") || mode.equals("enable")) + { + return this.getNodeAsString(3); + } + } + + return null; + } + + public void setPoints(int points) + { + if(this.getMode() == null || !this.getMode().equals("add|set|remove")) + { + this.setMode("add|set|remove"); + } + this.setNode(4, points); + } + + public int getPoints() + { + if(this.getMode() != null && this.getMode().equals("add|set|remove")) + { + return this.getNodeAsInt(4); + } + + return 0; + } + + public void setTag(String name) + { + String tag = name != null ? name.replaceAll(" ", "_") : null; + + if(this.getMode() == null || !this.getMode().equals("tag")) + { + this.setMode("tag"); + } + this.setNode(4, tag); + } + + public String getTag() + { + if(this.getMode() != null && this.getMode().equals("tag")) + { + return this.getNodeAsString(4); + } + + return null; + } + + private Syntax getSyntax(String mode) + { + if(mode.equals("add|set|remove")) + { + Syntax syntax = new Syntax(); + + syntax.addRequired("players", Type.STRING); + syntax.addRequired("add|set|remove", Type.STRING, "add|set|remove"); + syntax.addRequired("player", Type.STRING); + syntax.addRequired("objective", Type.STRING); + syntax.addRequired("count", Type.INT, 0); + syntax.addOptional("nbt", Type.NBT); + + return syntax; + } + else if(mode.equals("tag")) + { + Syntax syntax = new Syntax(); + + syntax.addRequired("players", Type.STRING); + syntax.addRequired("tag", Type.STRING); + syntax.addRequired("player", Type.STRING); + syntax.addRequired("add|remove|list", Type.STRING); + syntax.addRequired("tag_name", Type.STRING); + syntax.addOptional("nbt", Type.NBT); + + return syntax; + } + else if(mode.equals("enable")) + { + Syntax syntax = new Syntax(); + + syntax.addRequired("players", Type.STRING); + syntax.addRequired("enable", Type.STRING); + syntax.addRequired("player", Type.STRING); + syntax.addRequired("trigger", Type.STRING); + + return syntax; + } + + return null; + } + + public BuilderGeneric getBuilderForTag(EnumTag tag) + { + return new BuilderGeneric(this.getCommandName(), "players", this.getMode(), this.getPlayer(), tag.toString(), this.getTag()); + } + + public BuilderGeneric getBuilderForPoints(EnumPoints mode) + { + return this.getBuilderForPoints(mode, this.getPoints()); + } + + public BuilderGeneric getBuilderForPoints(EnumPoints mode, int points) + { + return new BuilderGeneric(this.getCommandName(), "players", mode.toString(), this.getPlayer(), this.getObjective(), String.valueOf(points)); + } + + @Override + public final Syntax getSyntax() + { + Syntax syntax = new Syntax(); + + syntax.addRequired("players", Type.STRING); + syntax.addRequired("add|enable|list|operation|remove|reset|set|tag|test", Type.STRING); + syntax.addOptional("...", Type.STRING); + + return syntax; + } + + public static enum EnumTag + { + ADD, + REMOVE; + + @Override + public String toString() + { + return this.name().toLowerCase(); + } + } + + public static enum EnumPoints + { + ADD, + REMOVE, + SET; + + @Override + public String toString() + { + return this.name().toLowerCase(); + } + } +} diff --git a/src/main/java/exopandora/worldhandler/builder/impl/BuilderScoreboardTeams.java b/src/main/java/exopandora/worldhandler/builder/impl/BuilderScoreboardTeams.java new file mode 100644 index 0000000..ba086d8 --- /dev/null +++ b/src/main/java/exopandora/worldhandler/builder/impl/BuilderScoreboardTeams.java @@ -0,0 +1,256 @@ +package exopandora.worldhandler.builder.impl; + +import javax.annotation.Nullable; + +import exopandora.worldhandler.builder.Syntax; +import exopandora.worldhandler.builder.impl.abstr.BuilderScoreboard; +import exopandora.worldhandler.builder.types.Type; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public class BuilderScoreboardTeams extends BuilderScoreboard +{ + public BuilderScoreboardTeams() + { + this.init(); + } + + private void init() + { + this.setNode(0, "teams"); + } + + public void setTeam(String name) + { + String mode = this.getMode(); + String team = name != null ? name.replaceAll(" ", "_") : null; + + if(mode != null) + { + if(mode.equals("add")) + { + this.setNode(3, name); + } + } + + this.setNode(2, team); + } + + public String getMode() + { + return this.getNodeAsString(1); + } + + @Nullable + public String getTeam() + { + return this.getNodeAsString(2); + } + + public void setMode(String mode) + { + String team = this.getTeam(); + String player = this.getPlayer(); + + if(mode.equals("add") || mode.equals("remove|empty") || mode.equals("join|leave") || mode.equals("option")) + { + this.updateSyntax(this.getSyntax(mode)); + this.setNode(1, mode); + + if(team != null) + { + this.setTeam(team); + } + + if(player != null && (mode.equals("join|leave"))) + { + this.setPlayer(player); + } + + this.init(); + } + } + + public void setPlayer(String player) + { + String mode = this.getMode(); + + if(mode != null) + { + if(mode.equals("join|leave")) + { + this.setNode(3, player); + } + } + } + + @Nullable + public String getPlayer() + { + String mode = this.getMode(); + + if(mode != null) + { + if(mode.equals("join|leave")) + { + return this.getNodeAsString(3); + } + } + + return null; + } + + public void setRule(String rule) + { + if(this.getMode() == null || !this.getMode().equals("option")) + { + this.setMode("option"); + } + + this.setNode(3, rule); + } + + public String getRule() + { + if(this.getMode() == null || this.getMode().equals("option")) + { + return this.getNodeAsString(3); + } + + return null; + } + + public void setValue(String value) + { + if(this.getMode() == null || !this.getMode().equals("option")) + { + this.setMode("option"); + } + + this.setNode(4, value); + } + + public String getValue() + { + if(this.getMode() == null || this.getMode().equals("option")) + { + return this.getNodeAsString(4); + } + + return null; + } + + @Nullable + private Syntax getSyntax(String mode) + { + if(mode.equals("add")) + { + Syntax syntax = new Syntax(); + + syntax.addRequired("teams", Type.STRING); + syntax.addRequired("add", Type.STRING); + syntax.addRequired("name", Type.STRING); + syntax.addOptional("display_name...", Type.STRING); + + return syntax; + } + else if(mode.equals("remove|empty")) + { + Syntax syntax = new Syntax(); + + syntax.addRequired("teams", Type.STRING); + syntax.addRequired("remove|empty", Type.STRING, "remove|empty"); + syntax.addRequired("name", Type.STRING); + + return syntax; + } + else if(mode.equals("join|leave")) + { + Syntax syntax = new Syntax(); + + syntax.addRequired("teams", Type.STRING); + syntax.addRequired("join|leave", Type.STRING, "join|leave"); + syntax.addRequired("name", Type.STRING); + syntax.addOptional("player", Type.STRING); + + return syntax; + } + else if(mode.equals("option")) + { + Syntax syntax = new Syntax(); + + syntax.addRequired("teams", Type.STRING); + syntax.addRequired("option", Type.STRING); + syntax.addRequired("team", Type.STRING); + syntax.addRequired("friendlyfire|color|seeFriendlyInvisibles|nametagVisibility|deathMessageVisibility|collisionRule", Type.STRING); + syntax.addRequired("value", Type.STRING); + + return syntax; + } + + return null; + } + + public BuilderScoreboardTeams getBuilderForMode(EnumMode mode) + { + BuilderScoreboardTeams builder = new BuilderScoreboardTeams(); + + switch(mode) + { + case JOIN: + case LEAVE: + builder.setNode(1, mode.toString()); + builder.setTeam(this.getTeam()); + builder.setPlayer(this.getPlayer()); + break; + case REMOVE: + case EMPTY: + builder.setNode(1, mode.toString()); + builder.setTeam(this.getTeam()); + break; + case ADD: + builder.setMode(mode.toString()); + builder.setTeam(this.getTeam()); + break; + case OPTION: + builder.setMode(mode.toString()); + builder.setTeam(this.getTeam()); + builder.setRule(this.getRule()); + builder.setValue(this.getValue()); + break; + default: + break; + } + + return builder; + } + + @Override + public final Syntax getSyntax() + { + Syntax syntax = new Syntax(); + + syntax.addRequired("teams", Type.STRING); + syntax.addRequired("list|add|remove|empty|join|leave|option", Type.STRING); + syntax.addOptional("...", Type.STRING); + + return syntax; + } + + public static enum EnumMode + { + JOIN, + LEAVE, + REMOVE, + EMPTY, + ADD, + OPTION; + + @Override + public String toString() + { + return this.name().toLowerCase(); + } + } +} diff --git a/src/main/java/exopandora/worldhandler/builder/impl/BuilderSetblock.java b/src/main/java/exopandora/worldhandler/builder/impl/BuilderSetblock.java new file mode 100644 index 0000000..4ce6f43 --- /dev/null +++ b/src/main/java/exopandora/worldhandler/builder/impl/BuilderSetblock.java @@ -0,0 +1,81 @@ +package exopandora.worldhandler.builder.impl; + +import exopandora.worldhandler.builder.Syntax; +import exopandora.worldhandler.builder.impl.abstr.BuilderBlockPos; +import exopandora.worldhandler.builder.types.Coordinate; +import exopandora.worldhandler.builder.types.Type; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.math.BlockPos; + +public class BuilderSetblock extends BuilderBlockPos +{ + @Deprecated + public BuilderSetblock(BlockPos pos, ResourceLocation block, int meta, String mode) + { + this.setPosition(pos); + this.setBlock(block); + this.setMetadata(meta); + this.setMode(mode); + } + + @Deprecated + public BuilderSetblock(Coordinate x, Coordinate y, Coordinate z, ResourceLocation block, int meta, String mode) + { + this.setX(x); + this.setY(y); + this.setZ(z); + this.setBlock(block); + this.setMetadata(meta); + this.setMode(mode); + } + + public BuilderSetblock(Coordinate x, Coordinate y, Coordinate z, ResourceLocation block, String mode) + { + this(x, y, z, block, 0, mode); + } + + public void setBlock(ResourceLocation block) + { + this.setNode(3, block); + } + + @Deprecated + public void setMetadata(int meta) + { + this.setNode(4, meta); + } + + public void setMode(String mode) + { + this.setNode(5, mode); + } + + @Override + public void setNBT(NBTTagCompound nbt) + { + this.setNode(6, nbt); + } + + @Override + public String getCommandName() + { + return "setblock"; + } + + @Override + public final Syntax getSyntax() + { + Syntax syntax = new Syntax(); + + syntax.addRequired("x", Type.COORDINATE); + syntax.addRequired("y", Type.COORDINATE); + syntax.addRequired("z", Type.COORDINATE); + syntax.addRequired("block", Type.RESOURCE_LOCATION); + syntax.addOptional("data_value", Type.INT); + syntax.addOptional("mode", Type.STRING); + syntax.addOptional("nbt", Type.NBT); + + return syntax; + } +} diff --git a/src/main/java/exopandora/worldhandler/builder/impl/BuilderSignEditor.java b/src/main/java/exopandora/worldhandler/builder/impl/BuilderSignEditor.java new file mode 100644 index 0000000..736d1a7 --- /dev/null +++ b/src/main/java/exopandora/worldhandler/builder/impl/BuilderSignEditor.java @@ -0,0 +1,72 @@ +package exopandora.worldhandler.builder.impl; + +import javax.annotation.Nullable; + +import exopandora.worldhandler.builder.component.impl.ComponentTag; +import exopandora.worldhandler.format.text.ColoredString; +import exopandora.worldhandler.format.text.SignText; +import net.minecraft.nbt.NBTTagString; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public class BuilderSignEditor extends BuilderBlockdata +{ + private final ComponentTag[] sign = new ComponentTag[4]; + + public BuilderSignEditor() + { + for(int x = 0; x < 4; x++) + { + this.sign[x] = this.registerNBTComponent(new ComponentTag("Text" + (x + 1), new SignText(x), text -> new NBTTagString(text.toString()))); + } + } + + public boolean isSpecial() + { + boolean special = false; + + for(int x = 0; x < this.sign.length; x++) + { + special = special || this.getColoredString(x).isSpecial(); + } + + return special; + } + + @Nullable + public ColoredString getColoredString(int line) + { + if(this.checkBounds(line)) + { + return this.sign[line].getValue().getColoredString(); + } + + return null; + } + + @Nullable + public String getCommand(int line) + { + if(this.checkBounds(line)) + { + return this.sign[line].getValue().getCommand(); + } + + return null; + } + + @Nullable + public void setCommand(int line, String command) + { + if(this.checkBounds(line)) + { + this.sign[line].getValue().setCommand(command); + } + } + + private boolean checkBounds(int line) + { + return line >= 0 && line < this.sign.length; + } +} diff --git a/src/main/java/exopandora/worldhandler/builder/impl/BuilderSpawnpoint.java b/src/main/java/exopandora/worldhandler/builder/impl/BuilderSpawnpoint.java new file mode 100644 index 0000000..795066e --- /dev/null +++ b/src/main/java/exopandora/worldhandler/builder/impl/BuilderSpawnpoint.java @@ -0,0 +1,58 @@ +package exopandora.worldhandler.builder.impl; + +import exopandora.worldhandler.builder.CommandBuilder; +import exopandora.worldhandler.builder.Syntax; +import exopandora.worldhandler.builder.types.Coordinate; +import exopandora.worldhandler.builder.types.Type; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public class BuilderSpawnpoint extends CommandBuilder +{ + public BuilderSpawnpoint(String player) + { + this.setX(new Coordinate(0, true)); + this.setY(new Coordinate(0, true)); + this.setZ(new Coordinate(0, true)); + } + + @Override + public String getCommandName() + { + return "spawnpoint"; + } + + public void setPlayer(String player) + { + this.setNode(0, player); + } + + public void setX(Coordinate x) + { + this.setNode(1, x); + } + + public void setY(Coordinate y) + { + this.setNode(2, y); + } + + public void setZ(Coordinate z) + { + this.setNode(3, z); + } + + @Override + public final Syntax getSyntax() + { + Syntax syntax = new Syntax(); + + syntax.addRequired("player", Type.STRING); + syntax.addRequired("x", Type.COORDINATE); + syntax.addRequired("y", Type.COORDINATE); + syntax.addRequired("z", Type.COORDINATE); + + return syntax; + } +} diff --git a/src/main/java/exopandora/worldhandler/builder/impl/BuilderSummon.java b/src/main/java/exopandora/worldhandler/builder/impl/BuilderSummon.java new file mode 100644 index 0000000..d8a9374 --- /dev/null +++ b/src/main/java/exopandora/worldhandler/builder/impl/BuilderSummon.java @@ -0,0 +1,407 @@ +package exopandora.worldhandler.builder.impl; + +import java.util.function.Consumer; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; + +import exopandora.worldhandler.builder.CommandBuilderNBT; +import exopandora.worldhandler.builder.Syntax; +import exopandora.worldhandler.builder.component.impl.ComponentAttributeMob; +import exopandora.worldhandler.builder.component.impl.ComponentPotionMob; +import exopandora.worldhandler.builder.component.impl.ComponentSummon; +import exopandora.worldhandler.builder.component.impl.ComponentTag; +import exopandora.worldhandler.builder.impl.abstr.EnumAttributes; +import exopandora.worldhandler.builder.impl.abstr.EnumAttributes.Applyable; +import exopandora.worldhandler.builder.types.Coordinate; +import exopandora.worldhandler.builder.types.Type; +import exopandora.worldhandler.format.text.ColoredString; +import net.minecraft.block.Block; +import net.minecraft.init.Blocks; +import net.minecraft.item.Item; +import net.minecraft.nbt.NBTBase; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraft.nbt.NBTTagString; +import net.minecraft.potion.Potion; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public class BuilderSummon extends CommandBuilderNBT +{ + private final ComponentAttributeMob attribute; + private final ComponentTag customName; + private final ComponentTag passengers; + private final ComponentTag armorItems; + private final ComponentTag handItems; + private final ComponentPotionMob potion; + private final ComponentSummon summon; + private final ResourceLocation[] armorItemsArray = {Blocks.AIR.getRegistryName(), Blocks.AIR.getRegistryName(), Blocks.AIR.getRegistryName(), Blocks.AIR.getRegistryName()}; + private final ResourceLocation[] handItemsArray = {Blocks.AIR.getRegistryName(), Blocks.AIR.getRegistryName()}; + + public BuilderSummon() + { + this.attribute = this.registerNBTComponent(new ComponentAttributeMob(attribute -> attribute.getApplyable().equals(Applyable.BOTH) || attribute.getApplyable().equals(Applyable.MOB))); + this.customName = this.registerNBTComponent(new ComponentTag("CustomName", new ColoredString(), this::colorStringSerializer)); + this.passengers = this.registerNBTComponent(new ComponentTag("Passengers")); + this.armorItems = this.registerNBTComponent(new ComponentTag("ArmorItems", this::itemListSerializer)); + this.handItems = this.registerNBTComponent(new ComponentTag("HandItems", this::itemListSerializer)); + this.summon = this.registerNBTComponent(new ComponentSummon(), "summon"); + this.potion = this.registerNBTComponent(new ComponentPotionMob()); + } + + public BuilderSummon(int direction) + { + this(); + this.setDirection(direction); + } + + public void setDirection(int direction) + { + if(direction == 0) + { + this.setX(new Coordinate(0, true)); + this.setY(new Coordinate(0, true)); + this.setZ(new Coordinate(2, true)); + } + else if(direction == 1) + { + this.setX(new Coordinate(-2, true)); + this.setY(new Coordinate(0, true)); + this.setZ(new Coordinate(0, true)); + } + else if(direction == 2) + { + this.setX(new Coordinate(0, true)); + this.setY(new Coordinate(0, true)); + this.setZ(new Coordinate(-2, true)); + } + else if(direction == 3) + { + this.setX(new Coordinate(2, true)); + this.setY(new Coordinate(0, true)); + this.setZ(new Coordinate(0, true)); + } + } + + public void setEntity(String entityName) + { + ResourceLocation location = this.summon.resolve(entityName); + + this.summon.setName(entityName); + this.summon.setEntity(location); + + this.setNode(0, location); + } + + public ResourceLocation getEntity() + { + return this.getNodeAsResourceLocation(0); + } + + public void setX(Coordinate x) + { + this.setNode(1, x); + } + + public Coordinate getX() + { + return this.getNodeAsCoordinate(1); + } + + public void setY(Coordinate y) + { + this.setNode(2, y); + } + + public Coordinate getY() + { + return this.getNodeAsCoordinate(2); + } + + public void setZ(Coordinate z) + { + this.setNode(3, z); + } + + public Coordinate getZ() + { + return this.getNodeAsCoordinate(3); + } + + public void setAttribute(EnumAttributes attribute, float ammount) + { + this.attribute.set(attribute, ammount); + } + + public void removeAttribute(EnumAttributes attribute) + { + this.attribute.remove(attribute); + } + + public void setCustomName(ColoredString name) + { + this.customName.setValue(name); + } + + public void setCustomName(String name) + { + this.customName.getValue().setText(name); + } + + @Nonnull + public ColoredString getCustomName() + { + if(this.customName.getValue() != null) + { + return this.customName.getValue(); + } + + return null; + } + + public void setPassenger(String entityName) + { + this.setPassenger(this.summon.resolve(entityName)); + } + + public void setPassenger(ResourceLocation entityName) + { + if(entityName != null) + { + NBTTagCompound passenger = new NBTTagCompound(); + passenger.setString("id", entityName.toString()); + + NBTTagList list = new NBTTagList(); + list.appendTag(passenger); + + this.passengers.setValue(list); + } + else + { + this.passengers.setValue(null); + } + } + + @Nullable + public ResourceLocation getPassenger() + { + NBTTagList list = this.passengers.getValue(); + + if(list != null && !list.hasNoTags()) + { + return new ResourceLocation(list.getCompoundTagAt(0).getString("id")); + } + + return null; + } + + public void setArmorItem(int index, Block block) + { + this.setArmorItem(index, block.getRegistryName()); + } + + public void setArmorItem(int index, Item item) + { + this.setArmorItem(index, item.getRegistryName()); + } + + public void setArmorItem(int index, ResourceLocation location) + { + this.changeNBTList(index, location, this.armorItemsArray, this::setArmorItems); + } + + public void setArmorItems(ResourceLocation[] armor) + { + NBTTagList list = new NBTTagList(); + + for(ResourceLocation item : armor) + { + NBTTagCompound compound = new NBTTagCompound(); + compound.setString("id", item.toString()); + compound.setInteger("Count", 1); + list.appendTag(compound); + } + + this.armorItems.setValue(list); + } + + public ResourceLocation getArmorItem(int slot) + { + if(slot < this.armorItemsArray.length) + { + return this.armorItemsArray[slot]; + } + + return Blocks.AIR.getRegistryName(); + } + + public void setHandItem(int index, Block block) + { + this.setHandItem(index, block.getRegistryName()); + } + + public void setHandItem(int index, Item item) + { + this.setHandItem(index, item.getRegistryName()); + } + + public void setHandItem(int index, ResourceLocation location) + { + this.changeNBTList(index, location, this.handItemsArray, this::setHandItems); + } + + private void changeNBTList(int index, ResourceLocation location, ResourceLocation[] array, Consumer consumer) + { + if(index < array.length) + { + array[index] = location; + consumer.accept(array); + } + } + + public void setHandItems(ResourceLocation[] armor) + { + NBTTagList list = new NBTTagList(); + + for(ResourceLocation item : armor) + { + NBTTagCompound compound = new NBTTagCompound(); + compound.setString("id", item.toString()); + compound.setInteger("Count", 1); + list.appendTag(compound); + } + + this.handItems.setValue(list); + } + + public ResourceLocation getHandItem(int slot) + { + if(slot < this.handItemsArray.length) + { + return this.handItemsArray[slot]; + } + + return Blocks.AIR.getRegistryName(); + } + + public void setAmplifier(Potion potion, byte amplifier) + { + this.potion.get(potion).setAmplifier(amplifier); + } + + public void setSeconds(Potion potion, int seconds) + { + this.potion.get(potion).setSeconds(seconds); + } + + public void setMinutes(Potion potion, int minutes) + { + this.potion.get(potion).setMinutes(minutes); + } + + public void setHours(Potion potion, int hours) + { + this.potion.get(potion).setHours(hours); + } + + public void setShowParticles(Potion potion, boolean showParticles) + { + this.potion.get(potion).setShowParticles(showParticles); + } + + public void setAmbient(Potion potion, boolean ambient) + { + this.potion.get(potion).setAmbient(ambient); + } + + public byte getAmplifier(Potion potion) + { + return this.potion.get(potion).getAmplifier(); + } + + public int getSeconds(Potion potion) + { + return this.potion.get(potion).getSeconds(); + } + + public int getMinutes(Potion potion) + { + return this.potion.get(potion).getMinutes(); + } + + public int getHours(Potion potion) + { + return this.potion.get(potion).getHours(); + } + + public boolean getShowParticles(Potion potion) + { + return this.potion.get(potion).getShowParticles(); + } + + public boolean getAmbient(Potion potion) + { + return this.potion.get(potion).getAmbient(); + } + + private NBTBase itemListSerializer(NBTTagList list) + { + for(int x = 0; x < list.tagCount(); x++) + { + if(!list.getCompoundTagAt(x).getString("id").equals(Blocks.AIR.getRegistryName().toString())) + { + return list; + } + } + + return null; + } + + private NBTBase colorStringSerializer(ColoredString string) + { + if(string.getText() != null && !string.getText().isEmpty()) + { + return new NBTTagString(string.toString()); + } + + return null; + } + + @Override + public void setNBT(NBTTagCompound nbt) + { + this.setNode(4, nbt); + } + + @Override + public String getCommandName() + { + return "summon"; + } + + @Override + public Syntax getSyntax() + { + Syntax syntax = new Syntax(); + + syntax.addRequired("entity_name", Type.RESOURCE_LOCATION); + syntax.addOptional("x", Type.COORDINATE); + syntax.addOptional("y", Type.COORDINATE); + syntax.addOptional("z", Type.COORDINATE); + syntax.addOptional("nbt", Type.NBT); + + return syntax; + } + + @Override + public String toCommand() + { + this.summon.setEntity(this.getEntity()); + this.summon.setHasPassenger(this.getPassenger() != null); + + return super.toCommand(); + } +} diff --git a/src/main/java/exopandora/worldhandler/builder/impl/BuilderTime.java b/src/main/java/exopandora/worldhandler/builder/impl/BuilderTime.java new file mode 100644 index 0000000..0eb9ad9 --- /dev/null +++ b/src/main/java/exopandora/worldhandler/builder/impl/BuilderTime.java @@ -0,0 +1,64 @@ +package exopandora.worldhandler.builder.impl; + +import exopandora.worldhandler.builder.CommandBuilder; +import exopandora.worldhandler.builder.Syntax; +import exopandora.worldhandler.builder.types.Type; + +public class BuilderTime extends CommandBuilder +{ + public BuilderTime() + { + + } + + public BuilderTime(EnumMode mode) + { + this.setMode(mode); + } + + public BuilderTime(EnumMode mode, int value) + { + this(mode); + this.setValue(value); + } + + public void setMode(EnumMode mode) + { + this.setNode(0, mode.toString()); + } + + public void setValue(int value) + { + this.setNode(1, value); + } + + @Override + public String getCommandName() + { + return "time"; + } + + @Override + public final Syntax getSyntax() + { + Syntax syntax = new Syntax(); + + syntax.addRequired("set|add|query", Type.STRING); + syntax.addOptional("value", Type.INT); + + return syntax; + } + + public static enum EnumMode + { + ADD, + SET, + QUERY; + + @Override + public String toString() + { + return this.name().toLowerCase(); + } + } +} diff --git a/src/main/java/exopandora/worldhandler/builder/impl/BuilderWH.java b/src/main/java/exopandora/worldhandler/builder/impl/BuilderWH.java new file mode 100644 index 0000000..0183a7c --- /dev/null +++ b/src/main/java/exopandora/worldhandler/builder/impl/BuilderWH.java @@ -0,0 +1,27 @@ +package exopandora.worldhandler.builder.impl; + +import exopandora.worldhandler.builder.CommandBuilder; +import exopandora.worldhandler.builder.Syntax; +import exopandora.worldhandler.builder.types.Type; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public class BuilderWH extends CommandBuilder +{ + @Override + public String getCommandName() + { + return "wh"; + } + + @Override + public Syntax getSyntax() + { + Syntax syntax = new Syntax(); + + syntax.addRequired("pos1|pos2|fill|replace", Type.STRING); + + return syntax; + } +} diff --git a/src/main/java/exopandora/worldhandler/builder/impl/BuilderWeather.java b/src/main/java/exopandora/worldhandler/builder/impl/BuilderWeather.java new file mode 100644 index 0000000..61d05d4 --- /dev/null +++ b/src/main/java/exopandora/worldhandler/builder/impl/BuilderWeather.java @@ -0,0 +1,64 @@ +package exopandora.worldhandler.builder.impl; + +import exopandora.worldhandler.builder.CommandBuilder; +import exopandora.worldhandler.builder.Syntax; +import exopandora.worldhandler.builder.types.Type; + +public class BuilderWeather extends CommandBuilder +{ + public BuilderWeather() + { + + } + + public BuilderWeather(EnumWeather weather) + { + this.setWeather(weather); + } + + public BuilderWeather(EnumWeather weather, int value) + { + this(weather); + this.setValue(value); + } + + public void setWeather(EnumWeather weather) + { + this.setNode(0, weather.toString()); + } + + public void setValue(int value) + { + this.setNode(1, value); + } + + @Override + public String getCommandName() + { + return "weather"; + } + + @Override + public final Syntax getSyntax() + { + Syntax syntax = new Syntax(); + + syntax.addRequired("clear|rain|thunde", Type.STRING); + syntax.addOptional("duration", Type.INT); + + return syntax; + } + + public static enum EnumWeather + { + CLEAR, + RAIN, + THUNDER; + + @Override + public String toString() + { + return this.name().toLowerCase(); + } + } +} diff --git a/src/main/java/exopandora/worldhandler/builder/impl/BuilderWhitelist.java b/src/main/java/exopandora/worldhandler/builder/impl/BuilderWhitelist.java new file mode 100644 index 0000000..c03eab8 --- /dev/null +++ b/src/main/java/exopandora/worldhandler/builder/impl/BuilderWhitelist.java @@ -0,0 +1,93 @@ +package exopandora.worldhandler.builder.impl; + +import javax.annotation.Nullable; + +import exopandora.worldhandler.builder.CommandBuilder; +import exopandora.worldhandler.builder.Syntax; +import exopandora.worldhandler.builder.types.Type; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public class BuilderWhitelist extends CommandBuilder +{ + public BuilderWhitelist() + { + + } + + public BuilderWhitelist(EnumMode mode) + { + this.setMode(mode); + } + + public BuilderWhitelist(EnumMode mode, String player) + { + this(mode); + this.setPlayer(player); + } + + public void setMode(EnumMode mode) + { + this.setNode(0, mode.toString()); + } + + public void setPlayer(String player) + { + this.setNode(1, player); + } + + public String getPlayer() + { + return this.getNodeAsString(1); + } + + @Override + public String getCommandName() + { + return "whitelist"; + } + + @Nullable + public BuilderWhitelist getBuilder(EnumMode mode) + { + switch(mode) + { + case ADD: + case REMOVE: + return new BuilderWhitelist(mode, this.getPlayer()); + case RELOAD: + case ON: + case OFF: + return new BuilderWhitelist(mode); + default: + return null; + } + } + + @Override + public final Syntax getSyntax() + { + Syntax syntax = new Syntax(); + + syntax.addRequired("add|remove|reload|on|off", Type.STRING); + syntax.addOptional("player", Type.STRING); + + return syntax; + } + + public static enum EnumMode + { + ADD, + REMOVE, + RELOAD, + ON, + OFF; + + @Override + public String toString() + { + return this.name().toLowerCase(); + } + } +} diff --git a/src/main/java/exopandora/worldhandler/builder/impl/BuilderWorldHandler.java b/src/main/java/exopandora/worldhandler/builder/impl/BuilderWorldHandler.java new file mode 100644 index 0000000..141ea41 --- /dev/null +++ b/src/main/java/exopandora/worldhandler/builder/impl/BuilderWorldHandler.java @@ -0,0 +1,27 @@ +package exopandora.worldhandler.builder.impl; + +import exopandora.worldhandler.builder.CommandBuilder; +import exopandora.worldhandler.builder.Syntax; +import exopandora.worldhandler.builder.types.Type; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public class BuilderWorldHandler extends CommandBuilder +{ + @Override + public String getCommandName() + { + return "worldhandler"; + } + + @Override + public final Syntax getSyntax() + { + Syntax syntax = new Syntax(); + + syntax.addRequired("help|display|version", Type.STRING); + + return syntax; + } +} diff --git a/src/main/java/exopandora/worldhandler/builder/impl/abstr/BuilderBlockPos.java b/src/main/java/exopandora/worldhandler/builder/impl/abstr/BuilderBlockPos.java new file mode 100644 index 0000000..c0b52c1 --- /dev/null +++ b/src/main/java/exopandora/worldhandler/builder/impl/abstr/BuilderBlockPos.java @@ -0,0 +1,80 @@ +package exopandora.worldhandler.builder.impl.abstr; + +import exopandora.worldhandler.builder.CommandBuilderNBT; +import exopandora.worldhandler.builder.types.Coordinate; +import net.minecraft.util.math.BlockPos; + +public abstract class BuilderBlockPos extends CommandBuilderNBT +{ + public void setPosition(BlockPos pos) + { + this.setX(pos.getX()); + this.setY(pos.getY()); + this.setZ(pos.getZ()); + } + + public void setX(float x) + { + this.setX(new Coordinate(x)); + } + + public void setY(float y) + { + this.setY(new Coordinate(y)); + } + + public void setZ(float z) + { + this.setZ(new Coordinate(z)); + } + + public void setX(Coordinate x) + { + this.setNode(0, x); + } + + public void setY(Coordinate y) + { + this.setNode(1, y); + } + + public void setZ(Coordinate z) + { + this.setNode(2, z); + } + + public Coordinate getXCoordiante() + { + return this.getNodeAsCoordinate(0); + } + + public Coordinate getYCoordiante() + { + return this.getNodeAsCoordinate(1); + } + + public Coordinate getZCoordiante() + { + return this.getNodeAsCoordinate(2); + } + + public double getX() + { + return this.getXCoordiante().getValue(); + } + + public double getY() + { + return this.getYCoordiante().getValue(); + } + + public double getZ() + { + return this.getZCoordiante().getValue(); + } + + public BlockPos getBlockPos() + { + return new BlockPos(this.getX(), this.getY(), this.getZ()); + } +} diff --git a/src/main/java/exopandora/worldhandler/builder/impl/abstr/BuilderDoubleBlockPos.java b/src/main/java/exopandora/worldhandler/builder/impl/abstr/BuilderDoubleBlockPos.java new file mode 100644 index 0000000..94d3c50 --- /dev/null +++ b/src/main/java/exopandora/worldhandler/builder/impl/abstr/BuilderDoubleBlockPos.java @@ -0,0 +1,176 @@ +package exopandora.worldhandler.builder.impl.abstr; + +import exopandora.worldhandler.builder.CommandBuilder; +import exopandora.worldhandler.builder.types.Coordinate; +import exopandora.worldhandler.helper.BlockHelper; +import net.minecraft.util.math.BlockPos; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public abstract class BuilderDoubleBlockPos extends CommandBuilder +{ + public BuilderDoubleBlockPos() + { + this.setPosition1(BlockHelper.getPos1()); + this.setPosition2(BlockHelper.getPos2()); + } + + public void setPosition1(BlockPos pos) + { + this.setX1(pos.getX()); + this.setY1(pos.getY()); + this.setZ1(pos.getZ()); + } + + public void setX1(float x) + { + this.setX1(new Coordinate(x)); + } + + public void setY1(float y) + { + this.setY1(new Coordinate(y)); + } + + public void setZ1(float z) + { + this.setZ1(new Coordinate(z)); + } + + public void setX1(Coordinate x) + { + this.setNode(0, x); + BlockHelper.setPos1(BlockHelper.setX(BlockHelper.getPos1(), x.getValue())); + } + + public void setY1(Coordinate y) + { + this.setNode(1, y); + BlockHelper.setPos1(BlockHelper.setY(BlockHelper.getPos1(), y.getValue())); + } + + public void setZ1(Coordinate z) + { + this.setNode(2, z); + BlockHelper.setPos1(BlockHelper.setZ(BlockHelper.getPos1(), z.getValue())); + } + + public Coordinate getX1Coordiante() + { + return this.getNodeAsCoordinate(0); + } + + public Coordinate getY1Coordiante() + { + return this.getNodeAsCoordinate(1); + } + + public Coordinate getZ1Coordiante() + { + return this.getNodeAsCoordinate(2); + } + + public double getX1() + { + return this.getX1Coordiante().getValue(); + } + + public double getY1() + { + return this.getY1Coordiante().getValue(); + } + + public double getZ1() + { + return this.getZ1Coordiante().getValue(); + } + + public BlockPos getBlockPos1() + { + return new BlockPos(this.getX1(), this.getY1(), this.getZ1()); + } + + public void setPosition2(BlockPos pos) + { + this.setX2(pos.getX()); + this.setY2(pos.getY()); + this.setZ2(pos.getZ()); + } + + public void setX2(float x) + { + this.setX2(new Coordinate(x)); + } + + public void setY2(float y) + { + this.setY2(new Coordinate(y)); + } + + public void setZ2(float z) + { + this.setZ2(new Coordinate(z)); + } + + public void setX2(Coordinate x) + { + this.setNode(3, x); + BlockHelper.setPos2(BlockHelper.setX(BlockHelper.getPos2(), x.getValue())); + } + + public void setY2(Coordinate y) + { + this.setNode(4, y); + BlockHelper.setPos2(BlockHelper.setY(BlockHelper.getPos2(), y.getValue())); + } + + public void setZ2(Coordinate z) + { + this.setNode(5, z); + BlockHelper.setPos2(BlockHelper.setZ(BlockHelper.getPos2(), z.getValue())); + } + + public Coordinate getX2Coordiante() + { + return this.getNodeAsCoordinate(3); + } + + public Coordinate getY2Coordiante() + { + return this.getNodeAsCoordinate(4); + } + + public Coordinate getZ2Coordiante() + { + return this.getNodeAsCoordinate(5); + } + + public double getX2() + { + return this.getX2Coordiante().getValue(); + } + + public double getY2() + { + return this.getY2Coordiante().getValue(); + } + + public double getZ2() + { + return this.getZ2Coordiante().getValue(); + } + + public BlockPos getBlockPos2() + { + return new BlockPos(this.getX2(), this.getY2(), this.getZ2()); + } + + public T addPositionObservers() + { + BlockHelper.addPos1Observer(this::setPosition1); + BlockHelper.addPos2Observer(this::setPosition2); + + return (T) this; + } +} diff --git a/src/main/java/exopandora/worldhandler/builder/impl/abstr/BuilderScoreboard.java b/src/main/java/exopandora/worldhandler/builder/impl/abstr/BuilderScoreboard.java new file mode 100644 index 0000000..218b916 --- /dev/null +++ b/src/main/java/exopandora/worldhandler/builder/impl/abstr/BuilderScoreboard.java @@ -0,0 +1,15 @@ +package exopandora.worldhandler.builder.impl.abstr; + +import exopandora.worldhandler.builder.CommandBuilder; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public abstract class BuilderScoreboard extends CommandBuilder +{ + @Override + public String getCommandName() + { + return "scoreboard"; + } +} diff --git a/src/main/java/exopandora/worldhandler/builder/impl/abstr/EnumAttributes.java b/src/main/java/exopandora/worldhandler/builder/impl/abstr/EnumAttributes.java new file mode 100644 index 0000000..106ebcc --- /dev/null +++ b/src/main/java/exopandora/worldhandler/builder/impl/abstr/EnumAttributes.java @@ -0,0 +1,125 @@ +package exopandora.worldhandler.builder.impl.abstr; + +import java.util.Arrays; +import java.util.List; +import java.util.function.Function; +import java.util.stream.Collectors; + +import net.minecraft.client.resources.I18n; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public enum EnumAttributes +{ + MAX_HEALTH("generic.maxHealth", EnumOperation.ADDITIVE, 0, 100, 0, Applyable.BOTH), + FOLLOW_RANGE("generic.followRange", EnumOperation.ADDITIVE, 0, 100, 0, Applyable.MOB), + KNOCKBACK_RESISTANCE("generic.knockbackResistance", EnumOperation.PERCENTAGE, 0, 100, 0, Applyable.BOTH), + MOVEMENT_SPEED("generic.movementSpeed", EnumOperation.PERCENTAGE, 0, 100, 0, Applyable.BOTH), + ATTACK_DAMAGE("generic.attackDamage", EnumOperation.ADDITIVE, 0, 100, 0, Applyable.BOTH), + ARMOR("generic.armor", EnumOperation.ADDITIVE, 0, 100, 0, Applyable.BOTH), + ARMOR_TOUGHNESS("generic.armorToughness", EnumOperation.ADDITIVE, 0, 100, 0, Applyable.BOTH), + ATTACK_SPEED("generic.attackSpeed", EnumOperation.PERCENTAGE, 0, 100, 0, Applyable.BOTH), + LUCK("generic.luck", EnumOperation.PERCENTAGE, -100, 100, 0, Applyable.PLAYER), + HORSE_JUMP_STRENGTH("horse.jumpStrength", EnumOperation.PERCENTAGE, 0, 100, 0, Applyable.MOB), + ZOMBIE_SPAWN_REINFORCEMENTS("zombie.spawnReinforcements", EnumOperation.PERCENTAGE, 0, 100, 0, Applyable.MOB); + + private String attribute; + private EnumOperation operation; + private float min; + private float max; + private float start; + private Applyable applyable; + + public enum Applyable + { + BOTH, + PLAYER, + MOB + } + + private EnumAttributes(String attribute, EnumOperation operation, float min, float max, float start, Applyable applyable) + { + this.attribute = attribute; + this.operation = operation; + this.min = min; + this.max = max; + this.start = start; + this.applyable = applyable; + } + + public String getAttribute() + { + return this.attribute; + } + + public String getTranslationKey() + { + return "attribute.name." + this.attribute; + } + + public String getTranslation() + { + return I18n.format(this.getTranslationKey(), new Object[0]); + } + + public EnumOperation getOperation() + { + return this.operation; + } + + public float getMin() + { + return this.min; + } + + public float getMax() + { + return this.max; + } + + public float getStart() + { + return this.start; + } + + public Applyable getApplyable() + { + return this.applyable; + } + + public double calculate(Float value) + { + return this.operation.getOperation().apply(value.doubleValue()); + } + + public enum EnumOperation + { + ADDITIVE(value -> value, "(+)"), + PERCENTAGE(value -> value / 100, "%"); + + private final Function operation; + private final String declaration; + + private EnumOperation(Function operation, String declaration) + { + this.operation = operation; + this.declaration = declaration; + } + + public Function getOperation() + { + return this.operation; + } + + public String getDeclaration() + { + return this.declaration; + } + } + + public static List getAttributesFor(Applyable applyable) + { + return Arrays.stream(EnumAttributes.values()).filter(attribute -> attribute.getApplyable().equals(applyable)).collect(Collectors.toList()); + } +} diff --git a/src/main/java/exopandora/worldhandler/builder/types/Coordinate.java b/src/main/java/exopandora/worldhandler/builder/types/Coordinate.java new file mode 100644 index 0000000..64f0be2 --- /dev/null +++ b/src/main/java/exopandora/worldhandler/builder/types/Coordinate.java @@ -0,0 +1,63 @@ +package exopandora.worldhandler.builder.types; + +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public class Coordinate +{ + private double value; + private boolean relative; + + public Coordinate() + { + this(0, true); + } + + public Coordinate(double value) + { + this(value, false); + } + + public Coordinate(double value, boolean relative) + { + this.relative = relative; + this.value = value; + } + + public void setValue(double value) + { + this.value = value; + } + + public double getValue() + { + return this.value; + } + + public void setRelative(boolean relative) + { + this.relative = relative; + } + + public boolean isRelative() + { + return this.relative; + } + + public static Coordinate valueOf(String value) + { + if(value.startsWith("~")) + { + return new Coordinate(Double.parseDouble(value.substring(1)), true); + } + + return new Coordinate(Double.parseDouble(value), false); + } + + @Override + public String toString() + { + return String.valueOf(this.relative ? (this.value != 0 ? "~" + this.value : "~") : this.value); + } +} diff --git a/src/main/java/exopandora/worldhandler/builder/types/Level.java b/src/main/java/exopandora/worldhandler/builder/types/Level.java new file mode 100644 index 0000000..c6c580a --- /dev/null +++ b/src/main/java/exopandora/worldhandler/builder/types/Level.java @@ -0,0 +1,49 @@ +package exopandora.worldhandler.builder.types; + +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public class Level +{ + private int level; + + public Level() + { + this(0); + } + + public Level(int level) + { + this.level = level; + } + + public int getLevel() + { + return this.level; + } + + public void setLevel(int level) + { + this.level = level; + } + + public static Level valueOf(String value) + { + if(value != null) + { + if(value.matches("[-]?[0-9]+[Ll]?")) + { + return new Level(Integer.valueOf(value.replaceAll("[lL]$", ""))); + } + } + + return null; + } + + @Override + public String toString() + { + return this.level + "L"; + } +} \ No newline at end of file diff --git a/src/main/java/exopandora/worldhandler/builder/types/TargetSelector.java b/src/main/java/exopandora/worldhandler/builder/types/TargetSelector.java new file mode 100644 index 0000000..d00afbf --- /dev/null +++ b/src/main/java/exopandora/worldhandler/builder/types/TargetSelector.java @@ -0,0 +1,56 @@ +package exopandora.worldhandler.builder.types; + +import java.util.HashMap; +import java.util.Map; +import java.util.stream.Collectors; + +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public class TargetSelector +{ + private final Map values = new HashMap(); + private static final String REGEX = "@e\\[(.*)\\]"; + + public void set(String id, Object value) + { + this.values.put(id.toLowerCase(), value); + } + + public T get(String id) + { + return (T) this.values.get(id); + } + + public Object remove(String id) + { + return this.values.remove(id.toLowerCase()); + } + + public static TargetSelector valueOf(String input) + { + if(input.matches(REGEX)); + { + TargetSelector result = new TargetSelector(); + + for(String keys : input.replaceFirst(REGEX, "$1").split(",")) + { + String[] pair = keys.split("="); + + if(pair.length > 1) + { + result.set(pair[0], pair[1]); + } + } + } + + return new TargetSelector(); + } + + @Override + public String toString() + { + return "@e[" + String.join(",", this.values.entrySet().stream().map(entry -> entry.getKey() + "=" + entry.getValue().toString()).collect(Collectors.toList())) + "]"; + } +} diff --git a/src/main/java/exopandora/worldhandler/builder/types/Type.java b/src/main/java/exopandora/worldhandler/builder/types/Type.java new file mode 100644 index 0000000..5dba84e --- /dev/null +++ b/src/main/java/exopandora/worldhandler/builder/types/Type.java @@ -0,0 +1,67 @@ +package exopandora.worldhandler.builder.types; + +import java.util.function.Function; + +import javax.annotation.Nullable; + +import net.minecraft.nbt.JsonToNBT; +import net.minecraft.nbt.NBTException; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public enum Type +{ + SHORT(Short::valueOf), + BYTE(Byte::valueOf), + INT(Integer::valueOf), + FLOAT(Float::valueOf), + DOUBLE(Double::valueOf), + LONG(Long::valueOf), + BOOLEAN(Boolean::valueOf), + STRING(String::valueOf), + RESOURCE_LOCATION(Type::parseResourceLocation), + NBT(Type::parseNBTTagCompound), + COORDINATE(Coordinate::valueOf), + TARGET_SELECTOR(TargetSelector::valueOf), + LEVEL(Level::valueOf); + + private final Function parser; + + private Type(Function parser) + { + this.parser = parser; + } + + @Nullable + public T parse(String object) + { + return (T) this.parser.apply(object); + } + + @Nullable + public static ResourceLocation parseResourceLocation(String value) + { + return value != null ? new ResourceLocation(value) : null; + } + + @Nullable + public static NBTTagCompound parseNBTTagCompound(String value) + { + if(value != null) + { + try + { + return JsonToNBT.getTagFromJson(value); + } + catch(NBTException nbtexception) + { + return null; + } + } + + return null; + } +} diff --git a/src/main/java/exopandora/worldhandler/command/CommandWH.java b/src/main/java/exopandora/worldhandler/command/CommandWH.java new file mode 100644 index 0000000..4e10c29 --- /dev/null +++ b/src/main/java/exopandora/worldhandler/command/CommandWH.java @@ -0,0 +1,231 @@ +package exopandora.worldhandler.command; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; + +import exopandora.worldhandler.builder.impl.BuilderClone; +import exopandora.worldhandler.builder.impl.BuilderClone.EnumMask; +import exopandora.worldhandler.builder.impl.BuilderFill; +import exopandora.worldhandler.builder.impl.BuilderWH; +import exopandora.worldhandler.helper.BlockHelper; +import exopandora.worldhandler.helper.EnumHelper; +import exopandora.worldhandler.helper.ResourceHelper; +import exopandora.worldhandler.main.WorldHandler; +import net.minecraft.block.Block; +import net.minecraft.client.Minecraft; +import net.minecraft.command.CommandBase; +import net.minecraft.command.CommandException; +import net.minecraft.command.ICommandSender; +import net.minecraft.command.NumberInvalidException; +import net.minecraft.command.WrongUsageException; +import net.minecraft.server.MinecraftServer; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.text.TextComponentString; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public class CommandWH extends CommandBase +{ + @Override + public String getName() + { + return "wh"; + } + + @Override + public int getRequiredPermissionLevel() + { + return 0; + } + + @Override + public void execute(MinecraftServer server, ICommandSender sender, String[] args) throws CommandException + { + if(args.length > 0) + { + if(args[0].equals("pos1")) + { + BlockHelper.setPos1(BlockHelper.getFocusedBlockPos()); + sender.sendMessage(new TextComponentString("Set first position to " + BlockHelper.getPos1().getX() + ", " + BlockHelper.getPos1().getY() + ", " + BlockHelper.getPos1().getZ() + " (" + Block.REGISTRY.getNameForObject(BlockHelper.getFocusedBlock()) + ")")); + } + else if(args[0].equals("pos2")) + { + BlockHelper.setPos2(BlockHelper.getFocusedBlockPos()); + sender.sendMessage(new TextComponentString("Set second position to " + BlockHelper.getPos2().getX() + ", " + BlockHelper.getPos2().getY() + ", " + BlockHelper.getPos2().getZ() + " (" + Block.REGISTRY.getNameForObject(BlockHelper.getFocusedBlock()) + ")")); + } + else if(args[0].equals("fill")) + { + final String usage = "/wh fill [meta]"; + + if(args.length > 1) + { + ResourceLocation id = new ResourceLocation(args[1]); + int meta = 0; + + if(args.length > 2) + { + try + { + meta = Integer.parseInt(args[2]); + } + catch(Exception e) + { + throw new WrongUsageException(usage); + } + } + + if(!ResourceHelper.isRegisteredBlock(id.toString())) + { + throw new NumberInvalidException(usage); + } + + BuilderFill builder = new BuilderFill(); + builder.setBlock1(id); + builder.setMeta1(meta); + + WorldHandler.sendCommand(builder); + } + else + { + throw new WrongUsageException(usage); + } + } + else if(args[0].equals("replace")) + { + final String usage = "/wh replace [meta2]"; + + if(args.length > 1) + { + ResourceLocation id1 = new ResourceLocation(args[1]); + + if(args.length > 2) + { + ResourceLocation id2 = new ResourceLocation(args[3]); + int meta1 = 0; + int meta2 = 0; + + try + { + meta1 = Integer.parseInt(args[2]); + } + catch(Exception e) + { + throw new WrongUsageException(usage); + } + + if(args.length > 4) + { + try + { + meta2 = Integer.parseInt(args[4]); + } + catch(Exception e) + { + throw new WrongUsageException(usage); + } + } + + if(!ResourceHelper.isRegisteredBlock(id1.toString()) || !ResourceHelper.isRegisteredBlock(id2.toString())) + { + throw new WrongUsageException(usage); + } + + BuilderFill builder = new BuilderFill(); + builder.setPosition1(BlockHelper.getPos1()); + builder.setPosition2(BlockHelper.getPos2()); + builder.setBlock1(id1); + builder.setMeta1(meta1); + builder.setBlock2(id2); + builder.setMeta2(meta2); + + Minecraft.getMinecraft().player.sendChatMessage(builder.getBuilderForReplace().toActualCommand()); + } + else + { + throw new WrongUsageException(usage); + } + } + else + { + throw new WrongUsageException(usage); + } + } + else if(args[0].equals("clone")) + { + final String usage = "/wh clone [" + String.join("|", Arrays.stream(EnumMask.MASKED.values()).map(EnumMask::toString).collect(Collectors.toList())) + "]"; + EnumMask mask = EnumMask.MASKED; + + if(args.length > 1) + { + mask = EnumHelper.valueOf(EnumMask.class, args[1]); + } + + if(mask == null) + { + throw new WrongUsageException(usage); + } + + BuilderClone builder = new BuilderClone(); + builder.setPosition1(BlockHelper.getPos1()); + builder.setPosition2(BlockHelper.getPos2()); + builder.setMask(mask); + + Minecraft.getMinecraft().player.sendChatMessage(builder.toActualCommand()); + } + else + { + throw new WrongUsageException(new BuilderWH().toCommand()); + } + } + else + { + throw new WrongUsageException(new BuilderWH().toCommand()); + } + } + + @Override + public List getTabCompletions(MinecraftServer server, ICommandSender sender, String[] args, BlockPos pos) + { + if(args.length == 1) + { + return this.getListOfStringsMatchingLastWord(args, new String[]{"pos1", "pos2", "fill", "replace", "clone"}); + } + else if(args.length == 2) + { + if(args[0].equals("fill") || args[0].equals("replace")) + { + return this.getListOfStringsMatchingLastWord(args, Block.REGISTRY.getKeys()); + } + else if(args[0].equals("clone")) + { + return this.getListOfStringsMatchingLastWord(args, new String[]{"replace", "masked", "filtered"}); + } + } + else if(args.length == 3) + { + if(args[0].equals("fill") || args[0].equals("replace")) + { + return this.getListOfStringsMatchingLastWord(args, new String[] {"0"}); + } + } + else if(args.length == 4) + { + if(args[0].equals("replace")) + { + return this.getListOfStringsMatchingLastWord(args, Block.REGISTRY.getKeys()); + } + } + + return Collections.emptyList(); + } + + @Override + public String getUsage(ICommandSender sender) + { + return new BuilderWH().toCommand(); + } +} \ No newline at end of file diff --git a/src/main/java/exopandora/worldhandler/command/CommandWorldHandler.java b/src/main/java/exopandora/worldhandler/command/CommandWorldHandler.java new file mode 100644 index 0000000..5b3eb2b --- /dev/null +++ b/src/main/java/exopandora/worldhandler/command/CommandWorldHandler.java @@ -0,0 +1,100 @@ +package exopandora.worldhandler.command; + +import java.util.Collections; +import java.util.List; + +import com.mojang.realmsclient.gui.ChatFormatting; + +import exopandora.worldhandler.builder.impl.BuilderWorldHandler; +import exopandora.worldhandler.event.EventHandler; +import exopandora.worldhandler.main.Main; +import exopandora.worldhandler.main.WorldHandler; +import net.minecraft.client.Minecraft; +import net.minecraft.command.CommandBase; +import net.minecraft.command.CommandException; +import net.minecraft.command.ICommandSender; +import net.minecraft.command.WrongUsageException; +import net.minecraft.server.MinecraftServer; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.text.TextComponentString; +import net.minecraftforge.common.ForgeVersion; +import net.minecraftforge.fml.common.Loader; +import net.minecraftforge.fml.common.versioning.ComparableVersion; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public class CommandWorldHandler extends CommandBase +{ + @Override + public String getName() + { + return "worldhandler"; + } + + @Override + public int getRequiredPermissionLevel() + { + return 0; + } + + @Override + public void execute(MinecraftServer server, ICommandSender sender, String[] args) throws CommandException + { + if(args.length > 0) + { + if(args[0].equalsIgnoreCase("help")) + { + this.printHelp(sender); + } + else if(args[0].equalsIgnoreCase("display")) + { + new Thread(() -> Minecraft.getMinecraft().addScheduledTask(EventHandler::displayGui)).start(); + } + else if(args[0].equalsIgnoreCase("version")) + { + sender.sendMessage(new TextComponentString("Installed: " + Main.MC_VERSION + "-" + Main.VERSION)); + ComparableVersion target = ForgeVersion.getResult(Loader.instance().getIndexedModList().get(Main.MODID)).target; + sender.sendMessage(new TextComponentString("Latest: " + Main.MC_VERSION + "-" + (target != null ? target : Main.VERSION))); + } + else + { + throw new WrongUsageException(this.getUsage(sender)); + } + } + else if(args.length == 0) + { + this.printHelp(sender); + } + else + { + throw new WrongUsageException(this.getUsage(sender)); + } + } + + private void printHelp(ICommandSender player) + { + player.sendMessage(new TextComponentString(ChatFormatting.DARK_GREEN + "--- Showing help page 1 of 1 (/worldhandler help) ---")); + player.sendMessage(new TextComponentString("/worldhandler help")); + player.sendMessage(new TextComponentString("/worldhandler display")); + player.sendMessage(new TextComponentString("/worldhandler version")); + player.sendMessage(new TextComponentString(ChatFormatting.GREEN + "Tip: Press '" + WorldHandler.KEY_WORLD_HANDLER.getDisplayName() + "' to open the World Handler")); + } + + @Override + public List getTabCompletions(MinecraftServer server, ICommandSender sender, String[] args, BlockPos pos) + { + if(args.length == 1) + { + return this.getListOfStringsMatchingLastWord(args, new String[]{"help", "display", "version"}); + } + + return Collections.emptyList(); + } + + @Override + public String getUsage(ICommandSender sender) + { + return new BuilderWorldHandler().toCommand(); + } +} \ No newline at end of file diff --git a/src/main/java/exopandora/worldhandler/command/FakeCommandHandler.java b/src/main/java/exopandora/worldhandler/command/FakeCommandHandler.java new file mode 100644 index 0000000..1b0c332 --- /dev/null +++ b/src/main/java/exopandora/worldhandler/command/FakeCommandHandler.java @@ -0,0 +1,45 @@ +package exopandora.worldhandler.command; + +import net.minecraft.client.Minecraft; +import net.minecraft.command.CommandHandler; +import net.minecraft.command.ICommand; +import net.minecraft.server.MinecraftServer; +import net.minecraftforge.client.event.ClientChatEvent; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public class FakeCommandHandler extends CommandHandler +{ + @Override + protected MinecraftServer getServer() + { + return null; + } + + private void fakeCommand(ICommand command, ClientChatEvent event) + { + Minecraft.getMinecraft().ingameGUI.getChatGUI().addToSentMessages(event.getMessage()); + this.tryExecute(Minecraft.getMinecraft().player, dropFirstString(event.getMessage().split(" ")), command, event.getMessage()); + + if(event != null && event.isCancelable()) + { + event.setCanceled(true); + } + } + + private static String[] dropFirstString(String[] input) + { + String[] string = new String[input.length - 1]; + System.arraycopy(input, 1, string, 0, input.length - 1); + return string; + } + + public void tryCommand(ICommand command, ClientChatEvent event) + { + if(event.getMessage().startsWith("/" + command.getName()) || event.getMessage().startsWith("/" + command.getName() + " ")) + { + this.fakeCommand(command, event); + } + } +} diff --git a/src/main/java/exopandora/worldhandler/config/ConfigButcher.java b/src/main/java/exopandora/worldhandler/config/ConfigButcher.java new file mode 100644 index 0000000..10753d0 --- /dev/null +++ b/src/main/java/exopandora/worldhandler/config/ConfigButcher.java @@ -0,0 +1,45 @@ +package exopandora.worldhandler.config; + +import java.util.HashMap; +import java.util.Map; + +import exopandora.worldhandler.helper.EntityHelper; +import net.minecraft.client.resources.I18n; +import net.minecraft.entity.EntityList; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.common.config.Configuration; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public class ConfigButcher +{ + private static Map ENTITIES = new HashMap(); + + public static final String CATEGORY = "butcher"; + + public static void load(Configuration config) + { + for(ResourceLocation location : EntityList.ENTITY_EGGS.keySet()) + { + String entity = EntityHelper.getEntityName(location); + String translationKey = "entity." + entity + ".name"; + String translation = I18n.format(translationKey); + + if(!translation.equals(translationKey)) + { + ENTITIES.put(entity, config.getBoolean(entity, CATEGORY, false, I18n.format("gui.worldhandler.config.comment.butcher", translation), translationKey)); + } + } + + if(config.hasChanged()) + { + config.save(); + } + } + + public static Map getEntitiyMap() + { + return ENTITIES; + } +} diff --git a/src/main/java/exopandora/worldhandler/config/ConfigSettings.java b/src/main/java/exopandora/worldhandler/config/ConfigSettings.java new file mode 100644 index 0000000..f1b59df --- /dev/null +++ b/src/main/java/exopandora/worldhandler/config/ConfigSettings.java @@ -0,0 +1,129 @@ +package exopandora.worldhandler.config; + +import net.minecraft.client.resources.I18n; +import net.minecraftforge.common.config.Configuration; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public class ConfigSettings +{ + private static boolean BIOME_INDICATOR; + private static boolean COMMAND_SYNTAX; + private static boolean SHORTCUTS; + private static boolean SHORTCUT_KEYS; + private static boolean TOOLTIPS; + private static boolean WATCH; + private static boolean SMOOTH_WATCH; + private static boolean PAUSE; + private static boolean CUSTOM_TIMES; + private static boolean PERMISSION_QEURY; + + private static int DAWN; + private static int NOON; + private static int SUNSET; + private static int MIDNIGHT; + + private static String BLOCK_PLACING_MODE; + + public static final String CATEGORY = "settings"; + + public static void load(Configuration config) + { + BIOME_INDICATOR = config.getBoolean("biome_indicator", CATEGORY, false, I18n.format("gui.worldhandler.config.comment.settings.biome_indicator"), "gui.worldhandler.config.key.settings.biome_indicator"); + COMMAND_SYNTAX = config.getBoolean("command_syntax", CATEGORY, false, I18n.format("gui.worldhandler.config.comment.settings.command_syntax"), "gui.worldhandler.config.key.settings.command_syntax"); + SHORTCUTS = config.getBoolean("shortcuts", CATEGORY, false, I18n.format("gui.worldhandler.config.comment.settings.shortcuts"), "gui.worldhandler.config.key.settings.shortcuts"); + SHORTCUT_KEYS = config.getBoolean("key_shortcuts", CATEGORY, false, I18n.format("gui.worldhandler.config.comment.settings.key_shortcuts"), "gui.worldhandler.config.key.settings.key_shortcuts"); + TOOLTIPS = config.getBoolean("tooltips", CATEGORY, true, I18n.format("gui.worldhandler.config.comment.settings.tooltips"), "gui.worldhandler.config.key.settings.tooltips"); + WATCH = config.getBoolean("watch", CATEGORY, true, I18n.format("gui.worldhandler.config.comment.settings.watch"), "gui.worldhandler.config.key.settings.watch"); + SMOOTH_WATCH = config.getBoolean("smooth_watch", CATEGORY, true, I18n.format("gui.worldhandler.config.comment.settings.smooth_watch"), "gui.worldhandler.config.key.settings.smooth_watch"); + PAUSE = config.getBoolean("pause_game", CATEGORY, false, I18n.format("gui.worldhandler.config.comment.settings.pause_game"), "gui.worldhandler.config.key.settings.pause_game"); + CUSTOM_TIMES = config.getBoolean("custom_times", CATEGORY, false, I18n.format("gui.worldhandler.config.comment.settings.custom_times"), "gui.worldhandler.config.key.settings.custom_times"); + PERMISSION_QEURY = config.getBoolean("permission_query", CATEGORY, true, I18n.format("gui.worldhandler.config.comment.settings.permission_query"), "gui.worldhandler.config.key.settings.permission_query"); + DAWN = config.getInt("custom_time_dawn", CATEGORY, 1000, 0, 24000, I18n.format("gui.worldhandler.config.comment.settings.custom_time_dawn"), "gui.worldhandler.config.key.settings.custom_time_dawn"); + NOON = config.getInt("custom_time_noon", CATEGORY, 6000, 0, 24000, I18n.format("gui.worldhandler.config.comment.settings.custom_time_noon"), "gui.worldhandler.config.key.settings.custom_time_noon"); + SUNSET = config.getInt("custom_time_sunset", CATEGORY, 12500, 0, 24000, I18n.format("gui.worldhandler.config.comment.settings.custom_time_sunset"), "gui.worldhandler.config.key.settings.custom_time_sunset"); + MIDNIGHT = config.getInt("custom_time_midnight", CATEGORY, 18000, 0, 24000, I18n.format("gui.worldhandler.config.comment.settings.custom_time_midnight"), "gui.worldhandler.config.key.settings.custom_time_midnight"); + BLOCK_PLACING_MODE = config.getString("block_placing_mode", CATEGORY, "keep", I18n.format("gui.worldhandler.config.comment.settings.block_placing_mode"), new String[]{"keep", "replace", "destroy"}, "gui.worldhandler.config.key.settings.block_placing_mode"); + + if(config.hasChanged()) + { + config.save(); + } + } + + public static boolean isBiomeIndicatorEnabled() + { + return BIOME_INDICATOR; + } + + public static boolean isCommandSyntaxEnabled() + { + return COMMAND_SYNTAX; + } + + public static boolean areShortcutsEnabled() + { + return SHORTCUTS; + } + + public static boolean arePosShortcutsEnabled() + { + return SHORTCUT_KEYS; + } + + public static boolean areTooltipsEnabled() + { + return TOOLTIPS; + } + + public static boolean isWatchEnabled() + { + return WATCH; + } + + public static boolean isSmoothWatchEnabled() + { + return SMOOTH_WATCH; + } + + public static boolean isPauseEnabled() + { + return PAUSE; + } + + public static boolean isCustomTimeEnabled() + { + return CUSTOM_TIMES; + } + + public static boolean isPermissionQueryEnabled() + { + return PERMISSION_QEURY; + } + + public static int getDawn() + { + return DAWN; + } + + public static int getNoon() + { + return NOON; + } + + public static int getSunset() + { + return SUNSET; + } + + public static int getMidnight() + { + return MIDNIGHT; + } + + public static String getMode() + { + return BLOCK_PLACING_MODE; + } +} \ No newline at end of file diff --git a/src/main/java/exopandora/worldhandler/config/ConfigSkin.java b/src/main/java/exopandora/worldhandler/config/ConfigSkin.java new file mode 100644 index 0000000..6ec1755 --- /dev/null +++ b/src/main/java/exopandora/worldhandler/config/ConfigSkin.java @@ -0,0 +1,127 @@ +package exopandora.worldhandler.config; + +import net.minecraft.client.resources.I18n; +import net.minecraftforge.common.config.Configuration; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public class ConfigSkin +{ + private static int ICON_SIZE; + private static int LABEL_COLOR; + private static int HEADLINE_COLOR; + + private static int BACKGROUND_RED; + private static int BACKGROUND_GREEN; + private static int BACKGROUND_BLUE; + private static int BACKGROUND_ALPHA; + + private static int BUTTON_RED; + private static int BUTTON_GREEN; + private static int BUTTON_BLUE; + private static int BUTTON_ALPHA; + + private static String TYPE; + + private static boolean SHARP_EDGES; + private static boolean DRAW_BACKGROUND; + + public static final String CATEGORY = "skin"; + + public static void load(Configuration config) + { + ICON_SIZE = Integer.valueOf(config.getString("icon_size", CATEGORY, "16", I18n.format("gui.worldhandler.config.comment.skin.icons"), new String[]{"16", "32", "64"}, "gui.worldhandler.config.key.skin.icons")); + LABEL_COLOR = config.getInt("label_color", CATEGORY, 0x1F1F1F, 0x80000000, 0x7FFFFFFF, I18n.format("gui.worldhandler.config.comment.skin.label_color"), "gui.worldhandler.config.key.skin.label_color"); + HEADLINE_COLOR = config.getInt("headline_color", CATEGORY, 0x4F4F4F, 0x80000000, 0x7FFFFFFF, I18n.format("gui.worldhandler.config.comment.skin.headline_color"), "gui.worldhandler.config.key.skin.headline_color"); + + BACKGROUND_RED = config.getInt("background_red", CATEGORY, 255, 0, 255, I18n.format("gui.worldhandler.config.comment.skin.background_red"), "gui.worldhandler.config.key.skin.background_red"); + BACKGROUND_GREEN = config.getInt("background_green", CATEGORY, 255, 0, 255, I18n.format("gui.worldhandler.config.comment.skin.background_green"), "gui.worldhandler.config.key.skin.background_green"); + BACKGROUND_BLUE = config.getInt("background_blue", CATEGORY, 255, 0, 255, I18n.format("gui.worldhandler.config.comment.skin.background_blue"), "gui.worldhandler.config.key.skin.background_blue"); + BACKGROUND_ALPHA = config.getInt("background_alpha", CATEGORY, 255, 0, 255, I18n.format("gui.worldhandler.config.comment.skin.background_alpha"), "gui.worldhandler.config.key.skin.background_alpha"); + + BUTTON_RED = config.getInt("button_red", CATEGORY, 255, 0, 255, I18n.format("gui.worldhandler.config.comment.skin.button_red"), "gui.worldhandler.config.key.skin.button_red"); + BUTTON_GREEN = config.getInt("button_green", CATEGORY, 255, 0, 255, I18n.format("gui.worldhandler.config.comment.skin.button_green"), "gui.worldhandler.config.key.skin.button_green"); + BUTTON_BLUE = config.getInt("button_blue", CATEGORY, 255, 0, 255, I18n.format("gui.worldhandler.config.comment.skin.button_blue"), "gui.worldhandler.config.key.skin.button_blue"); + BUTTON_ALPHA = config.getInt("button_alpha", CATEGORY, 255, 0, 255, I18n.format("gui.worldhandler.config.comment.skin.button_alpha"), "gui.worldhandler.config.key.skin.button_alpha"); + + TYPE = config.getString("textures", CATEGORY, "resourcepack", I18n.format("gui.worldhandler.config.comment.skin.textures"), new String[]{"resourcepack", "vanilla"}, "gui.worldhandler.config.key.skin.textures"); + SHARP_EDGES = config.getBoolean("sharp_tab_edges", CATEGORY, false, I18n.format("gui.worldhandler.config.comment.skin.sharp_tab_edges"), "gui.worldhandler.config.key.skin.sharp_tab_edges"); + DRAW_BACKGROUND = config.getBoolean("draw_background", CATEGORY, true, I18n.format("gui.worldhandler.config.comment.skin.draw_background"), "gui.worldhandler.config.key.skin.draw_background"); + + if(config.hasChanged()) + { + config.save(); + } + } + + public static int getIconSize() + { + return ICON_SIZE; + } + + public static int getLabelColor() + { + return LABEL_COLOR; + } + + public static int getHeadlineColor() + { + return HEADLINE_COLOR; + } + + public static int getBackgroundRed() + { + return BACKGROUND_RED; + } + + public static int getBackgroundGreen() + { + return BACKGROUND_GREEN; + } + + public static int getBackgroundBlue() + { + return BACKGROUND_BLUE; + } + + public static int getButtonRed() + { + return BUTTON_RED; + } + + public static int getButtonGreen() + { + return BUTTON_GREEN; + } + + public static int getButtonBlue() + { + return BUTTON_BLUE; + } + + public static String getTextureType() + { + return TYPE; + } + + public static boolean areSharpEdgesEnabled() + { + return SHARP_EDGES; + } + + public static boolean isBackgroundDrawingEnabled() + { + return DRAW_BACKGROUND; + } + + public static int getBackgroundAlpha() + { + return BACKGROUND_ALPHA; + } + + public static int getButtonAlpha() + { + return BUTTON_ALPHA; + } +} diff --git a/src/main/java/exopandora/worldhandler/event/EventHandler.java b/src/main/java/exopandora/worldhandler/event/EventHandler.java new file mode 100644 index 0000000..81fcf47 --- /dev/null +++ b/src/main/java/exopandora/worldhandler/event/EventHandler.java @@ -0,0 +1,103 @@ +package exopandora.worldhandler.event; + +import com.mojang.realmsclient.gui.ChatFormatting; + +import exopandora.worldhandler.command.FakeCommandHandler; +import exopandora.worldhandler.config.ConfigSettings; +import exopandora.worldhandler.gui.container.impl.GuiWorldHandlerContainer; +import exopandora.worldhandler.gui.content.Contents; +import exopandora.worldhandler.helper.BlockHelper; +import exopandora.worldhandler.hud.BiomeIndicator; +import exopandora.worldhandler.main.Main; +import exopandora.worldhandler.main.WorldHandler; +import exopandora.worldhandler.util.UtilPlayer; +import net.minecraft.client.Minecraft; +import net.minecraft.client.resources.I18n; +import net.minecraft.init.Blocks; +import net.minecraft.util.text.TextComponentString; +import net.minecraftforge.client.event.ClientChatEvent; +import net.minecraftforge.fml.client.event.ConfigChangedEvent.OnConfigChangedEvent; +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +import net.minecraftforge.fml.common.gameevent.InputEvent.KeyInputEvent; +import net.minecraftforge.fml.common.gameevent.TickEvent; +import net.minecraftforge.fml.common.gameevent.TickEvent.Phase; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public class EventHandler +{ + private final FakeCommandHandler commandHandler = new FakeCommandHandler(); + + @SubscribeEvent + public void clientTickEvent(TickEvent.ClientTickEvent event) + { + if(Minecraft.getMinecraft().inGameHasFocus && event.phase.equals(Phase.START)) + { + if(ConfigSettings.isBiomeIndicatorEnabled()) + { + BiomeIndicator.tick(); + } + } + } + + @SubscribeEvent + public void keyInputEvent(KeyInputEvent event) + { + if(WorldHandler.KEY_WORLD_HANDLER.isPressed()) + { + displayGui(); + } + else if(WorldHandler.KEY_WORLD_HANDLER_POS1.isPressed() && ConfigSettings.arePosShortcutsEnabled()) + { + BlockHelper.setPos1(BlockHelper.getFocusedBlockPos()); + } + else if(WorldHandler.KEY_WORLD_HANDLER_POS2.isPressed() && ConfigSettings.arePosShortcutsEnabled()) + { + BlockHelper.setPos2(BlockHelper.getFocusedBlockPos()); + } + } + + @SubscribeEvent + public void onConfigChanged(OnConfigChangedEvent event) + { + if(event.getModID().equals(Main.MODID)) + { + WorldHandler.updateConfig(); + } + } + + @SubscribeEvent + public void clientChatEvent(ClientChatEvent event) + { + if(!Minecraft.getMinecraft().isSingleplayer()) + { + this.commandHandler.tryCommand(WorldHandler.COMMAND_WORLD_HANDLER, event); + this.commandHandler.tryCommand(WorldHandler.COMMAND_WH, event); + } + } + + public static void displayGui() + { + if(!UtilPlayer.canIssueCommand() && ConfigSettings.isPermissionQueryEnabled()) + { + Minecraft.getMinecraft().player.sendMessage(new TextComponentString(ChatFormatting.RED + I18n.format("worldhandler.permission.refused"))); + Minecraft.getMinecraft().player.sendMessage(new TextComponentString(ChatFormatting.RED + I18n.format("worldhandler.permission.refused.change", I18n.format("gui.worldhandler.config.key.settings.permission_query")))); + } + else + { + if(BlockHelper.isFocusedBlockEqualTo(Blocks.STANDING_SIGN) || BlockHelper.isFocusedBlockEqualTo(Blocks.WALL_SIGN)) + { + Minecraft.getMinecraft().displayGuiScreen(new GuiWorldHandlerContainer(Contents.SIGN_EDITOR)); + } + else if(BlockHelper.isFocusedBlockEqualTo(Blocks.NOTEBLOCK)) + { + Minecraft.getMinecraft().displayGuiScreen(new GuiWorldHandlerContainer(Contents.NOTE_EDITOR)); + } + else + { + Minecraft.getMinecraft().displayGuiScreen(new GuiWorldHandlerContainer(Contents.MAIN)); + } + } + } +} diff --git a/src/main/java/exopandora/worldhandler/format/EnumColor.java b/src/main/java/exopandora/worldhandler/format/EnumColor.java new file mode 100644 index 0000000..87fc5da --- /dev/null +++ b/src/main/java/exopandora/worldhandler/format/EnumColor.java @@ -0,0 +1,67 @@ +package exopandora.worldhandler.format; + +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public enum EnumColor +{ + DEFAULT("reset", "r"), + YELLOW("yellow", "e"), + GOLD("gold", "6"), + DARK_RED("dark_red", "4"), + RED("red", "c"), + LIGHT_PURPLE("light_purple", "d"), + DARK_PURPLE("dark_purple", "5"), + BLUE("blue", "9"), + DARK_BLUE("dark_blue", "1"), + DARK_AQUA("dark_aqua", "3"), + AQUA("aqua", "b"), + GREEN("green", "a"), + DARK_GREEN("dark_green", "2"), + BLACK("black", "0"), + DARK_GRAY("dark_gray", "8"), + GRAY("gray", "7"), + WHITE("white", "f"), + + OBFUSCATED("obfuscated", "k"), + BOLD("bold", "l"), + STRIKETHROUGH("strikethrough", "m"), + UNDERLINED("underlined", "n"), + ITALIC("italic", "o"); + + private String format; + private String prefix; + + private EnumColor(String format, String prefix) + { + this.format = format; + this.prefix = prefix; + } + + public String getFormat() + { + return this.format; + } + + public String getPrefix() + { + return this.prefix; + } + + @Override + public String toString() + { + return "\u00A7" + this.prefix; + } + + public static EnumColor getColorFromId(int id) + { + if(id >= 0 && id < EnumColor.values().length) + { + return EnumColor.values()[id]; + } + + return null; + } +} diff --git a/src/main/java/exopandora/worldhandler/format/TextFormatting.java b/src/main/java/exopandora/worldhandler/format/TextFormatting.java new file mode 100644 index 0000000..f054772 --- /dev/null +++ b/src/main/java/exopandora/worldhandler/format/TextFormatting.java @@ -0,0 +1,169 @@ +package exopandora.worldhandler.format; + +import com.mojang.realmsclient.gui.ChatFormatting; + +import net.minecraft.client.gui.FontRenderer; +import net.minecraft.util.math.MathHelper; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public class TextFormatting +{ + public static String getFormatting(int id) + { + if(id >= 0 && id < EnumColor.values().length) + { + return EnumColor.values()[id].getFormat(); + } + + return EnumColor.DEFAULT.getFormat(); + } + + public static String getPrefix(int id) + { + if(id >= 0 && id < EnumColor.values().length) + { + return EnumColor.values()[id].getPrefix(); + } + + return EnumColor.DEFAULT.getPrefix(); + } + + public static String format(String text, int color, boolean obfuscated, boolean bold, boolean strikethrough, boolean underlined, boolean italic) + { + String formattedText = text; + + if(italic) + { + formattedText = ChatFormatting.ITALIC + formattedText; + } + + if(underlined) + { + formattedText = ChatFormatting.UNDERLINE + formattedText; + } + + if(strikethrough) + { + formattedText = ChatFormatting.STRIKETHROUGH + formattedText; + } + + if(bold) + { + formattedText = ChatFormatting.BOLD + formattedText; + } + + if(obfuscated) + { + formattedText = ChatFormatting.OBFUSCATED + formattedText; + } + + if(color >= 0 && color < EnumColor.values().length) + { + formattedText = "\u00A7" + EnumColor.values()[color].getPrefix() + formattedText; + } + + return formattedText; + } + + public static String formatFinal(String text, Integer color, boolean obfuscated, boolean bold, boolean strikethrough, boolean underlined, boolean italic) + { + String formattedText = format(ChatFormatting.stripFormatting(text), color, obfuscated, bold, strikethrough, underlined, italic); + + if(!formattedText.equals(text)) + { + formattedText += ChatFormatting.RESET; + } + + return formattedText; + } + + public static String shortenString(String str, int maxWidth, FontRenderer fontRenderer) + { + return TextFormatting.shortenString(str, "", maxWidth, fontRenderer); + } + + public static String shortenString(String str, String prefix, int maxWidth, FontRenderer fontRenderer) + { + String display = prefix; + + if(fontRenderer.getStringWidth(prefix + str) > (maxWidth - fontRenderer.getStringWidth(prefix))) + { + for(int x = 0; x < str.length(); x++) + { + if(fontRenderer.getStringWidth(display + str.charAt(x) + "...") < maxWidth) + { + display += str.charAt(x); + } + else + { + display += "..."; + break; + } + } + } + else + { + display += str; + } + + return display; + } + + public static String getTotalTimePlayed(long tick) + { + int days = 0; + int hours = 0; + int minutes = 0; + int seconds = 0; + + seconds = (int) (tick / 20); + + if(seconds > 60) + { + int min = MathHelper.floor(seconds / 60); + seconds = seconds % 60; + minutes = min; + } + + if(minutes > 60) + { + int hrs = MathHelper.floor(minutes / 60); + minutes = minutes % 60; + hours = hrs; + } + + if(hours > 24) + { + int day = MathHelper.floor(hours / 24); + hours = hours % 24; + days = day; + } + + return String.format("%d:%02d:%02d:%02d", days, hours, minutes, seconds); + } + + public static int getHour(long tick) + { + int hour = MathHelper.floor((tick + 6000) / 1000F) % 24; + + return hour; + } + + public static int getMinute(long tick) + { + int hour = MathHelper.floor((tick + 6000F) / 1000F); + int minute = MathHelper.floor((tick + 6000F - hour * 1000) * 6 / 100); + + return minute; + } + + public static String getWorldTime(long tick) + { + int hour = TextFormatting.getHour(tick); + int minute = TextFormatting.getMinute(tick); + + return String.format("%02d:%02d", hour, minute); + } +} diff --git a/src/main/java/exopandora/worldhandler/format/text/ColoredString.java b/src/main/java/exopandora/worldhandler/format/text/ColoredString.java new file mode 100644 index 0000000..b4e74a9 --- /dev/null +++ b/src/main/java/exopandora/worldhandler/format/text/ColoredString.java @@ -0,0 +1,127 @@ +package exopandora.worldhandler.format.text; + +import com.mojang.realmsclient.gui.ChatFormatting; + +import exopandora.worldhandler.format.EnumColor; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public class ColoredString extends FormattedString +{ + private EnumColor color = EnumColor.DEFAULT; + private static final String EMPTY_STRING = "(\u00A7[a-f0-9k-or]?)*"; + + public ColoredString(String string) + { + this.text = string; + } + + public ColoredString() + { + this(""); + } + + public void setText(String string) + { + this.text = ChatFormatting.stripFormatting(string); + } + + public EnumColor getColor() + { + return this.color; + } + + public void setColor(EnumColor color) + { + this.color = color; + } + + public void setColor(int color) + { + this.color = EnumColor.getColorFromId(color); + } + + public boolean isSpecial() + { + if(this.text != null && !this.text.isEmpty()) + { + return this.toString().contains("\u00A7"); + } + + return false; + } + + private String getFormattedString(String string) + { + String result = string; + + if(result != null) + { + if(this.italic) + { + result = ChatFormatting.ITALIC + result; + } + + if(this.underlined) + { + result = ChatFormatting.UNDERLINE + result; + } + + if(this.strikethrough) + { + result = ChatFormatting.STRIKETHROUGH + result; + } + + if(this.bold) + { + result = ChatFormatting.BOLD + result; + } + + if(this.obfuscated) + { + result = ChatFormatting.OBFUSCATED + result; + } + + if(this.color != null && !this.color.equals(EnumColor.DEFAULT)) + { + result = this.color + result; + } + } + + return result; + } + + public String getTextFieldString() + { + if(this.text != null) + { + return this.getFormattedString(super.getPreformattedString(this.text)); + } + + return null; + } + + @Override + public String toString() + { + if(this.text != null) + { + String result = super.getPreformattedString(this.text); + + if(!result.matches(EMPTY_STRING)) + { + result = this.getFormattedString(result); + } + + if(result.contains("\u00A7")) + { + result += ChatFormatting.RESET; + } + + return result; + } + + return null; + } +} diff --git a/src/main/java/exopandora/worldhandler/format/text/FormattedString.java b/src/main/java/exopandora/worldhandler/format/text/FormattedString.java new file mode 100644 index 0000000..411f654 --- /dev/null +++ b/src/main/java/exopandora/worldhandler/format/text/FormattedString.java @@ -0,0 +1,86 @@ +package exopandora.worldhandler.format.text; + +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public abstract class FormattedString +{ + protected String text; + + protected boolean underlined; + protected boolean bold; + protected boolean italic; + protected boolean strikethrough; + protected boolean obfuscated; + + public String getText() + { + return this.text; + } + + public void setText(String string) + { + this.text = string; + } + + public boolean isUnderlined() + { + return this.underlined; + } + + public void setUnderlined(boolean underlined) + { + this.underlined = underlined; + } + + public boolean isBold() + { + return this.bold; + } + + public void setBold(boolean bold) + { + this.bold = bold; + } + + public boolean isItalic() + { + return this.italic; + } + + public void setItalic(boolean italic) + { + this.italic = italic; + } + + public boolean isStriked() + { + return this.strikethrough; + } + + public void setStriked(boolean striked) + { + this.strikethrough = striked; + } + + public boolean isObfuscated() + { + return this.obfuscated; + } + + public void setObfuscated(boolean obfuscated) + { + this.obfuscated = obfuscated; + } + + public static String getPreformattedString(String string) + { + if(string != null) + { + return string.replaceAll("\u0026", "\u00A7").replaceAll("\u00A7\u00A7", "\u0026"); + } + + return null; + } +} diff --git a/src/main/java/exopandora/worldhandler/format/text/JsonClickEvent.java b/src/main/java/exopandora/worldhandler/format/text/JsonClickEvent.java new file mode 100644 index 0000000..bc140b6 --- /dev/null +++ b/src/main/java/exopandora/worldhandler/format/text/JsonClickEvent.java @@ -0,0 +1,42 @@ +package exopandora.worldhandler.format.text; + +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public class JsonClickEvent +{ + private String action; + private String value; + + public JsonClickEvent() + { + this(null, null); + } + + public JsonClickEvent(String action, String value) + { + this.action = action; + this.value = value; + } + + public String getAction() + { + return this.action; + } + + public void setAction(String action) + { + this.action = action; + } + + public String getValue() + { + return this.value; + } + + public void setValue(String value) + { + this.value = value; + } +} diff --git a/src/main/java/exopandora/worldhandler/format/text/JsonSignLine.java b/src/main/java/exopandora/worldhandler/format/text/JsonSignLine.java new file mode 100644 index 0000000..929fce9 --- /dev/null +++ b/src/main/java/exopandora/worldhandler/format/text/JsonSignLine.java @@ -0,0 +1,47 @@ +package exopandora.worldhandler.format.text; + +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public class JsonSignLine extends FormattedString +{ + private String color; + private JsonClickEvent clickEvent; + + public JsonSignLine() + { + + } + + public JsonSignLine(ColoredString string) + { + this.text = super.getPreformattedString(string.getText()); + this.color = string.getColor().getFormat(); + this.bold = string.isBold(); + this.strikethrough = string.isStriked(); + this.underlined = string.isUnderlined(); + this.italic = string.isItalic(); + this.obfuscated = string.isObfuscated(); + } + + public JsonClickEvent getClickEvent() + { + return this.clickEvent; + } + + public void setClickEvent(JsonClickEvent clickEvent) + { + this.clickEvent = clickEvent; + } + + public String getColor() + { + return this.color; + } + + public void setColor(String color) + { + this.color = color; + } +} diff --git a/src/main/java/exopandora/worldhandler/format/text/JsonSignLineSerializer.java b/src/main/java/exopandora/worldhandler/format/text/JsonSignLineSerializer.java new file mode 100644 index 0000000..d318c1e --- /dev/null +++ b/src/main/java/exopandora/worldhandler/format/text/JsonSignLineSerializer.java @@ -0,0 +1,63 @@ +package exopandora.worldhandler.format.text; + +import java.lang.reflect.Type; + +import com.google.gson.Gson; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonSerializationContext; +import com.google.gson.JsonSerializer; + +import exopandora.worldhandler.format.EnumColor; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public class JsonSignLineSerializer implements JsonSerializer +{ + @Override + public JsonElement serialize(JsonSignLine src, Type typeOfSrc, JsonSerializationContext context) + { + JsonObject object = (JsonObject) new Gson().toJsonTree(src); + + if(src.getClickEvent() == null) + { + object.remove("clickEvent"); + } + + if(!src.isBold()) + { + object.remove("bold"); + } + + if(!src.isStriked()) + { + object.remove("strikethrough"); + } + + if(!src.isUnderlined()) + { + object.remove("underlined"); + } + + if(!src.isItalic()) + { + object.remove("italic"); + } + + if(!src.isObfuscated()) + { + object.remove("obfuscated"); + } + + if(src.getColor() != null) + { + if(src.getColor().equals(EnumColor.DEFAULT.getFormat())) + { + object.remove("color"); + } + } + + return object; + } +} diff --git a/src/main/java/exopandora/worldhandler/format/text/SignText.java b/src/main/java/exopandora/worldhandler/format/text/SignText.java new file mode 100644 index 0000000..65c32e5 --- /dev/null +++ b/src/main/java/exopandora/worldhandler/format/text/SignText.java @@ -0,0 +1,70 @@ +package exopandora.worldhandler.format.text; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; + +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public class SignText +{ + private static final Gson GSON = new GsonBuilder().registerTypeAdapter(JsonSignLine.class, new JsonSignLineSerializer()).create(); + + private ColoredString text = new ColoredString(); + private String command; + private final int line; + + public SignText(int line) + { + this.line = line; + } + + public int getLine() + { + return this.line; + } + + public ColoredString getColoredString() + { + return this.text; + } + + public void setColoredString(ColoredString coloredString) + { + this.text = coloredString; + } + + public String getCommand() + { + return this.command; + } + + public void setCommand(String command) + { + this.command = command; + } + + public boolean hasCommand() + { + return this.command != null && !this.command.isEmpty(); + } + + @Override + public String toString() + { + if(!this.text.isSpecial() && !this.hasCommand()) + { + return this.text.getText(); + } + + JsonSignLine line = new JsonSignLine(this.text); + + if(this.hasCommand()) + { + line.setClickEvent(new JsonClickEvent("run_command", FormattedString.getPreformattedString(this.command))); + } + + return GSON.toJson(line); + } +} diff --git a/src/main/java/exopandora/worldhandler/gui/button/EnumIcon.java b/src/main/java/exopandora/worldhandler/gui/button/EnumIcon.java new file mode 100644 index 0000000..331e063 --- /dev/null +++ b/src/main/java/exopandora/worldhandler/gui/button/EnumIcon.java @@ -0,0 +1,49 @@ +package exopandora.worldhandler.gui.button; + +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public enum EnumIcon +{ + WEATHER_SUN(0, 0), + WEATHER_RAIN(0, 1), + WEATHER_STORM(0, 2), + DIFFICULTY_PEACEFUL(1, 0), + DIFFICULTY_EASY(1, 1), + DIFFICULTY_NORMAL(1, 2), + DIFFICULTY_HARD(1, 3), + TIME_DAWN(2, 0), + TIME_NOON(2, 1), + TIME_SUNSET(2, 2), + TIME_MIDNIGHT(2, 3), + GAMEMODE_SURVIVAL(3, 0), + GAMEMODE_CREATIVE(3, 1), + GAMEMODE_ADVENTURE(3, 2), + GAMEMODE_SPECTATOR(3, 3), + BUTCHER(4, 0), + POTION(4, 1), + ACHIEVEMNTS(4, 2), + HOME(5, 0), + SETTINGS(5, 1), + RELOAD(5, 2); + + private int x; + private int y; + + private EnumIcon(int x, int y) + { + this.x = x; + this.y = y; + } + + public int getX() + { + return this.x; + } + + public int getY() + { + return this.y; + } +} diff --git a/src/main/java/exopandora/worldhandler/gui/button/EnumTooltip.java b/src/main/java/exopandora/worldhandler/gui/button/EnumTooltip.java new file mode 100644 index 0000000..39ea49d --- /dev/null +++ b/src/main/java/exopandora/worldhandler/gui/button/EnumTooltip.java @@ -0,0 +1,15 @@ +package exopandora.worldhandler.gui.button; + +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public enum EnumTooltip +{ + TOP_RIGHT, + TOP_LEFT, + BOTTOM_RIGHT, + BOTTOM_LEFT, + RIGHT, + LEFT +} diff --git a/src/main/java/exopandora/worldhandler/gui/button/GuiButtonItem.java b/src/main/java/exopandora/worldhandler/gui/button/GuiButtonItem.java new file mode 100644 index 0000000..d027b7d --- /dev/null +++ b/src/main/java/exopandora/worldhandler/gui/button/GuiButtonItem.java @@ -0,0 +1,46 @@ +package exopandora.worldhandler.gui.button; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.GlStateManager; +import net.minecraft.client.renderer.RenderHelper; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public class GuiButtonItem extends GuiButtonWorldHandler +{ + private final ItemStack item; + + public GuiButtonItem(int id, int x, int y, int width, int height, Item item) + { + this(id, x, y, width, height, new ItemStack(item)); + } + + public GuiButtonItem(int id, int x, int y, int width, int height, ItemStack item) + { + super(id, x, y, width, height, null); + this.item = item; + } + + @Override + public void drawButton(Minecraft minecraft, int mouseX, int mouseY, float partialTicks) + { + if(this.visible) + { + super.drawBackground(minecraft, mouseX, mouseY); + + GlStateManager.enableRescaleNormal(); + RenderHelper.enableGUIStandardItemLighting(); + + Minecraft.getMinecraft().getRenderItem().renderItemIntoGUI(this.item, this.x + this.width / 2 - 8, this.y + 2); + + RenderHelper.disableStandardItemLighting(); + GlStateManager.disableRescaleNormal(); + GlStateManager.disableBlend(); + + this.isActive = true; + } + } +} diff --git a/src/main/java/exopandora/worldhandler/gui/button/GuiButtonKeyboard.java b/src/main/java/exopandora/worldhandler/gui/button/GuiButtonKeyboard.java new file mode 100644 index 0000000..cd04ba4 --- /dev/null +++ b/src/main/java/exopandora/worldhandler/gui/button/GuiButtonKeyboard.java @@ -0,0 +1,172 @@ +package exopandora.worldhandler.gui.button; + +import org.lwjgl.input.Mouse; + +import exopandora.worldhandler.config.ConfigSkin; +import exopandora.worldhandler.gui.container.Container; +import exopandora.worldhandler.gui.content.Content; +import exopandora.worldhandler.main.Main; +import net.minecraft.client.Minecraft; +import net.minecraft.client.audio.PositionedSoundRecord; +import net.minecraft.client.audio.SoundHandler; +import net.minecraft.client.gui.FontRenderer; +import net.minecraft.client.renderer.GlStateManager; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.SoundEvent; +import net.minecraft.util.math.BlockPos; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public class GuiButtonKeyboard extends GuiButtonWorldHandler +{ + private static final ResourceLocation NOTE = new ResourceLocation(Main.MODID, "textures/misc/note.png"); + private final Orientation orientation; + private final float pitch; + + private boolean lastMousePressed; + + private final BlockPos pos; + private final SoundEvent sound; + private final Content content; + private final Container container; + + public GuiButtonKeyboard(int id, int x, int y, int width, int height, String displayString, Orientation orientation, float pitch, Container container, Content content, BlockPos pos, SoundEvent sound) + { + super(id, x, y, width, height, displayString); + this.orientation = orientation; + this.pitch = pitch; + this.pos = pos; + this.sound = sound; + this.content = content; + this.container = container; + } + + @Override + public void drawButton(Minecraft minecraft, int mouseX, int mouseY, float partialTicks) + { + if(this.visible) + { + FontRenderer fontRenderer = minecraft.fontRenderer; + GlStateManager.color(1.0F, 1.0F, 1.0F, (float) ConfigSkin.getButtonAlpha() / 255); + minecraft.renderEngine.bindTexture(NOTE); + + switch(this.orientation) + { + case LEFT: + this.hovered = this.isHoveringLeft(mouseX, mouseY); + break; + case NORMAL: + this.hovered = this.isHoveringNormal(mouseX, mouseY); + break; + case RIGHT: + this.hovered = this.isHoveringRight(mouseX, mouseY); + break; + case BLACK: + this.hovered = this.isHoveringBlack(mouseX, mouseY); + break; + default: + break; + } + + int hoverstate = this.getHoverState(this.hovered); + + switch(this.orientation) + { + case BLACK: + this.drawTexturedModalRect(this.x, this.y, 55 + hoverstate * -9 + 18, 0, 9, 58); + break; + case LEFT: + case NORMAL: + case RIGHT: + default: + int textColor = 0x000000; + + if(!this.enabled) + { + textColor = 0xA0A0A0; + } + else if(this.hovered) + { + textColor = 0x8B8B8B; + } + + this.drawTexturedModalRect(this.x, this.y, 25 + hoverstate * 15 - 15, 0, 15, 92); + fontRenderer.drawString(this.displayString, this.x + this.width / 2 - fontRenderer.getStringWidth(this.displayString) / 2, this.y + (this.height - 8) / 2 + 36, textColor); + break; + } + } + + this.mouseDragged(minecraft, mouseX, mouseY); + } + + private boolean isHoveringBlack(int mouseX, int mouseY) + { + return mouseX >= this.x && mouseY >= this.y && mouseX < this.x + this.width && mouseY < this.y + this.height; + } + + private boolean isHoveringLeft(int mouseX, int mouseY) + { + return (mouseX >= this.x && mouseY >= this.y && mouseX < this.x + 10 && mouseY < this.y + 60) || (mouseX >= this.x && mouseY >= this.y + 58 && mouseX < this.x + 14 && mouseY < this.y + 93); + } + + private boolean isHoveringNormal(int mouseX, int mouseY) + { + return (mouseX >= this.x + 4 && mouseY >= this.y && mouseX < this.x + 10 && mouseY < this.y + 60) || (mouseX >= this.x && mouseY >= this.y + 58 && mouseX < this.x + 14 && mouseY < this.y + 93); + } + + private boolean isHoveringRight(int mouseX, int mouseY) + { + return (mouseX >= this.x + 4 && mouseY >= this.y && mouseX < this.x + 14 && mouseY < this.y + 60) || (mouseX >= this.x && mouseY >= this.y + 58 && mouseX < this.x + 14 && mouseY < this.y + 93); + } + + @Override + public boolean mousePressed(Minecraft minecraft, int mouseX, int mouseY) + { + switch(this.orientation) + { + case LEFT: + return this.enabled && this.visible && this.isHoveringLeft(mouseX, mouseY); + case NORMAL: + return this.enabled && this.visible && this.isHoveringNormal(mouseX, mouseY); + case RIGHT: + return this.enabled && this.visible && this.isHoveringRight(mouseX, mouseY); + case BLACK: + return this.enabled && this.visible && this.isHoveringBlack(mouseX, mouseY); + default: + return false; + } + } + + @Override + protected void mouseDragged(Minecraft minecraft, int mouseX, int mouseY) + { + if(this.visible) + { + if(this.lastMousePressed != mousePressed(minecraft, mouseX, mouseY)) + { + if(mousePressed(minecraft, mouseX, mouseY) && Mouse.isButtonDown(0)) + { + this.playPressSound(minecraft.getSoundHandler()); + this.content.actionPerformed(this.container, this); + } + + this.lastMousePressed = mousePressed(minecraft, mouseX, mouseY); + } + } + } + + @Override + public void playPressSound(SoundHandler soundHandlerIn) + { + soundHandlerIn.playSound(PositionedSoundRecord.getMasterRecord(this.sound, this.pitch)); + } + + public static enum Orientation + { + LEFT, + NORMAL, + RIGHT, + BLACK; + } +} diff --git a/src/main/java/exopandora/worldhandler/gui/button/GuiButtonList.java b/src/main/java/exopandora/worldhandler/gui/button/GuiButtonList.java new file mode 100644 index 0000000..e8dd642 --- /dev/null +++ b/src/main/java/exopandora/worldhandler/gui/button/GuiButtonList.java @@ -0,0 +1,139 @@ +package exopandora.worldhandler.gui.button; + +import com.mojang.realmsclient.gui.ChatFormatting; + +import exopandora.worldhandler.format.TextFormatting; +import exopandora.worldhandler.gui.button.logic.IListButtonLogic; +import exopandora.worldhandler.gui.button.storage.ButtonStorage; +import exopandora.worldhandler.gui.container.Container; +import exopandora.worldhandler.gui.content.Content; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.FontRenderer; +import net.minecraft.client.gui.GuiButton; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public class GuiButtonList extends GuiButtonWorldHandler +{ + private final IListButtonLogic logic; + private final ButtonStorage storage; + private int mouseX; + private int mouseY; + + public GuiButtonList(int id, int x, int y, int width, int height, Content container, IListButtonLogic logic) + { + this(id, x, y, width, height, null, container, logic); + } + + public GuiButtonList(int id, int x, int y, int width, int height, EnumTooltip tooltipType, Content container, IListButtonLogic logic) + { + super(id, x, y, width, height, null, null, tooltipType); + this.logic = logic; + this.storage = container.getStorage(this.logic.getId()); + this.updateStorageObject(); + } + + @Override + public void drawButton(Minecraft minecraft, int mouseX, int mouseY, float partialTicks) + { + super.drawBackground(minecraft, mouseX, mouseY); + + if(this.visible) + { + FontRenderer fontRenderer = minecraft.fontRenderer; + + this.mouseX = mouseX; + this.mouseY = mouseY; + + this.displayString = this.logic.getDisplayString(this.storage); + + if(this.displayString != null && !this.displayString.isEmpty()) + { + String leftArrow = this.isHoveringLeft(mouseX, mouseY) ? ChatFormatting.BOLD + "<" + ChatFormatting.RESET : "<"; + String rightArrow = this.isHoveringRight(mouseX, mouseY) ? ChatFormatting.BOLD + ">" + ChatFormatting.RESET : ">"; + + int leftArrowWidth = fontRenderer.getStringWidth(leftArrow); + int rightArrowWidth = fontRenderer.getStringWidth(rightArrow); + + int maxWidth = Math.max(0, this.width - (fontRenderer.getStringWidth("< >"))); + int spaceWidth = fontRenderer.getCharWidth(' '); + + String display = TextFormatting.shortenString(this.displayString, maxWidth, fontRenderer); + int displayWidth = fontRenderer.getStringWidth(display); + int yPos = this.y + (this.height - 8) / 2; + + this.drawCenteredString(fontRenderer, display, this.x + this.width / 2, yPos, this.getTextColor()); + this.drawCenteredString(fontRenderer, leftArrow, this.x + this.width / 2 - maxWidth / 2 - spaceWidth, yPos, this.getTextColor()); + this.drawCenteredString(fontRenderer, rightArrow, this.x + this.width / 2 + maxWidth / 2 + spaceWidth, yPos, this.getTextColor()); + } + + this.isActive = true; + } + } + + @Override + public void drawTooltip(int mouseX, int mouseY, int width, int height) + { + if(this.tooltipType != null) + { + this.displayTooltip = this.logic.getTooltipString(this.storage); + } + + super.drawTooltip(mouseX, mouseY, width, height); + } + + private boolean isHoveringLeft(int mouseX, int mouseY) + { + return this.isHoveringVertical(mouseY) && mouseX >= this.x && mouseX < this.x + Math.ceil(this.width / 2); + } + + private boolean isHoveringRight(int mouseX, int mouseY) + { + return this.isHoveringVertical(mouseY) && mouseX >= this.x + Math.ceil(this.width / 2) && mouseX < this.x + this.width; + } + + private boolean isHoveringVertical(int mouseY) + { + return mouseY >= this.y && mouseY < this.y + this.height; + } + + public void actionPerformed(Container container, GuiButton button) + { + if(this.isHoveringLeft(this.mouseX, this.mouseY)) + { + if(this.storage.getIndex() > 0) + { + this.storage.decrementIndex(); + } + else + { + this.storage.setIndex(this.logic.getMax() - 1); + } + } + else if(this.isHoveringRight(this.mouseX, this.mouseY)) + { + if(this.storage.getIndex() < this.logic.getMax() - 1) + { + this.storage.incrementIndex(); + } + else + { + this.storage.setIndex(0); + } + } + + this.updateStorageObject(); + this.logic.actionPerformed(container, button, this.storage); + } + + private void updateStorageObject() + { + this.storage.setObject(this.logic.getObject(this.storage.getIndex())); + } + + public IListButtonLogic getLogic() + { + return this.logic; + } +} diff --git a/src/main/java/exopandora/worldhandler/gui/button/GuiButtonTab.java b/src/main/java/exopandora/worldhandler/gui/button/GuiButtonTab.java new file mode 100644 index 0000000..2dbf089 --- /dev/null +++ b/src/main/java/exopandora/worldhandler/gui/button/GuiButtonTab.java @@ -0,0 +1,36 @@ +package exopandora.worldhandler.gui.button; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.audio.SoundHandler; +import net.minecraft.client.gui.GuiButton; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public class GuiButtonTab extends GuiButton +{ + private final int index; + + public GuiButtonTab(int buttonId, int x, int y, int widthIn, int heightIn, int index) + { + super(buttonId, x, y, widthIn, heightIn, null); + this.index = index; + } + + @Override + public void drawButton(Minecraft minecraft, int mouseX, int mouseY, float partialTicks) + { + + } + + @Override + public void playPressSound(SoundHandler soundHandlerIn) + { + + } + + public int getIndex() + { + return this.index; + } +} diff --git a/src/main/java/exopandora/worldhandler/gui/button/GuiButtonWorldHandler.java b/src/main/java/exopandora/worldhandler/gui/button/GuiButtonWorldHandler.java new file mode 100644 index 0000000..07bc4c3 --- /dev/null +++ b/src/main/java/exopandora/worldhandler/gui/button/GuiButtonWorldHandler.java @@ -0,0 +1,219 @@ +package exopandora.worldhandler.gui.button; + +import exopandora.worldhandler.config.ConfigSkin; +import exopandora.worldhandler.helper.ResourceHelper; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.FontRenderer; +import net.minecraft.client.gui.GuiButton; +import net.minecraft.client.renderer.GlStateManager; +import net.minecraftforge.fml.client.config.GuiUtils; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public class GuiButtonWorldHandler extends GuiButton +{ + protected String displayTooltip; + protected EnumTooltip tooltipType; + protected EnumIcon icon; + protected boolean isActive; + + public GuiButtonWorldHandler(int id, int x, int y, int width, int height, String displayString) + { + this(id, x, y, width, height, displayString, null, null); + } + + public GuiButtonWorldHandler(int id, int x, int y, int width, int height, String displayString, String tooltip, EnumTooltip tooltipType) + { + this(id, x, y, width, height, displayString, tooltip, tooltipType, null); + } + + public GuiButtonWorldHandler(int id, int x, int y, int width, int height, String displayString, EnumIcon icon) + { + this(id, x, y, width, height, displayString, null, null, icon); + } + + public GuiButtonWorldHandler(int id, int x, int y, int width, int height, String displayString, String tooltip, EnumTooltip tooltipType, EnumIcon icon) + { + super(id, x, y, width, height, displayString); + this.displayTooltip = tooltip; + this.tooltipType = tooltipType; + this.icon = icon; + } + + @Override + public void drawButton(Minecraft minecraft, int mouseX, int mouseY, float partialTicks) + { + if(this.visible) + { + this.drawBackground(minecraft, mouseX, mouseY); + this.drawCenteredString(minecraft.fontRenderer, this.displayString, this.x + this.width / 2, this.y + (this.height - 8) / 2, this.getTextColor()); + + if(this.icon != null) + { + this.drawIcons(); + } + + this.isActive = true; + } + } + + protected int getTextColor() + { + int textColor = 0xE0E0E0; + + if(!this.enabled) + { + textColor = 0xA0A0A0; + } + else if(this.hovered) + { + textColor = 0xFFFFA0; + } + + return textColor; + } + + protected void drawBackground(Minecraft minecraft, int mouseX, int mouseY) + { + GlStateManager.enableBlend(); + GlStateManager.color((float) ConfigSkin.getButtonRed() / 255, (float) ConfigSkin.getButtonGreen() / 255, (float) ConfigSkin.getButtonBlue() / 255, (float) ConfigSkin.getButtonAlpha() / 255); + + this.hovered = mouseX >= this.x && mouseY >= this.y && mouseX < this.x + this.width && mouseY < this.y + this.height; + int hovered = this.getHoverState(this.hovered); + + Minecraft.getMinecraft().renderEngine.bindTexture(ResourceHelper.getButtonTexture()); + + if(ConfigSkin.getTextureType().equals("resourcepack")) + { + this.drawTexturedModalRect(this.x, this.y, 0, 46 + hovered * 20, this.width / 2, this.height); + this.drawTexturedModalRect(this.x + this.width / 2, this.y, 200 - this.width / 2, 46 + hovered * 20, this.width / 2, this.height); + } + else + { + this.drawTexturedModalRect(this.x, this.y, 0, hovered * 20, this.width / 2, this.height); + this.drawTexturedModalRect(this.x + this.width / 2, this.y, 200 - this.width / 2, hovered * 20, this.width / 2, this.height); + } + + GlStateManager.disableBlend(); + GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F); + } + + public void drawTooltip(int mouseX, int mouseY, int width, int height) + { + if(this.hovered && this.displayTooltip != null) + { + int tooltipWidth = Minecraft.getMinecraft().fontRenderer.getStringWidth(this.displayTooltip) + 9; + int xOffset = 12; + int yOffset = 12; + boolean right = mouseX + xOffset + tooltipWidth > width; + boolean left = mouseX > tooltipWidth + xOffset; + + switch(this.tooltipType) + { + case TOP_RIGHT: + this.renderTooltip(mouseX, mouseY, xOffset, -yOffset, right); + break; + case TOP_LEFT: + this.renderTooltip(mouseX, mouseY, xOffset, -yOffset, left); + break; + case BOTTOM_RIGHT: + this.renderTooltip(mouseX, mouseY, xOffset, yOffset, right); + break; + case BOTTOM_LEFT: + this.renderTooltip(mouseX, mouseY, xOffset, yOffset, left); + break; + case RIGHT: + this.renderTooltip(mouseX, mouseY, xOffset, 0, right); + break; + case LEFT: + this.renderTooltip(mouseX, mouseY, xOffset, 0, left); + break; + default: + break; + } + } + } + + protected void renderTooltip(int mouseX, int mouseY, int xOffset, int yOffset, boolean left) + { + FontRenderer fontRenderer = Minecraft.getMinecraft().fontRenderer; + + GlStateManager.disableDepth(); + + String[] text = this.displayTooltip.split("\n"); + + int tooltipTextWidth = 0; + int tooltipX = mouseX + xOffset; + int tooltipY = mouseY + yOffset; + + for(String line : text) + { + int length = fontRenderer.getStringWidth(line) + 1; + + if(length > tooltipTextWidth) + { + tooltipTextWidth = length; + } + } + + if(left) + { + tooltipX = mouseX - xOffset - tooltipTextWidth; + } + + int tooltipHeight = fontRenderer.FONT_HEIGHT * text.length; + int backgroundColor = 0xF0100010; + int borderColorStart = 0x505000FF; + int borderColorEnd = (borderColorStart & 0xFEFEFE) >> 1 | borderColorStart & 0xFF000000; + + int zLevel = 300; + + GuiUtils.drawGradientRect(zLevel, tooltipX - 3, tooltipY - 4, tooltipX + tooltipTextWidth + 3, tooltipY - 3, backgroundColor, backgroundColor); + GuiUtils.drawGradientRect(zLevel, tooltipX - 3, tooltipY + tooltipHeight + 3, tooltipX + tooltipTextWidth + 3, tooltipY + tooltipHeight + 4, backgroundColor, backgroundColor); + GuiUtils.drawGradientRect(zLevel, tooltipX - 3, tooltipY - 3, tooltipX + tooltipTextWidth + 3, tooltipY + tooltipHeight + 3, backgroundColor, backgroundColor); + GuiUtils.drawGradientRect(zLevel, tooltipX - 4, tooltipY - 3, tooltipX - 3, tooltipY + tooltipHeight + 3, backgroundColor, backgroundColor); + GuiUtils.drawGradientRect(zLevel, tooltipX + tooltipTextWidth + 3, tooltipY - 3, tooltipX + tooltipTextWidth + 4, tooltipY + tooltipHeight + 3, backgroundColor, backgroundColor); + + GuiUtils.drawGradientRect(zLevel, tooltipX - 3, tooltipY - 3 + 1, tooltipX - 3 + 1, tooltipY + tooltipHeight + 3 - 1, borderColorStart, borderColorEnd); + GuiUtils.drawGradientRect(zLevel, tooltipX + tooltipTextWidth + 2, tooltipY - 3 + 1, tooltipX + tooltipTextWidth + 3, tooltipY + tooltipHeight + 3 - 1, borderColorStart, borderColorEnd); + GuiUtils.drawGradientRect(zLevel, tooltipX - 3, tooltipY - 3, tooltipX + tooltipTextWidth + 3, tooltipY - 3 + 1, borderColorStart, borderColorStart); + GuiUtils.drawGradientRect(zLevel, tooltipX - 3, tooltipY + tooltipHeight + 2, tooltipX + tooltipTextWidth + 3, tooltipY + tooltipHeight + 3, borderColorEnd, borderColorEnd); + + for(int x = 0; x < text.length; x++) + { + fontRenderer.drawStringWithShadow(text[x], tooltipX + 1, tooltipY + 1 + fontRenderer.FONT_HEIGHT * x, -1); + } + + GlStateManager.enableDepth(); + } + + protected void drawIcons() + { + Minecraft.getMinecraft().renderEngine.bindTexture(ResourceHelper.getIconTexture()); + + if(this.enabled == true) + { + if(this.hovered) + { + GlStateManager.color(1.0F, 1.0F, 0.6F, 1.0F); + } + else + { + GlStateManager.color(0.95F, 0.95F, 0.95F, 1.0F); + } + } + else + { + GlStateManager.color(0.8F, 0.8F, 0.8F, 1.0F); + } + + this.drawTexturedModalRect(this.x + this.width / 2 - 4, this.y + 6, this.icon.getX() * 8, this.icon.getY() * 8, 8, 8); + } + + @Override + public boolean mousePressed(Minecraft mc, int mouseX, int mouseY) + { + return super.mousePressed(mc, mouseX, mouseY) && this.isActive; + } +} diff --git a/src/main/java/exopandora/worldhandler/gui/button/GuiSlider.java b/src/main/java/exopandora/worldhandler/gui/button/GuiSlider.java new file mode 100644 index 0000000..a94f4b3 --- /dev/null +++ b/src/main/java/exopandora/worldhandler/gui/button/GuiSlider.java @@ -0,0 +1,189 @@ +package exopandora.worldhandler.gui.button; + +import exopandora.worldhandler.config.ConfigSkin; +import exopandora.worldhandler.gui.button.logic.ISliderResponder; +import exopandora.worldhandler.gui.button.storage.ButtonStorage; +import exopandora.worldhandler.gui.button.storage.SliderStorage; +import exopandora.worldhandler.gui.container.Container; +import exopandora.worldhandler.gui.content.Content; +import exopandora.worldhandler.helper.ResourceHelper; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiButton; +import net.minecraft.client.renderer.GlStateManager; +import net.minecraft.client.resources.I18n; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public class GuiSlider extends GuiButton +{ + private boolean isMouseDown; + private boolean isActive; + + private final Object key; + private final String name; + private final ISliderResponder responder; + private final Container frame; + private final ButtonStorage storage; + + public GuiSlider(Content container, Container frame, Object key, int x, int y, int width, int height, String name, float min, float max, float start, ISliderResponder responder) + { + super(Integer.MAX_VALUE, x, y, width, height, null); + this.frame = frame; + this.key = key; + this.name = name; + this.responder = responder; + this.storage = container.getStorage(key); + + if(this.storage.getObject() == null || this.storage.getObject().getMin() != min || this.storage.getObject().getMax() != max) + { + this.storage.setObject(new SliderStorage(min, max, min == max ? 0 : ((start - min) / (max - min)))); + } + + this.displayString = this.getDisplayString(); + } + + private void setFloat(float value) + { + this.storage.getObject().setFloat(value); + } + + private float getFloat() + { + return this.storage.getObject().getFloat(); + } + + private void setValue(int value) + { + SliderStorage slider = this.storage.getObject(); + this.storage.getObject().setFloat((value - slider.getMin()) / (slider.getMax() - slider.getMin())); + } + + private int getValue() + { + SliderStorage slider = this.storage.getObject(); + return (int) (slider.getMin() + (slider.getMax() - slider.getMin()) * this.getFloat()); + } + + private String getDisplayString() + { + return this.responder.getText(this.key, I18n.format(this.name), this.getValue()); + } + + @Override + protected int getHoverState(boolean mouseOver) + { + return 0; + } + + @Override + public void drawButton(Minecraft minecraft, int mouseX, int mouseY, float partialTicks) + { + this.hovered = mouseX >= this.x && mouseY >= this.y && mouseX < this.x + this.width && mouseY < this.y + this.height; + + GlStateManager.pushMatrix(); + GlStateManager.enableBlend(); + GlStateManager.color((float) ConfigSkin.getButtonRed() / 255, (float) ConfigSkin.getButtonGreen() / 255, (float) ConfigSkin.getButtonBlue() / 255, (float) ConfigSkin.getButtonAlpha() / 255); + + Minecraft.getMinecraft().renderEngine.bindTexture(ResourceHelper.getButtonTexture()); + + if(ConfigSkin.getTextureType().equals("resourcepack")) + { + this.drawTexturedModalRect(this.x, this.y, 0, 46, this.width / 2, this.height); + this.drawTexturedModalRect(this.x + this.width / 2, this.y, 200 - this.width / 2, 46, this.width / 2, this.height); + } + else + { + this.drawTexturedModalRect(this.x, this.y, 0, 0, this.width / 2, this.height); + this.drawTexturedModalRect(this.x + this.width / 2, this.y, 200 - this.width / 2, 0, this.width / 2, this.height); + } + + GlStateManager.disableBlend(); + GlStateManager.popMatrix(); + + this.mouseDragged(minecraft, mouseX, mouseY); + } + + private void update(int mouseX, int mouseY) + { + float sliderValue = (float) (mouseX - (this.x + 4)) / (float) (this.width - 8); + + if(sliderValue < 0.0F) + { + sliderValue = 0.0F; + } + + if(sliderValue > 1.0F) + { + sliderValue = 1.0F; + } + + this.setFloat(sliderValue); + this.displayString = this.getDisplayString(); + this.responder.setValue(this.key, this.getValue()); + } + + @Override + public void mouseDragged(Minecraft mc, int mouseX, int mouseY) + { + if(this.visible) + { + if(this.isMouseDown) + { + this.update(mouseX, mouseY); + } + + int textureXOffset = ConfigSkin.getTextureType().equals("resourcepack") ? 0 : -46; + + GlStateManager.pushMatrix(); + GlStateManager.enableBlend(); + GlStateManager.color((float) ConfigSkin.getButtonRed() / 255, (float) ConfigSkin.getButtonGreen() / 255, (float) ConfigSkin.getButtonBlue() / 255, (float) ConfigSkin.getButtonAlpha() / 255); + + this.drawTexturedModalRect(this.x + (int) (this.getFloat() * (float) (this.width - 8)), this.y, 0, 66 + textureXOffset, 4, 20); + this.drawTexturedModalRect(this.x + (int) (this.getFloat() * (float) (this.width - 8)) + 4, this.y, 196, 66 + textureXOffset, 4, 20); + + GlStateManager.disableBlend(); + GlStateManager.popMatrix(); + + int color = 0xE0E0E0; + + if(!this.enabled) + { + color = 0xA0A0A0; + } + else if(this.hovered) + { + color = 0xFFFFA0; + } + + this.drawCenteredString(mc.fontRenderer, this.displayString, this.x + this.width / 2, this.y + (this.height - 8) / 2, color); + } + + this.isActive = true; + } + + @Override + public boolean mousePressed(Minecraft mc, int mouseX, int mouseY) + { + if(super.mousePressed(mc, mouseX, mouseY) && this.isActive) + { + this.update(mouseX, mouseY); + this.isMouseDown = true; + + return true; + } + + return false; + } + + @Override + public void mouseReleased(int mouseX, int mouseY) + { + this.isMouseDown = false; + + if(this.frame != null) + { + this.frame.initGui(); + } + } +} \ No newline at end of file diff --git a/src/main/java/exopandora/worldhandler/gui/button/GuiTextFieldTooltip.java b/src/main/java/exopandora/worldhandler/gui/button/GuiTextFieldTooltip.java new file mode 100644 index 0000000..358437c --- /dev/null +++ b/src/main/java/exopandora/worldhandler/gui/button/GuiTextFieldTooltip.java @@ -0,0 +1,261 @@ +package exopandora.worldhandler.gui.button; + +import com.google.common.base.Predicate; +import com.mojang.realmsclient.gui.ChatFormatting; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiPageButtonList; +import net.minecraft.client.gui.GuiTextField; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public class GuiTextFieldTooltip +{ + private GuiTextField textfield; + private String display; + + public GuiTextFieldTooltip(int x, int y, int width, int height, String display) + { + this.textfield = new GuiTextField(0, Minecraft.getMinecraft().fontRenderer, x, y, width, height); + this.textfield.setMaxStringLength(Integer.MAX_VALUE); + this.display = display; + } + + public GuiTextFieldTooltip(int x, int y, int width, int height) + { + this(x, y, width, height, null); + } + + public void setGuiResponder(GuiPageButtonList.GuiResponder responder) + { + this.textfield.setGuiResponder(responder); + } + + public void updateCursorCounter() + { + this.textfield.updateCursorCounter(); + } + + public void setText(String text) + { + this.textfield.setText(text); + } + + public String getText() + { + return this.textfield.getText(); + } + + public boolean isEmpty() + { + if(this.textfield.getText() != null) + { + return this.textfield.getText().matches("(\u00A7[a-f0-9k-or])+"); + } + + return true; + } + + public boolean canType(char charTyped) + { + return (!this.isEmpty() || charTyped != '\b') && this.textfield.isFocused(); + } + + public String getSelectedText() + { + return this.textfield.getSelectedText(); + } + + public void setValidator(Predicate validator) + { + this.textfield.setValidator(validator);; + } + + public void writeText(String text) + { + this.textfield.writeText(text); + } + + public void deleteWords(int num) + { + this.textfield.deleteWords(num); + } + + public void deleteFromCursor(int num) + { + this.textfield.deleteFromCursor(num); + } + + public int getId() + { + return this.textfield.getId(); + } + + public int getNthWordFromCursor(int numWords) + { + return this.textfield.getNthWordFromCursor(numWords); + } + + public int getNthWordFromPos(int n, int pos) + { + return this.textfield.getNthWordFromPos(n, pos); + } + + public int getNthWordFromPosWS(int n, int pos, boolean skipWs) + { + return this.textfield.getNthWordFromPosWS(n, pos, skipWs); + } + + public void moveCursorBy(int num) + { + this.textfield.moveCursorBy(num); + } + + public void setCursorPosition(int pos) + { + this.textfield.setCursorPosition(pos); + } + + public void setCursorPositionZero() + { + this.textfield.setCursorPositionZero(); + } + + public void setCursorPositionEnd() + { + this.textfield.setCursorPositionEnd(); + } + + public boolean textboxKeyTyped(char typedChar, int keyCode) + { + return this.textfield.textboxKeyTyped(typedChar, keyCode); + } + + public void mouseClicked(int mouseX, int mouseY, int mouseButton) + { + this.textfield.mouseClicked(mouseX, mouseY, mouseButton); + } + + public void drawTextBox() + { + this.textfield.drawTextBox(); + + if(this.textfield.getVisible()) + { + int x = this.textfield.getEnableBackgroundDrawing() ? this.textfield.x + 4 : this.textfield.x; + int y = this.textfield.getEnableBackgroundDrawing() ? this.textfield.y + (this.textfield.height - 8) / 2 : this.textfield.y; + + if(ChatFormatting.stripFormatting(this.textfield.getText()).isEmpty() && !this.textfield.isFocused() && this.display != null) + { + Minecraft.getMinecraft().fontRenderer.drawStringWithShadow(this.display, (float) x, (float) y, 0x7F7F7F); + } + } + } + + public void setMaxStringLength(int length) + { + this.textfield.setMaxStringLength(length); + } + + public int getMaxStringLength() + { + return this.textfield.getMaxStringLength(); + } + + public int getCursorPosition() + { + return this.textfield.getCursorPosition(); + } + + public boolean getEnableBackgroundDrawing() + { + return this.textfield.getEnableBackgroundDrawing(); + } + + public void setEnableBackgroundDrawing(boolean enableBackgroundDrawing) + { + this.textfield.setEnableBackgroundDrawing(enableBackgroundDrawing); + } + + public void setTextColor(int color) + { + this.textfield.setTextColor(color); + } + + public void setDisabledTextColour(int color) + { + this.textfield.setDisabledTextColour(color); + } + + public void setFocused(boolean focused) + { + this.textfield.setFocused(focused); + } + + public boolean isFocused() + { + return this.textfield.isFocused(); + } + + public void setEnabled(boolean enabled) + { + this.textfield.setEnabled(enabled); + } + + public int getSelectionEnd() + { + return this.textfield.getSelectionEnd(); + } + + public int getWidth() + { + return this.textfield.getWidth(); + } + + public void setSelectionPos(int position) + { + this.textfield.setSelectionPos(position); + } + + public void setCanLoseFocus(boolean canLoseFocus) + { + this.textfield.setCanLoseFocus(canLoseFocus); + } + + public boolean getVisible() + { + return this.textfield.getVisible(); + } + + public void setVisible(boolean visible) + { + this.textfield.setVisible(visible); + } + + public void setDisplay(String display) + { + this.display = display; + } + + public String getDisplay() + { + return this.display; + } + + public void setPosition(int x, int y) + { + this.textfield.x = x; + this.textfield.y = y; + } + + public void setWidth(int width) + { + this.textfield.width = width; + } + + public void setHeight(int height) + { + this.textfield.height = height; + } +} diff --git a/src/main/java/exopandora/worldhandler/gui/button/logic/ColorListButtonLogic.java b/src/main/java/exopandora/worldhandler/gui/button/logic/ColorListButtonLogic.java new file mode 100644 index 0000000..3711650 --- /dev/null +++ b/src/main/java/exopandora/worldhandler/gui/button/logic/ColorListButtonLogic.java @@ -0,0 +1,46 @@ +package exopandora.worldhandler.gui.button.logic; + +import java.util.Arrays; + +import com.mojang.realmsclient.gui.ChatFormatting; + +import exopandora.worldhandler.format.EnumColor; +import exopandora.worldhandler.gui.button.storage.ButtonStorage; +import net.minecraft.client.resources.I18n; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public abstract class ColorListButtonLogic implements IListButtonLogic +{ + @Override + public final int getMax() + { + return (int) Arrays.stream(ChatFormatting.values()).filter(ChatFormatting::isColor).count(); + } + + @Override + public Integer getObject(int index) + { + return index; + } + + @Override + public String getTooltipString(ButtonStorage storage) + { + return null; + } + + @Override + public String getDisplayString(ButtonStorage storage) + { + EnumColor color = EnumColor.getColorFromId(storage.getIndex()); + return color + I18n.format("gui.worldhandler.color") + ": " + I18n.format("gui.worldhandler.color." + color.getFormat()); + } + + @Override + public String getId() + { + return "color"; + } +} diff --git a/src/main/java/exopandora/worldhandler/gui/button/logic/IListButtonLogic.java b/src/main/java/exopandora/worldhandler/gui/button/logic/IListButtonLogic.java new file mode 100644 index 0000000..a5e1db4 --- /dev/null +++ b/src/main/java/exopandora/worldhandler/gui/button/logic/IListButtonLogic.java @@ -0,0 +1,31 @@ +package exopandora.worldhandler.gui.button.logic; + +import exopandora.worldhandler.gui.button.storage.ButtonStorage; +import exopandora.worldhandler.gui.container.Container; +import net.minecraft.client.gui.GuiButton; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public interface IListButtonLogic +{ + void actionPerformed(Container container, GuiButton button, ButtonStorage storage); + + int getMax(); + + T getObject(int index); + + String getDisplayString(ButtonStorage storage); + + default String getTooltipString(ButtonStorage storage) + { + if(storage != null && storage.getObject() != null) + { + return storage.getObject().toString() + " (" + (storage.getIndex() + 1) + "/" + this.getMax() + ")"; + } + + return null; + } + + String getId(); +} diff --git a/src/main/java/exopandora/worldhandler/gui/button/logic/ISliderResponder.java b/src/main/java/exopandora/worldhandler/gui/button/logic/ISliderResponder.java new file mode 100644 index 0000000..17f8754 --- /dev/null +++ b/src/main/java/exopandora/worldhandler/gui/button/logic/ISliderResponder.java @@ -0,0 +1,11 @@ +package exopandora.worldhandler.gui.button.logic; + +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public interface ISliderResponder +{ + void setValue(Object id, int value); + String getText(Object id, String format, int value); +} \ No newline at end of file diff --git a/src/main/java/exopandora/worldhandler/gui/button/responder/AttributeResponder.java b/src/main/java/exopandora/worldhandler/gui/button/responder/AttributeResponder.java new file mode 100644 index 0000000..8b8a7a7 --- /dev/null +++ b/src/main/java/exopandora/worldhandler/gui/button/responder/AttributeResponder.java @@ -0,0 +1,27 @@ +package exopandora.worldhandler.gui.button.responder; + +import java.util.function.Consumer; + +import exopandora.worldhandler.builder.impl.abstr.EnumAttributes; +import exopandora.worldhandler.format.TextFormatting; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.FontRenderer; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public class AttributeResponder extends SimpleResponder +{ + public AttributeResponder(Consumer valueConsumer) + { + super(valueConsumer); + } + + @Override + public String getText(Object id, String format, int value) + { + String suffix = ": " + value + " " + ((EnumAttributes) id).getOperation().getDeclaration(); + FontRenderer fontRenderer = Minecraft.getMinecraft().fontRenderer; + return TextFormatting.shortenString(format, 114 - fontRenderer.getStringWidth(suffix), fontRenderer) + suffix; + } +} diff --git a/src/main/java/exopandora/worldhandler/gui/button/responder/SimpleResponder.java b/src/main/java/exopandora/worldhandler/gui/button/responder/SimpleResponder.java new file mode 100644 index 0000000..76bd6e5 --- /dev/null +++ b/src/main/java/exopandora/worldhandler/gui/button/responder/SimpleResponder.java @@ -0,0 +1,35 @@ +package exopandora.worldhandler.gui.button.responder; + +import java.util.function.Consumer; + +import exopandora.worldhandler.format.TextFormatting; +import exopandora.worldhandler.gui.button.logic.ISliderResponder; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.FontRenderer; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public class SimpleResponder implements ISliderResponder +{ + private final Consumer valueConsumer; + + public SimpleResponder(Consumer valueConsumer) + { + this.valueConsumer = valueConsumer; + } + + @Override + public void setValue(Object id, int value) + { + this.valueConsumer.accept(value); + } + + @Override + public String getText(Object id, String format, int value) + { + String suffix = ": " + value; + FontRenderer fontRenderer = Minecraft.getMinecraft().fontRenderer; + return TextFormatting.shortenString(format, 114 - fontRenderer.getStringWidth(suffix), fontRenderer) + suffix; + } +} diff --git a/src/main/java/exopandora/worldhandler/gui/button/storage/ButtonStorage.java b/src/main/java/exopandora/worldhandler/gui/button/storage/ButtonStorage.java new file mode 100644 index 0000000..b8a6dc6 --- /dev/null +++ b/src/main/java/exopandora/worldhandler/gui/button/storage/ButtonStorage.java @@ -0,0 +1,41 @@ +package exopandora.worldhandler.gui.button.storage; + +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public class ButtonStorage +{ + private int index; + private T object; + + public void setIndex(int index) + { + this.index = index; + } + + public int getIndex() + { + return this.index; + } + + public void incrementIndex() + { + this.index++; + } + + public void decrementIndex() + { + this.index--; + } + + public T getObject() + { + return this.object; + } + + public void setObject(T object) + { + this.object = object; + } +} diff --git a/src/main/java/exopandora/worldhandler/gui/button/storage/SliderStorage.java b/src/main/java/exopandora/worldhandler/gui/button/storage/SliderStorage.java new file mode 100644 index 0000000..6650beb --- /dev/null +++ b/src/main/java/exopandora/worldhandler/gui/button/storage/SliderStorage.java @@ -0,0 +1,39 @@ +package exopandora.worldhandler.gui.button.storage; + +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public class SliderStorage +{ + private final float min; + private final float max; + private float value; + + public SliderStorage(float min, float max, float value) + { + this.min = min; + this.max = max; + this.value = value; + } + + public float getMin() + { + return this.min; + } + + public float getMax() + { + return this.max; + } + + public float getFloat() + { + return this.value; + } + + public void setFloat(float value) + { + this.value = value; + } +} \ No newline at end of file diff --git a/src/main/java/exopandora/worldhandler/gui/category/Categories.java b/src/main/java/exopandora/worldhandler/gui/category/Categories.java new file mode 100644 index 0000000..d209df7 --- /dev/null +++ b/src/main/java/exopandora/worldhandler/gui/category/Categories.java @@ -0,0 +1,41 @@ +package exopandora.worldhandler.gui.category; + +import exopandora.worldhandler.main.Main; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public class Categories +{ + public static final Category MAIN; + public static final Category ENTITIES; + public static final Category ITEMS; + public static final Category BLOCKS; + public static final Category WORLD; + public static final Category PLAYER; + public static final Category SCOREBOARD; + + static + { + MAIN = Categories.getRegisteredCategory("main"); + ENTITIES = Categories.getRegisteredCategory("entities"); + ITEMS = Categories.getRegisteredCategory("items"); + BLOCKS = Categories.getRegisteredCategory("blocks"); + WORLD = Categories.getRegisteredCategory("world"); + PLAYER = Categories.getRegisteredCategory("player"); + SCOREBOARD = Categories.getRegisteredCategory("scoreboard"); + } + + private static Category getRegisteredCategory(String name) + { + Category category = Category.REGISTRY.getObject(new ResourceLocation(Main.MODID, name)); + + if(category == null) + { + throw new IllegalStateException("Invalid Category requested: " + name); + } + + return category; + } +} diff --git a/src/main/java/exopandora/worldhandler/gui/category/Category.java b/src/main/java/exopandora/worldhandler/gui/category/Category.java new file mode 100644 index 0000000..9c7338a --- /dev/null +++ b/src/main/java/exopandora/worldhandler/gui/category/Category.java @@ -0,0 +1,81 @@ +package exopandora.worldhandler.gui.category; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import javax.annotation.Nullable; + +import exopandora.worldhandler.gui.content.Content; +import exopandora.worldhandler.gui.content.Contents; +import exopandora.worldhandler.main.Main; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.registry.RegistryNamespaced; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public class Category +{ + public static final RegistryNamespaced REGISTRY = new RegistryNamespaced(); + + private final List contents; + + public Category() + { + this.contents = new ArrayList(); + } + + public Category(List contents) + { + this.contents = contents; + } + + public Category(Content... contents) + { + this.contents = Arrays.asList(contents); + } + + public Category add(Content content) + { + this.contents.add(content); + return this; + } + + public List getContents() + { + return this.contents; + } + + public int getSize() + { + return this.contents.size(); + } + + @Nullable + public Content getContent(int index) + { + return this.contents.get(index); + } + + public static void registerCategories() + { + registerCategory(0, "main", new Category(Contents.MAIN, Contents.CONTAINERS, Contents.MULTIPLAYER)); + registerCategory(1, "entities", new Category(Contents.SUMMON)); + registerCategory(2, "items", new Category(Contents.CUSTOM_ITEM, Contents.ENCHANTMENT)); + registerCategory(3, "blocks", new Category(Contents.EDIT_BLOCKS, Contents.SIGN_EDITOR, Contents.NOTE_EDITOR)); + registerCategory(4, "world", new Category(Contents.WORLD_INFO, Contents.GAMERULES)); + registerCategory(5, "player", new Category(Contents.PLAYER, Contents.EXPERIENCE, Contents.ADVANCEMENTS)); + registerCategory(6, "scoreboard", new Category(Contents.SCOREBOARD_OBJECTIVES, Contents.SCOREBOARD_TEAMS, Contents.SCOREBOARD_PLAYERS)); + } + + private static void registerCategory(int id, String textualID, Category category) + { + registerCategory(id, new ResourceLocation(Main.MODID, textualID), category); + } + + private static void registerCategory(int id, ResourceLocation textualID, Category category) + { + REGISTRY.register(id, textualID, category); + } +} diff --git a/src/main/java/exopandora/worldhandler/gui/config/GuiConfigWorldHandler.java b/src/main/java/exopandora/worldhandler/gui/config/GuiConfigWorldHandler.java new file mode 100644 index 0000000..cb72774 --- /dev/null +++ b/src/main/java/exopandora/worldhandler/gui/config/GuiConfigWorldHandler.java @@ -0,0 +1,54 @@ +package exopandora.worldhandler.gui.config; + +import java.util.ArrayList; +import java.util.List; + +import exopandora.worldhandler.config.ConfigButcher; +import exopandora.worldhandler.config.ConfigSettings; +import exopandora.worldhandler.config.ConfigSkin; +import exopandora.worldhandler.main.Main; +import exopandora.worldhandler.main.WorldHandler; +import net.minecraft.client.gui.GuiScreen; +import net.minecraft.client.resources.I18n; +import net.minecraftforge.common.config.ConfigCategory; +import net.minecraftforge.common.config.ConfigElement; +import net.minecraftforge.fml.client.config.DummyConfigElement; +import net.minecraftforge.fml.client.config.GuiConfig; +import net.minecraftforge.fml.client.config.IConfigElement; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public class GuiConfigWorldHandler extends GuiConfig +{ + public GuiConfigWorldHandler(GuiScreen parentScreen, List configElements) + { + super(parentScreen, configElements, Main.MODID, false, false, Main.NAME); + } + + public GuiConfigWorldHandler(GuiScreen parentScreen, ConfigCategory category) + { + this(parentScreen, new ConfigElement(category).getChildElements()); + } + + public GuiConfigWorldHandler(GuiScreen parentScreen, String category) + { + this(parentScreen, WorldHandler.CONFIG.getCategory(category)); + } + + public GuiConfigWorldHandler(GuiScreen parentScreen) + { + this(parentScreen, getConfigElements()); + } + + private static List getConfigElements() + { + List list = new ArrayList(); + + list.add(new DummyConfigElement.DummyCategoryElement(I18n.format("gui.worldhandler.config.category.settings"), "gui.worldhandler.config", new ConfigElement(WorldHandler.CONFIG.getCategory(ConfigSettings.CATEGORY)).getChildElements())); + list.add(new DummyConfigElement.DummyCategoryElement(I18n.format("gui.worldhandler.config.category.skin"), "gui.worldhandler.config", new ConfigElement(WorldHandler.CONFIG.getCategory(ConfigSkin.CATEGORY)).getChildElements())); + list.add(new DummyConfigElement.DummyCategoryElement(I18n.format("gui.worldhandler.config.category.butcher"), "gui.worldhandler.config", new ConfigElement(WorldHandler.CONFIG.getCategory(ConfigButcher.CATEGORY)).getChildElements())); + + return list; + } +} diff --git a/src/main/java/exopandora/worldhandler/gui/config/GuiFactoryWorldHandler.java b/src/main/java/exopandora/worldhandler/gui/config/GuiFactoryWorldHandler.java new file mode 100644 index 0000000..f347e37 --- /dev/null +++ b/src/main/java/exopandora/worldhandler/gui/config/GuiFactoryWorldHandler.java @@ -0,0 +1,37 @@ +package exopandora.worldhandler.gui.config; + +import java.util.Set; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiScreen; +import net.minecraftforge.fml.client.IModGuiFactory; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public class GuiFactoryWorldHandler implements IModGuiFactory +{ + @Override + public void initialize(Minecraft minecraft) + { + + } + + @Override + public Set runtimeGuiCategories() + { + return null; + } + + @Override + public boolean hasConfigGui() + { + return true; + } + + @Override + public GuiScreen createConfigGui(GuiScreen parentScreen) + { + return new GuiConfigWorldHandler(parentScreen); + } +} diff --git a/src/main/java/exopandora/worldhandler/gui/container/Container.java b/src/main/java/exopandora/worldhandler/gui/container/Container.java new file mode 100644 index 0000000..aff9fe2 --- /dev/null +++ b/src/main/java/exopandora/worldhandler/gui/container/Container.java @@ -0,0 +1,29 @@ +package exopandora.worldhandler.gui.container; + +import java.util.ArrayList; +import java.util.List; + +import exopandora.worldhandler.gui.content.element.Element; +import exopandora.worldhandler.gui.content.element.IElement; +import net.minecraft.client.gui.GuiButton; +import net.minecraft.client.gui.GuiScreen; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public abstract class Container extends GuiScreen implements IContainer +{ + protected final List elements = new ArrayList(); + + @Override + public void add(GuiButton button) + { + this.buttonList.add(button); + } + + @Override + public void add(Element element) + { + this.elements.add(element); + } +} diff --git a/src/main/java/exopandora/worldhandler/gui/container/IContainer.java b/src/main/java/exopandora/worldhandler/gui/container/IContainer.java new file mode 100644 index 0000000..c52f260 --- /dev/null +++ b/src/main/java/exopandora/worldhandler/gui/container/IContainer.java @@ -0,0 +1,16 @@ +package exopandora.worldhandler.gui.container; + +import exopandora.worldhandler.gui.content.element.Element; +import net.minecraft.client.gui.GuiButton; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public interface IContainer +{ + void add(GuiButton button); + void initButtons(); + void add(Element element); + + String getPlayer(); +} diff --git a/src/main/java/exopandora/worldhandler/gui/container/impl/GuiWorldHandlerContainer.java b/src/main/java/exopandora/worldhandler/gui/container/impl/GuiWorldHandlerContainer.java new file mode 100644 index 0000000..b7e4c4d --- /dev/null +++ b/src/main/java/exopandora/worldhandler/gui/container/impl/GuiWorldHandlerContainer.java @@ -0,0 +1,718 @@ +package exopandora.worldhandler.gui.container.impl; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Calendar; +import java.util.List; +import java.util.function.BiConsumer; + +import javax.annotation.Nullable; + +import com.google.common.base.Predicates; +import com.mojang.realmsclient.gui.ChatFormatting; + +import exopandora.worldhandler.builder.impl.BuilderDifficulty; +import exopandora.worldhandler.builder.impl.BuilderDifficulty.EnumDifficulty; +import exopandora.worldhandler.builder.impl.BuilderGamemode; +import exopandora.worldhandler.builder.impl.BuilderGamemode.EnumGamemode; +import exopandora.worldhandler.builder.impl.BuilderTime; +import exopandora.worldhandler.builder.impl.BuilderTime.EnumMode; +import exopandora.worldhandler.builder.impl.BuilderWeather; +import exopandora.worldhandler.builder.impl.BuilderWeather.EnumWeather; +import exopandora.worldhandler.builder.impl.BuilderWorldHandler; +import exopandora.worldhandler.config.ConfigSettings; +import exopandora.worldhandler.config.ConfigSkin; +import exopandora.worldhandler.format.TextFormatting; +import exopandora.worldhandler.gui.button.EnumIcon; +import exopandora.worldhandler.gui.button.EnumTooltip; +import exopandora.worldhandler.gui.button.GuiButtonTab; +import exopandora.worldhandler.gui.button.GuiButtonWorldHandler; +import exopandora.worldhandler.gui.button.GuiTextFieldTooltip; +import exopandora.worldhandler.gui.container.Container; +import exopandora.worldhandler.gui.content.Content; +import exopandora.worldhandler.gui.content.IContent; +import exopandora.worldhandler.gui.content.element.IElement; +import exopandora.worldhandler.helper.ResourceHelper; +import exopandora.worldhandler.main.Main; +import exopandora.worldhandler.main.WorldHandler; +import exopandora.worldhandler.util.UtilRender; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiButton; +import net.minecraft.client.gui.GuiScreen; +import net.minecraft.client.renderer.GlStateManager; +import net.minecraft.client.renderer.RenderHelper; +import net.minecraft.client.resources.I18n; +import net.minecraft.util.math.MathHelper; +import net.minecraftforge.fml.client.config.GuiUtils; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public class GuiWorldHandlerContainer extends Container +{ + private final Content content; + private final int tabSize; + private final int bgTextureWidth = 248; + private final int bgTextureHeight = 166; + private final int tabDistance = 2; + private final int tabDistanceTotal; + private final double tabWidth; + private final double tabHalf; + private final double tabEpsilon; + private final String splash = this.getSplash(); + private final List finalButtons = new ArrayList(); + + private GuiTextFieldTooltip syntaxField; + private GuiTextFieldTooltip nameField; + + private static final BuilderWorldHandler BUILDER_WORLD_HANDLER = new BuilderWorldHandler(); + + public GuiWorldHandlerContainer(Content content) + { + this.content = content; + this.tabSize = this.content.getCategory().getSize(); + this.tabDistanceTotal = Math.max(this.tabSize - 1, 1) * this.tabDistance; + this.tabWidth = (this.bgTextureWidth - this.tabDistanceTotal) / Math.max(this.tabSize, 2); + this.tabHalf = this.tabWidth / 2D; + this.tabEpsilon = this.bgTextureWidth - (this.tabDistanceTotal + this.tabHalf * Math.max(this.tabSize, 2) * 2D); + } + + @Override + public void initGui() + { + this.finalButtons.clear(); + this.elements.clear(); + + //INIT + this.content.onPlayerNameChanged(this.getPlayer()); + this.content.initGui(this, this.getContentX(), this.getContentY()); + + //ELEMENTS + + for(IElement element : this.elements) + { + element.initGui(this); + } + + //SHORTCUTS + + final int x = this.width / 2 - 10; + final int delta = 21; + + if(ConfigSettings.areShortcutsEnabled()) + { + this.finalButtons.add(new GuiButtonWorldHandler(-1, x - delta * 7, 0, 20, 20, null, I18n.format("gui.worldhandler.shortcuts.tooltip.time", I18n.format("gui.worldhandler.shortcuts.tooltip.time.dawn", ConfigSettings.getDawn())), EnumTooltip.RIGHT, EnumIcon.TIME_DAWN)); + this.finalButtons.add(new GuiButtonWorldHandler(-2, x - delta * 6, 0, 20, 20, null, I18n.format("gui.worldhandler.shortcuts.tooltip.time", I18n.format("gui.worldhandler.shortcuts.tooltip.time.noon", ConfigSettings.getNoon())), EnumTooltip.RIGHT, EnumIcon.TIME_NOON)); + this.finalButtons.add(new GuiButtonWorldHandler(-3, x - delta * 5, 0, 20, 20, null, I18n.format("gui.worldhandler.shortcuts.tooltip.time", I18n.format("gui.worldhandler.shortcuts.tooltip.time.sunset", ConfigSettings.getSunset())), EnumTooltip.RIGHT, EnumIcon.TIME_SUNSET)); + this.finalButtons.add(new GuiButtonWorldHandler(-4, x - delta * 4, 0, 20, 20, null, I18n.format("gui.worldhandler.shortcuts.tooltip.time", I18n.format("gui.worldhandler.shortcuts.tooltip.time.midnight", ConfigSettings.getMidnight())), EnumTooltip.RIGHT, EnumIcon.TIME_MIDNIGHT)); + this.finalButtons.add(new GuiButtonWorldHandler(-5, x - delta * 3, 0, 20, 20, null, I18n.format("gui.worldhandler.shortcuts.tooltip.weather", I18n.format("gui.worldhandler.shortcuts.tooltip.weather.clear")), EnumTooltip.RIGHT, EnumIcon.WEATHER_SUN)); + this.finalButtons.add(new GuiButtonWorldHandler(-6, x - delta * 2, 0, 20, 20, null, I18n.format("gui.worldhandler.shortcuts.tooltip.weather", I18n.format("gui.worldhandler.shortcuts.tooltip.weather.rainy")), EnumTooltip.RIGHT, EnumIcon.WEATHER_RAIN)); + this.finalButtons.add(new GuiButtonWorldHandler(-7, x - delta * 1, 0, 20, 20, null, I18n.format("gui.worldhandler.shortcuts.tooltip.weather", I18n.format("gui.worldhandler.shortcuts.tooltip.weather.thunder")), EnumTooltip.RIGHT, EnumIcon.WEATHER_STORM)); + this.finalButtons.add(new GuiButtonWorldHandler(-8, x - delta * 0, 0, 20, 20, null, I18n.format("gui.worldhandler.shortcuts.tooltip.difficulty", I18n.format("gui.worldhandler.shortcuts.tooltip.difficulty.peaceful")), EnumTooltip.RIGHT, EnumIcon.DIFFICULTY_PEACEFUL)); + this.finalButtons.add(new GuiButtonWorldHandler(-9, x + delta * 1, 0, 20, 20, null, I18n.format("gui.worldhandler.shortcuts.tooltip.difficulty", I18n.format("gui.worldhandler.shortcuts.tooltip.difficulty.easy")), EnumTooltip.RIGHT, EnumIcon.DIFFICULTY_EASY)); + this.finalButtons.add(new GuiButtonWorldHandler(-10, x + delta * 2, 0, 20, 20, null, I18n.format("gui.worldhandler.shortcuts.tooltip.difficulty", I18n.format("gui.worldhandler.shortcuts.tooltip.difficulty.normal")), EnumTooltip.RIGHT, EnumIcon.DIFFICULTY_NORMAL)); + this.finalButtons.add(new GuiButtonWorldHandler(-11, x + delta * 3, 0, 20, 20, null, I18n.format("gui.worldhandler.shortcuts.tooltip.difficulty", I18n.format("gui.worldhandler.shortcuts.tooltip.difficulty.hard")), EnumTooltip.RIGHT, EnumIcon.DIFFICULTY_HARD)); + this.finalButtons.add(new GuiButtonWorldHandler(-12, x + delta * 4, 0, 20, 20, null, I18n.format("gui.worldhandler.shortcuts.tooltip.gamemode", I18n.format("gui.worldhandler.shortcuts.tooltip.gamemode.survival")), EnumTooltip.RIGHT, EnumIcon.GAMEMODE_SURVIVAL)); + this.finalButtons.add(new GuiButtonWorldHandler(-13, x + delta * 5, 0, 20, 20, null, I18n.format("gui.worldhandler.shortcuts.tooltip.gamemode", I18n.format("gui.worldhandler.shortcuts.tooltip.gamemode.creative")), EnumTooltip.RIGHT, EnumIcon.GAMEMODE_CREATIVE)); + this.finalButtons.add(new GuiButtonWorldHandler(-14, x + delta * 6, 0, 20, 20, null, I18n.format("gui.worldhandler.shortcuts.tooltip.gamemode", I18n.format("gui.worldhandler.shortcuts.tooltip.gamemode.adventure")), EnumTooltip.RIGHT, EnumIcon.GAMEMODE_ADVENTURE)); + this.finalButtons.add(new GuiButtonWorldHandler(-15, x + delta * 7, 0, 20, 20, null, I18n.format("gui.worldhandler.shortcuts.tooltip.gamemode", I18n.format("gui.worldhandler.shortcuts.tooltip.gamemode.spectator")), EnumTooltip.RIGHT, EnumIcon.GAMEMODE_SPECTATOR)); + } + + //SYNTAX + + if(ConfigSettings.isCommandSyntaxEnabled()) + { + this.syntaxField = new GuiTextFieldTooltip(x - delta * 7 + 1, this.height - 22, delta * 15 - 3, 20); + this.updateSyntax(); + } + + //NAME + + this.nameField = new GuiTextFieldTooltip(0, 0, 0, 11); + this.nameField.setMaxStringLength(16); + this.nameField.setText(this.getPlayer()); + this.updateNameField(); + + final int backgroundX = this.getBackgroundX(); + final int backgroundY = this.getBackgroundY(); + + this.forEachTab((index, xOffset) -> + { + IContent tab = this.content.getCategory().getContent(index); + + if(!this.content.getActiveContent().equals(tab)) + { + this.finalButtons.add(new GuiButtonTab(-16, (int)(backgroundX + xOffset), backgroundY - 20, (int)this.tabWidth + (int)Math.ceil(this.tabEpsilon / this.tabSize), 21, index)); + } + }); + + //BUTTONS + + this.initButtons(); + } + + public void initButtons() + { + this.buttonList.clear(); + + this.content.initButtons(this, this.getContentX(), this.getContentY()); + + if(this.finalButtons != null && !this.finalButtons.isEmpty()) + { + this.buttonList.addAll(this.finalButtons); + } + + for(IElement element : this.elements) + { + element.initButtons(this); + } + } + + private int getContentX() + { + return (this.width - this.bgTextureWidth) / 2 + 8 + this.getXOffset(); + } + + private int getContentY() + { + return this.height / 2 - 50 + this.getYOffset(); + } + + private int getXOffset() + { + return 0; + } + + private int getYOffset() + { + return ConfigSettings.areShortcutsEnabled() ? 11 : 8; + } + + @Override + public void updateScreen() + { + this.content.updateScreen(this); + this.updateSyntax(); + } + + private int getBackgroundX() + { + return (this.width - this.bgTextureWidth) / 2 + this.getXOffset(); + } + + private int getBackgroundY() + { + return (this.height - this.bgTextureHeight) / 2 + this.getYOffset(); + } + + private int getWatchOffset() + { + return ConfigSettings.isWatchEnabled() ? 9 : 0; + } + + private void forEachTab(BiConsumer consumer) + { + double xOffset = 0D; + + for(int index = 0; index < this.tabSize; index++) + { + consumer.accept(index, xOffset); + xOffset += this.tabWidth + this.tabDistance + this.tabEpsilon / this.tabSize; + } + } + + private void updateSyntax() + { + if(ConfigSettings.isCommandSyntaxEnabled() && this.syntaxField != null) + { + if(!this.syntaxField.isFocused()) + { + this.syntaxField.setValidator(Predicates.alwaysTrue()); + + if(this.content.getCommandBuilder() != null) + { + this.syntaxField.setText(this.content.getCommandBuilder().toCommand()); + } + else + { + this.syntaxField.setText(BUILDER_WORLD_HANDLER.toCommand()); + } + + this.syntaxField.setValidator(string -> string.equals(this.syntaxField.getText())); + this.syntaxField.setCursorPositionZero(); + } + } + } + + private void updateNameField() + { + final int backgroundX = this.getBackgroundX(); + final int backgroundY = this.getBackgroundY(); + + if(WorldHandler.USERNAME.isEmpty()) + { + int width = this.fontRenderer.getStringWidth(I18n.format("gui.worldhandler.generic.edit_username")) + 2; + + this.nameField.setWidth(width); + this.nameField.setPosition(backgroundX + this.bgTextureWidth - this.getWatchOffset() - 7 - (this.fontRenderer.getStringWidth(this.content.getTitle()) + 2), backgroundY + 6); + } + else + { + int width = this.fontRenderer.getStringWidth(WorldHandler.USERNAME) + 2; + + this.nameField.setWidth(width); + this.nameField.setPosition(backgroundX + this.bgTextureWidth - this.getWatchOffset() - 7 - width, backgroundY + 6); + this.content.onPlayerNameChanged(WorldHandler.USERNAME); + } + } + + @Override + protected void actionPerformed(GuiButton button) throws IOException + { + switch(button.id) + { + case 1: + Minecraft.getMinecraft().displayGuiScreen((GuiScreen) null); + Minecraft.getMinecraft().setIngameFocus(); + break; + case 0: + if(this.content.getBackContent() != null) + { + Minecraft.getMinecraft().displayGuiScreen(new GuiWorldHandlerContainer(this.content.getBackContent())); + } + break; + case -1: + WorldHandler.sendCommand(new BuilderTime(EnumMode.SET, ConfigSettings.getDawn())); + break; + case -2: + WorldHandler.sendCommand(new BuilderTime(EnumMode.SET, ConfigSettings.getNoon())); + break; + case -3: + WorldHandler.sendCommand(new BuilderTime(EnumMode.SET, ConfigSettings.getSunset())); + break; + case -4: + WorldHandler.sendCommand(new BuilderTime(EnumMode.SET, ConfigSettings.getMidnight())); + break; + case -5: + WorldHandler.sendCommand(new BuilderWeather(EnumWeather.CLEAR)); + break; + case -6: + WorldHandler.sendCommand(new BuilderWeather(EnumWeather.RAIN)); + break; + case -7: + WorldHandler.sendCommand(new BuilderWeather(EnumWeather.THUNDER)); + break; + case -8: + WorldHandler.sendCommand(new BuilderDifficulty(EnumDifficulty.PEACEFUL)); + break; + case -9: + WorldHandler.sendCommand(new BuilderDifficulty(EnumDifficulty.EASY)); + break; + case -10: + WorldHandler.sendCommand(new BuilderDifficulty(EnumDifficulty.NORMAL)); + break; + case -11: + WorldHandler.sendCommand(new BuilderDifficulty(EnumDifficulty.HARD)); + break; + case -12: + WorldHandler.sendCommand(new BuilderGamemode(EnumGamemode.SURVIVAL)); + break; + case -13: + WorldHandler.sendCommand(new BuilderGamemode(EnumGamemode.CREATIVE)); + break; + case -14: + WorldHandler.sendCommand(new BuilderGamemode(EnumGamemode.ADVENTURE)); + break; + case -15: + WorldHandler.sendCommand(new BuilderGamemode(EnumGamemode.SPECTATOR)); + break; + case -16: + if(button instanceof GuiButtonTab) + { + Minecraft.getMinecraft().displayGuiScreen(new GuiWorldHandlerContainer(this.content.getCategory().getContent(((GuiButtonTab)button).getIndex()))); + } + break; + default: + elements: + for(IElement element : this.elements) + { + if(element.actionPerformed(this, button)) + { + break elements; + } + } + + this.content.actionPerformed(this, button); + break; + } + } + + private void defaultColor() + { + this.defaultColor(1); + } + + private void defaultColor(float alpha) + { + GlStateManager.enableBlend(); + GlStateManager.color((float) ConfigSkin.getBackgroundRed() / 255, (float) ConfigSkin.getBackgroundGreen() / 255, (float) ConfigSkin.getBackgroundBlue() / 255, alpha * (float) ConfigSkin.getBackgroundAlpha() / 255); + } + + private void darkColor() + { + GlStateManager.enableBlend(); + GlStateManager.color((float) ConfigSkin.getBackgroundRed() / 255 - 0.3F, (float) ConfigSkin.getBackgroundGreen() / 255 - 0.3F, (float) ConfigSkin.getBackgroundBlue() / 255 - 0.3F, (float) ConfigSkin.getBackgroundAlpha() / 255); + } + + private void bindBackground() + { + Minecraft.getMinecraft().renderEngine.bindTexture(ResourceHelper.getBackgroundTexture()); + } + + @Nullable + protected String getSplash() + { + Calendar calendar = Calendar.getInstance(); + int day = calendar.get(Calendar.DAY_OF_MONTH); + int month = calendar.get(Calendar.MONTH) + 1; + + if(day == 12 && month == 24) + { + return "Merry X-mas!"; + } + else if(day == 1 && month == 1) + { + return "Happy new year!"; + } + else if(day == 10 && month == 31) + { + return "OOoooOOOoooo! Spooky!"; + } + else if(day == 3 && month == 28) + { + return (calendar.get(Calendar.YEAR) - 2013) + " Years of World Handler!"; + } + + return null; + } + + @Override + public void drawScreen(int mouseX, int mouseY, float partialTicks) + { + final int backgroundX = this.getBackgroundX(); + final int backgroundY = this.getBackgroundY(); + + //DEFAULT BACKGROUND + + if(ConfigSkin.isBackgroundDrawingEnabled()) + { + super.drawDefaultBackground(); + } + + //COLOR + + this.defaultColor(); + + //BACKGROUND + + this.bindBackground(); + this.drawTexturedModalRect(backgroundX, backgroundY, 0, 0, this.bgTextureWidth, this.bgTextureHeight); + + //TABS + + this.forEachTab((index, xOffset) -> + { + IContent tab = this.content.getCategory().getContent(index); + int yOffset; + int fHeight; + int color; + + if(this.content.getActiveContent().equals(tab)) + { + yOffset = -22; + fHeight = 25; + color = 0xFFFFFF; + this.defaultColor(); + } + else + { + yOffset = -20; + fHeight = 20; + color = 0xE0E0E0; + this.darkColor(); + } + + this.bindBackground(); + this.drawTexturedModalRect((int)(backgroundX + xOffset), (int)(backgroundY + yOffset), 0, 0, (int) Math.ceil(this.tabHalf), fHeight); + this.drawTexturedModalRect((int)(backgroundX + this.tabHalf + xOffset), (int)(backgroundY + yOffset), this.bgTextureWidth - (int) Math.ceil(this.tabHalf), 0, (int) Math.ceil(this.tabHalf), fHeight); + + if(!ConfigSkin.areSharpEdgesEnabled()) + { + if(this.content.getActiveContent().equals(tab)) + { + //RIGHT TAB CURVATURE + + if(index < this.tabSize - 1 || this.tabSize == 1) + { + int factor = 2; + + for(int x = 0; x < factor; x++) + { + this.drawTexturedModalRect((int)(backgroundX + this.tabWidth + xOffset - x - 1), (int)(backgroundY + x + 1), (int)(this.tabWidth - x - 1), x + 1, x + 1, 1); + } + } + + //LEFT TAB CURVATURE + + if(index > 0) + { + int factor = 2; + + for(int x = 0; x < factor; x++) + { + this.drawTexturedModalRect((int)(backgroundX + xOffset), (int)(backgroundY + x + 1), xOffset.intValue(), x + 1, x + 1, 1); + } + } + + int width = (int)(this.tabWidth - 3); + int interval = 5; + + //LEFT GRADIENT + + if(index == 0) + { + for(int x = 0; x < width; x += interval) + { + this.defaultColor(1.0F - (x / (width + 5.0F * interval))); + this.drawTexturedModalRect((int)(backgroundX + xOffset), (int)(backgroundY + yOffset + fHeight + x / interval), 0, fHeight, width - x, 1); + } + } + + //RIGHT GRADIENT + + if(index == this.tabSize - 1 && this.tabSize > 1) + { + int offset = 3; + + for(int x = 0; x < width; x += interval) + { + this.defaultColor(1.0F - (x / (width + 5.0F * interval))); + this.drawTexturedModalRect((int)(backgroundX + Math.ceil(xOffset) + x + offset), (int)(backgroundY + yOffset + fHeight + x / interval), this.bgTextureWidth - width + x, fHeight, width - x, 1); + } + } + } + else + { + //LEFT CORNER FILLER + + if(index == 0) + { + int factor = 2; + + for(int x = 0; x < factor; x++) + { + this.drawTexturedModalRect(backgroundX, backgroundY + x, 0, fHeight, factor - x, 1); + } + } + + //RIGHT CORNER FILLER + + if(index == this.tabSize - 1) + { + int factor = 3; + + for(int x = 0; x < factor + 1; x++) + { + this.drawTexturedModalRect(backgroundX + this.bgTextureWidth - x, backgroundY + factor - x, this.bgTextureWidth - x, fHeight, x, 1); + } + } + } + } + + this.drawCenteredString(this.fontRenderer, ChatFormatting.UNDERLINE + tab.getTabTitle(), (int)(backgroundX + this.tabHalf + xOffset), (int)(backgroundY - 13), color); + }); + + this.defaultColor(); + + //VERSION LABEL + + final int hexAlpha = (int) (0xFF * 0.2) << 24; + final int color = ConfigSkin.getLabelColor() + hexAlpha; + + this.fontRenderer.drawString(Main.MC_VERSION + "-" + Main.VERSION, this.width - this.fontRenderer.getStringWidth(Main.MC_VERSION + "-" + Main.VERSION) - 2, this.height - 10, color); + + //TITLE + + final int maxWidth = this.bgTextureWidth - 7 - 2 - this.fontRenderer.getStringWidth(WorldHandler.USERNAME) - 2 - this.getWatchOffset() - 7; + this.fontRenderer.drawString(TextFormatting.shortenString(this.content.getTitle(), maxWidth, this.fontRenderer), backgroundX + 7, backgroundY + 7, ConfigSkin.getLabelColor()); + + //HEADLINE + + if(this.content.getHeadline() != null) + { + if(this.content.getHeadline().length > 0) + { + this.fontRenderer.drawString(this.content.getHeadline()[0], backgroundX + 8, backgroundY + 22, ConfigSkin.getHeadlineColor()); + } + + if(this.content.getHeadline().length > 1) + { + this.fontRenderer.drawString(this.content.getHeadline()[1], backgroundX + 126, backgroundY + 22, ConfigSkin.getHeadlineColor()); + } + } + + //NAME FIELD + + final String username = WorldHandler.USERNAME.isEmpty() && !this.nameField.isFocused() ? I18n.format("gui.worldhandler.generic.edit_username") : WorldHandler.USERNAME; + this.fontRenderer.drawString(username, backgroundX + 232 - this.fontRenderer.getStringWidth(username), backgroundY + 7, ConfigSkin.getLabelColor()); + + //WATCH + + if(ConfigSettings.isWatchEnabled()) + { + final int watchX = backgroundX + 233; + final int watchY = backgroundY + 5; + + UtilRender.drawWatchIntoGui(this, watchX, watchY, Minecraft.getMinecraft().world.getWorldInfo().getWorldTime(), ConfigSettings.isSmoothWatchEnabled()); + + if(ConfigSettings.areTooltipsEnabled()) + { + if(mouseX >= watchX && mouseX <= watchX + 9 && mouseY >= watchY && mouseY <= watchY + 9) + { + GuiUtils.drawHoveringText(Arrays.asList(TextFormatting.getWorldTime(Minecraft.getMinecraft().world.getWorldTime())), mouseX, mouseY + 9, this.width, this.height, this.width, this.fontRenderer); + GlStateManager.disableLighting(); + } + } + } + + //BUTTONS + + for(int x = 0; x < this.buttonList.size(); x++) + { + this.buttonList.get(x).drawButton(this.mc, mouseX, mouseY, partialTicks); + } + + for(int x = 0; x < this.labelList.size(); x++) + { + this.labelList.get(x).drawLabel(this.mc, mouseX, mouseY); + } + + //CONTAINER + + this.content.drawScreen(this, this.getContentX(), this.getContentY(), mouseX, mouseY, partialTicks); + + //CONTAINER ELEMENTS + + for(IElement element : this.elements) + { + element.draw(); + } + + //SYNTAX + + if(ConfigSettings.isCommandSyntaxEnabled() && this.syntaxField != null) + { + this.syntaxField.drawTextBox(); + } + + //SPLASHTEXT + + if(this.splash != null) + { + GlStateManager.pushMatrix(); + RenderHelper.enableGUIStandardItemLighting(); + GlStateManager.disableLighting(); + GlStateManager.translate((float) (backgroundX + 212), backgroundY + 15, 0.0F); + GlStateManager.rotate(17.0F, 0.0F, 0.0F, 1.0F); + + float scale = 1.1F - MathHelper.abs(MathHelper.sin((float) (Minecraft.getSystemTime() % 1000L) / 1000.0F * (float) Math.PI * 2.0F) * 0.1F); + scale = scale * 100.0F / this.fontRenderer.getStringWidth(this.splash); + GlStateManager.scale(scale, scale, scale); + + this.drawCenteredString(this.fontRenderer, this.splash, 0, (int) scale, 0xFFFF00); + + GlStateManager.popMatrix(); + } + + //TOOLTIPS + + if(ConfigSettings.areTooltipsEnabled()) + { + for(int x = 0; x < this.buttonList.size(); x++) + { + if(this.buttonList.get(x) instanceof GuiButtonWorldHandler) + { + ((GuiButtonWorldHandler) this.buttonList.get(x)).drawTooltip(mouseX, mouseY, this.width, this.height); + } + } + } + } + + @Override + protected void keyTyped(char charTyped, int keyCode) throws IOException + { + super.keyTyped(charTyped, keyCode); + + this.content.keyTyped(this, charTyped, keyCode); + + if(this.nameField.isFocused()) + { + this.nameField.textboxKeyTyped(charTyped, keyCode); + WorldHandler.USERNAME = this.nameField.getText(); + this.updateNameField(); + } + + if(ConfigSettings.isCommandSyntaxEnabled() && this.syntaxField != null) + { + this.syntaxField.textboxKeyTyped(charTyped, keyCode); + } + + for(IElement element : this.elements) + { + element.keyTyped(this, charTyped, keyCode); + } + } + + @Override + protected void mouseClicked(int mouseX, int mouseY, int mouseButton) throws IOException + { + super.mouseClicked(mouseX, mouseY, mouseButton); + + this.content.mouseClicked(mouseX, mouseY, mouseButton); + this.nameField.mouseClicked(mouseX, mouseY, mouseButton); + + if(this.nameField.isFocused()) + { + this.nameField.setCursorPositionEnd(); + } + + if(ConfigSettings.isCommandSyntaxEnabled() && this.syntaxField != null) + { + this.syntaxField.mouseClicked(mouseX, mouseY, mouseButton); + } + + for(IElement element : this.elements) + { + element.mouseClicked(mouseX, mouseY, mouseButton); + } + } + + @Override + public void onGuiClosed() + { + this.content.onGuiClosed(); + } + + @Override + public boolean doesGuiPauseGame() + { + return ConfigSettings.isPauseEnabled(); + } + + @Override + public String getPlayer() + { + return WorldHandler.USERNAME; + } +} \ No newline at end of file diff --git a/src/main/java/exopandora/worldhandler/gui/content/Content.java b/src/main/java/exopandora/worldhandler/gui/content/Content.java new file mode 100644 index 0000000..cd66241 --- /dev/null +++ b/src/main/java/exopandora/worldhandler/gui/content/Content.java @@ -0,0 +1,111 @@ +package exopandora.worldhandler.gui.content; + +import java.util.HashMap; +import java.util.Map; + +import exopandora.worldhandler.gui.button.storage.ButtonStorage; +import exopandora.worldhandler.gui.content.impl.ContentAdvancements; +import exopandora.worldhandler.gui.content.impl.ContentButcher; +import exopandora.worldhandler.gui.content.impl.ContentChangeWorld; +import exopandora.worldhandler.gui.content.impl.ContentContainers; +import exopandora.worldhandler.gui.content.impl.ContentContinue; +import exopandora.worldhandler.gui.content.impl.ContentCustomItem; +import exopandora.worldhandler.gui.content.impl.ContentEditBlocks; +import exopandora.worldhandler.gui.content.impl.ContentEnchantment; +import exopandora.worldhandler.gui.content.impl.ContentExperience; +import exopandora.worldhandler.gui.content.impl.ContentGamerules; +import exopandora.worldhandler.gui.content.impl.ContentMain; +import exopandora.worldhandler.gui.content.impl.ContentMultiplayer; +import exopandora.worldhandler.gui.content.impl.ContentNoteEditor; +import exopandora.worldhandler.gui.content.impl.ContentPlayer; +import exopandora.worldhandler.gui.content.impl.ContentPotions; +import exopandora.worldhandler.gui.content.impl.ContentScoreboardObjectives; +import exopandora.worldhandler.gui.content.impl.ContentScoreboardPlayers; +import exopandora.worldhandler.gui.content.impl.ContentScoreboardTeams; +import exopandora.worldhandler.gui.content.impl.ContentSignEditor; +import exopandora.worldhandler.gui.content.impl.ContentSummon; +import exopandora.worldhandler.gui.content.impl.ContentWorldInfo; +import exopandora.worldhandler.main.Main; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.registry.RegistryNamespaced; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public abstract class Content implements IContent +{ + public static final RegistryNamespaced REGISTRY = new RegistryNamespaced(); + + public static void registerContents() + { + //MAIN + registerContent(0, "main", new ContentMain()); + registerContent(1, "containers", new ContentContainers()); + registerContent(2, "multiplayer", new ContentMultiplayer()); + + //ENTITIES + registerContent(3, "summon", new ContentSummon()); + + //ITEMS + registerContent(5, "custom_item", new ContentCustomItem()); + registerContent(4, "enchantment", new ContentEnchantment()); + + //BLOCKS + registerContent(6, "edit_blocks", new ContentEditBlocks()); + registerContent(7, "sign_editor", new ContentSignEditor()); + registerContent(8, "note_editor", new ContentNoteEditor()); + + //WORLD + registerContent(9, "world", new ContentWorldInfo()); + registerContent(10, "gamerules", new ContentGamerules()); + + //PLAYER + registerContent(11, "player", new ContentPlayer()); + registerContent(12, "experience", new ContentExperience()); + registerContent(13, "advancements", new ContentAdvancements()); + + //SCOREBOARD + registerContent(14, "scoreboard_objectives", new ContentScoreboardObjectives()); + registerContent(15, "scoreboard_teams", new ContentScoreboardTeams()); + registerContent(16, "scoreboard_players", new ContentScoreboardPlayers()); + + //MISC + registerContent(17, "change_world", new ContentChangeWorld()); + registerContent(18, "continue", new ContentContinue()); + + //NO CATEGORY + registerContent(19, "potions", new ContentPotions()); + registerContent(20, "butcher", new ContentButcher()); + } + + private static void registerContent(int id, String textualID, Content content) + { + registerContent(id, new ResourceLocation(Main.MODID, textualID), content); + } + + private static void registerContent(int id, ResourceLocation textualID, Content content) + { + REGISTRY.register(id, textualID, content); + } + + private Map storage; + + public ButtonStorage getStorage(Object id) + { + if(this.storage == null) + { + this.storage = new HashMap(); + } + + if(this.storage.containsKey(id)) + { + return this.storage.get(id); + } + + ButtonStorage storage = new ButtonStorage(); + + this.storage.put(id, storage); + + return storage; + } +} diff --git a/src/main/java/exopandora/worldhandler/gui/content/Contents.java b/src/main/java/exopandora/worldhandler/gui/content/Contents.java new file mode 100644 index 0000000..323ce38 --- /dev/null +++ b/src/main/java/exopandora/worldhandler/gui/content/Contents.java @@ -0,0 +1,87 @@ +package exopandora.worldhandler.gui.content; + +import exopandora.worldhandler.gui.content.impl.ContentContinue; +import exopandora.worldhandler.gui.content.impl.abstr.ContentChild; +import exopandora.worldhandler.main.Main; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public class Contents +{ + public static final Content MAIN; + public static final Content CONTAINERS; + public static final Content MULTIPLAYER; + + public static final Content SUMMON; + + public static final Content CUSTOM_ITEM; + public static final Content ENCHANTMENT; + + public static final Content EDIT_BLOCKS; + public static final Content SIGN_EDITOR; + public static final Content NOTE_EDITOR; + + public static final Content WORLD_INFO; + public static final Content GAMERULES; + + public static final Content PLAYER; + public static final Content EXPERIENCE; + public static final Content ADVANCEMENTS; + + public static final Content SCOREBOARD_OBJECTIVES; + public static final Content SCOREBOARD_TEAMS; + public static final Content SCOREBOARD_PLAYERS; + + public static final ContentChild CHANGE_WORLD; + public static final ContentContinue CONTINUE; + + public static final ContentChild POTIONS; + public static final ContentChild BUTCHER; + + static + { + MAIN = Contents.getRegisteredContainer("main"); + CONTAINERS = Contents.getRegisteredContainer("containers"); + MULTIPLAYER = Contents.getRegisteredContainer("multiplayer"); + + SUMMON = Contents.getRegisteredContainer("summon"); + + CUSTOM_ITEM = Contents.getRegisteredContainer("custom_item"); + ENCHANTMENT = Contents.getRegisteredContainer("enchantment"); + + EDIT_BLOCKS = Contents.getRegisteredContainer("edit_blocks"); + SIGN_EDITOR = Contents.getRegisteredContainer("sign_editor"); + NOTE_EDITOR = Contents.getRegisteredContainer("note_editor"); + + WORLD_INFO = Contents.getRegisteredContainer("world"); + GAMERULES = Contents.getRegisteredContainer("gamerules"); + + PLAYER = Contents.getRegisteredContainer("player"); + EXPERIENCE = Contents.getRegisteredContainer("experience"); + ADVANCEMENTS = Contents.getRegisteredContainer("advancements"); + + SCOREBOARD_OBJECTIVES = Contents.getRegisteredContainer("scoreboard_objectives"); + SCOREBOARD_TEAMS = Contents.getRegisteredContainer("scoreboard_teams"); + SCOREBOARD_PLAYERS = Contents.getRegisteredContainer("scoreboard_players"); + + CHANGE_WORLD = Contents.getRegisteredContainer("change_world"); + CONTINUE = Contents.getRegisteredContainer("continue"); + + POTIONS = Contents.getRegisteredContainer("potions"); + BUTCHER = Contents.getRegisteredContainer("butcher"); + } + + private static T getRegisteredContainer(String name) + { + Content container = Content.REGISTRY.getObject(new ResourceLocation(Main.MODID, name)); + + if(container == null) + { + throw new IllegalStateException("Invalid Container requested: " + name); + } + + return (T) container; + } +} \ No newline at end of file diff --git a/src/main/java/exopandora/worldhandler/gui/content/IContent.java b/src/main/java/exopandora/worldhandler/gui/content/IContent.java new file mode 100644 index 0000000..484b60b --- /dev/null +++ b/src/main/java/exopandora/worldhandler/gui/content/IContent.java @@ -0,0 +1,81 @@ +package exopandora.worldhandler.gui.content; + +import javax.annotation.Nullable; + +import exopandora.worldhandler.builder.ICommandBuilder; +import exopandora.worldhandler.gui.category.Category; +import exopandora.worldhandler.gui.container.Container; +import net.minecraft.client.gui.GuiButton; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public interface IContent +{ + default void initGui(Container container, int x, int y) + { + + } + + void initButtons(Container container, int x, int y); + + default void updateScreen(Container container) + { + + } + + default void actionPerformed(Container container, GuiButton button) + { + + } + + default void drawScreen(Container container, int x, int y, int mouseX, int mouseY, float partialTicks) + { + + } + + default void keyTyped(Container container, char typedChar, int keyCode) + { + + } + + default void mouseClicked(int mouseX, int mouseY, int mouseButton) + { + + } + + default void onPlayerNameChanged(String username) + { + + } + + Category getCategory(); + + String getTitle(); + String getTabTitle(); + + Content getActiveContent(); + + @Nullable + default Content getBackContent() + { + return Contents.MAIN; + } + + @Nullable + default ICommandBuilder getCommandBuilder() + { + return null; + } + + @Nullable + default String[] getHeadline() + { + return null; + } + + default void onGuiClosed() + { + + } +} diff --git a/src/main/java/exopandora/worldhandler/gui/content/element/Element.java b/src/main/java/exopandora/worldhandler/gui/content/element/Element.java new file mode 100644 index 0000000..cef184d --- /dev/null +++ b/src/main/java/exopandora/worldhandler/gui/content/element/Element.java @@ -0,0 +1,23 @@ +package exopandora.worldhandler.gui.content.element; + +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public abstract class Element implements IElement +{ + protected int x; + protected int y; + + public Element(int x, int y) + { + this.x = x; + this.y = y; + } + + @Override + public void draw() + { + + } +} diff --git a/src/main/java/exopandora/worldhandler/gui/content/element/IElement.java b/src/main/java/exopandora/worldhandler/gui/content/element/IElement.java new file mode 100644 index 0000000..85654f2 --- /dev/null +++ b/src/main/java/exopandora/worldhandler/gui/content/element/IElement.java @@ -0,0 +1,25 @@ +package exopandora.worldhandler.gui.content.element; + +import exopandora.worldhandler.gui.container.Container; +import net.minecraft.client.gui.GuiButton; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public interface IElement +{ + void initGui(Container container); + void initButtons(Container container); + void draw(); + boolean actionPerformed(Container container, GuiButton button); + + default void keyTyped(Container container, char charTyped, int keyCode) + { + + } + + default void mouseClicked(int mouseX, int mouseY, int mouseButton) + { + + } +} diff --git a/src/main/java/exopandora/worldhandler/gui/content/element/impl/ElementClickList.java b/src/main/java/exopandora/worldhandler/gui/content/element/impl/ElementClickList.java new file mode 100644 index 0000000..b7da6df --- /dev/null +++ b/src/main/java/exopandora/worldhandler/gui/content/element/impl/ElementClickList.java @@ -0,0 +1,207 @@ +package exopandora.worldhandler.gui.content.element.impl; + +import java.util.List; + +import javax.annotation.Nullable; + +import exopandora.worldhandler.gui.button.EnumTooltip; +import exopandora.worldhandler.gui.button.GuiButtonList; +import exopandora.worldhandler.gui.button.logic.IListButtonLogic; +import exopandora.worldhandler.gui.button.storage.ButtonStorage; +import exopandora.worldhandler.gui.container.Container; +import exopandora.worldhandler.gui.content.Content; +import exopandora.worldhandler.gui.content.element.Element; +import exopandora.worldhandler.gui.content.element.logic.ILogicClickList; +import exopandora.worldhandler.helper.Node; +import net.minecraft.client.gui.GuiButton; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public class ElementClickList extends Element +{ + private final int buttonId1; + private final int buttonId2; + private final List list; + private final ILogicClickList logic; + private GuiButtonList button1; + private GuiButtonList button2; + private final Content master; + + public ElementClickList(int x, int y, List list, int buttonId1, int buttonId2, Content container, ILogicClickList logic) + { + super(x, y); + this.list = list; + this.buttonId1 = buttonId1; + this.buttonId2 = buttonId2; + this.logic = logic; + this.master = container; + } + + @Override + public void initGui(Container container) + { + + } + + @Override + public void initButtons(Container container) + { + container.add(this.button1 = new GuiButtonList(this.buttonId1, this.x, this.y, 114, 20, EnumTooltip.TOP_RIGHT, this.master, new IListButtonLogic() + { + @Override + public void actionPerformed(Container container, GuiButton button, ButtonStorage storage) + { + master.getStorage(listButtonLogic2.getId()).setIndex(0); + container.initButtons(); + } + + @Override + public int getMax() + { + return list.size(); + } + + @Override + public Node getObject(int index) + { + return list.get(index); + } + + @Override + public String getDisplayString(ButtonStorage storage) + { + return logic.translate1(storage.getObject().getKey()); + } + + @Override + public String getTooltipString(ButtonStorage storage) + { + if(storage != null && storage.getObject() != null) + { + return storage.getObject().getKey() + " (" + (storage.getIndex() + 1) + "/" + this.getMax() + ")"; + } + + return null; + } + + @Override + public String getId() + { + return logic.getId() + 1; + } + })); + + final Node node = this.getStorage1().getObject(); + this.logic.consumeKey1(node.getKey()); + + if(node.getEntries() != null) + { + container.add(this.button2 = new GuiButtonList(this.buttonId2, this.x, this.y + 24, 114, 20, EnumTooltip.TOP_RIGHT, this.master, this.listButtonLogic2)); + this.logic.consumeKey2(node.getKey(), node.getEntries().get(this.getStorage2().getIndex()).getKey()); + } + else + { + container.add(this.button2 = new GuiButtonList(this.buttonId2, this.x, this.y + 24, 114, 20, EnumTooltip.TOP_RIGHT, this.master, this.listButtonLogic2)); + this.button2.enabled = false; + } + } + + private final IListButtonLogic listButtonLogic2 = new IListButtonLogic() + { + @Override + public void actionPerformed(Container container, GuiButton button, ButtonStorage storage) + { + container.initButtons(); + } + + @Override + public int getMax() + { + if(getStorage1().getObject() != null) + { + return getStorage1().getObject().getEntries().size(); + } + + return 0; + } + + @Override + public Node getObject(int index) + { + if(getStorage1().getObject().getEntries() != null) + { + return getStorage1().getObject().getEntries().get(index); + } + + return null; + } + + @Override + public String getDisplayString(ButtonStorage storage) + { + if(storage.getObject() != null) + { + return logic.translate2(getStorage1().getObject().getKey(), storage.getObject().getKey()); + } + + return null; + } + + @Override + public String getTooltipString(ButtonStorage storage) + { + if(getStorage1().getObject().getEntries() != null) + { + return storage.getObject().getKey() + " (" + (storage.getIndex() + 1) + "/" + getStorage1().getObject().getEntries().size() + ")"; + } + + return null; + } + + @Override + public String getId() + { + return logic.getId() + 2; + } + }; + + @Nullable + private ButtonStorage getStorage1() + { + if(this.button1 != null) + { + return this.master.getStorage(this.button1.getLogic().getId()); + } + + return null; + } + + @Nullable + private ButtonStorage getStorage2() + { + if(this.button2 != null) + { + return this.master.getStorage(this.button2.getLogic().getId()); + } + + return null; + } + + @Override + public boolean actionPerformed(Container container, GuiButton button) + { + if(button.id == this.buttonId1) + { + this.button1.actionPerformed(container, button); + return true; + } + else if(button.id == this.buttonId2) + { + this.button2.actionPerformed(container, button); + return true; + } + + return false; + } +} diff --git a/src/main/java/exopandora/worldhandler/gui/content/element/impl/ElementColorMenu.java b/src/main/java/exopandora/worldhandler/gui/content/element/impl/ElementColorMenu.java new file mode 100644 index 0000000..9a8e02c --- /dev/null +++ b/src/main/java/exopandora/worldhandler/gui/content/element/impl/ElementColorMenu.java @@ -0,0 +1,152 @@ +package exopandora.worldhandler.gui.content.element.impl; + +import com.mojang.realmsclient.gui.ChatFormatting; + +import exopandora.worldhandler.format.text.ColoredString; +import exopandora.worldhandler.gui.button.GuiButtonList; +import exopandora.worldhandler.gui.button.GuiButtonWorldHandler; +import exopandora.worldhandler.gui.button.GuiTextFieldTooltip; +import exopandora.worldhandler.gui.button.logic.ColorListButtonLogic; +import exopandora.worldhandler.gui.button.storage.ButtonStorage; +import exopandora.worldhandler.gui.container.Container; +import exopandora.worldhandler.gui.content.Content; +import exopandora.worldhandler.gui.content.element.Element; +import exopandora.worldhandler.gui.content.element.logic.ILogicColorMenu; +import net.minecraft.client.gui.GuiButton; +import net.minecraft.client.resources.I18n; + +public class ElementColorMenu extends Element +{ + private GuiTextFieldTooltip textField; + private GuiButtonList colorList; + private final Content content; + private final ColoredString string; + private final int[] ids; + private final ILogicColorMenu logic; + private final String translationKey; + + public ElementColorMenu(Content content, int x, int y, String translationKey, ColoredString string, int[] ids) + { + this(content, x, y, translationKey, string, ids, new ILogicColorMenu(){}); + } + + public ElementColorMenu(Content content, int x, int y, String translationKey, ColoredString string, int[] ids, ILogicColorMenu logic) + { + super(x, y); + this.content = content; + this.translationKey = translationKey; + this.string = string; + this.ids = ids; + this.logic = logic; + } + + @Override + public void initGui(Container container) + { + if(this.logic.drawTextfield()) + { + this.textField = new GuiTextFieldTooltip(this.x + 118, this.y, 114, 20, I18n.format(this.translationKey)); + this.textField.setValidator(this.logic.getValidator()); + this.textField.setText(this.string.getTextFieldString()); + } + } + + @Override + public void initButtons(Container container) + { + if(this.logic.drawButtons()) + { + container.add(this.colorList = new GuiButtonList(this.ids[0], this.x + 118, this.y + 24, 114, 20, this.content, new ColorListButtonLogic() + { + @Override + public void actionPerformed(Container container, GuiButton button, ButtonStorage storage) + { + string.setColor(storage.getIndex()); + } + })); + + container.add(new GuiButtonWorldHandler(this.ids[1], this.x + 118, this.y + 48, 20, 20, (this.string.isItalic() ? ChatFormatting.ITALIC : ChatFormatting.RESET) + "I")); + container.add(new GuiButtonWorldHandler(this.ids[2], this.x + 118 + 24 - 1, this.y + 48, 20, 20, (this.string.isBold() ? ChatFormatting.BOLD : ChatFormatting.RESET) + "B")); + container.add(new GuiButtonWorldHandler(this.ids[3], this.x + 118 + 24 * 2 - 1, this.y + 48, 20, 20, (this.string.isUnderlined() ? ChatFormatting.UNDERLINE : ChatFormatting.RESET) + "U")); + container.add(new GuiButtonWorldHandler(this.ids[4], this.x + 118 + 24 * 3 - 1, this.y + 48, 20, 20, (this.string.isStriked() ? ChatFormatting.STRIKETHROUGH : ChatFormatting.RESET) + "S")); + container.add(new GuiButtonWorldHandler(this.ids[5], this.x + 118 + 24 * 4 - 2, this.y + 48, 20, 20, (this.string.isObfuscated() ? ChatFormatting.OBFUSCATED : ChatFormatting.RESET) + "O")); + } + } + + @Override + public boolean actionPerformed(Container container, GuiButton button) + { + if(button.id == this.ids[0]) + { + this.colorList.actionPerformed(container, button); + container.initGui(); + return true; + } + else if(button.id == this.ids[1]) + { + this.string.setItalic(!this.string.isItalic()); + container.initGui(); + return true; + } + else if(button.id == this.ids[2]) + { + this.string.setBold(!this.string.isBold()); + container.initGui(); + return true; + } + else if(button.id == this.ids[3]) + { + this.string.setUnderlined(!this.string.isUnderlined()); + container.initGui(); + return true; + } + else if(button.id == this.ids[4]) + { + this.string.setStriked(!this.string.isStriked()); + container.initGui(); + return true; + } + else if(button.id == this.ids[5]) + { + this.string.setObfuscated(!this.string.isObfuscated()); + container.initGui(); + return true; + } + + return false; + } + + @Override + public void draw() + { + if(this.logic.drawTextfield()) + { + this.textField.drawTextBox(); + } + } + + @Override + public void keyTyped(Container container, char charTyped, int keyCode) + { + if(this.logic.drawTextfield()) + { + if(this.textField.canType(charTyped)) + { + if(this.textField.textboxKeyTyped(charTyped, keyCode)) + { + this.string.setText(this.textField.getText()); + container.initButtons(); + } + } + } + } + + @Override + public void mouseClicked(int mouseX, int mouseY, int mouseButton) + { + if(this.logic.drawTextfield()) + { + this.textField.mouseClicked(mouseX, mouseY, mouseButton); + } + } +} diff --git a/src/main/java/exopandora/worldhandler/gui/content/element/impl/ElementPageList.java b/src/main/java/exopandora/worldhandler/gui/content/element/impl/ElementPageList.java new file mode 100644 index 0000000..381add8 --- /dev/null +++ b/src/main/java/exopandora/worldhandler/gui/content/element/impl/ElementPageList.java @@ -0,0 +1,142 @@ +package exopandora.worldhandler.gui.content.element.impl; + +import java.util.List; + +import exopandora.worldhandler.format.TextFormatting; +import exopandora.worldhandler.gui.button.GuiButtonWorldHandler; +import exopandora.worldhandler.gui.button.storage.ButtonStorage; +import exopandora.worldhandler.gui.container.Container; +import exopandora.worldhandler.gui.content.Content; +import exopandora.worldhandler.gui.content.element.Element; +import exopandora.worldhandler.gui.content.element.logic.ILogicPageList; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiButton; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public class ElementPageList extends Element +{ + private final List list; + private final ILogicPageList logic; + private final int length; + private final int width; + private final int height; + private final int[] ids; + private final ButtonStorage storage; + + public ElementPageList(int x, int y, List list, K initial, int width, int height, int length, Content container, int[] ids, ILogicPageList logic) + { + super(x, y); + this.list = list; + this.length = length; + this.width = width; + this.height = height; + this.logic = logic; + this.storage = container.getStorage(logic.getId()); + this.ids = ids; + + this.list.sort((a, b) -> this.logic.translate(a).compareTo(this.logic.translate(b))); + + if(this.storage.getObject() == null) + { + this.storage.setObject(0); + this.storage.setIndex(Math.max(0, this.list.indexOf(this.logic.convert(initial)))); + + if(initial == null) + { + this.logic.onClick(this.list.get(0)); + } + } + } + + @Override + public void initGui(Container container) + { + + } + + @Override + public void initButtons(Container container) + { + boolean extended = (this.list.size() == this.length + 1); + + if(!extended) + { + int buttonWidth = (this.width - 4) / 2; + + GuiButtonWorldHandler left = new GuiButtonWorldHandler(this.ids[0], this.x, this.y + (this.height + 4) * this.length, buttonWidth + 1, this.height, "<"); + GuiButtonWorldHandler right = new GuiButtonWorldHandler(this.ids[1], this.x + 5 + buttonWidth, this.y + (this.height + 4) * this.length, buttonWidth, this.height, ">"); + + left.enabled = this.storage.getObject() > 0; + right.enabled = this.storage.getObject() < this.getTotalPages() - 1; + + container.add(left); + container.add(right); + } + + int length = (extended ? this.length + 1 : this.length); + + for(int x = 0; x < length; x++) + { + int index = this.storage.getObject() * length + x; + + if(index < this.list.size()) + { + T entry = this.list.get(index); + this.logic.onRegister(this.ids[2], this.x, this.y + (this.height + 4) * x, this.width, this.height, TextFormatting.shortenString(this.logic.translate(entry), this.width, Minecraft.getMinecraft().fontRenderer), this.logic.getRegistryName(entry), this.storage.getIndex() != index, entry, container); + } + else + { + GuiButtonWorldHandler button = new GuiButtonWorldHandler(this.ids[2], this.x, this.y + (this.height + 4) * x, this.width, this.height, null); + button.enabled = false; + container.add(button); + } + } + } + + @Override + public boolean actionPerformed(Container container, GuiButton button) + { + if(button.id == this.ids[0]) + { + this.storage.setObject(this.storage.getObject() - 1); + container.initGui(); + return true; + } + else if(button.id == this.ids[1]) + { + this.storage.setObject(this.storage.getObject() + 1); + container.initGui(); + return true; + } + else if(button.id == this.ids[2]) + { + for(int x = 0; x < this.list.size(); x++) + { + T entry = this.list.get(x); + + if(TextFormatting.shortenString(this.logic.translate(entry), this.width, Minecraft.getMinecraft().fontRenderer).equals(button.displayString)) + { + this.storage.setIndex(x); + this.logic.onClick(entry); + container.initGui(); + return true; + } + } + } + + return false; + } + + @Override + public void draw() + { + Minecraft.getMinecraft().fontRenderer.drawString((this.storage.getObject() + 1) + "/" + this.getTotalPages(), this.x, this.y - 11, 0x4F4F4F); + } + + private int getTotalPages() + { + return (int) Math.ceil((float) this.list.size() / this.length); + } +} diff --git a/src/main/java/exopandora/worldhandler/gui/content/element/logic/ILogicClickList.java b/src/main/java/exopandora/worldhandler/gui/content/element/logic/ILogicClickList.java new file mode 100644 index 0000000..b08b730 --- /dev/null +++ b/src/main/java/exopandora/worldhandler/gui/content/element/logic/ILogicClickList.java @@ -0,0 +1,24 @@ +package exopandora.worldhandler.gui.content.element.logic; + +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public interface ILogicClickList +{ + void consumeKey1(String key); + + default void consumeKey2(String key1, String key2) + { + this.consumeKey1(key1 + "." + key2); + } + + String translate1(String key); + + default String translate2(String key1, String key2) + { + return this.translate1(key2); + } + + String getId(); +} diff --git a/src/main/java/exopandora/worldhandler/gui/content/element/logic/ILogicColorMenu.java b/src/main/java/exopandora/worldhandler/gui/content/element/logic/ILogicColorMenu.java new file mode 100644 index 0000000..72ca679 --- /dev/null +++ b/src/main/java/exopandora/worldhandler/gui/content/element/logic/ILogicColorMenu.java @@ -0,0 +1,22 @@ +package exopandora.worldhandler.gui.content.element.logic; + +import com.google.common.base.Predicate; +import com.google.common.base.Predicates; + +public interface ILogicColorMenu +{ + default Predicate getValidator() + { + return Predicates.notNull(); + } + + default boolean drawTextfield() + { + return true; + } + + default boolean drawButtons() + { + return true; + } +} diff --git a/src/main/java/exopandora/worldhandler/gui/content/element/logic/ILogicPageList.java b/src/main/java/exopandora/worldhandler/gui/content/element/logic/ILogicPageList.java new file mode 100644 index 0000000..be5db0a --- /dev/null +++ b/src/main/java/exopandora/worldhandler/gui/content/element/logic/ILogicPageList.java @@ -0,0 +1,19 @@ +package exopandora.worldhandler.gui.content.element.logic; + +import exopandora.worldhandler.gui.container.Container; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public interface ILogicPageList +{ + String translate(T key); + String getRegistryName(T key); + + void onClick(T clicked); + void onRegister(int id, int x, int y, int width, int height, String display, String registryKey, boolean enabled, T value, Container container); + + T convert(K object); + + String getId(); +} \ No newline at end of file diff --git a/src/main/java/exopandora/worldhandler/gui/content/impl/ContentAdvancements.java b/src/main/java/exopandora/worldhandler/gui/content/impl/ContentAdvancements.java new file mode 100644 index 0000000..14d603e --- /dev/null +++ b/src/main/java/exopandora/worldhandler/gui/content/impl/ContentAdvancements.java @@ -0,0 +1,205 @@ +package exopandora.worldhandler.gui.content.impl; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.StreamSupport; + +import com.mojang.realmsclient.gui.ChatFormatting; + +import exopandora.worldhandler.builder.ICommandBuilder; +import exopandora.worldhandler.builder.impl.BuilderAdvancement; +import exopandora.worldhandler.builder.impl.BuilderAdvancement.EnumActionType; +import exopandora.worldhandler.builder.impl.BuilderAdvancement.EnumMode; +import exopandora.worldhandler.builder.types.Type; +import exopandora.worldhandler.gui.button.EnumTooltip; +import exopandora.worldhandler.gui.button.GuiButtonList; +import exopandora.worldhandler.gui.button.GuiButtonWorldHandler; +import exopandora.worldhandler.gui.button.logic.IListButtonLogic; +import exopandora.worldhandler.gui.button.storage.ButtonStorage; +import exopandora.worldhandler.gui.category.Categories; +import exopandora.worldhandler.gui.category.Category; +import exopandora.worldhandler.gui.container.Container; +import exopandora.worldhandler.gui.container.impl.GuiWorldHandlerContainer; +import exopandora.worldhandler.gui.content.Content; +import exopandora.worldhandler.gui.content.Contents; +import exopandora.worldhandler.gui.content.element.impl.ElementPageList; +import exopandora.worldhandler.gui.content.element.logic.ILogicPageList; +import exopandora.worldhandler.helper.AdvancementHelper; +import exopandora.worldhandler.main.WorldHandler; +import net.minecraft.advancements.Advancement; +import net.minecraft.advancements.AdvancementManager; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiButton; +import net.minecraft.client.resources.I18n; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public class ContentAdvancements extends Content +{ + private final AdvancementHelper helper = new AdvancementHelper(); + private final BuilderAdvancement builderAdvancement = new BuilderAdvancement(EnumMode.values()[0]); + + private GuiButtonList modeButton; + + private final List advancements = StreamSupport.stream(new AdvancementManager(null).getAdvancements().spliterator(), true).filter(advancement -> advancement.getDisplay() != null).collect(Collectors.toList()); + + @Override + public ICommandBuilder getCommandBuilder() + { + return this.builderAdvancement; + } + + @Override + public void initGui(Container container, int x, int y) + { + ElementPageList list = new ElementPageList(x, y, this.advancements, null, 114, 20, 3, this, new int[] {6, 7, 8}, new ILogicPageList() + { + @Override + public String translate(Advancement key) + { + return I18n.format(key.getDisplay().getTitle().getUnformattedText()); + } + + @Override + public void onClick(Advancement clicked) + { + builderAdvancement.setAdvancement(clicked.getId()); + } + + @Override + public String getRegistryName(Advancement key) + { + return key.getId().toString(); + } + + @Override + public void onRegister(int id, int x, int y, int width, int height, String display, String registry, boolean enabled, Advancement value, Container container) + { + GuiButtonWorldHandler button; + container.add(button = new GuiButtonWorldHandler(id, x, y, width, height, display, value.getId().toString(), EnumTooltip.TOP_RIGHT)); + button.enabled = enabled; + } + + @Override + public Advancement convert(String object) + { + return helper.ADVANCEMENT_MANAGER.getAdvancement(Type.parseResourceLocation(object)); + } + + @Override + public String getId() + { + return "advancements"; + } + }); + + container.add(list); + } + + @Override + public void initButtons(Container container, int x, int y) + { + container.add(new GuiButtonWorldHandler(0, x, y + 96, 114, 20, I18n.format("gui.worldhandler.generic.back"))); + container.add(new GuiButtonWorldHandler(1, x + 118, y + 96, 114, 20, I18n.format("gui.worldhandler.generic.backToGame"))); + + container.add(this.modeButton = new GuiButtonList(2, x + 118, y, 114, 20, EnumTooltip.TOP_RIGHT, this, new IListButtonLogic() + { + private final EnumMode[] values = Arrays.stream(EnumMode.values()).filter(mode -> !mode.equals(EnumMode.EVERYTHING)).toArray(EnumMode[]::new); + + @Override + public void actionPerformed(Container container, GuiButton button, ButtonStorage storage) + { + builderAdvancement.setMode(storage.getObject()); + } + + @Override + public int getMax() + { + return this.values.length; + } + + @Override + public EnumMode getObject(int index) + { + return this.values[index]; + } + + @Override + public String getDisplayString(ButtonStorage storage) + { + return I18n.format("gui.worldhandler.advancements." + storage.getObject().toString()); + } + + @Override + public String getId() + { + return "mode"; + } + })); + + container.add(new GuiButtonWorldHandler(3, x + 118, y + 24, 114, 20, I18n.format("gui.worldhandler.advancements.grant"))); + container.add(new GuiButtonWorldHandler(4, x + 118, y + 48, 114, 20, I18n.format("gui.worldhandler.advancements.revoke"))); + container.add(new GuiButtonWorldHandler(5, x + 118, y + 72, 114, 20, ChatFormatting.RED + I18n.format("gui.worldhandler.actions.reset"))); + } + + @Override + public void actionPerformed(Container container, GuiButton button) + { + switch(button.id) + { + case 2: + this.modeButton.actionPerformed(container, button); + container.initGui(); + break; + case 3: + WorldHandler.sendCommand(this.builderAdvancement.getBuilderForAction(EnumActionType.GRANT)); + break; + case 4: + WorldHandler.sendCommand(this.builderAdvancement.getBuilderForAction(EnumActionType.REVOKE)); + break; + case 5: + Minecraft.getMinecraft().displayGuiScreen(new GuiWorldHandlerContainer(Contents.CONTINUE.withBuilder(this.builderAdvancement.getBuilder(EnumActionType.REVOKE, EnumMode.EVERYTHING)).withParent(Contents.ADVANCEMENTS))); + break; + default: + break; + } + } + + @Override + public Category getCategory() + { + return Categories.PLAYER; + } + + @Override + public String getTitle() + { + return I18n.format("gui.worldhandler.title.player.advancements"); + } + + @Override + public String getTabTitle() + { + return I18n.format("gui.worldhandler.tab.player.advancements"); + } + + @Override + public String[] getHeadline() + { + return new String[] {null, I18n.format("gui.worldhandler.generic.options")}; + } + + @Override + public Content getActiveContent() + { + return Contents.ADVANCEMENTS; + } + + @Override + public void onPlayerNameChanged(String username) + { + this.builderAdvancement.setPlayer(username); + } +} diff --git a/src/main/java/exopandora/worldhandler/gui/content/impl/ContentButcher.java b/src/main/java/exopandora/worldhandler/gui/content/impl/ContentButcher.java new file mode 100644 index 0000000..1e964ac --- /dev/null +++ b/src/main/java/exopandora/worldhandler/gui/content/impl/ContentButcher.java @@ -0,0 +1,115 @@ +package exopandora.worldhandler.gui.content.impl; + +import exopandora.worldhandler.builder.ICommandBuilder; +import exopandora.worldhandler.builder.impl.BuilderButcher; +import exopandora.worldhandler.config.ConfigButcher; +import exopandora.worldhandler.gui.button.GuiButtonWorldHandler; +import exopandora.worldhandler.gui.button.GuiTextFieldTooltip; +import exopandora.worldhandler.gui.config.GuiConfigWorldHandler; +import exopandora.worldhandler.gui.container.Container; +import exopandora.worldhandler.gui.content.impl.abstr.ContentChild; +import exopandora.worldhandler.helper.EntityHelper; +import exopandora.worldhandler.main.WorldHandler; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiButton; +import net.minecraft.client.resources.I18n; +import net.minecraft.entity.EntityList; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public class ContentButcher extends ContentChild +{ + private GuiTextFieldTooltip radiusField; + private String radius; + private final BuilderButcher builderButcher = new BuilderButcher(); + + @Override + public ICommandBuilder getCommandBuilder() + { + return this.builderButcher; + } + + @Override + public void initGui(Container container, int x, int y) + { + this.radiusField = new GuiTextFieldTooltip(x + 116 / 2, y + 12, 116, 20, I18n.format("gui.worldhandler.butcher.radius")); + this.radiusField.setValidator(string -> string != null && string.matches("[0-9]*")); + this.radiusField.setText(this.radius); + } + + @Override + public void initButtons(Container container, int x, int y) + { + GuiButtonWorldHandler slaughter; + + container.add(new GuiButtonWorldHandler(0, x, y + 96, 114, 20, I18n.format("gui.worldhandler.generic.back"))); + container.add(new GuiButtonWorldHandler(1, x + 118, y + 96, 114, 20, I18n.format("gui.worldhandler.generic.backToGame"))); + + container.add(new GuiButtonWorldHandler(3, x + 116 / 2, y + 36, 232 / 2, 20, I18n.format("gui.worldhandler.butcher.configure"))); + container.add(slaughter = new GuiButtonWorldHandler(2, x + 116 / 2, y + 60, 232 / 2, 20, I18n.format("gui.worldhandler.butcher.slaughter"))); + + slaughter.enabled = this.radius != null && this.radius.matches("[0-9]+"); + } + + @Override + public void actionPerformed(Container container, GuiButton button) + { + switch(button.id) + { + case 2: + for(ResourceLocation entity : EntityList.ENTITY_EGGS.keySet()) + { + if(ConfigButcher.getEntitiyMap().get(EntityHelper.getEntityName(entity))) + { + WorldHandler.sendCommand(new BuilderButcher(entity, Integer.valueOf(this.radius))); + } + } + break; + case 3: + Minecraft.getMinecraft().displayGuiScreen(new GuiConfigWorldHandler(container, ConfigButcher.CATEGORY)); + break; + default: + break; + } + } + + @Override + public void drawScreen(Container container, int x, int y, int mouseX, int mouseY, float partialTicks) + { + this.radiusField.drawTextBox(); + } + + @Override + public String getTitle() + { + return I18n.format("gui.worldhandler.title.butcher"); + } + + @Override + public void keyTyped(Container container, char typedChar, int keyCode) + { + if(this.radiusField.textboxKeyTyped(typedChar, keyCode)) + { + this.radius = this.radiusField.getText(); + + if(this.radius.length() > 0) + { + this.builderButcher.setRadius(Integer.valueOf(this.radius)); + } + else + { + this.builderButcher.setRadius(0); + } + + container.initButtons(); + } + } + + @Override + public void mouseClicked(int mouseX, int mouseY, int mouseButton) + { + this.radiusField.mouseClicked(mouseX, mouseY, mouseButton); + } +} diff --git a/src/main/java/exopandora/worldhandler/gui/content/impl/ContentChangeWorld.java b/src/main/java/exopandora/worldhandler/gui/content/impl/ContentChangeWorld.java new file mode 100644 index 0000000..9b85969 --- /dev/null +++ b/src/main/java/exopandora/worldhandler/gui/content/impl/ContentChangeWorld.java @@ -0,0 +1,48 @@ +package exopandora.worldhandler.gui.content.impl; + +import exopandora.worldhandler.gui.button.GuiButtonWorldHandler; +import exopandora.worldhandler.gui.container.Container; +import exopandora.worldhandler.gui.content.impl.abstr.ContentChild; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiButton; +import net.minecraft.client.gui.GuiMultiplayer; +import net.minecraft.client.gui.GuiWorldSelection; +import net.minecraft.client.resources.I18n; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public class ContentChangeWorld extends ContentChild +{ + @Override + public void initButtons(Container container, int x, int y) + { + container.add(new GuiButtonWorldHandler(0, x, y + 96, 114, 20, I18n.format("gui.worldhandler.generic.back"))); + container.add(new GuiButtonWorldHandler(1, x + 118, y + 96, 114, 20, I18n.format("gui.worldhandler.generic.backToGame"))); + + container.add(new GuiButtonWorldHandler(2, x + 116 / 2, y + 24, 232 / 2, 20, I18n.format("gui.worldhandler.change_world.singleplayer"))); + container.add(new GuiButtonWorldHandler(3, x + 116 / 2, y + 48, 232 / 2, 20, I18n.format("gui.worldhandler.change_world.multiplayer"))); + } + + @Override + public void actionPerformed(Container container, GuiButton button) + { + switch(button.id) + { + case 2: + Minecraft.getMinecraft().displayGuiScreen(new GuiWorldSelection(container)); + break; + case 3: + Minecraft.getMinecraft().displayGuiScreen(new GuiMultiplayer(container)); + break; + default: + break; + } + } + + @Override + public String getTitle() + { + return I18n.format("gui.worldhandler.title.change_world"); + } +} diff --git a/src/main/java/exopandora/worldhandler/gui/content/impl/ContentContainers.java b/src/main/java/exopandora/worldhandler/gui/content/impl/ContentContainers.java new file mode 100644 index 0000000..605900b --- /dev/null +++ b/src/main/java/exopandora/worldhandler/gui/content/impl/ContentContainers.java @@ -0,0 +1,136 @@ +package exopandora.worldhandler.gui.content.impl; + +import exopandora.worldhandler.builder.impl.BuilderGive; +import exopandora.worldhandler.builder.impl.BuilderSetblock; +import exopandora.worldhandler.builder.types.Coordinate; +import exopandora.worldhandler.config.ConfigSettings; +import exopandora.worldhandler.gui.button.GuiButtonItem; +import exopandora.worldhandler.gui.button.GuiButtonWorldHandler; +import exopandora.worldhandler.gui.category.Categories; +import exopandora.worldhandler.gui.category.Category; +import exopandora.worldhandler.gui.container.Container; +import exopandora.worldhandler.gui.content.Content; +import exopandora.worldhandler.gui.content.Contents; +import exopandora.worldhandler.helper.BlockHelper; +import exopandora.worldhandler.main.WorldHandler; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiButton; +import net.minecraft.client.gui.GuiScreen; +import net.minecraft.client.resources.I18n; +import net.minecraft.init.Blocks; +import net.minecraft.item.ItemStack; +import net.minecraft.util.math.MathHelper; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public class ContentContainers extends Content +{ + @Override + public void initButtons(Container container, int x, int y) + { + container.add(new GuiButtonWorldHandler(1, x, y + 96, 232, 20, I18n.format("gui.worldhandler.generic.backToGame"))); + + container.add(new GuiButtonWorldHandler(3, x + 24, y, 208, 20, Blocks.CRAFTING_TABLE.getLocalizedName())); + container.add(new GuiButtonWorldHandler(4, x + 24, y + 24, 208, 20, Blocks.ENDER_CHEST.getLocalizedName())); + container.add(new GuiButtonWorldHandler(5, x + 24, y + 48, 208, 20, Blocks.ANVIL.getLocalizedName())); + container.add(new GuiButtonWorldHandler(6, x + 24, y + 72, 208, 20, Blocks.ENCHANTING_TABLE.getLocalizedName())); + + container.add(new GuiButtonItem(7, x, y, 20, 20, new ItemStack(Blocks.CRAFTING_TABLE))); + container.add(new GuiButtonItem(8, x, y + 24, 20, 20, new ItemStack(Blocks.ENDER_CHEST))); + container.add(new GuiButtonItem(9, x, y + 48, 20, 20, new ItemStack(Blocks.ANVIL))); + container.add(new GuiButtonItem(10, x, y + 72, 20, 20, new ItemStack(Blocks.ENCHANTING_TABLE))); + } + + @Override + public void actionPerformed(Container container, GuiButton button) + { + switch(button.id) + { + case 3: + BlockHelper.setBlockNearPlayer(Blocks.CRAFTING_TABLE, (byte) 0, (byte) 0, (byte) 0, (byte) 0); + Minecraft.getMinecraft().displayGuiScreen((GuiScreen) null); + Minecraft.getMinecraft().setIngameFocus(); + break; + case 4: + BlockHelper.setBlockNearPlayer(Blocks.ENDER_CHEST, (byte) 2, (byte) 5, (byte) 3, (byte) 4); + Minecraft.getMinecraft().displayGuiScreen((GuiScreen) null); + Minecraft.getMinecraft().setIngameFocus(); + break; + case 5: + BlockHelper.setBlockNearPlayer(Blocks.ANVIL, (byte) 1, (byte) 0, (byte) 1, (byte) 0); + Minecraft.getMinecraft().displayGuiScreen((GuiScreen) null); + Minecraft.getMinecraft().setIngameFocus(); + break; + case 6: + BlockHelper.setBlockNearPlayer(Blocks.ENCHANTING_TABLE, (byte) 0, (byte) 0, (byte) 0, (byte) 0); + + int direction = MathHelper.floor((double) (Minecraft.getMinecraft().player.rotationYaw * 4.0F / 360.0F) + 0.5D) & 3; + double angle = direction * Math.PI / 2; + double sin = Math.sin(angle); + double cos = Math.cos(angle); + + for(int x = -2; x <= 2; x++) + { + for(int y = 0; y <= 1; y++) + { + for(int z = 1; z <= 4; z++) + { + if(!(x >= -1 && x <= 1 && z < 4)) + { + WorldHandler.sendCommand(new BuilderSetblock(new Coordinate(x * cos - z * sin, true), new Coordinate(y, true), new Coordinate(x * sin + z * cos, true), Blocks.BOOKSHELF.getRegistryName(), ConfigSettings.getMode())); + } + } + } + } + + Minecraft.getMinecraft().displayGuiScreen((GuiScreen) null); + Minecraft.getMinecraft().setIngameFocus(); + break; + case 7: + WorldHandler.sendCommand(new BuilderGive(container.getPlayer(), Blocks.CRAFTING_TABLE.getRegistryName())); + break; + case 8: + WorldHandler.sendCommand(new BuilderGive(container.getPlayer(), Blocks.ENDER_CHEST.getRegistryName())); + break; + case 9: + WorldHandler.sendCommand(new BuilderGive(container.getPlayer(), Blocks.ANVIL.getRegistryName())); + break; + case 10: + WorldHandler.sendCommand(new BuilderGive(container.getPlayer(), Blocks.ENCHANTING_TABLE.getRegistryName())); + break; + default: + break; + } + } + + @Override + public Category getCategory() + { + return Categories.MAIN; + } + + @Override + public String getTitle() + { + return I18n.format("gui.worldhandler.title.containers"); + } + + @Override + public String getTabTitle() + { + return I18n.format("gui.worldhandler.tab.containers"); + } + + @Override + public Content getActiveContent() + { + return Contents.CONTAINERS; + } + + @Override + public Content getBackContent() + { + return null; + } +} diff --git a/src/main/java/exopandora/worldhandler/gui/content/impl/ContentContinue.java b/src/main/java/exopandora/worldhandler/gui/content/impl/ContentContinue.java new file mode 100644 index 0000000..60d4f10 --- /dev/null +++ b/src/main/java/exopandora/worldhandler/gui/content/impl/ContentContinue.java @@ -0,0 +1,120 @@ +package exopandora.worldhandler.gui.content.impl; + +import org.lwjgl.input.Keyboard; + +import com.mojang.realmsclient.gui.ChatFormatting; + +import exopandora.worldhandler.builder.ICommandBuilder; +import exopandora.worldhandler.builder.ICommandBuilderSyntax; +import exopandora.worldhandler.gui.button.GuiButtonWorldHandler; +import exopandora.worldhandler.gui.button.GuiTextFieldTooltip; +import exopandora.worldhandler.gui.container.Container; +import exopandora.worldhandler.gui.container.impl.GuiWorldHandlerContainer; +import exopandora.worldhandler.gui.content.impl.abstr.ContentChild; +import exopandora.worldhandler.main.WorldHandler; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiButton; +import net.minecraft.client.resources.I18n; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public class ContentContinue extends ContentChild +{ + private ICommandBuilder builder; + private GuiTextFieldTooltip commandField; + private boolean special; + + public ContentContinue withBuilder(ICommandBuilder builder) + { + return this.withBuilder(builder, false); + } + + public ContentContinue withBuilder(ICommandBuilder builder, boolean special) + { + this.builder = builder; + this.special = special; + return this; + } + + @Override + public ICommandBuilder getCommandBuilder() + { + return this.builder; + } + + @Override + public void initGui(Container container, int x, int y) + { + this.commandField = new GuiTextFieldTooltip(x + 116 / 2, y + 12, 116, 20); + this.commandField.setFocused(false); + + if(this.builder instanceof ICommandBuilderSyntax) + { + this.commandField.setText(((ICommandBuilderSyntax) this.builder).toActualCommand()); + } + else + { + this.commandField.setText(this.builder.toCommand()); + } + + this.commandField.setCursorPositionZero(); + } + + @Override + public void initButtons(Container container, int x, int y) + { + container.add(new GuiButtonWorldHandler(0, x, y + 96, 114, 20, I18n.format("gui.worldhandler.generic.back"))); + container.add(new GuiButtonWorldHandler(1, x + 118, y + 96, 114, 20, I18n.format("gui.worldhandler.generic.backToGame"))); + + container.add(new GuiButtonWorldHandler(2, x + 116 / 2, y + 36, 116, 20, ChatFormatting.RED + I18n.format("gui.worldhandler.generic.yes"))); + container.add(new GuiButtonWorldHandler(0, x + 116 / 2, y + 60, 116, 20, I18n.format("gui.worldhandler.generic.no"))); + } + + @Override + public void actionPerformed(Container container, GuiButton button) + { + switch(button.id) + { + case 2: + WorldHandler.sendCommand(this.builder, this.special); + Minecraft.getMinecraft().displayGuiScreen(new GuiWorldHandlerContainer(this.parent)); + break; + default: + break; + } + } + + @Override + public void drawScreen(Container container, int x, int y, int mouseX, int mouseY, float partialTicks) + { + this.commandField.drawTextBox(); + } + + @Override + public String[] getHeadline() + { + return new String[]{I18n.format("gui.worldhandler.continue.question")}; + } + + @Override + public void keyTyped(Container container, char typedChar, int keyCode) + { + if(keyCode == Keyboard.KEY_RIGHT || keyCode == Keyboard.KEY_LEFT) + { + this.commandField.textboxKeyTyped(typedChar, keyCode); + } + } + + @Override + public void mouseClicked(int mouseX, int mouseY, int mouseButton) + { + this.commandField.mouseClicked(mouseX, mouseY, mouseButton); + } + + @Override + public String getTitle() + { + return this.parent.getTitle(); + } +} diff --git a/src/main/java/exopandora/worldhandler/gui/content/impl/ContentCustomItem.java b/src/main/java/exopandora/worldhandler/gui/content/impl/ContentCustomItem.java new file mode 100644 index 0000000..bd23c0e --- /dev/null +++ b/src/main/java/exopandora/worldhandler/gui/content/impl/ContentCustomItem.java @@ -0,0 +1,359 @@ +package exopandora.worldhandler.gui.content.impl; + +import java.util.ArrayList; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import com.google.common.base.Predicates; + +import exopandora.worldhandler.builder.ICommandBuilder; +import exopandora.worldhandler.builder.impl.BuilderCustomItem; +import exopandora.worldhandler.builder.impl.abstr.EnumAttributes; +import exopandora.worldhandler.builder.impl.abstr.EnumAttributes.Applyable; +import exopandora.worldhandler.gui.button.GuiButtonList; +import exopandora.worldhandler.gui.button.GuiButtonWorldHandler; +import exopandora.worldhandler.gui.button.GuiSlider; +import exopandora.worldhandler.gui.button.GuiTextFieldTooltip; +import exopandora.worldhandler.gui.button.responder.AttributeResponder; +import exopandora.worldhandler.gui.button.responder.SimpleResponder; +import exopandora.worldhandler.gui.category.Categories; +import exopandora.worldhandler.gui.category.Category; +import exopandora.worldhandler.gui.container.Container; +import exopandora.worldhandler.gui.content.Content; +import exopandora.worldhandler.gui.content.Contents; +import exopandora.worldhandler.gui.content.element.impl.ElementColorMenu; +import exopandora.worldhandler.gui.content.element.impl.ElementPageList; +import exopandora.worldhandler.gui.content.element.logic.ILogicPageList; +import exopandora.worldhandler.helper.ResourceHelper; +import exopandora.worldhandler.main.WorldHandler; +import net.minecraft.client.gui.GuiButton; +import net.minecraft.client.resources.I18n; +import net.minecraft.enchantment.Enchantment; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public class ContentCustomItem extends Content +{ + private GuiTextFieldTooltip itemField; + private GuiTextFieldTooltip itemLore1Field; + private GuiTextFieldTooltip itemLore2Field; + + private final BuilderCustomItem builderCutomItem = new BuilderCustomItem(); + + private int startPage; + + private String selectedPage = "start"; + private String item; + + private GuiButtonList colorButton; + + @Override + public ICommandBuilder getCommandBuilder() + { + return this.builderCutomItem; + } + + @Override + public void initGui(Container container, int x, int y) + { + this.itemField = new GuiTextFieldTooltip(x + 118, y, 114, 20, I18n.format("gui.worldhandler.items.give_custom_item.start.item_id")); + this.itemField.setValidator(Predicates.notNull()); + this.itemField.setText(this.item); + + this.itemLore1Field = new GuiTextFieldTooltip(x + 118, y + 24, 114, 20, I18n.format("gui.worldhandler.items.give_custom_item.start.lore_1")); + this.itemLore1Field.setValidator(Predicates.notNull()); + this.itemLore1Field.setText(this.builderCutomItem.getLore1()); + + this.itemLore2Field = new GuiTextFieldTooltip(x + 118, y + 48, 114, 20, I18n.format("gui.worldhandler.items.give_custom_item.start.lore_2")); + this.itemLore2Field.setValidator(Predicates.notNull()); + this.itemLore2Field.setText(this.builderCutomItem.getLore2()); + + if(this.selectedPage.equals("start")) + { + if(this.startPage == 1) + { + ElementColorMenu colors = new ElementColorMenu(this, x, y, "gui.worldhandler.items.give_custom_item.start.custom_name", this.builderCutomItem.getName(), new int[] {10, 11, 12, 13, 14, 15}); + container.add(colors); + } + } + else if(this.selectedPage.equals("enchant")) + { + ElementPageList enchantments = new ElementPageList(x + 118, y, new ArrayList(Enchantment.REGISTRY.getKeys()), null, 114, 20, 3, this, new int[] {10, 11, 12}, new ILogicPageList() + { + @Override + public String translate(ResourceLocation key) + { + return I18n.format(Enchantment.REGISTRY.getObject(key).getName()); + } + + @Override + public String getRegistryName(ResourceLocation key) + { + return key.toString(); + } + + @Override + public void onClick(ResourceLocation clicked) + { + + } + + @Override + public void onRegister(int id, int x, int y, int width, int height, String display, String registry, boolean enabled, ResourceLocation value, Container container) + { + container.add(new GuiSlider(Contents.CUSTOM_ITEM, container, value, x, y, width, height, display, 0, 100, 0, new SimpleResponder(response -> + { + builderCutomItem.setEnchantment(Enchantment.REGISTRY.getObject(value), response.shortValue()); + }))); + } + + @Override + public ResourceLocation convert(String object) + { + if(object != null) + { + return new ResourceLocation(object.toString()); + } + + return null; + } + + @Override + public String getId() + { + return "enchantments"; + } + }); + + container.add(enchantments); + } + else if(this.selectedPage.equals("attributes")) + { + ElementPageList attributes = new ElementPageList(x + 118, y, Stream.concat(EnumAttributes.getAttributesFor(Applyable.BOTH).stream(), EnumAttributes.getAttributesFor(Applyable.PLAYER).stream()).collect(Collectors.toList()), null, 114, 20, 3, this, new int[] {13, 14, 15}, new ILogicPageList() + { + @Override + public String translate(EnumAttributes key) + { + return I18n.format("attribute.name." + key.getAttribute()); + } + + @Override + public void onClick(EnumAttributes clicked) + { + + } + + @Override + public String getRegistryName(EnumAttributes key) + { + return key.getAttribute(); + } + + @Override + public void onRegister(int id, int x, int y, int width, int height, String display, String registry, boolean enabled, EnumAttributes value, Container container) + { + container.add(new GuiSlider(Contents.CUSTOM_ITEM, container, value, x, y, width, height, display, value.getMin(), value.getMax(), value.getStart(), new AttributeResponder(response -> + { + builderCutomItem.setAttribute(value, response); + }))); + } + + @Override + public EnumAttributes convert(Object object) + { + return null; + } + + @Override + public String getId() + { + return "attributes"; + } + }); + + container.add(attributes); + } + } + + @Override + public void initButtons(Container container, int x, int y) + { + GuiButtonWorldHandler button3; + GuiButtonWorldHandler button4; + GuiButtonWorldHandler button5; + GuiButtonWorldHandler button6; + GuiButtonWorldHandler button7; + GuiButtonWorldHandler button8; + GuiButtonWorldHandler button9; + GuiButtonWorldHandler button10; + GuiButtonWorldHandler button11; + + container.add(new GuiButtonWorldHandler(0, x, y + 96, 114, 20, I18n.format("gui.worldhandler.generic.back"))); + container.add(new GuiButtonWorldHandler(1, x + 118, y + 96, 114, 20, I18n.format("gui.worldhandler.generic.backToGame"))); + + container.add(button3 = new GuiButtonWorldHandler(3, x, y, 114, 20, I18n.format("gui.worldhandler.items.give_custom_item.start"))); + container.add(button4 = new GuiButtonWorldHandler(4, x, y + 24, 114, 20, I18n.format("gui.worldhandler.items.give_custom_item.enchantment"))); + container.add(button5 = new GuiButtonWorldHandler(5, x, y + 48, 114, 20, I18n.format("gui.worldhandler.items.give_custom_item.attributes"))); + + if(this.selectedPage.equals("start")) + { + button3.enabled = false; + + container.add(button7 = new GuiButtonWorldHandler(6, x + 118, y + 72, 56, 20, "<")); + container.add(button8 = new GuiButtonWorldHandler(7, x + 118 + 60, y + 72, 55, 20, ">")); + + button7.enabled = this.startPage != 0; + button8.enabled = this.startPage != 1; + } + else if(this.selectedPage.equals("enchant")) + { + button4.enabled = false; + } + else if(this.selectedPage.equals("attributes")) + { + button5.enabled = false; + } + + if(!this.builderCutomItem.needsCommandBlock() && !this.builderCutomItem.getName().isSpecial()) + { + container.add(button6 = new GuiButtonWorldHandler(9, x, y + 72, 114, 20, I18n.format("gui.worldhandler.items.give_custom_item.give_custom_item"))); + } + else + { + container.add(button6 = new GuiButtonWorldHandler(9, x, y + 72, 114, 20, I18n.format("gui.worldhandler.actions.place_command_block"))); + } + + button6.enabled = ResourceHelper.isRegisteredItem(this.item); + } + + @Override + public void actionPerformed(Container container, GuiButton button) + { + switch(button.id) + { + case 3: + this.selectedPage = "start"; + container.initGui(); + break; + case 4: + this.selectedPage = "enchant"; + container.initGui(); + break; + case 5: + this.selectedPage = "attributes"; + container.initGui(); + break; + case 6: + this.startPage--; + container.initGui(); + break; + case 7: + this.startPage++; + container.initGui(); + break; + case 9: + WorldHandler.sendCommand(this.builderCutomItem, this.builderCutomItem.getName().isSpecial()); + break; + default: + break; + } + } + + @Override + public void drawScreen(Container container, int x, int y, int mouseX, int mouseY, float partialTicks) + { + if(this.selectedPage.equals("start")) + { + if(this.startPage == 0) + { + this.itemField.drawTextBox(); + this.itemLore1Field.drawTextBox(); + this.itemLore2Field.drawTextBox(); + } + } + } + + @Override + public void keyTyped(Container container, char charTyped, int keyCode) + { + if(this.itemField.textboxKeyTyped(charTyped, keyCode)) + { + this.item = this.itemField.getText(); + this.builderCutomItem.setItem(this.item); + container.initButtons(); + } + + if(this.itemLore1Field.textboxKeyTyped(charTyped, keyCode)) + { + this.builderCutomItem.setLore1(this.itemLore1Field.getText()); + container.initButtons(); + } + + if(this.itemLore2Field.textboxKeyTyped(charTyped, keyCode)) + { + this.builderCutomItem.setLore2(this.itemLore2Field.getText()); + container.initButtons(); + } + } + + @Override + public void mouseClicked(int mouseX, int mouseY, int mouseButton) + { + if(this.selectedPage.equals("start")) + { + if(this.startPage == 0) + { + this.itemField.mouseClicked(mouseX, mouseY, mouseButton); + this.itemLore1Field.mouseClicked(mouseX, mouseY, mouseButton); + this.itemLore2Field.mouseClicked(mouseX, mouseY, mouseButton); + } + } + } + + @Override + public Category getCategory() + { + return Categories.ITEMS; + } + + @Override + public String getTitle() + { + return I18n.format("gui.worldhandler.title.items.give_custom_item"); + } + + @Override + public String getTabTitle() + { + return I18n.format("gui.worldhandler.tab.items.give_custom_item"); + } + + @Override + public String[] getHeadline() + { + String[] headline = new String[2]; + + headline[0] = I18n.format("gui.worldhandler.generic.browse"); + + if(this.selectedPage.equals("start")) + { + headline[1] = I18n.format("gui.worldhandler.generic.options"); + } + + return headline; + } + + @Override + public Content getActiveContent() + { + return Contents.CUSTOM_ITEM; + } + + @Override + public void onPlayerNameChanged(String username) + { + this.builderCutomItem.setPlayer(username); + } +} diff --git a/src/main/java/exopandora/worldhandler/gui/content/impl/ContentEditBlocks.java b/src/main/java/exopandora/worldhandler/gui/content/impl/ContentEditBlocks.java new file mode 100644 index 0000000..8321aa5 --- /dev/null +++ b/src/main/java/exopandora/worldhandler/gui/content/impl/ContentEditBlocks.java @@ -0,0 +1,408 @@ +package exopandora.worldhandler.gui.content.impl; + +import com.google.common.base.Predicate; +import com.google.common.base.Predicates; + +import exopandora.worldhandler.builder.ICommandBuilder; +import exopandora.worldhandler.builder.impl.BuilderClone; +import exopandora.worldhandler.builder.impl.BuilderClone.EnumMask; +import exopandora.worldhandler.builder.impl.BuilderFill; +import exopandora.worldhandler.builder.impl.BuilderWH; +import exopandora.worldhandler.gui.button.EnumTooltip; +import exopandora.worldhandler.gui.button.GuiButtonList; +import exopandora.worldhandler.gui.button.GuiButtonWorldHandler; +import exopandora.worldhandler.gui.button.GuiTextFieldTooltip; +import exopandora.worldhandler.gui.button.logic.IListButtonLogic; +import exopandora.worldhandler.gui.button.storage.ButtonStorage; +import exopandora.worldhandler.gui.category.Categories; +import exopandora.worldhandler.gui.category.Category; +import exopandora.worldhandler.gui.container.Container; +import exopandora.worldhandler.gui.content.Content; +import exopandora.worldhandler.gui.content.Contents; +import exopandora.worldhandler.helper.BlockHelper; +import exopandora.worldhandler.helper.ResourceHelper; +import exopandora.worldhandler.main.WorldHandler; +import net.minecraft.client.gui.GuiButton; +import net.minecraft.client.resources.I18n; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public class ContentEditBlocks extends Content +{ + private GuiTextFieldTooltip x1Field; + private GuiTextFieldTooltip y1Field; + private GuiTextFieldTooltip z1Field; + + private GuiTextFieldTooltip x2Field; + private GuiTextFieldTooltip y2Field; + private GuiTextFieldTooltip z2Field; + + private GuiTextFieldTooltip block1Field; + private GuiTextFieldTooltip block2Field; + + private final BuilderFill builderFill = new BuilderFill().addPositionObservers(); + private final BuilderClone builderClone = new BuilderClone().addPositionObservers(); + private final BuilderWH builderWH = new BuilderWH(); + + private String block1; + private String block2; + + private GuiButtonList cloneButton; + + private String selectedPage = "coordinates"; + + @Override + public ICommandBuilder getCommandBuilder() + { + if(this.selectedPage.equals("coordinates")) + { + return this.builderWH; + } + else if(this.selectedPage.equals("fill") || this.selectedPage.equals("replace")) + { + return this.builderFill; + } + else if(this.selectedPage.equals("clone")) + { + return this.builderClone; + } + + return null; + } + + @Override + public void initGui(Container container, int x, int y) + { + this.x1Field = new GuiTextFieldTooltip(x + 118, y, 55, 20); + this.x1Field.setValidator(this.getCoordinatePredicate("X1")); + this.x1Field.setText("X1: " + BlockHelper.getPos1().getX()); + + this.y1Field = new GuiTextFieldTooltip(x + 118, y + 24, 55, 20); + this.y1Field.setValidator(this.getCoordinatePredicate("Y1")); + this.y1Field.setText("Y1: " + BlockHelper.getPos1().getY()); + + this.z1Field = new GuiTextFieldTooltip(x + 118, y + 48, 55, 20); + this.z1Field.setValidator(this.getCoordinatePredicate("Z1")); + this.z1Field.setText("Z1: " + BlockHelper.getPos1().getZ()); + + this.x2Field = new GuiTextFieldTooltip(x + 118 + 59, y, 55, 20); + this.x2Field.setValidator(this.getCoordinatePredicate("X2")); + this.x2Field.setText("X2: " + BlockHelper.getPos2().getX()); + + this.y2Field = new GuiTextFieldTooltip(x + 118 + 59, y + 24, 55, 20); + this.y2Field.setValidator(this.getCoordinatePredicate("Y2")); + this.y2Field.setText("Y2: " + BlockHelper.getPos2().getY()); + + this.z2Field = new GuiTextFieldTooltip(x + 118 + 59, y + 48, 55, 20); + this.z2Field.setValidator(this.getCoordinatePredicate("Z2")); + this.z2Field.setText("Z2: " + BlockHelper.getPos2().getZ()); + + this.block1Field = new GuiTextFieldTooltip(x + 118, y, 114, 20, this.selectedPage.equals("fill") ? I18n.format("gui.worldhandler.edit_blocks.fill.block_id_to_fill") : I18n.format("gui.worldhandler.edit_blocks.replace.block_id_replace")); + this.block1Field.setValidator(Predicates.notNull()); + this.block1Field.setText(this.block1); + + this.block2Field = new GuiTextFieldTooltip(x + 118, y + 24, 114, 20, I18n.format("gui.worldhandler.edit_blocks.replace.block_id_place")); + this.block2Field.setValidator(Predicates.notNull()); + this.block2Field.setText(this.block2); + } + + @Override + public void initButtons(Container container, int x, int y) + { + GuiButtonWorldHandler button3; + GuiButtonWorldHandler button4; + GuiButtonWorldHandler button5; + GuiButtonWorldHandler button6; + + container.add(new GuiButtonWorldHandler(0, x, y + 96, 114, 20, I18n.format("gui.worldhandler.generic.back"))); + container.add(new GuiButtonWorldHandler(1, x + 118, y + 96, 114, 20, I18n.format("gui.worldhandler.generic.backToGame"))); + + container.add(button3 = new GuiButtonWorldHandler(2, x, y, 114, 20, I18n.format("gui.worldhandler.edit_blocks.coordinates"))); + container.add(button4 = new GuiButtonWorldHandler(3, x, y + 24, 114, 20, I18n.format("gui.worldhandler.edit_blocks.fill"))); + container.add(button5 = new GuiButtonWorldHandler(4, x, y + 48, 114, 20, I18n.format("gui.worldhandler.edit_blocks.replace"))); + container.add(button6 = new GuiButtonWorldHandler(5, x, y + 72, 114, 20, I18n.format("gui.worldhandler.edit_blocks.clone"))); + + int yOffset1 = 0; + int yOffset2 = 0; + int xOffset2 = 0; + int width1 = 0; + int width2 = 0; + + if(this.selectedPage.equals("coordinates")) + { + button3.enabled = false; + + yOffset1 = 72; + yOffset2 = 72; + width1 = 56; + width2 = 56; + xOffset2 = 58; + } + else if(this.selectedPage.equals("fill")) + { + button4.enabled = false; + + yOffset1 = 24; + yOffset2 = 48; + width1 = 114; + width2 = 114; + xOffset2 = 0; + + container.add(button3 = new GuiButtonWorldHandler(10, x + 118, y + 72, 114, 20, I18n.format("gui.worldhandler.edit_blocks.fill"))); + button3.enabled = ResourceHelper.isRegisteredBlock(this.builderFill.getBlock1String()); + } + else if(this.selectedPage.equals("replace")) + { + button5.enabled = false; + + yOffset1 = 48; + yOffset2 = 48; + width1 = 56; + width2 = 56; + xOffset2 = 58; + + container.add(button3 = new GuiButtonWorldHandler(8, x + 118, y + 72, 114, 20, I18n.format("gui.worldhandler.edit_blocks.replace"))); + button3.enabled = ResourceHelper.isRegisteredBlock(this.builderFill.getBlock1String()) && ResourceHelper.isRegisteredBlock(this.builderFill.getBlock2String()); + } + else if(this.selectedPage.equals("clone")) + { + button6.enabled = false; + + yOffset1 = 24; + yOffset2 = 48; + width1 = 114; + width2 = 114; + xOffset2 = 0; + + container.add(this.cloneButton = new GuiButtonList(9, x + 118, y, 114, 20, EnumTooltip.TOP_RIGHT, this, new IListButtonLogic() + { + @Override + public void actionPerformed(Container container, GuiButton button, ButtonStorage storage) + { + builderClone.setMask(storage.getObject()); + } + + @Override + public int getMax() + { + return EnumMask.values().length; + } + + @Override + public EnumMask getObject(int index) + { + return EnumMask.values()[index]; + } + + @Override + public String getDisplayString(ButtonStorage storage) + { + return I18n.format("gui.worldhandler.edit_blocks.clone.mode." + storage.getObject().toString()); + } + + @Override + public String getId() + { + return "mask"; + } + })); + + container.add(new GuiButtonWorldHandler(11, x + 118, y + 72, 114, 20, I18n.format("gui.worldhandler.edit_blocks.clone"))); + } + + container.add(new GuiButtonWorldHandler(6, x + 118, y + yOffset1, width1, 20, I18n.format("gui.worldhandler.edit_blocks.pos.set_pos_1"))); + container.add(new GuiButtonWorldHandler(7, x + 118 + xOffset2, y + yOffset2, width2, 20, I18n.format("gui.worldhandler.edit_blocks.pos.set_pos_2"))); + } + + @Override + public void actionPerformed(Container container, GuiButton button) + { + switch(button.id) + { + case 2: + this.selectedPage = "coordinates"; + container.initGui(); + break; + case 3: + this.selectedPage = "fill"; + container.initGui(); + break; + case 4: + this.selectedPage = "replace"; + container.initGui(); + break; + case 5: + this.selectedPage = "clone"; + container.initGui(); + break; + case 6: + BlockHelper.setPos1(BlockHelper.getFocusedBlockPos()); + container.initGui(); + break; + case 7: + BlockHelper.setPos2(BlockHelper.getFocusedBlockPos()); + container.initGui(); + break; + case 8: + WorldHandler.sendCommand(this.builderFill.getBuilderForReplace()); + break; + case 9: + this.cloneButton.actionPerformed(container, button); + break; + case 10: + WorldHandler.sendCommand(this.builderFill.getBuilderForFill()); + break; + case 11: + WorldHandler.sendCommand(this.builderClone); + break; + default: + break; + } + } + + @Override + public void drawScreen(Container container, int x, int y, int mouseX, int mouseY, float partialTicks) + { + if(this.selectedPage.equals("coordinates")) + { + this.x1Field.drawTextBox(); + this.y1Field.drawTextBox(); + this.z1Field.drawTextBox(); + + this.x2Field.drawTextBox(); + this.y2Field.drawTextBox(); + this.z2Field.drawTextBox(); + } + else if(this.selectedPage.equals("fill")) + { + this.block1Field.drawTextBox(); + } + else if(this.selectedPage.equals("replace")) + { + this.block1Field.drawTextBox(); + this.block2Field.drawTextBox(); + } + } + + @Override + public void keyTyped(Container container, char typedChar, int keyCode) + { + if(this.x1Field.textboxKeyTyped(typedChar, keyCode)) + { + BlockHelper.setPos1(BlockHelper.setX(BlockHelper.getPos1(), this.filterCoordinateText(this.x1Field.getText()))); + } + + if(this.y1Field.textboxKeyTyped(typedChar, keyCode)) + { + BlockHelper.setPos1(BlockHelper.setY(BlockHelper.getPos1(), this.filterCoordinateText(this.y1Field.getText()))); + } + + if(this.z1Field.textboxKeyTyped(typedChar, keyCode)) + { + BlockHelper.setPos1(BlockHelper.setZ(BlockHelper.getPos1(), this.filterCoordinateText(this.z1Field.getText()))); + } + + if(this.x2Field.textboxKeyTyped(typedChar, keyCode)) + { + BlockHelper.setPos2(BlockHelper.setX(BlockHelper.getPos2(), this.filterCoordinateText(this.x2Field.getText()))); + } + + if(this.y2Field.textboxKeyTyped(typedChar, keyCode)) + { + BlockHelper.setPos2(BlockHelper.setY(BlockHelper.getPos2(), this.filterCoordinateText(this.y2Field.getText()))); + } + + if(this.z2Field.textboxKeyTyped(typedChar, keyCode)) + { + BlockHelper.setPos2(BlockHelper.setZ(BlockHelper.getPos2(), this.filterCoordinateText(this.z2Field.getText()))); + } + + if(this.block1Field.textboxKeyTyped(typedChar, keyCode)) + { + this.block1 = this.block1Field.getText(); + this.builderFill.setBlock1(this.block1); + container.initButtons(); + } + + if(this.block2Field.textboxKeyTyped(typedChar, keyCode)) + { + this.block2 = this.block2Field.getText(); + this.builderFill.setBlock2(this.block2); + container.initButtons(); + } + } + + @Override + public void mouseClicked(int mouseX, int mouseY, int mouseButton) + { + if(this.selectedPage.equals("coordinates")) + { + this.x1Field.mouseClicked(mouseX, mouseY, mouseButton); + this.y1Field.mouseClicked(mouseX, mouseY, mouseButton); + this.z1Field.mouseClicked(mouseX, mouseY, mouseButton); + this.x2Field.mouseClicked(mouseX, mouseY, mouseButton); + this.y2Field.mouseClicked(mouseX, mouseY, mouseButton); + this.z2Field.mouseClicked(mouseX, mouseY, mouseButton); + } + else if(this.selectedPage.equals("fill")) + { + this.block1Field.mouseClicked(mouseX, mouseY, mouseButton); + } + else if(this.selectedPage.equals("replace")) + { + this.block1Field.mouseClicked(mouseX, mouseY, mouseButton); + this.block2Field.mouseClicked(mouseX, mouseY, mouseButton); + } + } + + private Predicate getCoordinatePredicate(String coordinate) + { + return string -> string.matches(coordinate + ": [-]?[0-9]*"); + } + + private int filterCoordinateText(String input) + { + if(input != null) + { + String[] split = input.split(": ", 2); + + if(split[1].matches("[-]?[0-9]+")) + { + return Integer.parseInt(split[1]); + } + } + + return 0; + } + + @Override + public Category getCategory() + { + return Categories.BLOCKS; + } + + @Override + public String getTitle() + { + return I18n.format("gui.worldhandler.title.blocks.edit_blocks"); + } + + @Override + public String getTabTitle() + { + return I18n.format("gui.worldhandler.tab.blocks.edit_blocks"); + } + + @Override + public String[] getHeadline() + { + return new String[] {I18n.format("gui.worldhandler.generic.browse"), I18n.format("gui.worldhandler.generic.options")}; + } + + @Override + public Content getActiveContent() + { + return Contents.EDIT_BLOCKS; + } +} diff --git a/src/main/java/exopandora/worldhandler/gui/content/impl/ContentEnchantment.java b/src/main/java/exopandora/worldhandler/gui/content/impl/ContentEnchantment.java new file mode 100644 index 0000000..5c8db65 --- /dev/null +++ b/src/main/java/exopandora/worldhandler/gui/content/impl/ContentEnchantment.java @@ -0,0 +1,143 @@ +package exopandora.worldhandler.gui.content.impl; + +import java.util.ArrayList; + +import exopandora.worldhandler.builder.ICommandBuilder; +import exopandora.worldhandler.builder.impl.BuilderEnchantment; +import exopandora.worldhandler.builder.types.Type; +import exopandora.worldhandler.gui.button.EnumTooltip; +import exopandora.worldhandler.gui.button.GuiButtonWorldHandler; +import exopandora.worldhandler.gui.button.GuiSlider; +import exopandora.worldhandler.gui.button.responder.SimpleResponder; +import exopandora.worldhandler.gui.category.Categories; +import exopandora.worldhandler.gui.category.Category; +import exopandora.worldhandler.gui.container.Container; +import exopandora.worldhandler.gui.content.Content; +import exopandora.worldhandler.gui.content.Contents; +import exopandora.worldhandler.gui.content.element.impl.ElementPageList; +import exopandora.worldhandler.gui.content.element.logic.ILogicPageList; +import exopandora.worldhandler.main.WorldHandler; +import net.minecraft.client.gui.GuiButton; +import net.minecraft.client.resources.I18n; +import net.minecraft.enchantment.Enchantment; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public class ContentEnchantment extends Content +{ + private final BuilderEnchantment builderEnchantment = new BuilderEnchantment(); + + @Override + public ICommandBuilder getCommandBuilder() + { + return this.builderEnchantment; + } + + @Override + public void initGui(Container container, int x, int y) + { + ElementPageList enchantments = new ElementPageList(x, y, new ArrayList(Enchantment.REGISTRY.getKeys()), null, 114, 20, 3, this, new int[] {3, 4, 5}, new ILogicPageList() + { + @Override + public String translate(ResourceLocation key) + { + return I18n.format(Enchantment.REGISTRY.getObject(key).getName()); + } + + @Override + public String getRegistryName(ResourceLocation key) + { + return key.toString(); + } + + @Override + public void onClick(ResourceLocation clicked) + { + builderEnchantment.setEnchantment(clicked); + builderEnchantment.setLevel(1); + } + + @Override + public void onRegister(int id, int x, int y, int width, int height, String display, String registry, boolean enabled, ResourceLocation value, Container container) + { + GuiButtonWorldHandler button = new GuiButtonWorldHandler(id, x, y, width, height, display, registry, EnumTooltip.TOP_RIGHT); + button.enabled = enabled; + container.add(button); + } + + @Override + public ResourceLocation convert(String object) + { + return Type.parseResourceLocation(object); + } + + @Override + public String getId() + { + return "enchantments"; + } + }); + + container.add(enchantments); + } + + @Override + public void initButtons(Container container, int x, int y) + { + container.add(new GuiButtonWorldHandler(0, x, y + 96, 114, 20, I18n.format("gui.worldhandler.generic.back"))); + container.add(new GuiButtonWorldHandler(1, x + 118, y + 96, 114, 20, I18n.format("gui.worldhandler.generic.backToGame"))); + + container.add(new GuiSlider(this, container, "enchantment", x + 118, y + 24, 114, 20, I18n.format("gui.worldhandler.items.enchantment.level"), 1, Enchantment.REGISTRY.getObject(this.builderEnchantment.getEnchantment()).getMaxLevel(), 1, new SimpleResponder(value -> + { + this.builderEnchantment.setLevel(value.intValue()); + }))); + + container.add(new GuiButtonWorldHandler(2, x + 118, y + 48, 114, 20, I18n.format("gui.worldhandler.items.enchantment.enchant"))); + } + + @Override + public void actionPerformed(Container container, GuiButton button) + { + switch(button.id) + { + case 2: + WorldHandler.sendCommand(this.builderEnchantment); + container.initGui(); + break; + default: + break; + } + } + + @Override + public Category getCategory() + { + return Categories.ITEMS; + } + + @Override + public String getTitle() + { + return I18n.format("gui.worldhandler.title.items.enchantment"); + } + + @Override + public String getTabTitle() + { + return I18n.format("gui.worldhandler.tab.items.enchantment"); + } + + @Override + public Content getActiveContent() + { + return Contents.ENCHANTMENT; + } + + @Override + public void onPlayerNameChanged(String username) + { + this.builderEnchantment.setPlayer(username); + } +} diff --git a/src/main/java/exopandora/worldhandler/gui/content/impl/ContentExperience.java b/src/main/java/exopandora/worldhandler/gui/content/impl/ContentExperience.java new file mode 100644 index 0000000..c935fc3 --- /dev/null +++ b/src/main/java/exopandora/worldhandler/gui/content/impl/ContentExperience.java @@ -0,0 +1,117 @@ +package exopandora.worldhandler.gui.content.impl; + +import exopandora.worldhandler.builder.ICommandBuilder; +import exopandora.worldhandler.builder.impl.BuilderExperience; +import exopandora.worldhandler.gui.button.EnumTooltip; +import exopandora.worldhandler.gui.button.GuiButtonWorldHandler; +import exopandora.worldhandler.gui.button.GuiSlider; +import exopandora.worldhandler.gui.button.responder.SimpleResponder; +import exopandora.worldhandler.gui.category.Categories; +import exopandora.worldhandler.gui.category.Category; +import exopandora.worldhandler.gui.container.Container; +import exopandora.worldhandler.gui.content.Content; +import exopandora.worldhandler.gui.content.Contents; +import exopandora.worldhandler.main.WorldHandler; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiButton; +import net.minecraft.client.resources.I18n; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public class ContentExperience extends Content +{ + private final BuilderExperience builderExperience = new BuilderExperience(); + private GuiButtonWorldHandler addButton; + private GuiButtonWorldHandler removeButton; + + @Override + public ICommandBuilder getCommandBuilder() + { + return this.builderExperience; + } + + @Override + public void initButtons(Container container, int x, int y) + { + container.add(new GuiButtonWorldHandler(0, x, y + 96, 114, 20, I18n.format("gui.worldhandler.generic.back"))); + container.add(new GuiButtonWorldHandler(1, x + 118, y + 96, 114, 20, I18n.format("gui.worldhandler.generic.backToGame"))); + + container.add(new GuiSlider(this, container, "experience", x + 116 / 2, y, 114, 20, I18n.format("gui.worldhandler.title.player.experience"), 0, 100, 0, new SimpleResponder(value -> + { + this.builderExperience.setLevel(value); + }))); + + container.add(addButton = new GuiButtonWorldHandler(3, x + 116 / 2, y + 24, 114, 20, I18n.format("gui.worldhandler.actions.add"))); + container.add(removeButton = new GuiButtonWorldHandler(4, x + 116 / 2, y + 48, 114, 20, I18n.format("gui.worldhandler.actions.remove"))); + container.add(new GuiButtonWorldHandler(5, x + 116 / 2, y + 72, 114, 20, I18n.format("gui.worldhandler.actions.reset"), I18n.format("gui.worldhandler.actions.set_to_0"), EnumTooltip.TOP_RIGHT)); + + boolean enabled = this.builderExperience.getLevel() > 0; + + this.addButton.enabled = enabled; + this.removeButton.enabled = enabled; + } + + @Override + public void updateScreen(Container container) + { + boolean enabled = this.builderExperience.getLevel() > 0; + + this.addButton.enabled = enabled; + this.removeButton.enabled = enabled; + } + + @Override + public void actionPerformed(Container container, GuiButton button) + { + switch(button.id) + { + case 3: + WorldHandler.sendCommand(this.builderExperience); + container.initGui(); + break; + case 4: + if(Minecraft.getMinecraft().player.experienceLevel >= this.builderExperience.getLevel()) + { + WorldHandler.sendCommand(new BuilderExperience(-this.builderExperience.getLevel(), this.builderExperience.getPlayer())); + break; + } + case 5: + WorldHandler.sendCommand(new BuilderExperience(-Minecraft.getMinecraft().player.experienceLevel, this.builderExperience.getPlayer())); + container.initGui(); + break; + default: + break; + } + } + + @Override + public Category getCategory() + { + return Categories.PLAYER; + } + + @Override + public String getTitle() + { + return I18n.format("gui.worldhandler.title.player.experience"); + } + + @Override + public String getTabTitle() + { + return I18n.format("gui.worldhandler.tab.player.experience"); + } + + @Override + public Content getActiveContent() + { + return Contents.EXPERIENCE; + } + + @Override + public void onPlayerNameChanged(String username) + { + this.builderExperience.setPlayer(username); + } +} diff --git a/src/main/java/exopandora/worldhandler/gui/content/impl/ContentGamerules.java b/src/main/java/exopandora/worldhandler/gui/content/impl/ContentGamerules.java new file mode 100644 index 0000000..6d3c600 --- /dev/null +++ b/src/main/java/exopandora/worldhandler/gui/content/impl/ContentGamerules.java @@ -0,0 +1,198 @@ +package exopandora.worldhandler.gui.content.impl; + +import java.util.Arrays; + +import com.google.common.base.Predicates; + +import exopandora.worldhandler.builder.ICommandBuilder; +import exopandora.worldhandler.builder.impl.BuilderGamerule; +import exopandora.worldhandler.gui.button.EnumTooltip; +import exopandora.worldhandler.gui.button.GuiButtonWorldHandler; +import exopandora.worldhandler.gui.button.GuiTextFieldTooltip; +import exopandora.worldhandler.gui.category.Categories; +import exopandora.worldhandler.gui.category.Category; +import exopandora.worldhandler.gui.container.Container; +import exopandora.worldhandler.gui.content.Content; +import exopandora.worldhandler.gui.content.Contents; +import exopandora.worldhandler.gui.content.element.impl.ElementPageList; +import exopandora.worldhandler.gui.content.element.logic.ILogicPageList; +import exopandora.worldhandler.main.WorldHandler; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiButton; +import net.minecraft.client.resources.I18n; +import net.minecraft.world.GameRules.ValueType; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public class ContentGamerules extends Content +{ + private GuiTextFieldTooltip valueField; + + private boolean booleanValue; + private String value; + + private final BuilderGamerule builderGamerule = new BuilderGamerule(); + + @Override + public ICommandBuilder getCommandBuilder() + { + return this.builderGamerule; + } + + @Override + public void initGui(Container container, int x, int y) + { + this.valueField = new GuiTextFieldTooltip(x + 118, y + 24, 114, 20, I18n.format("gui.worldhandler.generic.value")); + this.valueField.setValidator(Predicates.notNull()); + this.valueField.setText(this.value); + this.valueField.setCursorPositionEnd(); + + ElementPageList rules = new ElementPageList(x, y, Arrays.asList(Minecraft.getMinecraft().world.getGameRules().getRules()), null, 114, 20, 3, this, new int[] {5, 6, 7}, new ILogicPageList() + { + @Override + public String translate(String key) + { + return I18n.format("gui.worldhandler.gamerules.rule." + key); + } + + @Override + public void onClick(String clicked) + { + builderGamerule.setRule(clicked); + booleanValue = Minecraft.getMinecraft().world.getGameRules().areSameType(clicked, ValueType.BOOLEAN_VALUE); + + if(booleanValue) + { + builderGamerule.setValue(null); + } + else + { + builderGamerule.setValue(value); + } + } + + @Override + public String getRegistryName(String key) + { + return key; + } + + @Override + public void onRegister(int id, int x, int y, int width, int height, String display, String registryKey, boolean enabled, String value, Container container) + { + GuiButtonWorldHandler button = new GuiButtonWorldHandler(id, x, y, width, height, display, registryKey, EnumTooltip.TOP_RIGHT); + button.enabled = enabled; + container.add(button); + } + + @Override + public String convert(String object) + { + return object; + } + + @Override + public String getId() + { + return "gamerules"; + } + }); + + container.add(rules); + } + + @Override + public void initButtons(Container container, int x, int y) + { + container.add(new GuiButtonWorldHandler(0, x, y + 96, 114, 20, I18n.format("gui.worldhandler.generic.back"))); + container.add(new GuiButtonWorldHandler(1, x + 118, y + 96, 114, 20, I18n.format("gui.worldhandler.generic.backToGame"))); + + if(this.booleanValue) + { + container.add(new GuiButtonWorldHandler(2, x + 118, y + 24, 114, 20, I18n.format("gui.worldhandler.generic.enable"))); + container.add(new GuiButtonWorldHandler(3, x + 118, y + 48, 114, 20, I18n.format("gui.worldhandler.generic.disable"))); + } + else + { + container.add(new GuiButtonWorldHandler(4, x + 118, y + 48, 114, 20, I18n.format("gui.worldhandler.actions.perform"))); + } + } + + @Override + public void actionPerformed(Container container, GuiButton button) + { + switch(button.id) + { + case 2: + WorldHandler.sendCommand(this.builderGamerule.getBuilderForValue(String.valueOf(true))); + break; + case 3: + WorldHandler.sendCommand(this.builderGamerule.getBuilderForValue(String.valueOf(false))); + break; + case 4: + WorldHandler.sendCommand(this.builderGamerule); + break; + default: + break; + } + } + + @Override + public void drawScreen(Container container, int x, int y, int mouseX, int mouseY, float partialTicks) + { + if(!this.booleanValue) + { + this.valueField.drawTextBox(); + } + } + + @Override + public void keyTyped(Container container, char typedChar, int keyCode) + { + if(this.valueField.textboxKeyTyped(typedChar, keyCode)) + { + this.value = this.valueField.getText(); + this.builderGamerule.setValue(this.value); + } + } + + @Override + public void mouseClicked(int mouseX, int mouseY, int mouseButton) + { + if(!this.booleanValue) + { + this.valueField.mouseClicked(mouseX, mouseY, mouseButton); + } + } + + @Override + public Category getCategory() + { + return Categories.WORLD; + } + + @Override + public String getTitle() + { + return I18n.format("gui.worldhandler.title.world.gamerules"); + } + + @Override + public String getTabTitle() + { + return I18n.format("gui.worldhandler.tab.world.gamerules"); + } + + @Override + public String[] getHeadline() + { + return new String[] {null, I18n.format("gui.worldhandler.generic.options")}; + } + + @Override + public Content getActiveContent() + { + return Contents.GAMERULES; + } +} diff --git a/src/main/java/exopandora/worldhandler/gui/content/impl/ContentMain.java b/src/main/java/exopandora/worldhandler/gui/content/impl/ContentMain.java new file mode 100644 index 0000000..9db8e11 --- /dev/null +++ b/src/main/java/exopandora/worldhandler/gui/content/impl/ContentMain.java @@ -0,0 +1,134 @@ +package exopandora.worldhandler.gui.content.impl; + +import exopandora.worldhandler.config.ConfigSettings; +import exopandora.worldhandler.gui.button.EnumIcon; +import exopandora.worldhandler.gui.button.EnumTooltip; +import exopandora.worldhandler.gui.button.GuiButtonWorldHandler; +import exopandora.worldhandler.gui.category.Categories; +import exopandora.worldhandler.gui.category.Category; +import exopandora.worldhandler.gui.config.GuiConfigWorldHandler; +import exopandora.worldhandler.gui.container.Container; +import exopandora.worldhandler.gui.container.impl.GuiWorldHandlerContainer; +import exopandora.worldhandler.gui.content.Content; +import exopandora.worldhandler.gui.content.Contents; +import exopandora.worldhandler.main.Main; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiButton; +import net.minecraft.client.gui.GuiScreenResourcePacks; +import net.minecraft.client.resources.I18n; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public class ContentMain extends Content +{ + @Override + public void initButtons(Container container, int x, int y) + { + container.add(new GuiButtonWorldHandler(-1, x, y, 22, 20, null, I18n.format("gui.worldhandler.shortcuts.tooltip.time", I18n.format("gui.worldhandler.shortcuts.tooltip.time.dawn", ConfigSettings.getDawn())), EnumTooltip.TOP_RIGHT, EnumIcon.TIME_DAWN)); + container.add(new GuiButtonWorldHandler(-2, x + 26, y, 22, 20, null, I18n.format("gui.worldhandler.shortcuts.tooltip.time", I18n.format("gui.worldhandler.shortcuts.tooltip.time.noon", ConfigSettings.getNoon())), EnumTooltip.TOP_RIGHT, EnumIcon.TIME_NOON)); + container.add(new GuiButtonWorldHandler(-3, x + 26 * 2, y, 22, 20, null, I18n.format("gui.worldhandler.shortcuts.tooltip.time", I18n.format("gui.worldhandler.shortcuts.tooltip.time.sunset", ConfigSettings.getSunset())), EnumTooltip.TOP_RIGHT, EnumIcon.TIME_SUNSET)); + container.add(new GuiButtonWorldHandler(-4, x + 26 * 3, y, 23, 20, null, I18n.format("gui.worldhandler.shortcuts.tooltip.time", I18n.format("gui.worldhandler.shortcuts.tooltip.time.midnight", ConfigSettings.getMidnight())), EnumTooltip.TOP_RIGHT, EnumIcon.TIME_MIDNIGHT)); + container.add(new GuiButtonWorldHandler(-8, x + 26 * 4, y, 24, 20, null, I18n.format("gui.worldhandler.shortcuts.tooltip.difficulty", I18n.format("gui.worldhandler.shortcuts.tooltip.difficulty.peaceful")), EnumTooltip.TOP_RIGHT, EnumIcon.DIFFICULTY_PEACEFUL)); + container.add(new GuiButtonWorldHandler(-9, x + 26 * 5 + 2, y, 23, 20, null, I18n.format("gui.worldhandler.shortcuts.tooltip.difficulty", I18n.format("gui.worldhandler.shortcuts.tooltip.difficulty.easy")), EnumTooltip.TOP_RIGHT, EnumIcon.DIFFICULTY_EASY)); + container.add(new GuiButtonWorldHandler(-10, x + 26 * 6 + 2, y, 22, 20, null, I18n.format("gui.worldhandler.shortcuts.tooltip.difficulty", I18n.format("gui.worldhandler.shortcuts.tooltip.difficulty.normal")), EnumTooltip.TOP_RIGHT, EnumIcon.DIFFICULTY_NORMAL)); + container.add(new GuiButtonWorldHandler(-11, x + 26 * 7 + 2, y, 22, 20, null, I18n.format("gui.worldhandler.shortcuts.tooltip.difficulty", I18n.format("gui.worldhandler.shortcuts.tooltip.difficulty.hard")), EnumTooltip.TOP_RIGHT, EnumIcon.DIFFICULTY_HARD)); + container.add(new GuiButtonWorldHandler(10, x + 26 * 8 + 2, y, 22, 20, null, I18n.format("gui.worldhandler.shortcuts.tooltip.settings"), EnumTooltip.TOP_RIGHT, EnumIcon.SETTINGS)); + + container.add(new GuiButtonWorldHandler(-5, x, y + 24, 22, 20, null, I18n.format("gui.worldhandler.shortcuts.tooltip.weather", I18n.format("gui.worldhandler.shortcuts.tooltip.weather.clear")), EnumTooltip.TOP_RIGHT, EnumIcon.WEATHER_SUN)); + container.add(new GuiButtonWorldHandler(-6, x + 26, y + 24, 22, 20, null, I18n.format("gui.worldhandler.shortcuts.tooltip.weather", I18n.format("gui.worldhandler.shortcuts.tooltip.weather.rainy")), EnumTooltip.TOP_RIGHT, EnumIcon.WEATHER_RAIN)); + container.add(new GuiButtonWorldHandler(-7, x + 26 * 2, y + 24, 22, 20, null, I18n.format("gui.worldhandler.shortcuts.tooltip.weather", I18n.format("gui.worldhandler.shortcuts.tooltip.weather.thunder")), EnumTooltip.TOP_RIGHT, EnumIcon.WEATHER_STORM)); + container.add(new GuiButtonWorldHandler(11, x + 26 * 3, y + 24, 23, 20, null, I18n.format("gui.worldhandler.shortcuts.tooltip.butcher"), EnumTooltip.TOP_RIGHT, EnumIcon.BUTCHER)); + container.add(new GuiButtonWorldHandler(12, x + 26 * 4, y + 24, 24, 20, null, I18n.format("gui.worldhandler.shortcuts.tooltip.potions"), EnumTooltip.TOP_RIGHT, EnumIcon.POTION)); + container.add(new GuiButtonWorldHandler(-12, x + 26 * 5 + 2, y + 24, 23, 20, null, I18n.format("gui.worldhandler.shortcuts.tooltip.gamemode", I18n.format("gui.worldhandler.shortcuts.tooltip.gamemode.survival")), EnumTooltip.TOP_RIGHT, EnumIcon.GAMEMODE_SURVIVAL)); + container.add(new GuiButtonWorldHandler(-13, x + 26 * 6 + 2, y + 24, 22, 20, null, I18n.format("gui.worldhandler.shortcuts.tooltip.gamemode", I18n.format("gui.worldhandler.shortcuts.tooltip.gamemode.creative")), EnumTooltip.TOP_RIGHT, EnumIcon.GAMEMODE_CREATIVE)); + container.add(new GuiButtonWorldHandler(-14, x + 26 * 7 + 2, y + 24, 22, 20, null, I18n.format("gui.worldhandler.shortcuts.tooltip.gamemode", I18n.format("gui.worldhandler.shortcuts.tooltip.gamemode.adventure")), EnumTooltip.TOP_RIGHT, EnumIcon.GAMEMODE_ADVENTURE)); + container.add(new GuiButtonWorldHandler(-15, x + 26 * 8 + 2, y + 24, 22, 20, null, I18n.format("gui.worldhandler.shortcuts.tooltip.gamemode", I18n.format("gui.worldhandler.shortcuts.tooltip.gamemode.spectator")), EnumTooltip.TOP_RIGHT, EnumIcon.GAMEMODE_SPECTATOR)); + + container.add(new GuiButtonWorldHandler(2, x, y + 48, 74, 20, I18n.format("gui.worldhandler.items"))); + container.add(new GuiButtonWorldHandler(3, x + 78, y + 48, 76, 20, I18n.format("gui.worldhandler.blocks"))); + container.add(new GuiButtonWorldHandler(9, x + 158, y + 48, 74, 20, I18n.format("gui.worldhandler.entities"))); + + container.add(new GuiButtonWorldHandler(7, x, y + 72, 74, 20, I18n.format("gui.worldhandler.world"))); + container.add(new GuiButtonWorldHandler(8, x + 78, y + 72, 76, 20, I18n.format("gui.worldhandler.player"))); + container.add(new GuiButtonWorldHandler(4, x + 158, y + 72, 74, 20, I18n.format("gui.worldhandler.scoreboard"))); + + container.add(new GuiButtonWorldHandler(6, x, y + 96, 74, 20, I18n.format("gui.worldhandler.change_world"))); + container.add(new GuiButtonWorldHandler(5, x + 78, y + 96, 76, 20, I18n.format("gui.worldhandler.resourcepack"))); + container.add(new GuiButtonWorldHandler(1, x + 158, y + 96, 74, 20, I18n.format("gui.worldhandler.generic.backToGame"))); + } + + @Override + public void actionPerformed(Container container, GuiButton button) + { + switch(button.id) + { + case 2: + Minecraft.getMinecraft().displayGuiScreen(new GuiWorldHandlerContainer(Contents.CUSTOM_ITEM)); + break; + case 3: + Minecraft.getMinecraft().displayGuiScreen(new GuiWorldHandlerContainer(Contents.EDIT_BLOCKS)); + break; + case 4: + Minecraft.getMinecraft().displayGuiScreen(new GuiWorldHandlerContainer(Contents.SCOREBOARD_OBJECTIVES)); + break; + case 5: + Minecraft.getMinecraft().gameSettings.saveOptions(); + Minecraft.getMinecraft().displayGuiScreen(new GuiScreenResourcePacks(container)); + break; + case 6: + Minecraft.getMinecraft().displayGuiScreen(new GuiWorldHandlerContainer(Contents.CHANGE_WORLD.withParent(Contents.MAIN))); + break; + case 7: + Minecraft.getMinecraft().displayGuiScreen(new GuiWorldHandlerContainer(Contents.WORLD_INFO)); + break; + case 8: + Minecraft.getMinecraft().displayGuiScreen(new GuiWorldHandlerContainer(Contents.PLAYER)); + break; + case 9: + Minecraft.getMinecraft().displayGuiScreen(new GuiWorldHandlerContainer(Contents.SUMMON)); + break; + case 10: + Minecraft.getMinecraft().displayGuiScreen(new GuiConfigWorldHandler(container, ConfigSettings.CATEGORY)); + break; + case 11: + Minecraft.getMinecraft().displayGuiScreen(new GuiWorldHandlerContainer(Contents.BUTCHER.withParent(Contents.MAIN))); + break; + case 12: + Minecraft.getMinecraft().displayGuiScreen(new GuiWorldHandlerContainer(Contents.POTIONS.withParent(Contents.MAIN))); + break; + default: + break; + } + } + + @Override + public Category getCategory() + { + return Categories.MAIN; + } + + @Override + public String getTitle() + { + return Main.NAME; + } + + @Override + public String getTabTitle() + { + return Main.NAME; + } + + @Override + public Content getActiveContent() + { + return Contents.MAIN; + } + + @Override + public Content getBackContent() + { + return null; + } +} diff --git a/src/main/java/exopandora/worldhandler/gui/content/impl/ContentMultiplayer.java b/src/main/java/exopandora/worldhandler/gui/content/impl/ContentMultiplayer.java new file mode 100644 index 0000000..c516287 --- /dev/null +++ b/src/main/java/exopandora/worldhandler/gui/content/impl/ContentMultiplayer.java @@ -0,0 +1,349 @@ +package exopandora.worldhandler.gui.content.impl; + +import com.google.common.base.Predicates; + +import exopandora.worldhandler.builder.ICommandBuilder; +import exopandora.worldhandler.builder.impl.BuilderGeneric; +import exopandora.worldhandler.builder.impl.BuilderMultiCommand; +import exopandora.worldhandler.builder.impl.BuilderPlayer; +import exopandora.worldhandler.builder.impl.BuilderPlayerReason; +import exopandora.worldhandler.builder.impl.BuilderWhitelist; +import exopandora.worldhandler.builder.impl.BuilderWhitelist.EnumMode; +import exopandora.worldhandler.gui.button.EnumIcon; +import exopandora.worldhandler.gui.button.EnumTooltip; +import exopandora.worldhandler.gui.button.GuiButtonWorldHandler; +import exopandora.worldhandler.gui.button.GuiTextFieldTooltip; +import exopandora.worldhandler.gui.category.Categories; +import exopandora.worldhandler.gui.category.Category; +import exopandora.worldhandler.gui.container.Container; +import exopandora.worldhandler.gui.container.impl.GuiWorldHandlerContainer; +import exopandora.worldhandler.gui.content.Content; +import exopandora.worldhandler.gui.content.Contents; +import exopandora.worldhandler.main.WorldHandler; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiButton; +import net.minecraft.client.resources.I18n; +import net.minecraft.util.text.TextFormatting; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public class ContentMultiplayer extends Content +{ + private GuiTextFieldTooltip playerField; + private GuiTextFieldTooltip reasonField; + + private int shiftDown = 0; + + private String selected = "kickBan"; + + private final BuilderPlayerReason builderKick = new BuilderPlayerReason("kick"); + private final BuilderPlayerReason builderBan = new BuilderPlayerReason("ban"); + private final BuilderPlayer builderPardon = new BuilderPlayer("pardon"); + private final BuilderPlayer builderOp = new BuilderPlayer("op"); + private final BuilderPlayer builderDeop = new BuilderPlayer("deop"); + private final BuilderGeneric builderSaveAll = new BuilderGeneric("save-all"); + private final BuilderGeneric builderSaveOn = new BuilderGeneric("save-on"); + private final BuilderGeneric builderSaveOff = new BuilderGeneric("save-off"); + private final BuilderGeneric builderStop = new BuilderGeneric("stop"); + private final BuilderWhitelist builderWhitelist = new BuilderWhitelist(); + + private final BuilderMultiCommand builderKickBan = new BuilderMultiCommand(this.builderKick, this.builderBan); + private final BuilderMultiCommand builderPermissions = new BuilderMultiCommand(this.builderOp, this.builderDeop); + private final BuilderMultiCommand builderRuntime = new BuilderMultiCommand(this.builderSaveAll, this.builderSaveOn, this.builderSaveOff, this.builderStop); + + @Override + public ICommandBuilder getCommandBuilder() + { + if(this.selected.equals("kickBan")) + { + return this.builderKickBan; + } + else if(this.selected.equals("pardon")) + { + return this.builderPardon; + } + else if(this.selected.equals("permissions")) + { + return this.builderPermissions; + } + else if(this.selected.equals("runtime")) + { + return this.builderRuntime; + } + else if(this.selected.equals("whitelist")) + { + return this.builderWhitelist; + } + + return null; + } + + @Override + public void initGui(Container container, int x, int y) + { + this.playerField = new GuiTextFieldTooltip(x + 118, y + this.shiftDown, 114, 20, I18n.format("gui.worldhandler.multiplayer.username")); + this.playerField.setValidator(Predicates.notNull()); + this.playerField.setFocused(false); + this.playerField.setText(this.builderKick.getPlayer()); + this.playerField.setMaxStringLength(16); + + this.reasonField = new GuiTextFieldTooltip(x + 118, y + 24 + this.shiftDown, 114, 20, I18n.format("gui.worldhandler.multiplayer.kick_ban.reason")); + this.reasonField.setValidator(Predicates.notNull()); + this.reasonField.setFocused(false); + this.reasonField.setText(this.builderKick.getReason()); + } + + @Override + public void initButtons(Container container, int x, int y) + { + GuiButtonWorldHandler button3; + GuiButtonWorldHandler button4; + GuiButtonWorldHandler button5; + GuiButtonWorldHandler button6; + GuiButtonWorldHandler button7; + GuiButtonWorldHandler button8; + GuiButtonWorldHandler button9; + + container.add(new GuiButtonWorldHandler(1, x + 118, y + 96, 114, 20, I18n.format("gui.worldhandler.generic.backToGame"))); + + container.add(button3 = new GuiButtonWorldHandler(3, x, y, 114, 20, I18n.format("gui.worldhandler.multiplayer.kick") + " / " + I18n.format("gui.worldhandler.multiplayer.ban"))); + container.add(button4 = new GuiButtonWorldHandler(4, x, y + 24, 114, 20, I18n.format("gui.worldhandler.multiplayer.pardon"))); + container.add(button5 = new GuiButtonWorldHandler(5, x, y + 48, 114, 20, I18n.format("gui.worldhandler.multiplayer.permissions"))); + container.add(button6 = new GuiButtonWorldHandler(6, x, y + 72, 114, 20, I18n.format("gui.worldhandler.multiplayer.runtime"))); + container.add(button7 = new GuiButtonWorldHandler(7, x, y + 96, 114, 20, I18n.format("gui.worldhandler.multiplayer.whitelist"))); + + if(this.selected.equals("kickBan")) + { + container.add(button8 = new GuiButtonWorldHandler(8, x + 118, y + 48, 114, 20, I18n.format("gui.worldhandler.multiplayer.kick"), this.builderKick.toActualCommand(), EnumTooltip.TOP_RIGHT)); + container.add(button9 = new GuiButtonWorldHandler(9, x + 118, y + 72, 114, 20, I18n.format("gui.worldhandler.multiplayer.ban"), this.builderBan.toActualCommand(), EnumTooltip.TOP_RIGHT)); + + if(this.playerField.getText().isEmpty()) + { + button8.enabled = false; + button9.enabled = false; + } + + button3.enabled = false; + } + else if(this.selected.equals("pardon")) + { + container.add(button8 = new GuiButtonWorldHandler(10, x + 118, y + 48, 114, 20, I18n.format("gui.worldhandler.multiplayer.pardon"), this.builderPardon.toActualCommand(), EnumTooltip.TOP_RIGHT)); + + if(this.playerField.getText().isEmpty()) + { + button8.enabled = false; + } + + button4.enabled = false; + } + else if(this.selected.equals("permissions")) + { + container.add(button8 = new GuiButtonWorldHandler(11, x + 118, y + 24 + 12, 114, 20, I18n.format("gui.worldhandler.multiplayer.permissions.give"), this.builderOp.toActualCommand(), EnumTooltip.TOP_RIGHT)); + container.add(button9 = new GuiButtonWorldHandler(12, x + 118, y + 48 + 12, 114, 20, I18n.format("gui.worldhandler.multiplayer.permissions.take"), this.builderDeop.toActualCommand(), EnumTooltip.TOP_RIGHT)); + + if(this.playerField.getText().isEmpty()) + { + button8.enabled = false; + button9.enabled = false; + } + + button5.enabled = false; + } + else if(this.selected.equals("runtime")) + { + container.add(new GuiButtonWorldHandler(13, x + 118, y, 114, 20, I18n.format("gui.worldhandler.multiplayer.runtime.save_world"), this.builderSaveAll.toActualCommand(), EnumTooltip.TOP_RIGHT)); + container.add(new GuiButtonWorldHandler(14, x + 118, y + 24, 114, 20, I18n.format("gui.worldhandler.multiplayer.runtime.autosave", I18n.format("gui.worldhandler.generic.on"), this.builderSaveOn.toActualCommand(), EnumTooltip.TOP_RIGHT))); + container.add(new GuiButtonWorldHandler(15, x + 118, y + 48, 114, 20, TextFormatting.RED + I18n.format("gui.worldhandler.multiplayer.runtime.autosave", I18n.format("gui.worldhandler.generic.off"), this.builderSaveOff.toActualCommand(), EnumTooltip.TOP_RIGHT))); + container.add(new GuiButtonWorldHandler(16, x + 118, y + 72, 114, 20, TextFormatting.RED + I18n.format("gui.worldhandler.multiplayer.runtime.stop_server"), this.builderStop.toActualCommand(), EnumTooltip.TOP_RIGHT)); + + button6.enabled = false; + } + else if(this.selected.equals("whitelist")) + { + container.add(button8 = new GuiButtonWorldHandler(17, x + 118, y + 24, 44, 20, I18n.format("gui.worldhandler.multiplayer.whitelist.add"))); + container.add(button9 = new GuiButtonWorldHandler(18, x + 118 + 47, y + 24, 44, 20, I18n.format("gui.worldhandler.multiplayer.whitelist.remove"))); + + container.add(new GuiButtonWorldHandler(19, x + 118, y + 48, 114, 20, I18n.format("gui.worldhandler.multiplayer.whitelist.whitelist", I18n.format("gui.worldhandler.generic.on")))); + container.add(new GuiButtonWorldHandler(20, x + 118, y + 72, 114, 20, I18n.format("gui.worldhandler.multiplayer.whitelist.whitelist", I18n.format("gui.worldhandler.generic.off")))); + + container.add(new GuiButtonWorldHandler(21, x + 232 - 20, y + 24, 20, 20, null, I18n.format("gui.worldhandler.multiplayer.whitelist.reload"), EnumTooltip.TOP_RIGHT, EnumIcon.RELOAD)); + + if(this.playerField.getText().isEmpty()) + { + button8.enabled = false; + button9.enabled = false; + } + + button7.enabled = false; + } + } + + @Override + public void actionPerformed(Container container, GuiButton button) + { + switch(button.id) + { + case 3: + this.selected = "kickBan"; + this.shiftDown = 0; + container.initGui(); + break; + case 4: + this.selected = "pardon"; + this.shiftDown = 24; + container.initGui(); + break; + case 5: + this.selected = "permissions"; + this.shiftDown = 12; + container.initGui(); + break; + case 6: + this.selected = "runtime"; + this.shiftDown = 0; + container.initGui(); + break; + case 7: + this.selected = "whitelist"; + this.shiftDown = 0; + container.initGui(); + break; + case 8: + WorldHandler.sendCommand(this.builderKick); + break; + case 9: + WorldHandler.sendCommand(this.builderBan); + break; + case 10: + WorldHandler.sendCommand(this.builderPardon); + break; + case 11: + WorldHandler.sendCommand(this.builderOp); + break; + case 12: + WorldHandler.sendCommand(this.builderDeop); + break; + case 13: + WorldHandler.sendCommand(this.builderSaveAll); + break; + case 14: + WorldHandler.sendCommand(this.builderSaveOn); + break; + case 15: + Minecraft.getMinecraft().displayGuiScreen(new GuiWorldHandlerContainer(Contents.CONTINUE.withBuilder(this.builderSaveOff).withParent(Contents.MULTIPLAYER))); + break; + case 16: + Minecraft.getMinecraft().displayGuiScreen(new GuiWorldHandlerContainer(Contents.CONTINUE.withBuilder(this.builderStop).withParent(Contents.MULTIPLAYER))); + break; + case 17: + WorldHandler.sendCommand(this.builderWhitelist.getBuilder(EnumMode.ADD)); + break; + case 18: + WorldHandler.sendCommand(this.builderWhitelist.getBuilder(EnumMode.REMOVE)); + break; + case 19: + WorldHandler.sendCommand(this.builderWhitelist.getBuilder(EnumMode.ON)); + break; + case 20: + WorldHandler.sendCommand(this.builderWhitelist.getBuilder(EnumMode.OFF)); + break; + case 21: + WorldHandler.sendCommand(this.builderWhitelist.getBuilder(EnumMode.RELOAD)); + break; + default: + break; + } + } + + @Override + public void drawScreen(Container container, int x, int y, int mouseX, int mouseY, float partialTicks) + { + if(this.selected.equals("kickBan")) + { + this.reasonField.drawTextBox(); + } + + if(!this.selected.equals("runtime")) + { + this.playerField.drawTextBox(); + } + } + + private void setPlayer(String player) + { + this.builderBan.setPlayer(player); + this.builderKick.setPlayer(player); + + this.builderPardon.setPlayer(player); + this.builderOp.setPlayer(player); + this.builderDeop.setPlayer(player); + + this.builderWhitelist.setPlayer(player); + } + + private void setReason(String reason) + { + this.builderBan.setReason(reason); + this.builderKick.setReason(reason); + } + + @Override + public Category getCategory() + { + return Categories.MAIN; + } + + @Override + public String getTitle() + { + return I18n.format("gui.worldhandler.title.multiplayer"); + } + + @Override + public String getTabTitle() + { + return I18n.format("gui.worldhandler.tab.multiplayer"); + } + + @Override + public String[] getHeadline() + { + return new String[]{I18n.format("gui.worldhandler.generic.browse"), I18n.format("gui.worldhandler.generic.options")}; + } + + @Override + public Content getActiveContent() + { + return Contents.MULTIPLAYER; + } + + @Override + public void keyTyped(Container container, char typedChar, int keyCode) + { + if(this.playerField.textboxKeyTyped(typedChar, keyCode)) + { + this.setPlayer(this.playerField.getText()); + container.initButtons(); + } + + if(this.reasonField.textboxKeyTyped(typedChar, keyCode)) + { + this.setReason(this.reasonField.getText()); + container.initButtons(); + } + } + + @Override + public void mouseClicked(int mouseX, int mouseY, int mouseButton) + { + this.playerField.mouseClicked(mouseX, mouseY, mouseButton); + this.reasonField.mouseClicked(mouseX, mouseY, mouseButton); + } + + @Override + public Content getBackContent() + { + return null; + } +} diff --git a/src/main/java/exopandora/worldhandler/gui/content/impl/ContentNoteEditor.java b/src/main/java/exopandora/worldhandler/gui/content/impl/ContentNoteEditor.java new file mode 100644 index 0000000..5e3aec9 --- /dev/null +++ b/src/main/java/exopandora/worldhandler/gui/content/impl/ContentNoteEditor.java @@ -0,0 +1,304 @@ +package exopandora.worldhandler.gui.content.impl; + +import org.lwjgl.input.Keyboard; + +import exopandora.worldhandler.builder.ICommandBuilder; +import exopandora.worldhandler.builder.impl.BuilderNoteEditor; +import exopandora.worldhandler.config.ConfigSkin; +import exopandora.worldhandler.gui.button.GuiButtonKeyboard; +import exopandora.worldhandler.gui.button.GuiButtonKeyboard.Orientation; +import exopandora.worldhandler.gui.button.GuiButtonWorldHandler; +import exopandora.worldhandler.gui.category.Categories; +import exopandora.worldhandler.gui.category.Category; +import exopandora.worldhandler.gui.container.Container; +import exopandora.worldhandler.gui.content.Content; +import exopandora.worldhandler.gui.content.Contents; +import exopandora.worldhandler.helper.BlockHelper; +import exopandora.worldhandler.main.WorldHandler; +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.block.state.IBlockState; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.FontRenderer; +import net.minecraft.client.gui.GuiButton; +import net.minecraft.client.renderer.GlStateManager; +import net.minecraft.client.renderer.RenderHelper; +import net.minecraft.client.resources.I18n; +import net.minecraft.init.Blocks; +import net.minecraft.init.SoundEvents; +import net.minecraft.item.ItemStack; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.SoundEvent; +import net.minecraft.util.math.BlockPos; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public class ContentNoteEditor extends Content +{ + private final BuilderNoteEditor builderNoteEditor = new BuilderNoteEditor(); + + @Override + public ICommandBuilder getCommandBuilder() + { + return this.isActive() ? this.builderNoteEditor : null; + } + + @Override + public void initGui(Container container, int x, int y) + { + this.builderNoteEditor.setPosition(BlockHelper.getFocusedBlockPos()); + } + + @Override + public void initButtons(Container container, int x, int y) + { + container.add(new GuiButtonWorldHandler(0, x, y + 96, 114, 20, I18n.format("gui.worldhandler.generic.back"))); + container.add(new GuiButtonWorldHandler(1, x + 118, y + 96, 114, 20, I18n.format("gui.worldhandler.generic.backToGame"))); + + if(this.isActive()) + { + BlockPos pos = BlockHelper.getFocusedBlockPos(); + SoundEvent sound = this.getSoundEvent(pos.down()); + + container.add(new GuiButtonKeyboard(4, x - 3 + 15, y, 14, 92, I18n.format("gui.worldhandler.blocks.note_block_editor.g"), Orientation.NORMAL, 0.53F, container, this, pos, sound)); + container.add(new GuiButtonKeyboard(5, x - 3 + 15 * 2, y, 14, 92, I18n.format("gui.worldhandler.blocks.note_block_editor.a"), Orientation.NORMAL, 0.6F, container, this, pos, sound)); + container.add(new GuiButtonKeyboard(6, x - 3 + 15 * 3, y, 14, 92, I18n.format("gui.worldhandler.blocks.note_block_editor.b"), Orientation.RIGHT, 0.67F, container, this, pos, sound)); + + container.add(new GuiButtonKeyboard(7, x - 3 + 15 * 4, y, 14, 92, I18n.format("gui.worldhandler.blocks.note_block_editor.c"), Orientation.LEFT, 0.7F, container, this, pos, sound)); + container.add(new GuiButtonKeyboard(8, x - 3 + 15 * 5, y, 14, 92, I18n.format("gui.worldhandler.blocks.note_block_editor.d"), Orientation.NORMAL, 0.8F, container, this, pos, sound)); + container.add(new GuiButtonKeyboard(9, x - 3 + 15 * 6, y, 14, 92, I18n.format("gui.worldhandler.blocks.note_block_editor.e"), Orientation.RIGHT, 0.9F, container, this, pos, sound)); + container.add(new GuiButtonKeyboard(10, x - 3 + 15 * 7, y, 14, 92, I18n.format("gui.worldhandler.blocks.note_block_editor.f"), Orientation.LEFT, 0.95F, container, this, pos, sound)); + container.add(new GuiButtonKeyboard(11, x - 3 + 15 * 8, y, 14, 92, I18n.format("gui.worldhandler.blocks.note_block_editor.g"), Orientation.NORMAL, 1.05F, container, this, pos, sound)); + container.add(new GuiButtonKeyboard(12, x - 3 + 15 * 9, y, 14, 92, I18n.format("gui.worldhandler.blocks.note_block_editor.a"), Orientation.NORMAL, 1.2F, container, this, pos, sound)); + container.add(new GuiButtonKeyboard(13, x - 3 + 15 * 10, y, 14, 92, I18n.format("gui.worldhandler.blocks.note_block_editor.b"), Orientation.RIGHT, 1.32F, container, this, pos, sound)); + + container.add(new GuiButtonKeyboard(14, x - 3 + 15 * 11, y, 14, 92, I18n.format("gui.worldhandler.blocks.note_block_editor.c"), Orientation.LEFT, 1.4F, container, this, pos, sound)); + container.add(new GuiButtonKeyboard(15, x - 3 + 15 * 12, y, 14, 92, I18n.format("gui.worldhandler.blocks.note_block_editor.d"), Orientation.NORMAL, 1.6F, container, this, pos, sound)); + container.add(new GuiButtonKeyboard(16, x - 3 + 15 * 13, y, 14, 92, I18n.format("gui.worldhandler.blocks.note_block_editor.e"), Orientation.RIGHT, 1.8F, container, this, pos, sound)); + container.add(new GuiButtonKeyboard(17, x - 3 + 15 * 14, y, 14, 92, I18n.format("gui.worldhandler.blocks.note_block_editor.f"), Orientation.LEFT, 1.9F, container, this, pos, sound)); + + container.add(new GuiButtonKeyboard(18, x - 3 - 5 + 15, y, 9, 58, "F#", Orientation.BLACK, 0.5F, container, this, pos, sound)); + container.add(new GuiButtonKeyboard(19, x - 3 - 5 + 15 * 2, y, 9, 58, "G#", Orientation.BLACK, 0.56F, container, this, pos, sound)); + container.add(new GuiButtonKeyboard(20, x - 3 - 5 + 15 * 3, y, 9, 58, "A#", Orientation.BLACK, 0.63F, container, this, pos, sound)); + + container.add(new GuiButtonKeyboard(21, x - 3 - 5 + 15 * 5, y, 9, 58, "C#", Orientation.BLACK, 0.75F, container, this, pos, sound)); + container.add(new GuiButtonKeyboard(22, x - 3 - 5 + 15 * 6, y, 9, 58, "D#", Orientation.BLACK, 0.85F, container, this, pos, sound)); + + container.add(new GuiButtonKeyboard(23, x - 3 - 5 + 15 * 8, y, 9, 58, "F#", Orientation.BLACK, 1.0F, container, this, pos, sound)); + container.add(new GuiButtonKeyboard(24, x - 3 - 5 + 15 * 9, y, 9, 58, "G#", Orientation.BLACK, 1.1F, container, this, pos, sound)); + container.add(new GuiButtonKeyboard(25, x - 3 - 5 + 15 * 10, y, 9, 58, "A#", Orientation.BLACK, 1.25F, container, this, pos, sound)); + + container.add(new GuiButtonKeyboard(26, x - 3 - 5 + 15 * 12, y, 9, 58, "C#", Orientation.BLACK, 1.5F, container, this, pos, sound)); + container.add(new GuiButtonKeyboard(27, x - 3 - 5 + 15 * 13, y, 9, 58, "D#", Orientation.BLACK, 1.7F, container, this, pos, sound)); + container.add(new GuiButtonKeyboard(28, x - 3 - 5 + 15 * 15, y, 9, 58, "F#", Orientation.BLACK, 2.0F, container, this, pos, sound)); + } + } + + @Override + public void updateScreen(Container container) + { + if(!this.isActive()) + { + container.initGui(); + } + } + + @Override + public void actionPerformed(Container container, GuiButton button) + { + switch(button.id) + { + case 4: + WorldHandler.sendCommand(this.builderNoteEditor.getBuilderForNote((byte) 1)); + break; + case 5: + WorldHandler.sendCommand(this.builderNoteEditor.getBuilderForNote((byte) 3)); + break; + case 6: + WorldHandler.sendCommand(this.builderNoteEditor.getBuilderForNote((byte) 5)); + break; + case 7: + WorldHandler.sendCommand(this.builderNoteEditor.getBuilderForNote((byte) 6)); + break; + case 8: + WorldHandler.sendCommand(this.builderNoteEditor.getBuilderForNote((byte) 8)); + break; + case 9: + WorldHandler.sendCommand(this.builderNoteEditor.getBuilderForNote((byte) 10)); + break; + case 10: + WorldHandler.sendCommand(this.builderNoteEditor.getBuilderForNote((byte) 11)); + break; + case 11: + WorldHandler.sendCommand(this.builderNoteEditor.getBuilderForNote((byte) 13)); + break; + case 12: + WorldHandler.sendCommand(this.builderNoteEditor.getBuilderForNote((byte) 15)); + break; + case 13: + WorldHandler.sendCommand(this.builderNoteEditor.getBuilderForNote((byte) 17)); + break; + case 14: + WorldHandler.sendCommand(this.builderNoteEditor.getBuilderForNote((byte) 18)); + break; + case 15: + WorldHandler.sendCommand(this.builderNoteEditor.getBuilderForNote((byte) 20)); + break; + case 16: + WorldHandler.sendCommand(this.builderNoteEditor.getBuilderForNote((byte) 22)); + break; + case 17: + WorldHandler.sendCommand(this.builderNoteEditor.getBuilderForNote((byte) 23)); + break; + case 18: + WorldHandler.sendCommand(this.builderNoteEditor.getBuilderForNote((byte) 0)); + break; + case 19: + WorldHandler.sendCommand(this.builderNoteEditor.getBuilderForNote((byte) 2)); + break; + case 20: + WorldHandler.sendCommand(this.builderNoteEditor.getBuilderForNote((byte) 4)); + break; + case 21: + WorldHandler.sendCommand(this.builderNoteEditor.getBuilderForNote((byte) 7)); + break; + case 22: + WorldHandler.sendCommand(this.builderNoteEditor.getBuilderForNote((byte) 9)); + break; + case 23: + WorldHandler.sendCommand(this.builderNoteEditor.getBuilderForNote((byte) 12)); + break; + case 24: + WorldHandler.sendCommand(this.builderNoteEditor.getBuilderForNote((byte) 14)); + break; + case 25: + WorldHandler.sendCommand(this.builderNoteEditor.getBuilderForNote((byte) 16)); + break; + case 26: + WorldHandler.sendCommand(this.builderNoteEditor.getBuilderForNote((byte) 19)); + break; + case 27: + WorldHandler.sendCommand(this.builderNoteEditor.getBuilderForNote((byte) 21)); + break; + case 28: + WorldHandler.sendCommand(this.builderNoteEditor.getBuilderForNote((byte) 24)); + break; + default: + break; + } + } + + @Override + public void drawScreen(Container container, int x, int y, int mouseX, int mouseY, float partialTicks) + { + if(this.isActive()) + { + Minecraft.getMinecraft().renderEngine.bindTexture(new ResourceLocation("worldhandler:textures/misc/note.png")); + + container.drawTexturedModalRect(x - 1, y - 1, 0, 0, 8, 59); + container.drawTexturedModalRect(x - 1, y - 1 + 59, 0, 59, 13, 35); + + container.drawTexturedModalRect(x - 1 + 232 - 5, y - 1, 18, 0, 7, 59); + container.drawTexturedModalRect(x - 1 + 232 - 10, y - 1 + 59, 13, 59, 12, 35); + + container.drawTexturedModalRect(x - 1 + 8, y - 1, 0, 94, 219, 1); + container.drawTexturedModalRect(x - 1 + 13, y - 1 + 93, 0, 94, 209, 1); + } + else + { + float scale = 4; + + GlStateManager.color(1.0F, 1.0F, 1.0F); + GlStateManager.pushMatrix(); + RenderHelper.enableGUIStandardItemLighting(); + + GlStateManager.translate(container.width / 2 - 8 * scale, container.height / 2 - 15 - 8 * scale, 0); + GlStateManager.scale(scale, scale, scale); + Minecraft.getMinecraft().getRenderItem().renderItemIntoGUI(new ItemStack(Blocks.NOTEBLOCK), 0, 0); + + RenderHelper.disableStandardItemLighting(); + GlStateManager.popMatrix(); + + String displayString = I18n.format("gui.worldhandler.blocks.note_block_editor.look_at_note_block", Keyboard.getKeyName(WorldHandler.KEY_WORLD_HANDLER.getKeyCode())); + FontRenderer fontRenderer = Minecraft.getMinecraft().fontRenderer; + fontRenderer.drawString(displayString, x + 116 - fontRenderer.getStringWidth(displayString) / 2, y + 70, ConfigSkin.getLabelColor()); + } + } + + private SoundEvent getSoundEvent(BlockPos blockPos) + { + IBlockState blockstate = Minecraft.getMinecraft().world.getBlockState(blockPos); + Material material = blockstate.getMaterial(); + Block block = blockstate.getBlock(); + + if(block.equals(Blocks.CLAY)) + { + return SoundEvents.BLOCK_NOTE_FLUTE; + } + else if(block.equals(Blocks.GOLD_BLOCK)) + { + return SoundEvents.BLOCK_NOTE_BELL; + } + else if(block.equals(Blocks.WOOL)) + { + return SoundEvents.BLOCK_NOTE_GUITAR; + } + else if(block.equals(Blocks.PACKED_ICE)) + { + return SoundEvents.BLOCK_NOTE_CHIME; + } + else if(block.equals(Blocks.BONE_BLOCK)) + { + return SoundEvents.BLOCK_NOTE_XYLOPHONE; + } + + if(material.equals(Material.WOOD)) + { + return SoundEvents.BLOCK_NOTE_BASS; + } + else if(material.equals(Material.SAND)) + { + return SoundEvents.BLOCK_NOTE_SNARE; + } + else if(material.equals(Material.GLASS)) + { + return SoundEvents.BLOCK_NOTE_HAT; + } + else if(material.equals(Material.ROCK)) + { + return SoundEvents.BLOCK_NOTE_BASEDRUM; + } + + return SoundEvents.BLOCK_NOTE_HARP; + } + + private boolean isActive() + { + return BlockHelper.isFocusedBlockEqualTo(Blocks.NOTEBLOCK); + } + + @Override + public Category getCategory() + { + return Categories.BLOCKS; + } + + @Override + public String getTitle() + { + return I18n.format("gui.worldhandler.title.blocks.note_block_editor"); + } + + @Override + public String getTabTitle() + { + return I18n.format("gui.worldhandler.tab.blocks.note_block_editor"); + } + + @Override + public Content getActiveContent() + { + return Contents.NOTE_EDITOR; + } +} diff --git a/src/main/java/exopandora/worldhandler/gui/content/impl/ContentPlayer.java b/src/main/java/exopandora/worldhandler/gui/content/impl/ContentPlayer.java new file mode 100644 index 0000000..ac65afb --- /dev/null +++ b/src/main/java/exopandora/worldhandler/gui/content/impl/ContentPlayer.java @@ -0,0 +1,232 @@ +package exopandora.worldhandler.gui.content.impl; + +import com.mojang.realmsclient.gui.ChatFormatting; + +import exopandora.worldhandler.builder.ICommandBuilder; +import exopandora.worldhandler.builder.impl.BuilderGeneric; +import exopandora.worldhandler.builder.impl.BuilderMultiCommand; +import exopandora.worldhandler.builder.impl.BuilderSpawnpoint; +import exopandora.worldhandler.gui.button.GuiButtonWorldHandler; +import exopandora.worldhandler.gui.button.GuiTextFieldTooltip; +import exopandora.worldhandler.gui.category.Categories; +import exopandora.worldhandler.gui.category.Category; +import exopandora.worldhandler.gui.container.Container; +import exopandora.worldhandler.gui.container.impl.GuiWorldHandlerContainer; +import exopandora.worldhandler.gui.content.Content; +import exopandora.worldhandler.gui.content.Contents; +import exopandora.worldhandler.main.WorldHandler; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiButton; +import net.minecraft.client.gui.inventory.GuiInventory; +import net.minecraft.client.renderer.GlStateManager; +import net.minecraft.client.resources.I18n; +import net.minecraft.util.math.MathHelper; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public class ContentPlayer extends Content +{ + private String selectedMain = "start"; + + private GuiTextFieldTooltip posXField; + private GuiTextFieldTooltip posYField; + private GuiTextFieldTooltip posZField; + + private GuiTextFieldTooltip scoreField; + private GuiTextFieldTooltip coinsField; + private GuiTextFieldTooltip xpField; + + private final BuilderGeneric builderSetworldspawn = new BuilderGeneric("setworldspawn"); + private final BuilderSpawnpoint builderSpawnpoint = new BuilderSpawnpoint(WorldHandler.USERNAME); + private final BuilderGeneric builderKill = new BuilderGeneric("kill"); + private final BuilderGeneric builderClear = new BuilderGeneric("clear"); + + private final BuilderMultiCommand builderMiscellaneous = new BuilderMultiCommand(this.builderSetworldspawn, this.builderSpawnpoint, this.builderKill, this.builderClear); + + @Override + public ICommandBuilder getCommandBuilder() + { + if(this.selectedMain.equals("miscellaneous")) + { + return this.builderMiscellaneous; + } + + return null; + } + + @Override + public void initGui(Container container, int x, int y) + { + this.posXField = new GuiTextFieldTooltip(x + 118, y, 114, 20); + this.posYField = new GuiTextFieldTooltip(x + 118, y + 24, 114, 20); + this.posZField = new GuiTextFieldTooltip(x + 118, y + 48, 114, 20); + this.scoreField = new GuiTextFieldTooltip(x + 118, y + 12, 114, 20); + this.coinsField = new GuiTextFieldTooltip(x + 118, y + 36, 114, 20); + this.xpField = new GuiTextFieldTooltip(x + 118, y + 60, 114, 20); + + this.updateScreen(container); + } + + @Override + public void initButtons(Container container, int x, int y) + { + GuiButtonWorldHandler button3; + GuiButtonWorldHandler button4; + GuiButtonWorldHandler button5; + GuiButtonWorldHandler button6; + + container.add(new GuiButtonWorldHandler(0, x, y + 96, 114, 20, I18n.format("gui.worldhandler.generic.back"))); + container.add(new GuiButtonWorldHandler(1, x + 118, y + 96, 114, 20, I18n.format("gui.worldhandler.generic.backToGame"))); + + container.add(button3 = new GuiButtonWorldHandler(4, x, y, 114, 20, I18n.format("gui.worldhandler.entities.player.start"))); + container.add(button4 = new GuiButtonWorldHandler(5, x, y + 24, 114, 20, I18n.format("gui.worldhandler.entities.player.score"))); + container.add(button5 = new GuiButtonWorldHandler(6, x, y + 48, 114, 20, I18n.format("gui.worldhandler.entities.player.position"))); + container.add(button6 = new GuiButtonWorldHandler(7, x, y + 72, 114, 20, I18n.format("gui.worldhandler.entities.player.miscellaneous"))); + + if(this.selectedMain.equals("start")) + { + button3.enabled = false; + } + else if(this.selectedMain.equals("score")) + { + button4.enabled = false; + } + else if(this.selectedMain.equals("position")) + { + button5.enabled = false; + + container.add(new GuiButtonWorldHandler(8, x + 118, y + 72, 114, 20, I18n.format("gui.worldhandler.entities.player.position.copy_position"))); + } + else if(this.selectedMain.equals("miscellaneous")) + { + button6.enabled = false; + + container.add(new GuiButtonWorldHandler(9, x + 118, y, 114, 20, ChatFormatting.RED + I18n.format("gui.worldhandler.entities.player.miscellaneous.set_spawn"))); + container.add(new GuiButtonWorldHandler(10, x + 118, y + 24, 114, 20, ChatFormatting.RED + I18n.format("gui.worldhandler.entities.player.miscellaneous.set_global_spawn"))); + container.add(new GuiButtonWorldHandler(11, x + 118, y + 48, 114, 20, ChatFormatting.RED + I18n.format("gui.worldhandler.entities.player.miscellaneous.kill"))); + container.add(new GuiButtonWorldHandler(12, x + 118, y + 72, 114, 20, ChatFormatting.RED + I18n.format("gui.worldhandler.entities.player.miscellaneous.clear_inventory"))); + } + } + + @Override + public void updateScreen(Container container) + { + this.posXField.setText("X: " + MathHelper.floor(Minecraft.getMinecraft().player.posX)); + this.posYField.setText("Y: " + MathHelper.floor(Minecraft.getMinecraft().player.posY)); + this.posZField.setText("Z: " + MathHelper.floor(Minecraft.getMinecraft().player.posZ)); + this.scoreField.setText(I18n.format("gui.worldhandler.entities.player.score") + ": " + Minecraft.getMinecraft().player.getScore()); + this.coinsField.setText(I18n.format("gui.worldhandler.entities.player.score.experience") + ": " + Minecraft.getMinecraft().player.experienceLevel + "L"); + this.xpField.setText(I18n.format("gui.worldhandler.entities.player.score.experience_coins") + ": " + Minecraft.getMinecraft().player.experienceTotal); + } + + @Override + public void actionPerformed(Container container, GuiButton button) + { + switch(button.id) + { + case 4: + this.selectedMain = "start"; + container.initGui(); + break; + case 5: + this.selectedMain = "score"; + container.initGui(); + break; + case 6: + this.selectedMain = "position"; + container.initGui(); + break; + case 7: + this.selectedMain = "miscellaneous"; + container.initGui(); + break; + case 8: + int posX = MathHelper.floor(Minecraft.getMinecraft().player.posX); + int posY = MathHelper.floor(Minecraft.getMinecraft().player.posY); + int posZ = MathHelper.floor(Minecraft.getMinecraft().player.posZ); + + container.setClipboardString(posX + " " + posY + " " + posZ); + break; + case 9: + Minecraft.getMinecraft().displayGuiScreen(new GuiWorldHandlerContainer(Contents.CONTINUE.withBuilder(this.builderSpawnpoint).withParent(Contents.PLAYER))); + break; + case 10: + Minecraft.getMinecraft().displayGuiScreen(new GuiWorldHandlerContainer(Contents.CONTINUE.withBuilder(this.builderSetworldspawn).withParent(Contents.PLAYER))); + break; + case 11: + Minecraft.getMinecraft().displayGuiScreen(new GuiWorldHandlerContainer(Contents.CONTINUE.withBuilder(this.builderKill).withParent(Contents.PLAYER))); + break; + case 12: + Minecraft.getMinecraft().displayGuiScreen(new GuiWorldHandlerContainer(Contents.CONTINUE.withBuilder(this.builderClear).withParent(Contents.PLAYER))); + break; + default: + break; + } + } + + @Override + public void drawScreen(Container container, int x, int y, int mouseX, int mouseY, float partialTicks) + { + if(this.selectedMain.equals("start")) + { + int xPos = x + 175; + int yPos = y + 82; + int playerNameWidth = Minecraft.getMinecraft().fontRenderer.getStringWidth(Minecraft.getMinecraft().player.getName()) / 2; + + container.drawRect(container.width / 2 - playerNameWidth - 1 + 59, yPos - 74, container.width / 2 + playerNameWidth + 1 + 59, yPos - 65, 0x3F000000); + Minecraft.getMinecraft().fontRenderer.drawString(Minecraft.getMinecraft().player.getName(), container.width / 2 - playerNameWidth + 59, yPos - 73, 0xE0E0E0); + + GuiInventory.drawEntityOnScreen(xPos, yPos, 30, xPos - mouseX, yPos - mouseY - 44, Minecraft.getMinecraft().player); + GlStateManager.tryBlendFuncSeparate(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA, GlStateManager.SourceFactor.ONE, GlStateManager.DestFactor.ZERO); + } + else if(this.selectedMain.equals("score")) + { + this.scoreField.drawTextBox(); + this.xpField.drawTextBox(); + this.coinsField.drawTextBox(); + } + else if(this.selectedMain.equals("position")) + { + this.posXField.drawTextBox(); + this.posYField.drawTextBox(); + this.posZField.drawTextBox(); + } + } + + @Override + public void onPlayerNameChanged(String username) + { + this.builderSpawnpoint.setPlayer(username); + } + + @Override + public Category getCategory() + { + return Categories.PLAYER; + } + + @Override + public String getTitle() + { + return I18n.format("gui.worldhandler.title.player.player"); + } + + @Override + public String getTabTitle() + { + return I18n.format("gui.worldhandler.tab.player.player"); + } + + @Override + public String[] getHeadline() + { + return new String[]{I18n.format("gui.worldhandler.generic.browse")}; + } + + @Override + public Content getActiveContent() + { + return Contents.PLAYER; + } +} diff --git a/src/main/java/exopandora/worldhandler/gui/content/impl/ContentPotions.java b/src/main/java/exopandora/worldhandler/gui/content/impl/ContentPotions.java new file mode 100644 index 0000000..8be9554 --- /dev/null +++ b/src/main/java/exopandora/worldhandler/gui/content/impl/ContentPotions.java @@ -0,0 +1,242 @@ +package exopandora.worldhandler.gui.content.impl; + +import java.util.ArrayList; + +import exopandora.worldhandler.builder.ICommandBuilder; +import exopandora.worldhandler.builder.impl.BuilderMultiCommand; +import exopandora.worldhandler.builder.impl.BuilderPotionEffect; +import exopandora.worldhandler.builder.impl.BuilderPotionItem; +import exopandora.worldhandler.gui.button.EnumTooltip; +import exopandora.worldhandler.gui.button.GuiButtonWorldHandler; +import exopandora.worldhandler.gui.button.GuiSlider; +import exopandora.worldhandler.gui.button.responder.SimpleResponder; +import exopandora.worldhandler.gui.container.Container; +import exopandora.worldhandler.gui.content.element.impl.ElementPageList; +import exopandora.worldhandler.gui.content.element.logic.ILogicPageList; +import exopandora.worldhandler.gui.content.impl.abstr.ContentChild; +import exopandora.worldhandler.main.WorldHandler; +import net.minecraft.client.gui.GuiButton; +import net.minecraft.client.resources.I18n; +import net.minecraft.init.Items; +import net.minecraft.potion.Potion; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public class ContentPotions extends ContentChild +{ + private int potionPage; + + private final BuilderPotionEffect builderPotion = new BuilderPotionEffect(); + private final BuilderPotionItem builderPotionItem = new BuilderPotionItem(); + + @Override + public ICommandBuilder getCommandBuilder() + { + return new BuilderMultiCommand(this.builderPotion, this.builderPotionItem); + } + + @Override + public void initGui(Container container, int x, int y) + { + ElementPageList potions = new ElementPageList(x, y, new ArrayList(Potion.REGISTRY.getKeys()), null, 114, 20, 3, this, new int[] {15, 16, 17}, new ILogicPageList() + { + @Override + public String translate(ResourceLocation key) + { + return I18n.format(Potion.REGISTRY.getObject(key).getName()); + } + + @Override + public void onClick(ResourceLocation clicked) + { + builderPotion.setEffect(clicked); + } + + @Override + public String getRegistryName(ResourceLocation key) + { + return key.toString(); + } + + @Override + public void onRegister(int id, int x, int y, int width, int height, String display, String registryKey, boolean enabled, ResourceLocation value, Container container) + { + GuiButtonWorldHandler button = new GuiButtonWorldHandler(id, x, y, width, height, display, registryKey, EnumTooltip.TOP_RIGHT); + button.enabled = enabled; + container.add(button); + } + + @Override + public ResourceLocation convert(Potion object) + { + if(object != null) + { + return object.getRegistryName(); + } + + return null; + } + + @Override + public String getId() + { + return "potions"; + } + }); + + container.add(potions); + } + + @Override + public void initButtons(Container container, int x, int y) + { + GuiButtonWorldHandler button6; + GuiButtonWorldHandler button7; + GuiButtonWorldHandler button8; + GuiButtonWorldHandler button9; + GuiButtonWorldHandler button10; + + container.add(new GuiButtonWorldHandler(1, x + 118, y + 96, 114, 20, I18n.format("gui.worldhandler.generic.backToGame"))); + container.add(new GuiButtonWorldHandler(0, x, y + 96, 114, 20, I18n.format("gui.worldhandler.generic.back"))); + + if(this.potionPage == 0) + { + container.add(new GuiButtonWorldHandler(5, x + 118, y + 12, 114, 20, I18n.format("gui.worldhandler.potions.effect.give"))); + container.add(new GuiButtonWorldHandler(6, x + 118, y + 36, 114, 20, I18n.format("gui.worldhandler.potions.effect.remove"))); + container.add(new GuiButtonWorldHandler(7, x + 118, y + 60, 114, 20, I18n.format("gui.worldhandler.potions.effect.remove_all"))); + } + else if(this.potionPage == 1) + { + Potion potion = this.builderPotion.getEffectAsPotion(); + + container.add(new GuiButtonWorldHandler(8, x + 118, y + 24, 114, 20, I18n.format("gui.worldhandler.potions.effect.ambient", (this.builderPotionItem.getAmbient(potion) ? I18n.format("gui.worldhandler.generic.on") : I18n.format("gui.worldhandler.generic.off"))))); + container.add(new GuiButtonWorldHandler(9, x + 118, y + 48, 114, 20, I18n.format("gui.worldhandler.potions.effect.particles", (this.builderPotion.getHideParticles() ? I18n.format("gui.worldhandler.generic.off") : I18n.format("gui.worldhandler.generic.on"))))); + container.add(new GuiSlider(this, container, "potions_amplifier" + potion, x + 118, y, 114, 20, I18n.format("gui.worldhandler.potions.effect.amplifier"), 0, 100, 0, new SimpleResponder(value -> + { + this.builderPotion.setAmplifier(value.byteValue()); + this.builderPotionItem.setAmplifier(potion, value.byteValue()); + }))); + } + else if(this.potionPage == 2) + { + Potion potion = this.builderPotion.getEffectAsPotion(); + + container.add(new GuiSlider(this, container, "seconds" + potion, x + 118, y, 114, 20, I18n.format("gui.worldhandler.potion.time.seconds"), 0, 59, 0, new SimpleResponder(value -> + { + this.builderPotion.setSeconds(value.intValue()); + this.builderPotionItem.setSeconds(potion, value.intValue()); + }))); + container.add(new GuiSlider(this, container, "minutes" + potion, x + 118, y + 24, 114, 20, I18n.format("gui.worldhandler.potion.time.minutes"), 0, 59, 0, new SimpleResponder(value -> + { + this.builderPotion.setMinutes(value.intValue()); + this.builderPotionItem.setMinutes(potion, value.intValue()); + }))); + container.add(new GuiSlider(this, container, "hours" + potion, x + 118, y + 48, 114, 20, I18n.format("gui.worldhandler.potion.time.hours"), 0, 99, 0, new SimpleResponder(value -> + { + this.builderPotion.setHours(value.intValue()); + this.builderPotionItem.setHours(potion, value.intValue()); + }))); + } + else if(this.potionPage == 3) + { + container.add(button6 = new GuiButtonWorldHandler(10, x + 118, y, 114, 20, I18n.format("gui.worldhandler.potions.effect"))); + container.add(button7 = new GuiButtonWorldHandler(14, x + 118, y + 24, 56, 20, I18n.format("gui.worldhandler.potions.effect.tipped_arrow"))); + container.add(button8 = new GuiButtonWorldHandler(11, x + 178, y + 24, 55, 20, I18n.format("gui.worldhandler.potions.effect.bottle"), I18n.format("gui.worldhandler.actions.place_command_block"), EnumTooltip.TOP_RIGHT)); + container.add(button9 = new GuiButtonWorldHandler(13, x + 118, y + 48, 56, 20, I18n.format("gui.worldhandler.potions.effect.splash"), I18n.format("gui.worldhandler.actions.place_command_block"), EnumTooltip.TOP_RIGHT)); + container.add(button10 = new GuiButtonWorldHandler(12, x + 178, y + 48, 55, 20, I18n.format("gui.worldhandler.potions.effect.lingering"), I18n.format("gui.worldhandler.actions.place_command_block"), EnumTooltip.TOP_RIGHT)); + + boolean enabled = this.builderPotion.getAmplifier() >= 0; + + button6.enabled = enabled; + button7.enabled = enabled; + button8.enabled = enabled; + button9.enabled = enabled; + button10.enabled = enabled; + } + + if(this.potionPage > 0) + { + container.add(new GuiButtonWorldHandler(4, x + 118, y + 72, 56, 20, "<")); + container.add(button6 = new GuiButtonWorldHandler(5, x + 118 + 60, y + 72, 55, 20, ">")); + + button6.enabled = this.potionPage < 3; + } + } + + @Override + public void actionPerformed(Container container, GuiButton button) + { + Potion potion = this.builderPotion.getEffectAsPotion(); + + switch(button.id) + { + case 4: + this.potionPage--; + container.initGui(); + break; + case 5: + this.potionPage++; + container.initGui(); + break; + case 6: + WorldHandler.sendCommand(this.builderPotion.getRemoveCommand()); + container.initGui(); + break; + case 7: + WorldHandler.sendCommand(this.builderPotion.getClearCommand()); + container.initGui(); + break; + case 8: + this.builderPotionItem.setAmbient(potion, !this.builderPotionItem.getAmbient(potion)); + container.initGui(); + break; + case 9: + this.builderPotion.setHideParticles(!this.builderPotion.getHideParticles()); + this.builderPotionItem.setShowParticles(potion, !this.builderPotionItem.getShowParticles(potion)); + container.initGui(); + break; + case 10: + WorldHandler.sendCommand(this.builderPotion); + this.potionPage = 0; + container.initGui(); + break; + case 11: + WorldHandler.sendCommand(this.builderPotionItem.getBuilderForPotion(Items.POTIONITEM)); + this.potionPage = 0; + container.initGui(); + break; + case 12: + WorldHandler.sendCommand(this.builderPotionItem.getBuilderForPotion(Items.LINGERING_POTION)); + this.potionPage = 0; + container.initGui(); + break; + case 13: + WorldHandler.sendCommand(this.builderPotionItem.getBuilderForPotion(Items.SPLASH_POTION)); + this.potionPage = 0; + container.initGui(); + break; + case 14: + WorldHandler.sendCommand(this.builderPotionItem.getBuilderForPotion(Items.TIPPED_ARROW)); + this.potionPage = 0; + container.initGui(); + break; + default: + break; + } + } + + @Override + public String getTitle() + { + return I18n.format("gui.worldhandler.title.potions"); + } + + @Override + public void onPlayerNameChanged(String username) + { + this.builderPotion.setPlayer(username); + this.builderPotionItem.setPlayer(username); + } +} diff --git a/src/main/java/exopandora/worldhandler/gui/content/impl/ContentScoreboardObjectives.java b/src/main/java/exopandora/worldhandler/gui/content/impl/ContentScoreboardObjectives.java new file mode 100644 index 0000000..6295969 --- /dev/null +++ b/src/main/java/exopandora/worldhandler/gui/content/impl/ContentScoreboardObjectives.java @@ -0,0 +1,249 @@ +package exopandora.worldhandler.gui.content.impl; + +import java.util.Arrays; + +import com.google.common.base.Predicates; + +import exopandora.worldhandler.builder.ICommandBuilder; +import exopandora.worldhandler.builder.impl.BuilderScoreboardObjectives; +import exopandora.worldhandler.format.EnumColor; +import exopandora.worldhandler.gui.button.GuiButtonWorldHandler; +import exopandora.worldhandler.gui.button.GuiTextFieldTooltip; +import exopandora.worldhandler.gui.container.Container; +import exopandora.worldhandler.gui.content.Content; +import exopandora.worldhandler.gui.content.Contents; +import exopandora.worldhandler.gui.content.element.impl.ElementClickList; +import exopandora.worldhandler.gui.content.element.logic.ILogicClickList; +import exopandora.worldhandler.gui.content.impl.abstr.ContentScoreboard; +import exopandora.worldhandler.helper.EntityHelper; +import exopandora.worldhandler.main.WorldHandler; +import net.minecraft.block.Block; +import net.minecraft.client.gui.GuiButton; +import net.minecraft.client.resources.I18n; +import net.minecraft.item.Item; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public class ContentScoreboardObjectives extends ContentScoreboard +{ + private GuiTextFieldTooltip objectField; + private String selectedObjective = "create"; + + private final BuilderScoreboardObjectives builderObjectives = new BuilderScoreboardObjectives(); + + @Override + public ICommandBuilder getCommandBuilder() + { + return this.builderObjectives; + } + + @Override + public void initGui(Container container, int x, int y) + { + this.objectField = new GuiTextFieldTooltip(x + 118, y + (this.selectedObjective.equals("remove") ? 24 : 0), 114, 20, I18n.format("gui.worldhandler.scoreboard.objectives.objective")); + this.objectField.setValidator(Predicates.notNull()); + this.objectField.setText(this.objective); + + if(this.selectedObjective.equals("create")) + { + ElementClickList objectives = new ElementClickList(x + 118, y + 24, HELPER.getObjectives(), 7, 8, this, new ILogicClickList() + { + @Override + public void consumeKey1(String key) + { + builderObjectives.setCriteria(key); + } + + @Override + public String translate1(String key) + { + String format = "gui.worldhandler.scoreboard.objectives.criteria." + key; + String result = I18n.format(format); + + if(result.equals(format)) + { + ResourceLocation location = new ResourceLocation(key); + + if(Item.REGISTRY.containsKey(location)) + { + result = I18n.format(Item.REGISTRY.getObject(location).getUnlocalizedName() + ".name"); + } + else if(Block.REGISTRY.containsKey(location)) + { + result = Block.REGISTRY.getObject(location).getLocalizedName(); + } + else if(EntityHelper.doesExist(key)) + { + result = I18n.format("entity." + key + ".name"); + } + else if(Arrays.stream(EnumColor.values()).map(EnumColor::getFormat).anyMatch(Predicates.equalTo(key))) + { + result = I18n.format("gui.worldhandler.color." + key); + } + else + { + result = I18n.format(key); + } + } + + return result; + } + + @Override + public String getId() + { + return "objectives"; + } + }); + + container.add(objectives); + } + else if(this.selectedObjective.equals("display") || this.selectedObjective.equals("undisplay")) + { + ElementClickList slots = new ElementClickList(x + 118, y + 24 + (this.selectedObjective.equals("undisplay") ? -12 : 0), HELPER.getSlots(), 9, 10, this, new ILogicClickList() + { + @Override + public String translate1(String key) + { + return I18n.format("gui.worldhandler.scoreboard.slot." + key); + } + + @Override + public String translate2(String key1, String key2) + { + return I18n.format("gui.worldhandler.color." + key2); + } + + @Override + public void consumeKey1(String key) + { + builderObjectives.setSlot(key); + } + + @Override + public String getId() + { + return "slots"; + } + }); + + container.add(slots); + } + } + + @Override + public void initButtons(Container container, int x, int y) + { + GuiButtonWorldHandler button3; + GuiButtonWorldHandler button4; + GuiButtonWorldHandler button5; + GuiButtonWorldHandler button6; + + container.add(new GuiButtonWorldHandler(0, x, y + 96, 114, 20, I18n.format("gui.worldhandler.generic.back"))); + container.add(new GuiButtonWorldHandler(1, x + 118, y + 96, 114, 20, I18n.format("gui.worldhandler.generic.backToGame"))); + + container.add(button3 = new GuiButtonWorldHandler(2, x, y, 114, 20, I18n.format("gui.worldhandler.scoreboard.objectives.create"))); + container.add(button4 = new GuiButtonWorldHandler(3, x, y + 24, 114, 20, I18n.format("gui.worldhandler.scoreboard.objectives.display"))); + container.add(button5 = new GuiButtonWorldHandler(4, x, y + 48, 114, 20, I18n.format("gui.worldhandler.scoreboard.objectives.undisplay"))); + container.add(button6 = new GuiButtonWorldHandler(5, x, y + 72, 114, 20, I18n.format("gui.worldhandler.scoreboard.objectives.remove"))); + + button3.enabled = !this.selectedObjective.equals("create"); + button4.enabled = !this.selectedObjective.equals("display"); + button5.enabled = !this.selectedObjective.equals("undisplay"); + button6.enabled = !this.selectedObjective.equals("remove"); + + boolean enabled = this.builderObjectives.getObjective() != null && this.builderObjectives.getObjective().length() > 0; + int yOffset = this.selectedObjective.equals("undisplay") ? -12 : (this.selectedObjective.equals("remove") ? -24 : 0); + + if(this.selectedObjective.equals("undisplay")) + { + this.builderObjectives.setObjective(null); + enabled = true; + } + else if(this.selectedObjective.equals("remove")) + { + this.builderObjectives.setMode("remove"); + } + + if(!this.selectedObjective.equals("undisplay")) + { + this.builderObjectives.setObjective(this.objective); + } + + container.add(button3 = new GuiButtonWorldHandler(6, x + 118, y + 72 + yOffset, 114, 20, I18n.format("gui.worldhandler.actions.perform"))); + button3.enabled = enabled; + } + + @Override + public void actionPerformed(Container container, GuiButton button) + { + switch(button.id) + { + case 2: + this.selectedObjective = "create"; + container.initGui(); + break; + case 3: + this.selectedObjective = "display"; + container.initGui(); + break; + case 4: + this.selectedObjective = "undisplay"; + container.initGui(); + break; + case 5: + this.selectedObjective = "remove"; + container.initGui(); + break; + case 6: + WorldHandler.sendCommand(this.builderObjectives); + container.initGui(); + break; + default: + break; + } + } + + @Override + public void drawScreen(Container container, int x, int y, int mouseX, int mouseY, float partialTicks) + { + if(!this.selectedObjective.equals("undisplay")) + { + this.objectField.drawTextBox(); + } + } + + @Override + public void keyTyped(Container container, char typedChar, int keyCode) + { + if(this.objectField.textboxKeyTyped(typedChar, keyCode)) + { + this.objective = this.objectField.getText(); + this.builderObjectives.setObjective(this.objective); + container.initButtons(); + } + } + + @Override + public void mouseClicked(int mouseX, int mouseY, int mouseButton) + { + if(!this.selectedObjective.equals("undisplay")) + { + this.objectField.mouseClicked(mouseX, mouseY, mouseButton); + } + } + + @Override + public String getTabTitle() + { + return I18n.format("gui.worldhandler.tab.scoreboard.objectives"); + } + + @Override + public Content getActiveContent() + { + return Contents.SCOREBOARD_OBJECTIVES; + } +} \ No newline at end of file diff --git a/src/main/java/exopandora/worldhandler/gui/content/impl/ContentScoreboardPlayers.java b/src/main/java/exopandora/worldhandler/gui/content/impl/ContentScoreboardPlayers.java new file mode 100644 index 0000000..13224fc --- /dev/null +++ b/src/main/java/exopandora/worldhandler/gui/content/impl/ContentScoreboardPlayers.java @@ -0,0 +1,243 @@ +package exopandora.worldhandler.gui.content.impl; + +import com.google.common.base.Predicate; + +import exopandora.worldhandler.builder.ICommandBuilder; +import exopandora.worldhandler.builder.impl.BuilderScoreboardPlayers; +import exopandora.worldhandler.builder.impl.BuilderScoreboardPlayers.EnumPoints; +import exopandora.worldhandler.builder.impl.BuilderScoreboardPlayers.EnumTag; +import exopandora.worldhandler.gui.button.EnumTooltip; +import exopandora.worldhandler.gui.button.GuiButtonWorldHandler; +import exopandora.worldhandler.gui.button.GuiSlider; +import exopandora.worldhandler.gui.button.GuiTextFieldTooltip; +import exopandora.worldhandler.gui.button.responder.SimpleResponder; +import exopandora.worldhandler.gui.container.Container; +import exopandora.worldhandler.gui.content.Content; +import exopandora.worldhandler.gui.content.Contents; +import exopandora.worldhandler.gui.content.impl.abstr.ContentScoreboard; +import exopandora.worldhandler.main.WorldHandler; +import net.minecraft.client.gui.GuiButton; +import net.minecraft.client.resources.I18n; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public class ContentScoreboardPlayers extends ContentScoreboard +{ + private GuiTextFieldTooltip objectField; + private GuiTextFieldTooltip tagField; + + private final BuilderScoreboardPlayers builderPlayers = new BuilderScoreboardPlayers(); + private final Predicate nonNullNoSpace = string -> string != null && !string.matches("(.* .*)+"); + + private String selectedPlayer = "add|set|remove"; + private String tag; + + private GuiButtonWorldHandler addButton; + private GuiButtonWorldHandler removeButton; + + @Override + public ICommandBuilder getCommandBuilder() + { + return this.builderPlayers; + } + + @Override + public void initGui(Container container, int x, int y) + { + this.objectField = new GuiTextFieldTooltip(x + 118, y + (this.selectedPlayer.equals("enable") ? 24 : 0), 114, 20, I18n.format("gui.worldhandler.scoreboard.objectives.objective")); + this.objectField.setValidator(this.nonNullNoSpace); + this.objectField.setText(this.objective); + + this.tagField = new GuiTextFieldTooltip(x + 118, y + 12, 114, 20, I18n.format("gui.worldhandler.scoreboard.players.tag")); + this.tagField.setValidator(this.nonNullNoSpace); + this.tagField.setText(this.tag); + } + + @Override + public void initButtons(Container container, int x, int y) + { + GuiButtonWorldHandler button3; + GuiButtonWorldHandler button4; + GuiButtonWorldHandler button5; + + container.add(new GuiButtonWorldHandler(0, x, y + 96, 114, 20, I18n.format("gui.worldhandler.generic.back"))); + container.add(new GuiButtonWorldHandler(1, x + 118, y + 96, 114, 20, I18n.format("gui.worldhandler.generic.backToGame"))); + + container.add(button3 = new GuiButtonWorldHandler(2, x, y + 12, 114, 20, I18n.format("gui.worldhandler.scoreboard.players.points"))); + container.add(button4 = new GuiButtonWorldHandler(3, x, y + 36, 114, 20, I18n.format("gui.worldhandler.scoreboard.players.tag"))); + container.add(button5 = new GuiButtonWorldHandler(4, x, y + 60, 114, 20, I18n.format("gui.worldhandler.scoreboard.players.trigger"))); + + button3.enabled = !this.selectedPlayer.equals("add|set|remove"); + button4.enabled = !this.selectedPlayer.equals("tag"); + button5.enabled = !this.selectedPlayer.equals("enable"); + + this.builderPlayers.setMode(this.selectedPlayer); + + boolean objective = this.builderPlayers.getObjective() != null && !this.builderPlayers.getObjective().isEmpty(); + + if(this.selectedPlayer.equals("add|set|remove")) + { + container.add(new GuiSlider(this, container, "points", x + 118, y + 24, 114, 20, I18n.format("gui.worldhandler.scoreboard.players.points"), 0, 100, 0, new SimpleResponder(value -> + { + this.builderPlayers.setPoints(value); + }))); + + container.add(this.addButton = new GuiButtonWorldHandler(5, x + 118, y + 48, 114, 20, I18n.format("gui.worldhandler.actions.add"))); + container.add(this.removeButton = new GuiButtonWorldHandler(6, x + 118, y + 72, 56, 20, I18n.format("gui.worldhandler.actions.remove"))); + container.add(button5 = new GuiButtonWorldHandler(7, x + 118 + 114 / 2 + 1, y + 72, 56, 20, I18n.format("gui.worldhandler.actions.reset"), I18n.format("gui.worldhandler.actions.set_to_0"), EnumTooltip.TOP_RIGHT)); + + boolean enabled = objective && this.builderPlayers.getPoints() > 0; + + this.addButton.enabled = enabled; + this.removeButton.enabled = enabled; + button5.enabled = objective; + } + else if(this.selectedPlayer.equals("tag")) + { + container.add(button3 = new GuiButtonWorldHandler(8, x + 118, y + 36, 114, 20, I18n.format("gui.worldhandler.actions.add"))); + container.add(button4 = new GuiButtonWorldHandler(9, x + 118, y + 60, 114, 20, I18n.format("gui.worldhandler.actions.remove"))); + + boolean enabled = this.tag != null && !this.tag.isEmpty(); + + button3.enabled = enabled; + button4.enabled = enabled; + } + else if(this.selectedPlayer.equals("enable")) + { + container.add(button3 = new GuiButtonWorldHandler(10, x + 118, y + 48, 114, 20, I18n.format("gui.worldhandler.generic.enable"))); + + button3.enabled = objective; + } + + if(this.selectedPlayer.equals("tag")) + { + this.builderPlayers.setTag(this.tag); + } + else + { + this.builderPlayers.setObjective(this.objective); + } + } + + @Override + public void updateScreen(Container container) + { + if(this.selectedPlayer.equals("add|set|remove")) + { + boolean objective = this.builderPlayers.getObjective() != null && !this.builderPlayers.getObjective().isEmpty(); + boolean enabled = objective && this.builderPlayers.getPoints() > 0; + + this.addButton.enabled = enabled; + this.removeButton.enabled = enabled; + } + } + + @Override + public void actionPerformed(Container container, GuiButton button) + { + switch(button.id) + { + case 2: + this.selectedPlayer = "add|set|remove"; + container.initGui(); + break; + case 3: + this.selectedPlayer = "tag"; + container.initGui(); + break; + case 4: + this.selectedPlayer = "enable"; + container.initGui(); + break; + case 5: + WorldHandler.sendCommand(this.builderPlayers.getBuilderForPoints(EnumPoints.ADD)); + container.initGui(); + break; + case 6: + WorldHandler.sendCommand(this.builderPlayers.getBuilderForPoints(EnumPoints.REMOVE)); + container.initGui(); + break; + case 7: + WorldHandler.sendCommand(this.builderPlayers.getBuilderForPoints(EnumPoints.SET, 0)); + container.initGui(); + break; + case 8: + WorldHandler.sendCommand(this.builderPlayers.getBuilderForTag(EnumTag.ADD)); + container.initGui(); + break; + case 9: + WorldHandler.sendCommand(this.builderPlayers.getBuilderForTag(EnumTag.REMOVE)); + container.initGui(); + break; + case 10: + WorldHandler.sendCommand(this.builderPlayers); + container.initGui(); + break; + default: + break; + } + } + + @Override + public void drawScreen(Container container, int x, int y, int mouseX, int mouseY, float partialTicks) + { + if(this.selectedPlayer.equals("tag")) + { + this.tagField.drawTextBox(); + } + else + { + this.objectField.drawTextBox(); + } + } + + @Override + public void keyTyped(Container container, char typedChar, int keyCode) + { + if(this.objectField.textboxKeyTyped(typedChar, keyCode)) + { + this.objective = this.objectField.getText(); + this.builderPlayers.setObjective(this.objective); + container.initButtons(); + } + + if(this.tagField.textboxKeyTyped(typedChar, keyCode)) + { + this.tag = this.tagField.getText(); + this.builderPlayers.setTag(this.tag); + container.initButtons(); + } + } + + @Override + public void mouseClicked(int mouseX, int mouseY, int mouseButton) + { + if(this.selectedPlayer.equals("tag")) + { + this.tagField.mouseClicked(mouseX, mouseY, mouseButton); + } + else + { + this.objectField.mouseClicked(mouseX, mouseY, mouseButton); + } + } + + @Override + public String getTabTitle() + { + return I18n.format("gui.worldhandler.tab.scoreboard.players"); + } + + @Override + public Content getActiveContent() + { + return Contents.SCOREBOARD_PLAYERS; + } + + @Override + public void onPlayerNameChanged(String username) + { + this.builderPlayers.setPlayer(username); + } +} diff --git a/src/main/java/exopandora/worldhandler/gui/content/impl/ContentScoreboardTeams.java b/src/main/java/exopandora/worldhandler/gui/content/impl/ContentScoreboardTeams.java new file mode 100644 index 0000000..3e9a47e --- /dev/null +++ b/src/main/java/exopandora/worldhandler/gui/content/impl/ContentScoreboardTeams.java @@ -0,0 +1,237 @@ +package exopandora.worldhandler.gui.content.impl; + +import java.util.Arrays; + +import com.google.common.base.Predicates; + +import exopandora.worldhandler.builder.ICommandBuilder; +import exopandora.worldhandler.builder.impl.BuilderScoreboardTeams; +import exopandora.worldhandler.builder.impl.BuilderScoreboardTeams.EnumMode; +import exopandora.worldhandler.format.EnumColor; +import exopandora.worldhandler.gui.button.GuiButtonWorldHandler; +import exopandora.worldhandler.gui.button.GuiTextFieldTooltip; +import exopandora.worldhandler.gui.container.Container; +import exopandora.worldhandler.gui.content.Content; +import exopandora.worldhandler.gui.content.Contents; +import exopandora.worldhandler.gui.content.element.impl.ElementClickList; +import exopandora.worldhandler.gui.content.element.logic.ILogicClickList; +import exopandora.worldhandler.gui.content.impl.abstr.ContentScoreboard; +import exopandora.worldhandler.main.WorldHandler; +import net.minecraft.client.gui.GuiButton; +import net.minecraft.client.resources.I18n; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public class ContentScoreboardTeams extends ContentScoreboard +{ + private GuiTextFieldTooltip teamField; + + private String team; + private String selectedTeam = "add"; + + private final BuilderScoreboardTeams builderTeams = new BuilderScoreboardTeams(); + + @Override + public ICommandBuilder getCommandBuilder() + { + return this.builderTeams; + } + + @Override + public void initGui(Container container, int x, int y) + { + this.teamField = new GuiTextFieldTooltip(x + 118, y + (this.selectedTeam.equals("option") ? 0 : (this.selectedTeam.equals("add") ? 24 : 12)), 114, 20, I18n.format("gui.worldhandler.scoreboard.team.team")); + this.teamField.setValidator(Predicates.notNull()); + this.teamField.setText(this.team); + + if(this.selectedTeam.equals("option")) + { + ElementClickList options = new ElementClickList(x + 118, y + 24, HELPER.getOptions(), 6, 7, this, new ILogicClickList() + { + @Override + public String translate1(String key) + { + return I18n.format("gui.worldhandler.scoreboard.team.options." + key); + } + + @Override + public String translate2(String key1, String key2) + { + if(Arrays.stream(EnumColor.values()).map(EnumColor::getFormat).anyMatch(Predicates.equalTo(key2))) + { + return I18n.format("gui.worldhandler.color." + key2); + } + + return I18n.format("gui.worldhandler.scoreboard.team.suboption." + key2); + } + + @Override + public void consumeKey1(String key) + { + builderTeams.setRule(key); + } + + @Override + public void consumeKey2(String key1, String key2) + { + builderTeams.setValue(key2); + } + + @Override + public String getId() + { + return "options"; + } + }); + + container.add(options); + } + } + + @Override + public void initButtons(Container container, int x, int y) + { + GuiButtonWorldHandler button3; + GuiButtonWorldHandler button4; + GuiButtonWorldHandler button5; + GuiButtonWorldHandler button6; + + container.add(new GuiButtonWorldHandler(0, x, y + 96, 114, 20, I18n.format("gui.worldhandler.generic.back"))); + container.add(new GuiButtonWorldHandler(1, x + 118, y + 96, 114, 20, I18n.format("gui.worldhandler.generic.backToGame"))); + + container.add(button3 = new GuiButtonWorldHandler(2, x, y, 114, 20, I18n.format("gui.worldhandler.scoreboard.team.create"))); + container.add(button4 = new GuiButtonWorldHandler(3, x, y + 24, 114, 20, I18n.format("gui.worldhandler.scoreboard.team.join") + " / " + I18n.format("gui.worldhandler.scoreboard.team.leave"))); + container.add(button5 = new GuiButtonWorldHandler(4, x, y + 48, 114, 20, I18n.format("gui.worldhandler.scoreboard.team.remove") + " / " + I18n.format("gui.worldhandler.scoreboard.team.empty"))); + container.add(button6 = new GuiButtonWorldHandler(5, x, y + 72, 114, 20, I18n.format("gui.worldhandler.scoreboard.team.options"))); + + button3.enabled = !this.selectedTeam.equals("add"); + button4.enabled = !this.selectedTeam.equals("join|leave"); + button5.enabled = !this.selectedTeam.equals("remove|empty"); + button6.enabled = !this.selectedTeam.equals("option"); + + this.builderTeams.setMode(this.selectedTeam); + + boolean enabled = this.team != null && this.team.length() > 0; + + if(this.selectedTeam.equals("add")) + { + this.builderTeams.setTeam(this.team); + } + else if(this.selectedTeam.equals("join|leave")) + { + this.builderTeams.setPlayer(container.getPlayer()); + + container.add(button3 = new GuiButtonWorldHandler(9, x + 118, y + 36, 114, 20, I18n.format("gui.worldhandler.scoreboard.team.join"))); + container.add(new GuiButtonWorldHandler(10, x + 118, y + 60, 114, 20, I18n.format("gui.worldhandler.scoreboard.team.leave"))); + + button3.enabled = enabled; + } + else if(this.selectedTeam.equals("remove|empty")) + { + container.add(button3 = new GuiButtonWorldHandler(11, x + 118, y + 36, 114, 20, I18n.format("gui.worldhandler.scoreboard.team.remove"))); + container.add(button4 = new GuiButtonWorldHandler(12, x + 118, y + 60, 114, 20, I18n.format("gui.worldhandler.scoreboard.team.empty"))); + + button3.enabled = enabled; + button4.enabled = enabled; + } + + if(!this.selectedTeam.equals("join|leave") && !this.selectedTeam.equals("remove|empty")) + { + int yOffset = this.selectedTeam.equals("option") ? 24 : 0; + + container.add(button3 = new GuiButtonWorldHandler(8, x + 118, y + 48 + yOffset, 114, 20, I18n.format("gui.worldhandler.actions.perform"))); + button3.enabled = enabled; + } + } + + @Override + public void actionPerformed(Container container, GuiButton button) + { + switch(button.id) + { + case 2: + this.selectedTeam = "add"; + container.initGui(); + break; + case 3: + this.selectedTeam = "join|leave"; + container.initGui(); + break; + case 4: + this.selectedTeam = "remove|empty"; + container.initGui(); + break; + case 5: + this.selectedTeam = "option"; + container.initGui(); + break; + case 8: + WorldHandler.sendCommand(this.builderTeams); + container.initButtons(); + break; + case 9: + WorldHandler.sendCommand(this.builderTeams.getBuilderForMode(EnumMode.JOIN)); + container.initButtons(); + break; + case 10: + WorldHandler.sendCommand(this.builderTeams.getBuilderForMode(EnumMode.LEAVE)); + container.initButtons(); + break; + case 11: + WorldHandler.sendCommand(this.builderTeams.getBuilderForMode(EnumMode.REMOVE)); + container.initButtons(); + break; + case 12: + WorldHandler.sendCommand(this.builderTeams.getBuilderForMode(EnumMode.EMPTY)); + container.initButtons(); + break; + default: + break; + } + } + + @Override + public void drawScreen(Container container, int x, int y, int mouseX, int mouseY, float partialTicks) + { + this.teamField.drawTextBox(); + } + + @Override + public void keyTyped(Container container, char typedChar, int keyCode) + { + if(this.teamField.textboxKeyTyped(typedChar, keyCode)) + { + this.team = this.teamField.getText(); + this.builderTeams.setTeam(this.team); + container.initButtons(); + } + } + + @Override + public void mouseClicked(int mouseX, int mouseY, int mouseButton) + { + this.teamField.mouseClicked(mouseX, mouseY, mouseButton); + } + + @Override + public String getTabTitle() + { + return I18n.format("gui.worldhandler.tab.scoreboard.teams"); + } + + @Override + public Content getActiveContent() + { + return Contents.SCOREBOARD_TEAMS; + } + + @Override + public void onPlayerNameChanged(String username) + { + if(this.selectedTeam.equals("join|leave")) + { + this.builderTeams.setPlayer(username); + } + } +} diff --git a/src/main/java/exopandora/worldhandler/gui/content/impl/ContentSignEditor.java b/src/main/java/exopandora/worldhandler/gui/content/impl/ContentSignEditor.java new file mode 100644 index 0000000..6dd2be5 --- /dev/null +++ b/src/main/java/exopandora/worldhandler/gui/content/impl/ContentSignEditor.java @@ -0,0 +1,254 @@ +package exopandora.worldhandler.gui.content.impl; + +import org.lwjgl.input.Keyboard; + +import com.google.common.base.Predicate; +import com.google.common.base.Predicates; + +import exopandora.worldhandler.builder.ICommandBuilder; +import exopandora.worldhandler.builder.impl.BuilderSignEditor; +import exopandora.worldhandler.config.ConfigSkin; +import exopandora.worldhandler.gui.button.GuiButtonWorldHandler; +import exopandora.worldhandler.gui.button.GuiTextFieldTooltip; +import exopandora.worldhandler.gui.category.Categories; +import exopandora.worldhandler.gui.category.Category; +import exopandora.worldhandler.gui.container.Container; +import exopandora.worldhandler.gui.content.Content; +import exopandora.worldhandler.gui.content.Contents; +import exopandora.worldhandler.gui.content.element.impl.ElementColorMenu; +import exopandora.worldhandler.gui.content.element.logic.ILogicColorMenu; +import exopandora.worldhandler.helper.BlockHelper; +import exopandora.worldhandler.main.WorldHandler; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.FontRenderer; +import net.minecraft.client.gui.GuiButton; +import net.minecraft.client.renderer.GlStateManager; +import net.minecraft.client.renderer.RenderHelper; +import net.minecraft.client.resources.I18n; +import net.minecraft.init.Blocks; +import net.minecraft.init.Items; +import net.minecraft.item.ItemStack; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public class ContentSignEditor extends Content +{ + private static final ResourceLocation LOGO = new ResourceLocation("worldhandler:textures/logo.png"); + + private int selectedLine = 0; + private boolean editColor; + + private GuiTextFieldTooltip commandField; + private GuiTextFieldTooltip textlineField; + + private final BuilderSignEditor builderSignEditor = new BuilderSignEditor(); + + @Override + public ICommandBuilder getCommandBuilder() + { + return this.isActive() ? this.builderSignEditor : null; + } + + @Override + public void initGui(Container container, int x, int y) + { + if(this.isActive()) + { + this.builderSignEditor.setPosition(BlockHelper.getFocusedBlockPos()); + + this.commandField = new GuiTextFieldTooltip(x + 118, y + 24, 114, 20, I18n.format("gui.worldhandler.blocks.sign_editor.commmand")); + this.commandField.setValidator(Predicates.notNull()); + this.commandField.setText(this.builderSignEditor.getCommand(this.selectedLine)); + this.commandField.setCursorPositionEnd(); + + ElementColorMenu colors = new ElementColorMenu(this, x, y, "gui.worldhandler.blocks.sign_editor.text_line_" + (this.selectedLine + 1), this.builderSignEditor.getColoredString(this.selectedLine), new int[] {8, 9, 10, 11, 12, 13}, new ILogicColorMenu() + { + @Override + public Predicate getValidator() + { + return string -> Minecraft.getMinecraft().fontRenderer.getStringWidth(string) <= 90; + } + + @Override + public boolean drawButtons() + { + return editColor; + } + }); + + container.add(colors); + } + } + + @Override + public void initButtons(Container container, int x, int y) + { + GuiButtonWorldHandler button3; + GuiButtonWorldHandler button4; + GuiButtonWorldHandler button5; + GuiButtonWorldHandler button6; + + container.add(new GuiButtonWorldHandler(0, x, y + 96, 114, 20, I18n.format("gui.worldhandler.generic.back"))); + container.add(new GuiButtonWorldHandler(1, x + 118, y + 96, 114, 20, I18n.format("gui.worldhandler.generic.backToGame"))); + + if(this.isActive()) + { + container.add(button3 = new GuiButtonWorldHandler(3, x, y, 114, 20, I18n.format("gui.worldhandler.blocks.sign_editor.text_line_1"))); + container.add(button4 = new GuiButtonWorldHandler(4, x, y + 24, 114, 20, I18n.format("gui.worldhandler.blocks.sign_editor.text_line_2"))); + container.add(button5 = new GuiButtonWorldHandler(5, x, y + 48, 114, 20, I18n.format("gui.worldhandler.blocks.sign_editor.text_line_3"))); + container.add(button6 = new GuiButtonWorldHandler(6, x, y + 72, 114, 20, I18n.format("gui.worldhandler.blocks.sign_editor.text_line_4"))); + + if(this.editColor) + { + container.add(new GuiButtonWorldHandler(7, x + 118, y + 72, 114, 20, I18n.format("gui.worldhandler.blocks.sign_editor.done"))); + } + else + { + container.add(new GuiButtonWorldHandler(7, x + 118, y + 48, 114, 20, I18n.format("gui.worldhandler.blocks.sign_editor.format_text_line"))); + container.add(new GuiButtonWorldHandler(2, x + 118, y + 72, 114, 20, I18n.format("gui.worldhandler.actions.place_command_block"))); + } + + button3.enabled = this.selectedLine != 0; + button4.enabled = this.selectedLine != 1; + button5.enabled = this.selectedLine != 2; + button6.enabled = this.selectedLine != 3; + } + } + + @Override + public void updateScreen(Container container) + { + if(!this.isActive()) + { + container.initGui(); + } + } + + @Override + public void actionPerformed(Container container, GuiButton button) + { + switch(button.id) + { + case 2: + WorldHandler.sendCommand(this.builderSignEditor, this.builderSignEditor.isSpecial()); + break; + case 3: + this.selectedLine = 0; + container.initGui(); + break; + case 4: + this.selectedLine = 1; + container.initGui(); + break; + case 5: + this.selectedLine = 2; + container.initGui(); + break; + case 6: + this.selectedLine = 3; + container.initGui(); + break; + case 7: + this.editColor = !this.editColor; + container.initGui(); + break; + default: + break; + } + } + + @Override + public void drawScreen(Container container, int x, int y, int mouseX, int mouseY, float partialTicks) + { + if(this.isActive()) + { + if(!this.editColor) + { + this.commandField.drawTextBox(); + } + } + else + { + float scale = 4; + + GlStateManager.color(1.0F, 1.0F, 1.0F); + GlStateManager.pushMatrix(); + RenderHelper.enableGUIStandardItemLighting(); + + GlStateManager.translate(container.width / 2 - 8.5F * scale, container.height / 2 - 15 - 8.5F * scale, 0); + GlStateManager.scale(scale, scale, scale); + Minecraft.getMinecraft().getRenderItem().renderItemIntoGUI(new ItemStack(Items.SIGN), 0, 0); + + RenderHelper.disableStandardItemLighting(); + GlStateManager.popMatrix(); + + String displayString = I18n.format("gui.worldhandler.blocks.sign_editor.look_at_sign", Keyboard.getKeyName(WorldHandler.KEY_WORLD_HANDLER.getKeyCode())); + FontRenderer fontRenderer = Minecraft.getMinecraft().fontRenderer; + fontRenderer.drawString(displayString, x + 116 - fontRenderer.getStringWidth(displayString) / 2, y + 70, ConfigSkin.getLabelColor()); + } + } + + private boolean isActive() + { + return BlockHelper.isFocusedBlockEqualTo(Blocks.STANDING_SIGN) || BlockHelper.isFocusedBlockEqualTo(Blocks.WALL_SIGN); + } + + @Override + public void keyTyped(Container container, char charTyped, int keyCode) + { + if(this.isActive()) + { + if(this.commandField.textboxKeyTyped(charTyped, keyCode)) + { + this.builderSignEditor.setCommand(this.selectedLine, this.commandField.getText()); + container.initButtons(); + } + } + } + + @Override + public void mouseClicked(int mouseX, int mouseY, int mouseButton) + { + if(this.isActive()) + { + this.commandField.mouseClicked(mouseX, mouseY, mouseButton); + } + } + + @Override + public Category getCategory() + { + return Categories.BLOCKS; + } + + @Override + public String getTitle() + { + return I18n.format("gui.worldhandler.title.blocks.sign_editor"); + } + + @Override + public String getTabTitle() + { + return I18n.format("gui.worldhandler.tab.blocks.sign_editor"); + } + + @Override + public String[] getHeadline() + { + if(BlockHelper.isFocusedBlockEqualTo(Blocks.STANDING_SIGN) || BlockHelper.isFocusedBlockEqualTo(Blocks.WALL_SIGN)) + { + return new String[] {I18n.format("gui.worldhandler.generic.browse"), I18n.format("gui.worldhandler.generic.options")}; + } + + return null; + } + + @Override + public Content getActiveContent() + { + return Contents.SIGN_EDITOR; + } +} diff --git a/src/main/java/exopandora/worldhandler/gui/content/impl/ContentSummon.java b/src/main/java/exopandora/worldhandler/gui/content/impl/ContentSummon.java new file mode 100644 index 0000000..dcc36f6 --- /dev/null +++ b/src/main/java/exopandora/worldhandler/gui/content/impl/ContentSummon.java @@ -0,0 +1,653 @@ +package exopandora.worldhandler.gui.content.impl; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import org.lwjgl.opengl.GL11; + +import com.google.common.base.Predicates; + +import exopandora.worldhandler.builder.ICommandBuilder; +import exopandora.worldhandler.builder.impl.BuilderSummon; +import exopandora.worldhandler.builder.impl.abstr.EnumAttributes; +import exopandora.worldhandler.builder.impl.abstr.EnumAttributes.Applyable; +import exopandora.worldhandler.gui.button.GuiButtonItem; +import exopandora.worldhandler.gui.button.GuiButtonWorldHandler; +import exopandora.worldhandler.gui.button.GuiSlider; +import exopandora.worldhandler.gui.button.GuiTextFieldTooltip; +import exopandora.worldhandler.gui.button.responder.AttributeResponder; +import exopandora.worldhandler.gui.button.responder.SimpleResponder; +import exopandora.worldhandler.gui.category.Categories; +import exopandora.worldhandler.gui.category.Category; +import exopandora.worldhandler.gui.container.Container; +import exopandora.worldhandler.gui.content.Content; +import exopandora.worldhandler.gui.content.Contents; +import exopandora.worldhandler.gui.content.element.impl.ElementPageList; +import exopandora.worldhandler.gui.content.element.logic.ILogicPageList; +import exopandora.worldhandler.main.WorldHandler; +import exopandora.worldhandler.util.UtilPlayer; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiButton; +import net.minecraft.client.resources.I18n; +import net.minecraft.entity.EntityList; +import net.minecraft.init.Blocks; +import net.minecraft.init.Items; +import net.minecraft.init.MobEffects; +import net.minecraft.potion.Potion; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public class ContentSummon extends Content +{ + private GuiTextFieldTooltip mobField; + private GuiTextFieldTooltip customNameField; + private GuiTextFieldTooltip passengerField; + + private int potionPage = 0; + private int equipmentPage = 0; + + private String page = "main"; + private String mob; + private String name; + private String passenger; + + private final BuilderSummon builderSummon = new BuilderSummon(); + + @Override + public ICommandBuilder getCommandBuilder() + { + return this.builderSummon; + } + + @Override + public void initGui(Container container, int x, int y) + { + this.builderSummon.setDirection(UtilPlayer.getPlayerDirection()); + + this.mobField = new GuiTextFieldTooltip(x + 118, y, 114, 20, I18n.format("gui.worldhandler.entities.summon.start.mob_id") + " (" + I18n.format("gui.worldhandler.generic.name") + ")"); + this.mobField.setValidator(Predicates.notNull()); + this.mobField.setText(this.mob); + + this.customNameField = new GuiTextFieldTooltip(x + 118, y + 24, 114, 20, I18n.format("gui.worldhandler.entities.summon.start.custom_name")); + this.customNameField.setValidator(Predicates.notNull()); + this.customNameField.setText(this.name); + + this.passengerField = new GuiTextFieldTooltip(x + 118, y + 48, 114, 20, I18n.format("gui.worldhandler.entities.summon.start.passenger_mob_id")); + this.passengerField.setValidator(Predicates.notNull()); + this.passengerField.setText(this.passenger); + + if(this.page.equals("attributes")) + { + ElementPageList attributes = new ElementPageList(x + 118, y, Stream.concat(EnumAttributes.getAttributesFor(Applyable.BOTH).stream(), EnumAttributes.getAttributesFor(Applyable.MOB).stream()).collect(Collectors.toList()), null, 114, 20, 3, this, new int[] {6, 7, 8}, new ILogicPageList() + { + @Override + public String translate(EnumAttributes key) + { + return key.getTranslation(); + } + + @Override + public void onClick(EnumAttributes clicked) + { + + } + + @Override + public String getRegistryName(EnumAttributes key) + { + return key.getAttribute(); + } + + @Override + public void onRegister(int id, int x, int y, int width, int height, String display, String registry, boolean enabled, EnumAttributes value, Container container) + { + container.add(new GuiSlider(Contents.SUMMON, container, value, x, y, width, height, display, value.getMin(), value.getMax(), value.getStart(), new AttributeResponder(response -> + { + builderSummon.setAttribute(value, response); + }))); + } + + @Override + public EnumAttributes convert(Object object) + { + return null; + } + + @Override + public String getId() + { + return "attributes"; + } + }); + + container.add(attributes); + } + } + + @Override + public void initButtons(Container container, int x, int y) + { + GuiButtonWorldHandler button3; + GuiButtonWorldHandler button4; + GuiButtonWorldHandler button5; + GuiButtonWorldHandler button6; + GuiButtonWorldHandler button7; + GuiButtonWorldHandler button8; + GuiButtonWorldHandler button9; + GuiButtonWorldHandler button10; + GuiButtonItem button11; + GuiButtonItem button12; + GuiButtonItem button13; + GuiButtonItem button14; + GuiButtonItem button15; + GuiButtonWorldHandler button16; + GuiButtonItem button17; + GuiButtonItem button18; + GuiButtonItem button19; + GuiButtonItem button20; + GuiButtonItem button21; + GuiButtonWorldHandler button22; + GuiButtonItem button23; + GuiButtonItem button24; + GuiButtonItem button25; + GuiButtonItem button26; + GuiButtonItem button27; + GuiButtonWorldHandler button28; + + container.add(new GuiButtonWorldHandler(0, x, y + 96, 114, 20, I18n.format("gui.worldhandler.generic.back"))); + container.add(new GuiButtonWorldHandler(1, x + 118, y + 96, 114, 20, I18n.format("gui.worldhandler.generic.backToGame"))); + + container.add(button7 = new GuiButtonWorldHandler(12, x, y, 114, 20, I18n.format("gui.worldhandler.entities.summon.start"))); + container.add(button8 = new GuiButtonWorldHandler(3, x, y + 24, 114, 20, I18n.format("gui.worldhandler.entities.summon.potion_effects"))); + container.add(button9 = new GuiButtonWorldHandler(4, x, y + 48, 114, 20, I18n.format("gui.worldhandler.entities.summon.attributes"))); + container.add(button10 = new GuiButtonWorldHandler(5, x, y + 72, 114, 20, I18n.format("gui.worldhandler.entities.summon.equipment"))); + + if(this.page.equals("main")) + { + button7.enabled = false; + + if(!this.builderSummon.needsCommandBlock() && !this.builderSummon.getCustomName().isSpecial()) + { + container.add(button5 = new GuiButtonWorldHandler(9, x + 118, y + 72, 114, 20, I18n.format("gui.worldhandler.title.entities.summon"))); + } + else + { + container.add(button5 = new GuiButtonWorldHandler(9, x + 118, y + 72, 114, 20, I18n.format("gui.worldhandler.actions.place_command_block"))); + } + + button5.enabled = EntityList.isRegistered(this.builderSummon.getEntity()); + } + else if(this.page.equals("potionEffects")) + { + button8.enabled = false; + + container.add(button3 = new GuiButtonWorldHandler(14, x + 118, y + 72, 56, 20, "<")); + container.add(button4 = new GuiButtonWorldHandler(15, x + 118 + 60, y + 72, 55, 20, ">")); + + int count = 0; + + for(ResourceLocation location : this.getSortedPotionList()) + { + Potion potion = Potion.REGISTRY.getObject(location); + + if(!potion.equals(MobEffects.INSTANT_DAMAGE) && !potion.equals(MobEffects.INSTANT_HEALTH)) + { + if(this.potionPage == 0) + { + button3.enabled = false; + } + + if(this.potionPage == Potion.REGISTRY.getKeys().size() - 3) + { + button4.enabled = false; + } + + if(count == this.potionPage) + { + container.add(new GuiSlider(this, container, "amplifier" + potion, x + 118, y, 114, 20, I18n.format(potion.getName()), 0, 100, 0, new SimpleResponder(value -> + { + this.builderSummon.setAmplifier(potion, value.byteValue()); + }))); + container.add(new GuiSlider(this, container, "duration" + potion, x + 118, y + 24, 114, 20, I18n.format("gui.worldhandler.potion.time.minutes"), 0, 100, 0, new SimpleResponder(value -> + { + this.builderSummon.setMinutes(potion, value); + }))); + container.add(new GuiButtonWorldHandler(54, x + 118, y + 48, 114, 20, I18n.format("gui.worldhandler.potions.effect.particles", this.builderSummon.getShowParticles(potion) ? I18n.format("gui.worldhandler.generic.on") : I18n.format("gui.worldhandler.generic.off")))); + break; + } + + count++; + } + } + } + else if(this.page.equals("attributes")) + { + button9.enabled = false; + } + else if(this.page.equals("equipment")) + { + container.add(button3 = new GuiButtonWorldHandler(16, x + 118, y + 72, 56, 20, "<")); + container.add(button4 = new GuiButtonWorldHandler(17, x + 118 + 60, y + 72, 54, 20, ">")); + + if(this.equipmentPage == 0) + { + button3.enabled = false; + + container.add(button11 = new GuiButtonItem(18, x + 118, y, 18, 20, Items.LEATHER_HELMET)); + container.add(button12 = new GuiButtonItem(19, x + 118 + 20 - 1, y, 18, 20, Items.IRON_HELMET)); + container.add(button13 = new GuiButtonItem(20, x + 118 + 20 * 2 - 2, y, 18, 20, Items.CHAINMAIL_HELMET)); + container.add(button14 = new GuiButtonItem(21, x + 118 + 20 * 3 - 3, y, 18, 20, Items.GOLDEN_HELMET)); + container.add(button15 = new GuiButtonItem(22, x + 118 + 20 * 4 - 4, y, 18, 20, Items.DIAMOND_HELMET)); + container.add(button16 = new GuiButtonWorldHandler(23, x + 118 + 20 * 5 - 5, y, 20, 20, null)); + + container.add(button17 = new GuiButtonItem(24, x + 118, y + 24, 18, 20, Items.LEATHER_CHESTPLATE)); + container.add(button18 = new GuiButtonItem(25, x + 118 + 20 - 1, y + 24, 18, 20, Items.IRON_CHESTPLATE)); + container.add(button19 = new GuiButtonItem(26, x + 118 + 20 * 2 - 2, y + 24, 18, 20, Items.CHAINMAIL_CHESTPLATE)); + container.add(button20 = new GuiButtonItem(27, x + 118 + 20 * 3 - 3, y + 24, 18, 20, Items.GOLDEN_CHESTPLATE)); + container.add(button21 = new GuiButtonItem(28, x + 118 + 20 * 4 - 4, y + 24, 18, 20, Items.DIAMOND_CHESTPLATE)); + container.add(button22 = new GuiButtonWorldHandler(29, x + 118 + 20 * 5 - 5, y + 24, 20, 20, null)); + + container.add(button23 = new GuiButtonItem(30, x + 118, y + 48, 18, 20, Items.LEATHER_LEGGINGS)); + container.add(button24 = new GuiButtonItem(31, x + 118 + 20 - 1, y + 48, 18, 20, Items.IRON_LEGGINGS)); + container.add(button25 = new GuiButtonItem(32, x + 118 + 20 * 2 - 2, y + 48, 18, 20, Items.CHAINMAIL_LEGGINGS)); + container.add(button26 = new GuiButtonItem(33, x + 118 + 20 * 3 - 3, y + 48, 18, 20, Items.GOLDEN_LEGGINGS)); + container.add(button27 = new GuiButtonItem(34, x + 118 + 20 * 4 - 4, y + 48, 18, 20, Items.DIAMOND_LEGGINGS)); + container.add(button28 = new GuiButtonWorldHandler(35, x + 118 + 20 * 5 - 5, y + 48, 20, 20, null)); + + button11.enabled = !this.builderSummon.getArmorItem(3).equals(Items.LEATHER_HELMET.getRegistryName()); + button12.enabled = !this.builderSummon.getArmorItem(3).equals(Items.IRON_HELMET.getRegistryName()); + button13.enabled = !this.builderSummon.getArmorItem(3).equals(Items.CHAINMAIL_HELMET.getRegistryName()); + button14.enabled = !this.builderSummon.getArmorItem(3).equals(Items.GOLDEN_HELMET.getRegistryName()); + button15.enabled = !this.builderSummon.getArmorItem(3).equals(Items.DIAMOND_HELMET.getRegistryName()); + button16.enabled = !this.builderSummon.getArmorItem(3).equals(Blocks.AIR.getRegistryName()); + + button17.enabled = !this.builderSummon.getArmorItem(2).equals(Items.LEATHER_CHESTPLATE.getRegistryName()); + button18.enabled = !this.builderSummon.getArmorItem(2).equals(Items.IRON_CHESTPLATE.getRegistryName()); + button19.enabled = !this.builderSummon.getArmorItem(2).equals(Items.CHAINMAIL_CHESTPLATE.getRegistryName()); + button20.enabled = !this.builderSummon.getArmorItem(2).equals(Items.GOLDEN_CHESTPLATE.getRegistryName()); + button21.enabled = !this.builderSummon.getArmorItem(2).equals(Items.DIAMOND_CHESTPLATE.getRegistryName()); + button22.enabled = !this.builderSummon.getArmorItem(2).equals(Blocks.AIR.getRegistryName()); + + button23.enabled = !this.builderSummon.getArmorItem(1).equals(Items.LEATHER_LEGGINGS.getRegistryName()); + button24.enabled = !this.builderSummon.getArmorItem(1).equals(Items.IRON_LEGGINGS.getRegistryName()); + button25.enabled = !this.builderSummon.getArmorItem(1).equals(Items.CHAINMAIL_LEGGINGS.getRegistryName()); + button26.enabled = !this.builderSummon.getArmorItem(1).equals(Items.GOLDEN_LEGGINGS.getRegistryName()); + button27.enabled = !this.builderSummon.getArmorItem(1).equals(Items.DIAMOND_LEGGINGS.getRegistryName()); + button28.enabled = !this.builderSummon.getArmorItem(1).equals(Blocks.AIR.getRegistryName()); + } + else if(this.equipmentPage == 1) + { + button4.enabled = false; + + container.add(button11 = new GuiButtonItem(36, x + 118, y, 18, 20, Items.LEATHER_BOOTS)); + container.add(button12 = new GuiButtonItem(37, x + 118 + 20 - 1, y, 18, 20, Items.IRON_BOOTS)); + container.add(button13 = new GuiButtonItem(38, x + 118 + 20 * 2 - 2, y, 18, 20, Items.CHAINMAIL_BOOTS)); + container.add(button14 = new GuiButtonItem(39, x + 118 + 20 * 3 - 3, y, 18, 20, Items.GOLDEN_BOOTS)); + container.add(button15 = new GuiButtonItem(40, x + 118 + 20 * 4 - 4, y, 18, 20, Items.DIAMOND_BOOTS)); + container.add(button16 = new GuiButtonWorldHandler(41, x + 118 + 20 * 5 - 5, y, 20, 20, null)); + + container.add(button17 = new GuiButtonItem(42, x + 118, y + 24, 18, 20, Items.WOODEN_SWORD)); + container.add(button18 = new GuiButtonItem(43, x + 118 + 20 - 1, y + 24, 18, 20, Items.STONE_SWORD)); + container.add(button19 = new GuiButtonItem(44, x + 118 + 20 * 2 - 2, y + 24, 18, 20, Items.IRON_SWORD)); + container.add(button20 = new GuiButtonItem(45, x + 118 + 20 * 3 - 3, y + 24, 18, 20, Items.GOLDEN_SWORD)); + container.add(button21 = new GuiButtonItem(46, x + 118 + 20 * 4 - 4, y + 24, 18, 20, Items.DIAMOND_SWORD)); + container.add(button22 = new GuiButtonWorldHandler(47, x + 118 + 20 * 5 - 5, y + 24, 20, 20, null)); + + container.add(button23 = new GuiButtonItem(48, x + 118, y + 48, 18, 20, Items.WOODEN_SWORD)); + container.add(button24 = new GuiButtonItem(49, x + 118 + 20 - 1, y + 48, 18, 20, Items.STONE_SWORD)); + container.add(button25 = new GuiButtonItem(50, x + 118 + 20 * 2 - 2, y + 48, 18, 20, Items.IRON_SWORD)); + container.add(button26 = new GuiButtonItem(51, x + 118 + 20 * 3 - 3, y + 48, 18, 20, Items.GOLDEN_SWORD)); + container.add(button27 = new GuiButtonItem(52, x + 118 + 20 * 4 - 4, y + 48, 18, 20, Items.DIAMOND_SWORD)); + container.add(button28 = new GuiButtonWorldHandler(53, x + 118 + 20 * 5 - 5, y + 48, 20, 20, null)); + + button11.enabled = !this.builderSummon.getArmorItem(0).equals(Items.LEATHER_BOOTS.getRegistryName()); + button12.enabled = !this.builderSummon.getArmorItem(0).equals(Items.IRON_BOOTS.getRegistryName()); + button13.enabled = !this.builderSummon.getArmorItem(0).equals(Items.CHAINMAIL_BOOTS.getRegistryName()); + button14.enabled = !this.builderSummon.getArmorItem(0).equals(Items.GOLDEN_BOOTS.getRegistryName()); + button15.enabled = !this.builderSummon.getArmorItem(0).equals(Items.DIAMOND_BOOTS.getRegistryName()); + button16.enabled = !this.builderSummon.getArmorItem(0).equals(Blocks.AIR.getRegistryName()); + + button17.enabled = !this.builderSummon.getHandItem(0).equals(Items.WOODEN_SWORD.getRegistryName()); + button18.enabled = !this.builderSummon.getHandItem(0).equals(Items.STONE_SWORD.getRegistryName()); + button19.enabled = !this.builderSummon.getHandItem(0).equals(Items.IRON_SWORD.getRegistryName()); + button20.enabled = !this.builderSummon.getHandItem(0).equals(Items.GOLDEN_SWORD.getRegistryName()); + button21.enabled = !this.builderSummon.getHandItem(0).equals(Items.DIAMOND_SWORD.getRegistryName()); + button22.enabled = !this.builderSummon.getHandItem(0).equals(Blocks.AIR.getRegistryName()); + + button23.enabled = !this.builderSummon.getHandItem(1).equals(Items.WOODEN_SWORD.getRegistryName()); + button24.enabled = !this.builderSummon.getHandItem(1).equals(Items.STONE_SWORD.getRegistryName()); + button25.enabled = !this.builderSummon.getHandItem(1).equals(Items.IRON_SWORD.getRegistryName()); + button26.enabled = !this.builderSummon.getHandItem(1).equals(Items.GOLDEN_SWORD.getRegistryName()); + button27.enabled = !this.builderSummon.getHandItem(1).equals(Items.DIAMOND_SWORD.getRegistryName()); + button28.enabled = !this.builderSummon.getHandItem(1).equals(Blocks.AIR.getRegistryName()); + } + + button10.enabled = false; + } + } + + @Override + public void actionPerformed(Container container, GuiButton button) + { + switch(button.id) + { + case 3: + this.page = "potionEffects"; + container.initGui(); + break; + case 4: + this.page = "attributes"; + container.initGui(); + break; + case 5: + this.page = "equipment"; + container.initGui(); + break; + case 9: + WorldHandler.sendCommand(this.builderSummon, this.builderSummon.getCustomName().isSpecial()); + break; + case 12: + this.page = "main"; + container.initGui(); + break; + case 14: + this.potionPage--; + container.initGui(); + break; + case 15: + this.potionPage++; + container.initGui(); + break; + case 16: + this.equipmentPage--; + container.initGui(); + break; + case 17: + this.equipmentPage++; + container.initGui(); + break; + case 18: + this.builderSummon.setArmorItem(3, Items.LEATHER_HELMET); + container.initGui(); + break; + case 19: + this.builderSummon.setArmorItem(3, Items.IRON_HELMET); + container.initGui(); + break; + case 20: + this.builderSummon.setArmorItem(3, Items.CHAINMAIL_HELMET); + container.initGui(); + break; + case 21: + this.builderSummon.setArmorItem(3, Items.GOLDEN_HELMET); + container.initGui(); + break; + case 22: + this.builderSummon.setArmorItem(3, Items.DIAMOND_HELMET); + container.initGui(); + break; + case 23: + this.builderSummon.setArmorItem(3, Blocks.AIR); + container.initGui(); + break; + case 24: + this.builderSummon.setArmorItem(2, Items.LEATHER_CHESTPLATE); + container.initGui(); + break; + case 25: + this.builderSummon.setArmorItem(2, Items.IRON_CHESTPLATE); + container.initGui(); + break; + case 26: + this.builderSummon.setArmorItem(2, Items.CHAINMAIL_CHESTPLATE); + container.initGui(); + break; + case 27: + this.builderSummon.setArmorItem(2, Items.GOLDEN_CHESTPLATE); + container.initGui(); + break; + case 28: + this.builderSummon.setArmorItem(2, Items.DIAMOND_CHESTPLATE); + container.initGui(); + break; + case 29: + this.builderSummon.setArmorItem(2, Blocks.AIR); + container.initGui(); + break; + case 30: + this.builderSummon.setArmorItem(1, Items.LEATHER_LEGGINGS); + container.initGui(); + break; + case 31: + this.builderSummon.setArmorItem(1, Items.IRON_LEGGINGS); + container.initGui(); + break; + case 32: + this.builderSummon.setArmorItem(1, Items.CHAINMAIL_LEGGINGS); + container.initGui(); + break; + case 33: + this.builderSummon.setArmorItem(1, Items.GOLDEN_LEGGINGS); + container.initGui(); + break; + case 34: + this.builderSummon.setArmorItem(1, Items.DIAMOND_LEGGINGS); + container.initGui(); + break; + case 35: + this.builderSummon.setArmorItem(1, Blocks.AIR); + container.initGui(); + break; + case 36: + this.builderSummon.setArmorItem(0, Items.LEATHER_BOOTS); + container.initGui(); + break; + case 37: + this.builderSummon.setArmorItem(0, Items.IRON_BOOTS); + container.initGui(); + break; + case 38: + this.builderSummon.setArmorItem(0, Items.CHAINMAIL_BOOTS); + container.initGui(); + break; + case 39: + this.builderSummon.setArmorItem(0, Items.GOLDEN_BOOTS); + container.initGui(); + break; + case 40: + this.builderSummon.setArmorItem(0, Items.DIAMOND_BOOTS); + container.initGui(); + break; + case 41: + this.builderSummon.setArmorItem(0, Blocks.AIR); + container.initGui(); + break; + case 42: + this.builderSummon.setHandItem(0, Items.WOODEN_SWORD); + container.initGui(); + break; + case 43: + this.builderSummon.setHandItem(0, Items.STONE_SWORD); + container.initGui(); + break; + case 44: + this.builderSummon.setHandItem(0, Items.IRON_SWORD); + container.initGui(); + break; + case 45: + this.builderSummon.setHandItem(0, Items.GOLDEN_SWORD); + container.initGui(); + break; + case 46: + this.builderSummon.setHandItem(0, Items.DIAMOND_SWORD); + container.initGui(); + break; + case 47: + this.builderSummon.setHandItem(0, Blocks.AIR); + container.initGui(); + break; + case 48: + this.builderSummon.setHandItem(1, Items.WOODEN_SWORD); + container.initGui(); + break; + case 49: + this.builderSummon.setHandItem(1, Items.STONE_SWORD); + container.initGui(); + break; + case 50: + this.builderSummon.setHandItem(1, Items.IRON_SWORD); + container.initGui(); + break; + case 51: + this.builderSummon.setHandItem(1, Items.GOLDEN_SWORD); + container.initGui(); + break; + case 52: + this.builderSummon.setHandItem(1, Items.DIAMOND_SWORD); + container.initGui(); + break; + case 53: + this.builderSummon.setHandItem(1, Blocks.AIR); + container.initGui(); + break; + case 54: + int count = 0; + + for(ResourceLocation value : this.getSortedPotionList()) + { + Potion potion = Potion.getPotionFromResourceLocation(value.toString()); + + if(!potion.equals(MobEffects.INSTANT_DAMAGE) && !potion.equals(MobEffects.INSTANT_HEALTH)) + { + if(count == this.potionPage) + { + this.builderSummon.setShowParticles(potion, !this.builderSummon.getShowParticles(potion)); + break; + } + + count++; + } + } + container.initGui(); + break; + default: + break; + } + } + + @Override + public void drawScreen(Container container, int x, int y, int mouseX, int mouseY, float partialTicks) + { + if(this.page.equals("main")) + { + this.mobField.drawTextBox(); + this.customNameField.drawTextBox(); + this.passengerField.drawTextBox(); + } + else if(this.page.equals("equipment")) + { + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + Minecraft.getMinecraft().renderEngine.bindTexture(new ResourceLocation("textures/gui/container/beacon.png")); + + for(int row = 0; row < 3; row++) + { + container.drawTexturedModalRect(x + 116 + 99, y + 2 + 24 * row, 112, 221, 16, 16); + } + } + } + + @Override + public void keyTyped(Container container, char charTyped, int keyCode) + { + if(this.mobField.textboxKeyTyped(charTyped, keyCode)) + { + this.mob = this.mobField.getText(); + this.builderSummon.setEntity(this.mob); + container.initButtons(); + } + + if(this.customNameField.textboxKeyTyped(charTyped, keyCode)) + { + this.name = this.customNameField.getText(); + this.builderSummon.setCustomName(this.name); + container.initButtons(); + } + + if(this.passengerField.textboxKeyTyped(charTyped, keyCode)) + { + this.passenger = this.passengerField.getText(); + this.builderSummon.setPassenger(this.passenger); + container.initButtons(); + } + } + + @Override + public void mouseClicked(int mouseX, int mouseY, int mouseButton) + { + if(this.page.equals("main")) + { + this.mobField.mouseClicked(mouseX, mouseY, mouseButton); + this.customNameField.mouseClicked(mouseX, mouseY, mouseButton); + this.passengerField.mouseClicked(mouseX, mouseY, mouseButton); + } + } + + private List getSortedPotionList() + { + List potions = new ArrayList(Potion.REGISTRY.getKeys()); + potions.sort((a, b) -> I18n.format(Potion.REGISTRY.getObject(a).getName()).compareTo(I18n.format(Potion.REGISTRY.getObject(b).getName()))); + + return potions; + } + + @Override + public Category getCategory() + { + return Categories.ENTITIES; + } + + @Override + public String getTitle() + { + return I18n.format("gui.worldhandler.title.entities.summon"); + } + + @Override + public String getTabTitle() + { + return I18n.format("gui.worldhandler.tab.entities.summon"); + } + + @Override + public String[] getHeadline() + { + String[] headline = new String[2]; + + headline[0] = I18n.format("gui.worldhandler.generic.browse"); + + if(this.page.equals("potionEffects")) + { + headline[1] = (this.potionPage + 1) + "/" + (Potion.REGISTRY.getKeys().size() - 2); + } + else if(this.page.equals("equipment")) + { + headline[1] = (this.equipmentPage + 1) + "/2"; + } + else if(this.page.equals("main")) + { + headline[1] = I18n.format("gui.worldhandler.generic.options"); + } + + return headline; + } + + @Override + public Content getActiveContent() + { + return Contents.SUMMON; + } +} diff --git a/src/main/java/exopandora/worldhandler/gui/content/impl/ContentWorldInfo.java b/src/main/java/exopandora/worldhandler/gui/content/impl/ContentWorldInfo.java new file mode 100644 index 0000000..ddf751e --- /dev/null +++ b/src/main/java/exopandora/worldhandler/gui/content/impl/ContentWorldInfo.java @@ -0,0 +1,233 @@ +package exopandora.worldhandler.gui.content.impl; + +import java.util.function.Function; + +import exopandora.worldhandler.format.TextFormatting; +import exopandora.worldhandler.gui.button.GuiButtonWorldHandler; +import exopandora.worldhandler.gui.button.GuiTextFieldTooltip; +import exopandora.worldhandler.gui.category.Categories; +import exopandora.worldhandler.gui.category.Category; +import exopandora.worldhandler.gui.container.Container; +import exopandora.worldhandler.gui.content.Content; +import exopandora.worldhandler.gui.content.Contents; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiButton; +import net.minecraft.client.resources.I18n; +import net.minecraft.world.World; +import net.minecraft.world.storage.WorldInfo; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public class ContentWorldInfo extends Content +{ + private String selectedMain = "start"; + + private GuiTextFieldTooltip posXField; + private GuiTextFieldTooltip posYField; + private GuiTextFieldTooltip posZField; + + private GuiTextFieldTooltip worldField; + private GuiTextFieldTooltip seedField; + private GuiTextFieldTooltip terrainField; + + private GuiTextFieldTooltip totalTimeField; + private GuiTextFieldTooltip currentTimeField; + + @Override + public void initGui(Container container, int x, int y) + { + World world = Minecraft.getMinecraft().world; + + if(Minecraft.getMinecraft().getIntegratedServer() != null) + { + world = Minecraft.getMinecraft().getIntegratedServer().getEntityWorld(); + } + + this.posXField = new GuiTextFieldTooltip(x + 118, y + 12, 114, 20); + this.posXField.setText(I18n.format("gui.worldhandler.world_info.start.spawn") + " X: " + this.getWorldInfo(WorldInfo::getSpawnX, world)); + + this.posYField = new GuiTextFieldTooltip(x + 118, y + 36, 114, 20); + this.posYField.setText(I18n.format("gui.worldhandler.world_info.start.spawn") + " Y: " + this.getWorldInfo(WorldInfo::getSpawnY, world)); + + this.posZField = new GuiTextFieldTooltip(x + 118, y + 60, 114, 20); + this.posZField.setText(I18n.format("gui.worldhandler.world_info.start.spawn") + " Z: " + this.getWorldInfo(WorldInfo::getSpawnZ, world)); + + this.worldField = new GuiTextFieldTooltip(x + 118, y + 12, 114, 20); + this.worldField.setText(I18n.format("gui.worldhandler.world_info.world.name") + ": " + this.getWorldInfo(WorldInfo::getWorldName, world)); + + this.terrainField = new GuiTextFieldTooltip(x + 118, y + 36, 114, 20); + this.terrainField.setText(I18n.format("gui.worldhandler.world_info.world.world_type") + ": " + this.getWorldInfo(info -> I18n.format(info.getTerrainType().getTranslationKey()), world)); + + this.seedField = new GuiTextFieldTooltip(x + 118, y + 60, 114, 20); + this.seedField.setText(I18n.format("gui.worldhandler.world_info.world.seed") + ": " + (Minecraft.getMinecraft().getIntegratedServer() != null ? world.getWorldInfo().getSeed() : I18n.format("gui.worldhandler.world_info.n_a"))); + this.seedField.setValidator(string -> string.equals(this.seedField.getText())); + this.seedField.setCursorPositionZero(); + this.updateCursorPosition(); + + this.currentTimeField = new GuiTextFieldTooltip(x + 118, y + 24, 114, 20); + this.updateCurrentTime(); + + this.totalTimeField = new GuiTextFieldTooltip(x + 118, y + 48, 114, 20); + this.updateTotalTime(); + } + + @Override + public void initButtons(Container container, int x, int y) + { + GuiButtonWorldHandler start; + GuiButtonWorldHandler world; + GuiButtonWorldHandler stats; + + container.add(new GuiButtonWorldHandler(0, x, y + 96, 114, 20, I18n.format("gui.worldhandler.generic.back"))); + container.add(new GuiButtonWorldHandler(1, x + 118, y + 96, 114, 20, I18n.format("gui.worldhandler.generic.backToGame"))); + + container.add(start = new GuiButtonWorldHandler(2, x, y + 12, 114, 20, I18n.format("gui.worldhandler.world_info.start"))); + container.add(world = new GuiButtonWorldHandler(3, x, y + 36, 114, 20, I18n.format("gui.worldhandler.world_info.world"))); + container.add(stats = new GuiButtonWorldHandler(4, x, y + 60, 114, 20, I18n.format("gui.worldhandler.world_info.statistics"))); + + if(this.selectedMain.equals("start")) + { + start.enabled = false; + } + else if(this.selectedMain.equals("world")) + { + world.enabled = false; + } + else if(this.selectedMain.equals("stats")) + { + stats.enabled = false; + } + } + + @Override + public void updateScreen(Container container) + { + this.updateCurrentTime(); + this.updateTotalTime(); + } + + @Override + public void actionPerformed(Container container, GuiButton button) + { + switch(button.id) + { + case 2: + this.selectedMain = "start"; + container.initGui(); + break; + case 3: + this.selectedMain = "world"; + container.initGui(); + break; + case 4: + this.selectedMain = "stats"; + container.initGui(); + break; + default: + break; + } + } + + @Override + public void drawScreen(Container container, int x, int y, int mouseX, int mouseY, float partialTicks) + { + if(this.selectedMain.equals("start")) + { + this.posXField.drawTextBox(); + this.posYField.drawTextBox(); + this.posZField.drawTextBox(); + } + else if(this.selectedMain.equals("world")) + { + this.worldField.drawTextBox(); + this.terrainField.drawTextBox(); + this.seedField.drawTextBox(); + } + else if(this.selectedMain.equals("stats")) + { + this.totalTimeField.drawTextBox(); + this.currentTimeField.drawTextBox(); + } + } + + private void updateCurrentTime() + { + this.currentTimeField.setText(I18n.format("gui.worldhandler.world_info.statistics.world_time") + ": " + TextFormatting.getWorldTime(Minecraft.getMinecraft().world.getWorldInfo().getWorldTime())); + } + + private void updateTotalTime() + { + this.totalTimeField.setText(I18n.format("gui.worldhandler.world_info.statistics.played") + ": " + TextFormatting.getTotalTimePlayed(Minecraft.getMinecraft().world.getWorldInfo().getWorldTotalTime())); + } + + @Override + public void keyTyped(Container container, char typedChar, int keyCode) + { + if(this.selectedMain.equals("world")) + { + this.seedField.textboxKeyTyped(typedChar, keyCode); + this.updateCursorPosition(); + } + } + + @Override + public void mouseClicked(int mouseX, int mouseY, int mouseButton) + { + if(this.selectedMain.equals("world")) + { + this.seedField.mouseClicked(mouseX, mouseY, mouseButton); + this.updateCursorPosition(); + } + } + + private String getWorldInfo(Function function, World world) + { + if(world != null) + { + return String.valueOf(function.apply(world.getWorldInfo())); + } + + return I18n.format("gui.worldhandler.world_info.n_a"); + } + + private void updateCursorPosition() + { + int length = I18n.format("gui.worldhandler.world_info.start.spawn").length(); + + if(this.seedField.getCursorPosition() < length + 2) + { + this.seedField.setCursorPosition(length + 1); + } + } + + @Override + public Category getCategory() + { + return Categories.WORLD; + } + + @Override + public String getTitle() + { + return I18n.format("gui.worldhandler.title.world.world"); + } + + @Override + public String getTabTitle() + { + return I18n.format("gui.worldhandler.tab.world.world"); + } + + @Override + public String[] getHeadline() + { + return new String[] {I18n.format("gui.worldhandler.generic.browse")}; + } + + @Override + public Content getActiveContent() + { + return Contents.WORLD_INFO; + } +} diff --git a/src/main/java/exopandora/worldhandler/gui/content/impl/abstr/ContentChild.java b/src/main/java/exopandora/worldhandler/gui/content/impl/abstr/ContentChild.java new file mode 100644 index 0000000..56a0d8e --- /dev/null +++ b/src/main/java/exopandora/worldhandler/gui/content/impl/abstr/ContentChild.java @@ -0,0 +1,58 @@ +package exopandora.worldhandler.gui.content.impl.abstr; + +import exopandora.worldhandler.gui.category.Category; +import exopandora.worldhandler.gui.content.Content; +import exopandora.worldhandler.gui.content.Contents; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public abstract class ContentChild extends Content +{ + protected Content parent; + + public ContentChild withParent(Content parent) + { + this.parent = parent; + return this; + } + + @Override + public Category getCategory() + { + if(this.parent.getCategory() != null) + { + return this.parent.getCategory(); + } + + return Contents.MAIN.getCategory(); + } + + @Override + public String getTabTitle() + { + if(this.parent != null) + { + return this.parent.getTabTitle(); + } + + return null; + } + + @Override + public Content getActiveContent() + { + if(this.parent != null) + { + return this.parent.getActiveContent(); + } + + return null; + } + + @Override + public Content getBackContent() + { + return this.parent; + } +} diff --git a/src/main/java/exopandora/worldhandler/gui/content/impl/abstr/ContentScoreboard.java b/src/main/java/exopandora/worldhandler/gui/content/impl/abstr/ContentScoreboard.java new file mode 100644 index 0000000..1376c6f --- /dev/null +++ b/src/main/java/exopandora/worldhandler/gui/content/impl/abstr/ContentScoreboard.java @@ -0,0 +1,34 @@ +package exopandora.worldhandler.gui.content.impl.abstr; + +import exopandora.worldhandler.gui.category.Categories; +import exopandora.worldhandler.gui.category.Category; +import exopandora.worldhandler.gui.content.Content; +import exopandora.worldhandler.helper.ScoreboardHelper; +import net.minecraft.client.resources.I18n; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public abstract class ContentScoreboard extends Content +{ + protected static final ScoreboardHelper HELPER = new ScoreboardHelper(); + protected static String objective; + + @Override + public Category getCategory() + { + return Categories.SCOREBOARD; + } + + @Override + public String getTitle() + { + return I18n.format("gui.worldhandler.title.scoreboard"); + } + + @Override + public String[] getHeadline() + { + return new String[] {I18n.format("gui.worldhandler.generic.browse"), I18n.format("gui.worldhandler.generic.options")}; + } +} diff --git a/src/main/java/exopandora/worldhandler/helper/AdvancementHelper.java b/src/main/java/exopandora/worldhandler/helper/AdvancementHelper.java new file mode 100644 index 0000000..d4cbe11 --- /dev/null +++ b/src/main/java/exopandora/worldhandler/helper/AdvancementHelper.java @@ -0,0 +1,38 @@ +package exopandora.worldhandler.helper; + +import java.util.List; + +import exopandora.worldhandler.builder.impl.BuilderAdvancement.EnumMode; +import net.minecraft.advancements.AdvancementManager; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public class AdvancementHelper +{ + public static final AdvancementManager ADVANCEMENT_MANAGER = new AdvancementManager(null); + private final Node modes = new Node(); + + public AdvancementHelper() + { + this.init(); + } + + private void init() + { + for(EnumMode mode : EnumMode.values()) + { + this.modes.addNode(mode.toString()); + } + } + + public List getModes() + { + if(this.modes != null) + { + return this.modes.getEntries(); + } + + return null; + } +} diff --git a/src/main/java/exopandora/worldhandler/helper/BlockHelper.java b/src/main/java/exopandora/worldhandler/helper/BlockHelper.java new file mode 100644 index 0000000..12c996e --- /dev/null +++ b/src/main/java/exopandora/worldhandler/helper/BlockHelper.java @@ -0,0 +1,223 @@ +package exopandora.worldhandler.helper; + +import java.util.ArrayList; +import java.util.List; +import java.util.function.Consumer; + +import org.apache.commons.lang3.ArrayUtils; + +import exopandora.worldhandler.builder.impl.BuilderSetblock; +import exopandora.worldhandler.builder.types.Coordinate; +import exopandora.worldhandler.config.ConfigSettings; +import exopandora.worldhandler.main.WorldHandler; +import exopandora.worldhandler.util.UtilPlayer; +import io.netty.buffer.Unpooled; +import net.minecraft.block.Block; +import net.minecraft.client.Minecraft; +import net.minecraft.init.Blocks; +import net.minecraft.network.PacketBuffer; +import net.minecraft.network.play.client.CPacketCustomPayload; +import net.minecraft.tileentity.TileEntityCommandBlock; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.RayTraceResult; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public class BlockHelper +{ + private static BlockPos POS_1 = BlockPos.ORIGIN; + private static BlockPos POS_2 = BlockPos.ORIGIN; + private static final List> POS_1_OBSERVERS = new ArrayList>(); + private static final List> POS_2_OBSERVERS = new ArrayList>(); + private static final Block[] BLACKLIST = new Block[] {Blocks.AIR, Blocks.WATER, Blocks.LAVA}; + + public static BlockPos getFocusedBlockPos() + { + RayTraceResult rayTrace = Minecraft.getMinecraft().objectMouseOver; + + if(rayTrace != null) + { + if(rayTrace.typeOfHit.equals(RayTraceResult.Type.BLOCK)) + { + BlockPos position = rayTrace.getBlockPos(); + + if(!ArrayUtils.contains(BLACKLIST, Minecraft.getMinecraft().world.getBlockState(position).getBlock())) + { + return position; + } + } + } + + return Minecraft.getMinecraft().player.getPosition(); + } + + public static boolean isFocusedBlockEqualTo(Block block) + { + return Block.isEqualTo(getFocusedBlock(), block); + } + + public static Block getFocusedBlock() + { + return Minecraft.getMinecraft().world.getBlockState(getFocusedBlockPos()).getBlock(); + } + + public static BlockPos setX(BlockPos pos, double x) + { + return new BlockPos(x, pos.getY(), pos.getZ()); + } + + public static BlockPos setY(BlockPos pos, double y) + { + return new BlockPos(pos.getX(), y, pos.getZ()); + } + + public static BlockPos setZ(BlockPos pos, double z) + { + return new BlockPos(pos.getX(), pos.getY(), z); + } + + public static BlockPos getPos1() + { + return POS_1; + } + + public static void setPos1(BlockPos pos1) + { + if(POS_1 != null && !POS_1.equals(pos1)) + { + POS_1 = pos1; + + for(Consumer observer : POS_1_OBSERVERS) + { + observer.accept(POS_1); + } + } + } + + public static BlockPos getPos2() + { + return POS_2; + } + + public static void setPos2(BlockPos pos2) + { + if(POS_2 != null && !POS_2.equals(pos2)) + { + POS_2 = pos2; + + for(Consumer observer : POS_2_OBSERVERS) + { + observer.accept(POS_2); + } + } + } + + public static void addPos1Observer(Consumer observer) + { + POS_1_OBSERVERS.add(observer); + } + + public static void removePos1Observer(Consumer observer) + { + POS_1_OBSERVERS.remove(observer); + } + + public static void addPos2Observer(Consumer observer) + { + POS_2_OBSERVERS.add(observer); + } + + public static void removePos2Observer(Consumer observer) + { + POS_2_OBSERVERS.add(observer); + } + + public static boolean setCommandBlockNearPlayer(String command) + { + if(UtilPlayer.canIssueCommand()) + { + BlockPos player = new BlockPos(Minecraft.getMinecraft().player.posX, Minecraft.getMinecraft().player.posY, Minecraft.getMinecraft().player.posZ); + BlockPos block = player; + BlockPos button = player; + + int meta = 0; + + switch(UtilPlayer.getPlayerDirection()) + { + case 0: + block = block.add(0, 0, 2); + button = button.add(0, 0, 1); + meta = 4; + break; + case 1: + block = block.add(-2, 0, 0); + button = button.add(-1, 0, 0); + meta = 1; + break; + case 2: + block = block.add(0, 0, -2); + button = button.add(0, 0, -1); + meta = 3; + break; + case 3: + block = block.add(2, 0, 0); + button = button.add(1, 0, 0); + meta = 2; + break; + } + + boolean flag = false; + + if(Minecraft.getMinecraft().world.isAirBlock(block)) + { + Minecraft.getMinecraft().player.sendChatMessage(new BuilderSetblock(block, Blocks.COMMAND_BLOCK.getRegistryName(), 0, ConfigSettings.getMode()).toActualCommand()); + Minecraft.getMinecraft().player.sendChatMessage(new BuilderSetblock(button, Blocks.WOODEN_BUTTON.getRegistryName(), meta, ConfigSettings.getMode()).toActualCommand()); + flag = true; + } + + if(Minecraft.getMinecraft().world.getBlockState(block).getBlock().equals(Blocks.COMMAND_BLOCK) || flag) + { + if(Minecraft.getMinecraft().getConnection() != null) + { + PacketBuffer packetbuffer = new PacketBuffer(Unpooled.buffer()); + packetbuffer.writeInt(block.getX()); + packetbuffer.writeInt(block.getY()); + packetbuffer.writeInt(block.getZ()); + packetbuffer.writeString(command); + packetbuffer.writeBoolean(true); + packetbuffer.writeString(TileEntityCommandBlock.Mode.REDSTONE.name()); + packetbuffer.writeBoolean(false); + packetbuffer.writeBoolean(false); + + Minecraft.getMinecraft().getConnection().sendPacket(new CPacketCustomPayload("MC|AutoCmd", packetbuffer)); + + return true; + } + } + } + + return false; + } + + public static void setBlockNearPlayer(Block block, byte southMeta, byte westMeta, byte northMeta, byte eastMeta) + { + int direction = UtilPlayer.getPlayerDirection(); + + switch(direction) + { + case 0: + WorldHandler.sendCommand(new BuilderSetblock(new Coordinate(), new Coordinate(), new Coordinate(2, true), block.getRegistryName(), southMeta, ConfigSettings.getMode())); + break; + case 1: + WorldHandler.sendCommand(new BuilderSetblock(new Coordinate(-2, true), new Coordinate(), new Coordinate(), block.getRegistryName(), westMeta, ConfigSettings.getMode())); + break; + case 2: + WorldHandler.sendCommand(new BuilderSetblock(new Coordinate(), new Coordinate(), new Coordinate(-2, true), block.getRegistryName(), northMeta, ConfigSettings.getMode())); + break; + case 3: + WorldHandler.sendCommand(new BuilderSetblock(new Coordinate(2, true), new Coordinate(), new Coordinate(), block.getRegistryName(), eastMeta, ConfigSettings.getMode())); + break; + } + } +} diff --git a/src/main/java/exopandora/worldhandler/helper/EntityHelper.java b/src/main/java/exopandora/worldhandler/helper/EntityHelper.java new file mode 100644 index 0000000..7c5401b --- /dev/null +++ b/src/main/java/exopandora/worldhandler/helper/EntityHelper.java @@ -0,0 +1,80 @@ +package exopandora.worldhandler.helper; + +import java.util.Map; +import java.util.Map.Entry; +import java.util.stream.Collectors; + +import javax.annotation.Nullable; + +import net.minecraft.entity.Entity; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.fml.common.registry.ForgeRegistries; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public class EntityHelper +{ + private static final Map RESOURCELOCATION_TO_NAME; + private static final Map, ResourceLocation> CLASS_TO_RESOURCELOCATION; + + static + { + if(ForgeRegistries.ENTITIES.getEntries().isEmpty()) + { + throw new RuntimeException("Accessed Entities before register!"); + } + + RESOURCELOCATION_TO_NAME = ForgeRegistries.ENTITIES.getEntries().stream().collect(Collectors.toMap(Entry::getKey, entry -> entry.getValue().getName())); + CLASS_TO_RESOURCELOCATION = ForgeRegistries.ENTITIES.getEntries().stream().collect(Collectors.toMap(entry -> entry.getValue().getEntityClass(), Entry::getKey)); + } + + @Nullable + public static String getUnifiedEntityName(String name) + { + for(ResourceLocation location : RESOURCELOCATION_TO_NAME.keySet()) + { + if(RESOURCELOCATION_TO_NAME.get(location).equals(name)) + { + return location.getResourcePath(); + } + } + + return null; + } + + public static String getEntityName(ResourceLocation location) + { + return RESOURCELOCATION_TO_NAME.get(location); + } + + @Nullable + public static String getEntityName(String name) + { + for(ResourceLocation location : RESOURCELOCATION_TO_NAME.keySet()) + { + if(location.getResourcePath().equals(name)) + { + return RESOURCELOCATION_TO_NAME.get(location); + } + } + + return null; + } + + public static boolean doesExist(ResourceLocation key) + { + return RESOURCELOCATION_TO_NAME.containsKey(key); + } + + public static boolean doesExist(String value) + { + return RESOURCELOCATION_TO_NAME.containsValue(value); + } + + @Nullable + public static ResourceLocation getResourceLocation(Class entity) + { + return CLASS_TO_RESOURCELOCATION.get(entity); + } +} diff --git a/src/main/java/exopandora/worldhandler/helper/EnumHelper.java b/src/main/java/exopandora/worldhandler/helper/EnumHelper.java new file mode 100644 index 0000000..5d5bb4a --- /dev/null +++ b/src/main/java/exopandora/worldhandler/helper/EnumHelper.java @@ -0,0 +1,20 @@ +package exopandora.worldhandler.helper; + +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public class EnumHelper +{ + public static > T valueOf(Class klass, String name) + { + try + { + return Enum.valueOf(klass, name.toUpperCase()); + } + catch(Exception e) + { + return null; + } + } +} diff --git a/src/main/java/exopandora/worldhandler/helper/Node.java b/src/main/java/exopandora/worldhandler/helper/Node.java new file mode 100644 index 0000000..90c6fc9 --- /dev/null +++ b/src/main/java/exopandora/worldhandler/helper/Node.java @@ -0,0 +1,280 @@ +package exopandora.worldhandler.helper; + +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; +import java.util.function.BiFunction; + +import javax.annotation.Nullable; + +import net.minecraft.block.Block; +import net.minecraft.item.Item; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public class Node +{ + private final String key; + private List entries; + + public Node() + { + this("root", null); + } + + public Node(String key) + { + this(key, null); + } + + public Node(String key, List entries) + { + this.key = key; + this.entries = entries; + } + + public String getKey() + { + return this.key; + } + + @Nullable + public List getEntries() + { + return this.entries; + } + + public void addEntries(List entries) + { + this.validateEntries(); + this.entries.addAll(entries); + } + + public Node addNode(Node node) + { + this.validateEntries(); + this.entries.add(node); + + return node; + } + + private void validateEntries() + { + if(this.entries == null) + { + this.entries = new ArrayList(); + } + } + + public Node addNode(String key) + { + return this.addNode(new Node(key)); + } + + public Node addNode(String key, List entries) + { + return this.addNode(new Node(key, entries)); + } + + public Node getNode(String key) + { + if(this.entries != null) + { + for(int x = 0; x < this.entries.size(); x++) + { + Node node = this.entries.get(x); + + if(node.getKey().equals(key)) + { + return node; + } + } + } + + return null; + } + + public void sort() + { + this.sort(this, (a, b) -> a.getKey().compareTo(b.getKey())); + } + + public void sort(Comparator comparator) + { + this.sort(this, comparator); + } + + private void sort(Node root, Comparator comparator) + { + if(root.getEntries() != null) + { + for(Node node : root.getEntries()) + { + this.sort(node, comparator); + } + + root.getEntries().sort(comparator); + } + } + + public Node insertNode(String[] path) + { + return this.insertNode(path, this); + } + + private Node insertNode(String[] path, Node root) + { + return this.insertNode(0, path, root); + } + + private Node insertNode(int index, String[] path, Node root) + { + if(index == path.length) + { + return root; + } + + Node node = new Node(path[index]); + + if(root.getEntries() != null && root.getEntries().contains(node)) + { + for(Node element : root.getEntries()) + { + if(element.equals(node)) + { + return this.insertNode(index + 1, path, element); + } + } + } + + root.addNode(node); + return this.insertNode(index + 1, path, node); + } + + public void mergeItems() + { + this.mergeItems(null, this); + } + + private void mergeItems(Node root, Node child) + { + if(child != null && child.getEntries() != null) + { + if(root == null) + { + for(Node node : child.getEntries()) + { + this.mergeItems(child, node); + } + } + else + { + if(child.getEntries() != null && !child.getEntries().isEmpty()) + { + boolean flag = true; + + for(Node node : child.getEntries()) + { + if(node.getEntries() != null && !node.getEntries().isEmpty()) + { + this.mergeItems(child, node); + flag = false; + break; + } + else + { + ResourceLocation location = new ResourceLocation(child.getKey(), node.getKey()); + flag = flag && (Item.REGISTRY.containsKey(location) || Block.REGISTRY.containsKey(location)); + } + } + + if(flag) + { + this.merge(root, child.getKey(), (parent, kid) -> parent + ":" + kid); + } + } + } + } + } + + public void merge(String key, BiFunction merger) + { + this.merge(this, key, merger); + } + + private void merge(Node root, String key, BiFunction merger) + { + if(root.getEntries() != null) + { + Node node = root.getNode(key); + + if(node != null) + { + root.getEntries().remove(node); + + for(Node entry : node.getEntries()) + { + root.addNode(new Node(merger.apply(node.getKey(), entry.getKey()), entry.getEntries())); + } + } + + for(Node entry : root.getEntries()) + { + this.merge(entry, key, merger); + } + } + } + + public void print() + { + this.print("", this); + } + + private void print(String offset, Node node) + { + System.out.println(offset + node.getKey()); + + if(node.getEntries() != null) + { + for(Node entry : node.getEntries()) + { + this.print(offset + " ", entry); + } + } + } + + public void writeFile(FileOutputStream out) throws IOException + { + this.writeFile("", this, out); + } + + protected void writeFile(String offset, Node node, FileOutputStream out) throws IOException + { + out.write((offset + node.getKey() + "\n").getBytes()); + + if(node.getEntries() != null) + { + for(Node entry : node.getEntries()) + { + this.writeFile(offset + " ", entry, out); + } + } + } + + @Override + public boolean equals(Object obj) + { + if(obj instanceof Node) + { + Node node = (Node) obj; + + return this.key.equals(node.getKey()); + } + + return false; + } +} diff --git a/src/main/java/exopandora/worldhandler/helper/ResourceHelper.java b/src/main/java/exopandora/worldhandler/helper/ResourceHelper.java new file mode 100644 index 0000000..77afb55 --- /dev/null +++ b/src/main/java/exopandora/worldhandler/helper/ResourceHelper.java @@ -0,0 +1,88 @@ +package exopandora.worldhandler.helper; + +import java.util.function.Predicate; + +import javax.annotation.Nullable; + +import exopandora.worldhandler.config.ConfigSkin; +import exopandora.worldhandler.main.Main; +import net.minecraft.block.Block; +import net.minecraft.entity.EntityList; +import net.minecraft.item.Item; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public class ResourceHelper +{ + private static final ResourceLocation BACKGROUND = new ResourceLocation("textures/gui/demo_background.png"); + private static final ResourceLocation BACKGROUND_VANILLA = new ResourceLocation(Main.MODID, "textures/skins/vanilla/vanilla.png"); + private static final ResourceLocation BUTTON = new ResourceLocation("textures/gui/widgets.png"); + + public static ResourceLocation stringToResourceLocation(String resource) + { + if(resource != null) + { + return new ResourceLocation(resource.replaceAll(" ", "_")); + } + + return null; + } + + public static boolean isRegisteredItem(String item) + { + return Item.REGISTRY.getKeys().contains(stringToResourceLocation(item)); + } + + public static boolean isRegisteredBlock(String block) + { + return Block.REGISTRY.getKeys().contains(stringToResourceLocation(block)); + } + + public static boolean isRegisteredMob(String mob) + { + return EntityList.isRegistered(stringToResourceLocation(mob)); + } + + public static boolean isRegisteredAdvancement(String advancement) + { + return AdvancementHelper.ADVANCEMENT_MANAGER.getAdvancement(stringToResourceLocation(advancement)) != null; + } + + @Nullable + public static ResourceLocation stringToResourceLocationNullable(String resource, Predicate predicate) + { + if(predicate.test(resource)) + { + return stringToResourceLocation(resource); + } + + return null; + } + + public static ResourceLocation getBackgroundTexture() + { + if(ConfigSkin.getTextureType().equals("resourcepack")) + { + return BACKGROUND; + } + + return BACKGROUND_VANILLA; + } + + public static ResourceLocation getIconTexture() + { + return new ResourceLocation(Main.MODID, "textures/icons/icons" + ConfigSkin.getIconSize() + ".png"); + } + + public static ResourceLocation getButtonTexture() + { + if(ConfigSkin.getTextureType().equals("resourcepack")) + { + return BUTTON; + } + + return new ResourceLocation(Main.MODID, "textures/skins/" + ConfigSkin.getTextureType() + "/" + ConfigSkin.getTextureType() + "_buttons.png"); + } +} diff --git a/src/main/java/exopandora/worldhandler/helper/ScoreboardHelper.java b/src/main/java/exopandora/worldhandler/helper/ScoreboardHelper.java new file mode 100644 index 0000000..c20d85a --- /dev/null +++ b/src/main/java/exopandora/worldhandler/helper/ScoreboardHelper.java @@ -0,0 +1,117 @@ +package exopandora.worldhandler.helper; + +import java.util.ArrayList; +import java.util.List; +import java.util.function.Function; +import java.util.function.Predicate; + +import com.google.common.base.Predicates; +import com.mojang.realmsclient.gui.ChatFormatting; + +import net.minecraft.scoreboard.IScoreCriteria; +import net.minecraft.scoreboard.Team.CollisionRule; +import net.minecraft.scoreboard.Team.EnumVisible; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public class ScoreboardHelper +{ + private final Node objectives = new Node(); + private final Node slots = new Node(); + private final Node options = new Node(); + + public ScoreboardHelper() + { + this.init(); + } + + private void init() + { + //Lists + + final List colors = this.createList(ChatFormatting.values(), ChatFormatting::getName, ChatFormatting::isColor); + final List visibility = this.createList(EnumVisible.values(), value -> value.internalName); + final List collision = this.createList(CollisionRule.values(), value -> value.name); + final List bool = this.createList(new Boolean[] {true, false}, String::valueOf); + + //Objectives + + for(String criteria : IScoreCriteria.INSTANCES.keySet()) + { + this.objectives.insertNode(criteria.split("[.]")); + } + + this.objectives.merge("stat", (parent, child) -> parent + "." + child); + this.objectives.mergeItems(); + this.objectives.sort(); + + //Slots + + this.slots.addNode("belowName"); + this.slots.addNode("list"); + this.slots.addNode("sidebar"); + this.slots.addNode("sidebar.team", colors); + this.slots.sort(); + + //Options + + this.options.addNode("color", colors); + this.options.addNode("nametagVisibility", visibility); + this.options.addNode("deathMessageVisibility", visibility); + this.options.addNode("friendlyfire", bool); + this.options.addNode("seeFriendlyInvisibles", bool); + this.options.addNode("collisionRule", collision); + this.options.sort(); + } + + private List createList(T[] array, Function mapper) + { + return this.createList(array, mapper, Predicates.alwaysTrue()); + } + + private List createList(T[] array, Function mapper, Predicate predicate) + { + List list = new ArrayList(); + + for(T index : array) + { + if(predicate.test(index)) + { + list.add(new Node(mapper.apply(index))); + } + } + + return list; + } + + public List getObjectives() + { + if(this.objectives != null) + { + return this.objectives.getEntries(); + } + + return null; + } + + public List getSlots() + { + if(this.slots != null) + { + return this.slots.getEntries(); + } + + return null; + } + + public List getOptions() + { + if(this.options != null) + { + return this.options.getEntries(); + } + + return null; + } +} diff --git a/src/main/java/exopandora/worldhandler/hud/BiomeIndicator.java b/src/main/java/exopandora/worldhandler/hud/BiomeIndicator.java new file mode 100644 index 0000000..cc36077 --- /dev/null +++ b/src/main/java/exopandora/worldhandler/hud/BiomeIndicator.java @@ -0,0 +1,94 @@ +package exopandora.worldhandler.hud; + +import java.util.HashSet; +import java.util.Set; + +import javax.annotation.Nullable; + +import net.minecraft.client.Minecraft; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.MathHelper; +import net.minecraft.world.biome.Biome; +import net.minecraft.world.chunk.Chunk; + +public class BiomeIndicator +{ + private static final Set BIOMES; + private static String CURRENT_BIOME; + private static int TICKS; + + static + { + Set pool = new HashSet(); + + for(ResourceLocation location : Biome.REGISTRY.getKeys()) + { + pool.add(filterName(Biome.REGISTRY.getObject(location).getBiomeName())); + } + + BIOMES = new HashSet(pool); + + for(String biome : pool) + { + for(String index : pool) + { + if(index.matches(biome + "([A-Za-z ])+") || index.matches("([A-Za-z ])+ " + biome)) + { + BIOMES.remove(index); + } + } + } + + BIOMES.remove("River"); + BIOMES.remove("Beach"); + } + + public static void tick() + { + int posX = MathHelper.floor(Minecraft.getMinecraft().player.posX); + int posY = MathHelper.floor(Minecraft.getMinecraft().player.posY); + int posZ = MathHelper.floor(Minecraft.getMinecraft().player.posZ); + + BlockPos pos = new BlockPos(posX, posY, posZ); + + if(Minecraft.getMinecraft().world != null && Minecraft.getMinecraft().world.isBlockLoaded(pos)) + { + Chunk chunk = Minecraft.getMinecraft().world.getChunkFromBlockCoords(pos); + String biome = getBaseBiome(filterName(chunk.getBiome(pos, Minecraft.getMinecraft().world.getBiomeProvider()).getBiomeName())); + + if(TICKS == 0 && biome != null) + { + if(CURRENT_BIOME == null || !CURRENT_BIOME.equals(biome)) + { + Minecraft.getMinecraft().ingameGUI.displayTitle(biome, null, 20, 60, 20); + TICKS = 100; + CURRENT_BIOME = biome; + } + } + else if(TICKS > 0) + { + TICKS--; + } + } + } + + private static String filterName(String biome) + { + return biome.replaceAll("([a-z])([A-Z])", "$1 $2").replaceAll("[^A-Za-z ]", "").replaceAll("( [A-Z])$", ""); + } + + @Nullable + private static String getBaseBiome(String input) + { + for(String biome : BIOMES) + { + if(input.matches("([A-Za-z ])*" + biome + "([A-Za-z ])*")) + { + return biome; + } + } + + return null; + } +} diff --git a/src/main/java/exopandora/worldhandler/installer/ChangeFolderListener.java b/src/main/java/exopandora/worldhandler/installer/ChangeFolderListener.java new file mode 100644 index 0000000..5555f0e --- /dev/null +++ b/src/main/java/exopandora/worldhandler/installer/ChangeFolderListener.java @@ -0,0 +1,49 @@ +package exopandora.worldhandler.installer; + +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.io.File; + +import javax.swing.JFileChooser; +import javax.swing.JTextField; + +import exopandora.worldhandler.main.Main; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public class ChangeFolderListener implements ActionListener +{ + private final JTextField textField; + + public ChangeFolderListener(JTextField textField) + { + this.textField = textField; + } + + @Override + public void actionPerformed(ActionEvent event) + { + JFileChooser fileChooser = new JFileChooser(); + File inital = new File(this.textField.getText()); + + if(inital.exists()) + { + fileChooser.setCurrentDirectory(inital); + } + else + { + fileChooser.setCurrentDirectory(Main.getInitialDirectory()); + } + + fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); + fileChooser.showOpenDialog(null); + + File file = fileChooser.getSelectedFile(); + + if(file != null) + { + this.textField.setText(file.getAbsolutePath()); + } + } +} diff --git a/src/main/java/exopandora/worldhandler/installer/ForumListener.java b/src/main/java/exopandora/worldhandler/installer/ForumListener.java new file mode 100644 index 0000000..e038ee2 --- /dev/null +++ b/src/main/java/exopandora/worldhandler/installer/ForumListener.java @@ -0,0 +1,31 @@ +package exopandora.worldhandler.installer; + +import java.awt.Desktop; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.net.URI; + +import exopandora.worldhandler.main.Main; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public class ForumListener implements ActionListener +{ + @Override + public void actionPerformed(ActionEvent event) + { + if(Desktop.isDesktopSupported()) + { + try + { + Desktop.getDesktop().browse(new URI(Main.URL)); + } + catch(Exception e) + { + e.printStackTrace(); + } + } + } +} + \ No newline at end of file diff --git a/src/main/java/exopandora/worldhandler/installer/InstallListener.java b/src/main/java/exopandora/worldhandler/installer/InstallListener.java new file mode 100644 index 0000000..e8e663d --- /dev/null +++ b/src/main/java/exopandora/worldhandler/installer/InstallListener.java @@ -0,0 +1,104 @@ +package exopandora.worldhandler.installer; + +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.io.File; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.StandardCopyOption; + +import javax.swing.JFrame; +import javax.swing.JOptionPane; +import javax.swing.JTextField; + +import exopandora.worldhandler.main.Main; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public class InstallListener implements ActionListener +{ + private final JFrame parent; + private final JTextField textField; + + public InstallListener(JFrame parent, JTextField textField) + { + this.parent = parent; + this.textField = textField; + } + + @Override + public void actionPerformed(ActionEvent event) + { + File directory = new File(this.textField.getText()); + + if(directory.isDirectory()) + { + File mods = new File(directory, "mods"); + File versions = new File(directory, "versions"); + + if(!this.isPartialFileNameInFolder(versions, Main.MC_VERSION, "Forge")) + { + JOptionPane.showMessageDialog(null, "Please install Mineceaft Forge", null, JOptionPane.ERROR_MESSAGE); + } + else + { + for(File file : mods.listFiles()) + { + if(this.containsIgnoreCase(file.getName(), "World") && this.containsIgnoreCase(file.getName(), "Handler")) + { + file.delete(); + } + } + + try + { + Path path = new File(InstallListener.class.getProtectionDomain().getCodeSource().getLocation().toURI().getPath()).toPath(); + Files.copy(path, new File(mods, "WorldHandler-" + Main.FULL_VERSION + "-Universal.jar").toPath(), StandardCopyOption.REPLACE_EXISTING); + JOptionPane.showMessageDialog(null, Main.NAME_AND_VERSION + " has been successfully installed", null, JOptionPane.INFORMATION_MESSAGE); + } + catch(Exception e) + { + JOptionPane.showMessageDialog(null, "Error:\n" + e.getMessage(), null, JOptionPane.ERROR_MESSAGE); + } + } + + this.parent.dispose(); + } + else + { + JOptionPane.showMessageDialog(null, "Invalid directory", null, JOptionPane.ERROR_MESSAGE); + } + } + + private boolean containsIgnoreCase(String string, String sequence) + { + return string.toLowerCase().contains(sequence.toLowerCase()); + } + + private boolean isPartialFileNameInFolder(File path, String... parts) + { + if(path.exists()) + { + int contains = 0; + + for(File file : path.listFiles()) + { + for(String part : parts) + { + if(this.containsIgnoreCase(file.getName(), part)) + { + contains++; + } + + if(contains == parts.length) + { + return true; + } + } + } + } + + return false; + } +} diff --git a/src/main/java/exopandora/worldhandler/installer/Window.java b/src/main/java/exopandora/worldhandler/installer/Window.java new file mode 100644 index 0000000..4c6d166 --- /dev/null +++ b/src/main/java/exopandora/worldhandler/installer/Window.java @@ -0,0 +1,194 @@ +package exopandora.worldhandler.installer; + +import java.awt.Component; +import java.awt.Container; +import java.awt.FocusTraversalPolicy; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.Image; +import java.awt.Insets; +import java.util.ArrayList; +import java.util.List; + +import javax.swing.ImageIcon; +import javax.swing.JButton; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.JTextField; + +import exopandora.worldhandler.main.Main; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public class Window implements Runnable +{ + private final String title = Main.NAME_AND_VERSION + " Installer"; + private final JFrame frame = new JFrame(); + + @Override + public void run() + { + this.frame.setResizable(false); + this.frame.setTitle(this.title); + this.frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + + List icons = new ArrayList(); + + icons.add(new ImageIcon(this.getClass().getResource("/assets/worldhandler/installer/icon/icon16.png")).getImage()); + icons.add(new ImageIcon(this.getClass().getResource("/assets/worldhandler/installer/icon/icon32.png")).getImage()); + icons.add(new ImageIcon(this.getClass().getResource("/assets/worldhandler/installer/icon/icon64.png")).getImage()); + icons.add(new ImageIcon(this.getClass().getResource("/assets/worldhandler/installer/icon/icon128.png")).getImage()); + icons.add(new ImageIcon(this.getClass().getResource("/assets/worldhandler/installer/icon/icon256.png")).getImage()); + + this.frame.setIconImages(icons); + this.frame.setLayout(new GridBagLayout()); + + JLabel logo = new JLabel(); + logo.setIcon(new ImageIcon(Window.class.getResource("/assets/worldhandler/installer/logo.png"))); + + GridBagConstraints gbcLogo = new GridBagConstraints(); + gbcLogo.insets = new Insets(15, 10, 15, 5); + gbcLogo.gridx = 0; + gbcLogo.gridy = 0; + this.frame.add(logo, gbcLogo); + + JPanel panel = new JPanel(new GridBagLayout()); + + GridBagConstraints gbcPanel = new GridBagConstraints(); + gbcPanel.insets = new Insets(15, 5, 15, 10); + gbcPanel.fill = GridBagConstraints.BOTH; + gbcPanel.gridx = 1; + gbcPanel.gridy = 0; + this.frame.add(panel, gbcPanel); + + JLabel title = new JLabel(this.title); + panel.add(title, this.getButtonConstraints(0, 0)); + + JTextField textField = new JTextField(Main.getInitialDirectory().getAbsolutePath()); + textField.setCaretPosition(textField.getText().length()); + textField.setColumns(30); + panel.add(textField, this.getButtonConstraints(0, 1)); + + JButton directory = new JButton("Change Minecraft Folder"); + directory.addActionListener(new ChangeFolderListener(textField)); + panel.add(directory, this.getButtonConstraints(0, 2)); + + JButton changelog = new JButton("Forum"); + changelog.addActionListener(new ForumListener()); + panel.add(changelog, this.getButtonConstraints(0, 3)); + + JButton install = new JButton("Install"); + install.addActionListener(new InstallListener(this.frame, textField)); + panel.add(install, this.getButtonConstraints(0, 4)); + + JButton exit = new JButton("Exit"); + exit.addActionListener(event -> this.frame.dispose()); + panel.add(exit, this.getButtonConstraints(0, 5)); + + this.frame.pack(); + this.frame.setLocationRelativeTo(null); + this.frame.setFocusTraversalPolicy(new FocusTraversalOnArray(new Component[]{textField, directory, changelog, install, exit})); + this.frame.setVisible(true); + + install.requestFocusInWindow(); + } + + private GridBagConstraints getButtonConstraints(int x, int y) + { + GridBagConstraints gbc = new GridBagConstraints(); + + gbc.fill = GridBagConstraints.HORIZONTAL; + gbc.insets = new Insets(5, 5, 5, 5); + gbc.gridx = x; + gbc.gridy = y; + + return gbc; + } + + private static final class FocusTraversalOnArray extends FocusTraversalPolicy + { + private final Component components[]; + + public FocusTraversalOnArray(Component components[]) + { + this.components = components; + } + + private int indexCycle(int index, int delta) + { + int size = this.components.length; + int next = (index + delta + size) % size; + + return next; + } + + private Component cycle(Component currentComponent, int delta) + { + int index = -1; + + loop : for(int i = 0; i < this.components.length; i++) + { + Component component = this.components[i]; + + for(Component c = currentComponent; c != null; c = c.getParent()) + { + if(component == c) + { + index = i; + break loop; + } + } + } + + int initialIndex = index; + + while(true) + { + int newIndex = this.indexCycle(index, delta); + + if(newIndex == initialIndex) + { + break; + } + + index = newIndex; + + Component component = this.components[newIndex]; + + if(component.isEnabled() && component.isVisible() && component.isFocusable()) + { + return component; + } + } + + return currentComponent; + } + + public Component getComponentAfter(Container container, Component component) + { + return this.cycle(component, 1); + } + + public Component getComponentBefore(Container container, Component component) + { + return this.cycle(component, -1); + } + + public Component getFirstComponent(Container container) + { + return this.components[0]; + } + + public Component getLastComponent(Container container) + { + return this.components[this.components.length - 1]; + } + + public Component getDefaultComponent(Container container) + { + return this.getFirstComponent(container); + } + } +} diff --git a/src/main/java/exopandora/worldhandler/main/Main.java b/src/main/java/exopandora/worldhandler/main/Main.java new file mode 100644 index 0000000..55c0d56 --- /dev/null +++ b/src/main/java/exopandora/worldhandler/main/Main.java @@ -0,0 +1,57 @@ +package exopandora.worldhandler.main; + +import java.awt.EventQueue; +import java.io.File; +import java.util.Locale; + +import javax.swing.UIManager; + +import exopandora.worldhandler.installer.Window; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public class Main +{ + public static final String NAME = "World Handler"; + public static final String MODID = "worldhandler"; + public static final String MC_VERSION = "1.12.2"; + public static final String MC_COMPATIBLE = "1.12"; + public static final String VERSION = "2.0"; + public static final String FULL_VERSION = MC_VERSION + "-" + VERSION; + public static final String NAME_AND_VERSION = NAME + " " + FULL_VERSION; + public static final String URL = "https://minecraft.curseforge.com/projects/world-handler-command-gui"; + public static final String UPDATE_URL = "https://raw.githubusercontent.com/Exopandora/worldhandler/master/version.json"; + + public static void main(String[] args) + { + try + { + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + } + catch(Exception e) + { + e.printStackTrace(); + } + + EventQueue.invokeLater(new Window()); + } + + public static File getInitialDirectory() + { + String home = System.getProperty("user.home", "."); + String os = System.getProperty("os.name").toLowerCase(Locale.ENGLISH); + String minecraft = ".minecraft"; + + if(os.contains("win") && (System.getenv("APPDATA") != null)) + { + return new File(System.getenv("APPDATA"), minecraft); + } + else if(os.contains("mac")) + { + return new File(new File(new File(home, "Library"), "Application Support"), "minecraft"); + } + + return new File(home, minecraft); + } +} diff --git a/src/main/java/exopandora/worldhandler/main/WorldHandler.java b/src/main/java/exopandora/worldhandler/main/WorldHandler.java new file mode 100644 index 0000000..d492d39 --- /dev/null +++ b/src/main/java/exopandora/worldhandler/main/WorldHandler.java @@ -0,0 +1,155 @@ +package exopandora.worldhandler.main; + +import org.apache.commons.lang3.ArrayUtils; +import org.apache.logging.log4j.Logger; +import org.lwjgl.input.Keyboard; + +import exopandora.worldhandler.builder.ICommandBuilder; +import exopandora.worldhandler.builder.ICommandBuilderSyntax; +import exopandora.worldhandler.command.CommandWH; +import exopandora.worldhandler.command.CommandWorldHandler; +import exopandora.worldhandler.config.ConfigButcher; +import exopandora.worldhandler.config.ConfigSettings; +import exopandora.worldhandler.config.ConfigSkin; +import exopandora.worldhandler.gui.category.Category; +import exopandora.worldhandler.gui.content.Content; +import exopandora.worldhandler.helper.BlockHelper; +import exopandora.worldhandler.proxy.CommonProxy; +import net.minecraft.client.Minecraft; +import net.minecraft.client.settings.KeyBinding; +import net.minecraft.command.ICommand; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.common.config.Configuration; +import net.minecraftforge.fml.client.registry.ClientRegistry; +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.fml.common.Mod.EventHandler; +import net.minecraftforge.fml.common.Mod.Instance; +import net.minecraftforge.fml.common.SidedProxy; +import net.minecraftforge.fml.common.event.FMLInitializationEvent; +import net.minecraftforge.fml.common.event.FMLPostInitializationEvent; +import net.minecraftforge.fml.common.event.FMLPreInitializationEvent; +import net.minecraftforge.fml.common.event.FMLServerStartingEvent; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +@Mod(modid = Main.MODID, name = Main.NAME, acceptedMinecraftVersions = "[" + Main.MC_COMPATIBLE + ",)", version = Main.VERSION, canBeDeactivated = false, guiFactory = "exopandora.worldhandler.gui.config.GuiFactoryWorldHandler", updateJSON = Main.UPDATE_URL, clientSideOnly = true) +public class WorldHandler +{ + @Instance(Main.MODID) + public WorldHandler INSTANCE; + + public static KeyBinding KEY_WORLD_HANDLER = new KeyBinding(Main.NAME, Keyboard.KEY_V, "key.categories.misc"); + public static KeyBinding KEY_WORLD_HANDLER_POS1 = new KeyBinding(Main.NAME + " Pos1", Keyboard.KEY_O, "key.categories.misc"); + public static KeyBinding KEY_WORLD_HANDLER_POS2 = new KeyBinding(Main.NAME + " Pos2", Keyboard.KEY_P, "key.categories.misc"); + + public static Logger LOGGER; + + public static final ICommand COMMAND_WORLD_HANDLER = new CommandWorldHandler(); + public static final ICommand COMMAND_WH = new CommandWH(); + + public static Configuration CONFIG; + + public static String USERNAME = null; + + @SidedProxy(clientSide = "exopandora.worldhandler.proxy.ClientProxy", serverSide = "exopandora.worldhandler.proxy.CommonProxy") + public static CommonProxy PROXY; + + @EventHandler + public void preInit(FMLPreInitializationEvent event) + { + LOGGER = event.getModLog(); + LOGGER.info("Pre-Initializing " + Main.NAME_AND_VERSION); + LOGGER.info("First Release on March 28 2013 - 02:29 PM CET by Exopandora"); + LOGGER.info("Latest Version: " + Main.URL); + CONFIG = new Configuration(event.getSuggestedConfigurationFile()); + + ConfigSettings.load(CONFIG); + ConfigSkin.load(CONFIG); + } + + @EventHandler + public void init(FMLInitializationEvent event) + { + LOGGER.info("Initializing " + Main.NAME_AND_VERSION); + USERNAME = Minecraft.getMinecraft().getSession().getUsername(); + + MinecraftForge.EVENT_BUS.register(new exopandora.worldhandler.event.EventHandler()); + ClientRegistry.registerKeyBinding(KEY_WORLD_HANDLER); + updateKeyBindings(); + } + + @EventHandler + public void postInit(FMLPostInitializationEvent event) + { + LOGGER.info("Post-Initializing " + Main.NAME_AND_VERSION); + LOGGER.info("Every mod that has not been registered to this point may not be fully featured in this mod"); + + ConfigButcher.load(CONFIG); + Content.registerContents(); + Category.registerCategories(); + } + + @EventHandler + public void serverLoad(FMLServerStartingEvent event) + { + event.registerServerCommand(COMMAND_WORLD_HANDLER); + event.registerServerCommand(COMMAND_WH); + } + + public static void updateConfig() + { + ConfigSettings.load(CONFIG); + ConfigSkin.load(CONFIG); + ConfigButcher.load(CONFIG); + updateKeyBindings(); + } + + public static void updateKeyBindings() + { + boolean isRegistered = ArrayUtils.contains(Minecraft.getMinecraft().gameSettings.keyBindings, KEY_WORLD_HANDLER_POS1) || ArrayUtils.contains(Minecraft.getMinecraft().gameSettings.keyBindings, KEY_WORLD_HANDLER_POS2); + + if(ConfigSettings.arePosShortcutsEnabled() && !isRegistered) + { + ClientRegistry.registerKeyBinding(KEY_WORLD_HANDLER_POS1); + ClientRegistry.registerKeyBinding(KEY_WORLD_HANDLER_POS2); + } + else if(!ConfigSettings.arePosShortcutsEnabled() && isRegistered) + { + Minecraft.getMinecraft().gameSettings.keyBindings = ArrayUtils.removeElements(Minecraft.getMinecraft().gameSettings.keyBindings, KEY_WORLD_HANDLER_POS1, KEY_WORLD_HANDLER_POS2); + } + } + + public static void sendCommand(ICommandBuilder builder) + { + sendCommand(builder, false); + } + + public static void sendCommand(ICommandBuilder builder, boolean special) + { + if(builder != null) + { + String command; + + if(builder instanceof ICommandBuilderSyntax) + { + command = ((ICommandBuilderSyntax) builder).toActualCommand(); + } + else + { + command = builder.toCommand(); + } + + LOGGER.info("Command: " + command); + + if(builder.needsCommandBlock() || special) + { + BlockHelper.setCommandBlockNearPlayer(command); + } + else + { + Minecraft.getMinecraft().player.sendChatMessage(command); + } + } + } +} \ No newline at end of file diff --git a/src/main/java/exopandora/worldhandler/proxy/ClientProxy.java b/src/main/java/exopandora/worldhandler/proxy/ClientProxy.java new file mode 100644 index 0000000..8b84502 --- /dev/null +++ b/src/main/java/exopandora/worldhandler/proxy/ClientProxy.java @@ -0,0 +1,10 @@ +package exopandora.worldhandler.proxy; + +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public class ClientProxy extends CommonProxy +{ + +} diff --git a/src/main/java/exopandora/worldhandler/proxy/CommonProxy.java b/src/main/java/exopandora/worldhandler/proxy/CommonProxy.java new file mode 100644 index 0000000..0354bb7 --- /dev/null +++ b/src/main/java/exopandora/worldhandler/proxy/CommonProxy.java @@ -0,0 +1,6 @@ +package exopandora.worldhandler.proxy; + +public class CommonProxy +{ + +} diff --git a/src/main/java/exopandora/worldhandler/util/UtilPlayer.java b/src/main/java/exopandora/worldhandler/util/UtilPlayer.java new file mode 100644 index 0000000..4c335c9 --- /dev/null +++ b/src/main/java/exopandora/worldhandler/util/UtilPlayer.java @@ -0,0 +1,17 @@ +package exopandora.worldhandler.util; + +import net.minecraft.client.Minecraft; +import net.minecraft.util.math.MathHelper; + +public class UtilPlayer +{ + public static boolean canIssueCommand() + { + return Minecraft.getMinecraft().player.getPermissionLevel() > 0; + } + + public static int getPlayerDirection() + { + return MathHelper.floor((double) (Minecraft.getMinecraft().player.rotationYaw * 4.0F / 360.0F) + 0.5D) & 3; + } +} diff --git a/src/main/java/exopandora/worldhandler/util/UtilRender.java b/src/main/java/exopandora/worldhandler/util/UtilRender.java new file mode 100644 index 0000000..f45c048 --- /dev/null +++ b/src/main/java/exopandora/worldhandler/util/UtilRender.java @@ -0,0 +1,54 @@ +package exopandora.worldhandler.util; + +import exopandora.worldhandler.config.ConfigSkin; +import exopandora.worldhandler.format.TextFormatting; +import exopandora.worldhandler.helper.ResourceHelper; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.Gui; +import net.minecraft.client.renderer.GlStateManager; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public class UtilRender +{ + public static void drawWatchIntoGui(Gui gui, int width, int height, long worldTicks, boolean smooth) + { + float hour = TextFormatting.getHour(worldTicks); + float minute = TextFormatting.getMinute(worldTicks); + + if(smooth) + { + hour = (worldTicks + 6000) / 1000F; + minute = (float) ((worldTicks + 6000F - Math.floor(hour) * 1000) * 6 / 100); + } + + float rotationHour = (360 / 12) * (hour >= 12 ? (hour - 12) : hour) - 180F; + float rotationMinute = (360 / 60) * minute - 180F; + + GlStateManager.pushMatrix(); + GlStateManager.translate(width + 5, height + 5, 0F); + GlStateManager.scale(0.25F, 0.25F, 0.25F); + + GlStateManager.rotate(rotationHour, 0F, 0F, 1F); + Gui.drawRect(-1, -1, 1, 11, 0xFF383838); + GlStateManager.rotate(-rotationHour, 0F, 0F, 1F); + + GlStateManager.rotate(rotationMinute, 0F, 0F, 1F); + Gui.drawRect(-1, -1, 1, 15, 0xFF6F6F6F); + GlStateManager.rotate(-rotationMinute, 0F, 0F, 1F); + + GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F); + GlStateManager.popMatrix(); + + GlStateManager.color((float) ConfigSkin.getButtonRed() / 255, (float) ConfigSkin.getButtonGreen() / 255, (float) ConfigSkin.getButtonBlue() / 255, 1.0F); + Minecraft.getMinecraft().renderEngine.bindTexture(ResourceHelper.getIconTexture()); + + gui.drawTexturedModalRect(width + 0, height, 48, 0, 10, 10); + + GlStateManager.pushMatrix(); + GlStateManager.scale(0.5F, 0.5F, 0.5F); + Gui.drawRect((width + 5) * 2 - 1, (height + 4) * 2 + 1, (width + 6) * 2 - 1, (height + 5) * 2 + 1, 0xFF000000); + GlStateManager.popMatrix(); + } +} diff --git a/src/main/resources/assets/worldhandler/installer/icon/icon128.png b/src/main/resources/assets/worldhandler/installer/icon/icon128.png new file mode 100644 index 0000000000000000000000000000000000000000..6b3e178150e3111a6c7d1eed14dc1bcaae34ee8e GIT binary patch literal 1827 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H3?#oinD`S&F%}28J29*~C-V}>VM%xNb!1@J z*w6hZk(GggnIXU@#1$yc&CP9ZuVHO%U}0eq8X6iATbY@enVp@TlarI1o12%Hm!F?s zP*6}UNga@2YK@UD33ss%1}g>)x8S zeRUoCmn~bieEISfD^{#pwQBY1)eT(-8oLiR_a1ENJJdGeaL1%0|Nk#IcI?>u_Xi$4 zc<|@XAE5h3!DtAO9RgoweNqAD6NZu?zu^BP8!!ZaXIBLVBxiv~WHAE+-(e7DJf6QI z1t=&{;u=vBoS#-wo>-L1P>`6JSE84fTB2a0XP{>y)Wr0efq|*U)5S5QBJS<%+eJc- zBCg6G#dy2QAK%RoVs^Vy;dZP4+=-zPA_IZq5Yby&@ zIw~0@Hs*0`__5sa6`xo}{DPMSGyIkxQRC(=@plk6KR2}@hr7gEVO{>56WbeDbuJV( zuKg;sTd$*rTSTE?SBt;nl;!hXeWq{H*9q8m;GN|i5$mSP{rCN|rG%RgHh5c~Kgyig zxQUfxmtK%lf%6@qK&I5a%f5eef3$If!%ij{qc?8J7eh`2TtA%jS5Jl8P=?R{L4=Kv zm_~SmnhFb}*}1bP=1fdWxnh*(`EF~#``QyW!a%tPi%&@Z7wc(YFm>wrw1chXztF4w zB7Vy6IJu{2I|wTsNOZoCT4;TuwCCkBV=;~|RkoY_SLg=pV|eKC#NnAq(mKiX&5}Ds zg*<#S8b7h_<2a7 z`N|D0Hm_0ADM)Pm6Z=v7;Oo=N_B?xkbmEC@ z?-ecgxVR%89Ac7j3TJKSw70n!lvI6;>1s;*b z3=Dh+L6~vJ#O${~L5ULAh?3y^w370~qEv>0#LT=By}Z;C1rt33J4VKA?NRR zu>NFVUz(TC`}cvC*n@`_eFqC=Rx!B0>bW{U?g-PH4#(4*6g-`{ir6;K-ox;)>Et6l z{S$WQq5~OT_MC6Aw&`S*IA;F&Lx!BwhMJV@g$qJnJ1yPWoR!W0^qAPIx6EfPof>)K qS+!D{_5_OR9bl{w4wXoL!D$jGRusOaeEn3xzkoz7q|m`o;% z#fpuM<#0GW9xos$YbPz6viIz+kaJ&$<^+c2?%pS*hRgQsmj^}UMISuQ5oB?N*|Y=agCj45((@VoJM4tASkb+BNe)k<;3q2thsuR16$xpT`T6+;1qFqL zg_kd1zH;S?_^>kZNL5lsRr0awl;bsNCm)#2d9}5*{ryU{T5U8M;rc(ej|lu{1cuHH z&bHhd_BPUX^Z&bn?RuLzFpy}*rd=!ma5a_(Qqc=T;Xw!X1`2ySeIJ_}d@u|!f+J$s zZZTnOm!)nVZcFVX2ps^Z-p%WM{CRu&+5%Y({tmv(%K`JF=gZbSzz?V0qEES+HzC1H z4saiQax+zPsgy9Q@2RLw^EgNI_-2FOlHT6h=95_vnmEJ0vEh+-H6t0zv~)HIo#l& zOk$aN!TC1r+ev05JU{9xzCNiLE=mf_E0pbF&C;esvVO$X={b`bUR^Ae)(tE=8un*$ zcn@xx*G$(jG_C!}DS-Ca0ao8%9zJ1V*)o=(TJ>e_D!oD_tErhKM1)NHpvH6&LQ4j} z!6410t`+5iJ->K)QUnKe7xSMKKkGSHCaf4snzqy4o8(mIRlUmL$?;VRObhJYfK*eP z8oNnGyx12}A4CS3(D2&iv9XH8Ra1TrNz7azE|3J`^t+4KVf2$LH1sT?^>}NaSpvOs zRUSYXC+QlL0{6L2Q-B*zf2F_-KU)saCt~xYF zE4Qj&z2Yt8Tun*QbW-a{VwjYmzq(>3w@VI6r(=A^(CR3}B)pQfwcJ)+R#`cjJ=$fO zrlKcxEF29@=^2a{tMY!RwcX+rhvT!z5*XbC#B5**^RNKLfV|q5PI&rgG56AP=j1Hg zl|yo`6^EYb;&zcpvMy*mO02nG#Yzz&2)ivu^ssS>JLU_k(a$^D4a7E-mO2=6&8ofC z09rDTo5b(Bnp*GdE)GgMBXYi>E;pgPnxry27ypg8@|T2_U0jX!QJl!L^T%0I&-PSB znf+&Qk=!b8Xw(&$;0)P^@XF3%tojbX89Td)Tm>{3VjgChUq+J&+TOu#e*KBQp}O>r zY?yZAF~Y*e*BEtKflq6zj#XE7H)^Ueq*m4QMxSxMKt4XOj_8t;V62E?qIO=}Cp3A6 z$4ku-FAeDI=dt$dWm8`{j>}sSqMj^9Qql(C-RfOz`l|)$2EC~!DO3Hdwhf)#rc099 z=Eg^l2ddH=`u+sCg4WJytsLlkz*RRQO`1nc z$kJ&jsCeFow77TSy=d?UK;tLxMafO$X#LNP0V{1EtQBaQA80=WYg@&PQoIXP^cu^s zRs{xLYa&dHf^Aq;y5SSLWj!yK(YC+jMay167Ob+EC4U6!NzgH3CXLOxFwd~?&b}o^~GyxlHUPpeN@K) literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/worldhandler/installer/icon/icon32.png b/src/main/resources/assets/worldhandler/installer/icon/icon32.png new file mode 100644 index 0000000000000000000000000000000000000000..501e35c031cf8d5da2168695ad3417a3c34e0a19 GIT binary patch literal 777 zcmV+k1NQuhP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;JH?0`mX>0(wbAK~z{r<(At{8c`I6x#vZC=_QF5J_XU* zTD96*H5(H=9l0q(k^_4%O>*1#u4mligN09A?4W0nqNp-O$qj2(->; zC#A3bXn;zka!;jFi6#AVx$KyC%bwmf14t&5ZIwtQC>D!xJC#bQ2w9fJbMg1vH1K-g z3;;&aXw+dIkH;yUPCLfjePo_ruF;D(hu#5DUMz;JkP%?qW-^}3<#-<{@uY)n8=I z|D?h31G5SU02Y=?2mmU9h;f0l3Okfrs?p5aCCz@gq~XY^cYtECs1|NC8XO@2pbuk2 zfJ7n@HYYme>|u`h^6imX1pt6D!zdIAQ6`gNNnaxNd~W@U0s8u$u{rw20J6toq*p`$ zZf}3Hu?PUz0%L$`wW`W4hH~Yk4|5ob1OVpQxeE#p8@>a`7^Zs0wrz9l?d?&9%b%_t zTYw7S8X9kbUI9p8By$~L;p5#_pg+HHMXOsk^y=M7=KxRvXliCp8A-&c*DHWF4x;fE z$eo8^p0>YorZ5mAMBIHCBBGB+2vEjbfGdZ$9i^A6CMVq81_0nTzWk-d&1+W2&H&6M zb6pr)ZyBy_|8dOY46J;q6SwP4I?`rLX-c zfNtvl1`u-v(0V%=!aeDS6o5dq`%$+9KlmyDf$&Rro)q{8@s3z=bJSRP00000NkvXX Hu0mjfOpQ>j literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/worldhandler/installer/icon/icon64.png b/src/main/resources/assets/worldhandler/installer/icon/icon64.png new file mode 100644 index 0000000000000000000000000000000000000000..4a1b9a394f43aa49c695224132b2b5822b045c54 GIT binary patch literal 952 zcmV;p14sOcP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;JH?0`mX>11U*FK~#8N?VH<96G0q@x#vZ^^pb=No}v*C z2r3?GDQ$(;mZQo+(5OTOqIf_r3V{bO8kB>E=im)^0g{#e^fTSRyD21O7q)ZpCH>FL zlKFj^ncZzei|2VhT3cJaBw};Ie+@wwCjpxi{(WHJ!NEZy2@~N2Bt1Cn?(PaJ!U1%F2ol+rPTH zDs1~vDGe_OCm=2Xxm@m8^!N9RzP>&|dp@5RwuWM{D7Y?rZ%%YxeuEK$VJ9~R7xFPF=L@i6*mNeoYY z7sc^!;!^LDZ~~$hz!o3~0+_Jf60}pZC8!y1#TAF2z8U-1C+NOP}D>S8lx*PC(QG*a8UPFe6Y~Tbmdd81P~H zZOv_NY-Up+prhlQAUOR_K->ZdjtCowcD91;r{3S+5(Ks&fJ4v;h+Dw=`nn)kSU_%% zVf_Rrpv4Lx_~6)Ak?LL$PC(QG*a9qZg4%%8rBX>yx3`}cHsHjwZ9!1m&lcciDE2d; z=>^m;|N12kR*YTpVFDgJ*%G#Ye0Ebzz1R^~?|c+az-be}7J&OBi^2x7HIKSsTYz>R zh+;nkn_d7fIaUP03#C_rB~1Vuh?>`40#eh@7a@p>{Sa(=0leh!wKa#HeW~I0Mct?! z0f?J@`Aa-}y6wXWh+BYN`UGd$ z1ULasKywPP!NCbYfcN*GhiGVYVN!4ctN<$_=%OS*KJq#Ne6TPuY1o{;qMo3OlYl>` a*YX<#Az{#5-try*0000VM%xNb!1@J z*w6hZk(GggnIXU@#1$yc&CP9ZuVHO%U}0eq8X6iATbY@enVp@TlarI1o12%Hm!F?s zP*6}UNga@2YK@UD33ss%1}g>)x8S zeRUoCmn~bieEISfD^{#pwQBY1)eT(-8oLiR_a1ENJJdGeaL1%0|Nk#IcI?>u_Xi$4 zc<|@XAE5h3!DtAO9RgoweNqAD6NZu?zu^BP8!!ZaXIBLVBxiv~WHAE+-(e7DJf6QI z1t=&{;u=vBoS#-wo>-L1P>`6JSE84fTB2a0XP{>y)Wq}|SiWd@x;TbZ#J#rGc48`hNWL7d`Wv0dTQiMm z{%+^PTMHfM&UKRc@t|j&0K1*VV(la99Pj3GpMJqr_@LQ%7m7?H|2dd&&7z0P)6O?X zyM=c!+h4NTky_Gf@j>}4Sb(3m{_n=R{K}P8OaDyw|JHoTfIm+%R*|n}?(|g$nD5U% zd&>K2(}U@DcaOf>lk{-)s@PrHqQBp*ob7cOYEEh6`%@r`UQgqk{_2rs>(Wxk+Stle zuhqY&TQbdGX$@Bx+Q=T4t20Mj?O5Twmnx4ZZ`i}XTsCLtvKx;3L-enlf3*#6wWz|n zsbwttgda`je;&ff67%>s<6_naG6uW$ERntRo7pbJ$}?`;zF?_m2X%o#(767R(}Ue$ z-)rgW@co

hpFjJ%)Q7y{*ME zOwXTst}=dAv|9J|r0jiHeugss-_vxa=)vnRYYs4nyM^Dod1q`C02)-+LNNM zJ-zmuE62Z}@9=@|OVU~Q1wXK^O!q!twRpqC5RRXdGVX6W@m}?fsl}7!uXe%wWAot@ zB<$mL<~*KI%%3j&s_6BqOHVVew!9ZPx9v>fiu$BVvlkXTHU+6APv`2|YJYg#So~;W z%N0A$_aQ-Fi}`;O zF#HmGG)=VPLG|U$O!jgX_jNb!X{w1YywRyNHFDRJQWnMQQP0@zeuOyR4`t%7Ib|JP z753mb^Yh)Rzb?MluG;wOzEYyy^{o3$1$GbaUzJ~b;QGtRM)q|*>-KD3nx1QMr+tBt zWJ_%I<7F-NnqoEOUHW(T1;QdiUc{Wayu;sa&;LI^n3oDSos^M3e|56g_nObiU(bJ@ zj4eF2Pth027yYF=NxF-5SLn-ox&QuNeckSZnYh^g$NhZyD)4JW>B73XA-|$^w*0cY zD$e$|s`^2r_G0b#IY4Kg=bdi~NxgqOK0latQS{M)eiN{O9ZwA>I8_&b@__stkQ945 zC>tC^5}vj*7$}J#&Bf2vn;nbiySHP@1~$9+2E72wLVyG3ShN!7hA>Knx9|Kkn#DZ&hB@QCxJ?BPgg&ebxsLQ0FAks A`Tzg` literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/worldhandler/lang/de_de.lang b/src/main/resources/assets/worldhandler/lang/de_de.lang new file mode 100644 index 0000000..3ba03df --- /dev/null +++ b/src/main/resources/assets/worldhandler/lang/de_de.lang @@ -0,0 +1,429 @@ +gui.worldhandler.config.tooltip=World Handler Einstellungen + +gui.worldhandler.config.category.settings=Einstellungen +gui.worldhandler.config.category.skin=Skin +gui.worldhandler.config.category.butcher=Metzler + +gui.worldhandler.config.key.settings.biome_indicator=Biome Indikator +gui.worldhandler.config.key.settings.command_syntax=Befehlssyntax +gui.worldhandler.config.key.settings.shortcuts=Schnellsteuerleiste +gui.worldhandler.config.key.settings.key_shortcuts=Tasten Abkürzungen +gui.worldhandler.config.key.settings.tooltips=Tooltips +gui.worldhandler.config.key.settings.watch=Uhr +gui.worldhandler.config.key.settings.smooth_watch=Geschmeidige Uhr +gui.worldhandler.config.key.settings.pause_game=Spiel Pausieren +gui.worldhandler.config.key.settings.custom_times=Benutzerdefinierte Zeiten +gui.worldhandler.config.key.settings.permission_query=Berechtigungsabfrage +gui.worldhandler.config.key.settings.custom_time_dawn=Sonnenaufgangszeit +gui.worldhandler.config.key.settings.custom_time_noon=Mittagszeit +gui.worldhandler.config.key.settings.custom_time_sunset=Sonnenuntergangszeit +gui.worldhandler.config.key.settings.custom_time_midnight=Mitternachtszeit +gui.worldhandler.config.key.settings.block_placing_mode=Platziermodus für Blöcke + +gui.worldhandler.config.comment.settings.custom_time_dawn=Biome Indikator Aktiviert +gui.worldhandler.config.comment.settings.command_syntax=Befehlssyntax Aktiviert +gui.worldhandler.config.comment.settings.shortcuts=Schnellsteuerleiste Aktiviert +gui.worldhandler.config.comment.settings.key_shortcuts=Tasten Abkürzungen Aktiviert +gui.worldhandler.config.comment.settings.tooltips=Tooltips Aktiviert +gui.worldhandler.config.comment.settings.watch=Uhr Aktiviert +gui.worldhandler.config.comment.settings.smooth_watch=Geschmeidige Uhr Aktiviert +gui.worldhandler.config.comment.settings.pause_game=Spiel Pausieren +gui.worldhandler.config.comment.settings.custom_times=Benutzerdefinierte Zeiten Aktiviert +gui.worldhandler.config.comment.settings.permission_query=Berechtigungsabfrage Aktiviert +gui.worldhandler.config.comment.settings.custom_time_dawn=Sonnenaufgangszeit in Ticks +gui.worldhandler.config.comment.settings.custom_time_noon=Mittagszeit in Ticks +gui.worldhandler.config.comment.settings.custom_time_sunset=Sonnenuntergangszeit in Ticks +gui.worldhandler.config.comment.settings.custom_time_midnight=Mitternachtszeit in Ticks +gui.worldhandler.config.comment.settings.block_placing_mode=Platziermodus für Blöcke + +gui.worldhandler.config.key.skin.icons=Ikon Größe +gui.worldhandler.config.key.skin.label_color=Label Farbe +gui.worldhandler.config.key.skin.headline_color=Farbe der Überschrift +gui.worldhandler.config.key.skin.background_red=Hintergrund Rot +gui.worldhandler.config.key.skin.background_green=Hintergrund Grün +gui.worldhandler.config.key.skin.background_blue=Hintergrund Blau +gui.worldhandler.config.key.skin.button_red=Schaltflächen Rot +gui.worldhandler.config.key.skin.button_green=Schaltflächen Grün +gui.worldhandler.config.key.skin.button_blue=Schaltflächen Blau +gui.worldhandler.config.key.skin.textures=Texturen +gui.worldhandler.config.key.skin.sharp_tab_edges=Scharfe Tab Kanten +gui.worldhandler.config.key.skin.draw_background=Zeichne Hintergrund +gui.worldhandler.config.key.skin.background_alpha=Hintergrund Alpha +gui.worldhandler.config.key.skin.button_alpha=Hintergrund Alpha + +gui.worldhandler.config.comment.skin.icons=Größe der Ikons +gui.worldhandler.config.comment.skin.label_color=Label Farbe +gui.worldhandler.config.comment.skin.headline_color=Farbe der Überschrift +gui.worldhandler.config.comment.skin.background_red=Hintergrund Rot +gui.worldhandler.config.comment.skin.background_green=Hintergrund Grün +gui.worldhandler.config.comment.skin.background_blue=Hintergrund Blau +gui.worldhandler.config.comment.skin.button_red=Schaltflächen Rot +gui.worldhandler.config.comment.skin.button_green=Schaltflächen Grün +gui.worldhandler.config.comment.skin.button_blue=Schaltflächen Blau +gui.worldhandler.config.comment.skin.textures=Hintergrund Texturen +gui.worldhandler.config.comment.skin.sharp_tab_edges=Scharfe Tab Kanten Aktiviert +gui.worldhandler.config.comment.skin.draw_background=Hintergrund Aktiviert +gui.worldhandler.config.comment.skin.background_alpha=Hintergrund Alpha +gui.worldhandler.config.comment.skin.button_alpha=Schaltflächen Alpha + +gui.worldhandler.config.comment.butcher=Metzeln von %s Aktiviert + +gui.worldhandler.tab.scoreboard.objectives=Objekte +gui.worldhandler.tab.scoreboard.teams=Teams +gui.worldhandler.tab.scoreboard.players=Spieler + +gui.worldhandler.tab.player.player=Player +gui.worldhandler.tab.player.experience=Experience +gui.worldhandler.tab.player.advancements=Fortschritt + +gui.worldhandler.tab.entities.summon=Beschwören + +gui.worldhandler.tab.world.world=Welt +gui.worldhandler.tab.world.gamerules=Spielregeln + +gui.worldhandler.tab.blocks.edit_blocks=Blöcke Ändern +gui.worldhandler.tab.blocks.sign_editor=Schilder Ändern +gui.worldhandler.tab.blocks.note_block_editor=Noten Ändern + +gui.worldhandler.tab.items.give_custom_item=Item Erstellen +gui.worldhandler.tab.items.enchantment=Verzaubern + +gui.worldhandler.tab.containers=Container +gui.worldhandler.tab.multiplayer=Mehrspieler + +gui.worldhandler.title.entities.summon=Beschwören + +gui.worldhandler.title.items.give_custom_item=Item Erstellen +gui.worldhandler.title.items.enchantment=Verzaubern + +gui.worldhandler.title.blocks.edit_blocks=Blöcke Ändern +gui.worldhandler.title.blocks.sign_editor=Schilder Ändern +gui.worldhandler.title.blocks.note_block_editor=Noten Ändern + +gui.worldhandler.title.scoreboard=Anzeigetafel + +gui.worldhandler.title.world.world=Welt +gui.worldhandler.title.world.gamerules=Gamerules + +gui.worldhandler.title.player.player=Spieler +gui.worldhandler.title.player.experience=Erfahrung +gui.worldhandler.title.player.advancements=Fortschritt + +gui.worldhandler.title.butcher=Metzler +gui.worldhandler.title.change_world=Welt Wechseln +gui.worldhandler.title.potions=Tränke + +gui.worldhandler.title.containers=Container +gui.worldhandler.title.multiplayer=Mehrspieler + +gui.worldhandler.advancements.grant=Vergeben +gui.worldhandler.advancements.revoke=Wiederrufen +gui.worldhandler.advancements.only=Nur +gui.worldhandler.advancements.until=Bis +gui.worldhandler.advancements.from=Von +gui.worldhandler.advancements.through=Durch +gui.worldhandler.advancements.everything=Alles + +gui.worldhandler.continue.question=Bist du sicher ? + +gui.worldhandler.change_world.singleplayer=Einzelspieler Welt +gui.worldhandler.change_world.multiplayer=Mehrspieler Server + +gui.worldhandler.butcher.radius=Radius +gui.worldhandler.butcher.configure=Konfigurieren +gui.worldhandler.butcher.slaughter=Metzeln + +gui.worldhandler.multiplayer.kick=Kicken +gui.worldhandler.multiplayer.ban=Bannen +gui.worldhandler.multiplayer.pardon=Pardon +gui.worldhandler.multiplayer.permissions=Berechtigung +gui.worldhandler.multiplayer.runtime=Laufzeit +gui.worldhandler.multiplayer.whitelist=Weiße Liste +gui.worldhandler.multiplayer.username=Benutzername + +gui.worldhandler.multiplayer.kick_ban.reason=Grund + +gui.worldhandler.multiplayer.permissions.give=Berechtigung Geben +gui.worldhandler.multiplayer.permissions.take=Berechtigung Nehmen + +gui.worldhandler.multiplayer.runtime.save_world=Welt Speichern +gui.worldhandler.multiplayer.runtime.autosave=Autom. Speichern: %s +gui.worldhandler.multiplayer.runtime.stop_server=Server Stoppen + +gui.worldhandler.multiplayer.whitelist.reload=Weiße Liste Neu Laden +gui.worldhandler.multiplayer.whitelist.whitelist=Weiße Liste: %s +gui.worldhandler.multiplayer.whitelist.add=Hinzuf +gui.worldhandler.multiplayer.whitelist.remove=Entf + +gui.worldhandler.potions.effect=Effekt +gui.worldhandler.potions.effect.give=Geben +gui.worldhandler.potions.effect.remove=Entfernen +gui.worldhandler.potions.effect.remove_all=Alle Entfernen +gui.worldhandler.potions.effect.amplifier=Verstärker +gui.worldhandler.potions.effect.ambient=Umgebung: %s +gui.worldhandler.potions.effect.particles=Partikel: %s +gui.worldhandler.potions.effect.bottle=Trank +gui.worldhandler.potions.effect.splash=Wurftrank +gui.worldhandler.potions.effect.lingering=Verweil +gui.worldhandler.potions.effect.tipped_arrow=Pfeil + +gui.worldhandler.entities=Lebewesen +gui.worldhandler.items=Items +gui.worldhandler.scoreboard=Anzeigetafel +gui.worldhandler.resourcepack=Ressourcen +gui.worldhandler.change_world=Welt Wechseln +gui.worldhandler.world=Welt +gui.worldhandler.blocks=Blöcke +gui.worldhandler.player=Spieler + +gui.worldhandler.items.give_custom_item.start=Start +gui.worldhandler.items.give_custom_item.enchantment=Verzauberung +gui.worldhandler.items.give_custom_item.attributes=Attribute +gui.worldhandler.items.give_custom_item.give_custom_item=Gebe Eigenes Item + +gui.worldhandler.items.give_custom_item.start.item_id=Item ID +gui.worldhandler.items.give_custom_item.start.lore_1=Sage I +gui.worldhandler.items.give_custom_item.start.lore_2=Sage II +gui.worldhandler.items.give_custom_item.start.custom_name=Eigener Name + +gui.worldhandler.items.enchantment.level=Level +gui.worldhandler.items.enchantment.enchant=Verzaubern + +gui.worldhandler.blocks.sign_editor.look_at_sign=Gucke auf ein Schild und drücke '%s' +gui.worldhandler.blocks.sign_editor.text_line_1=Textzeile I +gui.worldhandler.blocks.sign_editor.text_line_2=Textzeile II +gui.worldhandler.blocks.sign_editor.text_line_3=Textzeile III +gui.worldhandler.blocks.sign_editor.text_line_4=Textzeile IV +gui.worldhandler.blocks.sign_editor.commmand=Befehl +gui.worldhandler.blocks.sign_editor.done=Fertig +gui.worldhandler.blocks.sign_editor.format_text_line=Textzeile formatieren + +gui.worldhandler.blocks.note_block_editor.look_at_note_block=Gucke auf einen Notenblock und drücke '%s' +gui.worldhandler.blocks.note_block_editor.c=C +gui.worldhandler.blocks.note_block_editor.d=D +gui.worldhandler.blocks.note_block_editor.e=E +gui.worldhandler.blocks.note_block_editor.f=F +gui.worldhandler.blocks.note_block_editor.g=G +gui.worldhandler.blocks.note_block_editor.a=A +gui.worldhandler.blocks.note_block_editor.b=H + +gui.worldhandler.gamerules.rule.commandBlockOutput=Befehlsblock Feedback +gui.worldhandler.gamerules.rule.disableElytraMovementCheck=Deaktiviere Speed-Check +gui.worldhandler.gamerules.rule.doDaylightCycle=Tageszyklus +gui.worldhandler.gamerules.rule.doEntityDrops=Entity Drops +gui.worldhandler.gamerules.rule.doFireTick=Feuerverbreitung +gui.worldhandler.gamerules.rule.doMobLoot=Tierdrops +gui.worldhandler.gamerules.rule.doMobSpawning=Tiere Spawnen +gui.worldhandler.gamerules.rule.doTileDrops=Block Drops +gui.worldhandler.gamerules.rule.keepInventory=Behalte Inventar +gui.worldhandler.gamerules.rule.logAdminCommands=Adminbefehle Aufschreiben +gui.worldhandler.gamerules.rule.mobGriefing=Griefing von Tieren +gui.worldhandler.gamerules.rule.naturalRegeneration=Natürliche Regeneration +gui.worldhandler.gamerules.rule.randomTickSpeed=Zufällige Tickgeschwindigkeit +gui.worldhandler.gamerules.rule.reducedDebugInfo=Reduzierte Debug Info +gui.worldhandler.gamerules.rule.sendCommandFeedback=Befehlsfeedback +gui.worldhandler.gamerules.rule.showDeathMessages=Todesnachrichten +gui.worldhandler.gamerules.rule.spawnRadius=Spawn Radius +gui.worldhandler.gamerules.rule.spectatorsGenerateChunks=Zuschauer Generieren Chunks +gui.worldhandler.gamerules.rule.doWeatherCycle=Wetterzyklus +gui.worldhandler.gamerules.rule.maxEntityCramming=Max Entity Stapel +gui.worldhandler.gamerules.rule.announceAdvancements=Fortschritte bekanntgeben +gui.worldhandler.gamerules.rule.doLimitedCrafting=Limitertes Craften +gui.worldhandler.gamerules.rule.gameLoopFunction=Game Loop Funktion +gui.worldhandler.gamerules.rule.maxCommandChainLength=Kommandokettenlänge + +gui.worldhandler.world_info.start=Start +gui.worldhandler.world_info.world=Welt +gui.worldhandler.world_info.statistics=Statistiken + +gui.worldhandler.world_info.n_a=n/v + +gui.worldhandler.world_info.start.spawn=Spawn + +gui.worldhandler.world_info.world.name=Name +gui.worldhandler.world_info.world.world_type=Welttyp +gui.worldhandler.world_info.world.seed=Seed + +gui.worldhandler.world_info.statistics.world_time=Weltzeit +gui.worldhandler.world_info.statistics.played=Played + +gui.worldhandler.edit_blocks.coordinates=Koordinaten +gui.worldhandler.edit_blocks.fill=Füllen +gui.worldhandler.edit_blocks.replace=Ersetzen +gui.worldhandler.edit_blocks.clone=Klonen + +gui.worldhandler.edit_blocks.replace.block_id_replace=Block ID Ersetze +gui.worldhandler.edit_blocks.replace.block_id_place=Block ID Platzier + +gui.worldhandler.edit_blocks.fill.block_id_to_fill=Block ID Füllen + +gui.worldhandler.edit_blocks.clone.mode.replace=Ersetzen +gui.worldhandler.edit_blocks.clone.mode.masked=Maskiert +gui.worldhandler.edit_blocks.clone.mode.filtered=Gefiltert + +gui.worldhandler.edit_blocks.pos.set_pos_1=Position 1 +gui.worldhandler.edit_blocks.pos.set_pos_2=Position 2 + +gui.worldhandler.scoreboard.slot.list=Liste +gui.worldhandler.scoreboard.slot.belowName=Unter Name +gui.worldhandler.scoreboard.slot.sidebar=Seitentafel +gui.worldhandler.scoreboard.slot.sidebar.team=Seitentafel Team + +gui.worldhandler.scoreboard.objectives.objective=Objekt +gui.worldhandler.scoreboard.objectives.create=Erstellen +gui.worldhandler.scoreboard.objectives.display=Anzeigen +gui.worldhandler.scoreboard.objectives.undisplay=Verstecken +gui.worldhandler.scoreboard.objectives.remove=Entfernen + +gui.worldhandler.scoreboard.objectives.criteria.air=Spieler Luft +gui.worldhandler.scoreboard.objectives.criteria.armor=Spieler Rüstung +gui.worldhandler.scoreboard.objectives.criteria.deathCount=Tode +gui.worldhandler.scoreboard.objectives.criteria.dummy=Dummy +gui.worldhandler.scoreboard.objectives.criteria.food=Spieler Hunger +gui.worldhandler.scoreboard.objectives.criteria.health=Spieler Leben +gui.worldhandler.scoreboard.objectives.criteria.killedByTeam=Von Team Getötet +gui.worldhandler.scoreboard.objectives.criteria.level=Erfahrungslevel +gui.worldhandler.scoreboard.objectives.criteria.playerKillCount=Spieler Getötet +gui.worldhandler.scoreboard.objectives.criteria.stat=Statistik +gui.worldhandler.scoreboard.objectives.criteria.stat.craftingTableInteraction=Werkbank Interaktionen +gui.worldhandler.scoreboard.objectives.criteria.stat.breakItem=Items Verbraucht +gui.worldhandler.scoreboard.objectives.criteria.stat.craftItem=Items Hergestellt +gui.worldhandler.scoreboard.objectives.criteria.stat.drop=Items Fallen Gelassen +gui.worldhandler.scoreboard.objectives.criteria.stat.entityKilledBy=Getötet Von Zähler +gui.worldhandler.scoreboard.objectives.criteria.stat.killEntity=Tötungen Von Lebewesen +gui.worldhandler.scoreboard.objectives.criteria.stat.mineBlock=Blöcke Abgebaut +gui.worldhandler.scoreboard.objectives.criteria.stat.pickup=Items Aufgenommen +gui.worldhandler.scoreboard.objectives.criteria.stat.useItem=Items Benutzt +gui.worldhandler.scoreboard.objectives.criteria.teamkill=Teamtötungen +gui.worldhandler.scoreboard.objectives.criteria.totalKillCount=Tötungen +gui.worldhandler.scoreboard.objectives.criteria.trigger=Auslöser +gui.worldhandler.scoreboard.objectives.criteria.xp=Erfahrung + +gui.worldhandler.scoreboard.team.options.friendlyfire=Freundliches Feuer +gui.worldhandler.scoreboard.team.options.seeFriendlyInvisibles=Unsichtbare Freunde +gui.worldhandler.scoreboard.team.options.nametagVisibility=Namensschild Sichtbarkeit +gui.worldhandler.scoreboard.team.options.deathMessageVisibility=Todesnachrichten +gui.worldhandler.scoreboard.team.options.collisionRule=Teamkollision +gui.worldhandler.scoreboard.team.options.color=Farbe + +gui.worldhandler.scoreboard.team.suboption.always=Immer +gui.worldhandler.scoreboard.team.suboption.never=Niemals +gui.worldhandler.scoreboard.team.suboption.hideForOtherTeams=Für Andere Unsichtbar +gui.worldhandler.scoreboard.team.suboption.hideForOwnTeam=Für Eigene Unsichtbar +gui.worldhandler.scoreboard.team.suboption.pushOwnTeam=Bewege Eigenes Team +gui.worldhandler.scoreboard.team.suboption.pushOtherTeams=Bewege Andere Teams +gui.worldhandler.scoreboard.team.suboption.true=Ein +gui.worldhandler.scoreboard.team.suboption.false=Aus + +gui.worldhandler.scoreboard.team.team=Team +gui.worldhandler.scoreboard.team.create=Erstellen +gui.worldhandler.scoreboard.team.join=Beitreten +gui.worldhandler.scoreboard.team.leave=Verlassen +gui.worldhandler.scoreboard.team.remove=Entfernen +gui.worldhandler.scoreboard.team.empty=Leeren +gui.worldhandler.scoreboard.team.options=Team Optionen + +gui.worldhandler.scoreboard.players.points=Punkte +gui.worldhandler.scoreboard.players.tag=Etikett +gui.worldhandler.scoreboard.players.trigger=Auslöser + +gui.worldhandler.entities.player.start=Start +gui.worldhandler.entities.player.score=Wertung +gui.worldhandler.entities.player.position=Position +gui.worldhandler.entities.player.miscellaneous=Sonstige + +gui.worldhandler.entities.player.score.experience=Erfahrung +gui.worldhandler.entities.player.score.experience_coins=Erf-Punkte + +gui.worldhandler.entities.player.position.copy_position=Kopiere Position + +gui.worldhandler.entities.player.miscellaneous.set_spawn=Setze Spawn +gui.worldhandler.entities.player.miscellaneous.set_global_spawn=Setze Globalen Spawn +gui.worldhandler.entities.player.miscellaneous.kill=Töten +gui.worldhandler.entities.player.miscellaneous.clear_inventory=Leere Inventar + +gui.worldhandler.entities.summon.start=Start +gui.worldhandler.entities.summon.potion_effects=Statuseffekte +gui.worldhandler.entities.summon.attributes=Attribute +gui.worldhandler.entities.summon.equipment=Ausrüstung + +gui.worldhandler.entities.summon.start.mob_id=Tier ID +gui.worldhandler.entities.summon.start.custom_name=Eigener Name +gui.worldhandler.entities.summon.start.passenger_mob_id=Passagier Tier ID + +gui.worldhandler.potion.time.hours=Stunden +gui.worldhandler.potion.time.minutes=Minuten +gui.worldhandler.potion.time.seconds=Sekunden + +gui.worldhandler.shortcuts.tooltip.home=Home +gui.worldhandler.shortcuts.tooltip.butcher=Metzeln +gui.worldhandler.shortcuts.tooltip.settings=Einstellungen +gui.worldhandler.shortcuts.tooltip.potions=Tränke + +gui.worldhandler.shortcuts.tooltip.gamemode=Spielmodus: %s +gui.worldhandler.shortcuts.tooltip.gamemode.survival=Überleben +gui.worldhandler.shortcuts.tooltip.gamemode.creative=Kreativ +gui.worldhandler.shortcuts.tooltip.gamemode.adventure=Abenteuer +gui.worldhandler.shortcuts.tooltip.gamemode.spectator=Zuschauer + +gui.worldhandler.shortcuts.tooltip.difficulty=Schwierigkeit: %s +gui.worldhandler.shortcuts.tooltip.difficulty.peaceful=Friedlich +gui.worldhandler.shortcuts.tooltip.difficulty.easy=Einfach +gui.worldhandler.shortcuts.tooltip.difficulty.normal=Normal +gui.worldhandler.shortcuts.tooltip.difficulty.hard=Schwer + +gui.worldhandler.shortcuts.tooltip.weather=Wetter: %s +gui.worldhandler.shortcuts.tooltip.weather.thunder=Unwetter +gui.worldhandler.shortcuts.tooltip.weather.rainy=Regen +gui.worldhandler.shortcuts.tooltip.weather.clear=Sonnig + +gui.worldhandler.shortcuts.tooltip.time=Zeit: %s +gui.worldhandler.shortcuts.tooltip.time.midnight=Mitternacht (%s) +gui.worldhandler.shortcuts.tooltip.time.sunset=Sonnenuntergang (%s) +gui.worldhandler.shortcuts.tooltip.time.noon=Mittag (%s) +gui.worldhandler.shortcuts.tooltip.time.dawn=Sonnenaufgang (%s) + +gui.worldhandler.generic.back=Zurück +gui.worldhandler.generic.backToGame=Schließen +gui.worldhandler.generic.browse=Blättern +gui.worldhandler.generic.options=Optionen +gui.worldhandler.generic.on=An +gui.worldhandler.generic.off=Aus +gui.worldhandler.generic.yes=Ja +gui.worldhandler.generic.no=Nein +gui.worldhandler.generic.value=Wert +gui.worldhandler.generic.name=Name +gui.worldhandler.generic.enable=Ein +gui.worldhandler.generic.disable=Aus +gui.worldhandler.generic.edit_username=Benutzername + +gui.worldhandler.actions.add=Hinzufügen +gui.worldhandler.actions.remove=Entfernen +gui.worldhandler.actions.reset=Zurücksetzen +gui.worldhandler.actions.set_to_0=Auf 0 setzen +gui.worldhandler.actions.perform=Ausführen +gui.worldhandler.actions.send=Senden +gui.worldhandler.actions.copy=Kopieren +gui.worldhandler.actions.place_command_block=Platziere Befehlsblock + +gui.worldhandler.color=Farbe +gui.worldhandler.color.black=Schwarz +gui.worldhandler.color.dark_blue=Dunkel Blau +gui.worldhandler.color.dark_green=Dunkel Grün +gui.worldhandler.color.dark_aqua=Dunkel Türkis +gui.worldhandler.color.dark_red=Dunkel Rot +gui.worldhandler.color.dark_purple=Dunkel Lila +gui.worldhandler.color.gold=Gold +gui.worldhandler.color.gray=Grau +gui.worldhandler.color.dark_gray=Dunkel Grau +gui.worldhandler.color.blue=Blau +gui.worldhandler.color.green=Grün +gui.worldhandler.color.aqua=Türkis +gui.worldhandler.color.red=Rot +gui.worldhandler.color.light_purple=Pink +gui.worldhandler.color.yellow=Gelb +gui.worldhandler.color.white=Weiss +gui.worldhandler.color.reset=Normal + +worldhandler.permission.refused=Du hast nicht die benötigte Berechtigung, um den World Handler zu benutzen +worldhandler.permission.refused.change=Ändere "%s" um diese Nachricht zu umgehen \ No newline at end of file diff --git a/src/main/resources/assets/worldhandler/lang/en_us.lang b/src/main/resources/assets/worldhandler/lang/en_us.lang new file mode 100644 index 0000000..64c337a --- /dev/null +++ b/src/main/resources/assets/worldhandler/lang/en_us.lang @@ -0,0 +1,429 @@ +gui.worldhandler.config.tooltip=World Handler Settings + +gui.worldhandler.config.category.settings=Settings +gui.worldhandler.config.category.skin=Skin +gui.worldhandler.config.category.butcher=Butcher + +gui.worldhandler.config.key.settings.biome_indicator=Biome Indicator +gui.worldhandler.config.key.settings.command_syntax=Command Syntax +gui.worldhandler.config.key.settings.shortcuts=Shortcuts +gui.worldhandler.config.key.settings.key_shortcuts=Key Shortcuts +gui.worldhandler.config.key.settings.tooltips=Tooltips +gui.worldhandler.config.key.settings.watch=Watch +gui.worldhandler.config.key.settings.smooth_watch=Smooth Watch +gui.worldhandler.config.key.settings.pause_game=Pause Game +gui.worldhandler.config.key.settings.custom_times=Custom Times +gui.worldhandler.config.key.settings.permission_query=Permission Query +gui.worldhandler.config.key.settings.custom_time_dawn=Custom Dawn Ticks +gui.worldhandler.config.key.settings.custom_time_noon=Custom Noon Ticks +gui.worldhandler.config.key.settings.custom_time_sunset=Custom Sunset Ticks +gui.worldhandler.config.key.settings.custom_time_midnight=Custom Midnight Ticks +gui.worldhandler.config.key.settings.block_placing_mode=Block Placing Mode + +gui.worldhandler.config.comment.settings.biome_indicator=Biome Indicator Enabled +gui.worldhandler.config.comment.settings.command_syntax=Command Syntax Enabled +gui.worldhandler.config.comment.settings.shortcuts=Shortcuts Enabled +gui.worldhandler.config.comment.settings.key_shortcuts=Key Shortcuts Enabled +gui.worldhandler.config.comment.settings.tooltips=Tooltips Enabled +gui.worldhandler.config.comment.settings.watch=Watch Enabled +gui.worldhandler.config.comment.settings.smooth_watch=Smooth Watch Enabled +gui.worldhandler.config.comment.settings.pause_game=Pause Game +gui.worldhandler.config.comment.settings.custom_times=Custom Times Enabled +gui.worldhandler.config.comment.settings.permission_query=Permission Query Enabled +gui.worldhandler.config.comment.settings.custom_time_dawn=Ticks When Dawn +gui.worldhandler.config.comment.settings.custom_time_noon=Ticks When Noon +gui.worldhandler.config.comment.settings.custom_time_sunset=Ticks When Sunset +gui.worldhandler.config.comment.settings.custom_time_midnight=Ticks When Midnight +gui.worldhandler.config.comment.settings.block_placing_mode=Block Placing Mode + +gui.worldhandler.config.key.skin.icons=Icon Size +gui.worldhandler.config.key.skin.label_color=Label Color +gui.worldhandler.config.key.skin.headline_color=Headline Color +gui.worldhandler.config.key.skin.background_red=Background Red +gui.worldhandler.config.key.skin.background_green=Background Green +gui.worldhandler.config.key.skin.background_blue=Background Blue +gui.worldhandler.config.key.skin.button_red=Button Red +gui.worldhandler.config.key.skin.button_green=Button Green +gui.worldhandler.config.key.skin.button_blue=Button Blue +gui.worldhandler.config.key.skin.textures=Textures +gui.worldhandler.config.key.skin.sharp_tab_edges=Sharp Tab Edges +gui.worldhandler.config.key.skin.draw_background=Draw Background +gui.worldhandler.config.key.skin.background_alpha=Background Alpha +gui.worldhandler.config.key.skin.button_alpha=Button Alpha + +gui.worldhandler.config.comment.skin.icons=Size of the Icons +gui.worldhandler.config.comment.skin.label_color=Label Color +gui.worldhandler.config.comment.skin.headline_color=Headline Color +gui.worldhandler.config.comment.skin.background_red=Background Red +gui.worldhandler.config.comment.skin.background_green=Background Green +gui.worldhandler.config.comment.skin.background_blue=Background Blue +gui.worldhandler.config.comment.skin.button_red=Button Red +gui.worldhandler.config.comment.skin.button_green=Button Green +gui.worldhandler.config.comment.skin.button_blue=Button Blue +gui.worldhandler.config.comment.skin.textures=Background Texture +gui.worldhandler.config.comment.skin.sharp_tab_edges=Sharp Tab Edges Enabled +gui.worldhandler.config.comment.skin.draw_background=Background Drawing Enabled +gui.worldhandler.config.comment.skin.background_alpha=Background Alpha +gui.worldhandler.config.comment.skin.button_alpha=Button Alpha + +gui.worldhandler.config.comment.butcher=Butcher %s Enabled + +gui.worldhandler.tab.scoreboard.objectives=Objectives +gui.worldhandler.tab.scoreboard.teams=Teams +gui.worldhandler.tab.scoreboard.players=Players + +gui.worldhandler.tab.player.player=Player +gui.worldhandler.tab.player.experience=Experience +gui.worldhandler.tab.player.advancements=Advancements + +gui.worldhandler.tab.entities.summon=Summon + +gui.worldhandler.tab.world.world=World +gui.worldhandler.tab.world.gamerules=Gamerules + +gui.worldhandler.tab.blocks.edit_blocks=Edit Blocks +gui.worldhandler.tab.blocks.sign_editor=Sign Editor +gui.worldhandler.tab.blocks.note_block_editor=Note Editor + +gui.worldhandler.tab.items.give_custom_item=Give Custom Item +gui.worldhandler.tab.items.enchantment=Enchantment + +gui.worldhandler.tab.containers=Containers +gui.worldhandler.tab.multiplayer=Multiplayer + +gui.worldhandler.title.entities.summon=Summon + +gui.worldhandler.title.items.give_custom_item=Give Custom Item +gui.worldhandler.title.items.enchantment=Enchantment + +gui.worldhandler.title.blocks.edit_blocks=Edit Blocks +gui.worldhandler.title.blocks.sign_editor=Sign Editor +gui.worldhandler.title.blocks.note_block_editor=Note Block Editor + +gui.worldhandler.title.scoreboard=Scoreboard + +gui.worldhandler.title.world.world=World +gui.worldhandler.title.world.gamerules=Gamerules + +gui.worldhandler.title.player.player=Player +gui.worldhandler.title.player.experience=Experience +gui.worldhandler.title.player.advancements=Advancements + +gui.worldhandler.title.butcher=Butcher +gui.worldhandler.title.change_world=Change World +gui.worldhandler.title.potions=Potions + +gui.worldhandler.title.containers=Containers +gui.worldhandler.title.multiplayer=Multiplayer + +gui.worldhandler.advancements.grant=Grant +gui.worldhandler.advancements.revoke=Revoke +gui.worldhandler.advancements.only=Only +gui.worldhandler.advancements.until=Until +gui.worldhandler.advancements.from=From +gui.worldhandler.advancements.through=Through +gui.worldhandler.advancements.everything=Everything + +gui.worldhandler.continue.question=Continue ? + +gui.worldhandler.change_world.singleplayer=Singleplayer World +gui.worldhandler.change_world.multiplayer=Multiplayer Server + +gui.worldhandler.butcher.radius=Radius +gui.worldhandler.butcher.configure=Configure +gui.worldhandler.butcher.slaughter=Slaughter + +gui.worldhandler.multiplayer.kick=Kick +gui.worldhandler.multiplayer.ban=Ban +gui.worldhandler.multiplayer.pardon=Pardon +gui.worldhandler.multiplayer.permissions=Permissions +gui.worldhandler.multiplayer.runtime=Runtime +gui.worldhandler.multiplayer.whitelist=Whitelist +gui.worldhandler.multiplayer.username=Username + +gui.worldhandler.multiplayer.kick_ban.reason=Reason + +gui.worldhandler.multiplayer.permissions.give=Give Permissions +gui.worldhandler.multiplayer.permissions.take=Take Permissions + +gui.worldhandler.multiplayer.runtime.save_world=Save World +gui.worldhandler.multiplayer.runtime.autosave=Autosave: %s +gui.worldhandler.multiplayer.runtime.stop_server=Stop Server + +gui.worldhandler.multiplayer.whitelist.reload=Reload Whitelist +gui.worldhandler.multiplayer.whitelist.whitelist=Whitelist: %s +gui.worldhandler.multiplayer.whitelist.add=Add +gui.worldhandler.multiplayer.whitelist.remove=Remove + +gui.worldhandler.potions.effect=Effect +gui.worldhandler.potions.effect.give=Give +gui.worldhandler.potions.effect.remove=Remove +gui.worldhandler.potions.effect.remove_all=Remove All +gui.worldhandler.potions.effect.amplifier=Amplifier +gui.worldhandler.potions.effect.ambient=Ambient: %s +gui.worldhandler.potions.effect.particles=Particles: %s +gui.worldhandler.potions.effect.bottle=Bottle +gui.worldhandler.potions.effect.splash=Splash +gui.worldhandler.potions.effect.lingering=Lingering +gui.worldhandler.potions.effect.tipped_arrow=Arrow + +gui.worldhandler.entities=Entities +gui.worldhandler.items=Items +gui.worldhandler.scoreboard=Scoreboard +gui.worldhandler.resourcepack=Resourcepack +gui.worldhandler.change_world=Change World +gui.worldhandler.world=World +gui.worldhandler.blocks=Blocks +gui.worldhandler.player=Player + +gui.worldhandler.items.give_custom_item.start=Start +gui.worldhandler.items.give_custom_item.enchantment=Enchantment +gui.worldhandler.items.give_custom_item.attributes=Attributes +gui.worldhandler.items.give_custom_item.give_custom_item=Give Custom Item + +gui.worldhandler.items.give_custom_item.start.item_id=Item ID +gui.worldhandler.items.give_custom_item.start.lore_1=Lore I +gui.worldhandler.items.give_custom_item.start.lore_2=Lore II +gui.worldhandler.items.give_custom_item.start.custom_name=Custom Name + +gui.worldhandler.items.enchantment.level=Level +gui.worldhandler.items.enchantment.enchant=Enchant + +gui.worldhandler.blocks.sign_editor.look_at_sign=Look at a Sign and press '%s' +gui.worldhandler.blocks.sign_editor.text_line_1=Text Line I +gui.worldhandler.blocks.sign_editor.text_line_2=Text Line II +gui.worldhandler.blocks.sign_editor.text_line_3=Text Line III +gui.worldhandler.blocks.sign_editor.text_line_4=Text Line IV +gui.worldhandler.blocks.sign_editor.commmand=Command +gui.worldhandler.blocks.sign_editor.done=Done +gui.worldhandler.blocks.sign_editor.format_text_line=Format Text Line + +gui.worldhandler.blocks.note_block_editor.look_at_note_block=Look at a Note Block and press '%s' +gui.worldhandler.blocks.note_block_editor.c=C +gui.worldhandler.blocks.note_block_editor.d=D +gui.worldhandler.blocks.note_block_editor.e=E +gui.worldhandler.blocks.note_block_editor.f=F +gui.worldhandler.blocks.note_block_editor.g=G +gui.worldhandler.blocks.note_block_editor.a=A +gui.worldhandler.blocks.note_block_editor.b=B + +gui.worldhandler.gamerules.rule.commandBlockOutput=Commandblock Messages +gui.worldhandler.gamerules.rule.disableElytraMovementCheck=Disable Speed Check +gui.worldhandler.gamerules.rule.doDaylightCycle=Daylight Cycle +gui.worldhandler.gamerules.rule.doEntityDrops=Entity Drops +gui.worldhandler.gamerules.rule.doFireTick=Fire Spread +gui.worldhandler.gamerules.rule.doMobLoot=Mob Drops +gui.worldhandler.gamerules.rule.doMobSpawning=Mob Spawning +gui.worldhandler.gamerules.rule.doTileDrops=Block Drops +gui.worldhandler.gamerules.rule.keepInventory=Keep Inventory +gui.worldhandler.gamerules.rule.logAdminCommands=Log Admin Commands +gui.worldhandler.gamerules.rule.mobGriefing=Mob Griefing +gui.worldhandler.gamerules.rule.naturalRegeneration=Natural Regeneration +gui.worldhandler.gamerules.rule.randomTickSpeed=Random Tick Speed +gui.worldhandler.gamerules.rule.reducedDebugInfo=Reduced Debug Info +gui.worldhandler.gamerules.rule.sendCommandFeedback=Command Feedback +gui.worldhandler.gamerules.rule.showDeathMessages=Death Messages +gui.worldhandler.gamerules.rule.spawnRadius=Spawn Radius +gui.worldhandler.gamerules.rule.spectatorsGenerateChunks=Spectators Generate Chunks +gui.worldhandler.gamerules.rule.doWeatherCycle=Weather Cycle +gui.worldhandler.gamerules.rule.maxEntityCramming=Max Entitiy Cramming +gui.worldhandler.gamerules.rule.announceAdvancements=Anncounce Advancements +gui.worldhandler.gamerules.rule.doLimitedCrafting=Limited Crafting +gui.worldhandler.gamerules.rule.gameLoopFunction=Game Loop Function +gui.worldhandler.gamerules.rule.maxCommandChainLength=Command Chain Length + +gui.worldhandler.world_info.start=Start +gui.worldhandler.world_info.world=World +gui.worldhandler.world_info.statistics=Statistics + +gui.worldhandler.world_info.n_a=n/a + +gui.worldhandler.world_info.start.spawn=Spawn + +gui.worldhandler.world_info.world.name=Name +gui.worldhandler.world_info.world.world_type=World Type +gui.worldhandler.world_info.world.seed=Seed + +gui.worldhandler.world_info.statistics.world_time=World Time +gui.worldhandler.world_info.statistics.played=Played + +gui.worldhandler.edit_blocks.coordinates=Coordinates +gui.worldhandler.edit_blocks.fill=Fill +gui.worldhandler.edit_blocks.replace=Replace +gui.worldhandler.edit_blocks.clone=Clone + +gui.worldhandler.edit_blocks.replace.block_id_replace=Block ID Replace +gui.worldhandler.edit_blocks.replace.block_id_place=Block ID Place + +gui.worldhandler.edit_blocks.fill.block_id_to_fill=Block ID To Fill + +gui.worldhandler.edit_blocks.clone.mode.replace=Replace +gui.worldhandler.edit_blocks.clone.mode.masked=Masked +gui.worldhandler.edit_blocks.clone.mode.filtered=Filtered + +gui.worldhandler.edit_blocks.pos.set_pos_1=Set Pos 1 +gui.worldhandler.edit_blocks.pos.set_pos_2=Set Pos 2 + +gui.worldhandler.scoreboard.slot.list=List +gui.worldhandler.scoreboard.slot.belowName=Below Name +gui.worldhandler.scoreboard.slot.sidebar=Sidebar +gui.worldhandler.scoreboard.slot.sidebar.team=Sidebar Team + +gui.worldhandler.scoreboard.objectives.objective=Objective +gui.worldhandler.scoreboard.objectives.create=Create +gui.worldhandler.scoreboard.objectives.display=Display +gui.worldhandler.scoreboard.objectives.undisplay=Undisplay +gui.worldhandler.scoreboard.objectives.remove=Remove + +gui.worldhandler.scoreboard.objectives.criteria.air=Player Air +gui.worldhandler.scoreboard.objectives.criteria.armor=Player Armor +gui.worldhandler.scoreboard.objectives.criteria.deathCount=Death Count +gui.worldhandler.scoreboard.objectives.criteria.dummy=Dummy +gui.worldhandler.scoreboard.objectives.criteria.food=Player Food +gui.worldhandler.scoreboard.objectives.criteria.health=Player Health +gui.worldhandler.scoreboard.objectives.criteria.killedByTeam=Killed By Team +gui.worldhandler.scoreboard.objectives.criteria.level=Experience Level +gui.worldhandler.scoreboard.objectives.criteria.playerKillCount=Players Killed +gui.worldhandler.scoreboard.objectives.criteria.stat=Stat +gui.worldhandler.scoreboard.objectives.criteria.stat.craftingTableInteraction=Crafting Table Interaction +gui.worldhandler.scoreboard.objectives.criteria.stat.breakItem=Break Item +gui.worldhandler.scoreboard.objectives.criteria.stat.craftItem=Craft Item +gui.worldhandler.scoreboard.objectives.criteria.stat.drop=Drop Item +gui.worldhandler.scoreboard.objectives.criteria.stat.entityKilledBy=Killed By Count +gui.worldhandler.scoreboard.objectives.criteria.stat.killEntity=Kill Count +gui.worldhandler.scoreboard.objectives.criteria.stat.mineBlock=Block Mined Count +gui.worldhandler.scoreboard.objectives.criteria.stat.pickup=Item Pickup Count +gui.worldhandler.scoreboard.objectives.criteria.stat.useItem=Item Used Count +gui.worldhandler.scoreboard.objectives.criteria.teamkill=Teamkills +gui.worldhandler.scoreboard.objectives.criteria.totalKillCount=Total Kill Count +gui.worldhandler.scoreboard.objectives.criteria.trigger=Trigger +gui.worldhandler.scoreboard.objectives.criteria.xp=Total Experience + +gui.worldhandler.scoreboard.team.options.friendlyfire=Friendly Fire +gui.worldhandler.scoreboard.team.options.seeFriendlyInvisibles=Friendly Invisibles +gui.worldhandler.scoreboard.team.options.nametagVisibility=Name Tag Visibility +gui.worldhandler.scoreboard.team.options.deathMessageVisibility=Death Messages +gui.worldhandler.scoreboard.team.options.collisionRule=Team Collision +gui.worldhandler.scoreboard.team.options.color=Color + +gui.worldhandler.scoreboard.team.suboption.always=Always +gui.worldhandler.scoreboard.team.suboption.never=Never +gui.worldhandler.scoreboard.team.suboption.hideForOtherTeams=Hide For Others +gui.worldhandler.scoreboard.team.suboption.hideForOwnTeam=Hide For Own +gui.worldhandler.scoreboard.team.suboption.pushOwnTeam=Push Own Team +gui.worldhandler.scoreboard.team.suboption.pushOtherTeams=Push Other Team +gui.worldhandler.scoreboard.team.suboption.true=Enable +gui.worldhandler.scoreboard.team.suboption.false=Disable + +gui.worldhandler.scoreboard.team.team=Team +gui.worldhandler.scoreboard.team.create=Create +gui.worldhandler.scoreboard.team.join=Join +gui.worldhandler.scoreboard.team.leave=Leave +gui.worldhandler.scoreboard.team.remove=Remove +gui.worldhandler.scoreboard.team.empty=Empty +gui.worldhandler.scoreboard.team.options=Team Options + +gui.worldhandler.scoreboard.players.points=Points +gui.worldhandler.scoreboard.players.tag=Tag +gui.worldhandler.scoreboard.players.trigger=Trigger + +gui.worldhandler.entities.player.start=Start +gui.worldhandler.entities.player.score=Score +gui.worldhandler.entities.player.position=Position +gui.worldhandler.entities.player.miscellaneous=Miscellaneous + +gui.worldhandler.entities.player.score.experience=Experience +gui.worldhandler.entities.player.score.experience_coins=Exp Coins + +gui.worldhandler.entities.player.position.copy_position=Copy Position + +gui.worldhandler.entities.player.miscellaneous.set_spawn=Set Spawn +gui.worldhandler.entities.player.miscellaneous.set_global_spawn=Set Global Spawn +gui.worldhandler.entities.player.miscellaneous.kill=Kill +gui.worldhandler.entities.player.miscellaneous.clear_inventory=Clear Inventory + +gui.worldhandler.entities.summon.start=Start +gui.worldhandler.entities.summon.potion_effects=Potion Effects +gui.worldhandler.entities.summon.attributes=Attributes +gui.worldhandler.entities.summon.equipment=Equipment + +gui.worldhandler.entities.summon.start.mob_id=Mob ID +gui.worldhandler.entities.summon.start.custom_name=Custom Name +gui.worldhandler.entities.summon.start.passenger_mob_id=Passenger Mob ID + +gui.worldhandler.potion.time.hours=Hours +gui.worldhandler.potion.time.minutes=Minutes +gui.worldhandler.potion.time.seconds=Seconds + +gui.worldhandler.shortcuts.tooltip.home=Home +gui.worldhandler.shortcuts.tooltip.butcher=Butcher +gui.worldhandler.shortcuts.tooltip.settings=Settings +gui.worldhandler.shortcuts.tooltip.potions=Potions + +gui.worldhandler.shortcuts.tooltip.gamemode=Gamemode: %s +gui.worldhandler.shortcuts.tooltip.gamemode.survival=Survival +gui.worldhandler.shortcuts.tooltip.gamemode.creative=Creative +gui.worldhandler.shortcuts.tooltip.gamemode.adventure=Adventure +gui.worldhandler.shortcuts.tooltip.gamemode.spectator=Spectator + +gui.worldhandler.shortcuts.tooltip.difficulty=Difficulty: %s +gui.worldhandler.shortcuts.tooltip.difficulty.peaceful=Peaceful +gui.worldhandler.shortcuts.tooltip.difficulty.easy=Easy +gui.worldhandler.shortcuts.tooltip.difficulty.normal=Normal +gui.worldhandler.shortcuts.tooltip.difficulty.hard=Hard + +gui.worldhandler.shortcuts.tooltip.weather=Weather: %s +gui.worldhandler.shortcuts.tooltip.weather.thunder=Thunderstorm +gui.worldhandler.shortcuts.tooltip.weather.rainy=Rain +gui.worldhandler.shortcuts.tooltip.weather.clear=Clear + +gui.worldhandler.shortcuts.tooltip.time=Time: %s +gui.worldhandler.shortcuts.tooltip.time.midnight=Midnight (%s) +gui.worldhandler.shortcuts.tooltip.time.sunset=Sunset (%s) +gui.worldhandler.shortcuts.tooltip.time.noon=Noon (%s) +gui.worldhandler.shortcuts.tooltip.time.dawn=Dawn (%s) + +gui.worldhandler.generic.back=Back +gui.worldhandler.generic.backToGame=Back to Game +gui.worldhandler.generic.browse=Browse +gui.worldhandler.generic.options=Options +gui.worldhandler.generic.on=On +gui.worldhandler.generic.off=Off +gui.worldhandler.generic.yes=Yes +gui.worldhandler.generic.no=No +gui.worldhandler.generic.value=Value +gui.worldhandler.generic.name=Name +gui.worldhandler.generic.enable=Enable +gui.worldhandler.generic.disable=Disable +gui.worldhandler.generic.edit_username=Edit Username + +gui.worldhandler.actions.add=Add +gui.worldhandler.actions.remove=Remove +gui.worldhandler.actions.reset=Reset +gui.worldhandler.actions.set_to_0=Set To 0 +gui.worldhandler.actions.perform=Perform +gui.worldhandler.actions.send=Send +gui.worldhandler.actions.copy=Copy +gui.worldhandler.actions.place_command_block=Place Command Block + +gui.worldhandler.color=Color +gui.worldhandler.color.black=Black +gui.worldhandler.color.dark_blue=Dark Blue +gui.worldhandler.color.dark_green=Dark Green +gui.worldhandler.color.dark_aqua=Dark Aqua +gui.worldhandler.color.dark_red=Dark Red +gui.worldhandler.color.dark_purple=Dark Purple +gui.worldhandler.color.gold=Gold +gui.worldhandler.color.gray=Gray +gui.worldhandler.color.dark_gray=Dark Gray +gui.worldhandler.color.blue=Blue +gui.worldhandler.color.green=Green +gui.worldhandler.color.aqua=Aqua +gui.worldhandler.color.red=Red +gui.worldhandler.color.light_purple=Light Purple +gui.worldhandler.color.yellow=Yellow +gui.worldhandler.color.white=White +gui.worldhandler.color.reset=Default + +worldhandler.permission.refused=You do not have permission to use the World Handler +worldhandler.permission.refused.change=Change "%s" to disable this message \ No newline at end of file diff --git a/src/main/resources/assets/worldhandler/lang/zh_cn.lang b/src/main/resources/assets/worldhandler/lang/zh_cn.lang new file mode 100644 index 0000000..17fd7a2 --- /dev/null +++ b/src/main/resources/assets/worldhandler/lang/zh_cn.lang @@ -0,0 +1,429 @@ +gui.worldhandler.config.tooltip=World Handler 设置 + +gui.worldhandler.config.category.settings=设置 +gui.worldhandler.config.category.skin=皮肤样式 +gui.worldhandler.config.category.butcher=屠宰 + +gui.worldhandler.config.key.settings.biome_indicator=生物群系指示器 +gui.worldhandler.config.key.settings.command_syntax=命令句法 +gui.worldhandler.config.key.settings.shortcuts=快捷键 +gui.worldhandler.config.key.settings.key_shortcuts=键盘快捷键 +gui.worldhandler.config.key.settings.tooltips=浮动提示 +gui.worldhandler.config.key.settings.watch=时钟 +gui.worldhandler.config.key.settings.smooth_watch=时钟平滑效果 +gui.worldhandler.config.key.settings.pause_game=暂停游戏 +gui.worldhandler.config.key.settings.custom_times=自定义时间 +gui.worldhandler.config.key.settings.permission_query=权限队列 +gui.worldhandler.config.key.settings.custom_time_dawn=自定义日出时间 +gui.worldhandler.config.key.settings.custom_time_noon=自定义正午时间 +gui.worldhandler.config.key.settings.custom_time_sunset=自定义日落时间 +gui.worldhandler.config.key.settings.custom_time_midnight=自定义午夜时间 +gui.worldhandler.config.key.settings.block_placing_mode=方块放置方式 + +gui.worldhandler.config.comment.settings.custom_time_dawn=生物群系指示器开启 +gui.worldhandler.config.comment.settings.command_syntax=命令句法开启 +gui.worldhandler.config.comment.settings.shortcuts=快捷键开启 +gui.worldhandler.config.comment.settings.key_shortcuts=键盘快捷键开启 +gui.worldhandler.config.comment.settings.tooltips=浮动提示开启 +gui.worldhandler.config.comment.settings.watch=时钟开启 +gui.worldhandler.config.comment.settings.smooth_watch=时钟平滑效果开启 +gui.worldhandler.config.comment.settings.pause_game=暂停游戏 +gui.worldhandler.config.comment.settings.custom_times=自定义时间开启 +gui.worldhandler.config.comment.settings.permission_query=权限队列开启 +gui.worldhandler.config.comment.settings.custom_time_dawn=日出的时间 +gui.worldhandler.config.comment.settings.custom_time_noon=正午的时间 +gui.worldhandler.config.comment.settings.custom_time_sunset=日落的时间 +gui.worldhandler.config.comment.settings.custom_time_midnight=午夜的时间 +gui.worldhandler.config.comment.settings.block_placing_mode=方块放置方式 + +gui.worldhandler.config.key.skin.icons=图标尺寸 +gui.worldhandler.config.key.skin.label_color=标签颜色 +gui.worldhandler.config.key.skin.headline_color=标题颜色 +gui.worldhandler.config.key.skin.background_red=背景红色 +gui.worldhandler.config.key.skin.background_green=背景绿色 +gui.worldhandler.config.key.skin.background_blue=背景蓝色 +gui.worldhandler.config.key.skin.button_red=按钮红色 +gui.worldhandler.config.key.skin.button_green=按钮绿色 +gui.worldhandler.config.key.skin.button_blue=按钮蓝色 +gui.worldhandler.config.key.skin.textures=材质 +gui.worldhandler.config.key.skin.sharp_tab_edges=尖锐分栏边缘 +gui.worldhandler.config.key.skin.draw_background=绘制暗色背景 +gui.worldhandler.config.key.skin.background_alpha=背景透明度 +gui.worldhandler.config.key.skin.button_alpha=按钮透明度 + +gui.worldhandler.config.comment.skin.icons=图标的大小 +gui.worldhandler.config.comment.skin.label_color=标签的颜色 +gui.worldhandler.config.comment.skin.headline_color=标题颜色 +gui.worldhandler.config.comment.skin.background_red=背景 R +gui.worldhandler.config.comment.skin.background_green=背景 G +gui.worldhandler.config.comment.skin.background_blue=背景 B +gui.worldhandler.config.comment.skin.button_red=按钮 R +gui.worldhandler.config.comment.skin.button_green=按钮 G +gui.worldhandler.config.comment.skin.button_blue=按钮 B +gui.worldhandler.config.comment.skin.textures=背景材质 +gui.worldhandler.config.comment.skin.sharp_tab_edges=尖锐分栏边缘开启 +gui.worldhandler.config.comment.skin.draw_background=绘制暗色背景开启 +gui.worldhandler.config.comment.skin.background_alpha=背景 Alpha +gui.worldhandler.config.comment.skin.button_alpha=按钮 Alpha + +gui.worldhandler.config.comment.butcher=屠宰 %s 开启 + +gui.worldhandler.tab.scoreboard.objectives=变量 +gui.worldhandler.tab.scoreboard.teams=团队 +gui.worldhandler.tab.scoreboard.players=玩家 + +gui.worldhandler.tab.player.player=玩家 +gui.worldhandler.tab.player.experience=经验等级 +gui.worldhandler.tab.player.advancements=进度 + +gui.worldhandler.tab.entities.summon=召唤 + +gui.worldhandler.tab.world.world=世界 +gui.worldhandler.tab.world.gamerules=游戏规则 + +gui.worldhandler.tab.blocks.edit_blocks=编辑方块 +gui.worldhandler.tab.blocks.sign_editor=告示牌编辑器 +gui.worldhandler.tab.blocks.note_block_editor=音符编辑器 + +gui.worldhandler.tab.items.give_custom_item=给予自定义物品 +gui.worldhandler.tab.items.enchantment=附魔 + +gui.worldhandler.tab.containers=容器 +gui.worldhandler.tab.multiplayer=多人 + +gui.worldhandler.title.entities.summon=召唤 + +gui.worldhandler.title.items.give_custom_item=给予自定义物品 +gui.worldhandler.title.items.enchantment=附魔 + +gui.worldhandler.title.blocks.edit_blocks=编辑方块 +gui.worldhandler.title.blocks.sign_editor=告示牌编辑器 +gui.worldhandler.title.blocks.note_block_editor=音符盒编辑器 + +gui.worldhandler.title.scoreboard=记分板 + +gui.worldhandler.title.world.world=世界 +gui.worldhandler.title.world.gamerules=游戏规则 + +gui.worldhandler.title.player.player=玩家 +gui.worldhandler.title.player.experience=经验等级 +gui.worldhandler.title.player.advancements=进度 + +gui.worldhandler.title.butcher=屠宰 +gui.worldhandler.title.change_world=更改世界 +gui.worldhandler.title.potions=药水 + +gui.worldhandler.title.containers=容器 +gui.worldhandler.title.multiplayer=多人 + +gui.worldhandler.advancements.grant=给予 +gui.worldhandler.advancements.revoke=移除 +gui.worldhandler.advancements.only=仅此 +gui.worldhandler.advancements.until=直到 +gui.worldhandler.advancements.from=自 +gui.worldhandler.advancements.through=经由 +gui.worldhandler.advancements.everything=全部 + +gui.worldhandler.continue.question=继续? + +gui.worldhandler.change_world.singleplayer=单人世界 +gui.worldhandler.change_world.multiplayer=多人世界 + +gui.worldhandler.butcher.radius=范围 +gui.worldhandler.butcher.configure=配置 +gui.worldhandler.butcher.slaughter=屠杀 + +gui.worldhandler.multiplayer.kick=踢出 +gui.worldhandler.multiplayer.ban=封禁 +gui.worldhandler.multiplayer.pardon=解封 +gui.worldhandler.multiplayer.permissions=权限 +gui.worldhandler.multiplayer.runtime=运行时 +gui.worldhandler.multiplayer.whitelist=白名单 +gui.worldhandler.multiplayer.username=用户名 + +gui.worldhandler.multiplayer.kick_ban.reason=理由 + +gui.worldhandler.multiplayer.permissions.give=给予权限 +gui.worldhandler.multiplayer.permissions.take=收回权限 + +gui.worldhandler.multiplayer.runtime.save_world=保存世界 +gui.worldhandler.multiplayer.runtime.autosave=自动保存:%s +gui.worldhandler.multiplayer.runtime.stop_server=停止服务器 + +gui.worldhandler.multiplayer.whitelist.reload=重新加载白名单 +gui.worldhandler.multiplayer.whitelist.whitelist=白名单:%s +gui.worldhandler.multiplayer.whitelist.add=添加 +gui.worldhandler.multiplayer.whitelist.remove=删除 + +gui.worldhandler.potions.effect=效果 +gui.worldhandler.potions.effect.give=给予 +gui.worldhandler.potions.effect.remove=删除 +gui.worldhandler.potions.effect.remove_all=移除所有 +gui.worldhandler.potions.effect.amplifier=效果等级 +gui.worldhandler.potions.effect.ambient=减少粒子显示:%s +gui.worldhandler.potions.effect.particles=粒子:%s +gui.worldhandler.potions.effect.bottle=瓶装 +gui.worldhandler.potions.effect.splash=喷溅 +gui.worldhandler.potions.effect.lingering=滞留 +gui.worldhandler.potions.effect.tipped_arrow=箭 + +gui.worldhandler.entities=实体 +gui.worldhandler.items=物品 +gui.worldhandler.scoreboard=记分板 +gui.worldhandler.resourcepack=资源包 +gui.worldhandler.change_world=更改世界 +gui.worldhandler.world=世界 +gui.worldhandler.blocks=方块 +gui.worldhandler.player=玩家 + +gui.worldhandler.items.give_custom_item.start=首选项 +gui.worldhandler.items.give_custom_item.enchantment=附魔 +gui.worldhandler.items.give_custom_item.attributes=属性 +gui.worldhandler.items.give_custom_item.give_custom_item=给予自定义物品 + +gui.worldhandler.items.give_custom_item.start.item_id=物品 ID +gui.worldhandler.items.give_custom_item.start.lore_1=描述 I +gui.worldhandler.items.give_custom_item.start.lore_2=描述 II +gui.worldhandler.items.give_custom_item.start.custom_name=自定义名称 + +gui.worldhandler.items.enchantment.level=等级 +gui.worldhandler.items.enchantment.enchant=附魔 + +gui.worldhandler.blocks.sign_editor.look_at_sign=看着一个告示牌并按 '%s' +gui.worldhandler.blocks.sign_editor.text_line_1=文字行 I +gui.worldhandler.blocks.sign_editor.text_line_2=文字行 II +gui.worldhandler.blocks.sign_editor.text_line_3=文字行 III +gui.worldhandler.blocks.sign_editor.text_line_4=文字行 IV +gui.worldhandler.blocks.sign_editor.commmand=命令 +gui.worldhandler.blocks.sign_editor.done=完成 +gui.worldhandler.blocks.sign_editor.format_text_line=文本行格式 + +gui.worldhandler.blocks.note_block_editor.look_at_note_block=看着一个音符盒并按 '%s' +gui.worldhandler.blocks.note_block_editor.c=C +gui.worldhandler.blocks.note_block_editor.d=D +gui.worldhandler.blocks.note_block_editor.e=E +gui.worldhandler.blocks.note_block_editor.f=F +gui.worldhandler.blocks.note_block_editor.g=G +gui.worldhandler.blocks.note_block_editor.a=A +gui.worldhandler.blocks.note_block_editor.b=B + +gui.worldhandler.gamerules.rule.commandBlockOutput=命令方块输出信息 +gui.worldhandler.gamerules.rule.disableElytraMovementCheck=禁用鞘翅速度检查 +gui.worldhandler.gamerules.rule.doDaylightCycle=昼夜循环 +gui.worldhandler.gamerules.rule.doEntityDrops=实体掉落 +gui.worldhandler.gamerules.rule.doFireTick=火焰扩散 +gui.worldhandler.gamerules.rule.doMobLoot=生物掉落 +gui.worldhandler.gamerules.rule.doMobSpawning=生物出生 +gui.worldhandler.gamerules.rule.doTileDrops=方块掉落 +gui.worldhandler.gamerules.rule.keepInventory=死亡保留物品 +gui.worldhandler.gamerules.rule.logAdminCommands=存储命令输出到聊天记录 +gui.worldhandler.gamerules.rule.mobGriefing=生物对世界的破坏 +gui.worldhandler.gamerules.rule.naturalRegeneration=自然回血 +gui.worldhandler.gamerules.rule.randomTickSpeed=随机方块刻速度 +gui.worldhandler.gamerules.rule.reducedDebugInfo=简化调试信息 +gui.worldhandler.gamerules.rule.sendCommandFeedback=命令反馈 +gui.worldhandler.gamerules.rule.showDeathMessages=死亡信息 +gui.worldhandler.gamerules.rule.spawnRadius=出生范围 +gui.worldhandler.gamerules.rule.spectatorsGenerateChunks=旁观者生成区块 +gui.worldhandler.gamerules.rule.doWeatherCycle=天气循环 +gui.worldhandler.gamerules.rule.maxEntityCramming=最大实体堆叠 +gui.worldhandler.gamerules.rule.announceAdvancements=广播进度 +gui.worldhandler.gamerules.rule.doLimitedCrafting=限制合成配方 +gui.worldhandler.gamerules.rule.gameLoopFunction=每刻运行的函数 +gui.worldhandler.gamerules.rule.maxCommandChainLength=命令连锁长度 + +gui.worldhandler.world_info.start=首选项 +gui.worldhandler.world_info.world=世界 +gui.worldhandler.world_info.statistics=统计数据 + +gui.worldhandler.world_info.n_a=n/a + +gui.worldhandler.world_info.start.spawn=出生 + +gui.worldhandler.world_info.world.name=名称 +gui.worldhandler.world_info.world.world_type=世界类型 +gui.worldhandler.world_info.world.seed=种子 + +gui.worldhandler.world_info.statistics.world_time=世界时间 +gui.worldhandler.world_info.statistics.played=已游玩 + +gui.worldhandler.edit_blocks.coordinates=坐标 +gui.worldhandler.edit_blocks.fill=填充 +gui.worldhandler.edit_blocks.replace=替换 +gui.worldhandler.edit_blocks.clone=克隆 + +gui.worldhandler.edit_blocks.replace.block_id_replace=被替换方块 ID +gui.worldhandler.edit_blocks.replace.block_id_place=放置方块 ID + +gui.worldhandler.edit_blocks.fill.block_id_to_fill=填充方块 ID + +gui.worldhandler.edit_blocks.clone.mode.replace=替换 +gui.worldhandler.edit_blocks.clone.mode.masked=叠加 +gui.worldhandler.edit_blocks.clone.mode.filtered=仅指定方块 + +gui.worldhandler.edit_blocks.pos.set_pos_1=设置位点 1 +gui.worldhandler.edit_blocks.pos.set_pos_2=设置位点 2 + +gui.worldhandler.scoreboard.slot.list=列表 +gui.worldhandler.scoreboard.slot.belowName=名称下方 +gui.worldhandler.scoreboard.slot.sidebar=侧边栏 +gui.worldhandler.scoreboard.slot.sidebar.team=侧边栏队伍 + +gui.worldhandler.scoreboard.objectives.objective=变量 +gui.worldhandler.scoreboard.objectives.create=创建 +gui.worldhandler.scoreboard.objectives.display=显示 +gui.worldhandler.scoreboard.objectives.undisplay=取消显示 +gui.worldhandler.scoreboard.objectives.remove=删除 + +gui.worldhandler.scoreboard.objectives.criteria.air=空气值 +gui.worldhandler.scoreboard.objectives.criteria.armor=盔甲值 +gui.worldhandler.scoreboard.objectives.criteria.deathCount=死亡次数 +gui.worldhandler.scoreboard.objectives.criteria.dummy=虚拟型 +gui.worldhandler.scoreboard.objectives.criteria.food=饱食度 +gui.worldhandler.scoreboard.objectives.criteria.health=生命值 +gui.worldhandler.scoreboard.objectives.criteria.killedByTeam=团队被击杀数 +gui.worldhandler.scoreboard.objectives.criteria.level=经验等级 +gui.worldhandler.scoreboard.objectives.criteria.playerKillCount=击杀玩家数 +gui.worldhandler.scoreboard.objectives.criteria.stat=统计 +gui.worldhandler.scoreboard.objectives.criteria.stat.craftingTableInteraction=与工作台互动 +gui.worldhandler.scoreboard.objectives.criteria.stat.breakItem=用坏物品 +gui.worldhandler.scoreboard.objectives.criteria.stat.craftItem=合成物品 +gui.worldhandler.scoreboard.objectives.criteria.stat.drop=掉落物品 +gui.worldhandler.scoreboard.objectives.criteria.stat.entityKilledBy=被实体击杀数 +gui.worldhandler.scoreboard.objectives.criteria.stat.killEntity=击杀实体数 +gui.worldhandler.scoreboard.objectives.criteria.stat.mineBlock=挖掘方块数 +gui.worldhandler.scoreboard.objectives.criteria.stat.pickup=物品拾起数 +gui.worldhandler.scoreboard.objectives.criteria.stat.useItem=物品使用数 +gui.worldhandler.scoreboard.objectives.criteria.teamkill=团队击杀数 +gui.worldhandler.scoreboard.objectives.criteria.totalKillCount=击杀生物数 +gui.worldhandler.scoreboard.objectives.criteria.trigger=触发器 +gui.worldhandler.scoreboard.objectives.criteria.xp=经验值 + +gui.worldhandler.scoreboard.team.options.friendlyfire=误伤 +gui.worldhandler.scoreboard.team.options.seeFriendlyInvisibles=可看到隐身队友 +gui.worldhandler.scoreboard.team.options.nametagVisibility=成员名称牌可见性 +gui.worldhandler.scoreboard.team.options.deathMessageVisibility=死亡信息可见性 +gui.worldhandler.scoreboard.team.options.collisionRule=碰撞模式 +gui.worldhandler.scoreboard.team.options.color=颜色 + +gui.worldhandler.scoreboard.team.suboption.always=总是 +gui.worldhandler.scoreboard.team.suboption.never=从不 +gui.worldhandler.scoreboard.team.suboption.hideForOtherTeams=对其他队伍隐藏 +gui.worldhandler.scoreboard.team.suboption.hideForOwnTeam=对己方队伍隐藏 +gui.worldhandler.scoreboard.team.suboption.pushOwnTeam=推动己方队伍 +gui.worldhandler.scoreboard.team.suboption.pushOtherTeams=推动其它队伍 +gui.worldhandler.scoreboard.team.suboption.true=开启 +gui.worldhandler.scoreboard.team.suboption.false=关闭 + +gui.worldhandler.scoreboard.team.team=队伍 +gui.worldhandler.scoreboard.team.create=创建 +gui.worldhandler.scoreboard.team.join=加入 +gui.worldhandler.scoreboard.team.leave=离开 +gui.worldhandler.scoreboard.team.remove=删除 +gui.worldhandler.scoreboard.team.empty=空 +gui.worldhandler.scoreboard.team.options=队伍选项 + +gui.worldhandler.scoreboard.players.points=点数 +gui.worldhandler.scoreboard.players.tag=标签 +gui.worldhandler.scoreboard.players.trigger=触发器 + +gui.worldhandler.entities.player.start=首选项 +gui.worldhandler.entities.player.score=记分 +gui.worldhandler.entities.player.position=位置 +gui.worldhandler.entities.player.miscellaneous=杂项 + +gui.worldhandler.entities.player.score.experience=经验等级 +gui.worldhandler.entities.player.score.experience_coins=经验值 + +gui.worldhandler.entities.player.position.copy_position=复制位置 + +gui.worldhandler.entities.player.miscellaneous.set_spawn=设置出生点 +gui.worldhandler.entities.player.miscellaneous.set_global_spawn=设置全局出生点 +gui.worldhandler.entities.player.miscellaneous.kill=杀死 +gui.worldhandler.entities.player.miscellaneous.clear_inventory=清空物品栏 + +gui.worldhandler.entities.summon.start=首选项 +gui.worldhandler.entities.summon.potion_effects=药水效果 +gui.worldhandler.entities.summon.attributes=属性 +gui.worldhandler.entities.summon.equipment=装备 + +gui.worldhandler.entities.summon.start.mob_id=生物 ID +gui.worldhandler.entities.summon.start.custom_name=自定义名称 +gui.worldhandler.entities.summon.start.passenger_mob_id=骑乘生物 ID + +gui.worldhandler.potion.time.hours=小时 +gui.worldhandler.potion.time.minutes=分钟 +gui.worldhandler.potion.time.seconds=秒 + +gui.worldhandler.shortcuts.tooltip.home=主页 +gui.worldhandler.shortcuts.tooltip.butcher=屠宰 +gui.worldhandler.shortcuts.tooltip.settings=设置 +gui.worldhandler.shortcuts.tooltip.potions=药水 + +gui.worldhandler.shortcuts.tooltip.gamemode=游戏模式:%s +gui.worldhandler.shortcuts.tooltip.gamemode.survival=生存 +gui.worldhandler.shortcuts.tooltip.gamemode.creative=创造 +gui.worldhandler.shortcuts.tooltip.gamemode.adventure=冒险 +gui.worldhandler.shortcuts.tooltip.gamemode.spectator=旁观 + +gui.worldhandler.shortcuts.tooltip.difficulty=难度:%s +gui.worldhandler.shortcuts.tooltip.difficulty.peaceful=和平 +gui.worldhandler.shortcuts.tooltip.difficulty.easy=简单 +gui.worldhandler.shortcuts.tooltip.difficulty.normal=普通 +gui.worldhandler.shortcuts.tooltip.difficulty.hard=困难 + +gui.worldhandler.shortcuts.tooltip.weather=天气:%s +gui.worldhandler.shortcuts.tooltip.weather.thunder=雷雨 +gui.worldhandler.shortcuts.tooltip.weather.rainy=雨天 +gui.worldhandler.shortcuts.tooltip.weather.clear=晴朗 + +gui.worldhandler.shortcuts.tooltip.time=时间:%s +gui.worldhandler.shortcuts.tooltip.time.midnight=午夜(%s) +gui.worldhandler.shortcuts.tooltip.time.sunset=日落(%s) +gui.worldhandler.shortcuts.tooltip.time.noon=正午(%s) +gui.worldhandler.shortcuts.tooltip.time.dawn=日出(%s) + +gui.worldhandler.generic.back=返回 +gui.worldhandler.generic.backToGame=返回游戏 +gui.worldhandler.generic.browse=浏览 +gui.worldhandler.generic.options=选项 +gui.worldhandler.generic.on=开 +gui.worldhandler.generic.off=关 +gui.worldhandler.generic.yes=是 +gui.worldhandler.generic.no=否 +gui.worldhandler.generic.value=值 +gui.worldhandler.generic.name=名称 +gui.worldhandler.generic.enable=开启 +gui.worldhandler.generic.disable=关闭 +gui.worldhandler.generic.edit_username=编辑用户名 + +gui.worldhandler.actions.add=添加 +gui.worldhandler.actions.remove=删除 +gui.worldhandler.actions.reset=重置 +gui.worldhandler.actions.set_to_0=重置为 0 +gui.worldhandler.actions.perform=执行 +gui.worldhandler.actions.send=发送 +gui.worldhandler.actions.copy=复制 +gui.worldhandler.actions.place_command_block=放置命令方块 + +gui.worldhandler.color=颜色 +gui.worldhandler.color.black=黑色 +gui.worldhandler.color.dark_blue=深蓝色 +gui.worldhandler.color.dark_green=深绿色 +gui.worldhandler.color.dark_aqua=湖蓝色 +gui.worldhandler.color.dark_red=深红色 +gui.worldhandler.color.dark_purple=紫色 +gui.worldhandler.color.gold=金色 +gui.worldhandler.color.gray=灰色 +gui.worldhandler.color.dark_gray=深灰色 +gui.worldhandler.color.blue=蓝色 +gui.worldhandler.color.green=绿色 +gui.worldhandler.color.aqua=天蓝色 +gui.worldhandler.color.red=红色 +gui.worldhandler.color.light_purple=粉色 +gui.worldhandler.color.yellow=黄色 +gui.worldhandler.color.white=白色 +gui.worldhandler.color.reset=默认 + +worldhandler.permission.refused=您没有权限使用 World Handler +worldhandler.permission.refused.change=更改 "%s" 来停止显示这条信息 \ No newline at end of file diff --git a/src/main/resources/assets/worldhandler/textures/icons/icons16.png b/src/main/resources/assets/worldhandler/textures/icons/icons16.png new file mode 100644 index 0000000000000000000000000000000000000000..c134c26a7cd47361d5d0017b5b4108f954b075e9 GIT binary patch literal 2308 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K58911MRQ8&P5Fo{p?&#~tz_78O`%fY(0|PTd zfKP}kP~6tmHru}5*VnJWrR7@v|L*SYUAuN2J9g~k$&=TvU3>cU>Hq&9|Ns9FR5=Pp zLtvPNfJ=26FDRpw1o;I66ZuF648h;oRe{mVS>O>_%)r3641^im@2t!R3QCr^MwA5S zrB;%5xQvPzgN4eIU)~)W-var=#v-aN4Z@Zq)O~3u^+u_Qe z$9Kw>uD@+nYi!_qIjD8({i@LSiC(@7KUO#XCqto_joDQWc>Y4US-k7%5w<7uP z4`Jg~3?j!~{p@yIA)j(njU(gq-Z}{he}<^q+}@>&Z7ed*v@LV^`-VZn;jbyvf-I?k z16{uYGv+fZFqfK@FuZ>6yg+x&lwKx#X1>O%CmPda56seJ_$=RlQErJ3+QF!ACh82)x1asgXN>ZT-{KRmCvf4`q0~BmeF<@kmmis; zIq@tXFU@a1n`^#t zQ;Eb5{>G*Mbbp+AaJ7=-MSS!7$q9)EBLDl_aXe6aV8?lFAG`Rx+5=ZB#RIJGyED%D z-ovsc`v3R#wG4UeJ0#z9J6QjC!@TZXyW#=&zVO~!oga@j^Y5_guWiWg<10vInX|Vr z#O=UMX?F-SO}^mTl@&b=o6Y-9aadG8hB9wYuT*l_;>*&pt&`!RnV`ZgH71waE)5y8 qIRtWr85iY_O423}lJy?Eer@h9-1v`6K+7Cd8+p3=xvXgBl3d>nu>^Ac7%*1B#Vs9cT+gs3z{kR*60f&{X)g+yB*3WO*@0&GI&-rqYt z@B2J&zS;XlxWk7lJ_G>3;q%>LUjl%Y<*OC&zK!KFo7bnaT;9Wn{8tD7++^4pQkGbL ze{ghnJP`mK8|FW-s+cSDPcJ{VGw#^F%!9{rQ?k>6qbXkq1AkeFrr%DGO8{Ja{MJqy2+U0y2SS zf>>2UECSXfkfRw*G5zYZymj?xQ^zkyN#reN+dUg@O7?lYS>=4tGP z>S#e(+Oxlnwvijg9{R`fVla>sj^zPGFV?@3He| zuBlU>a7ub^D+3K^vjH+BL4916N?caT83k~~GuJToG`luJ1eQOpyx2CfVsNHXMT>LI+$lcDx=M6{!IBh#sT zQDZyJn6yfy>_ejBfYEuUgt5lKbIQtj&!)Ola)r+a(m(UyWqFY|=%XNQe{hcidj1&* z;t|oj?m)u`FWN5HQ9W%~sy?lkKW;^#g&Ji1SA5osvMm%Qm6iO?98`Y46H)vnmOM!s-AWUZG~u#fT%+O)L!M=xNJm5AmA2;X<_*rIx4ld|`9B%K zJ3Ahn;wXYE&ZY##I^0V%wz}}#!f3i*SVPK~3UI>9lGP+?ksm_2L7#;}$e|uYj+$iv z(_v>gx;txpaH`x0elE4-CgWm?|Hh)ez@?32({(A-Xh#i{Tyc$s18$jq zgrm1=O^vQ4`jT!!^Lx?lf^&GWTAL)()>JNe;zZN5SJx^K-Bwc@UcPresp2Y#_;tZC z`|7BG`t0@0O+~R4Xa_F*9}idJst~x&UMHcdb(_t@Yny>ih$LYgaWF5v1nDEQIB-Lh z#q@lU4#lcdF{xIb^Oi1@2}Nmu??=eabcf{CWuIhUs=7DwtV5MoAr~tm(8RPG@)7y? zu_LY2{3DucDkCVqaS-ZhjSSMrX{g%?Ly{VblfQ0t+S~ryU-_hcL$Q>2q0p=NQQ*KZ zDQSlXgUS@j;|VAa!Q46^e#E9YhtA@##o%X&>D$1aJ|Z|LNQ9m60sQrM-?q-}ud8hK zIr2(3+QvEFJh~z~E&1Na_Hst!LDS6emXoPBlraZZf5*W&Ol4hJ+HA0&ZtWJS$*N4N z5|b*@YBNyv5>^WpDDXiS?LB$-ytOi>_ioPeM|EcW{-VMWsB_gagV&xE3wy$eu+?(>3RP#sTweLKSf}= z$d$@?l^5{3AE-r)RkIZk&bnu={2P{IPjUNn>v%`xM`Mjnwb;1g-;hM4;So92aptx} z+sLfT=OGMFY*(*zW>it9PvL%|HJVWy$x&$I^T=>E&ul^VmwT>L{W>4*3z(fzc1Z-A zSm8rGq}`oRUZtEFex$&MzE>DoFUdZ{KM0Fsf_Er!z^#jlSm#1Cp};J^;)Wm5X|tl4ky6uK zlkh3R$Q7?iejzVFV5rvjUxnEG$N*1c{QwwpN5v=1-?0n_`hH#MkE_SyH<`kWwM#sU z5BIfp^jjUpz9+s*!vZ4fEuv1zZR#ZZf{3O@G-nnl5|tvZH*oeFvcVun3tHr>yE8o( zy8S|I5ao!_&BY;p&*}n;2FzhQkGnsMB5@|dPrC-x^KxJ(A^iv=nY64j4vFqlQWRYmF25^tIy(oLMK6 ztlwxunHAR-(Xc{2vesa8?o|gj-P8sQH+0a;tp9f0+Z>mPB0mm1ko}C)j_wE=QDODV z==G%XJ1%qzTy<{5fEgp;^uON0nPy6>njCeB&dps1*n%$@>jfuX&pz5=Y6^o7RobrNe7knTU;2d|QcY!S{#-e-zM7VUSVFZCQ71L`i0b!o%i52MjqqKzS zn#CZ9)33KpLYAy@Wq_eR<6Q9-qGeP~+;LW}-rBD}X<{!)=9}vb1hhme84gG59;U;- z=dCM5>lMu$ifohe>Tm(_)?%l{s07;q3d)0Hd81bcFU_r2&*9`iS|nOI6*b$K4U213 zs6J8e*of9gQ05AFF!~Gnz~HfQH6~5(G5Pe`z{LyMQSh@d@RYF=*QSU?XdZ+`5Y>-O!7o) zvU|21itpq?&E@JlvHV?*Chp9yNS*(Fpaj&9x(@i?c$>8q%zn^r-l`EpUttmWF(~VJ z5+#kKgwF|#FEYc~cENo*k0V|H{^1T*WvTZJU&sl?K(n^|6AL`_HDxQ5IGXp`^Xi~Z zZq{0lP8Eg8YdWV+vMulic0{yIS}k>E_`A@j6?^-;7hAC3$;{2JVf(EPoh!M!tq2>K zA3s9Dg4pQU)bEG(DU7u#G^~|aadvs;+zm%{{TT+7Z*R)c$O+O~(&3u?w@pEW)~ql@ zDLjQ`g@*e;4~%8udoBzpA$rdDJL?~HECUa7>6>mcrX59i!I2EBI?F3-*LaR24OOLL zkl3JY?tBVyKSF72F1|wgJXgCSJVX6b@gPB0ib!WQ$b#WU8Gqz(7a=OktN5_}+yslj zb74pZlvMQ{b-X-<1xl#M5`B+aHSL-l=mP^C%ox6)zSSHR*^s_d^mYW&@~Yip2<-Op zJnHg8QO}PBF&WsTJ6WcU-xY2vHi#sCx%MV}DIKmO^s4=a64w-)CZ{5&O;^QwyfQ|+ z$j}B$`EVV7sA-f<f*7{Xo1j3DVVM9qPWKyPgxFN&xTc zG41GaKeMA}J*%mf)MKHRb8iseP)P|a=ej$wW`8A%N9?VO?BLeJ?-AG%NsFvnae=}% z6w~D0ig++ynufW*D7V1iK4Qt~6M2TuX(;l>223c?y@tca445Ghjfl7xm>fDcoL`YB z#j7rzw~#Kg(jpat<#6|syMZIWv|gUKQMFD zKu-v~Fvxb|&?m#Xdf_Gb*aD-v6yT&=s>YfBSAb%uT`qB3Xx3e?rtBIELm0F^>iAeF zar@_%qjhE0y77q?pob8dVX5V`Gw3EDtV6-Zt@agQG3rd<4SI_x7m$Im2d7~x8S*x- zO{MhhWF!Iy+O>%!JskjJ=vqu`>7*2RL$IQ^nb+C{TjT*=_VLnGx-N=Yl9&kQ#-oPpwg4h*D*^=?1<3XjLh~-MJ&-kc|I_d==_PmnNURr_DFlZNSKa8;# z*W+F2TfPn*trDZ3au~i%bHg4M4i)CZMBsd^P1Om+K>_TI`lKB;O)g1x?6;(0d^*ik zJ9e2LnCJy4B*b{2;k8O%IHKI(+y<{7$+GXCCsbTGpSY9}!nA8UlJ2c^2Ib^OwSE%g z%HTKb>Kv2KN`asDT5^?oJH{D*QBleQdQO-|4eUT4U|Qps4%6&?J5gebACibn_uElf z1wqSrH@sn->m=}IG-XeR{@LPOWwrocyLAUV+SJs5H*@_OwfpF?v5Tt(F)t`KROj~( zqG4wilJF|uG3wSO!TgDrn~2{>qFQFrHtB!tI(`>r7LDYi|6M)5ER=$IZT?EVXX5|An3e|HYl&4f zXJ*;IuZ{mE;WG`Afy?f80PvRsFo0gP82}!fvFr|4+ya2$P!|9=)MeQ-I>ZCOB3knD_wMs@15(yik1 z&2N6s+`s#|pZj^HVAF?DfBw_!e*ysD&+FE{w;2GQ!~gmm@WS)>2iG?+fAS~V>gd$~ zaG5{TxpM~o^Nah}#%BV6SNY^0H!njT4gcl*18cS&*pild;NZ@T6kz|(Pxc)M+Lv@l{uT zKD)PG=z6d4n#cYX+WwbwfahOw+f#DBaOK#?K-bc9`{~z}e-iPDyRf6Y#qUZ67@FL9p+G#Oij3c|JYNDH+s`i+V4kWqdxk zhGRahmTIK>Mva(C!Iav$I;vVTF!%4TXUex^BqZ-XG->vLbEH)k) z+;6Q;0Lnb?8*bTJb(0GvrXP?wH&io0r`EmyJczh#Op^t<=%t1_Ynv1^uJQ{xt}bby z-4bW6cmPvxHGWIwh8k`@n!GME{m@EKc2D8OPc+L)nplgxjtc11xNdJUU0!0X=cIPF z$YXs?X+vK+8L8APE7m39SiYIDiV{(#-clq*|K8>1EM~B+wSe{ZQ}4f6#U zdE8q@r%?P*RlCRw)4BJPLCj@CX2X;{U>*%NR}s*q0O!DyQ2j1`7Z7pFxwL^zn|w=3 znrqU}MWng*bzLKi#Jn4!I-P?qu*@&ESi)HE%S(pXa_38`<6(PS#J6)_0Ew=igF%3a zJ`DfH{B#70$t1%O!dxePVBe(u}`$G+1J~gn_4rtd;E7IS(=oJ$?ug_`q>Xwu}Om&v*NuUYRy4V zay5l3dsifYE>%$?oDji#Wi*kYj-O4PfHCfAHG{zq$i{*VyvmEICQFgP>MvV+j} z`$YvTmv$fdM`{F1;`!)|0*|cDjgpa^E&yAcnN)GTx)GrjcAx$(hpaJkW2zR%1J)Ud z|D=Q8g!M5;nDme7fw8K`I~vaL=?@|fiby|=!e{vMJ>;)j%nOZD*6>))aDa}?aGk1K zF&iG5w0yHNz!MyWcO>)4~uDu z$06)?8}iB$!0BFrbKS3)`V9dxvaz9AKYrPiko9rNF;AKGHD2S%SYA`B&AOr_(q`*8 z?RjHF6w2Txo~|wl6brju4`6T)`8zcp1g@9OzE81_y-&)KBJE;Z?k&z}4Z15EfkMRU zq8#eAsZmY!T3s6UN{r`)w{<&%a)uYiwy||NVhAyJTN1gMP*>+ zIwdV-KxH19*G?Bo<9Ztjod#dIpH93wxw^C>Nla9?+j}_CU0jxHQK>XYwx2%zi4gS3H}4-k-WM^W8w7V#E7qnVnz6}FV1Vb$O0)%7CZ-z8mO^| z25aJwzMFP7<&;#L3^B`jrUafL)FEEok!=gVUNGF zNM3t{d}Ef+>;c_|&UeD^d-LGgP*T$5Jy0`9j)3J<3H3N^sOUSLw17f@6Xg}NB|{d4 zYc!49P&6VU)8X?2J(gvh(ebk;U8~(pRTyHOM;3OG>1xV-2Opviy_}ATtn=BaC55dt zoY8IV)DxE~WWF==I{!Ci{RX2O3?P4py7`+2&PNO7D(^psw>Nd=Zj%b7D`I)3R--MT z#Z2|OpsR@;u=mwCVB}?@pHZgKGEI3zxc6qm3)>Xp4T*DzFd9|H8>jOO7KTo*gg{?| zE_T8}7zO2=qNsA{P&4!}q*?(TneItZ;Ze^9%cdH_EMhdF`RClX_?m0GA2zaN$#bBK z6#f}L`|o|kcy$!3qZz5;xE@^NLJcppHj^l+2Q{L)VL=lTq!lE9Sf7y)Tu^9{x0a)= zM$2i^x4ED#(^=+Y7#fmQ7!1{O0r9-4LXrRvt^SMmX2&<nFzV%hPLY(>ml2m zyW3&!3e}zu9*B>P@*mcP7F#KUgHc{6Gvmcs;+7WuSEP@~2h=NB1|_`DPFf>}3y0gtcGt67l|EteCngy^7tWyt2lEiR|z(n{Fjr=z!+ zlhGx92VIi$%v-N^LFv&fBE5vJYz{TDiA1Vw=$QMn?I#$SmeZDo<0uDkGfuipWQ5OS8;qJOe@Fvx8CXWi*x18 zxN5XD!7Vj{-P39jdisv--nrtUu+Nhs4qeyxd`333HM4a(tzS?fg8o!JFketd@h(`7 z-JY5EfSRgpL{rHzG$nGD5tFPy=j)NUv&AJ$7f#(@(XJygY-;clV655wT*&Vv<&*Py z=ZXB;w%t1iUo!73BmDCo#r0Pd|iz#_oig9hRCo&8nyc& zd8_T+Aj3}b2AZiMhirP8k%oqsL6=sB&=I4G>N*00_eVu>TzT3yptoSgD%w<{ukuI2 z7$wl*wj}eB%s*M;HHI_PVGZ5ZdxpwKAo)65k*k&^KgsgUiLgBUrNtSL-#=2+b=^ukiOKzJMRB5Iivpg@1 ztinDXKsQj#tg%vjRUteP!?Pj&4I#FU4>}s>0XEUkd1g$ zC>i*CgnjT*19(?K95)PoVIjvBAO~4e&261oG(8{_x_16@zQ6;niGia`7KS3XcqunA>!e-u z9qDKylU(L0L^R|Q2lu@agW=__Y9&izpi_tX_PP-+uxyU!5lN8u-{3Qt z%+&}F>FEC>C3>qVX^>47)J<*gt?_L&vqzyzC=1r($vzx$4pGsefbP?6jA4bV7Rzo6 z=GxlDN*_<@zGGJ|N4_+`?uD)z*f*3C`6(s8@7HDF2wkyg;HvOm#J4zsq zz!d=oyiBdY;Moh27^JyclA@TX2*h>feoUar9Ba$ZNfzUZUO=BLP{!c*mjHzI&e<2= z&40RTds4Pe)RFpQc`kZE{*Ab~21D3^WEHI_XQ{WT3p=Mih3f()yyvW;z(KghNm~?= zoEQ%@Q;&n0Hj1gyI@oHmRPo z`w$-|+`M31xq7@<>G5};g|LK3wi@sSi%+(+SSqFMjNRN}#9v(O8+>KP)v>x2nT!wR zh|}Dw)zM?Kwbg2$9zUBNxsbb6UJGJokXvLK#}F=tv;;WZoZYqwF^~ANBJW=d`+uJ3 z$*QcfmZIwyhkJ2_0axRGBz`$CYd#Uo7+2%z)=Hw>fEG~Re|x!FY>aQ~jO!CifmU0M zzLTbi2Q-=BDHkIO8FD2h0IXY0T#beME*Qaadu&PkUZzi$L^~zy;cMJzpD_8imQ`Qd zjx=!>2?53nw_-{hV90G_iKA_19%dzCg8}Jj1f{t+wvZ-m<3tBZluca!l~uv!8gEPh zWA#qGbw=6Kd=L;X_P&r!oSzG%zYq~f*-MtPPFRWs5Xni)c(L-r<~~PpTmJar;2#02 z7&CKEsIhc)X)`VWd+`4;!Nix*(21yDngW83P_O>4zw(>SOcw6E@2*ih986 zjr{^9;uTS~vN_XF7m}7j1>XAzN4t`__(t%Krv4n;4? za2t<5oJX=!lYlcHWe3`%QcOiUJ|VgD_#hr*b)Fi*ou49UD!#cAou96Hy1gx#+}q6> zkB{$pBYch0{C4`MDj}8DFc;5Ld`Yn3lbT@Q9Y^L^3TUNOxTGItFV$t5(UF=g(K-kG z7p*RH;qB^!Yf2(nsj_`kpbTorhMK1W3;RwbVC4?>3ruEf9dXQjPIM`mk6Q#GfsAO? z94La?&=G-4E@uKz9GhjOZXu^dXFZ_KQ6oL|a{k-8YBThUGSoq5X2YluD;04O1KM}1 z3?9StbQ_Efr=i2goVk0P?#lnM)P9>w#kd{QBxfkycaVS5y2)1VzX5mE7<-m7uw2OY zbBam^)J=#=Be_Mc;;x;Fo2oa&)ONeGF4$0BmE5Sfl8O}1%v+nx{M4&oQEC}Tcilm0E6OIWO{tj6Jprd#OId~l24v^+f$tc*Ox|LVC8w>N{QvBrN%Y{)T zrB%t|Hh3#s!7nr)YuC*MU~iNG`4!L+tsZ{w*o>>0Q}N_Pw%dN6uTdmy$ypu(wLZCQ z?lOKEJQTX~Y`LdB6sd@hFcsgK2k0D!>F?O=%sEH}v?N)fQ9Dm_&BHxwyL@5Q`sBu7 zV1Q9O zyXDn|0jmfoj8vC+*=jfAQZ0bV=LLENmyHIVt+Ss zlpEN!0NYySu;#3jOS0s0R8~l%C0lk!5t;|b6)5PA%VKHT#;i~M#q;1Y9vZ64Tr?FC zkCul?TUtn!-&@9K6~MdXgb6=KMt@WREe?Wg<=>Ic+|Wk_xtYerREc3{tnVYq_bWBj z^#`=#7W{Crf^{smi|Gr=@l2popt|*@O3@{+N4Ttz>TP#G*PXaFl<2QvL9}V=nr=fMZZ$g#3>p%M-5OY9#9;?ZOB&HTw8KW zHTWZND8|zfwV524yA)7Ov(07KTS#x|dG-#9q#^<@MffMqGWW%+>6)k|`2G|J`?mPn z;YoSkU5^l`)MJJ;Hko>uB^m5qF%RHc;<#DsSV_J;r5U9104QPlEz@IeVNiy|}j1w<;xdi(A5h1sI+mMs+ z5Xmg7N;9-oWVy|{j)CYPDEG&G9CI9e zU1uyiIdqK!_G>No&B^4&$Km%T;0xEM$m`>$M~-d^h?T^Kd+*jJQCm>T;L+EK=Kj|_ zt^6hKCb?zS>t^d~j7M4lZ0Mc`bRSPbsP>n+Zzi>Zca!i|O0XnD&l-d(c`H>Vi~UallM5!&@oZOeKU zovrM-jOfFY6*e=3VCSpkEufvM;BGV;sjgD4rNSx1Ow^kOrXnbnJ^_a~vhGZ=rWM&v z@XFR*`z0(#=JQr5BeY$oIL6|quO+K>LxVUA9`kh43vg41%AnyZnMkio| z6`KAUU-Q|=^E_=Qi3XR+NN!`+cHffYS1vP�L`<_r=KkdMR;cUhu0^WKfwQ&PAw2ibqOInhwQa;6g5p zKkmRi?#UP?@7&=QVZJzW?j$6g&~K0@ll`hxT-=t>zAfkB>+mrvKTZgwe;P0>aN0Br zxUOOu(y#a-S82D{wyL(Nv8W8naF8PJ(UdJG*~YAKewnAfgXz_y+qrxT*(~T~eklE+ z6^bPsfFrT;fUAuAfevU7`9WMYe>eL>3jOTaw4tvoGOoXo#-@xcnr;Ph#Y$_`gh#f& zcejA4%-@OUt$1;9n|5rnmMep9#vo{-hDr6V@4AM`xO3i2wV7?WdABE9{?!U4;u839 zuL$K#r~A)Olctj`;3w^!$tP0Kw3Sfz4&!QP?`&B6&9Z7RxEeeNrCXWivQS3|CrH^e zntK%@H9QwaL>6)gw(85k1OC(co=?=TcKHMOiTkXDjmn z8j9zLc#>B8rb0W&%niR=!Lz%LDjCW(?CBaK(^CS0?y z*4aDGj!I}z{&LJ&9K(C$q7~H#NaDq}Wk73%)BgH&86Zz!`T0Gi zcq4Ov#2B}TjyfHupp)74$Zb6K=S)#Oja5@aiMBwi&nXk`V6 z0t+A3I%;&Gfz$1u9T67m=}hSM-i`~}d&>NeXt7-W?qR(WRx&4=xSgH%lU+8Aqfuya87@`eow|UjLy+;pcJDQe zI{VrZk2rrSBpNiYkK5+`g(Fljh{knGAg0Nlq?!loksC{zTcXVO)#$_z3EdKfknOfV z4KH4FO!FXZ6B@5qif@PKhPFE@@Ja!T=7vTPT?@zlY@=q}u}Gpo;dM5xE>O@m2Qm#P3$7l_jX8COA3RtPcvx!&#WWsCza zRxVcGM?((BD8*ZfEI9Af&?|h=EfkuIQE^Gdz0iPe?fhUS;2Qe3!I&pJ_Bf@a#q!GV zy87*KiPttkSlOBq#~sevUI|&0*_L~2xx&%=3WAT4xNJwH*jCdjB0kR`C$ybEoHtls zOssmY6`7+p*vV7}<9nC7H?EBqD=BZw$I6?yH)$1M`-n@@En)vPT|!;;YXbg#_M9B* zXsl?@9}qEllEG6eJg->LSIm~mlZYm(rJ6u-MrAYlYG}=7^C>a|&q?ZpB0Ai+-Tm`H z(fR=$>&B^(P1u9kZ>pQ@uG9hAtMvi+wH$Uc(_i-um_ae^yzOdr;C1eFjId9(k?>z7 z9W~g%lKbaU+)uhkt)94n6szg}a&@Shj@4IS zO3*Z4Ns}Qi33%AaXs({nT4#LsG{By*O=?0(5g^a%3)-QYKAbQ@- zwWN?^P@h;9fj4Ed1axS-0dK<30~ilFC5jbBy&l3xj7IVD9%L#DodiT=O@{Ffh4%Gs zY!st04Gt=Iku9?TsR3K2iNN~Wp>OtqF)0K4Uv1MVJ(T1Ym&9w-aV>+rFPRw#i>g6- zQT2!#l~B3wPbg;WkCtBv1{M;-t>D{Cm=@E`z0yU+B&NUX5W7GFrC^L{_PhK+1F0^S zSF+Zp%(TC#EmE2LQ^Ro1jr9|eDT_q)$+a{#nIaKgRzR_x6EjxfEyg%=C}Wc(IRTq{ z)o8JKRUFot7<3cE#x7UiKeY?}NgVkl(==GF2dOjj`2RLw_p4wnGQV~p$>$V~bAPW` zM&)+zIGvkLG#D-{2KS58i1UQraY?bM7PjG zT@AD%r)_&}9W{QOE0cE5fCz6xYO3XnBc|P$(!+8>=#e|j^g*bi)4U%?>f7lKCZh;% z3od0uTcpHdrlB;W7kL}pE^WzbGl@th@Fi=q1Hn}K={9kInsxF^)(O%qRW6#lpS2Np z+8*9q+NG=IP{f~b#px%pwG-Oilsy=#K7Dp-st*UqA=+^L8p14W$jSB0kw^`<^M_?R ze3~;^*gZs2(=6m+XPm;`mHyBmQDhy8)`be{f<>3J*KF+)7d$Qx4>^AsdWb#$h{Th( zdKl6-$$S#kf!_7DGnv^IjR+=(G+LO4JXnNb^A2vbT+}w>zl^rhfU6_jT=c2-$>U#c zFkl%o^Y;5}rlOwal1QDONp7AmJQFN?nWu@GgL!ajtEkx8>~^L?D)-R@*W)$?a{vu< zw!i|`@J%r95A)k2uolx+0(CyS)q!K(qI4Tk6+z_$c(>N#K7p&4NvV3_o-f2$mwX&A zawg|Pu+tdpeM;sKan&CdgLd(K?2*R~!iRU#SFy9s6-MsWuxvZieQ2&?xrK%)G&$?8CFzKAVCI zV70D}d+Rh!EKJfc?;ZEVa5D<7XsmfI=dSV0`T-HCKdycv4K-I%uTK+*hn`o>3%cX+~T6 zMTPW4I4y2)n#jcBlaE3VbNVv2jpY4Er{nKdq_I;uz6Bl=xjPDbBb)|LS0bR%c1gFp zlSb;W07e?Y>StthbQ+99r&z9&)UUX}QyY$tf63j4-SN)T&R^kOD)Ab|bAX|MrU`)} zjinMiXJKK@2A*jZmB;Y(gxIgFw?El=L&VDN#`V01px#7 zBJ6oAWHwYW*So96w*VQKX6q?)fkr6INgIgQ?xOne)a#Y`IhHgGmVka;YWG%nV3kTx z15JHD+`H~?dfk5*=2RsCF^t`RsYGiqvQF(DChts4ZnyC}d$d#E1(=F+xb77mw)T*X z>4hOD0HeJe8@Y9wx=l9dxjM}|_mKlFozqoqbP}MJrCn;fJ zIMi*ld9UL@E!to<>UQ^!Jb-VpdKY+l#wwq!aG9i!$xZ@%h*U51FT*-DaL9w1%I^GM zroZamkKHqIMK(pJ2FC6ekIbJ7ta<7H&f{O=h7YvI?WpIl`KWVTXGj91iy2oX$?f`f zx0!iqPtSpqc^L0#)y-Jt?{%&8B>RBdxS%%yI8(iGBTJ2s1Pdt`F!DzZ)8xE?ac16` za(p~t#e_pqqX<=J8dgrXm@of)m?J|MrC31g0P{zt~UVOfSn-56W&__$fpn=4_zB^E8;Wc zRM^$H!+Fe^dD37>xG4iD{7%nrzUEXa`V>eHs+bU)vrgdXnHZ*rM^LZ@Z3fr$K*84I zr)X2IP4l&9SF8NFLwJkWQbV$8VWZPB{s!@m(Na2Nm6S93CY3F}aLRzi=DE~pl&R(n zQH&ie1M}BDvUzTLT08mi1QDv80NMD_+(h+ibHM4FZp~Q5;ur?yK$v-?SZl*RA|KJt zKDQlc-YMVi6?3WL5<1Got4bRV(l#S&X5P|2PCTSWtaJ&G?A69JZIZgOQ2ZSMsOf;M z7q?dU8uxP__>2(4ol*Oi0u!AqHUk3vTg*#=D^Hym{hz7kU^D1`lJ|3{ZYRT4Yey&* zIGGQ2(W1VMhZU z4MPj@Ie`VC$9Tg?DpzUW?(+pKDQ$M+Bt3^aqTmBVo1;R8J?PYs8GZI1e(Q9Mh6T(6 z7ILmiR2LI59iUly-|THzIf0sM35uR%;|Q06YtKRBWg8j z;)#PT^c8auNqDM|_PsPnjD2j%<1W2@yxY)MEmfHE(DQQ)x2L9StUUTHIiG7L&*CbNvQX z&tmfLFSY!?6%(}GebswUzR=3SG~hw7_UWCq$5JXKS1}_G&G?ts27i~OE+7fdF7hlU z&v5daH_QJ2JUbZCHTkl(^IA3j9msQAGWoFsm^u0J+Ew?-kLN2Vzd!q@XVI9%!82?; zI}VdLct#G-sB#hq&$7d_T#3WrnLKzV4<_m0nLKzV4<>Q&OddRw2a`B>CJ&y;0~`j= zioSbmETwYUu;V%XL7X=Re%O!b_ z1%Pvgx$q|E{}}+6LqS!ZX2KXd4=ez1rti<-8#$UY;*oMV8+V*bSRgLaFCqYd@k60; z+UNk>MMG^}ZIcj#SQr2Rtc6%x-X{8N6;lYa#*)dXQLAnB?%K+wN-u|2@x|OwsC<#y)1uzCZBP zlDuX{hdR$x+d9xDP&WB;oS8I*I8mO*ZDrk}HP_o3)vPw)ZNW))3N=h&uLtE)Z zgEftD8phJMq8%osx0s~TWA`C4(xZ~IVU8vPx=Xb@!%6nHFCL$T>f6%@W8sZm&o6?)*G zP(w%_P1IyFg`0vb!*#)Fqq8WWv#NAIY0$DvS@-KfFgwU_1}9A2azd^&CU6#7UU(0l;_eN7U7r#V zg|>ejB9jg^ik1g`EYW9Ae(gH@B|TqT&S$Xb(>P#~JNillHPZ{Ej18dW-C9&hAuOG# ziBi+3*nO}&y=+XWq?QUfAd%Di1&F_}i-k1FYn}1hYm07V>S|s%^o)mbN~otFZR6Dw ztSjXle@xe2!(6}7GqP{>@AL_U>zH}PV;6YrSh6d}x~$YpkoKd+8qMT-DJ*=ly`v*B zu?9+9+CJB!H>tQT;z5FYGZAmrFe^sq;g6z#0SVvulsvA@{ao|bfqo^86klBOge6Yr)OV3@4k2xaFjj_Yhc{AYHr@q&8A6%^_YAf=I>-`NiV)I_ z>D}Dj;4g;9VpE|v%a(Z~=NLN=$ zb%kCiCcc>WJ{ClE3hq5Opgu2md}-3$*%+c+HIr)4DU&JOEG_ORAY6VKSSZ0DzR%97 zFia1yZI`>8 z>f$b3Y`_B`s!hBd(s|yTF>szZk4Y3T3rZv3Z`=d7G6Z5=MqL-(lSim%hupWh?I24?+>6(ZqZ DTVZMM literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/worldhandler/textures/misc/note.png b/src/main/resources/assets/worldhandler/textures/misc/note.png new file mode 100644 index 0000000000000000000000000000000000000000..ee6a1aea9ed677c4570023c14b8f3f8ec67f4a22 GIT binary patch literal 1698 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K58911MRQ8&P5Fo{p?&#~tz_78O`%fY(0|PTd zfKP}kP@Id4OHxu&O-(H{G<3m&1t(9Qym8~k)2C1W|Njq^9R;HyFpNVW=118JP(~>U z@(Ttg_>l}4g1@t?0;8I+7bUzTK|Pz;L&YA80Lv z#FGB19$sW(U~o_em2W^`3*<03Y`+iWLP)SEh&T|v_d^EbkNAf7>%Sga{PjG;`qFM8LG+7n)iCnQ=f~^}3=Mv45cw*W4@@6cy0cZhXMLc{kZWsjp#Qtx zbh)@+%nyRO8EPM1{Qc|v)!&B}e>Xkw@%54Y7tXOQn9J*6E!|LN#_%?W;nq!t jEt?rLhP{M)b=^PKDXRBfz6+OjfI`pH)z4*}Q$iB}e@Xkp literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/worldhandler/textures/skins/vanilla/vanilla.png b/src/main/resources/assets/worldhandler/textures/skins/vanilla/vanilla.png new file mode 100644 index 0000000000000000000000000000000000000000..69ce514d9e2ea5ffd59e50751992911d194433c7 GIT binary patch literal 1639 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K58911MRQ8&P5Fo{p?&#~tz_78O`%fY(0|PTd zfKP}kP&_m=^w_au|Ns97vPZ#a2#lx@P@L2510#LT=By}Z;C1rt33J=4@yqf}rZp7nHb z45^5Fd)YCM$x(piAnU*X&o*B7W2|3s!u#MIt0jBS?fhmne_iq3Z@+|gh`q13wP&hl zIKNe{fBOO63$Fu!w!EkV5)2H(mNS{5Kfj^)?*He%m@LBcz4yM~&sb;Qyz^iG{@=fL zN;Z_4F}%%TxOJ0Z%Vx%mbmj}^*cQy?b+DGEw?r@VoX^aRvy|)qubj{ciV#m%KbLh* G2~7Y9!qB+@ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/worldhandler/textures/skins/vanilla/vanilla_buttons.png b/src/main/resources/assets/worldhandler/textures/skins/vanilla/vanilla_buttons.png new file mode 100644 index 0000000000000000000000000000000000000000..fe7b0b53624d9904e84c013fef32d69931193d67 GIT binary patch literal 6657 zcmeHr^-~mH*!?aIA|W89gfvTsbSfyZ2um)pbS^BpbcrA$DJdP&Exo&dAOg~|5-yE& zBP}6cJ~Q9{;hlHpedgSG?wq+lojdoQIZuqP&WrnGOk@B6;J(Jo=MVq@c((-tNbv6( zyxPRzt`Rt@fK>p1&x!Z0tqB1De1NXDf!ZC<$;rvZ#l_9d&BMdP%gf8h$H&jl4+4P% z1Ox;H1%-r!goTAgL_|bIMa9I##KpxWBqX%8wZUNUt5>gdb#?Xh^dJz3zP`SJfq|i+ zp^=f1v9YmTffk3#syL)(eczSwzdwcu%_#lx;UteE8KR)Hci1F5ApL$J`;;!Z8o#lyB)=VChn5bq9Enwd*Gvw_;nw9ZKxn zOC3DR-27VH{9D`uTRrX&)aDu7<`shS2}L2p(7xdq|A_X$$o8P9j^MX<=nQ@LrMS4b zw6wIWtgO7eyt1;gs;a8Gx;p%Q*X!8sh`8>^gs*RtdZIskdzbv}eM)a^YHw^>UtC&W ze0qQ4$NtvtTh!NE^tapg-rJ78+b`d5yT0Fc58n0+-`>@o{{L71g9uM%~>L{Io8`NRk#N%^j($1 z|C2#8VVW0C_gSNiOXMQ?)J8MeDpj44@Ra6L<9>n^{d$*4RBRyq5 zawaMQWvCH~jorxjMDK}h`0G=L)Ta{6kx4v3pp01i@RDr*5>xJ6T&ovLf3SHaonx(d zI3K-JyX|8FBIFa}Y>tz-l^lrrg3CqeoW- zYcX}jm?5rMM^KU}Uh~w=r3k`LhhL!bF<4+gI8g{=Wmpl(j+bM>2yuGXuIyo>=?8`s zyWB^7Y}3l{?l4Ve4ksx(jYTS^d46Yu<6Qlp%&<+i_ayu!X@4EF%a`)Ra69_eHAmrx zLCr&c;Ffx`_%!r|;?&^AR>D!V9j5>yPrf-}n%B(QSZmaz+Hffe@++-F6UJP}$5;<7?7UVrAVfWW7SL>Iorl>qaltm$y9zN@&YWvlk))iS^15Lbgsi)OeI;bE1 zD?bUzX4CW6l!|G8jGpL=?+9L2xnlcH`5!}>>34ua7&h_ejD-!wHh=Rt(obWLeID;3 zCYTOJ&2TH7nKgk11m*=}Y=={53EAW4Yy+Z#RXKHAk7_`q7wVG2+)jayYK^EEM5gQC zjQ8CqQ>^xE!>2)e6zY-|l!_)Y(M~bb)ulGRuaR(4&xD^=5{00rS08=*DafAUa_oJ4 zAa*ljl__An<6TUDFooLOpCerTq&_6ORO4;%oo@;U!N3d_u$etlrwG0AIIpg?$h-ep zrJFp-%OJV59KgDiO+t^-QWkc$DUO%C!>=oZe{2I9mQjP8-Elc~n11^rvS{QtH2ytxSD2#6{EaJ~JCc5}s;en5R_tO*}fSKG=l$ z!qT9X_Q%ldHj;?4S%unU0sCr?{KGhzT)h$VqcRHKD2k|-H?AA`2<3EKR?_2(3R(TP z%eQjg$oI+-Ee|K`YP<;2$g&M+WeBS+K+U3-mG^BJ%dL3H61z{n6;grV&UAuug_Wn^k&`9;Ha5iH!_@uF;rFsf^PHq0B z-mWSY)kKFPmM}LK!{6*qnAIPBpc&%vu+!I&62p6~=36eBz9v8~TlRHSX_DGn_LaNU zOGexCqGPo6$E%!c^!^kbuob_HG2-h&UVNXN`>auEhT(l|#Ha5%!gi5H9sh21@fs$3 zbuz5z==;$k=R}|P)B-cb<~s#Je}{UFuJ*&*o)xIf77ckOxzzSiZ{m%~ZSB7DK$2JP zM-c7myWn7gkz)Z@Q|c5@8siOG9!^$ zTr}@iTC2;Cr(<3_a;x|h;Q_v7TWv~p=aUA6g^K-M3%gpq`8(jVKSwkE=|x|j{NF)^ z&cLIK@s<8pd52@6eG*Gs6)fC9xvS8lldY5&mWmGMpAs`e8oN$p8w|fYMVGx|Ra#~} ze%iH~k;rnxgU_^bo|YQy+!t^!Kd&P2dM$;=b-mnzAiPB{-G?S<>qslvA*;lKc?+2$ z0JneHl*PArE!*z?WE!_5xaBMBM!@)L)>(YZ715F+;p~S+s(;w_H8thYoXuSbEPafX zaBhY!sC&15qOJgAQ@ck6JA=p@1csi@?mWeHN9HXA20Acj3ruC{IEteJnn?iAdukQ9 zAGj_;sIv&e=llPprbVOknP*(fY8>De<;7qY^3!Bk*?e#L{@xk7zAe*1gGfFGh5ftq zFq}kg?v>d*Sf5i>Q@W*_x!0m)gQFv}m=|Bwr&z2n4*RyDo9f8UeEKZ9C_>pI7fDzDcMzrlZ!)$EMcQ8-R~G z_8p|)czG%8<&Y=x`p<)kv%u70wyPA?pJZM@%jPw+G}23JCVKi=prDajI>3_F&x5ZZ z%x=Z|mxzd1HXcOewoShJ1rFQSid1|Y z{?7!s+!aPQhf_E|*k!CI%&e+c@wpGn*(-nm(LSYOu&asTa+QvYYx)m(GtX}(hS54< zd%*>LQD%N#~=?7k_cS%Wh&COrWVdAKx2E@WKtMesuuAMRr6>7*Sw9F9i2u7|Z~3Sr`|tPHRxv=^sxb3wKDfAPCVEp zxbQ&|QwiVvDiN^p*ATglhZeQhDG%QN_Xe@4f5>OQMc6$gf8z;t?sd8QIygu@~tC8!7ulIV?uzU&Vj^>1koEA_VFlK@DNXE@&<4 z44{2s^Xo4K6#d1*xc%r8m1-=A>)tyn^-ixU?7VJ&PVKva`082LgHJTNnOXw@E{|jk?ncp%mC=jFu8Q?Xj{MC79NAFne%2B+d z5iJ+pwXBNH)14Y#%A5D3mARMC5fQ46U=iGzM$r#xVEP7KOS33oUT4{x&z2h^CW6xd;DOrJH z^7&$0C2<&VQ^R(GKC_5MC-4FMG)bt7cPY6%;runQFm7NfdjLEN-nqWS0PPwPnlw%E zsf7FTz#xT+eoA*ZXjU(b&xce~y~Qg~L!=}M8G8o!c|S*}#XKS^T&dC<0 zPylfoRp}{-hReph40@Te;E)l37SfVq1`z`M;~d&ce+Lp24efEdRZ=%e`B;_Ex);4Y z=)qo(1STp$#LlF6Qk#i@8<+^2FkT!FweN!|(WYNmm~6nAKA z4>x3h9*vgq!+2ql4z!Q+*38V{5tfXy^r1i0yz}kX-pOXIi~#%KWo#w)2bcv69UO2v z4FbWds!ThZTF$EA+5$o_3)2wyG{b2loVrg%260ryD=4wch`|Hl)=O@APL|@)`=YXhWkfhN614j6c&4 zdAI}s7ui{~hDrFy+f6P?tR7eKiq*-b#V(rNRwUeOOp(+r3df_LT zhXooPw_Y-2d^ZU&suM6rZ|inZC{wYwqRm%tiLbT4Umd3m2;a`~9E`mx_1=If3+F4* zzk#9pt1^W1!fqAnge}{tuD+bSVHvZOcVs&IT@v!;VmaD)>`NmsNPZf^S^V=vR;(l0 zI-1qw;!UR|4zP>a7`we1NvPB9PJ-?I`Mq}AepK0cyFVFwkh3~O|LF-JF79aA-$~du zv}ai_kFxBkST6Z-dp^gw(r=mHQtLOFt2#}HO2U7Zp%M%V+3{}!^6OS!J7*^}&5$T6 zjJl~T9KccQeea~VH=YsomzhfDy_6rzk56zzRQCpEZfEAp|HL@SGe24o#tV;ooN0JO zGTr=PPLAU`%s)=1Kh)z|+v+6oJ{^7(-B)Y*mGjfhkA=(2BCM<5Pd%fMWo0YoE1%3a z!Bi)lu7uAObLvBrl~R+85*@1<#N-}OvQA;uPwIdO^=qO&i-!n$gAJGrYxm1C{IXMMm_OYdc0c>aCKYYZ}7nYr58PKOi zTOR(qDy(p+l7)c@6{1HDaS}`W{(TNB8cJhjKet3~SM21OS={JBulcN>*ful&T^sLB z>pr}=@R!IYJIo2@W{O-d&!?myhQ+0Jo5V4``qC|`{S(_6uxCD&D9E8>qVQNLd-cVO zL20`rB#t~U!sb2G(+@pImJBg^f_-caWlH`e?EX z#h1sDii|WyQc6aG4?a1w5>v@@+di+f=pHw|OFxQ7@~Px;Y|pkCBu?m$C#VsShsEPt zZeRq zaHzItX7JuCujgz3E+(SlxJ7d-4v%}D!2t+eXsOc{{-1$H_v+AqHn+W@O}jZ(Q)tnc zL4t-z_VT3Wx9^F38Dv0Z%?hh#dUTGc*kB;T=~Ef5+8OxZqctIErx+A_kq!^Dv}A&X z(09WZ&kUohcPW2(|56eY``t*mVRsvD)r8k@TpJBj?pr> z-$jxGTi+QB2*O#lYdFLs2(tSn4rt zmJ=zAW~B!#ae3&JmX#NR;>(`>m$ssh2cAZ9KYdvv;v?%-qbZIcosJsc+TC$SKFnhj zQ1C*^bNmvsq!Zy6-umG+DxvX6!#Cr`(L?Dxs)DVaG><|Y2x zNK%VCk9}Bit^YcC!^(fL>+6YAU%HpsgE^Wur`3?lGTF%fpZx1~U)TT;Rm1fjVTzbK z4DI8ph_t9$w~oTkRkQ+^H2>oH?0^Lbo(#tmeZrboE#h$$5z-2>c=W)MA9|#B`HSaw zjWbmUy^gc&6j3!cn&znomazi`9J%~wG6E1hVeRIo`fS=E21aSc z^_P&~82G<9E$AZFVowF~Kz~LW(j3^3UO5$f{nw*d$N5Fs_#ykPGtFK>5J!Z0cj9F} z+V+FnF;H{f{v)N03cyKelNd5Ve)J~{${j~^+oz7E4)#o?=Lha+j;aRMubeeq`_B7b zY{8A`xQ4%}?jbA(QnYGU1CziXJ zh!?MuCM+(Pwx~n+`|oF}k2<6|=pxz#^+&Jy?>$TOIpb-Q?enVr=B*Z`j1t>vlk27Sk$GP6xm_Iquy}7L_>gfxk*j_YOPM%9qRw-f!WC8yQ|>vp zmbpB){jn^JcI=c4G!}_aB6(LblN#~>bc{oidjp}Wh=aL%t9k25vLH5Ce;LoHtyv*y zvmrOtM*0&_-{0^BGBQW0MBGI_89-!ye!dff!8CU?pC+1N>b91age+(M_Ji9`ufi0p zmb(A#w{ZLJyD=}?1cq&_MB2U|Duxfs9m zurIBC^^1mVG&9}S7ztutznqv zkPXE%8%CWy#9rtV(%>0f?@UdQ*}0!@YiN~d8S*@Qks|QE>Pwd08=XtveH(zs-s0@S z{Gy!yA#n|0I`<0Ww15h74-0d@U6{(fq9EJ_5KwzvVbuPGb&W-~D=B6E+m2GAe-H3y z5l{ojQ>H%w)>ckF+gAcPcMiAw(%A)btG Uc;9Q5{~McYsOdbfRke!vf5(K$%K!iX literal 0 HcmV?d00001 diff --git a/src/main/resources/mcmod.info b/src/main/resources/mcmod.info new file mode 100644 index 0000000..0d6dc4c --- /dev/null +++ b/src/main/resources/mcmod.info @@ -0,0 +1,40 @@ +{ + "modListVersion": 2, + "modList": + [ + { + "modid": "worldhandler", + "name": "World Handler", + "description": "The World Handler provides a smart Gui for people without having to know any complex commands and gives them a look inside the art of Minecraft map and world making. Now anyone can easily create maps or just save a few ammount of time and provides an easy to use interface.", + "mcversion": "$mcversion", + "version": "$version", + "authorList": + [ + "Exopandora" + ], + "credits": "Exopandora: Author, fhfuih (samhzy): Simplified Chinese Translation", + "dependants": + [ + + ], + "dependencies": + [ + + ], + "parent": "", + "requiredMods": + [ + "forge", + "FML" + ], + "logoFile": "assets/worldhandler/textures/logo.png", + "screenshots": + [ + + ], + "updateUrl": "https://minecraft.curseforge.com/projects/world-handler-command-gui/files", + "url": "https://minecraft.curseforge.com/projects/world-handler-command-gui", + "useDependencyInformation": true + } + ] +} diff --git a/src/main/resources/pack.mcmeta b/src/main/resources/pack.mcmeta new file mode 100644 index 0000000..c1a03f5 --- /dev/null +++ b/src/main/resources/pack.mcmeta @@ -0,0 +1,7 @@ +{ + "pack": + { + "description": "World Handler Resources", + "pack_format": 3 + } +} diff --git a/version.json b/version.json index da1dea7..e0fda07 100644 --- a/version.json +++ b/version.json @@ -2,12 +2,12 @@ "homepage": "https://minecraft.curseforge.com/projects/world-handler-command-gui", "promos": { - "1.12.2-latest": "1.50", - "1.12.2-recommended": "1.50", - "1.12.1-latest": "1.50", - "1.12.1-recommended": "1.50", - "1.12-latest": "1.50", - "1.12-recommended": "1.50", + "1.12.2-latest": "2.0", + "1.12.2-recommended": "2.0", + "1.12.1-latest": "2.0", + "1.12.1-recommended": "2.0", + "1.12-latest": "2.0", + "1.12-recommended": "2.0", "1.11.2-latest": "1.46", "1.11.2-recommended": "1.46", "1.11-latest": "1.42", @@ -41,6 +41,7 @@ }, "1.12.2": { + "2.0": "- Recode 2.0\n- Added headline color as a config option\n- Added option tag and trigger for scoreboard players\n- Added reset for advancements\n- Updated config file format\n- Updated translations\n- Updated layout\n- Updated biome indicator (should work better with modded biomes)\n- Changed command syntax display\n- Changed /worldhandler show to /worldhandler display\n- Fixed setworldspawn and spawnpoint\n- Fixed equipment not working for summon\n- Fixed wrong translation for biome indicator settings\n- Fixed translation typo\n- Fixed potential config file issues\n- Fixed custom potions not having an item model\n- Fixed /worldhandler display not showing the mouse cursor\n- /worldhandler and /wh now work in multiplayer\n- Removed custom data from summon\n- Potions can now be combined if given as an item\n- Open source and signed", "1.50": "- Fixed Biome Indicator black screen", "1.49": "- Fixed Bone Block in Note Editor\n- Fixed missing translation", "1.48": "- Fixed crash for Forge Version 14.21.0.2348", @@ -48,6 +49,7 @@ }, "1.12.1": { + "2.0": "- Recodee 2.0\n- Added headline color as a config option\n- Added option tag and trigger for scoreboard players\n- Added reset for advancements\n- Updated config file format\n- Updated translations\n- Updated layout\n- Updated biome indicator (should work better with modded biomes)\n- Changed command syntax display\n- Changed /worldhandler show to /worldhandler display\n- Fixed setworldspawn and spawnpoint\n- Fixed equipment not working for summon\n- Fixed wrong translation for biome indicator settings\n- Fixed translation typo\n- Fixed potential config file issues\n- Fixed custom potions not having an item model\n- Fixed /worldhandler display not showing the mouse cursor\n- /worldhandler and /wh now work in multiplayer\n- Removed custom data from summon\n- Potions can now be combined if given as an item\n- Open source and signed", "1.50": "- Fixed Biome Indicator black screen", "1.49": "- Fixed Bone Block in Note Editor\n- Fixed missing translation", "1.48": "- Fixed crash for Forge Version 14.21.0.2348", @@ -55,6 +57,7 @@ }, "1.12": { + "2.0": "- Recodee 2.0\n- Added headline color as a config option\n- Added option tag and trigger for scoreboard players\n- Added reset for advancements\n- Updated config file format\n- Updated translations\n- Updated layout\n- Updated biome indicator (should work better with modded biomes)\n- Changed command syntax display\n- Changed /worldhandler show to /worldhandler display\n- Fixed setworldspawn and spawnpoint\n- Fixed equipment not working for summon\n- Fixed wrong translation for biome indicator settings\n- Fixed translation typo\n- Fixed potential config file issues\n- Fixed custom potions not having an item model\n- Fixed /worldhandler display not showing the mouse cursor\n- /worldhandler and /wh now work in multiplayer\n- Removed custom data from summon\n- Potions can now be combined if given as an item\n- Open source and signed", "1.50": "- Fixed Biome Indicator black screen", "1.49": "- Fixed Bone Block in Note Editor\n- Fixed missing translation", "1.48": "- Fixed crash for Forge Version 14.21.0.2348",