From 3316f7b6953a5d129ab12d74fadca35c0cfe13f2 Mon Sep 17 00:00:00 2001 From: Matthew Messinger Date: Sat, 1 Aug 2015 18:36:33 -0400 Subject: [PATCH] init --- .gitignore | 7 + build.gradle | 56 + gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 52271 bytes gradle/wrapper/gradle-wrapper.properties | 6 + gradlew | 164 ++ gradlew.bat | 90 + libs/liteloader-1.8-SNAPSHOT-mcpnames.jar | Bin 0 -> 632144 bytes settings.gradle | 1 + .../minelp/LiteModMineLittlePony.java | 20 + .../minelittlepony/minelp/MineLittlePony.java | 179 ++ .../java/com/minelittlepony/minelp/Pony.java | 447 +++++ .../com/minelittlepony/minelp/PonyConfig.java | 73 + .../com/minelittlepony/minelp/PonyLevel.java | 23 + .../minelittlepony/minelp/PonyManager.java | 262 +++ .../minelp/gui/FakeVoxelPropertyCheckBox.java | 77 + .../minelp/gui/MineLittlePonyGUI.java | 25 + .../minelp/gui/MineLittlePonyGUIMob.java | 24 + .../minelp/gui/VoxelPropertyIntSlider.java | 175 ++ .../minelp/hdskins/gui/EntityPonyModel.java | 10 + .../minelp/hdskins/gui/GuiSkinsMineLP.java | 684 +++++++ .../minelp/hdskins/gui/NewGuiSkinsMineLP.java | 48 + .../minelp/hdskins/gui/RenderPonyModel.java | 37 + .../minelp/model/ModelArmor.java | 21 + .../minelp/model/ModelHornGlow.java | 106 + .../minelp/model/ModelPony.java | 219 +++ .../minelittlepony/minelp/model/PMAPI.java | 55 + .../minelp/model/PlayerModel.java | 80 + .../minelp/model/ScalableModelBox.java | 84 + .../model/pony/armor/pm_newPonyArmor.java | 311 +++ .../pony/armor/pm_skeletonPonyArmor.java | 100 + .../model/pony/armor/pm_zombiePonyArmor.java | 104 + .../minelp/model/pony/armor/pma_Human.java | 14 + .../minelp/model/pony/armor/pma_newPony.java | 11 + .../model/pony/armor/pma_skeletonPony.java | 12 + .../model/pony/armor/pma_zombiePony.java | 12 + .../minelp/model/pony/pm_Human.java | 152 ++ .../minelp/model/pony/pm_newPonyAdv.java | 1707 +++++++++++++++++ .../minelp/model/pony/pm_skeletonPony.java | 136 ++ .../minelp/model/pony/pm_zombiePony.java | 104 + .../minelp/renderer/AniParams.java | 18 + .../minelp/renderer/CompressiveRendering.java | 89 + .../minelp/renderer/HornGlowRenderer.java | 235 +++ .../minelp/renderer/IRenderPony.java | 8 + .../minelp/renderer/PlaneRenderer.java | 444 +++++ .../minelp/renderer/RenderPony.java | 150 ++ .../minelp/renderer/RenderPonyMob.java | 135 ++ .../minelp/renderer/RenderPonySkeleton.java | 43 + .../minelp/renderer/RenderPonyVillager.java | 41 + .../minelp/renderer/RenderPonyZombie.java | 31 + .../renderer/ScalableModelRenderer.java | 313 +++ .../renderer/layer/LayerHeldPonyItem.java | 31 + .../minelp/renderer/layer/LayerPonyArmor.java | 295 +++ .../minelp/renderer/layer/LayerPonyCape.java | 29 + .../minelp/renderer/layer/LayerPonySkull.java | 117 ++ .../transformers/RenderPlayerTransformer.java | 12 + .../minelp/util/MineLPLogger.java | 75 + .../minelittlepony/minelp/util/MineLPObf.java | 17 + .../minelp/util/MineLPPrivateFields.java | 22 + .../minelp/util/MineLPRData.java | 210 ++ .../minelp/util/MineLPReflection.java | 508 +++++ .../liteloader/core/LiteLoaderFriend.java | 12 + .../core/api/LoadableModFileFriend.java | 11 + .../common/VoxelCommonLiteMod.java | 133 ++ .../voxelmodpack/hdskins/HDPrivateFields.java | 33 + .../voxelmodpack/hdskins/HDSkinDownload.java | 70 + .../voxelmodpack/hdskins/HDSkinManager.java | 234 +++ .../hdskins/ImageBufferDownloadHD.java | 59 + .../voxelmodpack/hdskins/PreviewTexture.java | 19 + .../hdskins/gui/EntityPlayerModel.java | 134 ++ .../voxelmodpack/hdskins/gui/GuiSkins.java | 638 ++++++ .../hdskins/gui/HDSkinsConfigPanel.java | 46 + .../hdskins/gui/RenderPlayerModel.java | 64 + .../voxelmodpack/hdskins/mod/HDSkinsMod.java | 7 + .../hdskins/mod/HDSkinsModCore.java | 79 + .../hdskins/mod/LiteModHDSkins.java | 19 + .../voxelmenu/IPanoramaRenderer.java | 15 + .../hdskins/textures/cubemaps/cubemap0_0.png | Bin 0 -> 11342 bytes .../hdskins/textures/cubemaps/cubemap0_1.png | Bin 0 -> 12143 bytes .../hdskins/textures/cubemaps/cubemap0_2.png | Bin 0 -> 11219 bytes .../hdskins/textures/cubemaps/cubemap0_3.png | Bin 0 -> 10714 bytes .../hdskins/textures/cubemaps/cubemap0_4.png | Bin 0 -> 10534 bytes .../hdskins/textures/cubemaps/cubemap0_5.png | Bin 0 -> 9282 bytes .../assets/hdskins/textures/mob/noskin.png | Bin 0 -> 1489 bytes .../assets/hdskins/textures/mob/tempskin.png | Bin 0 -> 1489 bytes .../textures/entity/pony/bpony_0.png | Bin 0 -> 1142 bytes .../textures/entity/pony/bpony_1.png | Bin 0 -> 1037 bytes .../textures/entity/pony/bpony_10.png | Bin 0 -> 941 bytes .../textures/entity/pony/bpony_100.png | Bin 0 -> 859 bytes .../textures/entity/pony/bpony_101.png | Bin 0 -> 3689 bytes .../textures/entity/pony/bpony_102.png | Bin 0 -> 3929 bytes .../textures/entity/pony/bpony_103.png | Bin 0 -> 4059 bytes .../textures/entity/pony/bpony_104.png | Bin 0 -> 859 bytes .../textures/entity/pony/bpony_105.png | Bin 0 -> 3584 bytes .../textures/entity/pony/bpony_106.png | Bin 0 -> 1760 bytes .../textures/entity/pony/bpony_107.png | Bin 0 -> 670 bytes .../textures/entity/pony/bpony_108.png | Bin 0 -> 1019 bytes .../textures/entity/pony/bpony_109.png | Bin 0 -> 986 bytes .../textures/entity/pony/bpony_11.png | Bin 0 -> 3767 bytes .../textures/entity/pony/bpony_110.png | Bin 0 -> 1019 bytes .../textures/entity/pony/bpony_111.png | Bin 0 -> 1033 bytes .../textures/entity/pony/bpony_112.png | Bin 0 -> 908 bytes .../textures/entity/pony/bpony_113.png | Bin 0 -> 1002 bytes .../textures/entity/pony/bpony_114.png | Bin 0 -> 885 bytes .../textures/entity/pony/bpony_115.png | Bin 0 -> 928 bytes .../textures/entity/pony/bpony_116.png | Bin 0 -> 3417 bytes .../textures/entity/pony/bpony_117.png | Bin 0 -> 3334 bytes .../textures/entity/pony/bpony_118.png | Bin 0 -> 972 bytes .../textures/entity/pony/bpony_119.png | Bin 0 -> 663 bytes .../textures/entity/pony/bpony_12.png | Bin 0 -> 1473 bytes .../textures/entity/pony/bpony_120.png | Bin 0 -> 1172 bytes .../textures/entity/pony/bpony_121.png | Bin 0 -> 872 bytes .../textures/entity/pony/bpony_122.png | Bin 0 -> 734 bytes .../textures/entity/pony/bpony_123.png | Bin 0 -> 1093 bytes .../textures/entity/pony/bpony_124.png | Bin 0 -> 1072 bytes .../textures/entity/pony/bpony_125.png | Bin 0 -> 905 bytes .../textures/entity/pony/bpony_126.png | Bin 0 -> 855 bytes .../textures/entity/pony/bpony_127.png | Bin 0 -> 951 bytes .../textures/entity/pony/bpony_128.png | Bin 0 -> 2108 bytes .../textures/entity/pony/bpony_129.png | Bin 0 -> 1287 bytes .../textures/entity/pony/bpony_13.png | Bin 0 -> 692 bytes .../textures/entity/pony/bpony_130.png | Bin 0 -> 666 bytes .../textures/entity/pony/bpony_131.png | Bin 0 -> 2369 bytes .../textures/entity/pony/bpony_132.png | Bin 0 -> 637 bytes .../textures/entity/pony/bpony_133.png | Bin 0 -> 865 bytes .../textures/entity/pony/bpony_134.png | Bin 0 -> 916 bytes .../textures/entity/pony/bpony_135.png | Bin 0 -> 1179 bytes .../textures/entity/pony/bpony_136.png | Bin 0 -> 961 bytes .../textures/entity/pony/bpony_137.png | Bin 0 -> 852 bytes .../textures/entity/pony/bpony_138.png | Bin 0 -> 3488 bytes .../textures/entity/pony/bpony_139.png | Bin 0 -> 825 bytes .../textures/entity/pony/bpony_14.png | Bin 0 -> 1619 bytes .../textures/entity/pony/bpony_140.png | Bin 0 -> 3611 bytes .../textures/entity/pony/bpony_15.png | Bin 0 -> 830 bytes .../textures/entity/pony/bpony_16.png | Bin 0 -> 1131 bytes .../textures/entity/pony/bpony_17.png | Bin 0 -> 926 bytes .../textures/entity/pony/bpony_18.png | Bin 0 -> 661 bytes .../textures/entity/pony/bpony_19.png | Bin 0 -> 816 bytes .../textures/entity/pony/bpony_2.png | Bin 0 -> 1867 bytes .../textures/entity/pony/bpony_20.png | Bin 0 -> 1584 bytes .../textures/entity/pony/bpony_21.png | Bin 0 -> 1025 bytes .../textures/entity/pony/bpony_22.png | Bin 0 -> 1090 bytes .../textures/entity/pony/bpony_23.png | Bin 0 -> 781 bytes .../textures/entity/pony/bpony_24.png | Bin 0 -> 723 bytes .../textures/entity/pony/bpony_25.png | Bin 0 -> 713 bytes .../textures/entity/pony/bpony_26.png | Bin 0 -> 784 bytes .../textures/entity/pony/bpony_27.png | Bin 0 -> 3532 bytes .../textures/entity/pony/bpony_28.png | Bin 0 -> 823 bytes .../textures/entity/pony/bpony_29.png | Bin 0 -> 1040 bytes .../textures/entity/pony/bpony_3.png | Bin 0 -> 1023 bytes .../textures/entity/pony/bpony_30.png | Bin 0 -> 1854 bytes .../textures/entity/pony/bpony_31.png | Bin 0 -> 3368 bytes .../textures/entity/pony/bpony_32.png | Bin 0 -> 690 bytes .../textures/entity/pony/bpony_33.png | Bin 0 -> 1008 bytes .../textures/entity/pony/bpony_34.png | Bin 0 -> 1135 bytes .../textures/entity/pony/bpony_35.png | Bin 0 -> 1599 bytes .../textures/entity/pony/bpony_36.png | Bin 0 -> 897 bytes .../textures/entity/pony/bpony_37.png | Bin 0 -> 770 bytes .../textures/entity/pony/bpony_38.png | Bin 0 -> 952 bytes .../textures/entity/pony/bpony_39.png | Bin 0 -> 711 bytes .../textures/entity/pony/bpony_4.png | Bin 0 -> 836 bytes .../textures/entity/pony/bpony_40.png | Bin 0 -> 3661 bytes .../textures/entity/pony/bpony_41.png | Bin 0 -> 894 bytes .../textures/entity/pony/bpony_42.png | Bin 0 -> 1119 bytes .../textures/entity/pony/bpony_43.png | Bin 0 -> 803 bytes .../textures/entity/pony/bpony_44.png | Bin 0 -> 2229 bytes .../textures/entity/pony/bpony_45.png | Bin 0 -> 1098 bytes .../textures/entity/pony/bpony_46.png | Bin 0 -> 1150 bytes .../textures/entity/pony/bpony_47.png | Bin 0 -> 955 bytes .../textures/entity/pony/bpony_48.png | Bin 0 -> 899 bytes .../textures/entity/pony/bpony_49.png | Bin 0 -> 843 bytes .../textures/entity/pony/bpony_5.png | Bin 0 -> 1695 bytes .../textures/entity/pony/bpony_50.png | Bin 0 -> 954 bytes .../textures/entity/pony/bpony_51.png | Bin 0 -> 835 bytes .../textures/entity/pony/bpony_52.png | Bin 0 -> 1476 bytes .../textures/entity/pony/bpony_53.png | Bin 0 -> 1506 bytes .../textures/entity/pony/bpony_54.png | Bin 0 -> 1170 bytes .../textures/entity/pony/bpony_55.png | Bin 0 -> 1045 bytes .../textures/entity/pony/bpony_56.png | Bin 0 -> 1011 bytes .../textures/entity/pony/bpony_57.png | Bin 0 -> 4158 bytes .../textures/entity/pony/bpony_58.png | Bin 0 -> 1159 bytes .../textures/entity/pony/bpony_59.png | Bin 0 -> 1005 bytes .../textures/entity/pony/bpony_6.png | Bin 0 -> 1384 bytes .../textures/entity/pony/bpony_60.png | Bin 0 -> 1077 bytes .../textures/entity/pony/bpony_61.png | Bin 0 -> 871 bytes .../textures/entity/pony/bpony_62.png | Bin 0 -> 1070 bytes .../textures/entity/pony/bpony_63.png | Bin 0 -> 664 bytes .../textures/entity/pony/bpony_64.png | Bin 0 -> 1287 bytes .../textures/entity/pony/bpony_65.png | Bin 0 -> 1015 bytes .../textures/entity/pony/bpony_66.png | Bin 0 -> 840 bytes .../textures/entity/pony/bpony_67.png | Bin 0 -> 910 bytes .../textures/entity/pony/bpony_68.png | Bin 0 -> 776 bytes .../textures/entity/pony/bpony_69.png | Bin 0 -> 985 bytes .../textures/entity/pony/bpony_7.png | Bin 0 -> 895 bytes .../textures/entity/pony/bpony_70.png | Bin 0 -> 1037 bytes .../textures/entity/pony/bpony_71.png | Bin 0 -> 878 bytes .../textures/entity/pony/bpony_72.png | Bin 0 -> 1340 bytes .../textures/entity/pony/bpony_73.png | Bin 0 -> 992 bytes .../textures/entity/pony/bpony_74.png | Bin 0 -> 1708 bytes .../textures/entity/pony/bpony_75.png | Bin 0 -> 805 bytes .../textures/entity/pony/bpony_76.png | Bin 0 -> 745 bytes .../textures/entity/pony/bpony_77.png | Bin 0 -> 719 bytes .../textures/entity/pony/bpony_78.png | Bin 0 -> 1802 bytes .../textures/entity/pony/bpony_79.png | Bin 0 -> 987 bytes .../textures/entity/pony/bpony_8.png | Bin 0 -> 818 bytes .../textures/entity/pony/bpony_80.png | Bin 0 -> 796 bytes .../textures/entity/pony/bpony_81.png | Bin 0 -> 991 bytes .../textures/entity/pony/bpony_82.png | Bin 0 -> 1339 bytes .../textures/entity/pony/bpony_83.png | Bin 0 -> 736 bytes .../textures/entity/pony/bpony_84.png | Bin 0 -> 889 bytes .../textures/entity/pony/bpony_85.png | Bin 0 -> 836 bytes .../textures/entity/pony/bpony_86.png | Bin 0 -> 3357 bytes .../textures/entity/pony/bpony_87.png | Bin 0 -> 879 bytes .../textures/entity/pony/bpony_88.png | Bin 0 -> 1663 bytes .../textures/entity/pony/bpony_89.png | Bin 0 -> 909 bytes .../textures/entity/pony/bpony_9.png | Bin 0 -> 3503 bytes .../textures/entity/pony/bpony_90.png | Bin 0 -> 971 bytes .../textures/entity/pony/bpony_91.png | Bin 0 -> 1281 bytes .../textures/entity/pony/bpony_92.png | Bin 0 -> 858 bytes .../textures/entity/pony/bpony_93.png | Bin 0 -> 924 bytes .../textures/entity/pony/bpony_94.png | Bin 0 -> 1240 bytes .../textures/entity/pony/bpony_95.png | Bin 0 -> 861 bytes .../textures/entity/pony/bpony_96.png | Bin 0 -> 1155 bytes .../textures/entity/pony/bpony_97.png | Bin 0 -> 895 bytes .../textures/entity/pony/bpony_98.png | Bin 0 -> 886 bytes .../textures/entity/pony/bpony_99.png | Bin 0 -> 1049 bytes .../textures/entity/pony/charpony.png | Bin 0 -> 1215 bytes .../entity/skeleton/skeleton_pony.png | Bin 0 -> 1276 bytes .../entity/skeleton/skeleton_wither_pony.png | Bin 0 -> 1356 bytes .../textures/entity/villager/butcher_pony.png | Bin 0 -> 828 bytes .../textures/entity/villager/farmer_pony.png | Bin 0 -> 1333 bytes .../entity/villager/librarian_pony.png | Bin 0 -> 901 bytes .../textures/entity/villager/priest_pony.png | Bin 0 -> 1103 bytes .../textures/entity/villager/smith_pony.png | Bin 0 -> 711 bytes .../entity/villager/villager_pony.png | Bin 0 -> 831 bytes .../textures/entity/zombie/zombie_pony.png | Bin 0 -> 6427 bytes .../entity/zombie/zombie_villager_pony.png | Bin 0 -> 6501 bytes .../textures/entity/zombie_pigman_pony.png | Bin 0 -> 8114 bytes .../models/armor/chainmail_layer_1_pony.png | Bin 0 -> 1051 bytes .../models/armor/chainmail_layer_2_pony.png | Bin 0 -> 450 bytes .../models/armor/diamond_layer_1_pony.png | Bin 0 -> 1765 bytes .../models/armor/diamond_layer_2_pony.png | Bin 0 -> 1532 bytes .../models/armor/gold_layer_1_pony.png | Bin 0 -> 1636 bytes .../models/armor/gold_layer_2_pony.png | Bin 0 -> 1260 bytes .../models/armor/iron_layer_1_pony.png | Bin 0 -> 1578 bytes .../models/armor/iron_layer_2_pony.png | Bin 0 -> 1380 bytes .../armor/leather_layer_1_overlay_pony.png | Bin 0 -> 1329 bytes .../models/armor/leather_layer_1_pony.png | Bin 0 -> 1306 bytes .../armor/leather_layer_2_overlay_pony.png | Bin 0 -> 1135 bytes .../models/armor/leather_layer_2_pony.png | Bin 0 -> 1120 bytes .../voxelcommon/textures/gui/guiparts.png | Bin 0 -> 12892 bytes src/main/resources/events.json | 28 + src/main/resources/litemod.json | 12 + voxellib/build.gradle | 17 + .../common/LiteModVoxelCommon.java | 131 ++ .../java/com/voxelmodpack/common/gl/FBO.java | 309 +++ .../voxelmodpack/common/gl/TextureHelper.java | 28 + .../voxelmodpack/common/gui/GuiCheckBox.java | 164 ++ .../voxelmodpack/common/gui/GuiControl.java | 104 + .../voxelmodpack/common/gui/GuiControlEx.java | 399 ++++ .../voxelmodpack/common/gui/GuiDialogBox.java | 366 ++++ .../common/gui/GuiDialogBoxConfirm.java | 97 + .../voxelmodpack/common/gui/GuiScreenEx.java | 139 ++ .../voxelmodpack/common/gui/GuiScrollBar.java | 386 ++++ .../common/gui/GuiTextFieldEx.java | 176 ++ .../common/gui/interfaces/IDragDrop.java | 66 + .../common/gui/interfaces/IExtendedGui.java | 81 + .../common/gui/interfaces/IListObject.java | 256 +++ .../gui/interfaces/IMouseEventListener.java | 33 + .../gui/interfaces/IMouseEventProvider.java | 13 + .../common/interfaces/INotifyable.java | 12 + .../common/interfaces/IRegionRenderer.java | 23 + .../common/interfaces/ITimeHandler.java | 48 + .../common/net/HttpFileRetriever.java | 224 +++ .../common/net/IDownloadCompletedWatcher.java | 25 + .../common/net/IDownloadProgressWatcher.java | 34 + .../net/upload/IUploadCompleteCallback.java | 5 + .../net/upload/ThreadMultipartPostUpload.java | 180 ++ .../net/upload/awt/IOpenFileCallback.java | 20 + .../common/net/upload/awt/ThreadOpenFile.java | 59 + .../net/upload/awt/ThreadOpenFilePNG.java | 43 + .../common/properties/ModConfig.java | 250 +++ .../common/properties/VoxelProperty.java | 177 ++ .../VoxelPropertyAbstractButton.java | 69 + .../VoxelPropertyAbstractTextField.java | 148 ++ .../properties/VoxelPropertyCheckBox.java | 67 + .../properties/VoxelPropertyFloatField.java | 40 + .../properties/VoxelPropertyIntField.java | 55 + .../properties/VoxelPropertyKeyBinding.java | 102 + .../common/properties/VoxelPropertyLabel.java | 33 + .../properties/VoxelPropertySlider.java | 279 +++ .../properties/VoxelPropertySliderOld.java | 188 ++ .../properties/VoxelPropertyToggleButton.java | 104 + .../gui/GuiVoxelBoxSettingsPanel.java | 303 +++ .../properties/gui/SettingsPanelManager.java | 317 +++ .../properties/gui/SettingsPanelMenuTab.java | 94 + .../gui/SettingsPanelScrollBar.java | 89 + .../interfaces/IVoxelPropertyProvider.java | 39 + .../IVoxelPropertyProviderBoolean.java | 25 + .../IVoxelPropertyProviderFloat.java | 25 + .../IVoxelPropertyProviderInteger.java | 25 + .../voxelmodpack/common/runtime/ObfMap.java | 59 + .../common/runtime/PrivateClasses.java | 47 + .../common/runtime/PrivateFields.java | 186 ++ .../common/runtime/PrivateMethods.java | 145 ++ .../common/runtime/Reflection.java | 108 ++ .../common/sound/SoundEffect.java | 19 + .../common/status/StatusMessage.java | 157 ++ .../common/status/StatusMessageConfig.java | 40 + .../common/status/StatusMessageGUI.java | 27 + .../common/status/StatusMessageManager.java | 101 + .../common/util/BrowserOpener.java | 53 + .../common/util/ChatMessageBuilder.java | 180 ++ .../common/util/ItemStackInfo.java | 283 +++ .../common/util/RenderItemEx.java | 51 + .../com/voxelmodpack/common/util/Util.java | 21 + .../voxelmodpack/common/xml/XmlHelper.java | 344 ++++ .../common/xml/XmlNamespaceContext.java | 44 + .../voxelcommon/textures/gui/guiparts.png | Bin 0 -> 12892 bytes voxellib/src/main/resources/litemod.json | 8 + 319 files changed, 17812 insertions(+) create mode 100644 .gitignore create mode 100644 build.gradle create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100644 gradlew create mode 100644 gradlew.bat create mode 100644 libs/liteloader-1.8-SNAPSHOT-mcpnames.jar create mode 100644 settings.gradle create mode 100644 src/main/java/com/minelittlepony/minelp/LiteModMineLittlePony.java create mode 100644 src/main/java/com/minelittlepony/minelp/MineLittlePony.java create mode 100644 src/main/java/com/minelittlepony/minelp/Pony.java create mode 100644 src/main/java/com/minelittlepony/minelp/PonyConfig.java create mode 100644 src/main/java/com/minelittlepony/minelp/PonyLevel.java create mode 100644 src/main/java/com/minelittlepony/minelp/PonyManager.java create mode 100644 src/main/java/com/minelittlepony/minelp/gui/FakeVoxelPropertyCheckBox.java create mode 100644 src/main/java/com/minelittlepony/minelp/gui/MineLittlePonyGUI.java create mode 100644 src/main/java/com/minelittlepony/minelp/gui/MineLittlePonyGUIMob.java create mode 100644 src/main/java/com/minelittlepony/minelp/gui/VoxelPropertyIntSlider.java create mode 100644 src/main/java/com/minelittlepony/minelp/hdskins/gui/EntityPonyModel.java create mode 100644 src/main/java/com/minelittlepony/minelp/hdskins/gui/GuiSkinsMineLP.java create mode 100644 src/main/java/com/minelittlepony/minelp/hdskins/gui/NewGuiSkinsMineLP.java create mode 100644 src/main/java/com/minelittlepony/minelp/hdskins/gui/RenderPonyModel.java create mode 100644 src/main/java/com/minelittlepony/minelp/model/ModelArmor.java create mode 100644 src/main/java/com/minelittlepony/minelp/model/ModelHornGlow.java create mode 100644 src/main/java/com/minelittlepony/minelp/model/ModelPony.java create mode 100644 src/main/java/com/minelittlepony/minelp/model/PMAPI.java create mode 100644 src/main/java/com/minelittlepony/minelp/model/PlayerModel.java create mode 100644 src/main/java/com/minelittlepony/minelp/model/ScalableModelBox.java create mode 100644 src/main/java/com/minelittlepony/minelp/model/pony/armor/pm_newPonyArmor.java create mode 100644 src/main/java/com/minelittlepony/minelp/model/pony/armor/pm_skeletonPonyArmor.java create mode 100644 src/main/java/com/minelittlepony/minelp/model/pony/armor/pm_zombiePonyArmor.java create mode 100644 src/main/java/com/minelittlepony/minelp/model/pony/armor/pma_Human.java create mode 100644 src/main/java/com/minelittlepony/minelp/model/pony/armor/pma_newPony.java create mode 100644 src/main/java/com/minelittlepony/minelp/model/pony/armor/pma_skeletonPony.java create mode 100644 src/main/java/com/minelittlepony/minelp/model/pony/armor/pma_zombiePony.java create mode 100644 src/main/java/com/minelittlepony/minelp/model/pony/pm_Human.java create mode 100644 src/main/java/com/minelittlepony/minelp/model/pony/pm_newPonyAdv.java create mode 100644 src/main/java/com/minelittlepony/minelp/model/pony/pm_skeletonPony.java create mode 100644 src/main/java/com/minelittlepony/minelp/model/pony/pm_zombiePony.java create mode 100644 src/main/java/com/minelittlepony/minelp/renderer/AniParams.java create mode 100644 src/main/java/com/minelittlepony/minelp/renderer/CompressiveRendering.java create mode 100644 src/main/java/com/minelittlepony/minelp/renderer/HornGlowRenderer.java create mode 100644 src/main/java/com/minelittlepony/minelp/renderer/IRenderPony.java create mode 100644 src/main/java/com/minelittlepony/minelp/renderer/PlaneRenderer.java create mode 100644 src/main/java/com/minelittlepony/minelp/renderer/RenderPony.java create mode 100644 src/main/java/com/minelittlepony/minelp/renderer/RenderPonyMob.java create mode 100644 src/main/java/com/minelittlepony/minelp/renderer/RenderPonySkeleton.java create mode 100644 src/main/java/com/minelittlepony/minelp/renderer/RenderPonyVillager.java create mode 100644 src/main/java/com/minelittlepony/minelp/renderer/RenderPonyZombie.java create mode 100644 src/main/java/com/minelittlepony/minelp/renderer/ScalableModelRenderer.java create mode 100644 src/main/java/com/minelittlepony/minelp/renderer/layer/LayerHeldPonyItem.java create mode 100644 src/main/java/com/minelittlepony/minelp/renderer/layer/LayerPonyArmor.java create mode 100644 src/main/java/com/minelittlepony/minelp/renderer/layer/LayerPonyCape.java create mode 100644 src/main/java/com/minelittlepony/minelp/renderer/layer/LayerPonySkull.java create mode 100644 src/main/java/com/minelittlepony/minelp/transformers/RenderPlayerTransformer.java create mode 100644 src/main/java/com/minelittlepony/minelp/util/MineLPLogger.java create mode 100644 src/main/java/com/minelittlepony/minelp/util/MineLPObf.java create mode 100644 src/main/java/com/minelittlepony/minelp/util/MineLPPrivateFields.java create mode 100644 src/main/java/com/minelittlepony/minelp/util/MineLPRData.java create mode 100644 src/main/java/com/minelittlepony/minelp/util/MineLPReflection.java create mode 100644 src/main/java/com/mumfrey/liteloader/core/LiteLoaderFriend.java create mode 100644 src/main/java/com/mumfrey/liteloader/core/api/LoadableModFileFriend.java create mode 100644 src/main/java/com/voxelmodpack/common/VoxelCommonLiteMod.java create mode 100644 src/main/java/com/voxelmodpack/hdskins/HDPrivateFields.java create mode 100644 src/main/java/com/voxelmodpack/hdskins/HDSkinDownload.java create mode 100644 src/main/java/com/voxelmodpack/hdskins/HDSkinManager.java create mode 100644 src/main/java/com/voxelmodpack/hdskins/ImageBufferDownloadHD.java create mode 100644 src/main/java/com/voxelmodpack/hdskins/PreviewTexture.java create mode 100644 src/main/java/com/voxelmodpack/hdskins/gui/EntityPlayerModel.java create mode 100644 src/main/java/com/voxelmodpack/hdskins/gui/GuiSkins.java create mode 100644 src/main/java/com/voxelmodpack/hdskins/gui/HDSkinsConfigPanel.java create mode 100644 src/main/java/com/voxelmodpack/hdskins/gui/RenderPlayerModel.java create mode 100644 src/main/java/com/voxelmodpack/hdskins/mod/HDSkinsMod.java create mode 100644 src/main/java/com/voxelmodpack/hdskins/mod/HDSkinsModCore.java create mode 100644 src/main/java/com/voxelmodpack/hdskins/mod/LiteModHDSkins.java create mode 100644 src/main/java/com/voxelmodpack/voxelmenu/IPanoramaRenderer.java create mode 100644 src/main/resources/assets/hdskins/textures/cubemaps/cubemap0_0.png create mode 100644 src/main/resources/assets/hdskins/textures/cubemaps/cubemap0_1.png create mode 100644 src/main/resources/assets/hdskins/textures/cubemaps/cubemap0_2.png create mode 100644 src/main/resources/assets/hdskins/textures/cubemaps/cubemap0_3.png create mode 100644 src/main/resources/assets/hdskins/textures/cubemaps/cubemap0_4.png create mode 100644 src/main/resources/assets/hdskins/textures/cubemaps/cubemap0_5.png create mode 100644 src/main/resources/assets/hdskins/textures/mob/noskin.png create mode 100644 src/main/resources/assets/hdskins/textures/mob/tempskin.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_0.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_1.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_10.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_100.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_101.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_102.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_103.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_104.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_105.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_106.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_107.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_108.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_109.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_11.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_110.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_111.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_112.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_113.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_114.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_115.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_116.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_117.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_118.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_119.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_12.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_120.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_121.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_122.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_123.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_124.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_125.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_126.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_127.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_128.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_129.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_13.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_130.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_131.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_132.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_133.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_134.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_135.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_136.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_137.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_138.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_139.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_14.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_140.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_15.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_16.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_17.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_18.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_19.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_2.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_20.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_21.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_22.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_23.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_24.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_25.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_26.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_27.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_28.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_29.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_3.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_30.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_31.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_32.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_33.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_34.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_35.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_36.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_37.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_38.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_39.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_4.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_40.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_41.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_42.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_43.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_44.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_45.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_46.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_47.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_48.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_49.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_5.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_50.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_51.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_52.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_53.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_54.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_55.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_56.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_57.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_58.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_59.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_6.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_60.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_61.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_62.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_63.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_64.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_65.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_66.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_67.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_68.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_69.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_7.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_70.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_71.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_72.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_73.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_74.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_75.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_76.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_77.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_78.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_79.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_8.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_80.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_81.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_82.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_83.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_84.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_85.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_86.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_87.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_88.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_89.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_9.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_90.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_91.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_92.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_93.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_94.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_95.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_96.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_97.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_98.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_99.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/pony/charpony.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/skeleton/skeleton_pony.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/skeleton/skeleton_wither_pony.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/villager/butcher_pony.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/villager/farmer_pony.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/villager/librarian_pony.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/villager/priest_pony.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/villager/smith_pony.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/villager/villager_pony.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/zombie/zombie_pony.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/zombie/zombie_villager_pony.png create mode 100644 src/main/resources/assets/minelittlepony/textures/entity/zombie_pigman_pony.png create mode 100644 src/main/resources/assets/minelittlepony/textures/models/armor/chainmail_layer_1_pony.png create mode 100644 src/main/resources/assets/minelittlepony/textures/models/armor/chainmail_layer_2_pony.png create mode 100644 src/main/resources/assets/minelittlepony/textures/models/armor/diamond_layer_1_pony.png create mode 100644 src/main/resources/assets/minelittlepony/textures/models/armor/diamond_layer_2_pony.png create mode 100644 src/main/resources/assets/minelittlepony/textures/models/armor/gold_layer_1_pony.png create mode 100644 src/main/resources/assets/minelittlepony/textures/models/armor/gold_layer_2_pony.png create mode 100644 src/main/resources/assets/minelittlepony/textures/models/armor/iron_layer_1_pony.png create mode 100644 src/main/resources/assets/minelittlepony/textures/models/armor/iron_layer_2_pony.png create mode 100644 src/main/resources/assets/minelittlepony/textures/models/armor/leather_layer_1_overlay_pony.png create mode 100644 src/main/resources/assets/minelittlepony/textures/models/armor/leather_layer_1_pony.png create mode 100644 src/main/resources/assets/minelittlepony/textures/models/armor/leather_layer_2_overlay_pony.png create mode 100644 src/main/resources/assets/minelittlepony/textures/models/armor/leather_layer_2_pony.png create mode 100644 src/main/resources/assets/voxelcommon/textures/gui/guiparts.png create mode 100644 src/main/resources/events.json create mode 100644 src/main/resources/litemod.json create mode 100644 voxellib/build.gradle create mode 100644 voxellib/src/main/java/com/voxelmodpack/common/LiteModVoxelCommon.java create mode 100644 voxellib/src/main/java/com/voxelmodpack/common/gl/FBO.java create mode 100644 voxellib/src/main/java/com/voxelmodpack/common/gl/TextureHelper.java create mode 100644 voxellib/src/main/java/com/voxelmodpack/common/gui/GuiCheckBox.java create mode 100644 voxellib/src/main/java/com/voxelmodpack/common/gui/GuiControl.java create mode 100644 voxellib/src/main/java/com/voxelmodpack/common/gui/GuiControlEx.java create mode 100644 voxellib/src/main/java/com/voxelmodpack/common/gui/GuiDialogBox.java create mode 100644 voxellib/src/main/java/com/voxelmodpack/common/gui/GuiDialogBoxConfirm.java create mode 100644 voxellib/src/main/java/com/voxelmodpack/common/gui/GuiScreenEx.java create mode 100644 voxellib/src/main/java/com/voxelmodpack/common/gui/GuiScrollBar.java create mode 100644 voxellib/src/main/java/com/voxelmodpack/common/gui/GuiTextFieldEx.java create mode 100644 voxellib/src/main/java/com/voxelmodpack/common/gui/interfaces/IDragDrop.java create mode 100644 voxellib/src/main/java/com/voxelmodpack/common/gui/interfaces/IExtendedGui.java create mode 100644 voxellib/src/main/java/com/voxelmodpack/common/gui/interfaces/IListObject.java create mode 100644 voxellib/src/main/java/com/voxelmodpack/common/gui/interfaces/IMouseEventListener.java create mode 100644 voxellib/src/main/java/com/voxelmodpack/common/gui/interfaces/IMouseEventProvider.java create mode 100644 voxellib/src/main/java/com/voxelmodpack/common/interfaces/INotifyable.java create mode 100644 voxellib/src/main/java/com/voxelmodpack/common/interfaces/IRegionRenderer.java create mode 100644 voxellib/src/main/java/com/voxelmodpack/common/interfaces/ITimeHandler.java create mode 100644 voxellib/src/main/java/com/voxelmodpack/common/net/HttpFileRetriever.java create mode 100644 voxellib/src/main/java/com/voxelmodpack/common/net/IDownloadCompletedWatcher.java create mode 100644 voxellib/src/main/java/com/voxelmodpack/common/net/IDownloadProgressWatcher.java create mode 100644 voxellib/src/main/java/com/voxelmodpack/common/net/upload/IUploadCompleteCallback.java create mode 100644 voxellib/src/main/java/com/voxelmodpack/common/net/upload/ThreadMultipartPostUpload.java create mode 100644 voxellib/src/main/java/com/voxelmodpack/common/net/upload/awt/IOpenFileCallback.java create mode 100644 voxellib/src/main/java/com/voxelmodpack/common/net/upload/awt/ThreadOpenFile.java create mode 100644 voxellib/src/main/java/com/voxelmodpack/common/net/upload/awt/ThreadOpenFilePNG.java create mode 100644 voxellib/src/main/java/com/voxelmodpack/common/properties/ModConfig.java create mode 100644 voxellib/src/main/java/com/voxelmodpack/common/properties/VoxelProperty.java create mode 100644 voxellib/src/main/java/com/voxelmodpack/common/properties/VoxelPropertyAbstractButton.java create mode 100644 voxellib/src/main/java/com/voxelmodpack/common/properties/VoxelPropertyAbstractTextField.java create mode 100644 voxellib/src/main/java/com/voxelmodpack/common/properties/VoxelPropertyCheckBox.java create mode 100644 voxellib/src/main/java/com/voxelmodpack/common/properties/VoxelPropertyFloatField.java create mode 100644 voxellib/src/main/java/com/voxelmodpack/common/properties/VoxelPropertyIntField.java create mode 100644 voxellib/src/main/java/com/voxelmodpack/common/properties/VoxelPropertyKeyBinding.java create mode 100644 voxellib/src/main/java/com/voxelmodpack/common/properties/VoxelPropertyLabel.java create mode 100644 voxellib/src/main/java/com/voxelmodpack/common/properties/VoxelPropertySlider.java create mode 100644 voxellib/src/main/java/com/voxelmodpack/common/properties/VoxelPropertySliderOld.java create mode 100644 voxellib/src/main/java/com/voxelmodpack/common/properties/VoxelPropertyToggleButton.java create mode 100644 voxellib/src/main/java/com/voxelmodpack/common/properties/gui/GuiVoxelBoxSettingsPanel.java create mode 100644 voxellib/src/main/java/com/voxelmodpack/common/properties/gui/SettingsPanelManager.java create mode 100644 voxellib/src/main/java/com/voxelmodpack/common/properties/gui/SettingsPanelMenuTab.java create mode 100644 voxellib/src/main/java/com/voxelmodpack/common/properties/gui/SettingsPanelScrollBar.java create mode 100644 voxellib/src/main/java/com/voxelmodpack/common/properties/interfaces/IVoxelPropertyProvider.java create mode 100644 voxellib/src/main/java/com/voxelmodpack/common/properties/interfaces/IVoxelPropertyProviderBoolean.java create mode 100644 voxellib/src/main/java/com/voxelmodpack/common/properties/interfaces/IVoxelPropertyProviderFloat.java create mode 100644 voxellib/src/main/java/com/voxelmodpack/common/properties/interfaces/IVoxelPropertyProviderInteger.java create mode 100644 voxellib/src/main/java/com/voxelmodpack/common/runtime/ObfMap.java create mode 100644 voxellib/src/main/java/com/voxelmodpack/common/runtime/PrivateClasses.java create mode 100644 voxellib/src/main/java/com/voxelmodpack/common/runtime/PrivateFields.java create mode 100644 voxellib/src/main/java/com/voxelmodpack/common/runtime/PrivateMethods.java create mode 100644 voxellib/src/main/java/com/voxelmodpack/common/runtime/Reflection.java create mode 100644 voxellib/src/main/java/com/voxelmodpack/common/sound/SoundEffect.java create mode 100644 voxellib/src/main/java/com/voxelmodpack/common/status/StatusMessage.java create mode 100644 voxellib/src/main/java/com/voxelmodpack/common/status/StatusMessageConfig.java create mode 100644 voxellib/src/main/java/com/voxelmodpack/common/status/StatusMessageGUI.java create mode 100644 voxellib/src/main/java/com/voxelmodpack/common/status/StatusMessageManager.java create mode 100644 voxellib/src/main/java/com/voxelmodpack/common/util/BrowserOpener.java create mode 100644 voxellib/src/main/java/com/voxelmodpack/common/util/ChatMessageBuilder.java create mode 100644 voxellib/src/main/java/com/voxelmodpack/common/util/ItemStackInfo.java create mode 100644 voxellib/src/main/java/com/voxelmodpack/common/util/RenderItemEx.java create mode 100644 voxellib/src/main/java/com/voxelmodpack/common/util/Util.java create mode 100644 voxellib/src/main/java/com/voxelmodpack/common/xml/XmlHelper.java create mode 100644 voxellib/src/main/java/com/voxelmodpack/common/xml/XmlNamespaceContext.java create mode 100644 voxellib/src/main/resources/assets/voxelcommon/textures/gui/guiparts.png create mode 100644 voxellib/src/main/resources/litemod.json diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..110f1aef --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +.gradle/ +.settings/ +bin/ +build/ +run/ +.classpath +.project \ No newline at end of file diff --git a/build.gradle b/build.gradle new file mode 100644 index 00000000..f74db51d --- /dev/null +++ b/build.gradle @@ -0,0 +1,56 @@ +buildscript { + repositories { + mavenCentral() + maven { + name = "forge" + url = "http://files.minecraftforge.net/maven" + } + maven { + name = "sonatype" + url = "https://oss.sonatype.org/content/repositories/snapshots/" + } + maven { + name = 'minecrell' + url = "http://repo.minecrell.net/snapshots" + } + } + dependencies { + classpath 'net.minecrell:VanillaGradle:3.0-SNAPSHOT' + } +} +evaluationDependsOnChildren() +apply plugin: 'net.minecrell.vanilla' + +archivesBaseName = "mod_minelp" +version = "1.8-UNOFFICIAL_mc1.8" + +minecraft { + version = "1.8" + mappings = 'snapshot_20150606' + clientTweaker = 'com.mumfrey.liteloader.launch.LiteLoaderTweaker' + // fix reobf issues + srgExtra "FD: com/voxelmodpack/common/properties/gui/GuiVoxelBoxSettingsPanel/zLevel bub/e" + srgExtra "FD: com/voxelmodpack/common/gui/GuiControl/zLevel bub/e" + srgExtra "FD: com/voxelmodpack/common/gui/GuiScreenEx/zLevel bub/e" +} +project(':voxellib').dependencies { + compile fileTree("libs") +} +dependencies { + compile project(':voxellib') +} +jar { + extension 'litemod' +} +task standaloneJar(type:Jar, dependsOn: [reobf, project(':voxellib').reobf]) { + extension "litemod" + from zipTree(jar.archivePath) + from project(':voxellib').jar.archivePath + classifier 'standalone' +} +artifacts { + archives standaloneJar +} +reobf { + setSrgMcp() +} diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..30d399d8d2bf522ff5de94bf434a7cc43a9a74b5 GIT binary patch literal 52271 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 p \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >&- +APP_HOME="`pwd -P`" +cd "$SAVED" >&- + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules +function splitJvmOpts() { + JVM_OPTS=("$@") +} +eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS +JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" + +exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 00000000..8a0b282a --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,90 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windowz variants + +if not "%OS%" == "Windows_NT" goto win9xME_args +if "%@eval[2+2]" == "4" goto 4NT_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* +goto execute + +:4NT_args +@rem Get arguments from the 4NT Shell from JP Software +set CMD_LINE_ARGS=%$ + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/libs/liteloader-1.8-SNAPSHOT-mcpnames.jar b/libs/liteloader-1.8-SNAPSHOT-mcpnames.jar new file mode 100644 index 0000000000000000000000000000000000000000..069697c9363beb5250c55b055c79d445a0c9912e GIT binary patch literal 632144 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
pzgSu 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%0D98OM_8Nz)L*NWM5ZS)WKbslJuT6bIhtxfHtS>x} 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

~EY=HLyHRV=yl#U6J1e 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

hOq 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 literal 0 HcmV?d00001 diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 00000000..63efbc54 --- /dev/null +++ b/settings.gradle @@ -0,0 +1 @@ +include ':voxellib' \ No newline at end of file diff --git a/src/main/java/com/minelittlepony/minelp/LiteModMineLittlePony.java b/src/main/java/com/minelittlepony/minelp/LiteModMineLittlePony.java new file mode 100644 index 00000000..f2299fea --- /dev/null +++ b/src/main/java/com/minelittlepony/minelp/LiteModMineLittlePony.java @@ -0,0 +1,20 @@ +package com.minelittlepony.minelp; + +import com.voxelmodpack.common.VoxelCommonLiteMod; + +public class LiteModMineLittlePony extends VoxelCommonLiteMod { + + public LiteModMineLittlePony() { + super("com.minelittlepony.minelp.MineLittlePony"); + } + + @Override + public String getVersion() { + return MineLittlePony.MOD_VERSION; + } + + @Override + public String getName() { + return MineLittlePony.MOD_NAME; + } +} diff --git a/src/main/java/com/minelittlepony/minelp/MineLittlePony.java b/src/main/java/com/minelittlepony/minelp/MineLittlePony.java new file mode 100644 index 00000000..b3214e3a --- /dev/null +++ b/src/main/java/com/minelittlepony/minelp/MineLittlePony.java @@ -0,0 +1,179 @@ +package com.minelittlepony.minelp; + +import java.io.File; + +import org.lwjgl.input.Keyboard; + +import com.minelittlepony.minelp.gui.MineLittlePonyGUI; +import com.minelittlepony.minelp.gui.MineLittlePonyGUIMob; +import com.minelittlepony.minelp.hdskins.gui.EntityPonyModel; +import com.minelittlepony.minelp.hdskins.gui.GuiSkinsMineLP; +import com.minelittlepony.minelp.hdskins.gui.RenderPonyModel; +import com.minelittlepony.minelp.renderer.RenderPonySkeleton; +import com.minelittlepony.minelp.renderer.RenderPonyVillager; +import com.minelittlepony.minelp.renderer.RenderPonyZombie; +import com.minelittlepony.minelp.util.MineLPLogger; +import com.mumfrey.liteloader.InitCompleteListener; +import com.mumfrey.liteloader.core.LiteLoader; +import com.mumfrey.liteloader.util.ModUtilities; +import com.voxelmodpack.common.properties.ModConfig; +import com.voxelmodpack.common.properties.gui.SettingsPanelManager; +import com.voxelmodpack.hdskins.HDSkinManager; +import com.voxelmodpack.hdskins.gui.GuiSkins; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiMainMenu; +import net.minecraft.client.renderer.entity.RenderManager; +import net.minecraft.client.settings.KeyBinding; +import net.minecraft.entity.monster.EntityPigZombie; +import net.minecraft.entity.monster.EntitySkeleton; +import net.minecraft.entity.monster.EntityZombie; +import net.minecraft.entity.passive.EntityVillager; + +public class MineLittlePony implements InitCompleteListener { + public static final String MOD_VERSION = "1.8-UNOFFICIAL"; + public static final String MOD_NAME = "Mine Little Pony"; + public static final String SKIN_SERVER_URL = "minelpskins.voxelmodpack.com"; + public static final String GATEWAY_URL = "minelpskinmanager.voxelmodpack.com"; + public static final String UPLOAD_URL = "http://minelpskinmanager.voxelmodpack.com/"; + private static final KeyBinding guiKeybinding = new KeyBinding("Settings", Keyboard.KEY_F9, "Mine Little Pony"); + private static final KeyBinding skinKeybinding = new KeyBinding("Skin Manager", Keyboard.KEY_F1, "Mine Little Pony"); + private PonyConfig config; + private PonyManager ponyManager; + private String spUsername; + private static MineLittlePony instance; + + public MineLittlePony() { + instance = this; + } + + public static MineLittlePony getInstance() { + return instance; + } + + @Override + public String getName() { + return MOD_NAME; + } + + @Override + public String getVersion() { + return MOD_VERSION; + } + + @Override + public void upgradeSettings(String version, File configPath, File oldConfigPath) {} + + @Override + public void init(File configPath) { + LiteLoader.getInput().registerKeyBinding(guiKeybinding); + LiteLoader.getInput().registerKeyBinding(skinKeybinding); + SettingsPanelManager.addSettingsPanel("Pony", MineLittlePonyGUI.class); + SettingsPanelManager.addSettingsPanel("Pony Mobs", MineLittlePonyGUIMob.class); + this.ponyManager = PonyManager.getInstance(); + this.config = new PonyConfig(); + + int readInt = this.config.getIntPropertySafe("ponylevel", 0, 2); + this.ponyManager.setPonyLevel(PonyLevel.parse(readInt)); + MineLPLogger.info("Pony level is set to %d.", Integer.valueOf(readInt)); + + readInt = this.config.getIntPropertySafe("sizes", 0, 1); + this.ponyManager.setUseSizes(readInt); + MineLPLogger.info("Different pony sizes are %s.", readInt == 0 ? "disabled" : "enabled"); + + readInt = this.config.getIntPropertySafe("ponyarmor", 0, 1); + this.ponyManager.setPonyArmor(readInt); + MineLPLogger.info("Pony armor is %s.", readInt == 0 ? "disabled" : "enabled"); + + readInt = this.config.getIntPropertySafe("snuzzles", 0, 1); + this.ponyManager.setShowSnuzzles(readInt); + MineLPLogger.info("Snuzzels are %s.", readInt == 0 ? "disabled (You are a bad pony)" : "enabled"); + + readInt = this.config.getIntPropertySafe("hd", 0, 1); + this.ponyManager.setHD(readInt); + MineLPLogger.info("MineLittlePony skin server is %s.", readInt == 0 ? "disabled" : "enabled"); + + readInt = this.config.getIntPropertySafe("showscale", 0, 1); + this.ponyManager.setShowScale(readInt); + MineLPLogger.info("Show-accurate scaling is %s.", readInt == 0 ? "disabled" : "enabled"); + + readInt = this.config.getIntPropertySafe("villagers", 0, 1); + this.ponyManager.setPonyVillagers(readInt); + MineLPLogger.info("Pony villagers are %s.", readInt == 0 ? "disabled" : "enabled"); + + readInt = this.config.getIntPropertySafe("zombies", 0, 1); + this.ponyManager.setPonyZombies(readInt); + MineLPLogger.info("Pony zombies are %s.", readInt == 0 ? "disabled" : "enabled"); + + readInt = this.config.getIntPropertySafe("pigzombies", 0, 1); + this.ponyManager.setPonyPigzombies(readInt); + MineLPLogger.info("Pony pigzombies are %s.", readInt == 0 ? "disabled" : "enabled"); + + readInt = this.config.getIntPropertySafe("skeletons", 0, 1); + this.ponyManager.setPonySkeletons(readInt); + MineLPLogger.info("Pony skeletons are %s.", readInt == 0 ? "disabled" : "enabled"); + } + + @Override + public void onInitCompleted(Minecraft minecraft, LiteLoader loader) { + this.spUsername = minecraft.getSession().getUsername(); + if (this.ponyManager.getHD() == 1) { + HDSkinManager.clearSkinCache(); + HDSkinManager.setSkinUrl(SKIN_SERVER_URL); + HDSkinManager.setGatewayURL(GATEWAY_URL); + MineLPLogger.info("Set MineLP skin server URL."); + } + RenderManager rm = minecraft.getRenderManager(); + ModUtilities.addRenderer(EntityPonyModel.class, new RenderPonyModel(rm)); + if (this.ponyManager.getPonyVillagers() == 1) { + ModUtilities.addRenderer(EntityVillager.class, new RenderPonyVillager(rm)); + MineLPLogger.info("Villagers are now ponies."); + } + + if (this.ponyManager.getPonyZombies() == 1) { + ModUtilities.addRenderer(EntityZombie.class, new RenderPonyZombie(rm)); + MineLPLogger.info("Zombies are now ponies."); + } + + if (this.ponyManager.getPonyPigzombies() == 1) { + ModUtilities.addRenderer(EntityPigZombie.class, new RenderPonyZombie(rm)); + MineLPLogger.info("Zombie pigmen are now ponies."); + } + + if (this.ponyManager.getPonySkeletons() == 1) { + ModUtilities.addRenderer(EntitySkeleton.class, new RenderPonySkeleton(rm)); + MineLPLogger.info("Skeletons are now ponies."); + } + + } + + @Override + public void onTick(Minecraft minecraft, float partialTicks, boolean inGame, boolean clock) { + this.ponyManager.setPonyLevel(PonyLevel.parse(this.config.getIntProperty("ponylevel"))); + this.ponyManager.setUseSizes(this.config.getIntProperty("sizes")); + this.ponyManager.setPonyArmor(this.config.getIntProperty("ponyarmor")); + this.ponyManager.setShowSnuzzles(this.config.getIntProperty("snuzzles")); + this.ponyManager.setShowScale(this.config.getIntProperty("showscale")); + if (inGame && minecraft.currentScreen == null && guiKeybinding.isPressed()) { + minecraft.displayGuiScreen(new MineLittlePonyGUI()); + } + // if (Keyboard.isKeyDown(Keyboard.KEY_O)) { + // ponyManager.initmodels(); + // } + + if (!inGame && minecraft.currentScreen != null + && (minecraft.currentScreen instanceof GuiMainMenu && Keyboard.isKeyDown(skinKeybinding.getKeyCode()) + || minecraft.currentScreen instanceof GuiSkins)) { + minecraft.displayGuiScreen(new GuiSkinsMineLP()); + } + + } + + public static ModConfig getConfig() { + return getInstance().config; + } + + public static String getSPUsername() { + return getInstance().spUsername; + } +} diff --git a/src/main/java/com/minelittlepony/minelp/Pony.java b/src/main/java/com/minelittlepony/minelp/Pony.java new file mode 100644 index 00000000..ba0cac35 --- /dev/null +++ b/src/main/java/com/minelittlepony/minelp/Pony.java @@ -0,0 +1,447 @@ +package com.minelittlepony.minelp; + +import java.awt.Color; +import java.awt.image.BufferedImage; + +import javax.imageio.ImageIO; + +import com.minelittlepony.minelp.model.PMAPI; +import com.minelittlepony.minelp.model.PlayerModel; +import com.minelittlepony.minelp.util.MineLPLogger; +import com.voxelmodpack.common.runtime.PrivateFields; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.entity.AbstractClientPlayer; +import net.minecraft.client.renderer.ThreadDownloadImageData; +import net.minecraft.client.renderer.texture.ITextureObject; +import net.minecraft.util.BlockPos; +import net.minecraft.util.MathHelper; +import net.minecraft.util.ResourceLocation; +import net.minecraft.world.World; + +public class Pony { + public static PonyManager ponyManager = PonyManager.getInstance(); + public Pony.PonyRace race; + public boolean advancedTexturing; + public ResourceLocation textureResourceLocation; + public boolean isSpPlayer; + public boolean isPony; + public boolean isPonySkin; + public boolean isPegasus; + public boolean isUnicorn; + public boolean isFlying; + public boolean isGlow; + public int glowColor; + public boolean isMale; + public int size; + public int wantTail; + public boolean isVillager; + public int villagerProfession; + public float defaultYOffset; + boolean pegasusFlying; + @SuppressWarnings("unused") + private final int dangerzone; + private float previousFallDistance; + private static int ponyCount = 0; + private final int ponyId; + private int skinCheckCount; + private boolean skinChecked; + private boolean newSkinSize; + + public Pony(AbstractClientPlayer player) { + this.race = Pony.PonyRace.EARTH; + this.isSpPlayer = false; + this.isPony = false; + this.isPonySkin = false; + this.isPegasus = false; + this.isUnicorn = false; + this.isFlying = false; + this.isGlow = false; + this.glowColor = -12303190; + this.isMale = false; + this.size = 1; + this.wantTail = 0; + this.isVillager = false; + this.villagerProfession = 1; + this.defaultYOffset = 1.62F; + this.pegasusFlying = false; + this.dangerzone = 2; + this.previousFallDistance = 0.0F; + this.skinCheckCount = 0; + this.skinChecked = false; + this.ponyId = ++ponyCount; + this.textureResourceLocation = player.getLocationSkin(); + MineLPLogger.debug("+ Initialising new pony #%d for player %s (%s) with resource location %s.", this.ponyId, + player.getCommandSenderName(), player.getUniqueID(), this.textureResourceLocation); + this.checkSkin(this.textureResourceLocation); + } + + public Pony(ResourceLocation aTextureResourceLocation) { + this.race = Pony.PonyRace.EARTH; + this.isSpPlayer = false; + this.isPony = false; + this.isPonySkin = false; + this.isPegasus = false; + this.isUnicorn = false; + this.isFlying = false; + this.isGlow = false; + this.glowColor = -12303190; + this.isMale = false; + this.size = 1; + this.wantTail = 0; + this.isVillager = false; + this.villagerProfession = 1; + this.defaultYOffset = 1.62F; + this.pegasusFlying = false; + this.dangerzone = 2; + this.previousFallDistance = 0.0F; + this.skinCheckCount = 0; + this.skinChecked = false; + this.ponyId = ++ponyCount; + this.textureResourceLocation = aTextureResourceLocation; + + MineLPLogger.debug("+ Initialising new pony #%d with resource location %s.", this.ponyId, + this.textureResourceLocation); + this.checkSkin(this.textureResourceLocation); + } + + public void invalidateSkinCheck() { + this.resetValues(); + this.skinChecked = false; + } + + public void checkSkin() { + if (!this.skinChecked) { + this.checkSkin(this.textureResourceLocation); + } + + } + + public void checkSkin(ResourceLocation textureResourceLocation) { + BufferedImage skinImage = this.getBufferedImage(textureResourceLocation); + if (skinImage != null) { + this.checkSkin(skinImage); + } + + } + + public BufferedImage getBufferedImage(ResourceLocation textureResourceLocation) { + BufferedImage skinImage = null; + + try { + skinImage = ImageIO.read(Minecraft.getMinecraft().getResourceManager().getResource(textureResourceLocation) + .getInputStream()); + MineLPLogger.debug("Obtained skin from resource location %s", textureResourceLocation); + this.checkSkin(skinImage); + } catch (Exception var6) { + Exception e = var6; + + try { + ITextureObject e2 = Minecraft.getMinecraft().getTextureManager().getTexture(textureResourceLocation); + if (e2 instanceof ThreadDownloadImageData) { + skinImage = PrivateFields.downloadedImage.get((ThreadDownloadImageData) e2); + if (skinImage != null) { + MineLPLogger.debug(e, "Successfully reflected downloadedImage from texture object"); + this.checkSkin(skinImage); + } + } + } catch (Exception var5) { + ; + } + } + + return skinImage; + } + + public void checkSkin(BufferedImage bufferedimage) { + MineLPLogger.debug("\tStart skin check #%d for pony #%d with image %s.", ++this.skinCheckCount, this.ponyId); + this.resetValues(); + Color flagPix = new Color(bufferedimage.getRGB(0, 0), true); + Color applejack = new Color(249, 177, 49, 255); + Color dashie = new Color(136, 202, 240, 255); + Color twilight = new Color(209, 159, 228, 255); + Color celestia = new Color(254, 249, 252, 255); + Color zecora = new Color(208, 204, 207, 255); + Color changeling = new Color(40, 43, 41, 255); + if (flagPix.equals(applejack)) { + this.isPony = true; + this.isPonySkin = true; + this.race = Pony.PonyRace.EARTH; + } + + if (flagPix.equals(zecora)) { + this.isPony = true; + this.isPonySkin = true; + this.race = Pony.PonyRace.ZEBRA; + } + + if (flagPix.equals(dashie)) { + this.isPony = true; + this.isPonySkin = true; + this.isPegasus = true; + this.race = Pony.PonyRace.PEGASUS; + } + + if (flagPix.equals(twilight)) { + this.isPony = true; + this.isPonySkin = true; + this.isUnicorn = true; + this.race = Pony.PonyRace.UNICORN; + } + + if (flagPix.equals(celestia)) { + this.isPony = true; + this.isPonySkin = true; + this.isPegasus = true; + this.isUnicorn = true; + this.race = Pony.PonyRace.ALICORN; + } + + if (flagPix.equals(changeling)) { + this.isPony = true; + this.isPonySkin = true; + this.isPegasus = true; + this.isUnicorn = true; + this.race = Pony.PonyRace.CHANGELING; + } + + Color tailcolor = new Color(bufferedimage.getRGB(1, 0), true); + Color tailcolor1 = new Color(66, 88, 68, 255); + Color tailcolor2 = new Color(70, 142, 136, 255); + Color tailcolor3 = new Color(83, 75, 118, 255); + Color tailcolor4 = new Color(138, 107, 127, 255); + if (tailcolor.equals(tailcolor1)) { + this.wantTail = 4; + } else if (tailcolor.equals(tailcolor2)) { + this.wantTail = 3; + } else if (tailcolor.equals(tailcolor3)) { + this.wantTail = 2; + } else if (tailcolor.equals(tailcolor4)) { + this.wantTail = 1; + } else { + this.wantTail = 0; + } + + Color gendercolor = new Color(bufferedimage.getRGB(2, 0), true); + Color gendercolor1 = new Color(255, 255, 255, 255); + if (gendercolor.equals(gendercolor1)) { + this.isMale = true; + } else { + this.isMale = false; + } + + Color sizecolor = new Color(bufferedimage.getRGB(3, 0), true); + Color scootaloo = new Color(255, 190, 83); + Color bigmac = new Color(206, 50, 84); + Color luna = new Color(42, 60, 120); + if (ponyManager.getUseSizes() == 1) { + if (sizecolor.equals(scootaloo)) { + this.size = 0; + } else if (sizecolor.equals(bigmac)) { + this.size = 2; + } else if (sizecolor.equals(luna)) { + this.size = 3; + } else { + this.size = 1; + } + } + + Color black = new Color(0, 0, 0); + int scaleFactor = bufferedimage.getHeight() / 32; + int tileSize = 8 * scaleFactor; + Color advcutiecolor = new Color(bufferedimage.getRGB(tileSize / 2, 0), true); + if (advcutiecolor.getAlpha() == 0) { + this.advancedTexturing = false; + } else { + this.advancedTexturing = false; + + for (int tempGlowColor = tileSize / 2; tempGlowColor < tileSize; ++tempGlowColor) { + for (int y = 0; y < tileSize; ++y) { + Color aColor = new Color(bufferedimage.getRGB(tempGlowColor, y), true); + if (!aColor.equals(black)) { + this.advancedTexturing = true; + } + } + } + } + + Color var27 = new Color(bufferedimage.getRGB(0, 1), true); + if (!var27.equals(black) && var27.getAlpha() != 0) { + this.glowColor = var27.getRGB(); + } else { + this.glowColor = -12303190; + } + + this.newSkinSize = bufferedimage.getWidth() == bufferedimage.getHeight(); + this.skinChecked = true; + MineLPLogger.debug( + "\tSkin check #%d for pony #%d completed. {IsPony:%b, Race:%s, FlagPixel:%s, AdvancedTexturing:%b}", + this.skinCheckCount, this.ponyId, this.isPony, this.race, flagPix, this.advancedTexturing); + } + + protected void resetValues() { + this.isPony = false; + this.isPonySkin = false; + this.isPegasus = false; + this.isUnicorn = false; + this.isPonySkin = false; + this.isMale = false; + this.wantTail = 0; + this.size = 1; + } + + public boolean isPony() { + return this.isPony; + } + + public boolean isPonySkin() { + return this.isPonySkin; + } + + public boolean isUnicorn() { + return this.isUnicorn; + } + + public boolean isPegasus() { + return this.isPegasus; + } + + public Pony.PonyRace getRace() { + return this.race; + } + + public int wantTail() { + return this.wantTail; + } + + public boolean isMale() { + return this.isMale; + } + + public int size() { + return ponyManager.getUseSizes() == 1 ? this.size : 1; + } + + public boolean advancedTexturing() { + return this.advancedTexturing; + } + + public boolean isFlying() { + return this.isFlying; + } + + public boolean isGlow() { + return this.isGlow; + } + + public int glowColor() { + return this.glowColor; + } + + public int villagerProfession() { + return this.villagerProfession; + } + + public boolean isPegasusFlying(double posX, double posY, double posZ, float fallDistance, boolean isJumping, + boolean onGround, World equestria) { + if (!this.isPegasus) { + return pegasusFlying = false; + } else if (isJumping) { + return true; + } else { + boolean falling = fallDistance > 0; + boolean levitating = fallDistance == this.previousFallDistance; + boolean standingOnAir; + if (falling && !levitating) { + standingOnAir = this.standingOnAir(posX, posY, posZ, 1.5F, equestria); + } else { + standingOnAir = this.standingOnAir(posX, posY, posZ, 1.0F, equestria); + } + + if (!standingOnAir) { + return pegasusFlying = false; + } else if (this.pegasusFlying) { + return true; + } else if (levitating) { + return pegasusFlying = true; + } else { + this.previousFallDistance = fallDistance; + if (fallDistance < 2.0F) { + return false; + } else { + return pegasusFlying = true; + } + } + } + } + + public boolean standingOnAir(double posX, double posY, double posZ, float range, World equestria) { + boolean foundSolidBlock = false; + int y; + if (this.isSpPlayer) { + y = MathHelper.floor_double(posY - this.defaultYOffset - 0.009999999776482582D); + } else { + y = MathHelper.floor_double(posY - 0.009999999776482582D); + } + + for (float shiftX = 0.0F - range; shiftX < range * 2.0F; shiftX += range) { + for (float shiftZ = 0.0F - range; shiftZ < range * 2.0F; shiftZ += range) { + int x = MathHelper.floor_double(posX + shiftX); + int z = MathHelper.floor_double(posZ + shiftZ); + if (!equestria.isAirBlock(new BlockPos(x, y, z))) { + foundSolidBlock = true; + } + } + } + + return !foundSolidBlock; + } + + public PlayerModel getModel() { + return getModel(false); + } + + public PlayerModel getModel(boolean ignorePony) { + boolean is_a_pony = false; + switch (ignorePony ? PonyLevel.MIXED : ponyManager.getPonyLevel()) { + case HUMANS: + is_a_pony = false; + break; + case MIXED: + is_a_pony = isPonySkin; + break; + case PONIES: + is_a_pony = true; + } + + PlayerModel model; + if (is_a_pony) { + model = newSkinSize ? PMAPI.newPonyAdv_64 : PMAPI.newPonyAdv; + } else { + model = newSkinSize ? PMAPI.human_64 : PMAPI.human; + } + return model; + } + + public ResourceLocation getTextureResourceLocation() { + return this.textureResourceLocation; + } + + public void setVillager(int profession) { + this.isVillager = true; + this.villagerProfession = profession; + } + + public void setIsPonySkin(boolean b) { + this.isPonySkin = false; + } + + public static enum PonyRace { + EARTH, + PEGASUS, + UNICORN, + ALICORN, + CHANGELING, + ZEBRA; + } +} diff --git a/src/main/java/com/minelittlepony/minelp/PonyConfig.java b/src/main/java/com/minelittlepony/minelp/PonyConfig.java new file mode 100644 index 00000000..c1c4fb44 --- /dev/null +++ b/src/main/java/com/minelittlepony/minelp/PonyConfig.java @@ -0,0 +1,73 @@ +package com.minelittlepony.minelp; + +import com.minelittlepony.minelp.util.MineLPLogger; +import com.voxelmodpack.common.properties.ModConfig; + +public class PonyConfig extends ModConfig { + @Override + protected void setDefaults() { + this.defaults.setProperty("ponylevel", "2"); + this.defaults.setProperty("sizes", "1"); + this.defaults.setProperty("ponyarmor", "1"); + this.defaults.setProperty("snuzzles", "1"); + this.defaults.setProperty("hd", "1"); + this.defaults.setProperty("showscale", "1"); + this.defaults.setProperty("eqg", "0"); + this.defaults.setProperty("villagers", "1"); + this.defaults.setProperty("zombies", "1"); + this.defaults.setProperty("pigzombies", "1"); + this.defaults.setProperty("skeletons", "1"); + this.defaults.setProperty("oldSkinUploaded", "0"); + } + + public PonyConfig() { + super("Mine Little Pony", "minelittlepony.properties"); + } + + @Override + public String getOptionDisplayString(String binding) { + return ""; + } + + public int getIntPropertySafe(String key) { + return this.getIntPropertySafe(key, Integer.MIN_VALUE, Integer.MAX_VALUE); + } + + public int getIntPropertySafe(String key, int minValue, int maxValue) { + int value; + try { + value = this.getIntProperty(key); + } catch (Exception var9) { + try { + boolean e2 = this.getBoolProperty(key); + if (e2) { + value = 1; + } else { + value = 0; + } + } catch (Exception var8) { + int defaultValue1 = this.getDefaultIntProperty(key); + this.setProperty(key, defaultValue1); + MineLPLogger.error("Invalid value for config key \"%s\", using default value %d", + new Object[] { key, Integer.valueOf(defaultValue1) }); + return defaultValue1; + } + } + + if (value >= minValue && value <= maxValue) { + return value; + } else { + int defaultValue = value = this.getDefaultIntProperty(key); + this.setProperty(key, defaultValue); + MineLPLogger.error( + "Invalid value for config key \"%s\", using default value %d. Found %d, expected value between %d and %d.", + new Object[] { key, Integer.valueOf(defaultValue), Integer.valueOf(value), + Integer.valueOf(minValue), Integer.valueOf(maxValue) }); + return defaultValue; + } + } + + public boolean isSet(String key) { + return this.config.containsKey(key); + } +} diff --git a/src/main/java/com/minelittlepony/minelp/PonyLevel.java b/src/main/java/com/minelittlepony/minelp/PonyLevel.java new file mode 100644 index 00000000..be7371d6 --- /dev/null +++ b/src/main/java/com/minelittlepony/minelp/PonyLevel.java @@ -0,0 +1,23 @@ +package com.minelittlepony.minelp; + +public enum PonyLevel { + PONIES, + HUMANS, + MIXED; + + private static final PonyLevel[] oldValues = { HUMANS, MIXED, PONIES }; + + public static PonyLevel parse(int intValue) { + if (intValue < 0) + intValue = 0; + if (intValue > 2) + intValue = 2; + // it's an old value + return oldValues[intValue]; + } + + @Override + public String toString() { + return name().toString(); + } +} diff --git a/src/main/java/com/minelittlepony/minelp/PonyManager.java b/src/main/java/com/minelittlepony/minelp/PonyManager.java new file mode 100644 index 00000000..132843e3 --- /dev/null +++ b/src/main/java/com/minelittlepony/minelp/PonyManager.java @@ -0,0 +1,262 @@ +package com.minelittlepony.minelp; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import com.minelittlepony.minelp.model.PMAPI; +import com.minelittlepony.minelp.util.MineLPLogger; + +import net.minecraft.client.entity.AbstractClientPlayer; +import net.minecraft.entity.passive.EntityVillager; +import net.minecraft.util.ResourceLocation; + +public class PonyManager { + public static final String RESOURCE_NAMESPACE = "minelittlepony"; + public static final ResourceLocation zombiePonyResource = new ResourceLocation("minelittlepony", + "textures/entity/zombie/zombie_pony.png"); + public static final ResourceLocation zombieVillagerPonyResource = new ResourceLocation("minelittlepony", + "textures/entity/zombie/zombie_villager_pony.png"); + public static final ResourceLocation zombiePigmanPonyResource = new ResourceLocation("minelittlepony", + "textures/entity/zombie_pigman_pony.png"); + public static final ResourceLocation skeletonPonyResource = new ResourceLocation("minelittlepony", + "textures/entity/skeleton/skeleton_pony.png"); + public static final ResourceLocation skeletonWitherPonyResource = new ResourceLocation("minelittlepony", + "textures/entity/skeleton/skeleton_wither_pony.png"); + public static final ResourceLocation defaultPonyResourceLocation = new ResourceLocation("minelittlepony", + "textures/entity/pony/charpony.png"); + public static List backgroundPonyResourceLocations = new ArrayList(); + public static List villagerResourceLocations; + private static final int MAX_BGPONY_COUNT = 141; + private static int numberOfPonies; + private Map ponyResourceRegistry = new HashMap(); + private Map backgroudPonyResourceRegistry = new HashMap(); + private PonyLevel ponyLevel = PonyLevel.PONIES; + private int useSizes = 1; + private int ponyArmor = 1; + private int showSnuzzles = 1; + private int showScale = 1; + private int ponyVillagers = 1; + private int ponyZombies = 1; + private int ponyPigzombies = 1; + private int ponySkeletons = 1; + private int useHDSkinServer = 1; + private static PonyManager instance; + + private PonyManager() { + initmodels(); + } + + public void initmodels() { + MineLPLogger.info("Initializing models..."); + PMAPI.init(); + MineLPLogger.info("Done initializing models."); + } + + public static PonyManager getInstance() { + if (instance == null) { + instance = new PonyManager(); + } + + return instance; + } + + private Pony getPonyFromResourceRegistry(ResourceLocation skinResourceLocation, AbstractClientPlayer player) { + Pony myLittlePony; + if (!this.ponyResourceRegistry.containsKey(skinResourceLocation)) { + if (player != null) { + myLittlePony = new Pony(player); + } else { + myLittlePony = new Pony(skinResourceLocation); + } + + this.ponyResourceRegistry.put(skinResourceLocation, myLittlePony); + } else { + myLittlePony = this.ponyResourceRegistry.get(skinResourceLocation); + } + + return myLittlePony; + } + + public Pony getPonyFromResourceRegistry(ResourceLocation skinResourceLocation) { + return this.getPonyFromResourceRegistry(skinResourceLocation, (AbstractClientPlayer) null); + } + + public Pony getPonyFromResourceRegistry(AbstractClientPlayer player) { + Pony myLittlePony = this.getPonyFromResourceRegistry(player.getLocationSkin(), player); + if (this.ponyLevel == PonyLevel.PONIES && !myLittlePony.isPonySkin()) { + myLittlePony = this.getPonyFromBackgroundResourceRegistry(player); + } + + if (player.getCommandSenderName().equals(MineLittlePony.getSPUsername())) { + myLittlePony.isSpPlayer = true; + } + + return myLittlePony; + } + + public Pony getPonyFromResourceRegistry(EntityVillager entity) { + int profession = entity.getProfession(); + + ResourceLocation villagerResourceLocation; + try { + villagerResourceLocation = villagerResourceLocations.get(profession); + } catch (IndexOutOfBoundsException var5) { + villagerResourceLocation = villagerResourceLocations.get(5); + } + + Pony myLittlePony = this.getPonyFromResourceRegistry(villagerResourceLocation); + myLittlePony.setVillager(profession); + return myLittlePony; + } + + private ResourceLocation getBackgroundPonyResource(String username) { + if (numberOfPonies > 0) { + int backgroundIndex = username.hashCode() % this.getNumberOfPonies(); + if (backgroundIndex < 0) { + backgroundIndex += this.getNumberOfPonies(); + } + + return backgroundPonyResourceLocations.get(backgroundIndex); + } else { + return defaultPonyResourceLocation; + } + } + + public Pony getPonyFromBackgroundResourceRegistry(AbstractClientPlayer player) { + ResourceLocation textureResourceLocation; + if (player.getCommandSenderName() == MineLittlePony.getSPUsername()) { + textureResourceLocation = defaultPonyResourceLocation; + } else { + textureResourceLocation = this.getBackgroundPonyResource(player.getCommandSenderName()); + } + + Pony myLittlePony; + if (!this.backgroudPonyResourceRegistry.containsKey(textureResourceLocation)) { + myLittlePony = new Pony(textureResourceLocation); + this.backgroudPonyResourceRegistry.put(textureResourceLocation, myLittlePony); + } else { + myLittlePony = this.backgroudPonyResourceRegistry.get(textureResourceLocation); + } + + return myLittlePony; + } + + public int getHD() { + return this.useHDSkinServer; + } + + public int getNumberOfPonies() { + return numberOfPonies; + } + + public int getPonyArmor() { + return this.ponyArmor; + } + + public PonyLevel getPonyLevel() { + return this.ponyLevel; + } + + public int getPonyPigzombies() { + return this.ponyPigzombies; + } + + public int getPonySkeletons() { + return this.ponySkeletons; + } + + public int getPonyVillagers() { + return this.ponyVillagers; + } + + public int getPonyZombies() { + return this.ponyZombies; + } + + public int getShowScale() { + return this.showScale; + } + + public int getShowSnuzzles() { + return this.showSnuzzles; + } + + public int getUseSizes() { + return this.useSizes; + } + + public void setHD(int useHDSkinServer) { + this.useHDSkinServer = useHDSkinServer; + } + + public void setPonyArmor(int ponyArmor) { + this.ponyArmor = ponyArmor; + } + + public void setPonyLevel(PonyLevel ponyLevel) { + this.ponyLevel = ponyLevel; + } + + public void setPonyPigzombies(int ponyPigzombies) { + this.ponyPigzombies = ponyPigzombies; + } + + public void setPonySkeletons(int ponySkeletons) { + this.ponySkeletons = ponySkeletons; + } + + public void setPonyVillagers(int ponyVillagers) { + this.ponyVillagers = ponyVillagers; + } + + public void setPonyZombies(int ponyZombies) { + this.ponyZombies = ponyZombies; + } + + public void setShowScale(int showScale) { + this.showScale = showScale; + } + + public void setShowSnuzzles(int showSnuzzles) { + this.showSnuzzles = showSnuzzles; + } + + public void setUseSizes(int useSizes) { + this.useSizes = useSizes; + } + + static { + for (int check = 0; check < MAX_BGPONY_COUNT; ++check) { + backgroundPonyResourceLocations + .add(new ResourceLocation("minelittlepony", "textures/entity/pony/bpony_" + check + ".png")); + } + + numberOfPonies = backgroundPonyResourceLocations.size(); + MineLPLogger.info("Detected %d of %d background ponies installed.", + new Object[] { Integer.valueOf(numberOfPonies), Integer.valueOf(MAX_BGPONY_COUNT) }); + villagerResourceLocations = new ArrayList(); + villagerResourceLocations + .add(new ResourceLocation("minelittlepony", "textures/entity/villager/farmer_pony.png")); + villagerResourceLocations + .add(new ResourceLocation("minelittlepony", "textures/entity/villager/librarian_pony.png")); + villagerResourceLocations + .add(new ResourceLocation("minelittlepony", "textures/entity/villager/priest_pony.png")); + villagerResourceLocations + .add(new ResourceLocation("minelittlepony", "textures/entity/villager/smith_pony.png")); + villagerResourceLocations + .add(new ResourceLocation("minelittlepony", "textures/entity/villager/butcher_pony.png")); + villagerResourceLocations + .add(new ResourceLocation("minelittlepony", "textures/entity/villager/villager_pony.png")); + } + + public static enum PonyRace { + EARTH, + PEGASUS, + UNICORN, + ALICORN, + CHANGELING, + ZEBRA; + } +} diff --git a/src/main/java/com/minelittlepony/minelp/gui/FakeVoxelPropertyCheckBox.java b/src/main/java/com/minelittlepony/minelp/gui/FakeVoxelPropertyCheckBox.java new file mode 100644 index 00000000..b883c5ac --- /dev/null +++ b/src/main/java/com/minelittlepony/minelp/gui/FakeVoxelPropertyCheckBox.java @@ -0,0 +1,77 @@ +package com.minelittlepony.minelp.gui; + +import com.voxelmodpack.common.LiteModVoxelCommon; +import com.voxelmodpack.common.gui.interfaces.IExtendedGui; +import com.voxelmodpack.common.properties.VoxelProperty; +import com.voxelmodpack.common.properties.interfaces.IVoxelPropertyProvider; +import com.voxelmodpack.common.properties.interfaces.IVoxelPropertyProviderInteger; + +public class FakeVoxelPropertyCheckBox extends VoxelProperty { + private int width = 11; + + public FakeVoxelPropertyCheckBox(IVoxelPropertyProvider propertyProvider, String binding, String text, int xPos, + int yPos) { + super(propertyProvider, binding, text, xPos, yPos); + this.width = this.fontRenderer.getStringWidth(this.displayText) + 20; + } + + @Override + public void draw(IExtendedGui host, int mouseX, int mouseY) { + this.drawString(this.fontRenderer, this.displayText, this.xPosition + 20, this.yPosition + 2, 16777215); + boolean overButton = this.mouseOver(mouseX, mouseY); + boolean checked = true; + + try { + int e = this.propertyProvider.getIntProperty(this.propertyBinding); + if (e < 2 && e > -1) { + if (e == 0) { + checked = false; + } else { + checked = true; + } + } + } catch (Exception var7) { + ; + } + + host.drawTessellatedModalBorderRect(LiteModVoxelCommon.GUIPARTS, 256, this.xPosition, this.yPosition, + this.xPosition + 11, this.yPosition + 11, 0, overButton ? 16 : 0, 16, overButton ? 32 : 16, 4); + host.drawTexturedModalRect(LiteModVoxelCommon.GUIPARTS, this.xPosition, this.yPosition, this.xPosition + 10, + this.yPosition + 10, checked ? 12 : 0, 52, checked ? 23 : 11, 63); + } + + @Override + public void mouseClicked(int mouseX, int mouseY) { + if (this.mouseOver(mouseX, mouseY)) { + boolean checked = true; + + try { + int e = this.propertyProvider.getIntProperty(this.propertyBinding); + if (e < 2 && e > -1) { + if (e == 0) { + checked = false; + } else { + checked = true; + } + } + } catch (Exception var5) { + ; + } + + if (checked) { + this.propertyProvider.setProperty(this.propertyBinding, 0); + } else { + this.propertyProvider.setProperty(this.propertyBinding, 1); + } + } + + } + + public boolean mouseOver(int mouseX, int mouseY) { + return mouseX > this.xPosition && mouseX < this.xPosition + this.width && mouseY > this.yPosition + && mouseY < this.yPosition + 11; + } + + @Override + public void keyTyped(char keyChar, int keyCode) {} +} diff --git a/src/main/java/com/minelittlepony/minelp/gui/MineLittlePonyGUI.java b/src/main/java/com/minelittlepony/minelp/gui/MineLittlePonyGUI.java new file mode 100644 index 00000000..18626ba1 --- /dev/null +++ b/src/main/java/com/minelittlepony/minelp/gui/MineLittlePonyGUI.java @@ -0,0 +1,25 @@ +package com.minelittlepony.minelp.gui; + +import com.minelittlepony.minelp.MineLittlePony; +import com.voxelmodpack.common.properties.VoxelPropertyLabel; +import com.voxelmodpack.common.properties.gui.GuiVoxelBoxSettingsPanel; + +public class MineLittlePonyGUI extends GuiVoxelBoxSettingsPanel { + public MineLittlePonyGUI() { + // PonyManager ponyManager = PonyManager.getInstance(); + this.config = MineLittlePony.getConfig(); + byte col1 = 30; + this.properties.add(new VoxelPropertyIntSlider(this.config, "ponylevel", "Pony Level", PANEL_LEFT, PANEL_TOP + 24)); + this.properties.add(new VoxelPropertyLabel("Pony Options", PANEL_LEFT + 15, PANEL_TOP + 58)); + this.properties.add(new FakeVoxelPropertyCheckBox(this.config, "hd", "Enable MineLP skin server (requires restart)", PANEL_LEFT + col1, PANEL_TOP + 72)); + this.properties.add(new FakeVoxelPropertyCheckBox(this.config, "sizes", "Allow all different sizes of pony", PANEL_LEFT + col1, PANEL_TOP + 90)); + this.properties.add(new FakeVoxelPropertyCheckBox(this.config, "ponyarmor", "Use Mine Little Pony compatible armor", PANEL_LEFT + col1, PANEL_TOP + 108)); + this.properties.add(new FakeVoxelPropertyCheckBox(this.config, "snuzzles", "Display snuzzles on ponies", PANEL_LEFT + col1, PANEL_TOP + 126)); + this.properties.add(new FakeVoxelPropertyCheckBox(this.config, "showscale", "Use show-accurate scaling", PANEL_LEFT + col1, PANEL_TOP + 144)); + } + + @Override + public String getPanelTitle() { + return "Mine Little Pony Settings"; + } +} diff --git a/src/main/java/com/minelittlepony/minelp/gui/MineLittlePonyGUIMob.java b/src/main/java/com/minelittlepony/minelp/gui/MineLittlePonyGUIMob.java new file mode 100644 index 00000000..73593586 --- /dev/null +++ b/src/main/java/com/minelittlepony/minelp/gui/MineLittlePonyGUIMob.java @@ -0,0 +1,24 @@ +package com.minelittlepony.minelp.gui; + +import com.minelittlepony.minelp.MineLittlePony; +import com.voxelmodpack.common.properties.VoxelPropertyLabel; +import com.voxelmodpack.common.properties.gui.GuiVoxelBoxSettingsPanel; + +public class MineLittlePonyGUIMob extends GuiVoxelBoxSettingsPanel { + public MineLittlePonyGUIMob() { + // PonyManager ponyManager = PonyManager.getInstance(); + this.config = MineLittlePony.getConfig(); + byte col1 = 30; + this.properties.add(new VoxelPropertyLabel("If you make any changes here, you must restart", PANEL_LEFT + 15, PANEL_TOP + 11, 16737894)); + this.properties.add(new VoxelPropertyLabel("Minecraft before they will take effect!", PANEL_LEFT + 15, PANEL_TOP + 23, 16737894)); + this.properties.add(new FakeVoxelPropertyCheckBox(this.config, "villagers", "Ponify villagers", PANEL_LEFT + col1, PANEL_TOP + 42)); + this.properties.add(new FakeVoxelPropertyCheckBox(this.config, "zombies", "Ponify zombies", PANEL_LEFT + col1, PANEL_TOP + 60)); + this.properties.add(new FakeVoxelPropertyCheckBox(this.config, "pigzombies", "Ponify zombie pigmen", PANEL_LEFT + col1, PANEL_TOP + 78)); + this.properties.add(new FakeVoxelPropertyCheckBox(this.config, "skeletons", "Ponify skeletons", PANEL_LEFT + col1, PANEL_TOP + 96)); + } + + @Override + public String getPanelTitle() { + return "Mine Little Pony Mob Settings"; + } +} diff --git a/src/main/java/com/minelittlepony/minelp/gui/VoxelPropertyIntSlider.java b/src/main/java/com/minelittlepony/minelp/gui/VoxelPropertyIntSlider.java new file mode 100644 index 00000000..10c3ac1e --- /dev/null +++ b/src/main/java/com/minelittlepony/minelp/gui/VoxelPropertyIntSlider.java @@ -0,0 +1,175 @@ +package com.minelittlepony.minelp.gui; + +import org.lwjgl.input.Mouse; + +import com.voxelmodpack.common.LiteModVoxelCommon; +import com.voxelmodpack.common.gui.interfaces.IExtendedGui; +import com.voxelmodpack.common.properties.VoxelProperty; +import com.voxelmodpack.common.properties.interfaces.IVoxelPropertyProviderInteger; + +import net.minecraft.util.MathHelper; + +public class VoxelPropertyIntSlider extends VoxelProperty { + int minValue; + int maxValue; + float value; + boolean overReset; + boolean overSlide; + boolean overBar; + boolean setBar; + boolean dragging; + int offset; + String minText; + String midText; + String maxText; + String labelText; + + public VoxelPropertyIntSlider(IVoxelPropertyProviderInteger parent, String binding, String text, String minText, + String maxText, int xPos, int yPos, int min, int max) { + this(parent, binding, text, minText, maxText, xPos, yPos); + this.minValue = min; + this.maxValue = max; + } + + public VoxelPropertyIntSlider(IVoxelPropertyProviderInteger parent, String binding, String text, int xPos, int yPos, + float min, float max) { + this(parent, binding, text, xPos, yPos); + } + + public VoxelPropertyIntSlider(IVoxelPropertyProviderInteger parent, String binding, String text, String minText, + String maxText, int xPos, int yPos) { + this(parent, binding, text, xPos, yPos); + this.minText = minText; + this.maxText = maxText; + } + + public VoxelPropertyIntSlider(IVoxelPropertyProviderInteger parent, String binding, String text, int xPos, + int yPos) { + super(parent, binding, text, xPos, yPos); + this.minValue = 0; + this.maxValue = 2; + this.value = 2.0F; + this.overReset = false; + this.overSlide = false; + this.overBar = false; + this.setBar = false; + this.dragging = false; + this.offset = 0; + this.minText = "Humans"; + this.midText = "Mix"; + this.maxText = "Ponies"; + } + + @Override + public void draw(IExtendedGui gui, int mouseX, int mouseY) { + this.overReset = this.mouseOverReset(mouseX, mouseY); + int outset = this.overReset ? 1 : 0; + int v = this.overReset ? 16 : 0; + drawRect(this.xPosition + 160 - outset, this.yPosition + 11 - outset, this.xPosition + 212 + outset, + this.yPosition + 26 + outset, -16777216); + gui.drawTessellatedModalBorderRect(LiteModVoxelCommon.GUIPARTS, 256, this.xPosition + 159 - outset, + this.yPosition + 10 - outset, this.xPosition + 213 + outset, this.yPosition + 27 + outset, 0, v, 16, + 16 + v, 4); + this.drawString(this.mc.fontRendererObj, "Default", this.xPosition + 169, this.yPosition + 15, + this.overReset ? 16777215 : 10066329); + int sliderLeft = this.xPosition + 48; + int sliderRight = this.xPosition + 124; + int sliderXPos = sliderLeft + 32; + int sliderXPos2 = sliderLeft + 45; + int sliderYPos = this.yPosition + 12; + int sliderYPos2 = this.yPosition + 25; + int sliderMinX = sliderLeft - (sliderXPos + sliderXPos2) / 2 + 5; + int sliderMaxX = sliderRight - (sliderXPos + sliderXPos2) / 2 - 5; + this.drawHorizontalLine(sliderLeft, sliderRight, this.yPosition + 18, -6710887); + this.drawVerticalLine(this.xPosition + 86, this.yPosition + 14, this.yPosition + 22, -6710887); + this.drawVerticalLine(sliderLeft, this.yPosition + 14, this.yPosition + 22, -6710887); + this.drawVerticalLine(sliderRight, this.yPosition + 14, this.yPosition + 22, -6710887); + if (this.displayText != null) { + this.drawString(this.mc.fontRendererObj, this.displayText, this.xPosition + 15, this.yPosition - 14, 10079487); + } + + this.drawString(this.mc.fontRendererObj, this.minText, this.xPosition + 35, this.yPosition, 16777215); + if (this.midText != null) { + this.drawString(this.mc.fontRendererObj, this.midText, this.xPosition + 80, this.yPosition, 16777215); + } + + if (this.maxText != null) { + this.drawString(this.mc.fontRendererObj, this.maxText, this.xPosition + 110, this.yPosition, 16777215); + } else { + float scale = (this.value + 1.0F) / 2.0F; + int displayValue = MathHelper.ceiling_float_int( + (this.minValue + (this.maxValue - this.minValue) * scale) * 100.0F); + this.drawString(this.mc.fontRendererObj, displayValue + "%", this.xPosition + 130, this.yPosition + 15, + 16777215); + } + + this.overSlide = this.mouseIn(mouseX, mouseY, sliderXPos, sliderYPos, sliderXPos2, sliderYPos2); + this.overBar = this.mouseIn(mouseX, mouseY, sliderLeft, sliderYPos, sliderRight, sliderYPos2) + && !this.overSlide; + if (this.dragging) { + if (Mouse.isButtonDown(0)) { + this.offset = Math.min(Math.max(mouseX - (sliderXPos + sliderXPos2) / 2, sliderMinX), sliderMaxX); + this.value = (float) this.offset / (float) sliderMaxX; + } else { + this.value = (float) this.offset / (float) sliderMaxX; + this.propertyProvider.setProperty(this.propertyBinding, + Math.round(this.value) + 1); + this.dragging = false; + } + } else { + this.offset = (this.propertyProvider.getIntProperty(this.propertyBinding) + - 1) * sliderMaxX; + this.value = (float) this.offset / (float) sliderMaxX; + } + + if (this.setBar) { + this.offset = mouseX - (sliderXPos + sliderXPos2) / 2; + this.value = (float) this.offset / (float) sliderMaxX; + this.propertyProvider.setProperty(this.propertyBinding, + Math.round(this.value) + 1); + this.setBar = false; + this.dragging = true; + } + + if (this.offset > sliderMaxX) { + this.offset = sliderMaxX; + } + + if (this.offset < sliderMinX) { + this.offset = sliderMinX; + } + + drawRect(sliderXPos2 - 1 + this.offset, sliderYPos2 - 1, sliderXPos + 1 + this.offset, sliderYPos + 1, + -16777216); + gui.drawTessellatedModalBorderRect(LiteModVoxelCommon.GUIPARTS, 256, sliderXPos + this.offset, sliderYPos, + sliderXPos2 + this.offset, sliderYPos2, 0, !this.overSlide && !this.dragging ? 0 : 16, 16, + !this.overSlide && !this.dragging ? 16 : 32, 4); + } + + protected boolean mouseIn(int mouseX, int mouseY, int x1, int y1, int x2, int y2) { + return mouseX > x1 + this.offset && mouseX < x2 + this.offset && mouseY > y1 && mouseY < y2; + } + + protected boolean mouseOverReset(int mouseX, int mouseY) { + return mouseX > this.xPosition + 159 && mouseX < this.xPosition + 213 && mouseY > this.yPosition + 10 + && mouseY < this.yPosition + 27; + } + + @Override + public void mouseClicked(int mouseX, int mouseY) { + if (this.overSlide) { + this.dragging = true; + this.playClickSound(this.mc.getSoundHandler()); + } else if (this.overBar) { + this.setBar = true; + this.playClickSound(this.mc.getSoundHandler()); + } else if (this.overReset) { + this.propertyProvider.setProperty(this.propertyBinding, 2); + this.playClickSound(this.mc.getSoundHandler()); + } + + } + + @Override + public void keyTyped(char keyChar, int keyCode) {} +} diff --git a/src/main/java/com/minelittlepony/minelp/hdskins/gui/EntityPonyModel.java b/src/main/java/com/minelittlepony/minelp/hdskins/gui/EntityPonyModel.java new file mode 100644 index 00000000..9d3086c1 --- /dev/null +++ b/src/main/java/com/minelittlepony/minelp/hdskins/gui/EntityPonyModel.java @@ -0,0 +1,10 @@ +package com.minelittlepony.minelp.hdskins.gui; + +import com.mojang.authlib.GameProfile; +import com.voxelmodpack.hdskins.gui.EntityPlayerModel; + +public class EntityPonyModel extends EntityPlayerModel { + public EntityPonyModel(GameProfile profile) { + super(profile); + } +} diff --git a/src/main/java/com/minelittlepony/minelp/hdskins/gui/GuiSkinsMineLP.java b/src/main/java/com/minelittlepony/minelp/hdskins/gui/GuiSkinsMineLP.java new file mode 100644 index 00000000..8f2a65e1 --- /dev/null +++ b/src/main/java/com/minelittlepony/minelp/hdskins/gui/GuiSkinsMineLP.java @@ -0,0 +1,684 @@ +package com.minelittlepony.minelp.hdskins.gui; + +import static net.minecraft.client.renderer.GlStateManager.*; + +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.IOException; +import java.nio.DoubleBuffer; +import java.util.HashMap; +import java.util.List; +import java.util.UUID; + +import javax.imageio.ImageIO; +import javax.swing.JFileChooser; + +import org.lwjgl.BufferUtils; +import org.lwjgl.opengl.GL11; +import org.lwjgl.util.glu.GLU; + +import com.minelittlepony.minelp.PonyManager; +import com.minelittlepony.minelp.util.MineLPLogger; +import com.mojang.authlib.GameProfile; +import com.mojang.authlib.exceptions.AuthenticationException; +import com.mojang.authlib.minecraft.MinecraftSessionService; +import com.mojang.authlib.yggdrasil.YggdrasilAuthenticationService; +import com.mumfrey.liteloader.util.log.LiteLoaderLogger; +import com.voxelmodpack.common.net.upload.IUploadCompleteCallback; +import com.voxelmodpack.common.net.upload.ThreadMultipartPostUpload; +import com.voxelmodpack.common.net.upload.awt.IOpenFileCallback; +import com.voxelmodpack.common.net.upload.awt.ThreadOpenFilePNG; +import com.voxelmodpack.hdskins.gui.EntityPlayerModel; +import com.voxelmodpack.hdskins.mod.HDSkinsModCore; +import com.voxelmodpack.voxelmenu.IPanoramaRenderer; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.Gui; +import net.minecraft.client.gui.GuiButton; +import net.minecraft.client.gui.GuiMainMenu; +import net.minecraft.client.gui.GuiScreen; +import net.minecraft.client.renderer.RenderHelper; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.renderer.WorldRenderer; +import net.minecraft.client.renderer.entity.RenderManager; +import net.minecraft.client.renderer.texture.DynamicTexture; +import net.minecraft.util.MathHelper; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.Session; + +public class GuiSkinsMineLP extends GuiScreen implements IUploadCompleteCallback, IOpenFileCallback, IPanoramaRenderer { + private static final ResourceLocation vignette = new ResourceLocation("textures/misc/vignette.png"); + private static final int MAX_SKIN_DIMENSION = 8192; + private static final String skinServerId = "7853dfddc358333843ad55a2c7485c4aa0380a51"; + private int updateCounter = 0; + private ResourceLocation viewportTexture; + private IPanoramaRenderer panoramaRenderer; + private static final ResourceLocation[] cubemapTextures = { + new ResourceLocation("hdskins", "textures/cubemaps/cubemap0_0.png"), + new ResourceLocation("hdskins", "textures/cubemaps/cubemap0_1.png"), + new ResourceLocation("hdskins", "textures/cubemaps/cubemap0_2.png"), + new ResourceLocation("hdskins", "textures/cubemaps/cubemap0_3.png"), + new ResourceLocation("hdskins", "textures/cubemaps/cubemap0_4.png"), + new ResourceLocation("hdskins", "textures/cubemaps/cubemap0_5.png") }; + private GuiButton btnBrowse; + private GuiButton btnUpload; + private GuiButton btnClear; + private GuiButton btnBack; + private EntityPonyModel localPlayer; + private EntityPonyModel remotePlayer; + protected DoubleBuffer doubleBuffer; + private String screenTitle; + private String uploadError; + private volatile String skinMessage = "Choose a file"; + private String skinUploadMessage = "Uploading skin please wait..."; + private volatile boolean fetchingSkin; + private volatile boolean uploadingSkin; + private volatile boolean pendingRemoteSkinRefresh; + private volatile boolean throttledByMojang; + private int refreshCounter = -1; + private ThreadOpenFilePNG openFileThread; + private ThreadMultipartPostUpload threadSkinUpload; + private Object skinLock = new Object(); + private File pendingSkinFile; + private File selectedSkin; + private BufferedImage pendingSkinImage; + private float uploadOpacity = 0.0F; + private float lastPartialTick; + + public GuiSkinsMineLP() { + Minecraft minecraft = Minecraft.getMinecraft(); + this.screenTitle = "Skin Manager"; + GameProfile profile = minecraft.getSession().getProfile(); + this.localPlayer = new EntityPonyModel(profile); + this.remotePlayer = new EntityPonyModel(profile); + RenderManager rm = Minecraft.getMinecraft().getRenderManager(); + rm.renderEngine = minecraft.getTextureManager(); + rm.options = minecraft.gameSettings; + rm.livingPlayer = this.localPlayer; + this.setRemoteSkin(); + this.fetchingSkin = true; + this.panoramaRenderer = HDSkinsModCore.getPanoramaRenderer(this); + } + + @Override + public void updateScreen() { + ++this.updateCounter; + this.panoramaRenderer.updatePanorama(); + this.localPlayer.updateModel(); + this.remotePlayer.updateModel(); + if (this.fetchingSkin && this.remotePlayer.isTextureSetupComplete()) { + this.fetchingSkin = false; + this.btnClear.enabled = true; + } + + synchronized (this.skinLock) { + if (this.pendingSkinFile != null) { + this.localPlayer.setLocalSkin(this.pendingSkinFile); + this.selectedSkin = this.pendingSkinFile; + this.pendingSkinFile = null; + MineLPLogger.debug("Invalidating old local skin, checking updated local skin"); + PonyManager.getInstance().getPonyFromResourceRegistry(this.localPlayer.getSkinTexture()) + .checkSkin(this.pendingSkinImage); + this.pendingSkinImage = null; + this.btnUpload.enabled = true; + } + } + + if (this.pendingRemoteSkinRefresh) { + this.pendingRemoteSkinRefresh = false; + this.fetchingSkin = true; + this.btnClear.enabled = false; + this.setRemoteSkin(); + MineLPLogger.debug("Invalidating old remove skin, checking updated remote skin"); + PonyManager.getInstance().getPonyFromResourceRegistry(this.remotePlayer.getSkinTexture()) + .invalidateSkinCheck(); + } + + if (this.throttledByMojang) { + if (this.refreshCounter == -1) { + this.refreshCounter = 200; + } else if (this.refreshCounter > 0) { + --this.refreshCounter; + } else { + this.refreshCounter = -1; + this.throttledByMojang = false; + this.setRemoteSkin(); + } + } + + } + + private void setRemoteSkin() { + try { + this.remotePlayer.setRemoteSkin(); + } catch (Exception var2) { + var2.printStackTrace(); + this.throttledByMojang = true; + } + + } + + @Override + public void updatePanorama() {} + + @Override + public int getUpdateCounter() { + return this.updateCounter; + } + + @Override + public void setWorldAndResolution(Minecraft par1Minecraft, int par2, int par3) { + super.setWorldAndResolution(par1Minecraft, par2, par3); + this.panoramaRenderer.setPanoramaResolution(par1Minecraft, par2, par3); + } + + @Override + public void setPanoramaResolution(Minecraft minecraft, int width, int height) {} + + protected List getControlList() { + return this.buttonList; + } + + @Override + public void initGui() { + super.initGui(); + this.panoramaRenderer.initPanoramaRenderer(); + this.getControlList().clear(); + this.getControlList().add(this.btnBrowse = new GuiButton(0, 30, this.height - 36, 60, 20, "Browse...")); + this.getControlList() + .add(this.btnUpload = new GuiButton(1, this.width / 2 - 24, this.height / 2 - 10, 48, 20, ">>")); + this.getControlList().add(this.btnClear = new GuiButton(2, this.width - 90, this.height - 36, 60, 20, "Clear")); + this.getControlList() + .add(this.btnBack = new GuiButton(3, this.width / 2 - 50, this.height - 36, 100, 20, "Close")); + this.btnUpload.enabled = false; + this.btnBrowse.enabled = !this.mc.isFullScreen(); + } + + @Override + public void initPanoramaRenderer() { + this.viewportTexture = this.mc.getTextureManager().getDynamicTextureLocation("skinpanorama", + new DynamicTexture(256, 256)); + } + + @Override + public void onGuiClosed() { + super.onGuiClosed(); + this.localPlayer.releaseTextures(); + this.remotePlayer.releaseTextures(); + PonyManager.getInstance().getPonyFromResourceRegistry(this.localPlayer.getSkinTexture()).invalidateSkinCheck(); + PonyManager.getInstance().getPonyFromResourceRegistry(this.remotePlayer.getSkinTexture()).invalidateSkinCheck(); + } + + @Override + public void onFileOpenDialogClosed(JFileChooser fileDialog, int dialogResult) { + this.openFileThread = null; + if (dialogResult == 0) { + this.loadLocalFile(fileDialog.getSelectedFile()); + } + + } + + private void loadLocalFile(File skinFile) { + if (!skinFile.exists()) { + this.skinMessage = "File not readable"; + } else { + BufferedImage chosenImage; + try { + chosenImage = ImageIO.read(skinFile); + } catch (IOException var6) { + this.skinMessage = "Error opening skin file"; + var6.printStackTrace(); + return; + } + + if (chosenImage == null) { + this.skinMessage = "Error opening skin file"; + } else if (isPowerOfTwo(chosenImage.getWidth()) + && (chosenImage.getWidth() == chosenImage.getHeight() * 2 + || chosenImage.getWidth() == chosenImage.getHeight()) + && chosenImage.getWidth() <= MAX_SKIN_DIMENSION + && chosenImage.getHeight() <= MAX_SKIN_DIMENSION) { + synchronized (this.skinLock) { + this.pendingSkinFile = skinFile; + this.pendingSkinImage = chosenImage; + } + } else { + this.skinMessage = "Not a valid skin file"; + } + } + } + + @Override + protected void actionPerformed(GuiButton guiButton) { + if (this.openFileThread == null && !this.uploadingSkin) { + if (this.uploadError != null) { + this.uploadError = null; + } else { + if (guiButton.id == this.btnBrowse.id) { + this.selectedSkin = null; + this.localPlayer.releaseTextures(); + this.openFileThread = new ThreadOpenFilePNG(this.mc, "Choose skin", this); + this.openFileThread.start(); + } + + if (guiButton.id == this.btnUpload.id) { + if (this.selectedSkin != null) { + this.uploadSkin(this.mc.getSession(), this.selectedSkin); + this.btnUpload.enabled = false; + } else { + this.setUploadError("Please select a skin first"); + } + } + + if (guiButton.id == this.btnClear.id && this.remotePlayer.isTextureSetupComplete()) { + this.clearUploadedSkin(this.mc.getSession()); + this.btnUpload.enabled = this.selectedSkin != null; + } + + if (guiButton.id == this.btnBack.id) { + this.mc.displayGuiScreen(new GuiMainMenu()); + } + + } + } + } + + @Override + protected void mouseClicked(int mouseX, int mouseY, int button) throws IOException { + if (this.uploadError != null) { + this.uploadError = null; + } else { + super.mouseClicked(mouseX, mouseY, button); + byte top = 30; + int bottom = this.height - 40; + int mid = this.width / 2; + if ((mouseX > 30 && mouseX < mid - 30 || mouseX > mid + 30 && mouseX < this.width - 30) && mouseY > top + && mouseY < bottom) { + this.localPlayer.swingArm(); + this.remotePlayer.swingArm(); + } + + } + } + + @Override + protected void keyTyped(char keyChar, int keyCode) throws IOException { + if (this.openFileThread == null && !this.uploadingSkin) { + super.keyTyped(keyChar, keyCode); + } + } + + public void setupCubemapCamera() { + matrixMode(5889); + pushMatrix(); + loadIdentity(); + GLU.gluPerspective(150.0F, 1.0F, 0.05F, 10.0F); + matrixMode(5888); + pushMatrix(); + loadIdentity(); + } + + public void revertPanoramaMatrix() { + matrixMode(5889); + popMatrix(); + matrixMode(5888); + popMatrix(); + } + + private void renderCubeMapTexture(int mouseX, int mouseY, float partialTick) { + this.setupCubemapCamera(); + color(1.0F, 1.0F, 1.0F, 1.0F); + rotate(180.0F, 1.0F, 0.0F, 0.0F); + GL11.glEnable(3042); + GL11.glDisable(3008); + GL11.glDisable(2884); + depthMask(false); + blendFunc(770, 771); + byte blendIterations = 8; + Tessellator tessellator = Tessellator.getInstance(); + WorldRenderer wr = tessellator.getWorldRenderer(); + + for (int blendPass = 0; blendPass < blendIterations * blendIterations; ++blendPass) { + pushMatrix(); + float offsetX = ((float) (blendPass % blendIterations) / (float) blendIterations - 0.5F) / 64.0F; + float offsetY = ((float) (blendPass / blendIterations) / (float) blendIterations - 0.5F) / 64.0F; + float offsetZ = 0.0F; + translate(offsetX, offsetY, offsetZ); + rotate(MathHelper.sin((this.updateCounter + 200 + partialTick) / 400.0F) * 25.0F + 20.0F, 1.0F, + 0.0F, 0.0F); + rotate(-(this.updateCounter + 200 + partialTick) * 0.1F, 0.0F, 1.0F, 0.0F); + + for (int cubeSide = 0; cubeSide < 6; ++cubeSide) { + pushMatrix(); + if (cubeSide == 1) { + rotate(90.0F, 0.0F, 1.0F, 0.0F); + } + + if (cubeSide == 2) { + rotate(180.0F, 0.0F, 1.0F, 0.0F); + } + + if (cubeSide == 3) { + rotate(-90.0F, 0.0F, 1.0F, 0.0F); + } + + if (cubeSide == 4) { + rotate(90.0F, 1.0F, 0.0F, 0.0F); + } + + if (cubeSide == 5) { + rotate(-90.0F, 1.0F, 0.0F, 0.0F); + } + + this.mc.getTextureManager().bindTexture(cubemapTextures[cubeSide]); + wr.startDrawingQuads(); + wr.setColorRGBA_I(16777215, 255 / (blendPass + 1)); + wr.addVertexWithUV(-1.0D, -1.0D, 1.0D, 0.0D, 0.0D); + wr.addVertexWithUV(1.0D, -1.0D, 1.0D, 1.0D, 0.0D); + wr.addVertexWithUV(1.0D, 1.0D, 1.0D, 1.0D, 1.0D); + wr.addVertexWithUV(-1.0D, 1.0D, 1.0D, 0.0D, 1.0D); + tessellator.draw(); + popMatrix(); + } + + popMatrix(); + colorMask(true, true, true, false); + } + + wr.setTranslation(0.0D, 0.0D, 0.0D); + colorMask(true, true, true, true); + depthMask(true); + GL11.glEnable(2884); + GL11.glEnable(3008); + GL11.glEnable(2929); + this.revertPanoramaMatrix(); + } + + private void rotateAndBlurCubemap(float partialTick) { + this.mc.getTextureManager().bindTexture(this.viewportTexture); + GL11.glCopyTexSubImage2D(3553, 0, 0, 0, 0, 0, 256, 256); + GL11.glEnable(3042); + blendFunc(770, 771); + colorMask(true, true, true, false); + Tessellator tessellator = Tessellator.getInstance(); + WorldRenderer wr = tessellator.getWorldRenderer(); + wr.startDrawingQuads(); + byte blurPasses = 4; + + for (int blurPass = 0; blurPass < blurPasses; ++blurPass) { + wr.setColorRGBA_F(1.0F, 1.0F, 1.0F, 1.0F / (blurPass + 1)); + float var7 = (blurPass - blurPasses / 2) / 256.0F; + wr.addVertexWithUV(this.width, this.height, this.zLevel, 0.0F + var7, 0.0D); + wr.addVertexWithUV(this.width, 0.0D, this.zLevel, 1.0F + var7, 0.0D); + wr.addVertexWithUV(0.0D, 0.0D, this.zLevel, 1.0F + var7, 1.0D); + wr.addVertexWithUV(0.0D, this.height, this.zLevel, 0.0F + var7, 1.0D); + } + + tessellator.draw(); + colorMask(true, true, true, true); + GL11.glDisable(3042); + } + + @Override + public boolean renderPanorama(int mouseX, int mouseY, float partialTicks) { + GL11.glViewport(0, 0, 256, 256); + this.renderCubeMapTexture(mouseX, mouseY, partialTicks); + GL11.glDisable(3553); + GL11.glEnable(3553); + + for (int tessellator = 0; tessellator < 8; ++tessellator) { + this.rotateAndBlurCubemap(partialTicks); + } + + GL11.glViewport(0, 0, this.mc.displayWidth, this.mc.displayHeight); + Tessellator tessellator = Tessellator.getInstance(); + WorldRenderer wr = tessellator.getWorldRenderer(); + wr.startDrawingQuads(); + float aspect = this.width > this.height ? 120.0F / this.width : 120.0F / this.height; + float uSample = this.height * aspect / 256.0F; + float vSample = this.width * aspect / 256.0F; + GL11.glTexParameteri(3553, 10241, 9729); + GL11.glTexParameteri(3553, 10240, 9729); + wr.setColorRGBA_F(1.0F, 1.0F, 1.0F, 1.0F); + wr.addVertexWithUV(0.0D, this.height, this.zLevel, 0.5F - uSample, 0.5F + vSample); + wr.addVertexWithUV(this.width, this.height, this.zLevel, 0.5F - uSample, 0.5F - vSample); + wr.addVertexWithUV(this.width, 0.0D, this.zLevel, 0.5F + uSample, 0.5F - vSample); + wr.addVertexWithUV(0.0D, 0.0D, this.zLevel, 0.5F + uSample, 0.5F + vSample); + tessellator.draw(); + return true; + } + + @Override + public void drawScreen(int mouseX, int mouseY, float partialTick) { + float deltaTime = this.updateCounter + partialTick - this.lastPartialTick; + this.lastPartialTick = this.updateCounter + partialTick; + GL11.glDisable(2912); + this.mc.entityRenderer.disableLightmap(); + this.panoramaRenderer.renderPanorama(mouseX, mouseY, partialTick); + byte top = 30; + int bottom = this.height - 40; + int mid = this.width / 2; + int horizon = this.height / 2 + this.height / 5; + GL11.glPushAttrib(1048575); + Gui.drawRect(30, top, mid - 30, bottom, Integer.MIN_VALUE); + Gui.drawRect(mid + 30, top, this.width - 30, bottom, Integer.MIN_VALUE); + this.drawGradientRect(30, horizon, mid - 30, bottom, -2130706433, 16777215); + this.drawGradientRect(mid + 30, horizon, this.width - 30, bottom, -2130706433, 16777215); + super.drawScreen(mouseX, mouseY, partialTick); + popAttrib(); + this.enableClipping(30, bottom); + float yPos = this.height * 0.75F; + float xPos1 = this.width * 0.25F; + float xPos2 = this.width * 0.75F; + float scale = this.height * 0.25F; + this.renderPlayerModel(this.localPlayer, xPos1, yPos, scale, xPos1 - mouseX, yPos - scale * 1.8F - mouseY, + partialTick); + this.renderPlayerModel(this.remotePlayer, xPos2, yPos, scale, xPos2 - mouseX, yPos - scale * 1.8F - mouseY, + partialTick); + this.disableClipping(); + this.drawCenteredString(this.fontRendererObj, this.screenTitle, this.width / 2, 10, 16777215); + this.fontRendererObj.drawStringWithShadow("Local Skin", 34, 34, 16777215); + this.fontRendererObj.drawStringWithShadow("Server Skin", this.width / 2 + 34, 34, 16777215); + GL11.glDisable(2929); + depthMask(false); + this.drawGradientRect(30, this.height - 60, mid - 30, bottom, 0, -520093697); + this.drawGradientRect(mid + 30, this.height - 60, this.width - 30, bottom, 0, -520093697); + int labelwidth = (this.width / 2 - 80) / 2; + int opacity; + if (!this.localPlayer.isUsingLocalTexture()) { + opacity = this.fontRendererObj.getStringWidth(this.skinMessage) / 2; + Gui.drawRect(40, this.height / 2 - 12, this.width / 2 - 40, this.height / 2 + 12, -1342177280); + this.fontRendererObj.drawStringWithShadow(this.skinMessage, (int) (xPos1 - opacity), this.height / 2 - 4, + 16777215); + } + + if (this.fetchingSkin) { + String opacity1; + if (this.throttledByMojang) { + opacity1 = "\u00a7cMojang API Error!"; + String stringWidth = "Please wait 1 minute"; + int stringWidth1 = this.fontRendererObj.getStringWidth(opacity1) / 2; + int stringWidth2 = this.fontRendererObj.getStringWidth(stringWidth) / 2; + Gui.drawRect((int) (xPos2 - labelwidth), this.height / 2 - 16, this.width - 40, this.height / 2 + 16, + -1342177280); + this.fontRendererObj.drawStringWithShadow(opacity1, (int) (xPos2 - stringWidth1), this.height / 2 - 10, + 16777215); + this.fontRendererObj.drawStringWithShadow(stringWidth, (int) (xPos2 - stringWidth2), + this.height / 2 + 2, 16777215); + } else { + opacity1 = "Fetching skin..."; + int stringWidth1 = this.fontRendererObj.getStringWidth(opacity1) / 2; + Gui.drawRect((int) (xPos2 - labelwidth), this.height / 2 - 12, this.width - 40, this.height / 2 + 12, + -1342177280); + this.fontRendererObj.drawStringWithShadow(opacity1, (int) (xPos2 - stringWidth1), this.height / 2 - 4, + 16777215); + } + } + + if (this.uploadingSkin || this.uploadOpacity > 0.0F) { + if (!this.uploadingSkin) { + this.uploadOpacity -= deltaTime * 0.05F; + } else if (this.uploadOpacity < 1.0F) { + this.uploadOpacity += deltaTime * 0.1F; + } + + if (this.uploadOpacity > 1.0F) { + this.uploadOpacity = 1.0F; + } + + opacity = Math.min(180, (int) (this.uploadOpacity * 180.0F)) & 255; + if (this.uploadOpacity > 0.0F) { + Gui.drawRect(0, 0, this.width, this.height, opacity << 24 | 0); + if (this.uploadingSkin) { + this.drawCenteredString(this.fontRendererObj, this.skinUploadMessage, this.width / 2, + this.height / 2, opacity << 24 | 16777215); + } + } + } + + if (this.uploadError != null) { + Gui.drawRect(0, 0, this.width, this.height, -1342177280); + this.drawCenteredString(this.fontRendererObj, "Uploading skin failed", this.width / 2, this.height / 2 - 10, + -171); + this.drawCenteredString(this.fontRendererObj, this.uploadError, this.width / 2, this.height / 2 + 2, + -43691); + } + + depthMask(true); + GL11.glEnable(2929); + } + + protected void renderVignette(int mouseX, int mouseY, float partialTick) { + GL11.glDisable(2929); + depthMask(false); + blendFunc(1, 774); + color(1.0F, 1.0F, 1.0F, 1.0F); + this.mc.getTextureManager().bindTexture(vignette); + GL11.glLogicOp(5386); + Tessellator tessellator = Tessellator.getInstance(); + WorldRenderer wr = tessellator.getWorldRenderer(); + wr.startDrawingQuads(); + wr.addVertexWithUV(0.0D, this.height, -90.0D, 0.0D, 1.0D); + wr.addVertexWithUV(this.width, this.height, -90.0D, 1.0D, 1.0D); + wr.addVertexWithUV(this.width, 0.0D, -90.0D, 1.0D, 0.0D); + wr.addVertexWithUV(0.0D, 0.0D, -90.0D, 0.0D, 0.0D); + tessellator.draw(); + depthMask(true); + GL11.glDisable(3058); + GL11.glEnable(2929); + color(1.0F, 1.0F, 1.0F, 1.0F); + blendFunc(770, 771); + } + + public void renderPlayerModel(EntityPlayerModel thePlayer, float xPosition, float yPosition, float scale, + float mouseX, float mouseY, float partialTick) { + GL11.glEnable(2903); + pushMatrix(); + translate(xPosition, yPosition, 300.0F); + scale(-scale, scale, scale); + rotate(180.0F, 0.0F, 0.0F, 1.0F); + rotate(135.0F, 0.0F, 1.0F, 0.0F); + RenderHelper.enableStandardItemLighting(); + rotate(-135.0F, 0.0F, 1.0F, 0.0F); + rotate(15.0F, 1.0F, 0.0F, 0.0F); + rotate((this.updateCounter + partialTick) * 2.5F, 0.0F, 1.0F, 0.0F); + thePlayer.rotationPitch = -((float) Math.atan(mouseY / 40.0F)) * 20.0F; + translate(0.0D, thePlayer.getYOffset(), 0.0D); + RenderManager rm = Minecraft.getMinecraft().getRenderManager(); + rm.playerViewY = 180.0F; + rm.renderEntityWithPosYaw(thePlayer, 0.0D, 0.0D, 0.0D, 1.0F, 1.0F); + popMatrix(); + RenderHelper.disableStandardItemLighting(); + GL11.glDisable('\u803a'); + } + + protected final void enableClipping(int yTop, int yBottom) { + if (this.doubleBuffer == null) { + this.doubleBuffer = BufferUtils.createByteBuffer(32).asDoubleBuffer(); + } + + this.doubleBuffer.clear(); + this.doubleBuffer.put(0.0D).put(1.0D).put(0.0D).put((-yTop)).flip(); + GL11.glClipPlane(12288, this.doubleBuffer); + this.doubleBuffer.clear(); + this.doubleBuffer.put(0.0D).put(-1.0D).put(0.0D).put(yBottom).flip(); + GL11.glClipPlane(12289, this.doubleBuffer); + GL11.glEnable(12288); + GL11.glEnable(12289); + } + + protected final void disableClipping() { + GL11.glDisable(12289); + GL11.glDisable(12288); + } + + public static boolean isPowerOfTwo(int number) { + return number != 0 && (number & number - 1) == 0; + } + + private boolean clearUploadedSkin(Session session) { + if (!this.registerServerConnection(session, skinServerId)) { + return false; + } else { + HashMap sourceData = new HashMap(); + sourceData.put("user", session.getUsername()); + sourceData.put("uuid", session.getPlayerID()); + sourceData.put("clear", "1"); + this.uploadError = null; + this.uploadingSkin = true; + this.skinUploadMessage = "Sending request to server please wait..."; + this.threadSkinUpload = new ThreadMultipartPostUpload("http://minelpskinmanager.voxelmodpack.com/", + sourceData, this); + this.threadSkinUpload.start(); + return true; + } + } + + private boolean uploadSkin(Session session, File skinFile) { + if (!this.registerServerConnection(session, skinServerId)) { + return false; + } else { + HashMap sourceData = new HashMap(); + sourceData.put("user", session.getUsername()); + sourceData.put("uuid", session.getPlayerID()); + sourceData.put("skin", skinFile); + this.uploadError = null; + this.uploadingSkin = true; + this.skinUploadMessage = "Uploading skin please wait..."; + this.threadSkinUpload = new ThreadMultipartPostUpload("http://minelpskinmanager.voxelmodpack.com/", + sourceData, this); + this.threadSkinUpload.start(); + return true; + } + } + + private void setUploadError(String error) { + this.uploadError = error.startsWith("ERROR: ") ? error.substring(7) : error; + this.btnUpload.enabled = true; + } + + @Override + public void onUploadComplete(String response) { + LiteLoaderLogger.info("Upload completed with: %s", new Object[] { response }); + this.uploadingSkin = false; + this.threadSkinUpload = null; + if (!response.equalsIgnoreCase("OK")) { + this.setUploadError(response); + } else { + this.pendingRemoteSkinRefresh = true; + } + } + + private boolean registerServerConnection(Session session, String serverId) { + try { + MinecraftSessionService e = (new YggdrasilAuthenticationService(this.mc.getProxy(), + UUID.randomUUID().toString())).createMinecraftSessionService(); + e.joinServer(session.getProfile(), session.getToken(), serverId); + return true; + } catch (AuthenticationException var4) { + this.setUploadError(var4.toString()); + var4.printStackTrace(); + return false; + } + } +} diff --git a/src/main/java/com/minelittlepony/minelp/hdskins/gui/NewGuiSkinsMineLP.java b/src/main/java/com/minelittlepony/minelp/hdskins/gui/NewGuiSkinsMineLP.java new file mode 100644 index 00000000..3420035e --- /dev/null +++ b/src/main/java/com/minelittlepony/minelp/hdskins/gui/NewGuiSkinsMineLP.java @@ -0,0 +1,48 @@ +package com.minelittlepony.minelp.hdskins.gui; + +import java.io.File; +import java.io.IOException; + +import javax.imageio.ImageIO; + +import com.minelittlepony.minelp.PonyManager; +import com.minelittlepony.minelp.util.MineLPLogger; +import com.mojang.authlib.GameProfile; +import com.voxelmodpack.hdskins.gui.GuiSkins; + +import net.minecraft.client.Minecraft; + +class dGuiSkinsMineLP extends GuiSkins { + + public dGuiSkinsMineLP() { + GameProfile profile = Minecraft.getMinecraft().getSession().getProfile(); + this.localPlayer = new EntityPonyModel(profile); + this.remotePlayer = new EntityPonyModel(profile); + } + + @Override + protected void setLocalSkin(File pendingSkin) { + super.setLocalSkin(pendingSkin); + MineLPLogger.debug("Invalidating old local skin, checking updated local skin"); + try { + PonyManager.getInstance().getPonyFromResourceRegistry(this.localPlayer.getSkinTexture()).checkSkin(ImageIO.read(pendingSkin)); + } catch (IOException e) { + MineLPLogger.error(e, "Unable to read file {}", pendingSkin.getName()); + } + + } + + @Override + protected void setRemoteSkin() { + super.setRemoteSkin(); + PonyManager.getInstance().getPonyFromResourceRegistry(this.remotePlayer.getSkinTexture()).invalidateSkinCheck(); + } + + @Override + public void onGuiClosed() { + super.onGuiClosed(); + PonyManager.getInstance().getPonyFromResourceRegistry(this.localPlayer.getSkinTexture()).invalidateSkinCheck(); + PonyManager.getInstance().getPonyFromResourceRegistry(this.remotePlayer.getSkinTexture()).invalidateSkinCheck(); + + } +} diff --git a/src/main/java/com/minelittlepony/minelp/hdskins/gui/RenderPonyModel.java b/src/main/java/com/minelittlepony/minelp/hdskins/gui/RenderPonyModel.java new file mode 100644 index 00000000..a3331e54 --- /dev/null +++ b/src/main/java/com/minelittlepony/minelp/hdskins/gui/RenderPonyModel.java @@ -0,0 +1,37 @@ +package com.minelittlepony.minelp.hdskins.gui; + +import com.minelittlepony.minelp.Pony; +import com.minelittlepony.minelp.PonyManager; +import com.minelittlepony.minelp.model.PlayerModel; +import com.voxelmodpack.hdskins.gui.EntityPlayerModel; +import com.voxelmodpack.hdskins.gui.RenderPlayerModel; + +import net.minecraft.client.renderer.entity.RenderManager; +import net.minecraft.entity.EntityLivingBase; + +public class RenderPonyModel extends RenderPlayerModel { + + public RenderPonyModel(RenderManager renderer) { + super(renderer); + } + + @Override + protected void renderModel(EntityLivingBase par1EntityLivingBase, float par2, float par3, float par4, float par5, float par6, float par7) { + this.bindEntityTexture(par1EntityLivingBase); + EntityPlayerModel playerModelEntity = (EntityPlayerModel) par1EntityLivingBase; + Pony thePony = PonyManager.getInstance().getPonyFromResourceRegistry(this.getEntityTexture(playerModelEntity)); + thePony.checkSkin(); + PlayerModel pm = thePony.getModel(true); + this.mainModel = pm.model; + pm.model.isFlying = thePony.isFlying = false; + pm.model.isPegasus = thePony.isPegasus(); + pm.model.isUnicorn = thePony.isUnicorn(); + pm.model.isMale = thePony.isMale(); + pm.model.size = thePony.size(); + pm.model.glowColor = thePony.glowColor(); + pm.model.wantTail = thePony.wantTail(); + pm.model.isVillager = false; + this.mainModel.render(par1EntityLivingBase, par2, par3, par4, par5, par6, par7); + } + +} diff --git a/src/main/java/com/minelittlepony/minelp/model/ModelArmor.java b/src/main/java/com/minelittlepony/minelp/model/ModelArmor.java new file mode 100644 index 00000000..4184aa10 --- /dev/null +++ b/src/main/java/com/minelittlepony/minelp/model/ModelArmor.java @@ -0,0 +1,21 @@ +package com.minelittlepony.minelp.model; + +public abstract class ModelArmor { + public final String path; + public ModelPony base; + public ModelPony modelArmorChestplate; + public ModelPony modelArmor; + + public ModelArmor(String path) { + this.path = path; + } + + public float layer() { + return 1; + }; + + public int subimage(int slot) { + return slot == 2 ? 2 : 1; + } + +} diff --git a/src/main/java/com/minelittlepony/minelp/model/ModelHornGlow.java b/src/main/java/com/minelittlepony/minelp/model/ModelHornGlow.java new file mode 100644 index 00000000..8f84bd71 --- /dev/null +++ b/src/main/java/com/minelittlepony/minelp/model/ModelHornGlow.java @@ -0,0 +1,106 @@ +package com.minelittlepony.minelp.model; + +import com.minelittlepony.minelp.renderer.HornGlowRenderer; +import net.minecraft.client.model.PositionTextureVertex; +import net.minecraft.client.model.TexturedQuad; +import net.minecraft.client.renderer.Tessellator; + +public class ModelHornGlow { + private PositionTextureVertex[] vertexPositions; + private TexturedQuad[] quadList; + public final float posX1; + public final float posY1; + public final float posZ1; + public final float posX2; + public final float posY2; + public final float posZ2; + public String field_78247_g; + + @SuppressWarnings("unused") + public ModelHornGlow(HornGlowRenderer par1ModelRenderer, int par2, int par3, float par4, float par5, float par6, + int par7, int par8, int par9, float par10) { + this.posX1 = par4; + this.posY1 = par5; + this.posZ1 = par6; + this.posX2 = par4 + par7; + this.posY2 = par5 + par8; + this.posZ2 = par6 + par9; + this.vertexPositions = new PositionTextureVertex[8]; + this.quadList = new TexturedQuad[6]; + float var11 = par4 + par7; + float var12 = par5 + par8; + float var13 = par6 + par9; + float halfpar4 = par4 + par7 * 0.05F; + float halfpar6 = par6 + par9 * 0.05F; + float halfvar11 = par4 + par7 * 0.95F; + float halfvar13 = par6 + par9 * 0.95F; + par4 -= par10; + par5 -= par10; + par6 -= par10; + var11 += par10; + var12 += par10; + var13 += par10; + float xcentre = (par4 + var11) / 2.0F; + float zcentre = (par6 + var13) / 2.0F; + if (par1ModelRenderer.mirror) { + float var26 = var11; + var11 = par4; + par4 = var26; + } + + PositionTextureVertex var32 = new PositionTextureVertex(halfpar4, par5, halfpar6, 0.0F, 0.0F); + PositionTextureVertex var15 = new PositionTextureVertex(halfvar11, par5, halfpar6, 0.0F, 8.0F); + PositionTextureVertex var16 = new PositionTextureVertex(var11, var12, par6, 8.0F, 8.0F); + PositionTextureVertex var17 = new PositionTextureVertex(par4, var12, par6, 8.0F, 0.0F); + PositionTextureVertex var18 = new PositionTextureVertex(halfpar4, par5, halfvar13, 0.0F, 0.0F); + PositionTextureVertex var19 = new PositionTextureVertex(halfvar11, par5, halfvar13, 0.0F, 8.0F); + PositionTextureVertex var20 = new PositionTextureVertex(var11, var12, var13, 8.0F, 8.0F); + PositionTextureVertex var21 = new PositionTextureVertex(par4, var12, var13, 8.0F, 0.0F); + this.vertexPositions[0] = var32; + this.vertexPositions[1] = var15; + this.vertexPositions[2] = var16; + this.vertexPositions[3] = var17; + this.vertexPositions[4] = var18; + this.vertexPositions[5] = var19; + this.vertexPositions[6] = var20; + this.vertexPositions[7] = var21; + this.quadList[0] = new TexturedQuad(new PositionTextureVertex[] { var19, var15, var16, var20 }, + par2 + par9 + par7, par3 + par9, par2 + par9 + par7 + par9, par3 + par9 + par8, + par1ModelRenderer.textureWidth, par1ModelRenderer.textureHeight); + this.quadList[1] = new TexturedQuad(new PositionTextureVertex[] { var32, var18, var21, var17 }, par2, + par3 + par9, par2 + par9, par3 + par9 + par8, par1ModelRenderer.textureWidth, + par1ModelRenderer.textureHeight); + this.quadList[2] = new TexturedQuad(new PositionTextureVertex[] { var19, var18, var32, var15 }, par2 + par9, + par3, par2 + par9 + par7, par3 + par9, par1ModelRenderer.textureWidth, par1ModelRenderer.textureHeight); + this.quadList[3] = new TexturedQuad(new PositionTextureVertex[] { var16, var17, var21, var20 }, + par2 + par9 + par7, par3 + par9, par2 + par9 + par7 + par7, par3, par1ModelRenderer.textureWidth, + par1ModelRenderer.textureHeight); + this.quadList[4] = new TexturedQuad(new PositionTextureVertex[] { var15, var32, var17, var16 }, par2 + par9, + par3 + par9, par2 + par9 + par7, par3 + par9 + par8, par1ModelRenderer.textureWidth, + par1ModelRenderer.textureHeight); + this.quadList[5] = new TexturedQuad(new PositionTextureVertex[] { var18, var19, var20, var21 }, + par2 + par9 + par7 + par9, par3 + par9, par2 + par9 + par7 + par9 + par7, par3 + par9 + par8, + par1ModelRenderer.textureWidth, par1ModelRenderer.textureHeight); + if (par1ModelRenderer.mirror) { + TexturedQuad[] var22 = this.quadList; + + for (TexturedQuad var25 : var22) { + var25.flipFace(); + } + } + + } + + public void render(Tessellator par1Tessellator, float par2) { + TexturedQuad[] var3 = this.quadList; + for (TexturedQuad var6 : var3) { + var6.draw(par1Tessellator.getWorldRenderer(), par2); + } + + } + + public ModelHornGlow func_78244_a(String par1Str) { + this.field_78247_g = par1Str; + return this; + } +} diff --git a/src/main/java/com/minelittlepony/minelp/model/ModelPony.java b/src/main/java/com/minelittlepony/minelp/model/ModelPony.java new file mode 100644 index 00000000..46c2e71f --- /dev/null +++ b/src/main/java/com/minelittlepony/minelp/model/ModelPony.java @@ -0,0 +1,219 @@ +package com.minelittlepony.minelp.model; + +import static net.minecraft.client.renderer.GlStateManager.*; + +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL14; + +import com.minelittlepony.minelp.PonyManager; +import com.minelittlepony.minelp.renderer.AniParams; + +import net.minecraft.client.entity.AbstractClientPlayer; +import net.minecraft.client.model.ModelPlayer; +import net.minecraft.client.model.ModelRenderer; +import net.minecraft.client.renderer.ItemRenderer; +import net.minecraft.client.renderer.block.model.ItemCameraTransforms.TransformType; +import net.minecraft.client.renderer.entity.RenderManager; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLiving; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EnumPlayerModelParts; +import net.minecraft.init.Items; +import net.minecraft.item.EnumAction; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; + +public abstract class ModelPony extends ModelPlayer { + public String texture; + protected float strech = 0.0F; + protected float scale = 0.0625F; + public boolean issneak = false; + public boolean isArmour = false; + public int glowColor = -12303190; + public final float pi = 3.141593F; + public boolean isPegasus; + public boolean isUnicorn; + public boolean isMale; + public int wantTail; + public int size; + public boolean isVillager; + public int villagerProfession; + public boolean isFlying; + public boolean isGlow; + public boolean isSleeping; + public int heldItemLeft; + public int heldItemRight; + public boolean aimedBow; + + public ModelPony(String texture) { + super(0, false); + this.texture = texture; + } + + public void setStrech(float strech) { + this.strech = strech; + } + + public final void init() { + init(0); + } + + public final void init(float var1) { + init(var1, 0); + } + + public abstract void init(float var1, float var2); + + public void animate(AniParams var1) {}; + + public void render(AniParams var1) {}; + + @Override + public void render(Entity player, float Move, float Moveswing, float Loop, float Right, float Down, float Scale) { + PonyManager.getInstance(); + if (player instanceof AbstractClientPlayer) { + setModelVisibilities((AbstractClientPlayer) player); + } + if (!doCancelRender()) { + AniParams ani = new AniParams(Move, Moveswing, Loop, Right, Down); + this.animate(ani); + this.render(ani); + } else { + super.render(player, Move, Moveswing, Loop, Right, Down, Scale); + } + } + + private void setModelVisibilities(AbstractClientPlayer clientPlayer) { + ModelPlayer modelplayer = this; + + if (clientPlayer.isSpectator()) { + modelplayer.setInvisible(false); + modelplayer.bipedHead.showModel = true; + modelplayer.bipedHeadwear.showModel = true; + } else { + ItemStack itemstack = clientPlayer.inventory.getCurrentItem(); + modelplayer.setInvisible(true); + modelplayer.bipedHeadwear.showModel = clientPlayer.isWearing(EnumPlayerModelParts.HAT); + modelplayer.bipedBodyWear.showModel = clientPlayer.isWearing(EnumPlayerModelParts.JACKET); + modelplayer.bipedLeftLegwear.showModel = clientPlayer.isWearing(EnumPlayerModelParts.LEFT_PANTS_LEG); + modelplayer.bipedRightLegwear.showModel = clientPlayer.isWearing(EnumPlayerModelParts.RIGHT_PANTS_LEG); + modelplayer.bipedLeftArmwear.showModel = clientPlayer.isWearing(EnumPlayerModelParts.LEFT_SLEEVE); + modelplayer.bipedRightArmwear.showModel = clientPlayer.isWearing(EnumPlayerModelParts.RIGHT_SLEEVE); + modelplayer.heldItemLeft = 0; + modelplayer.aimedBow = false; + modelplayer.isSneak = clientPlayer.isSneaking(); + + if (itemstack == null) { + modelplayer.heldItemRight = 0; + } else { + modelplayer.heldItemRight = 1; + + if (clientPlayer.getItemInUseCount() > 0) { + EnumAction enumaction = itemstack.getItemUseAction(); + + if (enumaction == EnumAction.BLOCK) { + modelplayer.heldItemRight = 3; + } else if (enumaction == EnumAction.BOW) { + modelplayer.aimedBow = true; + } + } + } + } + } + + public void renderDrop(RenderManager rendermanager, ItemRenderer itemrenderer, EntityLivingBase entity) {} + + protected void renderDrop(ItemRenderer itemrenderer, EntityLivingBase entity, ModelRenderer box, + float scalefactor, float posx, float posy, float posz) { + ItemStack drop = entity.getHeldItem(); + if (drop != null) { + pushMatrix(); + if (box != null) { + box.postRender(scalefactor * 0.0625F); + } + + translate(posx, posy, posz); + EnumAction playerAction = null; + if (entity instanceof EntityPlayer) { + EntityPlayer is3D = (EntityPlayer) entity; + if (is3D.fishEntity != null) { + drop = new ItemStack(Items.stick); + } + + if (is3D.getItemInUseCount() > 0) { + playerAction = drop.getItemUseAction(); + } + } + + if (drop.getItem() == Items.bow) { + rotate(-20.0F, 0.0F, 1.0F, 0.0F); + rotate(45.0F, 0.0F, 1.0F, 0.0F); + } else if (drop.getItem().isFull3D()) { + if (drop.getItem().shouldRotateAroundWhenRendering()) { + rotate(180.0F, 0.0F, 0.0F, 1.0F); + translate(0.0F, -0.125F, 0.0F); + } + + if (playerAction == EnumAction.BLOCK && entity instanceof EntityPlayer + && ((EntityPlayer) entity).getItemInUseCount() > 0) { + translate(0.05F, 0.0F, -0.1F); + rotate(-50.0F, 0.0F, 1.0F, 0.0F); + rotate(-10.0F, 1.0F, 0.0F, 0.0F); + rotate(-60.0F, 0.0F, 0.0F, 1.0F); + } + } + + float g; + float b; + int var20; + + var20 = drop.getItem().getColorFromItemStack(drop, 0); + float var19 = (var20 >> 16 & 255) / 255.0F; + g = (var20 >> 8 & 255) / 255.0F; + b = (var20 & 255) / 255.0F; + color(var19, g, b, 1.0F); + itemrenderer.renderItem(entity, drop, TransformType.THIRD_PERSON); + + if (isUnicorn && glowColor != 0) { + this.renderItemGlow(itemrenderer, entity, drop); + } + + popMatrix(); + } + } + + public void renderItemGlow(ItemRenderer itemRenderer, EntityLivingBase entity, ItemStack drop) { + // FIXME doesn't blend + pushMatrix(); + GL11.glPushAttrib(24577); + GL11.glDisable(2896); + float red = (glowColor >> 16 & 255) / 255.0F; + float green = (glowColor >> 8 & 255) / 255.0F; + float blue = (glowColor & 255) / 255.0F; + float alpha = 0.2F; + enableBlend(); + GL11.glEnable(3042); + GL14.glBlendColor(red, green, blue, alpha); + blendFunc('\u8001', 1); + color(red, green, blue, alpha); + // translate(1.1F, 1.1F, 1.1F); + if (!(drop.getItem() instanceof ItemBlock) || !drop.getItem().isFull3D()) { + translate(0.02F, -0.06F, -0.02F); + } + // itemRenderer.renderItem(entity, drop, TransformType.THIRD_PERSON); + popAttrib(); + popMatrix(); + } + + public void renderEars(EntityLivingBase entity, float par2) {} + + public void renderCloak(EntityPlayer player, float par2) {} + + public void renderStaticCloak(EntityLiving player, float par2) {} + + protected boolean doCancelRender() { + return false; + } + +} diff --git a/src/main/java/com/minelittlepony/minelp/model/PMAPI.java b/src/main/java/com/minelittlepony/minelp/model/PMAPI.java new file mode 100644 index 00000000..5475e980 --- /dev/null +++ b/src/main/java/com/minelittlepony/minelp/model/PMAPI.java @@ -0,0 +1,55 @@ +package com.minelittlepony.minelp.model; + +import java.lang.reflect.Field; + +import com.minelittlepony.minelp.model.pony.pm_Human; +import com.minelittlepony.minelp.model.pony.pm_newPonyAdv; +import com.minelittlepony.minelp.model.pony.pm_skeletonPony; +import com.minelittlepony.minelp.model.pony.pm_zombiePony; +import com.minelittlepony.minelp.model.pony.armor.pma_Human; +import com.minelittlepony.minelp.model.pony.armor.pma_newPony; +import com.minelittlepony.minelp.model.pony.armor.pma_skeletonPony; +import com.minelittlepony.minelp.model.pony.armor.pma_zombiePony; + +public final class PMAPI { + + public static PlayerModel newPonyAdv = new PlayerModel("newPonyAdv", new pm_newPonyAdv("/mob/char.png"), 0) + .setTextureHeight(32) + .setArmor(new pma_newPony("minelittlepony:textures/models/armor/")) + .setURL("http://skins.minecraft.net/MinecraftSkins/%NAME%.png") + .setScale(0.9375F); + public static PlayerModel newPonyAdv_64 = new PlayerModel("newPonyAdv", new pm_newPonyAdv("/mob/char.png"), 0) + .setArmor(new pma_newPony("minelittlepony:textures/models/armor/")) + .setURL("http://skins.minecraft.net/MinecraftSkins/%NAME%.png") + .setScale(0.9375F); + public static PlayerModel zombiePony = new PlayerModel("zombiePony", new pm_zombiePony("/mob/char.png"), 0) + .setTextureHeight(32) + .setArmor(new pma_zombiePony("minelittlepony:textures/models/armor/")) + .setURL("http://skins.minecraft.net/MinecraftSkins/%NAME%.png") + .setScale(0.9375F); + public static PlayerModel skeletonPony = new PlayerModel("skeletonPony", new pm_skeletonPony("/mob/char.png"), 0) + .setTextureHeight(32) + .setArmor(new pma_skeletonPony("minelittlepony:textures/models/armor/")) + .setURL("http://skins.minecraft.net/MinecraftSkins/%NAME%.png") + .setScale(0.9375F); + public static PlayerModel human = new PlayerModel("Human", new pm_Human("/mob/char.png"), 1) + .setTextureHeight(32) + .setArmor(new pma_Human("minecraft:textures/models/armor/")) + .setURL("http://skins.minecraft.net/MinecraftSkins/%NAME%.png") + .setScale(0.9375F); + public static PlayerModel human_64 = new PlayerModel("Human", new pm_Human("/mob/char.png"), 1) + .setArmor(new pma_Human("minecraft:textures/models/armor/")) + .setURL("http://skins.minecraft.net/MinecraftSkins/%NAME%.png") + .setScale(0.9375F); + + public static void init() { + for (Field field : PMAPI.class.getFields()) { + try { + PlayerModel model = (PlayerModel) field.get(null); + model.init(); + } catch (Exception e) { + e.printStackTrace(); + } + } + } +} diff --git a/src/main/java/com/minelittlepony/minelp/model/PlayerModel.java b/src/main/java/com/minelittlepony/minelp/model/PlayerModel.java new file mode 100644 index 00000000..9b966f57 --- /dev/null +++ b/src/main/java/com/minelittlepony/minelp/model/PlayerModel.java @@ -0,0 +1,80 @@ +package com.minelittlepony.minelp.model; + +import com.minelittlepony.minelp.model.ModelArmor; +import com.minelittlepony.minelp.model.ModelPony; +import java.text.DecimalFormat; + +public class PlayerModel { + public final int id; + public String name; + public String url; + public ModelPony model; + public ModelArmor armor; + public float width = 0.6F; + public float height = 1.8F; + public float shadowsize = 0.5F; + public float thirdpersondistance = 4.0F; + public float yoffset = 1.62F; + public float globalscale = 1.0F; + + public PlayerModel(String name, ModelPony model, int manual_id) { + this.name = name; + this.model = model; + this.id = manual_id; + } + + public PlayerModel setTextureHeight(int height) { + model.textureHeight = height; + return this; + } + + public PlayerModel setArmor(ModelArmor armor) { + this.armor = armor; + return this; + } + + public PlayerModel setURL(String url) { + this.url = url; + return this; + } + + public PlayerModel setShadow(float size) { + this.shadowsize = size; + return this; + } + + public PlayerModel setSize(float width, float height) { + this.width = width; + this.height = height; + return this; + } + + public PlayerModel setOffset(float offset) { + this.yoffset = offset; + return this; + } + + public PlayerModel setDistance(float distance) { + this.thirdpersondistance = distance; + return this; + } + + public PlayerModel setScale(float scale) { + this.globalscale = scale; + return this; + } + + public boolean hasArmor() { + return this.armor != null && this.armor.base != null && this.armor.path != null; + } + + public String getSize(DecimalFormat df) { + return df.format(this.width) + " * " + df.format(this.height) + " * " + df.format(this.width); + } + + public void init() { + model.init(); + armor.modelArmorChestplate.init(0.0F, 1.0F); + armor.modelArmor.init(0.0F, 0.5F); + } +} diff --git a/src/main/java/com/minelittlepony/minelp/model/ScalableModelBox.java b/src/main/java/com/minelittlepony/minelp/model/ScalableModelBox.java new file mode 100644 index 00000000..a4dd90ae --- /dev/null +++ b/src/main/java/com/minelittlepony/minelp/model/ScalableModelBox.java @@ -0,0 +1,84 @@ +package com.minelittlepony.minelp.model; + +import com.minelittlepony.minelp.renderer.ScalableModelRenderer; +import net.minecraft.client.model.PositionTextureVertex; +import net.minecraft.client.model.TexturedQuad; +import net.minecraft.client.renderer.Tessellator; + +public class ScalableModelBox { + private PositionTextureVertex[] vertexPositions; + private TexturedQuad[] quadList; + public final float posX1; + public final float posY1; + public final float posZ1; + public final float posX2; + public final float posY2; + public final float posZ2; + public String field_78247_g; + + public ScalableModelBox(ScalableModelRenderer par1ModelRenderer, int par2, int par3, float par4, float par5, float par6, int par7, int par8, int par9, float par10) { + this.posX1 = par4; + this.posY1 = par5; + this.posZ1 = par6; + this.posX2 = par4 + par7; + this.posY2 = par5 + par8; + this.posZ2 = par6 + par9; + this.vertexPositions = new PositionTextureVertex[8]; + this.quadList = new TexturedQuad[6]; + float var11 = par4 + par7; + float var12 = par5 + par8; + float var13 = par6 + par9; + par4 -= par10; + par5 -= par10; + par6 -= par10; + var11 += par10; + var12 += par10; + var13 += par10; + if(par1ModelRenderer.mirror) { + float var23 = var11; + var11 = par4; + par4 = var23; + } + + PositionTextureVertex var231 = new PositionTextureVertex(par4, par5, par6, 0.0F, 0.0F); + PositionTextureVertex var15 = new PositionTextureVertex(var11, par5, par6, 0.0F, 8.0F); + PositionTextureVertex var16 = new PositionTextureVertex(var11, var12, par6, 8.0F, 8.0F); + PositionTextureVertex var17 = new PositionTextureVertex(par4, var12, par6, 8.0F, 0.0F); + PositionTextureVertex var18 = new PositionTextureVertex(par4, par5, var13, 0.0F, 0.0F); + PositionTextureVertex var19 = new PositionTextureVertex(var11, par5, var13, 0.0F, 8.0F); + PositionTextureVertex var20 = new PositionTextureVertex(var11, var12, var13, 8.0F, 8.0F); + PositionTextureVertex var21 = new PositionTextureVertex(par4, var12, var13, 8.0F, 0.0F); + this.vertexPositions[0] = var231; + this.vertexPositions[1] = var15; + this.vertexPositions[2] = var16; + this.vertexPositions[3] = var17; + this.vertexPositions[4] = var18; + this.vertexPositions[5] = var19; + this.vertexPositions[6] = var20; + this.vertexPositions[7] = var21; + this.quadList[0] = new TexturedQuad(new PositionTextureVertex[]{var19, var15, var16, var20}, par2 + par9 + par7, par3 + par9, par2 + par9 + par7 + par9, par3 + par9 + par8, par1ModelRenderer.textureWidth, par1ModelRenderer.textureHeight); + this.quadList[1] = new TexturedQuad(new PositionTextureVertex[]{var231, var18, var21, var17}, par2, par3 + par9, par2 + par9, par3 + par9 + par8, par1ModelRenderer.textureWidth, par1ModelRenderer.textureHeight); + this.quadList[2] = new TexturedQuad(new PositionTextureVertex[]{var19, var18, var231, var15}, par2 + par9, par3, par2 + par9 + par7, par3 + par9, par1ModelRenderer.textureWidth, par1ModelRenderer.textureHeight); + this.quadList[3] = new TexturedQuad(new PositionTextureVertex[]{var16, var17, var21, var20}, par2 + par9 + par7, par3 + par9, par2 + par9 + par7 + par7, par3, par1ModelRenderer.textureWidth, par1ModelRenderer.textureHeight); + this.quadList[4] = new TexturedQuad(new PositionTextureVertex[]{var15, var231, var17, var16}, par2 + par9, par3 + par9, par2 + par9 + par7, par3 + par9 + par8, par1ModelRenderer.textureWidth, par1ModelRenderer.textureHeight); + this.quadList[5] = new TexturedQuad(new PositionTextureVertex[]{var18, var19, var20, var21}, par2 + par9 + par7 + par9, par3 + par9, par2 + par9 + par7 + par9 + par7, par3 + par9 + par8, par1ModelRenderer.textureWidth, par1ModelRenderer.textureHeight); + if(par1ModelRenderer.mirror) { + for (TexturedQuad element : this.quadList) { + element.flipFace(); + } + } + + } + + public void render(Tessellator par1Tessellator, float par2) { + for (TexturedQuad element : this.quadList) { + element.draw(par1Tessellator.getWorldRenderer(), par2); + } + + } + + public ScalableModelBox func_78244_a(String par1Str) { + this.field_78247_g = par1Str; + return this; + } +} diff --git a/src/main/java/com/minelittlepony/minelp/model/pony/armor/pm_newPonyArmor.java b/src/main/java/com/minelittlepony/minelp/model/pony/armor/pm_newPonyArmor.java new file mode 100644 index 00000000..6c5c8a8d --- /dev/null +++ b/src/main/java/com/minelittlepony/minelp/model/pony/armor/pm_newPonyArmor.java @@ -0,0 +1,311 @@ +package com.minelittlepony.minelp.model.pony.armor; + +import com.minelittlepony.minelp.model.pony.pm_newPonyAdv; +import com.minelittlepony.minelp.renderer.AniParams; + +import net.minecraft.client.model.ModelRenderer; +import net.minecraft.client.renderer.ItemRenderer; +import net.minecraft.client.renderer.entity.RenderManager; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.util.MathHelper; + +public class pm_newPonyArmor extends pm_newPonyAdv { + public ModelRenderer Bodypiece; + public ModelRenderer extBody; + public ModelRenderer[] extHead; + public ModelRenderer[] extLegs; + + public pm_newPonyArmor(String texture) { + super(texture); + this.isArmour = true; + this.textureHeight = 32; + } + + @Override + public void animate(AniParams aniparams) { + this.checkRainboom(aniparams.swing); + this.rotateHead(aniparams.horz, aniparams.vert); + float bodySwingRotation = 0.0F; + if (this.swingProgress > -9990.0F && !this.isUnicorn) { + bodySwingRotation = MathHelper.sin(MathHelper.sqrt_float(this.swingProgress) * 3.1415927F * 2.0F) * 0.2F; + } + + this.bipedBody.rotateAngleY = bodySwingRotation * 0.2F; + this.Bodypiece.rotateAngleY = bodySwingRotation * 0.2F; + this.extBody.rotateAngleY = bodySwingRotation * 0.2F; + this.setLegs(aniparams.move, aniparams.swing, aniparams.tick); + this.holdItem(); + this.swingItem(this.swingProgress); + if (this.issneak && !this.isFlying) { + this.adjustBody(BODY_ROTATE_ANGLE_X_SNEAK, BODY_RP_Y_SNEAK, BODY_RP_Z_SNEAK); + this.sneakLegs(); + this.setHead(0.0F, 6.0F, -2.0F); + } else { + this.adjustBody(BODY_ROTATE_ANGLE_X_NOTSNEAK, BODY_RP_Y_NOTSNEAK, + BODY_RP_Z_NOTSNEAK); + this.bipedRightLeg.rotationPointY = FRONT_LEG_RP_Y_NOTSNEAK; + this.bipedLeftLeg.rotationPointY = FRONT_LEG_RP_Y_NOTSNEAK; + this.extLegs[0].rotationPointY = FRONT_LEG_RP_Y_NOTSNEAK; + this.extLegs[1].rotationPointY = FRONT_LEG_RP_Y_NOTSNEAK; + this.swingArms(aniparams.tick); + this.setHead(0.0F, 0.0F, 0.0F); + } + + if (this.isSleeping) { + this.ponySleep(); + } + + if (this.aimedBow) { + this.aimBow(aniparams.tick); + } + + this.fixSpecialRotationPoints(aniparams.move); + } + + @Override + protected void setHead(float posX, float posY, float posZ) { + this.setRotationPoint(this.bipedHead, posX, posY, posZ); + this.setRotationPoint(this.bipedHeadwear, posX, posY, posZ); + this.setRotationPoint(this.extHead[0], posX, posY, posZ); + this.setRotationPoint(this.extHead[1], posX, posY, posZ); + } + + @Override + protected void rotateHead(float horz, float vert) { + float headRotateAngleY; + float headRotateAngleX; + if (this.isSleeping) { + headRotateAngleY = 1.4F; + headRotateAngleX = 0.1F; + } else { + headRotateAngleY = horz / 57.29578F; + headRotateAngleX = vert / 57.29578F; + } + + if (headRotateAngleX > 0.5F) { + headRotateAngleX = 0.5F; + } + + if (headRotateAngleX < -0.5F) { + headRotateAngleX = -0.5F; + } + + this.bipedHead.rotateAngleY = headRotateAngleY; + this.bipedHead.rotateAngleX = headRotateAngleX; + this.extHead[0].rotateAngleY = headRotateAngleY; + this.extHead[0].rotateAngleX = headRotateAngleX; + this.extHead[1].rotateAngleY = headRotateAngleY; + this.extHead[1].rotateAngleX = headRotateAngleX; + this.bipedHeadwear.rotateAngleY = headRotateAngleY; + this.bipedHeadwear.rotateAngleX = headRotateAngleX; + } + + @Override + protected void adjustBody(float rotateAngleX, float rotationPointY, float rotationPointZ) { + this.bipedBody.rotateAngleX = rotateAngleX; + this.bipedBody.rotationPointY = rotationPointY; + this.bipedBody.rotationPointZ = rotationPointZ; + this.Bodypiece.rotateAngleX = rotateAngleX; + this.Bodypiece.rotationPointY = rotationPointY; + this.Bodypiece.rotationPointZ = rotationPointZ; + this.extBody.rotateAngleX = rotateAngleX; + this.extBody.rotationPointY = rotationPointY; + this.extBody.rotationPointZ = rotationPointZ; + } + + protected void ridingPony() { + this.setHead(this.bipedHead.rotationPointX + 0.0F, this.bipedHead.rotationPointY + RIDING_SHIFT_Y, + this.bipedHead.rotationPointZ + RIDING_SHIFT_Z); + this.shiftRotationPoint(this.bipedBody, 0.0F, RIDING_SHIFT_Y, RIDING_SHIFT_Z); + this.shiftRotationPoint(this.Bodypiece, 0.0F, RIDING_SHIFT_Y, RIDING_SHIFT_Z); + this.shiftRotationPoint(this.extBody, 0.0F, RIDING_SHIFT_Y, RIDING_SHIFT_Z); + this.shiftRotationPoint(this.bipedLeftArm, 0.0F, RIDING_SHIFT_Y, RIDING_SHIFT_Z); + this.shiftRotationPoint(this.bipedRightArm, 0.0F, RIDING_SHIFT_Y, RIDING_SHIFT_Z); + this.shiftRotationPoint(this.bipedLeftLeg, 0.0F, RIDING_SHIFT_Y, RIDING_SHIFT_Z); + this.shiftRotationPoint(this.bipedRightLeg, 0.0F, RIDING_SHIFT_Y, RIDING_SHIFT_Z); + this.shiftRotationPoint(this.extLegs[0], 0.0F, RIDING_SHIFT_Y, RIDING_SHIFT_Z); + this.shiftRotationPoint(this.extLegs[1], 0.0F, RIDING_SHIFT_Y, RIDING_SHIFT_Z); + } + + @Override + protected void renderHead() { + this.bipedHead.render(this.scale); + this.extHead[0].render(this.scale); + this.extHead[1].render(this.scale); + this.bipedHeadwear.render(this.scale); + } + + @Override + protected void renderNeck() {} + + @Override + protected void renderBody() { + this.bipedBody.render(this.scale); + this.Bodypiece.render(this.scale); + this.extBody.render(this.scale); + } + + @Override + protected void renderTail() {} + + @Override + protected void renderLegs() { + this.bipedLeftArm.render(this.scale); + this.bipedRightArm.render(this.scale); + this.bipedLeftLeg.render(this.scale); + this.bipedRightLeg.render(this.scale); + this.extLegs[0].render(this.scale); + this.extLegs[1].render(this.scale); + } + + @Override + protected void initTextures() { + this.extHead = new ModelRenderer[2]; + this.extLegs = new ModelRenderer[2]; + this.initHeadTextures(); + this.initBodyTextures(); + this.initLegTextures(); + } + + @Override + protected void initHeadTextures() { + this.bipedHead = new ModelRenderer(this, 0, 0); + this.bipedHeadwear = new ModelRenderer(this, 32, 0); + this.extHead[0] = new ModelRenderer(this, 0, 0); + this.extHead[1] = new ModelRenderer(this, 0, 4); + } + + @Override + protected void initBodyTextures() { + this.bipedBody = new ModelRenderer(this, 16, 16); + this.Bodypiece = new ModelRenderer(this, 0, 0); + this.extBody = new ModelRenderer(this, 16, 8); + } + + @Override + protected void initLegTextures() { + this.bipedRightArm = new ModelRenderer(this, 0, 16); + this.bipedLeftArm = new ModelRenderer(this, 0, 16); + this.bipedLeftArm.mirror = true; + this.bipedRightLeg = new ModelRenderer(this, 0, 16); + this.bipedLeftLeg = new ModelRenderer(this, 0, 16); + this.bipedLeftLeg.mirror = true; + this.SteveArm = new ModelRenderer(this, 0, 16); + this.unicornarm = new ModelRenderer(this, 0, 16); + this.extLegs[0] = new ModelRenderer(this, 48, 8); + this.extLegs[1] = new ModelRenderer(this, 48, 8); + this.extLegs[1].mirror = true; + } + + @Override + protected void initPositions(float yOffset, float stretch) { + this.initHeadPositions(yOffset, stretch); + this.initBodyPositions(yOffset, stretch); + this.initLegPositions(yOffset, stretch); + } + + @Override + protected void initHeadPositions(float yOffset, float stretch) { + this.bipedHead.addBox(-4.0F + HEAD_CENTRE_X, -4.0F + HEAD_CENTRE_Y, + -4.0F + HEAD_CENTRE_Z, 8, 8, 8, + stretch * 1.1F); + this.bipedHead.setRotationPoint(HEAD_RP_X, HEAD_RP_Y + yOffset, HEAD_RP_Z); + this.extHead[0].addBox(-4.0F + HEAD_CENTRE_X, -6.0F + HEAD_CENTRE_Y, + 1.0F + HEAD_CENTRE_Z, 2, 2, + 2, stretch * 0.5F); + this.extHead[0].setRotationPoint(HEAD_RP_X, HEAD_RP_Y + yOffset, + HEAD_RP_Z); + this.extHead[1].addBox(2.0F + HEAD_CENTRE_X, -6.0F + HEAD_CENTRE_Y, + 1.0F + HEAD_CENTRE_Z, 2, 2, + 2, stretch * 0.5F); + this.extHead[1].setRotationPoint(HEAD_RP_X, HEAD_RP_Y + yOffset, + HEAD_RP_Z); + this.bipedHeadwear.addBox(-4.0F + HEAD_CENTRE_X, -4.0F + HEAD_CENTRE_Y, + -4.0F + HEAD_CENTRE_Z, 8, 8, 8, + stretch * 1.1F + 0.5F); + this.bipedHeadwear.setRotationPoint(HEAD_RP_X, HEAD_RP_Y + yOffset, + HEAD_RP_Z); + } + + @Override + protected void initBodyPositions(float yOffset, float stretch) { + this.bipedBody.addBox(-4.0F, 4.0F, -2.0F, 8, 8, 4, stretch); + this.bipedBody.setRotationPoint(HEAD_RP_X, HEAD_RP_Y + yOffset, HEAD_RP_Z); + this.Bodypiece.addBox(-4.0F, 4.0F, 6.0F, 8, 8, 8, stretch); + this.Bodypiece.setRotationPoint(HEAD_RP_X, HEAD_RP_Y + yOffset, + HEAD_RP_Z); + this.extBody.addBox(-4.0F, 4.0F, -2.0F, 8, 8, 16, stretch); + this.extBody.setRotationPoint(HEAD_RP_X, HEAD_RP_Y + yOffset, + HEAD_RP_Z); + } + + @Override + protected void initLegPositions(float yOffset, float stretch) { + super.initLegPositions(yOffset, stretch); + this.extLegs[0].addBox(-2.0F + THIRDP_ARM_CENTRE_X, -6.0F + THIRDP_ARM_CENTRE_Y, + -2.0F + THIRDP_ARM_CENTRE_Z, 4, 12, 4, stretch); + this.extLegs[0].setRotationPoint(-3.0F, 0.0F + yOffset, 0.0F); + this.extLegs[1].addBox(-2.0F + THIRDP_ARM_CENTRE_X, -6.0F + THIRDP_ARM_CENTRE_Y, + -2.0F + THIRDP_ARM_CENTRE_Z, 4, 12, 4, stretch); + this.extLegs[1].setRotationPoint(3.0F, 0.0F + yOffset, 0.0F); + } + + protected void syncLegs() { + this.extLegs[0].rotateAngleX = this.bipedRightLeg.rotateAngleX; + this.extLegs[0].rotateAngleY = this.bipedRightLeg.rotateAngleY; + this.extLegs[0].rotateAngleZ = this.bipedRightLeg.rotateAngleZ; + this.extLegs[0].rotationPointX = this.bipedRightLeg.rotationPointX; + this.extLegs[0].rotationPointY = this.bipedRightLeg.rotationPointY; + this.extLegs[0].rotationPointZ = this.bipedRightLeg.rotationPointZ; + this.extLegs[1].rotateAngleX = this.bipedLeftLeg.rotateAngleX; + this.extLegs[1].rotateAngleY = this.bipedLeftLeg.rotateAngleY; + this.extLegs[1].rotateAngleZ = this.bipedLeftLeg.rotateAngleZ; + this.extLegs[1].rotationPointX = this.bipedLeftLeg.rotationPointX; + this.extLegs[1].rotationPointY = this.bipedLeftLeg.rotationPointY; + this.extLegs[1].rotationPointZ = this.bipedLeftLeg.rotationPointZ; + } + + @Override + protected void rotateLegs(float move, float swing, float tick) { + super.rotateLegs(move, swing, tick); + this.syncLegs(); + } + + @Override + protected void adjustLegs() { + super.adjustLegs(); + this.syncLegs(); + } + + @Override + protected void sneakLegs() { + super.sneakLegs(); + this.syncLegs(); + } + + @Override + protected void ponySleep() { + super.ponySleep(); + this.syncLegs(); + } + + @Override + public void renderDrop(RenderManager rendermanager, ItemRenderer itemrenderer, EntityLivingBase entity) { + this.renderDrop(itemrenderer, entity, this.bipedRightArm, 1.0F, -0.0625F, 0.8375F, 0.0625F); + } + + @Override + public void setInvisible(boolean invisible) { + super.setInvisible(invisible); + this.bipedLeftArm.showModel = invisible; + this.bipedRightArm.showModel = invisible; + this.Bodypiece.showModel = invisible; + extBody.showModel = invisible; + for (ModelRenderer m : extHead) { + m.showModel = invisible; + } + for (ModelRenderer m : extLegs) { + m.showModel = invisible; + } + } +} diff --git a/src/main/java/com/minelittlepony/minelp/model/pony/armor/pm_skeletonPonyArmor.java b/src/main/java/com/minelittlepony/minelp/model/pony/armor/pm_skeletonPonyArmor.java new file mode 100644 index 00000000..5c741d34 --- /dev/null +++ b/src/main/java/com/minelittlepony/minelp/model/pony/armor/pm_skeletonPonyArmor.java @@ -0,0 +1,100 @@ +package com.minelittlepony.minelp.model.pony.armor; + +import com.minelittlepony.minelp.model.pony.armor.pm_newPonyArmor; + +import net.minecraft.util.MathHelper; + +public class pm_skeletonPonyArmor extends pm_newPonyArmor { + public pm_skeletonPonyArmor(String texture) { + super(texture); + } + + @Override + protected void rotateLegs(float move, float swing, float tick) { + float rightArmRotateAngleX; + float leftArmRotateAngleX; + float rightLegRotateAngleX; + float leftLegRotateAngleX; + float var8; + float var9; + if (this.isFlying && this.isPegasus) { + if (this.rainboom) { + rightArmRotateAngleX = ROTATE_270; + leftArmRotateAngleX = ROTATE_270; + rightLegRotateAngleX = ROTATE_90; + leftLegRotateAngleX = ROTATE_90; + } else { + rightArmRotateAngleX = MathHelper.sin(0.0F - swing * 0.5F); + leftArmRotateAngleX = MathHelper.sin(0.0F - swing * 0.5F); + rightLegRotateAngleX = MathHelper.sin(swing * 0.5F); + leftLegRotateAngleX = MathHelper.sin(swing * 0.5F); + } + + this.bipedRightArm.rotateAngleY = 0.2F; + this.SteveArm.rotateAngleY = 0.2F; + this.bipedLeftArm.rotateAngleY = -0.2F; + this.bipedRightLeg.rotateAngleY = -0.2F; + this.bipedLeftLeg.rotateAngleY = 0.2F; + } else { + var8 = (float) Math.pow(swing, 16.0D); + this.getClass(); + var9 = 3.1415927F * var8 * 0.5F; + this.getClass(); + float laQuad = 3.1415927F * var8; + this.getClass(); + float rlQuad = 3.1415927F * var8 * 0.2F; + this.getClass(); + float llQuad = 3.1415927F * var8 * -0.4F; + rightArmRotateAngleX = MathHelper.cos(move * 0.6662F + 3.1415927F + var9) * 0.6F * swing; + leftArmRotateAngleX = MathHelper.cos(move * 0.6662F + laQuad) * 0.6F * swing; + rightLegRotateAngleX = MathHelper.cos(move * 0.6662F + rlQuad) * 0.6F * swing; + leftLegRotateAngleX = MathHelper.cos(move * 0.6662F + 3.1415927F + llQuad) * 0.6F * swing; + this.bipedRightArm.rotateAngleY = 0.0F; + this.SteveArm.rotateAngleY = 0.0F; + this.unicornarm.rotateAngleY = 0.0F; + this.bipedLeftArm.rotateAngleY = 0.0F; + this.bipedRightLeg.rotateAngleY = 0.0F; + this.bipedLeftLeg.rotateAngleY = 0.0F; + } + + this.bipedRightArm.rotateAngleX = rightArmRotateAngleX; + this.SteveArm.rotateAngleX = rightArmRotateAngleX; + this.unicornarm.rotateAngleX = 0.0F; + this.bipedLeftArm.rotateAngleX = leftArmRotateAngleX; + this.bipedRightLeg.rotateAngleX = rightLegRotateAngleX; + this.bipedLeftLeg.rotateAngleX = leftLegRotateAngleX; + this.bipedRightArm.rotateAngleZ = 0.0F; + this.SteveArm.rotateAngleZ = 0.0F; + this.unicornarm.rotateAngleZ = 0.0F; + this.bipedLeftArm.rotateAngleZ = 0.0F; + if (this.heldItemRight != 0) { + var8 = MathHelper.sin(this.swingProgress * 3.1415927F); + var9 = MathHelper.sin((1.0F - (1.0F - this.swingProgress) * (1.0F - this.swingProgress)) * 3.1415927F); + if (this.glowColor == 0) { + this.bipedRightArm.rotateAngleZ = 0.0F; + this.bipedRightArm.rotateAngleY = 0.1F - var8 * 0.6F; + this.bipedRightArm.rotateAngleX = -1.5707964F; + this.bipedRightArm.rotateAngleX -= var8 * 1.2F - var9 * 0.4F; + this.bipedRightArm.rotateAngleZ += MathHelper.cos(tick * 0.09F) * 0.05F + 0.05F; + this.bipedRightArm.rotateAngleX += MathHelper.sin(tick * 0.067F) * 0.1F; + } else { + this.unicornarm.rotateAngleZ = 0.0F; + this.unicornarm.rotateAngleY = 0.1F - var8 * 0.6F; + this.unicornarm.rotateAngleX = -1.5707964F; + this.unicornarm.rotateAngleX -= var8 * 1.2F - var9 * 0.4F; + this.unicornarm.rotateAngleZ += MathHelper.cos(tick * 0.09F) * 0.05F + 0.05F; + this.unicornarm.rotateAngleX += MathHelper.sin(tick * 0.067F) * 0.1F; + } + } + + this.syncLegs(); + } + + @Override + protected void fixSpecialRotationPoints(float move) { + if (this.heldItemRight != 0 && this.glowColor == 0) { + this.setRotationPoint(this.bipedRightArm, -1.5F, 9.5F, 4.0F); + } + + } +} diff --git a/src/main/java/com/minelittlepony/minelp/model/pony/armor/pm_zombiePonyArmor.java b/src/main/java/com/minelittlepony/minelp/model/pony/armor/pm_zombiePonyArmor.java new file mode 100644 index 00000000..f9fa2a34 --- /dev/null +++ b/src/main/java/com/minelittlepony/minelp/model/pony/armor/pm_zombiePonyArmor.java @@ -0,0 +1,104 @@ +package com.minelittlepony.minelp.model.pony.armor; + +import com.minelittlepony.minelp.model.pony.armor.pm_newPonyArmor; + +import net.minecraft.util.MathHelper; + +public class pm_zombiePonyArmor extends pm_newPonyArmor { + public pm_zombiePonyArmor(String texture) { + super(texture); + } + + @Override + protected void rotateLegs(float move, float swing, float tick) { + float rightArmRotateAngleX; + float leftArmRotateAngleX; + float rightLegRotateAngleX; + float leftLegRotateAngleX; + float var8; + float var9; + if (this.isFlying && this.isPegasus) { + if (this.rainboom) { + rightArmRotateAngleX = ROTATE_270; + leftArmRotateAngleX = ROTATE_270; + rightLegRotateAngleX = ROTATE_90; + leftLegRotateAngleX = ROTATE_90; + } else { + rightArmRotateAngleX = MathHelper.sin(0.0F - swing * 0.5F); + leftArmRotateAngleX = MathHelper.sin(0.0F - swing * 0.5F); + rightLegRotateAngleX = MathHelper.sin(swing * 0.5F); + leftLegRotateAngleX = MathHelper.sin(swing * 0.5F); + } + + this.bipedRightArm.rotateAngleY = 0.2F; + this.SteveArm.rotateAngleY = 0.2F; + this.bipedLeftArm.rotateAngleY = -0.2F; + this.bipedRightLeg.rotateAngleY = -0.2F; + this.bipedLeftLeg.rotateAngleY = 0.2F; + } else { + var8 = (float) Math.pow(swing, 16.0D); + this.getClass(); + var9 = 3.1415927F * var8 * 0.5F; + this.getClass(); + float laQuad = 3.1415927F * var8; + this.getClass(); + float rlQuad = 3.1415927F * var8 * 0.2F; + this.getClass(); + float llQuad = 3.1415927F * var8 * -0.4F; + rightArmRotateAngleX = MathHelper.cos(move * 0.6662F + 3.1415927F + var9) * 0.45F * swing; + leftArmRotateAngleX = MathHelper.cos(move * 0.6662F + laQuad) * 0.45F * swing; + rightLegRotateAngleX = MathHelper.cos(move * 0.6662F + rlQuad) * 0.45F * swing; + leftLegRotateAngleX = MathHelper.cos(move * 0.6662F + 3.1415927F + llQuad) * 0.45F * swing; + this.bipedRightArm.rotateAngleY = 0.0F; + this.SteveArm.rotateAngleY = 0.0F; + this.unicornarm.rotateAngleY = 0.0F; + this.bipedLeftArm.rotateAngleY = 0.0F; + this.bipedRightLeg.rotateAngleY = 0.0F; + this.bipedLeftLeg.rotateAngleY = 0.0F; + } + + this.bipedRightArm.rotateAngleX = rightArmRotateAngleX; + this.SteveArm.rotateAngleX = rightArmRotateAngleX; + this.unicornarm.rotateAngleX = 0.0F; + this.bipedLeftArm.rotateAngleX = leftArmRotateAngleX; + this.bipedRightLeg.rotateAngleX = rightLegRotateAngleX; + this.bipedLeftLeg.rotateAngleX = leftLegRotateAngleX; + this.bipedRightArm.rotateAngleZ = 0.0F; + this.SteveArm.rotateAngleZ = 0.0F; + this.unicornarm.rotateAngleZ = 0.0F; + this.bipedLeftArm.rotateAngleZ = 0.0F; + if (this.heldItemRight == 0) { + var8 = MathHelper.sin(this.swingProgress * 3.1415927F); + var9 = MathHelper.sin((1.0F - (1.0F - this.swingProgress) * (1.0F - this.swingProgress)) * 3.1415927F); + if (MathHelper.sin(move / 20.0F) < 0.0F) { + this.bipedRightArm.rotateAngleZ = 0.0F; + this.bipedRightArm.rotateAngleY = 0.1F - var8 * 0.6F; + this.bipedRightArm.rotateAngleX = -1.5707964F; + this.bipedRightArm.rotateAngleX -= var8 * 1.2F - var9 * 0.4F; + this.bipedRightArm.rotateAngleZ += MathHelper.cos(tick * 0.09F) * 0.05F + 0.05F; + this.bipedRightArm.rotateAngleX += MathHelper.sin(tick * 0.067F) * 0.1F; + } else { + this.bipedLeftArm.rotateAngleZ = 0.0F; + this.bipedLeftArm.rotateAngleY = -(0.1F - var8 * 0.6F); + this.bipedLeftArm.rotateAngleX = -1.5707964F; + this.bipedLeftArm.rotateAngleX -= var8 * 1.2F - var9 * 0.4F; + this.bipedLeftArm.rotateAngleZ += MathHelper.cos(tick * 0.09F) * 0.05F + 0.05F; + this.bipedLeftArm.rotateAngleX += MathHelper.sin(tick * 0.067F) * 0.1F; + } + } + + this.syncLegs(); + } + + @Override + protected void fixSpecialRotationPoints(float move) { + if (this.heldItemRight == 0) { + if (MathHelper.sin(move / 20.0F) < 0.0F) { + this.shiftRotationPoint(this.bipedRightArm, 0.5F, 1.5F, 3.0F); + } else { + this.shiftRotationPoint(this.bipedLeftArm, -0.5F, 1.5F, 3.0F); + } + } + + } +} diff --git a/src/main/java/com/minelittlepony/minelp/model/pony/armor/pma_Human.java b/src/main/java/com/minelittlepony/minelp/model/pony/armor/pma_Human.java new file mode 100644 index 00000000..2b0afcf5 --- /dev/null +++ b/src/main/java/com/minelittlepony/minelp/model/pony/armor/pma_Human.java @@ -0,0 +1,14 @@ +package com.minelittlepony.minelp.model.pony.armor; + +import com.minelittlepony.minelp.model.ModelArmor; +import com.minelittlepony.minelp.model.pony.pm_Human; + +public class pma_Human extends ModelArmor { + + public pma_Human(String path) { + super(path); + this.modelArmorChestplate = new pm_Human(path); + this.modelArmor = new pm_Human(path); + } + +} diff --git a/src/main/java/com/minelittlepony/minelp/model/pony/armor/pma_newPony.java b/src/main/java/com/minelittlepony/minelp/model/pony/armor/pma_newPony.java new file mode 100644 index 00000000..56a4aa67 --- /dev/null +++ b/src/main/java/com/minelittlepony/minelp/model/pony/armor/pma_newPony.java @@ -0,0 +1,11 @@ +package com.minelittlepony.minelp.model.pony.armor; + +import com.minelittlepony.minelp.model.ModelArmor; + +public class pma_newPony extends ModelArmor { + public pma_newPony(String path) { + super(path); + this.modelArmorChestplate = new pm_newPonyArmor(path); + this.modelArmor = new pm_newPonyArmor(path); + } +} diff --git a/src/main/java/com/minelittlepony/minelp/model/pony/armor/pma_skeletonPony.java b/src/main/java/com/minelittlepony/minelp/model/pony/armor/pma_skeletonPony.java new file mode 100644 index 00000000..ffd7cc4b --- /dev/null +++ b/src/main/java/com/minelittlepony/minelp/model/pony/armor/pma_skeletonPony.java @@ -0,0 +1,12 @@ +package com.minelittlepony.minelp.model.pony.armor; + +import com.minelittlepony.minelp.model.ModelArmor; + +public class pma_skeletonPony extends ModelArmor { + + public pma_skeletonPony(String path) { + super(path); + this.modelArmorChestplate = new pm_skeletonPonyArmor(path); + this.modelArmor = new pm_skeletonPonyArmor(path); + } +} diff --git a/src/main/java/com/minelittlepony/minelp/model/pony/armor/pma_zombiePony.java b/src/main/java/com/minelittlepony/minelp/model/pony/armor/pma_zombiePony.java new file mode 100644 index 00000000..45ddad5d --- /dev/null +++ b/src/main/java/com/minelittlepony/minelp/model/pony/armor/pma_zombiePony.java @@ -0,0 +1,12 @@ +package com.minelittlepony.minelp.model.pony.armor; + +import com.minelittlepony.minelp.model.ModelArmor; + +public class pma_zombiePony extends ModelArmor { + + public pma_zombiePony(String path) { + super(path); + this.modelArmorChestplate = new pm_zombiePonyArmor(path); + this.modelArmor = new pm_zombiePonyArmor(path); + } +} diff --git a/src/main/java/com/minelittlepony/minelp/model/pony/pm_Human.java b/src/main/java/com/minelittlepony/minelp/model/pony/pm_Human.java new file mode 100644 index 00000000..d0a38700 --- /dev/null +++ b/src/main/java/com/minelittlepony/minelp/model/pony/pm_Human.java @@ -0,0 +1,152 @@ +package com.minelittlepony.minelp.model.pony; + +import org.lwjgl.opengl.GL11; + +import com.minelittlepony.minelp.model.ModelPony; +import com.minelittlepony.minelp.renderer.AniParams; + +import net.minecraft.client.model.ModelRenderer; +import net.minecraft.client.renderer.ItemRenderer; +import net.minecraft.client.renderer.entity.RenderManager; +import net.minecraft.entity.EntityLiving; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.util.MathHelper; + +public class pm_Human extends ModelPony { + + public ModelRenderer bipedEars; + public ModelRenderer cloak; + + public pm_Human(String texture) { + super(texture); + } + + @Override + public void init(float yoffset, float stretch) { + this.cloak = new ModelRenderer(this, 0, 0); + this.cloak.addBox(-5.0F, 0.0F, -1.0F, 10, 16, 1, stretch); + this.bipedEars = new ModelRenderer(this, 24, 0); + this.bipedEars.addBox(-3.0F, -6.0F, -1.0F, 6, 6, 1, stretch); + this.bipedHead = new ModelRenderer(this, 0, 0); + this.bipedHead.addBox(-4.0F, -8.0F, -4.0F, 8, 8, 8, stretch); + this.bipedHead.setRotationPoint(0.0F, 0.0F + yoffset, 0.0F); + this.bipedHeadwear = new ModelRenderer(this, 32, 0); + this.bipedHeadwear.addBox(-4.0F, -8.0F, -4.0F, 8, 8, 8, stretch + 0.5F); + this.bipedHeadwear.setRotationPoint(0.0F, 0.0F + yoffset, 0.0F); + this.bipedBody = new ModelRenderer(this, 16, 16); + this.bipedBody.addBox(-4.0F, 0.0F, -2.0F, 8, 12, 4, stretch); + this.bipedBody.setRotationPoint(0.0F, 0.0F + yoffset, 0.0F); + this.bipedRightArm = new ModelRenderer(this, 40, 16); + this.bipedRightArm.addBox(-3.0F, -2.0F, -2.0F, 4, 12, 4, stretch); + this.bipedRightArm.setRotationPoint(-5.0F, 2.0F + yoffset, 0.0F); + this.bipedLeftArm = new ModelRenderer(this, 40, 16); + this.bipedLeftArm.mirror = true; + this.bipedLeftArm.addBox(-1.0F, -2.0F, -2.0F, 4, 12, 4, stretch); + this.bipedLeftArm.setRotationPoint(5.0F, 2.0F + yoffset, 0.0F); + this.bipedRightLeg = new ModelRenderer(this, 0, 16); + this.bipedRightLeg.addBox(-2.0F, 0.0F, -2.0F, 4, 12, 4, stretch); + this.bipedRightLeg.setRotationPoint(-2.0F, 12.0F + yoffset, 0.0F); + this.bipedLeftLeg = new ModelRenderer(this, 0, 16); + this.bipedLeftLeg.mirror = true; + this.bipedLeftLeg.addBox(-2.0F, 0.0F, -2.0F, 4, 12, 4, stretch); + this.bipedLeftLeg.setRotationPoint(2.0F, 12.0F + yoffset, 0.0F); + } + + @Override + public void animate(AniParams ani) {} + + @Override + public void render(AniParams ani) {} + + @Override + protected boolean doCancelRender() { + return true; + } + + + @Override + public void renderDrop(RenderManager rendermanager, ItemRenderer itemrenderer, EntityLivingBase entity) { + this.renderDrop(itemrenderer, entity, this.bipedRightArm, 1.0F, -0.0625F, 0.4375F, 0.0625F); + } + + @Override + public void renderEars(EntityLivingBase entity, float par2) { + for (int i = 0; i < 2; ++i) { + float f1 = entity.renderYawOffset + (entity.prevRenderYawOffset - entity.renderYawOffset) * par2 + - (entity.prevRenderYawOffset + (entity.renderYawOffset - entity.prevRenderYawOffset) * par2); + float f2 = entity.prevRotationPitch + (entity.rotationPitch - entity.prevRotationPitch) * par2; + GL11.glPushMatrix(); + GL11.glRotatef(f1, 0.0F, 1.0F, 0.0F); + GL11.glRotatef(f2, 1.0F, 0.0F, 0.0F); + GL11.glTranslatef(0.375F * (i * 2 - 1), 0.0F, 0.0F); + GL11.glTranslatef(0.0F, -0.375F, 0.0F); + GL11.glRotatef(-f2, 1.0F, 0.0F, 0.0F); + GL11.glRotatef(-f1, 0.0F, 1.0F, 0.0F); + float f7 = 1.333333F; + GL11.glScalef(f7, f7, f7); + this.bipedEars.rotateAngleY = this.bipedHead.rotateAngleY; + this.bipedEars.rotateAngleX = this.bipedHead.rotateAngleX; + this.bipedEars.rotationPointX = 0.0F; + this.bipedEars.rotationPointY = 0.0F; + this.bipedEars.render(0.0625F); + GL11.glPopMatrix(); + } + + } + + @Override + public void renderCloak(EntityPlayer player, float par2) { + this.renderCape(par2); + GL11.glPushMatrix(); + GL11.glTranslatef(0.0F, 0.0F, 0.125F); + double d = player.prevChasingPosX + (player.chasingPosX - player.prevChasingPosX) * par2 + - (player.prevPosX + (player.posX - player.prevPosX) * par2); + double d1 = player.prevChasingPosY + (player.chasingPosY - player.prevChasingPosY) * par2 + - (player.prevPosY + (player.posY - player.prevPosY) * par2); + double d2 = player.prevChasingPosZ + (player.chasingPosZ - player.prevChasingPosZ) * par2 + - (player.prevPosZ + (player.posZ - player.prevPosZ) * par2); + float f10 = player.prevRenderYawOffset + (player.renderYawOffset - player.prevRenderYawOffset) * par2; + double d3 = MathHelper.sin(f10 * 3.1415927F / 180.0F); + double d4 = (-MathHelper.cos(f10 * 3.1415927F / 180.0F)); + float f12 = (float) d1 * 10.0F; + if (f12 < -6.0F) { + f12 = -6.0F; + } + + if (f12 > 32.0F) { + f12 = 32.0F; + } + + float f13 = (float) (d * d3 + d2 * d4) * 100.0F; + float f14 = (float) (d * d4 - d2 * d3) * 100.0F; + if (f13 < 0.0F) { + f13 = 0.0F; + } + + float f15 = player.prevCameraYaw + (player.cameraYaw - player.prevCameraYaw) * par2; + f12 += MathHelper.sin((player.prevDistanceWalkedModified + + (player.distanceWalkedModified - player.prevDistanceWalkedModified) * par2) * 6.0F) * 32.0F * f15; + if (player.isSneaking()) { + f12 += 25.0F; + } + + GL11.glRotatef(6.0F + f13 / 2.0F + f12, 1.0F, 0.0F, 0.0F); + GL11.glRotatef(f14 / 2.0F, 0.0F, 0.0F, 1.0F); + GL11.glRotatef(-f14 / 2.0F, 0.0F, 1.0F, 0.0F); + GL11.glRotatef(180.0F, 0.0F, 1.0F, 0.0F); + this.cloak.render(0.0625F); + GL11.glPopMatrix(); + } + + @Override + public void renderStaticCloak(EntityLiving player, float par2) { + GL11.glPushMatrix(); + GL11.glTranslatef(0.0F, 0.0F, 0.125F); + GL11.glRotatef(3.0F, 1.0F, 0.0F, 0.0F); + GL11.glRotatef(2.0F, 0.0F, 1.0F, 0.0F); + GL11.glRotatef(180.0F, 0.0F, 1.0F, 0.0F); + this.cloak.render(0.0625F); + GL11.glPopMatrix(); + } +} diff --git a/src/main/java/com/minelittlepony/minelp/model/pony/pm_newPonyAdv.java b/src/main/java/com/minelittlepony/minelp/model/pony/pm_newPonyAdv.java new file mode 100644 index 00000000..35b0d46a --- /dev/null +++ b/src/main/java/com/minelittlepony/minelp/model/pony/pm_newPonyAdv.java @@ -0,0 +1,1707 @@ +package com.minelittlepony.minelp.model.pony; + +import static net.minecraft.client.renderer.GlStateManager.*; + +import java.util.Random; + +import org.lwjgl.opengl.GL11; + +import com.minelittlepony.minelp.PonyManager; +import com.minelittlepony.minelp.model.ModelPony; +import com.minelittlepony.minelp.model.PMAPI; +import com.minelittlepony.minelp.renderer.AniParams; +import com.minelittlepony.minelp.renderer.CompressiveRendering; +import com.minelittlepony.minelp.renderer.HornGlowRenderer; +import com.minelittlepony.minelp.renderer.PlaneRenderer; + +import net.minecraft.client.model.ModelRenderer; +import net.minecraft.client.renderer.ItemRenderer; +import net.minecraft.client.renderer.entity.RenderManager; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLiving; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.util.MathHelper; + +public class pm_newPonyAdv extends ModelPony { + + protected static final float HEAD_CENTRE_X = 0.0F; + protected static final float HEAD_CENTRE_Y = -1.0F; + protected static final float HEAD_CENTRE_Z = -2.0F; + protected static final float BODY_CENTRE_X = 0.0F; + protected static final float BODY_CENTRE_Y = 8.0F; + protected static final float BODY_CENTRE_Z = 6.0F; + protected static final float THIRDP_ARM_CENTRE_X = 0.0F; + protected static final float THIRDP_ARM_CENTRE_Y = 10.0F; + protected static final float THIRDP_ARM_CENTRE_Z = 0.0F; + protected static final float FIRSTP_ARM_CENTRE_X = -1.0F; + protected static final float FIRSTP_ARM_CENTRE_Y = 4.0F; + protected static final float FIRSTP_ARM_CENTRE_Z = 0.0F; + protected static final float HEAD_RP_X = 0.0F; + protected static final float HEAD_RP_Y = 0.0F; + protected static final float HEAD_RP_Z = 0.0F; + protected static final float BODY_RP_Y_SNEAK = 7.0F; + protected static final float BODY_RP_Y_NOTSNEAK = 0.0F; + protected static final float BODY_RP_Z_SNEAK = -4.0F; + protected static final float BODY_RP_Z_NOTSNEAK = 0.0F; + protected static final float FRONT_LEG_RP_Y_SNEAK = 7.0F; + protected static final float FRONT_LEG_RP_Y_NOTSNEAK = 8.0F; + protected static final float WING_FOLDED_RP_Y = 13.0F; + protected static final float WING_FOLDED_RP_Z = -3.0F; + protected static final float LEFT_WING_RP_Y_SNEAK = 10.5F; + protected static final float LEFT_WING_RP_Y_NOTSNEAK = 5.5F; + protected static final float LEFT_WING_RP_Z_SNEAK = 2.0F; + protected static final float LEFT_WING_RP_Z_NOTSNEAK = 3.0F; + protected static final float RIGHT_WING_RP_Y_SNEAK = 11.5F; + protected static final float RIGHT_WING_RP_Y_NOTSNEAK = 6.5F; + protected static final float RIGHT_WING_RP_Z_SNEAK = 2.0F; + protected static final float RIGHT_WING_RP_Z_NOTSNEAK = 3.0F; + protected static final float TAIL_RP_X = 0.0F; + protected static final float TAIL_RP_Y = 0.8F; + protected static final float TAIL_RP_Z = 0.0F; + protected static final float TAIL_RP_Z_SNEAK = 10.0F; + protected static final float TAIL_RP_Z_NOTSNEAK = 14.0F; + protected static final float LEFT_WING_EXT_RP_X = 4.5F; + protected static final float LEFT_WING_EXT_RP_Y = 5.0F; + protected static final float LEFT_WING_EXT_RP_Z = 6.0F; + protected static final float RIGHT_WING_EXT_RP_X = -4.5F; + protected static final float RIGHT_WING_EXT_RP_Y = 5.0F; + protected static final float RIGHT_WING_EXT_RP_Z = 6.0F; + protected static final float BODY_ROTATE_ANGLE_X_SNEAK = 0.4F; + protected static final float BODY_ROTATE_ANGLE_X_NOTSNEAK = 0.0F; + protected static final float EXT_WING_ROTATE_ANGLE_X = 2.5F; + protected static final float LEFT_WING_ROTATE_ANGLE_Z_SNEAK = -6.0F; + protected static final float RIGHT_WING_ROTATE_ANGLE_Z_SNEAK = 6.0F; + protected static final float SNEAK_LEG_X_ROTATION_ADJUSTMENT = 0.4F; + protected static final float ROTATE_270 = 4.712F; + protected static final float ROTATE_90 = 1.571F; + protected static final float RIDING_SHIFT_Y = -10.0F; + protected static final float RIDING_SHIFT_Z = -10.0F; + + protected boolean rainboom; + protected final float Pi = 3.1415927F; + private float WingRotateAngleZ; + protected float NeckRotX = 0.166F; + public int tailstop = 0; + + public ModelRenderer bipedCape; + public ModelRenderer[] headpiece;// horn? ears? + public HornGlowRenderer[] hornglow; + public PlaneRenderer[] Bodypiece; + public PlaneRenderer[] VillagerBagPiece; + public PlaneRenderer VillagerApron; + public PlaneRenderer VillagerTrinket; + public PlaneRenderer[] BodypieceNeck; + public PlaneRenderer[] MuzzleFemale; + public PlaneRenderer[] MuzzleMale; + public ModelRenderer SteveArm; + public ModelRenderer unicornarm; + public PlaneRenderer[] Tail; + public ModelRenderer[] LeftWing; + public ModelRenderer[] RightWing; + public ModelRenderer[] LeftWingExt; + public ModelRenderer[] RightWingExt; + public CompressiveRendering CompressiveLeftWing; + public CompressiveRendering CompressiveRightWing; + + public pm_newPonyAdv(String texture) { + super(texture); + } + + @Override + public void init(float yOffset, float stretch) { + this.initTextures(); + this.initPositions(yOffset, stretch); + } + + @Override + public void animate(AniParams aniparams) { + this.checkRainboom(aniparams.swing); + this.rotateHead(aniparams.horz, aniparams.vert); + this.swingTailZ(aniparams.move, aniparams.swing); + float bodySwingRotation = 0.0F; + if (this.swingProgress > -9990.0F && (!this.isUnicorn || this.glowColor == 0)) { + bodySwingRotation = MathHelper.sin(MathHelper.sqrt_float(this.swingProgress) * 3.1415927F * 2.0F) * 0.2F; + } + + this.bipedBody.rotateAngleY = bodySwingRotation * 0.2F; + + int k1; + for (k1 = 0; k1 < this.Bodypiece.length; ++k1) { + this.Bodypiece[k1].rotateAngleY = bodySwingRotation * 0.2F; + } + + for (k1 = 0; k1 < this.VillagerBagPiece.length; ++k1) { + this.VillagerBagPiece[k1].rotateAngleY = bodySwingRotation * 0.2F; + } + + this.VillagerBagPiece[4].rotateAngleY += 4.712389F; + this.VillagerBagPiece[5].rotateAngleY += 4.712389F; + this.VillagerBagPiece[6].rotateAngleY += 4.712389F; + this.VillagerBagPiece[7].rotateAngleY += 4.712389F; + this.VillagerApron.rotateAngleY = bodySwingRotation * 0.2F; + this.VillagerTrinket.rotateAngleY = bodySwingRotation * 0.2F; + + for (k1 = 0; k1 < this.BodypieceNeck.length; ++k1) { + this.BodypieceNeck[k1].rotateAngleY = bodySwingRotation * 0.2F; + } + + for (k1 = 0; k1 < this.LeftWing.length; ++k1) { + this.LeftWing[k1].rotateAngleY = bodySwingRotation * 0.2F; + } + + for (k1 = 0; k1 < this.RightWing.length; ++k1) { + this.RightWing[k1].rotateAngleY = bodySwingRotation * 0.2F; + } + + this.tailstop = 0; + this.tailstop = this.Tail.length - this.wantTail * 5; + if (this.tailstop <= 1) { + this.tailstop = 0; + } + + for (k1 = 0; k1 < this.tailstop; ++k1) { + this.Tail[k1].rotateAngleY = bodySwingRotation; + } + + this.setLegs(aniparams.move, aniparams.swing, aniparams.tick); + this.holdItem(); + this.swingItem(this.swingProgress); + if (this.issneak && !this.isFlying) { + this.adjustBody(BODY_ROTATE_ANGLE_X_SNEAK, BODY_RP_Y_SNEAK, BODY_RP_Z_SNEAK); + this.animatePegasusWingsSneaking(); + this.sneakLegs(); + this.setHead(0.0F, 6.0F, -2.0F); + this.sneakTail(); + } else { + this.adjustBody(BODY_ROTATE_ANGLE_X_NOTSNEAK, BODY_RP_Y_NOTSNEAK, BODY_RP_Z_NOTSNEAK); + if (this.isPegasus) { + this.animatePegasusWingsNotSneaking(aniparams.tick); + } + + this.bipedRightLeg.rotationPointY = FRONT_LEG_RP_Y_NOTSNEAK; + this.bipedLeftLeg.rotationPointY = FRONT_LEG_RP_Y_NOTSNEAK; + this.swingArms(aniparams.tick); + this.setHead(0.0F, 0.0F, 0.0F); + this.tailstop = 0; + this.tailstop = this.Tail.length - this.wantTail * 5; + if (this.tailstop <= 1) { + this.tailstop = 0; + } + + for (k1 = 0; k1 < this.tailstop; ++k1) { + this.setRotationPoint(this.Tail[k1], TAIL_RP_X, TAIL_RP_Y, TAIL_RP_Z_NOTSNEAK); + if (this.rainboom) { + this.Tail[k1].rotateAngleX = ROTATE_90 + 0.1F * MathHelper.sin(aniparams.move); + } else { + this.Tail[k1].rotateAngleX = 0.5F * aniparams.swing; + } + } + + if (!this.rainboom) { + this.swingTailX(aniparams.tick); + } + } + + if (this.rainboom) { + this.tailstop = 0; + this.tailstop = this.Tail.length - this.wantTail * 5; + if (this.tailstop <= 1) { + this.tailstop = 0; + } + + for (k1 = 0; k1 < this.tailstop; ++k1) { + this.Tail[k1].rotationPointY += 6.0F; + ++this.Tail[k1].rotationPointZ; + } + } + + if (this.isSleeping) { + this.ponySleep(); + } + + if (this.aimedBow) { + this.aimBow(aniparams.tick); + } + + this.fixSpecialRotations(); + this.fixSpecialRotationPoints(aniparams.move); + + animateWears(); + } + + private void animateWears() { + copyModelAngles(bipedLeftArm, bipedLeftArmwear); + copyModelAngles(bipedRightArm, bipedRightArmwear); + copyModelAngles(bipedLeftLeg, bipedLeftLegwear); + copyModelAngles(bipedRightLeg, bipedRightLegwear); + copyModelAngles(bipedBody, bipedBodyWear); + } + + protected void checkRainboom(float swing) { + if (this.isPegasus && this.isFlying && swing >= 0.9999F) { + this.rainboom = true; + } else { + this.rainboom = false; + } + + } + + protected void setHead(float posX, float posY, float posZ) { + this.setRotationPoint(this.bipedHead, posX, posY, posZ); + this.setRotationPoint(this.bipedHeadwear, posX, posY, posZ); + + int j6; + for (j6 = 0; j6 < this.headpiece.length; ++j6) { + this.setRotationPoint(this.headpiece[j6], posX, posY, posZ); + } + + for (j6 = 0; j6 < this.hornglow.length; ++j6) { + this.setRotationPoint(this.hornglow[j6], posX, posY, posZ); + } + + if (this.isMale) { + for (j6 = 0; j6 < this.MuzzleMale.length; ++j6) { + this.setRotationPoint(this.MuzzleMale[j6], posX, posY, posZ); + } + } else { + for (j6 = 0; j6 < this.MuzzleFemale.length; ++j6) { + this.setRotationPoint(this.MuzzleFemale[j6], posX, posY, posZ); + } + } + + } + + protected void rotateHead(float horz, float vert) { + float headRotateAngleY; + float headRotateAngleX; + if (this.isSleeping) { + headRotateAngleY = 1.4F; + headRotateAngleX = 0.1F; + } else { + headRotateAngleY = horz / 57.29578F; + headRotateAngleX = vert / 57.29578F; + } + + if (headRotateAngleX > 0.5F) { + headRotateAngleX = 0.5F; + } + + if (headRotateAngleX < -0.5F) { + headRotateAngleX = -0.5F; + } + + this.bipedHead.rotateAngleY = headRotateAngleY; + this.bipedHead.rotateAngleX = headRotateAngleX; + int i; + if (this.isMale) { + for (i = 0; i < this.MuzzleMale.length; ++i) { + this.MuzzleMale[i].rotateAngleY = headRotateAngleY; + this.MuzzleMale[i].rotateAngleX = headRotateAngleX; + } + } else { + for (i = 0; i < this.MuzzleFemale.length; ++i) { + this.MuzzleFemale[i].rotateAngleY = headRotateAngleY; + this.MuzzleFemale[i].rotateAngleX = headRotateAngleX; + } + } + + this.headpiece[0].rotateAngleY = headRotateAngleY; + this.headpiece[0].rotateAngleX = headRotateAngleX; + this.headpiece[1].rotateAngleY = headRotateAngleY; + this.headpiece[1].rotateAngleX = headRotateAngleX; + this.headpiece[2].rotateAngleY = headRotateAngleY; + this.headpiece[2].rotateAngleX = headRotateAngleX; + this.hornglow[0].rotateAngleY = headRotateAngleY; + this.hornglow[0].rotateAngleX = headRotateAngleX; + this.hornglow[1].rotateAngleY = headRotateAngleY; + this.hornglow[1].rotateAngleX = headRotateAngleX; + this.bipedHeadwear.rotateAngleY = headRotateAngleY; + this.bipedHeadwear.rotateAngleX = headRotateAngleX; + this.headpiece[2].rotateAngleX = headRotateAngleX + 0.5F; + this.hornglow[0].rotateAngleX = headRotateAngleX + 0.5F; + this.hornglow[1].rotateAngleX = headRotateAngleX + 0.5F; + } + + protected void setLegs(float move, float swing, float tick) { + this.rotateLegs(move, swing, tick); + this.adjustLegs(); + } + + protected void rotateLegs(float move, float swing, float tick) { + float rightArmRotateAngleX; + float leftArmRotateAngleX; + float rightLegRotateAngleX; + float leftLegRotateAngleX; + if (this.isFlying && this.isPegasus) { + if (this.rainboom) { + rightArmRotateAngleX = ROTATE_270; + leftArmRotateAngleX = ROTATE_270; + rightLegRotateAngleX = ROTATE_90; + leftLegRotateAngleX = ROTATE_90; + } else { + rightArmRotateAngleX = MathHelper.sin(0.0F - swing * 0.5F); + leftArmRotateAngleX = MathHelper.sin(0.0F - swing * 0.5F); + rightLegRotateAngleX = MathHelper.sin(swing * 0.5F); + leftLegRotateAngleX = MathHelper.sin(swing * 0.5F); + } + + this.SteveArm.rotateAngleY = 0.2F; + this.bipedRightArm.rotateAngleY = 0.2F; + this.bipedLeftArm.rotateAngleY = -0.2F; + this.bipedRightLeg.rotateAngleY = -0.2F; + this.bipedLeftLeg.rotateAngleY = 0.2F; + + } else { + float swag = (float) Math.pow(swing, 16.0D); + this.getClass(); + float raQuad = 3.1415927F * swag * 0.5F; + this.getClass(); + float laQuad = 3.1415927F * swag; + this.getClass(); + float rlQuad = 3.1415927F * swag * 0.2F; + this.getClass(); + float llQuad = 3.1415927F * swag * -0.4F; + rightArmRotateAngleX = MathHelper.cos(move * 0.6662F + 3.1415927F + raQuad) * 0.45F * swing; + leftArmRotateAngleX = MathHelper.cos(move * 0.6662F + laQuad) * 0.45F * swing; + rightLegRotateAngleX = MathHelper.cos(move * 0.6662F + rlQuad) * 0.45F * swing; + leftLegRotateAngleX = MathHelper.cos(move * 0.6662F + 3.1415927F + llQuad) * 0.45F * swing; + this.SteveArm.rotateAngleY = 0.0F; + this.unicornarm.rotateAngleY = 0.0F; + + this.bipedRightArm.rotateAngleY = 0.0F; + this.bipedLeftArm.rotateAngleY = 0.0F; + this.bipedRightLeg.rotateAngleY = 0.0F; + this.bipedLeftLeg.rotateAngleY = 0.0F; + } + + this.bipedRightArm.rotateAngleX = rightArmRotateAngleX; + this.SteveArm.rotateAngleX = rightArmRotateAngleX; + this.unicornarm.rotateAngleX = 0.0F; + + this.bipedLeftArm.rotateAngleX = leftArmRotateAngleX; + this.bipedRightLeg.rotateAngleX = rightLegRotateAngleX; + this.bipedLeftLeg.rotateAngleX = leftLegRotateAngleX; + this.bipedRightArm.rotateAngleZ = 0.0F; + + this.SteveArm.rotateAngleZ = 0.0F; + this.unicornarm.rotateAngleZ = 0.0F; + this.bipedLeftArm.rotateAngleZ = 0.0F; + } + + protected void adjustLegs() { + float sinBodyRotateAngleYFactor = MathHelper.sin(this.bipedBody.rotateAngleY) * 5.0F; + float cosBodyRotateAngleYFactor = MathHelper.cos(this.bipedBody.rotateAngleY) * 5.0F; + float legOutset = 4.0F; + if (this.issneak && !this.isFlying) { + legOutset = 0.0F; + } + + if (this.isSleeping) { + legOutset = 2.6F; + } + + if (this.rainboom) { + this.bipedRightArm.rotationPointZ = sinBodyRotateAngleYFactor + + 2.0F; + this.SteveArm.rotationPointZ = sinBodyRotateAngleYFactor + 2.0F; + this.bipedLeftArm.rotationPointZ = 0.0F - sinBodyRotateAngleYFactor + 2.0F; + } else { + this.bipedRightArm.rotationPointZ = sinBodyRotateAngleYFactor + 1.0F; + this.SteveArm.rotationPointZ = sinBodyRotateAngleYFactor + 1.0F; + this.bipedLeftArm.rotationPointZ = 0.0F - sinBodyRotateAngleYFactor + 1.0F; + } + this.SteveArm.rotationPointX = 0.0F - cosBodyRotateAngleYFactor; + + this.bipedRightArm.rotationPointX = 0.0F - cosBodyRotateAngleYFactor - 1.0F + legOutset; + this.bipedLeftArm.rotationPointX = cosBodyRotateAngleYFactor + 1.0F - legOutset; + this.bipedRightLeg.rotationPointX = 0.0F - cosBodyRotateAngleYFactor - 1.0F + legOutset; + this.bipedLeftLeg.rotationPointX = cosBodyRotateAngleYFactor + 1.0F - legOutset; + + this.bipedRightArm.rotateAngleY += this.bipedBody.rotateAngleY; + this.bipedLeftArm.rotateAngleY += this.bipedBody.rotateAngleY; + this.bipedLeftArm.rotateAngleX += this.bipedBody.rotateAngleY; + + this.bipedRightArm.rotationPointY = 8.0F; + this.bipedLeftArm.rotationPointY = 8.0F; + this.bipedRightLeg.rotationPointZ = 10.0F; + this.bipedLeftLeg.rotationPointZ = 10.0F; + } + + protected void swingTailZ(float move, float swing) { + this.tailstop = 0; + this.tailstop = this.Tail.length - this.wantTail * 5; + if (this.tailstop <= 1) { + this.tailstop = 0; + } + + for (int j = 0; j < this.tailstop; ++j) { + if (this.rainboom) { + this.Tail[j].rotateAngleZ = 0.0F; + } else { + this.Tail[j].rotateAngleZ = MathHelper.cos(move * 0.8F) * 0.2F * swing; + } + } + + } + + protected void swingTailX(float tick) { + float sinTickFactor = MathHelper.sin(tick * 0.067F) * 0.05F; + this.tailstop = 0; + this.tailstop = this.Tail.length - this.wantTail * 5; + if (this.tailstop <= 1) { + this.tailstop = 0; + } + + for (int l6 = 0; l6 < this.tailstop; ++l6) { + this.Tail[l6].rotateAngleX += sinTickFactor; + } + + } + + protected void holdItem() { + if (this.heldItemRight != 0 && !this.rainboom && (!this.isUnicorn || this.glowColor == 0)) { + this.bipedRightArm.rotateAngleX = this.bipedRightArm.rotateAngleX * 0.5F - 0.3141593F; + this.SteveArm.rotateAngleX = this.SteveArm.rotateAngleX * 0.5F - 0.3141593F; + } + + } + + protected void swingItem(float swingProgress) { + if (swingProgress > -9990.0F && !this.isSleeping) { + float f16 = 1.0F - swingProgress; + f16 *= f16 * f16; + f16 = 1.0F - f16; + float f22 = MathHelper.sin(f16 * 3.1415927F); + float f28 = MathHelper.sin(swingProgress * 3.1415927F); + float f33 = f28 * -(this.bipedHead.rotateAngleX - 0.7F) * 0.75F; + if (this.isUnicorn && this.glowColor != 0 && this.heldItemRight != 0) { + this.unicornarm.rotateAngleX = (float) (this.unicornarm.rotateAngleX + - (f22 * 1.2D + f33)); + this.unicornarm.rotateAngleY += this.bipedBody.rotateAngleY * 2.0F; + this.unicornarm.rotateAngleZ = f28 * -0.4F; + } else { + this.bipedRightArm.rotateAngleX = (float) (this.bipedRightArm.rotateAngleX + - (f22 * 1.2D + f33)); + this.bipedRightArm.rotateAngleY += this.bipedBody.rotateAngleY * 2.0F; + this.bipedRightArm.rotateAngleZ = f28 * -0.4F; + this.SteveArm.rotateAngleX = (float) (this.SteveArm.rotateAngleX + - (f22 * 1.2D + f33)); + this.SteveArm.rotateAngleY += this.bipedBody.rotateAngleY * + 2.0F; + this.SteveArm.rotateAngleZ = f28 * -0.4F; + } + } + + } + + protected void swingArms(float tick) { + if (this.heldItemRight != 0 && !this.isSleeping) { + float cosTickFactor = MathHelper.cos(tick * 0.09F) * 0.05F + 0.05F; + float sinTickFactor = MathHelper.sin(tick * 0.067F) * 0.05F; + if (this.isUnicorn && this.glowColor != 0) { + this.unicornarm.rotateAngleZ += cosTickFactor; + this.unicornarm.rotateAngleX += sinTickFactor; + } else { + this.bipedRightArm.rotateAngleZ += cosTickFactor; + this.bipedRightArm.rotateAngleX += sinTickFactor; + this.SteveArm.rotateAngleZ += cosTickFactor; + this.SteveArm.rotateAngleX += sinTickFactor; + } + } + + } + + protected void adjustBody(float rotateAngleX, float rotationPointY, float rotationPointZ) { + this.adjustBodyComponents(rotateAngleX, rotationPointY, rotationPointZ); + this.adjustNeck(rotateAngleX, rotationPointY, rotationPointZ); + } + + protected void adjustBodyComponents(float rotateAngleX, float rotationPointY, float rotationPointZ) { + this.bipedBody.rotateAngleX = rotateAngleX; + this.bipedBody.rotationPointY = rotationPointY; + this.bipedBody.rotationPointZ = rotationPointZ; + + int k3; + for (k3 = 0; k3 < this.Bodypiece.length; ++k3) { + this.Bodypiece[k3].rotateAngleX = rotateAngleX; + this.Bodypiece[k3].rotationPointY = rotationPointY; + this.Bodypiece[k3].rotationPointZ = rotationPointZ; + } + + for (k3 = 0; k3 < this.VillagerBagPiece.length; ++k3) { + this.VillagerBagPiece[k3].rotateAngleX = rotateAngleX; + this.VillagerBagPiece[k3].rotationPointY = rotationPointY; + this.VillagerBagPiece[k3].rotationPointZ = rotationPointZ; + } + + this.VillagerApron.rotateAngleX = rotateAngleX; + this.VillagerApron.rotationPointY = rotationPointY; + this.VillagerApron.rotationPointZ = rotationPointZ; + this.VillagerTrinket.rotateAngleX = rotateAngleX; + this.VillagerTrinket.rotationPointY = rotationPointY; + this.VillagerTrinket.rotationPointZ = rotationPointZ; + } + + protected void adjustNeck(float rotateAngleX, float rotationPointY, float rotationPointZ) { + for (int k3 = 0; k3 < this.BodypieceNeck.length; ++k3) { + this.BodypieceNeck[k3].rotateAngleX = this.NeckRotX + rotateAngleX; + this.BodypieceNeck[k3].rotationPointY = rotationPointY; + this.BodypieceNeck[k3].rotationPointZ = rotationPointZ; + } + + } + + protected void sneakLegs() { + this.SteveArm.rotateAngleX += SNEAK_LEG_X_ROTATION_ADJUSTMENT; + this.unicornarm.rotateAngleX += SNEAK_LEG_X_ROTATION_ADJUSTMENT; + + this.bipedRightArm.rotateAngleX -= SNEAK_LEG_X_ROTATION_ADJUSTMENT; + this.bipedLeftArm.rotateAngleX -= SNEAK_LEG_X_ROTATION_ADJUSTMENT; + this.bipedRightLeg.rotationPointY = FRONT_LEG_RP_Y_SNEAK; + this.bipedLeftLeg.rotationPointY = FRONT_LEG_RP_Y_SNEAK; + + } + + protected void sneakTail() { + this.tailstop = 0; + this.tailstop = this.Tail.length - this.wantTail * 5; + if (this.tailstop <= 1) { + this.tailstop = 0; + } + + for (int i7 = 0; i7 < this.tailstop; ++i7) { + this.setRotationPoint(this.Tail[i7], TAIL_RP_X, TAIL_RP_Y, TAIL_RP_Z_SNEAK); + this.Tail[i7].rotateAngleX = 0.0F; + } + + } + + protected void ponySleep() { + this.bipedRightArm.rotateAngleX = ROTATE_270; + this.bipedLeftArm.rotateAngleX = ROTATE_270; + this.bipedRightLeg.rotateAngleX = ROTATE_90; + this.bipedLeftLeg.rotateAngleX = ROTATE_90; + float headPosX; + float headPosY; + float headPosZ; + if (this.issneak) { + headPosY = 2.0F; + headPosZ = -1.0F; + headPosX = 1.0F; + } else { + headPosY = 2.0F; + headPosZ = 1.0F; + headPosX = 1.0F; + } + + this.setHead(headPosX, headPosY, headPosZ); + this.shiftRotationPoint(this.bipedRightArm, 0.0F, 2.0F, 6.0F); + this.shiftRotationPoint(this.bipedLeftArm, 0.0F, 2.0F, 6.0F); + this.shiftRotationPoint(this.bipedRightLeg, 0.0F, 2.0F, -8.0F); + this.shiftRotationPoint(this.bipedLeftLeg, 0.0F, 2.0F, -8.0F); + } + + protected void aimBow(float tick) { + if (this.isUnicorn && this.glowColor != 0) { + this.aimBowUnicorn(tick); + } else { + this.aimBowPony(tick); + } + + } + + protected void aimBowPony(float tick) { + this.bipedRightArm.rotateAngleZ = 0.0F; + this.bipedRightArm.rotateAngleY = -0.06F + this.bipedHead.rotateAngleY; + this.bipedRightArm.rotateAngleX = ROTATE_270 + this.bipedHead.rotateAngleX; + this.bipedRightArm.rotateAngleZ += MathHelper.cos(tick * 0.09F) * 0.05F + 0.05F; + this.bipedRightArm.rotateAngleX += MathHelper.sin(tick * 0.067F) * 0.05F; + this.shiftRotationPoint(this.bipedRightArm, 0.0F, 0.0F, 1.0F); + + this.bipedRightArmwear.rotateAngleZ = 0.0F; + this.bipedRightArmwear.rotateAngleY = -0.06F + this.bipedHead.rotateAngleY; + this.bipedRightArmwear.rotateAngleX = ROTATE_270 + this.bipedHead.rotateAngleX; + this.bipedRightArmwear.rotateAngleZ += MathHelper.cos(tick * 0.09F) * 0.05F + 0.05F; + this.bipedRightArmwear.rotateAngleX += MathHelper.sin(tick * 0.067F) * 0.05F; + this.shiftRotationPoint(this.bipedRightArmwear, 0.0F, 0.0F, 1.0F); + } + + protected void aimBowUnicorn(float tick) { + this.unicornarm.rotateAngleZ = 0.0F; + this.unicornarm.rotateAngleY = -0.06F + this.bipedHead.rotateAngleY; + this.unicornarm.rotateAngleX = ROTATE_270 + this.bipedHead.rotateAngleX; + this.unicornarm.rotateAngleZ += MathHelper.cos(tick * 0.09F) * 0.05F + 0.05F; + this.unicornarm.rotateAngleX += MathHelper.sin(tick * 0.067F) * 0.05F; + } + + protected void animatePegasusWingsSneaking() { + int k5; + for (k5 = 0; k5 < this.LeftWingExt.length; ++k5) { + this.LeftWingExt[k5].rotationPointY = LEFT_WING_RP_Y_SNEAK; + this.LeftWingExt[k5].rotationPointZ = LEFT_WING_RP_Z_SNEAK; + this.LeftWingExt[k5].rotateAngleX = EXT_WING_ROTATE_ANGLE_X; + this.LeftWingExt[k5].rotateAngleZ = LEFT_WING_ROTATE_ANGLE_Z_SNEAK; + } + + for (k5 = 0; k5 < this.LeftWingExt.length; ++k5) { + this.RightWingExt[k5].rotationPointY = RIGHT_WING_RP_Y_SNEAK; + this.RightWingExt[k5].rotationPointZ = RIGHT_WING_RP_Z_SNEAK; + this.RightWingExt[k5].rotateAngleX = EXT_WING_ROTATE_ANGLE_X; + this.RightWingExt[k5].rotateAngleZ = RIGHT_WING_ROTATE_ANGLE_Z_SNEAK; + } + + } + + protected void animatePegasusWingsNotSneaking(float tick) { + int l5; + if (!this.isFlying) { + for (l5 = 0; l5 < this.LeftWing.length; ++l5) { + this.LeftWing[l5].rotationPointY = WING_FOLDED_RP_Y; + this.LeftWing[l5].rotationPointZ = WING_FOLDED_RP_Z; + } + + for (l5 = 0; l5 < this.RightWing.length; ++l5) { + this.RightWing[l5].rotationPointY = WING_FOLDED_RP_Y; + this.RightWing[l5].rotationPointZ = WING_FOLDED_RP_Z; + } + } else { + this.WingRotateAngleZ = MathHelper.sin(tick * 0.536F) * 1.0F; + + for (l5 = 0; l5 < this.LeftWingExt.length; ++l5) { + this.LeftWingExt[l5].rotateAngleX = EXT_WING_ROTATE_ANGLE_X; + this.LeftWingExt[l5].rotateAngleZ = -this.WingRotateAngleZ - ROTATE_270 - 0.4F; + this.LeftWingExt[l5].rotationPointY = LEFT_WING_RP_Y_NOTSNEAK; + this.LeftWingExt[l5].rotationPointZ = LEFT_WING_RP_Z_NOTSNEAK; + } + + for (l5 = 0; l5 < this.RightWingExt.length; ++l5) { + this.RightWingExt[l5].rotateAngleX = EXT_WING_ROTATE_ANGLE_X; + this.RightWingExt[l5].rotateAngleZ = this.WingRotateAngleZ + ROTATE_270 + 0.4F; + this.RightWingExt[l5].rotationPointY = RIGHT_WING_RP_Y_NOTSNEAK; + this.RightWingExt[l5].rotationPointZ = RIGHT_WING_RP_Z_NOTSNEAK; + } + } + + } + + protected void fixSpecialRotations() { + this.LeftWingExt[1].rotateAngleX -= 0.85F; + this.LeftWingExt[2].rotateAngleX -= 0.75F; + this.LeftWingExt[3].rotateAngleX -= 0.5F; + this.LeftWingExt[5].rotateAngleX -= 0.85F; + this.RightWingExt[1].rotateAngleX -= 0.85F; + this.RightWingExt[2].rotateAngleX -= 0.75F; + this.RightWingExt[3].rotateAngleX -= 0.5F; + this.RightWingExt[5].rotateAngleX -= 0.85F; + this.Bodypiece[9].rotateAngleX += 0.5F; + this.Bodypiece[10].rotateAngleX += 0.5F; + this.Bodypiece[11].rotateAngleX += 0.5F; + this.Bodypiece[12].rotateAngleX += 0.5F; + this.Bodypiece[13].rotateAngleX += 0.5F; + } + + @Override + public void setRotationAngles(float p_78087_1_, float p_78087_2_, float p_78087_3_, float p_78087_4_, + float p_78087_5_, float p_78087_6_, Entity p_78087_7_) { + // TODO Auto-generated method stub + super.setRotationAngles(p_78087_1_, p_78087_2_, p_78087_3_, + p_78087_4_, p_78087_5_, p_78087_6_, p_78087_7_); + copyModelAngles(this.bipedRightArm, this.SteveArm); + } + + protected void fixSpecialRotationPoints(float move) {} + + public void shiftRotationPoint(PlaneRenderer aPlaneRenderer, float shiftX, float shiftY, float shiftZ) { + aPlaneRenderer.rotationPointX += shiftX; + aPlaneRenderer.rotationPointY += shiftY; + aPlaneRenderer.rotationPointZ += shiftZ; + } + + public void shiftRotationPoint(ModelRenderer aRenderer, float shiftX, float shiftY, float shiftZ) { + aRenderer.rotationPointX += shiftX; + aRenderer.rotationPointY += shiftY; + aRenderer.rotationPointZ += shiftZ; + } + + public void setRotationPoint(HornGlowRenderer aRenderer, float setX, float setY, float setZ) { + aRenderer.rotationPointX = setX; + aRenderer.rotationPointY = setY; + aRenderer.rotationPointZ = setZ; + } + + public void setRotationPoint(PlaneRenderer aPlaneRenderer, float setX, float setY, float setZ) { + aPlaneRenderer.rotationPointX = setX; + aPlaneRenderer.rotationPointY = setY; + aPlaneRenderer.rotationPointZ = setZ; + } + + public void setRotationPoint(ModelRenderer aRenderer, float setX, float setY, float setZ) { + aRenderer.rotationPointX = setX; + aRenderer.rotationPointY = setY; + aRenderer.rotationPointZ = setZ; + } + + @Override + public void render(AniParams aniparams) { + if (this.isRiding && !this.isArmour) { + translate(0.0F, -0.56F, -0.46F); + } + + if (this.isSleeping && !this.isArmour) { + rotate(90.0F, 0.0F, 1.0F, 0.0F); + rotate(270.0F, 0.0F, 0.0F, 1.0F); + rotate(90.0F, 0.0F, 1.0F, 0.0F); + rotate(180.0F, 0.0F, 0.0F, 1.0F); + rotate(180.0F, 0.0F, 1.0F, 0.0F); + } + + if (this.size == 0) { + if (this.issneak && !this.isFlying && !this.isArmour) { + translate(0.0F, -0.12F, 0.0F); + } + + if (this.isSleeping && !this.isArmour) { + translate(0.0F, -1.0F, 0.25F); + } + + pushMatrix(); + translate(0.0F, 0.76F, 0.0F); + scale(0.9F, 0.9F, 0.9F); + this.renderHead(); + if (this.issneak && !this.isFlying) { + translate(0.0F, -0.01F, 0.15F); + } + + this.renderNeck(); + popMatrix(); + + pushMatrix(); + translate(0.0F, 0.76F, -0.04F); + scale(0.6F, 0.6F, 0.6F); + this.renderBody(); + this.renderTail(); + popMatrix(); + + pushMatrix(); + translate(0.0F, 0.89F, 0.0F); + scale(0.6F, 0.41F, 0.6F); + if (this.issneak && !this.isFlying) { + translate(0.0F, 0.12F, 0.0F); + } + + if (this.rainboom) { + translate(0.0F, -0.08F, 0.0F); + } + + this.renderLegs(); + popMatrix(); + + } else if (this.size == 2) { + if (this.isSleeping && !this.isArmour) { + translate(0.0F, -0.47F, 0.2F); + } + + pushMatrix(); + translate(0.0F, -0.17F, -0.04F); + if (this.isSleeping && !this.isArmour) { + translate(0.0F, 0.0F, -0.1F); + } + + if (this.issneak && !this.isFlying) { + translate(0.0F, 0.15F, 0.0F); + } + + this.renderHead(); + popMatrix(); + pushMatrix(); + translate(0.0F, -0.15F, -0.07F); + if (this.issneak && !this.isFlying) { + translate(0.0F, 0.0F, -0.05F); + } + + this.renderNeck(); + popMatrix(); + pushMatrix(); + translate(0.0F, -0.2F, -0.04F); + scale(1.15F, 1.2F, 1.2F); + this.renderBody(); + popMatrix(); + pushMatrix(); + translate(0.0F, -0.2F, 0.08F); + this.renderTail(); + popMatrix(); + pushMatrix(); + translate(0.0F, -0.14F, 0.0F); + scale(1.15F, 1.12F, 1.15F); + this.renderLegs(); + popMatrix(); + } else if (this.size == 3) { + if (this.isSleeping && !this.isArmour) { + translate(0.0F, -0.43F, 0.25F); + } + + pushMatrix(); + translate(0.0F, -0.15F, 0.01F); + if (this.issneak && !this.isFlying) { + translate(0.0F, 0.05F, 0.0F); + } + + this.renderHead(); + popMatrix(); + pushMatrix(); + translate(0.0F, -0.19F, -0.01F); + scale(1.0F, 1.1F, 1.0F); + if (this.issneak && !this.isFlying) { + translate(0.0F, -0.06F, -0.04F); + } + + this.renderNeck(); + popMatrix(); + pushMatrix(); + translate(0.0F, -0.1F, 0.0F); + scale(1.0F, 1.0F, 1.0F); + this.renderBody(); + this.renderTail(); + popMatrix(); + pushMatrix(); + translate(0.0F, -0.25F, 0.03F); + scale(1.0F, 1.18F, 1.0F); + if (this.rainboom) { + translate(0.0F, 0.05F, 0.0F); + } + + this.renderLegs(); + popMatrix(); + } else { + if (this.isSleeping && !this.isArmour) { + translate(0.0F, -0.535F, 0.25F); + } + + this.renderHead(); + this.renderNeck(); + this.renderBody(); + this.renderTail(); + this.renderLegs(); + } + + } + + protected void renderHead() { + this.bipedHead.render(this.scale); + this.headpiece[0].render(this.scale); + this.headpiece[1].render(this.scale); + if (PonyManager.getInstance().getShowSnuzzles() == 1) { + int red; + if (this.isMale) { + for (red = 0; red < this.MuzzleMale.length; ++red) { + this.MuzzleMale[red].render(this.scale); + } + } else { + for (red = 0; red < this.MuzzleFemale.length; ++red) { + this.MuzzleFemale[red].render(this.scale); + } + } + } + + this.bipedHeadwear.render(this.scale); + if (this.isUnicorn) { + this.headpiece[2].render(this.scale); + if (this.heldItemRight != 0 && this.glowColor != 0) { + GL11.glPushAttrib(24577); + GL11.glDisable(3553); + GL11.glDisable(2896); + GL11.glEnable(3042); + float var4 = (this.glowColor >> 16 & 255) / 255.0F; + float green = (this.glowColor >> 8 & 255) / 255.0F; + float blue = (this.glowColor & 255) / 255.0F; + blendFunc(770, 1); + color(var4, green, blue, 0.4F); + this.hornglow[0].render(this.scale); + color(var4, green, blue, 0.2F); + this.hornglow[1].render(this.scale); + popAttrib(); + } + } + + } + + protected void renderNeck() { + for (PlaneRenderer element : this.BodypieceNeck) { + element.render(this.scale); + } + + } + + protected void renderBody() { + this.bipedBody.render(this.scale); + if (this.textureHeight == 64) { + this.bipedBodyWear.render(this.scale); + } + int k1; + for (k1 = 0; k1 < this.Bodypiece.length; ++k1) { + this.Bodypiece[k1].render(this.scale); + } + + if (this.isVillager) { + if (this.villagerProfession < 2) { + for (k1 = 0; k1 < this.VillagerBagPiece.length; ++k1) { + this.VillagerBagPiece[k1].render(this.scale); + } + } else if (this.villagerProfession == 2) { + this.VillagerTrinket.render(this.scale); + } else if (this.villagerProfession > 2) { + this.VillagerApron.render(this.scale); + } + } + + if (this.isPegasus) { + if (!this.isFlying && !this.issneak) { + this.setExtendingWings(true); + + for (k1 = 0; k1 < this.LeftWing.length; ++k1) { + this.LeftWing[k1].render(this.scale); + } + + for (k1 = 0; k1 < this.RightWing.length; ++k1) { + this.RightWing[k1].render(this.scale); + } + } else { + this.setExtendingWings(false); + + for (k1 = 0; k1 < this.LeftWingExt.length; ++k1) { + this.LeftWingExt[k1].render(this.scale); + } + + for (k1 = 0; k1 < this.RightWingExt.length; ++k1) { + this.RightWingExt[k1].render(this.scale); + } + } + } + + } + + protected void renderTail() { + int var3 = this.Tail.length - this.wantTail * 5; + if (var3 <= 1) { + var3 = 0; + } + + for (int k = 0; k < var3; ++k) { + this.Tail[k].render(this.scale); + } + + } + + protected void renderLegs() { + this.bipedLeftArm.render(this.scale); + this.bipedRightArm.render(this.scale); + this.bipedLeftLeg.render(this.scale); + this.bipedRightLeg.render(this.scale); + if (this.textureHeight == 64) { + this.bipedLeftArmwear.render(this.scale); + this.bipedRightArmwear.render(this.scale); + this.bipedLeftLegwear.render(this.scale); + this.bipedRightLegwear.render(this.scale); + } + } + + @Override + public void renderRightArm() { + copyModelAngles(PMAPI.human.model.bipedRightArm, SteveArm); + this.SteveArm.render(this.scale); + copyModelAngles(PMAPI.human.model.bipedRightArm, unicornarm); + this.unicornarm.showModel = this.bipedRightArmwear.showModel; + this.unicornarm.render(this.scale); + + } + + protected void initTextures() { + this.Tail = new PlaneRenderer[21]; + this.headpiece = new ModelRenderer[3]; + this.hornglow = new HornGlowRenderer[2]; + this.MuzzleFemale = new PlaneRenderer[10]; + this.MuzzleMale = new PlaneRenderer[5]; + this.Bodypiece = new PlaneRenderer[14]; + this.VillagerBagPiece = new PlaneRenderer[14]; + this.BodypieceNeck = new PlaneRenderer[4]; + this.LeftWing = new ModelRenderer[3]; + this.RightWing = new ModelRenderer[3]; + this.LeftWingExt = new ModelRenderer[6]; + this.RightWingExt = new ModelRenderer[6]; + this.initHeadTextures(); + this.initMuzzleTextures(); + this.initBodyTextures(); + this.initLegTextures(); + this.initTailTextures(); + this.initWingTextures(); + } + + protected void initHeadTextures() { + this.bipedCape = new ModelRenderer(this, 0, 0); + this.bipedHead = new ModelRenderer(this, 0, 0); + this.headpiece[0] = new ModelRenderer(this, 12, 16); + this.headpiece[1] = new ModelRenderer(this, 12, 16); + this.headpiece[1].mirror = true; + this.headpiece[2] = new ModelRenderer(this, 0, 3); + this.hornglow[0] = new HornGlowRenderer(this, 0, 3); + this.hornglow[1] = new HornGlowRenderer(this, 0, 3); + this.bipedHeadwear = new ModelRenderer(this, 32, 0); + this.boxList.remove(this.headpiece[2]); + } + + protected void initMuzzleTextures() { + this.MuzzleFemale[0] = new PlaneRenderer(this, 10, 14); + this.MuzzleFemale[1] = new PlaneRenderer(this, 11, 13); + this.MuzzleFemale[2] = new PlaneRenderer(this, 9, 14); + this.MuzzleFemale[3] = new PlaneRenderer(this, 14, 14); + this.MuzzleFemale[4] = new PlaneRenderer(this, 11, 12); + this.MuzzleFemale[5] = new PlaneRenderer(this, 18, 7); + this.MuzzleFemale[6] = new PlaneRenderer(this, 9, 14); + this.MuzzleFemale[7] = new PlaneRenderer(this, 14, 14); + this.MuzzleFemale[8] = new PlaneRenderer(this, 11, 12); + this.MuzzleFemale[9] = new PlaneRenderer(this, 12, 12); + this.MuzzleMale[0] = new PlaneRenderer(this, 10, 13); + this.MuzzleMale[1] = new PlaneRenderer(this, 10, 13); + this.MuzzleMale[2] = new PlaneRenderer(this, 18, 7); + this.MuzzleMale[3] = new PlaneRenderer(this, 10, 13); + this.MuzzleMale[4] = new PlaneRenderer(this, 13, 13); + } + + protected void initBodyTextures() { + this.bipedBody = new ModelRenderer(this, 16, 16); + if (this.textureHeight == 64) { + this.bipedBodyWear = new ModelRenderer(this, 16, 32); + } + + this.Bodypiece[0] = new PlaneRenderer(this, 24, 0); + this.Bodypiece[1] = new PlaneRenderer(this, 24, 0); + + this.Bodypiece[0] = new PlaneRenderer(this, 24, 0); + this.Bodypiece[1] = new PlaneRenderer(this, 24, 0); + this.Bodypiece[2] = new PlaneRenderer(this, 32, 20); + this.Bodypiece[2].mirrorxy = true; + this.Bodypiece[3] = new PlaneRenderer(this, 56, 0); + this.Bodypiece[4] = new PlaneRenderer(this, 4, 0); + this.Bodypiece[5] = new PlaneRenderer(this, 4, 0); + this.Bodypiece[6] = new PlaneRenderer(this, 36, 16); + this.Bodypiece[7] = new PlaneRenderer(this, 36, 16); + this.Bodypiece[8] = new PlaneRenderer(this, 36, 16); + this.Bodypiece[9] = new PlaneRenderer(this, 32, 0); + this.Bodypiece[10] = new PlaneRenderer(this, 32, 0); + this.Bodypiece[11] = new PlaneRenderer(this, 32, 0); + this.Bodypiece[11].mirror = true; + this.Bodypiece[12] = new PlaneRenderer(this, 32, 0); + this.Bodypiece[13] = new PlaneRenderer(this, 32, 0); + // neck + this.BodypieceNeck[0] = new PlaneRenderer(this, 0, 8); + this.BodypieceNeck[1] = new PlaneRenderer(this, 0, 8); + this.BodypieceNeck[2] = new PlaneRenderer(this, 0, 8); + this.BodypieceNeck[3] = new PlaneRenderer(this, 0, 8); + + this.VillagerBagPiece[0] = new PlaneRenderer(this, 56, 19); + this.VillagerBagPiece[1] = new PlaneRenderer(this, 56, 19); + this.VillagerBagPiece[2] = new PlaneRenderer(this, 56, 19); + this.VillagerBagPiece[3] = new PlaneRenderer(this, 56, 19); + this.VillagerBagPiece[4] = new PlaneRenderer(this, 56, 16); + this.VillagerBagPiece[5] = new PlaneRenderer(this, 56, 16); + this.VillagerBagPiece[6] = new PlaneRenderer(this, 56, 22); + this.VillagerBagPiece[7] = new PlaneRenderer(this, 56, 22); + this.VillagerBagPiece[8] = new PlaneRenderer(this, 56, 25); + this.VillagerBagPiece[9] = new PlaneRenderer(this, 56, 25); + this.VillagerBagPiece[10] = new PlaneRenderer(this, 59, 25); + this.VillagerBagPiece[11] = new PlaneRenderer(this, 59, 25); + this.VillagerBagPiece[12] = new PlaneRenderer(this, 56, 31); + this.VillagerBagPiece[13] = new PlaneRenderer(this, 56, 31); + this.VillagerApron = new PlaneRenderer(this, 56, 16); + this.VillagerTrinket = new PlaneRenderer(this, 0, 3); + } + + protected void initLegTextures() { + this.bipedRightArm = new ModelRenderer(this, 40, 16); + this.bipedRightLeg = new ModelRenderer(this, 0, 16); + + if (this.textureHeight == 64) { + this.bipedLeftArm = new ModelRenderer(this, 32, 48); + this.bipedLeftLeg = new ModelRenderer(this, 32, 48); + + this.bipedRightArmwear = new ModelRenderer(this, 40, 32); + this.bipedLeftArmwear = new ModelRenderer(this, 48, 48); + this.bipedRightLegwear = new ModelRenderer(this, 0, 32); + this.bipedLeftLegwear = new ModelRenderer(this, 0, 48); + } else { + this.bipedLeftArm = new ModelRenderer(this, 40, 16); + this.bipedLeftArm.mirror = true; + this.bipedLeftLeg = new ModelRenderer(this, 0, 16); + this.bipedLeftLeg.mirror = true; + } + this.SteveArm = new ModelRenderer(this, 40, 16); + this.unicornarm = new ModelRenderer(this, 40, 32); + this.boxList.remove(this.SteveArm); + this.boxList.remove(this.unicornarm); + } + + protected void initTailTextures() { + // upper + this.Tail[0] = new PlaneRenderer(this, 32, 0); + this.Tail[1] = new PlaneRenderer(this, 36, 0); + this.Tail[2] = new PlaneRenderer(this, 32, 0); + this.Tail[3] = new PlaneRenderer(this, 36, 0); + this.Tail[4] = new PlaneRenderer(this, 32, 0); + this.Tail[5] = new PlaneRenderer(this, 32, 0); + this.Tail[6] = new PlaneRenderer(this, 36, 4); + this.Tail[7] = new PlaneRenderer(this, 32, 4); + this.Tail[8] = new PlaneRenderer(this, 36, 4); + this.Tail[9] = new PlaneRenderer(this, 32, 4); + this.Tail[10] = new PlaneRenderer(this, 32, 0); + this.Tail[11] = new PlaneRenderer(this, 36, 0); + this.Tail[12] = new PlaneRenderer(this, 32, 0); + this.Tail[13] = new PlaneRenderer(this, 36, 0); + this.Tail[14] = new PlaneRenderer(this, 32, 0); + this.Tail[15] = new PlaneRenderer(this, 32, 0); + this.Tail[16] = new PlaneRenderer(this, 36, 4); + this.Tail[17] = new PlaneRenderer(this, 32, 4); + this.Tail[18] = new PlaneRenderer(this, 36, 4); + this.Tail[19] = new PlaneRenderer(this, 32, 4); + this.Tail[20] = new PlaneRenderer(this, 32, 0); + } + + protected void initWingTextures() { + this.LeftWing[0] = new ModelRenderer(this, 56, 16); + this.LeftWing[0].mirror = true; + this.LeftWing[1] = new ModelRenderer(this, 56, 16); + this.LeftWing[1].mirror = true; + this.LeftWing[2] = new ModelRenderer(this, 56, 16); + this.LeftWing[2].mirror = true; + this.RightWing[0] = new ModelRenderer(this, 56, 16); + this.RightWing[1] = new ModelRenderer(this, 56, 16); + this.RightWing[2] = new ModelRenderer(this, 56, 16); + this.LeftWingExt[0] = new ModelRenderer(this, 56, 19); + this.LeftWingExt[0].mirror = true; + this.LeftWingExt[1] = new ModelRenderer(this, 56, 19); + this.LeftWingExt[1].mirror = true; + this.LeftWingExt[2] = new ModelRenderer(this, 56, 19); + this.LeftWingExt[2].mirror = true; + this.LeftWingExt[3] = new ModelRenderer(this, 56, 19); + this.LeftWingExt[3].mirror = true; + this.LeftWingExt[4] = new ModelRenderer(this, 56, 19); + this.LeftWingExt[4].mirror = true; + this.LeftWingExt[5] = new ModelRenderer(this, 56, 19); + this.LeftWingExt[5].mirror = true; + this.RightWingExt[0] = new ModelRenderer(this, 56, 19); + this.RightWingExt[1] = new ModelRenderer(this, 56, 19); + this.RightWingExt[2] = new ModelRenderer(this, 56, 19); + this.RightWingExt[3] = new ModelRenderer(this, 56, 19); + this.RightWingExt[4] = new ModelRenderer(this, 56, 19); + this.RightWingExt[5] = new ModelRenderer(this, 56, 19); + this.compressWings(); + } + + protected void initPositions(float yOffset, float stretch) { + this.initHeadPositions(yOffset, stretch); + this.initMuzzlePositions(yOffset, stretch); + this.initBodyPositions(yOffset, stretch); + this.initLegPositions(yOffset, stretch); + this.initTailPositions(yOffset, stretch); + this.initWingPositions(yOffset, stretch); + } + + protected void initHeadPositions(float yOffset, float stretch) { + this.bipedCape.addBox(-5.0F, 0.0F, -1.0F, 10, 16, 1, stretch); + this.bipedHead.addBox(-4.0F + HEAD_CENTRE_X, -4 + HEAD_CENTRE_Y, -4.0F + HEAD_CENTRE_Z, + 8, 8, 8, stretch); + this.bipedHead.setRotationPoint(HEAD_RP_X, HEAD_RP_Y + yOffset, HEAD_RP_Z); + this.headpiece[0].addBox(-4.0F + HEAD_CENTRE_X, -6.0F + HEAD_CENTRE_Y, 1.0F + HEAD_CENTRE_Z, 2, 2, 2, stretch); + this.headpiece[0].setRotationPoint(HEAD_RP_X, HEAD_RP_Y + yOffset, HEAD_RP_Z); + this.headpiece[1].addBox(2.0F + HEAD_CENTRE_X, -6.0F + HEAD_CENTRE_Y, 1.0F + HEAD_CENTRE_Z, 2, 2, 2, stretch); + this.headpiece[1].setRotationPoint(HEAD_RP_X, HEAD_RP_Y + yOffset, HEAD_RP_Z); + this.headpiece[2].addBox(-0.5F + HEAD_CENTRE_X, -10.0F + HEAD_CENTRE_Y, -1.5F + HEAD_CENTRE_Z, 1, 4, 1, + stretch); + this.headpiece[2].setRotationPoint(HEAD_RP_X, HEAD_RP_Y + yOffset, HEAD_RP_Z); + this.hornglow[0].addBox(-0.5F + HEAD_CENTRE_X, -10.0F + HEAD_CENTRE_Y, -1.5F + HEAD_CENTRE_Z, 1, 4, 1, + stretch + 0.5F); + this.hornglow[0].setRotationPoint(HEAD_RP_X, HEAD_RP_Y + yOffset, HEAD_RP_Z); + this.hornglow[1].addBox(-0.5F + HEAD_CENTRE_X, -10.0F + HEAD_CENTRE_Y, -1.5F + HEAD_CENTRE_Z, 1, 3, 1, + stretch + 0.8F); + this.hornglow[1].setRotationPoint(HEAD_RP_X, HEAD_RP_Y + yOffset, HEAD_RP_Z); + this.bipedHeadwear.addBox(-4.0F + HEAD_CENTRE_X, -4.0F + HEAD_CENTRE_Y, -4.0F + HEAD_CENTRE_Z, 8, 8, 8, + stretch + 0.5F); + this.bipedHeadwear.setRotationPoint(HEAD_RP_X, HEAD_RP_Y + yOffset, HEAD_RP_Z); + } + + protected void initMuzzlePositions(float yOffset, float stretch) { + this.MuzzleFemale[0].addBackPlane(-2.0F + HEAD_CENTRE_X, 2.0F + HEAD_CENTRE_Y, + -5.0F + HEAD_CENTRE_Z, 4, 2, 0, stretch); + this.MuzzleFemale[0].setRotationPoint(HEAD_RP_X, HEAD_RP_Y + yOffset, HEAD_RP_Z); + this.MuzzleFemale[1].addBackPlane(-1.0F + HEAD_CENTRE_X, 1.0F + HEAD_CENTRE_Y, + -5.0F + HEAD_CENTRE_Z, 2, 1, 0, stretch); + this.MuzzleFemale[1].setRotationPoint(HEAD_RP_X, HEAD_RP_Y + yOffset, HEAD_RP_Z); + this.MuzzleFemale[2].addTopPlane(-2.0F + HEAD_CENTRE_X, 2.0F + HEAD_CENTRE_Y, + -5.0F + HEAD_CENTRE_Z, 1, 0, 1, stretch); + this.MuzzleFemale[2].setRotationPoint(HEAD_RP_X, HEAD_RP_Y + yOffset, HEAD_RP_Z); + this.MuzzleFemale[3].addTopPlane(1.0F + HEAD_CENTRE_X, 2.0F + HEAD_CENTRE_Y, + -5.0F + HEAD_CENTRE_Z, 1, 0, 1, stretch); + this.MuzzleFemale[3].setRotationPoint(HEAD_RP_X, HEAD_RP_Y + yOffset, HEAD_RP_Z); + this.MuzzleFemale[4].addTopPlane(-1.0F + HEAD_CENTRE_X, 1.0F + HEAD_CENTRE_Y, + -5.0F + HEAD_CENTRE_Z, 2, 0, 1, stretch); + this.MuzzleFemale[4].setRotationPoint(HEAD_RP_X, HEAD_RP_Y + yOffset, HEAD_RP_Z); + this.MuzzleFemale[5].addBottomPlane(-2.0F + HEAD_CENTRE_X, 4.0F + HEAD_CENTRE_Y, + -5.0F + HEAD_CENTRE_Z, 4, 0, 1, stretch); + this.MuzzleFemale[5].setRotationPoint(HEAD_RP_X, HEAD_RP_Y + yOffset, HEAD_RP_Z); + this.MuzzleFemale[6].addSidePlane(-2.0F + HEAD_CENTRE_X, 2.0F + HEAD_CENTRE_Y, + -5.0F + HEAD_CENTRE_Z, 0, 2, 1, stretch); + this.MuzzleFemale[6].setRotationPoint(HEAD_RP_X, HEAD_RP_Y + yOffset, HEAD_RP_Z); + this.MuzzleFemale[7].addSidePlane(2.0F + HEAD_CENTRE_X, 2.0F + HEAD_CENTRE_Y, + -5.0F + HEAD_CENTRE_Z, 0, 2, 1, stretch); + this.MuzzleFemale[7].setRotationPoint(HEAD_RP_X, HEAD_RP_Y + yOffset, HEAD_RP_Z); + this.MuzzleFemale[8].addSidePlane(-1.0F + HEAD_CENTRE_X, 1.0F + HEAD_CENTRE_Y, + -5.0F + HEAD_CENTRE_Z, 0, 1, 1, stretch); + this.MuzzleFemale[8].setRotationPoint(HEAD_RP_X, HEAD_RP_Y + yOffset, HEAD_RP_Z); + this.MuzzleFemale[9].addSidePlane(1.0F + HEAD_CENTRE_X, 1.0F + HEAD_CENTRE_Y, + -5.0F + HEAD_CENTRE_Z, 0, 1, 1, stretch); + this.MuzzleFemale[9].setRotationPoint(HEAD_RP_X, HEAD_RP_Y + yOffset, HEAD_RP_Z); + this.MuzzleMale[0].addBackPlane(-2.0F + HEAD_CENTRE_X, 1.0F + HEAD_CENTRE_Y, + -5.0F + HEAD_CENTRE_Z, 4, 3, 0, stretch); + this.MuzzleMale[0].setRotationPoint(HEAD_RP_X, HEAD_RP_Y + yOffset, HEAD_RP_Z); + this.MuzzleMale[1].addTopPlane(-2.0F + HEAD_CENTRE_X, 1.0F + HEAD_CENTRE_Y, + -5.0F + HEAD_CENTRE_Z, 4, 0, 1, stretch); + this.MuzzleMale[1].setRotationPoint(HEAD_RP_X, HEAD_RP_Y + yOffset, HEAD_RP_Z); + this.MuzzleMale[2].addBottomPlane(-2.0F + HEAD_CENTRE_X, 4.0F + HEAD_CENTRE_Y, + -5.0F + HEAD_CENTRE_Z, 4, 0, 1, stretch); + this.MuzzleMale[2].setRotationPoint(HEAD_RP_X, HEAD_RP_Y + yOffset, HEAD_RP_Z); + this.MuzzleMale[3].addSidePlane(-2.0F + HEAD_CENTRE_X, 1.0F + HEAD_CENTRE_Y, + -5.0F + HEAD_CENTRE_Z, 0, 3, 1, stretch); + this.MuzzleMale[3].setRotationPoint(HEAD_RP_X, HEAD_RP_Y + yOffset, HEAD_RP_Z); + this.MuzzleMale[4].addSidePlane(2.0F + HEAD_CENTRE_X, 1.0F + HEAD_CENTRE_Y, + -5.0F + HEAD_CENTRE_Z, 0, 3, 1, stretch); + this.MuzzleMale[4].setRotationPoint(HEAD_RP_X, HEAD_RP_Y + yOffset, HEAD_RP_Z); + } + + protected void initBodyPositions(float yOffset, float stretch) { + this.bipedBody.addBox(-4.0F, 4.0F, -2.0F, 8, 8, 4, stretch); + this.bipedBody.setRotationPoint(HEAD_RP_X, HEAD_RP_Y + yOffset, HEAD_RP_Z); + this.bipedBodyWear.addBox(-4.0F, 4.0F, -2.0F, 8, 8, 4, stretch + 0.25F); + this.bipedBodyWear.setRotationPoint(HEAD_RP_X, HEAD_RP_Y + yOffset, HEAD_RP_Z); + + this.Bodypiece[0].addSidePlane(-4.0F + BODY_CENTRE_X, -4.0F + BODY_CENTRE_Y, + -4.0F + BODY_CENTRE_Z, 0, 8, 8, stretch); + this.Bodypiece[0].setRotationPoint(HEAD_RP_X, HEAD_RP_Y + yOffset, HEAD_RP_Z); + this.Bodypiece[1].addSidePlane(4.0F + BODY_CENTRE_X, -4.0F + BODY_CENTRE_Y, + -4.0F + BODY_CENTRE_Z, 0, 8, 8, stretch); + this.Bodypiece[1].setRotationPoint(HEAD_RP_X, HEAD_RP_Y + yOffset, HEAD_RP_Z); + this.Bodypiece[2].addTopPlane(-4.0F + BODY_CENTRE_X, -4.0F + BODY_CENTRE_Y, + -4.0F + BODY_CENTRE_Z, 8, 0, 12, stretch); + this.Bodypiece[2].setRotationPoint(HEAD_RP_X, HEAD_RP_Y + yOffset, HEAD_RP_Z); + this.Bodypiece[3].addBottomPlane(-4.0F + BODY_CENTRE_X, 4.0F + BODY_CENTRE_Y, + -4.0F + BODY_CENTRE_Z, 8, 0, 8, stretch); + this.Bodypiece[3].setRotationPoint(HEAD_RP_X, HEAD_RP_Y + yOffset, HEAD_RP_Z); + this.Bodypiece[4].addSidePlane(-4.0F + BODY_CENTRE_X, -4.0F + BODY_CENTRE_Y, + 4.0F + BODY_CENTRE_Z, 0, 8, 4, stretch); + this.Bodypiece[4].setRotationPoint(HEAD_RP_X, HEAD_RP_Y + yOffset, HEAD_RP_Z); + this.Bodypiece[5].addSidePlane(4.0F + BODY_CENTRE_X, -4.0F + BODY_CENTRE_Y, 4.0F + BODY_CENTRE_Z, + 0, 8, 4, stretch); + this.Bodypiece[5].setRotationPoint(HEAD_RP_X, HEAD_RP_Y + yOffset, HEAD_RP_Z); + this.Bodypiece[6].addBackPlane(-4.0F + BODY_CENTRE_X, -4.0F + BODY_CENTRE_Y, + 8.0F + BODY_CENTRE_Z, 8, 4, 0, stretch); + this.Bodypiece[6].setRotationPoint(HEAD_RP_X, HEAD_RP_Y + yOffset, HEAD_RP_Z); + this.Bodypiece[7].addBackPlane(-4.0F + BODY_CENTRE_X, 0.0F + BODY_CENTRE_Y, 8.0F + BODY_CENTRE_Z, + 8, 4, 0, stretch); + this.Bodypiece[7].setRotationPoint(HEAD_RP_X, HEAD_RP_Y + yOffset, HEAD_RP_Z); + this.Bodypiece[8].addBottomPlane(-4.0F + BODY_CENTRE_X, 4.0F + BODY_CENTRE_Y, + 4.0F + BODY_CENTRE_Z, 8, 0, 4, stretch); + this.Bodypiece[8].setRotationPoint(HEAD_RP_X, HEAD_RP_Y + yOffset, HEAD_RP_Z); + this.Bodypiece[9].addTopPlane(-1.0F + BODY_CENTRE_X, 2.0F + BODY_CENTRE_Y, 2.0F + BODY_CENTRE_Z, + 2, 0, 6, stretch); + this.Bodypiece[9].setRotationPoint(HEAD_RP_X, HEAD_RP_Y + yOffset, HEAD_RP_Z); + this.Bodypiece[10].addBottomPlane(-1.0F + BODY_CENTRE_X, 4.0F + BODY_CENTRE_Y, + 2.0F + BODY_CENTRE_Z, 2, 0, 6, stretch); + this.Bodypiece[10].setRotationPoint(HEAD_RP_X, HEAD_RP_Y + yOffset, HEAD_RP_Z); + this.Bodypiece[11].addSidePlane(-1.0F + BODY_CENTRE_X, 2.0F + BODY_CENTRE_Y, + 2.0F + BODY_CENTRE_Z, 0, 2, 6, stretch); + this.Bodypiece[11].setRotationPoint(HEAD_RP_X, HEAD_RP_Y + yOffset, HEAD_RP_Z); + this.Bodypiece[12].addSidePlane(1.0F + BODY_CENTRE_X, 2.0F + BODY_CENTRE_Y, 2.0F + BODY_CENTRE_Z, + 0, 2, 6, stretch); + this.Bodypiece[12].setRotationPoint(HEAD_RP_X, HEAD_RP_Y + yOffset, HEAD_RP_Z); + this.Bodypiece[13].addBackPlane(-1.0F + BODY_CENTRE_X, 2.0F + BODY_CENTRE_Y, + 8.0F + BODY_CENTRE_Z, 2, 2, 0, stretch); + this.Bodypiece[13].setRotationPoint(HEAD_RP_X, HEAD_RP_Y + yOffset, HEAD_RP_Z); + this.VillagerBagPiece[0].addSidePlane(-7.0F + BODY_CENTRE_X, -5.0F + BODY_CENTRE_Y, + -4.0F + BODY_CENTRE_Z, 0, 6, 8, stretch); + this.VillagerBagPiece[0].setRotationPoint(HEAD_RP_X, HEAD_RP_Y + yOffset, HEAD_RP_Z); + this.VillagerBagPiece[1].addSidePlane(-4.0F + BODY_CENTRE_X, -5.0F + BODY_CENTRE_Y, + -4.0F + BODY_CENTRE_Z, 0, 6, 8, stretch); + this.VillagerBagPiece[1].setRotationPoint(HEAD_RP_X, HEAD_RP_Y + yOffset, HEAD_RP_Z); + this.VillagerBagPiece[2].addSidePlane(4.0F + BODY_CENTRE_X, -5.0F + BODY_CENTRE_Y, + -4.0F + BODY_CENTRE_Z, 0, 6, 8, stretch); + this.VillagerBagPiece[2].setRotationPoint(HEAD_RP_X, HEAD_RP_Y + yOffset, HEAD_RP_Z); + this.VillagerBagPiece[3].addSidePlane(7.0F + BODY_CENTRE_X, -5.0F + BODY_CENTRE_Y, + -4.0F + BODY_CENTRE_Z, 0, 6, 8, stretch); + this.VillagerBagPiece[3].setRotationPoint(HEAD_RP_X, HEAD_RP_Y + yOffset, HEAD_RP_Z); + this.VillagerBagPiece[4].addTopPlane(2.0F + BODY_CENTRE_X, -5.0F + BODY_CENTRE_Y, + -2.0F + BODY_CENTRE_Z, 8, 0, 3, stretch); + this.VillagerBagPiece[4].setRotationPoint(HEAD_RP_X, HEAD_RP_Y + yOffset, HEAD_RP_Z); + this.VillagerBagPiece[5].addTopPlane(2.0F + BODY_CENTRE_X, -5.0F + BODY_CENTRE_Y, + -13.0F + BODY_CENTRE_Z, 8, 0, 3, stretch); + this.VillagerBagPiece[5].setRotationPoint(HEAD_RP_X, HEAD_RP_Y + yOffset, HEAD_RP_Z); + this.VillagerBagPiece[6].addBottomPlane(2.0F + BODY_CENTRE_X, 1.0F + BODY_CENTRE_Y, + -2.0F + BODY_CENTRE_Z, 8, 0, 3, stretch); + this.VillagerBagPiece[6].setRotationPoint(HEAD_RP_X, HEAD_RP_Y + yOffset, HEAD_RP_Z); + this.VillagerBagPiece[7].addBottomPlane(2.0F + BODY_CENTRE_X, 1.0F + BODY_CENTRE_Y, + -13.0F + BODY_CENTRE_Z, 8, 0, 3, stretch); + this.VillagerBagPiece[7].setRotationPoint(HEAD_RP_X, HEAD_RP_Y + yOffset, HEAD_RP_Z); + this.VillagerBagPiece[8].addBackPlane(-7.0F + BODY_CENTRE_X, -5.0F + BODY_CENTRE_Y, + -4.0F + BODY_CENTRE_Z, 3, 6, 0, stretch); + this.VillagerBagPiece[8].setRotationPoint(HEAD_RP_X, HEAD_RP_Y + yOffset, HEAD_RP_Z); + this.VillagerBagPiece[9].addBackPlane(4.0F + BODY_CENTRE_X, -5.0F + BODY_CENTRE_Y, + -4.0F + BODY_CENTRE_Z, 3, 6, 0, stretch); + this.VillagerBagPiece[9].setRotationPoint(HEAD_RP_X, HEAD_RP_Y + yOffset, HEAD_RP_Z); + this.VillagerBagPiece[10].addBackPlane(-7.0F + BODY_CENTRE_X, -5.0F + BODY_CENTRE_Y, + 4.0F + BODY_CENTRE_Z, 3, 6, 0, stretch); + this.VillagerBagPiece[10].setRotationPoint(HEAD_RP_X, HEAD_RP_Y + yOffset, HEAD_RP_Z); + this.VillagerBagPiece[11].addBackPlane(4.0F + BODY_CENTRE_X, -5.0F + BODY_CENTRE_Y, + 4.0F + BODY_CENTRE_Z, 3, 6, 0, stretch); + this.VillagerBagPiece[11].setRotationPoint(HEAD_RP_X, HEAD_RP_Y + yOffset, HEAD_RP_Z); + this.VillagerBagPiece[12].addTopPlane(-4.0F + BODY_CENTRE_X, -4.5F + BODY_CENTRE_Y, + -1.0F + BODY_CENTRE_Z, 8, 0, 1, stretch); + this.VillagerBagPiece[13].setRotationPoint(HEAD_RP_X, HEAD_RP_Y + yOffset, HEAD_RP_Z); + this.VillagerBagPiece[13].addTopPlane(-4.0F + BODY_CENTRE_X, -4.5F + BODY_CENTRE_Y, + 0.0F + BODY_CENTRE_Z, 8, 0, 1, stretch); + this.VillagerBagPiece[13].setRotationPoint(HEAD_RP_X, HEAD_RP_Y + yOffset, HEAD_RP_Z); + this.VillagerApron.addBackPlane(-4.0F + BODY_CENTRE_X, -4.0F + BODY_CENTRE_Y, + -9.0F + BODY_CENTRE_Z, 8, 10, 0, stretch); + this.VillagerApron.setRotationPoint(HEAD_RP_X, HEAD_RP_Y + yOffset, HEAD_RP_Z); + this.VillagerTrinket.addBackPlane(-2.0F + BODY_CENTRE_X, -4.0F + BODY_CENTRE_Y, + -9.0F + BODY_CENTRE_Z, 4, 5, 0, stretch); + this.VillagerTrinket.setRotationPoint(HEAD_RP_X, HEAD_RP_Y + yOffset, HEAD_RP_Z); + this.BodypieceNeck[0].addBackPlane(-2.0F + BODY_CENTRE_X, -6.8F + BODY_CENTRE_Y, + -8.8F + BODY_CENTRE_Z, 4, 4, 0, stretch); + this.BodypieceNeck[0].setRotationPoint(HEAD_RP_X, HEAD_RP_Y + yOffset, HEAD_RP_Z); + this.BodypieceNeck[1].addBackPlane(-2.0F + BODY_CENTRE_X, -6.8F + BODY_CENTRE_Y, + -4.8F + BODY_CENTRE_Z, 4, 4, 0, stretch); + this.BodypieceNeck[1].setRotationPoint(HEAD_RP_X, HEAD_RP_Y + yOffset, HEAD_RP_Z); + this.BodypieceNeck[2].addSidePlane(-2.0F + BODY_CENTRE_X, -6.8F + BODY_CENTRE_Y, + -8.8F + BODY_CENTRE_Z, 0, 4, 4, stretch); + this.BodypieceNeck[2].setRotationPoint(HEAD_RP_X, HEAD_RP_Y + yOffset, HEAD_RP_Z); + this.BodypieceNeck[3].addSidePlane(2.0F + BODY_CENTRE_X, -6.8F + BODY_CENTRE_Y, + -8.8F + BODY_CENTRE_Z, 0, 4, 4, stretch); + this.BodypieceNeck[3].setRotationPoint(HEAD_RP_X, HEAD_RP_Y + yOffset, HEAD_RP_Z); + this.BodypieceNeck[0].rotateAngleX = this.NeckRotX; + this.BodypieceNeck[1].rotateAngleX = this.NeckRotX; + this.BodypieceNeck[2].rotateAngleX = this.NeckRotX; + this.BodypieceNeck[3].rotateAngleX = this.NeckRotX; + } + + protected void initLegPositions(float yOffset, float stretch) { + this.bipedRightArm.addBox(-2.0F + THIRDP_ARM_CENTRE_X, -6.0F + THIRDP_ARM_CENTRE_Y, -2.0F + THIRDP_ARM_CENTRE_Z, + 4, + 12, 4, stretch); + this.bipedRightArm.setRotationPoint(-3.0F, 8.0F + yOffset, 0.0F); + if (bipedRightArmwear != null) { + this.bipedRightArmwear.addBox(-2.0F + THIRDP_ARM_CENTRE_X, -6.0F + THIRDP_ARM_CENTRE_Y, + -2.0F + THIRDP_ARM_CENTRE_Z, 4, + 12, 4, stretch + 0.25f); + this.bipedRightArmwear.setRotationPoint(-3.0F, 8.0F + yOffset, 0.0F); + } + this.bipedLeftArm.addBox(-2.0F + THIRDP_ARM_CENTRE_X, -6.0F + THIRDP_ARM_CENTRE_Y, -2.0F + THIRDP_ARM_CENTRE_Z, + 4, + 12, 4, stretch); + this.bipedLeftArm.setRotationPoint(3.0F, 8.0F + yOffset, 0.0F); + if (this.bipedLeftArmwear != null) { + this.bipedLeftArmwear.addBox(-2.0F + THIRDP_ARM_CENTRE_X, -6.0F + THIRDP_ARM_CENTRE_Y, + -2.0F + THIRDP_ARM_CENTRE_Z, 4, + 12, 4, stretch + 0.25f); + this.bipedLeftArmwear.setRotationPoint(3.0F, 8.0F + yOffset, 0.0F); + } + this.bipedRightLeg.addBox(-2.0F + THIRDP_ARM_CENTRE_X, -6.0F + THIRDP_ARM_CENTRE_Y, -2.0F + THIRDP_ARM_CENTRE_Z, + 4, 12, 4, stretch); + this.bipedRightLeg.setRotationPoint(-3.0F, 0.0F + yOffset, 0.0F); + + if (bipedRightLegwear != null) { + this.bipedRightLegwear.addBox(-2.0F + THIRDP_ARM_CENTRE_X, -6.0F + THIRDP_ARM_CENTRE_Y, + -2.0F + THIRDP_ARM_CENTRE_Z, + 4, 12, 4, stretch + 0.25f); + this.bipedRightLegwear.setRotationPoint(-3.0F, 0.0F + yOffset, 0.0F); + + } + + this.bipedLeftLeg.addBox(-2.0F + THIRDP_ARM_CENTRE_X, -6.0F + THIRDP_ARM_CENTRE_Y, -2.0F + THIRDP_ARM_CENTRE_Z, + 4, 12, 4, stretch); + if (this.bipedLeftLegwear != null) { + this.bipedLeftLegwear.addBox(-2.0F + THIRDP_ARM_CENTRE_X, -6.0F + THIRDP_ARM_CENTRE_Y, + -2.0F + THIRDP_ARM_CENTRE_Z, + 4, 12, 4, stretch + 0.25f); + } + this.SteveArm.addBox(-3.0F, -2.0F, -2.0F, 4, 12, 4, stretch); + this.SteveArm.setRotationPoint(-5.0F, 2.0F + yOffset, 0.0F); + this.unicornarm.addBox(-2.0F + FIRSTP_ARM_CENTRE_X, -6.0F + FIRSTP_ARM_CENTRE_Y, -2.0F + FIRSTP_ARM_CENTRE_Z, 4, + 12, 4, stretch + .25f); + this.unicornarm.setRotationPoint(-5.0F, 2.0F + yOffset, 0.0F); + } + + protected void initTailPositions(float yOffset, float stretch) { + this.Tail[0].addTopPlane(-2.0F, 1.0F, 2.0F, 4, 0, 4, stretch); + this.Tail[0].setRotationPoint(TAIL_RP_X, TAIL_RP_Y + yOffset, TAIL_RP_Z); + this.Tail[1].addSidePlane(-2.0F, 1.0F, 2.0F, 0, 4, 4, stretch); + this.Tail[1].setRotationPoint(TAIL_RP_X, TAIL_RP_Y + yOffset, TAIL_RP_Z); + this.Tail[2].addBackPlane(-2.0F, 1.0F, 2.0F, 4, 4, 0, stretch); + this.Tail[2].setRotationPoint(TAIL_RP_X, TAIL_RP_Y + yOffset, TAIL_RP_Z); + this.Tail[3].addSidePlane(2.0F, 1.0F, 2.0F, 0, 4, 4, stretch); + this.Tail[3].setRotationPoint(TAIL_RP_X, TAIL_RP_Y + yOffset, TAIL_RP_Z); + this.Tail[4].addBackPlane(-2.0F, 1.0F, 6.0F, 4, 4, 0, stretch); + this.Tail[4].setRotationPoint(TAIL_RP_X, TAIL_RP_Y + yOffset, TAIL_RP_Z); + this.Tail[5].addTopPlane(-2.0F, 5.0F, 2.0F, 4, 0, 4, stretch); + this.Tail[5].setRotationPoint(TAIL_RP_X, TAIL_RP_Y + yOffset, TAIL_RP_Z); + this.Tail[6].addSidePlane(-2.0F, 5.0F, 2.0F, 0, 4, 4, stretch); + this.Tail[6].setRotationPoint(TAIL_RP_X, TAIL_RP_Y + yOffset, TAIL_RP_Z); + this.Tail[7].addBackPlane(-2.0F, 5.0F, 2.0F, 4, 4, 0, stretch); + this.Tail[7].setRotationPoint(TAIL_RP_X, TAIL_RP_Y + yOffset, TAIL_RP_Z); + this.Tail[8].addSidePlane(2.0F, 5.0F, 2.0F, 0, 4, 4, stretch); + this.Tail[8].setRotationPoint(TAIL_RP_X, TAIL_RP_Y + yOffset, TAIL_RP_Z); + this.Tail[9].addBackPlane(-2.0F, 5.0F, 6.0F, 4, 4, 0, stretch); + this.Tail[9].setRotationPoint(TAIL_RP_X, TAIL_RP_Y + yOffset, TAIL_RP_Z); + this.Tail[10].addTopPlane(-2.0F, 9.0F, 2.0F, 4, 0, 4, stretch); + this.Tail[10].setRotationPoint(TAIL_RP_X, TAIL_RP_Y + yOffset, TAIL_RP_Z); + this.Tail[11].addSidePlane(-2.0F, 9.0F, 2.0F, 0, 4, 4, stretch); + this.Tail[11].setRotationPoint(TAIL_RP_X, TAIL_RP_Y + yOffset, TAIL_RP_Z); + this.Tail[12].addBackPlane(-2.0F, 9.0F, 2.0F, 4, 4, 0, stretch); + this.Tail[12].setRotationPoint(TAIL_RP_X, TAIL_RP_Y + yOffset, TAIL_RP_Z); + this.Tail[13].addSidePlane(2.0F, 9.0F, 2.0F, 0, 4, 4, stretch); + this.Tail[13].setRotationPoint(TAIL_RP_X, TAIL_RP_Y + yOffset, TAIL_RP_Z); + this.Tail[14].addBackPlane(-2.0F, 9.0F, 6.0F, 4, 4, 0, stretch); + this.Tail[14].setRotationPoint(TAIL_RP_X, TAIL_RP_Y + yOffset, TAIL_RP_Z); + this.Tail[15].addTopPlane(-2.0F, 13.0F, 2.0F, 4, 0, 4, stretch); + this.Tail[15].setRotationPoint(TAIL_RP_X, TAIL_RP_Y + yOffset, TAIL_RP_Z); + this.Tail[16].addSidePlane(-2.0F, 13.0F, 2.0F, 0, 4, 4, stretch); + this.Tail[16].setRotationPoint(TAIL_RP_X, TAIL_RP_Y + yOffset, TAIL_RP_Z); + this.Tail[17].addBackPlane(-2.0F, 13.0F, 2.0F, 4, 4, 0, stretch); + this.Tail[17].setRotationPoint(TAIL_RP_X, TAIL_RP_Y + yOffset, TAIL_RP_Z); + this.Tail[18].addSidePlane(2.0F, 13.0F, 2.0F, 0, 4, 4, stretch); + this.Tail[18].setRotationPoint(TAIL_RP_X, TAIL_RP_Y + yOffset, TAIL_RP_Z); + this.Tail[19].addBackPlane(-2.0F, 13.0F, 6.0F, 4, 4, 0, stretch); + this.Tail[19].setRotationPoint(TAIL_RP_X, TAIL_RP_Y + yOffset, TAIL_RP_Z); + this.Tail[20].addTopPlane(-2.0F, 17.0F, 2.0F, 4, 0, 4, stretch); + this.Tail[20].setRotationPoint(TAIL_RP_X, TAIL_RP_Y + yOffset, TAIL_RP_Z); + } + + protected void initWingPositions(float yOffset, float stretch) { + this.LeftWing[0].addBox(4.0F, 5.0F, 2.0F, 2, 6, 2, stretch); + this.LeftWing[0].setRotationPoint(HEAD_RP_X, WING_FOLDED_RP_Y + yOffset, WING_FOLDED_RP_Z); + this.LeftWing[0].rotateAngleX = ROTATE_90; + this.LeftWing[1].addBox(4.0F, 5.0F, 4.0F, 2, 8, 2, stretch); + this.LeftWing[1].setRotationPoint(HEAD_RP_X, WING_FOLDED_RP_Y + yOffset, WING_FOLDED_RP_Z); + this.LeftWing[1].rotateAngleX = ROTATE_90; + this.LeftWing[2].addBox(4.0F, 5.0F, 6.0F, 2, 6, 2, stretch); + this.LeftWing[2].setRotationPoint(HEAD_RP_X, WING_FOLDED_RP_Y + yOffset, WING_FOLDED_RP_Z); + this.LeftWing[2].rotateAngleX = ROTATE_90; + this.RightWing[0].addBox(-6.0F, 5.0F, 2.0F, 2, 6, 2, stretch); + this.RightWing[0].setRotationPoint(HEAD_RP_X, WING_FOLDED_RP_Y + yOffset, WING_FOLDED_RP_Z); + this.RightWing[0].rotateAngleX = ROTATE_90; + this.RightWing[1].addBox(-6.0F, 5.0F, 4.0F, 2, 8, 2, stretch); + this.RightWing[1].setRotationPoint(HEAD_RP_X, WING_FOLDED_RP_Y + yOffset, WING_FOLDED_RP_Z); + this.RightWing[1].rotateAngleX = ROTATE_90; + this.RightWing[2].addBox(-6.0F, 5.0F, 6.0F, 2, 6, 2, stretch); + this.RightWing[2].setRotationPoint(HEAD_RP_X, WING_FOLDED_RP_Y + yOffset, WING_FOLDED_RP_Z); + this.RightWing[2].rotateAngleX = ROTATE_90; + this.LeftWingExt[0].addBox(0.0F, 6.0F, 0.0F, 1, 8, 2, stretch + 0.1F); + this.LeftWingExt[0].setRotationPoint(LEFT_WING_EXT_RP_X, LEFT_WING_EXT_RP_Y + yOffset, + LEFT_WING_EXT_RP_Z); + this.LeftWingExt[1].addBox(0.0F, -1.2F, -0.2F, 1, 8, 2, stretch - 0.2F); + this.LeftWingExt[1].setRotationPoint(LEFT_WING_EXT_RP_X, LEFT_WING_EXT_RP_Y + yOffset, + LEFT_WING_EXT_RP_Z); + this.LeftWingExt[2].addBox(0.0F, 1.8F, 1.3F, 1, 8, 2, stretch - 0.1F); + this.LeftWingExt[2].setRotationPoint(LEFT_WING_EXT_RP_X, LEFT_WING_EXT_RP_Y + yOffset, + LEFT_WING_EXT_RP_Z); + this.LeftWingExt[3].addBox(0.0F, 5.0F, 2.0F, 1, 8, 2, stretch); + this.LeftWingExt[3].setRotationPoint(LEFT_WING_EXT_RP_X, LEFT_WING_EXT_RP_Y + yOffset, + LEFT_WING_EXT_RP_Z); + this.LeftWingExt[4].addBox(0.0F, 0.0F, -0.2F, 1, 6, 2, stretch + 0.3F); + this.LeftWingExt[4].setRotationPoint(LEFT_WING_EXT_RP_X, LEFT_WING_EXT_RP_Y + yOffset, + LEFT_WING_EXT_RP_Z); + this.LeftWingExt[5].addBox(0.0F, 0.0F, 0.2F, 1, 3, 2, stretch + 0.2F); + this.LeftWingExt[5].setRotationPoint(LEFT_WING_EXT_RP_X, LEFT_WING_EXT_RP_Y + yOffset, + LEFT_WING_EXT_RP_Z); + this.RightWingExt[0].addBox(0.0F, 6.0F, 0.0F, 1, 8, 2, stretch + 0.1F); + this.RightWingExt[0].setRotationPoint(RIGHT_WING_EXT_RP_X, RIGHT_WING_EXT_RP_Y + yOffset, + RIGHT_WING_EXT_RP_Z); + this.RightWingExt[1].addBox(0.0F, -1.2F, -0.2F, 1, 8, 2, stretch - 0.2F); + this.RightWingExt[1].setRotationPoint(RIGHT_WING_EXT_RP_X, RIGHT_WING_EXT_RP_Y + yOffset, + RIGHT_WING_EXT_RP_Z); + this.RightWingExt[2].addBox(0.0F, 1.8F, 1.3F, 1, 8, 2, stretch - 0.1F); + this.RightWingExt[2].setRotationPoint(RIGHT_WING_EXT_RP_X, RIGHT_WING_EXT_RP_Y + yOffset, + RIGHT_WING_EXT_RP_Z); + this.RightWingExt[3].addBox(0.0F, 5.0F, 2.0F, 1, 8, 2, stretch); + this.RightWingExt[3].setRotationPoint(RIGHT_WING_EXT_RP_X, RIGHT_WING_EXT_RP_Y + yOffset, + RIGHT_WING_EXT_RP_Z); + this.RightWingExt[4].addBox(0.0F, 0.0F, -0.2F, 1, 6, 2, stretch + 0.3F); + this.RightWingExt[4].setRotationPoint(RIGHT_WING_EXT_RP_X, RIGHT_WING_EXT_RP_Y + yOffset, + RIGHT_WING_EXT_RP_Z); + this.RightWingExt[5].addBox(0.0F, 0.0F, 0.2F, 1, 3, 2, stretch + 0.2F); + this.RightWingExt[5].setRotationPoint(RIGHT_WING_EXT_RP_X, RIGHT_WING_EXT_RP_Y + yOffset, + RIGHT_WING_EXT_RP_Z); + } + + @Override + public void renderDrop(RenderManager rendermanager, ItemRenderer itemrenderer, EntityLivingBase entity) { + + if (!this.isSleeping) { + if (this.isUnicorn && this.glowColor != 0) { + if (this.aimedBow) { + this.renderDrop(itemrenderer, entity, this.unicornarm, 1.0F, 0.15F, 0.9375F, 0.0625F); + } else if (this.size == 0) { + this.renderDrop(itemrenderer, entity, this.unicornarm, 1.0F, 0.35F, 0.5375F, -0.8F); + } else { + this.renderDrop(itemrenderer, entity, this.unicornarm, 1.0F, 0.35F, 0.5375F, -0.45F); + } + } else if (this.size == 0) { + this.renderDrop(itemrenderer, entity, this.bipedRightArm, 1.0F, 0.08F, 0.8375F, 0.0625F); + } else { + this.renderDrop(itemrenderer, entity, this.bipedRightArm, 1.0F, -0.0625F, 0.8375F, 0.0625F); + } + } + } + + @Override + public void renderCloak(EntityPlayer player, float par2) { + pushMatrix(); + translate(0.0F, 0.24F, 0.0F); + if (this.size == 0) { + translate(0.0F, 0.67F, -0.04F); + scale(0.6F, 0.6F, 0.6F); + } else if (this.size == 2) { + translate(0.0F, -0.14F, -0.1F); + scale(1.15F, 1.2F, 1.2F); + if (this.issneak && !this.isFlying) { + translate(0.0F, 0.03F, 0.0F); + } + } else if (this.size == 3) { + translate(0.0F, -0.09F, 0.0F); + scale(1.0F, 1.0F, 1.0F); + if (this.issneak && !this.isFlying) { + translate(0.0F, 0.03F, 0.0F); + } + } + + if (this.issneak && !this.isFlying) { + translate(0.0F, 0.4F, -0.12F); + } + double d = player.prevChasingPosX + (player.chasingPosX - player.prevChasingPosX) * par2 + - (player.prevPosX + (player.posX - player.prevPosX) * par2); + double d1 = player.prevChasingPosY + (player.chasingPosY - player.prevChasingPosY) * par2 + - (player.prevPosY + (player.posY - player.prevPosY) * par2); + double d2 = player.prevChasingPosZ + (player.chasingPosZ - player.prevChasingPosZ) * par2 + - (player.prevPosZ + (player.posZ - player.prevPosZ) * par2); + float f10 = player.prevRenderYawOffset + (player.renderYawOffset - player.prevRenderYawOffset) * par2; + double d3 = MathHelper.sin(f10 * 3.1415927F / 180.0F); + double d4 = (-MathHelper.cos(f10 * 3.1415927F / 180.0F)); + float f12 = (float) d1 * 10.0F; + if (f12 < -6.0F) { + f12 = -6.0F; + } + + if (f12 > 32.0F) { + f12 = 32.0F; + } + + float f13 = (float) (d * d3 + d2 * d4) * 100.0F; + float f14 = (float) (d * d4 - d2 * d3) * 100.0F; + if (f13 < 0.0F) { + f13 = 0.0F; + } + + float f15 = player.prevCameraYaw + (player.cameraYaw - player.prevCameraYaw) * par2; + f12 += MathHelper.sin((player.prevDistanceWalkedModified + + (player.distanceWalkedModified - player.prevDistanceWalkedModified) * par2) * 6.0F) * 32.0F * f15; + if (player.isSneaking()) { + f12 += 25.0F; + } + + rotate(2.0F + f13 / 12.0F + f12, 1.0F, 0.0F, 0.0F); + rotate(f14 / 2.0F, 0.0F, 0.0F, 1.0F); + rotate(-f14 / 2.0F, 0.0F, 1.0F, 0.0F); + rotate(180.0F, 0.0F, 0.0F, 1.0F); + rotate(90.0F, 1.0F, 0.0F, 0.0F); + this.bipedCape.render(0.0625F); + popMatrix(); + } + + @Override + public void renderStaticCloak(EntityLiving player, float par2) { + pushMatrix(); + translate(0.0F, 0.24F, 0.0F); + if (this.size == 0) { + translate(0.0F, 0.67F, -0.04F); + scale(0.6F, 0.6F, 0.6F); + } else if (this.size == 2) { + translate(0.0F, -0.14F, -0.1F); + scale(1.15F, 1.2F, 1.2F); + if (this.issneak && !this.isFlying) { + translate(0.0F, 0.03F, 0.0F); + } + } else if (this.size == 3) { + translate(0.0F, -0.09F, 0.0F); + scale(1.0F, 1.0F, 1.0F); + if (this.issneak && !this.isFlying) { + translate(0.0F, 0.03F, 0.0F); + } + } + + if (this.issneak && !this.isFlying) { + translate(0.0F, 0.4F, -0.12F); + } + + rotate(3.0F, 1.0F, 0.0F, 0.0F); + rotate(2.0F, 0.0F, 1.0F, 0.0F); + rotate(180.0F, 0.0F, 0.0F, 1.0F); + rotate(90.0F, 1.0F, 0.0F, 0.0F); + this.bipedCape.render(0.0625F); + popMatrix(); + } + + protected void compressWings() { + this.CompressiveLeftWing = new CompressiveRendering(this); + this.CompressiveRightWing = new CompressiveRendering(this); + this.CompressiveLeftWing.addCompressed(this.LeftWing[0]); + this.CompressiveLeftWing.addCompressed(this.LeftWing[1]); + this.CompressiveLeftWing.addCompressed(this.LeftWing[2]); + this.CompressiveRightWing.addCompressed(this.RightWing[0]); + this.CompressiveRightWing.addCompressed(this.RightWing[1]); + this.CompressiveRightWing.addCompressed(this.RightWing[2]); + this.CompressiveLeftWing.addExpanded(this.LeftWingExt[0]); + this.CompressiveLeftWing.addExpanded(this.LeftWingExt[1]); + this.CompressiveLeftWing.addExpanded(this.LeftWingExt[2]); + this.CompressiveLeftWing.addExpanded(this.LeftWingExt[3]); + this.CompressiveLeftWing.addExpanded(this.LeftWingExt[4]); + this.CompressiveLeftWing.addExpanded(this.LeftWingExt[5]); + this.CompressiveRightWing.addExpanded(this.RightWingExt[0]); + this.CompressiveRightWing.addExpanded(this.RightWingExt[1]); + this.CompressiveRightWing.addExpanded(this.RightWingExt[2]); + this.CompressiveRightWing.addExpanded(this.RightWingExt[3]); + this.CompressiveRightWing.addExpanded(this.RightWingExt[4]); + this.CompressiveRightWing.addExpanded(this.RightWingExt[5]); + this.CompressiveLeftWing.setChance(2); + this.CompressiveRightWing.setChance(2); + } + + @Override + public ModelRenderer getRandomModelBox(Random par1Random) { + Object part = this.boxList.get(par1Random.nextInt(this.boxList.size())); + return part instanceof ModelRenderer ? (ModelRenderer) part + : ((CompressiveRendering) part).getARenderer(par1Random); + } + + public void setExtendingWings(boolean isCompressed) { + this.CompressiveLeftWing.setIsCompressed(isCompressed); + this.CompressiveRightWing.setIsCompressed(isCompressed); + } + + public void setHasWings_Compression(boolean pegasus) { + if (pegasus) { + this.CompressiveLeftWing.init_Safe(); + this.CompressiveRightWing.init_Safe(); + } else { + this.CompressiveLeftWing.deInit_Safe(); + this.CompressiveRightWing.deInit_Safe(); + } + } + +} diff --git a/src/main/java/com/minelittlepony/minelp/model/pony/pm_skeletonPony.java b/src/main/java/com/minelittlepony/minelp/model/pony/pm_skeletonPony.java new file mode 100644 index 00000000..922fd608 --- /dev/null +++ b/src/main/java/com/minelittlepony/minelp/model/pony/pm_skeletonPony.java @@ -0,0 +1,136 @@ +package com.minelittlepony.minelp.model.pony; + +import static net.minecraft.client.renderer.GlStateManager.*; + +import net.minecraft.util.MathHelper; + +public class pm_skeletonPony extends pm_newPonyAdv { + + public pm_skeletonPony(String texture) { + super(texture); + } + + @Override + protected void rotateLegs(float move, float swing, float tick) { + float rightArmRotateAngleX; + float leftArmRotateAngleX; + float rightLegRotateAngleX; + float leftLegRotateAngleX; + float var8; + float var9; + if (this.isFlying && this.isPegasus) { + if (this.rainboom) { + rightArmRotateAngleX = ROTATE_270; + leftArmRotateAngleX = ROTATE_270; + rightLegRotateAngleX = ROTATE_90; + leftLegRotateAngleX = ROTATE_90; + } else { + rightArmRotateAngleX = MathHelper.sin(0.0F - swing * 0.5F); + leftArmRotateAngleX = MathHelper.sin(0.0F - swing * 0.5F); + rightLegRotateAngleX = MathHelper.sin(swing * 0.5F); + leftLegRotateAngleX = MathHelper.sin(swing * 0.5F); + } + + this.bipedRightArm.rotateAngleY = 0.2F; + this.SteveArm.rotateAngleY = 0.2F; + this.bipedLeftArm.rotateAngleY = -0.2F; + this.bipedRightLeg.rotateAngleY = -0.2F; + this.bipedLeftLeg.rotateAngleY = 0.2F; + } else { + var8 = (float) Math.pow(swing, 16.0D); + this.getClass(); + var9 = 3.1415927F * var8 * 0.5F; + this.getClass(); + float laQuad = 3.1415927F * var8; + this.getClass(); + float rlQuad = 3.1415927F * var8 * 0.2F; + this.getClass(); + float llQuad = 3.1415927F * var8 * -0.4F; + rightArmRotateAngleX = MathHelper.cos(move * 0.6662F + 3.1415927F + var9) * 0.6F * swing; + leftArmRotateAngleX = MathHelper.cos(move * 0.6662F + laQuad) * 0.6F * swing; + rightLegRotateAngleX = MathHelper.cos(move * 0.6662F + rlQuad) * 0.6F * swing; + leftLegRotateAngleX = MathHelper.cos(move * 0.6662F + 3.1415927F + llQuad) * 0.6F * swing; + this.bipedRightArm.rotateAngleY = 0.0F; + this.SteveArm.rotateAngleY = 0.0F; + this.unicornarm.rotateAngleY = 0.0F; + this.bipedLeftArm.rotateAngleY = 0.0F; + this.bipedRightLeg.rotateAngleY = 0.0F; + this.bipedLeftLeg.rotateAngleY = 0.0F; + } + + this.bipedRightArm.rotateAngleX = rightArmRotateAngleX; + this.SteveArm.rotateAngleX = rightArmRotateAngleX; + this.unicornarm.rotateAngleX = rightArmRotateAngleX; + this.bipedLeftArm.rotateAngleX = leftArmRotateAngleX; + this.bipedRightLeg.rotateAngleX = rightLegRotateAngleX; + this.bipedLeftLeg.rotateAngleX = leftLegRotateAngleX; + this.bipedRightArm.rotateAngleZ = 0.0F; + this.SteveArm.rotateAngleZ = 0.0F; + this.unicornarm.rotateAngleZ = 0.0F; + this.bipedLeftArm.rotateAngleZ = 0.0F; + if (this.heldItemRight != 0) { + var8 = MathHelper.sin(this.swingProgress * 3.1415927F); + var9 = MathHelper.sin((1.0F - (1.0F - this.swingProgress) * (1.0F - this.swingProgress)) * 3.1415927F); + if (this.glowColor == 0) { + this.bipedRightArm.rotateAngleZ = 0.0F; + this.bipedRightArm.rotateAngleY = 0.1F - var8 * 0.6F; + this.bipedRightArm.rotateAngleX = -1.5707964F; + this.bipedRightArm.rotateAngleX -= var8 * 1.2F - var9 * 0.4F; + this.bipedRightArm.rotateAngleZ += MathHelper.cos(tick * 0.09F) * 0.05F + 0.05F; + this.bipedRightArm.rotateAngleX += MathHelper.sin(tick * 0.067F) * 0.1F; + } else { + this.unicornarm.rotationPointX = -7.0F; + this.unicornarm.rotationPointY = 12.0F; + this.unicornarm.rotationPointZ = -2.0F; + this.unicornarm.rotateAngleZ = 0.0F; + this.unicornarm.rotateAngleY = 0.1F - var8 * 0.6F; + this.unicornarm.rotateAngleX = -1.5707964F; + this.unicornarm.rotateAngleX -= var8 * 1.2F - var9 * 0.4F; + this.unicornarm.rotateAngleZ += MathHelper.cos(tick * 0.09F) * 0.05F + 0.05F; + this.unicornarm.rotateAngleX += MathHelper.sin(tick * 0.067F) * 0.1F; + } + } + + } + + @Override + protected void fixSpecialRotationPoints(float move) { + if (this.heldItemRight != 0 && this.glowColor == 0) { + this.setRotationPoint(this.bipedRightArm, -1.5F, 9.5F, 4.0F); + } + + } + + @Override + protected void renderLegs() { + pushMatrix(); + translate(0.05F, -0.21F, -0.0F); + scale(0.5F, 1.15F, 0.5F); + this.bipedLeftArm.render(this.scale); + popMatrix(); + + pushMatrix(); + if (this.heldItemRight != 0 && this.glowColor == 0) { + translate(-0.1F, 0.3F, 0.1F); + scale(0.5F, 0.5F, 1.2F); + } else { + translate(-0.05F, -0.21F, -0.0F); + scale(0.5F, 1.2F, 0.5F); + } + + this.bipedRightArm.render(this.scale); + popMatrix(); + + pushMatrix(); + translate(0.05F, -0.21F, 0.35F); + scale(0.5F, 1.2F, 0.5F); + this.bipedLeftLeg.render(this.scale); + popMatrix(); + + pushMatrix(); + translate(-0.05F, -0.21F, 0.35F); + scale(0.5F, 1.15F, 0.5F); + this.bipedRightLeg.render(this.scale); + popMatrix(); + } +} diff --git a/src/main/java/com/minelittlepony/minelp/model/pony/pm_zombiePony.java b/src/main/java/com/minelittlepony/minelp/model/pony/pm_zombiePony.java new file mode 100644 index 00000000..2928ebf2 --- /dev/null +++ b/src/main/java/com/minelittlepony/minelp/model/pony/pm_zombiePony.java @@ -0,0 +1,104 @@ +package com.minelittlepony.minelp.model.pony; + +import com.minelittlepony.minelp.model.pony.pm_newPonyAdv; + +import net.minecraft.util.MathHelper; + +public class pm_zombiePony extends pm_newPonyAdv { + + public pm_zombiePony(String texture) { + super(texture); + } + + @Override + protected void rotateLegs(float move, float swing, float tick) { + float rightArmRotateAngleX; + float leftArmRotateAngleX; + float rightLegRotateAngleX; + float leftLegRotateAngleX; + float var8; + float var9; + if (this.isFlying && this.isPegasus) { + if (this.rainboom) { + rightArmRotateAngleX = ROTATE_270; + leftArmRotateAngleX = ROTATE_270; + rightLegRotateAngleX = ROTATE_90; + leftLegRotateAngleX = ROTATE_90; + } else { + rightArmRotateAngleX = MathHelper.sin(0.0F - swing * 0.5F); + leftArmRotateAngleX = MathHelper.sin(0.0F - swing * 0.5F); + rightLegRotateAngleX = MathHelper.sin(swing * 0.5F); + leftLegRotateAngleX = MathHelper.sin(swing * 0.5F); + } + + this.bipedRightArm.rotateAngleY = 0.2F; + this.SteveArm.rotateAngleY = 0.2F; + this.bipedLeftArm.rotateAngleY = -0.2F; + this.bipedRightLeg.rotateAngleY = -0.2F; + this.bipedLeftLeg.rotateAngleY = 0.2F; + } else { + var8 = (float) Math.pow(swing, 16.0D); + this.getClass(); + var9 = 3.1415927F * var8 * 0.5F; + this.getClass(); + float laQuad = 3.1415927F * var8; + this.getClass(); + float rlQuad = 3.1415927F * var8 * 0.2F; + this.getClass(); + float llQuad = 3.1415927F * var8 * -0.4F; + rightArmRotateAngleX = MathHelper.cos(move * 0.6662F + 3.1415927F + var9) * 0.45F * swing; + leftArmRotateAngleX = MathHelper.cos(move * 0.6662F + laQuad) * 0.45F * swing; + rightLegRotateAngleX = MathHelper.cos(move * 0.6662F + rlQuad) * 0.45F * swing; + leftLegRotateAngleX = MathHelper.cos(move * 0.6662F + 3.1415927F + llQuad) * 0.45F * swing; + this.bipedRightArm.rotateAngleY = 0.0F; + this.SteveArm.rotateAngleY = 0.0F; + this.unicornarm.rotateAngleY = 0.0F; + this.bipedLeftArm.rotateAngleY = 0.0F; + this.bipedRightLeg.rotateAngleY = 0.0F; + this.bipedLeftLeg.rotateAngleY = 0.0F; + } + + this.bipedRightArm.rotateAngleX = rightArmRotateAngleX; + this.SteveArm.rotateAngleX = rightArmRotateAngleX; + this.unicornarm.rotateAngleX = 0.0F; + this.bipedLeftArm.rotateAngleX = leftArmRotateAngleX; + this.bipedRightLeg.rotateAngleX = rightLegRotateAngleX; + this.bipedLeftLeg.rotateAngleX = leftLegRotateAngleX; + this.bipedRightArm.rotateAngleZ = 0.0F; + this.SteveArm.rotateAngleZ = 0.0F; + this.unicornarm.rotateAngleZ = 0.0F; + this.bipedLeftArm.rotateAngleZ = 0.0F; + if (this.heldItemRight == 0) { + var8 = MathHelper.sin(this.swingProgress * (float) Math.PI); + var9 = MathHelper.sin((1.0F - (1.0F - this.swingProgress) * (1.0F - this.swingProgress)) * (float) Math.PI); + if (MathHelper.sin(move / 20.0F) < 0.0F) { + this.bipedRightArm.rotateAngleZ = 0.0F; + this.bipedRightArm.rotateAngleY = 0.1F - var8 * 0.6F; + this.bipedRightArm.rotateAngleX = -1.5707964F; + this.bipedRightArm.rotateAngleX -= var8 * 1.2F - var9 * 0.4F; + this.bipedRightArm.rotateAngleZ += MathHelper.cos(tick * 0.09F) * 0.05F + 0.05F; + this.bipedRightArm.rotateAngleX += MathHelper.sin(tick * 0.067F) * 0.1F; + } else { + this.bipedLeftArm.rotateAngleZ = 0.0F; + this.bipedLeftArm.rotateAngleY = -(0.1F - var8 * 0.6F); + this.bipedLeftArm.rotateAngleX = -1.5707964F; + this.bipedLeftArm.rotateAngleX -= var8 * 1.2F - var9 * 0.4F; + this.bipedLeftArm.rotateAngleZ += MathHelper.cos(tick * 0.09F) * 0.05F + 0.05F; + this.bipedLeftArm.rotateAngleX += MathHelper.sin(tick * 0.067F) * 0.1F; + } + } + + } + + @Override + protected void fixSpecialRotationPoints(float move) { + if (this.heldItemRight == 0) { + if (MathHelper.sin(move / 20.0F) < 0.0F) { + this.shiftRotationPoint(this.bipedRightArm, 0.5F, 1.5F, 3.0F); + } else { + this.shiftRotationPoint(this.bipedLeftArm, -0.5F, 1.5F, 3.0F); + } + } + + } +} diff --git a/src/main/java/com/minelittlepony/minelp/renderer/AniParams.java b/src/main/java/com/minelittlepony/minelp/renderer/AniParams.java new file mode 100644 index 00000000..cc69d90a --- /dev/null +++ b/src/main/java/com/minelittlepony/minelp/renderer/AniParams.java @@ -0,0 +1,18 @@ +package com.minelittlepony.minelp.renderer; + +public class AniParams { + + public float move; + public float swing; + public float tick; + public float horz; + public float vert; + + public AniParams(float move, float swing, float tick, float horz, float vert) { + this.move = move; + this.swing = swing; + this.tick = tick; + this.horz = horz; + this.vert = vert; + } +} diff --git a/src/main/java/com/minelittlepony/minelp/renderer/CompressiveRendering.java b/src/main/java/com/minelittlepony/minelp/renderer/CompressiveRendering.java new file mode 100644 index 00000000..b6d5e317 --- /dev/null +++ b/src/main/java/com/minelittlepony/minelp/renderer/CompressiveRendering.java @@ -0,0 +1,89 @@ +package com.minelittlepony.minelp.renderer; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.Random; +import net.minecraft.client.model.ModelBase; +import net.minecraft.client.model.ModelRenderer; + +public class CompressiveRendering { + private boolean isCompressed; + private int chance = 1; + private Collection me; + private ArrayList expanded; + private ArrayList compressed; + private ModelBase model; + + public CompressiveRendering(ModelBase model) { + this.model = model; + this.expanded = new ArrayList(1); + this.compressed = new ArrayList(1); + model.boxList.remove(this.compressed); + } + + public void addExpanded(ModelRenderer expanded) { + this.model.boxList.remove(expanded); + this.expanded.add(expanded); + } + + public void addExpanded(ModelRenderer expanded, int weighted) { + this.model.boxList.remove(expanded); + this.expanded.addAll(Collections.nCopies(weighted, expanded)); + } + + public void addCompressed(ModelRenderer compressed) { + this.model.boxList.remove(compressed); + this.compressed.add(compressed); + } + + public void addCompressed(ModelRenderer compressed, int weighted) { + this.model.boxList.remove(compressed); + this.compressed.addAll(Collections.nCopies(weighted, compressed)); + } + + public void setChance(int chance) { + this.chance = chance; + } + + public int getChance() { + return this.chance; + } + + public void init() { + this.me = Collections.nCopies(this.chance, this); + this.model.boxList.addAll(this.me); + } + + public void deInit() { + this.model.boxList.removeAll(this.me); + this.me = null; + } + + public void init_Safe() { + if (this.me == null) { + this.init(); + } + + } + + public void deInit_Safe() { + if (this.me != null) { + this.deInit(); + } + + } + + public void setIsCompressed(boolean isCompressed) { + this.isCompressed = isCompressed; + } + + public boolean getIsCompressed() { + return this.isCompressed; + } + + public ModelRenderer getARenderer(Random rand) { + return this.isCompressed ? (ModelRenderer) this.compressed.get(rand.nextInt(this.compressed.size())) + : (ModelRenderer) this.expanded.get(rand.nextInt(this.expanded.size())); + } +} diff --git a/src/main/java/com/minelittlepony/minelp/renderer/HornGlowRenderer.java b/src/main/java/com/minelittlepony/minelp/renderer/HornGlowRenderer.java new file mode 100644 index 00000000..833c7f57 --- /dev/null +++ b/src/main/java/com/minelittlepony/minelp/renderer/HornGlowRenderer.java @@ -0,0 +1,235 @@ +package com.minelittlepony.minelp.renderer; + +import com.minelittlepony.minelp.model.ModelHornGlow; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import net.minecraft.client.model.ModelBase; +import net.minecraft.client.model.TextureOffset; +import net.minecraft.client.renderer.GLAllocation; +import net.minecraft.client.renderer.Tessellator; +import org.lwjgl.opengl.GL11; + +public class HornGlowRenderer { + public float textureWidth; + public float textureHeight; + private int textureOffsetX; + private int textureOffsetY; + public float rotationPointX; + public float rotationPointY; + public float rotationPointZ; + public float rotateAngleX; + public float rotateAngleY; + public float rotateAngleZ; + private boolean compiled; + private int displayList; + public boolean mirror; + public boolean showModel; + public boolean isHidden; + public List cubeList; + public List childModels; + public final String boxName; + private ModelBase baseModel; + + public HornGlowRenderer(ModelBase par1ModelBase, String par2Str) { + this.textureWidth = 64.0F; + this.textureHeight = 32.0F; + this.compiled = false; + this.displayList = 0; + this.mirror = false; + this.showModel = true; + this.isHidden = false; + this.cubeList = new ArrayList(); + this.baseModel = par1ModelBase; + this.boxName = par2Str; + this.setTextureSize(par1ModelBase.textureWidth, par1ModelBase.textureHeight); + } + + public HornGlowRenderer(ModelBase par1ModelBase) { + this(par1ModelBase, (String) null); + } + + public HornGlowRenderer(ModelBase par1ModelBase, int par2, int par3) { + this(par1ModelBase); + this.setTextureOffset(par2, par3); + } + + public void addChild(HornGlowRenderer par1ModelRenderer) { + if (this.childModels == null) { + this.childModels = new ArrayList(); + } + + this.childModels.add(par1ModelRenderer); + } + + public HornGlowRenderer setTextureOffset(int par1, int par2) { + this.textureOffsetX = par1; + this.textureOffsetY = par2; + return this; + } + + public HornGlowRenderer addBox(String par1Str, float par2, float par3, float par4, int par5, int par6, int par7) { + par1Str = this.boxName + "." + par1Str; + TextureOffset var8 = this.baseModel.getTextureOffset(par1Str); + this.setTextureOffset(var8.textureOffsetX, var8.textureOffsetY); + this.cubeList.add((new ModelHornGlow(this, this.textureOffsetX, this.textureOffsetY, par2, par3, par4, par5, + par6, par7, 0.0F)).func_78244_a(par1Str)); + return this; + } + + public HornGlowRenderer addBox(float par1, float par2, float par3, int par4, int par5, int par6) { + this.cubeList.add(new ModelHornGlow(this, this.textureOffsetX, this.textureOffsetY, par1, par2, par3, par4, + par5, par6, 0.0F)); + return this; + } + + public void addBox(float par1, float par2, float par3, int par4, int par5, int par6, float par7) { + this.cubeList.add(new ModelHornGlow(this, this.textureOffsetX, this.textureOffsetY, par1, par2, par3, par4, + par5, par6, par7)); + } + + public void setRotationPoint(float par1, float par2, float par3) { + this.rotationPointX = par1; + this.rotationPointY = par2; + this.rotationPointZ = par3; + } + + public void render(float par1) { + if (!this.isHidden && this.showModel) { + if (!this.compiled) { + this.compileDisplayList(par1); + } + + Iterator var2; + HornGlowRenderer var3; + if (this.rotateAngleX == 0.0F && this.rotateAngleY == 0.0F && this.rotateAngleZ == 0.0F) { + if (this.rotationPointX == 0.0F && this.rotationPointY == 0.0F && this.rotationPointZ == 0.0F) { + GL11.glCallList(this.displayList); + if (this.childModels != null) { + var2 = this.childModels.iterator(); + + while (var2.hasNext()) { + var3 = var2.next(); + var3.render(par1); + } + } + } else { + GL11.glTranslatef(this.rotationPointX * par1, this.rotationPointY * par1, + this.rotationPointZ * par1); + GL11.glCallList(this.displayList); + if (this.childModels != null) { + var2 = this.childModels.iterator(); + + while (var2.hasNext()) { + var3 = var2.next(); + var3.render(par1); + } + } + + GL11.glTranslatef(-this.rotationPointX * par1, -this.rotationPointY * par1, + -this.rotationPointZ * par1); + } + } else { + GL11.glPushMatrix(); + GL11.glTranslatef(this.rotationPointX * par1, this.rotationPointY * par1, this.rotationPointZ * par1); + if (this.rotateAngleZ != 0.0F) { + GL11.glRotatef(this.rotateAngleZ * 57.295776F, 0.0F, 0.0F, 1.0F); + } + + if (this.rotateAngleY != 0.0F) { + GL11.glRotatef(this.rotateAngleY * 57.295776F, 0.0F, 1.0F, 0.0F); + } + + if (this.rotateAngleX != 0.0F) { + GL11.glRotatef(this.rotateAngleX * 57.295776F, 1.0F, 0.0F, 0.0F); + } + + GL11.glCallList(this.displayList); + if (this.childModels != null) { + var2 = this.childModels.iterator(); + + while (var2.hasNext()) { + var3 = var2.next(); + var3.render(par1); + } + } + + GL11.glPopMatrix(); + } + } + + } + + public void renderWithRotation(float par1) { + if (!this.isHidden && this.showModel) { + if (!this.compiled) { + this.compileDisplayList(par1); + } + + GL11.glPushMatrix(); + GL11.glTranslatef(this.rotationPointX * par1, this.rotationPointY * par1, this.rotationPointZ * par1); + if (this.rotateAngleY != 0.0F) { + GL11.glRotatef(this.rotateAngleY * 57.295776F, 0.0F, 1.0F, 0.0F); + } + + if (this.rotateAngleX != 0.0F) { + GL11.glRotatef(this.rotateAngleX * 57.295776F, 1.0F, 0.0F, 0.0F); + } + + if (this.rotateAngleZ != 0.0F) { + GL11.glRotatef(this.rotateAngleZ * 57.295776F, 0.0F, 0.0F, 1.0F); + } + + GL11.glCallList(this.displayList); + GL11.glPopMatrix(); + } + + } + + public void postRender(float par1) { + if (!this.isHidden && this.showModel) { + if (!this.compiled) { + this.compileDisplayList(par1); + } + + if (this.rotateAngleX == 0.0F && this.rotateAngleY == 0.0F && this.rotateAngleZ == 0.0F) { + if (this.rotationPointX != 0.0F || this.rotationPointY != 0.0F || this.rotationPointZ != 0.0F) { + GL11.glTranslatef(this.rotationPointX * par1, this.rotationPointY * par1, + this.rotationPointZ * par1); + } + } else { + GL11.glTranslatef(this.rotationPointX * par1, this.rotationPointY * par1, this.rotationPointZ * par1); + if (this.rotateAngleZ != 0.0F) { + GL11.glRotatef(this.rotateAngleZ * 57.295776F, 0.0F, 0.0F, 1.0F); + } + + if (this.rotateAngleY != 0.0F) { + GL11.glRotatef(this.rotateAngleY * 57.295776F, 0.0F, 1.0F, 0.0F); + } + + if (this.rotateAngleX != 0.0F) { + GL11.glRotatef(this.rotateAngleX * 57.295776F, 1.0F, 0.0F, 0.0F); + } + } + } + + } + + private void compileDisplayList(float par1) { + this.displayList = GLAllocation.generateDisplayLists(1); + GL11.glNewList(this.displayList, 4864); + Tessellator var2 = Tessellator.getInstance(); + for (ModelHornGlow var4 : cubeList) { + var4.render(var2, par1); + } + + GL11.glEndList(); + this.compiled = true; + } + + public HornGlowRenderer setTextureSize(int par1, int par2) { + this.textureWidth = par1; + this.textureHeight = par2; + return this; + } +} diff --git a/src/main/java/com/minelittlepony/minelp/renderer/IRenderPony.java b/src/main/java/com/minelittlepony/minelp/renderer/IRenderPony.java new file mode 100644 index 00000000..9488cd32 --- /dev/null +++ b/src/main/java/com/minelittlepony/minelp/renderer/IRenderPony.java @@ -0,0 +1,8 @@ +package com.minelittlepony.minelp.renderer; + +import com.minelittlepony.minelp.model.PlayerModel; + +public interface IRenderPony { + + PlayerModel getPony(); +} diff --git a/src/main/java/com/minelittlepony/minelp/renderer/PlaneRenderer.java b/src/main/java/com/minelittlepony/minelp/renderer/PlaneRenderer.java new file mode 100644 index 00000000..85d8d7b5 --- /dev/null +++ b/src/main/java/com/minelittlepony/minelp/renderer/PlaneRenderer.java @@ -0,0 +1,444 @@ +package com.minelittlepony.minelp.renderer; + +import static net.minecraft.client.renderer.GlStateManager.*; +import org.lwjgl.opengl.GL11; + +import net.minecraft.client.model.ModelBase; +import net.minecraft.client.model.ModelRenderer; +import net.minecraft.client.model.PositionTextureVertex; +import net.minecraft.client.model.TexturedQuad; +import net.minecraft.client.renderer.GLAllocation; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.renderer.WorldRenderer; + +public class PlaneRenderer { + public float textureWidth; + public float textureHeight; + private PositionTextureVertex[] corners; + private TexturedQuad[] faces; + private int textureOffsetX; + private int textureOffsetY; + public float rotationPointX; + public float rotationPointY; + public float rotationPointZ; + public float rotateAngleX; + public float rotateAngleY; + public float rotateAngleZ; + public float field_35977_i; + public float field_35975_j; + public float field_35976_k; + public float field_35973_l; + public float field_35974_m; + public float field_35972_n; + private boolean compiled = false; + private int displayList = 0; + public boolean mirror = false; + public boolean mirrory = false; + public boolean mirrorxy = false; + public boolean showModel = true; + public boolean isHidden = false; + + public PlaneRenderer(ModelBase modelbase, int i, int j) { + this.textureOffsetX = i; + this.textureOffsetY = j; + this.textureWidth = modelbase.textureWidth; + this.textureHeight = modelbase.textureHeight; + } + + public void addBackPlane(float f, float f1, float f2, int i, int j, int k) { + this.addBackPlane(f, f1, f2, i, j, k, 0.0F); + } + + public void addSidePlane(float f, float f1, float f2, int i, int j, int k) { + this.addSidePlane(f, f1, f2, i, j, k, 0.0F); + } + + public void addTopPlane(float f, float f1, float f2, int i, int j, int k) { + this.addTopPlane(f, f1, f2, i, j, k, 0.0F); + } + + public void addBottomPlane(float f, float f1, float f2, int i, int j, int k) { + this.addBottomPlane(f, f1, f2, i, j, k, 0.0F); + } + + public void addBackPlane(float f, float f1, float f2, int i, int j, int k, float f3) { + this.field_35977_i = f; + this.field_35975_j = f1; + this.field_35976_k = f2; + this.field_35973_l = f + i; + this.field_35974_m = f1 + j; + this.field_35972_n = f2 + k; + this.corners = new PositionTextureVertex[8]; + this.faces = new TexturedQuad[1]; + float f4 = f + i; + float f5 = f1 + j; + float f6 = f2 + k; + f -= f3; + f1 -= f3; + f2 -= f3; + f4 += f3; + f5 += f3; + f6 += f3; + if (this.mirror) { + float positiontexturevertex = f4; + f4 = f; + f = positiontexturevertex; + } + + PositionTextureVertex positiontexturevertex = new PositionTextureVertex(f, f1, f2, 0.0F, 0.0F); + PositionTextureVertex positiontexturevertex1 = new PositionTextureVertex(f4, f1, f2, 0.0F, 8.0F); + PositionTextureVertex positiontexturevertex2 = new PositionTextureVertex(f4, f5, f2, 8.0F, 8.0F); + PositionTextureVertex positiontexturevertex3 = new PositionTextureVertex(f, f5, f2, 8.0F, 0.0F); + PositionTextureVertex positiontexturevertex4 = new PositionTextureVertex(f, f1, f6, 0.0F, 0.0F); + PositionTextureVertex positiontexturevertex5 = new PositionTextureVertex(f4, f1, f6, 0.0F, 8.0F); + PositionTextureVertex positiontexturevertex6 = new PositionTextureVertex(f4, f5, f6, 8.0F, 8.0F); + PositionTextureVertex positiontexturevertex7 = new PositionTextureVertex(f, f5, f6, 8.0F, 0.0F); + this.corners[0] = positiontexturevertex; + this.corners[1] = positiontexturevertex1; + this.corners[2] = positiontexturevertex2; + this.corners[3] = positiontexturevertex3; + this.corners[4] = positiontexturevertex4; + this.corners[5] = positiontexturevertex5; + this.corners[6] = positiontexturevertex6; + this.corners[7] = positiontexturevertex7; + this.faces[0] = new TexturedQuad( + new PositionTextureVertex[] { + positiontexturevertex1, + positiontexturevertex, + positiontexturevertex3, + positiontexturevertex2 }, + this.textureOffsetX, this.textureOffsetY, + this.textureOffsetX + i, this.textureOffsetY + j, + this.textureWidth, this.textureHeight); + if (this.mirror) { + this.faces[0].flipFace(); + } + + } + + public void addSidePlane(float f, float f1, float f2, int i, int j, int k, float f3) { + this.field_35977_i = f; + this.field_35975_j = f1; + this.field_35976_k = f2; + this.field_35973_l = f + i; + this.field_35974_m = f1 + j; + this.field_35972_n = f2 + k; + this.corners = new PositionTextureVertex[8]; + this.faces = new TexturedQuad[1]; + float f4 = f + i; + float f5 = f1 + j; + float f6 = f2 + k; + f -= f3; + f1 -= f3; + f2 -= f3; + f4 += f3; + f5 += f3; + f6 += f3; + if (this.mirror) { + float positiontexturevertex = f4; + f4 = f; + f = positiontexturevertex; + } + + PositionTextureVertex positiontexturevertex = new PositionTextureVertex(f, f1, f2, 0.0F, 0.0F); + PositionTextureVertex positiontexturevertex1 = new PositionTextureVertex(f4, f1, f2, 0.0F, 8.0F); + PositionTextureVertex positiontexturevertex2 = new PositionTextureVertex(f4, f5, f2, 8.0F, 8.0F); + PositionTextureVertex positiontexturevertex3 = new PositionTextureVertex(f, f5, f2, 8.0F, 0.0F); + PositionTextureVertex positiontexturevertex4 = new PositionTextureVertex(f, f1, f6, 0.0F, 0.0F); + PositionTextureVertex positiontexturevertex5 = new PositionTextureVertex(f4, f1, f6, 0.0F, 8.0F); + PositionTextureVertex positiontexturevertex6 = new PositionTextureVertex(f4, f5, f6, 8.0F, 8.0F); + PositionTextureVertex positiontexturevertex7 = new PositionTextureVertex(f, f5, f6, 8.0F, 0.0F); + this.corners[0] = positiontexturevertex; + this.corners[1] = positiontexturevertex1; + this.corners[2] = positiontexturevertex2; + this.corners[3] = positiontexturevertex3; + this.corners[4] = positiontexturevertex4; + this.corners[5] = positiontexturevertex5; + this.corners[6] = positiontexturevertex6; + this.corners[7] = positiontexturevertex7; + this.faces[0] = new TexturedQuad( + new PositionTextureVertex[] { + positiontexturevertex5, + positiontexturevertex1, + positiontexturevertex2, + positiontexturevertex6 }, + this.textureOffsetX, this.textureOffsetY, + this.textureOffsetX + k, this.textureOffsetY + j, + this.textureWidth, this.textureHeight); + if (this.mirror) { + this.faces[0].flipFace(); + } + + } + + public void addTopPlane(float f, float f1, float f2, int i, int j, int k, float f3) { + this.field_35977_i = f; + this.field_35975_j = f1; + this.field_35976_k = f2; + this.field_35973_l = f + i; + this.field_35974_m = f1 + j; + this.field_35972_n = f2 + k; + this.corners = new PositionTextureVertex[8]; + this.faces = new TexturedQuad[1]; + float f4 = f + i; + float f5 = f1 + j; + float f6 = f2 + k; + f -= f3; + f1 -= f3; + f2 -= f3; + f4 += f3; + f5 += f3; + f6 += f3; + float vertex; + if (this.mirror) { + vertex = f4; + f4 = f; + f = vertex; + } + + if (this.mirrory) { + vertex = f6; + f6 = f2; + f2 = vertex; + } + + if (this.mirrorxy) { + vertex = f6; + f6 = f2; + f2 = vertex; + vertex = f4; + f4 = f; + f = vertex; + } + + PositionTextureVertex positiontexturevertex = new PositionTextureVertex(f, f1, f2, 0.0F, 0.0F); + PositionTextureVertex positiontexturevertex1 = new PositionTextureVertex(f4, f1, f2, 0.0F, 8.0F); + PositionTextureVertex positiontexturevertex2 = new PositionTextureVertex(f4, f5, f2, 8.0F, 8.0F); + PositionTextureVertex positiontexturevertex3 = new PositionTextureVertex(f, f5, f2, 8.0F, 0.0F); + PositionTextureVertex positiontexturevertex4 = new PositionTextureVertex(f, f1, f6, 0.0F, 0.0F); + PositionTextureVertex positiontexturevertex5 = new PositionTextureVertex(f4, f1, f6, 0.0F, 8.0F); + PositionTextureVertex positiontexturevertex6 = new PositionTextureVertex(f4, f5, f6, 8.0F, 8.0F); + PositionTextureVertex positiontexturevertex7 = new PositionTextureVertex(f, f5, f6, 8.0F, 0.0F); + this.corners[0] = positiontexturevertex; + this.corners[1] = positiontexturevertex1; + this.corners[2] = positiontexturevertex2; + this.corners[3] = positiontexturevertex3; + this.corners[4] = positiontexturevertex4; + this.corners[5] = positiontexturevertex5; + this.corners[6] = positiontexturevertex6; + this.corners[7] = positiontexturevertex7; + this.faces[0] = new TexturedQuad( + new PositionTextureVertex[] { + positiontexturevertex5, + positiontexturevertex4, + positiontexturevertex, + positiontexturevertex1 }, + this.textureOffsetX, this.textureOffsetY, + this.textureOffsetX + i, this.textureOffsetY + k, + this.textureWidth, this.textureHeight); + if (this.mirror || this.mirrory) { + this.faces[0].flipFace(); + } + + } + + public void addBottomPlane(float f, float f1, float f2, int i, int j, int k, float f3) { + this.field_35977_i = f; + this.field_35975_j = f1; + this.field_35976_k = f2; + this.field_35973_l = f + i; + this.field_35974_m = f1 + j; + this.field_35972_n = f2 + k; + this.corners = new PositionTextureVertex[8]; + this.faces = new TexturedQuad[1]; + float f4 = f + i; + float f5 = f1 + j; + float f6 = f2 + k; + f -= f3; + f1 -= f3; + f2 -= f3; + f4 += f3; + f5 += f3; + f6 += f3; + float vertex; + if (this.mirror) { + vertex = f4; + f4 = f; + f = vertex; + } + + if (this.mirrory) { + vertex = f6; + f6 = f2; + f2 = vertex; + } + + if (this.mirrorxy) { + vertex = f6; + f6 = f2; + f2 = vertex; + vertex = f4; + f4 = f; + f = vertex; + } + + PositionTextureVertex positiontexturevertex = new PositionTextureVertex(f, f1, f2, 0.0F, 0.0F); + PositionTextureVertex positiontexturevertex1 = new PositionTextureVertex(f4, f1, f2, 0.0F, 8.0F); + PositionTextureVertex positiontexturevertex2 = new PositionTextureVertex(f4, f5, f2, 8.0F, 8.0F); + PositionTextureVertex positiontexturevertex3 = new PositionTextureVertex(f, f5, f2, 8.0F, 0.0F); + PositionTextureVertex positiontexturevertex4 = new PositionTextureVertex(f, f1, f6, 0.0F, 0.0F); + PositionTextureVertex positiontexturevertex5 = new PositionTextureVertex(f4, f1, f6, 0.0F, 8.0F); + PositionTextureVertex positiontexturevertex6 = new PositionTextureVertex(f4, f5, f6, 8.0F, 8.0F); + PositionTextureVertex positiontexturevertex7 = new PositionTextureVertex(f, f5, f6, 8.0F, 0.0F); + this.corners[0] = positiontexturevertex; + this.corners[1] = positiontexturevertex1; + this.corners[2] = positiontexturevertex2; + this.corners[3] = positiontexturevertex3; + this.corners[4] = positiontexturevertex4; + this.corners[5] = positiontexturevertex5; + this.corners[6] = positiontexturevertex6; + this.corners[7] = positiontexturevertex7; + this.faces[0] = new TexturedQuad( + new PositionTextureVertex[] { + positiontexturevertex2, + positiontexturevertex3, + positiontexturevertex7, + positiontexturevertex6 }, + this.textureOffsetX, this.textureOffsetY, + this.textureOffsetX + i, this.textureOffsetY + k, + this.textureWidth, this.textureHeight); + if (this.mirror || this.mirrory) { + this.faces[0].flipFace(); + } + + } + + public void setRotationPoint(float f, float f1, float f2) { + this.rotationPointX = f; + this.rotationPointY = f1; + this.rotationPointZ = f2; + } + + public void render(float f) { + if (!this.isHidden) { + if (this.showModel) { + if (!this.compiled) { + this.compileDisplayList(f); + } + + if (this.rotateAngleX == 0.0F && this.rotateAngleY == 0.0F && this.rotateAngleZ == 0.0F) { + if (this.rotationPointX == 0.0F && this.rotationPointY == 0.0F && this.rotationPointZ == 0.0F) { + callList(this.displayList); + } else { + translate(this.rotationPointX * f, this.rotationPointY * f, this.rotationPointZ * f); + callList(this.displayList); + translate(-this.rotationPointX * f, -this.rotationPointY * f, -this.rotationPointZ * f); + } + } else { + pushMatrix(); + translate(this.rotationPointX * f, this.rotationPointY * f, this.rotationPointZ * f); + if (this.rotateAngleZ != 0.0F) { + rotate(this.rotateAngleZ * 57.29578F, 0.0F, 0.0F, 1.0F); + } + + if (this.rotateAngleY != 0.0F) { + rotate(this.rotateAngleY * 57.29578F, 0.0F, 1.0F, 0.0F); + } + + if (this.rotateAngleX != 0.0F) { + rotate(this.rotateAngleX * 57.29578F, 1.0F, 0.0F, 0.0F); + } + + callList(this.displayList); + popMatrix(); + } + + } + } + } + + public void renderWithRotation(float f) { + if (!this.isHidden) { + if (this.showModel) { + if (!this.compiled) { + this.compileDisplayList(f); + } + + pushMatrix(); + translate(this.rotationPointX * f, this.rotationPointY * f, this.rotationPointZ * f); + if (this.rotateAngleY != 0.0F) { + rotate(this.rotateAngleY * 57.29578F, 0.0F, 1.0F, 0.0F); + } + + if (this.rotateAngleX != 0.0F) { + rotate(this.rotateAngleX * 57.29578F, 1.0F, 0.0F, 0.0F); + } + + if (this.rotateAngleZ != 0.0F) { + rotate(this.rotateAngleZ * 57.29578F, 0.0F, 0.0F, 1.0F); + } + + callList(this.displayList); + popMatrix(); + } + } + } + + public void postRender(float f) { + if (!this.isHidden) { + if (this.showModel) { + if (!this.compiled) { + this.compileDisplayList(f); + } + + if (this.rotateAngleX == 0.0F && this.rotateAngleY == 0.0F && this.rotateAngleZ == 0.0F) { + if (this.rotationPointX != 0.0F || this.rotationPointY != 0.0F || this.rotationPointZ != 0.0F) { + translate(this.rotationPointX * f, this.rotationPointY * f, this.rotationPointZ * f); + } + } else { + translate(this.rotationPointX * f, this.rotationPointY * f, this.rotationPointZ * f); + if (this.rotateAngleZ != 0.0F) { + rotate(this.rotateAngleZ * 57.29578F, 0.0F, 0.0F, 1.0F); + } + + if (this.rotateAngleY != 0.0F) { + rotate(this.rotateAngleY * 57.29578F, 0.0F, 1.0F, 0.0F); + } + + if (this.rotateAngleX != 0.0F) { + rotate(this.rotateAngleX * 57.29578F, 1.0F, 0.0F, 0.0F); + } + } + + } + } + } + + private void compileDisplayList(float f) { + this.displayList = GLAllocation.generateDisplayLists(1); + GL11.glNewList(this.displayList, 4864); + WorldRenderer wr = Tessellator.getInstance().getWorldRenderer(); + + for (TexturedQuad face : this.faces) { + face.draw(wr, f); + } + + GL11.glEndList(); + this.compiled = true; + } + + public PlaneRenderer setTextureSize(int i, int j) { + this.textureWidth = i; + this.textureHeight = j; + return this; + } + + public void setToModel(ModelRenderer modelrenderer) { + this.rotationPointX = modelrenderer.rotationPointX; + this.rotationPointY = modelrenderer.rotationPointY; + this.rotationPointZ = modelrenderer.rotationPointZ; + this.rotateAngleX = modelrenderer.rotateAngleX; + this.rotateAngleY = modelrenderer.rotateAngleY; + this.rotateAngleZ = modelrenderer.rotateAngleZ; + } +} diff --git a/src/main/java/com/minelittlepony/minelp/renderer/RenderPony.java b/src/main/java/com/minelittlepony/minelp/renderer/RenderPony.java new file mode 100644 index 00000000..5aaf58b8 --- /dev/null +++ b/src/main/java/com/minelittlepony/minelp/renderer/RenderPony.java @@ -0,0 +1,150 @@ +package com.minelittlepony.minelp.renderer; + +import static net.minecraft.client.renderer.GlStateManager.scale; + +import com.minelittlepony.minelp.Pony; +import com.minelittlepony.minelp.PonyManager; +import com.minelittlepony.minelp.model.PMAPI; +import com.minelittlepony.minelp.model.PlayerModel; +import com.minelittlepony.minelp.model.pony.pm_Human; +import com.minelittlepony.minelp.model.pony.pm_newPonyAdv; +import com.minelittlepony.minelp.renderer.layer.LayerHeldPonyItem; +import com.minelittlepony.minelp.renderer.layer.LayerPonyArmor; +import com.minelittlepony.minelp.renderer.layer.LayerPonySkull; +import com.minelittlepony.minelp.util.MineLPPrivateFields; +import com.mumfrey.liteloader.transformers.AppendInsns; +import com.mumfrey.liteloader.transformers.Obfuscated; + +import net.minecraft.client.entity.AbstractClientPlayer; +import net.minecraft.client.entity.EntityPlayerSP; +import net.minecraft.client.renderer.entity.RenderManager; +import net.minecraft.client.renderer.entity.RenderPlayer; +import net.minecraft.client.renderer.entity.RendererLivingEntity; +import net.minecraft.client.renderer.entity.layers.LayerArrow; +import net.minecraft.entity.Entity; +import net.minecraft.item.EnumAction; +import net.minecraft.item.ItemStack; +import net.minecraft.util.ResourceLocation; + +public abstract class RenderPony extends RendererLivingEntity implements IRenderPony { + @SuppressWarnings("unused") + private static RenderPlayer __TARGET; + private PlayerModel playerModel; + + private RenderPony(RenderManager renderManager) { + super(renderManager, null, 0.5F); + throw new InstantiationError("Overlay classes must not be instantiated"); + } + + @AppendInsns("") + private void init(RenderManager renderManager, boolean useSmallArms) { + this.playerModel = PMAPI.newPonyAdv; + this.mainModel = this.playerModel.model; + this.shadowSize = this.playerModel.shadowsize; + this.layerRenderers.clear(); + + this.addLayer(new LayerPonyArmor(this)); + this.addLayer(new LayerHeldPonyItem(this)); + this.addLayer(new LayerArrow(this)); + this.addLayer(new LayerPonySkull(this)); + } + + @Obfuscated({ "a", "func_180596_a" }) + public void doRender(AbstractClientPlayer player, double x, double y, double z, float yaw, float partialTicks) { + ItemStack currentItemStack = player.inventory.getCurrentItem(); + Pony thePony = PonyManager.getInstance().getPonyFromResourceRegistry(player); + this.playerModel = this.getModel(player); + this.mainModel = this.playerModel.model; + this.playerModel.armor.modelArmorChestplate.heldItemRight = this.playerModel.armor.modelArmor.heldItemRight = this.playerModel.model.heldItemRight = currentItemStack == null + ? 0 : 1; + if (currentItemStack != null && player.getItemInUseCount() > 0) { + EnumAction yOrigin = currentItemStack.getItemUseAction(); + if (yOrigin == EnumAction.BLOCK) { + this.playerModel.armor.modelArmorChestplate.heldItemRight = this.playerModel.armor.modelArmor.heldItemRight = this.playerModel.model.heldItemRight = 3; + } else if (yOrigin == EnumAction.BOW) { + this.playerModel.armor.modelArmorChestplate.aimedBow = this.playerModel.armor.modelArmor.aimedBow = this.playerModel.model.aimedBow = true; + } + } + + this.playerModel.armor.modelArmorChestplate.issneak = this.playerModel.armor.modelArmor.issneak = this.playerModel.model.issneak = player.isSneaking(); + this.playerModel.armor.modelArmorChestplate.isFlying = this.playerModel.armor.modelArmor.isFlying = this.playerModel.model.isFlying = thePony.isFlying = player.capabilities.isFlying + || thePony.isPegasusFlying(player.posX, player.posY, player.posZ, player.fallDistance, + MineLPPrivateFields.isJumping.get(player).booleanValue(), player.onGround, this.renderManager.worldObj); + this.playerModel.armor.modelArmorChestplate.isPegasus = this.playerModel.armor.modelArmor.isPegasus = this.playerModel.model.isPegasus = thePony + .isPegasus(); + if (this.playerModel.model instanceof pm_newPonyAdv) { + ((pm_newPonyAdv) this.playerModel.model).setHasWings_Compression(thePony.isPegasus()); + } + + this.playerModel.armor.modelArmorChestplate.isUnicorn = this.playerModel.armor.modelArmor.isUnicorn = this.playerModel.model.isUnicorn = thePony.isUnicorn(); + this.playerModel.armor.modelArmorChestplate.isMale = this.playerModel.armor.modelArmor.isMale = this.playerModel.model.isMale = thePony.isMale(); + this.playerModel.armor.modelArmorChestplate.size = this.playerModel.armor.modelArmor.size = this.playerModel.model.size = thePony.size(); + if (PonyManager.getInstance().getShowScale() == 1) { + if (this.playerModel != PMAPI.human) { + if (thePony.size() == 0) { + this.shadowSize = 0.25F; + } else if (thePony.size() == 1) { + this.shadowSize = 0.4F; + } else if (thePony.size() == 2) { + this.shadowSize = 0.45F; + } else if (thePony.size() == 3) { + this.shadowSize = 0.5F; + } else { + this.shadowSize = 0.5F; + } + } else { + this.shadowSize = 0.5F; + } + } else { + this.shadowSize = 0.5F; + } + + double yOrigin1 = y; + if (player.isSneaking() && !(player instanceof EntityPlayerSP)) { + yOrigin1 -= 0.125D; + } + + this.playerModel.model.glowColor = thePony.glowColor(); + this.playerModel.armor.modelArmorChestplate.isSleeping = this.playerModel.armor.modelArmor.isSleeping = this.playerModel.model.isSleeping = player.isPlayerSleeping(); + this.playerModel.armor.modelArmorChestplate.swingProgress = this.playerModel.armor.modelArmor.swingProgress = this.playerModel.model.swingProgress; + this.playerModel.model.wantTail = thePony.wantTail(); + this.playerModel.armor.modelArmorChestplate.isVillager = this.playerModel.armor.modelArmor.isVillager = this.playerModel.model.isVillager = false; + super.doRender(player, x, yOrigin1, z, yaw, partialTicks); + this.playerModel.armor.modelArmorChestplate.aimedBow = this.playerModel.armor.modelArmor.aimedBow = this.playerModel.model.aimedBow = false; + this.playerModel.armor.modelArmorChestplate.issneak = this.playerModel.armor.modelArmor.issneak = this.playerModel.model.issneak = false; + this.playerModel.armor.modelArmorChestplate.heldItemRight = this.playerModel.armor.modelArmor.heldItemRight = this.playerModel.model.heldItemRight = 0; + } + + @AppendInsns("renderLivingAt") + @Obfuscated({ "a", "func_77039_a" }) + public void setupPlayerScale(AbstractClientPlayer player, double xPosition, double yPosition, double zPosition) { + + if (PonyManager.getInstance().getShowScale() == 1 && !(playerModel.model instanceof pm_Human)) { + if (this.playerModel.model.size == 2) { + scale(0.9F, 0.9F, 0.9F); + } else if (this.playerModel.model.size == 1 || this.playerModel.model.size == 0) { + scale(0.8F, 0.8F, 0.8F); + } + } + } + + public ResourceLocation getEntityTexture(AbstractClientPlayer player) { + Pony thePony = PonyManager.getInstance().getPonyFromResourceRegistry(player); + return thePony.getTextureResourceLocation(); + } + + @Override + public ResourceLocation getEntityTexture(Entity entity) { + return this.getEntityTexture((AbstractClientPlayer) entity); + } + + protected PlayerModel getModel(AbstractClientPlayer player) { + Pony thePony = PonyManager.getInstance().getPonyFromResourceRegistry(player); + return thePony.getModel(); + } + + @Override + public PlayerModel getPony() { + return this.playerModel; + } +} diff --git a/src/main/java/com/minelittlepony/minelp/renderer/RenderPonyMob.java b/src/main/java/com/minelittlepony/minelp/renderer/RenderPonyMob.java new file mode 100644 index 00000000..e22dee43 --- /dev/null +++ b/src/main/java/com/minelittlepony/minelp/renderer/RenderPonyMob.java @@ -0,0 +1,135 @@ +package com.minelittlepony.minelp.renderer; + +import com.minelittlepony.minelp.PonyManager; +import com.minelittlepony.minelp.model.ModelPony; +import com.minelittlepony.minelp.model.PlayerModel; +import com.minelittlepony.minelp.model.pony.pm_newPonyAdv; +import com.minelittlepony.minelp.renderer.layer.LayerHeldPonyItem; +import com.minelittlepony.minelp.renderer.layer.LayerPonyArmor; +import com.minelittlepony.minelp.renderer.layer.LayerPonySkull; + +import net.minecraft.client.renderer.entity.RenderLiving; +import net.minecraft.client.renderer.entity.RenderManager; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLiving; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.monster.EntityPigZombie; +import net.minecraft.entity.monster.EntitySkeleton; +import net.minecraft.item.ItemStack; +import net.minecraft.util.ResourceLocation; + +public abstract class RenderPonyMob extends RenderLiving implements IRenderPony { + protected ModelPony mobModel; + protected PlayerModel playerModel; + + public RenderPonyMob(RenderManager renderManager, PlayerModel playerModel) { + super(renderManager, playerModel.model, playerModel.shadowsize); + this.mobModel = playerModel.model; + this.playerModel = playerModel; + + this.addLayer(new LayerPonyArmor(this)); + this.addLayer(new LayerHeldPonyItem(this)); + // this.addLayer(new LayerArrow(this)); + this.addLayer(new LayerPonySkull(this)); + } + + @Override + public void doRender(EntityLiving entity, double xPosition, double yPosition, double zPosition, float yaw, + float partialTicks) { + ItemStack heldItem = entity.getHeldItem(); + this.playerModel.armor.modelArmorChestplate.heldItemRight = this.playerModel.armor.modelArmor.heldItemRight = this.playerModel.model.heldItemRight = heldItem == null + ? 0 : 1; + if (entity.isChild()) { + this.playerModel.armor.modelArmorChestplate.size = this.playerModel.armor.modelArmor.size = this.playerModel.model.size = 0; + } else { + this.playerModel.armor.modelArmorChestplate.size = this.playerModel.armor.modelArmor.size = this.playerModel.model.size = 1; + } + + this.playerModel.armor.modelArmorChestplate.issneak = this.playerModel.armor.modelArmor.issneak = this.playerModel.model.issneak = false; + this.playerModel.armor.modelArmorChestplate.isFlying = this.playerModel.armor.modelArmor.isFlying = this.playerModel.model.isFlying = false; + this.playerModel.armor.modelArmorChestplate.isPegasus = this.playerModel.armor.modelArmor.isPegasus = this.playerModel.model.isPegasus = false; + if (this.playerModel.model instanceof pm_newPonyAdv) { + ((pm_newPonyAdv) this.playerModel.model).setHasWings_Compression(false); + } + + if (entity instanceof EntitySkeleton) { + this.playerModel.armor.modelArmorChestplate.glowColor = this.playerModel.armor.modelArmor.glowColor = this.playerModel.model.glowColor = 0; + switch (entity.getEntityId() % 3) { + case 0: + this.playerModel.armor.modelArmorChestplate.glowColor = this.playerModel.armor.modelArmor.glowColor = this.playerModel.model.glowColor = -10066211; + case 1: + this.playerModel.armor.modelArmorChestplate.isUnicorn = this.playerModel.armor.modelArmor.isUnicorn = this.playerModel.model.isUnicorn = true; + break; + case 2: + this.playerModel.armor.modelArmorChestplate.isUnicorn = this.playerModel.armor.modelArmor.isUnicorn = this.playerModel.model.isUnicorn = false; + } + } else { + this.playerModel.armor.modelArmorChestplate.isUnicorn = this.playerModel.armor.modelArmor.isUnicorn = this.playerModel.model.isUnicorn = false; + } + + if (entity instanceof EntityPigZombie) { + this.playerModel.armor.modelArmorChestplate.isMale = this.playerModel.armor.modelArmor.isMale = this.playerModel.model.isMale = true; + } else { + this.playerModel.armor.modelArmorChestplate.isMale = this.playerModel.armor.modelArmor.isMale = this.playerModel.model.isMale = false; + } + + if (entity instanceof EntitySkeleton) { + this.playerModel.model.wantTail = 4; + } else { + this.playerModel.model.wantTail = 0; + } + + this.playerModel.armor.modelArmorChestplate.isSleeping = this.playerModel.armor.modelArmor.isSleeping = this.playerModel.model.isSleeping = false; + this.playerModel.model.isVillager = false; + if (PonyManager.getInstance().getShowScale() == 1) { + this.shadowSize = 0.4F; + } + + double yOrigin = yPosition; + if (entity.isSneaking()) { + yOrigin -= 0.125D; + } + + super.doRender(entity, xPosition, yOrigin, zPosition, yaw, partialTicks); + this.playerModel.armor.modelArmorChestplate.aimedBow = this.playerModel.armor.modelArmor.aimedBow = this.playerModel.model.aimedBow = false; + this.playerModel.armor.modelArmorChestplate.issneak = this.playerModel.armor.modelArmor.issneak = this.playerModel.model.issneak = false; + this.playerModel.armor.modelArmorChestplate.heldItemRight = this.playerModel.armor.modelArmor.heldItemRight = this.playerModel.model.heldItemRight = 0; + } + + @SuppressWarnings("unchecked") + @Override + public void doRender(Entity entity, double xPosition, double yPosition, double zPosition, float yaw, + float partialTicks) { + this.doRender((T) entity, xPosition, yPosition, zPosition, yaw, partialTicks); + } + + protected abstract ResourceLocation getEntityTexture(T var1); + + @SuppressWarnings("unchecked") + @Override + protected ResourceLocation getEntityTexture(Entity var1) { + return this.getEntityTexture((T) var1); + } + + protected void preRenderCallback(T t, float partick) {} + + @SuppressWarnings("unchecked") + @Override + protected void preRenderCallback(EntityLivingBase entitylivingbaseIn, float partialTickTime) { + preRenderCallback((T) entitylivingbaseIn, partialTickTime); + } + + protected void rotateCorpse(T entity, float xPosition, float yPosition, float zPosition) {} + + @SuppressWarnings("unchecked") + @Override + protected void rotateCorpse(EntityLivingBase entity, float xPosition, float yPosition, float zPosition) { + this.rotateCorpse((T) entity, xPosition, yPosition, zPosition); + super.rotateCorpse(entity, xPosition, yPosition, zPosition); + } + + @Override + public PlayerModel getPony() { + return playerModel; + } +} diff --git a/src/main/java/com/minelittlepony/minelp/renderer/RenderPonySkeleton.java b/src/main/java/com/minelittlepony/minelp/renderer/RenderPonySkeleton.java new file mode 100644 index 00000000..5dc9158e --- /dev/null +++ b/src/main/java/com/minelittlepony/minelp/renderer/RenderPonySkeleton.java @@ -0,0 +1,43 @@ +package com.minelittlepony.minelp.renderer; + +import org.lwjgl.opengl.GL11; + +import com.minelittlepony.minelp.PonyManager; +import com.minelittlepony.minelp.model.PMAPI; + +import net.minecraft.client.renderer.entity.RenderManager; +import net.minecraft.client.renderer.entity.layers.LayerBipedArmor; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.monster.EntitySkeleton; +import net.minecraft.util.ResourceLocation; + +public class RenderPonySkeleton extends RenderPonyMob { + public RenderPonySkeleton(RenderManager rm) { + super(rm, PMAPI.skeletonPony); + addLayer(new LayerBipedArmor(this) { + @Override + protected void func_177177_a() { + this.field_177189_c = PMAPI.skeletonPony.model; + this.field_177186_d = PMAPI.skeletonPony.model; + } + }); + } + + @Override + protected void preRenderCallback(EntitySkeleton skeleton, float partialTicks) { + if (skeleton.getSkeletonType() == 1) { + GL11.glScalef(1.2F, 1.2F, 1.2F); + } + + } + + protected void a(EntityLivingBase entity, float partialTicks) { + this.preRenderCallback((EntitySkeleton) entity, partialTicks); + } + + @Override + protected ResourceLocation getEntityTexture(EntitySkeleton skeleton) { + return skeleton.getSkeletonType() == 1 ? PonyManager.skeletonWitherPonyResource + : PonyManager.skeletonPonyResource; + } +} diff --git a/src/main/java/com/minelittlepony/minelp/renderer/RenderPonyVillager.java b/src/main/java/com/minelittlepony/minelp/renderer/RenderPonyVillager.java new file mode 100644 index 00000000..77ab6a03 --- /dev/null +++ b/src/main/java/com/minelittlepony/minelp/renderer/RenderPonyVillager.java @@ -0,0 +1,41 @@ +package com.minelittlepony.minelp.renderer; + +import org.lwjgl.opengl.GL11; + +import com.minelittlepony.minelp.Pony; +import com.minelittlepony.minelp.PonyManager; +import com.minelittlepony.minelp.model.PMAPI; + +import net.minecraft.client.renderer.entity.RenderManager; +import net.minecraft.entity.passive.EntityVillager; +import net.minecraft.util.ResourceLocation; + +public class RenderPonyVillager extends RenderPonyMob { + + public RenderPonyVillager(RenderManager rm) { + super(rm, PMAPI.newPonyAdv); + } + + @Override + protected void preRenderCallback(EntityVillager villager, float partialTicks) { + if (villager.getGrowingAge() < 0) { + this.mobModel.size = 0; + this.shadowSize = 0.25F; + } else { + this.mobModel.size = 1; + if (PonyManager.getInstance().getShowScale() == 1) { + this.shadowSize = 0.4F; + } else { + this.shadowSize = 0.5F; + } + } + + GL11.glScalef(0.9375F, 0.9375F, 0.9375F); + } + + @Override + protected ResourceLocation getEntityTexture(EntityVillager villager) { + Pony aVillagerPony = PonyManager.getInstance().getPonyFromResourceRegistry(villager); + return aVillagerPony.getTextureResourceLocation(); + } +} diff --git a/src/main/java/com/minelittlepony/minelp/renderer/RenderPonyZombie.java b/src/main/java/com/minelittlepony/minelp/renderer/RenderPonyZombie.java new file mode 100644 index 00000000..a02a394b --- /dev/null +++ b/src/main/java/com/minelittlepony/minelp/renderer/RenderPonyZombie.java @@ -0,0 +1,31 @@ +package com.minelittlepony.minelp.renderer; + +import com.minelittlepony.minelp.PonyManager; +import com.minelittlepony.minelp.model.PMAPI; + +import net.minecraft.client.renderer.entity.RenderManager; +import net.minecraft.entity.monster.EntityPigZombie; +import net.minecraft.entity.monster.EntityZombie; +import net.minecraft.util.ResourceLocation; + +public class RenderPonyZombie extends RenderPonyMob { + + public RenderPonyZombie(RenderManager rendermanager) { + super(rendermanager, PMAPI.zombiePony); + } + + @Override + protected void rotateCorpse(EntityZombie zombie, float xPosition, float yPosition, float zPosition) { + if (zombie.isConverting()) { + yPosition += (float) (Math.cos(zombie.ticksExisted * 3.25D) * 3.141592653589793D * 0.25D); + } + } + + @Override + protected ResourceLocation getEntityTexture(EntityZombie zombie) { + return zombie instanceof EntityPigZombie ? PonyManager.zombiePigmanPonyResource + : (zombie.isVillager() ? PonyManager.zombieVillagerPonyResource + : PonyManager.zombiePonyResource); + } + +} diff --git a/src/main/java/com/minelittlepony/minelp/renderer/ScalableModelRenderer.java b/src/main/java/com/minelittlepony/minelp/renderer/ScalableModelRenderer.java new file mode 100644 index 00000000..da628a67 --- /dev/null +++ b/src/main/java/com/minelittlepony/minelp/renderer/ScalableModelRenderer.java @@ -0,0 +1,313 @@ +package com.minelittlepony.minelp.renderer; + +import java.util.ArrayList; +import java.util.List; + +import org.lwjgl.opengl.GL11; + +import com.minelittlepony.minelp.model.ScalableModelBox; + +import net.minecraft.client.model.ModelBase; +import net.minecraft.client.model.ModelRenderer; +import net.minecraft.client.model.TextureOffset; +import net.minecraft.client.renderer.GLAllocation; +import net.minecraft.client.renderer.Tessellator; + +public class ScalableModelRenderer extends ModelRenderer { + public float textureWidth; + public float textureHeight; + private int textureOffsetX; + private int textureOffsetY; + public float rotationPointX; + public float rotationPointY; + public float rotationPointZ; + public float rotateAngleX; + public float rotateAngleY; + public float rotateAngleZ; + private boolean compiled; + private int displayList; + public boolean mirror; + public boolean showModel; + public boolean isHidden; + public List cubeList; + public List childModels; + public final String boxName; + private ModelBase baseModel; + public float offsetX; + public float offsetY; + public float offsetZ; + + @SuppressWarnings("unchecked") + public ScalableModelRenderer(ModelBase par1ModelBase, String par2Str) { + super(par1ModelBase); + this.textureWidth = 64.0F; + this.textureHeight = 32.0F; + this.showModel = true; + this.cubeList = new ArrayList(); + this.baseModel = par1ModelBase; + par1ModelBase.boxList.add(this); + this.boxName = par2Str; + this.setTextureSize(par1ModelBase.textureWidth, par1ModelBase.textureHeight); + } + + public ScalableModelRenderer(ModelBase par1ModelBase) { + this(par1ModelBase, (String) null); + } + + public ScalableModelRenderer(ModelBase par1ModelBase, int par2, int par3) { + this(par1ModelBase); + this.setTextureOffset(par2, par3); + } + + public void addChild(ScalableModelRenderer par1ModelRenderer) { + if (this.childModels == null) { + this.childModels = new ArrayList(); + } + + this.childModels.add(par1ModelRenderer); + } + + @Override + public ScalableModelRenderer setTextureOffset(int par1, int par2) { + this.textureOffsetX = par1; + this.textureOffsetY = par2; + return this; + } + + @Override + public ScalableModelRenderer addBox(String par1Str, float par2, float par3, float par4, int par5, int par6, + int par7) { + par1Str = this.boxName + "." + par1Str; + TextureOffset var8 = this.baseModel.getTextureOffset(par1Str); + this.setTextureOffset(var8.textureOffsetX, var8.textureOffsetY); + this.cubeList.add((new ScalableModelBox(this, this.textureOffsetX, this.textureOffsetY, par2, par3, par4, par5, + par6, par7, 0.0F)).func_78244_a(par1Str)); + return this; + } + + @Override + public ScalableModelRenderer addBox(float par1, float par2, float par3, int par4, int par5, int par6) { + this.cubeList.add(new ScalableModelBox(this, this.textureOffsetX, this.textureOffsetY, par1, par2, par3, par4, + par5, par6, 0.0F)); + return this; + } + + @Override + public void addBox(float par1, float par2, float par3, int par4, int par5, int par6, float par7) { + this.cubeList.add(new ScalableModelBox(this, this.textureOffsetX, this.textureOffsetY, par1, par2, par3, par4, + par5, par6, par7)); + } + + @Override + public void setRotationPoint(float par1, float par2, float par3) { + this.rotationPointX = par1; + this.rotationPointY = par2; + this.rotationPointZ = par3; + } + + @Override + public void render(float par1) { + if (!this.isHidden && this.showModel) { + if (!this.compiled) { + this.compileDisplayList(par1); + } + + GL11.glTranslatef(this.offsetX, this.offsetY, this.offsetZ); + int var2; + if (this.rotateAngleX == 0.0F && this.rotateAngleY == 0.0F && this.rotateAngleZ == 0.0F) { + if (this.rotationPointX == 0.0F && this.rotationPointY == 0.0F && this.rotationPointZ == 0.0F) { + GL11.glCallList(this.displayList); + if (this.childModels != null) { + for (var2 = 0; var2 < this.childModels.size(); ++var2) { + this.childModels.get(var2).render(par1); + } + } + } else { + GL11.glTranslatef(this.rotationPointX * par1, this.rotationPointY * par1, + this.rotationPointZ * par1); + GL11.glCallList(this.displayList); + if (this.childModels != null) { + for (var2 = 0; var2 < this.childModels.size(); ++var2) { + this.childModels.get(var2).render(par1); + } + } + + GL11.glTranslatef(-this.rotationPointX * par1, -this.rotationPointY * par1, + -this.rotationPointZ * par1); + } + } else { + GL11.glPushMatrix(); + GL11.glTranslatef(this.rotationPointX * par1, this.rotationPointY * par1, this.rotationPointZ * par1); + if (this.rotateAngleZ != 0.0F) { + GL11.glRotatef(this.rotateAngleZ * 57.295776F, 0.0F, 0.0F, 1.0F); + } + + if (this.rotateAngleY != 0.0F) { + GL11.glRotatef(this.rotateAngleY * 57.295776F, 0.0F, 1.0F, 0.0F); + } + + if (this.rotateAngleX != 0.0F) { + GL11.glRotatef(this.rotateAngleX * 57.295776F, 1.0F, 0.0F, 0.0F); + } + + GL11.glCallList(this.displayList); + if (this.childModels != null) { + for (var2 = 0; var2 < this.childModels.size(); ++var2) { + this.childModels.get(var2).render(par1); + } + } + + GL11.glPopMatrix(); + } + + GL11.glTranslatef(-this.offsetX, -this.offsetY, -this.offsetZ); + } + + } + + public void render(float par1, float scaleX, float scaleY, float scaleZ) { + if (!this.isHidden && this.showModel) { + if (!this.compiled) { + this.compileDisplayList(par1); + } + + GL11.glTranslatef(this.offsetX, this.offsetY, this.offsetZ); + int var2; + if (this.rotateAngleX == 0.0F && this.rotateAngleY == 0.0F && this.rotateAngleZ == 0.0F) { + if (this.rotationPointX == 0.0F && this.rotationPointY == 0.0F && this.rotationPointZ == 0.0F) { + GL11.glPushMatrix(); + GL11.glScalef(scaleX, scaleY, scaleZ); + GL11.glCallList(this.displayList); + if (this.childModels != null) { + for (var2 = 0; var2 < this.childModels.size(); ++var2) { + this.childModels.get(var2).render(par1); + } + } + + GL11.glPopMatrix(); + } else { + GL11.glTranslatef(this.rotationPointX * par1, this.rotationPointY * par1, + this.rotationPointZ * par1); + GL11.glPushMatrix(); + GL11.glScalef(scaleX, scaleY, scaleZ); + GL11.glCallList(this.displayList); + if (this.childModels != null) { + for (var2 = 0; var2 < this.childModels.size(); ++var2) { + this.childModels.get(var2).render(par1); + } + } + + GL11.glPopMatrix(); + GL11.glTranslatef(-this.rotationPointX * par1, -this.rotationPointY * par1, + -this.rotationPointZ * par1); + } + } else { + GL11.glPushMatrix(); + GL11.glTranslatef(this.rotationPointX * par1, this.rotationPointY * par1, this.rotationPointZ * par1); + if (this.rotateAngleZ != 0.0F) { + GL11.glRotatef(this.rotateAngleZ * 57.295776F, 0.0F, 0.0F, 1.0F); + } + + if (this.rotateAngleY != 0.0F) { + GL11.glRotatef(this.rotateAngleY * 57.295776F, 0.0F, 1.0F, 0.0F); + } + + if (this.rotateAngleX != 0.0F) { + GL11.glRotatef(this.rotateAngleX * 57.295776F, 1.0F, 0.0F, 0.0F); + } + + GL11.glPushMatrix(); + GL11.glScalef(scaleX, scaleY, scaleZ); + GL11.glCallList(this.displayList); + if (this.childModels != null) { + for (var2 = 0; var2 < this.childModels.size(); ++var2) { + this.childModels.get(var2).render(par1); + } + } + + GL11.glPopMatrix(); + GL11.glPopMatrix(); + } + + GL11.glTranslatef(-this.offsetX, -this.offsetY, -this.offsetZ); + } + + } + + @Override + public void renderWithRotation(float par1) { + if (!this.isHidden && this.showModel) { + if (!this.compiled) { + this.compileDisplayList(par1); + } + + GL11.glPushMatrix(); + GL11.glTranslatef(this.rotationPointX * par1, this.rotationPointY * par1, this.rotationPointZ * par1); + if (this.rotateAngleY != 0.0F) { + GL11.glRotatef(this.rotateAngleY * 57.295776F, 0.0F, 1.0F, 0.0F); + } + + if (this.rotateAngleX != 0.0F) { + GL11.glRotatef(this.rotateAngleX * 57.295776F, 1.0F, 0.0F, 0.0F); + } + + if (this.rotateAngleZ != 0.0F) { + GL11.glRotatef(this.rotateAngleZ * 57.295776F, 0.0F, 0.0F, 1.0F); + } + + GL11.glCallList(this.displayList); + GL11.glPopMatrix(); + } + + } + + @Override + public void postRender(float par1) { + if (!this.isHidden && this.showModel) { + if (!this.compiled) { + this.compileDisplayList(par1); + } + + if (this.rotateAngleX == 0.0F && this.rotateAngleY == 0.0F && this.rotateAngleZ == 0.0F) { + if (this.rotationPointX != 0.0F || this.rotationPointY != 0.0F || this.rotationPointZ != 0.0F) { + GL11.glTranslatef(this.rotationPointX * par1, this.rotationPointY * par1, + this.rotationPointZ * par1); + } + } else { + GL11.glTranslatef(this.rotationPointX * par1, this.rotationPointY * par1, this.rotationPointZ * par1); + if (this.rotateAngleZ != 0.0F) { + GL11.glRotatef(this.rotateAngleZ * 57.295776F, 0.0F, 0.0F, 1.0F); + } + + if (this.rotateAngleY != 0.0F) { + GL11.glRotatef(this.rotateAngleY * 57.295776F, 0.0F, 1.0F, 0.0F); + } + + if (this.rotateAngleX != 0.0F) { + GL11.glRotatef(this.rotateAngleX * 57.295776F, 1.0F, 0.0F, 0.0F); + } + } + } + + } + + private void compileDisplayList(float par1) { + this.displayList = GLAllocation.generateDisplayLists(1); + GL11.glNewList(this.displayList, 4864); + Tessellator var2 = Tessellator.getInstance(); + + for (int var3 = 0; var3 < this.cubeList.size(); ++var3) { + this.cubeList.get(var3).render(var2, par1); + } + + GL11.glEndList(); + this.compiled = true; + } + + @Override + public ScalableModelRenderer setTextureSize(int par1, int par2) { + this.textureWidth = par1; + this.textureHeight = par2; + return this; + } +} diff --git a/src/main/java/com/minelittlepony/minelp/renderer/layer/LayerHeldPonyItem.java b/src/main/java/com/minelittlepony/minelp/renderer/layer/LayerHeldPonyItem.java new file mode 100644 index 00000000..0b976c52 --- /dev/null +++ b/src/main/java/com/minelittlepony/minelp/renderer/layer/LayerHeldPonyItem.java @@ -0,0 +1,31 @@ +package com.minelittlepony.minelp.renderer.layer; + +import com.minelittlepony.minelp.model.ModelPony; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.entity.RendererLivingEntity; +import net.minecraft.client.renderer.entity.layers.LayerRenderer; +import net.minecraft.entity.EntityLivingBase; + +public class LayerHeldPonyItem implements LayerRenderer { + + private final RendererLivingEntity livingPonyEntity; + + public LayerHeldPonyItem(RendererLivingEntity livingPony) { + this.livingPonyEntity = livingPony; + } + + @Override + public void doRenderLayer(EntityLivingBase entitylivingbaseIn, float p_177141_2_, float p_177141_3_, + float partialTicks, float p_177141_5_, float p_177141_6_, float p_177141_7_, float scale) { + ModelPony pony = (ModelPony) livingPonyEntity.getMainModel(); + Minecraft mc = Minecraft.getMinecraft(); + pony.renderDrop(mc.getRenderManager(), mc.getItemRenderer(), entitylivingbaseIn); + } + + @Override + public boolean shouldCombineTextures() { + return false; + } + +} diff --git a/src/main/java/com/minelittlepony/minelp/renderer/layer/LayerPonyArmor.java b/src/main/java/com/minelittlepony/minelp/renderer/layer/LayerPonyArmor.java new file mode 100644 index 00000000..dbee2f40 --- /dev/null +++ b/src/main/java/com/minelittlepony/minelp/renderer/layer/LayerPonyArmor.java @@ -0,0 +1,295 @@ +package com.minelittlepony.minelp.renderer.layer; + +import java.io.IOException; +import java.util.HashSet; +import java.util.Map; + +import com.google.common.collect.Maps; +import com.minelittlepony.minelp.PonyManager; +import com.minelittlepony.minelp.model.ModelPony; +import com.minelittlepony.minelp.model.PlayerModel; +import com.minelittlepony.minelp.model.pony.pm_Human; +import com.minelittlepony.minelp.model.pony.pm_newPonyAdv; +import com.minelittlepony.minelp.model.pony.armor.pm_newPonyArmor; +import com.minelittlepony.minelp.renderer.IRenderPony; +import com.minelittlepony.minelp.util.MineLPReflection; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.model.ModelBase; +import net.minecraft.client.model.ModelRenderer; +import net.minecraft.client.renderer.GlStateManager; +import net.minecraft.client.renderer.entity.RendererLivingEntity; +import net.minecraft.client.renderer.entity.layers.LayerBipedArmor; +import net.minecraft.client.renderer.entity.layers.LayerRenderer; +import net.minecraft.client.renderer.texture.TextureUtil; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.item.ItemArmor; +import net.minecraft.item.ItemArmor.ArmorMaterial; +import net.minecraft.item.ItemStack; +import net.minecraft.util.ResourceLocation; + +public class LayerPonyArmor implements LayerRenderer { + + private static final ResourceLocation ENCHANTED_ITEM_GLINT_RES = new ResourceLocation( + "textures/misc/enchanted_item_glint.png"); + + private static final Map field_110859_k = Maps.newHashMap(); + private static final Map ponyArmorMap = Maps.newHashMap(); + private static final Map onlyPonyArmorMap = Maps.newHashMap(); + private static final String[] bipedArmorFilenamePrefix = { "leather", "chainmail", "iron", "gold", "diamond" }; + + private static HashSet ponyArmors = new HashSet(); + + private RendererLivingEntity renderer; + private LayerBipedArmor humanArmor; + private PlayerModel pony; + + public LayerPonyArmor(RendererLivingEntity entity) { + this.renderer = entity; + this.humanArmor = new LayerBipedArmor(entity); + } + + @Override + public void doRenderLayer(EntityLivingBase entitylivingbaseIn, float p_177141_2_, float p_177141_3_, + float partialTicks, float p_177141_5_, float p_177141_6_, float p_177141_7_, float scale) { + pony = ((IRenderPony) renderer).getPony(); + if (pony.model instanceof pm_Human) { + humanArmor.doRenderLayer(entitylivingbaseIn, p_177141_2_, p_177141_3_, partialTicks, p_177141_5_, + p_177141_6_, p_177141_7_, scale); + } else { + renderArmor(entitylivingbaseIn, p_177141_2_, p_177141_3_, partialTicks, p_177141_5_, p_177141_6_, + p_177141_7_, scale, 4); + renderArmor(entitylivingbaseIn, p_177141_2_, p_177141_3_, partialTicks, p_177141_5_, p_177141_6_, + p_177141_7_, scale, 3); + renderArmor(entitylivingbaseIn, p_177141_2_, p_177141_3_, partialTicks, p_177141_5_, p_177141_6_, + p_177141_7_, scale, 2); + renderArmor(entitylivingbaseIn, p_177141_2_, p_177141_3_, partialTicks, p_177141_5_, p_177141_6_, + p_177141_7_, scale, 1); + } + } + + private void renderArmor(EntityLivingBase entitylivingbaseIn, float p_177141_2_, float p_177141_3_, + float partialTicks, float p_177141_5_, float p_177141_6_, float p_177141_7_, float scale, int armorSlot) { + ItemStack itemstack = entitylivingbaseIn.getCurrentArmor(armorSlot - 1); + + if (itemstack != null && itemstack.getItem() instanceof ItemArmor) { + ItemArmor itemarmor = (ItemArmor) itemstack.getItem(); + + ModelPony modelbase = armorSlot > 2 ? pony.armor.modelArmorChestplate : pony.armor.modelArmor; + modelbase.setModelAttributes(this.renderer.getMainModel()); + modelbase.setLivingAnimations(entitylivingbaseIn, p_177141_2_, p_177141_3_, partialTicks); + prepareToRender((pm_newPonyArmor) modelbase, armorSlot); + this.bindPonyArmorTexture(itemarmor, armorSlot, null); + if (itemarmor.getArmorMaterial() == ArmorMaterial.LEATHER) { + int j = itemarmor.getColor(itemstack); + float f7 = (j >> 16 & 255) / 255.0F; + float f8 = (j >> 8 & 255) / 255.0F; + float f9 = (j & 255) / 255.0F; + GlStateManager.color(f7, f8, f9, 1); + modelbase.render(entitylivingbaseIn, p_177141_2_, p_177141_3_, p_177141_5_, p_177141_6_, p_177141_7_, + scale); + + bindPonyArmorTexture(itemarmor, armorSlot, "overlay"); + } + GlStateManager.color(1, 1, 1, 1); + modelbase.render(entitylivingbaseIn, p_177141_2_, p_177141_3_, p_177141_5_, p_177141_6_, p_177141_7_, + scale); + + if (itemstack.isItemEnchanted()) { + this.renderEnchantment(entitylivingbaseIn, modelbase, p_177141_2_, p_177141_3_, partialTicks, + p_177141_5_, p_177141_6_, p_177141_7_, scale); + } + } + } + + private void prepareToRender(pm_newPonyArmor model, int slot) { + model.setInvisible(false); + + switch (slot) { + // feet + case 1: + model.bipedRightArm.showModel = true; + model.bipedLeftArm.showModel = true; + for (ModelRenderer m : model.extLegs) { + m.showModel = true; + } + model.bipedRightLeg.showModel = true; + model.bipedLeftLeg.showModel = true; + break; + // legs + case 2: + model.bipedRightLeg.showModel = true; + model.bipedLeftLeg.showModel = true; + model.bipedRightArm.showModel = true; + model.bipedLeftArm.showModel = true; + model.Bodypiece.showModel = true; + model.extBody.showModel = true; + model.bipedBody.showModel = true; + break; + // chest + case 3: + model.bipedRightLeg.showModel = true; + model.bipedLeftLeg.showModel = true; + model.bipedRightArm.showModel = true; + model.bipedLeftArm.showModel = true; + model.extBody.showModel = true; + break; + // head + case 4: + model.bipedHead.showModel = true; + for (ModelRenderer m : model.extHead) { + m.showModel = true; + } + } + } + + private void renderEnchantment(EntityLivingBase entitylivingbaseIn, ModelBase modelbaseIn, float p_177183_3_, + float p_177183_4_, float p_177183_5_, float p_177183_6_, float p_177183_7_, float p_177183_8_, + float p_177183_9_) { + float f7 = entitylivingbaseIn.ticksExisted + p_177183_5_; + this.renderer.bindTexture(ENCHANTED_ITEM_GLINT_RES); + GlStateManager.enableBlend(); + GlStateManager.depthFunc(514); + GlStateManager.depthMask(false); + float f8 = 0.5F; + GlStateManager.color(f8, f8, f8, 1.0F); + + for (int i = 0; i < 2; ++i) { + GlStateManager.disableLighting(); + GlStateManager.blendFunc(768, 1); + float f9 = 0.76F; + GlStateManager.color(0.5F * f9, 0.25F * f9, 0.8F * f9, 1.0F); + GlStateManager.matrixMode(5890); + GlStateManager.loadIdentity(); + float f10 = 0.33333334F; + GlStateManager.scale(f10, f10, f10); + GlStateManager.rotate(30.0F - i * 60.0F, 0.0F, 0.0F, 1.0F); + GlStateManager.translate(0.0F, f7 * (0.001F + i * 0.003F) * 20.0F, 0.0F); + GlStateManager.matrixMode(5888); + modelbaseIn.render(entitylivingbaseIn, p_177183_3_, p_177183_4_, p_177183_6_, p_177183_7_, p_177183_8_, + p_177183_9_); + } + + GlStateManager.matrixMode(5890); + GlStateManager.loadIdentity(); + GlStateManager.matrixMode(5888); + GlStateManager.enableLighting(); + GlStateManager.depthMask(true); + GlStateManager.depthFunc(515); + GlStateManager.disableBlend(); + } + + @Override + public boolean shouldCombineTextures() { + return false; + } + + protected boolean bindPonyArmorTexture(ItemArmor armorPiece, int slot, String overlay) { + String overlayText = ""; + if (overlay != null) { + overlayText = String.format("_%s", overlay); + } + + String path = this.pony.armor.path + + bipedArmorFilenamePrefix[armorPiece.getArmorMaterial().ordinal()] + + "_layer_" + this.pony.armor.subimage(slot) + overlayText + ".png"; + if (PonyManager.getInstance().getPonyArmor() == 1 && this.pony.model instanceof pm_newPonyAdv) { + Object[] armorResourceAndState = this.getPonyResourceLocation(path); + renderer.bindTexture((ResourceLocation) armorResourceAndState[0]); + return ((Boolean) armorResourceAndState[1]).booleanValue(); + } else { + // this.a(RenderBiped.func_110858_a(armorPiece., slot, overlay)); + return false; + } + } + + protected boolean bindForgeArmorTexture(Entity playerEntity, ItemStack armorStack, ItemArmor armorPiece, int slot, + String overlay) { + String path = ""; + + try { + path = String.format("textures/models/armor/%s_layer_%d%s.png", + bipedArmorFilenamePrefix[armorPiece.renderIndex], + Integer.valueOf(slot == 2 ? 2 : 1), + overlay == null ? "" : String.format("_%s", overlay)); + } catch (ArrayIndexOutOfBoundsException var10) {} + + path = (String) MineLPReflection.forgeAPI.invokeMethod("ForgeHooksClient.getArmorTexture", (Object) null, + playerEntity, armorStack, path, Integer.valueOf(slot), overlay); + boolean ponyArmor; + if (ponyArmors.contains(path)) { + ponyArmor = this.bindPonyArmorTexture(armorPiece, slot, overlay); + } else { + ponyArmor = false; + ResourceLocation forgeResourceLocation; + if (PonyManager.getInstance().getPonyArmor() == 1 && this.pony.model instanceof pm_newPonyAdv) { + Object[] armorResourceAndState = this.getPonyResourceLocation(path); + forgeResourceLocation = (ResourceLocation) armorResourceAndState[0]; + ponyArmor = ((Boolean) armorResourceAndState[1]).booleanValue(); + } else { + forgeResourceLocation = field_110859_k.get(path); + if (forgeResourceLocation == null) { + forgeResourceLocation = new ResourceLocation(path); + field_110859_k.put(path, forgeResourceLocation); + } + + ponyArmor = false; + } + + renderer.bindTexture(forgeResourceLocation); + } + + return ponyArmor; + } + + protected Object[] getPonyResourceLocation(String path) { + boolean ponyArmor = false; + String ponyPath = path.replace(".png", "_pony.png"); + ResourceLocation ponyResourceLocation = ponyArmorMap.get(path); + if (ponyResourceLocation == null) { + ResourceLocation ponyArmorResource = new ResourceLocation(ponyPath); + + try { + TextureUtil.readImageData(Minecraft.getMinecraft().getResourceManager(), ponyArmorResource); + if (ponyArmorResource != null) { + ponyResourceLocation = ponyArmorResource; + ponyArmorMap.put(path, ponyArmorResource); + onlyPonyArmorMap.put(path, ponyArmorResource); + ponyArmor = true; + } + } catch (IOException var7) { + ponyResourceLocation = field_110859_k.get(path); + if (ponyResourceLocation == null) { + ponyResourceLocation = new ResourceLocation(path); + field_110859_k.put(path, ponyResourceLocation); + } + + ponyArmorMap.put(path, ponyResourceLocation); + ponyArmor = false; + } + } else { + ponyArmor = true; + ponyResourceLocation = onlyPonyArmorMap.get(path); + if (ponyResourceLocation == null) { + ponyResourceLocation = ponyArmorMap.get(path); + ponyArmor = false; + } + } + + return new Object[] { ponyResourceLocation, Boolean.valueOf(ponyArmor) }; + } + + static { + MineLPReflection.preCall(); + + for (int i = 1; i <= 2; ++i) { + for (String prefix : bipedArmorFilenamePrefix) { + ponyArmors.add("textures/models/armor/" + prefix + "_layer_" + i + ".png"); + } + } + + ponyArmors.add("textures/models/armor/leather_layer_1_overlay.png"); + ponyArmors.add("textures/models/armor/leather_layer_2_overlay.png"); + } +} diff --git a/src/main/java/com/minelittlepony/minelp/renderer/layer/LayerPonyCape.java b/src/main/java/com/minelittlepony/minelp/renderer/layer/LayerPonyCape.java new file mode 100644 index 00000000..6ece77a3 --- /dev/null +++ b/src/main/java/com/minelittlepony/minelp/renderer/layer/LayerPonyCape.java @@ -0,0 +1,29 @@ +package com.minelittlepony.minelp.renderer.layer; + +import com.minelittlepony.minelp.model.ModelPony; + +import net.minecraft.client.renderer.entity.RendererLivingEntity; +import net.minecraft.client.renderer.entity.layers.LayerRenderer; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; + +public class LayerPonyCape implements LayerRenderer { + + private RendererLivingEntity renderer; + + public LayerPonyCape(RendererLivingEntity entity) { + renderer = entity; + } + + @Override + public void doRenderLayer(EntityLivingBase entitylivingbaseIn, float p_177141_2_, float p_177141_3_, + float partialTicks, float p_177141_5_, float p_177141_6_, float p_177141_7_, float scale) { + ((ModelPony) renderer.getMainModel()).renderCloak((EntityPlayer) entitylivingbaseIn, partialTicks); + } + + @Override + public boolean shouldCombineTextures() { + return false; + } + +} diff --git a/src/main/java/com/minelittlepony/minelp/renderer/layer/LayerPonySkull.java b/src/main/java/com/minelittlepony/minelp/renderer/layer/LayerPonySkull.java new file mode 100644 index 00000000..211a716d --- /dev/null +++ b/src/main/java/com/minelittlepony/minelp/renderer/layer/LayerPonySkull.java @@ -0,0 +1,117 @@ +package com.minelittlepony.minelp.renderer.layer; + +import static net.minecraft.client.renderer.GlStateManager.*; + +import com.minelittlepony.minelp.model.ModelPony; +import com.minelittlepony.minelp.model.PlayerModel; +import com.minelittlepony.minelp.model.pony.pm_newPonyAdv; +import com.minelittlepony.minelp.renderer.IRenderPony; +import com.mojang.authlib.GameProfile; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.block.model.ItemCameraTransforms.TransformType; +import net.minecraft.client.renderer.entity.RendererLivingEntity; +import net.minecraft.client.renderer.entity.layers.LayerRenderer; +import net.minecraft.client.renderer.tileentity.TileEntitySkullRenderer; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.monster.EntityZombie; +import net.minecraft.entity.passive.EntityVillager; +import net.minecraft.init.Items; +import net.minecraft.item.Item; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTUtil; +import net.minecraft.tileentity.TileEntitySkull; +import net.minecraft.util.EnumFacing; + +public class LayerPonySkull implements LayerRenderer { + + private RendererLivingEntity renderer; + + public LayerPonySkull(RendererLivingEntity renderPony) { + this.renderer = renderPony; + } + + @Override + public void doRenderLayer(EntityLivingBase entity, float p_177141_2_, float p_177141_3_, + float partialTicks, float p_177141_5_, float p_177141_6_, float p_177141_7_, float scale) { + ItemStack itemstack = entity.getCurrentArmor(3); + if (itemstack != null && itemstack.getItem() != null) { + ModelPony model = getModel().model; + Item item = itemstack.getItem(); + + pushMatrix(); + boolean isVillager = entity instanceof EntityVillager + || entity instanceof EntityZombie && ((EntityZombie) entity).isVillager(); + if (!isVillager && entity.isChild()) { + scale(0.7, 0.7, 0.7); + } + if (model instanceof pm_newPonyAdv) { + if (model.size == 0) { + translate(0.0F, 0.76F, 0.0F); + scale(0.9, 0.9, 0.9); + } + } + model.bipedHead.postRender(0.0625f); + if (model instanceof pm_newPonyAdv) { + translate(0, .2, 0); + } + color(1, 1, 1, 1); + if (item instanceof ItemBlock) { + renderBlock(entity, itemstack, isVillager); + } else if (item == Items.skull) { + if (model instanceof pm_newPonyAdv) { + translate(0, 0, -.15); + } + renderSkull(itemstack, isVillager); + } + popMatrix(); + } + + } + + private void renderBlock(EntityLivingBase entity, ItemStack itemstack, boolean isVillager) { + // translate(0, -0.25, 0); + rotate(180, 0, 1, 0); + scale(0.625, -0.625, -0.625); + translate(0, 0.4, -0.21); + + Minecraft.getMinecraft().getItemRenderer().renderItem(entity, itemstack, TransformType.HEAD); + } + + private void renderSkull(ItemStack itemstack, boolean isVillager) { + float f = 1.1875f; + scale(f, -f, -f); + if (isVillager) { + translate(0, 0.0625, 0); + } + translate(0, 0, -.05f); + GameProfile profile = null; + + if (itemstack.hasTagCompound()) { + NBTTagCompound nbt = itemstack.getTagCompound(); + + if (nbt.hasKey("SkullOwner", 10)) { + profile = NBTUtil.readGameProfileFromNBT(nbt.getCompoundTag("SkullOwner")); + } else if (nbt.hasKey("SkullOwner", 8)) { + profile = TileEntitySkull.updateGameprofile(new GameProfile(null, nbt.getString("SkullOwner"))); + nbt.setTag("SkullOwner", NBTUtil.writeGameProfile(new NBTTagCompound(), profile)); + } + } + + TileEntitySkullRenderer.instance.renderSkull(-0.5F, 0.0F, -0.45F, EnumFacing.UP, 180.0F, + itemstack.getMetadata(), profile, -1); + + } + + private PlayerModel getModel() { + return ((IRenderPony) renderer).getPony(); + } + + @Override + public boolean shouldCombineTextures() { + return true; + } + +} diff --git a/src/main/java/com/minelittlepony/minelp/transformers/RenderPlayerTransformer.java b/src/main/java/com/minelittlepony/minelp/transformers/RenderPlayerTransformer.java new file mode 100644 index 00000000..5d69ee4a --- /dev/null +++ b/src/main/java/com/minelittlepony/minelp/transformers/RenderPlayerTransformer.java @@ -0,0 +1,12 @@ +package com.minelittlepony.minelp.transformers; + +import com.mumfrey.liteloader.transformers.ClassOverlayTransformer; + +public class RenderPlayerTransformer extends ClassOverlayTransformer { + + private static final String overlayClassName = "com.minelittlepony.minelp.renderer.RenderPony"; + + public RenderPlayerTransformer() { + super(overlayClassName); + } +} diff --git a/src/main/java/com/minelittlepony/minelp/util/MineLPLogger.java b/src/main/java/com/minelittlepony/minelp/util/MineLPLogger.java new file mode 100644 index 00000000..2ae0c454 --- /dev/null +++ b/src/main/java/com/minelittlepony/minelp/util/MineLPLogger.java @@ -0,0 +1,75 @@ +package com.minelittlepony.minelp.util; + +import com.mumfrey.liteloader.util.log.LiteLoaderLogger; +import org.apache.logging.log4j.Level; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +public class MineLPLogger { + private static Logger logger = LogManager.getLogger("MineLittlePony"); + + public static Logger getLogger() { + return logger; + } + + private static void log(Level level, String format, Object... data) { + logger.log(level, "MineLittlePony> " + String.format(format, data)); + } + + private static void log(Level level, Throwable t, String format, Object... data) { + logger.log(level, "MineLittlePony> " + String.format(format, data), t); + } + + public static void info(String message) { + log(Level.INFO, message, new Object[0]); + } + + public static void info(String message, Object... data) { + log(Level.INFO, message, data); + } + + public static void debug(String message) { + if(LiteLoaderLogger.DEBUG) { + log(Level.INFO, message, new Object[0]); + } + + } + + public static void debug(String message, Object... data) { + if(LiteLoaderLogger.DEBUG) { + log(Level.INFO, message, data); + } + + } + + public static void debug(Throwable t, String message, Object... data) { + if(LiteLoaderLogger.DEBUG) { + log(Level.INFO, message, new Object[]{data, t}); + } + + } + + public static void warn(String message) { + log(Level.WARN, message, new Object[0]); + } + + public static void warn(String message, Object... data) { + log(Level.WARN, message, data); + } + + public static void warn(Throwable t, String message, Object... data) { + log(Level.WARN, t, message, data); + } + + public static void error(String message) { + log(Level.ERROR, message, new Object[0]); + } + + public static void error(String message, Object... data) { + log(Level.ERROR, message, data); + } + + public static void error(Throwable t, String message, Object... data) { + log(Level.ERROR, t, message, data); + } +} diff --git a/src/main/java/com/minelittlepony/minelp/util/MineLPObf.java b/src/main/java/com/minelittlepony/minelp/util/MineLPObf.java new file mode 100644 index 00000000..dcb2075f --- /dev/null +++ b/src/main/java/com/minelittlepony/minelp/util/MineLPObf.java @@ -0,0 +1,17 @@ +package com.minelittlepony.minelp.util; + +import com.mumfrey.liteloader.core.runtime.Obf; + +public class MineLPObf extends Obf { + + public static final MineLPObf isJumping = new MineLPObf("field_70703_bu", "aW", "isJumping"); + public static final MineLPObf ARMOR_TEXTURE_RES_MAP = new MineLPObf("field_177191_j", "j", "ARMOR_TEXTURE_RES_MAP"); + + protected MineLPObf(String seargeName, String obfName, String mcpName) { + super(seargeName, obfName, mcpName); + } + + protected MineLPObf(String seargeName, String obfName) { + super(seargeName, obfName, seargeName); + } +} diff --git a/src/main/java/com/minelittlepony/minelp/util/MineLPPrivateFields.java b/src/main/java/com/minelittlepony/minelp/util/MineLPPrivateFields.java new file mode 100644 index 00000000..3eded698 --- /dev/null +++ b/src/main/java/com/minelittlepony/minelp/util/MineLPPrivateFields.java @@ -0,0 +1,22 @@ +package com.minelittlepony.minelp.util; + +import java.util.Map; + +import com.mumfrey.liteloader.core.runtime.Obf; +import com.mumfrey.liteloader.util.PrivateFields; + +import net.minecraft.client.renderer.entity.layers.LayerArmorBase; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.util.ResourceLocation; + +public class MineLPPrivateFields extends PrivateFields { + public static final MineLPPrivateFields isJumping = new MineLPPrivateFields( + EntityLivingBase.class, MineLPObf.isJumping); + public static final MineLPPrivateFields> ARMOR_TEXTURE_RES_MAP = new MineLPPrivateFields>( + LayerArmorBase.class, MineLPObf.ARMOR_TEXTURE_RES_MAP); + + protected MineLPPrivateFields(Class

owner, Obf obf) { + super(owner, obf); + } + +} diff --git a/src/main/java/com/minelittlepony/minelp/util/MineLPRData.java b/src/main/java/com/minelittlepony/minelp/util/MineLPRData.java new file mode 100644 index 00000000..8c6ce99a --- /dev/null +++ b/src/main/java/com/minelittlepony/minelp/util/MineLPRData.java @@ -0,0 +1,210 @@ +package com.minelittlepony.minelp.util; + +import com.minelittlepony.minelp.util.MineLPLogger; +import com.minelittlepony.minelp.util.MineLPReflection; +import java.lang.reflect.Constructor; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; + +public class MineLPRData { + public boolean installed = false; + public boolean compatible = false; + public HashMap> classes = new HashMap>(); + public HashMap> constructors = new HashMap>(); + public HashMap methods = new HashMap(); + public HashMap fields = new HashMap(); + public HashMap objects = new HashMap(); + + public Object getInstance(String constructorName, Object... params) { + try { + if (this.constructors.containsKey(constructorName)) { + Constructor e = this.constructors.get(constructorName); + if (params != null && params.length != 0) { + return e.newInstance(params); + } + + return e.newInstance(new Object[0]); + } + + MineLPLogger.error("Unknown requested constructor \"%s\"", new Object[] { constructorName }); + } catch (Exception var4) { + var4.printStackTrace(); + MineLPLogger.error("Error when trying to get constructor \"%s\"", new Object[] { constructorName }); + } + + return null; + } + + public boolean isInstance(String className, Object object) { + return this.getClass(className).isInstance(object); + } + + public Object getField(String fieldName, Object object) { + try { + if (this.fields.containsKey(fieldName)) { + Field e = this.fields.get(fieldName); + return e.get(object); + } + + MineLPLogger.error("Unknown requested field \"%s\"", new Object[] { fieldName }); + } catch (Exception var4) { + var4.printStackTrace(); + MineLPLogger.error("Error when trying to get field \"%s\"", new Object[] { fieldName }); + } + + return null; + } + + public boolean setField(String fieldName, Object object, Object value) { + try { + if (this.fields.containsKey(fieldName)) { + Field e = this.fields.get(fieldName); + e.set(object, value); + return true; + } else { + MineLPLogger.error("Unknown requested field \"%s\"", new Object[] { fieldName }); + return false; + } + } catch (Exception var5) { + var5.printStackTrace(); + MineLPLogger.error("Error when trying to set field \"%s\"", new Object[] { fieldName }); + return false; + } + } + + public Object invokeMethod(String methodName, Object object, Object... params) { + try { + if (this.methods.containsKey(methodName)) { + Method e = this.methods.get(methodName); + return params != null ? e.invoke(object, params) : e.invoke(object, new Object[0]); + } else { + MineLPLogger.error("Unknown requested method \"%s\"", new Object[] { methodName }); + return null; + } + } catch (Exception var5) { + var5.printStackTrace(); + MineLPLogger.error("Method \"%s\" failed to be invoked", new Object[] { methodName }); + MineLPLogger.error( + "Types: " + MineLPReflection.getStringFromTypes(MineLPReflection.getTypesFromObjects(params))); + MineLPLogger.error("Values: " + params.toString()); + return null; + } + } + + public Class getClass(String className) { + return this.classes.containsKey(className) ? (Class) this.classes.get(className) : null; + } + + public Constructor getConstructor(String constructorName) { + return this.constructors.containsKey(constructorName) ? (Constructor) this.constructors.get(constructorName) + : null; + } + + public Method getMethod(String methodName) { + return this.methods.containsKey(methodName) ? (Method) this.methods.get(methodName) : null; + } + + public Field getField(String fieldName) { + return this.fields.containsKey(fieldName) ? (Field) this.fields.get(fieldName) : null; + } + + public Object getObject(String objectName) { + Object object = null; + if (this.objects.containsKey(objectName)) { + object = this.objects.get(objectName); + } + + if (object == null) { + MineLPLogger.error("Object \"%s\" is NULL", new Object[] { objectName }); + } + + return object; + } + + public void putClass(String className, Class clazz) { + this.classes.put(className, clazz); + } + + public void putConstructor(String constructorName, Constructor constructor) { + this.constructors.put(constructorName, constructor); + } + + public void putMethod(String methodName, Method method) { + this.methods.put(methodName, method); + } + + public void putField(String fieldName, Field field) { + this.fields.put(fieldName, field); + } + + public void putObject(String objectName, Object object) { + this.objects.put(objectName, object); + } + + public void removeClass(String className) { + this.classes.remove(className); + } + + public void removeConstructor(String constructorName) { + this.constructors.remove(constructorName); + } + + public void removeMethod(String methodName) { + this.methods.remove(methodName); + } + + public void removeField(String fieldName) { + this.fields.remove(fieldName); + } + + public void removeObject(String objectName) { + this.objects.remove(objectName); + } + + public boolean hasClass(String className) { + return this.classes.containsKey(className); + } + + public boolean hasConstructor(String constructorName) { + return this.constructors.containsKey(constructorName); + } + + public boolean hasMethod(String methodName) { + return this.methods.containsKey(methodName); + } + + public boolean hasField(String fieldName) { + return this.fields.containsKey(fieldName); + } + + public boolean hasObject(String objectName) { + return this.objects.containsKey(objectName); + } + + public boolean removeNullData() { + boolean nullDataPresent = false; + nullDataPresent |= this.removeNullData(this.classes); + nullDataPresent |= this.removeNullData(this.constructors); + nullDataPresent |= this.removeNullData(this.methods); + nullDataPresent |= this.removeNullData(this.fields); + return nullDataPresent; + } + + private boolean removeNullData(Map map) { + // boolean nullDataPresent = false; + Iterator var3 = map.keySet().iterator(); + + while (var3.hasNext()) { + Object key = var3.next(); + if (map.get(key) == null) { + this.constructors.remove(key); + // nullDataPresent = true; + } + } + + return false; + } +} diff --git a/src/main/java/com/minelittlepony/minelp/util/MineLPReflection.java b/src/main/java/com/minelittlepony/minelp/util/MineLPReflection.java new file mode 100644 index 00000000..ac257371 --- /dev/null +++ b/src/main/java/com/minelittlepony/minelp/util/MineLPReflection.java @@ -0,0 +1,508 @@ +package com.minelittlepony.minelp.util; + +import com.minelittlepony.minelp.util.MineLPLogger; +import com.minelittlepony.minelp.util.MineLPRData; +import java.lang.reflect.Constructor; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; +import net.minecraft.client.Minecraft; +import net.minecraft.client.model.ModelBiped; +import net.minecraft.client.renderer.RenderGlobal; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.renderer.entity.RenderBiped; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.MovingObjectPosition; + +public class MineLPReflection { + public static MineLPRData forgeAPI; + + public static void preCall() {} + + private static boolean reflectForgeAPI(MineLPRData data) { + MineLPLogger.info("Checking ForgeAPI..."); + Class forgeAPIIItemRendererItemRenderType; + Class forgeAPIIItemRendererItemRendererHelper; + Class forgeAPIIItemRenderer; + Class forgeAPIMinecraftForgeClient; + Class forgeAPIForgeHooksClient; + Class[] reflectedForgeAPIClasses = new Class[] { + forgeAPIIItemRendererItemRenderType = getClass( + "net.minecraftforge.client.IItemRenderer$ItemRenderType"), + forgeAPIIItemRendererItemRendererHelper = getClass( + "net.minecraftforge.client.IItemRenderer$ItemRendererHelper"), + forgeAPIIItemRenderer = getClass("net.minecraftforge.client.IItemRenderer"), + forgeAPIMinecraftForgeClient = getClass("net.minecraftforge.client.MinecraftForgeClient"), + forgeAPIForgeHooksClient = getClass("net.minecraftforge.client.ForgeHooksClient"), + getClass("net.minecraft.src.RenderBiped") }; + data.installed = false; + int var9 = reflectedForgeAPIClasses.length; + byte o = 0; + if (o < var9) { + Class enumConstants = reflectedForgeAPIClasses[o]; + if (enumConstants == null) { + return false; + } + + data.installed = true; + } + + data.putClass("ForgeHooksClient", forgeAPIForgeHooksClient); + data.putClass("IItemRenderer", forgeAPIIItemRenderer); + data.putClass("MinecraftForgeClient", forgeAPIMinecraftForgeClient); + data.putClass("IItemRenderer$ItemRenderType", forgeAPIIItemRendererItemRenderType); + data.putClass("IItemRenderer$ItemRendererHelper", forgeAPIIItemRendererItemRendererHelper); + Method m; + data.putMethod("ForgeHooksClient.getArmorModel", m = getMethod(forgeAPIForgeHooksClient, "getArmorModel", + new Class[] { EntityLivingBase.class, ItemStack.class, Integer.TYPE, ModelBiped.class })); + if (m == null) { + return false; + } else { + MineLPLogger.debug("ForgeAPI Method " + stringMethod(m)); + data.putMethod("ForgeHooksClient.getArmorTexture", + m = getMethod(forgeAPIForgeHooksClient, "getArmorTexture", + new Class[] { Entity.class, ItemStack.class, String.class, Integer.TYPE, String.class })); + if (m == null) { + return false; + } else { + MineLPLogger.debug("ForgeAPI Method " + stringMethod(m)); + data.putMethod("ForgeHooksClient.orientBedCamera", m = getMethod(forgeAPIForgeHooksClient, + "orientBedCamera", new Class[] { Minecraft.class, EntityLivingBase.class })); + if (m == null) { + return false; + } else { + MineLPLogger.debug("ForgeAPI Method " + stringMethod(m)); + data.putMethod("ForgeHooksClient.setRenderPass", + m = getMethod(forgeAPIForgeHooksClient, "setRenderPass", new Class[] { Integer.TYPE })); + if (m == null) { + return false; + } else { + MineLPLogger.debug("ForgeAPI Method " + stringMethod(m)); + data.putMethod("ForgeHooksClient.onDrawBlockHighlight", + m = getMethod(forgeAPIForgeHooksClient, "onDrawBlockHighlight", + new Class[] { RenderGlobal.class, EntityPlayer.class, + MovingObjectPosition.class, Integer.TYPE, ItemStack.class, + Float.TYPE })); + if (m == null) { + return false; + } else { + MineLPLogger.debug("ForgeAPI Method " + stringMethod(m)); + data.putMethod("ForgeHooksClient.dispatchRenderLast", + m = getMethod(forgeAPIForgeHooksClient, "dispatchRenderLast", + new Class[] { RenderGlobal.class, Float.TYPE })); + if (m == null) { + return false; + } else { + MineLPLogger.debug("ForgeAPI Method " + stringMethod(m)); + data.putMethod("MinecraftForgeClient.getItemRenderer", + m = getMethod(forgeAPIMinecraftForgeClient, "getItemRenderer", + new Class[] { ItemStack.class, forgeAPIIItemRendererItemRenderType })); + if (m == null) { + return false; + } else { + MineLPLogger.debug("ForgeAPI Method " + stringMethod(m)); + data.putMethod("IItemRenderer.shouldUseRenderHelper", + m = getMethod(forgeAPIIItemRenderer, "shouldUseRenderHelper", + new Class[] { forgeAPIIItemRendererItemRenderType, ItemStack.class, + forgeAPIIItemRendererItemRendererHelper })); + if (m == null) { + return false; + } else { + MineLPLogger.debug("ForgeAPI Method " + stringMethod(m)); + data.putMethod("Item.getRenderPasses", m = getMethod(Item.class, + "getRenderPasses", new Class[] { Integer.TYPE })); + if (m == null) { + return false; + } else { + MineLPLogger.debug("ForgeAPI Method " + stringMethod(m)); + data.putMethod("RenderBiped.getArmorResource", + m = getMethod(RenderBiped.class, "getArmorResource", + new Class[] { Entity.class, ItemStack.class, Integer.TYPE, + String.class })); + if (m == null) { + return false; + } else { + MineLPLogger.debug("ForgeAPI Method " + stringMethod(m)); + data.putMethod("Entity.canRiderInteract", + m = getMethod(Entity.class, "canRiderInteract", new Class[0])); + if (m == null) { + return false; + } else { + MineLPLogger.debug("ForgeAPI Method " + stringMethod(m)); + data.putMethod("RenderGlobal.drawBlockDamageTexture", + m = getMethod(RenderGlobal.class, "drawBlockDamageTexture", + new Class[] { Tessellator.class, + EntityLivingBase.class, Float.TYPE })); + if (m == null) { + return false; + } else { + MineLPLogger.debug("ForgeAPI Method " + stringMethod(m)); + Object[] enumConstants1 = forgeAPIIItemRendererItemRenderType + .getEnumConstants(); + Object o1; + data.putObject("IItemRenderer$ItemRenderType.ENTITY", + o1 = enumConstants1[0]); + if (o1 == null) { + return false; + } else { + MineLPLogger.debug("ForgeAPI Object " + o1.toString()); + data.putObject("IItemRenderer$ItemRenderType.EQUIPPED", + o1 = enumConstants1[1]); + if (o1 == null) { + return false; + } else { + MineLPLogger.debug("ForgeAPI Object " + o1.toString()); + data.putObject( + "IItemRenderer$ItemRenderType.EQUIPPED_FIRST_PERSON", + o1 = enumConstants1[2]); + if (o1 == null) { + return false; + } else { + MineLPLogger + .debug("ForgeAPI Object " + o1.toString()); + data.putObject( + "IItemRenderer$ItemRenderType.INVENTORY", + o1 = enumConstants1[3]); + if (o1 == null) { + return false; + } else { + MineLPLogger.debug( + "ForgeAPI Object " + o1.toString()); + data.putObject( + "IItemRenderer$ItemRenderType.FIRST_PERSON_MAP", + o1 = enumConstants1[4]); + if (o1 == null) { + return false; + } else { + MineLPLogger.debug( + "ForgeAPI Object " + o1.toString()); + enumConstants1 = forgeAPIIItemRendererItemRendererHelper + .getEnumConstants(); + data.putObject( + "IItemRenderer$ItemRendererHelper.ENTITY_ROTATION", + o1 = enumConstants1[0]); + if (o1 == null) { + return false; + } else { + MineLPLogger.debug("ForgeAPI Object " + + o1.toString()); + data.putObject( + "IItemRenderer$ItemRendererHelper.ENTITY_BOBBING", + o1 = enumConstants1[1]); + if (o1 == null) { + return false; + } else { + MineLPLogger + .debug("ForgeAPI Object " + + o1.toString()); + data.putObject( + "IItemRenderer$ItemRendererHelper.EQUIPPED_BLOCK", + o1 = enumConstants1[2]); + if (o1 == null) { + return false; + } else { + MineLPLogger.debug( + "ForgeAPI Object " + o1 + .toString()); + data.putObject( + "IItemRenderer$ItemRendererHelper.BLOCK_3D", + o1 = enumConstants1[3]); + if (o1 == null) { + return false; + } else { + MineLPLogger + .debug("ForgeAPI Object " + + o1.toString()); + data.putObject( + "IItemRenderer$ItemRendererHelper.INVENTORY_BLOCK", + o1 = enumConstants1[4]); + if (o1 == null) { + return false; + } else { + MineLPLogger + .debug("ForgeAPI Object " + + o1.toString()); + if (forgeAPI + .removeNullData()) { + MineLPLogger.warn( + "ForgeAPI reflection returned some nulls"); + } + + return true; + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + + public static Class getClass(String className) { + try { + return Class.forName(className); + } catch (Exception var2) { + return null; + } + } + + public static Constructor getConstructor(Class clazz, Class... types) { + try { + Constructor e = null; + + try { + if (types != null && types.length != 0) { + e = clazz.getConstructor(types); + } else { + e = clazz.getConstructor(new Class[0]); + } + } catch (Exception var4) { + ; + } + + return e; + } catch (Exception var5) { + MineLPLogger.error("Failed to match Constructor for class \"%s\"", new Object[] { clazz.getName() }); + var5.printStackTrace(); + return null; + } + } + + public static Field getField(Class clazz, String fieldName) { + Object ex = null; + + try { + Field e = null; + + try { + e = clazz.getField(fieldName); + } catch (Exception var5) { + e = null; + } + + if (e == null) { + e = clazz.getDeclaredField(fieldName); + } + + e.setAccessible(true); + return e; + } catch (SecurityException var6) { + ex = var6; + } catch (NoSuchFieldException var7) { + ex = var7; + } catch (Exception var8) { + ex = var8; + } + + if (ex != null) { + MineLPLogger.error("Failed to match Field \"%s\" in %s", new Object[] { fieldName, clazz.getName() }); + ((Exception) ex).printStackTrace(); + } + + return null; + } + + public static Method getMethod(Class clazz, String methodName, Class... types) { + try { + Method e = null; + + try { + e = clazz.getMethod(methodName, types); + } catch (Exception var5) { + ; + } + + if (e == null) { + if (types != null && types.length != 0) { + e = clazz.getDeclaredMethod(methodName, types); + } else { + e = clazz.getDeclaredMethod(methodName, new Class[0]); + } + } + + e.setAccessible(true); + return e; + } catch (Exception var6) { + MineLPLogger.error("Failed to match method \"%s\" in %s", new Object[] { methodName, clazz.getName() }); + MineLPLogger.error("Types: " + getStringFromTypes(types)); + var6.printStackTrace(); + return null; + } + } + + public static String getStringFromTypes(Class... types) { + String temp = ""; + temp = temp + "("; + boolean first = true; + Class[] var3 = types; + int var4 = types.length; + + for (int var5 = 0; var5 < var4; ++var5) { + Class c = var3[var5]; + if (!first) { + temp = temp + ","; + } else { + first = false; + } + + temp = temp + c.getName(); + } + + temp = temp + ")"; + return temp; + } + + public static Class[] getTypesFromObjects(Object... objects) { + Class[] types = new Class[objects.length]; + + for (int i = 0; i < objects.length; ++i) { + types[i] = objects[i].getClass(); + } + + return types; + } + + public static void printClass(Class c) { + printClass(c, true); + } + + public static void printClass(Class c, boolean declared) { + printClass(c, declared, 0); + } + + public static void printClass(Class c, boolean declared, int indent) { + String indentation = ""; + int i; + if (indent > 0) { + char[] lineFormat = new char[indent]; + + for (i = 0; i < indent; ++i) { + lineFormat[i] = 32; + } + + indentation = String.valueOf(lineFormat); + } + + String var10 = indentation + "%03d"; + System.out.println(indentation + c.getName()); + System.out.println(indentation + "Nested Classes:"); + Class[] var6 = c.getClasses(); + int var7 = var6.length; + + int var8; + for (var8 = 0; var8 < var7; ++var8) { + Class f = var6[var8]; + printClass(f, declared, indent + 1); + } + + System.out.println(indentation + "Constructors:"); + i = 0; + Constructor[] var11 = c.getConstructors(); + var7 = var11.length; + + for (var8 = 0; var8 < var7; ++var8) { + Constructor var14 = var11[var8]; + System.out.println( + String.format(var10, new Object[] { Integer.valueOf(i) }) + " " + stringConstructor(var14)); + ++i; + } + + System.out.println(indentation + "Methods:"); + i = 0; + Method[] var12 = c.getMethods(); + var7 = var12.length; + + Method var15; + for (var8 = 0; var8 < var7; ++var8) { + var15 = var12[var8]; + System.out.println(String.format(var10, new Object[] { Integer.valueOf(i) }) + " " + stringMethod(var15)); + ++i; + } + + System.out.println(indentation + "Fields:"); + i = 0; + Field[] var13 = c.getFields(); + var7 = var13.length; + + Field var16; + for (var8 = 0; var8 < var7; ++var8) { + var16 = var13[var8]; + System.out.println(String.format(var10, new Object[] { Integer.valueOf(i) }) + " " + stringField(var16)); + ++i; + } + + if (declared) { + System.out.println(indentation + "Declared Methods:"); + i = 0; + var12 = c.getDeclaredMethods(); + var7 = var12.length; + + for (var8 = 0; var8 < var7; ++var8) { + var15 = var12[var8]; + System.out + .println(String.format(var10, new Object[] { Integer.valueOf(i) }) + " " + stringMethod(var15)); + ++i; + } + + System.out.println(indentation + "Declared Fields:"); + i = 0; + var13 = c.getDeclaredFields(); + var7 = var13.length; + + for (var8 = 0; var8 < var7; ++var8) { + var16 = var13[var8]; + System.out + .println(String.format(var10, new Object[] { Integer.valueOf(i) }) + " " + stringField(var16)); + ++i; + } + } + + } + + public static String stringConstructor(Constructor c) { + return Modifier.toString(c.getModifiers()) + " " + c.getName() + getStringFromTypes(c.getParameterTypes()) + + (c.getExceptionTypes().length > 0 ? " throws " + c.getExceptionTypes() : ""); + } + + public static String stringMethod(Method m) { + return Modifier.toString(m.getModifiers()) + " " + + (m.getReturnType() != null ? m.getReturnType().getName() : "void") + " " + m.getName() + + getStringFromTypes(m.getParameterTypes()) + + (m.getExceptionTypes().length > 0 ? " throws " + getStringFromTypes(m.getExceptionTypes()) : ""); + } + + public static String stringField(Field f) { + return Modifier.toString(f.getModifiers()) + " " + f.getType().getName() + " " + f.getName(); + } + + static { + MineLPLogger.info("Checking compatibilities..."); + forgeAPI = new MineLPRData(); + forgeAPI.compatible = reflectForgeAPI(forgeAPI); + MineLPLogger.info("Compatibility Check Done!"); + if (forgeAPI.installed) { + MineLPLogger.info( + "ForgeAPI " + (forgeAPI.compatible ? "Installed and Compatible" : "Installed but Incompatible")); + } + + } +} diff --git a/src/main/java/com/mumfrey/liteloader/core/LiteLoaderFriend.java b/src/main/java/com/mumfrey/liteloader/core/LiteLoaderFriend.java new file mode 100644 index 00000000..646e5d65 --- /dev/null +++ b/src/main/java/com/mumfrey/liteloader/core/LiteLoaderFriend.java @@ -0,0 +1,12 @@ +package com.mumfrey.liteloader.core; + +import com.mumfrey.liteloader.LiteMod; +import com.mumfrey.liteloader.core.LiteLoader; +import com.mumfrey.liteloader.core.api.LoadableModFileFriend; +import java.io.File; + +public abstract class LiteLoaderFriend { + public static void loadMod(String identifier, Class mod, File jarFile) throws InstantiationException, IllegalAccessException { + LiteLoader.getInstance().mods.loadMod(identifier, mod, LoadableModFileFriend.getLoadableModFile(jarFile)); + } +} diff --git a/src/main/java/com/mumfrey/liteloader/core/api/LoadableModFileFriend.java b/src/main/java/com/mumfrey/liteloader/core/api/LoadableModFileFriend.java new file mode 100644 index 00000000..8b3efe1d --- /dev/null +++ b/src/main/java/com/mumfrey/liteloader/core/api/LoadableModFileFriend.java @@ -0,0 +1,11 @@ +package com.mumfrey.liteloader.core.api; + +import com.mumfrey.liteloader.core.api.LoadableModFile; +import com.mumfrey.liteloader.interfaces.LoadableMod; +import java.io.File; + +public class LoadableModFileFriend { + public static LoadableMod getLoadableModFile(File jarFile) { + return new LoadableModFile(jarFile, (String)null); + } +} diff --git a/src/main/java/com/voxelmodpack/common/VoxelCommonLiteMod.java b/src/main/java/com/voxelmodpack/common/VoxelCommonLiteMod.java new file mode 100644 index 00000000..d156a4a4 --- /dev/null +++ b/src/main/java/com/voxelmodpack/common/VoxelCommonLiteMod.java @@ -0,0 +1,133 @@ +package com.voxelmodpack.common; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.lang.reflect.Field; + +import com.google.common.io.ByteSink; +import com.google.common.io.Files; +import com.mumfrey.liteloader.Configurable; +import com.mumfrey.liteloader.LiteMod; +import com.mumfrey.liteloader.core.LiteLoader; +import com.mumfrey.liteloader.core.LiteLoaderFriend; +import com.mumfrey.liteloader.launch.ClassPathUtilities; +import com.mumfrey.liteloader.modconfig.ConfigManager; +import com.mumfrey.liteloader.modconfig.ConfigPanel; +import com.mumfrey.liteloader.util.log.LiteLoaderLogger; + +import net.minecraft.launchwrapper.Launch; + +public abstract class VoxelCommonLiteMod implements LiteMod, Configurable { + private String bundledJarName = "voxelcommon-2.3.1.jar"; + private final String voxelCommonClassName = "com.voxelmodpack.common.LiteModVoxelCommon"; + private final String modClassName; + private LiteMod mod; + + public VoxelCommonLiteMod(String modClassName) { + this.bundledJarName = LiteLoader.getInstance().getModMetaData(this, "voxelCommonJarName", this.bundledJarName); + this.modClassName = modClassName; + } + + @Override + public void init(File configPath) { + try { + this.getClass(); + Class.forName(voxelCommonClassName, false, Launch.class.getClassLoader()); + } catch (Throwable var4) { + this.getClass(); + if (!this.extractAndInjectMod("VoxelLib", voxelCommonClassName, this.bundledJarName, + Files.createTempDir())) { + return; + } + } + + try { + Class th = Class.forName(this.modClassName); + this.mod = (LiteMod) th.newInstance(); + this.mod.init(configPath); + if (this.mod instanceof Configurable && ((Configurable) this.mod).getConfigPanelClass() != null) { + this.registerConfigurable(); + } + + LiteLoader.getInterfaceManager().registerListener(this.mod); + } catch (Throwable var3) { + var3.printStackTrace(); + } + + } + + public void registerConfigurable() + throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException { + Field configManagerField = LiteLoader.class.getDeclaredField("configManager"); + configManagerField.setAccessible(true); + ConfigManager mgr = (ConfigManager) configManagerField.get(LiteLoader.getInstance()); + mgr.registerMod(this); + } + + @Override + public Class getConfigPanelClass() { + return this.mod != null && this.mod instanceof Configurable ? ((Configurable) this.mod).getConfigPanelClass() + : null; + } + + @Override + public void upgradeSettings(String version, File configPath, File oldConfigPath) { + if (this.mod != null) { + this.mod.upgradeSettings(version, configPath, oldConfigPath); + } + + } + + @SuppressWarnings("unchecked") + private boolean extractAndInjectMod(String libraryName, String className, String resourceName, File libPath) { + if ("true".equals(System.getProperty("VoxelCommon.Injected"))) { + LiteLoaderLogger.warning("%s jar was already injected, skipping injection.", libraryName); + return true; + } else { + File jarFile = new File(libPath, resourceName); + if (!jarFile.exists()) { + LiteLoaderLogger.info("%s jar does not exist, attempting to extract to %s", + libraryName, libPath.getAbsolutePath()); + if (!extractFile("/" + resourceName, jarFile)) { + LiteLoaderLogger.warning("%s jar could not be extracted, %s may not function correctly (or at all)", + libraryName, this.getName()); + return false; + } + } + + if (jarFile.exists()) { + LiteLoaderLogger.info("%s jar exists, attempting to inject into classpath", libraryName); + + try { + ClassPathUtilities.injectIntoClassPath(Launch.classLoader, jarFile.toURI().toURL()); + LiteLoaderFriend.loadMod(libraryName, (Class) Class.forName(className), jarFile); + } catch (Exception var7) { + var7.printStackTrace(); + return false; + } + + System.setProperty("VoxelCommon.Injected", "true"); + LiteLoaderLogger.info("%s jar was successfully extracted", libraryName); + return true; + } else { + LiteLoaderLogger.warning("%s jar was not detected, %s may not function correctly (or at all)", + libraryName, this.getName()); + return false; + } + } + } + + private static boolean extractFile(String resourceName, File outputFile) { + try { + InputStream ex = VoxelCommonLiteMod.class.getResourceAsStream(resourceName); + ByteSink sink = Files.asByteSink(outputFile); + sink.writeFrom(ex); + return true; + } catch (NullPointerException var4) { + return false; + } catch (IOException var5) { + return false; + } + } +} diff --git a/src/main/java/com/voxelmodpack/hdskins/HDPrivateFields.java b/src/main/java/com/voxelmodpack/hdskins/HDPrivateFields.java new file mode 100644 index 00000000..b7a10d3a --- /dev/null +++ b/src/main/java/com/voxelmodpack/hdskins/HDPrivateFields.java @@ -0,0 +1,33 @@ +package com.voxelmodpack.hdskins; + +import java.util.Map; + +import com.google.common.cache.Cache; +import com.mojang.authlib.GameProfile; +import com.mojang.authlib.minecraft.MinecraftProfileTexture; +import com.mojang.authlib.minecraft.MinecraftProfileTexture.Type; +import com.mumfrey.liteloader.core.runtime.Obf; +import com.mumfrey.liteloader.util.PrivateFields; + +import net.minecraft.client.resources.SkinManager; + +public class HDPrivateFields extends PrivateFields { + + public static PrivateFields>> skinCacheLoader = new HDPrivateFields>>( + SkinManager.class, HDObf.skinLoadingCache); + + protected HDPrivateFields(Class

owner, Obf obf) { + super(owner, obf); + } + + private static class HDObf extends Obf { + private static Obf skinLoadingCache = new HDObf("field_152798_f", "e", "skinCacheLoader"); + + protected HDObf(String seargeName, String obfName, String mcpName) { + super(seargeName, obfName, mcpName); + // TODO Auto-generated constructor stub + } + + } + +} diff --git a/src/main/java/com/voxelmodpack/hdskins/HDSkinDownload.java b/src/main/java/com/voxelmodpack/hdskins/HDSkinDownload.java new file mode 100644 index 00000000..3a117beb --- /dev/null +++ b/src/main/java/com/voxelmodpack/hdskins/HDSkinDownload.java @@ -0,0 +1,70 @@ +package com.voxelmodpack.hdskins; + +import java.awt.image.BufferedImage; +import java.net.HttpURLConnection; +import java.net.Proxy; +import java.net.URL; + +import javax.imageio.ImageIO; + +import com.mumfrey.liteloader.util.log.LiteLoaderLogger; +import com.voxelmodpack.common.runtime.PrivateFields; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.IImageBuffer; +import net.minecraft.client.renderer.ThreadDownloadImageData; + +class HDSkinDownload extends Thread { + private final ThreadDownloadImageData image; + private final IImageBuffer imageBuffer; + private final String skinUrl; + private final Thread originalThread; + + HDSkinDownload(ThreadDownloadImageData image, IImageBuffer imageBuffer, String url) { + this.image = image; + this.imageBuffer = imageBuffer != null ? imageBuffer : (IImageBuffer) PrivateFields.imageBuffer.get(image); + this.originalThread = PrivateFields.imageThread.get(image); + this.skinUrl = url; + } + + @Override + public void run() { + Proxy proxy = Minecraft.getMinecraft().getProxy(); + if (!this.tryDownload(proxy, this.skinUrl) && this.originalThread != null) { + this.originalThread.run(); + } + + } + + boolean tryDownload(Proxy proxy, String strUrl) { + HttpURLConnection httpConnection = null; + + try { + LiteLoaderLogger.debug("Downloading HD Skin from %s", strUrl); + URL ex = new URL(strUrl); + httpConnection = (HttpURLConnection) ex.openConnection(proxy); + httpConnection.addRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)"); + httpConnection.setDoInput(true); + httpConnection.setDoOutput(false); + httpConnection.connect(); + if (httpConnection.getResponseCode() / 100 == 2) { + BufferedImage image1 = ImageIO.read(httpConnection.getInputStream()); + if (this.imageBuffer != null) { + image1 = this.imageBuffer.parseUserSkin(image1); + } + + this.image.setBufferedImage(image1); + return true; + } + } catch (Exception var10) { + return false; + } finally { + if (httpConnection != null) { + httpConnection.disconnect(); + } + + } + + return false; + } +} diff --git a/src/main/java/com/voxelmodpack/hdskins/HDSkinManager.java b/src/main/java/com/voxelmodpack/hdskins/HDSkinManager.java new file mode 100644 index 00000000..66145212 --- /dev/null +++ b/src/main/java/com/voxelmodpack/hdskins/HDSkinManager.java @@ -0,0 +1,234 @@ +package com.voxelmodpack.hdskins; + +import java.io.File; +import java.io.IOException; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.UUID; + +import org.apache.commons.io.FileUtils; +import org.apache.commons.io.FilenameUtils; + +import com.google.common.cache.Cache; +import com.google.common.collect.BiMap; +import com.google.common.collect.HashBiMap; +import com.mojang.authlib.GameProfile; +import com.mojang.authlib.minecraft.InsecureTextureException; +import com.mojang.authlib.minecraft.MinecraftProfileTexture; +import com.mojang.authlib.minecraft.MinecraftProfileTexture.Type; +import com.mojang.authlib.minecraft.MinecraftSessionService; +import com.mumfrey.liteloader.core.LiteLoader; +import com.mumfrey.liteloader.transformers.event.EventInfo; +import com.mumfrey.liteloader.util.log.LiteLoaderLogger; +import com.voxelmodpack.common.runtime.PrivateFields; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.network.NetworkPlayerInfo; +import net.minecraft.client.renderer.ThreadDownloadImageData; +import net.minecraft.client.renderer.texture.ITextureObject; +import net.minecraft.client.renderer.texture.TextureManager; +import net.minecraft.client.resources.DefaultPlayerSkin; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.StringUtils; + +public final class HDSkinManager { + private static String gatewayUrl = "skinmanager.voxelmodpack.com"; + private static String skinUrl = "skins.voxelmodpack.com"; + private static Cache> skinsCache; + private static final BiMap playerHashes = HashBiMap.create(); + private static final Map> cachedTextures = new HashMap>(); + + public static void onDownloadSkin(EventInfo e) { + ThreadDownloadImageData imageDownload = e.getSource(); + if (imageDownload != null) { + String imageUrl = PrivateFields.imageUrl.get(imageDownload); + if (imageUrl != null) { + String hash = FilenameUtils.getBaseName(imageUrl); + String uuid = resolvePlayerIdFromHash(hash); + if (uuid == null) { + if (!(imageDownload instanceof PreviewTexture)) { + return; + } + + uuid = Minecraft.getMinecraft().getSession().getPlayerID(); + } + + Map textures = getCachedTexturesForId(uuid); + MinecraftProfileTexture skinTexture = textures.get(Type.SKIN); + if (skinTexture != null && skinTexture.getUrl().equals(imageUrl)) { + Thread imageThread = PrivateFields.imageThread.get(imageDownload); + if (imageThread != null) { + HDSkinDownload hdThread = new HDSkinDownload(imageDownload, new ImageBufferDownloadHD(), + getCustomSkinURLForId(uuid, imageDownload instanceof PreviewTexture)); + PrivateFields.imageThread.set(imageDownload, hdThread); + hdThread.setDaemon(true); + hdThread.start(); + e.cancel(); + } + } else { + LiteLoaderLogger.debug("Not a skin texture!"); + } + } + } + } + + private static String resolvePlayerIdFromHash(String hash) { + Minecraft mc = Minecraft.getMinecraft(); + Collection playersInfo = mc.getNetHandler().func_175106_d(); + String uuid; + // players + for (NetworkPlayerInfo player : playersInfo) { + GameProfile profile = player.getGameProfile(); + Map textures = getTexturesForProfile(mc, profile); + storeTexturesForProfile(profile, textures); + uuid = findUUID(profile, textures, hash); + if (uuid != null) + return uuid; + } + @SuppressWarnings("unchecked") + List players = mc.theWorld.playerEntities; + for (EntityPlayer player : players) { + GameProfile profile = player.getGameProfile(); + Map textures = getTexturesForProfile(mc, profile); + storeTexturesForProfile(profile, textures); + uuid = findUUID(profile, textures, hash); + if (uuid != null) + return uuid; + } + // skulls + for (Entry> e : getSkinsCache().asMap().entrySet()) { + GameProfile profile = e.getKey(); + Map textures = e.getValue(); + storeTexturesForProfile(profile, textures); + uuid = findUUID(profile, textures, hash); + if (uuid != null) + return uuid; + } + + return null; + } + + private static String findUUID(GameProfile profile, Map textures, String hash) { + for (MinecraftProfileTexture texture : textures.values()) { + if (hash.equals(texture.getHash())) { + String uuid = trimUUID(profile.getId()); + playerHashes.put(hash, uuid); + return uuid; + } + } + return null; + } + + private static void storeTexturesForProfile(GameProfile profile, Map textures) { + Map cached = getCachedTexturesForId(trimUUID(profile.getId())); + if (cached == null && textures != null && !textures.isEmpty()) { + LiteLoaderLogger.debug("Store textures for " + profile.getId()); + cachedTextures.put(trimUUID(profile.getId()), textures); + } + } + + private static Map getTexturesForProfile(Minecraft minecraft, GameProfile profile) { + LiteLoaderLogger.debug("Get textures for " + profile.getId(), new Object[0]); + Map cached = getCachedTexturesForId(trimUUID(profile.getId())); + if (cached != null) { + return cached; + } else { + MinecraftSessionService sessionService = minecraft.getSessionService(); + Map textures = null; + + try { + textures = sessionService.getTextures(profile, true); + } catch (InsecureTextureException var6) { + textures = sessionService.getTextures(profile, false); + } + + if ((textures == null || textures.isEmpty()) + && profile.getId().equals(minecraft.getSession().getProfile().getId())) { + textures = sessionService.getTextures(sessionService.fillProfileProperties(profile, false), false); + } + + storeTexturesForProfile(profile, textures); + + return textures; + } + } + + private static Cache> getSkinsCache() { + if (skinsCache == null) { + // final field isn't going to change + skinsCache = HDPrivateFields.skinCacheLoader.get(Minecraft.getMinecraft().getSkinManager()); + } + return skinsCache; + } + + private static Map getCachedTexturesForId(String uuid) { + return cachedTextures.get(uuid); + } + + private static String trimUUID(UUID uuid) { + return uuid.toString().replace("-", ""); + } + + public static void setSkinUrl(String skinUrl) { + HDSkinManager.skinUrl = skinUrl; + } + + public static void setGatewayURL(String gatewayURL) { + gatewayUrl = gatewayURL; + } + + public static String getSkinUrl() { + return String.format("http://%s/", skinUrl); + } + + public static String getGatewayUrl() { + return String.format("http://%s/", gatewayUrl); + } + + public static String getCustomSkinURLForId(String uuid, boolean gateway) { + uuid = StringUtils.stripControlCodes(uuid); + return String.format("http://%s/skins/%s.png", gateway ? gatewayUrl : skinUrl, uuid); + } + + public static String getCustomCloakURLForId(String uuid) { + return String.format("http://%s/capes/%s.png", skinUrl, StringUtils.stripControlCodes(uuid)); + } + + public static PreviewTexture getPreviewTexture(ResourceLocation skinResource, GameProfile profile) { + TextureManager textureManager = Minecraft.getMinecraft().getTextureManager(); + Object skinTexture = textureManager.getTexture(skinResource); + if (skinTexture == null) { + Map textures = getTexturesForProfile(Minecraft.getMinecraft(), profile); + MinecraftProfileTexture skin = textures.get(Type.SKIN); + if (skin == null) { + throw new RuntimeException("Could not get player skin URL from profile"); + } + + String url = skin.getUrl(); + skinTexture = new PreviewTexture(url, DefaultPlayerSkin.getDefaultSkin(profile.getId()), + new ImageBufferDownloadHD()); + textureManager.loadTexture(skinResource, (ITextureObject) skinTexture); + } + + return (PreviewTexture) skinTexture; + } + + public static void clearSkinCache() { + LiteLoaderLogger.info("Clearing local player skin cache", new Object[0]); + + try { + FileUtils.deleteDirectory(new File(LiteLoader.getAssetsDirectory(), "skins")); + } catch (IOException var1) { + var1.printStackTrace(); + } + // clear the maps, too + getSkinsCache().invalidateAll(); + cachedTextures.clear(); + playerHashes.clear(); + + } +} diff --git a/src/main/java/com/voxelmodpack/hdskins/ImageBufferDownloadHD.java b/src/main/java/com/voxelmodpack/hdskins/ImageBufferDownloadHD.java new file mode 100644 index 00000000..53f10f13 --- /dev/null +++ b/src/main/java/com/voxelmodpack/hdskins/ImageBufferDownloadHD.java @@ -0,0 +1,59 @@ +package com.voxelmodpack.hdskins; + +import java.awt.Graphics; +import java.awt.image.BufferedImage; +import java.awt.image.ImageObserver; + +import net.minecraft.client.renderer.IImageBuffer; + +public class ImageBufferDownloadHD implements IImageBuffer { + + private int scale; + private Graphics graphics; + private BufferedImage image; + + @Override + public BufferedImage parseUserSkin(BufferedImage downloadedImage) { + if (downloadedImage == null) { + return null; + } else { + int imageWidth = downloadedImage.getWidth(); + int imageHeight = downloadedImage.getHeight(); + if (imageHeight == imageWidth) { + return downloadedImage; + } else { + scale = imageWidth / 64; + image = new BufferedImage(imageWidth, imageWidth, BufferedImage.TYPE_INT_ARGB); + graphics = image.getGraphics(); + graphics.drawImage(downloadedImage, 0, 0, (ImageObserver) null); + + // copy layers + drawImage(24, 48, 20, 52, 4, 16, 8, 20); + drawImage(28, 48, 24, 52, 8, 16, 12, 20); + drawImage(20, 52, 16, 64, 8, 20, 12, 32); + drawImage(24, 52, 20, 64, 4, 20, 8, 32); + drawImage(28, 52, 24, 64, 0, 20, 4, 32); + drawImage(32, 52, 28, 64, 12, 20, 16, 32); + drawImage(40, 48, 36, 52, 44, 16, 48, 20); + drawImage(44, 48, 40, 52, 48, 16, 52, 20); + drawImage(36, 52, 32, 64, 48, 20, 52, 32); + drawImage(40, 52, 36, 64, 44, 20, 48, 32); + drawImage(44, 52, 40, 64, 40, 20, 44, 32); + drawImage(48, 52, 44, 64, 52, 20, 56, 32); + + graphics.dispose(); + return image; + } + } + } + + private void drawImage(int dx1, int dy1, int dx2, int dy2, int sx1, int sy1, int sx2, int sy2) { + graphics.drawImage(image, + dx1 * scale, dy1 * scale, dx2 * scale, dy2 * scale, + sx1 * scale, sy1 * scale, sx2 * scale, sy2 * scale, + null); + } + + @Override + public void skinAvailable() {} +} diff --git a/src/main/java/com/voxelmodpack/hdskins/PreviewTexture.java b/src/main/java/com/voxelmodpack/hdskins/PreviewTexture.java new file mode 100644 index 00000000..95d54b40 --- /dev/null +++ b/src/main/java/com/voxelmodpack/hdskins/PreviewTexture.java @@ -0,0 +1,19 @@ +package com.voxelmodpack.hdskins; + +import java.io.File; + +import com.voxelmodpack.common.runtime.PrivateFields; + +import net.minecraft.client.renderer.IImageBuffer; +import net.minecraft.client.renderer.ThreadDownloadImageData; +import net.minecraft.util.ResourceLocation; + +public class PreviewTexture extends ThreadDownloadImageData { + public PreviewTexture(String url, ResourceLocation fallbackTexture, IImageBuffer imageBuffer) { + super((File) null, url, fallbackTexture, imageBuffer); + } + + public boolean isTextureUploaded() { + return PrivateFields.downloadedImage.get(this) != null && this.getGlTextureId() > -1; + } +} diff --git a/src/main/java/com/voxelmodpack/hdskins/gui/EntityPlayerModel.java b/src/main/java/com/voxelmodpack/hdskins/gui/EntityPlayerModel.java new file mode 100644 index 00000000..9678e331 --- /dev/null +++ b/src/main/java/com/voxelmodpack/hdskins/gui/EntityPlayerModel.java @@ -0,0 +1,134 @@ +package com.voxelmodpack.hdskins.gui; + +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.IOException; + +import javax.imageio.ImageIO; + +import com.mojang.authlib.GameProfile; +import com.voxelmodpack.common.gl.TextureHelper; +import com.voxelmodpack.hdskins.HDSkinManager; +import com.voxelmodpack.hdskins.PreviewTexture; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.texture.DynamicTexture; +import net.minecraft.client.renderer.texture.TextureManager; +import net.minecraft.client.resources.DefaultPlayerSkin; +import net.minecraft.entity.EntityLiving; +import net.minecraft.util.ResourceLocation; +import net.minecraft.world.World; + +public class EntityPlayerModel extends EntityLiving { + public static final ResourceLocation NOSKIN = new ResourceLocation("hdskins", "textures/mob/noskin.png"); + private PreviewTexture remoteSkinTexture; + private ResourceLocation remoteSkinResource; + private ResourceLocation localSkinResource; + private DynamicTexture localSkinTexture; + private TextureManager textureManager; + public final GameProfile profile; + public boolean isSwinging = false; + protected boolean remoteSkin = false; + protected boolean hasLocalTexture = false; + + public EntityPlayerModel(GameProfile profile) { + super((World) null); + this.profile = profile; + this.textureManager = Minecraft.getMinecraft().getTextureManager(); + this.remoteSkinResource = new ResourceLocation("skins/preview_" + this.profile.getName() + ".png"); + this.localSkinResource = NOSKIN; + TextureHelper.releaseTexture(this.remoteSkinResource); + } + + public void setRemoteSkin() { + this.remoteSkin = true; + if (this.remoteSkinTexture != null) { + TextureHelper.releaseTexture(this.remoteSkinResource); + } + + this.remoteSkinTexture = HDSkinManager.getPreviewTexture(this.remoteSkinResource, this.profile); + } + + public void setLocalSkin(File skinTextureFile) { + if (skinTextureFile.exists()) { + this.remoteSkin = false; + if (this.localSkinTexture != null) { + TextureHelper.releaseTexture(this.localSkinResource); + this.localSkinTexture = null; + } + + BufferedImage bufferedImage; + try { + bufferedImage = ImageIO.read(skinTextureFile); + } catch (IOException var4) { + this.localSkinResource = NOSKIN; + var4.printStackTrace(); + return; + } + + this.localSkinTexture = new DynamicTexture(bufferedImage); + this.localSkinResource = this.textureManager.getDynamicTextureLocation("localSkinPreview", + this.localSkinTexture); + this.hasLocalTexture = true; + } + + } + + public boolean usingRemoteSkin() { + return this.remoteSkin; + } + + public boolean isUsingLocalTexture() { + return !this.remoteSkin && this.hasLocalTexture; + } + + public float d(float par1) { + return 1.0F; + } + + public boolean isTextureSetupComplete() { + return this.remoteSkin && this.remoteSkinTexture != null ? this.remoteSkinTexture.isTextureUploaded() : false; + } + + public void releaseTextures() { + if (this.localSkinTexture != null) { + TextureHelper.releaseTexture(this.localSkinResource); + this.localSkinTexture = null; + this.localSkinResource = NOSKIN; + this.hasLocalTexture = false; + } + + } + + public ResourceLocation getSkinTexture() { + return this.remoteSkin ? (this.remoteSkinTexture != null ? this.remoteSkinResource + : DefaultPlayerSkin.getDefaultSkin(entityUniqueID)) : this.localSkinResource; + } + + public boolean hasCloak() { + return false; + } + + public void swingArm() { + if (!this.isSwinging || this.swingProgressInt >= 4 || this.swingProgressInt < 0) { + this.swingProgressInt = -1; + this.isSwinging = true; + } + + } + + public void updateModel() { + this.prevSwingProgress = this.swingProgress; + if (this.isSwinging) { + ++this.swingProgressInt; + if (this.swingProgressInt >= 8) { + this.swingProgressInt = 0; + this.isSwinging = false; + } + } else { + this.swingProgressInt = 0; + } + + this.swingProgress = this.swingProgressInt / 8.0F; + } +} diff --git a/src/main/java/com/voxelmodpack/hdskins/gui/GuiSkins.java b/src/main/java/com/voxelmodpack/hdskins/gui/GuiSkins.java new file mode 100644 index 00000000..de4e12d4 --- /dev/null +++ b/src/main/java/com/voxelmodpack/hdskins/gui/GuiSkins.java @@ -0,0 +1,638 @@ +package com.voxelmodpack.hdskins.gui; + +import static net.minecraft.client.renderer.GlStateManager.*; + +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.IOException; +import java.nio.DoubleBuffer; +import java.util.HashMap; +import java.util.List; +import java.util.UUID; + +import javax.imageio.ImageIO; +import javax.swing.JFileChooser; + +import org.lwjgl.BufferUtils; +import org.lwjgl.opengl.GL11; +import org.lwjgl.util.glu.GLU; + +import com.mojang.authlib.GameProfile; +import com.mojang.authlib.exceptions.AuthenticationException; +import com.mojang.authlib.minecraft.MinecraftSessionService; +import com.mojang.authlib.yggdrasil.YggdrasilAuthenticationService; +import com.mumfrey.liteloader.util.log.LiteLoaderLogger; +import com.voxelmodpack.common.net.upload.IUploadCompleteCallback; +import com.voxelmodpack.common.net.upload.ThreadMultipartPostUpload; +import com.voxelmodpack.common.net.upload.awt.IOpenFileCallback; +import com.voxelmodpack.common.net.upload.awt.ThreadOpenFilePNG; +import com.voxelmodpack.hdskins.HDSkinManager; +import com.voxelmodpack.hdskins.mod.HDSkinsModCore; +import com.voxelmodpack.voxelmenu.IPanoramaRenderer; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.Gui; +import net.minecraft.client.gui.GuiButton; +import net.minecraft.client.gui.GuiMainMenu; +import net.minecraft.client.gui.GuiScreen; +import net.minecraft.client.renderer.RenderHelper; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.renderer.WorldRenderer; +import net.minecraft.client.renderer.entity.RenderManager; +import net.minecraft.client.renderer.texture.DynamicTexture; +import net.minecraft.util.MathHelper; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.Session; + +public class GuiSkins extends GuiScreen implements IUploadCompleteCallback, IOpenFileCallback, IPanoramaRenderer { + private static final ResourceLocation vignette = new ResourceLocation("textures/misc/vignette.png"); + private static final int MAX_SKIN_DIMENSION = 8192; + private static final String skinServerId = "7853dfddc358333843ad55a2c7485c4aa0380a51"; + private int updateCounter = 0; + private ResourceLocation viewportTexture; + private IPanoramaRenderer panoramaRenderer; + private static final ResourceLocation[] cubemapTextures = { + new ResourceLocation("hdskins", "textures/cubemaps/cubemap0_0.png"), + new ResourceLocation("hdskins", "textures/cubemaps/cubemap0_1.png"), + new ResourceLocation("hdskins", "textures/cubemaps/cubemap0_2.png"), + new ResourceLocation("hdskins", "textures/cubemaps/cubemap0_3.png"), + new ResourceLocation("hdskins", "textures/cubemaps/cubemap0_4.png"), + new ResourceLocation("hdskins", "textures/cubemaps/cubemap0_5.png") }; + private GuiButton btnBrowse; + private GuiButton btnUpload; + private GuiButton btnClear; + private GuiButton btnBack; + protected EntityPlayerModel localPlayer; + protected EntityPlayerModel remotePlayer; + protected DoubleBuffer doubleBuffer; + private String screenTitle; + private String uploadError; + private volatile String skinMessage = "Choose a file"; + private String skinUploadMessage = "Uploading skin please wait..."; + private volatile boolean fetchingSkin; + private volatile boolean uploadingSkin; + private volatile boolean pendingRemoteSkinRefresh; + private volatile boolean throttledByMojang; + private ThreadOpenFilePNG openFileThread; + private ThreadMultipartPostUpload threadSkinUpload; + private Object skinLock = new Object(); + private File pendingSkin; + private File selectedSkin; + private float uploadOpacity = 0.0F; + private float lastPartialTick; + + public GuiSkins() { + Minecraft minecraft = Minecraft.getMinecraft(); + this.screenTitle = "Skin Manager"; + GameProfile profile = minecraft.getSession().getProfile(); + this.localPlayer = new EntityPlayerModel(profile); + this.remotePlayer = new EntityPlayerModel(profile); + RenderManager rm = Minecraft.getMinecraft().getRenderManager(); + rm.renderEngine = minecraft.getTextureManager(); + rm.options = minecraft.gameSettings; + rm.livingPlayer = this.localPlayer; + + try { + this.remotePlayer.setRemoteSkin(); + } catch (Exception var4) { + var4.printStackTrace(); + this.throttledByMojang = true; + } + + this.fetchingSkin = true; + this.panoramaRenderer = HDSkinsModCore.getPanoramaRenderer(this); + } + + @Override + public void updateScreen() { + ++this.updateCounter; + this.panoramaRenderer.updatePanorama(); + this.localPlayer.updateModel(); + this.remotePlayer.updateModel(); + if (this.fetchingSkin && this.remotePlayer.isTextureSetupComplete()) { + this.fetchingSkin = false; + this.btnClear.enabled = true; + } + + synchronized (this.skinLock) { + if (this.pendingSkin != null) { + this.setLocalSkin(this.pendingSkin); + this.selectedSkin = this.pendingSkin; + this.pendingSkin = null; + } + } + + this.btnUpload.enabled = this.selectedSkin != null; + if (this.pendingRemoteSkinRefresh) { + this.pendingRemoteSkinRefresh = false; + this.fetchingSkin = true; + this.btnClear.enabled = false; + this.setRemoteSkin(); + } + + } + + protected void setLocalSkin(File pendingSkin) { + this.localPlayer.setLocalSkin(pendingSkin); + } + + protected void setRemoteSkin() { + this.remotePlayer.setRemoteSkin(); + } + + @Override + public void updatePanorama() {} + + @Override + public int getUpdateCounter() { + return this.updateCounter; + } + + @Override + public void setWorldAndResolution(Minecraft par1Minecraft, int par2, int par3) { + super.setWorldAndResolution(par1Minecraft, par2, par3); + this.panoramaRenderer.setPanoramaResolution(par1Minecraft, par2, par3); + } + + @Override + public void setPanoramaResolution(Minecraft minecraft, int width, int height) {} + + protected List getControlList() { + return this.buttonList; + } + + @Override + public void initGui() { + super.initGui(); + this.panoramaRenderer.initPanoramaRenderer(); + this.getControlList().clear(); + this.getControlList().add(this.btnBrowse = new GuiButton(0, 30, this.height - 36, 60, 20, "Browse...")); + this.getControlList() + .add(this.btnUpload = new GuiButton(1, this.width / 2 - 24, this.height / 2 - 10, 48, 20, ">>")); + this.getControlList().add(this.btnClear = new GuiButton(2, this.width - 90, this.height - 36, 60, 20, "Clear")); + this.getControlList() + .add(this.btnBack = new GuiButton(3, this.width / 2 - 50, this.height - 36, 100, 20, "Close")); + this.btnUpload.enabled = false; + this.btnBrowse.enabled = !this.mc.isFullScreen(); + } + + @Override + public void initPanoramaRenderer() { + this.viewportTexture = this.mc.getTextureManager().getDynamicTextureLocation("skinpanorama", + new DynamicTexture(256, 256)); + } + + @Override + public void onGuiClosed() { + super.onGuiClosed(); + this.localPlayer.releaseTextures(); + this.remotePlayer.releaseTextures(); + } + + @Override + public void onFileOpenDialogClosed(JFileChooser fileDialog, int dialogResult) { + this.openFileThread = null; + + try { + if (dialogResult == 0) { + File ex = fileDialog.getSelectedFile(); + if (!ex.exists()) { + this.skinMessage = "File not readable"; + return; + } + + BufferedImage chosenImage = ImageIO.read(ex); + if (!isPowerOfTwo(chosenImage.getWidth()) + || (chosenImage.getWidth() != chosenImage.getHeight() * 2 + && chosenImage.getWidth() != chosenImage.getHeight()) + || chosenImage.getWidth() > MAX_SKIN_DIMENSION + || chosenImage.getHeight() > MAX_SKIN_DIMENSION) { + this.skinMessage = "Not a valid skin file"; + return; + } + + synchronized (this.skinLock) { + this.pendingSkin = ex; + } + } + } catch (Exception var8) { + this.skinMessage = "Error opening skin file"; + var8.printStackTrace(); + } + + } + + @Override + protected void actionPerformed(GuiButton guiButton) { + if (this.openFileThread == null && !this.uploadingSkin) { + if (this.uploadError != null) { + this.uploadError = null; + } else { + if (guiButton.id == this.btnBrowse.id) { + this.selectedSkin = null; + this.localPlayer.releaseTextures(); + this.openFileThread = new ThreadOpenFilePNG(this.mc, "Choose skin", this); + this.openFileThread.start(); + } + + if (guiButton.id == this.btnUpload.id && this.selectedSkin != null) { + this.uploadSkin(this.mc.getSession(), this.selectedSkin); + this.selectedSkin = null; + } + + if (guiButton.id == this.btnClear.id && this.remotePlayer.isTextureSetupComplete()) { + this.clearUploadedSkin(this.mc.getSession()); + } + + if (guiButton.id == this.btnBack.id) { + this.mc.displayGuiScreen(new GuiMainMenu()); + } + + } + } + } + + @Override + protected void mouseClicked(int mouseX, int mouseY, int button) throws IOException { + if (this.uploadError != null) { + this.uploadError = null; + } else { + super.mouseClicked(mouseX, mouseY, button); + byte top = 30; + int bottom = this.height - 40; + int mid = this.width / 2; + if ((mouseX > 30 && mouseX < mid - 30 || mouseX > mid + 30 && mouseX < this.width - 30) && mouseY > top + && mouseY < bottom) { + this.localPlayer.swingArm(); + } else if (mouseX > mid + 30 && mouseY > top && mouseX < this.width - 30 && mouseY < bottom) { + this.remotePlayer.swingArm(); + } + + } + } + + @Override + protected void keyTyped(char keyChar, int keyCode) throws IOException { + if (this.openFileThread == null && !this.uploadingSkin) { + super.keyTyped(keyChar, keyCode); + } + } + + public void setupCubemapCamera() { + matrixMode(5889); + pushMatrix(); + loadIdentity(); + GLU.gluPerspective(150.0F, 1.0F, 0.05F, 10.0F); + matrixMode(5888); + pushMatrix(); + loadIdentity(); + } + + public void revertPanoramaMatrix() { + matrixMode(5889); + popMatrix(); + matrixMode(5888); + popMatrix(); + } + + private void renderCubeMapTexture(int mouseX, int mouseY, float partialTick) { + this.setupCubemapCamera(); + color(1.0F, 1.0F, 1.0F, 1.0F); + rotate(180.0F, 1.0F, 0.0F, 0.0F); + GL11.glEnable(3042); + GL11.glDisable(3008); + GL11.glDisable(2884); + depthMask(false); + blendFunc(770, 771); + byte blendIterations = 8; + Tessellator tessellator = Tessellator.getInstance(); + WorldRenderer wr = tessellator.getWorldRenderer(); + + for (int blendPass = 0; blendPass < blendIterations * blendIterations; ++blendPass) { + pushMatrix(); + float offsetX = ((float) (blendPass % blendIterations) / (float) blendIterations - 0.5F) / 64.0F; + float offsetY = ((float) (blendPass / blendIterations) / (float) blendIterations - 0.5F) / 64.0F; + float offsetZ = 0.0F; + translate(offsetX, offsetY, offsetZ); + rotate(MathHelper.sin((this.updateCounter + 200 + partialTick) / 400.0F) * 25.0F + 20.0F, 1.0F, + 0.0F, 0.0F); + rotate(-(this.updateCounter + 200 + partialTick) * 0.1F, 0.0F, 1.0F, 0.0F); + + for (int cubeSide = 0; cubeSide < 6; ++cubeSide) { + pushMatrix(); + if (cubeSide == 1) { + rotate(90.0F, 0.0F, 1.0F, 0.0F); + } + + if (cubeSide == 2) { + rotate(180.0F, 0.0F, 1.0F, 0.0F); + } + + if (cubeSide == 3) { + rotate(-90.0F, 0.0F, 1.0F, 0.0F); + } + + if (cubeSide == 4) { + rotate(90.0F, 1.0F, 0.0F, 0.0F); + } + + if (cubeSide == 5) { + rotate(-90.0F, 1.0F, 0.0F, 0.0F); + } + + this.mc.getTextureManager().bindTexture(cubemapTextures[cubeSide]); + wr.startDrawingQuads(); + wr.setColorRGBA_I(16777215, 255 / (blendPass + 1)); + wr.addVertexWithUV(-1.0D, -1.0D, 1.0D, 0.0D, 0.0D); + wr.addVertexWithUV(1.0D, -1.0D, 1.0D, 1.0D, 0.0D); + wr.addVertexWithUV(1.0D, 1.0D, 1.0D, 1.0D, 1.0D); + wr.addVertexWithUV(-1.0D, 1.0D, 1.0D, 0.0D, 1.0D); + tessellator.draw(); + popMatrix(); + } + + popMatrix(); + colorMask(true, true, true, false); + } + + wr.setTranslation(0.0D, 0.0D, 0.0D); + colorMask(true, true, true, true); + depthMask(true); + GL11.glEnable(2884); + GL11.glEnable(3008); + GL11.glEnable(2929); + this.revertPanoramaMatrix(); + } + + private void rotateAndBlurCubemap(float partialTick) { + this.mc.getTextureManager().bindTexture(this.viewportTexture); + GL11.glCopyTexSubImage2D(3553, 0, 0, 0, 0, 0, 256, 256); + GL11.glEnable(3042); + blendFunc(770, 771); + colorMask(true, true, true, false); + Tessellator tessellator = Tessellator.getInstance(); + WorldRenderer wr = tessellator.getWorldRenderer(); + wr.startDrawingQuads(); + byte blurPasses = 4; + + for (int blurPass = 0; blurPass < blurPasses; ++blurPass) { + wr.setColorRGBA_F(1.0F, 1.0F, 1.0F, 1.0F / (blurPass + 1)); + float var7 = (blurPass - blurPasses / 2) / 256.0F; + wr.addVertexWithUV(this.width, this.height, this.zLevel, 0.0F + var7, 0.0D); + wr.addVertexWithUV(this.width, 0.0D, this.zLevel, 1.0F + var7, 0.0D); + wr.addVertexWithUV(0.0D, 0.0D, this.zLevel, 1.0F + var7, 1.0D); + wr.addVertexWithUV(0.0D, this.height, this.zLevel, 0.0F + var7, 1.0D); + } + + tessellator.draw(); + colorMask(true, true, true, true); + GL11.glDisable(3042); + } + + @Override + public boolean renderPanorama(int mouseX, int mouseY, float partialTicks) { + viewport(0, 0, 256, 256); + this.renderCubeMapTexture(mouseX, mouseY, partialTicks); + GL11.glDisable(3553); + GL11.glEnable(3553); + + for (int tessellator = 0; tessellator < 8; ++tessellator) { + this.rotateAndBlurCubemap(partialTicks); + } + + viewport(0, 0, this.mc.displayWidth, this.mc.displayHeight); + Tessellator tessellator = Tessellator.getInstance(); + WorldRenderer wr = tessellator.getWorldRenderer(); + wr.startDrawingQuads(); + float aspect = this.width > this.height ? 120.0F / this.width : 120.0F / this.height; + float uSample = this.height * aspect / 256.0F; + float vSample = this.width * aspect / 256.0F; + GL11.glTexParameteri(3553, 10241, 9729); + GL11.glTexParameteri(3553, 10240, 9729); + wr.setColorRGBA_F(1.0F, 1.0F, 1.0F, 1.0F); + wr.addVertexWithUV(0.0D, this.height, this.zLevel, 0.5F - uSample, 0.5F + vSample); + wr.addVertexWithUV(this.width, this.height, this.zLevel, 0.5F - uSample, 0.5F - vSample); + wr.addVertexWithUV(this.width, 0.0D, this.zLevel, 0.5F + uSample, 0.5F - vSample); + wr.addVertexWithUV(0.0D, 0.0D, this.zLevel, 0.5F + uSample, 0.5F + vSample); + tessellator.draw(); + return true; + } + + @Override + public void drawScreen(int mouseX, int mouseY, float partialTick) { + float deltaTime = this.updateCounter + partialTick - this.lastPartialTick; + this.lastPartialTick = this.updateCounter + partialTick; + GL11.glDisable(2912); + this.mc.entityRenderer.disableLightmap(); + this.panoramaRenderer.renderPanorama(mouseX, mouseY, partialTick); + byte top = 30; + int bottom = this.height - 40; + int mid = this.width / 2; + int horizon = this.height / 2 + this.height / 5; + GL11.glPushAttrib(1048575); + Gui.drawRect(30, top, mid - 30, bottom, Integer.MIN_VALUE); + Gui.drawRect(mid + 30, top, this.width - 30, bottom, Integer.MIN_VALUE); + this.drawGradientRect(30, horizon, mid - 30, bottom, -2130706433, 16777215); + this.drawGradientRect(mid + 30, horizon, this.width - 30, bottom, -2130706433, 16777215); + super.drawScreen(mouseX, mouseY, partialTick); + popAttrib(); + this.enableClipping(30, bottom); + float yPos = this.height * 0.75F; + float xPos1 = this.width * 0.25F; + float xPos2 = this.width * 0.75F; + float scale = this.height * 0.25F; + this.renderPlayerModel(this.localPlayer, xPos1, yPos, scale, xPos1 - mouseX, yPos - scale * 1.8F - mouseY, + partialTick); + this.renderPlayerModel(this.remotePlayer, xPos2, yPos, scale, xPos2 - mouseX, yPos - scale * 1.8F - mouseY, + partialTick); + this.disableClipping(); + this.drawCenteredString(this.fontRendererObj, this.screenTitle, this.width / 2, 10, 16777215); + this.fontRendererObj.drawStringWithShadow("Local Skin", 34, 34, 16777215); + this.fontRendererObj.drawStringWithShadow("Server Skin", this.width / 2 + 34, 34, 16777215); + GL11.glDisable(2929); + depthMask(false); + this.drawGradientRect(30, this.height - 60, mid - 30, bottom, 0, -520093697); + this.drawGradientRect(mid + 30, this.height - 60, this.width - 30, bottom, 0, -520093697); + int labelwidth = (this.width / 2 - 80) / 2; + int opacity; + if (!this.localPlayer.isUsingLocalTexture()) { + opacity = this.fontRendererObj.getStringWidth(this.skinMessage) / 2; + Gui.drawRect(40, this.height / 2 - 12, this.width / 2 - 40, this.height / 2 + 12, -1342177280); + this.fontRendererObj.drawStringWithShadow(this.skinMessage, (int) (xPos1 - opacity), this.height / 2 - 4, + 16777215); + } + + if (this.fetchingSkin) { + String opacity1 = this.throttledByMojang ? "\u00a7cMojang API Error!" : "Fetching skin..."; + int stringWidth = this.fontRendererObj.getStringWidth(opacity1) / 2; + Gui.drawRect((int) (xPos2 - labelwidth), this.height / 2 - 12, this.width - 40, this.height / 2 + 12, + -1342177280); + this.fontRendererObj.drawStringWithShadow(opacity1, (int) (xPos2 - stringWidth), this.height / 2 - 4, + 16777215); + } + + if (this.uploadingSkin || this.uploadOpacity > 0.0F) { + if (!this.uploadingSkin) { + this.uploadOpacity -= deltaTime * 0.05F; + } else if (this.uploadOpacity < 1.0F) { + this.uploadOpacity += deltaTime * 0.1F; + } + + if (this.uploadOpacity > 1.0F) { + this.uploadOpacity = 1.0F; + } + + opacity = Math.min(180, (int) (this.uploadOpacity * 180.0F)) & 255; + if (this.uploadOpacity > 0.0F) { + Gui.drawRect(0, 0, this.width, this.height, opacity << 24 | 0); + if (this.uploadingSkin) { + this.drawCenteredString(this.fontRendererObj, this.skinUploadMessage, this.width / 2, + this.height / 2, opacity << 24 | 16777215); + } + } + } + + if (this.uploadError != null) { + Gui.drawRect(0, 0, this.width, this.height, -1342177280); + this.drawCenteredString(this.fontRendererObj, "Uploading skin failed", this.width / 2, this.height / 2 - 10, + -171); + this.drawCenteredString(this.fontRendererObj, this.uploadError, this.width / 2, this.height / 2 + 2, + -43691); + } + + depthMask(true); + GL11.glEnable(2929); + } + + protected void renderVignette(int mouseX, int mouseY, float partialTick) { + GL11.glDisable(2929); + depthMask(false); + blendFunc(1, 774); + color(1.0F, 1.0F, 1.0F, 1.0F); + this.mc.getTextureManager().bindTexture(vignette); + GL11.glLogicOp(5386); + Tessellator tessellator = Tessellator.getInstance(); + WorldRenderer wr = tessellator.getWorldRenderer(); + wr.startDrawingQuads(); + wr.addVertexWithUV(0.0D, this.height, -90.0D, 0.0D, 1.0D); + wr.addVertexWithUV(this.width, this.height, -90.0D, 1.0D, 1.0D); + wr.addVertexWithUV(this.width, 0.0D, -90.0D, 1.0D, 0.0D); + wr.addVertexWithUV(0.0D, 0.0D, -90.0D, 0.0D, 0.0D); + tessellator.draw(); + depthMask(true); + GL11.glDisable(3058); + GL11.glEnable(2929); + color(1.0F, 1.0F, 1.0F, 1.0F); + blendFunc(770, 771); + } + + public void renderPlayerModel(EntityPlayerModel thePlayer, float xPosition, float yPosition, float scale, + float mouseX, float mouseY, float partialTick) { + GL11.glEnable(2903); + pushMatrix(); + translate(xPosition, yPosition, 300.0F); + scale(-scale, scale, scale); + rotate(180.0F, 0.0F, 0.0F, 1.0F); + rotate(135.0F, 0.0F, 1.0F, 0.0F); + RenderHelper.enableStandardItemLighting(); + rotate(-135.0F, 0.0F, 1.0F, 0.0F); + rotate(15.0F, 1.0F, 0.0F, 0.0F); + rotate((this.updateCounter + partialTick) * 2.5F, 0.0F, 1.0F, 0.0F); + thePlayer.rotationPitch = -((float) Math.atan(mouseY / 40.0F)) * 20.0F; + translate(0.0F, thePlayer.getYOffset(), 0.0F); + RenderManager rm = Minecraft.getMinecraft().getRenderManager(); + rm.playerViewY = 180.0F; + rm.renderEntityWithPosYaw(thePlayer, 0.0D, 0.0D, 0.0D, 1.0F, 1.0F); + popMatrix(); + RenderHelper.disableStandardItemLighting(); + GL11.glDisable('\u803a'); + } + + protected final void enableClipping(int yTop, int yBottom) { + if (this.doubleBuffer == null) { + this.doubleBuffer = BufferUtils.createByteBuffer(32).asDoubleBuffer(); + } + + this.doubleBuffer.clear(); + this.doubleBuffer.put(0.0D).put(1.0D).put(0.0D).put((-yTop)).flip(); + GL11.glClipPlane(12288, this.doubleBuffer); + this.doubleBuffer.clear(); + this.doubleBuffer.put(0.0D).put(-1.0D).put(0.0D).put(yBottom).flip(); + GL11.glClipPlane(12289, this.doubleBuffer); + GL11.glEnable(12288); + GL11.glEnable(12289); + } + + protected final void disableClipping() { + GL11.glDisable(12289); + GL11.glDisable(12288); + } + + public static boolean isPowerOfTwo(int number) { + return number != 0 && (number & number - 1) == 0; + } + + private boolean clearUploadedSkin(Session session) { + if (!this.registerServerConnection(session, skinServerId)) { + return false; + } else { + HashMap sourceData = new HashMap(); + sourceData.put("user", session.getUsername()); + sourceData.put("uuid", session.getPlayerID()); + sourceData.put("clear", "1"); + this.uploadError = null; + this.uploadingSkin = true; + this.skinUploadMessage = "Sending request to server please wait..."; + this.threadSkinUpload = new ThreadMultipartPostUpload(HDSkinManager.getGatewayUrl(), sourceData, this); + this.threadSkinUpload.start(); + return true; + } + } + + private boolean uploadSkin(Session session, File skinFile) { + if (!this.registerServerConnection(session, skinServerId)) { + return false; + } else { + HashMap sourceData = new HashMap(); + sourceData.put("user", session.getUsername()); + sourceData.put("uuid", session.getPlayerID()); + sourceData.put("skin", skinFile); + this.uploadError = null; + this.uploadingSkin = true; + this.skinUploadMessage = "Uploading skin please wait..."; + this.threadSkinUpload = new ThreadMultipartPostUpload(HDSkinManager.getGatewayUrl(), sourceData, this); + this.threadSkinUpload.start(); + return true; + } + } + + private void setUploadError(String error) { + this.uploadError = error.startsWith("ERROR: ") ? error.substring(7) : error; + this.btnUpload.enabled = true; + } + + @Override + public void onUploadComplete(String response) { + LiteLoaderLogger.info("Upload completed with: %s", new Object[] { response }); + this.uploadingSkin = false; + this.threadSkinUpload = null; + if (!response.equalsIgnoreCase("OK")) { + this.setUploadError(response); + } else { + this.pendingRemoteSkinRefresh = true; + } + } + + private boolean registerServerConnection(Session session, String serverId) { + try { + MinecraftSessionService e = (new YggdrasilAuthenticationService(this.mc.getProxy(), + UUID.randomUUID().toString())).createMinecraftSessionService(); + e.joinServer(session.getProfile(), session.getToken(), serverId); + return true; + } catch (AuthenticationException var4) { + this.setUploadError(var4.toString()); + var4.printStackTrace(); + return false; + } + } +} diff --git a/src/main/java/com/voxelmodpack/hdskins/gui/HDSkinsConfigPanel.java b/src/main/java/com/voxelmodpack/hdskins/gui/HDSkinsConfigPanel.java new file mode 100644 index 00000000..5888b4fc --- /dev/null +++ b/src/main/java/com/voxelmodpack/hdskins/gui/HDSkinsConfigPanel.java @@ -0,0 +1,46 @@ +package com.voxelmodpack.hdskins.gui; + +import com.voxelmodpack.common.properties.VoxelPropertyToggleButton; +import com.voxelmodpack.common.properties.gui.GuiVoxelBoxSettingsPanel; +import com.voxelmodpack.common.properties.interfaces.IVoxelPropertyProviderBoolean; +import com.voxelmodpack.hdskins.HDSkinManager; + +public class HDSkinsConfigPanel extends GuiVoxelBoxSettingsPanel implements IVoxelPropertyProviderBoolean { + + public HDSkinsConfigPanel() { + this.properties.add(new VoxelPropertyToggleButton(this, "clear", "Clear local skin cache", 72, 8, 120, 70, 16)); + } + + @Override + public String getPanelTitle() { + return "HD Skins Settings"; + } + + @Override + public String getStringProperty(String propertyName) { + return null; + } + + @Override + public String getOptionDisplayString(String propertyName) { + return "Clear now"; + } + + @Override + public void toggleOption(String propertyName) { + HDSkinManager.clearSkinCache(); + } + + @Override + public String getDefaultPropertyValue(String propertyName) { + return null; + } + + @Override + public void setProperty(String propertyName, boolean value) {} + + @Override + public boolean getBoolProperty(String propertyName) { + return true; + } +} diff --git a/src/main/java/com/voxelmodpack/hdskins/gui/RenderPlayerModel.java b/src/main/java/com/voxelmodpack/hdskins/gui/RenderPlayerModel.java new file mode 100644 index 00000000..1ff6a9f2 --- /dev/null +++ b/src/main/java/com/voxelmodpack/hdskins/gui/RenderPlayerModel.java @@ -0,0 +1,64 @@ +package com.voxelmodpack.hdskins.gui; + +import static net.minecraft.client.renderer.GlStateManager.*; + +import org.lwjgl.opengl.GL11; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.model.ModelPlayer; +import net.minecraft.client.renderer.entity.RenderLiving; +import net.minecraft.client.renderer.entity.RenderManager; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLiving; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.util.ResourceLocation; + +public class RenderPlayerModel extends RenderLiving { + + public RenderPlayerModel(RenderManager renderer) { + super(renderer, new ModelPlayer(0, false), 0.0F); + } + + @Override + protected ResourceLocation getEntityTexture(Entity var1) { + return ((EntityPlayerModel) var1).getSkinTexture(); + } + + @Override + protected boolean canRenderName(EntityLivingBase targetEntity) { + if (Minecraft.getMinecraft().thePlayer != null) { + return super.canRenderName(targetEntity); + } + return false; + } + + @Override + protected boolean setBrightness(EntityLivingBase entitylivingbaseIn, float partialTicks, boolean p_177092_3_) { + if (Minecraft.getMinecraft().theWorld != null) { + return super.setBrightness(entitylivingbaseIn, partialTicks, p_177092_3_); + } + return false; + } + + @Override + public void doRender(Entity par1Entity, double par2, double par4, double par6, float par8, float par9) { + GL11.glPushAttrib(GL11.GL_ALL_ATTRIB_BITS); + this.doRender((EntityLiving) par1Entity, par2, par4, par6, par8, par9); + popAttrib(); + pushMatrix(); + scale(1.0F, -1.0F, 1.0F); + GL11.glPushAttrib(GL11.GL_ALL_ATTRIB_BITS); + this.doRender((EntityLiving) par1Entity, par2, par4, par6, par8, par9); + popAttrib(); + popMatrix(); + } + + @Override + protected void preRenderCallback(EntityLivingBase par1EntityLiving, float par2) { + this.renderCloak((EntityPlayerModel) par1EntityLiving, par2); + } + + protected void renderCloak(EntityPlayerModel entity, float par2) { + super.preRenderCallback(entity, par2); + } +} diff --git a/src/main/java/com/voxelmodpack/hdskins/mod/HDSkinsMod.java b/src/main/java/com/voxelmodpack/hdskins/mod/HDSkinsMod.java new file mode 100644 index 00000000..0c65b20b --- /dev/null +++ b/src/main/java/com/voxelmodpack/hdskins/mod/HDSkinsMod.java @@ -0,0 +1,7 @@ +package com.voxelmodpack.hdskins.mod; + +import com.mumfrey.liteloader.Configurable; +import com.mumfrey.liteloader.InitCompleteListener; + +public interface HDSkinsMod extends InitCompleteListener, Configurable { +} diff --git a/src/main/java/com/voxelmodpack/hdskins/mod/HDSkinsModCore.java b/src/main/java/com/voxelmodpack/hdskins/mod/HDSkinsModCore.java new file mode 100644 index 00000000..2a6850b8 --- /dev/null +++ b/src/main/java/com/voxelmodpack/hdskins/mod/HDSkinsModCore.java @@ -0,0 +1,79 @@ +package com.voxelmodpack.hdskins.mod; + +import java.io.File; +import java.lang.reflect.Method; + +import com.mumfrey.liteloader.core.LiteLoader; +import com.mumfrey.liteloader.modconfig.ConfigPanel; +import com.mumfrey.liteloader.util.ModUtilities; +import com.voxelmodpack.hdskins.HDSkinManager; +import com.voxelmodpack.hdskins.gui.EntityPlayerModel; +import com.voxelmodpack.hdskins.gui.GuiSkins; +import com.voxelmodpack.hdskins.gui.HDSkinsConfigPanel; +import com.voxelmodpack.hdskins.gui.RenderPlayerModel; +import com.voxelmodpack.voxelmenu.IPanoramaRenderer; + +import net.minecraft.client.Minecraft; + +public class HDSkinsModCore implements HDSkinsMod { + @Override + public String getName() { + return "HD Skins"; + } + + @Override + public String getVersion() { + return "4.0.0"; + } + + @Override + public void init(File configPath) { + try { + Class ex = Class.forName("com.thevoxelbox.voxelmenu.GuiMainMenuVoxelBox"); + Method mRegisterCustomScreen = ex.getDeclaredMethod("registerCustomScreen", + new Class[] { Class.class, String.class }); + mRegisterCustomScreen.invoke(null, GuiSkins.class, "HD Skins Manager"); + } catch (ClassNotFoundException var4) { + ; + } catch (Exception var5) { + var5.printStackTrace(); + } + + } + + @Override + public void upgradeSettings(String version, File configPath, File oldConfigPath) { + HDSkinManager.clearSkinCache(); + } + + @Override + public Class getConfigPanelClass() { + return HDSkinsConfigPanel.class; + } + + @Override + public void onInitCompleted(Minecraft minecraft, LiteLoader loader) { + ModUtilities.addRenderer(EntityPlayerModel.class, new RenderPlayerModel(minecraft.getRenderManager())); + } + + @Override + public void onTick(Minecraft minecraft, float partialTicks, boolean inGame, boolean clock) {} + + public static IPanoramaRenderer getPanoramaRenderer(IPanoramaRenderer fallbackRenderer) { + try { + Class ex = Class.forName("com.thevoxelbox.voxelmenu.VoxelMenuModCore"); + Method mGetPanoramaRenderer = ex.getDeclaredMethod("getPanoramaRenderer", new Class[0]); + IPanoramaRenderer panoramaRenderer = (IPanoramaRenderer) mGetPanoramaRenderer.invoke((Object) null, + new Object[0]); + if (panoramaRenderer != null) { + return panoramaRenderer; + } + } catch (ClassNotFoundException var4) { + ; + } catch (Exception var5) { + var5.printStackTrace(); + } + + return fallbackRenderer; + } +} diff --git a/src/main/java/com/voxelmodpack/hdskins/mod/LiteModHDSkins.java b/src/main/java/com/voxelmodpack/hdskins/mod/LiteModHDSkins.java new file mode 100644 index 00000000..8e6988ef --- /dev/null +++ b/src/main/java/com/voxelmodpack/hdskins/mod/LiteModHDSkins.java @@ -0,0 +1,19 @@ +package com.voxelmodpack.hdskins.mod; + +import com.voxelmodpack.common.VoxelCommonLiteMod; + +public class LiteModHDSkins extends VoxelCommonLiteMod { + public LiteModHDSkins() { + super("com.voxelmodpack.hdskins.mod.HDSkinsModCore"); + } + + @Override +public String getVersion() { + return "4.0.1"; + } + + @Override +public String getName() { + return "HDSkins"; + } +} diff --git a/src/main/java/com/voxelmodpack/voxelmenu/IPanoramaRenderer.java b/src/main/java/com/voxelmodpack/voxelmenu/IPanoramaRenderer.java new file mode 100644 index 00000000..b618d244 --- /dev/null +++ b/src/main/java/com/voxelmodpack/voxelmenu/IPanoramaRenderer.java @@ -0,0 +1,15 @@ +package com.voxelmodpack.voxelmenu; + +import net.minecraft.client.Minecraft; + +public interface IPanoramaRenderer { + void setPanoramaResolution(Minecraft var1, int var2, int var3); + + void initPanoramaRenderer(); + + void updatePanorama(); + + boolean renderPanorama(int var1, int var2, float var3); + + int getUpdateCounter(); +} diff --git a/src/main/resources/assets/hdskins/textures/cubemaps/cubemap0_0.png b/src/main/resources/assets/hdskins/textures/cubemaps/cubemap0_0.png new file mode 100644 index 0000000000000000000000000000000000000000..64d152ed2a4d308744c44bffa267af13e813d4e4 GIT binary patch literal 11342 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 EA6*&(y8r+H literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hdskins/textures/cubemaps/cubemap0_1.png b/src/main/resources/assets/hdskins/textures/cubemaps/cubemap0_1.png new file mode 100644 index 0000000000000000000000000000000000000000..8f8b83a4f64f4c44e8ab3238b2423cb13bbd5d64 GIT binary patch literal 12143 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 kavZpj#FP{8=6(Bk@VRQq0i*KaH58jsO4v literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hdskins/textures/cubemaps/cubemap0_2.png b/src/main/resources/assets/hdskins/textures/cubemaps/cubemap0_2.png new file mode 100644 index 0000000000000000000000000000000000000000..d27fab3f79bab0198b0874d9f96992594443b1e1 GIT binary patch literal 11219 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 KBr3#ALjMOx?d2N) literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hdskins/textures/cubemaps/cubemap0_4.png b/src/main/resources/assets/hdskins/textures/cubemaps/cubemap0_4.png new file mode 100644 index 0000000000000000000000000000000000000000..b7692f231970d685b0ddf0d9d6991999f28bab3a GIT binary patch literal 10534 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 W1tFut%>?c^g4C3>6l>+JqW%x>rH85j literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hdskins/textures/cubemaps/cubemap0_5.png b/src/main/resources/assets/hdskins/textures/cubemaps/cubemap0_5.png new file mode 100644 index 0000000000000000000000000000000000000000..f05f3a12bdf1ed33401963b66134639c0baf7be5 GIT binary patch literal 9282 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 Hu0mjfZARQ3 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_10.png b/src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_10.png new file mode 100644 index 0000000000000000000000000000000000000000..a15e33d692ad65c0356054ccee734b4553b57378 GIT binary patch literal 941 zcmV;e15*5nP)~1!8t9zNu?9A-E-+S*rlQ9;a z?6TGzeq+GW^YM1gqTf_L%w2~5%{y$()1TkNiJ>dJtLJ*<>4Tk=wDZ)OPOd7epQ&zld8%$;|!ui>}01;LS zR3^Uwtedt)7k7vp5q=$9F;VUl?DHG&usCbO77Q`{t4HhQs7` zCo$3j;1N*GuYxU?GQxO#RNfD2yqLEh{xh`?A_7z%SB1W8JQ=JLNi6^#0kPSgO#;a2 zwgUjoNr2^D#>tzi_P_vigyfInV*MEJCZb!Iw$kvIITm9ijWlq4&`;m(P zG7gO=!{y&WjE_VLc#Qxr-e2|rDCA`b$>(t)TC{!k4Ez?ayEk;(+OdtpXxANr9F;r* zX?@gA2fe;TpRH@TR2Fqt5#%|K^&kL*ezf5Zfdi0JGjsqt0n}+irvdQ)I(&UCMSwiW zD*#FbEb%}T1^`uxQd?jEO}9hRZop~k>ar%tdO#;e9Pj0hLA4w4w#xRmuFKL!Kqmm` zz&X8d6#xn#ik_FPh`D4_deYK|2Yhe0% z4wkm=f#FIwWX)Zwb+vq7&CkH>x~G87h#bVRLZJ{XfL}kBENkX4tQvd-xntvSb8iVA zmo7#Q0i8cEbP3G4%_|E4kFr=STA54+>gBgEGCBqD;%B4~$a&bk8qA44M@_5>*uNuJ zK)GCY#r#0eSZn|mGSiU1WBvnx1>yyO=3tJH#iKF@;OVmq>>oO%CBFSG;st;l#9ovn zwIxAb0qM>GzqV_cM*zISK$IY9V?PiQqX5<^JaL)hEO`u(P$8fqq~(|;i*)rGo(|Cc zPcXc$OI03_)e*55K0FH<0Gx})Q!&IAMF<0%%6VGDtB_IxSl$2XQ36mok2VAXKu#l!Bmj^lKuVy#0pJ6q0$tAk4JYY69!6%W1gKO1 zFME98;L&c!V5%P;ysJAlo;#FwjpG>qu8(ndDk!JJ>w&C!y+SGW#L}(2D$7CBzLtRq6Ut0DD@k0ARx*3IMEqq)-|Q4S;tz z%niUQfz1ar9yCXYY~ja5d4dI|R6ra6NFhNJq+bB&1I^|8*Z_!r{SA8JeBw+b0QS{3 z=!qv904sA;Ls;i=y+kQM$Gx9;1?Yy*R)FB8Omq$Y7q@`!({Ja1b`tb=3p^=Z1N^sN ltyUBEu@yoq6#^;%zX1n1Uk9`)htdE5002ovPDHLkV1n|^cbEVG literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_101.png b/src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_101.png new file mode 100644 index 0000000000000000000000000000000000000000..35ee03e5afae14a5e71b2048645b831be156dae7 GIT binary patch literal 3689 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 Hu0mjfoy7%> literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_102.png b/src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_102.png new file mode 100644 index 0000000000000000000000000000000000000000..e12ab761c8e6e584867cc39d72c5537c0f77ee53 GIT binary patch literal 3929 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_106.png b/src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_106.png new file mode 100644 index 0000000000000000000000000000000000000000..23733d826aab1009b6e013b64fb0cf82807156ff GIT binary patch literal 1760 zcmV<61|Ru}P)BtE&sPRXd>OY#XcpwO|w*w=Z+M-OQi1mKKPN zj)v~Lcj1oP&B|zA4|mj06z%aJne`v60N9>g$@<;6I}O@y-jo6G&NFA5x*;z)oZXwW ztsPRPMJfQyDijSJCkGG!@4PKElr>SECIGy_EQEmsfRW!^>xPqcc1WG-g5($*kODB` zXY(SM0;~eCq=4SuUeW#AWJbvh1SANp?9zb#&K==q3xNq5++))L| zm+PUip&7~@(@iU2&!$@O>Xl~ZPi(xC{pYVAr~(MU{I!Yl6o?xW#3GHdr-#Y^xOUAA2tdn71p@(q`fs}Gf|yvl{5rgTpsRpZ z4p@CmTIPH~pn6mTTJ`A$2y`Yeb)fBHIQ*AMSc}t3q}!dZc2id zrrVJG^d-d@YrlUSqGN`EGv=I62h21~&7b5mp*@+~Dh_>AQV2Rs&eJviM}_#B2KYQC zPc)i3YM{CR(D}H;5$u^CDw<>n==_ZI7*^kS;a0yOOfN}gNzTX#a`cJimqk*5k@EOYLSNPxl}IG$RN+AdDCxF^_}bwqJ%(f(Kvuik*bNsELHr@KVlU*INdsBMU*(u6mwIu!%n znNsHkASl4b>U!>VgINH1dzA0nyi|G(0zmV1K;aJnetgwo;~{wRGi?3Guf*}?qPRY( z53)uFXam@HsYiS{{1G_p{ugFP_dtm7lP&-xtY@2+xLC6u0KEf>{sP!}BnuXo-GDKk z6Q6<^fx_HUlnPwvnaU z0B|qhy0RL=C)UgT;DHEki81L#NB*M-cuQNbVi^>Jo|W5ix0k!45(?f*W5-^+8MSGt z3j4t4)P2#tm;-owKf8)uPMMm>{^Q{ZCOSREvQ+>9pdkeQG{`Cd?1Q$vSf+t%)#=V7 zt`VQbh@xRsc_RP^K4@Uo*P5h*1j_*MA%cKqIuP*(01XfiJtL!{;O?C}><`QS8f~L7 zqG$x2fTK$Q+Du^#F?!8#)VUI-B%gs9}EC=y7&tzd#V8} zn%fAUeSp?AX^KxPRx;3zF>r#ab?P2%N@{0~G^OC5QB#224 zm*2v!8t5$A%le8~u@Ke{Phm?kInBo7$M|+1U8(;a;A^jpFLZTj|MYDiet*lX^_glF zz?O5<*w148&*Jz~*?UQ6A%A7J7htL|Gd`nF;r{_c-@fFtR9;>H0000{ecG6!U=vF5MX9t~HaCQNqeZXzB0 z0Ybc&>#J#ccS)M-QN7EOUX#3g-*?~p-c{+z;}<(vnWDrU%-LpyO~S|6#_d^_d^cXn zM1G-nPw{%=>WE&?>@aa1Ho~5*k4v6+*kJV%3tJxupgN$sq3OB_0RS2XkdY_?0JNwA zUGQAhe?b8#X_R^5NmDm`_j_p?(CoNkRJ{Fynx0amZ_UCJF)|S(LX79(_PZ{xWz!5Ah`c4st;3 z_a%x_%1KeJML_`eeX;Jb_Dz8MJ$<=^f)yZuKP^?r&HWQ`su_O1Q0|b;wPmtjtMu@S z1euT!Rs!(!#aP3DAF2dAlvO@C7Z0Skm-E!%l)ZTF8UU`JH%Vc4)%yPpzqB#$>!(yB|BW?Gd+IcbGz|IW^>u0!Sh%eCKwd~VjS!ufgUh$)4OLv z)|b4m#m|=6#X$h1Xw(G)F#&KGNQ5Q$xDHs zko+)ZRX$n-bf)Kdyv%0{>VNDA@XK#x1Vkx+>k8^BVB`e!B^qJ_P}9_eZot>H8CN&M2%k0j6^Z0)AJ!Z$cGV#m3bSP%A z#d7zj>kfYVz%rQ(D;zwE&AxThsx z9P92{SCu8OZBadKvUEcF@ z0%55yPiZh12C-T}fN`iR&=iVuDJ?);2tuIBFL$v30LM@Ty)g42SnMkUY~9Kc8!t)P zZI!7$e=nOnE!%o3<}X{+&_a$)l@2(cwhmT(-t{HL`WEj4RLVTCx|O=(!3u?lcd1|yA#Tzab41&iQ*`u1E3nqBu&$wtra^5 pv;YJk(6Rt>u@ZnA7p;X0`~$rGdUVwDG1CA5002ovPDHLkV1oQFz?uL6 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_109.png b/src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_109.png new file mode 100644 index 0000000000000000000000000000000000000000..1378a1f137804db1d605c694272cfd96ba4c07d8 GIT binary patch literal 986 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 D10UKu literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_112.png b/src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_112.png new file mode 100644 index 0000000000000000000000000000000000000000..b76f93a9e742d0d2f9ab9bba82b7a98f616bd5f1 GIT binary patch literal 908 zcmV;719SX|P)57&)fXIFYT=L#4$GTvFyId=>kh{t>g3ZKCGR|wsPNf zqxbG3KWx41@WhY#zYZix1c;s<9}6YmQ1b!rer~`A2_gX|-~rs4fZ^_3KtRpKqlqeE zMG^o7%-(v&k_Jz*G);jx@{gqeNQP=a(zU=u0YsFlPMD;Dbqa_CBwhha7epyQRs6`W zL|%2gH6Ge*-f>|t`H>DXSM{u$tKQg6(EAY-T8)%jK5_~=YF@OLw5>n@2-99 zLht@1CIy0QNKh#N=RpDh!FkahT3?!@HkkH?-K$C~kf~L``Hqv^-oxvk*y$@fxf=TV zAM-h^K@ksnKC)9?JNO)}*?|9}CS}xApfHCsa-?kupjr@000Dh@Z;Bo1NON45uHE3@ zn^!OM?~DFPcDQ|8Z1A=O=*W#CKvxL0DWJOOeLm0jWHNk7{M$C-@_t`-C&QRoa z^D19ry#hK=0FFUK{44k{1-P&c8>(NDn5Wl6TLUQ4vLhw=^PH8RPl_bwQ#EyE@Ac@1 z&#o{9b|@gCVe-%PGVk@&cmLhsAZuu8Vfc!JE=X0^^6BE-4Dvsc0PK}XNRj}Rf5rqL zVgz0$K}CR#{6PYZ;%vdxC*yr#0WvjWodPxlm^u-6pOX{_`z?SANM1oCOKA|71WF4O zAQy@-@h|L^0j5X=xFSFV&+CbUl&ClY033bzs#HMp#5y*2JnalTJ=0MNUG@|p>Cg9! zu+0q{*;r$>6Zuyh0dUxLFHkWxfcgO!g->qOR(uM?edA5eRg3~mz{J_JMu0)1w(PG! ioXDD2*;8dtrU*9fsidO@kch}s7&+PH|?xzSC~vPA?%r4T{7Fo+hlDyW5STm(fy z5Upy{szpCkbU_VNw7RDGm)U9F8Ncz|bLXCOuFlk=IUC10zwdM2?>lGIS$=Rxq))tZ zXsz@ujtG9n&&EO>ZBK2HUr}dcmhMb^qp5~DniH!CtFMS9dWC7l_-`4>5_?Y;J|kptkd2M&*r3Bc^*jTpenQ}T#maa>dvMCAa0xPPEv?ErQ6;DlHlaJ*1W``$JM5W)apF$jZv zw%D?^Apr63+b8K=Dy;?Z^1B}z<;wLv5jy}O000jgmI#Z46LfiCBLH|@%wqz89Ds7N zX^8Glc9n35%>gn1%vvrC;s(&s@VH303L-WDatK5X0OQ$)02~mu`}{6)0AWc`1;9tv zW^w>SFeSm*bAWp8mrFJr0(=6X9qs|9f_|rV?I=0lXIFoF{WH@o!P!2xL{#fu8_w+> zqHCYKXu-W=n3CMtk3w)CT)lo@Fs;uq0qCj8(d}{nE`UYL!cph;*UrHJXnv4} z=Z^(#JJYwQKiy4><1OAf&*J%#Vj1CYrN2!a6{#==E&jCTv0H`GXc|3XdId{kaWZ~+!gwX*qttYGgt*;}cznuj;4*;ro$^Pts zjGOqTfBLrX&AZle3qZiirci)*gbswG;M)N27y#aJZosn&!x{j@vvBztgF-M88b9lH z9&Na-4B%pJ{YuLaY!V^wK8xoKyD=t&{1wUKWgw`x27rz_2L!t=TSj@7g>#h~PTJ2| z&2ZLL3{>p^w>awevi$wdg5{1T`}5xiT4($)FOZ!UQy@77{_|7d Y54|2Gd`SjiY5)KL07*qoM6N<$f~%O)9smFU literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_114.png b/src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_114.png new file mode 100644 index 0000000000000000000000000000000000000000..a5e17a0d819421fefd8f808036c6f2177a5be30d GIT binary patch literal 885 zcmV-*1B(2KP)fS`~_kOYGSObgfup(M6?qU zA%j^pHAS3D?lbuP$^~F8KwL|$9Fl(X1?L0627$6K1xiQ60igR60iZyw zHQc*33g4E0z`&J0qig2z9JIB!!re#LK`9jr$OnQC04|nxid-m(ln&tHF&5cpa1N&f zRu>dpzH!Qccs}{cXd*CAN2j5wJ8b7{1Axz*fDVc2!gB0#Z8=)eJUw00Q>qW_mCjh%PDaumu7z7?Ee!09NZ`lNXk9|^;!i;Fwes6t7VfhT0Xy?>@q*& zA1QuaW)8Q!c7E%(nSmZTZpWwip4#)xkK2Smk6;G>@ zD?S1e_gM%45|2US@{`qS;OhW{R2KmF%g+$&lZ6`sfXqI<(cMx2C}SuZfn*`Rp?W}O zTR$;TLzF;X;@RxU%1{^kfV|4U#{sSvE`@A_>KVWvIY^eAIkox`00000 LNkvXXu0mjfwAYIW literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_115.png b/src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_115.png new file mode 100644 index 0000000000000000000000000000000000000000..4074f48b65c705c60021265db014fdef31a956a7 GIT binary patch literal 928 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 Q`~Uy|07*qoM6N<$f>T~wApigX literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_118.png b/src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_118.png new file mode 100644 index 0000000000000000000000000000000000000000..eed238fb928a42b23496ebb7dd4895b65661551d GIT binary patch literal 972 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 Qv;Y7A07*qoM6N<$f}>DGJ^%m! literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_123.png b/src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_123.png new file mode 100644 index 0000000000000000000000000000000000000000..f480b06921af174696260b1de078c3166c5d3f5b GIT binary patch literal 1093 zcmV-L1iJf)P)zw@*l3qR zP6JB76p2QQkVsOW1O$VEoM4rxIq!}Bm$#GInYr6NFUDzhc4ubyz2E%bo0&UrHoYm= zp4l%3yDoYnUyhv3|AiQEtZSJZ zbNccNA3)|*uY8v5IT;&(?nI4%!*r!WKu~XfG%IZ*=lLYKLa+i*$--)HC@Fy9;bAG0#>PgELV!C&3W!oRuHGSs11b+MdPX6j&N{y*1*py= z1YJ~MRY3M@HsJ7ut5rhH0dW9O-vJwqY9xDLMJ`CK} zu+_JfjEqYGVGv)9zFy!ofv^FPVUkb8HWd`CfXbDte7VMv0}ujX0DA8C%9-aX;Pvl) z+smT>z6z8g1n^EB0E7eeDLH`gPtT3(WEAHy7W)Y7As}DcN7Supv99U5Bp4O~h3*x+ zFaUYOM83_*e_P+E0LTbH;2SX{Lu#j7!28&8102%=Acu1K)zI^TlLH{s&I|g60gD3w zAmF>YooOMfgAo8V0zzG1znD0&PXd|v{CiKp+s2RYm7r{DAqZ5|ZL~`W=wt|~7qc|- z_l1T496k4DTHM{TPL5F(fHs@+JQq-%pCO6`fOi4}!oVqJStla^^<|^aZplXt?UxGu zPH6wA0HPY=41k=6X^QC*+pIqGqqwd!Kd1qK&c2cXuq8kOxR?N_r(G4QlLGjl#R!1g2ZiF96@cluNHeL* zR((d2g)C7wDM0NHLn&|YLivIUm%KWAF80xJ+f=+b0nmrYLDwW`i}$zyPy(c+r@KZ5 zprfloFs%SK2yrOjuLA%Sk|-5Z_FobJcwBQu=wcM@7_%e*s7{%ZjtZ;n0Qk?~YP?|v zxsjCMkfCi!%DU_MlQdoW>AvM+AN}fV%mM2E0P0SQJ4;5C6MzbV0NCs+7y$o>%LhzZ z+GS>KA)tE)zUg9LQ2_Yn#74Lr01C0s8330y>grVu0cv+S;MkI)i&BcUueIev;2$UT zA1JSNS6cooPNz58u&8z2Jq)HXwm&{>&e=i$TVz-J)PAG=86$vS!6hCwV?)Ka00000 LNkvXXu0mjf0zL9c literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_124.png b/src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_124.png new file mode 100644 index 0000000000000000000000000000000000000000..0bed83c672d60308891235045c8449b90f846b52 GIT binary patch literal 1072 zcmV-01kd}4P)D6NEvgox}H3H}E`t=a@_3UX1aXw#;G)@=-$PG|HTgL?VtZ1$ddFL~S9+Bzk|~ zIqM!6==Gfflp=UFDZ!WmlT(vvIX^X91`kGhKuiNZ1^7I*O$8AGy~7p&KmSPDdG@M(~30Q5fF6wnpAjEbO40kQ=}0Dg7?oq>4=AX9+KU>-tH>5FUU z9e}Awhz27Bzs?glzIf3Z-Y#Lap9f6=nuq5IzIIXVP*#1KsN2R&TO6$+0^ko*D+K^; zp~DnkIJE%KLDzMm>RvlcjV0jI#Y@bm-M4Q+d1VzO&bNZ&INE()Ry*?Y& zTon7i43DO|$#DXK4|dd414dXjSJp3%Gb(^4p!4K7|J#;?>KwrrK?1=8L1*KQN%oqS zEndO#TF1DTkEn#6(v%uxb8T$127rqNRR9@6f2r|)rME#93@re1n4f&2Il`hq=ZErj z)9i6Yc?Ihag+gv`Uw_&+0IV55r+>kLhI;6F_1PvcR%3Mb(E@bPs}0wttvM7MV)s@6 zc)Js!w3KRDdi+vj#wPSlj{7VOitTfSfnU8s}icdO=N>GP2!B?E5ylxOJ04#u5^kmnJ0jLy!j>#e_MuNtOUybRssrs6X z>l6e4ev9*~0Nv+uQ@Ruk05pW6MY&5+J@syo`SJ8%U0QCdqHg0fKc*lQz#AmWwrb%d zdz>ihWLFzm`+-n!0Q?xAjj^i$xIbtFRJIM~bQj1*B!jN8s(@7m{QpLwN`Yq&??5;l qhFB~ny=Ht63M$`h%(F=W6M%o;*+`uIk1pi^0000Jsl>PH!m?z8`oE@$m@5bkDt z?gaVgV0bT9CH5t8@sOzuPaf_iIR(H{ z3^9QKi%|4b01E_+0QmQ#?!V=lY|(;E&&B|3PxYx)w++ z;D!5d_Jq%1HnP~x?K=nt0NyM>?-)mqt&=h0SUmuWU4Oqz3~zfjGnjBQGQ^58F*F5x zfwiNHZQP^>P9?Zf0(v_FISVlo3IL!38GvfAnvGA6*lGk<0KoLSdwRedX0X`CCWg;G zvI79*!T1HiIC5KvA~z0H0Kf`Tf&n05#KN#qOBn1) zSXKZ900{VBd&}_R9HRYBPDs!r06^|S?n{uA0+2mb@NYGkJAo;b9KYf!M~LdwP+}pr zG5};AQCR?HG05}YF79CN);&9^76`OX0WkN20s%QC5S;~vOA3JX8(;we;)B?D%YYvz z)?lQ(i&L_}N%qsT+u#u8lTt-V!i1_-n1Q%@XQU)`eC|Ux2j*UwILzHd1puF%23X&x zM>iO#6#yXfu=UT$2>@*FqgenPu5!ccM%R6OV2>dWI>0=OO$;Q5E>3J9z)}Fd06>p< zbhC*{0mzz&4FGJOK=vrTvH-;a01I81hd|kY!y*K4B;gx?AU1Z1Q3px^gxm+Kx^bCD zFa;2@0GGkkh+#s3Kx_bjs&7!$jg6*R08pcl8?pf~*s{QYq=3;ZK!tjKGz$<2fk9me zj`%DvWC8#*_y}sD!J4ng&DhhhG z>&D}42Vk=V40sz?_WOowlK0@;bG;0V^GXQXv fg~Swsga%vy&hKOF`#{x;00000NkvXXu0mjfI_i29 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_126.png b/src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_126.png new file mode 100644 index 0000000000000000000000000000000000000000..bbd93f409df8e1910f28e515f066ee87d0f3d24b GIT binary patch literal 855 zcmV-d1E~CoP)&Z*k@n%?i~>HfBTr(Z9q={wik-YglT~ZF{HoyIzm8 z`lHp&rFdjuytRmJLTEAs0B6!1J$UVG^yuzPEc;xYhpje$+UVIP>=pp5YeGQu5n%}c z&U36S`py8>R#xJ{p&@m+T8;Js0Ls1)07W}&D(JwMUkZ+*LFV$zn*bR7pb9|rrBP5q zkqrRo7?Pj~fMD<`0k}f21-Nj@rzt=J&<+bl@R^l@^N}y`?#6?$d{tntDIiUK00L*> zG#bAL0brBJZXX9EUULtb_05EcvFMi&vW|mULb(@9Y3dP3j6(fHRcP6UXW7g?&hZ6i z1Hko|5G4S)SEox+R{*du9E#)r`7w$j4aL?M0sx(qYne44j%D?;FAadaOLSC#bpFMM zXX@j-H8pediC%YV{;|4nd00(ceAu!<0`h^7rU0M$ax9?`R#x&C+h;` z3_wRbfq)kBwipTk>|zdZi9A7N0-(c^Y9fDKx6S(l9g*+xQy0d_b2mAAFRy4?^Rw)8 z-NXq%-_d{ff$g7loPTcsGzK7Qw@9_cghlu7}v$2*JO_P;Kdnl#VLyQQD=pk1T@g|-GZyp4#J&1^S5vpLtiv7V$^&mOa3VQHT z1dm=tyhgA{1tIoO6GPC31~+Na*1XexVY2S-Oqy&GN(Mr9cYb!>XTG1=@fF@hw*nX9 zKH4eiI%5lPoDSD@WBB}u4KeN3a*`swax73E0ww1^+~P7T=o3d z82~=achi}X4ITZ|OaKsX7IR`=tLeP>_Y455SAl3WfIsFh%Kz>bug{lq6zmCA7NUPJ zNQOToAb1WyC7fsF1%TDGDTasmyqTn+F)Uz2!iR)-Kwvj%xCJacekFXS*#HvDKWON{ zK$SRQ1r`8uj6hxN+ug>-fK~y(in58zL68AJxHSNJ0-zOH0K!v0Gqx5WM`F7y(Qp@N z1pu8i$l|M9pd1%si#O|Yfm#J?<;EHsVIRQ0F8lNKqf;UlApk;r;`F9K9;{>3tLCc+GE5cY# zR-kl&vAGP*-@hZ~!>#}TC?k)a(Ddl`{(ZN_YXF=^If%-;NYp6-$ihr>N!%JneXA~y zS%&Ev#dix9{pXM#KKVBWai%38iocs-CT_ zz83e^{@e)lZfA-*^HZf+*L{G_3ou#vROr*QC52dHKi@M7{Kmh=iFx`yMwg4a);(4_JMSiwt0kAtju)NZ2 z8I4?hysPajKz0S|Dg#2JR-WI}wg7Z}xZZXh02*n!sac@j6|J>@#{xPQpx&u=TtIQ+ Z^baPM8L3LA7oq?F002ovPDHLkV1lq>ySxAZ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_128.png b/src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_128.png new file mode 100644 index 0000000000000000000000000000000000000000..c6e5fc48378d621e123da33bc06e1bb37ac04f70 GIT binary patch literal 2108 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_13.png b/src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_13.png new file mode 100644 index 0000000000000000000000000000000000000000..1a3c02f8217de8933a6d18c44ce9595247136b0d GIT binary patch literal 692 zcmV;l0!#ggP)Y5Zx=aQVT`@g56GTC@hyjCw5o|8_ z7ve`@Y^_%3WRA_bx4XFyjq$Fz+r6FH*|%@r&Ykvt(nDwWM@aT8rP2HZP2bND`}O?# zK;olulDo)R_l~yiZ{yr_@O-m#jSUTGZv3K6DxIMsdo30_ruqE1HHnh}1PT`h*DwIs z(fJDiEUhN#)ox@d1hAI@AqAlFR;kL7 zgM&*Y4S-bmZ2%w!nMOzfz}?4H-xgo$9st;V)S`dE05<2(uWl%wMzB*q!T^{k(%Wer zgV6Sa{;C?l?l^ly`T_tr_v=U#DI!noR74EMhycJj*&0PPJ-}8&H4PdBC$*PR7y)ns z7ZwYbCjgv^o0a9ss(C*Z)oeTU*UA7D6&Lvwu>$~+38cjUQFT`?ACjHzBSI-9>CLPK z0JIktr$|@Vv@AyRy%z?ECU8m*UjTreUQf=GwZyI&gPj5R4*UN!12B(7T5w(bDv}2K zhLv`m9aQ%WkO2UT$Az=csz?M0051lW{I@iKbr2*2yacKWbgkpKA3x{>DbG4R&Fq<9 zVOV3&&3&aqYfEcYf31PI883wxB_C!*^*F${xyZ}>t; a2EYf2MVfZr(s`Ny0000kau=9O>eBST-JWm)oue8nT$r*cizF-k+X_{uT0N48Q zAxqE2xySP7SD)vt)M8}6STyq+Yd!A@PcQ5$my5_kmF3fC05@pbCbw-Ek1`)h??(Xu zNy7pdz5&qn`yK_10{}=GRIs|d!~s-Z-$`(ys+6HAsLY9E) zd&4lKy&M6!X@eM_2vJl};De7H7zKbz8x;2rsv%MUx~{WEHO->$9d=Mk@c1t?4c1wR zvcyW6WwTi&5l{hOBJiY4fMQVM3}J7hQUHb185WWPQm^8rnPXMrf44Naz0Kf>Uz^mlD*Gbw2J&~Ga1g?U;h&lqW%N{n@>NOs)eSSbG z2RTb*t+e{5P(ygpb%C$LDjvK_=cT4{ykJcr~rpw zf+!MGm9ffxN_^oJ=>Fptc7Y)v!Xg+J!3i&dzYB@BkX-Q}?*IS*07*qoM6N<$f*m*_ Ar2qf` literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_131.png b/src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_131.png new file mode 100644 index 0000000000000000000000000000000000000000..c4e8e3af8898d03af1dcc5bdaefb67dd1fad3085 GIT binary patch literal 2369 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_134.png b/src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_134.png new file mode 100644 index 0000000000000000000000000000000000000000..d54ee3348b310a80ddef72ff97456a81d1ab0b2b GIT binary patch literal 916 zcmV;F18e+=P)ey7Tzpk2niG4GfiXXm}$*}ZI$Yj$sTX7>Gm^ZswkJqs)t75oXjWn;c+v55CeRkKx-=`mqc*n>~BmLMCPrfn0rN^8{j-Odji_az^ z06xB*5QmR1MBZmY$VxoC006*zHeh^t?f`76^%viD1`HYiywik$PzC~^)9Gl@l}bed zfX3T=TX{Zfw z{z@s#@8?UYS#f@U5FGh zqDYbed>LR{Ax#yI8#BG9E~Z}o&;Wd5DG*eRAOXZ>K$c>Cb8)so@O#=_f&@Ty$O43~ zh+f+})h}+QP}ASgZtoIyT%3B~(jqAU8v(*$!pXt+%pBkX0MADcd=pD!7yhg6xZ1WT z7YKXDpo*d`M8c$T#S8>0r9^kME$gE{^Y41cjw$$wrIPf z4Ivaj>OeLJvH^g26mH%p4WO_9I9ZTI2Ecnv2wR>3zHJZ%o2#rYKGfS5j+Bps^ zl5R&!;TVp!l4cS1_r-^O@SulBd~83la#Y`X&jI#|!}lTrFs+I4^2u96C#-b6ac%b zhXTO);7Zwt3jj1=U;A1}0F?L5U4UAkIN{hH3?OR@aK%HvLS#S^&n6Ma>02lO_}5hy zHGm_&Fd2YF3knuw1E+X#1ycPAkpWbYc|P9;VEjUj+Zl4-1@c^BYVPd}U}V6~`E^k) qmqoYRbzXzd0n{qx`J9sh6o9{!kyh%!9y*c$0000cC79qAMtjNOJq%J1in3Vk}wa9)JQKD&y z5JXUD&?2J5tR#e@3@Wotw)5q8hx52|=Dl~{%)D3D+049i|IYdD`MLMpz{{&2jbQJ2 z(Kpl<5c8COtH(ICI!{zp*N7EqIbwU!TCiiL@`_T?^lns+uTQ)jF;8kzr0PZ8tax;Y2F@P+9te|-!+cZ4C0no+(-T^@i zNlCQ?U}z}h4g_-l?Q5<9h$RL@ zZ2=GrAQ0`{Q)T{-=THCOupC}lS{OD>WqGL<02-hIK)krKfDWN}ly)=r!K2r1x_Q#a z>KqYRC;*V3lcsP%mEe{tIkoe-=-bML908b5i(!k-gC)Q1__1sgS%4}ul$)7+8g{}< z%-n1c2)cI90DwY2M!LoIc{4Q(L)165n*iXuW^0aET2LE{-sTuJ-Vl>3PyC#MT6w6k z^Lv2gBn$$sj6=I?%x+p2ST;K#PM&!p2XG5$J(e%NBvix&0Ji|E-F3SFS&63>pe{Z- z_DX){<*supleV9g1?Vh+PpaE_Cn2;JK!c$?DX#w4YN+X86$5C98*5Nw1C8Sr06uss z;c^9X4FEd(VF79yocc6r%9yq?Qy#|b;sJFe0Qgw98{-H76n-%pI>K_ZdcxIK2 zIFACi-6Yx=;5Pt?hl&N&3b>G{9c&s4r7J6P3jlPWzWg_C0C>sI}kkTap0F>u3q-y`ayhpGl+Q=xYQXV`j0HTr4F8UMS%mS(j z7ZvT0=XTmHYJ)&t1Auo3t2aZeh1VlWgR#oz8UQSaLk*Nx0pJg$UIRey5bEOzWJyl$ zl-{5ogkq6T3ji-Bkn*Yz+b5~;%L!!w>Q8~r$pv(mAHH_9@{t?c9)zgQW~C%Oj;L*% t$FH~1#sJ;**9m+#@-0u9lX1)rfZvBjU6^183n>5q002ovPDHLkV1nM_4yFJA literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_136.png b/src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_136.png new file mode 100644 index 0000000000000000000000000000000000000000..3cac82dc100353757aba4befa5292388f64813a3 GIT binary patch literal 961 zcmV;y13vtTP)pMK@# zy}bV=->t}!! z@59*0H8^|mqz4v<9&sKQfVqjwp6vSX8Gz1JDixl~FVu&){d$M*Z`=tN8SkT!3Mz! z0HZH2x@)*7PALmW0tlf!dO^Uz9wiZH5u^+-0YDpDk+cF(GoWY9`VJ3-fD$mZxQd`G z0TYDK0Q@pQmOz{U{3IYh22t;R5JCfZ(r9`lU<`K`lb9iDrKji)jZZ=$zpYc;WJhIv z<2YUuwjSuV&ujn=^7 z9KOw*5YsPGlcL}M{Squd3f2`L0b|S;5ZY3W&}D&N5hF)&URUL15acwC*`5l40HAR; zU4{P5Hw1|K>|1d?f%)>G1kLuSQ5f9-a8(*frklujGPE^P;_|Dldh_hg2hhLviWnv- zAOLKi7p_9{)oCXHXr#*mTM@It=r-~m0C-}8K*qE6cj9ngVT)~Foq6>!sX_<~zn1pqovj?2fk4XhXdt`NdzfGUM$&j8b_VxzwFO+b+@mrsf3HeI)4>qarv*V`w? zDWk|9rG?M?IGSmH>itwd>HUMb0LT~q{2aj>CJ}&cf3X3eoB2f)|L~BUu#YSH6cFr9 z0IVNFE*T&@>jEIow3qkdB7x8VREP1V@|fCKi2x9_1YDihrMsU5V$FacnhoNdi*2GZK>nQ_rU<$? zPBw`EKt&Lpb}e2(oHW@c20&B}1zl$qfbveVEJZMA)S|Rs%>aiCc>e4)?B25-{Q5{< jgrbaUkhNSgzy{zK%6yBN;M~R500000NkvXXu0mjfU9Gm2 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_137.png b/src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_137.png new file mode 100644 index 0000000000000000000000000000000000000000..2fb6f1ea181278d3d4bcbe88e6df6d64b48d09b0 GIT binary patch literal 852 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 h=H{9f3Ni{pzP~P)YmpD zt&Gazhmha1c+wfN5|hNawi>yaV_bb^!@NmVq99FFhb@hxG_!7vKR0W$K&0 zCpQ&;D;eGmq+Yp8=u;_bA_FirJpA@(b)|$k=XpX4_(m2kFy#aWz zxRH*n`_-Mf6aWC@-q#8pZuyiNfRBjVGN9T$!ZC6&{1a(ibfs%>9N zZPAzg#u)&dXUFAxTBDbDwneV%t`eM6}wRTK2iF;{>4Cep2Zx&)lY@08r}~GtUNGZL`WT0F!;z$twb}0VHXF za2^*MTxXZgEV(PKSD>o$|0l;wl2dJR{z-c}Q z_&f{bCIeg>Wn8%?fIMx3aii-Z-^_q!2IS}@=#tWLWqg#tPtZWK4E1yTTL1t607*qo IM6N<$f}Ko^of0&&;duGm_v!UR;oZUJ9%>4iNUuMo|y*0D+ z!+~Y6^T;01B5l!>biMJBAKYr^ww*Jknle2T4%GL;m21n5zOI|~FvL4KX1PC4-?P4v z>zlQ;xs!A=eJ(b%YBD|b&$~>=(m1X4R-1l%(r{=v>WAOn9H?0lg2ma#!7T_p09>^8 z-I+((>)K#YKGMQzf;W=CN4s+t&aaT_E7ssnr)JbV>~ z1=G@DNE8xMjMK*U1^;0P@C+pJIKg?R4+d#f!&85O5c zC-0--6dkG%cmRAPNCEg7>*4CkX3+J>W)Uto0N{V$4KGwL&P&vGHm>t}zz9c`i3kWj zQC_7Eh!H^RU^++v97=76veYwdj2Hn2drDz@PnL?_ab*wy<)j^h5?RzN4Ws~Qp>TCw z)S4N-f<$zP8AAZ*1r;Y(CO4TxgkTGRVRT01u+*0hP8IF`@b9Zn>#NSHIqhU!9)dCe zwjdgg%_ZY;DguDNADn)soYPJK;8=oS2|x^c95}}RobB7<_DTD>FK4Rd_cwnCa%zN? zel)ju(iPWK0zjdU3#tIvFtZo(cl%=O!&6~00GR2QGyt;Vhx_`x85w{_SP{a21;D$q zKLX(OqX=~^0z`u`4fsC1@SrcftjuA|`v?|uY;-cO_rC;(_68ZTab$s&Lcd7Oj4Kp8LqMDOx9KUNWda#qc1+f=Oq z|0M-@BkV+gm4{_1({BKXm0Y~{LqjMEMA-okKz8THd(n=p%=>0rUc7BEsVQK`C_A!) x02B!HiyC0Zt9E1+?2kG14W>Yxqp(#C_zNza5mFqD&k+Cs002ovPDHLkV1iDd3>j0?(clVRNe$hK6?!KvTp0&~{)O?mVi% zAGIS1AoxB`1tw>4!}t!5Fg?>5fZLd$Svln!i3)f%Rf6kxmp~~MZWgOIKEIs20@sGh z;##-yf;fgUmxDS3m!ci z09^Ww2*BiDZUCeLNJrbeqmLWZQxcykKm>pgB=>Px#07*qoM6N<$f|(Se A$p8QV literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_18.png b/src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_18.png new file mode 100644 index 0000000000000000000000000000000000000000..cd9bf70dd4e92d42530b32c8feeb76c234440cc9 GIT binary patch literal 661 zcmV;G0&4w9$8hx!Y2ceHWOcysn|_?cb5eOhuv2~s^_Ykpje7f|tWK(H1760<=8xWjW( zBW{>NB3Hop@rN5n;iN8^0>S{`2FZ%YHQFse05Cz5DzFwnoF0G>CXc3tCP)e(Gb9r< zrU2Wg08Ib_A!`He7LZ*K^-Pp`06PZh-e`!C0f@WcAV6oVAe`g4o~A%h{`h;D0>UN; z#rl5miF#*MZ`^8=mw_UrXqQ}AM^|<07{~IQ*O#9-8ZD0pLPrA z-heHb_kzVUOf3LZG{UeE0GS@1d2f(^0)RnD1yL2>Xea3y{H+q$>%zvRPyzRqX4zxF zO!nMQIQaZPZXV}zg(yE&Xi5M&Qz<{*Q>|tt0A7B^0QB@nV}7a$iq??=j00ekun_>8 zAGN3|U}*~wT?&Y8U<(9PfGj`RyG8;)kYK<{3W7E*3L^Rgf@smEKcJBoE?gD`qA=j1 zMxsBUXdnvO6cmN2B;q1UUY<98<#4^f-n{#U9?spod3f%*_xm}&W{iH%48*%e-$t~t zPFIHG>eW#yKbawZ=CRl}FZSQ@YC6*qony7lyXzeNT6`4S4%o8!;?t4%=fWBt*xy0? z3=M(Bvu|GPf3|n){g&px(Z23JFEGIYEZpml>+?J5e(7Lv@lb>ecu@aJr$!n=A=*d0 zvIr{G3XiKQa-JQy_$J6##_uQ`ZNa0HnIP*;?{?_WV#L z(Q@V$u1zNqQ^zNSxW;NT5jE|x-Ou+NF91i5ok;wB`tXjL1;Dk=YtNN%zb*kl zcfZ^KG}8cCJUZ~&nG3#mbK12GfV|272tZe&PI?;#&JsX+!6BDHRtRWBS<8Vlz;!=Y zlWjQw`OlAS2|$jaZ36&J5I=H4O@qRefSdxM>K|Xs3e^M9NVBFs{1hewd`D7RyEcF# ujls0h^|5bfKsy5p^i9wwrPJDkD1m?X!MUP1tzS<700004Tx04R}-l+Q~PVHn51vyB)iL11Qkh@nGBs7w}RMCGo(*tBg~f0Po$?CiU{ zle4qa%26U(f|ru*d1uDm5$(qdGxK?$AK&MB z-{F0M8d)(-JtP5n!?BWmQR({Vm{j`_Asj&+!l+YJ+l(X<1E9fUv1@F;hrqupt$X|b zI_lE4ng@jaKh%lTb}(f=ak3uu6-!kMZ8FSKs7BM z|C+c%%_(W1MkH>@24YeH&g(_h@8=*r^~@L^r0;R+=`OQ-d=_TXN_RhT8}a8f>+a#2 z#Pb=gH%8n{&sxUn9rjo_p*gW3k3%Dd9v|?z$wwEp4JbjhwM#!rpOV)g4O?IHuKzA8qHe6NWHQ4?5 zW?+>pP^lFuS83d>RC0Yby(58Yf7(5YU7B8Os@7T+7jCT7FHP^*tHQ2TvC67;&Z}|3 zd?p?hPl_?ILp%pbyd-vt7sYOxofiix8N;NaVZv3ip-`5AN%ERI{+SmG@2t6_p^q8N z(o~6`|AbY@XgUiV(SNxAbMSk`qp>3J!UhhXuG%(|?j0gDE>~^N72v`*x)0t~ZOwEZ z4m|-D&ZtGJ}8;WLk96sqPn3I;4%{fxLET5GkbR{t#`+_*~}`j zbQ|o&#vn5cx9D&iCDOkMP%5d!ZVTjDTnI}5z3=`Ez|i}__s8a!3Hj{;D#-R!!!oz@HQ#)nk!}nh#`3~T zjJ__=^UgH8f1l--+!KH?2bjUaP^xhMZ2sB<;J2&FdVL=$_Sfw`@)Uu^PR76d7Tfp| z0B`L1ho+Zz^4crU)u^&IE(NZtKGSn6%eE#LK*@DmlZ&~*q+)adthOzRKZ~%bUije7 ztCFWqWdHWfTnb#p)x3ko<`xq7ZW}ZaBIypg9g~K~sg)nPm2IdKMN#s2JOJ!Eu+MY_ zx&|kRq&q71of1US3`8?h zu-D1LP_m@`TB}XdYfud#l{~LnN!OE$iIa+k3`8?h@jf6N&*F1i0quK%foMjOW!m!l z3wf+MHDRY~?M6mRpH_li8w1fy)gXlYb|D?9BbOnbC?OnlP&Rn>HBuS#J(45z@;Xb!jQz{gv0j#EiY6@&^SP>G0((wgB zDD;^@&}&mohhjp0yP!86Dm|;K2&NNJ033~e&6BDjuK=0irM@1N7ev(+Ad^l+aWwjI zH2MpUFoWWJ1ofh5CR3@Lb_d9Y%Z@Nxk#a|@7v*WAm;#j|{k;FW0BgUqpMEANz{(Q) z;;lVZ6}W%mH$?@Pj-D^ve;W7ef$26h-Cp07Y%`$Pw4F^nGqCT)xZOjUTV+ zQ~NfDRimr5RdR+N{mRkgfMTkhu*mIg&R$~ky7kyFG&w+zXT$Mq#pr9LIKpZvAY-H` ztJZ+>f>+*lF>w-~+e(|Wo^U*iQvO#$Pfe&rzfUgzsW`sow}4jEj-bkaj{^CVztUBA z4Nybv2Q;T5# zbc1f0c4Tx04R}-l+Q~PVHn51vyB)iL11Qkh@nGBs7w}RMCGo(*tBg~f0Po$?CiU{ zle4qa%26U(f|ru*d1uDm5$(qdGxK?$AK&MB z-{F0M8d)(-JtP5n!?BWmQR({Vm{j`_Asj&+!l+YJ+l(X<1E9fUv1@F;hrqupt$X|b zI_lE4ng@jaKh%lTb}(f=ak3uu6-!kMZ8FSKs7BM z|C+c%%_(W1MkH>@24YeH&g(_h@8=*r^~@L^r0;R+=`OQ-d=_TXN_RhT8}a8f>+a#2 z#Pb=gH%8n{&sxUn9rjo_p*gW3k3%Dd9v|?z$wwEp4JbjhwM#!rpOV)g4O?IHuKzA8qHe6NWHQ4?5 zW?+>pP^lFuS83d>RC0Yby(58Yf7(5YU7B8Os@7T+7jCT7FHP^*tHQ2TvC67;&Z}|3 zd?p?hPl_?ILp%pbyd-vt7sYOxofiix8N;NaVZv3ip-`5AN%ERI{+SmG@2t6_p^q8N z(o~6`|AbY@XgUiV(SNxAbMSk`qp>3J!UhhXuG%(|?j0gDE>~^N72v`*x)0t~ZOwEZ z4m|-D&ZtGJ}8;WLk96sqPn3I;4%{fxLET5GkbR{t#`+_*~}`j zbQ|o%)r;hH_VRX+vm>A8-qTu>|-7?zd!Hy=e@uIn`q_Ex`}$|cfC-y&jZa{kcC0Y`wMD6syRax!Xx$oE+R z1Yo91q^}blu^wzpEO0Bl2uC6yiiogsLBky5hH!K>;(;oS!}`35a=vD4Xccpn4XuK% z!&b;zqVeVn<+a3t3*F$g&`>=E#|l#o&3Q#{W}FyW#Z-E0?z1_^#%|If%$po5Oo390 z#~-g^_eTpx^CJL&-0&jWF7AOYQxHOs9ZEGKTNvx=_GZQjGuA$~zh~b-Il*;6b|{5e zeHyPvbWlo>%clVV@1CuKQi@r9+IQofuscNbJ*PbfHwDHDQ)q2&2LKRKD~Aw**5-C8 zY2YRHdO@;7DdF5%SK5D@V8v>CEOL0gj%tStvW5zgaIfvXmXR!LA=GL9<%0000^?^^{HU;_f~*PCbpWK;4N;Mv%}6^`05oJENrF%n0@elc02Ns- zyCkb3%}w%3pDBP`W=TY%O#-jb*OUbD9j0Yag`kE4dISJ~xj-OA!-;w|Bwv;2&4r;nCe|c(|#rZ^L@Q# z8<^I?q=aQ_)7gNa)YXLr0F$*nZxtO^Vgj}Yux>*s8ZDov2WG|G!TBJ%OJj5ZK;W0Y zF0pZNOrU5gT&>gfRgI!vfF1-_)&uUJ9FYK^6uqSc0B)u(&4^P&$BiN4LPiGw;(0W_ zUbNkNv@AU4&K#9qp{wtH{nfY{z!-HY#Z8nI01Q+UAc`{8yNKpO05doW#{MW=SFc+M zOkM!>&HyH-K8r0Kn7GifNj2_Z2(+^nBM0ymL^eS2vE^~zj$7>w6Bqm z3+W#c0+vc(&=7DDz`^#N!x{qW7Y5-_5Cq&;>IDeE*KivMpSeQnMuBczP%wQN6|Xab z+Zl3SkZb4cOPt-~wXbjjfbI@CU^N1u_SFH@!UO*65U_29)oc$S)G(mueYUedgsAIp znuD9q#Xjy|!@3H%ydb>!q4+lOOzK;=>yW&M15lGt>_hwO>aaaOeax5_UF@ql03V?? zFnDV0<54RH0JAQh59mITj}UI@GqtZ609*=Tdu)RcRG90yssMO3G*K{#P+x%m0^DA} zRY0Zvsscb=1?X3Gc|oNje8>CR7bpqhuP%IX`qQIZ27LuoqrZ=RfdHV9tI-1}Ko|S! v0GLD9iZ?>laOt3P)IC5sn9=1ZE(HDnaH&#G$3eFj00000NkvXXu0mjf>GaLl literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_22.png b/src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_22.png new file mode 100644 index 0000000000000000000000000000000000000000..3e994cd447c27b29f0ae3f6ca6b04f5b88861860 GIT binary patch literal 1090 zcmV-I1ikx-P)LF0U$5IKAR-+e%G?cYX@+q{iY0uSfygNI)9F%1KBTOL^v|v?X!xsX8de?mwwP&-87Yq%y@t1>V_+jL z;R%{t_WZEgRQfCy*eUnmA-eQ+djL29W56Jwb!t>8NzPOO)`%ed9xhnR1YkmW%N2?R z30TKfJxjcstOAUA=iLud4DmH8GgPTM$aT5Hegd#!v`J`6J459YZB&|C7$k8yB~FbT zpj&S}RCgjrBcfw>FBN~uC-fEGkI^B31B^y4^cLMG&yYvFx>ubFki0(Mm4tZ>EI{j< z)A`VT0^|U(OVMadFicREJl0|bzyq$|+ZT5EsHH$O6(A$hp8|RlWG~?RGC{bu{S+{B zO}o`#bPTd0;QUa5d@9K6+j0!X8nB)~Wy4O9!-LJmYR1V7VR(9X*B^s&ihu;PEwu_^ zKHB)3ar#}eRL(GotR5bNXeAT@{=n#0cfS^|qi~^E;WpE=RJ3e8l1KjcL?jNGfc~0^ zknS#%z(o=(1pN?Ain)3M09LLcIF-<&h6qUjUIY@*?)H?BZ)}<#mo$j+wbm+1+Toz2Y$@3Mquf^#%$mQvv{9RaNSnZlL_c ztKypejfoe@zqy@Nq$o{0-OveGjFm?M|U@@~uE<>$hBfKd>iKYb9l_v98>i81W6dIeZ{F~H06#$1f` zrL~+6>>Ide>H%^v0MEeXYbya8J!=;Ma=tSGM()psXzBs0K>>)-$Qaomxo0f$n7<;! zdH_paCS$MrtZD5%e4#yvzxu9baj#{vXQiUi=0_5re(_}ykd&4s=J_T@$c%uY^L1)U z(f)vSs&7<^+(fJR`O0U>)rKswTin3P1tbFHZ*$z~B7QQh=5C zEGvNJ#S@VR`eP6|57}eq_27A)Oag!Gtke(S0cP=;oie5#V734NG6A?|`GW{HLtHZf z0AK&8F)UfjHHo+(Ku>}oqHBOsj`~&M@9R68gFZ-By8Boot_WZfc=sH;(rI(%HjMx_ zK`vO5fkDIou=v*rm9>EKsE z_KSt%P&Pojz{j-$WETf`ZgzrSCmL?)Ms3761SM07*qo IM6N<$g6uc?H~;_u literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_23.png b/src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_23.png new file mode 100644 index 0000000000000000000000000000000000000000..050933658f3b5244da496854c8f7287c64c87ab6 GIT binary patch literal 781 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_30.png b/src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_30.png new file mode 100644 index 0000000000000000000000000000000000000000..8143db0dc8145e0e35cfbee27c344d778092c7ac GIT binary patch literal 1854 zcmV-E2f_G>P)4Tx04R}-l+Q~PVHn51vyB)iL11Qkh@nGBs7w}RMCGo(*tBg~f0Po$?CiU{ zle4qa%26U(f|ru*d1uDm5$(qdGxK?$AK&MB z-{F0M8d)(-JtP5n!?BWmQR({Vm{j`_Asj&+!l+YJ+l(X<1E9fUv1@F;hrqupt$X|b zI_lE4ng@jaKh%lTb}(f=ak3uu6-!kMZ8FSKs7BM z|C+c%%_(W1MkH>@24YeH&g(_h@8=*r^~@L^r0;R+=`OQ-d=_TXN_RhT8}a8f>+a#2 z#Pb=gH%8n{&sxUn9rjo_p*gW3k3%Dd9v|?z$wwEp4JbjhwM#!rpOV)g4O?IHuKzA8qHe6NWHQ4?5 zW?+>pP^lFuS83d>RC0Yby(58Yf7(5YU7B8Os@7T+7jCT7FHP^*tHQ2TvC67;&Z}|3 zd?p?hPl_?ILp%pbyd-vt7sYOxofiix8N;NaVZv3ip-`5AN%ERI{+SmG@2t6_p^q8N z(o~6`|AbY@XgUiV(SNxAbMSk`qp>3J!UhhXuG%(|?j0gDE>~^N72v`*x)0t~ZOwEZ z4m|-D&ZtGJ}8;WLk96sqPn3I;4%{fxLET5GkbR{t#`+_*~}`j zbQ|oAJL4FhW=8OExuq2vKmU#S$pASXz}*$oR0C$;@Q_c4s!p z_cAl*?EN|Co^$TZUGd<2ll;k#5e82mrkCg0FglEuf!!CdUG$w2Z2i}jisco-b zzem&NwK{#^vB;DdJbhRI;wyd=QX~q1a`lR0yczHAous{fBNHPzV9|I$m0KAP*y`L8 zu$q`(SQ!uS#ram>#;KGbKsue4AJ%SVs4psV*$h(TC{Kw5Q2hxip>8d=PeCW9Z`@b! z0|B9X1_&lcGcvVX0Z5K!)R0=P)lovdqhF$!iK zoUsyUYrt|5G&4At%`DpltWrQ>{iZQbyMPlb9sye8wJD%=j30(tA%1x78P8jZ7he0l zST*C^5WGBa+)^1iHmlxe4>nMo$pcW=7+#{QlolWMaxVn!l+Dv!Ol=znO3uh046FCr z-(=5TGi~pNfA%~HKwwvC*O|XKNnlqizkK>VZ#+2TDmu=s>5+FF=w$xl;`@uXKRcPN z0{|}F9w&A0S7ccxJ6bA^+pm9wEXy2O*F-a2ZsxdZaol9XuZI8-LcbV72vt`Nb{y#B z+?pQ8^iWp6QY<5&IFsk?L>?Z0iNwet#hJWX1KxaZfV##oV>5Zi5}yO5y5JW|8kF0n z5=3I;J6A=hIFnb6)ZTk#ODt!pE2jojI=*8KP^fDR>vjRZaBF0>`ml9?Vz8EPKRY2n z|J?vE)E5;1AN1^%)2D`)w1d*8aj5kjoy^#e6Y=iFEjJa5Ggnh@IzJ=1TuwKRBuN5X zMu0Z-ok*V=CKZcY>W06WHPv~cocS4XodOD0E2hZ*oBVpoDl3>pK(#ThyixAT0p)ns z&cJFJU&+cVI6A;s@Qgcvl9N_pZ-rHzD3>ok-miN$)}TV6VB5az6fmL~UamoI9p;Cl zT3T8t6bhzS&ko@4zku>1Kxrq>KjL``UhwV!g$0AOOcnp7xvs{xnemKnx$(~d72O%l@#& zvjajqla{)dy>`9~_!0qKp*9+x=;X-FLk#srNseZ?a(RSc+fLU0bcgMmL)?8~8$%6e zx%#1?yXIM<``Y{%+L2T$B>*I;bi!=B`r?2W_if|4+a{`~Fg5573y(3z|s-K+@z14qoCF|X9Hod5s;07*qoM6N<$f_Ei?-T(jq literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_31.png b/src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_31.png new file mode 100644 index 0000000000000000000000000000000000000000..37b74f8a9cc4bdd141fc074d8c891050a2673e54 GIT binary patch literal 3368 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 YPc5INw;h?F2mk;807*qoM6N<$f-74w4gdfE literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_33.png b/src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_33.png new file mode 100644 index 0000000000000000000000000000000000000000..4e99d1483e9bd3c828a24350fd06194179cf38a6 GIT binary patch literal 1008 zcmVg_VMWS_gYYv9gi$3JS3hg~S7~NO8!e z6T;~QL?n%kCn0*CR&t4J-ov-Nd(O_x?aqY--DYohXWqQ;oA3SXUhuP83U^O60`=$U zJlzQCH=P$wTv3Pjp6R*0_T!bBdGkOH?fbep@i>|THsv}Kg<16N;fHhR7d(e?m&cw* zKARTR;o;+hN@X#u)uxREzywZ$FYq6aeo~$NH3Xz1818Wb2t4@XjR47Bv)M$Z54}Iw z^T;;=0KQNts2A<4e}U%<69HTW03HkelT~f|Y>ww{}m=Z+15oIJVVoAPFmbZW?!}xO}1S zxQ7Wq0vr?ql4K&GpLo|fVkLlfpC;#WIg}ceZ*TWpG7|?6o3FY9&Nl-)3wtsKH?Z%E=WrN-@v%{gt+(zpMvGq9EN~P zf8SmCia>@>?sEn$2U2GV_mlMY(w@u@x?R?VPm~0S02>Jao`Cb;{W8JBfL?Z7T3XXO zy4ZH{3+6=%un_>yeJDVNLfTf>1*mC^u?!MmZXkbm4C^+P&tH>6_;@roiud~oskF|U z{3F}c=#3Z0dzM>muHv;50bKen1i0jrwBU7$1VYHafe~O!fY91zi2(VoBZ+rX0H2ga z0(2ot_fiue0m}*?YkS(=@8`>tt{TaEZx6gPMw?XuHUe~6J;_%h?j`jKHao5aKmvrM zr#pKmz@?n}NPv_CZ5sp%7$^Z!vZnV6U%<&uCKMn$yMI;z@{5fvetoDR6AGXt2!LIa zmk;on$pOB=B(akj1tf9a$DIEJuvhfB$}sRU=wm07+Hg_8{Q47BEEd)FUw+!NmqsWl efVA^`5bzs6?AUH1eM5!-0000Z2$~Ob9Zt z%&3gQGNM$99w5`G)npl!W>5NvC~mEz+m3hcoO?$bn+f;Nz2~vd-D{n-_qlh*w*T%Y zZTqxn8+F->>UA35<66@kCpZ1>=S^r+j^Fw?sK>a^+b-H3Pa7RrKZ){+9?|o5pXf`D zO`#O~M2d@#r_|I`x>0q7PMq&0R~T%7xciRpXRr?+r3a*=ZK+`74ONFo*)Qt zI93@hUr}+6`ilVfA*VJvVYrCn&8yE;w58k^Y0Jt!( zNW^r!%q>V*<198+LC^$*qXPOu!0tWEBfkdpB?W>ez~~f+3O+s*lZxA-tU6g~aD+q}m4$X=eHq z%33hDd(FD*H$@vSE3lFy$EeIbIp8y~UjC+yHC+pXlZFe9=8)ZG~tz zJ4|SpG>wQcKkR6^iwut8ViJcNQG6sv?Ws`TF`|$yUkDrJk0N@$8e6J_L zXt!m_<6i#yix>hBxD^Fpo=WmEc%;d=?30#?;NOtD(HhDWV8F8D{7p3?VEysQK=dCU z$M)S9#gC=GaYu#{%bXEEmE-d73;00F9MaKaKF7zMrY}OO2~0rLsF7m5ukSj@3IP|- zHqf%wX~KsIz&%I^1p!9!g^U1I0mMVMop?-kdmOEu8PmNpa$$@}0%VPu5l~wDUQCw> zkn6%?*B@exv>tXT!1Cf?kp?meoRg3}b{@vR_sIaEj8{*-ch>_x2F(T$K0<66CkRMJqc$u>+ZY_svMrkK@mmeoX-*0=SPWHY))q0H;SFU;q%v z0L-jN!}p&OV76ms=f28+fPeu745Yw74d`nT`~@5#Iz8Kzi>Ckp002ovPDHLkV1m;e B6jJ~I literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_35.png b/src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_35.png new file mode 100644 index 0000000000000000000000000000000000000000..8e8b608f041f757a39a833717597d9f12908ea9e GIT binary patch literal 1599 zcmV-F2Eh4=P)4Tx04R}-l+Q~PVHn51vyB)iL11Qkh@nGBs7w}RMCGo(*tBg~f0Po$?CiU{ zle4qa%26U(f|ru*d1uDm5$(qdGxK?$AK&MB z-{F0M8d)(-JtP5n!?BWmQR({Vm{j`_Asj&+!l+YJ+l(X<1E9fUv1@F;hrqupt$X|b zI_lE4ng@jaKh%lTb}(f=ak3uu6-!kMZ8FSKs7BM z|C+c%%_(W1MkH>@24YeH&g(_h@8=*r^~@L^r0;R+=`OQ-d=_TXN_RhT8}a8f>+a#2 z#Pb=gH%8n{&sxUn9rjo_p*gW3k3%Dd9v|?z$wwEp4JbjhwM#!rpOV)g4O?IHuKzA8qHe6NWHQ4?5 zW?+>pP^lFuS83d>RC0Yby(58Yf7(5YU7B8Os@7T+7jCT7FHP^*tHQ2TvC67;&Z}|3 zd?p?hPl_?ILp%pbyd-vt7sYOxofiix8N;NaVZv3ip-`5AN%ERI{+SmG@2t6_p^q8N z(o~6`|AbY@XgUiV(SNxAbMSk`qp>3J!UhhXuG%(|?j0gDE>~^N72v`*x)0t~ZOwEZ z4m|-D&ZtGJ}8;WLk96sqPn3I;4%{fxLET5GkbR{t#`+_*~}`j zbQ|o^@ zRA_a~*HK9%X&+cUvb z+Nbfjp6ccJv5)^x*~!!@$MlF#vzUpPup(h$k}8lMA7DMsx-(gNjw;6|1-} zjGb%;A!Zl`Pp8uWfOA(f7)TB_MFDlDQ_z3!?7iT!y1O8-35pcAqu*Uhcpr7aEs zxqRarsdJ|Bj5w&>TQ#@+fYLqa-vDjN-J{ x4nh$@3j1yge;{NH=tllKpwk`bH2=HNkl}AX^ZjP_ z*gJzPGpA0Nw0;sl6SI~68oi$QA>MarWK+|7AC0}C-h95%#(mLop;V&FH;2XA-OMbS zrdNB@;48Og%<-XtRRbWC%^G*FPnqX#929F}0Dhbon;I0r$Ctm&J)76j==3bb34-U> zDL@5qb^JXY@9Ocj`=J1Q`u>LiA}-_kbpSX7o|TvA_UJyEpRUpJw+i7tU#>(S0#E>) zj#CA^`+(3ll<~{~EcxzjouV%Tz&$`5IlDFb8~^|p`}46Y;Qm}m?5bB1L>qP+vWL@b ztb#k&2BQVQNn^F-09gS5#)b`wMFG038Ffz3|Y8X4SZtKn^ZYO4(nPt5$J(*qmq zhujv#ds}Iq$5_DW{_E}pKrN*m70{T)a`a1ig?4sl#G}gN1##^>(<`o@mus}6tD|M- zF-H;roRS|a%Nu~ivpT;>xxQWEiTpdv4#f$;ZTHoWDBl3saa1c1Ne zu^=R%;oV#Ou1(vIH^^yy+QIb>fdK@SKUBa57#(wVLXE-_10XLpC;)jZV5BYtSYGT% z)e3`FA+Q>t1cXD_oFGo4dU(36Pj}2}LqPWezf$Ie$XU6q0dV~uHXKr^04N430ED&z z0LRr6AuNPcDS&eYAhcx?RF6a4w_OORCq~%1AeA8yWnr`iAWemkQ^B+r0wKQ*q6mS1 X!pIULfO?P~00000NkvXXu0mjfe%+fx literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_37.png b/src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_37.png new file mode 100644 index 0000000000000000000000000000000000000000..13e8eb36c0c96e4f3f4f778d05f16d71e25f7b9d GIT binary patch literal 770 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_4.png b/src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_4.png new file mode 100644 index 0000000000000000000000000000000000000000..9a0091211ac244981ee9f31b3ae828f693c7d686 GIT binary patch literal 836 zcmV-K1H1f*P)BP zA|fJ(AvQKCk`PfOQEY62ffE!(EhhW+@{VCLvu}29=aMDaW^Z@j%)I|^-p8ExcX*Ge z@0##n;mS`7G1%P%CkJNfm9smpQ+QJd=Ku084_gl87OfTbetSn>#cz|7s3%Ooq6ug~ zd;SEBXJz16Nk!j}X9I@fsaG|WAH<^+N~e?xCiEC3WWTolBPfK%&UK;d_% zvk0L1F#=4x%q@=N5(jW>|0dCQ^k7XRAPxW;Q@5clv<^g$fM55{iVnN)CT|bwQ|S z0a?7<8gV|d#rJgSilS~_>LMNoz;_UQ8?FCg-)zCj0C0@#ED2ME;jtp_pg`dt zq^^ttyzVc;jqBM!*Uei+IC3TnciR9we*;Z`Y#^ur2m;<|H&KAPA04;A~47L}8{ZiNN%K09d=mMyAt0^~(UzK#cv?VI;T^~Go(B?6)@sshl}3Tpr;o`lQ4qdKM9 zy8>Y9C~Epx13<^q6al*8r>h;I07$UBYfldE3krbRK4~Ypwpwk(=u%SWpY1wU0Cv_j z1oOTB{{yN4u>12xnB4lv);HFUHc00mJ9xn$GJv=R5XIvG=K1U)Ti;l_ngNhKS&jgl zrT~Q(ErMwf2LeR^&V%hJiB!M{;QZsd44VSn0&JZ62HE?q6|?oX@4(M%S1ZrO-Z7gg zv^J>%ka<`ZTDsH<^6!-e;6XQ(re`42yba*;KmcP!0KlE6G{D_Q;doUe9>=F91<+Y4 zf=Ly?)Bzv}cu%4Oq!Iu@SOt*KaX3{qfEsy{{|8n9q~#FTsk0 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_40.png b/src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_40.png new file mode 100644 index 0000000000000000000000000000000000000000..c3d03bcbfa760d59d89742e7be34c9005364a324 GIT binary patch literal 3661 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_41.png b/src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_41.png new file mode 100644 index 0000000000000000000000000000000000000000..f886a5898e5b0017ce06fc4cf8f88f70d61255b5 GIT binary patch literal 894 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 Qf&c&j07*qoM6N<$f|kVc=>Px# literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_47.png b/src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_47.png new file mode 100644 index 0000000000000000000000000000000000000000..fa7ea9098d177487d3f45959e2dbecf98848c28f GIT binary patch literal 955 zcmV;s14R6ZP)9=hj$ycCo$~)RMMZFRlm@^r?kp5LZR{rxz5tlk zXY@ZjDVaf7Ae#{s0Kyu43~ySVGps#U%Rp%W4EhuR@;q`BeXRck=H|bh%rH?nmm%q_ z4n%ivKXO0D2w)If|MAfG-8mBLJTN{{KI@XeGnkzHkO? zG~;kj0R#g8R|){7g0#nlL%s|k7y#%g08|)Kvl<-eT7X~xSfpIUTS!n+2NR?B#2kH! z>Um=9z^4YI;X|o`r0OSB&5~*!sp<&^0I+QUHxpQ1fZ5o@NVOQI9@O^0rFWW5Fd2 zmIs#@;tggp{Qv)-;oZk+@Bjeu7hTL?@KMks*Y7a1@CE?PaG2+jErSIFHaVC&nCC%! zvI5}bi%$$*8kJ!4&{M#+8|@6{5_~iZ0E!HTYQ_}+pp>xu?K1{~SpepUmGkB@$ZdWL z=05TjWSeWE205j}(U>Aes`Z6#VnN6u9=@|eZ&w~Ic z=0Sj{G630wpi}??)QWwOS+ouSQ0!xiB#`Gp;&`(F%)`hA5b`{F!w21ReC={jd!6ko zq@cwGg!oar*VFrrQIuvCog=ATK~w<1JPisEVgdk{CqRKiivU1&-)I2PA_b6>1<+Fg zENjpr1t7bR>L~y{$)jfj^#1;dC@NwV49CR5lo9)E?}^*6hg_fxcceH z;u0*_ON5ns-ZO-|2%<=$i-E>D@s%kA%K$P0a1%$i~t}t1t5ERPy_(JYERp8I@rTk zk7wdbg#>GcL7fG#r2xFXMUw>06W{}_jWMJchoLsYRfzs&0L&Gv&+-_4OHIP-0a6=2 z$c7DyEI?@rSlkThVBrG0Pe+dI6oAk7*jlFOVubn{G^qxunFU4z08a>vrT{FRv(YSo d7AS8yBVK5 zLH;=y-iuX<{mNnn3_}KE0DxSN90;JmAteA{zJ~<_$m1|DpaF0^WGcgN#%hvN04&82 z69}*fMNb8=K)?uqe?RK}Tdv8bN9t#Q1pv0>4{`t~*@LnGwiEyoBQ^j?$^xJO02xlN zKme5ixbi>99n>fTNX`PFm>J9gK+`NR*b2e_OtlOgtX(KI0jv=G@w@ClNN!ly0)7Gh zaQ|)Euo28g7TdXf2f+Zqn+50{)~6K+O^STQDsreH6y zc670goAkh`1XoHxZ$}_!Ax1(00CXS&Pz_eI@yQWejo=CZn0|Lp4|u~27Tegw@YzRp z0DwIB|NnmmrG?uV-oF39pegDCw&(imJq*Hv0u1-!y%-o78F2;>F@ZoR0EjVzRL{fI zgUS+uDZobc9Ye3VCO9B0mc9b(g#}E>sT&MOZVOT5#(@d|SV2lK03?i97&dANgFOk$ z3ZMW00sm`n8D50pw6nPq1Gp$nq$S!PU07#suEC6>b z(DUw!{9x|R`yZ(m2=oX5SRf#$1fsLRa7h8Megh~qfcymFgV=b>fFCE;U?la6Q?kMJ zZS|FBV1rt9q)_T#Le(nFKwP~uQt}o)_o15ub1zIB=5C?_fKN^XtnbsK8w}J60FZgu z`sd^X05|g?gs2$+xXMCe3PC~x ZE&#yxFChE`r=9=+002ovPDHLkV1iN{aZ3OI literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_49.png b/src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_49.png new file mode 100644 index 0000000000000000000000000000000000000000..a586fb67243933288e9e4a2a2e5eb972bb73dad3 GIT binary patch literal 843 zcmV-R1GM~!P)!|%egCgc5`eP@j2ZG67jotyXe&CK2Q%liAl# zcX8RX@%_t2{;Zw*cjUjnzWp|jIfurP!~62sT_bA_pFLSyUeBbH(1Nm= zi6wyGNm6M9Xh0<3{>?Y$&ZE<1!+0Pg+t;>T7mm2*A#tOphn;(~sG}5@3^^+vF5#*zOc$>LYZG|wJ063~j z0imK7Lvjc_d=w^tfMozTZePrIMYm79NZ~#L!S9KwV{LJNs4rRX#{jg=@x>SG)2jeJ z;L4>fFwf_gOo)IV>zf%rYDf|Q9;dk7dw0dg7M$mcFSz*cgu(=b3gG6(&(>ER5&-b{ z!UGBZmjp;QV+cSo)4N|K0k#w^O#zfY9U=`h3D{u_zNq*JpdURaHefjqDG-W}waMi_ zm;#{(&@poy|9v$8_A zKF|vA5uoeDK-K^W64$PipvzW7`kdQ$DbNXsZq^J5=%;f)H#^zs+Mxo53h4eQ{0D$U VDZaD297O;C002ovPDHLkV1nmEf=mDa literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_5.png b/src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_5.png new file mode 100644 index 0000000000000000000000000000000000000000..166a49bc9b068b4c2f41477e5acf77f0ac13863c GIT binary patch literal 1695 zcmV;Q24MM#P)4Tx04R}-l+Q~PVHn51vyB)iL11Qkh@nGBs7w}RMCGo(*tBg~f0Po$?CiU{ zle4qa%26U(f|ru*d1uDm5$(qdGxK?$AK&MB z-{F0M8d)(-JtP5n!?BWmQR({Vm{j`_Asj&+!l+YJ+l(X<1E9fUv1@F;hrqupt$X|b zI_lE4ng@jaKh%lTb}(f=ak3uu6-!kMZ8FSKs7BM z|C+c%%_(W1MkH>@24YeH&g(_h@8=*r^~@L^r0;R+=`OQ-d=_TXN_RhT8}a8f>+a#2 z#Pb=gH%8n{&sxUn9rjo_p*gW3k3%Dd9v|?z$wwEp4JbjhwM#!rpOV)g4O?IHuKzA8qHe6NWHQ4?5 zW?+>pP^lFuS83d>RC0Yby(58Yf7(5YU7B8Os@7T+7jCT7FHP^*tHQ2TvC67;&Z}|3 zd?p?hPl_?ILp%pbyd-vt7sYOxofiix8N;NaVZv3ip-`5AN%ERI{+SmG@2t6_p^q8N z(o~6`|AbY@XgUiV(SNxAbMSk`qp>3J!UhhXuG%(|?j0gDE>~^N72v`*x)0t~ZOwEZ z4m|-D&ZtGJ}8;WLk96sqPn3I;4%{fxLET5GkbR{t#`+_*~}`j zbQ|oa+2YuJcW;dB+C(+XWE{X4qJM%vCe#}Pt z9l0kzU44kpU*1Uo@ZtGwdGf6b?c#3iEA9+-0svBh9869#%F!ZBPBQ>hd{v+ge+ud+hf;kpIqx6QI!H}?3U%G#+s!R%u1zTR!RkOn&Z^}>3%>q z)~@$#c0N&40J~)wvMggRzK5x`q+*|1OJXj*2U(U4i_l0bQ(t~a1U<*u(=SJhN*kq5 zlha&X16cBfdCcukBjox9S(b5px&Q!3y!w7F%>Fd;g?ZlnYeM~8?LaA*mFNzT3gmQe zeR_5+=e4Mt0#B?j005FyxsD`B%2=zQR1k6H)uW*z7?11%047|+!ZzUWgwlhQk*=|HFU1(uYfcMv5NmIFDTfMv8J>0o0*I-GFfT!l26v zuanLE5AXg$>*F$OQ@?Ad;ckQVFgeYaVO|4=FD&FWRusYn0D#2mnUFc{#IOKtl^+-y z!-*xNJNLvA!obiN00;?x5j5Ndv`DO;VIbX)p4W!}x>5FptDJNA!Z3xp0UYA!O+OCO zJAhxr>c$X~0@i}(+#ya5(mSvgJR+7hjIbJDEqIh4CbU93<993L*Ts22Pzn(Ba{4;t pyc(fh;BVx=09U<%tLC2<;1APlr;HqH@rwWe002ovPDHLkV1jV!FyjCK literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_50.png b/src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_50.png new file mode 100644 index 0000000000000000000000000000000000000000..72a62d2b57249ed30d1746871aaa936484a847fe GIT binary patch literal 954 zcmV;r14aCaP)9=hj$yb22jl;%FQ$OiMfCJCEQ!;jC;)zOXQAk~ zv7bEn0$^I7(f{zIWCme@Y(`K3=$0tL9ZhKf4EhuR@;q`BW#spRx$gCe3@b{C87R#H z_)-AVEnbG3A(b@E0?JmCQ2d9H1<>}DwtEDsmaHRl{=lPB08BQri z(KG;_|Nj3!xo9QB+`e!IY&0Xb6i`x>%TV2zPL%+_l>!D$0HCJ;L0%oO$7!7cKz7h0 z3y_=wK!qVPpfn2%bS*$I04!22;w>a7se_5pdt#10MfE%}cHmQk(eR)0RU_pz|91f7hpCvF;XptsRy+^aOutCWclC!?Ki_IS$T%#Z=ZpcA@e7F|3fhK zfXs*#mSQk_{19vo2!PmyT&xTr{R9JG`@?GtG5S*(e*gZ)@agM(cmRO-E3cI@c*<*$ z>vx!0cs&8~07xOsv*>(6mQx%6ho8M*2+(Q<+k>70He9P^u$7V^4;D0$}E>oHrN6J?OOsxsIh*03c@rSatwqD}q@7IRIdu1_j1Y3ILEFV5tC< z_d(?d(PaQ~%)(LuwLA|pn_ejZ<_}O=0tyURnSwV3peK8fA%r}S-ta-s8u;4fp!Pc3 z*J*fjlMp{@_j-E2F^c-EqH_dm24oFH1pp~Y9~1z%JOPrUMF1eXZ!`dCkphsD46#`N zJr%&R1}#zmviqo>0?<8-UIU=__fH&u$MEua0@zKkh7%umBA733xq!jKQV1o_;_9a( zi%YOzFBVqrdCw5;B8Vc1E(RLs#8;>gECUDy0JcKU&&mwN&SS?8GFVyJGi*9`3aeWP zr3&-_fO&FI1OR#p0QvCsiC%`g{}UOM86iz)7!b86#s~mXQvkB32SotjtM;@lr-MCw z^>`-Us*ThX05fb*1OT=afY-NZlAw74e4w>4h7{v4)JC`p(Z39Uxq|gs9>Z^`Nq9X# zYQqQFuwjt`7B|1e8$i2HM~>_ifY0~XI%Vi$g!&pZsRpT;1x5n^PY8^r04(DYqgeng cPzaR)0P0>klgoaUN&o-=07*qoM6N<$f-ujTlK=n! literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_51.png b/src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_51.png new file mode 100644 index 0000000000000000000000000000000000000000..67d2130f07b2bb0a9bcea7e10fd69e69a396bff5 GIT binary patch literal 835 zcmV-J1HAl+P)wObbZ5RE1CR;B6+GftF@Ujqk7Ddh=xh7nD!s((pWn&_z(p)i zFn~}x08{{+%R3F2_tLhj2FMg(-m_i=sR2*`9336rr#CwU1Zlf;09XXa??2X6I?s!F zFKxR3u<)gI11QAiqbsGCO~!-}@~4xg?REgjRLBg#MJP`NB-yHWf3o&+wm>ugZS_FT z!F!9B>w4*~3sv25*4=Eh#*qs^-_F(OrHLGD|M`NW0&G3q2ZAh!@_htf+cu!xnSM8; z?{aJffBdBst)wl)TzmHDvF|1Kt2!vfV=5}AnlnaM>*F9 zfWZ@pQvshRZmHq1V;TfI0>L~uJ*75|9Px=W^&MXTrU6qGX#ki42wW-v&qxU;fVI!= zs@}7Q_4-T&0KheO?Y8>9=V0jp5Q3}$OD8M(`@;!9M)zW7Ru6X#^k)iMPR^g>fp4W)TaW_cB=20GEGB zbwb*3)&SQ6FeYVRHULx#HjV9D-a7znZNf)llv9z#k8Aq+m$dU#L@o+2)1Zg~NNM|| zXdwUyp{U?X2_VRE&tkMxDNuCq9R)NAbQIum5Gv#x@IU0=Nr9YF;4j>W;3BN-F|z;w N002ovPDHLkV1kOja%uno literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_52.png b/src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_52.png new file mode 100644 index 0000000000000000000000000000000000000000..eeab7d00e27f17a96e4e2e4a5e68ca350dac7722 GIT binary patch literal 1476 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 IM6N<$f-KI_H2?qr literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_54.png b/src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_54.png new file mode 100644 index 0000000000000000000000000000000000000000..f0ac11d5bd9e72cbf769d43efeee299b6f5ead74 GIT binary patch literal 1170 zcmV;D1a13?P)Xzr2!E(V_~B9U{=uJmR8o-&LLw-Mcvd_jNF!2F8X=yEwDCv?;?)L~ zh=hbzQN)i@QG|NLwq4!qwq32Po|~LC_uiSgbIYddF~4@_oS8Y_cfNDx-s=dIj10~{ zmH`*8?gmH4D9N7}gpTpC-UC^yx5C;bxzIf^2B%D;$^Q)wo;=L8v6E5GSd&j%zz3xV zcfzBWP15zn*Y7*fVdAjC!M@3fS}ZT>JaF$>jW%yJKE18b@Q8+K6PAEzXB6Cc`1zLz z5P>f{S^#bB-$Mi-nM5@EnzB=WVcNKH9_1EZ-VR%yZ$W#unA&!#(~#h zbgWDJ&8mR1kMo^T0ItJp5O0Et>c*~Bz?Ztm(tDDP4oSd)(pMe4@}adz zZ5z**tsxs;q10rlw>WqNR2?`6qt?t-#VGab3<0a> zjhXG;KRvWh2T{5`Wj1n@fkz*a0*C+>G@D^#wpA3v1CQr8ax%vS=^i!`FukN6s#Z<` zx7!WDzm@F0&o#M=vYY_L0-9a7yN!dEXbOwdlIxF0Kv2Svt_3v zAZKibPWlVWgK%TcC~d7s0n^S`!Kn#9%NWb2xbmi^rr%8fDWWq95Y=g@1Vj#2{eWku zW+{4!V$TvOz}N?5JwWxbn1_+u1kuq5ti|Wnt&ex5>i!%3i3D`wz2sQ+08v7I_q>n* zI*5S9xCZLZ{^onF91DAWvczDSbTm_?*IMPnY&trOkBaQ0tGB@nGATt*gz>!CZfVf$ zspf`}kUUgqQ;pjyzCpuh+agqnfOuDLExs1t7l=dx*!cbvU{?WkuWsw^$e6gKkQzHv z0tF@cuyMvluA&RC6$))#Rsynj0VIIrMFASiATfEcX4-LPF{GvSgAu)E!Ntl$uzvbx z9j3iy1&}><6+ErK47If%AaDM0CCq+LjnGdeKC31xy#-Vbptr&OH}`1(X&?!W4PNbU z&y*ySEjMFb$QPTV)9Ew;^}3${?|T9{s>By|0x%dP0SO=lV3r>~cn-@lw`dv1-=oJ2 z(bPc-KmrJy=#^Rq9?y+90_-Zl3ZPYuL<|9}3XlYpKPz#xQ;Cr6SHVY=0w_~d3aq?U zY*v{T*&|8;EKpH)kszZDKaI%-eUjt(L?i)rvst=-n{)|&mHwj?V3&Z36MLjf#xL6R kpMbww0snjnbafN_0mf>dw#=<+zW@LL07*qoM6N<$f^BjY1^@s6 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_55.png b/src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_55.png new file mode 100644 index 0000000000000000000000000000000000000000..3486b2edb8de9087e64d6b70d1e5eabc3b8d4d4c GIT binary patch literal 1045 zcmV+w1nT>VP)ArjKd+#c<@NH)1ew=&G@BYuZ_f7EQetTGZ z;BBD(J>k!>5WemjyP%%+pTO2nmxfg1`W703pL3sQ)rNtQingRbV2vm1)9MdFAu@;L4u*@bEUJZogCr0RkuKamQfS;7OYX5In3?uKNpstAKy!0OV%5 zK(GQR&zCWHdhT?!qGKF@lqVm*qU*RR1!MaNz^aW+7`%i`5R&A(ZZRtW+I^bb{&as7 zJhc6~d)XLZS^$&+eZ5T;_Icn^8L}Y4L|YnI0q7I}hN%WD764EHtO53={J9!TeK5|H zBG7LIAQiAk!jDB3RjPJkO!f@#9aX1uQO) zQC;1Tb|`fM8-PC!f{e65n)>*JEC9d`IUg6S?hYYqL)=9Q&r>k0JI*k`FjU(IJJgri zIrX79h;g+RMpaWwqk1tqt%4wk1r!G%O@${v=?*})={JWEcXDtWG#>$wtaK21ZcVG3 zeMJPJ7RGTNf$6!{t!{L8SW|!okP>)q+lrWrajpz*q*ruIF*8fFiggH2`+pwRrj1eYyzQiu95I@D)%} zJ5`YaNuBmNei=Zu)BvBmn#7ii0>&ql%H?vZR4QpdyCl5Qf>1PT2OZ_mgC&&gT z0>CtxKYQ`jsV4+P{?7;D zhPi;sM@Xs^2Ws(uaRuR*(s1yAGN6(1x<-46MLs70bGZ+;cD@x7ENxBD9=XF^n;rXA z0YC$tjC0G=HIxAI<*`3ZmjXcJ-3*d->{iDO0OrwP77K#tKBPeG&rtznq$yF$UQ;dX zS(c`n4Sp%bva~T$xj>^7Kt_vk#1#MzDK3cb^$fBZ0C0RxfzZ_jRE9SKM6&=mO_CM>zOrg{pzr_ek$qKt z;%6~rRzmjjP(6aFsw-QnP51N^Q?vl^(pLg74Hb>2Q6mJWyjrNp6xs%`7z*&@0)IgP z{P-HK08#Sdjt_l4-Lnq*KYl5X!#w|Ua{*YtniZouR$a4R)rI9A{dSERvfZbcrV6sk z7@!1z!L2e_h<20>d;Z1-0sTKcw5<%vGz`lkECOPsRVWac?BH(4@X!(fI(?(yACHs= z$${XNz*Ybu4~yeTG1j%fU?Ra$s0p)M0s#M^Qw5@8fCYworz3Jq!krnbC%6V3rRR-% zt*rnWofL$*?x#7f>&wK=|2Kbqa_p|P7fLsPmh&nlmc7jIn{qj z`ZI+;Y@zma&Kz43faUMpY9LFKf#cJ3e!R3U0MiobR#=km=-?U|Z2*#!tETS*#ED{Z hZ!4hf0{=`5_yg9-ZClzFcY6Q;002ovPDHLkV1i_|$_4-c literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_57.png b/src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_57.png new file mode 100644 index 0000000000000000000000000000000000000000..2d1dad03be63cf10f39a09264e023b335523ade9 GIT binary patch literal 4158 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 IM6N<$g0=ZO->Q|L;3zT!Xh3 zXlL)0(VlY$$Q8Bk-4C_bml`O4O9i2P@+C+)UN0G0x8G0Os;dm!xN<^@N7)`eR3q9W zIYcSlBVFa^sTW?jc!HC=N;Ew0KGPDbQ%)Xj40N@KG4X8FL=1ojBntpIpPiLO9*>6r z-YNv!0Gf_hXeFCA#(>qIIGGRyv|PSI_zo0+9f!#Z;CEI413-Ns82mo~z?tF?&tsC8 zL2wxSlMs;O1qxv4$@QU7NbJN|u)2I5xhAA40hs{^ zHPndM*PjA%4q(SO2i{U-+AuW@%oX1(8GJ(p=iez$1ltP0DWLZV5R5Fvok_!ykRt$A zjzIv}kk(1=V5R`&@93pg?<`v5`b2rBUpfO|aiavs~%G+wuY}D?K%KQvC1@ z62JEb!=?b_d?k zh6NQN(c(mbm52PI4E7J219%hh(W2b#VgQE%0KlGg)zO@kJSS_UueDV)yYZC^v5wNw zWV*os0HvU02>K(}GzZ9Y4)k=2*R;%$V`wZ40AOS7yu3CU0O|n&$rNT80GwyXH`lgYNHK=twkX>+|MU+R7uA08C0B$(}>~e$)70a`?_D=h*$6CpqJ~_6AaDOkg?JY7?woza1h&eD8CO^lU z3;nFD&n(F*k3lORz@Osz_qo)3_r4N>-ucp%#Z)=7D>i1usrDF1fOt?-DBAGH8PBY& zFW~^NIEIih$xTc!%5(8b-2bDf8|__I5%cDFNt} zVCFpc*XIM&o8^I|1)zsuBzxX{C*?Q*3-^@2ats>nA|H+M5}%Wu=dt4o7*~M#RoyHE ZegQ#Sc@{mImBs)7002ovPDHLkV1n;x7mWY_ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_59.png b/src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_59.png new file mode 100644 index 0000000000000000000000000000000000000000..aacbe7c9fff86f99702c878ba698d3be9009cb83 GIT binary patch literal 1005 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_63.png b/src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_63.png new file mode 100644 index 0000000000000000000000000000000000000000..4b66a314f2702126f61031b1793ea1b75015a2c7 GIT binary patch literal 664 zcmV;J0%!e+P)t(NIRsfABnHznyQ>B4c3fcf zrmg?+$ul}Rt^dDoUm)BNLK>(YGK2!))ZX1-x0yM+!aV{D43IcXp6mcX*EpC10OWC4 z?1N|!pW+k%GU(8uL*UT0v$JCyi~#_OeVS!~_aEM)sg3PJRmf+~gJP)Gr=*heo5Kvf~dS%BV!9(w+Q zl>vl2f-4nZYd>HsE0AjtWH#MP{UH+op?=;Bz|_G2qp_8Y#Hb-uqLP{daG8gznk1AO z@TLHe2ay3NKtKSOI3dqslLrL=u~ix_^YOJ4C<*|O=F3wbGc@hYVEF(4Kf{{M+u#8J ztUVa|!&frsX3LV}Z@8Wz696C=H}y^eJG`zq4??@o82$kOi>m9l?=onrDucPmY>J{E zsJVOM1h^5z)CAb%M-laSz_!!?kN(Z9yy@#1^~>% z$c6%wKiI*r_JfO^67`*2A}(2X2TkKx_Y`O)?L1I8O$dt0FaaZUb^ yv>F`2?SPk$?lb7==`mcobO|dx>>EOa0ssJvAdM*o$FoiV0000K3(L?d<4O`4?w9>f0{uOvaryihJ+d8ME!gulvpEWmk11=2ack3c!-3 z9r9}bs^r0hv1?$Zq&W%W=JS`EF_wNGj0q{!dE7T=0Ju3s1wI87yEh1&M*)DA!o}wN z^!Q1m2moM#V_FH?(Rl}e5LyZoRRFXipa3|p!=$DPD3?ZK&eFM1zz@i~u9 zya2YBvI%)dca{d-@sM*p*I8e$5_U4A8q$X0>POo~J^+ujMKW#U>_4k5luH@_+|TUK zz9{=V?*sPoX(!W60B|s#7Rbl#kICt&Gcxw|Yi2AZ!PX0a&LaelqgMgiiNPb4mzK`<%R_t%vOx%-gs$sB zohlc{;Ao^A5Y7T-j~tx|gS1gz6jdB`6@YnQ;|IohIIK4)ST`2{dVCEBu<4THvZH*Z6981O zyQ@cvpY$gnUOD(PDSxQb5fCo<5LThHr$JX`*Gji zQy0p*MSqzi?Cid2k3GwcJ%jS|Xi--0dwO=H{6Y{Or@+nK>aM0Q3R~91xBn z0KVxR5CY>!;3ym+2>Tj#a0b9}Z&uN8X-5!~lM__{>kdFm z&PNyk9^Cpy;tb_X=XedN6B69h*Z5z+JxF`1>k7cN2bdQCoy-EjHrn!kfenG%<}3Sq zY99h=8=xTo5CWKK&MLAqoWs#pfZgW$UqEl`1^}x-+AlC403F{r*Rz`ifVqa@fTQcD z3F>REfUGUCdH~>z>s)}@?^<8kXmKrryeDLQ-c_K{0H7Kzdz|ZhkoHmqyLklwd58sX xrYOFjGxGw#n>#icXLTOJ@@m()mV$Eu;6MH3Qx|tL8sY!|002ovPDHLkV1l%=S_J?A literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_65.png b/src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_65.png new file mode 100644 index 0000000000000000000000000000000000000000..6ab3da3f08e457eb12c800e94ee06ba36a08f28f GIT binary patch literal 1015 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 Hu0mjfl|{uW literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_7.png b/src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_7.png new file mode 100644 index 0000000000000000000000000000000000000000..a4a30163e88ff5b3701275c569a41b287efe518b GIT binary patch literal 895 zcmV-_1AzRAP)yPP*=1q`^CD199#G~rBx7} zA+!K+ATCIV`S@sAmV{zza|>Y2u`e)^d!_}T&c%V4-h%+zV;ypCEE}6=N=}W%zmnc?-x4dpe4!2P*Y!ohV+%cc5px@<9K_+iE((H9diW0&AbR;eY^!C z#g%dxf*=Ty#Zf>wWdUGAQ)5DQ__ugR(>L#O0*Yu7n>{d(gN)EyXD@Zu$C_A%rq z1bi1N4GSuRp3BAnm3V&S6*RWD$!dPT5YO;22!IE*O6Sv!r+|oC01NGZe0B_g7LHc} z;f1jTzz^@M_US&VYyqIB)iNi4nXc6IN%>rK_6YRos;50(@Ufl4&OREbo^;g-9Rc9d z49&CH3g9Ym zvUi<&*wimD3J3xGah22HW%8`k_CP7XsnK5c3jqWv2zu#Rr*nl02o*5@lV+jkfL{my V&EI5bY1aS%002ovPDHLkV1fX~qTc`j literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_70.png b/src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_70.png new file mode 100644 index 0000000000000000000000000000000000000000..9b61e27655b1af270820cd89885943d87d0ffba8 GIT binary patch literal 1037 zcmV+o1oHcdP)JhQ5mKqRLDblI5FrslJVZo9*L`#Q_GTxuGqbmMmn$;O+}_O2zW2R<-kV+a`*DxA z`P5qmK^u7Y&!gY9=yUF8{bS~r06JRKbNn%OBOBVTnq=~a_4ZD9Q&au100tWJFkWa^ z8lW4qg%<(P)dui>A#y9b(8;{()7~lw7S7{BMgX#*-rY~$ptA?iFy1>1X7gW^{v2xG z1%qxn!Q}q_Dmg6!@UPi{Ej&082$s%U1DKxn3HvRZ%`(q#aBm*qdaG{tUo-eC2{qg4F_B_+Zu-t^(C5bxx=cL->CgRExN;hFO(Ip9l zfDJ*&5YTyaoaczZd6O}!@!X?V#=}fG>(V`10RE&{0O&kcL~N}m$6)E%Q0OR*wVW7* z#i!T!IAbLRBsI2f0iYx3Xz!>CQ$r4iK{cP?^o`B&u~Z7cvp|A_O;W%(U#9}C0?@II zAAi8@v&G6lj?&h+{Gb4T_HN^#%7ws_V3h&rAZT-dOnc_#2mV*)$i8v{p}Z%o0&4*Q zkJ_e_5?PJTljGv=v?L<$0#$|(*$TlC+!_EnS``K0%Mdm^23HwCWGmPJAcw^$&tK`{ zwU3l@v%SEFn;M&xZ*7y8ipS}`9j!3=brJ3_$GqE@AtjxCv>YAux}EOG6Xx7Geyvr2 z9C5rh0(kS&qi7DEE}bgRH7{`pY2F@9IZ3pyY5+_Lknib<*C0Ai##G`1iU>g$Aetw? z>&OtT6d>MY1Q3)p6#!I0t+zmG0J6h!1;CRW^dBrSiiti>plyJ^#e5+C&leh=;hhSi ztN@dJ7Yn|9nr2jh=>ZV{K_;ifCqEZ+fb2ZYK?q{AQHrV@%l{z&On{j5RDERth+l2- zEAB{!`{E710M@bF|H8C0^sSPWp#A{(&SUf`(g*+>8#xvmd96MTgLMG_ZRFbkRe;g& z+zyjRw<=Ayk#!Ov^#=g0_aT^)R}v?6bL$2`sDdDKqatbnp{@W_Dym7=SqC7zp%S>7 zm%$_vtMuG;1z0GcXXX|-jsvdiD*Mz2p-M+J$$B;lFah`vlb=dvf4Q+=00000NkvXX Hu0mjfcc0!; literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_71.png b/src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_71.png new file mode 100644 index 0000000000000000000000000000000000000000..f4aeb54c05b4f73b70aa60615c7af1af1b39ffcc GIT binary patch literal 878 zcmV-!1CjiRP)6ue111Qa}o;vYo3i6_xZPJ$QdO;n_!SWpxS z5FWyxDp0_rCYu5U(-*DJY*P zdbD(1Uw9wzeJ?)WwT7sc`L|QeC)($?sNQT+rBD#x$@h4Ep2_`Ze|7!3w(mNBP4Reh zQ=>tC_p}zku~(<)&dytja!}vdDFDDS1rNuK0MzKPpnUfTl}iJO2hV!}LSuHG8b|NZ z#;=3ztm+hSU_;S6JM%VRMX&-A1yH>|7VNK9=uCEt_j77b0OxuE0DC;!G_eeTEPWM# zTn07}j0(^h^hyB;=0WwTsAHW~r7#)Ni)nYyjvW zaQ4*z)w4ku0A3#n009O;K=Uv6(vNzR9@ZX-xDM40(%MRa26nw5&+|e7*+8%Xz|OKV zROxe&ssiNTSs^%SGEkI{Q31#O%aqNH3lKN_4`MNc@xPy>+nI|tafaIH0KhmbSbVRm zdjxBn{a64_ub!h-Yj%hLxD)^Y*Pman>E`czR{$^sQnA__3 zzmOo z%0J`cC4<-iI%$BZ2O!g2i2!sZnwSDu{`^9eL0ky30@Sm+OHV)vnEW$M8Dj~UHn1hF zLcp=rC3v1nCjV9h01h5bqY)-G4N{|kZe%|-3Q)6;9*~6mQw4zg1kM2X2gtSd<>PrO zdVp=CjBA&g9uPM$Tl+qMG@S!%vl_>)uYkS++>gS40ZXYTz;-&)m;e9(07*qoM6N<$ Ef+9YLl>h($ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_72.png b/src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_72.png new file mode 100644 index 0000000000000000000000000000000000000000..36aa1aa89b898516c291ba60845cbac3efa541e5 GIT binary patch literal 1340 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_76.png b/src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_76.png new file mode 100644 index 0000000000000000000000000000000000000000..8cf225ce9458b19e2be3c000f00b2709c3c749a9 GIT binary patch literal 745 zcmV zVjtw5$inKdr$ew24+2U8@Nsla^t`Ok9Dr%V%mE;=TuYUTCoL!7`WNyrGzD%9z{jdhF8mjqIRfEd}t^LDPG!xKoB;qrU2*{J9JF2PT_e;1D43pd^Vkd3xApdkCrR(qzq&97Y}i&g5!W=u z`C;+dZej)CaaFZi@8`*}hywuD@OCO}V`Il508@PI^8LO?grq7(-RqyQHm*Jaog;5M+$HN7AvQ52m8fPZ)6oIbW??tpHs z1CnToPB{QhOz#MBAvgyBA>7F#sJBD-eWz-GZMTRr&dC&rB9I$<55T1tA?`Fwd4BJJ b1RU@W4%m|)Up8$W00000NkvXXu0mjf4rD%& literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_77.png b/src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_77.png new file mode 100644 index 0000000000000000000000000000000000000000..a245dd82455c7692b157952043dbcc0b81d72181 GIT binary patch literal 719 zcmV;=0xxigO_*n@;MB;ZeL?~P# zA!K=zd-86~&g>a`ZnL+|-tPQ*?=$ax-_BXDOSN`d$AQHn*Jk*`ep?vCN6+sqU7dW5 z!;M{juW4?GS`*%j@2~^3)wYj*+b%P9ZMNT5Iq_pK0DuAUf&c)hlcK{`Mw@l8JZ8(l z=$r>XVg@iXH62APlydA@6kNVnvA*t56aaCtKmbssKwtpSomZuV*iV-RF{c0wcs#pg z`6DZF(E$`eG4xg9NBcsAsB+W@Ks>~d0+8*z4uod_vdcp(wQIujC=esSsT|VMhZW&Z z%AhVpJSzc_iCcRor6Ej9pGp(NHc=B~C6vOnbO62#gjy=)plWjq&Mg3(4;&QX&^B>h zBLLu_ZQJZ*dx*U}U$gLC0iQo3@0O)!7PHExab{VTBOo^roB+UBFdptQrB}7lb&UYP zL}iV2tgxbogIJ#%;BzCG+tYb=zO(PfPsctg07er>0O~%YwJ881^`*4j7EA>I0GAzJ zW$O!zMs_AV0P5Y|{tQin-g`GhsB@nA54Shd%Vg%w~M#}P+C&N=exMN zVI}}z4pY&TX_Cx7&j7?KfDi?EK}qr@07^4f0CX(C@LdXEc%dVZ2ET>y*O~wtptDa` zWwaWgTfl9uiO$0~Q&CI;@M{F%5jL<95J&)!^H>t;KRPB=!B-l9VoAj?P$?jO55Tj@ z?&H}+SEUlB3?=~(0;mPa2rxVu`cedGHAsXA_yo4jsZDrgI==t_002ovPDHLkV1n^q BGvWXM literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_78.png b/src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_78.png new file mode 100644 index 0000000000000000000000000000000000000000..0645c67e9fa7659b6e45d38606a805af034d2770 GIT binary patch literal 1802 zcmV+l2le=gP)4Tx04R}-l+Q~PVHn51vyB)iL11Qkh@nGBs7w}RMCGo(*tBg~f0Po$?CiU{ zle4qa%26U(f|ru*d1uDm5$(qdGxK?$AK&MB z-{F0M8d)(-JtP5n!?BWmQR({Vm{j`_Asj&+!l+YJ+l(X<1E9fUv1@F;hrqupt$X|b zI_lE4ng@jaKh%lTb}(f=ak3uu6-!kMZ8FSKs7BM z|C+c%%_(W1MkH>@24YeH&g(_h@8=*r^~@L^r0;R+=`OQ-d=_TXN_RhT8}a8f>+a#2 z#Pb=gH%8n{&sxUn9rjo_p*gW3k3%Dd9v|?z$wwEp4JbjhwM#!rpOV)g4O?IHuKzA8qHe6NWHQ4?5 zW?+>pP^lFuS83d>RC0Yby(58Yf7(5YU7B8Os@7T+7jCT7FHP^*tHQ2TvC67;&Z}|3 zd?p?hPl_?ILp%pbyd-vt7sYOxofiix8N;NaVZv3ip-`5AN%ERI{+SmG@2t6_p^q8N z(o~6`|AbY@XgUiV(SNxAbMSk`qp>3J!UhhXuG%(|?j0gDE>~^N72v`*x)0t~ZOwEZ z4m|-D&ZtGJ}8;WLk96sqPn3I;4%{fxLET5GkbR{t#`+_*~}`j zbQ|o-qO3op1A%X}Z*u3nz?Pk-#-Z-;6&Wt-VoB6r8@4bEReShEg z-f!NH)X%{!Vo#_M7w%pG04n%&P=tkCYQLx`mwL+4*?dAO-|gwv?Em`ZTguG*dhyU7 z<4^JX_)6?KQU`ilt=PV8CjekN9yc?uAy%zfWBVL>&=p75V&iiU+8;&H+|Um9Nfv^@ zOJ8X59a^w+fADc3G};PHl@w7o#+pQS1&8Vlr4R%jZuguCTD#yCH;6qAO{PpJ#4hU^ zc%a!%a~vnKEDHeGv~Me><8cTAkHCu$7!D1ob|S(556na+HQQ;P=M@zdRh5{I$1xll zLS4gt+>5-iQ{O*_CaX_Ki?gVy_2Smwa-GT+|DH}4Kw4o?-2rc2J_7*M)Ow}Q*(`?y z2mn-I=!ppAX8S?~=-c09>N#%~TCH*^t**bfPrAr-oIYi_S&{*2LAM;7-xZlm27#d` z0Dyyy2T)vGEVcCq>@m#W+b5Es2l)4*ylfRKv>N*Zj}iMcg-j-cabaB178#2m_G!wt z;N=YP@5N@e+LoiDX@Hzccco_8F6;~*kR?Gq!lPmIbl(O5oIQ6QJ9h1`M1Worv^xhF zGJxcQU@!;(@cDcItU3Gt`YB-e2n2&cjJzAg$h%R=h~7S>zn3|a&NBD6mX~*&{whyWd@J*o3q=ixR46!GNvAkOBEPYnH_X zZ$_W40iVBqQIsd5`=<%Dc~ z9LI@reG}2~>@ErxeFW4k{08eWhF85!RKFfnI)XE#d5(DIP z96KWgd9C|CfVo|BpGrRrG=u<;s02!RXFpT7OK6G3h%wL%b zR_g;~M<9D}`6NK@^OmrfySo|k)u#td98?=TdlDi;M1& literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_79.png b/src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_79.png new file mode 100644 index 0000000000000000000000000000000000000000..d9d96e41d1add0c1137ff215e1cf60c86e684688 GIT binary patch literal 987 zcmV<110?*3P)Q3Pb7#(U-kp2jy>I5JBh1~*d-vUsbAI=K&;1zZ*Ta48mQ(K> z*GrC<+`scKV9NA~pD5DO&!bRXw;z5izJ=JLoYZMmNI<+-zGL|w80pSc~r!uau8PltOj5rg*A)lv8^I>uxIAVVMk zGY=ME&(k@8zAnE#{f}VgcmfatcU*q1J%2f04{aa-lvx0Ph(SYtwoHji_)~L95Vrxq zAt(VP4rFbb8v|eff=251(tD+Pi~xoPG7yClObVD98uv+GR)S9fMF99VaVI2zb%+5t z+LR~`M5TbdqBSyE^%%edP*4yg`v?Ys$SXkM0L6fyDG(ZfsX{T4(PkCU1;H?@fXX(L zKl&h8jHjA9HUQ*hkbvyHnHEvLc~{KW`t-sQ$V*;P08E4;74)Nd>3KlAZBI2#QBInBY?C_#pR&d0CLdON?|PDwk`iF=S7IU+s}x9t$W z$%)U|_wEk1$YbX6R%QUG=GY2pLaeO-aY z+A5K?vu$^n{2vym&06@-j$H^9R5M)-P<57-2 zwq*lAHP^$;f9wY#;E2nE5D0)A=9TJ`W1+McR^<vS6il9Ig4QP~fGa0qay$*K?QuxGPWu4Z_^VSB)-4MFIOj3Zy3P2F1L>Hu{a$?HJ*XXQLSpXn=_@zhCGKl51H^eqXDggcys3?G)PYBDJ zuL67u$O=~d6T`~{&2O98P<9Ha0FVe&6rlJsvN8o2fpUle{{VI9a{x@^P{aTL002ov JPDHLkV1j=Qynp}z literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_8.png b/src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_8.png new file mode 100644 index 0000000000000000000000000000000000000000..1c19170a35ac78b879cadd222e44984eb0935504 GIT binary patch literal 818 zcmV-21I_%2P)EkigL42Lm@=57|KS| zY^F?hHWp)=q#XBq#&hSn=boSM`=0l`>YmMe?|aU9-{<+9@AKo{?AMcRa>cRFnP?CB z`na6^HiwU0W9sft^?l_0%AUERH`b4D5PwFuie-~uI*;PthhE)Nwk_;CC;5GR#u&bF zLCxF7*ZT*gYrbc*Z9^&u1OP@71QP%bfv+V%|1|&@Z&LwxaQ^BY2}m|TCI~?aXf~Vj z=;{fv>FkTlwIPKHpny;SqylmjAPR?oj}WJt3IN5kDG%rpr(8f`P&fo|`rJtf^OAR7w7~hooEzw=ByP6b#o~EC7T6PNE2eJ-be**P0rsTmW4b#JV-Z;(Fs{$6pR820|GCbQSoV=JQqsY&`Q^`Eh$SH7dsuZ|O~3V_MJ zWB`2fPw|7vr-0-DxB)%@q2$Y0S4jxy4(k;FCytu>_Wk4JlGmY`s*!%r_gll81403y zsi-3EZKav+*8+fA(W+I@7YYFRy27Au0MrGcZva36sQGj)Bg2P0qi+C&7@K0v008@e wR$CQFak8P$94KI*fTjN^1|jf|Kx`-Y7wJ0gnPR0~7XSbN07*qoM6N<$f&o2ue*gdg literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_80.png b/src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_80.png new file mode 100644 index 0000000000000000000000000000000000000000..a988f8d4c65b6b926055a66cbfb121185490a12b GIT binary patch literal 796 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 P00000NkvXXu0mjfq8p!k literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_85.png b/src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_85.png new file mode 100644 index 0000000000000000000000000000000000000000..997debcefba800ea2bcc2e065bae370cd8d40963 GIT binary patch literal 836 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 FV1mEDi=_Yn literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_88.png b/src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_88.png new file mode 100644 index 0000000000000000000000000000000000000000..fa063268bbcfaebc84c623c8cf29ee7a9ef0fcfd GIT binary patch literal 1663 zcmV-_27vjAP)4Tx04R}-l+Q~PVHn51vyB)iL11Qkh@nGBs7w}RMCGo(*tBg~f0Po$?CiU{ zle4qa%26U(f|ru*d1uDm5$(qdGxK?$AK&MB z-{F0M8d)(-JtP5n!?BWmQR({Vm{j`_Asj&+!l+YJ+l(X<1E9fUv1@F;hrqupt$X|b zI_lE4ng@jaKh%lTb}(f=ak3uu6-!kMZ8FSKs7BM z|C+c%%_(W1MkH>@24YeH&g(_h@8=*r^~@L^r0;R+=`OQ-d=_TXN_RhT8}a8f>+a#2 z#Pb=gH%8n{&sxUn9rjo_p*gW3k3%Dd9v|?z$wwEp4JbjhwM#!rpOV)g4O?IHuKzA8qHe6NWHQ4?5 zW?+>pP^lFuS83d>RC0Yby(58Yf7(5YU7B8Os@7T+7jCT7FHP^*tHQ2TvC67;&Z}|3 zd?p?hPl_?ILp%pbyd-vt7sYOxofiix8N;NaVZv3ip-`5AN%ERI{+SmG@2t6_p^q8N z(o~6`|AbY@XgUiV(SNxAbMSk`qp>3J!UhhXuG%(|?j0gDE>~^N72v`*x)0t~ZOwEZ z4m|-D&ZtGJ}8;WLk96sqPn3I;4%{fxLET5GkbR{t#`+_*~}`j zbQ|oZXsoVD6HtQ0B9L%oHVPIY zguCL1V52r3u@O=Q|9~s3qJ`-KraK|r*@%WE*&{KHpt#{eQr%&pRjfpaXdwub;xgmx z-tOM)?d+XGesJvW%9-5anC-&u@IryQYB3dl+LRP7xBOX|hx* z1ppYzJjPX+0&%#yA6=D7#Zf?h-4i0TGZ?Di7aXIINTpJce*lE>aeG1(fhnaRgak%- z6&gI?$?T=;T_q2QWAp)lSXL>ric!etmjL*$>x2-N%T1$Nt%((ZQmUK>@HQx=;#w9n z;rCD`GwC?CdXEZ0##2gBD6BZ{31fUSdodZsWZO^Z)>Ocz1+1=5Acn z#pwY$k>@`5f>1%Qys-uVNRN$c>r}D$Nd!1u^BM>ad@{=GTzO+n7%rbjMV^m@5T;WE z6_f=?kB!IT0l=jQx^jNi(FdC30o-7jrFW|YXxwL~(-Q;$48vfyZDV`?)bZTNKrbkz zn4h0hx1bui*754ZYwFu`E}o5wrOmLW7o&G z`Cdn@0_+@|2?LGfs4(0}jsmC)L1h}bknI|EnJe?jr&Aj$ zZ81Rhg6l+N50KaQxc|h611(eFx_l4tLhCYk9r-Unr#sMT{sIC>%9>mK%Vhun002ov JPDHLkV1knm7|H+u literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_89.png b/src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_89.png new file mode 100644 index 0000000000000000000000000000000000000000..bc596284061ad633172884d23a37aa17942738cc GIT binary patch literal 909 zcmV;819JR{P)woYWH&)Ds6<6P7({aNX7Ca`dlM8R;whJfN>9yAdj zC|Lq}k!(bx2;wWKAgG8BP+@Ji+SF3p^mO;k^q5i7m)Ys*>aF_vuj-x&eq8Ppiw{l* zFxRe+jSKv_YRv}O^XAo4Saj(a6g!sD5P6+?@g9Elk2drrx#_N)lylMi^qa12rz&;d zlFU!>MA-(nIgu#Jx zaHv1j!paJOs; z=~m8~0_Ad9<~+5w))g{%-cY7$^OXiR0BY^wexMIF2vz{N`h3!j9c$$+seqm#gnNY{ znX`CB$FnSgRA@~AaEz@;S^=mE`2OWAfQ+lPdLEjVeu6^pEeL`j5|9f7 zorEb+wAWR64uXQFKHILKuA~vbpWR>rwuZwJ#EtQ*(w@M~JUm|8GJBn}BuWLg95zi( zDU)R7Y2M(&>4Grr>FuipZ0hWj<0%yo0Jg`|V=(*L{iv>kkOlzykaXo608l>K_Vqgt z-buTjaJkc}>jtS1(gH~A$ef{6fC~T&o&x8;<2sOA0Im?yDgf;{gn3thX&WTT^Hn}` z;;2k|vfH+!M?P+8Zjt?@D6;YO&Y)A8$v<`cLUbfHju6W3dJo@nVJFJHJ1Qf>q0I7_)Y=W;Bj2; z0QivqKMR0=&bH-loFGkObD;n#f*7=G@%rxo_zEcQJh@RoT*rNlUjV>f(Fv;VAe8wz jz}Je#oo7J-9u)8!e=vHrizx3700000NkvXXu0mjfRPn0F literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_9.png b/src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_9.png new file mode 100644 index 0000000000000000000000000000000000000000..a0610491c1e74d161655f47de929b55f96ce05e3 GIT binary patch literal 3503 zcmV;g4N&rlP)EX>4Tx0C?J+Q+HUC_ZB|i_hk=OLfG)Jmu!ImA|tE_$Pihg5Rw34gb)%y#f69p zRumNxoJdu~g4GI0orvO~D7a@qiilc^Ra`jkAKa(4eR}Wh?fcjJyyu+f{LXpL4}cL8 zCXwc%Y5+M>g*-agACFH+#L2yY0u@N$1RxOR%fe>`#Q*^C19^CUbg)1C0k3ZW0swH; zE+i7i;s1lWP$pLZAdvvzA`<5d0gzGv$SzdK6adH=0I*ZDWC{S3003-xd_p1ssto|_ z^hrJi0NAOM+!p}Yq8zCR0F40vnJ7mj0zkU}U{!%qECRs70HCZuA}$2Lt^t5qwlYTo zfV~9(c8*w(4?ti5fSE!p%m5%b0suoE6U_r4Oaq`W(!b!TUvP!ENC5!A%azTSOVTqG zxRuZvck=My;vwR~Y_URN7by^C3FIQ2mzyIKNaq7g&I|wm8u`(|{y0C7=jP<$=4R(? z@ASo@{%i1WB0eGU-~POe0t5gMPS5Y!U*+Z218~Oyuywy{sapWrRsd+<`CT*H37}dE z(0cicc{uz)9-g64$UGe!3JVMEC1RnyFyo6p|1;rl;ER6t{6HT5+j{T-ahgDxt-zy$ z{c&M#cCJ#6=gR~_F>d$gBmT#QfBlXr(c(0*Tr3re@mPttP$EsodAU-NL?OwQ;u7h9 zGVvdl{RxwI4FIf$Pry#L2er#=z<%xl0*ek<(slqqe)BDi8VivC5N9+pdG`PSlfU_o zKq~;2Moa!tiTSO!5zH77Xo1hL_iEAz&sE_ z2IPPo3ZWR5K^auQI@koYumc*P5t`u;w81er4d>tzT!HIw7Y1M$p28Tsh6w~g$Osc* zAv%Z=Vvg7%&IlKojszlMNHmgwq#)^t6j36@$a16tsX}UzT}UJHEpik&ja)$bklV;0 zGK&0)yhkyVfwEBp)B<%txu_o+ipHRG(R4HqU4WLNYtb6C9zB4zqNmYI=yh}eeTt4_ zfYC7yW{lZkT#ScBV2M~7CdU?I?5=ix(HVZgM=}{CnA%mPqZa^68Xe5gFH?u96Et<2 zCC!@_L(8Nsqt(!wX=iEoXfNq>x(VHb9z~bXm(pwK2kGbOgYq4YG!XMxcgB zqf}$J#u<$v7REAV@mNCEa#jQDENhreVq3EL>`ZnA`x|yIdrVV9bE;;nW|3x{=5fsd z4#u(I@HyF>O3oq94bFQl11&!-vDRv>X03j$H`;pIzS?5#a_tuF>)P*iaGgM%ES>c_ zZ94aL3A#4AQM!e?+jYlFJ5+DSzi0S9#6BJCZ5(XZOGfi zTj0IRdtf>~J!SgN=>tB-J_4V5pNGDtz9Qc}z9W9tewls;{GR(e`pf-~_`l(K@)q$< z1z-We0p$U`ff|9c18V~x1epY-2Q>wa1-k|>3_cY?3<(WcA99m#z!&lx`C~KOXDpi0 z70L*m6G6C?@k ziR8rC#65}Qa{}jVnlqf_npBo_W3J`gqPZ95>CVfZcRX1&S&)1jiOPpx423?lIEROmG(H@JAFg?XogQlb;dIZPf{y+kr|S? zBlAsGMAqJ{&)IR=Ejg5&l$@hd4QZCNE7vf$D7Q~$D=U)?Nn}(WA6du22pZOfRS_cv~1-c(_QtNLti0-)8>m`6CO07JR*suu!$(^sg%jf zZm#rNxnmV!m1I@#YM0epR(~oNm0zrItf;Q|utvD%;#W>z)qM4NZQ9!2O1H}G>qzUQ z>u#*~S--DJy=p<#(1!30tsC);y-IHSJr>wyfLop*ExT zdYyk=%U1oZtGB+{Cfe4&-FJKQ4uc&PJKpb5^_C@dOYIJXG+^@gCvI%WcHjN%gI&kHifN$EH?V5MBa9S!3!a?Q1 zC*P)gd*e{(q0YnH!_D8Bf4B7r>qvPk(mKC&tSzH$pgp0z@92!9ogH2sN4~fJe(y2k zV|B+hk5`_cohUu=`Q(C=R&z?UQbnZ;IU-!xL z-sg{9@Vs#JBKKn3CAUkhJ+3`ResKNaNUvLO>t*-L?N>ambo5Q@JJIjcfBI^`)pOVQ z*DhV3dA;w(>>IakCfyvkCA#(acJ}QTcM9%I++BK)c(44v+WqPW`VZ=VwEnSWz-{38 zV8CF{!&wjS4he^z{*?dIhvCvk%tzHDMk9@nogW_?4H~`jWX_Y}r?RIL&&qyQ|9R_k ztLNYS;`>X_Sp3-V3;B!Bzpi^ixc~qH?MXyIRA}DqSWRdXK@|RG zO~fGa=b~66MNlt+oYJ0LRFDLM;KeF<3KRko*j#EZB|&>kK`@w0tTcF15K=F}<`!~_ z_R_;%5{tB1N~MU0fH_Dz9^x#Um}Ymgo7si>AcURCPTu$4`@T0bWOG%a>l?4}^wl#0 z07@%G!O_0HTLu8sH@*M>#PCet{O!z10s!eqk@|f>b-q$BAy-Whz4i6*crI*x#+fGz zc#wQVh45XxxCtCiE%lt*-^Q)qZ)^vxUH|gmF)=)&27#vu7qj;<|NS056yD=}?PqUr zH#;%#Jk~em3-JnMpPYlzN@4cuDRpAf&Y4-CmH$KnptMr-ATSL8h(6xJ;nWgp-gz$3 zXH?J{ZyI<`DBFDlH7~!?6n3)!mYt=*L0}r%k5jzVX5L5@#Kbt#ks`Id0vH{f06uKI z5|R7(U#XYW0N7!q-IS=4B^bE=l9&;|PFF^*njq;&k;cThq5S~+EekAL0{{d)2d~`7 zk2PnP<*EtN>B?ijuLaM{?+dE*5%j=QO0hDxgT-h=9bb$#urjv;N~vQ($W;@B(ZP}i zjGAmWCG2I&c)qy?N-3093IOo-TLY9*>}ASmHzh7qVP!u!W+wZ?^v0w2$7g3w_r!vb zKCpxk{Q9_#9~||<$ll+GX*Ix<2(pf0XQ$8;LA$umvabbiNCdUu*dQear7FWp%idT+o=dDQtkpA14O$hLtS<)6B>uhm9UTriq_t65)N zc!)`z=&bnXG5f+%8P>~uOmybLL-#ObwA8E!pHz@hsh9q_?y{2#U%y`0dNy&M@8^|01UQGUK$~| d5j@XU`3Eg!ie;w34N?FA002ovPDHLkV1i?eu!jHu literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_90.png b/src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_90.png new file mode 100644 index 0000000000000000000000000000000000000000..2c000e44cbf0a023cf79d5c65a4c28fd88e6aa38 GIT binary patch literal 971 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_93.png b/src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_93.png new file mode 100644 index 0000000000000000000000000000000000000000..d05297e7da3a36a141a940952222a79001b31f57 GIT binary patch literal 924 zcmV;N17rM&P)pO3Is^liUegOdRq$AwnU(T4yCgxcmxU>cmQZ<-BVygfrMzNf(xexB>M?c zf`n`&Kp+topMm529?#BYy=zRSS?}!J&i7wtCP{w0+DUIb+fx1K`$^j0OV!mE$}H7W zo9fQ?aqZ~KY4!HgcQyWbw9q!T0%Kp<`ZFGje4iZsN?2dn+(_}xXUJUXw7A+OySp#b ze*e~NlB^CA!jnT)hX_dk5iyEfe~27u`W z*Djn%eIerY09v0a8jZ#R08}6`)y^F!DkQ>H0+5OC?xhWFG^}B106q^O4Or@50f2bZ z0EGeYd4O~W(_NQ!|Bw*C_6YGP(g1}4@Wn`MfFoy^iII6k3gA|nOiR`rw7e-EeUXnC zhO$3^$+LrR{no7S>-6aM<+&#JpT2W;$pgS9o;wf4%fk~F;1X{;KzRYsKs-=U{Dba$ zJ?F#rj()lzm;mHS(&hnDJgpD$JOze`H7z2=%im4_5KrO!4FC|2`pM^ss#dBRLKXmd z(qjn30HBp)+}h{C@_P^f2|@zEK=>8{z$X50|Aibt4~UKD7~yQ|4FQV8v)k?Je(iQ! zKj8%o37ZG_tnUJVZ)I6M*aKw4UazNGt(LCB@59%RXP;f-VMQb@nYran(zOfZv1n|c zAP?Z65RO6+uE}_Rz?R6ZQP#~|(6J51ipkU734ns-z*G0vG0XD<5+TYo8P3(`Sxjsn z*ZMdX4|=tFZEpC{aHQXZ07%zgM*z0#1%L#Iq-T2;0>Hc+QC!&& z)&fA5_*FpoF8}~US)Onr0l4lKX5Lr}09ceO3}UPw`-hfN07wgjOhBu|F5b2a#EucN zK5T=*yMVcX?VI-&Eh-!B4u{rfGW~N_=D&|u3BXLIKJjQ@1c2Z6rIjUIz literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_94.png b/src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_94.png new file mode 100644 index 0000000000000000000000000000000000000000..c4d54484cef54c75ef8fbb4a170e52baa2eb3e66 GIT binary patch literal 1240 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_96.png b/src/main/resources/assets/minelittlepony/textures/entity/pony/bpony_96.png new file mode 100644 index 0000000000000000000000000000000000000000..7530cd3dc229dd767b422486bd7b1159bacaf160 GIT binary patch literal 1155 zcmV-}1bq96P)q@p0HCrBbY`PP&>?gZWJA_Yot6; zAW?N^xX-TMdM#7;lx|kMyg`oVyUy>aU5y3feP^U^n_`3!0Ct~S5X!wL5Cgc6supGg z0L2&r%mJix?HPcH5LbZHR(nwZDNL6Ic-Eop!`;xc3#bYx+Z0T)bD;pF$^sk?#RK?0 z_4i!?89O)|$TJAvJp|C4oE&YQ=f?7YNbRb-m=vMfW0_pQ3BcT<#oRd8Y`g%#B-~gs zPz9jN7P^IM0l-jR$mmq^@Dbep;vFuU?IH8m|q4s_gNCU0c@4yiMtIYI;h(H*aO0Y^O6iuAwZuxL!1z zi+@l}jE#%VS1+?>hi-i|NjMyiXOB>6(!9|~RNlJ+FgzCb|H6WxYXD?C%?b#90dQKM zZvag4r_X2XJTIhzw$|3HD?kTe^4FyPkC5&p=p-={fXb>W(QwuIR~aDq0e}-F7o|4O z091q33_v@M3G45~T}21LDHc@h*(-tt`Eu;V zD0GcFH#Q{O)NB9}TA(_=NQ)}G#v z>j}PNd89Lt00740fN}DH1K?CIJYO~$Fl+!YCxw7eh6147ZkwQ6t(FD= zw+?Mp{hu=_n_)u`11?{n5G09+ z09+ZsrC>|3qIIPS8dzvQpJNd8Ui6fZGr)50hXx_FcbRB? z@H z02VO!ZBktt*=0cB-2lPd{P0Pg+Oi-izWf(=3$05E6KoyYYW0H{alT>tp$k?FVlz%ieAt!+4jvH%J%WUZq&00mM z@S=xTe5~)jJ7`{=_W-`*@VSZrs5EhX0|Ou#AYN_pf+87fsE5$@t_{L=(nZfJ1L&ka z00x=%HUKt>MgzbD<|hDm^|HZ-{Pku#jd-2SCnzv610(?4)yo3F@t~CC;|l;{z_z@s zBmiGus04u667UTk+EorfjP(C&0pMR(!-P!X-p ztbjttsZ0ihE<9HI{{YBObcAZV2o3xm5Nk(6$MMO4x%u^~*=(v#r(-Suc@K~P{05Oc VVP^5oHFE#}002ovPDHLkV1fy3nCN5 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minelittlepony/textures/entity/skeleton/skeleton_pony.png b/src/main/resources/assets/minelittlepony/textures/entity/skeleton/skeleton_pony.png new file mode 100644 index 0000000000000000000000000000000000000000..de1baabf9f75d707cab45dca9ec493f7d2469ad0 GIT binary patch literal 1276 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 O0000-a literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minelittlepony/textures/entity/villager/butcher_pony.png b/src/main/resources/assets/minelittlepony/textures/entity/villager/butcher_pony.png new file mode 100644 index 0000000000000000000000000000000000000000..6ac2000394afca8b1ceed88e648136824d77a0c8 GIT binary patch literal 828 zcmV-C1H=4@P)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01m?d01m?e$8V@)00007bV*G`2i*i5 z6fYWiY9S2(00O*8L_t(&-tAexYui8+{?0YDR$WLfGSyRm&=k6~a<*bGrle5lT)gWa z=s!^?$&gOD-G4x*n&8Er0@bw*A;d#NDL927j14YwLx<}SpL{yYlAPE^iTq8{JA8WY zd*8eFB$KmG&-l$Z-w1}-D6DZT5H`OJ!!W=Yb8YhdR%4d{Kq;$p(==VXVHlv40sslx zKP;Y<9DH0+%Ie%O3=ct+QZ)W_F70~?2}djlV2nY|aN-CEB1DzHTn44A&aZt5h~U+O zQeL}u1O#;jKO(L?0a1dQWzaIxi|+d>wi>&{8uU=fthhF7&;wn4;MP8445n#{zOTaL z|E7IR3d6lhS)HqMhG?PxKAaKmaHPW=tXVB=6xOC*n-+BM&~sm@H%YZz^pG$K@;qP- zdVzX>e}CZZi`VD&=f40t0OuTpkV}*Bb^ip_a?x*zFvhr) zLBbg0a@lO!$3!LZU3sLQu<}ZUjFG_O8vua2w;qlbhPGJ*9|1%JFYbj+&OF^aM73O; zMC3S5&nqXi1n?4onHi=kz&2+RR70iSBo{es#R&az@Ee89N_ZFOKKhRC_5r%v2e3PR z*quK3(?0l)1HR+La(1ZHn?wv#VcjEC0iy2hP9LlK9RNV#e%`&l>LAm!LA%ojfSCrb zzo#T}-HvD4y;k<{ygJMBS4$_501>cfAo+Ph{NA%`R*Nk9dqR+ZE)$&d;eqXIPe*x> z$hhAFPx#24YJ`L;(K){{a7>y{D4^000SaNLh0L01m?d01m?e$8V@)00007bV*G`2i*i5 z6c-uy{LD-M00gy3L_t(&-tCxAY*j@R#((F`z4yJA1=K_mP#_o$Li~qmAU0B((2^iA zE_7>b48esf_9kvzx=<2L=&CHbbDXdky3jx*t%+56R11CY-kCWr9<8O6 zwzjne%eR`G$-6V>%=dkB=1J{~tyX&Nf^Zw19c{)U;?s8;aboxoQFZuWs0wC=h=2v8 z)JU>!Cm_^*K8_YOP=^p{eB+2r_x+jj(TT|~1p_7#27&w5+Z^T%}|#D zAm*_JI4WhSk!DEhKpfEw6Cp_yN5IU8(TF~$cCC-ZDao2`1j!Ihu^8sPe6rN}mp8T( ze2qAG5{(fPAz%=5oO76gr~(l)a9JZsro_BJ)IInGD7;4{A=|KvJTGvG!&yP`%W1?S zp;|>Sioz%pD7+C3h>5I#Vb3exm6dgBMGpYOFiS6phC!J!==OLN02nvcF|5``EeDu$VW zE0H|03l*qcIS#%$vj=n^>z&iwY~e}pMP4@~=WrW#Le|JzziyV!UpGloZp1W0Mz6Ck z?~o)-@i!}oO9+MGbHhpCY{y|axBKw8CNzZcW=hrJO~8R*I0B*(l{mcwx{vk3{sy|c zdZ|=@;=rr>>hX==LD%T`0-YUgbElw!M8jglYeHk1l03J6JdqxlAoTa?0jXa2!~ibr zIUr|8Z_wPZ3V^QDmjO7>ATLJ6so^7d@5$1X7z|>8*Az`sidt=Y26T3`!KV6M+f;t? zpNZSC`6dtb6A1>LQhcm#7@P#L#esq2UVl%wO1{TiBsn^Y(yjeJfIK z#5qUsIr-JExOwq2sy}``ukW7O(<5k|O`?jbVg}}O!q9oljBI`D%nTUQ{m^iQ)hn9- z*t`9O@$vjyv6SSo7HR{hh*F>e*&~mlO`EA6ZL#w159iJT96<~xkq|;%5+bP2F`pAP zn|&X!dSw$s!Wxu`^HUgO#2h(ntlDn zXcAFPFbvEn@)|mLqHf~T^#NlEPsEWk-^*0*?CxW|ve^G8Ot-%=y!X1=ygR|M6Q63q z`vEiUuWifJD(daGf8Pq<>x7rOqx?_b0{835FU09Mmz5T}D5M(8s%CvHR00000NkvXXu0mjf`7dsn literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minelittlepony/textures/entity/villager/librarian_pony.png b/src/main/resources/assets/minelittlepony/textures/entity/villager/librarian_pony.png new file mode 100644 index 0000000000000000000000000000000000000000..a13f09b69480b560c3aeb9271ec5919a15764bcf GIT binary patch literal 901 zcmV;01A6?4P)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01m?d01m?e$8V@)00007bV*G`2i*i5 z6c!qH?yR=}00RX{L_t(&-tAaTXcIvgebc1DloV3LfK3FUilJ0`5j+V&tRXp+fR{qO zlw#?%r(BYommZ|hUfTN8y$D_`wTGlZkxDOmGgN{U4-v8(jMxMklaf}(Lpqz?HOX$$ zZCJB?m+Z`h+4;5|kvc02jjJ)a|PNhtCyM1J{Zk+$<6p42*>>%LR)En7V8Ki40()jPp{o@j&3r3kT|e89)KbEH4_ssX@me_b)I?q+l<)-gfRY1TWY-{W^ zn48}ue6Ap7Tp66&xNb!-;12>bb_D!E$1Gm4_WipG_A#t7o5% zJ{!1w4r9k58PUa31!Kn{aQmDF8@vx-#;)F{v5+aB*&fyFV56)NN0l8bIO#jG)xKA0_{_P)`Xs8gq z?-Y&xqpAS5?*)O!;Gi1-@Pd0LK5K#Z?koV{>-%L{+X!gM1_gl!fR=(+10zK*`AfHf zTESchkJF|Euz;nQo_a*;-LnJ!AnEk?gl6kwSoY+p<4UdlFfarR^|p2wU>UFXLL)$J zeUtBg)(Ch4(9ll%m!U=(HuAOl<-JQ1sRCrC`&#F~k(wFI31oe_X!}GPL zRND7_x(jZDXZlI3+XKwpz9?%)k^qt>A^-qPx#24YJ`L;(K){{a7>y{D4^000SaNLh0L01m?d01m?e$8V@)00007bV*G`2i*i5 z6$lwSWT@o;00YlSL_t(&-tCxQXj^3%#(!Vefjx7hsj%G$iczG=gl=79tgOATcp+%( zMJbYKMB$7<>V>PcyYOZ=OF?h8NU$QTk|5KY)L}u`kWCz=Ej3;&yYWB=+eKkC#nM)g z@p_S*)06b%-;yn1=7Dg|_nv&5?|HuGeb0N2iY#u(l&@2fL%455c#Jr8;Z;1o3DS#S z0O0XW09fPoS9F!Rd|HM>apq=&);!~#^Xf!LCxcHv1AxD~KX2U&w{NOS__W!{HxefC zVq=s1a461jD31H5vlcObcfTy$zNzfLLP3h5ohE|m1e3hSH^G%l0T~X(9fg>i4T`_J z-`ed$2UH?Ln}{4Y3_}dV5KYq?Lfo`_G0e>d_c*{DJCQF;gOUzVO08&`z5*QIy1$?C z!RB#a$*Q$v6}1GZVgxk zo^PI=w--UzSWGSNY+wpuuK_?!BD8OB&nQjP<$(8J0QHf#F)pYCF58aV#i#}9aXwS6q!|zEiPG@UKI>lRezf)x&gVCiV z;l7couT_hggCM^+IlhS=a zbSVjX2ho`%nScJ`^OM=Uj2`<1W_Az}lu|W|u=3|U5<>&Kfv^a`-w%T7P%L4Ef0wna zC|@ZRxOxNK@8#HMpKxejTn4AQ#1v?Sd+2_zHE;ge55(>1A-y<_$2XbZ2b5Y^xNihr z-j~h4r(WE>kc-uWyc7J_UI)NV9$-}+W>p=|i+ywMoHZvgG>|Xko~O+&dAFyB`QDI} z?*!ij^p5QLA0=Y-MpP-&33;)cLlQ|yB(o`SJ+iJQ`<#pSd~ZnHo}N8BZ=_SW#$x4b zK<1?sT*x`1_Y?qfbQ8YL#>Rc`)_3=FeSIEb2XV|4Sl-zHI&oi&D8{G6-u-1RpUxxi zlmcZ1F!MgMy@^XZ2te@YkahmZ$Ug*Z{lBu4zjEn4+@2ncbPAZpNT;%$WVMgM%=Tus z9@LS1=KQBBF*NW{GzGciaIdu;3Kho-8#e?)>rlSfMSX^x}&W9WvEK4H4|!CUwb9? zD!f@Ur9o9xEqK8&5b)F^V0Zcmc|O6Ko045}+kOOMsRDEdg2rv;_FS;y;$8 Vq{=A&W|{y1002ovPDHLkV1oUa3d8^a literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minelittlepony/textures/entity/villager/smith_pony.png b/src/main/resources/assets/minelittlepony/textures/entity/villager/smith_pony.png new file mode 100644 index 0000000000000000000000000000000000000000..b2254a80c02ed0d0c281a78046093cf5911e62da GIT binary patch literal 711 zcmV;&0yzDNP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01m?d01m?e$8V@)00007bV*G`2i*i5 z6fYg;4z#WS00KuzL_t(&-tAa1Yui8=edh*JV=|Od2-K5FP*gVr5<3tR2!Rk>@X*CW zDNX2-t!sx2{Sn=oB_SETc<`Vti?IhgAsK8*P+AJfQX?|Bq4jhb&Jt(!BulL$)JkvB z-IF+d_wL=@cSkM{ujta-G{F$X+yX^_c=PTAdS?JBI}N=v0065jWv8w0oa(Q4^Te(F zas5dwiO$5fbtG52}y@I02Nl2J9uF z9B8=t^%<|$ON?Ls1|0kZr4)pazZOC5enF+S<0~I2o(US-@QIzK5?D=I3r9U>HRINC>tbu>FItL|+L*aondWaV=gE~IF7T3l^l zapqbvR)CxN3*aLwZ^;_~0Q$TSd}7>-y!?Of0_ME$8GSr?JOcp8WztspUkCAX7U&s$ z0GMd!XJ+?(FM!rUSUR?1x3|H+`(pvj4)ZwsdQC*X1Aj>AES5XC9rmSmBr tIDj}MMUk2UA~(dBqOkz60I>j(#vRB1+Nv?uheQAX002ovPDHLkV1nmMG6?_x literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minelittlepony/textures/entity/villager/villager_pony.png b/src/main/resources/assets/minelittlepony/textures/entity/villager/villager_pony.png new file mode 100644 index 0000000000000000000000000000000000000000..2983275078562c0d55d6441ddb6217baec788bfb GIT binary patch literal 831 zcmV-F1Hk-=P)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01m?d01m?e$8V@)00007bV*G`2i*i5 z3lklKhbbHY00O^BL_t(&-tAdUYZE~jex?R&Lcp5fEw?Hj6t!#xKcFEHycqBY1aou$ zfWN?_NIle3=UC_u5F)4qLIPsIPGeefGq+SIb(4Z&)8b(~Br{H?o9w1(W17ta3$yPe zyYoEn$Gn-4)JObVihznTW| zaFkDd3JCIQVbtfQP5_;(dhaB}g%?2I2K%MOc_1+EeP74xPanxv`w;2ig0yY54?(Xj z%G_s+!8A>=@9XGU|LQ@FEO(z34@bG^Gj^(FDK@1Pf8HDuZgckt$Zq6MH8(71sVcAS z${y0WB2m3QC;|#Ci-=3@9UeTs-}gJ*=D=8KMfz68)VIOiaQ zAeBjsM1H%nht1@Q(-dKhaV75wV~ne{VD+FzR1pE-WpYuHSG_-U4M=4Yz|BhlfUEP@ z|4nplXF=WrL?j5JMA%f1(^3_i$(4RWp2U79a{{g(d;-7>cE(2oZ09V3Zb;{f>bj%A}M|O<{JKx4O&(M0M3;BmCP&RId4yTT8_16aMLt>5rje^0Dx`V-XlOSc@abKy*~sijY?MA=S`Z3_Wax`j z@Ra~Mao?nXzW?iUzK8%Jf>TrEs}yjGhS?t@GXZ7-%mnZ?{sJ{MJHdl715*G1002ov JPDHLkV1k8OaG3xA literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minelittlepony/textures/entity/zombie/zombie_pony.png b/src/main/resources/assets/minelittlepony/textures/entity/zombie/zombie_pony.png new file mode 100644 index 0000000000000000000000000000000000000000..e1136eb3657651153d40e82dfb7fdde75f95e4ca GIT binary patch literal 6427 zcmV+$8RX`PP)Oz@Z0f2-7z;ux~O9+4z06=<WDR*FRcSTFz- zW=q650N5=6FiBTtNC2?60Km==3$g$R3;-}uh=nNt1bYBr$Ri_o0EC$U6h`t_Jn<{8 z5a%iY0C<_QJh>z}MS)ugEpZ1|S1ukX&Pf+56gFW3VVXcL!g-k)GJ!M?;PcD?0HBc- z5#WRK{dmp}uFlRjj{U%*%WZ25jX z{P*?XzTzZ-GF^d31o+^>%=Ap99M6&ogks$0k4OBs3;+Bb(;~!4V!2o<6ys46agIcq zjPo+3B8fthDa9qy|77CdEc*jK-!%ZRYCZvbku9iQV*~a}ClFY4z~c7+0P?$U!PF=S z1Au6Q;m>#f??3%Vpd|o+W=WE9003S@Bra6Svp>fO002awfhw>;8}z{#EWidF!3EsG z3;bXU&9EIRU@z1_9W=mEXoiz;4lcq~xDGvV5BgyU zp1~-*fe8db$Osc*A=-!mVv1NJjtCc-h4>-CNCXm#Bp}I%6j35eku^v$Qi@a{RY)E3 zJ#qp$hg?Rwkvqr$GJ^buyhkyVfwECO)C{#lxu`c9ghrwZ&}4KmnvWKso6vH!8a<3Q zq36)6Xb;+tK10Vaz~~qUGsJ8#F2=(`u{bOVlVi)VBCHIn#u~6ztOL7=^<&SmcLWlF zMZgI*1b0FpVIDz9SWH+>*hr`#93(Um+6gxa1B6k+CnA%mOSC4s5&6UzVlpv@SV$}* z))J2sFA#f(L&P^E5{W}HC%KRUNwK6<(h|}}(r!{C=`5+6G)NjFlgZj-YqAG9lq?`C z$c5yc>d>VnA`E_*3F2Qp##d8RZb=H01_mm@+|Cqnc9PsG(F5HIG_C zt)aG3uTh7n6Et<2In9F>NlT@zqLtGcXcuVrX|L#Xx)I%#9!{6gSJKPrN9dR61N3(c z4Tcqi$B1Vr8Jidf7-t!G7_XR2rWwr)$3XQ?}=hpK0&Z&W{| zep&sA23f;Q!%st`QJ}G3cbou<7-yIK2z4nfCCCtN2-XOGSWo##{8Q{ATurxr~;I`ytDs%xbip}RzP zziy}Qn4Z2~fSycmr`~zJ=lUFdFa1>gZThG6M+{g7vkW8#+YHVaJjFF}Z#*3@$J_By zLtVo_L#1JrVVB{Ak-5=4qt!-@Mh}c>#$4kh<88)m#-k<%CLtzEP3leVno>={htGUuD;o7bD)w_sX$S}eAxwzy?UvgBH(S?;#HZiQMoS*2K2 zT3xe7t(~nU*1N5{rxB;QPLocnp4Ml>u<^FZwyC!nu;thW+pe~4wtZn|Vi#w(#jeBd zlf9FDx_yoPJqHbk*$%56S{;6Kv~mM9!g3B(KJ}#RZ#@)!hR|78Dq|Iq-afF%KE1Brn_fm;Im z_u$xr8UFki1L{Ox>G0o)(&RAZ;=|I=wN2l97;cLaHH6leTB-XXa*h%dBOEvi`+x zi?=Txl?TadvyiL>SuF~-LZ;|cS}4~l2eM~nS7yJ>iOM;atDY;(?aZ^v+mJV$@1Ote z62cPUlD4IWOIIx&SmwQ~YB{nzae3Pc;}r!fhE@iwJh+OsDs9zItL;~pu715HdQEGA zUct(O!LkCy1<%NCg+}G`0PgpNm-?d@-hMgNe6^V+j6x$b<6@S<$+<4_1hi}Ti zncS4LsjI}fWY1>OX6feMEuLErma3QLmkw?X+1j)X-&VBk_4Y;EFPF_I+q;9dL%E~B zJh;4Nr^(LEJ3myURP{Rblsw%57T)g973R8o)DE9*xN#~;4_o$q%o z4K@u`jhx2fBXC4{U8Qn{*%*B$Ge=nny$HAYq{=vy|sI0 z_vss+H_qMky?OB#|JK!>IX&II^LlUh#rO5!7TtbwC;iULyV-Xq?ybB}ykGP{?LpZ? z-G|jbTmIbG@7#ZCz;~eY(cDM(28Dyq{*m>M4?_iynUBkc4TkHUI6gT!;y-fz>HMcd z&t%Ugo)`Y2{>!cx7B7DI)$7;J(U{Spm-3gBzioV_{p!H$8L!*M!p0uH$#^p{Ui4P` z?ZJ24cOCDe-w#jZd?0@)|7iKK^;6KN`;!@ylm7$*nDhK&GcDTy000JJOGiWi{{a60 z|De66lK=n!32;bRa{vGi!vFvd!vV){sAK>D00(qQO+^RY1qKl(E|drZ5C8xUO-V#S zRA}D4nM+Y&zafXRsFf%Mt zt5WIo`MRpB|MjnGS^nmMnBM)Ua7BLV_umn$g=C5}#Vq*ZuYU$JLmt>;dE^KcD5|{v zm%kfP!7cd9pZjNCEI<9b??Cqx)&oT`b5c@50^G+kfjnwL35*2r|xGqt)l|c zjG{_&12a}PC63N_rb&6%``=D3g|J|;1(^yplvz7t+ffo`MnXxe%8*8`2>=xU0pcb4 zFuS_1|IL0aF%w2CY|d^ucI!Spcd`_kH|nhD%NGnfN4`ZRF}jgf${+{?o|q{Q?qL!1 z2u1@>oy#vQh$XBW;gHBYf93_cJJJ(okZZ==u^cRY5KV~W{Eu7iPWpU%i9UVL@vHlK zx&8jrx5o7ZpzddM+6CIHp_1?pPkrP$Y{)AEAR4Umgzg(9CuFNU^qUW%0*e{TJSYfB z6-KaJ8f*`@xEdoIk`v+NW0{Lj9ib?zDbcKxvf_O}55DjpU*qDFNAyRJ(EIn;s}+m5 zs;dZ+cRt>K`gFX~eqH|K-B`A5clu*+`1A%XyMP>C*pOebA`+4ywSu`5*%>s7D(24m zAagOC@BY98$-oo+Q z_aGbYPW$8``7L`d(Gg))cIWeI_Qx(DzPL2yAt$7%ED~pC3?yEMF;ch_G?Mb8Lh(H1{%V*yzMkt zKsaPUe(De25s?D1O30u@rHz@Qg^>ohGNsIjj;4&+KrG=JfDx{EIH_c!8J?Uh2~`0V z`sLv9U;7kUg_S7s;6B?=98yI1_FuY>zxeroxvo@x==M889+;RvafkztU*{D7c-x(K z#^t3^RG8j!jPa=>ESyiDKQBsv6eSg>c&0OxA`ucKPk0L~59(BCV@FaV8Il4lQxp!? zE3zxW?mvoVaK-09r{GwrB%lY(pFCnp2>~SQb)V$No<1w{BO65IhMWgjTI1lM1EwpP zW8s+ZO0Z_Bq@zsR1g=ghg|3|_ibUEGAWIxQKO>RIkr@^Ug<*{#v#~~t8I6SIV9^FC za5ch%d)|K^h{Am<%#1L@BB0!mAAI_mXQW@*_>IT_yu&h#_NhbMozFb`tN`fCiO)E) z9ZmFstbrng2kT=Kd8#bSAk0V@tAjNrh8m=l8HYxavODc%pzQ9gH&BFJgrdp-?){bf z(4KDCnJ2Dn{6@qgFzjmP`AeAZ72?Cn&?O<0FdV!qjKSfBLq7Fep8??e-v3tWe&)l! z_%KC;H~qq!IC0mSi%%c%+>@74gp;p5VE@*MRW5{qWUyr*1Ux>&8&}8^Gb)1Lxc~nz zDI%oD7UaQw{1b;{{l?YHFDE|B<(aach%iPI_D&t}gTL|pgczUw@EM9IKlB@KBdO5C z5f@(bx|=z8&6-PRFLU_pmgm2A$cfwcIdR86H40^Nj>cdTp+DAn-~$ih?zr`DN&p_a za6#UD`gD}Bt1=&d`su4#q%S8vSrfi>(w?9>NI4j>@Z_V<@TMRAHoo&mUdNe-pQcBU zYvAH+=PhB*E%)BS!EGyE|Ill><=*3rWJm`=dGq`4M^)LY759Ov(AzgB0032$@#xIU z31qHmkD<#|;-f`atfNEm4mJ!k=h8D9{`23z%IcspFeD&mftn~T_$nBe2dC~j!E&^q zBpAv_15bgBgaL2(<@<;pP++xQebWN)iF4=VyH1@7V z&CVA;_7r#Adouvfef2W`@rREKz`(#rhz&vg62r&4$fNS!I6m^PeZKwBPUk=f|%uoU)=6a#qw| z3@Soa$eK_CAHkF}M=vZ$QPz8vjv+0fk(t&jR#Hh)7&=hT^yuWW>(y-=cn>rsq7Ihc z+4Ro3OjvV%;)&1VEf^y>`PWa}aAxGg?IG*B{>I1Mh^maGvDV7^Ip{vnk=UMspZV2y zM)Axt7P2Za5{ot7_a{FQ9>UzV?A0|#M_Z=4qAi_VGbIU05;9<=6H8fG+JZ}x|SXHPH`^h@h6j0Hhdssf;p{l3>w@Sx6V4JLCdyzX$&DlQ$LsEm9~o5dxZ z@Da$$$rLP%7=jchOGQFxtr00mnh7yfGBF&{Oi0I?G1Ur55Obb+@&#_a`y??G92V`A zl0kye29kvN>z(~uCPp~L3R(qm#c|vmEyADw?1%nOOwc(xsVJI)FMQ-Fiew_3j*~?x zRq?F!*|9JdAH)b!%D8lv)<}^+p|XNvNDd@~RbCCIjl=p=Y+u=m2 zyLp5MhH&c6o3Mc94JNrV&nWld-h&-chIX_A#_Uj2p-M)~L1DGO#%x{Y*P0=DG5xN^aIyMI0J6;BKM^x!cBS)dGCTcE7f`e&A5=E-ehar&&AI#f@ zEQMe&Ts(J)&wcodc))Vh2o+>v zH)>bMtV1YyFQZ~$f?o&M)-nmtedQttx2|bz;2yLXNGK491a5{|XPwrx(XnFmHVA>D zi85t0<=yDJ4EK64!$PZ}@?`NCvb)?@k(-nlhn6P8ryxYK=^@Evu=J zTA}P^vSvyys3dGS!;L9dEIGCWLllM(0S9>>KXOKc^r}Y~W*1C>Vj*xDF6p7LrUz$w*dwYUEtVtBebj z{oSN?wk=5$%hE`b5Z!2_lalNh+g>5(gy|rX;}WcMV%s*XQ^kM?L9%mnxWzo^)gEkcW-5P3oMM$2G)b#;n@BG^>~5;bDPl|>>XRvHVcuR{o5w)e(<(yXTX2`+t<*fST|51 z2%h`WMS|ewI}ad)^G{u7^ntZON{KhT{VpQGmp=X!$8Xz5MG1qzkr1|HVYM!(DvRb_ zxf)wkbT`}gK=Q7Fh$SNJ#_J^|v004&%004{+008|`004nN004b?008NW002DY000@xb3BE2000U( zX+uL$P-t&-Z*ypGa3D!TLm+T+Z)Rz1WdHz3$DNjUR8-d%htIutdZEoQ0#b(FyTAa_ zdy`&8VVD_UC<6{NG_fI~0ue<-nj%P0#DLLIBvwSR5EN9f2P6n6F&ITuEN@2Ei>|D^ z_ww@lRz|vC zuzLs)$;-`!o*{AqUjza0dRV*yaMRE;fKCVhpQKsoe1Yhg01=zBIT!&C1$=TK@rP|Ibo3vKKm@PqnO#LJhq6%Ij6Hz*<$V$@wQAMN5qJ)hzm2h zoGcOF60t^#FqJFfH{#e-4l@G)6iI9sa9D{VHW4w29}?su;^hF~NC{tY+*d5%WDCTX za!E_i;d2ub1#}&jF5T4HnnCyEWTkKf0>c0%E1Ah>(_PY1)0w;+02c53Su*0<(nUqK zG_|(0G&D0Z{i;y^b@OjZ+}lNZ8Th$p5Uu}MTtq^NHl*T1?CO*}7&0ztZsv2j*bmJyf3G7=Z`5B*PvzoDiKdLpOAxi2$L0#SX*@cY z_n(^h55xYX#km%V()bZjV~l{*bt*u9?FT3d5g^g~#a;iSZ@&02Abxq_DwB(I|L-^b zXThc7C4-yrInE_0gw7K3GZ**7&k~>k0Z0NWkO#^@9q0fwx1%qj zZ=)yBuQ3=54Wo^*!gyjLF-e%Um=erBOdIALW)L%unZshS@>qSW9o8Sq#0s#5*edK% z>{;v(b^`kbN5rY%%y90wC>#%$kE_5P!JWYk;U;klcqzOl-UjcFXXA75rT9jCH~u<) z0>40zCTJ7v2qAyk54cquI@7b&LHdZ`+zlTss6bJ7%PQ)z$cROu4wBhpu-r)01) zS~6}jY?%U?gEALn#wiFzo#H}aQ8rT=DHkadR18&{>P1bW7E`~Y4p3)hWn`DhhRJ5j z*2tcg9i<^OEt(fCg;q*CP8+7ZTcWhYX$fb^_9d-LhL+6BEtPYWVlfKTBusSTASKKb%HuWJzl+By+?gkLq)?+BTu761 zjmyXF)a;mc^>(B7bo*HQ1NNg1st!zt28YLv>W*y3CdWx9U8f|cqfXDAO`Q48?auQq zHZJR2&bcD49Ip>EY~kKEPV6Wm+eXFV)D)_R=tM0@&p?(!V*Qu1PXHG9o^ zTY0bZ?)4%01p8F`JoeS|<@=<@RE7GY07EYX@lwd>4oW|Yi!o+Su@M`;WuSK z8LKk71XR(_RKHM1xJ5XYX`fk>`6eqY>qNG6HZQwBM=xi4&Sb88?zd}EYguc1@>KIS z<&CX#T35dwS|7K*XM_5Nf(;WJJvJWRMA($P>8E^?{IdL4o5MGE7bq2MEEwP7v8AO@ zqL5!WvekBL-8R%V?zVyL=G&{be=K4bT`e{#t|)$A!YaA?jp;X)-+bB;zhj`(vULAW z%ue3U;av{94wp%n<(7@__S@Z2PA@Mif3+uO&y|X06?J#oSi8M;ejj_^(0<4Lt#wLu#dYrva1Y$6_o(k^&}yhSh&h;f@JVA>W8b%o zZ=0JGnu?n~9O4}sJsfnnx7n(>`H13?(iXTy*fM=I`sj`CT)*pTHEgYKqqP+u1IL8N zo_-(u{qS+0<2@%BCt82d{Gqm;(q7a7b>wu+b|!X?c13m#p7cK1({0<`{-e>4hfb-U zsyQuty7Ua;Ou?B?XLHZaol8GAb3Wnxcu!2v{R_`T4=x`(GvqLI{-*2AOSimk zUAw*F_TX^n@STz9kDQ z$NC=!KfXWC8h`dn#xL(D3Z9UkR7|Q&Hcy#Notk!^zVUSB(}`#4&lYA1f0h2V_PNgU zAAWQEt$#LRcH#y9#i!p(Udq2b^lI6wp1FXzN3T;~FU%Lck$-deE#qz9yYP3D3t8{6 z?<+s(e(3(_^YOu_)K8!O1p}D#{JO;G(*OVf32;bRa{vGi!T<{98gxZibW?9;ba!ELWdKlNX>N2bPDNB8b~7$DE-^4L^m3s9 z01jPAL_t(&L%o^Va#ZIPg?R=KU?2fw#}z;W!l>0PwIqawo+U)o!|5~hAZ*I^8(=Vl zZ6G%;Ge~G2FtJ^gySz`{A-BoZ&bR(XN=t&YD5s*Tu0A?_hW+oo_S$Rj|H!}ocF~Ts z{Z*GHthzmE;YP}$rHuItX^WpYVg1LBSuAtLdfz{4eMgU4?1K-i`h3d#<&=4gQlYO6UbKOMJN`V7xI#&h4d3uCAD z9UtAbZSOVzIp1#k>yEvpD^_1GnD=~=_hRp2$^vW-u_fG2?OD6KKU&UOxR|l>GYnoy zS>vai^}L617}z&{$}S!Iz=cd?yE#7RD_g zP&2oa7CcK?8Hf0+tF(LtM@$@aKy`W2u06Yqu^Fon#p{19*tz%K+l_o8|B;>N|1Lh! zi;NW)Ms4=bqc(kK*rx9%ZRY+6Xc)5G*9nW(GZuiN;^T3PRV)}Az;tWM zLZI^5iy3Qd%tKp5N`gIw}5o1@PgdE1Pg)(Zt;C< z(D6gK2JDx~`=u-k$NM-Sbu(^*&2G!zO}0|t_;DM^kp^-^+p$ZDSBrezd8OoG98d;* z;R>k=np=wp5vv)8z}GsUx-LT@DZEsCI%d&k){)l*jOoS!v6CmPo0t0=klb3@{aytr zxx0gwxierh_eL#`Bg7@%D!C8jL^{)OL%eq0`m2AmxkqE1hmh9C9pw9tzHb9WyZyM2 z^9kOiMZW3$VH}{8Q!w1(IacKT=a3-wm6yj3ICIuRR~pu z776OP7bj0y;`oWZ$M3weYv7)1+Rk@!LUG{=M195Pu|ugX2Q;?xZf*J;xZhh;xd0}R zN3bzvrNs%m@yo1*n`x`PU;&)J{!784mnvtJzi%mfw;{bdgYZDya^EHGPY=ko+rw7i zH>Fd3J@1H5$O`2EA`;}2;wFF z2f;_Glmc%}P|cV}w4>#m%V~G9SQEqRtE7Q`gVlY$1AY_i-MuWPjFYOW^+dV6H0~A_ z^3rfUZIvHWu8Q;k^BAxmpo;XcFqO3`RiV=Yc7Bh8js#qx@+-}7*!y%{;^axH7Nwi_ z#3Lzx}xvaacTm#tAw(K#LclzgGAJK(w?t z20^*}uuGRNx$l4c^Y0Emg3iu4<4?bNIHQ8Vkl2Yx3lAa{yaainLTXUP_gy*d^uwiB zP=DpbxADOd5%F8yz{L`7u~bWOUVNoFcAv3d_^3uZwX_Q4x3ZQ_lP4^)g@l}yC@byf zs^pd+@3Y9#qj75>aRVG65hb<_BzzX8fIM|Q^`Y~=a=ZNe3TgHl5_;R!9pZWkw@*{2 zOlhRl+vCLj!YA4yzp3#aIj#tO_0?A{;`)?+0OFi)Kc{raQvwsz_Mv8v(*mUh%BOgM zbcm3`MOavn??+2WPRj|NxPp3o2>XBYCDIJyAF0@Oec>J~c5D|uC2GGf_yYGbO^%?y z^BK%vFn!wp0!Xs41DRmc!gvyz8g>-;NL6$G}cGQ70PAcst0fUgYK@Z^Z#BnL?5yLG(hI?oai1j&Cu&N7JJQMEye}DRFV@88NmO^ zWkR3Gc+bQ33m-wY&SGop^!Y3@9-g;}n=zYxFv@Y)?#;Cqh#}OR&vg<=I}ep$DuIqF zxgW0QP>`e(5pVEJIYW(!`$mSUyoQv?YcwhC+C$}68boQLhAZG56`ba4K7q5p_~j~2 zP1*df`8V2kXpij|J`EfomoDm_2B$Vbkry+w>>qCUr{q`Mt;X4a0`l_6u=z*g3mSS`ZfCn^=DnB1*HZbOz zEHy{^U0OuKNs%v+4&EjlK?;;`qGWeXvYfQ3BDq6KXY)ng=IKWoFLMX%dus>OfVq^P zCkac0O4RI-R=7qVAESLuT<>yG@L7z88mjMsG(HOvu|-5w3@?Z)uN~v7DiCo==U|1| zn<9?xFD)XaH5?(*B2V#8mAn@8ReoKSQH#wpQj}Dw%8=9upNUtb8(P|=%yaaNs}Dz< zU@H?eIZ7$3S)-h!&QHBaM~9Tf(7;ZHC$G~hs|2!m5zt`0+eW_Zak5ymwIVN8lr#tx z>&p-g8hoZL8h1JUzky@cT2mi6G?YUg16!gd=jtBiwyPf7Ep&(&C7K-fIAuw`^S^9z zX~2Ri;s>~*g2@_|UN!6Ld9cZn^2O6}(9hw!oDY42e z&=$+9pYVvZr?HuWqI2#yBFy!TO)8HRCaEcBQps*=;(kV zWT(MJa-K-5?C1r8EH6&Z_c|xIF*4`o$WK9DP6%OZ5vIhFQb3E)OT`b4y@Brj3e%~) zdBC}@e&a{!2({u$M-~h8HPIPhj;ME*aHO19_;$#pjNb3@5gPLk21yIqGif!5wW9-M z^kB2g(l-Yff$?C~Xv&xx7&&EVzN@u35s)TCA|pmw6~^JtVHhAIls2t-yBZ)$C=uCT zVLFvJl|v63B&1}#I7VeuQ{BqrF*n)OL?=WSNJJHwJXJu8W)e!JI`7TnC}|j%q6D|2 z1A@&-8@bWvdViHE!8yeE2oEP3=Pb@g5iJ49+)aj^l)Q#=@|BtsgV!jR^1hDU9>A+6 zXn%$2RNfqtaIm88YQLh*dz7LTr3SX;?+m$Wq-&=iBsoXrfMYc7){tiQ-iQURis*kg zv-t0S8dOSPgoqMf@>UxephAWun&*MtdGeW@Ql#;)ULv-42*4RKQkxu3{7^mge@NsU zI>h2{QQjIVtz2JXaYgkJu(<5dfTgif02!AZGBje-WH--djN9aJ#EdP#e&+iT>=S=b zWk5ow^&gReA-Si#R_>{hkr9H_@Mpa)@5BqL?`1fkN#|FEbabB(BZDM=1=}hpYOL|Q zQs{{WAv_y2sr)r1ibQS_M3T2+bs{Y&i@ZXR=u%0$MmSKZCJ4*XB1Z*Bl|}Nr0$D2< z;suW&xX~NRQl+%O_MFnOLSG_H)6oG%%1RxhBVJs7Mu)dG!6MlUK)Vlp-fPJl-7O}j zwpVxNeQKfAMsBxV&-TK=SlmME+q`o)|fgzX$q-Aw==|Ibk0LZl=w*J`|wRb zYaB7Glx|QYBdU{9PtTqHZrG)s6l8>xBb=@&bAfay;h=f!)o4#7I{je81w^7t!_STm z&1pNT2UaOot%BksE4*$#HRm>acQO9w&lDqAWpD1Cnkdg~dp#EBCagAR#0L zs73plFG$B@TvPg=1(f7OrJY2PYpc~_18M06#%TeSCJWI?6-pn}QK2=a(qj2*k4M>l zOX3usw_RZP%JUIp*B()+gbpg3Dp*Gc=%Lc_BKbGi=tdM>;L~G?TDKc=Bte53 z91)$%F`+=3z?DKcLedt+CJpZd4C$nix(xT!-0&Xl(@8O^%?{RD&MO0J@rp!|oU5v& zog6na5CRZ6PIc;kO{6t?2{tDowT3HcKyba=^aOz@Z0f2-7z;ux~O9+4z06=<WDR*FRcSTFz- zW=q650N5=6FiBTtNC2?60Km==3$g$R3;-}uh=nNt1bYBr$Ri_o0EC$U6h`t_Jn<{8 z5a%iY0C<_QJh>z}MS)ugEpZ1|S1ukX&Pf+56gFW3VVXcL!g-k)GJ!M?;PcD?0HBc- z5#WRK{dmp}uFlRjj{U%*%WZ25jX z{P*?XzTzZ-GF^d31o+^>%=Ap99M6&ogks$0k4OBs3;+Bb(;~!4V!2o<6ys46agIcq zjPo+3B8fthDa9qy|77CdEc*jK-!%ZRYCZvbku9iQV*~a}ClFY4z~c7+0P?$U!PF=S z1Au6Q;m>#f??3%Vpd|o+W=WE9003S@Bra6Svp>fO002awfhw>;8}z{#EWidF!3EsG z3;bXU&9EIRU@z1_9W=mEXoiz;4lcq~xDGvV5BgyU zp1~-*fe8db$Osc*A=-!mVv1NJjtCc-h4>-CNCXm#Bp}I%6j35eku^v$Qi@a{RY)E3 zJ#qp$hg?Rwkvqr$GJ^buyhkyVfwECO)C{#lxu`c9ghrwZ&}4KmnvWKso6vH!8a<3Q zq36)6Xb;+tK10Vaz~~qUGsJ8#F2=(`u{bOVlVi)VBCHIn#u~6ztOL7=^<&SmcLWlF zMZgI*1b0FpVIDz9SWH+>*hr`#93(Um+6gxa1B6k+CnA%mOSC4s5&6UzVlpv@SV$}* z))J2sFA#f(L&P^E5{W}HC%KRUNwK6<(h|}}(r!{C=`5+6G)NjFlgZj-YqAG9lq?`C z$c5yc>d>VnA`E_*3F2Qp##d8RZb=H01_mm@+|Cqnc9PsG(F5HIG_C zt)aG3uTh7n6Et<2In9F>NlT@zqLtGcXcuVrX|L#Xx)I%#9!{6gSJKPrN9dR61N3(c z4Tcqi$B1Vr8Jidf7-t!G7_XR2rWwr)$3XQ?}=hpK0&Z&W{| zep&sA23f;Q!%st`QJ}G3cbou<7-yIK2z4nfCCCtN2-XOGSWo##{8Q{ATurxr~;I`ytDs%xbip}RzP zziy}Qn4Z2~fSycmr`~zJ=lUFdFa1>gZThG6M+{g7vkW8#+YHVaJjFF}Z#*3@$J_By zLtVo_L#1JrVVB{Ak-5=4qt!-@Mh}c>#$4kh<88)m#-k<%CLtzEP3leVno>={htGUuD;o7bD)w_sX$S}eAxwzy?UvgBH(S?;#HZiQMoS*2K2 zT3xe7t(~nU*1N5{rxB;QPLocnp4Ml>u<^FZwyC!nu;thW+pe~4wtZn|Vi#w(#jeBd zlf9FDx_yoPJqHbk*$%56S{;6Kv~mM9!g3B(KJ}#RZ#@)!hR|78Dq|Iq-afF%KE1Brn_fm;Im z_u$xr8UFki1L{Ox>G0o)(&RAZ;=|I=wN2l97;cLaHH6leTB-XXa*h%dBOEvi`+x zi?=Txl?TadvyiL>SuF~-LZ;|cS}4~l2eM~nS7yJ>iOM;atDY;(?aZ^v+mJV$@1Ote z62cPUlD4IWOIIx&SmwQ~YB{nzae3Pc;}r!fhE@iwJh+OsDs9zItL;~pu715HdQEGA zUct(O!LkCy1<%NCg+}G`0PgpNm-?d@-hMgNe6^V+j6x$b<6@S<$+<4_1hi}Ti zncS4LsjI}fWY1>OX6feMEuLErma3QLmkw?X+1j)X-&VBk_4Y;EFPF_I+q;9dL%E~B zJh;4Nr^(LEJ3myURP{Rblsw%57T)g973R8o)DE9*xN#~;4_o$q%o z4K@u`jhx2fBXC4{U8Qn{*%*B$Ge=nny$HAYq{=vy|sI0 z_vss+H_qMky?OB#|JK!>IX&II^LlUh#rO5!7TtbwC;iULyV-Xq?ybB}ykGP{?LpZ? z-G|jbTmIbG@7#ZCz;~eY(cDM(28Dyq{*m>M4?_iynUBkc4TkHUI6gT!;y-fz>HMcd z&t%Ugo)`Y2{>!cx7B7DI)$7;J(U{Spm-3gBzioV_{p!H$8L!*M!p0uH$#^p{Ui4P` z?ZJ24cOCDe-w#jZd?0@)|7iKK^;6KN`;!@ylm7$*nDhK&GcDTy000JJOGiWi{{a60 z|De66lK=n!32;bRa{vGi!vFvd!vV){sAK>D00(qQO+^RY1q==kF0qoSlK=n|X`6JlKzyLmfJ)gSgoX@c=%v+>=HQviB5ZRWc6ZxM_N z{AA(x(E=g9R{0`VwQofbMS3@FMif941O)t#mzyKfGBtIDpzM7;gW#|a3ld= z^qH72DAz3n!3E&Zvs?Yc4nK^`)GwjxL404}*<-IqR74a>q2$-Nv%Q~L^XHQr86i_H zlHRoGlL2U25I=7q$pV@dq*k)2R4W{P@Cs&i^|1Wl(-FLVt4`KrX12{E7K;IJ%+gaa zoGh=rwVGHgMm!#;P|T5-zkpw;C$aR5)A`o+1gV}`#8LtLyg{LuLtGppq^h{SKb4Du zfFS!^fAN0`GBS>DbDQ`Q$y5V=F^B5dD5k@qU!CrM@#tf?)c+zHBDy3{s8$Gsg1D}W z8BhpSEe>&-DCZ`@sbOI=l%1ent$rN9_;`j8E`>KXGCrO`^hG?+V=|xNv}0D1&JIou z*s6L6AG8pQ#fZgXw5mM}8r!DY^F4@mcXRj5&8$83bnab}p*%T>FITf#o^x6@V>w_X@+?bC|^{gg+RE{8^De}JUx9@i$o{WHHVR#ODQo~j>%zTNmUB|8%jF0E|`o`Nh^@STK z=S?2JbF)ylO-Sm>}>Oa{yKs8mcsi3o{lNo>HE|j4?AxXj%WyF54&!%IlQ*x zU5@EoKDEpT2M1}J-uBUo2F&c5$Nt(ED3wb9gu)@3l1==}%hxe$K|AGA8OfKpXzy$S zU;PsG@eEDLCJNFpk}P1l4yq(g<%;}a_f$z@*Unw!A{9JAqDAqk22@nV21z1UHhJsS z4YbWl@#Gy_r;f%*Rivy(aNG)Zy^b$c2_!?@q@4}TAgp`kMc=GiXdxA|YLSR1$QSYe zw70i2I5^0wL;ppC*u&zU!!fHC>qdUhLTv@5YKewK1A-tBjYTmE1|A--jXj1b3oJ=2 zpsBJ&qLQV#&++fxw8$i zSS_Q4RE)_IrE-aUA#+ zV%1%53w%c0ddVMzv#vhGcO4JPRjT+jM0LEX$hPzZzT>kns*~RFKEZ}2VtNe0u}~z5 zV%4E;IfNaNM!`c#He*z(h?};*&S-uYre&gv8k3m`x|$a;nKh6^nU&wZkRRQCK66_R zVdlIxy3JYa9O&gM-#LaAD^^T(uA_6tN5t>#%ocR_L!FRCmGpQTvuZJ%89=ZDjHZVe z$W4%lMfp5&)>TXWYn0{qjzjq5(`Y~U0&06@_McJ~j_(3qrNv(a@OMH4A9M2bcn%cN%6v`%Yf%fM^o%M&a= zd>)yR4DnJ4MGJi{0Gb>mwqz+wQBtX_18GP`$A^K79s{*YL-nzk1$yrCsQ5Z#6vGY zK_Q|?nAzUW$mm{vboW>MPaFLGXP)7kb(bH$b_>70=>`I(C z<72{Wj|>X!9n-lq`xuw?{gw?IUnkYkL}=UrJ%VKw$>$BKW(6q`M7aH)>-@3t5#rG( z<#L6N=6Q6t&7o4Q;CUW9$KK@0_5VTCYa`-xvS9u~GGpUh^o@(BgtAmFk+pWvojizA zxkTIaHY(K$^K9C_jzXb8TXQFKW*mSPQVA$Q;{X3aHovotCy%J&2_ApE z<_qJ}KXZAewK!lTzxB#j_7g;b1%oOhUbU-Id1k`UfQ;ee>&q7X8rKTpBo5(I4|%8 z6j3E023Z_Eg192!dM3W)6AT2Y*J`-7jiRWu#SVEP*W{ zRc-3UA`{sX;Zz)I9#|fBzDT-gP{YB=R!}{GKmYMj%GG_3AFom&KRN-PIaOZh>!&h2 zOnE$qU3d9m?m!kCxfIX!7#QBmUpmulcxgTVXow~D83T@GQmdL&+&V!ItV)SWK0{0u z5rZ;)L&L~wknj5`83B!m=G!{^tptfB%VyH49btv19==Bq8Dx35b|Z zjbKbc^#sH*gDq=UbC7QF&rcj!-zligUmEj|0e9IqFi0nq{-cd!P01z6Z986cRy&eE%>;xym)x zi-aO!aAZ7BMDitU$K{fVV+aIQL`g)D9CG=w?KwVt8lSPYZ(-N4z zg_q7E$296=rH^TsJvzyZfBX5TYJ!*u1#u%mtYjR&?o55KhV!Vlk2G4qXl_F2?xZ{| zKD8|zC4v?Y^Q)6?ClHjm08|5v0@8}!R7tTkFN4a*!H%NusnJfx0@uv@I#z@RxK%tmp=M6VdDCQ^>a~yc@zcXX$QugGxQrfedg6dX) z=6jVtVO0w}z0@F6?Bn>K97aeKsf?s~Yt>`y$!}$7Y?#dWD4of~M<(fSef;}L`XueD zd!KzEh>qi62?_y0qUL#clLh`TbAYRtUC-t6U-0TazU)!8Y^FsMq{3koL7p-ik9lDY z^A2hw+TD%s!NI@z4ZgR}3Onz%6FBd-6Ho++d^V3BiWAjSTw}e+3F}p=wo9%wi5^L? z>as_0j3SNkIA`2(CyF4kc+SCuTc=U?>PW7DGch>@J{%BG^dPe6kPG>rs9pB(=w}0{ zmkWd)2RA5T4i9t3^gY~r`6>XSkpzK6aG!aoh42G1wdQ7anN{@0X?(kO=##~R>?)K*yz5G>H41yKo&$C zMWXE5TpM_e-uJdr$&9n{!3Qap^1Si-8r8@5h-a30RO%J#6^qWr^Jz=QXqev4yjcs7M1}gM zjf}m&g`fv*tutAFtVA%N)7jF_W!Y7{*SC{!p^WR*FtcM*4sZX^2$RMn4NWa5vcurc zA%5Dk1M367@>2l_%@KB`N4a?O|6_EQ!5zon$ms3?{+*||c%X-;_RH}r?-go-N7**n zyR8>h2osL!gk#|;yDK|3N>j3li*7%WreqU}uQ9DXh9n9seRv3?nB)A-GYCimfv8F? zJx*OwknAd%Y?d#-sIuv~HME3Py64Q`;B^kJZE~aiJZ&>u_<8Kh+}qO6-SY-9>vd2y zysC@l1PL}aAjmSsYzDV#qK9NodcwsIX`c(#v`HU!O-*RW5n>as*#v z$&rV0RelMTszp>#iK!t3Ny2qZ_B-TY>W;`cD=y`n7ebt~;!+Nqdm4YZ@@Wp6dm1Ml zzLJ0LoyC*!(`kw&F>Mo1QwTU7XTKHYR}Gu-WuF_PZ_wD3TPp#_lgW^G)ydla@h8FO~^K0>f0k-VeN;Wf2Yey$d&C^g)Eo|-Ei-Uup zel`I4&W24q`sD{PMUgc>_yP9>UuMRvcK*-ce2Nnjh~WUSSOiD$06`RWF7+%;VmTW-D7jbNdsNRB-wMle$bDRDW-`dedG#tTAM7hFS zN9v#k;;AN@pY5l&Fv*&egD9tHocx?aU+=EZ2B3%`9=i5gURj)G%*(NO&i?$uJDTs# zU&}>1J(3;m1hfG4N(D6(#4gr2c~2{i`^Oo4XEU=y4a6b=YDI_pl;h}qXAhgtOL6L& z0Rq#T80gzeYkLz>VJ=3th%EWssBEMwHG`qOd-?Mr1{b{9M6^rdrwv=UVrV8c%_m>4 zfavqhk=gjNiyoATR3pr2Zl!2BymXX^koNf5*aD(%3+bLwD!mq04|GwnYZN*m@HuXR za-lH6pL;C6v$>szm&Azwewg&}MVu%1@aPp`e&+7Sc;;O^)xgp;{;&2j)B7h_{-xvi z{c~$5oT5`POC*AEX2d$_+dIrR--==?F zG%(Ek{bq9P@yAoCl!#Z0bTmvO{lR}3p9z<9Ky^qsA4*9)jT#lbKQO2pmOZ=7(49M`vG*Q8Eyu5V9h&e*K$_ z96UPx#32;bRa{vGf6951U69E94oEQKA00(qQO+^RX2nYcRI~K}*LjV8(9cffpbVF}# zZDnqB0000007G(RVRU6=Aa`kWXdp*PO;BVmWd{HN1B6LLK~!ko)mU9fQ(+i>zH`o| zOAQf=EM2MwDZ9UY}u{KCQlCBvHnot>SALo6>Z8?Ht9Q;oT~IRb!z zfdRv&CnqQABzRL{Y;4Ss)*L*oqxp`G4oZeM1=iQs2>@niXAPU4nwp|mJpZK=@uq5k z{4o4F`ZHDjRAY5@)ljobOG}2$i}I#`sLv^zNhY0{Y9*=a99<&ux zO-ms?d|gbB-jp1VC+hQwc-|P}l??zimD}k>m0gM$x1Z(H(|2Xm&{0CSo?IrOIUru| zNVGn>NAN~@bm)>LLUnTiHFlL!V^=9vHy2RKb3m$dM1Oxj0l?7EkfAJGE|=lCP33la zek1?H1*mN;qMDXMs%#7QWCW>w(b2|%?lSZ!)r zHZ}2igKckbANzAg^j#)a4>}nim4xV7K}HW^FgdE53+Q5D4glci_dNi>`TXq2wf`W5 zOT}ja0Gr=-aptTAxfe140Drc8iA&(LBjd0v13n#0VNfmMBk6$EmmKBS^DWan9-s0^WCC@hRl@a_aaA%br&2+iyVKk(|2 z)CT~jFnD)^APP6|?JXZvl|fO%)vjp_`+oxw(WD9BayrPWDQNllNot?DxtRx%IMPah zh~V?<(lbCbjv~uPb8HqUihPq1jw9-$abK11T}#W$jA$Gt>Z3DVUt`MO<8)9~riSMC zYf{rdG>#(bqw(PL>+m01k4%WhQAB+-9x|;eteX5WLo|*i>Z9@C^#@@|g8-s&{sVYU V+Qjbz^n3sS002ovPDHLkV1l3+&1?Vw literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minelittlepony/textures/models/armor/chainmail_layer_2_pony.png b/src/main/resources/assets/minelittlepony/textures/models/armor/chainmail_layer_2_pony.png new file mode 100644 index 0000000000000000000000000000000000000000..4e853e223f0f74653be355a8e0d3daaa2a47ec62 GIT binary patch literal 450 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minelittlepony/textures/models/armor/iron_layer_2_pony.png b/src/main/resources/assets/minelittlepony/textures/models/armor/iron_layer_2_pony.png new file mode 100644 index 0000000000000000000000000000000000000000..37d6d9167d82685a3844f59e818108d42658f530 GIT binary patch literal 1380 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 QumAu607*qoM6N<$f}&zoUH||9 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minelittlepony/textures/models/armor/leather_layer_2_overlay_pony.png b/src/main/resources/assets/minelittlepony/textures/models/armor/leather_layer_2_overlay_pony.png new file mode 100644 index 0000000000000000000000000000000000000000..05fdfc682f7a3612bfc17cb5f4fc0e24a9eafe44 GIT binary patch literal 1135 zcmV-#1d#iQP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iyu6 z5FRP~;1%Wo0013nR9JLFZ*6U5Zgc_CX>@2HM@dakWG-a~000BV zNkl~j3i7Z$)sQDzJ2TA;&!*`JdmF5PQpx|&E?z+_4wDRbLti>u)qQf zEU>@=3oP(-LS2SIeEHrR9A*w5BGr;Xlp@5)C*S|^CedMT&_PTnNNitco>)4{`4O%0*ASpNF&Mc@FwCmto~I=ZnFJ5Msmw zArxETsZc;_GypCXdq0MVh{75Vr*C$#5Ckn9F?D5KrSJ`cL z*?iDCHw9$Qk4*5W0yfs`h*GDCmGqDajA3$RqSXi+E>GPHduRIpr4Xteuh#^fwg!VD!gl#~krQHtCLv?z{$ zKmMFnf_u%3m0Ei0w??}^caJc@NMa8gU6h)P&teNG6!&-AIA8dI)`~0Dl*G#adc@QP z7#>81lA4syVhh~cZt&TUcgEg-@ot^vils$9Uj+;$Hf(TGJ}ufkM>#op9@C=eyMR)P zokv}KjAIJPU7%LBvr#~5G+pmTrZWjYim%>(bL1gs#g-ODjIdHm>0~+0PM?>aUtwdt zPOt9~rAE&G_fCsaqN%2qgLa0o8XqDqFZ#%G&!=y{h88tS2qVHr-~Kk40ycMAqXACJ z$5%7w<+Up#-aPEHTq%l_`#?8yW4zJHNNkZbx2`YK%^Zo~Zm??1ZO-{Ij(zHqH}BDat8R=1D$k+sztF@lf9`#cXsAj=(n7g#DM=z-}C z)peZzv)iVW=!x$T=Jvm}v0mrK)#}K#l_->Aj30C|oC~b3lnFi#{s$roFhHK_mi&t+v%eCbaap2mC(ZvJ?{GgLjNe$JKMQgzh49*xq zMA6M0xeHWNi%8)gS_J3Ah~L|8a{Grnk3G)09`%0tYn%GbRceC?L?Yoxj{8B9lv9Iq z0p|mK7w|rUQtUN*)GC&8YKS2cfk;FtMGTRx{mxXAKezh;C5jLtsnugS-pw4flEsLC zfGCBJ|3zyl(S>oAlhKL~-CtxjyZ2n~1aH6dI;quEO2ta&zQ}hYiqvYd+>;oM2&lm^ zJkJB2ET>koxDbgkVzpq5aM*KXx##nr{+xPj{{q>xvILWBeRKc-002ovPDHLkV1mZF B2VejI literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minelittlepony/textures/models/armor/leather_layer_2_pony.png b/src/main/resources/assets/minelittlepony/textures/models/armor/leather_layer_2_pony.png new file mode 100644 index 0000000000000000000000000000000000000000..24c714b079c304f615f6e1a23588552108f1f99c GIT binary patch literal 1120 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 M`?~6-sx}e-3)x@zOaK4? literal 0 HcmV?d00001 diff --git a/src/main/resources/events.json b/src/main/resources/events.json new file mode 100644 index 00000000..2bd4a8fd --- /dev/null +++ b/src/main/resources/events.json @@ -0,0 +1,28 @@ +{ + "obfuscation": { + "classes": [ + { "id": "ThreadDownloadImageData", "mcp": "net.minecraft.client.renderer.ThreadDownloadImageData", "obf": "ctq"}, + { "id": "HDSkinManager", "mcp": "com.voxelmodpack.hdskins.HDSkinManager" } + ], + "methods": [ + { "id": "loadTextureFromServer", "mcp": "loadTextureFromServer", "srg": "func_152433_a", "obf": "d" } + ] + }, + "descriptors": [ + { "id": "start", "owner": "java.lang.Thread", "name": "start", "return": "VOID", "args": [] }, + { "id": "loadTextureFromServer", "owner": "${ThreadDownloadImageData}", "name": "${loadTextureFromServer}", "return": "VOID", "args": [] }, + { "id": "onDownloadSkin", "owner": "${HDSkinManager}", "name": "onDownloadSkin" } + ], + "events": [ + { + "name": "onDownloadSkin", + "cancellable": "true", + "injections": [{ + "type": "INVOKE", + "method": "${loadTextureFromServer}", + "target": "${start}" + }], + "listeners": [ "${onDownloadSkin}" ] + } + ] +} diff --git a/src/main/resources/litemod.json b/src/main/resources/litemod.json new file mode 100644 index 00000000..d2d2b89c --- /dev/null +++ b/src/main/resources/litemod.json @@ -0,0 +1,12 @@ +{ + "name": "minelp", + "mcversion": "1.8", + "version": "1.8-UNOFFICIAL", + "revision": "185.15", + "author": "Verdana, Rene_Z, Mumfrey, JoyJoy", + "voxelCommonJarName": "voxelcommon-2.4.0.jar", + "classTransformerClasses": "com.minelittlepony.minelp.transformers.RenderPlayerTransformer", + "description": "Mine Little Pony turns players and mobs into ponies", + "description.minelittlepony": "Mine Little Pony turns players and mobs into ponies", + "description.hdskins": "Seperate skin server for Mine Little Pony that also supports HD skins. Access via Skin Manager key binding (default: F1) in the main menu." +} diff --git a/voxellib/build.gradle b/voxellib/build.gradle new file mode 100644 index 00000000..669bacf4 --- /dev/null +++ b/voxellib/build.gradle @@ -0,0 +1,17 @@ +apply plugin: 'net.minecrell.vanilla' + +archivesBaseName = "lib_voxelcommon" +version = "4.4.0-mc1.8" + +minecraft { + version = "1.8" + mappings = 'snapshot_20150606' + clientTweaker = 'com.mumfrey.liteloader.launch.LiteLoaderTweaker' +} +jar { + extension 'litemod' + archiveName = 'voxelcommon-2.4.0.jar' +} +reobf { + setSrgMcp() +} diff --git a/voxellib/src/main/java/com/voxelmodpack/common/LiteModVoxelCommon.java b/voxellib/src/main/java/com/voxelmodpack/common/LiteModVoxelCommon.java new file mode 100644 index 00000000..8e9c4c61 --- /dev/null +++ b/voxellib/src/main/java/com/voxelmodpack/common/LiteModVoxelCommon.java @@ -0,0 +1,131 @@ +package com.voxelmodpack.common; + +import java.io.File; +import java.util.LinkedList; +import java.util.List; + +import com.google.common.collect.ImmutableList; +import com.mumfrey.liteloader.PacketHandler; +import com.mumfrey.liteloader.Priority; +import com.voxelmodpack.common.interfaces.ITimeHandler; + +import net.minecraft.client.Minecraft; +import net.minecraft.network.INetHandler; +import net.minecraft.network.Packet; +import net.minecraft.network.play.INetHandlerPlayClient; +import net.minecraft.network.play.server.S03PacketTimeUpdate; +import net.minecraft.util.ResourceLocation; + +/** + * Main mod class for VoxelCommon + * + * @author Adam Mummery-Smith + */ +@Priority(0) +public class LiteModVoxelCommon implements PacketHandler { + public static final String VERSION = "2.4.0"; + + public static final ResourceLocation GUIPARTS = new ResourceLocation("voxelcommon", "textures/gui/guiparts.png"); + + private static List timeHandlers = new LinkedList(); + + /* + * (non-Javadoc) + * @see com.mumfrey.liteloader.LiteMod#getName() + */ + @Override + public String getName() { + return "VoxelLib"; + } + + /* + * (non-Javadoc) + * @see com.mumfrey.liteloader.LiteMod#getVersion() + */ + @Override + public String getVersion() { + return LiteModVoxelCommon.VERSION; + } + + /* + * (non-Javadoc) + * @see com.mumfrey.liteloader.LiteMod#init(java.io.File) + */ + // @SuppressWarnings("unchecked") + @Override + public void init(File configPath) { + /* + * try { Class voxelPacketListenerClass = (Class)Class.forName( + * "com.voxelmodpack.voxelpacket.client.VoxelPacketListener"); LiteMod + * voxelPacketListener = voxelPacketListenerClass.newInstance(); + * voxelPacketListener.init(configPath); + * LiteLoader.getInterfaceManager().registerListener(voxelPacketListener + * ); } catch (Throwable th) { th.printStackTrace(); } + */ + } + + /* + * (non-Javadoc) + * @see com.mumfrey.liteloader.LiteMod#upgradeSettings(java.lang.String, + * java.io.File, java.io.File) + */ + @Override + public void upgradeSettings(String version, File configPath, File oldConfigPath) {} + + @Override + public List> getHandledPackets() { + return ImmutableList.> of( + S03PacketTimeUpdate.class); + } + + @Override + public boolean handlePacket(INetHandler netHandler, Packet packet) { + S03PacketTimeUpdate timeUpdatePacket = (S03PacketTimeUpdate) packet; + LiteModVoxelCommon.updateTime(netHandler, timeUpdatePacket.func_149366_c(), timeUpdatePacket.func_149365_d()); + return false; + } + + public static void registerTimeHandler(ITimeHandler timeHandler) { + if (!LiteModVoxelCommon.timeHandlers.contains(timeHandler)) { + LiteModVoxelCommon.timeHandlers.add(timeHandler); + } + } + + public static void updateTime(long totalTime, long worldTime) { + Minecraft mc = Minecraft.getMinecraft(); + if (mc.thePlayer != null && mc.thePlayer.sendQueue != null) { + LiteModVoxelCommon.updateTime(mc.thePlayer.sendQueue, totalTime, worldTime); + } + } + + /** + * @param netHandler + * @param totalTime + * @param worldTime + */ + private static void updateTime(INetHandler netHandler, long totalTime, long worldTime) { + boolean frozen = worldTime < 0L; + worldTime = Math.abs(worldTime); + + long inTotalTime = totalTime; + long inWorldTime = worldTime; + + for (ITimeHandler timeHandler : LiteModVoxelCommon.timeHandlers) { + timeHandler.onTimeUpdate(totalTime, worldTime); + } + + for (ITimeHandler timeHandler : LiteModVoxelCommon.timeHandlers) { + if (timeHandler.isFreezingTime()) { + frozen = true; + totalTime = timeHandler.getFrozenTotalTime(inTotalTime); + worldTime = timeHandler.getFrozenWorldTime(inWorldTime); + break; + } + + worldTime += timeHandler.getTimeOffset(); + } + + ((INetHandlerPlayClient) netHandler).handleTimeUpdate(new S03PacketTimeUpdate(totalTime, worldTime, !frozen)); + } +} diff --git a/voxellib/src/main/java/com/voxelmodpack/common/gl/FBO.java b/voxellib/src/main/java/com/voxelmodpack/common/gl/FBO.java new file mode 100644 index 00000000..61b598e8 --- /dev/null +++ b/voxellib/src/main/java/com/voxelmodpack/common/gl/FBO.java @@ -0,0 +1,309 @@ +package com.voxelmodpack.common.gl; + +import static com.mumfrey.liteloader.gl.GL.*; + +import java.awt.image.BufferedImage; + +import org.lwjgl.opengl.ContextCapabilities; +import org.lwjgl.opengl.GLContext; + +import net.minecraft.client.renderer.texture.DynamicTexture; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.renderer.WorldRenderer; +import static org.lwjgl.opengl.EXTFramebufferObject.*; +import static org.lwjgl.opengl.ARBFramebufferObject.*; + +/** + * Object-oriented wrapper for basic OpenGL FBOs with only a colour and depth + * buffer + * + * @author Adam Mummery-Smith + */ +public class FBO { + private static boolean supported = false; + + private static boolean useARB = false; + + /** + * This FBO is created + */ + private boolean created; + + /** + * FBO is bound + */ + private boolean active; + + /** + * Handle to the depth buffer resource + */ + private int depthBuffer; + + /** + * Handle to the frame buffer resource + */ + private int frameBuffer; + + /** + * Handle to the FBOs texture assigned by the renderer + */ + private DynamicTexture texture; + + /** + * Width and height for the current frame buffer, used so we know to + * regenerate it if the frame size changes + */ + private int frameBufferWidth, frameBufferHeight; + + /** + * Helper function to check that FBOs are supported + * + * @return True if EXT or ARB framebuffer support is available on the + * hardware + */ + public static boolean detectFBOCapabilities() { + ContextCapabilities capabilities = GLContext.getCapabilities(); + + if (capabilities.GL_ARB_framebuffer_object) { + supported = true; + useARB = true; + return true; + } else if (capabilities.GL_EXT_framebuffer_object) { + supported = true; + return true; + } + + supported = false; + return false; + } + + /** + * Create a new FBO, the internal FBO itself is not created until the first + * call to Begin() is made + * + * @param renderEngine Minecraft render engine + */ + public FBO() { + detectFBOCapabilities(); + } + + /** + * Get whether FBO is supported by the graphics hardware + */ + public static boolean isSupported() { + return supported; + } + + /** + * Begin + * + * @param width + * @param height + */ + public void begin(int width, int height) { + if (!supported) { + return; + } + + if (width < 1 || height < 1) { + throw new IllegalArgumentException("Attempted to create an FBO with zero or negative size"); + } + + if (this.created && (width != this.frameBufferWidth || height != this.frameBufferHeight)) { + this.dispose(); + } + + if (!this.created) { + this.created = true; + this.frameBufferWidth = width; + this.frameBufferHeight = height; + + BufferedImage textureImage = new BufferedImage(this.frameBufferWidth, this.frameBufferHeight, + BufferedImage.TYPE_INT_RGB); + this.texture = new DynamicTexture(textureImage); + + if (useARB) { + this.frameBuffer = glGenFramebuffers(); + this.depthBuffer = glGenRenderbuffers(); + + glBindFramebuffer(GL_FRAMEBUFFER, this.frameBuffer); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, + this.texture.getGlTextureId(), 0); + + glBindRenderbuffer(GL_RENDERBUFFER, this.depthBuffer); + glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT24, this.frameBufferWidth, + this.frameBufferHeight); + glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, this.depthBuffer); + + glBindFramebuffer(GL_FRAMEBUFFER, 0); + glBindRenderbuffer(GL_RENDERBUFFER, 0); + } else { + this.frameBuffer = glGenFramebuffersEXT(); + this.depthBuffer = glGenRenderbuffersEXT(); + + glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, this.frameBuffer); + glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, + this.texture.getGlTextureId(), 0); + + glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, this.depthBuffer); + glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT24, this.frameBufferWidth, + this.frameBufferHeight); + glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, + this.depthBuffer); + + glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); + glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, 0); + } + } + + this.bind(); + } + + /** + * + */ + public void bind() { + if (!supported) { + return; + } + + if (this.created && this.checkFBO()) { + if (useARB) { + glBindFramebuffer(GL_FRAMEBUFFER, this.frameBuffer); + glBindRenderbuffer(GL_RENDERBUFFER, this.depthBuffer); + } else { + glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, this.frameBuffer); + glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, this.depthBuffer); + } + + glPushAttrib(GL_VIEWPORT_BIT); + glViewport(0, 0, this.frameBufferWidth, this.frameBufferHeight); + glClear(GL_COLOR_BUFFER_BIT); + this.active = true; + } + // else + // { + // System.err.println("Bad fbo"); + // } + } + + public void end() { + if (supported && this.active) { + if (useARB) { + glBindFramebuffer(GL_FRAMEBUFFER, 0); + glBindRenderbuffer(GL_RENDERBUFFER, 0); + } else { + glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); + glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, 0); + } + + glPopAttrib(); + this.active = false; + } + } + + public void dispose() { + if (!supported) { + return; + } + + this.end(); + + if (this.texture != null) { + glDeleteTextures(this.texture.getGlTextureId()); + } + + if (useARB) { + glDeleteRenderbuffers(this.depthBuffer); + glDeleteFramebuffers(this.frameBuffer); + } else { + glDeleteRenderbuffersEXT(this.depthBuffer); + glDeleteFramebuffersEXT(this.frameBuffer); + } + + this.depthBuffer = 0; + this.texture = null; + this.frameBuffer = 0; + this.created = false; + } + + /** + * FBO completeness check + * + * @param fboID + * @return + */ + private boolean checkFBO() { + if (useARB) { + glBindFramebuffer(GL_FRAMEBUFFER, this.frameBuffer); + glBindRenderbuffer(GL_RENDERBUFFER, this.depthBuffer); + } else { + glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, this.frameBuffer); + glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, this.depthBuffer); + } + + int frameBufferStatus = useARB ? glCheckFramebufferStatus(GL_FRAMEBUFFER) + : glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT); + + // status + switch (frameBufferStatus) { + case GL_FRAMEBUFFER_COMPLETE_EXT: + return true; + + case GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT: + case GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT: + case GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT: + case GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT: + case GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT: + case GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT: + return false; + + default: + throw new RuntimeException("Unexpected reply from glCheckFramebufferStatus: " + frameBufferStatus); + } + } + + /** + * Draw this FBO + * + * @param x + * @param y + * @param x2 + * @param y2 + * @param z + * @param alpha + */ + public void draw(int x, int y, int x2, int y2, int z, float alpha) { + this.draw(x, y, x2, y2, z, alpha, 0.0, 0.0, 1.0, 1.0); + } + + /** + * @param x + * @param y + * @param x2 + * @param y2 + * @param z + * @param alpha + * @param u + * @param v + * @param u2 + * @param v2 + */ + public void draw(double x, double y, double x2, double y2, double z, float alpha, double u, double v, double u2, + double v2) { + if (supported && this.created) { + glEnableTexture2D(); + glBindTexture2D(this.texture.getGlTextureId()); + glColor4f(1, 1, 1, alpha); + + Tessellator tessellator = Tessellator.getInstance(); + WorldRenderer worldRender = tessellator.getWorldRenderer(); + worldRender.startDrawingQuads(); + worldRender.addVertexWithUV(x, y2, z, u, v); + worldRender.addVertexWithUV(x2, y2, z, u2, v); + worldRender.addVertexWithUV(x2, y, z, u2, v2); + worldRender.addVertexWithUV(x, y, z, u, v2); + tessellator.draw(); + } + } +} \ No newline at end of file diff --git a/voxellib/src/main/java/com/voxelmodpack/common/gl/TextureHelper.java b/voxellib/src/main/java/com/voxelmodpack/common/gl/TextureHelper.java new file mode 100644 index 00000000..dc7d6572 --- /dev/null +++ b/voxellib/src/main/java/com/voxelmodpack/common/gl/TextureHelper.java @@ -0,0 +1,28 @@ +package com.voxelmodpack.common.gl; + +import static com.mumfrey.liteloader.gl.GL.*; + +import java.util.Map; + +import com.voxelmodpack.common.runtime.PrivateFields; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.texture.TextureManager; +import net.minecraft.client.renderer.texture.ITextureObject; +import net.minecraft.util.ResourceLocation; + +public abstract class TextureHelper { + public static void releaseTexture(ResourceLocation resource) { + TextureManager textureManager = Minecraft.getMinecraft().getTextureManager(); + ITextureObject textureObject = textureManager.getTexture(resource); + + if (textureObject != null) { + int textureName = textureObject.getGlTextureId(); + glDeleteTextures(textureName); + + Map resourceToTextureMap = PrivateFields.resourceToTextureMap + .get(textureManager); + resourceToTextureMap.remove(resource); + } + } +} diff --git a/voxellib/src/main/java/com/voxelmodpack/common/gui/GuiCheckBox.java b/voxellib/src/main/java/com/voxelmodpack/common/gui/GuiCheckBox.java new file mode 100644 index 00000000..6d5fcfd4 --- /dev/null +++ b/voxellib/src/main/java/com/voxelmodpack/common/gui/GuiCheckBox.java @@ -0,0 +1,164 @@ +package com.voxelmodpack.common.gui; + +import static com.mumfrey.liteloader.gl.GL.glColor4f; + +import com.voxelmodpack.common.LiteModVoxelCommon; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.Gui; + +/** + * Simple checkbox-like control + * + * @author Adam Mummery-Smith + */ +public class GuiCheckBox extends GuiControl { + public enum DisplayStyle { + Button, + CheckBox, + KeyboardKey + } + + public DisplayStyle Style = DisplayStyle.CheckBox; + + /** + * True if the checkbox is checked + */ + public boolean checked; + + /** + * Make a new check box control, automatically size the control to fit the + * specified text + * + * @param id Control ID + * @param xPosition X location for the control + * @param yPosition Y location for the control + * @param displayText Text to display + * @param checked Initially checked value + */ + public GuiCheckBox(int id, int xPosition, int yPosition, String displayText, boolean checked) { + super(id, xPosition, yPosition, displayText); + + this.setWidth(Minecraft.getMinecraft().fontRendererObj.getStringWidth(displayText) + 20); + this.checked = checked; + } + + /** + * Make a new check box control, automatically size the control to fit the + * specified text + * + * @param id Control ID + * @param xPosition X location for the control + * @param yPosition Y location for the control + * @param displayText Text to display + * @param checked Initially checked value + */ + public GuiCheckBox(int id, int xPosition, int yPosition, String displayText, boolean checked, DisplayStyle style) { + super(id, xPosition, yPosition, displayText); + + this.setWidth(Minecraft.getMinecraft().fontRendererObj.getStringWidth(displayText) + 20); + this.checked = checked; + this.Style = style; + } + + /** + * Make a new check box control of the specified size + * + * @param id Control ID + * @param xPosition X location for the control + * @param yPosition Y location for the control + * @param width Width for the control (text may overflow or underflow) + * @param height Height for the control (check box and text will be centered + * vertically within this height) + * @param displayText Text to display + * @param checked Initially checked value + */ + public GuiCheckBox(int id, int xPosition, int yPosition, int width, int height, String displayText, + boolean checked) { + super(id, xPosition, yPosition, width, height, displayText); + + this.checked = checked; + } + + /** + * Make a new check box control of the specified size + * + * @param id Control ID + * @param xPosition X location for the control + * @param yPosition Y location for the control + * @param width Width for the control (text may overflow or underflow) + * @param height Height for the control (check box and text will be centered + * vertically within this height) + * @param displayText Text to display + * @param checked Initially checked value + */ + public GuiCheckBox(int id, int xPosition, int yPosition, int width, int height, String displayText, boolean checked, + DisplayStyle style) { + super(id, xPosition, yPosition, width, height, displayText); + + this.checked = checked; + this.Style = style; + } + + public void drawCheckboxAt(Minecraft minecraft, int mouseX, int mouseY, int yPos) { + this.setYPosition(yPos); + this.drawButton(minecraft, mouseX, mouseY); + } + + /** + * Draw the control + * + * @param minecraft Minecraft instance + * @param mouseX Mouse x coordinate + * @param mouseY Mouse y coordinate + */ + @Override + public void drawButton(Minecraft minecraft, int mouseX, int mouseY) { + // Control not visible + if (!this.isVisible()) + return; + + boolean mouseOver = mouseX >= this.xPosition && mouseY >= this.yPosition && mouseX < this.xPosition + this.width + && mouseY < this.yPosition + this.height; + + if (this.Style == DisplayStyle.Button) { + super.drawButton(minecraft, mouseX, mouseY); + } else if (this.Style == DisplayStyle.CheckBox) { + minecraft.getTextureManager().bindTexture(LiteModVoxelCommon.GUIPARTS); + glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + + int u = this.checked ? 12 : 0; + int y = this.yPosition + (this.height - 12) / 2; + + this.drawTexturedModalRect(this.xPosition, y, this.xPosition + 12, y + 12, u, 52, u + 12, 64); + this.mouseDragged(minecraft, mouseX, mouseY); + this.drawString(minecraft.fontRendererObj, this.displayString, this.xPosition + 16, + this.yPosition + (this.height - 8) / 2, + this.isEnabled() ? (mouseOver ? 0xa0ffff : 0xe0e0e0) : 0xffa0a0a0); + } else { + Gui.drawRect(this.xPosition, this.yPosition, this.xPosition + this.width, this.yPosition + this.height, + this.checked ? 0xFFFFFF00 : 0xFF808080); + Gui.drawRect(this.xPosition + 1, this.yPosition + 1, this.xPosition + this.width - 1, + this.yPosition + this.height - 1, mouseOver ? 0xFF333333 : 0xFF000000); + this.drawCenteredString(minecraft.fontRendererObj, this.displayString, this.xPosition + (this.width / 2), + this.yPosition + (this.height - 8) / 2, + this.isEnabled() ? (mouseOver ? 0xa0ffff : (this.checked ? 0xFFFFFF00 : 0xe0e0e0)) : 0xffa0a0a0); + } + } + + /** + * @param minecraft + * @param mouseX + * @param mouseY + * @return + */ + @Override + public boolean mousePressed(Minecraft minecraft, int mouseX, int mouseY) { + if (super.mousePressed(minecraft, mouseX, mouseY)) { + this.checked = !this.checked; + return true; + } + + return false; + } +} diff --git a/voxellib/src/main/java/com/voxelmodpack/common/gui/GuiControl.java b/voxellib/src/main/java/com/voxelmodpack/common/gui/GuiControl.java new file mode 100644 index 00000000..a047a270 --- /dev/null +++ b/voxellib/src/main/java/com/voxelmodpack/common/gui/GuiControl.java @@ -0,0 +1,104 @@ +package com.voxelmodpack.common.gui; + +import net.minecraft.client.gui.FontRenderer; +import net.minecraft.client.gui.GuiButton; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.renderer.WorldRenderer; + +/** + * Vestigial abstraction class, not really required any more since MCP updates + * so quickly but has some handy convenience methods + * + * @author Adam Mummery-Smith + */ +public class GuiControl extends GuiButton { + /** + * Scale factor which translates texture pixel coordinates to relative + * coordinates + */ + protected static float texMapScale = 0.00390625F; + + public GuiControl(int id, int xPosition, int yPosition, String displayText) { + super(id, xPosition, yPosition, displayText); + } + + public GuiControl(int id, int xPosition, int yPosition, int controlWidth, int controlHeight, String displayText) { + super(id, xPosition, yPosition, controlWidth, controlHeight, displayText); + } + + /** + * Draws a textured rectangle with custom UV coordinates + * + * @param x Left edge X coordinate + * @param y Top edge Y coordinate + * @param x2 Right edge X coordinate + * @param y2 Bottom edge Y coordinate + * @param u U coordinate + * @param v V coordinate + * @param u2 Right edge U coordinate + * @param v2 Bottom edge V coordinate + */ + public void drawTexturedModalRect(int x, int y, int x2, int y2, int u, int v, int u2, int v2) { + Tessellator tessellator = Tessellator.getInstance(); + WorldRenderer worldRender = tessellator.getWorldRenderer(); + worldRender.startDrawingQuads(); + worldRender.addVertexWithUV(x, y2, this.getZLevel(), (u) * texMapScale, (v2) * texMapScale); + worldRender.addVertexWithUV(x2, y2, this.getZLevel(), (u2) * texMapScale, (v2) * texMapScale); + worldRender.addVertexWithUV(x2, y, this.getZLevel(), (u2) * texMapScale, (v) * texMapScale); + worldRender.addVertexWithUV(x, y, this.getZLevel(), (u) * texMapScale, (v) * texMapScale); + tessellator.draw(); + } + + public final int getID() { + return this.id; + } + + public final int getHeight() { + return this.height; + } + + public final void setHeight(int newHeight) { + this.height = newHeight; + } + + public final int getXPosition() { + return this.xPosition; + } + + public final void setXPosition(int newXPosition) { + this.xPosition = newXPosition; + } + + public final int getYPosition() { + return this.yPosition; + } + + public final void setYPosition(int newYPosition) { + this.yPosition = newYPosition; + } + + public final boolean isEnabled() { + return this.enabled; + } + + public final void setEnabled(boolean newEnabled) { + this.enabled = newEnabled; + } + + public final boolean isVisible() { + return this.visible; + } + + public final void setVisible(boolean newVisible) { + this.visible = newVisible; + } + + protected final float getZLevel() { + return this.zLevel; + } + + @Override + public void drawString(FontRenderer fontRendererIn, String text, int x, int y, int color) { + super.drawString(fontRendererIn, text, x, y, color); + } +} diff --git a/voxellib/src/main/java/com/voxelmodpack/common/gui/GuiControlEx.java b/voxellib/src/main/java/com/voxelmodpack/common/gui/GuiControlEx.java new file mode 100644 index 00000000..e67e1460 --- /dev/null +++ b/voxellib/src/main/java/com/voxelmodpack/common/gui/GuiControlEx.java @@ -0,0 +1,399 @@ +package com.voxelmodpack.common.gui; + +import static com.mumfrey.liteloader.gl.GL.*; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.FontRenderer; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.renderer.WorldRenderer; + +/** + * GuiControlEx is the base class for additional controls. It includes some + * advanced drawing methods which are used by several derived classes + * + * @author Adam Mummery-Smith + */ +public abstract class GuiControlEx extends GuiControl { + /** + * Used by some controls to indicate the manner in which they have handled a + * keypress + */ + public enum KeyHandledState { + /** + * The control did not handle the keypress + */ + None, + + /** + * The control handled the keypress and the container should do no + * further processing + */ + Handled, + + /** + * The control handled the keypress and the container should call + * actionPerformed + */ + ActionPerformed + } + + /** + * Set by parent screen to enable cursor flash etc + */ + public int updateCounter; + + /** + * Reference to the minecraft game instance + */ + protected Minecraft mc; + + /** + * Flag indicating whether an action was performed, to support GuiScreenEx's + * callback mechanism + */ + protected boolean actionPerformed; + + /** + * Flag tracking whether an item was double-clicked + */ + protected boolean doubleClicked; + + /** + * Constructor, passes through to GuiButton constructor + * + * @param minecraft Minecraft game instance + * @param controlId Control's ID (used for actionPerformed) + * @param xPos Control X position (left) + * @param yPos Control Y position (top) + * @param controlWidth Control width + * @param controlHeight Control height + * @param displayText Control display text + */ + public GuiControlEx(Minecraft minecraft, int controlId, int xPos, int yPos, int controlWidth, int controlHeight, + String displayText) { + super(controlId, xPos, yPos, controlWidth, controlHeight, displayText); + this.mc = minecraft; + } + + /** + * Override from GuiButton, handle this call and forward it to DrawControl + * for neatness + * + * @param minecraft Reference to the minecraft game instance + * @param mouseX Mouse X coordinate + * @param mouseY Mouse Y coordinate + */ + @Override + public final void drawButton(Minecraft minecraft, int mouseX, int mouseY) { + this.drawControl(minecraft, mouseX, mouseY); + } + + /** + * Draw the control + * + * @param minecraft Reference to the minecraft game instance + * @param mouseX Mouse X coordinate + * @param mouseY Mouse Y coordinate + */ + protected abstract void drawControl(Minecraft minecraft, int mouseX, int mouseY); + + /** + * GuiControlEx returns true from mousePressed if the mouse was captured, + * NOT if an action was performed. Containers should call this function + * afterwards to determine whether an action was performed. + * + * @return True if actionPerformed should be dispatched + */ + public boolean getActionPerformed() { + return this.actionPerformed; + } + + /** + * Get whether an actionPerformed was a double-click event + * + * @return + */ + public boolean getDoubleClicked(boolean resetDoubleClicked) { + boolean result = this.doubleClicked; + if (resetDoubleClicked) + this.doubleClicked = false; + return result; + } + + /** + * Draws a line between two points with the specified width and colour + * + * @param x1 Origin x coordinate + * @param y1 Origin y coordinate + * @param x2 End x coordinate + * @param y2 End y coordinate + * @param width Line width in pixels + * @param colour Line colour + */ + protected void drawLine(int x1, int y1, int x2, int y2, int width, int colour) { + this.drawArrow(x1, y1, x2, y2, width, colour, false, 0); + } + + /** + * Draws an arrow between two points with the specified width and colour + * + * @param x1 Origin x coordinate + * @param y1 Origin y coordinate + * @param x2 End x coordinate + * @param y2 End y coordinate + * @param width Line width in pixels + * @param arrowHeadSize Size of the arrow head + * @param colour Colour + */ + protected void drawArrow(int x1, int y1, int x2, int y2, int width, int arrowHeadSize, int colour) { + this.drawArrow(x1, y1, x2, y2, width, colour, true, arrowHeadSize); + } + + /** + * Internal function for drawing lines and arrows + * + * @param x1 Origin x coordinate + * @param y1 Origin y coordinate + * @param x2 End x coordinate + * @param y2 End y coordinate + * @param width Line width in pixels + * @param colour Colour + * @param arrowHead True to draw an arrow, otherwise draws a line + * @param arrowHeadSize Size of the arrow head + */ + private void drawArrow(int x1, int y1, int x2, int y2, int width, int colour, boolean arrowHead, + int arrowHeadSize) { + // Calculate the line length and angle defined by the specified points + int length = (int) Math.sqrt(Math.pow((x2 - x1), 2) + Math.pow((y2 - y1), 2)); + float angle = (float) Math.toDegrees(Math.atan2(y2 - y1, x2 - x1)); + + // Local rotation + glPushMatrix(); + glTranslatef(x1, y1, 0.0f); + glRotatef(angle, 0.0f, 0.0f, 1.0f); + + // Calc coordinates for the line and arrow points + x1 = 0; + x2 = length - (arrowHead ? arrowHeadSize : 0); + y1 = (int) (width * -0.5); + y2 = y1 + width; + + // Calc colour components + float f = (colour >> 24 & 0xff) / 255F; + float f1 = (colour >> 16 & 0xff) / 255F; + float f2 = (colour >> 8 & 0xff) / 255F; + float f3 = (colour & 0xff) / 255F; + + glEnableBlend(); + glDisableTexture2D(); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glColor4f(f1, f2, f3, f); + + // Draw the line + Tessellator tessellator = Tessellator.getInstance(); + WorldRenderer worldRender = tessellator.getWorldRenderer(); + worldRender.startDrawingQuads(); + worldRender.addVertex(x1, y2, 0.0D); + worldRender.addVertex(x2, y2, 0.0D); + worldRender.addVertex(x2, y1, 0.0D); + worldRender.addVertex(x1, y1, 0.0D); + tessellator.draw(); + + // If an arrow then draw the arrow head + if (arrowHead && arrowHeadSize > 0) { + worldRender.startDrawing(4); + worldRender.addVertex(x2, 0 - arrowHeadSize / 2, 0); + worldRender.addVertex(x2, arrowHeadSize / 2, 0); + worldRender.addVertex(length, 0, 0); + tessellator.draw(); + } + + glEnableTexture2D(); + glDisableBlend(); + + glPopMatrix(); + } + + /** + * Set the texmap scale factor + * + * @param textureSize + */ + public void setTexMapSize(int textureSize) { + texMapScale = 1F / textureSize; + } + + /** + * Draws a textured rectangle at 90 degrees + * + * @param x Left edge X coordinate + * @param y Top edge Y coordinate + * @param x2 Right edge X coordinate + * @param y2 Bottom edge Y coordinate + * @param u U coordinate + * @param v V coordinate + * @param u2 Right edge U coordinate + * @param v2 Bottom edge V coordinate + */ + public void drawTexturedModalRectRot(int x, int y, int x2, int y2, int u, int v, int u2, int v2) { + Tessellator tessellator = Tessellator.getInstance(); + WorldRenderer worldRender = tessellator.getWorldRenderer(); + worldRender.startDrawingQuads(); + worldRender.addVertexWithUV(x2, y2, this.getZLevel(), (u) * texMapScale, (v2) * texMapScale); + worldRender.addVertexWithUV(x2, y, this.getZLevel(), (u2) * texMapScale, (v2) * texMapScale); + worldRender.addVertexWithUV(x, y, this.getZLevel(), (u2) * texMapScale, (v) * texMapScale); + worldRender.addVertexWithUV(x, y2, this.getZLevel(), (u) * texMapScale, (v) * texMapScale); + tessellator.draw(); + } + + /** + * Draws a textured rectangle at 90 degrees + * + * @param x Left edge X coordinate + * @param y Top edge Y coordinate + * @param u U coordinate + * @param v V coordinate + * @param width Width of texture to draw + * @param height Height of texture to draw + */ + public void drawTexturedModalRectRot(int x, int y, int u, int v, int width, int height) { + Tessellator tessellator = Tessellator.getInstance(); + WorldRenderer worldRender = tessellator.getWorldRenderer(); + worldRender.startDrawingQuads(); + worldRender.addVertexWithUV(x + height, y + width, this.getZLevel(), (u) * texMapScale, + (v + height) * texMapScale); + worldRender.addVertexWithUV(x + height, y, this.getZLevel(), (u + width) * texMapScale, + (v + height) * texMapScale); + worldRender.addVertexWithUV(x, y, this.getZLevel(), (u + width) * texMapScale, (v) * texMapScale); + worldRender.addVertexWithUV(x, y + width, this.getZLevel(), (u) * texMapScale, (v) * texMapScale); + tessellator.draw(); + } + + /** + * Draws a tesselated rectangle where the texture is stretched horizontally + * but vertical scaling is achieved by splitting the texture in half and + * repeating the middle pixels + * + * @param x Left edge X coordinate + * @param y Top edge Y coordinate + * @param x2 Right edge X coordinate + * @param y2 Bottom edge Y coordinate + * @param u U coordinate + * @param v V coordinate + * @param u2 Right edge U coordinate + * @param v2 Bottom edge V coordinate + */ + public void drawTessellatedModalRectV(int x, int y, int x2, int y2, int u, int v, int u2, int v2) { + int tileSize = ((v2 - v) / 2); + int vMidTop = v + tileSize; + int vMidBtm = vMidTop + 1; + + this.drawTexturedModalRect(x, y, x2, y + tileSize, u, v, u2, vMidTop); + this.drawTexturedModalRect(x, y + tileSize, x2, y2 - tileSize + 1, u, vMidTop, u2, vMidBtm); + this.drawTexturedModalRect(x, y2 - tileSize + 1, x2, y2, u, vMidBtm, u2, v2); + } + + /** + * Draws a tesselated rectangle where the texture is stretched vertically + * but horizontal scaling is achieved by splitting the texture in half and + * repeating the middle pixels + * + * @param x Left edge X coordinate + * @param y Top edge Y coordinate + * @param x2 Right edge X coordinate + * @param y2 Bottom edge Y coordinate + * @param u U coordinate + * @param v V coordinate + * @param u2 Right edge U coordinate + * @param v2 Bottom edge V coordinate + */ + public void drawTessellatedModalRectH(int x, int y, int x2, int y2, int u, int v, int u2, int v2) { + int tileSize = ((u2 - u) / 2); + int uMidLeft = u + tileSize; + int uMidRight = uMidLeft + 1; + + this.drawTexturedModalRect(x, y, x + tileSize, y2, u, v, uMidLeft, v2); + this.drawTexturedModalRect(x + tileSize, y, x2 - tileSize + 1, y2, uMidLeft, v, uMidRight, v2); + this.drawTexturedModalRect(x2 - tileSize + 1, y, x2, y2, uMidRight, v, u2, v2); + } + + /** + * Draws a tesselated rectangle where the texture is stretched vertically + * and horizontally but the middle pixels are repeated whilst the joining + * pixels are stretched. + * + * @param x Left edge X coordinate + * @param y Top edge Y coordinate + * @param x2 Right edge X coordinate + * @param y2 Bottom edge Y coordinate + * @param u U coordinate + * @param v V coordinate + * @param u2 Right edge U coordinate + * @param v2 Bottom edge V coordinate + */ + public void drawTessellatedModalBorderRect(int x, int y, int x2, int y2, int u, int v, int u2, int v2) { + this.drawTessellatedModalBorderRect(x, y, x2, y2, u, v, u2, v2, + Math.min(((x2 - x) / 2) - 1, ((y2 - y) / 2) - 1)); + } + + /** + * Draws a tesselated rectangle where the texture is stretched vertically + * and horizontally but the middle pixels are repeated whilst the joining + * pixels are stretched. Bordersize specifies the portion of the texture + * which will remain unstretched. + * + * @param x Left edge X coordinate + * @param y Top edge Y coordinate + * @param x2 Right edge X coordinate + * @param y2 Bottom edge Y coordinate + * @param u U coordinate + * @param v V coordinate + * @param u2 Right edge U coordinate + * @param v2 Bottom edge V coordinate + * @param borderSize Number of pixels to leave unstretched, must be less + * than half of the width or height (whichever is smallest) + */ + public void drawTessellatedModalBorderRect(int x, int y, int x2, int y2, int u, int v, int u2, int v2, + int borderSize) { + int tileSize = Math.min(((u2 - u) / 2) - 1, ((v2 - v) / 2) - 1); + + int ul = u + tileSize, ur = u2 - tileSize, vt = v + tileSize, vb = v2 - tileSize; + int xl = x + borderSize, xr = x2 - borderSize, yt = y + borderSize, yb = y2 - borderSize; + + this.drawTexturedModalRect(x, y, xl, yt, u, v, ul, vt); + this.drawTexturedModalRect(xl, y, xr, yt, ul, v, ur, vt); + this.drawTexturedModalRect(xr, y, x2, yt, ur, v, u2, vt); + this.drawTexturedModalRect(x, yb, xl, y2, u, vb, ul, v2); + this.drawTexturedModalRect(xl, yb, xr, y2, ul, vb, ur, v2); + this.drawTexturedModalRect(xr, yb, x2, y2, ur, vb, u2, v2); + this.drawTexturedModalRect(x, yt, xl, yb, u, vt, ul, vb); + this.drawTexturedModalRect(xr, yt, x2, yb, ur, vt, u2, vb); + this.drawTexturedModalRect(xl, yt, xr, yb, ul, vt, ur, vb); + } + + /** + * Draw a string but cut it off if it's too long to fit in the specified + * width + * + * @param fontrenderer + * @param s + * @param x + * @param y + * @param width + * @param colour + */ + public static void drawStringWithEllipsis(FontRenderer fontrenderer, String s, int x, int y, int width, + int colour) { + if (fontrenderer.getStringWidth(s) <= width) { + fontrenderer.drawStringWithShadow(s, x, y, colour); + } else if (width < 8) { + fontrenderer.drawStringWithShadow("..", x, y, colour); + } else { + String trimmedText = s; + + while (fontrenderer.getStringWidth(trimmedText) > width - 8 && trimmedText.length() > 0) + trimmedText = trimmedText.substring(0, trimmedText.length() - 1); + + fontrenderer.drawStringWithShadow(trimmedText + "...", x, y, colour); + } + } +} diff --git a/voxellib/src/main/java/com/voxelmodpack/common/gui/GuiDialogBox.java b/voxellib/src/main/java/com/voxelmodpack/common/gui/GuiDialogBox.java new file mode 100644 index 00000000..096f067e --- /dev/null +++ b/voxellib/src/main/java/com/voxelmodpack/common/gui/GuiDialogBox.java @@ -0,0 +1,366 @@ +package com.voxelmodpack.common.gui; + +import java.awt.Point; +import java.io.IOException; + +import org.lwjgl.input.Keyboard; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiButton; +import net.minecraft.client.gui.GuiScreen; +import net.minecraft.client.resources.I18n; + +/** + * Base class for GUI Screens which behave like dialog boxes + * + * @author Adam Mummery-Smith + */ +public abstract class GuiDialogBox extends GuiScreenEx { + public static int lastScreenWidth, lastScreenHeight; + + public enum DialogResult { + /** + * No result (maybe the dialog was not closed yet?) + */ + None, + + /** + * Dialog result OK (user clicked OK or pressed RETURN) + */ + OK, + + /** + * Dialog result Cancel (user clicked Cancel or pressed ESCAPE) + */ + Cancel, + + Yes, + + No + } + + private GuiScreen parentScreen; + + /** + * Parent screen which will be notified when this dialog is closed + */ + // protected GuiScreenEx parentScreenEx; + + /** + * Dialog box buttons + */ + protected GuiButton btnOk, btnCancel; + + /** + * Dialog box position and size + */ + protected int dialogX, dialogY, dialogWidth, dialogHeight; + + /** + * Title to display at the top of the dialog box + */ + protected String dialogTitle; + + /** + * True to centre the title + */ + protected boolean centreTitle = true; + + /** + * Colour for the window title + */ + protected int dialogTitleColour = 0xFFFFFF00; + + /** + * Dialog result based on the user's action + */ + public DialogResult dialogResult = DialogResult.None; + + /** + * This dialog box can be moved + */ + protected boolean movable = false; + + protected boolean dragging = false; + + protected Point dragOffset = new Point(0, 0); + + @SuppressWarnings("unused") + private boolean generateMouseDragEvents; + + /** + * Constructor, create a new GuiDialogBox + * + * @param parentScreen Screen which owns this dialog + * @param width + * @param height + * @param windowTitle + */ + public GuiDialogBox(GuiScreen parentScreen, int width, int height, String windowTitle) { + this.parentScreen = parentScreen; + this.dialogWidth = width; + this.dialogHeight = height; + this.dialogTitle = windowTitle; + + this.generateMouseDragEvents = true; + } + + /** + * Close the dialog box and display the parent screen (if it is available, + * otherwise clear the gui) + */ + protected void closeDialog() { + this.mc.displayGuiScreen(this.getParentScreen()); + } + + /** + * Handle a button event + * + * @param guibutton Button or control which sourced the event + */ + @Override + protected void actionPerformed(GuiButton guibutton) { + if (guibutton.id == this.btnCancel.id) { + this.dialogResult = DialogResult.Cancel; + this.closeDialog(); + } + if (guibutton.id == this.btnOk.id) { + if (this.validateDialog()) { + this.dialogResult = DialogResult.OK; + this.onSubmit(); + this.closeDialog(); + } + } + } + + /** + * Handle a keyboard event + */ + @Override + protected final void keyTyped(char keyChar, int keyCode) { + if (keyCode == Keyboard.KEY_ESCAPE) { + this.actionPerformed(this.btnCancel); + } else if (keyCode == Keyboard.KEY_RETURN) { + this.actionPerformed(this.btnOk); + } else { + this.onKeyTyped(keyChar, keyCode); + } + } + + /* + * (non-Javadoc) + * @see net.eq2online.macros.gui.shared.GuiScreenEx#mouseClicked(int, int, + * int) + */ + @Override + protected final void mouseClicked(int mouseX, int mouseY, int button) throws IOException { + if (button == 0 && this.movable && mouseX > this.dialogX && mouseX < this.dialogX + this.dialogWidth + && mouseY > this.dialogY - 18 && mouseY < this.dialogY) { + this.dragOffset = new Point(mouseX - this.dialogX, mouseY - this.dialogY); + this.dragging = true; + } else { + this.mouseClickedEx(mouseX, mouseY, button); + } + } + + /** + * @param mouseX + * @param mouseY + * @param button + * @throws IOException + */ + protected void mouseClickedEx(int mouseX, int mouseY, int button) throws IOException { + super.mouseClicked(mouseX, mouseY, button); + } + + /* + * (non-Javadoc) + * @see net.minecraft.client.gui.GuiScreen#mouseReleased(int, int, int) + */ + @Override + protected void mouseReleased(int mouseX, int mouseY, int button) { + if (this.dragging) { + this.dialogX = mouseX - this.dragOffset.x; + this.dialogY = mouseY - this.dragOffset.y; + this.initGui(); + } + + if (button == 0 && this.dragging) { + if (this.dialogX < 0) + this.dialogX = 0; + if (this.dialogX > this.width) + this.dialogX = this.width - this.dialogWidth; + if (this.dialogY < 9) + this.dialogY = 18; + if (this.dialogY > this.height) + this.dialogY = this.height - this.dialogHeight; + this.initGui(); + this.dragging = false; + return; + } + + super.mouseReleased(mouseX, mouseY, button); + } + + /** + * Initialise the dialog box + */ + @Override + public final void initGui() { + super.initGui(); + + Keyboard.enableRepeatEvents(true); + + // Call to owner since the owner is still drawn whilst we are being + // displayed + if (this.getParentScreen() != null) + this.getParentScreen().initGui(); + + if (!this.dragging) { + // Draw the dialog centered unless moved by the parent + this.dialogX = (this.width - this.dialogWidth) / 2; + this.dialogY = (this.height - this.dialogHeight) / 2; + } + + this.btnOk = new GuiButton(-1, this.dialogX + this.dialogWidth - 62, this.dialogY + this.dialogHeight - 22, 60, + 20, I18n.format("gui.done")); + this.btnCancel = new GuiButton(-2, this.dialogX + this.dialogWidth - 124, this.dialogY + this.dialogHeight - 22, + 60, 20, I18n.format("gui.cancel")); + + this.buttonList.clear(); + this.buttonList.add(this.btnOk); + this.buttonList.add(this.btnCancel); + + lastScreenWidth = this.width; + lastScreenHeight = this.height; + + this.onInitDialog(); + } + + @Override + public final void onGuiClosed() { + this.onDialogClosed(); + + Keyboard.enableRepeatEvents(false); + + super.onGuiClosed(); + } + + @Override + public void setWorldAndResolution(Minecraft minecraft, int width, int height) { + super.setWorldAndResolution(minecraft, width, height); + + if (this.getParentScreen() != null) { + this.getParentScreen().setWorldAndResolution(minecraft, width, height); + } + } + + @Override + public final void drawScreen(int mouseX, int mouseY, float partialTick) { + this.drawParentScreen(mouseX, mouseY, partialTick); + + int backColour = 0xAA000000; + int backColour2 = 0xCC333333; + + // Header + drawRect(this.dialogX, this.dialogY - 18, this.dialogX + this.dialogWidth, this.dialogY, backColour2); + + if (this.centreTitle) + this.drawCenteredString(this.mc.fontRendererObj, this.dialogTitle, this.dialogX + (this.dialogWidth / 2), + this.dialogY - 13, this.dialogTitleColour); + else + this.drawString(this.mc.fontRendererObj, this.dialogTitle, this.dialogX + 5, this.dialogY - 13, + this.dialogTitleColour); + + // Dialog body + drawRect(this.dialogX, this.dialogY, this.dialogX + this.dialogWidth, this.dialogY + this.dialogHeight, + backColour); + + // Subclasses + this.drawDialog(mouseX, mouseY, partialTick); + + // Superclass (buttons etc.) + super.drawScreen(mouseX, mouseY, partialTick); + + this.postRender(mouseX, mouseY, partialTick); + } + + @Override + public void updateScreen() { + if (this.getParentScreen() != null) { + this.getParentScreen().updateScreen(); + } + + super.updateScreen(); + } + + /** + * @param partialTick + */ + public void drawParentScreen(int mouseX, int mouseY, float partialTick) { + if (this.getParentScreen() != null) { + this.getParentScreen().drawScreen(0, 0, partialTick); + drawRect(0, 0, this.width, this.height, 0xAA000000); + } else if (this.mc.theWorld == null) { + this.drawDefaultBackground(); + } + } + + /** + * Stub for subclasses, draw any additional dialog features + * + * @param mouseX Mouse X coordinate + * @param mouseY Mouse Y coordinate + * @param f + */ + protected void drawDialog(int mouseX, int mouseY, float f) { + + } + + /** + * Stub for subclasses, draw any additional dialog features + * + * @param mouseX Mouse X coordinate + * @param mouseY Mouse Y coordinate + * @param f + */ + protected void postRender(int mouseX, int mouseY, float f) { + + } + + /** + * Stub for subclasses, perform any tasks required when the dialog is + * validated and about to be submitted + */ + public abstract void onSubmit(); + + /** + * Stub for subclasses, return true if the dialog can be submitted in its + * current state, or false to prevent submission + * + * @return + */ + public abstract boolean validateDialog(); + + /** + * Stub for subclasses, handle a key typed event + * + * @param keyChar + * @param keyCode + */ + protected void onKeyTyped(char keyChar, int keyCode) {} + + /** + * Stub for subclasses, perform any required initialisation + */ + protected void onInitDialog() {} + + /** + * Stub for subclasses, the gui was closed + */ + protected void onDialogClosed() {} + + public GuiScreen getParentScreen() { + return this.parentScreen; + } +} diff --git a/voxellib/src/main/java/com/voxelmodpack/common/gui/GuiDialogBoxConfirm.java b/voxellib/src/main/java/com/voxelmodpack/common/gui/GuiDialogBoxConfirm.java new file mode 100644 index 00000000..998820ae --- /dev/null +++ b/voxellib/src/main/java/com/voxelmodpack/common/gui/GuiDialogBoxConfirm.java @@ -0,0 +1,97 @@ +package com.voxelmodpack.common.gui; + +import net.minecraft.client.gui.GuiScreen; +import net.minecraft.client.resources.I18n; + +/** + * Confirmation dialog box, displays a message and yes/no buttons + * + * @author Adam Mummery-Smith + * @param + */ +public class GuiDialogBoxConfirm extends GuiDialogBox { + /** + * Message text to display + */ + private String messageText1, messageText2; + + /** + * Metadata for this confirmation, so that the calling class knows what's + * being confirmed! + */ + private T metaData; + + /** + * Constructor with metadata + * + * @param parentScreen Screen which owns this dialog + * @param windowTitle Dialog title + * @param line1 Label line 1 + * @param line2 Label line 2 + * @param metaData Metadata supplied by the owning gui + */ + public GuiDialogBoxConfirm(GuiScreen parentScreen, String windowTitle, String line1, String line2, T metaData) { + this(parentScreen, windowTitle, line1, line2); + this.metaData = metaData; + } + + /** + * Constructor with no metadata + * + * @param parentScreen Screen which owns this dialog + * @param windowTitle Dialog title + * @param line1 Label line 1 + * @param line2 Label line 2 + */ + public GuiDialogBoxConfirm(GuiScreen parentScreen, String windowTitle, String line1, String line2) { + super(parentScreen, 320, 80, windowTitle); + + // Set local labels + this.messageText1 = line1; + this.messageText2 = line2; + } + + /** + * Get the meta data passed to this dialog when it was created + * + * @return Meta data (if any) + */ + public T GetMetaData() { + return this.metaData; + } + + @Override + protected void onInitDialog() { + this.btnOk.displayString = I18n.format("gui.yes"); + this.btnCancel.displayString = I18n.format("gui.no"); + } + + @Override + public void onSubmit() {} + + @Override + public boolean validateDialog() { + return true; + } + + @Override + protected void drawDialog(int mouseX, int mouseY, float f) { + // Label + drawCenteredString(this.fontRendererObj, this.messageText1, this.dialogX + (this.dialogWidth / 2), + this.dialogY + 18, 0xFFFFAA00); + drawCenteredString(this.fontRendererObj, this.messageText2, this.dialogX + (this.dialogWidth / 2), + this.dialogY + 32, 0xFFFFAA00); + } + + /* + * (non-Javadoc) + * @see net.eq2online.macros.gui.shared.GuiDialogBox#KeyTyped(char, int) + */ + @Override + protected void onKeyTyped(char keyChar, int keyCode) { + if (keyChar == 'y' || keyChar == 'Y') + actionPerformed(this.btnOk); + if (keyChar == 'n' || keyChar == 'N') + actionPerformed(this.btnCancel); + } +} diff --git a/voxellib/src/main/java/com/voxelmodpack/common/gui/GuiScreenEx.java b/voxellib/src/main/java/com/voxelmodpack/common/gui/GuiScreenEx.java new file mode 100644 index 00000000..bd19a9df --- /dev/null +++ b/voxellib/src/main/java/com/voxelmodpack/common/gui/GuiScreenEx.java @@ -0,0 +1,139 @@ +package com.voxelmodpack.common.gui; + +import static com.mumfrey.liteloader.gl.GL.*; + +import com.voxelmodpack.common.gui.interfaces.IExtendedGui; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiScreen; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.renderer.WorldRenderer; +import net.minecraft.util.ResourceLocation; + +/** + * Class with many extra ways of drawing rectangular images + */ +public abstract class GuiScreenEx extends GuiScreen implements IExtendedGui { + public static float texMapScale = 1F / 256F; + + /* + * (non-Javadoc) + * @see + * com.voxelmodpack.common.gui.IExtendedGui#drawTessellatedModalBorderRect( + * net.minecraft.src.ResourceLocation, int, int, int, int, int, int, int, + * int, int, int) + */ + @Override + public void drawTessellatedModalBorderRect(ResourceLocation texture, int textureSize, int x, int y, int x2, int y2, + int u, int v, int u2, int v2, int borderSize) { + this.drawTessellatedModalBorderRect(texture, textureSize, x, y, x2, y2, u, v, u2, v2, borderSize, true); + } + + /* + * (non-Javadoc) + * @see + * com.voxelmodpack.common.gui.IExtendedGui#drawTessellatedModalBorderRect( + * net.minecraft.src.ResourceLocation, int, int, int, int, int, int, int, + * int, int, int, boolean) + */ + @Override + public void drawTessellatedModalBorderRect(ResourceLocation texture, int textureSize, int x, int y, int x2, int y2, + int u, int v, int u2, int v2, int borderSize, boolean setcolor) { + int tileSize = Math.min(((u2 - u) / 2) - 1, ((v2 - v) / 2) - 1); + + int ul = u + tileSize, ur = u2 - tileSize, vt = v + tileSize, vb = v2 - tileSize; + int xl = x + borderSize, xr = x2 - borderSize, yt = y + borderSize, yb = y2 - borderSize; + + this.setTexMapSize(textureSize); + + Minecraft.getMinecraft().getTextureManager().bindTexture(texture); + + if (setcolor) + glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + + this.drawTexturedModalRect(x, y, xl, yt, u, v, ul, vt); + this.drawTexturedModalRect(xl, y, xr, yt, ul, v, ur, vt); + this.drawTexturedModalRect(xr, y, x2, yt, ur, v, u2, vt); + this.drawTexturedModalRect(x, yb, xl, y2, u, vb, ul, v2); + this.drawTexturedModalRect(xl, yb, xr, y2, ul, vb, ur, v2); + this.drawTexturedModalRect(xr, yb, x2, y2, ur, vb, u2, v2); + this.drawTexturedModalRect(x, yt, xl, yb, u, vt, ul, vb); + this.drawTexturedModalRect(xr, yt, x2, yb, ur, vt, u2, vb); + this.drawTexturedModalRect(xl, yt, xr, yb, ul, vt, ur, vb); + } + + /* + * (non-Javadoc) + * @see com.voxelmodpack.common.gui.IExtendedGui#drawTexturedModalRect(net. + * minecraft.src.ResourceLocation, int, int, int, int, int, int, int, int) + */ + @Override + public void drawTexturedModalRect(ResourceLocation texture, int x, int y, int x2, int y2, int u, int v, int u2, + int v2) { + glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + Minecraft.getMinecraft().getTextureManager().bindTexture(texture); + + this.drawTexturedModalRect(x, y, x2, y2, u, v, u2, v2); + } + + /* + * (non-Javadoc) + * @see com.voxelmodpack.common.gui.IExtendedGui#drawTexturedModalRect(int, + * int, int, int, int, int, int, int) + */ + @Override + public void drawTexturedModalRect(int x, int y, int x2, int y2, int u, int v, int u2, int v2) { + Tessellator tessellator = Tessellator.getInstance(); + WorldRenderer worldRender = tessellator.getWorldRenderer(); + worldRender.startDrawingQuads(); + worldRender.addVertexWithUV(x, y2, this.zLevel, u * texMapScale, v2 * texMapScale); + worldRender.addVertexWithUV(x2, y2, this.zLevel, u2 * texMapScale, v2 * texMapScale); + worldRender.addVertexWithUV(x2, y, this.zLevel, u2 * texMapScale, v * texMapScale); + worldRender.addVertexWithUV(x, y, this.zLevel, u * texMapScale, v * texMapScale); + tessellator.draw(); + } + + /** + * Draws a solid color rectangle with the specified coordinates and color. + */ + @SuppressWarnings("cast") + public void drawDepthRect(int x1, int y1, int x2, int y2, int color) { + if (x1 < x2) { + int xTemp = x1; + x1 = x2; + x2 = xTemp; + } + + if (y1 < y2) { + int yTemp = y1; + y1 = y2; + y2 = yTemp; + } + + float alpha = (color >> 24 & 255) / 255.0F; + float red = (color >> 16 & 255) / 255.0F; + float green = (color >> 8 & 255) / 255.0F; + float blue = (color & 255) / 255.0F; + Tessellator tessellator = Tessellator.getInstance(); + WorldRenderer worldRender = tessellator.getWorldRenderer(); + glEnableBlend(); + glDisableTexture2D(); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glColor4f(red, green, blue, alpha); + worldRender.startDrawingQuads(); + worldRender.addVertex(x1, y2, this.zLevel); + worldRender.addVertex(x2, y2, this.zLevel); + worldRender.addVertex(x2, y1, this.zLevel); + worldRender.addVertex(x1, y1, this.zLevel); + tessellator.draw(); + glEnableTexture2D(); + glDisableBlend(); + } + + /** + * @param textureSize + */ + protected void setTexMapSize(int textureSize) { + GuiScreenEx.texMapScale = 1F / textureSize; + } +} diff --git a/voxellib/src/main/java/com/voxelmodpack/common/gui/GuiScrollBar.java b/voxellib/src/main/java/com/voxelmodpack/common/gui/GuiScrollBar.java new file mode 100644 index 00000000..daaa1158 --- /dev/null +++ b/voxellib/src/main/java/com/voxelmodpack/common/gui/GuiScrollBar.java @@ -0,0 +1,386 @@ +package com.voxelmodpack.common.gui; + +import static com.mumfrey.liteloader.gl.GL.*; +import net.minecraft.client.Minecraft; + +import com.voxelmodpack.common.LiteModVoxelCommon; + +/** + * General-purpose scrollbar control + * + * @author Adam Mummery-Smith + */ +public class GuiScrollBar extends GuiControlEx { + public enum ScrollBarOrientation { + Vertical, + Horizontal + } + + protected ScrollBarOrientation orientation; + + /** + * Scroll bar minimum value + */ + protected int min; + + /** + * Scroll bar maximum value + */ + protected int max; + + /** + * Scroll bar current value + */ + protected int value; + + /** + * Current visual position of the scroll button relative to the scroll tray + */ + protected int buttonPos = 0; + + /** + * Size of the scroll button + */ + protected int scrollButtonSize = 20; + + /** + * Total scrollable distance + */ + protected int traySize; + + /** + * Mousedown offset relative to the scroll button, used for mouse drag delta + * calculations + */ + protected int dragOffset; + + /** + * Mousedown state, track whether holding down the drag button, up button, + * or down button + */ + protected int mouseDownState = 0; + + /** + * Used to track a small delay before activating scroll on the up/down + * buttons + */ + protected int mouseDownTime = 0; + + /** + * Make a new scrollbar control + * + * @param minecraft Reference to the minecraft game instance + * @param controlId Control ID, used for handling actionPerformed dispatches + * @param xPos Control's X position + * @param yPos Control's Y position + * @param controlWidth Width of the control (also the height of the buttons) + * @param controlHeight Height of the control + * @param minValue Minimum scroll value + * @param maxValue Maximum scroll value + */ + public GuiScrollBar(Minecraft minecraft, int controlId, int xPos, int yPos, int controlWidth, int controlHeight, + int minValue, int maxValue, ScrollBarOrientation orientation) { + super(minecraft, controlId, xPos, yPos, controlWidth, controlHeight, ""); + + this.orientation = orientation; + + this.value = this.min = minValue; + this.max = Math.max(this.min, maxValue); + + this.traySize = this.getLargeDimension() - (this.getSmallDimension() * 2) - this.scrollButtonSize; + } + + protected int getLargeDimension() { + return (this.orientation == ScrollBarOrientation.Vertical) ? this.height : this.width; + } + + protected int getSmallDimension() { + return (this.orientation == ScrollBarOrientation.Vertical) ? this.width : this.height; + } + + /** + * Get the current value of the control + * + * @return current value + */ + public int getValue() { + return this.value; + } + + /** + * Set the current control value + * + * @param value New value (will be clamped within current min and max values + */ + public void setValue(int value) { + this.value = value; + this.updateValue(); + } + + /** + * Set the minimum value for the control, the current value will be clamped + * between min and max + * + * @param value + */ + public void setMin(int value) { + this.min = value; + this.max = Math.max(this.min, this.max); + this.updateValue(); + } + + /** + * Set the maximum value for the control, the current value will be clamped + * between min and max. + * + * @param value + */ + public void setMax(int value) { + this.max = value; + this.min = Math.min(this.max, this.min); + this.updateValue(); + } + + /** + * Set the control's position + * + * @param left New left, X coordinate + * @param top New top, Y coordinate + */ + public void setPosition(int left, int top) { + this.setXPosition(left); + this.setYPosition(top); + } + + /** + * Set the size of the control + * + * @param controlWidth New width for the control. Minimum 60 pixels + * @param controlHeight New height for the control. Minimum 8 pixels + */ + public void setSize(int controlWidth, int controlHeight) { + this.setWidth(controlWidth); + this.setHeight(controlHeight); + this.traySize = this.getLargeDimension() - (this.getSmallDimension() * 2) - this.scrollButtonSize; + this.updateValue(); + } + + /** + * Set the size and position of the control + * + * @param left New left, X coordinate + * @param top New top, Y coordinate + * @param controlWidth New width for the control. Minimum 60 pixels + * @param controlHeight New height for the control. Minimum 8 pixels + */ + public void setSizeAndPosition(int left, int top, int controlWidth, int controlHeight) { + this.setPosition(left, top); + this.setSize(controlWidth, controlHeight); + } + + /** + * Clamp the value between max and min and update the button position + */ + private void updateValue() { + if (this.value < this.min) + this.value = this.min; + if (this.value > this.max) + this.value = this.max; + + this.buttonPos = (int) (((float) (this.value - this.min) / (float) (this.max - this.min)) * this.traySize); + } + + /** + * Draw the control + * + * @param minecraft Minecraft game instance + * @param mouseX Mouse X coordinate + * @param mouseY Mouse Y coordinate + */ + @Override + protected void drawControl(Minecraft minecraft, int mouseX, int mouseY) { + if (!this.isVisible()) + return; + + float opacity = this.isEnabled() ? 1.0F : 0.3F; + + glColor4f(opacity, opacity, opacity, opacity); + + // Calc mouseover state of buttons + boolean mouseOverUpButton = this.mouseDownState == 3 || this.mouseIsOverButton(3, mouseX, mouseY); + boolean mouseOverDownButton = this.mouseDownState == 2 || this.mouseIsOverButton(2, mouseX, mouseY); + boolean mouseOverButton = this.mouseDownState == 1 || this.mouseIsOverButton(1, mouseX, mouseY); + + // V coordinates based on button hover states + int upButtonHoverState = 0 + (this.getHoverState(mouseOverUpButton) * 16); + int downButtonHoverState = 0 + (this.getHoverState(mouseOverDownButton) * 16); + int buttonHoverState = 0 + (this.getHoverState(mouseOverButton) * 16); + + if (this.orientation == ScrollBarOrientation.Vertical) { + minecraft.getTextureManager().bindTexture(LiteModVoxelCommon.GUIPARTS); + this.setTexMapSize(256); + + this.drawTessellatedModalBorderRect(this.xPosition, this.yPosition, this.xPosition + this.width, + this.yPosition + this.width, 0, upButtonHoverState, 16, upButtonHoverState + 16, 4); + this.drawTessellatedModalBorderRect(this.xPosition, this.yPosition + this.height - this.width, + this.xPosition + this.width, this.yPosition + this.height, 0, downButtonHoverState, 16, + downButtonHoverState + 16, 4); + + // Slider tray + this.drawTessellatedModalBorderRect(this.xPosition + 1, this.yPosition + this.width, + this.xPosition + this.width - 1, this.yPosition + this.height - this.width, 0, 0, 16, 16, 4); + + // Button icons + this.drawTexturedModalRect(this.xPosition + 1, this.yPosition + 1, this.xPosition + this.width - 2, + this.yPosition + this.width - 2, 36, 0, 54, 18); + this.drawTexturedModalRect(this.xPosition + 1, this.yPosition + this.height - this.width + 1, + this.xPosition + this.width - 2, this.yPosition + this.height - 1, 18, 0, 36, 18); + } + + // Handle mouse dragged event + this.mouseDragged(minecraft, mouseX, mouseY); + + minecraft.getTextureManager().bindTexture(LiteModVoxelCommon.GUIPARTS); + + if (this.orientation == ScrollBarOrientation.Vertical) { + this.drawTessellatedModalBorderRect(this.xPosition, this.yPosition + this.width + this.buttonPos, + this.xPosition + this.width, this.yPosition + this.width + this.buttonPos + this.scrollButtonSize, + 0, buttonHoverState, 16, buttonHoverState + 16, 4); + } + } + + protected boolean mouseIsOverButton(int button, int mouseX, int mouseY) { + int buttonX = 0, buttonY = 0, buttonWidth = this.getSmallDimension(), buttonHeight = this.getSmallDimension(); + mouseX -= this.xPosition; + mouseY -= this.yPosition; + + if (mouseX < 0 || mouseY < 0 || mouseX > this.width || mouseY > this.height) + return false; + + if (button == 2) // down button + { + if (this.orientation == ScrollBarOrientation.Vertical) + buttonY = this.getLargeDimension() - this.getSmallDimension(); + if (this.orientation == ScrollBarOrientation.Horizontal) + buttonX = this.getLargeDimension() - this.getSmallDimension(); + } else if (button == 1) // drag button + { + if (this.orientation == ScrollBarOrientation.Vertical) { + buttonY = this.getSmallDimension() + this.buttonPos; + buttonHeight = this.scrollButtonSize; + } + if (this.orientation == ScrollBarOrientation.Horizontal) { + buttonX = this.getSmallDimension() + this.buttonPos; + buttonWidth = this.scrollButtonSize; + } + } + + return (mouseX >= buttonX && mouseY >= buttonY && mouseX < buttonX + buttonWidth + && mouseY < buttonY + buttonHeight); + } + + /** + * Handle mouse dragged event + * + * @param minecraft Minecraft game instance + * @param mouseX Mouse X coordinate + * @param mouseY Mouse Y coordinate + */ + @Override + protected void mouseDragged(Minecraft minecraft, int mouseX, int mouseY) { + if (!this.isVisible()) + return; + + if (this.mouseDownState > 0) { + int mouseDownTicks = this.updateCounter - this.mouseDownTime; + + if (this.mouseDownState == 1) { + int mPos = (this.orientation == ScrollBarOrientation.Vertical) ? mouseY - this.yPosition + : mouseX - this.xPosition; + this.value = (int) (((float) (mPos - this.dragOffset - this.getSmallDimension()) + / (float) this.traySize) * (this.max - this.min)) + this.min; + } else if (this.mouseDownState == 2 && mouseDownTicks > 6) { + this.value += 4; + } else if (this.mouseDownState == 3 && mouseDownTicks > 6) { + this.value -= 4; + } + + this.updateValue(); + } + } + + /** + * Handle mouse released event + * + * @param mouseX Mouse X coordinate + * @param mouseY Mouse Y coordinate + */ + @Override + public void mouseReleased(int mouseX, int mouseY) { + this.mouseDownState = 0; + } + + /** + * Mouse pressed event + * + * @param minecraft Minecraft game instance + * @param mouseX Mouse X coordinate + * @param mouseY Mouse Y coordinate + */ + @Override + public boolean mousePressed(Minecraft minecraft, int mouseX, int mouseY) { + this.actionPerformed = false; + boolean returnValue = false; + + if (super.mousePressed(minecraft, mouseX, mouseY)) { + // Adjust coords relative to control + mouseX -= this.xPosition; + mouseY -= this.yPosition; + + if (this.orientation == ScrollBarOrientation.Horizontal) { + int mouseT = mouseY; + mouseY = mouseX; + mouseX = mouseT; + } + + // Counter starts now and we wait 10 seconds for mousedown effects + // to kick in + this.mouseDownTime = this.updateCounter; + + if (mouseY < this.getSmallDimension()) // up button + { + this.mouseDownState = 3; + this.value -= 4; + this.actionPerformed = true; + } else if (mouseY > this.getLargeDimension() - this.getSmallDimension()) // down + // button + { + this.mouseDownState = 2; + this.value += 4; + this.actionPerformed = true; + } else if (mouseY > this.buttonPos + this.getSmallDimension() + && mouseY < this.buttonPos + this.getSmallDimension() + this.scrollButtonSize) // drag + // button + { + this.mouseDownState = 1; + this.dragOffset = mouseY - this.buttonPos - this.getSmallDimension(); + returnValue = true; + } else if (mouseY < this.buttonPos + this.getSmallDimension()) // upper + // tray + { + this.value -= 40; + this.actionPerformed = true; + } else if (mouseY > this.buttonPos + this.getSmallDimension() + this.scrollButtonSize) // lower + // tray + { + this.value += 40; + this.actionPerformed = true; + } + + // Clamp value and update slider position + this.updateValue(); + } + + return this.actionPerformed || returnValue; + } +} diff --git a/voxellib/src/main/java/com/voxelmodpack/common/gui/GuiTextFieldEx.java b/voxellib/src/main/java/com/voxelmodpack/common/gui/GuiTextFieldEx.java new file mode 100644 index 00000000..352f81f8 --- /dev/null +++ b/voxellib/src/main/java/com/voxelmodpack/common/gui/GuiTextFieldEx.java @@ -0,0 +1,176 @@ +package com.voxelmodpack.common.gui; + +import net.minecraft.client.gui.FontRenderer; +import net.minecraft.client.gui.GuiTextField; + +import org.lwjgl.input.Keyboard; + +import com.mumfrey.liteloader.client.overlays.IGuiTextField; + +/** + * 'Dynamic' text field which supports resizing and moving and also syntax + * highlight + * + * @author Adam Mummery-Smith + */ +public class GuiTextFieldEx extends GuiTextField { + /** + * Width member is private in the superclass + */ + protected int xPos, yPos, width, height; + + /** + * Allowed character filter for this text box + */ + public String allowedCharacters; + + public int minStringLength = 0; + + protected FontRenderer fontRenderer; + + /** + * Constructor + * + * @param parentScreen Parent screen + * @param fontrenderer Font renderer + * @param xPos X location + * @param yPos Y location + * @param width Control width + * @param height Control height + * @param initialText Text to initially set + */ + public GuiTextFieldEx(int id, FontRenderer fontrenderer, int xPos, int yPos, int width, int height, + String initialText, String allowedCharacters, int maxStringLength) { + super(id, fontrenderer, xPos, yPos, width, height); + this.allowedCharacters = allowedCharacters; + this.setMaxStringLength(maxStringLength); + this.setText(initialText); + + this.width = width; + } + + /** + * Constructor + * + * @param parentScreen Parent screen + * @param fontrenderer Font renderer + * @param xPos X location + * @param yPos Y location + * @param width Control width + * @param height Control height + * @param initialText Text to initially set + */ + public GuiTextFieldEx(int id, FontRenderer fontrenderer, int xPos, int yPos, int width, int height, + String initialText) { + super(id, fontrenderer, xPos, yPos, width, height); + this.setMaxStringLength(65536); + this.setText(initialText); + + this.width = width; + } + + /** + * Constructor + * + * @param parentScreen Parent screen + * @param fontrenderer Font renderer + * @param xPos X location + * @param yPos Y location + * @param width Control width + * @param height Control height + * @param initialText Text to initially set + */ + public GuiTextFieldEx(int id, FontRenderer fontrenderer, int xPos, int yPos, int width, int height, + int initialValue, int digits) { + super(id, fontrenderer, xPos, yPos, width, height); + this.setMaxStringLength(digits); + this.setText(String.valueOf(initialValue)); + this.allowedCharacters = "0123456789"; + this.width = width; + } + + @Override + public boolean textboxKeyTyped(char keyChar, int keyCode) { + if ((this.allowedCharacters == null || this.allowedCharacters.indexOf(keyChar) >= 0) || + keyCode == Keyboard.KEY_LEFT || keyCode == Keyboard.KEY_RIGHT || + keyCode == Keyboard.KEY_HOME || keyCode == Keyboard.KEY_END || + keyCode == Keyboard.KEY_DELETE || keyCode == Keyboard.KEY_BACK) { + return super.textboxKeyTyped(keyChar, keyCode); + } + + return false; + } + + /* + * (non-Javadoc) + * @see net.minecraft.src.GuiTextField#func_50038_e() + */ + @Override + public void setCursorPositionEnd() { + try { + super.setCursorPositionEnd(); + } catch (Exception ex) {} + } + + public void setSizeAndPosition(int xPos, int yPos, int width, int height) { + this.setPosition(xPos, yPos); + this.setSize(width, height); + } + + public void setSize(int width, int height) { + ((IGuiTextField) this).setInternalWidth(width); + ((IGuiTextField) this).setHeight(height); + + this.width = width; + this.height = height; + } + + public void setPosition(int xPos, int yPos) { + ((IGuiTextField) this).setXPosition(xPos); + ((IGuiTextField) this).setYPosition(yPos); + + this.xPos = xPos; + this.yPos = yPos; + } + + public void scrollToEnd() { + this.setCursorPosition(0); + this.setCursorPosition(this.getText().length()); + } + + /* + * (non-Javadoc) + * @see net.minecraft.src.GuiTextField#func_50032_g(int) + */ + @Override + public void setCursorPosition(int cursorPos) { + super.setCursorPosition(cursorPos); + super.setCursorPosition(cursorPos); + } + + /** + * Synchronise private members from the superclass using reflection + */ + protected void syncMembers() { + this.xPos = ((IGuiTextField) this).getXPosition(); + this.yPos = ((IGuiTextField) this).getYPosition(); + this.width = ((IGuiTextField) this).getInternalWidth(); + this.height = ((IGuiTextField) this).getHeight(); + } + + public void drawTextBoxAt(int yPos) { + try { + ((IGuiTextField) this).setYPosition(yPos); + this.yPos = yPos; + this.drawTextBox(); + } catch (Exception ex) {} + } + + public int getIntValue(int defaultValue) { + try { + return Integer.parseInt(this.getText()); + } catch (Exception ex) { + return defaultValue; + } + } +} diff --git a/voxellib/src/main/java/com/voxelmodpack/common/gui/interfaces/IDragDrop.java b/voxellib/src/main/java/com/voxelmodpack/common/gui/interfaces/IDragDrop.java new file mode 100644 index 00000000..bbc35802 --- /dev/null +++ b/voxellib/src/main/java/com/voxelmodpack/common/gui/interfaces/IDragDrop.java @@ -0,0 +1,66 @@ +package com.voxelmodpack.common.gui.interfaces; + +/** + * Interface for controls or other objects which support drag/drop sourcing and + * destination capabilities + * + * @author Adam Mummery-Smith + */ +public interface IDragDrop { + /** + * Get whether this object is a valid drag target + * + * @return true if the object can have draggable items dropped into it + */ + public abstract boolean getIsValidDragTarget(); + + /** + * Get whether this object is a valid drag source + * + * @return true if this object can source drag events + */ + public abstract boolean getIsValidDragSource(); + + /** + * Add the specified target to this object's list of targets + * + * @param target DragTarget to add, the object MUST support drag targets + */ + public abstract void addDragTarget(IDragDrop target); + + /** + * Add the specified target to this object's list of targets and create a + * mutual (bi-directional) linkage if specified + * + * @param target Target to add + * @param mutual Set true to create a mutual (bi-directional) linkage + */ + public abstract void addDragTarget(IDragDrop target, boolean mutual); + + /** + * Remove the specified object from this object's list of targets + * + * @param target Drag Target object to remove + */ + public abstract void removeDragTarget(IDragDrop target); + + /** + * Remove the specified object from this object's list of targets and this + * object from the other object's list of targets if specified + * + * @param target Drag Target object to remove + * @param mutual Set true to break the link mutually + */ + public abstract void removeDragTarget(IDragDrop target, boolean mutual); + + /** + * Perform a drag operation to this object + * + * @param source Object sourcing the drag event + * @param object Object being dragged + * @param mouseX Mouse X coordinate + * @param mouseY Mouse Y coordinate + * @return True if the object was accepted + */ + public abstract boolean dragDrop(IDragDrop source, IListObject object, int mouseX, int mouseY); +} diff --git a/voxellib/src/main/java/com/voxelmodpack/common/gui/interfaces/IExtendedGui.java b/voxellib/src/main/java/com/voxelmodpack/common/gui/interfaces/IExtendedGui.java new file mode 100644 index 00000000..1a3601b0 --- /dev/null +++ b/voxellib/src/main/java/com/voxelmodpack/common/gui/interfaces/IExtendedGui.java @@ -0,0 +1,81 @@ +package com.voxelmodpack.common.gui.interfaces; + +import net.minecraft.util.ResourceLocation; + +public interface IExtendedGui { + /** + * Draws a tesselated rectangle where the texture is stretched vertically + * and horizontally but the middle pixels are repeated whilst the joining + * pixels are stretched. Bordersize specifies the portion of the texture + * which will remain unstretched. + * + * @param texture Texture to use + * @param textureSize Size of the texture + * @param x Left edge X coordinate + * @param y Top edge Y coordinate + * @param x2 Right edge X coordinate + * @param y2 Bottom edge Y coordinate + * @param u U coordinate + * @param v V coordinate + * @param u2 Right edge U coordinate + * @param v2 Bottom edge V coordinate + * @param borderSize Number of pixels to leave unstretched, must be less + * than half of the width or height (whichever is smallest) + */ + public abstract void drawTessellatedModalBorderRect(ResourceLocation texture, int textureSize, int x, int y, int x2, + int y2, int u, int v, int u2, int v2, int borderSize); + + /** + * Draws a tesselated rectangle where the texture is stretched vertically + * and horizontally but the middle pixels are repeated whilst the joining + * pixels are stretched. Bordersize specifies the portion of the texture + * which will remain unstretched. + * + * @param texture Texture to use + * @param textureSize Size of the texture + * @param x Left edge X coordinate + * @param y Top edge Y coordinate + * @param x2 Right edge X coordinate + * @param y2 Bottom edge Y coordinate + * @param u U coordinate + * @param v V coordinate + * @param u2 Right edge U coordinate + * @param v2 Bottom edge V coordinate + * @param borderSize Number of pixels to leave unstretched, must be less + * than half of the width or height (whichever is smallest) + */ + public abstract void drawTessellatedModalBorderRect(ResourceLocation texture, int textureSize, int x, int y, int x2, + int y2, int u, int v, int u2, int v2, int borderSize, boolean setcolor); + + /** + * Advanced version of drawTexturedModalRect which supports separating the + * UV coordinates from the drawn width/height + * + * @param texture Texture to draw + * @param x Left edge X coordinate + * @param y Top edge Y coordinate + * @param x2 Right edge X coordinate + * @param y2 Bottom edge Y coordinate + * @param u U coordinate + * @param v V coordinate + * @param u2 Right edge U coordinate + * @param v2 Bottom edge V coordinate + */ + public abstract void drawTexturedModalRect(ResourceLocation texture, int x, int y, int x2, int y2, int u, int v, + int u2, int v2); + + /** + * Advanced version of drawTexturedModalRect which supports separating the + * UV coordinates from the drawn width/height + * + * @param x Left edge X coordinate + * @param y Top edge Y coordinate + * @param x2 Right edge X coordinate + * @param y2 Bottom edge Y coordinate + * @param u U coordinate + * @param v V coordinate + * @param u2 Right edge U coordinate + * @param v2 Bottom edge V coordinate + */ + public abstract void drawTexturedModalRect(int x, int y, int x2, int y2, int u, int v, int u2, int v2); +} \ No newline at end of file diff --git a/voxellib/src/main/java/com/voxelmodpack/common/gui/interfaces/IListObject.java b/voxellib/src/main/java/com/voxelmodpack/common/gui/interfaces/IListObject.java new file mode 100644 index 00000000..af62198f --- /dev/null +++ b/voxellib/src/main/java/com/voxelmodpack/common/gui/interfaces/IListObject.java @@ -0,0 +1,256 @@ +package com.voxelmodpack.common.gui.interfaces; + +import net.minecraft.client.Minecraft; + +import com.mumfrey.liteloader.util.render.Icon; + +/** + * Interface for items that can be added to listboxes + * + * @author Adam Mummery-Smith + */ +public interface IListObject { + /** + * Custom draw behaviours + */ + public enum CustomDrawBehaviour { + /** + * Don't custom draw, this object is completely owner-drawn + */ + NoCustomDraw, + + /** + * Combined custom draw, custom draw is called AFTER owner draw + */ + CustomDrawExtra, + + /** + * Custom draw only, no owner draw is performed and the item draws + * itself + */ + FullCustomDraw + } + + /** + * Get the custom draw behaviour for this object + * + * @return custom draw behaviour + */ + public abstract CustomDrawBehaviour getCustomDrawBehaviour(); + + /** + * Callback which is called if GetCustomDrawBegaviour returns + * CustomDrawExtra or FullCustomDraw + * + * @param iconEnabled True if icons are enabled in the container (owner) + * @param minecraft Minecraft game instance + * @param mouseX Mouse X coordinate + * @param mouseY Mouse Y coordinate + * @param XPosition() X location of the control + * @param yPosition Y location of the control + * @param width control width + * @param height control height + */ + public abstract void drawCustom(boolean iconEnabled, Minecraft minecraft, int mouseX, int mouseY, int xPosition, + int yPosition, int width, int height, int updateCounter); + + /** + * @param iconEnabled True if icons are enabled in the container + * @param minecraft Minecraft game instance + * @param mouseX Mouse X coordinate + * @param mouseY Mouse Y coordinate + * @param XPosition() X location of the control + * @param yPosition Y location of the control + * @param width control width + * @param height control height + * @return true if a custom action was performed + */ + public abstract boolean mousePressed(boolean iconEnabled, Minecraft minecraft, int mouseX, int mouseY, + int xPosition, int yPosition, int width, int height); + + /** + * Called when the mouse is released after a MousePressed event + * + * @param mouseX + * @param mouseY + */ + public abstract void mouseReleased(int mouseX, int mouseY); + + /** + * If a custom action was flagged after calling MousePressed, this function + * is called to retrieve the custom action + * + * @param bClear Set true to clear the custom action after it is read + * @return Custom action which was performed + */ + public abstract String getCustomAction(boolean bClear); + + /** + * True if the object has an icon + * + * @return True if the object has an icon + */ + public abstract boolean hasIcon(); + + /** + * Bind the icon texture for this object + */ + public abstract void bindIconTexture(); + + /** + * Get the icon ID for this object + * + * @return icon id + */ + public abstract Icon getIcon(); + + /** + * Get the icon's size on the texture + * + * @return + */ + public abstract int getIconSize(); + + /** + * Get the size of the texture map used for the object's icons + * + * @return + */ + public abstract int getIconTexmapSize(); + + /** + * Get the display text for the object + * + * @return Display text + */ + public abstract String getText(); + + /** + * Display name if different to text + * + * @return + */ + public abstract String getDisplayName(); + + /** + * Get the object's ID, object-specific identifier + * + * @return + */ + public abstract int getID(); + + /** + * Get the arbitrary data associated with the object + * + * @return object's data or NULL if no data + */ + public abstract Object getData(); + + /** + * Return true if this item is draggable + * + * @return true if this item is draggable + */ + public abstract boolean getDraggable(); + + /** + * True if this object supports in-place editing + * + * @return + */ + public abstract boolean getCanEditInPlace(); + + /** + * True if this object is currently in-place editing + * + * @return + */ + public abstract boolean getEditingInPlace(); + + /** + * Tell this object to begin editing in-place + */ + public abstract void beginEditInPlace(); + + /** + * Tell this object to end editing in-place + */ + public abstract void endEditInPlace(); + + /** + * Key typed handler for editing in-place + * + * @param keyChar Key character that was entered + * @param keyCode Key scan code + * @return + */ + public abstract boolean editInPlaceKeyTyped(char keyChar, int keyCode); + + /** + * @param iconEnabled True if icons are enabled in the container + * @param minecraft Minecraft game instance + * @param mouseX Mouse X coordinate + * @param mouseY Mouse Y coordinate + * @param XPosition() X location of the control + * @param yPosition Y location of the control + * @param width control width + * @param height control height + * @return true if the mouse was captured + */ + public abstract boolean editInPlaceMousePressed(boolean iconEnabled, Minecraft minecraft, int mouseX, int mouseY, + int xPosition, int yPosition, int width, int height); + + /** + * Callback which is called if GetEditingInPlace is true + * + * @param iconEnabled True if icons are enabled in the container (owner) + * @param minecraft Minecraft game instance + * @param mouseX Mouse X coordinate + * @param mouseY Mouse Y coordinate + * @param XPosition() X location of the control + * @param yPosition Y location of the control + * @param width control width + * @param height control height + */ + public abstract void editInPlaceDraw(boolean iconEnabled, Minecraft minecraft, int mouseX, int mouseY, + int xPosition, int yPosition, int width, int height, int updateCounter); + + /** + * Set the texture name of the icon for this object. + */ + public abstract void setIconTexture(String newTexture); + + /** + * Set the icon ID for this object + */ + public abstract void setIconID(int newIconId); + + /** + * Set the display text for the object + */ + public abstract void setText(String newText); + + /** + * Set the display name for this object + * + * @param newDisplayName + */ + public abstract void setDisplayName(String newDisplayName); + + /** + * Set the object's ID, object-specific identifier + */ + public abstract void setID(int newId); + + /** + * Set the arbitrary data associated with the object + */ + public abstract void setData(Object newData); + + /** + * Get the serialised representation of this list entry + * + * @return + */ + public abstract String serialise(); +} diff --git a/voxellib/src/main/java/com/voxelmodpack/common/gui/interfaces/IMouseEventListener.java b/voxellib/src/main/java/com/voxelmodpack/common/gui/interfaces/IMouseEventListener.java new file mode 100644 index 00000000..72d2f557 --- /dev/null +++ b/voxellib/src/main/java/com/voxelmodpack/common/gui/interfaces/IMouseEventListener.java @@ -0,0 +1,33 @@ +package com.voxelmodpack.common.gui.interfaces; + +public interface IMouseEventListener { + /** + * Called when a mouse button is pressed + * + * @param provider + * @param mouseX + * @param mouseY + * @param mouseButton + */ + public abstract void mousePressed(IMouseEventProvider provider, int mouseX, int mouseY, int mouseButton); + + /** + * Called when a mouse button is released + * + * @param provider + * @param mouseX + * @param mouseY + * @param mouseButton + */ + public abstract void mouseReleased(IMouseEventProvider provider, int mouseX, int mouseY, int mouseButton); + + /** + * Called when the mouse is moved + * + * @param provider + * @param mouseX + * @param mouseY + */ + public abstract void mouseMoved(IMouseEventProvider provider, int mouseX, int mouseY); + +} diff --git a/voxellib/src/main/java/com/voxelmodpack/common/gui/interfaces/IMouseEventProvider.java b/voxellib/src/main/java/com/voxelmodpack/common/gui/interfaces/IMouseEventProvider.java new file mode 100644 index 00000000..69692135 --- /dev/null +++ b/voxellib/src/main/java/com/voxelmodpack/common/gui/interfaces/IMouseEventProvider.java @@ -0,0 +1,13 @@ +package com.voxelmodpack.common.gui.interfaces; + +/** + * Interface for screens which can provide mouse events to multiple clients + * + * @author Adam Mummery-Smith + */ +public interface IMouseEventProvider { + /** + * Register a new mouse event listener for this provider instance + */ + public abstract void registerMouseListener(IMouseEventListener listener); +} diff --git a/voxellib/src/main/java/com/voxelmodpack/common/interfaces/INotifyable.java b/voxellib/src/main/java/com/voxelmodpack/common/interfaces/INotifyable.java new file mode 100644 index 00000000..a92f3d58 --- /dev/null +++ b/voxellib/src/main/java/com/voxelmodpack/common/interfaces/INotifyable.java @@ -0,0 +1,12 @@ +package com.voxelmodpack.common.interfaces; + +/** + * @author Adam Mummery-Smith + */ +public interface INotifyable { + /** + * @param message + * @param params + */ + public abstract void notify(String message, Object... params); +} diff --git a/voxellib/src/main/java/com/voxelmodpack/common/interfaces/IRegionRenderer.java b/voxellib/src/main/java/com/voxelmodpack/common/interfaces/IRegionRenderer.java new file mode 100644 index 00000000..ec0a59b3 --- /dev/null +++ b/voxellib/src/main/java/com/voxelmodpack/common/interfaces/IRegionRenderer.java @@ -0,0 +1,23 @@ +package com.voxelmodpack.common.interfaces; + +public interface IRegionRenderer { + /** + * Render a 3-dimensional region using the currently bound texture + * + * @param x1 First x coordinate + * @param y1 First y coordinate + * @param z1 First z coordinate + * @param x2 Second x coordinate + * @param y2 Second y coordinate + * @param z2 Second z coordinate + */ + public abstract void renderRegion3D(int x1, int y1, int z1, int x2, int y2, int z2); + + /** + * @param red + * @param green + * @param blue + * @param alpha + */ + public abstract void glColor4f(float red, float green, float blue, float alpha); +} \ No newline at end of file diff --git a/voxellib/src/main/java/com/voxelmodpack/common/interfaces/ITimeHandler.java b/voxellib/src/main/java/com/voxelmodpack/common/interfaces/ITimeHandler.java new file mode 100644 index 00000000..b565d98e --- /dev/null +++ b/voxellib/src/main/java/com/voxelmodpack/common/interfaces/ITimeHandler.java @@ -0,0 +1,48 @@ +package com.voxelmodpack.common.interfaces; + +/** + * Interface for mods which want to interact with inbound time + * + * @author Adam Mummery-Smith + */ +public interface ITimeHandler { + /** + * Called for every registered handler when a new time packet is received, + * lets each handler note the REAL (server) time + * + * @param totalTime + * @param worldTime + */ + public abstract void onTimeUpdate(long totalTime, long worldTime); + + /** + * Called for every registered handler until a handler returns TRUE. If a + * handler returns true then getFrozenTotalTime and getFrozenWorldTime are + * called and the frozen time overrides all other time adjustments + */ + public abstract boolean isFreezingTime(); + + /** + * If this handler returns TRUE in isFreezingTime then this method must + * return the frozen time + * + * @param totalTime + * @return + */ + public abstract long getFrozenTotalTime(long totalTime); + + /** + * If this handler returns TRUE in isFreezingTime then this method must + * return the frozen time + * + * @param worldTime + * @return + */ + public abstract long getFrozenWorldTime(long worldTime); + + /** + * If time is not frozen, this method should return the amount of time + * offset this handler wishes to apply + */ + public abstract long getTimeOffset(); +} diff --git a/voxellib/src/main/java/com/voxelmodpack/common/net/HttpFileRetriever.java b/voxellib/src/main/java/com/voxelmodpack/common/net/HttpFileRetriever.java new file mode 100644 index 00000000..a5b5bc13 --- /dev/null +++ b/voxellib/src/main/java/com/voxelmodpack/common/net/HttpFileRetriever.java @@ -0,0 +1,224 @@ +package com.voxelmodpack.common.net; + +import java.io.DataOutputStream; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; +import java.net.URLConnection; +import java.util.Map; +import java.util.Map.Entry; + +/** + * Object which retrieves files from a remote server using http + * + * @author Adam Mummery-Smith + */ +public class HttpFileRetriever extends Thread { + /** + * Callback which receives progress notifications + */ + private final IDownloadProgressWatcher progressWatcher; + + /** + * Callback which receives succeeded/failed notifications + */ + private final IDownloadCompletedWatcher completedWatcher; + + /** + * Source URL for the resource to download + */ + private final String sourceUrl; + + /** + * Additional headers to send with the request + */ + private final Map requestHeaders; + + /** + * File to download to + */ + private final File localFile; + + /** + * Maximum file size allowed for this resource + */ + private final int maxFileSize; + + /** + * Flag which can be set to cancel the download + */ + private volatile boolean cancelled; + + /** + * @param sourceUrl + * @param headers + * @param destinationFile + * @param maxFileSize + * @param progressWatcher + * @param completedWatcher + */ + private HttpFileRetriever(String sourceUrl, Map headers, File destinationFile, int maxFileSize, + IDownloadProgressWatcher progressWatcher, IDownloadCompletedWatcher completedWatcher) { + this.setDaemon(true); + + this.sourceUrl = sourceUrl; + this.requestHeaders = headers; + this.localFile = destinationFile; + this.maxFileSize = maxFileSize; + this.progressWatcher = progressWatcher; + this.completedWatcher = completedWatcher; + } + + /** + * Cancel this download + */ + public synchronized void cancel() { + this.cancelled = true; + } + + /* + * (non-Javadoc) + * @see java.lang.Thread#run() + */ + @Override + public void run() { + URLConnection http = null; + InputStream httpInputStream = null; + DataOutputStream fileOutputStream = null; + + if (this.progressWatcher != null) { + this.progressWatcher.resetProgressAndMessage("Downloading File"); + this.progressWatcher.resetProgressAndWorkingMessage("Making Request..."); + } + + try { + try { + byte[] buffer = new byte[4096]; + http = new URL(this.sourceUrl).openConnection(); + http.addRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)"); // For + // CloudFlare + + float progress = 0.0F; + float progressMax = this.requestHeaders.entrySet().size(); + for (Entry header : this.requestHeaders.entrySet()) { + http.setRequestProperty(header.getKey(), header.getValue()); + + if (this.progressWatcher != null) { + this.progressWatcher.setProgress((int) (++progress / progressMax * 100.0F)); + } + } + + if (this.cancelled) { + if (this.progressWatcher != null) + this.progressWatcher.onCompleted(); + this.completedWatcher.onFailure(this.localFile); + return; + } + + httpInputStream = http.getInputStream(); + progressMax = http.getContentLength(); + int contentLength = http.getContentLength(); + + if (this.progressWatcher != null) + this.progressWatcher.resetProgressAndWorkingMessage(String.format("Downloading file (%.2f MB)...", + new Object[] { Float.valueOf(progressMax / 1000.0F / 1000.0F) })); + + if (this.localFile.exists()) { + long receivedBytes = this.localFile.length(); + + if (receivedBytes == contentLength) { + this.completedWatcher.onSuccess(this.localFile); + + if (this.progressWatcher != null) + this.progressWatcher.onCompleted(); + + return; + } + + System.out.println("Deleting " + this.localFile + " as it does not match what we currently have (" + + contentLength + " vs our " + receivedBytes + ")."); + this.localFile.delete(); + } + + fileOutputStream = new DataOutputStream(new FileOutputStream(this.localFile)); + + if (this.maxFileSize > 0 && progressMax > this.maxFileSize) { + if (this.progressWatcher != null) + this.progressWatcher.onCompleted(); + + throw new IOException("Filesize is bigger than maximum allowed (file is " + progress + ", limit is " + + this.maxFileSize + ")"); + } + + int readBytes; + + while ((readBytes = httpInputStream.read(buffer)) >= 0 && !this.cancelled) { + progress += readBytes; + + if (this.progressWatcher != null) + this.progressWatcher.setProgress((int) (progress / progressMax * 100.0F)); + + if (this.maxFileSize > 0 && progress > this.maxFileSize) { + if (this.progressWatcher != null) + this.progressWatcher.onCompleted(); + + throw new IOException("Filesize was bigger than maximum allowed (got >= " + progress + + ", limit was " + this.maxFileSize + ")"); + } + + fileOutputStream.write(buffer, 0, readBytes); + } + + if (this.cancelled) { + try { + fileOutputStream.close(); + this.localFile.delete(); + } catch (IOException ex) {} + + if (this.progressWatcher != null) + this.progressWatcher.onCompleted(); + this.completedWatcher.onFailure(this.localFile); + return; + } + + this.completedWatcher.onSuccess(this.localFile); + + if (this.progressWatcher != null) { + this.progressWatcher.onCompleted(); + return; + } + } catch (Throwable th) { + // th.printStackTrace(); + } + } finally { + try { + if (httpInputStream != null) + httpInputStream.close(); + } catch (IOException ex) {} + + try { + if (fileOutputStream != null) + fileOutputStream.close(); + } catch (IOException ex) {} + } + } + + /** + * @param sourceUrl + * @param headers + * @param destFile + * @param maxFileSize + * @param progressWatcher + * @param completedWatcher + * @return + */ + public static HttpFileRetriever beginDownloading(String sourceUrl, Map headers, File destFile, + int maxFileSize, IDownloadProgressWatcher progressWatcher, IDownloadCompletedWatcher completedWatcher) { + HttpFileRetriever downloadThread = new HttpFileRetriever(sourceUrl, headers, destFile, maxFileSize, + progressWatcher, completedWatcher); + downloadThread.start(); + return downloadThread; + } +} diff --git a/voxellib/src/main/java/com/voxelmodpack/common/net/IDownloadCompletedWatcher.java b/voxellib/src/main/java/com/voxelmodpack/common/net/IDownloadCompletedWatcher.java new file mode 100644 index 00000000..b28f3c55 --- /dev/null +++ b/voxellib/src/main/java/com/voxelmodpack/common/net/IDownloadCompletedWatcher.java @@ -0,0 +1,25 @@ +package com.voxelmodpack.common.net; + +import java.io.File; + +/** + * Interface for objects which want a callback on the success/failure of file + * downloads + * + * @author Adam Mummery-Smith + */ +public interface IDownloadCompletedWatcher { + /** + * Called if the download succeeds + * + * @param destFile + */ + public abstract void onSuccess(File destFile); + + /** + * Called if the download fails + * + * @param destFile + */ + public abstract void onFailure(File destFile); +} diff --git a/voxellib/src/main/java/com/voxelmodpack/common/net/IDownloadProgressWatcher.java b/voxellib/src/main/java/com/voxelmodpack/common/net/IDownloadProgressWatcher.java new file mode 100644 index 00000000..5639a0bc --- /dev/null +++ b/voxellib/src/main/java/com/voxelmodpack/common/net/IDownloadProgressWatcher.java @@ -0,0 +1,34 @@ +package com.voxelmodpack.common.net; + +/** + * Interface for objects which want a callback to monitor the progress of file + * downloads + * + * @author Adam Mummery-Smith + */ +public interface IDownloadProgressWatcher { + /** + * @param message + */ + public abstract void setMessage(String message); + + /** + * @param message + */ + public abstract void resetProgressAndMessage(String message); + + /** + * @param message + */ + public abstract void resetProgressAndWorkingMessage(String message); + + /** + * @param progress + */ + public abstract void setProgress(int progress); + + /** + * + */ + public abstract void onCompleted(); +} diff --git a/voxellib/src/main/java/com/voxelmodpack/common/net/upload/IUploadCompleteCallback.java b/voxellib/src/main/java/com/voxelmodpack/common/net/upload/IUploadCompleteCallback.java new file mode 100644 index 00000000..7601f36d --- /dev/null +++ b/voxellib/src/main/java/com/voxelmodpack/common/net/upload/IUploadCompleteCallback.java @@ -0,0 +1,5 @@ +package com.voxelmodpack.common.net.upload; + +public interface IUploadCompleteCallback { + public abstract void onUploadComplete(String response); +} diff --git a/voxellib/src/main/java/com/voxelmodpack/common/net/upload/ThreadMultipartPostUpload.java b/voxellib/src/main/java/com/voxelmodpack/common/net/upload/ThreadMultipartPostUpload.java new file mode 100644 index 00000000..c81fcfd8 --- /dev/null +++ b/voxellib/src/main/java/com/voxelmodpack/common/net/upload/ThreadMultipartPostUpload.java @@ -0,0 +1,180 @@ +package com.voxelmodpack.common.net.upload; + +import java.io.BufferedReader; +import java.io.DataOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.net.HttpURLConnection; +import java.net.URL; +import java.util.Map; +import java.util.Map.Entry; + +/** + * Uploader for Multipart form data + * + * @author Adam Mummery-Smith + */ +public class ThreadMultipartPostUpload extends Thread { + protected final Map sourceData; + + protected final String method; + + protected final String authorization; + + protected final String urlString; + + protected final IUploadCompleteCallback callback; + + protected HttpURLConnection httpClient; + + protected static final String CRLF = "\r\n"; + + protected static final String twoHyphens = "--"; + + protected static final String boundary = "----------AaB03x"; + + public String response; + + public int httpResponseCode; + + public String httpResponse; + + public ThreadMultipartPostUpload(String method, String url, Map sourceData, String authorization, + IUploadCompleteCallback callback) { + this.method = method; + this.urlString = url; + this.sourceData = sourceData; + this.authorization = authorization; + this.callback = callback; + } + + public ThreadMultipartPostUpload(String url, Map sourceData, IUploadCompleteCallback callback) { + this("POST", url, sourceData, null, callback); + } + + public String getResponse() { + return this.response == null ? "" : this.response.trim(); + } + + @Override + public void run() { + try { + this.uploadMultipart(); + } catch (IOException ex) { + ex.printStackTrace(); + + try { + this.httpResponseCode = this.httpClient.getResponseCode(); + this.httpResponse = this.httpClient.getResponseMessage(); + } catch (Exception ex1) {} + } + + this.callback.onUploadComplete(this.getResponse()); + } + + protected void uploadMultipart() throws IOException { + // open a URL connection + URL url = new URL(this.urlString); + + // Open a HTTP connection to the URL + this.httpClient = (HttpURLConnection) url.openConnection(); + this.httpClient.setDoOutput(true); + this.httpClient.setUseCaches(false); + + this.httpClient.setRequestMethod(this.method); + this.httpClient.setRequestProperty("Connection", "Close"); + this.httpClient.addRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)"); // For + // CloudFlare + + if (this.sourceData.size() > 0) { + this.httpClient.setRequestProperty("Content-Type", + "multipart/form-data, boundary=" + ThreadMultipartPostUpload.boundary); + } + + if (this.authorization != null) { + this.httpClient.addRequestProperty("Authorization", this.authorization); + } + + DataOutputStream outputStream = new DataOutputStream(this.httpClient.getOutputStream()); + + for (Entry data : this.sourceData.entrySet()) { + outputStream.writeBytes(ThreadMultipartPostUpload.twoHyphens + ThreadMultipartPostUpload.boundary + + ThreadMultipartPostUpload.CRLF); + + String paramName = data.getKey(); + Object paramData = data.getValue(); + + if (paramData instanceof File) { + File uploadFile = (File) paramData; + outputStream.writeBytes( + "Content-Disposition: form-data; name=\"" + paramName + "\"; filename=\"" + uploadFile.getName() + + "\"" + ThreadMultipartPostUpload.CRLF + ThreadMultipartPostUpload.CRLF); + this.writeFile(uploadFile, outputStream); + } else { + outputStream.writeBytes("Content-Disposition: form-data; name=\"" + paramName + "\"" + + ThreadMultipartPostUpload.CRLF + ThreadMultipartPostUpload.CRLF); + outputStream.writeBytes(paramData.toString()); + } + + outputStream.writeBytes(ThreadMultipartPostUpload.CRLF); + } + + outputStream.writeBytes(ThreadMultipartPostUpload.twoHyphens + ThreadMultipartPostUpload.boundary + + ThreadMultipartPostUpload.twoHyphens + ThreadMultipartPostUpload.CRLF); + outputStream.flush(); + + InputStream httpStream = this.httpClient.getInputStream(); + + try { + StringBuilder readString = new StringBuilder(); + BufferedReader reader = new BufferedReader(new InputStreamReader(httpStream)); + + String readLine; + while ((readLine = reader.readLine()) != null) { + readString.append(readLine).append("\n"); + } + + reader.close(); + this.response = readString.toString(); + } catch (IOException ex) { + ex.printStackTrace(); + } + + outputStream.close(); + + this.httpResponseCode = this.httpClient.getResponseCode(); + this.httpResponse = this.httpClient.getResponseMessage(); + } + + /** + * @param sourceFile + * @param outputStream + * @throws FileNotFoundException + * @throws IOException + */ + public void writeFile(File sourceFile, DataOutputStream outputStream) throws FileNotFoundException, IOException { + int bytesRead, bufferSize; + int maxBufferSize = 1 * 1024 * 1024; + + FileInputStream fileInputStream = new FileInputStream(sourceFile); + + int bytesAvailable = fileInputStream.available(); + bufferSize = Math.min(bytesAvailable, maxBufferSize); + byte[] buffer = new byte[bufferSize]; + + bytesRead = fileInputStream.read(buffer, 0, bufferSize); + + while (bytesRead > 0) { + outputStream.write(buffer, 0, bufferSize); + bytesAvailable = fileInputStream.available(); + bufferSize = Math.min(bytesAvailable, maxBufferSize); + bytesRead = fileInputStream.read(buffer, 0, bufferSize); + } + + fileInputStream.close(); + } +} diff --git a/voxellib/src/main/java/com/voxelmodpack/common/net/upload/awt/IOpenFileCallback.java b/voxellib/src/main/java/com/voxelmodpack/common/net/upload/awt/IOpenFileCallback.java new file mode 100644 index 00000000..62d270db --- /dev/null +++ b/voxellib/src/main/java/com/voxelmodpack/common/net/upload/awt/IOpenFileCallback.java @@ -0,0 +1,20 @@ +package com.voxelmodpack.common.net.upload.awt; + +import javax.swing.JFileChooser; + +/** + * Interface for objects which can receive a callback from ThreadOpenFile + * + * @author Adam Mummery-Smith + */ +public interface IOpenFileCallback { + + /** + * Callback method called when the "open file" dialog is closed + * + * @param fileDialog + * @param dialogResult + */ + public abstract void onFileOpenDialogClosed(JFileChooser fileDialog, int dialogResult); + +} \ No newline at end of file diff --git a/voxellib/src/main/java/com/voxelmodpack/common/net/upload/awt/ThreadOpenFile.java b/voxellib/src/main/java/com/voxelmodpack/common/net/upload/awt/ThreadOpenFile.java new file mode 100644 index 00000000..2c567b65 --- /dev/null +++ b/voxellib/src/main/java/com/voxelmodpack/common/net/upload/awt/ThreadOpenFile.java @@ -0,0 +1,59 @@ +package com.voxelmodpack.common.net.upload.awt; + +import java.awt.Frame; + +import javax.swing.JFileChooser; +import javax.swing.filechooser.FileFilter; + +import net.minecraft.client.Minecraft; + +/** + * Base class for "open file" dialog threads + * + * @author Adam Mummery-Smith + */ +public abstract class ThreadOpenFile extends Thread { + /** + * Minecraft's AWT parent frame + */ + protected Frame parentFrame; + + protected String dialogTitle; + + /** + * Delegate to call back when the dialog box is closed + */ + protected final IOpenFileCallback parentScreen; + + /** + * @param minecraft + * @param callback + */ + protected ThreadOpenFile(Minecraft minecraft, String dialogTitle, IOpenFileCallback callback) + throws IllegalStateException { + if (minecraft.isFullScreen()) { + throw new IllegalStateException("Cannot open an awt window whilst minecraft is in full screen mode!"); + } + + this.parentScreen = callback; + this.dialogTitle = dialogTitle; + } + + @Override + public void run() { + JFileChooser fileDialog = new JFileChooser(); + fileDialog.setDialogTitle(this.dialogTitle); + fileDialog.setFileFilter(this.getFileFilter()); + + int dialogResult = fileDialog.showOpenDialog(this.parentFrame); + + this.parentScreen.onFileOpenDialogClosed(fileDialog, dialogResult); + } + + /** + * Subclasses should override this to return a file filter + * + * @return + */ + protected abstract FileFilter getFileFilter(); +} \ No newline at end of file diff --git a/voxellib/src/main/java/com/voxelmodpack/common/net/upload/awt/ThreadOpenFilePNG.java b/voxellib/src/main/java/com/voxelmodpack/common/net/upload/awt/ThreadOpenFilePNG.java new file mode 100644 index 00000000..3e9c5fd6 --- /dev/null +++ b/voxellib/src/main/java/com/voxelmodpack/common/net/upload/awt/ThreadOpenFilePNG.java @@ -0,0 +1,43 @@ +package com.voxelmodpack.common.net.upload.awt; + +import java.io.File; + +import javax.swing.filechooser.FileFilter; + +import net.minecraft.client.Minecraft; + +/** + * Opens an awt "Open File" dialog with a PNG file filter + * + * @author Adam Mummery-Smith + */ +public class ThreadOpenFilePNG extends ThreadOpenFile { + /** + * @param minecraft + * @param dialogTitle + * @param callback + * @throws IllegalStateException + */ + public ThreadOpenFilePNG(Minecraft minecraft, String dialogTitle, IOpenFileCallback callback) + throws IllegalStateException { + super(minecraft, dialogTitle, callback); + } + + /** + * @return + */ + @Override + protected FileFilter getFileFilter() { + return new FileFilter() { + @Override + public String getDescription() { + return "PNG Files (*.png)"; + } + + @Override + public boolean accept(File f) { + return f.isDirectory() || f.getName().toLowerCase().endsWith(".png"); + } + }; + } +} diff --git a/voxellib/src/main/java/com/voxelmodpack/common/properties/ModConfig.java b/voxellib/src/main/java/com/voxelmodpack/common/properties/ModConfig.java new file mode 100644 index 00000000..12763a6e --- /dev/null +++ b/voxellib/src/main/java/com/voxelmodpack/common/properties/ModConfig.java @@ -0,0 +1,250 @@ +package com.voxelmodpack.common.properties; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileWriter; +import java.util.Properties; + +import com.mumfrey.liteloader.core.LiteLoader; +import com.mumfrey.liteloader.util.log.LiteLoaderLogger; +import com.voxelmodpack.common.properties.interfaces.IVoxelPropertyProviderBoolean; +import com.voxelmodpack.common.properties.interfaces.IVoxelPropertyProviderFloat; +import com.voxelmodpack.common.properties.interfaces.IVoxelPropertyProviderInteger; + +/** + * Configuration file for VoxelMods + */ +public abstract class ModConfig + implements IVoxelPropertyProviderFloat, IVoxelPropertyProviderInteger, IVoxelPropertyProviderBoolean { + /** + * Set of default properties Set these in setDefaults + */ + protected final Properties defaults = new Properties(); + + /** + * The runtime configuration + */ + protected Properties config; + + /** + * name of the mod that this belongs to + */ + protected final String modName; + + /** + * String path to the config file + */ + protected final String propertiesFileName; + + /** + * File that the configuration is held in + */ + protected File propertiesFile; + + /** + * @param modName Name of the mod that this will belong to + * @param propertiesFileName string path to the file that this uses + */ + public ModConfig(String modName, String propertiesFileName) { + this.modName = modName; + this.propertiesFileName = propertiesFileName; + this.setDefaults(); + LiteLoaderLogger.info("%s> Attempting to load/create the configuration.", this.modName); + this.loadConfig(); + } + + /** + * Use this to set the defaults in a config + */ + protected abstract void setDefaults(); + + /** + * Attemps to load the saved config file If the file cannot load the + * defaults are used If the file does not exist one is created with the + * defaults saved to it + */ + protected void loadConfig() { + this.config = new Properties(this.defaults); + + try { + this.propertiesFile = new File(LiteLoader.getCommonConfigFolder(), this.propertiesFileName); + + if (this.propertiesFile.exists()) { + LiteLoaderLogger.info("%s> Config file found, loading...", this.modName); + this.config.load(new FileInputStream(this.propertiesFile)); + } else { + LiteLoaderLogger.info("%s> No config file found, creating...", this.modName); + this.createConfig(); + } + } catch (Exception ex) { + LiteLoaderLogger.warning("%s> ERROR: %s", this.modName, ex.toString()); + } + } + + /** + * Create the config Only used to generate a new config file + */ + protected void createConfig() { + try { + this.config.putAll(this.defaults); + this.config.store(new FileWriter(this.propertiesFile), null); + } catch (Exception ex) { + LiteLoaderLogger.warning("%s> ERROR: %s", this.modName, ex.toString()); + } + } + + /** + * Set the given property to a float + * + * @param propertyName The property to change + * @param s The float value to set it to + */ + @Override + public void setProperty(String propertyName, float value) { + this.config.setProperty(propertyName, String.valueOf(value)); + this.saveConfig(); + } + + /** + * Set the given property to a int + * + * @param propertyName The property to change + * @param s The int value to set it to + */ + @Override + public void setProperty(String propertyName, int value) { + this.config.setProperty(propertyName, String.valueOf(value)); + this.saveConfig(); + } + + /** + * Set the given property to a boolean + * + * @param propertyName The property to change + * @param s The boolean value to set it to + */ + @Override + public void setProperty(String propertyName, boolean value) { + this.config.setProperty(propertyName, String.valueOf(value)); + this.saveConfig(); + } + + /** + * Set the given property to a string + * + * @param propertyName The property to change + * @param value The String to set it to + */ + public void setProperty(String propertyName, String value) { + this.config.setProperty(propertyName, value); + this.saveConfig(); + } + + /** + * @param propertyName The property that gets it's value returned + * @return A string value of the given property + */ + @Override + public String getStringProperty(String propertyName) { + return this.config.getProperty(propertyName); + } + + /** + * @param propertyName The property that gets it's value returned + * @return A float value of the given property + */ + @Override + public float getFloatProperty(String propertyName) { + return Float.parseFloat(this.config.getProperty(propertyName)); + } + + /** + * @param propertyName Name of the Property to get + * @param min the minimum that the property can be + * @param max the maximum that the property can be + * @return a float representation of the property that is within the min and + * max + */ + public float getClampedFloatProperty(String propertyName, float min, float max) { + float value = this.getFloatProperty(propertyName); + return Math.min(Math.max(value, min), max); + } + + /** + * @param propertyName The property that gets it's value returned + * @return A int value of the given property + */ + @Override + public int getIntProperty(String propertyName) { + return Integer.parseInt(this.config.getProperty(propertyName)); + } + + /** + * @param propertyName The property that gets it's value returned + * @return A boolean value of the given property + */ + @Override + public boolean getBoolProperty(String propertyName) { + return Boolean.parseBoolean(this.config.getProperty(propertyName)); + } + + /** + * @param propertyName The property that gets it's value returned + * @return A int value of the default for the given property + */ + @Override + public String getDefaultPropertyValue(String propertyName) { + return this.defaults.getProperty(propertyName); + } + + /** + * @param propertyName The property that gets it's value returned + * @return A float value of the default for the given property + */ + public float getDefaultFloatProperty(String propertyName) { + return Float.parseFloat(this.defaults.getProperty(propertyName)); + } + + /** + * @param propertyName The property that gets it's value returned + * @return A int value of the default for the given property + */ + public int getDefaultIntProperty(String propertyName) { + return Integer.parseInt(this.defaults.getProperty(propertyName)); + } + + /** + * @param propertyName The property that gets it's value returned + * @return A boolean value of the default for the given property + */ + public boolean getDefaultBoolProperty(String propertyName) { + return Boolean.parseBoolean(this.defaults.getProperty(propertyName)); + } + + /** + * Saves the configuration to file + */ + public void saveConfig() { + try { + this.config.store(new FileWriter(this.propertiesFile), null); + } catch (Exception e) { + LiteLoaderLogger.warning("%s> ERROR: %s", this.modName, e.toString()); + } + } + + /** + * Swaps the state of a boolean option + */ + @Override + public void toggleOption(String propertyName) { + this.setProperty(propertyName, !this.getBoolProperty(propertyName)); + } + + /** + * + */ + @Override + public String getOptionDisplayString(String propertyName) { + return ""; + } +} diff --git a/voxellib/src/main/java/com/voxelmodpack/common/properties/VoxelProperty.java b/voxellib/src/main/java/com/voxelmodpack/common/properties/VoxelProperty.java new file mode 100644 index 00000000..ef813196 --- /dev/null +++ b/voxellib/src/main/java/com/voxelmodpack/common/properties/VoxelProperty.java @@ -0,0 +1,177 @@ +package com.voxelmodpack.common.properties; + +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.gui.Gui; +import net.minecraft.util.ResourceLocation; + +import com.voxelmodpack.common.gui.interfaces.IExtendedGui; +import com.voxelmodpack.common.properties.interfaces.IVoxelPropertyProvider; + +/** + * Property superclass + * + * @author Adam Mummery-Smith + */ +public abstract class VoxelProperty extends Gui { + /** + * Font renderer reference + */ + protected FontRenderer fontRenderer; + + /** + * Underlying property provider for this property + */ + protected PropertyType propertyProvider; + + /** + * Name of the property this control is bound to + */ + protected String propertyBinding; + + /** + * Minecraft reference + */ + protected Minecraft mc = Minecraft.getMinecraft(); + + /** + * Display text (if any) for this property + */ + protected String displayText; + + /** + * X position + */ + protected int xPosition; + + /** + * Y position + */ + protected int yPosition; + + /** + * Cursor flash counter + */ + protected int cursorCounter; + + /** + * True if this control is has focus + */ + protected boolean focused; + + /** + * True if this control is visible + */ + protected boolean visible = true; + + /** + * @param propertyProvider + * @param binding + * @param displayText + * @param xPos + * @param yPos + */ + @SuppressWarnings("unchecked") + public VoxelProperty(IVoxelPropertyProvider propertyProvider, String binding, String displayText, int xPos, + int yPos) { + try { + this.propertyProvider = (PropertyType) propertyProvider; + } catch (ClassCastException ex) { + throw new RuntimeException(String.format("Can't create VoxelProperty for binding %s for panel %s", binding, + propertyProvider.getClass().getSimpleName())); + } + + this.fontRenderer = this.mc.fontRendererObj; + + this.propertyBinding = binding; + this.displayText = displayText; + this.xPosition = xPos; + this.yPosition = yPos; + } + + /** + * + */ + public void updateCursorCounter() { + this.cursorCounter++; + } + + /** + * Draw this property + * + * @param host + * @param mouseX + * @param mouseY + */ + public abstract void draw(IExtendedGui host, int mouseX, int mouseY); + + /** + * Handle mouse clicks on the property + * + * @param mouseX + * @param mouseY + */ + public abstract void mouseClicked(int mouseX, int mouseY); + + /** + * Handle keystrokes + * + * @param keyChar + * @param keyCode + */ + public abstract void keyTyped(char keyChar, int keyCode); + + /** + * Called when the containing GUI is closed + */ + public void onClosed() { + // stub + } + + /** + * Get whether this property is visible + */ + public boolean isVisible() { + return this.visible; + } + + /** + * Set whether this property is visible + */ + public void setVisible(boolean visible) { + this.visible = visible; + } + + /** + * @return + */ + public boolean isFocusable() { + return false; + } + + /** + * @return + */ + public boolean isFocused() { + return false; + } + + /** + * @param focus + */ + public void setFocused(boolean focus) {} + + /** + * @param soundHandler + */ + public void playClickSound(SoundHandler soundHandler) { + soundHandler.playSound(PositionedSoundRecord.create(new ResourceLocation("gui.button.press"), 1.0F)); + } + + @Override + public void drawString(FontRenderer fontRendererIn, String text, int x, int y, int color) { + super.drawString(fontRendererIn, text, x, y, color); + } +} diff --git a/voxellib/src/main/java/com/voxelmodpack/common/properties/VoxelPropertyAbstractButton.java b/voxellib/src/main/java/com/voxelmodpack/common/properties/VoxelPropertyAbstractButton.java new file mode 100644 index 00000000..0e779a7f --- /dev/null +++ b/voxellib/src/main/java/com/voxelmodpack/common/properties/VoxelPropertyAbstractButton.java @@ -0,0 +1,69 @@ +package com.voxelmodpack.common.properties; + +import com.voxelmodpack.common.LiteModVoxelCommon; +import com.voxelmodpack.common.gui.interfaces.IExtendedGui; +import com.voxelmodpack.common.properties.interfaces.IVoxelPropertyProvider; + +public abstract class VoxelPropertyAbstractButton + extends VoxelProperty { + private int buttonOffset = 60; + private int buttonWidth = 70; + private int buttonHeight = 16; + + public VoxelPropertyAbstractButton(IVoxelPropertyProvider propertyProvider, String binding, String displayText, + int xPos, int yPos) { + this(propertyProvider, binding, displayText, xPos, yPos, 60, 70, 16); + } + + public VoxelPropertyAbstractButton(IVoxelPropertyProvider propertyProvider, String binding, String displayText, + int xPos, int yPos, int buttonOffset, int buttonWidth, int buttonHeight) { + super(propertyProvider, binding, displayText, xPos, yPos); + this.buttonOffset = buttonOffset; + this.buttonWidth = buttonWidth; + this.buttonHeight = buttonHeight; + } + + @Override + public void draw(IExtendedGui host, int mouseX, int mouseY) { + boolean overButton = this.mouseOver(mouseX, mouseY); + + int outset = overButton ? 1 : 0; + int v = overButton ? 16 : 0; + int colour = overButton ? 0xFFFFFF : 0x999999; + + drawRect(this.xPosition + this.buttonOffset + this.buttonWidth - 1, this.yPosition + this.buttonHeight, + this.xPosition + this.buttonOffset + 1, this.yPosition, 0xFF000000); + host.drawTessellatedModalBorderRect(LiteModVoxelCommon.GUIPARTS, 256, + this.xPosition + this.buttonOffset - outset, this.yPosition - 1 - outset, + this.xPosition + this.buttonOffset + this.buttonWidth + outset, + this.yPosition + 1 + this.buttonHeight + outset, 0, v, 16, v + 16, 4); + + this.drawString(this.fontRenderer, this.displayText, + (this.xPosition + this.buttonOffset + (this.buttonWidth / 2)) + - (this.fontRenderer.getStringWidth(this.displayText) / 2), + this.yPosition + 4, colour); + } + + @Override + public void mouseClicked(int mouseX, int mouseY) { + if (this.mouseOver(mouseX, mouseY)) { + this.onClick(); + } + } + + protected abstract void onClick(); + + /** + * @param mouseX + * @param mouseY + * @return + */ + public boolean mouseOver(int mouseX, int mouseY) { + return mouseX > this.xPosition + this.buttonOffset + && mouseX < this.xPosition + this.buttonOffset + this.buttonWidth && mouseY >= this.yPosition + && mouseY <= this.yPosition + this.buttonHeight; + } + + @Override + public void keyTyped(char keyChar, int keyCode) {} +} diff --git a/voxellib/src/main/java/com/voxelmodpack/common/properties/VoxelPropertyAbstractTextField.java b/voxellib/src/main/java/com/voxelmodpack/common/properties/VoxelPropertyAbstractTextField.java new file mode 100644 index 00000000..281e2b27 --- /dev/null +++ b/voxellib/src/main/java/com/voxelmodpack/common/properties/VoxelPropertyAbstractTextField.java @@ -0,0 +1,148 @@ +package com.voxelmodpack.common.properties; + +import org.lwjgl.input.Keyboard; + +import com.voxelmodpack.common.gui.interfaces.IExtendedGui; +import com.voxelmodpack.common.properties.interfaces.IVoxelPropertyProvider; + +/** + * Adapted from xTiming's text field code + * + * @author Adam Mummery-Smith + */ +public abstract class VoxelPropertyAbstractTextField + extends VoxelProperty { + protected String allowedCharacters = "0123456789"; + protected String fieldValue = "0"; + protected String defaultFieldValue = "0"; + protected int fieldOffset = 74; + protected int fieldWidth = 52; + protected int fieldHeight = 16; + + public VoxelPropertyAbstractTextField(IVoxelPropertyProvider propertyProvider, String binding, String displayText, + int xPos, int yPos, int fieldOffset) { + super(propertyProvider, binding, displayText, xPos, yPos); + + this.fieldValue = this.propertyProvider.getStringProperty(binding); + this.defaultFieldValue = this.propertyProvider.getDefaultPropertyValue(this.propertyBinding); + this.fieldOffset = fieldOffset; + } + + /** + * @param mouseX + * @param mouseY + * @param fieldValue + * @param focused + * @param field_146128_h + * @param field_146129_i + * @return + */ + @Override + public void draw(IExtendedGui host, int mouseX, int mouseY) { + drawRect(this.xPosition + this.fieldOffset + this.fieldWidth, this.yPosition + this.fieldHeight, + this.xPosition + this.fieldOffset, this.yPosition - 1, this.focused ? 0xFFFFFFFF : 0xFF999999); + drawRect(this.xPosition + this.fieldOffset + this.fieldWidth - 1, this.yPosition + this.fieldHeight - 1, + this.xPosition + this.fieldOffset + 1, this.yPosition, 0xFF000000); + + boolean optionCursor = this.focused && (this.cursorCounter / 6) % 2 == 0; + this.drawString(this.fontRenderer, this.displayText, this.xPosition, this.yPosition + 4, 0xFFFFFF); + this.drawString(this.fontRenderer, this.fieldValue + (optionCursor ? "_" : ""), + this.fieldValue.length() > 0 + ? (this.xPosition + this.fieldOffset + (this.fieldWidth / 2)) + - (this.fontRenderer.getStringWidth(this.fieldValue) / 2) + : this.xPosition + this.fieldOffset + (this.fieldWidth / 2) - 3, + this.yPosition + 4, 0xFFFFFF); + } + + /** + * @param keyChar + * @param keyCode + */ + @Override + public void keyTyped(char keyChar, int keyCode) { + if (this.focused) { + if (keyCode == Keyboard.KEY_RETURN || keyCode == Keyboard.KEY_NUMPADENTER || keyCode == Keyboard.KEY_ESCAPE) + this.onLostFocus(); + + if (keyCode == Keyboard.KEY_BACK && this.fieldValue.length() > 0) + this.fieldValue = this.fieldValue.substring(0, this.fieldValue.length() - 1); + + if (keyCode == Keyboard.KEY_PERIOD && this.allowedCharacters.indexOf('.') >= 0) { + if (this.fieldValue.indexOf(keyChar) >= 0) + return; + if (this.fieldValue.length() == 0) + this.fieldValue += "0"; + } + + if (this.allowedCharacters.indexOf(keyChar) >= 0 && this.fieldValue.length() < 4) + this.fieldValue += keyChar; + + if (this.checkInvalidValue()) + this.fieldValue = this.defaultFieldValue; + } + } + + /** + * @return + */ + protected abstract boolean checkInvalidValue(); + + /** + * @param mouseX + * @param mouseY + */ + @Override + public void mouseClicked(int mouseX, int mouseY) { + boolean mouseOver = this.mouseOver(mouseX, mouseY); + + if (!this.focused && mouseOver) { + this.playClickSound(this.mc.getSoundHandler()); + this.fieldValue = this.propertyProvider.getStringProperty(this.propertyBinding); + } else if (this.focused && !mouseOver) { + this.onLostFocus(); + } + + this.focused = mouseOver; + } + + @Override + public void onClosed() { + this.onLostFocus(); + } + + protected abstract void onLostFocus(); + + /** + * @param mouseX + * @param mouseY + * @return + */ + public boolean mouseOver(int mouseX, int mouseY) { + return mouseX > this.xPosition + this.fieldOffset + && mouseX < this.xPosition + this.fieldOffset + this.fieldWidth && mouseY > this.yPosition + && mouseY < this.yPosition + 15; + } + + public void update() { + this.fieldValue = this.propertyProvider.getStringProperty(this.propertyBinding); + } + + @Override + public boolean isFocusable() { + return true; + } + + @Override + public void setFocused(boolean focus) { + if (this.focused && !focus) { + this.onLostFocus(); + } + + this.focused = focus; + } + + @Override + public boolean isFocused() { + return this.focused; + } +} \ No newline at end of file diff --git a/voxellib/src/main/java/com/voxelmodpack/common/properties/VoxelPropertyCheckBox.java b/voxellib/src/main/java/com/voxelmodpack/common/properties/VoxelPropertyCheckBox.java new file mode 100644 index 00000000..52b7e98c --- /dev/null +++ b/voxellib/src/main/java/com/voxelmodpack/common/properties/VoxelPropertyCheckBox.java @@ -0,0 +1,67 @@ +package com.voxelmodpack.common.properties; + +import com.voxelmodpack.common.LiteModVoxelCommon; +import com.voxelmodpack.common.gui.interfaces.IExtendedGui; +import com.voxelmodpack.common.properties.interfaces.IVoxelPropertyProviderBoolean; + +/** + * Adapted from xTiming's checkbox code + * + * @author Adam Mummery-Smith + */ +public class VoxelPropertyCheckBox extends VoxelPropertyToggleButton { + private int width = 11; + + private final VoxelPropertyCheckBox parent; + + public VoxelPropertyCheckBox(IVoxelPropertyProviderBoolean propertyProvider, String binding, String text, int xPos, + int yPos) { + this(propertyProvider, binding, text, xPos, yPos, null); + } + + public VoxelPropertyCheckBox(IVoxelPropertyProviderBoolean propertyProvider, String binding, String text, int xPos, + int yPos, VoxelPropertyCheckBox parent) { + super(propertyProvider, binding, text, xPos, yPos); + + this.width = this.fontRenderer.getStringWidth(this.displayText) + 20; + this.parent = parent; + } + + public VoxelPropertyCheckBox getParent() { + return this.parent; + } + + @Override + public void draw(IExtendedGui host, int mouseX, int mouseY) { + this.drawString(this.fontRenderer, this.displayText, this.xPosition + 20, this.yPosition + 2, + this.isParentChecked() ? 0xFFFFFF : 0x666666); + + boolean overButton = this.mouseOver(mouseX, mouseY); + boolean checked = this.isChecked(); + + host.drawTessellatedModalBorderRect(LiteModVoxelCommon.GUIPARTS, 256, this.xPosition, this.yPosition, + this.xPosition + 11, this.yPosition + 11, 0, overButton ? 16 : 0, 16, overButton ? 32 : 16, 4); + host.drawTexturedModalRect(LiteModVoxelCommon.GUIPARTS, this.xPosition, this.yPosition, this.xPosition + 10, + this.yPosition + 10, checked ? 12 : 0, 52, checked ? 23 : 11, 63); + } + + /** + * @return + */ + boolean isChecked() { + return this.isParentChecked() && this.propertyProvider.getBoolProperty(this.propertyBinding); + } + + /** + * @return + */ + boolean isParentChecked() { + return this.parent == null || this.parent.isChecked(); + } + + @Override + public boolean mouseOver(int mouseX, int mouseY) { + return this.isParentChecked() && mouseX > this.xPosition && mouseX < this.xPosition + this.width + && mouseY > this.yPosition && mouseY < this.yPosition + 11; + } +} diff --git a/voxellib/src/main/java/com/voxelmodpack/common/properties/VoxelPropertyFloatField.java b/voxellib/src/main/java/com/voxelmodpack/common/properties/VoxelPropertyFloatField.java new file mode 100644 index 00000000..99197454 --- /dev/null +++ b/voxellib/src/main/java/com/voxelmodpack/common/properties/VoxelPropertyFloatField.java @@ -0,0 +1,40 @@ +package com.voxelmodpack.common.properties; + +import com.voxelmodpack.common.properties.interfaces.IVoxelPropertyProvider; +import com.voxelmodpack.common.properties.interfaces.IVoxelPropertyProviderFloat; + +/** + * Adapted from xTiming's text field code + * + * @author Adam Mummery-Smith + */ +public class VoxelPropertyFloatField extends VoxelPropertyAbstractTextField { + private float minFieldValue = 0.1F; + + private float maxFieldValue = 10.0F; + + public VoxelPropertyFloatField(IVoxelPropertyProvider propertyProvider, String binding, String text, int xPos, + int yPos, int fieldOffset) { + super(propertyProvider, binding, text, xPos, yPos, fieldOffset); + this.allowedCharacters = "0123456789."; + } + + @Override + protected void onLostFocus() { + if (this.fieldValue.length() == 0) + this.fieldValue = this.propertyProvider.getDefaultPropertyValue(this.propertyBinding); + if (Float.valueOf(this.fieldValue) < this.minFieldValue) + this.fieldValue = String.valueOf(this.minFieldValue); + this.propertyProvider.setProperty(this.propertyBinding, Float.parseFloat(this.fieldValue)); + this.fieldValue = this.propertyProvider.getStringProperty(this.propertyBinding); + this.focused = false; + } + + /** + * @return + */ + @Override + protected boolean checkInvalidValue() { + return this.fieldValue.length() > 0 && Float.valueOf(this.fieldValue) > this.maxFieldValue; + } +} diff --git a/voxellib/src/main/java/com/voxelmodpack/common/properties/VoxelPropertyIntField.java b/voxellib/src/main/java/com/voxelmodpack/common/properties/VoxelPropertyIntField.java new file mode 100644 index 00000000..022a4b2d --- /dev/null +++ b/voxellib/src/main/java/com/voxelmodpack/common/properties/VoxelPropertyIntField.java @@ -0,0 +1,55 @@ +package com.voxelmodpack.common.properties; + +import com.voxelmodpack.common.properties.interfaces.IVoxelPropertyProvider; +import com.voxelmodpack.common.properties.interfaces.IVoxelPropertyProviderInteger; + +/** + * Adapted from xTiming's text field code + * + * @author Adam Mummery-Smith + */ +public class VoxelPropertyIntField extends VoxelPropertyAbstractTextField { + private int minFieldValue = 1; + + private int maxFieldValue = 60; + + public VoxelPropertyIntField(IVoxelPropertyProvider propertyProvider, String binding, String text, int xPos, + int yPos, int fieldOffset) { + super(propertyProvider, binding, text, xPos, yPos, fieldOffset); + } + + @Override + protected void onLostFocus() { + if (this.fieldValue.length() == 0) + this.fieldValue = this.propertyProvider.getDefaultPropertyValue(this.propertyBinding); + if (Integer.valueOf(this.fieldValue) < this.minFieldValue) + this.fieldValue = String.valueOf(this.minFieldValue); + this.propertyProvider.setProperty(this.propertyBinding, Integer.parseInt(this.fieldValue)); + this.fieldValue = this.propertyProvider.getStringProperty(this.propertyBinding); + this.focused = false; + } + + /** + * @return + */ + @Override + protected boolean checkInvalidValue() { + return this.fieldValue.length() > 0 && Integer.valueOf(this.fieldValue) > this.maxFieldValue; + } + + public int getMinFieldValue() { + return this.minFieldValue; + } + + public void setMinFieldValue(int minFieldValue) { + this.minFieldValue = minFieldValue; + } + + public int getMaxFieldValue() { + return this.maxFieldValue; + } + + public void setMaxFieldValue(int maxFieldValue) { + this.maxFieldValue = maxFieldValue; + } +} diff --git a/voxellib/src/main/java/com/voxelmodpack/common/properties/VoxelPropertyKeyBinding.java b/voxellib/src/main/java/com/voxelmodpack/common/properties/VoxelPropertyKeyBinding.java new file mode 100644 index 00000000..a297da7c --- /dev/null +++ b/voxellib/src/main/java/com/voxelmodpack/common/properties/VoxelPropertyKeyBinding.java @@ -0,0 +1,102 @@ +package com.voxelmodpack.common.properties; + +import org.lwjgl.input.Keyboard; + +import com.voxelmodpack.common.LiteModVoxelCommon; +import com.voxelmodpack.common.gui.interfaces.IExtendedGui; +import com.voxelmodpack.common.properties.interfaces.IVoxelPropertyProvider; +import com.voxelmodpack.common.properties.interfaces.IVoxelPropertyProviderInteger; + +/** + * Adapted from xTiming's key bind button code + * + * @author Adam Mummery-Smith + */ +public class VoxelPropertyKeyBinding extends VoxelProperty { + private int buttonOffset = 60; + private int buttonWidth = 70; + private int buttonHeight = 16; + + /** + * @param parent + * @param binding + * @param displayText + * @param xPos + * @param yPos + */ + public VoxelPropertyKeyBinding(IVoxelPropertyProvider propertyProvider, String binding, String displayText, + int xPos, int yPos) { + super(propertyProvider, binding, displayText, xPos, yPos); + } + + /** + * @param mouseX + * @param mouseY + * @param displayText + * @param keyCode + * @param bindActive + * @param field_146128_h + * @param field_146129_i + * @return + */ + @Override + public void draw(IExtendedGui host, int mouseX, int mouseY) { + boolean overKey = this.focused || this.mouseOver(mouseX, mouseY); + int outset = overKey ? 1 : 0; + int v = overKey ? 16 : 0; + int keyCode = this.propertyProvider.getIntProperty(this.propertyBinding); + + this.drawString(this.fontRenderer, this.displayText, this.xPosition, this.yPosition + 4, 0xFFFFFF); + String fKey = this.focused ? "Press a key" : Keyboard.getKeyName(keyCode); + drawRect(this.xPosition + this.buttonOffset + this.buttonWidth - 1, this.yPosition + this.buttonHeight, + this.xPosition + this.buttonOffset + 1, this.yPosition, 0xFF000000); + host.drawTessellatedModalBorderRect(LiteModVoxelCommon.GUIPARTS, 256, + this.xPosition + this.buttonOffset - outset, this.yPosition - 1 - outset, + this.xPosition + this.buttonOffset + this.buttonWidth + outset, + this.yPosition + 1 + this.buttonHeight + outset, 0, v, 16, v + 16, 4); + this.drawString(this.fontRenderer, fKey, + (this.xPosition + this.buttonOffset + (this.buttonWidth / 2)) + - (this.fontRenderer.getStringWidth(fKey) / 2), + this.yPosition + 4, overKey || this.focused ? 0xFFFFFF : 0x999999); + } + + /* + * (non-Javadoc) + * @see + * com.voxelbox.voxelflight.VoxelFlightGUI.VoxelProperty#MouseClicked(int, + * int) + */ + @Override + public void mouseClicked(int mouseX, int mouseY) { + boolean mouseOver = this.mouseOver(mouseX, mouseY); + + if (!this.focused && mouseOver) + this.playClickSound(this.mc.getSoundHandler()); + + this.focused = mouseOver; + } + + /** + * @param mouseX + * @param mouseY + * @return + */ + public boolean mouseOver(int mouseX, int mouseY) { + return mouseX > this.xPosition + this.buttonOffset + && mouseX < this.xPosition + this.buttonOffset + this.buttonWidth && mouseY >= this.yPosition + && mouseY <= this.yPosition + this.buttonHeight; + } + + /* + * (non-Javadoc) + * @see com.voxelbox.voxelflight.VoxelFlightGUI.VoxelProperty#KeyTyped(char, + * int) + */ + @Override + public void keyTyped(char keyChar, int keyCode) { + if (this.focused) { + this.propertyProvider.setProperty(this.propertyBinding, keyCode); + this.focused = false; + } + } +} diff --git a/voxellib/src/main/java/com/voxelmodpack/common/properties/VoxelPropertyLabel.java b/voxellib/src/main/java/com/voxelmodpack/common/properties/VoxelPropertyLabel.java new file mode 100644 index 00000000..064a4bab --- /dev/null +++ b/voxellib/src/main/java/com/voxelmodpack/common/properties/VoxelPropertyLabel.java @@ -0,0 +1,33 @@ +package com.voxelmodpack.common.properties; + +import com.voxelmodpack.common.gui.interfaces.IExtendedGui; +import com.voxelmodpack.common.properties.interfaces.IVoxelPropertyProvider; + +/** + * Label + * + * @author Adam Mummery-Smith + */ +public class VoxelPropertyLabel extends VoxelProperty { + private int colour = 0x99CCFF; + + public VoxelPropertyLabel(String displayText, int xPos, int yPos) { + this(displayText, xPos, yPos, 0x99CCFF); + } + + public VoxelPropertyLabel(String displayText, int xPos, int yPos, int colour) { + super(null, null, displayText, xPos, yPos); + this.colour = colour; + } + + @Override + public void draw(IExtendedGui host, int mouseX, int mouseY) { + this.drawString(this.mc.fontRendererObj, this.displayText, this.xPosition, this.yPosition, this.colour); + } + + @Override + public void mouseClicked(int mouseX, int mouseY) {} + + @Override + public void keyTyped(char keyChar, int keyCode) {} +} diff --git a/voxellib/src/main/java/com/voxelmodpack/common/properties/VoxelPropertySlider.java b/voxellib/src/main/java/com/voxelmodpack/common/properties/VoxelPropertySlider.java new file mode 100644 index 00000000..ffb36776 --- /dev/null +++ b/voxellib/src/main/java/com/voxelmodpack/common/properties/VoxelPropertySlider.java @@ -0,0 +1,279 @@ +package com.voxelmodpack.common.properties; + +import org.lwjgl.input.Mouse; + +import com.voxelmodpack.common.LiteModVoxelCommon; +import com.voxelmodpack.common.gui.interfaces.IExtendedGui; +import com.voxelmodpack.common.properties.interfaces.IVoxelPropertyProvider; +import com.voxelmodpack.common.properties.interfaces.IVoxelPropertyProviderFloat; + +/** + * Rebuilt by anangrybeaver + * + * @author anangrybeaver + */ +public class VoxelPropertySlider extends VoxelProperty { + private float value = 0; + private float valueMin = -1; + private float valueMax = 1; + private float valueShift = -1; + private float valueScale; + + private float indicatorValue = 0; + + private int sliderHeight; + private int sliderWidth; + + private int handleXPos; + private int handleXPosMin; + private int handleXPosMax; + private int handleWidth; + private int handleHeight; + + private boolean snap = false; + + private boolean indicatorShow = false; + + private String minText = "Min"; + private String maxText = "Max"; + + @SuppressWarnings("unused") + private String labelText; + + public VoxelPropertySlider(IVoxelPropertyProvider propertyProvider, String binding, String text, int xPos, int yPos, + int w, int h, float minValue, float maxValue, boolean snap) { + this(propertyProvider, binding, text, xPos, yPos, w, h, snap); + + this.valueMax = maxValue; + this.valueMin = minValue; + + if (this.valueMax < this.valueMin || this.valueMax == this.valueMin) + this.valueMax = this.valueMin + 1; + + this.valueShift = this.valueMin; + + this.value = this.propertyProvider.getFloatProperty(binding) - this.valueShift; + this.valueScale = (this.handleXPosMax - this.handleXPosMin) / (this.valueMax - this.valueMin); + + if (this.propertyProvider.getFloatProperty(binding) < this.valueMin) + this.propertyProvider.setProperty(binding, this.valueMin); + + else if (this.propertyProvider.getFloatProperty(binding) > this.valueMax) + this.propertyProvider.setProperty(binding, this.valueMax); + } + + /** + * Creates a more defined Slider with given specifications. + * + * @param parent The GUI Element, "this" + * @param binding The numeral binding to be linked to. + * @param text Name of the slider. + * @param xPos x Coordinate + * @param yPos y coordinate + * @param w Width of the slider + * @param h Height of the slider + * @param minValue minimum value of the slider + * @param maxValue max value of the slider + * @param snap If it snaps to whole numbers. + */ + public VoxelPropertySlider(IVoxelPropertyProvider propertyProvider, String binding, String text, int xPos, int yPos, + int w, int h, float minValue, float maxValue, float indicatorValue, boolean snap) { + this(propertyProvider, binding, text, xPos, yPos, w, h, indicatorValue, snap); + + this.valueMax = maxValue; + this.valueMin = minValue; + + if (this.valueMax < this.valueMin || this.valueMax == this.valueMin) + this.valueMax = this.valueMin + 1; + + this.valueShift = this.valueMin; + + this.value = this.propertyProvider.getFloatProperty(binding) - this.valueShift; + this.valueScale = (this.handleXPosMax - this.handleXPosMin) / (this.valueMax - this.valueMin); + + if (this.propertyProvider.getFloatProperty(binding) < this.valueMin) + this.propertyProvider.setProperty(binding, this.valueMin); + + else if (this.propertyProvider.getFloatProperty(binding) > this.valueMax) + this.propertyProvider.setProperty(binding, this.valueMax); + + } + + /** + * Creates a generic Slider with given specifications. + * + * @param parent The GUI Element, "this" + * @param binding The numeral binding to be linked to. + * @param text Name of the slider. + * @param xPos x Coordinate + * @param yPos y coordinate + * @param w Width of the slider + * @param h Height of the slider + * @param indicatorValue The value of a visible indicator on the slider. + * @param snap If it snaps to whole numbers. + */ + public VoxelPropertySlider(IVoxelPropertyProvider propertyProvider, String binding, String text, int xPos, int yPos, + int w, int h, float indicatorValue, boolean snap) { + this(propertyProvider, binding, text, xPos, yPos, w, h, snap); + + this.indicatorValue = indicatorValue; + this.indicatorShow = true; + } + + /** + * Creates a generic Slider with given specifications. + * + * @param parent The GUI Element, "this" + * @param binding The numeral binding to be linked to. + * @param displayText Name of the slider. + * @param xPos x Coordinate + * @param yPos y coordinate + * @param w Width of the slider + * @param h Height of the slider + * @param snap If it snaps to whole numbers. + */ + public VoxelPropertySlider(IVoxelPropertyProvider propertyProvider, String binding, String displayText, int xPos, + int yPos, int w, int h, boolean snap) { + super(propertyProvider, binding, displayText, xPos, yPos); + + this.sliderHeight = h; + this.sliderWidth = w; + + this.handleWidth = this.sliderHeight - 2; + this.handleHeight = this.sliderHeight + 4; + + this.handleXPos = this.xPosition; + this.handleXPosMin = this.xPosition + 2; + this.handleXPosMax = this.xPosition + this.sliderWidth - this.handleWidth - 2; + + this.value = this.propertyProvider.getFloatProperty(binding) - this.valueShift; + this.valueScale = (this.handleXPosMax - this.handleXPosMin) / (this.valueMax - this.valueMin); + + this.snap = snap; + } + + public VoxelPropertySlider(IVoxelPropertyProvider propertyProvider, String binding, String displayText, + String minText, String maxText, int xPos, int yPos, float min, float max) { + this(propertyProvider, binding, displayText, xPos, yPos, min, max); + + this.minText = minText; + this.maxText = maxText; + } + + public VoxelPropertySlider(IVoxelPropertyProvider propertyProvider, String binding, String displayText, int xPos, + int yPos, float min, float max) { + this(propertyProvider, binding, displayText, xPos, yPos); + + this.valueMin = min; + this.valueMax = max; + + if (this.valueMax < this.valueMin || this.valueMax == this.valueMin) + this.valueMax = this.valueMin + 1; + + this.valueShift = this.valueMin; + + this.value = this.propertyProvider.getFloatProperty(binding) - this.valueShift; + this.valueScale = (this.handleXPosMax - this.handleXPosMin) / (this.valueMax - this.valueMin); + + } + + public VoxelPropertySlider(IVoxelPropertyProvider propertyProvider, String binding, String displayText, + String minText, String maxText, int xPos, int yPos) { + this(propertyProvider, binding, displayText, xPos, yPos); + + this.minText = minText; + this.maxText = maxText; + } + + public VoxelPropertySlider(IVoxelPropertyProvider propertyProvider, String binding, String displayText, int xPos, + int yPos) { + this(propertyProvider, binding, displayText, xPos, yPos, 100, 8, false); + } + + @Override + public void draw(IExtendedGui host, int mouseX, int mouseY) { + if (Mouse.isButtonDown(0)) { + if (this.focused) { + this.moveHandle(mouseX); + } + } else { + this.focused = false; + } + + this.handleXPos = (int) (this.handleXPosMin + (this.value * this.valueScale)); + + int mintextX = this.fontRenderer.getStringWidth(this.minText); + + this.fontRenderer.drawStringWithShadow(this.displayText, this.xPosition, this.yPosition - 12, 0xFFFFFF); + this.fontRenderer.drawStringWithShadow(this.minText, this.xPosition - mintextX - 2, this.yPosition, 0xFFFFFF); + this.fontRenderer.drawStringWithShadow(this.maxText, this.xPosition + this.sliderWidth + 2, this.yPosition, + 0xFFFFFF); + + host.drawTessellatedModalBorderRect(LiteModVoxelCommon.GUIPARTS, 256, this.xPosition, this.yPosition, + this.xPosition + this.sliderWidth, this.yPosition + this.sliderHeight, 1, 114, 127, 119, 2); + + if (this.indicatorShow) + this.drawIndicator(host); + this.drawHandle(host); + } + + /** + * Draws an indicator for a value on the slider. + */ + private void drawIndicator(IExtendedGui host) { + int xPosZero = (int) (this.handleXPosMin + ((this.indicatorValue + Math.abs(this.valueMin)) * this.valueScale)); + + host.drawTessellatedModalBorderRect(LiteModVoxelCommon.GUIPARTS, 256, xPosZero - 1, this.yPosition + 1, + xPosZero + this.handleWidth + 1, this.yPosition + this.sliderHeight - 1, 1, 33, 15, 47, 3); + host.drawTessellatedModalBorderRect(LiteModVoxelCommon.GUIPARTS, 256, xPosZero, this.yPosition + 1, + xPosZero + this.handleWidth, this.yPosition + this.sliderHeight - 1, 0, 121, 128, 128, 2); + } + + /** + * Draws the handle for the slider. + */ + private void drawHandle(IExtendedGui host) { + host.drawTessellatedModalBorderRect(LiteModVoxelCommon.GUIPARTS, 256, this.handleXPos - 1, this.yPosition - 2, + this.handleXPos + this.handleWidth + 1, this.yPosition + this.handleHeight - 2, 17, 33, 31, 47, 3); + host.drawTessellatedModalBorderRect(LiteModVoxelCommon.GUIPARTS, 256, this.handleXPos, this.yPosition - 2, + this.handleXPos + this.handleWidth, this.yPosition + this.handleHeight - 2, 0, 121, 128, 128, 3); + } + + /** + * @param mouseX + * @param mouseY + * @param x1 + * @param y1 + * @param x2 + * @param y2 + */ + protected boolean mouseIn(int mouseX, int mouseY, int x1, int y1, int x2, int y2) { + return mouseX > x1 && mouseX < x2 && mouseY > y1 && mouseY < y2; + } + + @SuppressWarnings("cast") + public void moveHandle(int mouseX) { + mouseX -= (this.handleWidth / 2); + + if (mouseX < this.handleXPosMin || ((mouseX - this.handleXPosMin) / this.valueScale) < 0) + this.value = 0; + else if (mouseX > this.handleXPosMin + (this.handleXPosMax - this.handleXPosMin) + || ((mouseX - this.handleXPosMin) / this.valueScale) > (this.valueMax - this.valueMin)) + this.value = (this.valueMax - this.valueMin); + else if (this.snap) + this.value = (int) ((mouseX - this.handleXPosMin) / this.valueScale); + else + this.value = (float) ((mouseX - this.handleXPosMin) / this.valueScale); + + this.propertyProvider.setProperty(this.propertyBinding, this.value + this.valueShift); + } + + @Override + public void mouseClicked(int mouseX, int mouseY) { + this.focused = this.mouseIn(mouseX, mouseY, this.xPosition, this.yPosition, this.xPosition + this.sliderWidth, + this.yPosition + this.sliderHeight); + } + + @Override + public void keyTyped(char keyChar, int keyCode) {} +} diff --git a/voxellib/src/main/java/com/voxelmodpack/common/properties/VoxelPropertySliderOld.java b/voxellib/src/main/java/com/voxelmodpack/common/properties/VoxelPropertySliderOld.java new file mode 100644 index 00000000..18e9425f --- /dev/null +++ b/voxellib/src/main/java/com/voxelmodpack/common/properties/VoxelPropertySliderOld.java @@ -0,0 +1,188 @@ +package com.voxelmodpack.common.properties; + +import net.minecraft.util.MathHelper; + +import org.lwjgl.input.Mouse; + +import com.voxelmodpack.common.LiteModVoxelCommon; +import com.voxelmodpack.common.gui.interfaces.IExtendedGui; +import com.voxelmodpack.common.properties.interfaces.IVoxelPropertyProvider; +import com.voxelmodpack.common.properties.interfaces.IVoxelPropertyProviderFloat; + +/** + * @author xTiming + */ +public class VoxelPropertySliderOld extends VoxelProperty { + float minValue = -1.0F; + + float maxValue = 1.0F; + + float value = 0F; + + boolean overReset = false; + boolean overSlide = false; + boolean overBar = false; + boolean setBar = false; + boolean dragging = false; + + int offset = 0; + + String minText = "Min"; + String maxText = "Max"; + + String labelText; + + public VoxelPropertySliderOld(IVoxelPropertyProvider propertyProvider, String binding, String displayText, + String minText, String maxText, int xPos, int yPos, float min, float max) { + this(propertyProvider, binding, displayText, minText, maxText, xPos, yPos); + this.minValue = min; + this.maxValue = max; + } + + public VoxelPropertySliderOld(IVoxelPropertyProvider propertyProvider, String binding, String displayText, int xPos, + int yPos, float min, float max) { + this(propertyProvider, binding, displayText, xPos, yPos); + } + + public VoxelPropertySliderOld(IVoxelPropertyProvider propertyProvider, String binding, String displayText, + String minText, String maxText, int xPos, int yPos) { + this(propertyProvider, binding, displayText, xPos, yPos); + + this.minText = minText; + this.maxText = maxText; + } + + public VoxelPropertySliderOld(IVoxelPropertyProvider propertyProvider, String binding, String displayText, int xPos, + int yPos) { + super(propertyProvider, binding, displayText, xPos, yPos); + } + + @Override + public void draw(IExtendedGui host, int mouseX, int mouseY) { + if (this.displayText != null) { + this.drawString(this.mc.fontRendererObj, this.displayText, this.xPosition + 18, this.yPosition, 0x99CCFF); + } + + this.drawString(this.mc.fontRendererObj, this.minText, this.xPosition + 30, this.yPosition + 15, 0xFFFFFF); + + if (this.maxText != null) { + this.drawString(this.mc.fontRendererObj, this.maxText, this.xPosition + 130, this.yPosition + 15, 0xFFFFFF); + } else { + float scale = (this.value + 1.0F) / 2.0F; + int displayValue = MathHelper + .ceiling_float_int((this.minValue + ((this.maxValue - this.minValue) * scale)) * 100F); + + this.drawString(this.mc.fontRendererObj, displayValue + "%", this.xPosition + 130, this.yPosition + 15, + 0xFFFFFF); + } + + this.overReset = this.mouseOverReset(mouseX, mouseY); + + int outset = this.overReset ? 1 : 0; + int v = this.overReset ? 16 : 0; + + drawRect(this.xPosition + 160 - outset, this.yPosition + 11 - outset, this.xPosition + 212 + outset, + this.yPosition + 26 + outset, 0xFF000000); + host.drawTessellatedModalBorderRect(LiteModVoxelCommon.GUIPARTS, 256, this.xPosition + 159 - outset, + this.yPosition + 10 - outset, this.xPosition + 213 + outset, this.yPosition + 27 + outset, 0, v, 16, + 16 + v, 4); + this.drawString(this.mc.fontRendererObj, "Default", this.xPosition + 169, this.yPosition + 15, + this.overReset ? 0xFFFFFF : 0x999999); + + int sliderLeft = this.xPosition + 48; + int sliderRight = this.xPosition + 124; + int sliderXPos = sliderLeft + 32; + int sliderXPos2 = sliderLeft + 45; + int sliderYPos = this.yPosition + 12; + int sliderYPos2 = this.yPosition + 25; + int sliderMinX = sliderLeft - ((sliderXPos + sliderXPos2) / 2) + 5; + int sliderMaxX = sliderRight - ((sliderXPos + sliderXPos2) / 2) - 5; + + this.drawHorizontalLine(sliderLeft, sliderRight, this.yPosition + 18, 0xFF999999); + this.drawVerticalLine(this.xPosition + 86, this.yPosition + 14, this.yPosition + 22, 0xFF999999); + this.drawVerticalLine(sliderLeft, this.yPosition + 14, this.yPosition + 22, 0xFF999999); + this.drawVerticalLine(sliderRight, this.yPosition + 14, this.yPosition + 22, 0xFF999999); + + this.overSlide = this.mouseIn(mouseX, mouseY, sliderXPos, sliderYPos, sliderXPos2, sliderYPos2); + this.overBar = this.mouseIn(mouseX, mouseY, sliderLeft, sliderYPos, sliderRight, sliderYPos2) + && !this.overSlide; + + if (this.dragging) { + if (Mouse.isButtonDown(0)) { + this.offset = Math.min(Math.max(mouseX - (sliderXPos + sliderXPos2) / 2, sliderMinX), sliderMaxX); + this.value = ((float) this.offset / (float) sliderMaxX); + } else { + this.value = ((float) this.offset / (float) sliderMaxX); + this.propertyProvider.setProperty(this.propertyBinding, this.value); + this.dragging = false; + } + } else { + this.offset = (int) ((this.propertyProvider.getFloatProperty(this.propertyBinding)) * sliderMaxX); + this.value = ((float) this.offset / (float) sliderMaxX); + } + + if (this.setBar) { + this.offset = mouseX - (sliderXPos + sliderXPos2) / 2; + this.value = ((float) this.offset / (float) sliderMaxX); + this.propertyProvider.setProperty(this.propertyBinding, this.value); + this.setBar = false; + this.dragging = true; + } + + if (this.offset > sliderMaxX) + this.offset = sliderMaxX; + if (this.offset < sliderMinX) + this.offset = sliderMinX; + + drawRect(sliderXPos2 - 1 + this.offset, sliderYPos2 - 1, sliderXPos + 1 + this.offset, sliderYPos + 1, + 0xFF000000); + host.drawTessellatedModalBorderRect(LiteModVoxelCommon.GUIPARTS, 256, (sliderXPos + this.offset), sliderYPos, + (sliderXPos2 + this.offset), sliderYPos2, 0, (this.overSlide || this.dragging) ? 16 : 0, 16, + (this.overSlide || this.dragging) ? 32 : 16, 4); + } + + /** + * @param mouseX + * @param mouseY + * @param x1 + * @param y1 + * @param x2 + * @param y2 + */ + protected boolean mouseIn(int mouseX, int mouseY, int x1, int y1, int x2, int y2) { + return mouseX > x1 + this.offset && mouseX < x2 + this.offset && mouseY > y1 && mouseY < y2; + } + + /** + * @param mouseX + * @param mouseY + * @return + */ + protected boolean mouseOverReset(int mouseX, int mouseY) { + return mouseX > this.xPosition + 159 && mouseX < this.xPosition + 213 && mouseY > this.yPosition + 10 + && mouseY < this.yPosition + 27; + } + + @Override + public void mouseClicked(int mouseX, int mouseY) { + if (this.overSlide) { + this.dragging = true; + this.playClickSound(this.mc.getSoundHandler()); + return; + } + + if (this.overBar) { + this.setBar = true; + this.playClickSound(this.mc.getSoundHandler()); + return; + } + + if (this.overReset) { + this.propertyProvider.setProperty(this.propertyBinding, 0.0F); + this.playClickSound(this.mc.getSoundHandler()); + } + } + + @Override + public void keyTyped(char keyChar, int keyCode) {} +} diff --git a/voxellib/src/main/java/com/voxelmodpack/common/properties/VoxelPropertyToggleButton.java b/voxellib/src/main/java/com/voxelmodpack/common/properties/VoxelPropertyToggleButton.java new file mode 100644 index 00000000..92861a57 --- /dev/null +++ b/voxellib/src/main/java/com/voxelmodpack/common/properties/VoxelPropertyToggleButton.java @@ -0,0 +1,104 @@ +package com.voxelmodpack.common.properties; + +import com.voxelmodpack.common.LiteModVoxelCommon; +import com.voxelmodpack.common.gui.interfaces.IExtendedGui; +import com.voxelmodpack.common.properties.interfaces.IVoxelPropertyProviderBoolean; + +/** + * Adapted from xTiming's button code + * + * @author Adam Mummery-Smith + */ +public class VoxelPropertyToggleButton extends VoxelProperty { + private int buttonOffset = 60; + private int buttonWidth = 70; + private int buttonHeight = 16; + + private String status; + + /** + * @param propertyProvider + * @param binding + * @param displayText + * @param xPos + * @param yPos + */ + public VoxelPropertyToggleButton(IVoxelPropertyProviderBoolean propertyProvider, String binding, String displayText, + int xPos, int yPos) { + this(propertyProvider, binding, displayText, xPos, yPos, 60, 70, 16); + } + + /** + * @param propertyProvider + * @param binding + * @param displayText + * @param xPos + * @param yPos + * @param buttonOffset + * @param buttonWidth + * @param buttonHeight + */ + public VoxelPropertyToggleButton(IVoxelPropertyProviderBoolean propertyProvider, String binding, String displayText, + int xPos, int yPos, int buttonOffset, int buttonWidth, int buttonHeight) { + super(propertyProvider, binding, displayText, xPos, yPos); + this.buttonOffset = buttonOffset; + this.buttonWidth = buttonWidth; + this.buttonHeight = buttonHeight; + this.status = this.propertyProvider.getOptionDisplayString(this.propertyBinding); + } + + /* + * (non-Javadoc) + * @see + * com.voxelmodpack.common.properties.VoxelProperty#draw(com.voxelmodpack. + * common.gui.IExtendedGui, int, int) + */ + @Override + public void draw(IExtendedGui host, int mouseX, int mouseY) { + boolean overButton = this.mouseOver(mouseX, mouseY); + int outset = overButton ? 1 : 0; + int v = overButton ? 16 : 0; + int colour = overButton ? 0xFFFFFF : 0x999999; + + this.drawString(this.fontRenderer, this.displayText, this.xPosition, this.yPosition + 4, 0xFFFFFF); + drawRect(this.xPosition + this.buttonOffset + this.buttonWidth - 1, this.yPosition + this.buttonHeight, + this.xPosition + this.buttonOffset + 1, this.yPosition, 0xFF000000); + host.drawTessellatedModalBorderRect(LiteModVoxelCommon.GUIPARTS, 256, + this.xPosition + this.buttonOffset - outset, this.yPosition - outset, + this.xPosition + this.buttonOffset + this.buttonWidth + outset, + this.yPosition + this.buttonHeight + outset, 0, v, 16, v + 16, 4); + this.drawString(this.fontRenderer, this.status, (this.xPosition + this.buttonOffset + (this.buttonWidth / 2)) + - (this.fontRenderer.getStringWidth(this.status) / 2), this.yPosition + 4, colour); + } + + /* + * (non-Javadoc) + * @see com.voxelmodpack.common.properties.VoxelProperty#mouseClicked(int, + * int) + */ + @Override + public void mouseClicked(int mouseX, int mouseY) { + if (this.mouseOver(mouseX, mouseY)) { + this.propertyProvider.toggleOption(this.propertyBinding); + this.status = this.propertyProvider.getOptionDisplayString(this.propertyBinding); + } + } + + /** + * @param mouseX + * @param mouseY + * @return + */ + public boolean mouseOver(int mouseX, int mouseY) { + return mouseX > this.xPosition + this.buttonOffset + && mouseX < this.xPosition + this.buttonOffset + this.buttonWidth && mouseY >= this.yPosition + && mouseY <= this.yPosition + this.buttonHeight; + } + + /* + * (non-Javadoc) + * @see com.voxelmodpack.common.properties.VoxelProperty#keyTyped(char, int) + */ + @Override + public void keyTyped(char keyChar, int keyCode) {} +} diff --git a/voxellib/src/main/java/com/voxelmodpack/common/properties/gui/GuiVoxelBoxSettingsPanel.java b/voxellib/src/main/java/com/voxelmodpack/common/properties/gui/GuiVoxelBoxSettingsPanel.java new file mode 100644 index 00000000..fffd6fd5 --- /dev/null +++ b/voxellib/src/main/java/com/voxelmodpack/common/properties/gui/GuiVoxelBoxSettingsPanel.java @@ -0,0 +1,303 @@ +package com.voxelmodpack.common.properties.gui; + +import static com.mumfrey.liteloader.gl.GL.*; + +import java.io.IOException; +import java.util.ArrayList; + +import net.minecraft.client.Minecraft; + +import org.lwjgl.input.Keyboard; + +import com.mumfrey.liteloader.modconfig.ConfigPanel; +import com.mumfrey.liteloader.modconfig.ConfigPanelHost; +import com.voxelmodpack.common.LiteModVoxelCommon; +import com.voxelmodpack.common.gui.GuiScreenEx; +import com.voxelmodpack.common.properties.ModConfig; +import com.voxelmodpack.common.properties.VoxelProperty; + +/** + * Base class for voxelmod gui config screens + * + * @author Adam Mummery-Smith + */ +public abstract class GuiVoxelBoxSettingsPanel extends GuiScreenEx implements ConfigPanel { + /** + * Mod config + */ + protected ModConfig config; + + /** + * Property widgets to display + */ + protected ArrayList> properties = new ArrayList>(); + + /** + * Shared panel width, calculated from the width of the tabs + */ + protected static int PANEL_WIDTH = 330; + + /** + * Panel left edge position + */ + protected static int PANEL_LEFT = 97; + + /** + * Panel top edge position + */ + protected static int PANEL_TOP = 0; + + /** + * + */ + protected static int PANEL_HEIGHT = 220; + + /** + * Pixel spacing between tabs + */ + protected static int TAB_SPACING = 2; + + protected boolean overCloseButton = false; + + protected SettingsPanelManager panelManager = SettingsPanelManager.getInstance(); + + protected boolean isPanel = false; + + protected int contentHeight = 240; + + public ModConfig getConfig() { + return this.config; + } + + @Override + public void drawScreen(int mouseX, int mouseY, float partialTicks) { + super.drawScreen(mouseX, mouseY, partialTicks); + + this.setTexMapSize(256); + + glColor4f(1.0F, 1.0F, 1.0F, 0.5F); + glEnableBlend(); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + + int right = PANEL_LEFT + PANEL_WIDTH; + int bottom = PANEL_TOP + PANEL_HEIGHT; + + this.zLevel = -50; + this.drawTabs(mouseX, mouseY, partialTicks, true); + this.drawPanel(right, bottom); + this.drawTabs(mouseX, mouseY, partialTicks, false); + this.zLevel = 0; + + this.drawCloseButton(mouseX, mouseY, right - 4, PANEL_TOP + 20); + for (VoxelProperty property : this.properties) { + if (property.isVisible()) { + property.draw(this, mouseX, mouseY); + } + } + } + + /** + * @param right + * @param bottom + */ + protected void drawPanel(int right, int bottom) { + PANEL_HEIGHT = Math.max(220, this.height - PANEL_TOP - 2); + + this.zLevel = -100; + glEnableDepthTest(); + + this.drawTessellatedModalBorderRect(LiteModVoxelCommon.GUIPARTS, 256, PANEL_LEFT, PANEL_TOP, right, bottom, 0, + 16, 16, 32, 4); + + this.zDrop(); + this.drawDepthRect(PANEL_LEFT + 1, PANEL_TOP + 1, right - 1, bottom - 1, 0x80000000); + + glDisableDepthTest(); + } + + /** + * @param mouseX + * @param mouseY + * @param partialTicks + */ + protected void drawTabs(int mouseX, int mouseY, float partialTicks, boolean mask) { + this.zDrop(); + + this.panelManager.renderTabs(this, mouseX, mouseY, partialTicks, PANEL_LEFT, PANEL_TOP, TAB_SPACING, mask); + } + + @Override + protected void mouseClicked(int mouseX, int mouseY, int button) throws IOException { + if (this.overCloseButton) // mouseIn(mouseX, mouseY, 315, 5, 330, 20)) + { + this.onClosed(); + this.mc.displayGuiScreen(null); + return; + } + + if (!this.panelManager.mouseClicked(this, mouseX, mouseY, button, PANEL_LEFT, PANEL_TOP, TAB_SPACING)) { + super.mouseClicked(mouseX, mouseY, button); + + for (VoxelProperty property : this.properties) { + if (property.isVisible()) { + property.mouseClicked(mouseX, mouseY); + } + } + } + } + + protected void onClosed() { + for (VoxelProperty property : this.properties) { + property.onClosed(); + } + } + + @Override + protected void keyTyped(char keyChar, int keyCode) throws IOException { + super.keyTyped(keyChar, keyCode); + + this.keyPressed(null, keyChar, keyCode); + } + + @Override + public void updateScreen() { + super.updateScreen(); + + for (VoxelProperty property : this.properties) { + property.updateCursorCounter(); + } + } + + /** + * @return + */ + public void zDrop() { + this.zLevel--; + } + + protected boolean mouseIn(int mouseX, int mouseY, int x, int y, int x2, int y2) { + return (mouseX > x && mouseX < x2 && mouseY > y && mouseY < y2); + } + + /** + * @param mouseX + * @param mouseY + * @param right + * @param top + */ + protected void drawCloseButton(int mouseX, int mouseY, int right, int top) { + this.overCloseButton = this.mouseIn(mouseX, mouseY, right - 15, top - 16, right, top - 1); + int v = this.overCloseButton ? 32 : 0; + + this.drawDepthRect(right - 1, top - 2, right - 14, top - 15, 0x80000000); + this.drawTessellatedModalBorderRect(LiteModVoxelCommon.GUIPARTS, 256, + this.overCloseButton ? right - 16 : right - 15, this.overCloseButton ? top - 17 : top - 16, + this.overCloseButton ? right + 1 : right, this.overCloseButton ? top : top - 1, 0, v, 16, 16 + v, 4); + this.drawString(this.mc.fontRendererObj, "x", right - 10, top - 13, this.overCloseButton ? 0x55FFFF : 0xAAAAAA); + } + + @Override + public int getContentHeight() { + return this.contentHeight; + } + + @Override + public void onPanelShown(ConfigPanelHost host) { + this.mc = Minecraft.getMinecraft(); + this.isPanel = true; + this.initGui(); + } + + @Override + public void onPanelResize(ConfigPanelHost host) { + this.initGui(); + } + + @Override + public void onPanelHidden() {} + + @Override + public void onTick(ConfigPanelHost host) { + this.updateScreen(); + } + + @Override + public void drawPanel(ConfigPanelHost host, int mouseX, int mouseY, float partialTicks) { + glTranslatef(-PANEL_LEFT, 0.0F, 0.0F); + + for (VoxelProperty property : this.properties) { + if (property.isVisible()) { + property.draw(this, mouseX + PANEL_LEFT, mouseY); + } + } + } + + @Override + public void mousePressed(ConfigPanelHost host, int mouseX, int mouseY, int mouseButton) { + try { + super.mouseClicked(mouseX + PANEL_LEFT, mouseY, mouseButton); + } catch (IOException ex) {} + + for (VoxelProperty property : this.properties) { + if (property.isVisible()) { + property.mouseClicked(mouseX + PANEL_LEFT, mouseY); + } + } + } + + @Override + public void mouseReleased(ConfigPanelHost host, int mouseX, int mouseY, int mouseButton) { + super.mouseClickMove(mouseX + PANEL_LEFT, mouseY, mouseButton, 0L); + } + + @Override + public void mouseMoved(ConfigPanelHost host, int mouseX, int mouseY) { + super.mouseClickMove(mouseX + PANEL_LEFT, mouseY, -1, 0L); + } + + @Override + public void keyPressed(ConfigPanelHost host, char keyChar, int keyCode) { + if (keyCode == Keyboard.KEY_ESCAPE && host != null) { + host.close(); + return; + } + + if (keyCode == Keyboard.KEY_TAB) { + VoxelProperty focused = null; // focused property + VoxelProperty next = null; // next focusable property AFTER the + // focused property + VoxelProperty before = null; // first focusable property BEFORE + // the focused property + + // Search through properties to find focus chain + for (VoxelProperty property : this.properties) { + if (property.isFocusable() && next == null) + next = property; + if (property.isFocused() && focused == null) { + focused = property; + before = next; + next = null; + } + } + + // If didn't find a focusable property after focused in the chain, + // use the one nearest the start + if (next == null) + next = before; + + // If we ARE focused and have a focusable property to switch to, + // then switch + if (focused != null && next != null && next != focused) { + focused.setFocused(false); + next.setFocused(true); + return; + } + } + + for (VoxelProperty property : this.properties) { + if (property.isVisible()) { + property.keyTyped(keyChar, keyCode); + } + } + } +} diff --git a/voxellib/src/main/java/com/voxelmodpack/common/properties/gui/SettingsPanelManager.java b/voxellib/src/main/java/com/voxelmodpack/common/properties/gui/SettingsPanelManager.java new file mode 100644 index 00000000..e03ccbe9 --- /dev/null +++ b/voxellib/src/main/java/com/voxelmodpack/common/properties/gui/SettingsPanelManager.java @@ -0,0 +1,317 @@ +package com.voxelmodpack.common.properties.gui; + +import static com.mumfrey.liteloader.gl.GL.*; + +import java.io.File; +import java.util.Iterator; +import java.util.Map; +import java.util.TreeMap; +import java.util.TreeSet; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.settings.KeyBinding; + +import org.lwjgl.input.Keyboard; + +import com.mumfrey.liteloader.Tickable; +import com.mumfrey.liteloader.core.LiteLoader; + +/** + * Manager object that keeps track of the settings panels and manages the tab + * display and switching between panels + * + * @author Adam Mummery-Smith + */ +public class SettingsPanelManager implements Tickable { + // Consts + private static int TAB_WIDTH = 72; + private static final int TAB_HEIGHT = 16; + + /** + * Singleton + */ + private static SettingsPanelManager instance; + + /** + * Minecraft game instance + */ + private Minecraft mc; + + /** + * Settings panels + */ + private Map> panels = new TreeMap>(); + + /** + * Sorted tabs + */ + private TreeSet tabs = new TreeSet(); + + /** + * Scroll bar to display when there are too many tabs + */ + private SettingsPanelScrollBar scrollbar = new SettingsPanelScrollBar(6, 4, 10, 220, 0); + + /** + * First panel which was added, this becomes the default panel + */ + private Class firstPanel = null; + + /** + * Key binding used to display the GUI + */ + public static KeyBinding guiKeyBinding = new KeyBinding("VoxelMods Config", Keyboard.KEY_NONE, "VoxelLib"); + + /** + * Get the singleton instance of the tab manager + * + * @return + */ + public static SettingsPanelManager getInstance() { + if (instance == null) { + instance = new SettingsPanelManager(); + LiteLoader.getInterfaceManager().registerListener(instance); + LiteLoader.getInput().registerKeyBinding(guiKeyBinding); + } + + return instance; + } + + /** + * Private ctor + */ + private SettingsPanelManager() { + this.mc = Minecraft.getMinecraft(); + } + + /** + * Add a settings panel to the tab list + * + * @param panelName + * @param panel + */ + public static void addSettingsPanel(String panelName, Class panel) { + SettingsPanelManager.getInstance().addPanel(panelName, panel); + } + + /** + * Remove a settings panel from the tab list + * + * @param panelName + */ + public static void removeSettingsPanel(String panelName) { + SettingsPanelManager.getInstance().removePanel(panelName); + } + + public static void displaySettings() { + SettingsPanelManager.getInstance().displaySettings(Minecraft.getMinecraft()); + } + + public static boolean hasOptions() { + return SettingsPanelManager.getInstance().panels.size() > 0; + } + + /** + * Add a settings panel to the panel pool + * + * @param panelName + * @param panel + */ + public void addPanel(String panelName, Class panel) { + // Add the panel to the pool + if (panel != null) { + this.panels.put(panelName, panel); + this.tabs.add(new SettingsPanelMenuTab(panelName, GuiVoxelBoxSettingsPanel.PANEL_LEFT, 0)); + } + + this.updateTabs(); + } + + public void addPanel(String panelName, Class panel, int priority) { + // Add the panel to the pool + if (panel != null) { + this.panels.put(panelName, panel); + this.tabs.add(new SettingsPanelMenuTab(panelName, 62, priority)); + } + + this.updateTabs(); + } + + /** + * Remove a settings panel from the tabs set + * + * @param panelName + */ + public void removePanel(String panelName) { + this.panels.remove(panelName); + this.updateTabs(); + } + + /** + * + */ + protected void updateTabs() { + + Iterator iter = this.panels.keySet().iterator(); + if (iter.hasNext()) + this.firstPanel = this.panels.get(iter.next()); + + int largest = 0; + + for (SettingsPanelMenuTab tab : this.tabs) + if (this.mc.fontRendererObj.getStringWidth(tab.getLabel()) > largest) + largest = this.mc.fontRendererObj.getStringWidth(tab.getLabel()); + + if (SettingsPanelManager.TAB_HEIGHT * this.tabs.size() < GuiVoxelBoxSettingsPanel.PANEL_HEIGHT) + SettingsPanelManager.TAB_WIDTH = largest + 6; + else + SettingsPanelManager.TAB_WIDTH = largest + 18 + this.scrollbar.getWidth(); + + for (SettingsPanelMenuTab tab : this.tabs) + tab.setXPos(SettingsPanelManager.TAB_WIDTH); + + GuiVoxelBoxSettingsPanel.PANEL_LEFT = SettingsPanelManager.TAB_WIDTH; + } + + /* + * (non-Javadoc) + * @see com.mumfrey.liteloader.Tickable#onTick(net.minecraft.src.Minecraft, + * float, boolean, boolean) + */ + @Override + public void onTick(Minecraft minecraft, float partialTicks, boolean inGame, boolean clock) { + // Handle GUI key being pressed + if (minecraft.currentScreen == null && guiKeyBinding.isKeyDown() && this.firstPanel != null) { + this.displaySettings(minecraft); + } + } + + /** + * @param minecraft + */ + public void displaySettings(Minecraft minecraft) { + try { + // If it was pressed display the default panel + GuiVoxelBoxSettingsPanel panel = this.firstPanel.newInstance(); + minecraft.displayGuiScreen(panel); + } catch (InstantiationException ex) {} catch (IllegalAccessException ex) {} + } + + /** + * Callback from the panel, checks whether a tab was clicked, returns true + * if a tab click was handled + * + * @param panel Source panel + * @param mouseX + * @param mouseY + * @param button + * @param xPos tab x pos + * @param yPos tab y pos + * @param spacing tab spacing + * @return + */ + public boolean mouseClicked(GuiVoxelBoxSettingsPanel panel, int mouseX, int mouseY, int button, int xPos, int yPos, + int spacing) { + if (button == 0) { + + int newWidth = SettingsPanelManager.TAB_WIDTH; + + if (SettingsPanelManager.TAB_HEIGHT * this.tabs.size() > GuiVoxelBoxSettingsPanel.PANEL_HEIGHT) + newWidth -= 18 + this.scrollbar.getWidth(); + + for (SettingsPanelMenuTab tab : this.tabs) + if (tab.isMouseOver(newWidth, mouseX, mouseY)) { + try { + GuiVoxelBoxSettingsPanel newPanel = this.panels.get(tab.getLabel()).newInstance(); + this.mc.displayGuiScreen(newPanel); + return true; + + } catch (InstantiationException e) {} catch (IllegalAccessException e) {} + } + + boolean intersects = this.scrollbar.mouseIn(mouseX, mouseY); + + if (intersects) { + this.scrollbar.mouseHeld = true; + return true; + } + + this.scrollbar.mouseHeld = false; + return false; + } + return false; + } + + /** + * Callback from the panel, renders the tabs + * + * @param panel + * @param mouseX + * @param mouseY + * @param partialTicks + * @param xPos + * @param tabYPosition + * @param spacing + */ + public void renderTabs(GuiVoxelBoxSettingsPanel panel, int mouseX, int mouseY, float partialTicks, int xPos, + int yPos, int spacing, boolean mask) { + int tabYPosition = yPos; + + glEnableDepthTest(); + + this.updateTabs(); + + int newWidth = SettingsPanelManager.TAB_WIDTH; + int newY = 0; + + if (TAB_HEIGHT * this.tabs.size() > GuiVoxelBoxSettingsPanel.PANEL_HEIGHT) { + newWidth -= 12 + this.scrollbar.getWidth(); + newY = (int) (TAB_HEIGHT * this.tabs.size() * this.scrollbar.getValue()); + } + + tabYPosition += 8; + tabYPosition -= newY; + + for (SettingsPanelMenuTab tab : this.tabs) { + tab.setActive(panel.getClass().equals(this.panels.get(tab.getLabel()))); + tab.renderTab(panel, newWidth, mouseX, mouseY, tabYPosition, mask); + + tabYPosition += TAB_HEIGHT; + } + + if (TAB_HEIGHT * this.tabs.size() > GuiVoxelBoxSettingsPanel.PANEL_HEIGHT) { + this.scrollbar.setHeight(GuiVoxelBoxSettingsPanel.PANEL_HEIGHT - 8); + this.scrollbar.render(panel, mouseY); + } + + glDisableDepthTest(); + } + + /* + * (non-Javadoc) + * @see com.mumfrey.liteloader.LiteMod#init() + */ + @Override + public void init(File f) {} + + /* + * (non-Javadoc) + * @see com.mumfrey.liteloader.LiteMod#getName() + */ + @Override + public String getName() { + return null; + } + + /* + * (non-Javadoc) + * @see com.mumfrey.liteloader.LiteMod#getVersion() + */ + @Override + public String getVersion() { + return null; + } + + @Override + public void upgradeSettings(String version, File configPath, File oldConfigPath) {} +} diff --git a/voxellib/src/main/java/com/voxelmodpack/common/properties/gui/SettingsPanelMenuTab.java b/voxellib/src/main/java/com/voxelmodpack/common/properties/gui/SettingsPanelMenuTab.java new file mode 100644 index 00000000..da48dba3 --- /dev/null +++ b/voxellib/src/main/java/com/voxelmodpack/common/properties/gui/SettingsPanelMenuTab.java @@ -0,0 +1,94 @@ +package com.voxelmodpack.common.properties.gui; + +import net.minecraft.client.Minecraft; + +import com.voxelmodpack.common.LiteModVoxelCommon; + +/** + * @author anangrybeaver + */ +public class SettingsPanelMenuTab implements Comparable { + private Minecraft mc; + + private final int priority; + private final int width; + + private int xPos; + private int yPos; + + private final String label; + + private boolean active = false; + + public SettingsPanelMenuTab(String label, int xPosition, int priority) { + this.mc = Minecraft.getMinecraft(); + + this.label = label; + this.priority = priority; + this.width = this.mc.fontRendererObj.getStringWidth(label); + this.xPos = xPosition - this.width - 2; + } + + public boolean isActive() { + return this.active; + } + + public void setActive(boolean active) { + this.active = active; + } + + public void setXPos(int xPos) { + this.xPos = xPos - this.width - 3; + } + + public boolean isMouseOver(int tabMenuWidth, int mouseX, int mouseY) { + int newX = GuiVoxelBoxSettingsPanel.PANEL_LEFT - tabMenuWidth; + + return mouseX > newX && mouseX < newX + tabMenuWidth && mouseY > this.yPos - 4 && mouseY < this.yPos + 12; + } + + public String getLabel() { + return this.label; + } + + public void renderTab(GuiVoxelBoxSettingsPanel panel, int tabMenuWidth, int mouseX, int mouseY, int y, + boolean mask) { + this.yPos = y; + + int tabX = GuiVoxelBoxSettingsPanel.PANEL_LEFT - tabMenuWidth; + int tabY = this.yPos - 4; + int tabRight = GuiVoxelBoxSettingsPanel.PANEL_LEFT + 4; + int tabBottom = this.yPos + 12; + + if (mask) { + // Draw the tab mask over the window border so it looks like this + // tab "flows" into the window + if (this.active) { + this.renderTabMask(panel, tabY, tabRight, tabBottom); + } + } else { + // Draw the actual tab + boolean mouseOver = this.isMouseOver(tabMenuWidth, mouseX, mouseY); + int v = mouseOver ? 32 : (this.active ? 16 : 0); + panel.drawTessellatedModalBorderRect(LiteModVoxelCommon.GUIPARTS, 256, tabX, tabY, tabRight, tabBottom, 0, + 0 + v, 16, 16 + v, 4); + panel.zDrop(); + panel.drawDepthRect(tabX + 1, tabY + 1, tabRight - 1, tabBottom - 1, 0x80000000); + + this.mc.fontRendererObj.drawString(this.label, this.xPos, y, + this.isMouseOver(tabMenuWidth, mouseX, mouseY) ? 0x55FFFF : (this.active ? 0xFFFF55 : 0xAAAAAA)); + } + } + + private void renderTabMask(GuiVoxelBoxSettingsPanel panel, int tabY, int tabRight, int tabBottom) { + panel.drawDepthRect(tabRight - 4, tabY + 1, tabRight - 3, tabBottom - 1, 0x80000000); + panel.drawDepthRect(tabRight - 3, tabY, tabRight - 2, tabBottom, 0x80000000); + } + + @Override + public int compareTo(SettingsPanelMenuTab other) { + if (other == null) + return 0; + return (this.priority == other.priority) ? -1 : this.priority - other.priority; + } +} diff --git a/voxellib/src/main/java/com/voxelmodpack/common/properties/gui/SettingsPanelScrollBar.java b/voxellib/src/main/java/com/voxelmodpack/common/properties/gui/SettingsPanelScrollBar.java new file mode 100644 index 00000000..e368e26b --- /dev/null +++ b/voxellib/src/main/java/com/voxelmodpack/common/properties/gui/SettingsPanelScrollBar.java @@ -0,0 +1,89 @@ +package com.voxelmodpack.common.properties.gui; + +import static com.mumfrey.liteloader.gl.GL.*; + +import org.lwjgl.input.Mouse; + +import com.voxelmodpack.common.LiteModVoxelCommon; + +/** + * @author anangrybeaver + */ +public class SettingsPanelScrollBar { + public boolean mouseHeld = false; + + private final int xPos, yPos; + private final int width; + private int height; + + private int handleY; + + public SettingsPanelScrollBar(int x, int y, int width, int height, int startingValue) { + this.xPos = x; + this.yPos = y; + + this.width = width; + this.height = height; + + this.moveHandle(startingValue); + } + + @SuppressWarnings("cast") + public double getValue() { + return ((double) this.handleY - (double) this.yPos - 3) / (double) this.height; + } + + public void setHeight(int height) { + this.height = height; + } + + public int getWidth() { + return this.width; + } + + public void moveHandle(int mouseY) { + this.handleY = mouseY - this.width / 2; + + if (this.handleY < this.yPos + 3) + this.handleY = this.yPos + 3; + + if (this.handleY > this.yPos + this.height - this.width - 3) + this.handleY = this.yPos + this.height - this.width - 3; + } + + public boolean mouseIn(int mouseX, int mouseY) { + return mouseX > this.xPos && mouseX < this.xPos + this.width && mouseY > this.yPos + && mouseY < this.yPos + this.height; + } + + private void renderHandle(GuiVoxelBoxSettingsPanel panel) { + panel.drawTessellatedModalBorderRect(LiteModVoxelCommon.GUIPARTS, 256, this.xPos - 2, this.handleY - 1, + this.xPos + this.width + 2, this.handleY + this.width + 1, 17, 33, 31, 47, 3); + panel.drawTessellatedModalBorderRect(LiteModVoxelCommon.GUIPARTS, 256, this.xPos - 2, this.handleY, + this.xPos + this.width + 2, this.handleY + this.width, 0, 121, 128, 128, 3); + } + + private void renderBar(GuiVoxelBoxSettingsPanel panel) { + glEnableDepthTest(); + + panel.drawTessellatedModalBorderRect(LiteModVoxelCommon.GUIPARTS, 256, this.xPos, this.yPos, + this.xPos + this.width, this.yPos + this.height, 0, 16, 16, 32, 4); + panel.zDrop(); + panel.drawDepthRect(this.xPos + 1, this.yPos + 1, this.xPos + this.width - 1, this.yPos + this.height - 1, + 0x80000000); + + glDisableDepthTest(); + + } + + public void render(GuiVoxelBoxSettingsPanel panel, int mouseY) { + if (Mouse.isButtonDown(0)) { + if (this.mouseHeld) + this.moveHandle(mouseY); + } else + this.mouseHeld = false; + + this.renderBar(panel); + this.renderHandle(panel); + } +} diff --git a/voxellib/src/main/java/com/voxelmodpack/common/properties/interfaces/IVoxelPropertyProvider.java b/voxellib/src/main/java/com/voxelmodpack/common/properties/interfaces/IVoxelPropertyProvider.java new file mode 100644 index 00000000..1ae8fee0 --- /dev/null +++ b/voxellib/src/main/java/com/voxelmodpack/common/properties/interfaces/IVoxelPropertyProvider.java @@ -0,0 +1,39 @@ +package com.voxelmodpack.common.properties.interfaces; + +/** + * Base interface for property providers + * + * @author Adam Mummery-Smith + */ +public interface IVoxelPropertyProvider { + /** + * Get the value of a property as a string + * + * @param propertyName + * @return + */ + public abstract String getStringProperty(String propertyName); + + /** + * Get the name of this property for display + * + * @param propertyName + * @return + */ + public abstract String getOptionDisplayString(String propertyName); + + /** + * Toggle the value of this option + * + * @param propertyName + */ + public abstract void toggleOption(String propertyName); + + /** + * Get the default value of the property as a string + * + * @param propertyName + * @return + */ + public abstract String getDefaultPropertyValue(String propertyName); +} \ No newline at end of file diff --git a/voxellib/src/main/java/com/voxelmodpack/common/properties/interfaces/IVoxelPropertyProviderBoolean.java b/voxellib/src/main/java/com/voxelmodpack/common/properties/interfaces/IVoxelPropertyProviderBoolean.java new file mode 100644 index 00000000..fcb9da13 --- /dev/null +++ b/voxellib/src/main/java/com/voxelmodpack/common/properties/interfaces/IVoxelPropertyProviderBoolean.java @@ -0,0 +1,25 @@ +package com.voxelmodpack.common.properties.interfaces; + +/** + * Interface for property providers that can provide boolean values + * + * @author Adam Mummery-Smith + */ +public interface IVoxelPropertyProviderBoolean extends IVoxelPropertyProvider { + /** + * Set the specified property to the boolean value specified + * + * @param propertyName + * @param value + */ + public abstract void setProperty(String propertyName, boolean value); + + /** + * Attempts to parse the value of the property specified by calling + * Boolean.parseBoolean on the underlying string value + * + * @param propertyName + * @return + */ + public abstract boolean getBoolProperty(String propertyName); +} diff --git a/voxellib/src/main/java/com/voxelmodpack/common/properties/interfaces/IVoxelPropertyProviderFloat.java b/voxellib/src/main/java/com/voxelmodpack/common/properties/interfaces/IVoxelPropertyProviderFloat.java new file mode 100644 index 00000000..27976465 --- /dev/null +++ b/voxellib/src/main/java/com/voxelmodpack/common/properties/interfaces/IVoxelPropertyProviderFloat.java @@ -0,0 +1,25 @@ +package com.voxelmodpack.common.properties.interfaces; + +/** + * Interface for property providers that can provide storage for float values + * + * @author Adam Mummery-Smith + */ +public interface IVoxelPropertyProviderFloat extends IVoxelPropertyProvider { + /** + * Set the specified property to the value specified + * + * @param propertyName + * @param value + */ + public abstract void setProperty(String propertyName, float value); + + /** + * Attempts to retrieve the specified value as a float by calling + * Float.parseFloat on the underlying string value + * + * @param propertyName + * @return + */ + public abstract float getFloatProperty(String propertyName); +} diff --git a/voxellib/src/main/java/com/voxelmodpack/common/properties/interfaces/IVoxelPropertyProviderInteger.java b/voxellib/src/main/java/com/voxelmodpack/common/properties/interfaces/IVoxelPropertyProviderInteger.java new file mode 100644 index 00000000..db7f50d3 --- /dev/null +++ b/voxellib/src/main/java/com/voxelmodpack/common/properties/interfaces/IVoxelPropertyProviderInteger.java @@ -0,0 +1,25 @@ +package com.voxelmodpack.common.properties.interfaces; + +/** + * Interface for property providers that can provide storage for integer values + * + * @author Adam Mummery-Smith + */ +public interface IVoxelPropertyProviderInteger extends IVoxelPropertyProvider { + /** + * Set the specified property to the integer value specified + * + * @param propertyName + * @param value + */ + public abstract void setProperty(String propertyName, int value); + + /** + * Attempts to return the specified property as an integer by calling + * Integer.parseInt on the underlying string value + * + * @param propertyName + * @return + */ + public abstract int getIntProperty(String propertyName); +} diff --git a/voxellib/src/main/java/com/voxelmodpack/common/runtime/ObfMap.java b/voxellib/src/main/java/com/voxelmodpack/common/runtime/ObfMap.java new file mode 100644 index 00000000..67429da6 --- /dev/null +++ b/voxellib/src/main/java/com/voxelmodpack/common/runtime/ObfMap.java @@ -0,0 +1,59 @@ +package com.voxelmodpack.common.runtime; + +import com.mumfrey.liteloader.core.runtime.Obf; + +/** + * Central list of obfuscation mappings used throughout macros, coalesced here + * instead of being spread throughout the different reflection mechanisms + * + * @author Adam Mummery-Smith TODO Obfuscation - updated 1.8 + */ +public class ObfMap extends Obf { + public static final ObfMap currentLocale = new ObfMap("field_135054_a", "a", "i18nLocale"); + public static final ObfMap downloadedImage = new ObfMap("field_110560_d", "l", "bufferedImage"); + public static final ObfMap renderZoom = new ObfMap("field_78503_V", "X", "cameraZoom"); + public static final ObfMap renderOfsetX = new ObfMap("field_78502_W", "Y", "cameraYaw"); + public static final ObfMap renderOfsetY = new ObfMap("field_78509_X", "Z", "cameraPitch"); + public static final ObfMap guiScreenSelectedButton = new ObfMap("field_146290_a", "h", "selectedButton"); + public static final ObfMap worldType = new ObfMap("field_76098_b", "c", "terrainType"); + public static final ObfMap soundSystemThread = new ObfMap("field_148620_e", "e", "sndSystem"); + public static final ObfMap lastClicked = new ObfMap("field_148167_s", "p", "lastClicked"); + public static final ObfMap imageUrl = new ObfMap("field_110562_b", "j", "imageUrl"); + public static final ObfMap imageThread = new ObfMap("field_110561_e", "m", "imageThread"); + public static final ObfMap imageBuffer = new ObfMap("field_110563_c", "k", "imageBuffer"); + public static final ObfMap imageFile = new ObfMap("field_152434_e", "i"); + public static final ObfMap resourceToTextureMap = new ObfMap("field_110585_a", "b", "mapTextureObjects"); + public static final ObfMap optionsBackground = new ObfMap("field_110325_k", "b", "optionsBackground"); + public static final ObfMap rainingStrength = new ObfMap("field_73004_o", "p", "rainingStrength"); + public static final ObfMap thunderingStrength = new ObfMap("field_73017_q", "r", "thunderingStrength"); + public static final ObfMap internetServerList = new ObfMap("field_146804_i", "i", "savedServerList"); + public static final ObfMap serverSelectionList = new ObfMap("field_146803_h", "h", "serverListSelector"); + public static final ObfMap guiResourcePacksParentScreen = new ObfMap("field_146965_f", "f"); + public static final ObfMap abstractResourcePackFile = new ObfMap("field_110597_b", "a", "resourcePackFile"); + public static final ObfMap mcFramebuffer = new ObfMap("field_147124_at", "aB", "framebufferMc"); + public static final ObfMap eventSounds = new ObfMap("field_148736_a", "a", "soundPool"); + + public static final ObfMap getSlotAtPosition = new ObfMap("func_146975_c", "c", "getSlotAtPosition"); + public static final ObfMap handleMouseClick = new ObfMap("func_146984_a", "a", "handleMouseClick"); + public static final ObfMap selectTab = new ObfMap("func_147050_b", "b", "setCurrentCreativeTab"); + public static final ObfMap scrollTo = new ObfMap("func_148329_a", "a", "scrollTo"); + public static final ObfMap renderSkyBox = new ObfMap("func_73971_c", "c", "renderSkybox"); + public static final ObfMap guiScreenMouseClicked = new ObfMap("func_73864_a", "a", "mouseClicked"); + public static final ObfMap guiScreenMouseMovedOrUp = new ObfMap("func_146286_b", "b", "mouseReleased"); + public static final ObfMap guiScreenKeyTyped = new ObfMap("func_73869_a", "a", "keyTyped"); + public static final ObfMap createPlayer = new ObfMap("func_178892_a", "a"); + + public static final ObfMap ContainerCreative = new ObfMap("net.minecraft.client.gui.inventory.GuiContainerCreative$ContainerCreative", "bza"); + public static final ObfMap SlotCreativeInventory = new ObfMap("net.minecraft.client.gui.inventory.GuiContainerCreative$CreativeSlot", "bzb"); + public static final ObfMap PlayerControllerMP = new ObfMap("net.minecraft.client.multiplayer.PlayerControllerMP", "cem"); + public static final ObfMap StatFileWriter = new ObfMap("net.minecraft.stats.StatFileWriter", "tz"); + public static final ObfMap World = new ObfMap("net.minecraft.world.World", "aqu"); + + private ObfMap(String seargeName, String obfuscatedName, String mcpName) { + super(seargeName, obfuscatedName, mcpName); + } + + private ObfMap(String seargeName, String obfuscatedName) { + super(seargeName, obfuscatedName, seargeName); + } +} diff --git a/voxellib/src/main/java/com/voxelmodpack/common/runtime/PrivateClasses.java b/voxellib/src/main/java/com/voxelmodpack/common/runtime/PrivateClasses.java new file mode 100644 index 00000000..af555dae --- /dev/null +++ b/voxellib/src/main/java/com/voxelmodpack/common/runtime/PrivateClasses.java @@ -0,0 +1,47 @@ +package com.voxelmodpack.common.runtime; + +import com.mumfrey.liteloader.core.runtime.Obf; +import com.mumfrey.liteloader.util.ModUtilities; + +import net.minecraft.inventory.Container; +import net.minecraft.inventory.Slot; + +/** + * Wrapper for obf/mcp reflection-accessed private (or default) classes, added + * to centralise the locations I have to update the obfuscated names and also + * make referencing the hidden classes more straightforward + * + * @author Adam Mummery-Smith + * @param Parent class type + */ +public class PrivateClasses { + /** + * Class to which this field belongs + */ + public final Class Class; + + /** + * Name used to access the field, determined at init + */ + private final String className; + + @SuppressWarnings({ "unchecked", "deprecation" }) + private PrivateClasses(Obf mapping) { + this.className = ModUtilities.getObfuscatedFieldName(mapping); + + Class reflectedClass = null; + + try { + reflectedClass = (Class) java.lang.Class.forName(this.className); + } catch (Exception ex) { + ex.printStackTrace(); + } + + this.Class = reflectedClass; + } + + public static final PrivateClasses SlotCreativeInventory = new PrivateClasses( + ObfMap.SlotCreativeInventory); + public static final PrivateClasses ContainerCreative = new PrivateClasses( + ObfMap.ContainerCreative); +} diff --git a/voxellib/src/main/java/com/voxelmodpack/common/runtime/PrivateFields.java b/voxellib/src/main/java/com/voxelmodpack/common/runtime/PrivateFields.java new file mode 100644 index 00000000..765815e3 --- /dev/null +++ b/voxellib/src/main/java/com/voxelmodpack/common/runtime/PrivateFields.java @@ -0,0 +1,186 @@ +package com.voxelmodpack.common.runtime; + +import java.awt.image.BufferedImage; +import java.io.File; +import java.util.List; +import java.util.Map; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.audio.ISoundEventAccessor; +import net.minecraft.client.audio.SoundEventAccessorComposite; +import net.minecraft.client.audio.SoundManager; +import net.minecraft.client.gui.Gui; +import net.minecraft.client.gui.GuiButton; +import net.minecraft.client.gui.GuiMultiplayer; +import net.minecraft.client.gui.GuiScreen; +import net.minecraft.client.gui.GuiScreenResourcePacks; +import net.minecraft.client.gui.GuiSlot; +import net.minecraft.client.gui.ServerSelectionList; +import net.minecraft.client.multiplayer.ServerList; +import net.minecraft.client.renderer.EntityRenderer; +import net.minecraft.client.renderer.IImageBuffer; +import net.minecraft.client.renderer.ThreadDownloadImageData; +import net.minecraft.client.renderer.texture.ITextureObject; +import net.minecraft.client.renderer.texture.TextureManager; +import net.minecraft.client.resources.AbstractResourcePack; +import net.minecraft.client.resources.I18n; +import net.minecraft.client.resources.Locale; +import net.minecraft.client.shader.Framebuffer; +import net.minecraft.util.ResourceLocation; +import net.minecraft.world.World; +import net.minecraft.world.WorldType; +import net.minecraft.world.storage.WorldInfo; +import paulscode.sound.SoundSystem; + +import com.mumfrey.liteloader.core.runtime.Obf; +import com.mumfrey.liteloader.util.ModUtilities; + +/** + * Wrapper for obf/mcp reflection-accessed private fields, mainly added to + * centralise the locations I have to update the obfuscated field names + * + * @author Adam Mummery-Smith + * @param + *

+ * Parent class type, the type of the class that owns the field + * @param Field type, the type of the field value + */ +public class PrivateFields { + /** + * Class to which this field belongs + */ + public final Class

parentClass; + + /** + * Name used to access the field, determined at init + */ + private final String fieldName; + + private boolean errorReported; + + /** + * Creates a new private field entry + * + * @param owner + * @param mcpName + * @param name + */ + @SuppressWarnings("deprecation") + private PrivateFields(Class

owner, Obf mapping) { + this.parentClass = owner; + this.fieldName = ModUtilities.getObfuscatedFieldName(mapping); + } + + /** + * Get the current value of this field on the instance class supplied + * + * @param instance Class to get the value of + * @return field value or null if errors occur + */ + @SuppressWarnings("unchecked") + public T get(P instance) { + try { + return (T) Reflection.getPrivateValue(this.parentClass, instance, this.fieldName); + } catch (Exception ex) { + if (!this.errorReported) { + this.errorReported = true; + ex.printStackTrace(); + } + return null; + } + } + + /** + * Set the value of this field on the instance class supplied + * + * @param instance Object to set the value of the field on + * @param value value to set + * @return value + */ + public T set(P instance, T value) { + try { + Reflection.setPrivateValue(this.parentClass, instance, this.fieldName, value); + } catch (Exception ex) { + if (!this.errorReported) { + this.errorReported = true; + ex.printStackTrace(); + } + } + + return value; + } + + /** + * Static private fields + * + * @param + *

+ * Parent class type, the type of the class that owns the field + * @param Field type, the type of the field value + */ + public static final class StaticFields extends PrivateFields { + @SuppressWarnings("synthetic-access") + public StaticFields(Class

owner, ObfMap mapping) { + super(owner, mapping); + } + + public T get() { + return this.get(null); + } + + public void set(T value) { + this.set(null, value); + } + + public static final StaticFields locale = new StaticFields(I18n.class, + ObfMap.currentLocale); + public static final StaticFields optionsBackground = new StaticFields( + Gui.class, ObfMap.optionsBackground); + } + + // If anyone screws up the formatting of this table again I will have them + // fed to a shark + public static final PrivateFields guiScreenSelectedButton = new PrivateFields( + GuiScreen.class, ObfMap.guiScreenSelectedButton); + public static final PrivateFields worldType = new PrivateFields( + WorldInfo.class, ObfMap.worldType); + public static final PrivateFields soundSystem = new PrivateFields( + SoundManager.class, ObfMap.soundSystemThread); + public static final PrivateFields lastClicked = new PrivateFields(GuiSlot.class, + ObfMap.lastClicked); + public static final PrivateFields renderZoom = new PrivateFields( + EntityRenderer.class, ObfMap.renderZoom); + public static final PrivateFields renderOfsetX = new PrivateFields( + EntityRenderer.class, ObfMap.renderOfsetX); + public static final PrivateFields renderOfsetY = new PrivateFields( + EntityRenderer.class, ObfMap.renderOfsetY); + public static final PrivateFields rainingStrength = new PrivateFields(World.class, + ObfMap.rainingStrength); + public static final PrivateFields thunderingStrength = new PrivateFields(World.class, + ObfMap.thunderingStrength); + public static final PrivateFields downloadedImage = new PrivateFields( + ThreadDownloadImageData.class, ObfMap.downloadedImage); + public static final PrivateFields internetServerList = new PrivateFields( + GuiMultiplayer.class, ObfMap.internetServerList); + public static final PrivateFields serverSelectionList = new PrivateFields( + GuiMultiplayer.class, ObfMap.serverSelectionList); + public static final PrivateFields guiResourcePacksParentScreen = new PrivateFields( + GuiScreenResourcePacks.class, ObfMap.guiResourcePacksParentScreen); + public static final PrivateFields abstractResourcePackFile = new PrivateFields( + AbstractResourcePack.class, ObfMap.abstractResourcePackFile); + public static final PrivateFields mcFramebuffer = new PrivateFields( + Minecraft.class, ObfMap.mcFramebuffer); + public static final PrivateFields imageUrl = new PrivateFields( + ThreadDownloadImageData.class, ObfMap.imageUrl); + public static final PrivateFields imageThread = new PrivateFields( + ThreadDownloadImageData.class, ObfMap.imageThread); + public static final PrivateFields imageBuffer = new PrivateFields( + ThreadDownloadImageData.class, ObfMap.imageBuffer); + public static final PrivateFields imageFile = new PrivateFields( + ThreadDownloadImageData.class, ObfMap.imageFile); + + public static final PrivateFields> eventSounds = new PrivateFields>( + SoundEventAccessorComposite.class, ObfMap.eventSounds); + public static final PrivateFields> resourceToTextureMap = new PrivateFields>( + TextureManager.class, ObfMap.resourceToTextureMap); +} diff --git a/voxellib/src/main/java/com/voxelmodpack/common/runtime/PrivateMethods.java b/voxellib/src/main/java/com/voxelmodpack/common/runtime/PrivateMethods.java new file mode 100644 index 00000000..fbaf841f --- /dev/null +++ b/voxellib/src/main/java/com/voxelmodpack/common/runtime/PrivateMethods.java @@ -0,0 +1,145 @@ +package com.voxelmodpack.common.runtime; + +import java.lang.reflect.Method; + +import net.minecraft.client.gui.GuiMainMenu; +import net.minecraft.client.gui.GuiScreen; +import net.minecraft.client.gui.inventory.GuiContainer; +import net.minecraft.client.gui.inventory.GuiContainerCreative; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.inventory.Container; +import net.minecraft.inventory.Slot; + +import com.mumfrey.liteloader.core.runtime.Obf; +import com.mumfrey.liteloader.util.ModUtilities; + +/** + * Wrapper for obf/mcp reflection-accessed private methods, added to centralise + * the locations I have to update the obfuscated method names + * + * @author Adam Mummery-Smith + * @param + *

+ * Parent class type + * @param Method return type + */ +public class PrivateMethods { + public static class Void {} + + /** + * Class to which this field belongs + */ + public final Class parentClass; + + /** + * Name used to access the field, determined at init + */ + private final String methodName; + + /** + * Method + */ + private final Method method; + + /** + * Creates a new private field entry + * + * @param owner + * @param mcpName + * @param name + */ + @SuppressWarnings("deprecation") + private PrivateMethods(Class owner, Obf mapping, Class... parameterTypes) { + this.parentClass = owner; + this.methodName = ModUtilities.getObfuscatedFieldName(mapping); + + Method method = null; + + try { + method = this.parentClass.getDeclaredMethod(this.methodName, parameterTypes); + method.setAccessible(true); + } catch (SecurityException ex) { + ex.printStackTrace(); + } catch (NoSuchMethodException ex) { + ex.printStackTrace(); + } + + this.method = method; + } + + /** + * Invoke the method and return a value + * + * @param instance + * @param args + * @return + */ + @SuppressWarnings("unchecked") + public R invoke(P instance, Object... args) { + try { + return (R) this.method.invoke(instance, args); + } catch (Exception ex) { + return null; + } + } + + /** + * Invoke a static method that returns a value + * + * @param args + * @return + */ + @SuppressWarnings("unchecked") + public R invokeStatic(Object... args) { + try { + return (R) this.method.invoke(null, args); + } catch (Exception ex) { + return null; + } + } + + /** + * Invoke a method that returns void + * + * @param instance + * @param args + */ + public void invokeVoid(P instance, Object... args) { + try { + this.method.invoke(instance, args); + } catch (Exception ex) {} + } + + /** + * Invoke a static method that returns void + * + * @param args + */ + public void invokeStaticVoid(Object... args) { + try { + this.method.invoke(null, args); + } catch (Exception ex) {} + } + + // Methods on public classes + public static final PrivateMethods containerGetSlotAtPosition = new PrivateMethods( + GuiContainer.class, ObfMap.getSlotAtPosition, int.class, int.class); + public static final PrivateMethods containerHandleMouseClick = new PrivateMethods( + GuiContainer.class, ObfMap.handleMouseClick, Slot.class, int.class, int.class, int.class); + public static final PrivateMethods selectTab = new PrivateMethods( + GuiContainerCreative.class, ObfMap.selectTab, CreativeTabs.class); + public static final PrivateMethods mainMenuRenderSkyBox = new PrivateMethods( + GuiMainMenu.class, ObfMap.renderSkyBox, int.class, int.class, float.class); + + public static final PrivateMethods guiScreenMouseClicked = new PrivateMethods( + GuiScreen.class, ObfMap.guiScreenMouseClicked, int.class, int.class, int.class); + public static final PrivateMethods guiScreenMouseMovedOrUp = new PrivateMethods( + GuiScreen.class, ObfMap.guiScreenMouseMovedOrUp, int.class, int.class, int.class); + public static final PrivateMethods guiScreenKeyTyped = new PrivateMethods( + GuiScreen.class, ObfMap.guiScreenKeyTyped, char.class, int.class); + + // Methods on dynamic classes below here + @SuppressWarnings({ "unchecked", "rawtypes" }) + public static final PrivateMethods scrollTo = new PrivateMethods( + PrivateClasses.ContainerCreative.Class, ObfMap.scrollTo, float.class); +} \ No newline at end of file diff --git a/voxellib/src/main/java/com/voxelmodpack/common/runtime/Reflection.java b/voxellib/src/main/java/com/voxelmodpack/common/runtime/Reflection.java new file mode 100644 index 00000000..6dc0eaf0 --- /dev/null +++ b/voxellib/src/main/java/com/voxelmodpack/common/runtime/Reflection.java @@ -0,0 +1,108 @@ +package com.voxelmodpack.common.runtime; + +import java.lang.reflect.Field; +import java.lang.reflect.Modifier; + +import com.mumfrey.liteloader.util.ModUtilities; + +public class Reflection { + private static Field MODIFIERS = null; + + static { + try { + Reflection.MODIFIERS = (java.lang.reflect.Field.class).getDeclaredField("modifiers"); + Reflection.MODIFIERS.setAccessible(true); + } catch (Exception ex) { + ex.printStackTrace(); + } + } + + /** + * ModLoader function, set a private value on the specified object + * + * @param instanceClass Class which the member belongs to (may be a + * superclass of the actual instance object's class) + * @param instance Object instance to set the value in + * @param fieldName Name of the field to set + * @param value Value to set for the field + */ + @SuppressWarnings("deprecation") + public static void setPrivateValue(Class instanceClass, Object instance, String fieldName, + String obfuscatedFieldName, String seargeName, Object value) + throws IllegalArgumentException, SecurityException, NoSuchFieldException { + Reflection.setPrivateValueRaw(instanceClass, instance, + ModUtilities.getObfuscatedFieldName(fieldName, obfuscatedFieldName, seargeName), value); + } + + /** + * ModLoader function, set a private value on the specified object + * + * @param instanceClass Class which the member belongs to (may be a + * superclass of the actual instance object's class) + * @param instance Object instance to set the value in + * @param fieldName Name of the field to set + * @param value Value to set for the field + */ + public static void setPrivateValue(Class instanceClass, Object instance, String fieldName, Object value) + throws IllegalArgumentException, SecurityException, NoSuchFieldException { + Reflection.setPrivateValueRaw(instanceClass, instance, fieldName, value); + } + + /** + * ModLoader function, get a private value from the specified object + * + * @param instanceClass Class which the member belongs to (may be a + * superclass of the actual instance object's class) + * @param instance Object instance to get the value from + * @param fieldName Name of the field to get the value of + * @return Value of the field + */ + @SuppressWarnings({ "unchecked", "deprecation" }) + public static T getPrivateValue(Class instanceClass, Object instance, String fieldName, + String obfuscatedFieldName, String seargeName) + throws IllegalArgumentException, SecurityException, NoSuchFieldException { + return (T) Reflection.getPrivateValueRaw(instanceClass, instance, + ModUtilities.getObfuscatedFieldName(fieldName, obfuscatedFieldName, seargeName)); + } + + /** + * ModLoader function, get a private value from the specified object + * + * @param instanceClass Class which the member belongs to (may be a + * superclass of the actual instance object's class) + * @param instance Object instance to get the value from + * @param fieldName Name of the field to get the value of + * @return Value of the field + */ + @SuppressWarnings("unchecked") + public static T getPrivateValue(Class instanceClass, Object instance, String fieldName) + throws IllegalArgumentException, SecurityException, NoSuchFieldException { + return (T) Reflection.getPrivateValueRaw(instanceClass, instance, fieldName); + } + + private static void setPrivateValueRaw(Class instanceClass, Object instance, String fieldName, Object value) + throws IllegalArgumentException, SecurityException, NoSuchFieldException { + try { + Field field = instanceClass.getDeclaredField(fieldName); + int modifiers = Reflection.MODIFIERS.getInt(field); + + if ((modifiers & Modifier.FINAL) != 0) { + Reflection.MODIFIERS.setInt(field, modifiers & 0xffffffef); + } + + field.setAccessible(true); + field.set(instance, value); + } catch (IllegalAccessException illegalaccessexception) {} + } + + public static Object getPrivateValueRaw(Class instanceClass, Object instance, String fieldName) + throws IllegalArgumentException, SecurityException, NoSuchFieldException { + try { + Field field = instanceClass.getDeclaredField(fieldName); + field.setAccessible(true); + return field.get(instance); + } catch (IllegalAccessException illegalaccessexception) { + return null; + } + } +} diff --git a/voxellib/src/main/java/com/voxelmodpack/common/sound/SoundEffect.java b/voxellib/src/main/java/com/voxelmodpack/common/sound/SoundEffect.java new file mode 100644 index 00000000..0b20d7ca --- /dev/null +++ b/voxellib/src/main/java/com/voxelmodpack/common/sound/SoundEffect.java @@ -0,0 +1,19 @@ +package com.voxelmodpack.common.sound; + +import net.minecraft.client.audio.ISound; +import net.minecraft.client.audio.PositionedSound; +import net.minecraft.util.ResourceLocation; + +public class SoundEffect extends PositionedSound { + public SoundEffect(ResourceLocation soundLocation, float volume, float pitch) { + super(soundLocation); + this.volume = volume; + this.pitch = pitch; + this.xPosF = 0.0F; + this.yPosF = 0.0F; + this.zPosF = 0.0F; + this.repeat = false; + this.repeatDelay = 0; + this.attenuationType = ISound.AttenuationType.NONE; + } +} diff --git a/voxellib/src/main/java/com/voxelmodpack/common/status/StatusMessage.java b/voxellib/src/main/java/com/voxelmodpack/common/status/StatusMessage.java new file mode 100644 index 00000000..1064dbc6 --- /dev/null +++ b/voxellib/src/main/java/com/voxelmodpack/common/status/StatusMessage.java @@ -0,0 +1,157 @@ +package com.voxelmodpack.common.status; + +import java.util.Random; + +import net.minecraft.client.gui.FontRenderer; + +/** + * A status message instance, this is returned from the manager to a mod to + * allow the mod to control its own status message display + * + * @author anangrybeaver + */ +public class StatusMessage implements Comparable { + /** + * Message format + */ + private static final String MESSAGE_FORMAT = "\247%s%s\247f: \247%s%s\247r"; + + private static final int MESSAGE_HEIGHT = 10; + + /** + * Colour for the title text + */ + private char titleColour = 'f'; + + /** + * Colour for the status text + */ + private char textColour = 'a'; + + /** + * The label for this particular status message, not displayed + */ + private final String label; + + /** + * Status message title + */ + private String title = ""; + + /** + * Status message text + */ + private String text = ""; + + /** + * Priority, for choosing display order + */ + private int priority = 0; + + /** + * Order the message was added, this is used to order messages which have + * the same priority + */ + private int order = 0; + + /** + * Show this message + */ + private boolean visible = false; + + public StatusMessage(String label) { + this.label = label; + this.order = new Random().nextInt(Integer.MAX_VALUE); + } + + public StatusMessage(String label, int priority, int order) { + this(label); + + this.priority = priority; + this.order = order; + } + + public StatusMessage setTitleAndText(String title, String text) { + this.title = title; + this.text = text; + return this; + } + + public StatusMessage setTitle(String title) { + this.title = title; + return this; + } + + public StatusMessage setText(String text) { + this.text = text; + return this; + } + + public StatusMessage setPriority(int priority) { + this.priority = priority; + return this; + } + + public StatusMessage setVisible(boolean visible) { + this.visible = visible; + return this; + } + + public StatusMessage setTextColour(char textColour) { + this.textColour = textColour; + return this; + } + + public StatusMessage setTitleColour(char titleColour) { + this.titleColour = titleColour; + return this; + } + + public StatusMessage setColours(char textColour, char titleColour) { + this.textColour = textColour; + this.titleColour = titleColour; + return this; + } + + public String getTitle() { + return this.title; + } + + public String getText() { + return this.text; + } + + public String getLabel() { + return this.label; + } + + public int getPriority() { + return this.priority; + } + + public boolean isVisible() { + return this.visible; + } + + public int drawStatus(FontRenderer fontRenderer, int xPos, int yPos) { + if (this.isVisible()) { + fontRenderer.drawStringWithShadow( + String.format(MESSAGE_FORMAT, this.titleColour, this.title, this.textColour, this.text), xPos, yPos, + 0xffffff); + return MESSAGE_HEIGHT; + } + + return 0; + } + + @Override + public int compareTo(StatusMessage other) { + if (other == null) + return 0; + + if (this.priority == other.priority) + return this.order - other.order; + + return this.priority - other.priority; + } +} diff --git a/voxellib/src/main/java/com/voxelmodpack/common/status/StatusMessageConfig.java b/voxellib/src/main/java/com/voxelmodpack/common/status/StatusMessageConfig.java new file mode 100644 index 00000000..e67b5370 --- /dev/null +++ b/voxellib/src/main/java/com/voxelmodpack/common/status/StatusMessageConfig.java @@ -0,0 +1,40 @@ +package com.voxelmodpack.common.status; + +import java.io.FileWriter; + +import com.mumfrey.liteloader.util.log.LiteLoaderLogger; +import com.voxelmodpack.common.properties.ModConfig; + +/** + * @author anangrybeaver + */ +public class StatusMessageConfig extends ModConfig { + public StatusMessageConfig() { + super("StatusMessage", "statusmessage.properties"); + } + + @Override + protected void createConfig() { + try { + this.config.setProperty("showStatuses", "true"); + this.config.store(new FileWriter(this.propertiesFile), null); + } catch (Exception e) { + LiteLoaderLogger.warning("%s> ERROR: %s", this.modName, e.toString()); + } + } + + @Override + public String getOptionDisplayString(String optionName) { + return null; + } + + @Override + public void toggleOption(String optionName) { + StatusMessageManager.getInstance().toggleOption(optionName); + } + + @Override + protected void setDefaults() { + this.defaults.setProperty("showStatuses", "true"); + } +} \ No newline at end of file diff --git a/voxellib/src/main/java/com/voxelmodpack/common/status/StatusMessageGUI.java b/voxellib/src/main/java/com/voxelmodpack/common/status/StatusMessageGUI.java new file mode 100644 index 00000000..e07029d4 --- /dev/null +++ b/voxellib/src/main/java/com/voxelmodpack/common/status/StatusMessageGUI.java @@ -0,0 +1,27 @@ +package com.voxelmodpack.common.status; + +import com.voxelmodpack.common.properties.VoxelPropertyCheckBox; +import com.voxelmodpack.common.properties.VoxelPropertyLabel; +import com.voxelmodpack.common.properties.gui.GuiVoxelBoxSettingsPanel; + +/** + * @author anangrybeaver + */ +public class StatusMessageGUI extends GuiVoxelBoxSettingsPanel { + public StatusMessageGUI() { + this.config = StatusMessageManager.getInstance().getConfig(); + + this.properties.add(new VoxelPropertyLabel("Status Settings", PANEL_LEFT + 15, PANEL_TOP + 10)); + this.properties.add(new VoxelPropertyCheckBox(this.config, "showStatuses", "Show Statuses", PANEL_LEFT + 20, + this.getRowYPos(0))); + } + + public int getRowYPos(int row) { + return 26 + (row * 20); + } + + @Override + public String getPanelTitle() { + return "Voxel Status Message"; + } +} \ No newline at end of file diff --git a/voxellib/src/main/java/com/voxelmodpack/common/status/StatusMessageManager.java b/voxellib/src/main/java/com/voxelmodpack/common/status/StatusMessageManager.java new file mode 100644 index 00000000..c8b6e133 --- /dev/null +++ b/voxellib/src/main/java/com/voxelmodpack/common/status/StatusMessageManager.java @@ -0,0 +1,101 @@ +package com.voxelmodpack.common.status; + +import static com.mumfrey.liteloader.gl.GL.*; + +import java.io.File; +import java.util.HashMap; +import java.util.Map; +import java.util.TreeSet; + +import net.minecraft.client.Minecraft; + +import com.mumfrey.liteloader.Tickable; +import com.mumfrey.liteloader.core.LiteLoader; +import com.voxelmodpack.common.properties.ModConfig; +import com.voxelmodpack.common.properties.gui.SettingsPanelManager; + +/** + * @author anangrybeaver + */ +public class StatusMessageManager implements Tickable { + private static StatusMessageManager instance; + + private static int order = 0; + + private Map statusMessages = new HashMap(); + private TreeSet sortedMessage = new TreeSet(); + private StatusMessageConfig config = new StatusMessageConfig(); + + private boolean showStatuses = true; + + @Override + public void init(File configPath) { + this.showStatuses = this.config.getBoolProperty("showStatuses"); + } + + public static StatusMessageManager getInstance() { + if (StatusMessageManager.instance == null) { + StatusMessageManager.instance = new StatusMessageManager(); + LiteLoader.getInterfaceManager().registerListener(StatusMessageManager.instance); + SettingsPanelManager.addSettingsPanel("Status MSG", StatusMessageGUI.class); + } + + return StatusMessageManager.instance; + } + + @Override + public void onTick(Minecraft minecraft, float partialTicks, boolean inGame, boolean clock) { + this.showStatuses = this.config.getBoolProperty("showStatuses"); + + if (minecraft.inGameHasFocus && !minecraft.gameSettings.hideGUI && !minecraft.gameSettings.showDebugInfo + && this.showStatuses) { + int xPos = 2; + int yPos = xPos; + + glDisableBlend(); + glEnableAlphaTest(); + glAlphaFunc(GL_GREATER, 0.1F); + + for (StatusMessage msg : this.sortedMessage) { + yPos += msg.drawStatus(minecraft.fontRendererObj, xPos, yPos); + } + } + } + + public StatusMessage getStatusMessage(String label, int priority) { + if (this.statusMessages.containsKey(label)) + return this.statusMessages.get(label); + + StatusMessage newMessage = new StatusMessage(label, priority, order++); + this.statusMessages.put(label, newMessage); + this.sortedMessage.add(newMessage); + + return newMessage; + } + + public void releaseStatusMessage(StatusMessage message) { + this.sortedMessage.remove(message); + this.statusMessages.remove(message); + } + + public ModConfig getConfig() { + return this.config; + } + + public void toggleOption(String optionName) { + this.config.setProperty(optionName, !this.config.getBoolProperty(optionName)); + } + + @Override + public String getName() { + return null; + } + + @Override + public String getVersion() { + return null; + } + + @Override + public void upgradeSettings(String version, File configPath, File oldConfigPath) {} +} diff --git a/voxellib/src/main/java/com/voxelmodpack/common/util/BrowserOpener.java b/voxellib/src/main/java/com/voxelmodpack/common/util/BrowserOpener.java new file mode 100644 index 00000000..0915a4f3 --- /dev/null +++ b/voxellib/src/main/java/com/voxelmodpack/common/util/BrowserOpener.java @@ -0,0 +1,53 @@ +package com.voxelmodpack.common.util; + +import java.awt.Desktop; +import java.io.IOException; +import java.net.URI; +import java.net.URISyntaxException; +import java.net.URL; + +/** + * Utility for opening the users default file/internet browser + * + * @author thatapplefreak + */ +public abstract class BrowserOpener { + /** + * Open via url + */ + public static void openURLinBrowser(URL url) { + try { + URI uri = url.toURI(); + Desktop.getDesktop().browse(uri); + } catch (URISyntaxException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + /** + * Open via uri + */ + public static void openURIinBrowser(URI uri) { + try { + Desktop.getDesktop().browse(uri); + } catch (IOException e) { + e.printStackTrace(); + } + } + + /** + * Open via string + */ + public static void openURLstringInBrowser(String url) { + try { + URI uri = new URI(url); + Desktop.getDesktop().browse(uri); + } catch (URISyntaxException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + } +} diff --git a/voxellib/src/main/java/com/voxelmodpack/common/util/ChatMessageBuilder.java b/voxellib/src/main/java/com/voxelmodpack/common/util/ChatMessageBuilder.java new file mode 100644 index 00000000..e289a733 --- /dev/null +++ b/voxellib/src/main/java/com/voxelmodpack/common/util/ChatMessageBuilder.java @@ -0,0 +1,180 @@ +package com.voxelmodpack.common.util; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.entity.EntityPlayerSP; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.event.ClickEvent; +import net.minecraft.event.ClickEvent.Action; +import net.minecraft.util.ChatComponentText; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.IChatComponent; + +/** + * Utility Class for building a chat message based on StringBuilder + * + * @author thatapplefreak + * @author Gabizou + * @author Mumfrey + */ +public class ChatMessageBuilder { + /** + * The message being built + */ + private final IChatComponent queuedMessage; + + public ChatMessageBuilder() { + this.queuedMessage = new ChatComponentText(""); + } + + /** + * Just add some plain text into the message + * + * @param text Text to add + */ + public ChatMessageBuilder append(String text) { + this.queuedMessage.appendSibling(new ChatComponentText(text)); + return this; + } + + /** + * Append some formatted text to this message + * + * @param format + * @param args + * @return fluent interface + */ + public ChatMessageBuilder append(String format, Object... args) { + this.queuedMessage.appendSibling(new ChatComponentText(String.format(format, args))); + return this; + } + + /** + * Add some coloured text into the message + * + * @param text The text in the message + * @param color The color in the message + */ + public ChatMessageBuilder append(String text, EnumChatFormatting color) { + IChatComponent addmsg = new ChatComponentText(text); + addmsg.getChatStyle().setColor(color); + this.queuedMessage.appendSibling(addmsg); + return this; + } + + /** + * Add some formatted text into the message + * + * @param text The text in the message + * @param color The color in the message + * @param underline Underline the text? + */ + public ChatMessageBuilder append(String text, EnumChatFormatting color, boolean underline) { + IChatComponent addmsg = new ChatComponentText(text); + addmsg.getChatStyle().setColor(color); + addmsg.getChatStyle().setUnderlined(underline); + this.queuedMessage.appendSibling(addmsg); + return this; + } + + /** + * @param comp + * @return + */ + public ChatMessageBuilder append(IChatComponent comp) { + this.queuedMessage.appendSibling(this.queuedMessage); + return this; + } + + /** + * Add a URL link into the message + * + * @param text The Link Text + * @param path The URL + */ + public ChatMessageBuilder append(String text, String path, boolean onAWebsite) { + this.append(text, EnumChatFormatting.WHITE, path, onAWebsite); + return this; + } + + /** + * Add a URL link into the message with color + * + * @param text The Link Text + * @param color Color of the link + * @param path The URL + */ + public ChatMessageBuilder append(String text, EnumChatFormatting color, String path, boolean onAWebsite) { + IChatComponent addmsg = new ChatComponentText(text); + addmsg.getChatStyle().setColor(color); + addmsg.getChatStyle().setUnderlined(true); + addmsg.getChatStyle().setChatClickEvent(new ClickEvent(onAWebsite ? Action.OPEN_URL : Action.OPEN_FILE, path)); + this.queuedMessage.appendSibling(addmsg); + return this; + } + + /** + * Put the message into chat + */ + public void showChatMessageIngame() { + Minecraft.getMinecraft().ingameGUI.getChatGUI().printChatMessage(this.queuedMessage); + } + + /** + * Dispatch this message as as a chat packet to the server + * + * @param recipient + */ + public void dispatch(EntityPlayerSP recipient) { + recipient.sendChatMessage(this.getUnformattedText()); + } + + /** + * Dispatch this message to the specified client recipients + * + * @param recipient + */ + public void dispatch(EntityPlayerMP... recipients) { + for (EntityPlayerMP recipient : recipients) { + if (recipient != null) { + recipient.addChatMessage(this.queuedMessage); + } + } + } + + /** + * Get the chat message being built by this builder + */ + public IChatComponent getMessage() { + return this.queuedMessage; + } + + /** + * Get the current unformatted text string represented by this builder + */ + public String getFormattedText() { + return this.queuedMessage.getFormattedText(); + } + + /** + * Get the current unformatted text string represented by this builder + */ + public String getUnformattedText() { + return this.queuedMessage.getUnformattedText(); + } + + /* + * (non-Javadoc) + * @see java.lang.Object#toString() + */ + @Override + public String toString() { + return this.getUnformattedText(); + } + + /** + * Get the current chat component as JSON + */ + public String toJson() { + return IChatComponent.Serializer.componentToJson(this.queuedMessage); + } +} \ No newline at end of file diff --git a/voxellib/src/main/java/com/voxelmodpack/common/util/ItemStackInfo.java b/voxellib/src/main/java/com/voxelmodpack/common/util/ItemStackInfo.java new file mode 100644 index 00000000..4aa9ab86 --- /dev/null +++ b/voxellib/src/main/java/com/voxelmodpack/common/util/ItemStackInfo.java @@ -0,0 +1,283 @@ +package com.voxelmodpack.common.util; + +import net.minecraft.block.Block; +import net.minecraft.client.Minecraft; +import net.minecraft.item.Item; +import net.minecraft.item.ItemFood; +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumChatFormatting; + +import com.mumfrey.liteloader.util.render.Icon; +import com.voxelmodpack.common.gui.interfaces.IListObject; + +/** + * Information about an enumerated item, for display in the item list + * + * @author Adam Mummery-Smith + */ +public class ItemStackInfo implements IListObject { + private int index; + + private Icon icon; + + /** + * Item name + */ + private String name, nameWithID; + + private Item item; + + private String itemId; + + private int damageValue; + + private ItemStack stack; + + /** + * Create a new item info + * + * @param id Item ID + * @param texture Item texture + * @param icon Item's icon index + */ + public ItemStackInfo(int index, Icon icon, int damage, ItemStack stack) { + this.index = index; + this.name = stack.getDisplayName(); + this.icon = icon; + this.damageValue = damage; + this.stack = stack; + } + + /** + * + */ + public void updateName() { + this.name = this.stack.getDisplayName(); + this.item = this.stack.getItem(); + this.itemId = ItemStackInfo.getItemIdentifier(this.item); + this.nameWithID = this.name + " " + EnumChatFormatting.LIGHT_PURPLE + this.itemId; + + if (this.damageValue > 0) + this.nameWithID += ":" + this.damageValue; + } + + /** + * True if the item has an icon that can be displayed in list boxes + */ + @Override + public boolean hasIcon() { + return true; + } + + @Override + public Icon getIcon() { + return this.icon; + } + + public String getName(boolean withID) { + return withID ? this.nameWithID : this.name; + } + + public int getDamage() { + return this.damageValue; + } + + public Item getItem() { + return this.item; + } + + public String getItemId() { + return this.itemId; + } + + public ItemStack getItemStack() { + return this.stack; + } + + public boolean compareTo(ItemStackInfo other) { + return (other.name.equalsIgnoreCase(this.name) && other.icon == this.icon); + } + + /** + * Get the display text to show in listboxes + * + * @return display text + */ + @Override + public String getText() { + return this.name; + } + + /** + * Get the display text to show in listboxes + * + * @return display text + */ + public String getSortText() { + String sortText = this.name; + + if (this.stack.getItem() instanceof ItemFood) + sortText += " food"; + if (this.name.toLowerCase().contains("wood")) + sortText += " wood"; + + return sortText; + } + + /** + * Get the item's ID + */ + @Override + public int getID() { + return this.index; + } + + /** + * Get the data associated with the item + */ + @Override + public Object getData() { + return null; + } + + /** + * Return the custom draw behaviour for the item + */ + @Override + public CustomDrawBehaviour getCustomDrawBehaviour() { + return CustomDrawBehaviour.NoCustomDraw; + } + + /** + * Handles custom drawing, this object does not support custom draw + * behaviour + */ + @Override + public void drawCustom(boolean iconEnabled, Minecraft minecraft, int mouseX, int mouseY, int xPosition, + int yPosition, int width, int height, int updateCounter) {} + + /** + * Handle mouse pressed, this object does not support this event + */ + @Override + public boolean mousePressed(boolean iconEnabled, Minecraft minecraft, int mouseX, int mouseY, int xPosition, + int yPosition, int width, int height) { + return false; + } + + /** + * Handle mouse released. + */ + @Override + public void mouseReleased(int mouseX, int mouseY) {} + + /** + * Get custom action. Not supported by this object, always returns an empty + * string. + */ + @Override + public String getCustomAction(boolean bClear) { + return ""; + } + + /** + * Get whether this object is draggable or not + */ + @Override + public boolean getDraggable() { + return false; + } + + @Override + public void setIconTexture(String newTexture) {} + + @Override + public void setIconID(int newIconId) {} + + @Override + public void setText(String newText) { + this.name = newText; + + } + + @Override + public void setID(int newId) {} + + @Override + public void setData(Object newData) {} + + @Override + public boolean getCanEditInPlace() { + return false; + } + + @Override + public boolean getEditingInPlace() { + return false; + } + + @Override + public void beginEditInPlace() {} + + @Override + public void endEditInPlace() {} + + @Override + public boolean editInPlaceKeyTyped(char keyChar, int keyCode) { + return false; + } + + @Override + public void editInPlaceDraw(boolean iconEnabled, Minecraft minecraft, int mouseX, int mouseY, int xPosition, + int yPosition, int width, int height, int updateCounter) {} + + @Override + public boolean editInPlaceMousePressed(boolean iconEnabled, Minecraft minecraft, int mouseX, int mouseY, + int xPosition, int yPosition, int width, int height) { + return false; + } + + @Override + public String serialise() { + return null; + } + + @Override + public void bindIconTexture() {} + + @Override + public int getIconSize() { + return 16; + } + + @Override + public int getIconTexmapSize() { + return 256; + } + + @Override + public String getDisplayName() { + return this.name.toLowerCase(); + } + + @Override + public void setDisplayName(String newDisplayName) {} + + public static String getItemIdentifier(Item item) { + String itemName = (String) Item.itemRegistry.getNameForObject(item); + return itemName == null ? "air" : ItemStackInfo.stripNamespace(itemName); + } + + public static String getBlockIdentifier(Block block) { + String blockName = (String) Block.blockRegistry.getNameForObject(block); + return blockName == null ? "air" : ItemStackInfo.stripNamespace(blockName); + } + + /** + * @param itemName + * @return + */ + private static String stripNamespace(String itemName) { + return itemName.startsWith("minecraft:") ? itemName.substring(10) : itemName; + } +} diff --git a/voxellib/src/main/java/com/voxelmodpack/common/util/RenderItemEx.java b/voxellib/src/main/java/com/voxelmodpack/common/util/RenderItemEx.java new file mode 100644 index 00000000..616b0726 --- /dev/null +++ b/voxellib/src/main/java/com/voxelmodpack/common/util/RenderItemEx.java @@ -0,0 +1,51 @@ +package com.voxelmodpack.common.util; + +import static com.mumfrey.liteloader.gl.GL.*; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.FontRenderer; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.renderer.WorldRenderer; +import net.minecraft.client.renderer.entity.RenderItem; +import net.minecraft.item.ItemStack; + +public class RenderItemEx extends RenderItem { + public RenderItemEx() { + super(Minecraft.getMinecraft().getTextureManager(), + Minecraft.getMinecraft().getRenderItem().getItemModelMesher().getModelManager()); + } + + /** + * Render the item's icon or block into the GUI, including the glint effect. + */ + @Override + public void renderItemOverlays(FontRenderer fontRenderer, ItemStack stack, int xPos, int yPos) { + if (stack != null) { + this.drawRect(xPos, yPos, 16, 16, 1, 0, 0, 1); + this.drawRect(xPos + 1, yPos + 1, 14, 14, 0.6F, 0, 0, 1); + super.renderItemOverlays(fontRenderer, stack, xPos, yPos); + } + } + + @SuppressWarnings("cast") + private void drawRect(int x, int y, int width, int height, float r, float g, float b, float a) { + glPushAttrib(GL_ALL_ATTRIB_BITS); + glDisableDepthTest(); + glDepthFunc(GL_GREATER); + glDisableLighting(); + glDepthMask(false); + glEnableBlend(); + glDisableTexture2D(); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glColor4f(r, g, b, a); + Tessellator tessellator = Tessellator.getInstance(); + WorldRenderer worldRender = tessellator.getWorldRenderer(); + worldRender.startDrawingQuads(); + worldRender.addVertex((double) (x + 0), (double) (y + 0), 0.0D); + worldRender.addVertex((double) (x + 0), (double) (y + height), 0.0D); + worldRender.addVertex((double) (x + width), (double) (y + height), 0.0D); + worldRender.addVertex((double) (x + width), (double) (y + 0), 0.0D); + tessellator.draw(); + glDepthMask(true); + glPopAttrib(); + } +} diff --git a/voxellib/src/main/java/com/voxelmodpack/common/util/Util.java b/voxellib/src/main/java/com/voxelmodpack/common/util/Util.java new file mode 100644 index 00000000..3a725036 --- /dev/null +++ b/voxellib/src/main/java/com/voxelmodpack/common/util/Util.java @@ -0,0 +1,21 @@ +package com.voxelmodpack.common.util; + +import net.minecraft.client.Minecraft; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.server.integrated.IntegratedServer; + +/** + * Utility functions + */ +public final class Util { + public static EntityPlayer getPlayerMP() { + Minecraft mc = Minecraft.getMinecraft(); + IntegratedServer server = mc.getIntegratedServer(); + + if (server != null) { + return server.getConfigurationManager().getPlayerByUsername(server.getServerOwner()); + } + + return Minecraft.getMinecraft().thePlayer; + } +} diff --git a/voxellib/src/main/java/com/voxelmodpack/common/xml/XmlHelper.java b/voxellib/src/main/java/com/voxelmodpack/common/xml/XmlHelper.java new file mode 100644 index 00000000..d2f23ed2 --- /dev/null +++ b/voxellib/src/main/java/com/voxelmodpack/common/xml/XmlHelper.java @@ -0,0 +1,344 @@ +package com.voxelmodpack.common.xml; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.StringWriter; +import java.util.ArrayList; + +import javax.xml.namespace.NamespaceContext; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.transform.OutputKeys; +import javax.xml.transform.Transformer; +import javax.xml.transform.TransformerConfigurationException; +import javax.xml.transform.TransformerException; +import javax.xml.transform.TransformerFactory; +import javax.xml.transform.dom.DOMSource; +import javax.xml.transform.stream.StreamResult; +import javax.xml.xpath.XPath; +import javax.xml.xpath.XPathConstants; +import javax.xml.xpath.XPathExpressionException; +import javax.xml.xpath.XPathFactory; + +import org.w3c.dom.Document; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; +import org.xml.sax.SAXException; + +/** + * XML helper functions to make working with XML less of a nuisance + * + * @author Adam Mummery-Smith + */ +public class XmlHelper { + /** + * xpath evaluator + */ + private static XPath xpath; + + /** + * Namespace context helper for resolving namespaces + */ + private static XmlNamespaceContext staticNamespaceContext; + + /** + * Factory for document builders + */ + private static DocumentBuilderFactory documentBuilderFactory; + + /** + * Document builder + */ + private static DocumentBuilder documentBuilder; + + /** + * Factory for transformers (not the big robotic kind, the small boring + * kind) + */ + private static TransformerFactory transformerFactory; + + /** + * Robots in disguise! (Wait, no...) + */ + private static Transformer transformer; + + static { + // XML namespace manager which is used if a context is not specified + XmlHelper.staticNamespaceContext = new XmlNamespaceContext(); + + // Create the xpath evaluator + XmlHelper.xpath = XPathFactory.newInstance().newXPath(); + XmlHelper.xpath.setNamespaceContext(XmlHelper.staticNamespaceContext); + + // Create the document builder factory and enable namespaces + XmlHelper.documentBuilderFactory = DocumentBuilderFactory.newInstance(); + XmlHelper.documentBuilderFactory.setNamespaceAware(true); + XmlHelper.createDocumentBuilder(XmlHelper.documentBuilderFactory); + + // Create the transformer factory + XmlHelper.transformerFactory = TransformerFactory.newInstance(); + XmlHelper.createTransformer(XmlHelper.transformerFactory); + } + + /** + * Attempts to create the document builder if one is not initialised + * already. This may fail in which case the function will return FALSE + * + * @param factory + * @return + */ + protected static boolean createDocumentBuilder(DocumentBuilderFactory factory) { + if (XmlHelper.documentBuilder == null) { + try { + // Create the document builder + XmlHelper.documentBuilder = XmlHelper.documentBuilderFactory.newDocumentBuilder(); + } catch (ParserConfigurationException e) { + return false; + } + } + + return true; + } + + /** + * Attempts to create the dom transformer if one is not initialised already. + * This may fail in which case the function will return FALSE + * + * @param factory + * @return + */ + protected static boolean createTransformer(TransformerFactory factory) { + if (XmlHelper.transformer == null) { + try { + XmlHelper.transformer = XmlHelper.transformerFactory.newTransformer(); + } catch (TransformerConfigurationException e) { + return false; + } + + // Set transformer properties for the desired output layout that we + // need for transformation + XmlHelper.transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "no"); + XmlHelper.transformer.setOutputProperty(OutputKeys.INDENT, "yes"); + XmlHelper.transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4"); + } + + return true; + } + + /** + * Create and return a new, empty document. Returns null if the document + * builder cannot be initialised + * + * @return new document + */ + public static Document newDocument() { + return (XmlHelper.createDocumentBuilder(XmlHelper.documentBuilderFactory)) + ? XmlHelper.documentBuilder.newDocument() : null; + } + + /** + * Loads a document from the specified URI. Returns null if the document + * builder cannot be initialised + * + * @param uri URI to load the xml from + * @return new document + */ + public static Document getDocument(String uri) throws SAXException, IOException { + return (XmlHelper.createDocumentBuilder(XmlHelper.documentBuilderFactory)) + ? XmlHelper.documentBuilder.parse(uri) : null; + } + + /** + * Loads a document from the specified URI. Returns null if the document + * builder cannot be initialised + * + * @param is InputStream to load the xml from + * @return new document + */ + public static Document getDocument(InputStream is) throws SAXException, IOException { + return (XmlHelper.createDocumentBuilder(XmlHelper.documentBuilderFactory)) ? XmlHelper.documentBuilder.parse(is) + : null; + } + + /** + * Loads a document from the specified file. Returns null if the document + * builder cannot be initialised + * + * @param file File to load from + * @return new document + */ + public static Document getDocument(File file) throws SAXException, IOException { + return (XmlHelper.createDocumentBuilder(XmlHelper.documentBuilderFactory)) + ? XmlHelper.documentBuilder.parse(file) : null; + } + + /** + * Attempts to save the specified document to the specified file + * + * @param file File to save to + * @param document DOM Document to save + * @return True if the file was saved successfully, false if saving the file + * failed + */ + public static boolean saveDocument(File file, Document document) { + if (XmlHelper.createTransformer(XmlHelper.transformerFactory)) { + try { + XmlHelper.transformer.transform(new DOMSource(document), new StreamResult(file)); + return true; + } catch (TransformerException e) {} + } + + return false; + } + + /** + * @param document + * @return + */ + public static String getDocumentContent(Document document) { + if (XmlHelper.createTransformer(XmlHelper.transformerFactory)) { + try { + StringWriter writer = new StringWriter(); + XmlHelper.transformer.transform(new DOMSource(document), new StreamResult(writer)); + writer.flush(); + return writer.getBuffer().toString(); + } catch (TransformerException e) {} + } + + return null; + } + + /** + * Add a namespace prefix to the current static namespace manager + * + * @param prefix + * @param namespaceURI + */ + public static void addNamespacePrefix(String prefix, String namespaceURI) { + XmlHelper.staticNamespaceContext.addPrefix(prefix, namespaceURI); + } + + /** + * Clear namespace prefixes in the current static namespace context + */ + public static void clearNamespacePrefixList() { + XmlHelper.staticNamespaceContext.clear(); + } + + /** + * Replace the current static namespace context with the supplied namespace + * context + * + * @param namespaceContext + */ + public static void setNamespaceContext(XmlNamespaceContext namespaceContext) { + if (namespaceContext != null) { + XmlHelper.staticNamespaceContext = namespaceContext; + } + } + + /** + * @param xml + * @param xPath + * @return + */ + public static NodeList query(Node xml, String xPath) { + return XmlHelper.query(xml, xPath, XmlHelper.staticNamespaceContext); + } + + public static NodeList query(Node xml, String xPath, NamespaceContext namespaceContext) { + try { + XmlHelper.xpath.setNamespaceContext(namespaceContext); + + // System.out.println("Result is: " + xpath.evaluate(xPath, xml)); + return (NodeList) XmlHelper.xpath.evaluate(xPath, xml, XPathConstants.NODESET); + } catch (XPathExpressionException e) { + e.printStackTrace(); + return null; + } + } + + public static ArrayList queryAsArray(Node xml, String xPath) { + return XmlHelper.queryAsArray(xml, xPath, XmlHelper.staticNamespaceContext); + } + + public static ArrayList queryAsArray(Node xml, String xPath, NamespaceContext namespaceContext) { + ArrayList nodes = new ArrayList(); + NodeList result = XmlHelper.query(xml, xPath, namespaceContext); + + if (result != null) { + for (int nodeIndex = 0; nodeIndex < result.getLength(); nodeIndex++) + nodes.add(result.item(nodeIndex)); + } + + return nodes; + } + + public static Node getNode(Node node, String nodeName) { + return XmlHelper.getNode(node, nodeName, XmlHelper.staticNamespaceContext); + } + + public static Node getNode(Node node, String nodeName, NamespaceContext namespaceContext) { + try { + XmlHelper.xpath.setNamespaceContext(namespaceContext); + return (Node) XmlHelper.xpath.evaluate(nodeName, node, XPathConstants.NODE); + } catch (XPathExpressionException e) {} + + return null; + } + + public static String getNodeValue(Node node, String nodeName, String defaultValue) { + return XmlHelper.getNodeValue(node, nodeName, defaultValue, XmlHelper.staticNamespaceContext); + } + + public static String getNodeValue(Node node, String nodeName, String defaultValue, + NamespaceContext namespaceContext) { + try { + XmlHelper.xpath.setNamespaceContext(namespaceContext); + NodeList nodes = (NodeList) XmlHelper.xpath.evaluate(nodeName, node, XPathConstants.NODESET); + + if (nodes.getLength() > 0) + return nodes.item(0).getTextContent(); + } catch (XPathExpressionException e) { + e.printStackTrace(); + } + + return defaultValue; + } + + public static int getNodeValue(Node node, String nodeName, int defaultValue) { + return XmlHelper.getNodeValue(node, nodeName, defaultValue, XmlHelper.staticNamespaceContext); + } + + public static int getNodeValue(Node node, String nodeName, int defaultValue, NamespaceContext namespaceContext) { + String nodeValue = XmlHelper.getNodeValue(node, nodeName, "" + defaultValue, namespaceContext); + + try { + return Integer.parseInt(nodeValue); + } catch (NumberFormatException ex) { + return defaultValue; + } + } + + public static String getAttributeValue(Node node, String attributeName, String defaultValue) { + Node attribute = node.getAttributes().getNamedItem(attributeName); + + if (attribute != null) { + return attribute.getTextContent(); + } + + return defaultValue; + } + + public static int getAttributeValue(Node node, String attributeName, int defaultValue) { + String attributeValue = XmlHelper.getAttributeValue(node, attributeName, "" + defaultValue); + + try { + return Integer.parseInt(attributeValue); + } catch (NumberFormatException ex) { + return defaultValue; + } + } +} diff --git a/voxellib/src/main/java/com/voxelmodpack/common/xml/XmlNamespaceContext.java b/voxellib/src/main/java/com/voxelmodpack/common/xml/XmlNamespaceContext.java new file mode 100644 index 00000000..39c7b6ef --- /dev/null +++ b/voxellib/src/main/java/com/voxelmodpack/common/xml/XmlNamespaceContext.java @@ -0,0 +1,44 @@ +package com.voxelmodpack.common.xml; + +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map.Entry; + +import javax.xml.namespace.NamespaceContext; + +/** + * Xmlns for Xml Helper + * + * @author Adam Mummery-Smith + */ +public class XmlNamespaceContext implements NamespaceContext { + private HashMap prefixes = new HashMap(); + + public void addPrefix(String prefix, String namespaceURI) { + this.prefixes.put(prefix, namespaceURI); + } + + public void clear() { + this.prefixes.clear(); + } + + @Override + public Iterator getPrefixes(String namespaceURI) { + return this.prefixes.keySet().iterator(); + } + + @Override + public String getPrefix(String namespaceURI) { + for (Entry prefix : this.prefixes.entrySet()) { + if (prefix.getValue().equals(namespaceURI)) + return prefix.getKey(); + } + + return null; + } + + @Override + public String getNamespaceURI(String prefix) { + return this.prefixes.get(prefix); + } +} diff --git a/voxellib/src/main/resources/assets/voxelcommon/textures/gui/guiparts.png b/voxellib/src/main/resources/assets/voxelcommon/textures/gui/guiparts.png new file mode 100644 index 0000000000000000000000000000000000000000..9f93565f64ffd048768be697bb474fa2556b4914 GIT binary patch literal 12892 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 M`?~6-sx}e-3)x@zOaK4? literal 0 HcmV?d00001 diff --git a/voxellib/src/main/resources/litemod.json b/voxellib/src/main/resources/litemod.json new file mode 100644 index 00000000..96cd31b6 --- /dev/null +++ b/voxellib/src/main/resources/litemod.json @@ -0,0 +1,8 @@ +{ + "name": "voxellib", + "mcversion": "1.7.10", + "version": "2.3.1", + "revision": "234", + "author": "The VoxelModPack Team", + "description": "VoxelLib contains all of the shared functionality for the VoxelModPack mods" +}