Compare commits

..
374 Commits
Author SHA1 Message Date
mezz 703e99e916 Bump version for first 1.11.2 release 2017-07-28 21:47:08 -07:00
mezz f73667c173 Fix grade git changelog 2017-07-28 21:38:27 -07:00
mezz 0101eae8f8 Make gradlew executable 2017-07-28 20:56:54 -07:00
mezz 5be32a2a3a Set up gradle for jenkins and auto-upload to curse 2017-07-28 20:49:07 -07:00
Alexander Kornilov 3ff4957a10 Feature/code improve (#221)
* Code improvement for genetics.api
Code improvement for genetics.core
Fix missed localization for info of Lab Stand
* Code improvement for genetics.genetics package
2017-07-16 18:08:38 -07:00
Alexander Kornilov 9e1ec59b86 Feature/refactoring (#211)
* Some code improve readability for botany.ceramic package
* Code improvement for botany.core package
* Code improvement for botany.craftgui package
* Fixed TextJustification from all code files
* Code improvement for botany.farm package
* Code improvement for botany.flower
* Code improvement for root botany package
Code improvement for botany.network package
Code improvement for botany.proxypackage
* Code improvement for botany.gargdening package
Added missed localization for Soil Meter
* Code improvement for botany.genetic package
* Code improvement for botany.items package
* Removed "// TODO fix deprecated" comment
* Reformatted code by Forestry format settings
* Reformat code with new format settings
2017-07-15 12:27:20 -07:00
Alexander Kornilov 0aa9853da2 Feature/refactoring (#207)
* Fixed deprecated I18n usage
* Code improve readability for botany.api package
* Fix naming of templateAsGenome method params
2017-07-14 22:48:11 -07:00
mezz 96fe27e834 Cleanup 2017-07-13 23:35:09 -07:00
mezz 934bb3b8f9 Fix #162 Crash when hovering over drinks with AppleSkin and AppleCore 2017-07-13 23:25:53 -07:00
mezz 83d9da7797 Update gradle and dependencies 2017-07-13 23:11:57 -07:00
Nedelosk 1e0d11b1ac Merge branch 'master-MC1.11.2' of https://github.com/ForestryMC/Binnie into master-MC1.11.2 2017-07-10 00:48:04 +02:00
Nedelosk 808b04c3b8 More localisation 2017-07-10 00:47:53 +02:00
marcin212 2425ae959e Fixed recipe for Apiarist Database 2017-07-08 14:36:12 +02:00
marcin212 3679551882 Fixed SOF when machine has full inventory 2017-07-08 14:35:30 +02:00
marcin212 83fd00cad5 Fixed brewery recipes 2017-07-07 13:41:45 +02:00
marcin212 f3d93b47b9 Fixed shitf-click stack overflow #180 2017-07-07 12:34:32 +02:00
marcin212 62fc457808 Fixed second NPE in machines 2017-07-06 20:00:37 +02:00
marcin212 2811aabc2e Fixed NPE in machines 2017-07-06 15:04:19 +02:00
marcin212 8573f087eb Fixed blue/black background in machines GUI 2017-07-06 15:03:55 +02:00
marcin212 d0215ce0aa Color changed to hex 2017-07-06 15:00:40 +02:00
Nedelosk b6d5901f07 Star to rework Machine localisation 2017-06-28 19:10:09 +02:00
Nedelosk 18f30c8c0d Fix Farm Circuit Dictionary localisation 2017-06-28 16:07:19 +02:00
Nedelosk cf8634546c Fix Botany Dictionary localisation 2017-06-27 18:25:04 +02:00
Nedelosk 864e5e0dfc Add Botany Dictionary localisation 2017-06-27 17:42:13 +02:00
Nedelosk 6df4570bca Improve ceramic localization 2017-06-27 16:56:02 +02:00
Nedelosk e0d23ada41 Change colour to color 2017-06-27 16:35:15 +02:00
Nedelosk b7b663640d Improve insulated tube and color localization 2017-06-27 16:33:41 +02:00
Nedelosk 9989eef753 Improve flower localization 2017-06-27 16:01:25 +02:00
Nedelosk 941c377c58 Improve localization 2017-06-27 15:10:47 +02:00
Nedelosk be827a17a7 Moving gardening helper class to the api 2017-06-27 14:01:56 +02:00
Nedelosk beb1ba9ae1 Clean Up Soil and Plank Block 2017-06-27 13:22:32 +02:00
Nedelosk 709d80adc6 Fix #151 [1.11.2] Implement Hive Attack 2017-06-27 12:54:53 +02:00
Nedelosk 552a907d58 Fix #157 Using normal logs in the logs to planks recipe always produces fireproof planks 2017-06-26 18:56:39 +02:00
Nedelosk e0409c17ba Update Forestry and add village hope field 2017-06-26 14:52:52 +02:00
Nedelosk b1de19e1f1 Change the machine sink tier from 1 to 4 2017-06-25 14:06:16 +02:00
Nedelosk 09754111f0 Add hops as a grass seed 2017-06-25 01:50:40 +02:00
Nedelosk a7da3c5297 Fix machine particle texture 2017-06-24 15:48:29 +02:00
Nedelosk 866e8d0711 Fix #149 GUI scrollbar working differently 2017-06-24 15:22:29 +02:00
Nedelosk bbc87beb38 Improve Glass Fix #148, Fix #147 2017-06-24 15:08:59 +02:00
Nedelosk d0cb769a2b Update Forestry and Fix #143 2017-06-24 14:30:16 +02:00
Nedelosk d678903d68 Improve Extra Trees Wood Fix #144, Fix #145, Fix #146 2017-06-24 13:54:54 +02:00
Nedelosk 140df9ce4e Merge remote-tracking branch 'origin/master-MC1.11.2' into master-MC1.11.2 2017-06-24 01:50:51 +02:00
Nedelosk db2f4b7360 Add hops crop 2017-06-24 01:50:32 +02:00
marcin212 b9dfb8ee31 Fixed block alveary 2017-06-23 00:01:00 +02:00
marcin212 a408df86ed Fixed Alveary transmitter and lighting 2017-06-22 23:52:20 +02:00
Nedelosk 564f586c58 Fix #137 [1.11.2] Lumbermill keeps working when bark and sawdust slots full. 2017-06-21 20:27:04 +02:00
marcin212 05308e82c8 Added recipes for glassware 2017-06-21 12:01:51 +02:00
marcin212 e9d5c638c7 Fixed crash without IC2 2017-06-18 17:59:22 +02:00
Nedelosk a51bfd196c Add drink models 2017-06-18 02:24:56 +02:00
Nedelosk 81f632168b Add et wood doors 2017-06-17 13:42:07 +02:00
Nedelosk 6ec7808b25 Fix #115 Add a botanist backpack recipe and fix OreDictionary integration 2017-06-17 01:44:59 +02:00
Nedelosk f3770bf545 Add a botanist backpack Fix #115 2017-06-16 14:08:11 +02:00
marcin212 2a873e8bfb Merge branch 'master-MC1.11.2' of https://github.com/ForestryMC/Binnie into master-MC1.11.2
# Conflicts:
#	src/main/java/binnie/extrabees/worldgen/ExtraBeesWorldGenerator.java
#	src/main/java/binnie/extrabees/worldgen/WorldGenHiveNether.java
2017-06-16 12:49:49 +02:00
marcin212 6968ebed3f Added marble bees #36 2017-06-16 12:46:38 +02:00
Nedelosk 88c7daf024 Move drain input fluid from onFinishTask to onUpdate 2017-06-16 00:58:03 +02:00
Nedelosk e72bda24e3 Merge remote-tracking branch 'origin/master-MC1.11.2' into master-MC1.11.2 2017-06-16 00:55:12 +02:00
Nedelosk b3e514355b Fix #119 Infinity Alcohol crafting and some other brewery bugs 2017-06-16 00:54:46 +02:00
marcin212 c530745d8e Merge branch 'master-MC1.11.2' of https://github.com/ForestryMC/Binnie into master-MC1.11.2 2017-06-15 23:12:56 +02:00
marcin212 c30629eac4 Fixed ic2 mod id in optional method 2017-06-15 23:12:17 +02:00
Nedelosk 10e641506e Optimize imports 2017-06-15 23:11:48 +02:00
Nedelosk f1df70aeec Fix #98 Analyzer doesn't add researched data to the tracker. 2017-06-15 23:06:19 +02:00
marcin212 0d35e58106 Added flower farm harvesting logic #126 2017-06-15 22:44:50 +02:00
Nedelosk ae1168ea60 Fixed Compartment dupe bug 2017-06-15 22:41:54 +02:00
Nedelosk a91c578829 Add ic2 energy support back to power components 2017-06-15 22:26:30 +02:00
Nedelosk 7ac50de818 Add ic2 energy support back to IPoweredMachine 2017-06-15 22:18:50 +02:00
Nedelosk a61b6c9397 Add modelmanager back 2017-06-15 21:33:26 +02:00
Nedelosk 8ccb633925 Clean Up 2017-06-15 21:27:17 +02:00
Nedelosk 96a747518e Remove license header from IItemModelProvider 2017-06-15 21:16:59 +02:00
Nedelosk 31d0a03d3f Clean Up and fix some bugs 2017-06-15 21:15:09 +02:00
Nedelosk 21752a8b28 Update Forestry 2017-06-15 19:52:46 +02:00
Nedelosk ef371173c9 Make the honey crystal to a energy storage 2017-06-15 19:41:41 +02:00
Nedelosk d460bcab77 Clean Up ModuleItems and add two fluid names to ManagerLiquid 2017-06-15 17:08:13 +02:00
Nedelosk c5d0520299 Fix #23 Corn recipe yields barley grain 2017-06-15 16:45:32 +02:00
marcin212 bf40504ddf Fixed spawn fruit block 2017-06-14 15:20:26 +02:00
marcin212 e0ab7a89cc Removed null parameter 2017-06-14 15:18:09 +02:00
marcin212 24fd7e89d3 Updated Forge, Forestry and JEI 2017-06-14 12:59:26 +02:00
marcin212 287b1a5b10 Clean up 2017-06-14 12:58:32 +02:00
marcin212 81a2268e1d Fixed synchronization with container 2017-06-13 13:12:18 +02:00
marcin212 7ddd7d976e Fixed selecting distillery level 2017-06-13 11:36:52 +02:00
marcin212 d43d770024 Fixed drop of Corrosive bees 2017-06-11 20:35:11 +02:00
marcin212 876b214a97 Fixed leaves 2017-06-11 16:38:49 +02:00
marcin212 57eea26c1a Fixed creative Gene Database 2017-06-09 23:19:01 +02:00
marcin212 a5019da906 Merge branch 'master-MC1.11.2' of https://github.com/ForestryMC/Binnie into master-MC1.11.2 2017-06-09 21:08:39 +02:00
marcin212 0b3dbe6ef5 Fixed NPE caused by missing FlowerAlyzerPlugin 2017-06-09 21:07:45 +02:00
marcin212 c4db4fa664 Fixed missing textures for leaves 2017-06-09 20:43:53 +02:00
marcin212 99cef245d0 Fix flower rendering after reconnect. 2017-06-08 12:04:31 +02:00
marcin212 97a2b939cf Fixed flower tooltip formatting 2017-06-08 11:51:32 +02:00
marcin212 3ebb628a56 Fixed Fluid duplication in Incubator #103 2017-06-08 11:08:33 +02:00
marcin212 0c64d703d8 Fixed garden logic crash 2017-06-07 21:03:40 +02:00
marcin212 852c9a9a3e Fixed Player inventory in Gene Bank 2017-06-07 17:57:48 +02:00
marcin212 87ac2c18a3 Fixed rendering in MasterRegistry 2017-06-07 16:22:54 +02:00
marcin212 3aa8fb19c7 Added Nonnull 2017-06-07 16:22:19 +02:00
marcin212 ab03f3f734 Fixed Crash when placing flower on soil #104 2017-06-07 15:38:05 +02:00
marcin212 9fb03893b2 Fixed wrong import 2017-06-05 23:50:28 +02:00
marcin212 e6b087319c Fixed #101 TileEntityMachine has throw an exception trying to write state. 2017-06-05 23:19:21 +02:00
marcin212 aa567e190e remove unsed import 2017-06-05 21:57:04 +02:00
marcin212 6907f4159e Fixed incubator recipes 2017-06-05 21:56:47 +02:00
marcin212 dc2c63c856 Fixed Inoculator don't need Bacteria Vector to process #66 2017-06-05 21:06:30 +02:00
marcin212 dde90817d7 Fixed progress texture for Acclimatiser 2017-06-05 20:44:43 +02:00
marcin212 559ab4176d Fixed wrong texture in WindowPolymeriser 2017-06-05 20:21:11 +02:00
marcin212 5f234cc94e Fixed IndexOutOfBoundsException when crafting in 2x2 grid 2017-06-05 20:07:07 +02:00
marcin212 3936c0d377 Removed unused imports 2017-06-05 19:50:15 +02:00
marcin212 9fae7c1866 Fixed Sequencer progress control 2017-06-05 19:44:54 +02:00
marcin212 814b717aaf Fixed crash caused by opening Registry 2017-06-05 19:41:52 +02:00
marcin212 314e632e47 Fixed rotating block design 2017-06-05 19:39:56 +02:00
marcin212 e1fbb78c8a Fixed world generating lag 2017-06-05 19:38:45 +02:00
marcin212 f85e312c1a Fixed wooden tile kicks player from server when placing #90 2017-06-05 19:37:24 +02:00
marcin212 f4903fc1bc Fixed hives drop #97 2017-06-05 01:09:16 +02:00
marcin212 248a07e311 Fixed color of bees 2017-06-05 01:08:29 +02:00
marcin212 8f0bdf698a Fixed #98 2017-06-05 00:22:32 +02:00
marcin212 218e1c6f8c Fixed #89 2017-06-04 23:38:07 +02:00
marcin212 14bedffe0e Fixed NPE 2017-06-04 23:37:45 +02:00
marcin212 b772f7c305 Fixed lumbermill crash 2017-06-04 22:47:56 +02:00
marcin212 c8be69796f Fixed #99 2017-06-04 22:44:07 +02:00
marcin212 41bf3bfdbb Fixed some missing textures 2017-06-04 22:01:43 +02:00
Nedelosk 7a8dfc3012 Update forestry version 2017-06-04 00:45:36 +02:00
marcin212 04706d12c8 Fix bee mutations 2017-06-03 19:24:15 +02:00
marcin212 34d57cda35 Fix problem in PlankType with "getName", which conflicts during obfuscation. 2017-06-03 18:50:39 +02:00
marcin212 6c3eaca546 Remove unused imports 2017-06-03 18:14:13 +02:00
marcin212 05648ce05a Fix problem in EnumFlowerColor with "getName", which conflicts during obfuscation. 2017-06-03 18:11:05 +02:00
marcin212 b59f541a10 Fix extrabees dependencies 2017-06-03 17:49:00 +02:00
Alexander Kornilov 966f4e0693 Fix build script (#83)
* Fix build.gradlew
Added README.md

* Fix

* Fix build.gradle and README.md
2017-06-01 00:48:31 -07:00
Alexander Kornilov c3809fbc27 Some reformat code for 1.11.2 source (#84)
* Optimized imports

* Some code reformat

* Some refactoring and code reformat

* Some code reformat
2017-06-01 00:48:08 -07:00
Elec332 886c36a308 Fixed last dependancies on one another 2017-05-14 21:14:21 +02:00
Elec332 0630d0e0f1 Added item filters for alveary parts & added recipes for alveary parts 2017-05-14 20:48:17 +02:00
Elec332 2dac035df0 Separation basically done 2017-05-13 22:25:42 +02:00
Elec332 b7da877963 Moved punnett square and apiarist database to the genetics mod 2017-05-13 18:42:38 +02:00
Elec332 34a9a90ab3 Fixed textures, split the alveary stuff, onlt GUI left to do! 2017-05-13 17:10:55 +02:00
Elec332 a5e27bfd47 Only the client and apiary packages left to do! 2017-05-13 11:59:49 +02:00
Elec332 60607354dd Split the proxy from the rest 2017-05-12 21:57:54 +02:00
Elec332 2c45413a6b Fixes and more ExtraBees unhooking stuff 2017-05-12 20:49:12 +02:00
Elec332 1828ad9f3b Packages done: worldgen, utils, items, init, genetics & blocks. Now on to the hard part... 2017-05-12 18:13:06 +02:00
Elec332 a1aa3661d5 Unhook mutation & species classes 2017-05-12 17:25:44 +02:00
Elec332 b12d19c9ea More work on splitting ExtraBees 2017-05-12 16:02:25 +02:00
Elec332 ac05f9013a Started on splitting ExtraBees 2017-05-12 12:32:53 +02:00
mezz 601e20fe99 Move the strange block-scope class SpeciesList which was breaking S2S
See https://github.com/MinecraftForge/Srg2Source/issues/18
2017-05-09 23:14:18 -07:00
mezz 9e47e018cf Add .travis.yml 2017-05-09 14:22:29 -07:00
mezz a97f5a2baa SideOnly fixes 2017-04-19 01:57:44 -07:00
mezz 14c107ab71 Minor cleanup and fixes 2017-04-19 01:57:02 -07:00
mezz 3bb678258f Clean up some null annotations 2017-04-19 00:52:10 -07:00
mezz cc20e2d339 Clean up some parameter names 2017-04-19 00:15:55 -07:00
Nedelosk f5e52163b4 Clean Up 2017-04-12 15:59:06 +02:00
Nedelosk d3b2c99c60 Some todos 2017-04-12 15:46:47 +02:00
marcin212 fd0783afee Fix effect: Power 2017-04-12 13:14:54 +02:00
marcin212 319bf4ea2c Fix item rotation in GUI 2017-04-12 13:07:14 +02:00
Nedelosk d1306b174c Fix Size MultiFenceRecipe 2017-04-11 23:02:01 +02:00
Nedelosk aa1e797cf7 Remove Unused Stuff 2017-04-11 17:51:42 +02:00
Nedelosk 8ba9d8609b Add MultiFenceRecipe Jei Registry Plugin 2017-04-11 17:50:41 +02:00
Nedelosk 7964e56c77 Remove Gooseberry from world gen 2017-04-11 01:29:55 +02:00
Nedelosk 6d54f6a8a8 Imrpove ShrubLog 2017-04-11 01:18:32 +02:00
Nedelosk 498fe87e49 Work on Tree generation and add shrubs to world gen 2017-04-11 01:04:19 +02:00
Nedelosk 9fe3d8bbf1 Fix Ceramic Model 2017-04-10 21:24:36 +02:00
Nedelosk 4202534e1f Fix MultiFence Model 2017-04-10 21:17:35 +02:00
Nedelosk c5c76f4009 Cache MultiFence Models 2017-04-10 21:01:13 +02:00
Nedelosk 3124c00152 Fix MultiFence Name 2017-04-10 20:49:10 +02:00
Nedelosk bb9427367d Remove old ETFenceGate class 2017-04-10 20:19:22 +02:00
Nedelosk 36c0409e5a Clean Up Multi Fences 2017-04-10 20:15:51 +02:00
Nedelosk f1640ff21b Work on MultiFence 2017-04-10 19:19:19 +02:00
Nedelosk c949131976 Clean Up and remove BlockFence 2017-04-10 16:27:04 +02:00
Nedelosk fa67089c77 Remove model text gui 2017-04-10 15:59:55 +02:00
Nedelosk a17d9015c1 Rename ModelBaker, fix uv and add multifence model 2017-04-10 15:56:56 +02:00
Nedelosk 892dee2eb0 Add .name to fluid keys 2017-04-10 13:20:07 +02:00
Nedelosk c980cf68b1 Add extra bees fluid names 2017-04-10 13:13:14 +02:00
Nedelosk b84e29a3f0 Fix some names 2017-04-10 13:06:19 +02:00
Nedelosk 12ade3a559 Clean Up Bee Mutations 2017-04-10 12:28:25 +02:00
Nedelosk 2faa08c1b6 Clean Up 2017-04-10 11:53:54 +02:00
Nedelosk 11b8fce668 Clean Up Butterflies 2017-04-10 11:52:02 +02:00
Nedelosk 1626b6ec03 Make shrub logs flammable 2017-04-10 02:20:04 +02:00
Nedelosk 1cbf2ad892 Add Fruit pods and update forestry version 2017-04-10 01:52:17 +02:00
Nedelosk c90b134ded Add butterfly item textures 2017-04-09 23:01:31 +02:00
Nedelosk 72567d3706 Improve shrub log 2017-04-09 21:56:33 +02:00
Nedelosk 3919edcc3e Add tiny shrub log 2017-04-09 21:26:40 +02:00
Nedelosk 11c40fa158 Clean Up and fix missing fruit sprites 2017-04-09 14:33:31 +02:00
Nedelosk b044244dc6 Move craftgui to binnie core 2017-04-09 01:58:51 +02:00
mezz 1ea33829b3 Update JEI integration 2017-04-04 03:26:39 -07:00
mezz 79af0241e8 Remove SimpleRecipeHandler (unused now) 2017-04-03 18:05:40 -07:00
mezz c6ee1184ff Update JEI integration 2017-04-03 18:04:31 -07:00
mezz 2c277cc311 Update Forestry integration 2017-04-03 18:03:54 -07:00
mezz d3dd0467d9 update required Forge version 2017-03-23 18:11:13 -07:00
mezz a0843d9523 More sideonly cleanup 2017-03-23 18:10:55 -07:00
Nedelosk 475f4b63da Start to clean up Analyst Gui 2017-03-23 15:32:55 +01:00
Nedelosk 044a8a1984 Clean up Genetics Mod 2017-03-22 17:17:12 +01:00
Nedelosk e88822fb3d Add color to serums 2017-03-22 16:35:38 +01:00
Nedelosk 14deee0df7 Clean up some Items 2017-03-22 16:21:29 +01:00
Nedelosk 8f77efae6e Start to clean up tree generation 2017-03-21 15:50:03 +01:00
Nedelosk c93a79887f Clean Up and move guis 2017-03-20 21:21:17 +01:00
Nedelosk 490feb915f Clean Up 2017-03-18 22:58:25 +01:00
Nedelosk 4825f402fc Fix PanelModelBaker 2017-02-18 18:52:19 +01:00
mezz cce3b7b901 Auto-format fix imports, tabs/spaces 2017-02-12 00:09:28 -08:00
mezz 5816af57bc Add tooltips to frames to show what each does 2017-02-12 00:01:53 -08:00
mezz bdcefcb5be Fix some gui crashes 2017-02-11 23:51:03 -08:00
mezz 5ecfb694c5 Fix mutation multiplier and add gui mutation tooltip to accepted items 2017-02-09 23:00:32 -08:00
mezz e851fb5bc8 Use Forge tooltips where possible 2017-02-09 22:59:51 -08:00
mezz 8654b9d054 Fix crashes on the Debug map 2017-02-09 22:17:22 -08:00
mezz 93419395c3 Fix JEI integration crash 2017-02-09 21:58:45 -08:00
mezz 4936316ef3 Fix render crash with ceramic bricks 2017-02-09 21:58:31 -08:00
mezz fef0b7ede9 Fix assets to use lowercase for 1.11 2017-02-09 21:58:01 -08:00
mezz 2423adae4c Resolve more client/server sided issues
using Minecraft Development for IntelliJ IDEA plugin.
https://plugins.jetbrains.com/idea/plugin/8327-minecraft-development
2017-02-09 20:13:10 -08:00
mezz b8acba968e Fix many server crashes from client-side code 2017-02-09 02:27:31 -08:00
mezz f660f213f6 Updates for 1.11. Running but missing textures. 2017-02-09 01:41:06 -08:00
mezz 424fdaaf48 Begin 1.11 (compiles, does not run yet) 2017-02-08 00:52:37 -08:00
mezz 5310003659 Fix fruit press interface 2017-02-07 18:34:40 -08:00
mezz e38b8531da Improve tooltips and information for insulated electron tubes 2017-02-07 17:54:26 -08:00
mezz a5daa93bf1 More null annotations 2017-02-07 00:05:24 -08:00
mezz da8a833485 More null annotations 2017-02-06 01:34:48 -08:00
mezz 16b955b443 Begin adding stricter null annotations to prepare for 1.11 2017-02-05 23:47:40 -08:00
Nedelosk 4140ba7d7f Fix block carpentry panel 2017-01-27 20:15:44 +01:00
Chocohead 23ed2dcaea Generics for everyone \o/ 2017-01-26 18:18:14 +00:00
Chocohead ac9344cbda Add back planks to arborist's database 2017-01-26 17:46:47 +00:00
Nedelosk ce5232841a Improve Fluid Containers 2017-01-25 22:13:28 +01:00
Nedelosk f35f247cb4 Clean Up 2017-01-25 20:58:37 +01:00
Nedelosk 923d3791cd Fix fluid containers 2017-01-25 20:58:11 +01:00
Nedelosk cdea827464 Clean Up BinnieSprite 2017-01-25 20:57:52 +01:00
Nedelosk 58c36b3c92 Clean Up 2017-01-25 15:05:17 +01:00
Nedelosk 49d80c847e Move some craftguis 2017-01-25 15:01:41 +01:00
Nedelosk fff40b966d Add more models 2017-01-25 13:35:12 +01:00
mezz 6f42dfdef9 Fix Distillery 2017-01-24 23:28:30 -08:00
mezz f9dc27a063 Fix uses of liquid containers 2017-01-24 23:15:52 -08:00
mezz fd77975c6e Fix item rendering in inventories 2017-01-24 21:56:56 -08:00
mezz 460a7db190 Move static rendering methods to RenderUtil 2017-01-24 21:36:55 -08:00
mezz 9c4b081f6d Use GlStateManager 2017-01-24 21:18:28 -08:00
mezz 31a305ffc2 Gui rendering cleanup 2017-01-24 20:53:27 -08:00
mezz 17f036522e Fix compilation problems 2017-01-24 16:01:26 -08:00
Nedelosk 1a3b8fae21 Clean Up 2017-01-24 22:05:32 +01:00
Nedelosk 172afd0574 Fix design blocks 2017-01-24 21:44:39 +01:00
Nedelosk 7666e96542 Clean Up extra tree modules and add wood fences and fence gates 2017-01-24 18:41:35 +01:00
mezz 1276bd4b18 Fix some TODOs 2017-01-24 01:47:00 -08:00
mezz 7c048de845 Stop suppressing exceptions that may be important 2017-01-24 01:19:28 -08:00
mezz 163abc377e Remove unused machine types from alveary blockstate json 2017-01-24 00:44:25 -08:00
mezz 89edfaa7c7 Remove ItemParser 2017-01-23 23:40:13 -08:00
mezz 159dc804a2 Improve Brewery JEI representation 2017-01-23 22:19:24 -08:00
mezz d0dffe7edd Fix the brewery not consuming input items 2017-01-23 22:18:55 -08:00
mezz 2d459dd953 Complete the implementation of ComponentInventorySlots 2017-01-23 22:17:17 -08:00
mezz aede7bf7ec Fix IDesignMaterials not compiling 2017-01-23 14:46:59 -08:00
Nedelosk 9fcdc34b5a Fix wood blocks 2017-01-23 21:00:17 +01:00
Nedelosk 9ba257dec5 Merge branch 'master-MC1.10.2' of https://github.com/ForestryMC/Binnie into master-MC1.10.2 2017-01-23 15:49:21 +01:00
Nedelosk 87cf7386c6 Improve fluid rendering 2017-01-23 15:44:46 +01:00
mezz b79b279a17 Add Distilling JEI recipes 2017-01-23 01:34:30 -08:00
mezz 1d96c9d349 Refactor Distillery 2017-01-22 23:52:15 -08:00
mezz e5f01e82a2 Add Brewing JEI recipes 2017-01-22 22:24:01 -08:00
mezz 25a2752907 Fix concurrent modification exceptions from networking 2017-01-22 22:23:27 -08:00
mezz c195cfaa19 Fix concurrent modification exceptions from networking 2017-01-22 22:21:25 -08:00
mezz 427f030110 Refactor Brewing Recipes 2017-01-22 21:51:59 -08:00
Nedelosk f0d8d6b89d Work on extra trees 2017-01-22 10:36:25 +01:00
Nedelosk 192943cb3e Add decorative leaves and food models 2017-01-21 15:57:39 +01:00
mezz 31d7d6e76e Add Fruit Press JEI recipes 2017-01-21 00:28:28 -08:00
mezz b6f91fe870 Add Lumbermill JEI recipes 2017-01-20 23:42:29 -08:00
Nedelosk 88ad994a8c Update Forestry Version 2017-01-20 16:48:11 +01:00
mezz aa8ff6556b Add Genetic Database JEI recipes 2017-01-19 23:12:00 -08:00
mezz 0f716a0a16 Add Genepool JEI recipes 2017-01-19 22:15:25 -08:00
mezz 3530a0e9df Add Splicer JEI recipes, improve Inoculator JEI recipes 2017-01-19 19:34:31 -08:00
Nedelosk a990ce3dc9 Improve wood blocks 2017-01-19 23:54:13 +01:00
Nedelosk 3ed915f9d5 Fix soil item model and start to move craftgui 2017-01-15 18:41:45 +01:00
Nedelosk de2dc3dabb Update jei and improve other things 2017-01-15 18:07:05 +01:00
Nedelosk 3059231363 Update Forestry Version 2017-01-15 14:33:09 +01:00
Nedelosk 154839594d Fix fluid container models 2017-01-15 00:46:39 +01:00
Nedelosk c7635db7e8 Clean Up and fluid texture fix 2017-01-14 23:56:44 +01:00
mezz 41e847b944 Add Inoculator JEI recipes 2017-01-03 03:16:55 -08:00
mezz 125cd54b66 Update Forestry version 2017-01-03 00:25:27 -08:00
Nedelosk 56f2be5817 Merge pull request #6 from RossRKK/master-MC1.10.2
Added proven and scented gears to the oredictionary
2016-12-04 19:03:48 +01:00
Ross Kelso e93934fdf8 Removed an import
This was accidentally moved over when I copied the line of code
2016-12-04 02:10:23 +00:00
Ross Kelso 1ad0dcc0ae Added proven and scented gears to the oredictionary 2016-12-04 01:52:35 +00:00
marcin212 cee31027e6 Work on items from wood - part 2 2016-11-04 00:54:45 +01:00
marcin212 38c1aa5b4b Fix planks textures and add banana planks 2016-11-03 17:00:14 +01:00
Nedelosk bebb663768 Improve default statemapper 2016-11-01 16:52:41 +01:00
Nedelosk f288984833 Merge branch 'master-MC1.10.2' of https://github.com/ForestryMC/Binnie into master-MC1.10.2 2016-11-01 16:48:14 +01:00
Nedelosk 9e68539431 Start to work on ceramic blocks 2016-11-01 16:48:01 +01:00
marcin212 a903d57103 Work on items from wood 2016-11-01 02:39:35 +01:00
marcin212 8c9cd7c202 Merge branch 'master-MC1.10.2' of https://github.com/ForestryMC/Binnie into master-MC1.10.2
# Conflicts:
#	src/main/java/binnie/extratrees/genetics/ExtraTreeSpecies.java
#	src/main/java/binnie/extratrees/genetics/ModuleGenetics.java
2016-10-31 21:11:27 +01:00
marcin212 8e14eb81a1 Rewrite ExtraTreeSpecies class 2016-10-31 21:03:38 +01:00
mezz 4b6e3e5424 Fix cast warning 2016-10-30 21:57:40 -07:00
mezz 61f7878acc Cleanup 2016-10-30 21:34:53 -07:00
mezz 307374ca2b improve null checks for Mods.java 2016-10-30 20:56:24 -07:00
mezz 975309598a Auto-fix formatting 2016-10-30 20:56:03 -07:00
mezz 697ccabf53 Fix several broken ItemStacks and recipes 2016-10-30 19:24:46 -07:00
marcin212 775b4109a9 Merge branch 'master-MC1.10.2' of https://github.com/ForestryMC/Binnie into master-MC1.10.2 2016-10-31 00:25:42 +01:00
marcin212 977d295680 Remove unused classes 2016-10-31 00:24:45 +01:00
Nedelosk 21db702ee7 Fix GUIs do not always update their displayed items #4 2016-10-30 22:30:33 +01:00
Nedelosk cef5f4963f Work on GardenLogic and localize the tubes 2016-10-30 18:59:39 +01:00
Nedelosk 1cd3dc1ac8 Update Forestry Version 2016-10-30 13:54:12 +01:00
mezz ef722ec0d0 Update Forestry, JEI, Forge version 2016-10-29 18:37:01 -07:00
mezz c40cdb281f Add Sequencer JEI recipes 2016-10-29 01:20:39 -07:00
mezz 7c37c3f126 Add Polymeriser JEI recipes 2016-10-29 00:17:04 -07:00
mezz f082500fc0 Add Isolator JEI recipes 2016-10-28 21:47:06 -07:00
mezz b6191ab4b0 Fix DefaultTankContainer 2016-10-28 18:58:14 -07:00
Nedelosk 91933a738b Adding Fluid and Item Capability to the machine tile entity 2016-10-28 14:11:28 +02:00
Nedelosk d77daf41d0 Localise three analyst pages and fix analyser 2016-10-28 13:31:40 +02:00
Nedelosk 489ce3dece Clean Up Machines: Genetic 2016-10-28 12:43:12 +02:00
Nedelosk 154207f60f Clean Up 2016-10-28 02:20:36 +02:00
Nedelosk 84d8ad9144 Clean up Acclimatiser 2016-10-28 00:22:46 +02:00
Nedelosk 6b7b6480c0 Start to clean up machines 2016-10-28 00:01:33 +02:00
Nedelosk 3bf37f8838 Work on things 2016-10-27 16:05:15 +02:00
mezz 5bb4b5d9a5 Auto-format spaces to tabs (#2) 2016-10-27 02:49:49 -07:00
mezz 25be7fd254 Complete JEI integration of the Incubator 2016-10-27 02:42:11 -07:00
mezz 49542b0851 Minor cleanup 2016-10-27 02:41:42 -07:00
marcin212 09fa488cff Merge branch 'master-MC1.10.2' of https://github.com/ForestryMC/Binnie into master-MC1.10.2 2016-10-27 05:21:18 +02:00
marcin212 c201768ffa Fix sapling rendering 2016-10-27 05:20:23 +02:00
marcin212 c91a0c601f Fix textures of leaves and remove redundant enum (replace LeafType to EnumLeafType from Forestry) 2016-10-27 05:16:43 +02:00
Nedelosk ccb718b84d Fix Flower Mutation Registration 2016-10-27 01:34:14 +02:00
Nedelosk 5b4d490e94 Remove unused classes 2016-10-27 01:13:55 +02:00
Nedelosk 1982cbc615 Clean Up 2016-10-27 01:12:43 +02:00
Nedelosk b356c65a73 Register Fluid Textures 2016-10-27 01:09:37 +02:00
Nedelosk d7b5954d42 Clean Up 2016-10-27 00:01:23 +02:00
Nedelosk fe1c8b77c9 Remove unused ore dicts 2016-10-27 00:00:08 +02:00
Nedelosk 8a103a72cc Remove Unused Encylopedia 2016-10-26 23:59:04 +02:00
Nedelosk 5927258a90 Improve Soil 2016-10-26 23:44:47 +02:00
Nedelosk a300bc0a11 Adding database and soil localisation 2016-10-26 23:23:47 +02:00
Nedelosk 7e9a87f08b Remove Log 2016-10-26 22:15:47 +02:00
Nedelosk 2c8285651f Adding Flower localisation and Clean Up 2016-10-26 22:10:55 +02:00
Nedelosk df17dccad7 Add Flower Item Models and Flower Double Models 2016-10-26 22:01:13 +02:00
Nedelosk fb732b9398 Adding more flower models 2016-10-26 16:24:17 +02:00
Nedelosk 2a23e60cdb Adding flower blockstate and blockstatemapper 2016-10-26 01:32:05 +02:00
Nedelosk 5a64454906 Clean Up and localise flower tooltip 2016-10-25 19:07:29 +02:00
Nedelosk d706224e56 Clean Up Botany Mod Class 2016-10-25 18:39:41 +02:00
Nedelosk f993d0571d Merge branch 'master-MC1.10.2' of https://github.com/ForestryMC/Binnie into master-MC1.10.2 2016-10-25 18:14:30 +02:00
Nedelosk 7dba116937 Working on Flower Models and Update Forestry 2016-10-25 18:08:12 +02:00
Elec332 0f67d73b30 Cleanup main mod classes, ran import optimiser 2016-10-25 15:13:44 +02:00
marcin212 bedfd6e402 Fix sprite color in Butterfly module 2016-10-25 02:28:09 +02:00
marcin212 d4519ffee6 Add JEIBees for debugging 2016-10-25 02:23:46 +02:00
marcin212 5171e33764 Merge branch 'master-MC1.10.2' of https://github.com/ForestryMC/Binnie into master-MC1.10.2 2016-10-25 00:42:37 +02:00
marcin212 e00101e0c0 Fix missing GUI icons 2016-10-25 00:42:29 +02:00
Nedelosk 9e31a19f34 Merge branch 'master-MC1.10.2' of https://github.com/ForestryMC/Binnie into master-MC1.10.2 2016-10-25 00:28:35 +02:00
Nedelosk 7ce53b0c23 Working on Ceramic and other Botany things 2016-10-25 00:28:26 +02:00
marcin212 62a4efaa53 Merge branch 'master-MC1.10.2' of https://github.com/ForestryMC/Binnie into master-MC1.10.2 2016-10-25 00:01:04 +02:00
marcin212 6801529ca5 Working on module apiary 2016-10-25 00:00:47 +02:00
Nedelosk f814808f20 Working on Ceramic 2016-10-24 23:27:17 +02:00
Nedelosk 9884a13c6e Merge branch 'master-MC1.10.2' of https://github.com/ForestryMC/Binnie into master-MC1.10.2 2016-10-24 21:58:05 +02:00
Nedelosk 57494b1f81 Working on Gardening 2016-10-24 21:57:50 +02:00
marcin212 3a0c551668 Add ItemGenesis model 2016-10-24 21:56:35 +02:00
marcin212 9d5144ddea Merge branch 'master-MC1.10.2' of https://github.com/ForestryMC/Binnie into master-MC1.10.2 2016-10-24 21:35:41 +02:00
marcin212 eacfa331e3 Add extrabees item models 2016-10-24 21:35:14 +02:00
marcin212 43efa66c20 Move ItemMisc models to subdirectory 2016-10-24 21:34:29 +02:00
Nedelosk 9f04dc7ed0 Merge branch 'master-MC1.10.2' of https://github.com/ForestryMC/Binnie into master-MC1.10.2 2016-10-24 20:26:19 +02:00
Nedelosk 7de922264a Adding new Models 2016-10-24 20:25:24 +02:00
marcin212 7e1e92ae2c Decompiler mess cleanup 2016-10-24 19:33:53 +02:00
Nedelosk 2ed7e79478 Update Soil and add Soil Models 2016-10-24 18:23:30 +02:00
Nedelosk 0caaa095a2 Update Jei Integration 2016-10-24 16:24:42 +02:00
Nedelosk 0806d2ac38 Clean Up Api 2016-10-22 19:18:25 +02:00
Nedelosk 8b1bce6963 Clean Up and start to work on flower models 2016-10-22 18:56:37 +02:00
Nedelosk fd7c73c354 Add Flower Definition and Add Flower Factory 2016-10-22 03:39:42 +02:00
marcin212 4cca08af79 Fix flickering GUI 2016-10-21 18:06:45 +02:00
marcin212 59e21d05ef Fix wrong allele name and enable module genetics in botany 2016-10-21 15:30:06 +02:00
Nedelosk ff41a6e83b Rename FlowerHelper to FlowerRoot and improve it 2016-10-21 14:23:48 +02:00
Nedelosk 86bde197ec Clean Up 2016-10-21 13:40:04 +02:00
Nedelosk 8c61cacb57 Add Item models 2016-10-21 13:39:50 +02:00
Nedelosk ef6cbb1090 Adding basic Item and improve genetic Items 2016-10-21 12:20:02 +02:00
Nedelosk 2adc2e3562 Improve .gitignore and Adding ModelManager like that from Forestry 2016-10-21 12:07:12 +02:00
marcin212 ce2629a9f4 Fix itemstack display name for soil, serum and serum array 2016-10-21 11:27:53 +02:00
marcin212 a7af5980a1 Merge branch 'master-MC1.10.2' of https://github.com/ForestryMC/Binnie into master-MC1.10.2 2016-10-21 10:37:23 +02:00
marcin212 8a2fc188ae Support for Forge Energy 2016-10-21 10:36:20 +02:00
mezz f27454a73d Begin work on JEI integration 2016-10-21 01:31:57 -07:00
mezz 827c260442 Remove System.out.println spam 2016-10-21 00:39:55 -07:00
mezz a4cd13282a Remove redundant casts, unnecessary object creation, and string == 2016-10-21 00:32:06 -07:00
mezz 100784b51b Fix bug with mutation discovery in ControlMutationsBox 2016-10-21 00:29:36 -07:00
mezz b2963069fc Fix more null warnings 2016-10-21 00:22:24 -07:00
mezz ca1b4b03b1 Clean up genetic item recipes 2016-10-21 00:18:44 -07:00
mezz 4e3fb7e0bd fix bug in IBorder 2016-10-20 23:54:21 -07:00
mezz 0806b3b562 Fix missing import 2016-10-20 23:52:52 -07:00
mezz fc47c969f1 Remove FakeWorld 2016-10-20 23:51:42 -07:00
mezz 3178aa890d Fix some null warnings 2016-10-20 23:51:14 -07:00
mezz c6783e573c Use Collections.addAll 2016-10-20 23:18:49 -07:00
mezz 57930991ec Remove unnecessary boxing/unboxing 2016-10-20 23:14:07 -07:00
mezz f96bf5ba5f Use foreach loops 2016-10-20 23:13:41 -07:00
mezz 7a90a5cbbf Remove unused imports 2016-10-20 23:13:09 -07:00
mezz dac491c788 remove default template file headers 2016-10-20 23:12:50 -07:00
mezz d06b1d6304 Clean up some odd casts and obfuscated param names 2016-10-20 23:08:28 -07:00
mezz 507b8fa2d6 Remove unnecessary modifiers from enums and interfaces 2016-10-20 22:46:07 -07:00
mezz 55c58cf5d9 Use diamond operator everywhere 2016-10-20 22:41:23 -07:00
mezz 9812ddc4ce Fix mod names and dependencies 2016-10-20 22:38:23 -07:00
mezz 61d2d5ce30 Fix PlankType for Forestry planks 2016-10-20 22:00:47 -07:00
mezz d4cb398ac1 Fix crash from WATER effect bees 2016-10-20 21:48:08 -07:00
mezz 885ee83ede Fix null items in flowermanager registration 2016-10-20 21:47:29 -07:00
mezz edf9f0a9d0 Update gradle wrapper and build.gradle 2016-10-20 21:26:21 -07:00
marcin212 6a7c4bf67d start 1.10.2 2016-10-20 04:32:47 +02:00
2642 changed files with 68483 additions and 50636 deletions

No files matched your search

+18 -10
View File
@@ -1,20 +1,28 @@
# everything
/*
.gradle
# IntelliJ
/build
/run
/eclipse
/out
/classes
.idea
*.iml
*.ipr
*.iws
# minecraft
/config
/logs
/saves
/options.txt
/usernamecache.json
classes/
changelog.html
*.bat
# folders
!/gradle/wrapper
!/src
# files
!/.gitignore
!/LICENSE.txt
!/license-header.txt
!/README.md
!/gradle.properties
!/build.gradle
!/gradlew
!/gradlew.bat
+1 -43
View File
@@ -1,46 +1,4 @@
[Binnie mods](https://minecraft.curseforge.com/projects/binnies-mods/files)
====================================
### What is it?
Binnie’s Mods is a suite of mods designed to expand the [Forestry](https://github.com/ForestryMC/ForestryMC) mod.
It both extends the bee and tree breeding aspect by adding many new species with varied products,
along with new features such as fully breedable flowers and genetic manipulation.
### Homepage
[Wiki](https://binnie.mods.wiki/wiki/Main_Page)
[Latest Builds for 1.7.10](https://ci.bymarcin.com/job/Binnie-Mods-MC1.7.10/)
### Mods
[![](https://binnie.mods.wiki/w/images/binnie/9/91/Extra_Bees_Header.png)](https://binnie.mods.wiki/wiki/Extra_Bees)
Extra Bees expands upon the bee breeding of Forestry by adding 107 new bee species to forestry. These bees cover a large spectrum of different effects and products, giving you the ability to produce everything from dyes to rare metal dusts purely from bees. It also adds the Apiarist Database, a tool to keep track of discovered species, mutations and traits. There are also new alveary components which help improve and streamline bee production.
[![](https://binnie.mods.wiki/w/images/binnie/5/59/Extra_Trees_Header.png)](https://binnie.mods.wiki/wiki/Extra_Trees)
Extra Trees both increases the number of tree species and adds many new aesthetic uses. There are 96 new tree species, such as Banana, Brazil nut and Douglas-fir. This comes with many new fruits as well as 35 new wooden planks. Extra Trees allows these, as well as Forestry and vanilla planks, to be combined to give doors, gates and various designs of fences. The woodworker allows planks to be combined to give patterned tiles, allowing you to build beautiful wooden floors, and the same can be done with stained glass. A group of machines such as the brewery and distillery allow you to use the fruits you grow to make a variety of wines, ciders and spirits.
[![](https://binnie.mods.wiki/w/images/binnie/3/34/Botany_Header.png)](https://binnie.mods.wiki/wiki/Botany)
Botany adds an entirely new breeding system to Forestry: flowers. There are 46 different species that can be bred, including both vanilla flowers and new ones such as Fuschia and Lilies. The colour of the flowers can be transferred and selectively bred, meaning that each flower can be one of a possible 80 different colours. These new flowers can be bred manually in small gardens using a trowel and fertiliser, with careful care taken to maintain the desired pH or moisture, or grown on the large scale in Forestry farms.
[![](https://binnie.mods.wiki/w/images/binnie/4/4e/Genetics_Header.png)](https://binnie.mods.wiki/wiki/Genetics)
Genetics is for those who want to eschew conventional breeding, and want to enter the realm of genetic manipulation. Here, genes can be isolated, sequenced and then inoculated back into different species, making it easier to obtain the perfect genome. Bees, trees, butterflies and flowers can all be manipulated in this way. They can also be acclimatised to different environments to build tolerance to hostile climates.
[![](https://binnie.mods.wiki/w/images/binnie/d/d7/Binnie_Core_Header.png)](https://binnie.mods.wiki/wiki/Binnie_Core)
Binnie Core is a mod which contains a lot of the core functionality such as networking and GUI's for the other mods. The only in game features it currently contains are the Compartments
### Warning
Removed unused (unfinished) items and blocks: Honey Crystal, Alcohol, etc.
### Building
## Binnie mods
The master branch will always contain the latest released version with possibly some bug fixes for that version that will eventually be released.
New versions will be created in branched named like {mc_version}-{mod_version}
+73 -37
View File
@@ -1,68 +1,107 @@
buildscript {
repositories {
mavenCentral()
jcenter()
maven {
name = "forge"
url = "https://files.minecraftforge.net/maven"
}
maven {
name = "sonatype"
url = "https://oss.sonatype.org/content/repositories/snapshots/"
}
maven {
url "https://plugins.gradle.org/m2/"
url = "http://files.minecraftforge.net/maven"
}
}
dependencies {
classpath 'net.minecraftforge.gradle:ForgeGradle:1.2-SNAPSHOT'
classpath 'net.minecraftforge.gradle:ForgeGradle:2.2-SNAPSHOT'
classpath "gradle.plugin.se.bjurr.gitchangelog:git-changelog-gradle-plugin:1.47"
}
}
plugins {
id "com.matthewprenger.cursegradle" version "1.0.6"
id "com.matthewprenger.cursegradle" version "1.0.9"
}
apply plugin: "se.bjurr.gitchangelog.git-changelog-gradle-plugin"
apply plugin: 'forge'
version = "2.0.26"
if (System.getenv("BUILD_NUMBER") != null) {
version = version + "." + System.getenv("BUILD_NUMBER")
}
group = "binnie" // http://maven.apache.org/guides/mini/guide-naming-conventions.html
archivesBaseName = "binnie-mods-1.7.10-gtnh"
apply plugin: 'net.minecraftforge.gradle.forge'
apply plugin: 'idea'
apply plugin: 'maven'
apply plugin: "se.bjurr.gitchangelog.git-changelog-gradle-plugin"
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
// uncomment this hack if you use old IDEA
/*sourceSets {
main {
output.resourcesDir = output.classesDir
}
}*/
version = version_major + '.' + version_minor + '.' + version_patch
if (System.getenv("BUILD_NUMBER") != null) {
version = version + "-" + System.getenv("BUILD_NUMBER")
}
group = "binnie" // http://maven.apache.org/guides/mini/guide-naming-conventions.html
archivesBaseName = "binnie-mods-1.11.2"
minecraft {
version = "1.7.10-10.13.4.1614-1.7.10"
runDir = "eclipse"
version = mcversion + "-" + forgeversion
mappings = mcp_mappings
runDir = "run"
}
repositories {
maven {
name = "jei"
url "http://dvs1.progwml6.com/files/maven"
}
maven {
name = "ic2, forestry"
url = "http://maven.ic2.player.to/"
}
maven {
name = "CurseForge"
url = "https://minecraft.curseforge.com/api/maven/"
}
}
dependencies {
deobfCompile("net.sengir.forestry:forestry_${mcversion}:${forestry_version}") {
transitive = false;
}
deobfProvided "mezz.jei:jei_${mcversion}:${jei_version}:api"
runtime "mezz.jei:jei_${mcversion}:${jei_version}"
runtime "jei-bees:jeibees:${jeibees_version}:mc${mcversion}"
deobfProvided "net.industrial-craft:industrialcraft-2:${ic2_version}:api"
runtime "net.industrial-craft:industrialcraft-2:${ic2_version}"
}
processResources {
// this will ensure that this task is redone when the versions change.
inputs.property "version", project.version
inputs.property "mcversion", project.minecraft.version
// replace stuff in mcmod.info, nothing else
from(sourceSets.main.resources.srcDirs) {
include 'mcmod.info'
expand 'version': project.version,
expand 'version': project.version,
'mcversion': project.minecraft.version,
'modid': "BinnieMods"
'modid': "binniemods"
}
// copy everything else, thats not the mcmod.info
from(sourceSets.main.resources.srcDirs) {
exclude 'mcmod.info'
}
}
task gitChangelogTask(type: se.bjurr.gitchangelog.plugin.gradle.GitChangelogTask) {
// prevent java 8's strict doclint for javadocs from failing builds
allprojects {
tasks.withType(Javadoc) {
options.addStringOption('Xdoclint:none', '-quiet')
}
}
uploadArchives {
repositories {
if (project.hasProperty('mavenDir')) {
mavenDeployer {
repository(url: "file://" + mavenDir)
}
} else {
println 'Archives upload disabled, mavenDir in gradle.properties is missing.'
}
}
}
task makeChangelog(type: se.bjurr.gitchangelog.plugin.gradle.GitChangelogTask) {
filePath = "changelog.html"
untaggedName = "Current release ${project.version}"
fromCommit = "dbc5c1a564c39e4a9c042411d1bdbe450985ce2c"
@@ -73,19 +112,16 @@ task gitChangelogTask(type: se.bjurr.gitchangelog.plugin.gradle.GitChangelogTask
curseforge {
apiKey = project.hasProperty('curseforge_apikey') ? project.curseforge_apikey : '0'
project {
id = '223525'
id = curse_project_id
changelog = file('changelog.html')
changelogType = 'html'
releaseType = 'release'
releaseType = 'alpha'
relations {
requiredLibrary 'forestry'
incompatible 'binnie-fix'
incompatible 'binniepatcher'
incompatible 'more-binnie-fixes'
}
}
}
afterEvaluate {
tasks.curseforge223525.dependsOn.add(gitChangelogTask)
tasks.curseforge223525.dependsOn.add(makeChangelog)
}
+9 -7
View File
@@ -1,8 +1,10 @@
{{#tags}}
<h3>{{name}}</h3>
<ul>
{{#commits}}
<li>{{{message}}} - {{authorName}}</li>
{{/commits}}
</ul>
Alpha version. Do not create a world you care about with this version, it may break things severely.<br/>
Please help the project by trying it out and <a href="https://github.com/ForestryMC/Binnie/issues">reporting issues here.</a><br/>
{{#tags}}
<h3>{{name}}</h3>
<ul>
{{#commits}}
<li>{{{message}}} - {{authorName}}</li>
{{/commits}}
</ul>
{{/tags}}
+18
View File
@@ -0,0 +1,18 @@
# Sets default memory used for gradle commands. Can be overridden by user or command line properties.
# This is required to provide enough memory for the Minecraft decompilation process.
org.gradle.jvmargs=-Xmx3G
mcversion=1.11.2
forgeversion=13.20.1.2393
mcp_mappings=snapshot_20161220
curse_project_id=223525
forestry_version=5.3.4.132
ic2_version=2.7.71-ex111
version_major=2
version_minor=1
version_patch=0
jei_version=4.5.0.292
jeibees_version=0.9.0.5
Binary file not shown.
+2 -1
View File
@@ -1,5 +1,6 @@
#Thu Jul 13 23:08:17 PDT 2017
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-4.4.1-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-4.0.1-all.zip
Vendored
+9 -17
View File
@@ -1,4 +1,4 @@
#!/usr/bin/env sh
#!/usr/bin/env bash
##############################################################################
##
@@ -33,11 +33,11 @@ DEFAULT_JVM_OPTS=""
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD="maximum"
warn () {
warn ( ) {
echo "$*"
}
die () {
die ( ) {
echo
echo "$*"
echo
@@ -154,19 +154,11 @@ if $cygwin ; then
esac
fi
# Escape application args
save () {
for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
echo " "
# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
function splitJvmOpts() {
JVM_OPTS=("$@")
}
APP_ARGS=$(save "$@")
eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
# Collect all arguments for the java command, following the shell quoting and substitution rules
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
cd "$(dirname "$0")"
fi
exec "$JAVACMD" "$@"
exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
Vendored Regular → Executable
+90 -84
View File
@@ -1,84 +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
set DIRNAME=%~dp0
if "%DIRNAME%" == "" set DIRNAME=.
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%
@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=
@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 Windows variants
if not "%OS%" == "Windows_NT" goto win9xME_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=%*
: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
@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
set DIRNAME=%~dp0
if "%DIRNAME%" == "" set DIRNAME=.
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%
@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=
@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 Windows 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
Binary file not shown.
Binary file not shown.
Binary file not shown.
+9 -11
View File
@@ -1,22 +1,20 @@
package binnie;
import java.util.ArrayList;
import java.util.List;
import binnie.core.ManagerBase;
import binnie.core.genetics.ManagerGenetics;
import binnie.core.item.ManagerItem;
import binnie.core.liquid.ManagerLiquid;
import binnie.core.machines.ManagerMachine;
import binnie.core.mod.config.ManagerConfig;
import binnie.core.resource.ManagerResource;
import java.util.ArrayList;
import java.util.List;
public final class Binnie {
public static List<ManagerBase> Managers = new ArrayList<>();
public static ManagerGenetics Genetics = new ManagerGenetics();
public static ManagerConfig Configuration = new ManagerConfig();
public static ManagerLiquid Liquid = new ManagerLiquid();
public static ManagerMachine Machine = new ManagerMachine();
public static ManagerItem Item = new ManagerItem();
public static ManagerResource Resource = new ManagerResource();
public static final List<ManagerBase> MANAGERS = new ArrayList<>();
public static final ManagerGenetics GENETICS = new ManagerGenetics();
public static final ManagerConfig CONFIGURATION = new ManagerConfig();
public static final ManagerLiquid LIQUID = new ManagerLiquid();
public static final ManagerMachine MACHINE = new ManagerMachine();
public static final ManagerResource RESOURCE = new ManagerResource();
}
+16
View File
@@ -0,0 +1,16 @@
package binnie;
public final class Constants {
public static final String CORE_MOD_ID = "binniecore";
public static final String BOTANY_MOD_ID = "botany";
public static final String EXTRA_TREES_MOD_ID = "extratrees";
public static final String GENETICS_MOD_ID = "genetics";
public static final String LIQUID_JUICE = "juice";
public static final String LIQUID_WATER = "water";
public static final String LIQUID_SEED_OIL = "seedoil";
public static final String LIQUID_CREOSOTE = "Creosote Oil";
public static final String LIQUID_BIO_ETHANOL = "bioethanol";
public static final String LIQUID_FOR_HONEY = "for.honey";
}
+148 -156
View File
@@ -1,23 +1,48 @@
package binnie.botany;
import javax.annotation.Nullable;
import net.minecraft.block.Block;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.init.Items;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import net.minecraftforge.event.entity.player.BonemealEvent;
import net.minecraftforge.event.entity.player.PlayerInteractEvent;
import net.minecraftforge.event.world.BlockEvent;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.common.SidedProxy;
import net.minecraftforge.fml.common.event.FMLInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPostInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;
import net.minecraftforge.fml.common.eventhandler.Event;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import binnie.Constants;
import binnie.botany.api.EnumAcidity;
import binnie.botany.api.EnumSoilType;
import binnie.botany.api.IBlockSoil;
import binnie.botany.api.IFlower;
import binnie.botany.api.gardening.IBlockSoil;
import binnie.botany.api.IFlowerRoot;
import binnie.botany.api.IGardeningManager;
import binnie.botany.ceramic.BlockCeramic;
import binnie.botany.ceramic.BlockCeramicBrick;
import binnie.botany.ceramic.BlockCeramicPatterned;
import binnie.botany.ceramic.BlockStained;
import binnie.botany.ceramic.BlockStainedGlass;
import binnie.botany.ceramic.brick.BlockCeramicBrick;
import binnie.botany.core.BotanyCore;
import binnie.botany.core.BotanyGUI;
import binnie.botany.core.ModuleCore;
import binnie.botany.flower.BlockFlower;
import binnie.botany.flower.ItemFlower;
import binnie.botany.flower.ItemBotany;
import binnie.botany.flower.ItemInsulatedTube;
import binnie.botany.flower.TileEntityFlower;
import binnie.botany.gardening.BlockPlant;
import binnie.botany.gardening.BlockSoil;
import binnie.botany.gardening.Gardening;
import binnie.botany.gardening.ItemSoilMeter;
import binnie.botany.gardening.ItemTrowel;
import binnie.botany.gardening.ModuleGardening;
@@ -34,44 +59,24 @@ import binnie.core.item.ItemMisc;
import binnie.core.network.BinniePacketHandler;
import binnie.core.network.IPacketID;
import binnie.core.proxy.IProxyCore;
import cpw.mods.fml.common.Mod;
import cpw.mods.fml.common.SidedProxy;
import cpw.mods.fml.common.event.FMLInitializationEvent;
import cpw.mods.fml.common.event.FMLInterModComms;
import cpw.mods.fml.common.event.FMLPostInitializationEvent;
import cpw.mods.fml.common.event.FMLPreInitializationEvent;
import cpw.mods.fml.common.eventhandler.Event;
import cpw.mods.fml.common.eventhandler.SubscribeEvent;
import net.minecraft.block.Block;
import net.minecraft.init.Items;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.world.World;
import net.minecraftforge.event.entity.player.BonemealEvent;
import net.minecraftforge.event.entity.player.PlayerInteractEvent;
import net.minecraftforge.event.world.BlockEvent;
@Mod(
modid = "Botany",
name = "Botany",
useMetadata = true,
dependencies = "after:BinnieCore"
)
@Mod(modid = Constants.BOTANY_MOD_ID, name = "Binnie's Botany", useMetadata = true, dependencies = "required-after:" + Constants.CORE_MOD_ID)
public class Botany extends AbstractMod {
@Mod.Instance("Botany")
public static final float AGE_CHANCE = 0.2f;
@SuppressWarnings("NullableProblems")
@Mod.Instance(Constants.BOTANY_MOD_ID)
public static Botany instance;
@SidedProxy(
clientSide = "binnie.botany.proxy.ProxyClient",
serverSide = "binnie.botany.proxy.ProxyServer"
)
@SuppressWarnings("NullableProblems")
@SidedProxy(clientSide = "binnie.botany.proxy.ProxyClient", serverSide = "binnie.botany.proxy.ProxyServer")
public static Proxy proxy;
/* MODULE GENETIC */
public static BlockFlower flower;
public static Item seed;
public static Item pollen;
public static ItemBotany flowerItem;
public static ItemBotany seed;
public static ItemBotany pollen;
public static ItemDictionary database;
/* MODULE GARDENING */
public static BlockPlant plant;
public static ItemTrowel trowelWood;
public static ItemTrowel trowelStone;
@@ -87,36 +92,37 @@ public class Botany extends AbstractMod {
public static ItemInsulatedTube insulatedTube;
public static ItemSoilMeter soilMeter;
public static ItemMisc misc;
public static ItemFlower flowerItem;
public static ItemPigment pigment;
public static ItemClay clay;
public static BlockCeramic ceramic;
public static BlockCeramicPatterned ceramicTile;
public static BlockStained stained;
public static BlockStainedGlass stained;
public static BlockCeramicBrick ceramicBrick;
public Botany() {
Botany.instance = this;
}
@Nullable
public static Item botanistBackpack;
@Mod.EventHandler
public void preInit(FMLPreInitializationEvent event) {
addModule(new ModuleCore());
addModule(new ModuleGenetics());
addModule(new ModuleGardening());
public void preInit(FMLPreInitializationEvent evt) {
preInit();
}
@Mod.EventHandler
public void init(FMLInitializationEvent event) {
public void init(FMLInitializationEvent evt) {
init();
}
@Mod.EventHandler
public void postInit(FMLPostInitializationEvent event) {
public void postInit(FMLPostInitializationEvent evt) {
postInit();
}
@Override
protected void registerModules() {
addModule(new ModuleCore());
addModule(new ModuleGenetics());
addModule(new ModuleGardening());
}
@Override
public IBinnieGUID[] getGUIDs() {
return BotanyGUI.values();
@@ -144,7 +150,7 @@ public class Botany extends AbstractMod {
@Override
public String getModID() {
return "botany";
return Constants.BOTANY_MOD_ID;
}
@Override
@@ -152,185 +158,171 @@ public class Botany extends AbstractMod {
return PacketHandler.class;
}
@Override
public boolean isActive() {
return BinnieCore.isBotanyActive();
}
@SubscribeEvent
public void onShearFlower(PlayerInteractEvent event) {
if (event.action != PlayerInteractEvent.Action.RIGHT_CLICK_BLOCK) {
public void onShearFlower(PlayerInteractEvent.RightClickBlock event) {
EntityPlayer player = event.getEntityPlayer();
if (player == null) {
return;
}
if (event.entityPlayer != null && event.entityPlayer.getHeldItem() != null && event.entityPlayer.getHeldItem().getItem() == Items.shears) {
TileEntity tile = event.world.getTileEntity(event.x, event.y, event.z);
if (tile instanceof TileEntityFlower) {
TileEntityFlower flower = (TileEntityFlower) tile;
flower.onShear();
event.entityPlayer.getHeldItem().damageItem(1, event.entityPlayer);
}
ItemStack heldItem = player.getHeldItemMainhand();
if (heldItem.isEmpty()) {
return;
}
if (event.entityPlayer != null && event.entityPlayer.getHeldItem() != null && event.entityPlayer.getHeldItem().getItem() == Botany.pollen) {
TileEntity tile = event.world.getTileEntity(event.x, event.y, event.z);
if (tile instanceof TileEntityFlower) {
TileEntityFlower flower = (TileEntityFlower) tile;
IFlower pollen = BotanyCore.getFlowerRoot().getMember(event.entityPlayer.getHeldItem());
if (pollen != null && flower.canMateWith(pollen)) {
flower.mateWith(pollen);
if (!event.entityPlayer.capabilities.isCreativeMode) {
ItemStack heldItem = event.entityPlayer.getHeldItem();
heldItem.stackSize--;
}
TileEntity tile = event.getWorld().getTileEntity(event.getPos());
if (!(tile instanceof TileEntityFlower)) {
return;
}
TileEntityFlower flower = (TileEntityFlower) tile;
if (heldItem.getItem() == Items.SHEARS) {
flower.onShear();
heldItem.damageItem(1, player);
} else if (heldItem.getItem() == Botany.pollen) {
IFlower pollen = BotanyCore.getFlowerRoot().getMember(heldItem);
if (pollen != null && flower.canMateWith(pollen)) {
flower.mateWith(pollen);
if (!player.capabilities.isCreativeMode) {
heldItem.shrink(1);
}
}
}
}
@SubscribeEvent
public void onFertiliseSoil(PlayerInteractEvent event) {
if (event.action != PlayerInteractEvent.Action.RIGHT_CLICK_BLOCK || event.world == null) {
public void onFertiliseSoil(PlayerInteractEvent.RightClickBlock event) {
World world = event.getWorld();
if (world == null) {
return;
}
if (event.entityPlayer == null || event.entityPlayer.getHeldItem() == null) {
BlockPos pos = event.getPos();
EntityPlayer player = event.getEntityPlayer();
if (player == null) {
return;
}
int y = event.y;
Block block = event.world.getBlock(event.x, y, event.z);
if (block == null || !Gardening.isSoil(block)) {
block = event.world.getBlock(event.x, --y, event.z);
ItemStack heldItem = player.getHeldItemMainhand();
if (heldItem.isEmpty()) {
return;
}
if (block == null || !Gardening.isSoil(block)) {
IGardeningManager gardening = BotanyCore.getGardening();
Block block = world.getBlockState(event.getPos()).getBlock();
if (!gardening.isSoil(block)) {
pos = pos.down();
block = world.getBlockState(pos).getBlock();
}
if (!gardening.isSoil(block)) {
return;
}
IBlockSoil soil = (IBlockSoil) block;
if (Gardening.isNutrientFertiliser(event.entityPlayer.getHeldItem()) && soil.getType(event.world, event.x, y, event.z) != EnumSoilType.FLOWERBED) {
EnumSoilType type = soil.getType(event.world, event.x, y, event.z);
int next = Math.min(type.ordinal() + Gardening.getFertiliserStrength(event.entityPlayer.getHeldItem()), 2);
if (soil.fertilise(event.world, event.x, y, event.z, EnumSoilType.values()[next]) && !event.entityPlayer.capabilities.isCreativeMode) {
ItemStack heldItem = event.entityPlayer.getHeldItem();
heldItem.stackSize--;
int fertiliserStrength = gardening.getFertiliserStrength(heldItem);
if (gardening.isNutrientFertiliser(heldItem) && soil.getType(world, pos) != EnumSoilType.FLOWERBED) {
EnumSoilType type = soil.getType(world, pos);
int next = Math.min(type.ordinal() + fertiliserStrength, 2);
if (soil.fertilise(world, pos, EnumSoilType.values()[next]) && !player.capabilities.isCreativeMode) {
heldItem.shrink(1);
return;
}
}
if (Gardening.isAcidFertiliser(event.entityPlayer.getHeldItem()) && soil.getPH(event.world, event.x, y, event.z) != EnumAcidity.ACID) {
EnumAcidity pH = soil.getPH(event.world, event.x, y, event.z);
int next = Math.max(pH.ordinal() - Gardening.getFertiliserStrength(event.entityPlayer.getHeldItem()), 0);
if (soil.setPH(event.world, event.x, y, event.z, EnumAcidity.values()[next]) && !event.entityPlayer.capabilities.isCreativeMode) {
ItemStack heldItem2 = event.entityPlayer.getHeldItem();
heldItem2.stackSize--;
if (gardening.isAcidFertiliser(heldItem) && soil.getPH(world, pos) != EnumAcidity.ACID) {
EnumAcidity pH = soil.getPH(world, pos);
int next = Math.max(pH.ordinal() - fertiliserStrength, 0);
if (soil.setPH(world, pos, EnumAcidity.values()[next]) && !player.capabilities.isCreativeMode) {
heldItem.shrink(1);
return;
}
}
if (Gardening.isAlkalineFertiliser(event.entityPlayer.getHeldItem()) && soil.getPH(event.world, event.x, y, event.z) != EnumAcidity.ALKALINE) {
EnumAcidity pH = soil.getPH(event.world, event.x, y, event.z);
int next = Math.min(pH.ordinal() + Gardening.getFertiliserStrength(event.entityPlayer.getHeldItem()), 2);
if (soil.setPH(event.world, event.x, y, event.z, EnumAcidity.values()[next]) && !event.entityPlayer.capabilities.isCreativeMode) {
ItemStack heldItem3 = event.entityPlayer.getHeldItem();
heldItem3.stackSize--;
if (gardening.isAlkalineFertiliser(heldItem) && soil.getPH(world, pos) != EnumAcidity.ALKALINE) {
EnumAcidity pH = soil.getPH(world, pos);
int next = Math.min(pH.ordinal() + fertiliserStrength, 2);
if (soil.setPH(world, pos, EnumAcidity.values()[next]) && !player.capabilities.isCreativeMode) {
heldItem.shrink(1);
return;
}
}
if (Gardening.isWeedkiller(event.entityPlayer.getHeldItem()) && Gardening.addWeedKiller(event.world, event.x, y, event.z) && !event.entityPlayer.capabilities.isCreativeMode) {
ItemStack heldItem4 = event.entityPlayer.getHeldItem();
heldItem4.stackSize--;
if (gardening.isWeedkiller(heldItem) && gardening.addWeedKiller(world, pos) && !player.capabilities.isCreativeMode) {
heldItem.shrink(1);
}
}
@SubscribeEvent
public void plantVanilla(BlockEvent.PlaceEvent event) {
World world = event.world;
int x = event.x;
int y = event.y;
int z = event.z;
Block block = world.getBlock(x, y - 1, z);
if (!(block instanceof IBlockSoil)) {
World world = event.getWorld();
BlockPos pos = event.getPos();
Block block = world.getBlockState(pos.down()).getBlock();
if (!BotanyCore.getGardening().isSoil(block)) {
return;
}
IFlower flower = BotanyCore.getFlowerRoot().getConversion(event.itemInHand);
EntityPlayer player = event.getPlayer();
ItemStack heldItem = player.getHeldItem(event.getHand());
IFlowerRoot flowerRoot = BotanyCore.getFlowerRoot();
IFlower flower = flowerRoot.getConversion(heldItem);
if (flower != null) {
Gardening.plant(world, x, y, z, flower, event.player.getGameProfile());
flowerRoot.plant(world, pos, flower, player.getGameProfile());
}
}
@Deprecated
public void onPlantVanilla(PlayerInteractEvent event) {
if (!BinnieCore.proxy.isSimulating(event.world) || event.action != PlayerInteractEvent.Action.RIGHT_CLICK_BLOCK) {
return;
}
if (event.entityPlayer == null || event.entityPlayer.getHeldItem() == null) {
public void onPlantVanilla(PlayerInteractEvent.RightClickBlock event) {
BlockPos pos = event.getPos();
World world = event.getWorld();
EntityPlayer player = event.getEntityPlayer();
ItemStack heldItem = player.getHeldItemMainhand();
if (!BinnieCore.getBinnieProxy().isSimulating(event.getWorld())) {
return;
}
World world = event.world;
int x = event.x;
int y = event.y;
int z = event.z;
Block block = world.getBlock(x, y, z);
if (heldItem.isEmpty()) {
return;
}
Block block = world.getBlockState(pos).getBlock();
int py = -1;
if (block instanceof IBlockSoil && (world.isAirBlock(x, y + 1, z) || world.getBlock(x, y, z).isReplaceable(world, x, y, z))) {
if (block instanceof IBlockSoil && (world.isAirBlock(pos.up()) || block.isReplaceable(world, pos))) {
py = 1;
}
if (py < 0) {
return;
}
IFlower flower = BotanyCore.getFlowerRoot().getConversion(event.entityPlayer.getHeldItem());
if (flower != null && Gardening.plant(world, x, y + py, z, flower, event.entityPlayer.getGameProfile()) && !event.entityPlayer.capabilities.isCreativeMode) {
ItemStack heldItem = event.entityPlayer.getHeldItem();
heldItem.stackSize--;
IFlowerRoot flowerRoot = BotanyCore.getFlowerRoot();
IFlower flower = flowerRoot.getConversion(heldItem);
if (flower != null && flowerRoot.plant(world, pos.add(0, py, 0), flower, player.getGameProfile()) && !player.capabilities.isCreativeMode) {
heldItem.shrink(1);
}
}
@SubscribeEvent
public void onBonemeal(BonemealEvent event) {
Block block = event.world.getBlock(event.x, event.y, event.z);
if (Gardening.isSoil(block)) {
BlockPos pos = event.getPos();
Block block = event.getBlock().getBlock();
if (BotanyCore.getGardening().isSoil(block)) {
IBlockSoil soil = (IBlockSoil) block;
if (soil.fertilise(event.world, event.x, event.y, event.z, EnumSoilType.LOAM)) {
if (soil.fertilise(event.getWorld(), pos, EnumSoilType.LOAM)) {
event.setResult(Event.Result.ALLOW);
}
}
TileEntity tile = event.world.getTileEntity(event.x, event.y, event.z);
TileEntity tile = event.getWorld().getTileEntity(pos);
if (tile instanceof TileEntityFlower && ((TileEntityFlower) tile).onBonemeal()) {
event.setResult(Event.Result.ALLOW);
}
}
@Override
public boolean isActive() {
return BinnieCore.isBotanyActive();
}
@Mod.EventHandler
public void onIMC(FMLInterModComms.IMCEvent event) {
for (FMLInterModComms.IMCMessage message : event.getMessages()) {
if (message.key.equals("add-nutrient-fertiliser-1")) {
ModuleGardening.queuedNutrientFertilisers.put(message.getItemStackValue(), 1);
}
if (message.key.equals("add-nutrient-fertiliser-2")) {
ModuleGardening.queuedNutrientFertilisers.put(message.getItemStackValue(), 2);
}
if (message.key.equals("add-acid-fertiliser-1")) {
ModuleGardening.queuedAcidFertilisers.put(message.getItemStackValue(), 1);
}
if (message.key.equals("add-acid-fertiliser-2")) {
ModuleGardening.queuedAcidFertilisers.put(message.getItemStackValue(), 2);
}
if (message.key.equals("add-alkaline-fertiliser-1")) {
ModuleGardening.queuedAlkalineFertilisers.put(message.getItemStackValue(), 1);
}
if (message.key.equals("add-alkaline-fertiliser-2")) {
ModuleGardening.queuedAlkalineFertilisers.put(message.getItemStackValue(), 1);
}
}
}
public static class PacketHandler extends BinniePacketHandler {
public PacketHandler() {
super(Botany.instance);
@@ -1,13 +1,14 @@
package binnie.botany;
import binnie.core.util.I18N;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.init.Blocks;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import binnie.core.util.I18N;
public class CreativeTabBotany extends CreativeTabs {
public static CreativeTabs instance = new CreativeTabBotany();
@@ -17,10 +18,11 @@ public class CreativeTabBotany extends CreativeTabs {
@Override
public ItemStack getIconItemStack() {
return new ItemStack(Blocks.red_flower, 1, 5);
return new ItemStack(Blocks.RED_FLOWER, 1, 5);
}
@Override
@SideOnly(Side.CLIENT)
public String getTranslatedTabLabel() {
return getTabLabel();
}
@@ -33,7 +35,7 @@ public class CreativeTabBotany extends CreativeTabs {
@Override
@SideOnly(Side.CLIENT)
public Item getTabIconItem() {
return Item.getItemFromBlock(Blocks.yellow_flower);
public ItemStack getTabIconItem() {
return new ItemStack(Blocks.YELLOW_FLOWER);
}
}
@@ -1,11 +1,34 @@
package binnie.botany.api;
public enum EnumAcidity {
ACID,
NEUTRAL,
ALKALINE;
import javax.annotation.Nullable;
public String getID() {
import net.minecraft.util.IStringSerializable;
import net.minecraft.util.text.TextFormatting;
import binnie.core.util.I18N;
public enum EnumAcidity implements IStringSerializable {
ACID(TextFormatting.RED),
NEUTRAL(null),
ALKALINE(TextFormatting.AQUA);
@Nullable
TextFormatting color;
EnumAcidity(@Nullable TextFormatting color) {
this.color = color;
}
@Override
public String getName() {
return name().toLowerCase();
}
public String getLocalisedName(boolean withColor) {
String localisedName = I18N.localise("botany.ph." + getName());
if (withColor && color != null) {
localisedName += color;
}
return localisedName;
}
}
@@ -1,5 +1,7 @@
package binnie.botany.api;
import java.util.Locale;
import forestry.api.genetics.AlleleManager;
import forestry.api.genetics.IAllele;
import forestry.api.genetics.IAlleleArea;
@@ -36,7 +38,7 @@ public enum EnumFlowerChromosome implements IChromosomeType {
@Override
public String getName() {
return toString().toLowerCase();
return toString().toLowerCase(Locale.ENGLISH);
}
@Override
@@ -1,18 +1,31 @@
package binnie.botany.api;
public enum EnumFlowerStage {
import forestry.api.genetics.ISpeciesType;
public enum EnumFlowerStage implements ISpeciesType {
FLOWER("Flower"),
SEED("Seed"),
POLLEN("Pollen"),
NONE("NONE");
POLLEN("Pollen");
protected String name;
public static final EnumFlowerStage[] VALUES = values();
String name;
EnumFlowerStage(String name) {
this.name = name;
}
public static EnumFlowerStage getStage(IFlower flower) {
return getStage(flower.getAge());
}
public static EnumFlowerStage getStage(int age) {
return age == 0
? EnumFlowerStage.SEED
: EnumFlowerStage.FLOWER;
}
public String getName() {
return name;
}
}
@@ -1,11 +1,34 @@
package binnie.botany.api;
public enum EnumMoisture {
DRY,
NORMAL,
DAMP;
import javax.annotation.Nullable;
public String getID() {
import net.minecraft.util.IStringSerializable;
import net.minecraft.util.text.TextFormatting;
import binnie.core.util.I18N;
public enum EnumMoisture implements IStringSerializable {
DRY(TextFormatting.YELLOW),
NORMAL(null),
DAMP(TextFormatting.DARK_BLUE);
@Nullable
final TextFormatting color;
EnumMoisture(@Nullable TextFormatting color) {
this.color = color;
}
@Override
public String getName() {
return name().toLowerCase();
}
public String getLocalisedName(boolean withColor) {
String localisedName = I18N.localise("botany.moisture." + getName());
if (withColor && color != null) {
localisedName += color;
}
return localisedName;
}
}
@@ -1,11 +1,29 @@
package binnie.botany.api;
public enum EnumSoilType {
SOIL,
LOAM,
FLOWERBED;
import java.util.Locale;
public String getID() {
return name().toLowerCase();
import net.minecraft.util.IStringSerializable;
import net.minecraft.util.text.TextFormatting;
import binnie.core.util.I18N;
public enum EnumSoilType implements IStringSerializable {
SOIL(TextFormatting.DARK_GRAY),
LOAM(TextFormatting.GOLD),
FLOWERBED(TextFormatting.LIGHT_PURPLE);
private final TextFormatting color;
EnumSoilType(TextFormatting color) {
this.color = color;
}
@Override
public String getName() {
return name().toLowerCase(Locale.ENGLISH);
}
public String getTranslated() {
return color + I18N.localise("botany.soil." + getName());
}
}
@@ -0,0 +1,18 @@
package binnie.botany.api;
public class FlowerManager {
/**
* Convenient access to AlleleManager.alleleRegistry.getSpeciesRoot("rootFlowers")
*/
public static IFlowerRoot flowerRoot;
/**
* Used to create new flowers.
*/
public static IFlowerFactory flowerFactory;
/**
* Used to manager soil.
*/
public static IGardeningManager gardening;
}
@@ -1,9 +1,10 @@
package binnie.botany.api;
import net.minecraft.world.World;
import forestry.api.genetics.IAlleleEffect;
import forestry.api.genetics.IEffectData;
import net.minecraft.world.World;
public interface IAlleleFlowerEffect extends IAlleleEffect {
IEffectData doEffect(IFlowerGenome genome, IEffectData storedData, World world, int x, int y, int z);
IEffectData doEffect(IFlowerGenome genome, IEffectData effect, World world, int x, int y, int z);
}
@@ -1,11 +1,28 @@
package binnie.botany.api;
import net.minecraft.client.renderer.block.model.ModelResourceLocation;
import net.minecraft.item.Item;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import forestry.api.core.IModelManager;
import forestry.api.genetics.IAlleleProperty;
import forestry.api.genetics.IAlleleSpecies;
public interface IAlleleFlowerSpecies extends IAlleleSpecies {
public interface IAlleleFlowerSpecies extends IAlleleSpecies, IAlleleProperty<IAlleleFlowerSpecies> {
IFlowerType getType();
EnumAcidity getPH();
EnumMoisture getMoisture();
@SideOnly(Side.CLIENT)
int getFlowerColor(EnumFlowerStage type, int renderPass);
@SideOnly(Side.CLIENT)
ModelResourceLocation getFlowerModel(EnumFlowerStage type, boolean flowered);
@SideOnly(Side.CLIENT)
void registerModels(Item item, IModelManager manager, EnumFlowerStage type);
}
@@ -0,0 +1,12 @@
package binnie.botany.api;
import forestry.api.genetics.IAlleleSpeciesBuilder;
public interface IAlleleFlowerSpeciesBuilder extends IAlleleSpeciesBuilder {
@Override
IAlleleFlowerSpecies build();
IAlleleFlowerSpeciesBuilder setPH(EnumAcidity acidity);
IAlleleFlowerSpeciesBuilder setMoisture(EnumMoisture moisture);
}
@@ -0,0 +1,22 @@
package binnie.botany.api;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
public interface IBlockSoil {
EnumAcidity getPH(World world, BlockPos pos);
EnumMoisture getMoisture(World world, BlockPos pos);
EnumSoilType getType(World world, BlockPos pos);
boolean fertilise(World world, BlockPos pos, EnumSoilType soilType);
boolean degrade(World world, BlockPos pos, EnumSoilType soilType);
boolean setPH(World world, BlockPos pos, EnumAcidity acidity);
boolean setMoisture(World world, BlockPos pos, EnumMoisture moisture);
boolean resistsWeeds(World world, BlockPos pos);
}
@@ -0,0 +1,13 @@
package binnie.botany.api;
public interface IColorMix {
IFlowerColor getColorFirst();
IFlowerColor getColorSecond();
boolean isMutation(IFlowerColor colorFirst, IFlowerColor colorSecond);
int getChance();
IFlowerColor getResult();
}
@@ -1,13 +0,0 @@
package binnie.botany.api;
public interface IColourMix {
IFlowerColor getColor1();
IFlowerColor getColor2();
boolean isMutation(IFlowerColor color1, IFlowerColor color2);
int getChance();
IFlowerColor getResult();
}
+10 -5
View File
@@ -1,15 +1,20 @@
package binnie.botany.api;
import forestry.api.genetics.IIndividual;
import javax.annotation.Nullable;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import forestry.api.genetics.IIndividual;
public interface IFlower extends IIndividual {
@Override
IFlowerGenome getGenome();
@Nullable
IFlowerGenome getMate();
void mate(IFlower other);
void mate(IFlower flower);
int getAge();
@@ -17,17 +22,17 @@ public interface IFlower extends IIndividual {
void age();
IFlower getOffspring(World world);
IFlower getOffspring(World world, BlockPos pos);
int getMaxAge();
boolean isWilted();
void setWilted(boolean value);
void setWilted(boolean p0);
boolean hasFlowered();
void setFlowered(boolean value);
void setFlowered(boolean p0);
void removeMate();
}
@@ -9,5 +9,5 @@ public interface IFlowerColor {
int getID();
String getName();
String getColorName();
}
@@ -0,0 +1,15 @@
package binnie.botany.api;
import net.minecraft.item.ItemStack;
import forestry.core.genetics.IGeneticDefinition;
public interface IFlowerDefinition extends IGeneticDefinition {
@Override
IFlowerGenome getGenome();
@Override
IFlower getIndividual();
ItemStack getMemberStack(EnumFlowerStage flowerStage);
}
@@ -0,0 +1,10 @@
package binnie.botany.api;
import forestry.api.genetics.IAllele;
import forestry.api.genetics.IClassification;
public interface IFlowerFactory {
IAlleleFlowerSpeciesBuilder createSpecies(String uid, String unlocalizedName, String authority, String unlocalizedDescription, boolean isDominant, IClassification branch, String binomial, IFlowerType flowerType);
IFlowerMutationBuilder createMutation(IAlleleFlowerSpecies allele0, IAlleleFlowerSpecies allele1, IAllele[] result, int chance);
}
@@ -33,9 +33,9 @@ public interface IFlowerGenome extends IGenome {
float getSappiness();
boolean canTolerate(EnumAcidity pH);
boolean canTolerate(EnumAcidity acidity);
boolean canTolerate(EnumMoisture moisture);
boolean canTolerate(EnumTemperature temp);
boolean canTolerate(EnumTemperature temperature);
}
@@ -1,9 +1,13 @@
package binnie.botany.api;
import forestry.api.genetics.IAllele;
import forestry.api.genetics.IGenome;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import forestry.api.genetics.IMutation;
public interface IFlowerMutation extends IMutation {
float getChance(IAllele allele0, IAllele allele1, IGenome genome0, IGenome genome1);
@Override
IFlowerRoot getRoot();
float getChance(World world, BlockPos pos, IAlleleFlowerSpecies allele0, IAlleleFlowerSpecies allele1, IFlowerGenome genome0, IFlowerGenome genome1);
}
@@ -0,0 +1,6 @@
package binnie.botany.api;
import forestry.api.genetics.IMutationBuilder;
public interface IFlowerMutationBuilder extends IMutationBuilder {
}
@@ -1,22 +1,28 @@
package binnie.botany.api;
import com.mojang.authlib.GameProfile;
import forestry.api.genetics.IAllele;
import forestry.api.genetics.ISpeciesRoot;
import javax.annotation.Nullable;
import java.util.Collection;
import java.util.List;
import net.minecraft.item.ItemStack;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import java.util.Collection;
import com.mojang.authlib.GameProfile;
import forestry.api.genetics.IAllele;
import forestry.api.genetics.ISpeciesRoot;
public interface IFlowerRoot extends ISpeciesRoot {
@Override
IFlower getMember(ItemStack stack);
@Nullable
IFlower getMember(ItemStack memberStack);
@Override
IFlower templateAsIndividual(IAllele[] template);
@Override
IFlower templateAsIndividual(IAllele[] templateActive, IAllele[] templateInactive);
IFlower templateAsIndividual(IAllele[] templateFirst, IAllele[] templateSecond);
@Override
IFlowerGenome templateAsGenome(IAllele[] template);
@@ -25,20 +31,29 @@ public interface IFlowerRoot extends ISpeciesRoot {
IFlowerGenome templateAsGenome(IAllele[] templateActive, IAllele[] templateInactive);
@Override
IBotanistTracker getBreedingTracker(World world, GameProfile player);
IBotanistTracker getBreedingTracker(World world, @Nullable GameProfile profile);
@Override
Collection<IFlowerMutation> getMutations(boolean shuffle);
List<? extends IFlowerMutation> getMutations(boolean shuffle);
EnumFlowerStage getStageType(ItemStack stack);
@Override
@Nullable
EnumFlowerStage getType(ItemStack itemStack);
IFlower getFlower(World world, IFlowerGenome genome);
IFlower getFlower(IFlowerGenome genome);
void addConversion(ItemStack stack, IAllele[] template);
void addConversion(ItemStack memberStack, IAllele[] template);
IFlower getConversion(ItemStack stack);
@Nullable
IFlower getConversion(ItemStack memberStack);
Collection<IColourMix> getColourMixes(boolean shuffle);
Collection<IColorMix> getColorMixes(boolean shuffle);
void registerColourMix(IColourMix colorMix);
void registerColourMix(IColorMix colorMix);
boolean plant(World world, BlockPos pos, IFlower flower, GameProfile owner);
void tryGrowSection(World world, BlockPos pos);
void onGrowFromSeed(World world, BlockPos pos);
}
@@ -1,13 +1,21 @@
package binnie.botany.api;
import net.minecraft.util.IIcon;
import net.minecraft.client.renderer.block.model.ModelResourceLocation;
import net.minecraft.item.Item;
public interface IFlowerType {
IIcon getStem(EnumFlowerStage stage, boolean flowered, int section);
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
IIcon getPetalIcon(EnumFlowerStage stage, boolean flowered, int section);
import forestry.api.core.IModelManager;
IIcon getVariantIcon(EnumFlowerStage stage, boolean flowered, int section);
public interface IFlowerType<I extends IFlowerType<I>> extends Comparable<I> {
@SideOnly(Side.CLIENT)
void registerModels(Item item, IModelManager manager, EnumFlowerStage type);
@SideOnly(Side.CLIENT)
ModelResourceLocation getModel(EnumFlowerStage type, boolean flowered);
String getName();
int getID();
@@ -0,0 +1,68 @@
package binnie.botany.api;
import javax.annotation.Nullable;
import java.util.Collection;
import net.minecraft.block.Block;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import forestry.api.core.EnumTemperature;
public interface IGardeningManager {
default boolean isSoil(Block block) {
return block instanceof IBlockSoil;
}
boolean isSoil(Item item);
boolean isSoil(ItemStack item);
EnumMoisture getNaturalMoisture(World world, BlockPos pos);
EnumAcidity getNaturalPH(World world, BlockPos pos);
float getBiomeMoisture(World world, BlockPos pos);
float getBiomePH(World world, BlockPos pos);
void plantSoil(World world, BlockPos pos, EnumSoilType soil, EnumMoisture moisture, EnumAcidity acidity);
Collection<ItemStack> getAcidFertilisers();
Collection<ItemStack> getAlkalineFertilisers();
Collection<ItemStack> getNutrientFertilisers();
void registerAcidFertiliser(ItemStack stack, int strength);
void registerAlkalineFertiliser(ItemStack stack, int strength);
void registerNutrientFertiliser(ItemStack stack, int strength);
boolean isAcidFertiliser(ItemStack stack);
boolean isAlkalineFertiliser(ItemStack stack);
boolean isNutrientFertiliser(ItemStack stack);
int getFertiliserStrength(ItemStack stack);
boolean canTolerate(@Nullable IFlower flower, World world, BlockPos pos);
EnumSoilType getSoilType(World world, BlockPos pos);
default Block getSoilBlock(EnumSoilType type) {
return getSoilBlock(type, false);
}
Block getSoilBlock(EnumSoilType type, boolean weedKill);
boolean canTolerate(IFlower flower, EnumAcidity acidity, EnumMoisture moisture, EnumTemperature temperature);
boolean isWeedkiller(ItemStack heldItem);
boolean addWeedKiller(World world, BlockPos pos);
}
@@ -1,24 +0,0 @@
package binnie.botany.api.gardening;
import binnie.botany.api.EnumAcidity;
import binnie.botany.api.EnumMoisture;
import binnie.botany.api.EnumSoilType;
import net.minecraft.world.World;
public interface IBlockSoil {
EnumAcidity getPH(World world, int x, int y, int z);
EnumMoisture getMoisture(World world, int x, int y, int z);
EnumSoilType getType(World world, int x, int y, int z);
boolean fertilise(World world, int x, int y, int z, EnumSoilType maxLevel);
boolean degrade(World world, int x, int y, int z, EnumSoilType minLevel);
boolean setPH(World world, int x, int y, int z, EnumAcidity pH);
boolean setMoisture(World world, int x, int y, int z, EnumMoisture p4);
boolean resistsWeeds(World world, int x, int y, int z);
}
@@ -0,0 +1,7 @@
@ParametersAreNonnullByDefault
@MethodsReturnNonnullByDefault
package binnie.botany.api;
import javax.annotation.ParametersAreNonnullByDefault;
import mcp.MethodsReturnNonnullByDefault;
@@ -1,146 +1,119 @@
package binnie.botany.ceramic;
import binnie.botany.Botany;
import binnie.botany.CreativeTabBotany;
import binnie.botany.genetics.EnumFlowerColor;
import binnie.core.block.BlockMetadata;
import binnie.core.block.IBlockMetadata;
import binnie.core.block.TileEntityMetadata;
import binnie.core.util.I18N;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import javax.annotation.Nullable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
import net.minecraft.client.renderer.texture.IIconRegister;
import net.minecraft.block.state.IBlockState;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.EnumChatFormatting;
import net.minecraft.util.IIcon;
import net.minecraft.util.MovingObjectPosition;
import net.minecraft.util.NonNullList;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.RayTraceResult;
import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World;
import net.minecraftforge.common.util.ForgeDirection;
import java.util.ArrayList;
import java.util.List;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
public class BlockCeramic extends Block implements IBlockMetadata {
import forestry.api.core.IItemModelRegister;
import forestry.api.core.IModelManager;
import forestry.core.blocks.IColoredBlock;
import binnie.botany.CreativeTabBotany;
import binnie.botany.genetics.EnumFlowerColor;
import binnie.core.BinnieCore;
import binnie.core.util.TileUtil;
public class BlockCeramic extends Block implements IColoredBlock, IItemModelRegister {
public BlockCeramic() {
super(Material.rock);
super(Material.ROCK);
setHardness(1.0f);
setResistance(5.0f);
setBlockName("ceramic");
setRegistryName("ceramic");
setCreativeTab(CreativeTabBotany.instance);
}
@Override
public ArrayList<ItemStack> getDrops(World world, int x, int y, int z, int blockMeta, int fortune) {
return BlockMetadata.getBlockDropped(this, world, x, y, z, blockMeta);
@SideOnly(Side.CLIENT)
public void registerModel(Item item, IModelManager manager) {
for (EnumFlowerColor c : EnumFlowerColor.values()) {
manager.registerItemModel(item, c.ordinal());
}
}
@Override
public boolean removedByPlayer(World world, EntityPlayer player, int x, int y, int z, boolean willHarvest) {
return BlockMetadata.breakBlock(this, player, world, x, y, z);
public List<ItemStack> getDrops(IBlockAccess world, BlockPos pos, IBlockState state, int fortune) {
return Collections.emptyList();
}
@Override
public TileEntity createNewTileEntity(World var1, int i) {
return new TileEntityMetadata();
public boolean removedByPlayer(IBlockState state, World world, BlockPos pos, @Nullable EntityPlayer player, boolean willHarvest) {
List<ItemStack> drops = new ArrayList<>();
TileCeramic ceramic = TileUtil.getTile(world, pos, TileCeramic.class);
if (ceramic != null) {
drops = Collections.singletonList(ceramic.getStack());
}
boolean hasBeenBroken = world.setBlockToAir(pos);
if (hasBeenBroken && BinnieCore.getBinnieProxy().isSimulating(world) && drops.size() > 0 && (player == null || !player.capabilities.isCreativeMode)) {
for (ItemStack drop : drops) {
spawnAsEntity(world, pos, drop);
}
}
return hasBeenBroken;
}
@Override
public boolean hasTileEntity(int meta) {
public TileEntity createTileEntity(World world, IBlockState state) {
return new TileCeramic();
}
@Override
public boolean hasTileEntity(IBlockState state) {
return true;
}
@Override
public boolean onBlockEventReceived(World world, int x, int y, int z, int eventId, int eventType) {
super.onBlockEventReceived(world, x, y, z, eventId, eventType);
TileEntity tileentity = world.getTileEntity(x, y, z);
return tileentity != null && tileentity.receiveClientEvent(eventId, eventType);
public void onBlockPlacedBy(World worldIn, BlockPos pos, IBlockState state, EntityLivingBase placer, ItemStack stack) {
TileCeramic ceramic = TileUtil.getTile(worldIn, pos, TileCeramic.class);
if (ceramic != null) {
ceramic.setColor(EnumFlowerColor.VALUES[stack.getItemDamage()]);
}
}
@Override
public int getPlacedMeta(ItemStack itemStack, World world, int x, int y, int z, ForgeDirection direction) {
return TileEntityMetadata.getItemDamage(itemStack);
}
@Override
public int getDroppedMeta(int blockMeta, int tileMeta) {
return tileMeta;
}
@Override
public String getBlockName(ItemStack itemStack) {
return I18N.localise("botany.ceramicBlock");
}
@Override
public void addBlockTooltip(ItemStack stack, List tooltip) {
int meta = TileEntityMetadata.getItemDamage(stack);
tooltip.add(EnumChatFormatting.GRAY + EnumFlowerColor.get(meta).getName());
}
@Override
public void dropAsStack(World world, int x, int y, int z, ItemStack itemStack) {
dropBlockAsItem(world, x, y, z, itemStack);
}
@Override
public void getSubBlocks(Item item, CreativeTabs tabs, List itemList) {
@SideOnly(Side.CLIENT)
public void getSubBlocks(Item item, CreativeTabs tab, NonNullList<ItemStack> itemList) {
for (EnumFlowerColor c : EnumFlowerColor.values()) {
itemList.add(TileEntityMetadata.getItemStack(this, c.ordinal()));
itemList.add(new ItemStack(item, 1, c.getFlowerColorAllele().getID()));
}
}
@Override
@SideOnly(Side.CLIENT)
public IIcon getIcon(IBlockAccess world, int x, int y, int z, int side) {
TileEntityMetadata tile = TileEntityMetadata.getTile(world, x, y, z);
if (tile != null) {
return getIcon(side, tile.getTileMetadata());
public ItemStack getPickBlock(IBlockState state, RayTraceResult target, World world, BlockPos pos, EntityPlayer player) {
TileCeramic ceramic = TileUtil.getTile(world, pos, TileCeramic.class);
if (ceramic != null) {
return ceramic.getStack();
}
return super.getIcon(world, x, y, z, side);
return super.getPickBlock(state, target, world, pos, player);
}
@Override
public IIcon getIcon(int side, int meta) {
return blockIcon;
}
@Override
@SideOnly(Side.CLIENT)
public void registerBlockIcons(IIconRegister register) {
blockIcon = Botany.proxy.getIcon(register, "ceramic");
}
@Override
@SideOnly(Side.CLIENT)
public int colorMultiplier(IBlockAccess world, int x, int y, int z) {
TileEntityMetadata tile = TileEntityMetadata.getTile(world, x, y, z);
if (tile != null) {
return getRenderColor(tile.getTileMetadata());
public int colorMultiplier(IBlockState state, @Nullable IBlockAccess world, @Nullable BlockPos pos, int tintIndex) {
if (world != null && pos != null) {
TileCeramic ceramic = TileUtil.getTile(world, pos, TileCeramic.class);
if (ceramic != null) {
return ceramic.getColor().getFlowerColorAllele().getColor(false);
}
}
return 0xffffff;
}
@Override
public void breakBlock(World world, int x, int y, int z, Block block, int side) {
super.breakBlock(world, x, y, z, block, side);
world.removeTileEntity(x, y, z);
}
@Override
public ItemStack getPickBlock(MovingObjectPosition target, World world, int x, int y, int z, EntityPlayer player) {
return BlockMetadata.getPickBlock(world, x, y, z);
}
@Override
@SideOnly(Side.CLIENT)
public int getRenderColor(int meta) {
return EnumFlowerColor.get(meta).getColor(false);
return EnumFlowerColor.get(0).getFlowerColorAllele().getColor(false);
}
}
@@ -1,553 +0,0 @@
package binnie.botany.ceramic;
import binnie.botany.Botany;
import binnie.botany.CreativeTabBotany;
import binnie.botany.genetics.EnumFlowerColor;
import binnie.botany.items.BotanyItems;
import binnie.core.BinnieCore;
import binnie.core.block.BlockMetadata;
import binnie.core.block.IBlockMetadata;
import binnie.core.block.IMultipassBlock;
import binnie.core.block.MultipassBlockRenderer;
import binnie.core.block.TileEntityMetadata;
import binnie.core.util.I18N;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
import net.minecraft.client.renderer.texture.IIconRegister;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.EnumChatFormatting;
import net.minecraft.util.IIcon;
import net.minecraft.util.MovingObjectPosition;
import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World;
import net.minecraftforge.common.util.ForgeDirection;
import java.util.ArrayList;
import java.util.List;
public class BlockCeramicBrick extends Block implements IBlockMetadata, IMultipassBlock {
public BlockCeramicBrick() {
super(Material.rock);
setHardness(1.0f);
setResistance(5.0f);
setBlockName("ceramicBrick");
setCreativeTab(CreativeTabBotany.instance);
}
private static BlockType getType(int meta) {
return new BlockType(meta);
}
@Override
public ArrayList<ItemStack> getDrops(World world, int x, int y, int z, int blockMeta, int fortune) {
return BlockMetadata.getBlockDropped(this, world, x, y, z, blockMeta);
}
@Override
public boolean removedByPlayer(World world, EntityPlayer player, int x, int y, int z) {
return BlockMetadata.breakBlock(this, player, world, x, y, z);
}
@Override
public TileEntity createNewTileEntity(World var1, int i) {
return new TileEntityMetadata();
}
@Override
public boolean hasTileEntity(int meta) {
return true;
}
@Override
public boolean onBlockEventReceived(World world, int x, int y, int z, int eventId, int eventType) {
super.onBlockEventReceived(world, x, y, z, eventId, eventType);
TileEntity tileentity = world.getTileEntity(x, y, z);
return tileentity != null && tileentity.receiveClientEvent(eventId, eventType);
}
@Override
public int getPlacedMeta(ItemStack itemStack, World world, int x, int y, int z, ForgeDirection direction) {
return TileEntityMetadata.getItemDamage(itemStack);
}
@Override
public int getDroppedMeta(int blockMeta, int tileMeta) {
return tileMeta;
}
@Override
public String getBlockName(ItemStack itemStack) {
int meta = TileEntityMetadata.getItemDamage(itemStack);
return getType(meta).getName();
}
@Override
public void addBlockTooltip(ItemStack itemStack, List tooltip) {
int meta = TileEntityMetadata.getItemDamage(itemStack);
getType(meta).addTooltip(tooltip);
}
@Override
public void dropAsStack(World world, int x, int y, int z, ItemStack itemStack) {
dropBlockAsItem(world, x, y, z, itemStack);
}
@Override
public void getSubBlocks(Item item, CreativeTabs tab, List itemList) {
for (EnumFlowerColor c : EnumFlowerColor.values()) {
BlockType type = new BlockType(c, c, TileType.Tile);
itemList.add(TileEntityMetadata.getItemStack(this, type.ordinal()));
}
for (TileType type2 : TileType.values()) {
if (type2.canDouble()) {
itemList.add(new BlockType(EnumFlowerColor.BROWN, EnumFlowerColor.GOLD, type2).getStack(1));
}
}
itemList.add(new BlockType(EnumFlowerColor.GOLD, EnumFlowerColor.GOLD, TileType.Split).getStack(1));
itemList.add(new BlockType(EnumFlowerColor.BROWN, EnumFlowerColor.BROWN, TileType.Chequered).getStack(1));
itemList.add(new BlockType(EnumFlowerColor.GOLD, EnumFlowerColor.BROWN, TileType.LargeBrick).getStack(1));
}
@Override
@SideOnly(Side.CLIENT)
public IIcon getIcon(IBlockAccess world, int x, int y, int z, int side) {
TileEntityMetadata tile = TileEntityMetadata.getTile(world, x, y, z);
if (tile != null) {
return getIcon(side, tile.getTileMetadata());
}
return super.getIcon(world, x, y, z, side);
}
@Override
public IIcon getIcon(int side, int meta) {
return getType(meta).getIcon(MultipassBlockRenderer.getLayer());
}
@Override
@SideOnly(Side.CLIENT)
public void registerBlockIcons(IIconRegister register) {
for (TileType type : TileType.values()) {
for (int i = 0; i < 3; ++i) {
type.icons[i] = Botany.proxy.getIcon(register, "ceramic." + type.id + "." + i);
}
}
}
@Override
@SideOnly(Side.CLIENT)
public int colorMultiplier(IBlockAccess world, int x, int y, int z) {
TileEntityMetadata tile = TileEntityMetadata.getTile(world, x, y, z);
if (tile != null) {
return getRenderColor(tile.getTileMetadata());
}
return 0xffffff;
}
@Override
public void breakBlock(World world, int x, int y, int z, Block block, int side) {
super.breakBlock(world, x, y, z, block, side);
world.removeTileEntity(x, y, z);
}
@Override
public ItemStack getPickBlock(MovingObjectPosition target, World world, int x, int y, int z) {
return BlockMetadata.getPickBlock(world, x, y, z);
}
@Override
@SideOnly(Side.CLIENT)
public int getRenderColor(int meta) {
return colorMultiplier(meta);
}
@Override
public int getNumberOfPasses() {
return 3;
}
@Override
public int colorMultiplier(int meta) {
BlockType type = getType(meta);
if (MultipassBlockRenderer.getLayer() == 0) {
return 0xffffff;
}
if (MultipassBlockRenderer.getLayer() == 1) {
return type.color1.getColor(false);
}
return type.color2.getColor(false);
}
@Override
public int getRenderType() {
return BinnieCore.multipassRenderID;
}
public enum TileType {
Tile("tile", "ceramicTile"),
Brick("brick", "ceramicBricks"),
StripeBrick("brickstripe", "strippedCeramicBricks"),
LargeBrick("bricklarge", "largeCeramicBricks"),
Split("split", "splitCeramicTile"),
Chequered("cheque", "chequeredCeramicTile"),
Mixed("mixed", "mixedCeramicTile"),
VerticalBrick("verticalbrick", "verticalCeramicBricks"),
VerticalStripeBrick("verticalbrickstripe", "verticalStripedCeramicBricks"),
VerticalLargeBrick("verticalbricklarge", "largeVerticalCeramicBricks");
protected String id;
protected String name;
protected IIcon[] icons;
TileType(String id, String name) {
icons = new IIcon[3];
this.id = id;
this.name = name;
}
public static TileType get(int id) {
return values()[id % values().length];
}
public boolean canDouble() {
return this != TileType.Tile;
}
public ItemStack getRecipe(List<ItemStack> stacks) {
switch (this) {
case Tile:
return getTileRecipe(stacks);
case Split:
return getSplitRecipe(stacks);
case Chequered:
return getChequeredRecipe(stacks);
case Mixed:
return getMixedRecipe(stacks);
case LargeBrick:
return getLargeBrickRecipe(stacks);
case Brick:
case StripeBrick:
return getBrickRecipe(stacks);
case VerticalLargeBrick:
case VerticalBrick:
case VerticalStripeBrick:
return getVerticalBrickRecipe(stacks);
}
return null;
}
private ItemStack getTileRecipe(List<ItemStack> stacks) {
if (stacks.size() != 4) {
return null;
}
int mortars = 0;
int blockColor = -1;
for (ItemStack stack : stacks) {
if (isMortar(stack)) {
mortars++;
} else {
if (stack.getItem() != Item.getItemFromBlock(Botany.ceramic)) {
return null;
}
int color = TileEntityMetadata.getItemDamage(stack);
if (blockColor == -1) {
blockColor = color;
} else if (blockColor != color) {
return null;
}
}
}
if (mortars != 1) {
return null;
}
EnumFlowerColor c = EnumFlowerColor.get(blockColor);
return new BlockType(c, c, TileType.Tile).getStack(3);
}
private ItemStack getSplitRecipe(List<ItemStack> stacks) {
if (stacks.size() != 4) {
return null;
}
int[] colors = {-1, -1};
int altCounter = 0;
for (ItemStack stack : stacks) {
int alt = (altCounter != 0 && altCounter != 3) ? 1 : 0;
if (stack.getItem() != Item.getItemFromBlock(Botany.ceramicBrick)) {
return null;
}
BlockType type = new BlockType(stack);
if (type.type != TileType.Tile) {
return null;
}
int color2 = type.color1.ordinal();
if (colors[alt] == -1) {
colors[alt] = color2;
} else if (colors[alt] != color2) {
return null;
}
altCounter++;
}
return new BlockType(EnumFlowerColor.get(colors[0]), EnumFlowerColor.get(colors[1]), TileType.Split).getStack(4);
}
private ItemStack getChequeredRecipe(List<ItemStack> stacks) {
if (stacks.size() != 4) {
return null;
}
int[] colors = {-1, -1};
for (ItemStack stack : stacks) {
if (stack.getItem() != Item.getItemFromBlock(Botany.ceramicBrick)) {
return null;
}
BlockType type2 = new BlockType(stack);
if (type2.type != TileType.Split) {
return null;
}
int color1 = type2.color1.ordinal();
int color2 = type2.color2.ordinal();
if (colors[0] == -1) {
colors[0] = color1;
colors[1] = color2;
} else if (colors[0] != color1 || colors[1] != color2) {
return null;
}
}
return new BlockType(EnumFlowerColor.get(colors[0]), EnumFlowerColor.get(colors[1]), TileType.Chequered).getStack(4);
}
private ItemStack getMixedRecipe(List<ItemStack> stacks) {
if (stacks.size() != 4) {
return null;
}
int[] colors = {-1, -1};
for (ItemStack stack : stacks) {
if (stack.getItem() != Item.getItemFromBlock(Botany.ceramicBrick)) {
return null;
}
BlockType type2 = new BlockType(stack);
if (type2.isTwoColors()) {
return null;
}
int color3 = type2.color1.ordinal();
if (type2.type == TileType.Split) {
if (colors[1] != -1) {
return null;
}
colors[1] = color3;
} else {
if (type2.type != TileType.Chequered) {
return null;
}
if (colors[0] == -1) {
colors[0] = color3;
} else if (colors[0] != color3) {
return null;
}
}
}
if (colors[0] == -1 || colors[1] == -1) {
return null;
}
return new BlockType(EnumFlowerColor.get(colors[0]), EnumFlowerColor.get(colors[1]), TileType.Mixed).getStack(4);
}
private ItemStack getLargeBrickRecipe(List<ItemStack> stacks) {
if (stacks.size() == 1) {
ItemStack stack3 = stacks.get(0);
BlockType type3 = new BlockType(stack3);
if (type3.type == TileType.VerticalLargeBrick) {
type3.type = this;
return type3.getStack(1);
}
return null;
}
if (stacks.size() != 3) {
return null;
}
int[] colors = {-1, -1};
for (ItemStack stack4 : stacks) {
if (stack4.getItem() != Item.getItemFromBlock(Botany.ceramicBrick)) {
return null;
}
BlockType type4 = new BlockType(stack4);
if (type4.type != TileType.Tile) {
return null;
}
int color5 = type4.color1.ordinal();
if (colors[0] == -1) {
colors[0] = color5;
} else if (colors[1] == -1) {
colors[1] = color5;
} else if (colors[1] != color5) {
return null;
}
}
if (colors[1] == -1) {
colors[1] = colors[0];
}
return new BlockType(EnumFlowerColor.get(colors[0]), EnumFlowerColor.get(colors[1]), TileType.LargeBrick).getStack(3);
}
private ItemStack getBrickRecipe(List<ItemStack> stacks) {
if (stacks.size() == 1) {
ItemStack stack = stacks.get(0);
BlockType type = new BlockType(stack);
if (type.type == TileType.VerticalBrick) {
type.type = this;
return type.getStack(1);
}
if (type.type == TileType.StripeBrick) {
type.type = this;
return type.getStack(1);
}
return null;
}
if (stacks.size() != 4) {
return null;
}
int[] colors = {-1, -1};
for (int index2 = 0; index2 < stacks.size(); ++index2) {
ItemStack stack = stacks.get(index2);
if (stack.getItem() != Item.getItemFromBlock(Botany.ceramicBrick)) {
return null;
}
BlockType type = new BlockType(stack);
if (type.type != TileType.LargeBrick) {
return null;
}
int color5 = type.color1.ordinal();
int color6 = type.color2.ordinal();
int alt2 = (index2 != 0 && index2 != 3) ? 1 : 0;
if (this == TileType.StripeBrick) {
alt2 = 0;
}
if (colors[alt2] == -1) {
colors[alt2] = color5;
colors[1 - alt2] = color6;
} else if (colors[alt2] != color5 || colors[1 - alt2] != color6) {
return null;
}
}
return new BlockType(EnumFlowerColor.get(colors[0]), EnumFlowerColor.get(colors[1]), this).getStack(4);
}
private ItemStack getVerticalBrickRecipe(List<ItemStack> stacks) {
if (stacks.size() != 1) {
return null;
}
ItemStack stack5 = stacks.get(0);
BlockType type = new BlockType(stack5);
if (type.type == TileType.LargeBrick) {
type.type = TileType.VerticalLargeBrick;
return type.getStack(1);
}
if (type.type == TileType.Brick) {
type.type = TileType.VerticalBrick;
return type.getStack(1);
}
if (type.type == TileType.StripeBrick) {
type.type = TileType.VerticalStripeBrick;
return type.getStack(1);
}
return null;
}
private boolean isMortar(ItemStack stack) {
return stack.getItem() == Botany.misc
&& stack.getItemDamage() == BotanyItems.Mortar.ordinal();
}
}
public static class BlockType {
protected EnumFlowerColor color1;
protected EnumFlowerColor color2;
protected TileType type;
private BlockType(EnumFlowerColor color1, EnumFlowerColor color2, TileType type) {
this.color1 = color1;
this.color2 = color2;
this.type = type;
}
public boolean isTwoColors() {
return type.canDouble() && color2 != color1;
}
public BlockType(ItemStack stack) {
this(TileEntityMetadata.getItemDamage(stack));
}
public ItemStack getStack(int stackSize) {
ItemStack stack = TileEntityMetadata.getItemStack(Botany.ceramicBrick, ordinal());
stack.stackSize = stackSize;
return stack;
}
public BlockType(int id) {
color1 = EnumFlowerColor.get(id & 0xFF);
color2 = EnumFlowerColor.get(id >> 8 & 0xFF);
type = TileType.get(id >> 16 & 0xFF);
}
public String getName() {
return I18N.localise("botany." + type.name);
}
public void addTooltip(List tooltip) {
String name = color1.getName();
if (type.canDouble() && color2 != color1) {
name = I18N.localise("botany.colour.double", name, color2.getName());
}
tooltip.add(EnumChatFormatting.GRAY + name);
}
public int ordinal() {
return color1.ordinal() + color2.ordinal() * 256 + type.ordinal() * 65536;
}
public IIcon getIcon(int layer) {
return type.icons[layer];
}
}
}
@@ -1,42 +1,32 @@
package binnie.botany.ceramic;
import net.minecraft.block.material.Material;
import net.minecraft.item.ItemStack;
import binnie.botany.CreativeTabBotany;
import binnie.botany.genetics.EnumFlowerColor;
import binnie.core.block.TileEntityMetadata;
import binnie.core.util.I18N;
import binnie.extratrees.api.IDesign;
import binnie.extratrees.carpentry.BlockDesign;
import binnie.extratrees.carpentry.DesignBlock;
import binnie.extratrees.carpentry.ModuleCarpentry;
import net.minecraft.block.material.Material;
import net.minecraft.item.ItemStack;
import net.minecraft.util.EnumChatFormatting;
import java.util.List;
public class BlockCeramicPatterned extends BlockDesign {
public BlockCeramicPatterned() {
super(CeramicDesignSystem.instance, Material.rock);
super(CeramicDesignSystem.instance, Material.ROCK);
setHardness(1.0f);
setResistance(5.0f);
setCreativeTab(CreativeTabBotany.instance);
setBlockName("ceramicPattern");
setRegistryName("ceramicPattern");
}
@Override
public ItemStack getCreativeStack(IDesign design) {
return ModuleCarpentry.getItemStack(this, CeramicColor.get(EnumFlowerColor.WHITE), CeramicColor.get(EnumFlowerColor.BLACK), design);
return ModuleCarpentry.getItemStack(this, CeramicColor.get(EnumFlowerColor.White), CeramicColor.get(EnumFlowerColor.Black), design);
}
@Override
public String getBlockName(DesignBlock design) {
return I18N.localise("botany.ceramicBlock");
}
@Override
public void addBlockTooltip(ItemStack stack, List tooltip) {
super.addBlockTooltip(stack, tooltip);
DesignBlock block = ModuleCarpentry.getDesignBlock(getDesignSystem(), TileEntityMetadata.getItemDamage(stack));
tooltip.add(EnumChatFormatting.GRAY + block.getDesign().getName());
return I18N.localise("botany.ceramic.block.name", design.getDesign().getName());
}
}
@@ -1,197 +0,0 @@
package binnie.botany.ceramic;
import binnie.botany.Botany;
import binnie.botany.CreativeTabBotany;
import binnie.botany.genetics.EnumFlowerColor;
import binnie.core.block.BlockMetadata;
import binnie.core.block.IBlockMetadata;
import binnie.core.block.TileEntityMetadata;
import binnie.core.util.I18N;
import binnie.extratrees.ExtraTrees;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
import net.minecraft.client.renderer.texture.IIconRegister;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.EnumChatFormatting;
import net.minecraft.util.IIcon;
import net.minecraft.util.MovingObjectPosition;
import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World;
import net.minecraftforge.common.util.ForgeDirection;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
public class BlockStained extends Block implements IBlockMetadata {
public BlockStained() {
super(Material.glass);
setCreativeTab(CreativeTabBotany.instance);
setBlockName("stained");
}
@Override
public int quantityDropped(Random rand) {
return 0;
}
@Override
public boolean isOpaqueCube() {
return false;
}
@Override
public boolean renderAsNormalBlock() {
return false;
}
@Override
@SideOnly(Side.CLIENT)
public int getRenderBlockPass() {
return 1;
}
@Override
@SideOnly(Side.CLIENT)
public boolean shouldSideBeRendered(IBlockAccess world, int x, int y, int z, int side) {
// Block block2 = world.getBlock(x - Facing.offsetsXForSide[side], y - Facing.offsetsYForSide[side], z - Facing.offsetsZForSide[side]);
Block block = world.getBlock(x, y, z);
return block != this
&& block != ExtraTrees.blockStained
&& super.shouldSideBeRendered(world, x, y, z, side);
}
@Override
public ArrayList<ItemStack> getDrops(World world, int x, int y, int z, int blockMeta, int fortune) {
return BlockMetadata.getBlockDropped(this, world, x, y, z, blockMeta);
}
@Override
public boolean removedByPlayer(World world, EntityPlayer player, int x, int y, int z, boolean willHarvest) {
return BlockMetadata.breakBlock(this, player, world, x, y, z);
}
@Override
public TileEntity createNewTileEntity(World var1, int i) {
return new TileEntityMetadata();
}
@Override
public boolean hasTileEntity(int meta) {
return true;
}
@Override
public boolean onBlockEventReceived(World world, int x, int y, int z, int eventId, int eventType) {
super.onBlockEventReceived(world, x, y, z, eventId, eventType);
TileEntity tileentity = world.getTileEntity(x, y, z);
return tileentity != null && tileentity.receiveClientEvent(eventId, eventType);
}
@Override
public int getPlacedMeta(ItemStack itemStack, World world, int x, int y, int z, ForgeDirection direction) {
return TileEntityMetadata.getItemDamage(itemStack);
}
@Override
public int getDroppedMeta(int blockMeta, int tileMeta) {
return tileMeta;
}
@Override
public String getBlockName(ItemStack itemStack) {
return I18N.localise("botany.pigmentedGlass");
}
@Override
public void addBlockTooltip(ItemStack itemStack, List tooltip) {
int meta = TileEntityMetadata.getItemDamage(itemStack);
tooltip.add(EnumChatFormatting.GRAY + EnumFlowerColor.get(meta).getName());
}
@Override
public void dropAsStack(World world, int x, int y, int z, ItemStack stack) {
dropBlockAsItem(world, x, y, z, stack);
}
@Override
public void getSubBlocks(Item item, CreativeTabs tab, List itemList) {
for (EnumFlowerColor c : EnumFlowerColor.values()) {
itemList.add(TileEntityMetadata.getItemStack(this, c.ordinal()));
}
}
@Override
@SideOnly(Side.CLIENT)
public IIcon getIcon(IBlockAccess world, int x, int y, int z, int side) {
TileEntityMetadata tile = TileEntityMetadata.getTile(world, x, y, z);
if (tile != null) {
return getIcon(side, tile.getTileMetadata());
}
return super.getIcon(world, x, y, z, side);
}
@Override
public IIcon getIcon(int side, int meta) {
return blockIcon;
}
@Override
@SideOnly(Side.CLIENT)
public void registerBlockIcons(IIconRegister register) {
blockIcon = Botany.proxy.getIcon(register, "stained");
}
@Override
@SideOnly(Side.CLIENT)
public int colorMultiplier(IBlockAccess world, int x, int y, int z) {
TileEntityMetadata tile = TileEntityMetadata.getTile(world, x, y, z);
if (tile != null) {
return getRenderColor(tile.getTileMetadata());
}
return 0xffffff;
}
@Override
public void breakBlock(World world, int x, int y, int z, Block block, int side) {
super.breakBlock(world, x, y, z, block, side);
world.removeTileEntity(x, y, z);
}
@Override
public boolean isWood(IBlockAccess world, int x, int y, int z) {
return true;
}
@Override
public int getFlammability(IBlockAccess world, int x, int y, int z, ForgeDirection face) {
return 20;
}
@Override
public boolean isFlammable(IBlockAccess world, int x, int y, int z, ForgeDirection face) {
return true;
}
@Override
public int getFireSpreadSpeed(IBlockAccess world, int x, int y, int z, ForgeDirection face) {
return 5;
}
@Override
public ItemStack getPickBlock(MovingObjectPosition target, World world, int x, int y, int z, EntityPlayer player) {
return BlockMetadata.getPickBlock(world, x, y, z);
}
@Override
@SideOnly(Side.CLIENT)
public int getRenderColor(int meta) {
return EnumFlowerColor.get(meta).getColor(false);
}
}
@@ -0,0 +1,185 @@
package binnie.botany.ceramic;
import javax.annotation.Nullable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;
import net.minecraft.block.Block;
import net.minecraft.block.SoundType;
import net.minecraft.block.material.Material;
import net.minecraft.block.state.IBlockState;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.enchantment.EnchantmentHelper;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.init.Enchantments;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.stats.StatList;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.BlockRenderLayer;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.NonNullList;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.RayTraceResult;
import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World;
import net.minecraftforge.event.ForgeEventFactory;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import forestry.api.core.IItemModelRegister;
import forestry.api.core.IModelManager;
import forestry.core.blocks.IColoredBlock;
import binnie.botany.CreativeTabBotany;
import binnie.botany.genetics.EnumFlowerColor;
import binnie.core.block.BlockMetadata;
import binnie.core.block.IBlockMetadata;
import binnie.core.block.TileEntityMetadata;
import binnie.core.util.I18N;
public class BlockStainedGlass extends Block implements IBlockMetadata, IColoredBlock, IItemModelRegister {
public BlockStainedGlass() {
super(Material.GLASS);
setCreativeTab(CreativeTabBotany.instance);
setRegistryName("stained");
setSoundType(SoundType.GLASS);
setHardness(0.3F);
}
@Override
public int quantityDropped(Random rand) {
return 0;
}
@Override
public boolean isOpaqueCube(IBlockState state) {
return false;
}
@SideOnly(Side.CLIENT)
@Override
public BlockRenderLayer getBlockLayer() {
return BlockRenderLayer.TRANSLUCENT;
}
@SideOnly(Side.CLIENT)
@Override
public void registerModel(Item item, IModelManager manager) {
for (EnumFlowerColor color : EnumFlowerColor.values()) {
manager.registerItemModel(item, color.getFlowerColorAllele().getID());
}
}
@Override
@SideOnly(Side.CLIENT)
public boolean shouldSideBeRendered(IBlockState blockState, IBlockAccess blockAccess, BlockPos pos, EnumFacing side) {
IBlockState iblockstate = blockAccess.getBlockState(pos.offset(side));
Block block = iblockstate.getBlock();
return block != this;
}
@Override
public void harvestBlock(World worldIn, EntityPlayer player, BlockPos pos, IBlockState state, @Nullable TileEntity te, ItemStack stack) {
player.addStat(StatList.getBlockStats(this));
player.addExhaustion(0.005F);
if (EnchantmentHelper.getEnchantmentLevel(Enchantments.SILK_TOUCH, stack) > 0 && te instanceof TileEntityMetadata) {
List<ItemStack> items = new ArrayList<>();
TileEntityMetadata tile = (TileEntityMetadata) te;
int damage = getDroppedMeta(state, tile.getTileMetadata());
ItemStack itemstack = TileEntityMetadata.getItemStack(this, damage);
if (!itemstack.isEmpty()) {
items.add(itemstack);
}
ForgeEventFactory.fireBlockHarvesting(items, worldIn, pos, state, 0, 1.0f, true, player);
for (ItemStack item : items) {
spawnAsEntity(worldIn, pos, item);
}
}
}
@Override
public List<ItemStack> getDrops(IBlockAccess world, BlockPos pos, IBlockState state, int fortune) {
return Collections.emptyList();
}
@Override
public TileEntity createNewTileEntity(World var1, int i) {
return new TileEntityMetadata();
}
@Override
public boolean hasTileEntity(IBlockState state) {
return true;
}
@Override
public boolean eventReceived(IBlockState state, World worldIn, BlockPos pos, int id, int param) {
TileEntity tileentity = worldIn.getTileEntity(pos);
return tileentity != null && tileentity.receiveClientEvent(id, param);
}
@Override
public int getPlacedMeta(ItemStack stack, World world, BlockPos pos, EnumFacing clickedBlock) {
return TileEntityMetadata.getItemDamage(stack);
}
@Override
public int getDroppedMeta(IBlockState state, int tileMetadata) {
return tileMetadata;
}
@Override
public String getDisplayName(ItemStack itemStack) {
EnumFlowerColor color = EnumFlowerColor.get(TileEntityMetadata.getItemDamage(itemStack));
return I18N.localise("botany.pigmented.glass.name", color.getDisplayName());
}
@Override
public void getSubBlocks(Item itemIn, CreativeTabs tab, NonNullList<ItemStack> itemList) {
for (EnumFlowerColor color : EnumFlowerColor.values()) {
itemList.add(TileEntityMetadata.getItemStack(this, color.ordinal()));
}
}
@Override
public boolean isWood(IBlockAccess world, BlockPos pos) {
return true;
}
@Override
public int getFlammability(IBlockAccess world, BlockPos pos, EnumFacing face) {
return 20;
}
@Override
public boolean isFlammable(IBlockAccess world, BlockPos pos, EnumFacing face) {
return true;
}
@Override
public int getFireSpreadSpeed(IBlockAccess world, BlockPos pos, EnumFacing face) {
return 5;
}
@Override
public ItemStack getPickBlock(IBlockState state, RayTraceResult target, World world, BlockPos pos, EntityPlayer player) {
return BlockMetadata.getPickBlock(world, pos);
}
@Override
public int colorMultiplier(IBlockState state, @Nullable IBlockAccess worldIn, @Nullable BlockPos pos, int tintIndex) {
if (worldIn == null || pos == null) {
return 0;
}
EnumFlowerColor color = EnumFlowerColor.get(TileEntityMetadata.getTileMetadata(worldIn, pos));
return color.getFlowerColorAllele().getColor(false);
}
}
@@ -1,25 +1,25 @@
package binnie.botany.ceramic;
import java.util.LinkedHashMap;
import java.util.Map;
import net.minecraft.item.ItemStack;
import binnie.botany.Botany;
import binnie.botany.genetics.EnumFlowerColor;
import binnie.core.block.TileEntityMetadata;
import binnie.extratrees.api.IDesignMaterial;
import net.minecraft.item.ItemStack;
import java.util.LinkedHashMap;
import java.util.Map;
public class CeramicColor implements IDesignMaterial {
private static Map<EnumFlowerColor, CeramicColor> map;
private final static Map<EnumFlowerColor, CeramicColor> map = new LinkedHashMap<>();
static {
CeramicColor.map = new LinkedHashMap<>();
for (EnumFlowerColor c : EnumFlowerColor.values()) {
CeramicColor.map.put(c, new CeramicColor(c));
}
}
protected EnumFlowerColor color;
EnumFlowerColor color;
CeramicColor(EnumFlowerColor color) {
this.color = color;
@@ -35,12 +35,17 @@ public class CeramicColor implements IDesignMaterial {
}
@Override
public String getName() {
public ItemStack getStack(boolean fireproof) {
return getStack();
}
@Override
public String getDesignMaterialName() {
return color.getName();
}
@Override
public int getColor() {
return color.getColor(false);
public int getColour() {
return color.getFlowerColorAllele().getColor(false);
}
}
@@ -1,28 +1,33 @@
package binnie.botany.ceramic;
import javax.annotation.Nullable;
import java.util.HashMap;
import java.util.Map;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
import net.minecraft.client.renderer.texture.TextureMap;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import binnie.botany.Botany;
import binnie.botany.genetics.EnumFlowerColor;
import binnie.botany.items.BotanyItems;
import binnie.core.AbstractMod;
import binnie.core.BinnieCore;
import binnie.extratrees.api.IDesignMaterial;
import binnie.extratrees.api.IDesignSystem;
import binnie.extratrees.api.IPattern;
import binnie.extratrees.carpentry.DesignerManager;
import binnie.extratrees.carpentry.EnumPattern;
import net.minecraft.client.renderer.texture.IIconRegister;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.util.IIcon;
import java.util.HashMap;
import java.util.Map;
public class CeramicDesignSystem implements IDesignSystem {
public static CeramicDesignSystem instance = new CeramicDesignSystem();
protected Map<Integer, IIcon> primary;
protected Map<Integer, IIcon> secondary;
Map<Integer, TextureAtlasSprite> primary;
Map<Integer, TextureAtlasSprite> secondary;
CeramicDesignSystem() {
primary = new HashMap<>();
@@ -32,12 +37,12 @@ public class CeramicDesignSystem implements IDesignSystem {
@Override
public IDesignMaterial getDefaultMaterial() {
return CeramicColor.get(EnumFlowerColor.WHITE);
return CeramicColor.get(EnumFlowerColor.White);
}
@Override
public IDesignMaterial getDefaultMaterial2() {
return CeramicColor.get(EnumFlowerColor.BLACK);
return CeramicColor.get(EnumFlowerColor.Black);
}
@Override
@@ -51,11 +56,13 @@ public class CeramicDesignSystem implements IDesignSystem {
}
public String getTexturePath() {
return "ceramic";
return "blocks/ceramic";
}
@Override
public IIcon getPrimaryIcon(IPattern pattern) {
@Nullable
@SideOnly(Side.CLIENT)
public TextureAtlasSprite getPrimarySprite(IPattern pattern) {
if (pattern instanceof EnumPattern) {
return primary.get(((EnumPattern) pattern).ordinal());
}
@@ -63,7 +70,9 @@ public class CeramicDesignSystem implements IDesignSystem {
}
@Override
public IIcon getSecondaryIcon(IPattern pattern) {
@Nullable
@SideOnly(Side.CLIENT)
public TextureAtlasSprite getSecondarySprite(IPattern pattern) {
if (pattern instanceof EnumPattern) {
return secondary.get(((EnumPattern) pattern).ordinal());
}
@@ -71,10 +80,14 @@ public class CeramicDesignSystem implements IDesignSystem {
}
@Override
public void registerIcons(IIconRegister register) {
@SideOnly(Side.CLIENT)
public void registerSprites() {
TextureMap textureMap = Minecraft.getMinecraft().getTextureMapBlocks();
for (EnumPattern pattern : EnumPattern.values()) {
primary.put(pattern.ordinal(), BinnieCore.proxy.getIcon(register, getMod().getModID(), getTexturePath() + "/" + pattern.toString().toLowerCase() + ".0"));
secondary.put(pattern.ordinal(), BinnieCore.proxy.getIcon(register, getMod().getModID(), getTexturePath() + "/" + pattern.toString().toLowerCase() + ".1"));
ResourceLocation primaryLocation = new ResourceLocation(getMod().getModID(), getTexturePath() + "/" + pattern.toString().toLowerCase() + ".0");
ResourceLocation secondaryLocation = new ResourceLocation(getMod().getModID(), getTexturePath() + "/" + pattern.toString().toLowerCase() + ".1");
primary.put(pattern.ordinal(), textureMap.registerSprite(primaryLocation));
secondary.put(pattern.ordinal(), textureMap.registerSprite(secondaryLocation));
}
}
@@ -84,11 +97,14 @@ public class CeramicDesignSystem implements IDesignSystem {
@Override
public ItemStack getAdhesive() {
return BotanyItems.Mortar.get(1);
return BotanyItems.MORTAR.get(1);
}
@Override
public IDesignMaterial getMaterial(ItemStack stack) {
return (stack.getItem() == Item.getItemFromBlock(Botany.ceramic)) ? getMaterial(stack.getItemDamage()) : null;
@Nullable
public IDesignMaterial getMaterial(ItemStack itemStack) {
return (itemStack.getItem() == Item.getItemFromBlock(Botany.ceramic))
? getMaterial(itemStack.getItemDamage())
: null;
}
}
@@ -1,22 +1,27 @@
package binnie.botany.ceramic;
import binnie.botany.Botany;
import net.minecraft.inventory.InventoryCrafting;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.item.crafting.IRecipe;
import net.minecraft.world.World;
import java.util.ArrayList;
import java.util.List;
import net.minecraft.inventory.InventoryCrafting;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.item.crafting.IRecipe;
import net.minecraft.util.NonNullList;
import net.minecraft.world.World;
import net.minecraftforge.common.ForgeHooks;
import binnie.botany.Botany;
import binnie.botany.ceramic.brick.CeramicBrickType;
public class CeramicTileRecipe implements IRecipe {
protected ItemStack cached;
private ItemStack cached = ItemStack.EMPTY;
@Override
public boolean matches(InventoryCrafting crafting, World world) {
cached = getCraftingResult(crafting);
return cached != null;
public boolean matches(InventoryCrafting inv, World world) {
cached = getCraftingResult(inv);
return !cached.isEmpty();
}
@Override
@@ -28,10 +33,9 @@ public class CeramicTileRecipe implements IRecipe {
List<ItemStack> stacks = new ArrayList<>();
int ix = -1;
int iy = -1;
for (int i = 0; i < inv.getSizeInventory(); ++i) {
ItemStack stack = inv.getStackInSlot(i);
if (stack != null) {
if (!stack.isEmpty()) {
int x = i / 3;
int y = i % 3;
if (ix == -1) {
@@ -39,24 +43,21 @@ public class CeramicTileRecipe implements IRecipe {
iy = y;
}
if (x - ix >= 2 || y - iy >= 2 || y < iy || x < ix) {
return null;
return ItemStack.EMPTY;
}
Item item = stack.getItem();
if (item != ceramicBlock && item != ceramicTile && item != ceramicBrick && item != mortar) {
return null;
if (stack.getItem() != ceramicBlock && stack.getItem() != ceramicTile && stack.getItem() != ceramicBrick && stack.getItem() != mortar) {
return ItemStack.EMPTY;
}
stacks.add(stack);
}
}
for (BlockCeramicBrick.TileType type : BlockCeramicBrick.TileType.values()) {
ItemStack stack2 = type.getRecipe(stacks);
if (stack2 != null) {
return stack2;
for (CeramicBrickType type : CeramicBrickType.VALUES) {
ItemStack result = type.getRecipe(stacks);
if (!result.isEmpty()) {
return result;
}
}
return null;
return ItemStack.EMPTY;
}
@Override
@@ -68,4 +69,9 @@ public class CeramicTileRecipe implements IRecipe {
public ItemStack getRecipeOutput() {
return cached;
}
@Override
public NonNullList<ItemStack> getRemainingItems(InventoryCrafting inv) {
return ForgeHooks.defaultRecipeGetRemainingItems(inv);
}
}
@@ -0,0 +1,37 @@
package binnie.botany.ceramic;
import net.minecraft.item.ItemBlock;
import net.minecraft.item.ItemStack;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import forestry.core.items.IColoredItem;
import binnie.botany.genetics.EnumFlowerColor;
import binnie.core.util.I18N;
public class ItemCeramic extends ItemBlock implements IColoredItem {
public ItemCeramic(BlockCeramic block) {
super(block);
}
@Override
public int getMetadata(int metadata) {
return metadata;
}
@SideOnly(Side.CLIENT)
@Override
public int getColorFromItemstack(ItemStack stack, int tintIndex) {
EnumFlowerColor color = EnumFlowerColor.get(stack.getItemDamage());
return color.getFlowerColorAllele().getColor(false);
}
@Override
@SideOnly(Side.CLIENT)
public String getItemStackDisplayName(ItemStack itemStack) {
EnumFlowerColor color = EnumFlowerColor.get(itemStack.getItemDamage());
return I18N.localise("botany.ceramic.name", color.getDisplayName());
}
}
@@ -0,0 +1,26 @@
package binnie.botany.ceramic;
import net.minecraft.block.Block;
import net.minecraft.item.ItemStack;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import forestry.core.items.IColoredItem;
import binnie.botany.genetics.EnumFlowerColor;
import binnie.core.block.ItemMetadata;
import binnie.core.block.TileEntityMetadata;
public class ItemStainedGlass extends ItemMetadata implements IColoredItem {
public ItemStainedGlass(Block block) {
super(block);
}
@SideOnly(Side.CLIENT)
@Override
public int getColorFromItemstack(ItemStack stack, int tintIndex) {
EnumFlowerColor color = EnumFlowerColor.get(TileEntityMetadata.getItemDamage(stack));
return color.getFlowerColorAllele().getColor(false);
}
}
@@ -1,51 +1,43 @@
package binnie.botany.ceramic;
import net.minecraft.inventory.InventoryCrafting;
import net.minecraft.item.ItemStack;
import net.minecraft.item.crafting.IRecipe;
import net.minecraft.util.NonNullList;
import net.minecraft.world.World;
import net.minecraftforge.common.ForgeHooks;
import binnie.Binnie;
import binnie.botany.Botany;
import binnie.botany.api.IFlower;
import net.minecraft.inventory.InventoryCrafting;
import net.minecraft.item.ItemStack;
import net.minecraft.item.crafting.IRecipe;
import net.minecraft.world.World;
public class PigmentRecipe implements IRecipe {
protected ItemStack cached;
private ItemStack unknown;
public PigmentRecipe() {
unknown = null;
}
@Override
public boolean matches(InventoryCrafting crafting, World world) {
return getCraftingResult(crafting) != null;
return !getCraftingResult(crafting).isEmpty();
}
@Override
public ItemStack getRecipeOutput() {
if (cached != null) {
return cached;
}
return unknown;
return ItemStack.EMPTY;
}
@Override
public ItemStack getCraftingResult(InventoryCrafting crafting) {
int n = 0;
ItemStack stack = null;
ItemStack stack = ItemStack.EMPTY;
for (int i = 0; i < crafting.getSizeInventory(); ++i) {
if (crafting.getStackInSlot(i) != null) {
ItemStack stackInSlot = crafting.getStackInSlot(i);
if (!stackInSlot.isEmpty()) {
if (++n > 1) {
return null;
return ItemStack.EMPTY;
}
if (!Binnie.Genetics.getFlowerRoot().isMember(crafting.getStackInSlot(i))) {
continue;
}
IFlower flower = Binnie.Genetics.getFlowerRoot().getMember(crafting.getStackInSlot(i));
if (flower.getAge() >= 1) {
stack = new ItemStack(Botany.pigment, 1, flower.getGenome().getPrimaryColor().getID());
if (Binnie.GENETICS.getFlowerRoot().isMember(stackInSlot)) {
IFlower flower = Binnie.GENETICS.getFlowerRoot().getMember(stackInSlot);
if (flower != null && flower.getAge() >= 1) {
stack = new ItemStack(Botany.pigment, 1, flower.getGenome().getPrimaryColor().getID());
}
}
}
}
@@ -56,4 +48,9 @@ public class PigmentRecipe implements IRecipe {
public int getRecipeSize() {
return 1;
}
@Override
public NonNullList<ItemStack> getRemainingItems(InventoryCrafting inv) {
return ForgeHooks.defaultRecipeGetRemainingItems(inv);
}
}
@@ -0,0 +1,44 @@
package binnie.botany.ceramic;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity;
import binnie.botany.Botany;
import binnie.botany.genetics.EnumFlowerColor;
public class TileCeramic extends TileEntity {
protected EnumFlowerColor color = EnumFlowerColor.Black;
public EnumFlowerColor getColor() {
return color;
}
public void setColor(EnumFlowerColor color) {
this.color = color;
}
@Override
public NBTTagCompound writeToNBT(NBTTagCompound compound) {
compound.setInteger("Color", color.getFlowerColorAllele().getID());
return super.writeToNBT(compound);
}
@Override
public void readFromNBT(NBTTagCompound compound) {
super.readFromNBT(compound);
color = EnumFlowerColor.VALUES[compound.getInteger("Color")];
}
public ItemStack getStack() {
return getStack(1);
}
public ItemStack getStack(int amount) {
int ID = 0;
if (color != null) {
ID = color.getFlowerColorAllele().getID();
}
return new ItemStack(Botany.ceramic, amount, ID);
}
}
@@ -0,0 +1,262 @@
package binnie.botany.ceramic.brick;
import javax.annotation.Nullable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
import net.minecraft.block.properties.IProperty;
import net.minecraft.block.properties.PropertyEnum;
import net.minecraft.block.state.BlockStateContainer;
import net.minecraft.block.state.IBlockState;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.ItemMeshDefinition;
import net.minecraft.client.renderer.block.model.ModelResourceLocation;
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
import net.minecraft.client.renderer.texture.TextureMap;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.BlockRenderLayer;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.EnumHand;
import net.minecraft.util.NonNullList;
import net.minecraft.util.ResourceLocation;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.RayTraceResult;
import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World;
import net.minecraftforge.client.model.ModelLoader;
import net.minecraftforge.common.property.ExtendedBlockState;
import net.minecraftforge.common.property.IExtendedBlockState;
import net.minecraftforge.common.property.IUnlistedProperty;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import forestry.api.core.IItemModelRegister;
import forestry.api.core.IModelManager;
import forestry.api.core.ISpriteRegister;
import forestry.api.core.IStateMapperRegister;
import forestry.api.core.ITextureManager;
import forestry.core.blocks.IColoredBlock;
import forestry.core.blocks.properties.UnlistedBlockAccess;
import forestry.core.blocks.properties.UnlistedBlockPos;
import forestry.core.models.BlockModelEntry;
import binnie.Constants;
import binnie.botany.CreativeTabBotany;
import binnie.botany.ceramic.TileCeramic;
import binnie.botany.genetics.EnumFlowerColor;
import binnie.core.BinnieCore;
import binnie.core.block.IMultipassBlock;
import binnie.core.models.DefaultStateMapper;
import binnie.core.models.ModelManager;
import binnie.core.models.ModelMutlipass;
import binnie.core.util.TileUtil;
public class BlockCeramicBrick extends Block implements IMultipassBlock<CeramicBrickPair>, IColoredBlock, ISpriteRegister, IStateMapperRegister, IItemModelRegister {
private static final PropertyEnum<CeramicBrickType> TYPE = PropertyEnum.create("type", CeramicBrickType.class);
public BlockCeramicBrick() {
super(Material.ROCK);
setHardness(1.0f);
setResistance(5.0f);
setRegistryName("ceramicBrick");
setCreativeTab(CreativeTabBotany.instance);
}
@Override
public List<ItemStack> getDrops(IBlockAccess world, BlockPos pos, IBlockState state, int fortune) {
return Collections.emptyList();
}
@Override
public boolean removedByPlayer(IBlockState state, World world, BlockPos pos, @Nullable EntityPlayer player, boolean willHarvest) {
List<ItemStack> drops = new ArrayList<>();
TileCeramic ceramic = TileUtil.getTile(world, pos, TileCeramic.class);
if (ceramic != null) {
drops = Collections.singletonList(ceramic.getStack());
}
boolean hasBeenBroken = world.setBlockToAir(pos);
if (hasBeenBroken && BinnieCore.getBinnieProxy().isSimulating(world) && drops.size() > 0 && (player == null || !player.capabilities.isCreativeMode)) {
for (ItemStack drop : drops) {
spawnAsEntity(world, pos, drop);
}
}
return hasBeenBroken;
}
@Override
public TileEntity createTileEntity(World world, IBlockState state) {
return new TileCeramicBrick();
}
@Override
public boolean hasTileEntity(IBlockState state) {
return true;
}
@SideOnly(Side.CLIENT)
@Override
public void getSubBlocks(Item item, CreativeTabs tab, NonNullList<ItemStack> itemList) {
for (EnumFlowerColor color : EnumFlowerColor.values()) {
itemList.add(new CeramicBrickPair(color, color, CeramicBrickType.TILE).getStack(1));
}
for (CeramicBrickType type : CeramicBrickType.VALUES) {
if (type.canDouble()) {
itemList.add(new CeramicBrickPair(EnumFlowerColor.Brown, EnumFlowerColor.Gold, type).getStack(1));
}
}
itemList.add(new CeramicBrickPair(EnumFlowerColor.Gold, EnumFlowerColor.Gold, CeramicBrickType.SPLIT).getStack(1));
itemList.add(new CeramicBrickPair(EnumFlowerColor.Brown, EnumFlowerColor.Brown, CeramicBrickType.CHEQUERED).getStack(1));
itemList.add(new CeramicBrickPair(EnumFlowerColor.Gold, EnumFlowerColor.Brown, CeramicBrickType.LARGE_BRICK).getStack(1));
}
@SideOnly(Side.CLIENT)
@Override
public void registerStateMapper() {
ResourceLocation resourceLocation = new ResourceLocation(Constants.BOTANY_MOD_ID, "ceramicBrick");
ModelLoader.setCustomStateMapper(this, new DefaultStateMapper(resourceLocation));
ModelManager.registerCustomBlockModel(new BlockModelEntry(
new ModelResourceLocation(resourceLocation, "normal"),
new ModelResourceLocation(resourceLocation, "inventory"),
new ModelMutlipass<>(BlockCeramicBrick.class),
this
));
}
@SideOnly(Side.CLIENT)
@Override
public void registerModel(Item item, IModelManager manager) {
manager.registerItemModel(item, new CeramicBrickMeshDefinition());
}
@Override
protected BlockStateContainer createBlockState() {
return new ExtendedBlockState(
this,
new IProperty[]{TYPE},
new IUnlistedProperty[]{
UnlistedBlockPos.POS,
UnlistedBlockAccess.BLOCKACCESS
}
);
}
@Override
public IBlockState getStateFromMeta(int meta) {
return getDefaultState().withProperty(TYPE, CeramicBrickType.VALUES[meta]);
}
@Override
public int getMetaFromState(IBlockState state) {
return state.getValue(TYPE).ordinal();
}
@Override
public IBlockState getExtendedState(IBlockState state, IBlockAccess world, BlockPos pos) {
return ((IExtendedBlockState) super.getExtendedState(state, world, pos)).withProperty(UnlistedBlockPos.POS, pos).withProperty(UnlistedBlockAccess.BLOCKACCESS, world);
}
@Override
public IBlockState getStateForPlacement(World world, BlockPos pos, EnumFacing facing, float hitX, float hitY, float hitZ, int meta, EntityLivingBase placer, EnumHand hand) {
return getDefaultState().withProperty(TYPE, CeramicBrickType.get(meta >> 16 & 0xFF));
}
@Override
public void onBlockPlacedBy(World worldIn, BlockPos pos, IBlockState state, EntityLivingBase placer, ItemStack stack) {
TileCeramicBrick ceramic = TileUtil.getTile(worldIn, pos, TileCeramicBrick.class);
if (ceramic != null) {
int damage = stack.getItemDamage();
ceramic.setColors(EnumFlowerColor.get(damage & 0xFF), EnumFlowerColor.get(damage >> 8 & 0xFF));
}
}
@Override
public ItemStack getPickBlock(IBlockState state, RayTraceResult target, World world, BlockPos pos, EntityPlayer player) {
TileCeramicBrick ceramic = TileUtil.getTile(world, pos, TileCeramicBrick.class);
if (ceramic != null) {
return ceramic.pair().getStack(0);
}
return super.getPickBlock(state, target, world, pos, player);
}
@SideOnly(Side.CLIENT)
@Override
public int colorMultiplier(IBlockState state, @Nullable IBlockAccess world, @Nullable BlockPos pos, int tintIndex) {
if (world != null && pos != null) {
TileCeramicBrick ceramic = TileUtil.getTile(world, pos, TileCeramicBrick.class);
if (ceramic != null) {
if (tintIndex == 1) {
return ceramic.getColorFirst().getFlowerColorAllele().getColor(false);
} else if (tintIndex == 2) {
return ceramic.getColorSecond().getFlowerColorAllele().getColor(false);
}
}
}
return 0xffffff;
}
@SideOnly(Side.CLIENT)
@Override
public BlockRenderLayer getBlockLayer() {
return BlockRenderLayer.CUTOUT;
}
@Override
@SideOnly(Side.CLIENT)
public int getRenderPasses() {
return 3;
}
@Override
@SideOnly(Side.CLIENT)
public CeramicBrickPair getInventoryKey(ItemStack stack) {
return new CeramicBrickPair(stack);
}
@Override
@SideOnly(Side.CLIENT)
public CeramicBrickPair getWorldKey(IBlockState state) {
IExtendedBlockState extendedState = (IExtendedBlockState) state;
IBlockAccess world = extendedState.getValue(UnlistedBlockAccess.BLOCKACCESS);
BlockPos pos = extendedState.getValue(UnlistedBlockPos.POS);
TileCeramicBrick ceramic = TileUtil.getTile(world, pos, TileCeramicBrick.class);
if (ceramic != null) {
return ceramic.pair();
}
return null;
}
@Override
@SideOnly(Side.CLIENT)
public TextureAtlasSprite getSprite(CeramicBrickPair type, @Nullable EnumFacing facing, int pass) {
return type.getSprite(pass);
}
@Override
@SideOnly(Side.CLIENT)
public void registerSprites(ITextureManager manager) {
TextureMap textureMap = Minecraft.getMinecraft().getTextureMapBlocks();
for (CeramicBrickType type : CeramicBrickType.VALUES) {
type.sprites = new TextureAtlasSprite[3];
for (int i = 0; i < 3; ++i) {
type.sprites[i] = textureMap.registerSprite(new ResourceLocation(Constants.BOTANY_MOD_ID + ":blocks/ceramic." + type.id + "." + i));
}
}
}
private class CeramicBrickMeshDefinition implements ItemMeshDefinition {
@Override
public ModelResourceLocation getModelLocation(ItemStack stack) {
return new ModelResourceLocation(Constants.BOTANY_MOD_ID + ":ceramicBrick", "inventory");
}
}
}
@@ -0,0 +1,77 @@
package binnie.botany.ceramic.brick;
import com.google.common.base.Preconditions;
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
import net.minecraft.item.ItemStack;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import binnie.botany.Botany;
import binnie.botany.genetics.EnumFlowerColor;
import binnie.core.block.TileEntityMetadata;
import binnie.core.util.I18N;
public class CeramicBrickPair {
public final EnumFlowerColor colorFirst;
public final EnumFlowerColor colorSecond;
public CeramicBrickType type;
public int ordinal;
CeramicBrickPair(EnumFlowerColor colorFirst, EnumFlowerColor colorSecond, CeramicBrickType type) {
this.colorFirst = colorFirst;
this.colorSecond = colorSecond;
this.type = type;
ordinal = colorFirst.ordinal() + colorSecond.ordinal() * 256 + type.ordinal() * 256 * 256;
}
public CeramicBrickPair(ItemStack stack) {
this(TileEntityMetadata.getItemDamage(stack));
}
public CeramicBrickPair(int id) {
colorFirst = EnumFlowerColor.get(id & 0xFF);
colorSecond = EnumFlowerColor.get(id >> 8 & 0xFF);
type = CeramicBrickType.get(id >> 16 & 0xFF);
}
public boolean isTwoColors() {
return type.canDouble() && colorSecond != colorFirst;
}
public ItemStack getStack(int i) {
return new ItemStack(Botany.ceramicBrick, i, ordinal());
}
public String getName() {
String name = colorFirst.getFlowerColorAllele().getColorName();
if (type.canDouble() && colorSecond != colorFirst) {
name = name + " & " + colorSecond.getFlowerColorAllele().getColorName();
}
return I18N.localise("botany.ceramic.type." + type.id + ".name", name);
}
public int ordinal() {
return ordinal;
}
@SideOnly(Side.CLIENT)
public TextureAtlasSprite getSprite(int pass) {
TextureAtlasSprite[] sprites = type.sprites;
Preconditions.checkState(sprites != null, "Sprites have not been registered.");
return sprites[pass];
}
@Override
public int hashCode() {
return Integer.hashCode(ordinal());
}
@Override
public boolean equals(Object obj) {
return obj instanceof CeramicBrickPair
&& ((CeramicBrickPair) obj).ordinal() == ordinal();
}
}
@@ -0,0 +1,329 @@
package binnie.botany.ceramic.brick;
import javax.annotation.Nullable;
import java.util.List;
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.util.IStringSerializable;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import binnie.botany.Botany;
import binnie.botany.genetics.EnumFlowerColor;
import binnie.botany.items.BotanyItems;
import binnie.core.block.TileEntityMetadata;
public enum CeramicBrickType implements IStringSerializable {
TILE("tile") {
@Override
public ItemStack getRecipe(List<ItemStack> stacks) {
if (stacks.size() != 4) {
return ItemStack.EMPTY;
}
int mortars = 0;
int blocks = 0;
int blockColor = -1;
for (ItemStack stack : stacks) {
if (isMortar(stack)) {
++mortars;
} else {
if (stack.getItem() != Item.getItemFromBlock(Botany.ceramic)) {
return ItemStack.EMPTY;
}
++blocks;
int color = TileEntityMetadata.getItemDamage(stack);
if (blockColor == -1) {
blockColor = color;
} else {
if (blockColor != color) {
return ItemStack.EMPTY;
}
}
}
}
if (mortars != 1) {
return ItemStack.EMPTY;
}
EnumFlowerColor c = EnumFlowerColor.get(blockColor);
return new CeramicBrickPair(c, c, CeramicBrickType.TILE).getStack(3);
}
},
BRICK("brick") {
@Override
public ItemStack getRecipe(List<ItemStack> stacks) {
return getBrickRecipe(this, stacks);
}
},
STRIPE_BRICK("brickstripe") {
@Override
public ItemStack getRecipe(List<ItemStack> stacks) {
return getBrickRecipe(this, stacks);
}
},
LARGE_BRICK("bricklarge") {
@Override
public ItemStack getRecipe(List<ItemStack> stacks) {
if (stacks.size() == 1) {
ItemStack stack3 = stacks.get(0);
CeramicBrickPair type3 = new CeramicBrickPair(stack3);
if (type3.type == CeramicBrickType.VERTICAL_LARGE_BRICK) {
type3.type = this;
return type3.getStack(1);
}
return ItemStack.EMPTY;
} else {
if (stacks.size() != 3) {
return ItemStack.EMPTY;
}
int[] colors = {-1, -1};
int a = 0;
int b = 0;
for (ItemStack stack4 : stacks) {
if (stack4.getItem() != Item.getItemFromBlock(Botany.ceramicBrick)) {
return ItemStack.EMPTY;
}
CeramicBrickPair type4 = new CeramicBrickPair(stack4);
if (type4.type != CeramicBrickType.TILE) {
return ItemStack.EMPTY;
}
int color5 = type4.colorFirst.ordinal();
if (colors[0] == -1) {
colors[0] = color5;
a++;
} else if (colors[0] == color5) {
a++;
} else if (colors[1] == -1) {
colors[1] = color5;
b++;
} else {
if (colors[1] != color5) {
return ItemStack.EMPTY;
}
b++;
}
}
if (colors[1] == -1) {
colors[1] = colors[0];
}
return new CeramicBrickPair(EnumFlowerColor.get(colors[0]), EnumFlowerColor.get(colors[1]), CeramicBrickType.LARGE_BRICK).getStack(3);
}
}
},
SPLIT("split") {
@Override
public ItemStack getRecipe(List<ItemStack> stacks) {
if (stacks.size() != 4) {
return ItemStack.EMPTY;
}
int[] colors = {-1, -1};
int altCounter = 0;
for (ItemStack stack2 : stacks) {
int alt = (altCounter != 0 && altCounter != 3) ? 1 : 0;
if (stack2.getItem() != Item.getItemFromBlock(Botany.ceramicBrick)) {
return ItemStack.EMPTY;
}
CeramicBrickPair type = new CeramicBrickPair(stack2);
if (type.type != CeramicBrickType.TILE) {
return ItemStack.EMPTY;
}
int color2 = type.colorFirst.ordinal();
if (colors[alt] == -1) {
colors[alt] = color2;
} else if (colors[alt] != color2) {
return ItemStack.EMPTY;
}
++altCounter;
}
return new CeramicBrickPair(EnumFlowerColor.get(colors[0]), EnumFlowerColor.get(colors[1]), CeramicBrickType.SPLIT).getStack(4);
}
},
CHEQUERED("cheque") {
@Override
public ItemStack getRecipe(List<ItemStack> stacks) {
if (stacks.size() != 4) {
return ItemStack.EMPTY;
}
int[] colors = {-1, -1};
for (ItemStack stack2 : stacks) {
if (stack2.getItem() != Item.getItemFromBlock(Botany.ceramicBrick)) {
return ItemStack.EMPTY;
}
CeramicBrickPair type2 = new CeramicBrickPair(stack2);
if (type2.type != CeramicBrickType.SPLIT) {
return ItemStack.EMPTY;
}
int color3 = type2.colorFirst.ordinal();
int color4 = type2.colorSecond.ordinal();
if (colors[0] == -1) {
colors[0] = color3;
colors[1] = color4;
} else {
if (colors[0] != color3 || colors[1] != color4) {
return ItemStack.EMPTY;
}
}
}
return new CeramicBrickPair(EnumFlowerColor.get(colors[0]), EnumFlowerColor.get(colors[1]), CeramicBrickType.CHEQUERED).getStack(4);
}
},
MIXED("mixed") {
@Override
public ItemStack getRecipe(List<ItemStack> stacks) {
if (stacks.size() != 4) {
return ItemStack.EMPTY;
}
int[] colors = {-1, -1};
for (ItemStack stack2 : stacks) {
if (stack2.getItem() != Item.getItemFromBlock(Botany.ceramicBrick)) {
return ItemStack.EMPTY;
}
CeramicBrickPair type2 = new CeramicBrickPair(stack2);
if (type2.isTwoColors()) {
return ItemStack.EMPTY;
}
int color3 = type2.colorFirst.ordinal();
if (type2.type == CeramicBrickType.SPLIT) {
if (colors[1] != -1) {
return ItemStack.EMPTY;
}
colors[1] = color3;
} else {
if (type2.type != CeramicBrickType.CHEQUERED) {
return ItemStack.EMPTY;
}
if (colors[0] == -1) {
colors[0] = color3;
} else if (colors[0] != color3) {
return ItemStack.EMPTY;
}
}
int color4 = type2.colorSecond.ordinal();
}
if (colors[0] == -1 || colors[1] == -1) {
return ItemStack.EMPTY;
}
return new CeramicBrickPair(EnumFlowerColor.get(colors[0]), EnumFlowerColor.get(colors[1]), CeramicBrickType.MIXED).getStack(4);
}
},
VERTICAL_BRICK("verticalbrick") {
@Override
public ItemStack getRecipe(List<ItemStack> stacks) {
return getVerticalBrickRecipe(stacks);
}
},
VERTICAL_STRIPE_BRICK("verticalbrickstripe") {
@Override
public ItemStack getRecipe(List<ItemStack> stacks) {
return getVerticalBrickRecipe(stacks);
}
},
VERTICAL_LARGE_BRICK("verticalbricklarge") {
@Override
public ItemStack getRecipe(List<ItemStack> stacks) {
return getVerticalBrickRecipe(stacks);
}
};
public static final CeramicBrickType[] VALUES = values();
public String id;
@SideOnly(Side.CLIENT)
@Nullable
TextureAtlasSprite[] sprites;
CeramicBrickType(String id) {
this.id = id;
}
public static CeramicBrickType get(int id) {
return VALUES[id % VALUES.length];
}
public boolean canDouble() {
return this != CeramicBrickType.TILE;
}
public abstract ItemStack getRecipe(List<ItemStack> stacks);
protected ItemStack getVerticalBrickRecipe(List<ItemStack> stacks) {
if (stacks.size() != 1) {
return ItemStack.EMPTY;
}
ItemStack stack5 = stacks.get(0);
CeramicBrickPair type = new CeramicBrickPair(stack5);
if (type.type == CeramicBrickType.LARGE_BRICK) {
type.type = CeramicBrickType.VERTICAL_LARGE_BRICK;
return type.getStack(1);
}
if (type.type == CeramicBrickType.BRICK) {
type.type = CeramicBrickType.VERTICAL_BRICK;
return type.getStack(1);
}
if (type.type == CeramicBrickType.STRIPE_BRICK) {
type.type = CeramicBrickType.VERTICAL_STRIPE_BRICK;
return type.getStack(1);
}
return ItemStack.EMPTY;
}
protected ItemStack getBrickRecipe(CeramicBrickType ceramicType, List<ItemStack> stacks) {
if (stacks.size() == 1) {
ItemStack stack5 = stacks.get(0);
CeramicBrickPair type = new CeramicBrickPair(stack5);
if (type.type == CeramicBrickType.VERTICAL_BRICK) {
type.type = ceramicType;
return type.getStack(1);
}
if (type.type == CeramicBrickType.STRIPE_BRICK) {
type.type = ceramicType;
return type.getStack(1);
}
return ItemStack.EMPTY;
} else if (stacks.size() == 4) {
int[] colors = {-1, -1};
for (int index2 = 0; index2 < stacks.size(); ++index2) {
ItemStack stack4 = stacks.get(index2);
if (stack4.getItem() != Item.getItemFromBlock(Botany.ceramicBrick)) {
return ItemStack.EMPTY;
}
CeramicBrickPair type4 = new CeramicBrickPair(stack4);
if (type4.type != CeramicBrickType.LARGE_BRICK) {
return ItemStack.EMPTY;
}
int color5 = type4.colorFirst.ordinal();
int color6 = type4.colorSecond.ordinal();
int alt2 = (index2 != 0 && index2 != 3) ? 1 : 0;
if (ceramicType == CeramicBrickType.STRIPE_BRICK) {
alt2 = 0;
}
if (colors[alt2] == -1) {
colors[alt2] = color5;
colors[1 - alt2] = color6;
} else if (colors[alt2] != color5 || colors[1 - alt2] != color6) {
return ItemStack.EMPTY;
}
}
return new CeramicBrickPair(EnumFlowerColor.get(colors[0]), EnumFlowerColor.get(colors[1]), ceramicType).getStack(4);
}
return ItemStack.EMPTY;
}
protected boolean isMortar(ItemStack stack) {
return stack.getItem() == Botany.misc && stack.getItemDamage() == BotanyItems.MORTAR.ordinal();
}
@Override
public String getName() {
return id;
}
}
@@ -0,0 +1,38 @@
package binnie.botany.ceramic.brick;
import net.minecraft.item.ItemBlock;
import net.minecraft.item.ItemStack;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import forestry.core.items.IColoredItem;
public class ItemCeramicBrick extends ItemBlock implements IColoredItem {
public ItemCeramicBrick(BlockCeramicBrick block) {
super(block);
}
@Override
public int getMetadata(int metadata) {
return metadata;
}
@SideOnly(Side.CLIENT)
@Override
public int getColorFromItemstack(ItemStack stack, int tintIndex) {
CeramicBrickPair ceramic = new CeramicBrickPair(stack.getItemDamage());
if (tintIndex == 1) {
return ceramic.colorFirst.getFlowerColorAllele().getColor(false);
} else if (tintIndex == 2) {
return ceramic.colorSecond.getFlowerColorAllele().getColor(false);
}
return 0xffffff;
}
@Override
@SideOnly(Side.CLIENT)
public String getItemStackDisplayName(ItemStack itemStack) {
return new CeramicBrickPair(itemStack.getItemDamage()).getName();
}
}
@@ -0,0 +1,69 @@
package binnie.botany.ceramic.brick;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity;
import binnie.botany.Botany;
import binnie.botany.genetics.EnumFlowerColor;
import binnie.core.block.TileEntityMetadata;
public class TileCeramicBrick extends TileEntity {
private EnumFlowerColor colorFirst = EnumFlowerColor.Black;
private EnumFlowerColor colorSecond = EnumFlowerColor.White;
public void setColors(EnumFlowerColor colorFirst, EnumFlowerColor colorSecond) {
this.colorFirst = colorFirst;
this.colorSecond = colorSecond;
}
public boolean hasTwoColors() {
return CeramicBrickType.VALUES[getBlockMetadata()].canDouble() && colorSecond != colorFirst;
}
public ItemStack getStack(int i) {
ItemStack s = TileEntityMetadata.getItemStack(Botany.ceramicBrick, ordinal());
s.setCount(i);
return s;
}
public int ordinal() {
return colorFirst.ordinal() + colorSecond.ordinal() * 256 + getBlockMetadata() * 256 * 256;
}
public CeramicBrickPair pair() {
return new CeramicBrickPair(colorFirst, colorSecond, CeramicBrickType.VALUES[getBlockMetadata()]);
}
public EnumFlowerColor getColorFirst() {
return colorFirst;
}
public EnumFlowerColor getColorSecond() {
return colorSecond;
}
@Override
public NBTTagCompound writeToNBT(NBTTagCompound compound) {
compound.setInteger("First", colorFirst.ordinal());
compound.setInteger("Second", colorSecond.ordinal());
return super.writeToNBT(compound);
}
@Override
public NBTTagCompound getUpdateTag() {
return writeToNBT(new NBTTagCompound());
}
@Override
public void readFromNBT(NBTTagCompound compound) {
super.readFromNBT(compound);
if (compound.hasKey("First")) {
colorFirst = EnumFlowerColor.VALUES[compound.getInteger("First")];
}
if (compound.hasKey("Second")) {
colorSecond = EnumFlowerColor.VALUES[compound.getInteger("Second")];
}
}
}
@@ -0,0 +1,9 @@
@ParametersAreNonnullByDefault
@MethodsReturnNonnullByDefault
@FieldsAreNonnullByDefault
package binnie.botany.ceramic.brick;
import javax.annotation.ParametersAreNonnullByDefault;
import binnie.core.util.FieldsAreNonnullByDefault;
import mcp.MethodsReturnNonnullByDefault;
@@ -0,0 +1,9 @@
@ParametersAreNonnullByDefault
@MethodsReturnNonnullByDefault
@FieldsAreNonnullByDefault
package binnie.botany.ceramic;
import javax.annotation.ParametersAreNonnullByDefault;
import binnie.core.util.FieldsAreNonnullByDefault;
import mcp.MethodsReturnNonnullByDefault;
@@ -1,12 +1,25 @@
package binnie.botany.core;
import binnie.botany.api.FlowerManager;
import binnie.botany.api.IFlowerRoot;
import binnie.botany.genetics.FlowerHelper;
import binnie.botany.api.IGardeningManager;
import binnie.botany.gardening.Gardening;
import binnie.botany.genetics.FlowerRoot;
public class BotanyCore {
public static IFlowerRoot speciesRoot = new FlowerHelper();
public static final int CHANCE_INTERPOLLINATION = 20;
public static IFlowerRoot getFlowerRoot() {
return BotanyCore.speciesRoot;
if (FlowerManager.flowerRoot == null) {
FlowerManager.flowerRoot = new FlowerRoot();
}
return FlowerManager.flowerRoot;
}
public static IGardeningManager getGardening() {
if (FlowerManager.gardening == null) {
FlowerManager.gardening = new Gardening();
}
return FlowerManager.gardening;
}
}
@@ -1,23 +1,33 @@
package binnie.botany.core;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.IInventory;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import net.minecraftforge.fml.relauncher.Side;
import binnie.botany.craftgui.WindowBotanistDatabase;
import binnie.core.craftgui.minecraft.Window;
import binnie.core.gui.IBinnieGUID;
import cpw.mods.fml.relauncher.Side;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.world.World;
public enum BotanyGUI implements IBinnieGUID {
Database,
DatabaseNEI;
DATABASE,
DATABASE_NEI;
@Override
public Window getWindow(EntityPlayer player, World world, int x, int y, int z, Side side) {
Window window = null;
TileEntity tileEntity = world.getTileEntity(new BlockPos(x, y, z));
IInventory object = null;
if (tileEntity instanceof IInventory) {
object = (IInventory) tileEntity;
}
switch (this) {
case Database:
case DatabaseNEI: {
window = WindowBotanistDatabase.create(player, side, this != BotanyGUI.Database);
case DATABASE:
case DATABASE_NEI: {
window = WindowBotanistDatabase.create(player, side, this != BotanyGUI.DATABASE);
break;
}
}
@@ -0,0 +1,37 @@
package binnie.botany.core;
import javax.annotation.Nullable;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import binnie.Binnie;
import binnie.botany.Botany;
import binnie.core.resource.BinnieResource;
import binnie.core.resource.IBinnieTexture;
import binnie.core.resource.ResourceType;
// TODO unused enum?
public enum BotanyTexture implements IBinnieTexture {
;
String texture;
ResourceType type;
@SideOnly(Side.CLIENT)
@Nullable
private BinnieResource resource;
BotanyTexture(ResourceType base, String texture) {
this.texture = texture;
type = base;
}
@Override
@SideOnly(Side.CLIENT)
public BinnieResource getTexture() {
if (resource == null) {
resource = Binnie.RESOURCE.getPNG(Botany.instance, type, texture);
}
return resource;
}
}
@@ -0,0 +1,9 @@
@ParametersAreNonnullByDefault
@MethodsReturnNonnullByDefault
@FieldsAreNonnullByDefault
package binnie.botany.core;
import javax.annotation.ParametersAreNonnullByDefault;
import binnie.core.util.FieldsAreNonnullByDefault;
import mcp.MethodsReturnNonnullByDefault;
@@ -1,21 +1,24 @@
package binnie.botany.craftgui;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import binnie.botany.api.IFlowerColor;
import binnie.core.craftgui.CraftGUI;
import binnie.core.craftgui.Attribute;
import binnie.core.craftgui.ITooltip;
import binnie.core.craftgui.IWidget;
import binnie.core.craftgui.Tooltip;
import binnie.core.craftgui.WidgetAttribute;
import binnie.core.craftgui.controls.core.Control;
import binnie.core.craftgui.controls.core.IControlValue;
import binnie.core.craftgui.geometry.IArea;
import binnie.core.craftgui.renderer.RenderUtil;
public class ControlColorDisplay extends Control implements IControlValue<IFlowerColor>, ITooltip {
private IFlowerColor value;
public ControlColorDisplay(IWidget parent, float x, float y) {
super(parent, x, y, 16.0f, 16.0f);
addAttribute(WidgetAttribute.MOUSE_OVER);
public ControlColorDisplay(IWidget parent, int x, int y, IFlowerColor value) {
super(parent, x, y, 16, 16);
this.value = value;
addAttribute(Attribute.MouseOver);
}
@Override
@@ -29,15 +32,15 @@ public class ControlColorDisplay extends Control implements IControlValue<IFlowe
}
@Override
public void onRenderBackground() {
IArea area = getArea();
CraftGUI.render.solid(area, -1);
CraftGUI.render.solid(area.inset(1), 0xff000000 + getValue().getColor(false));
@SideOnly(Side.CLIENT)
public void onRenderBackground(int guiWidth, int guiHeight) {
RenderUtil.drawSolidRect(getArea(), -1);
RenderUtil.drawSolidRect(getArea().inset(1), 0xff000000 + getValue().getColor(false));
}
@Override
public void getTooltip(Tooltip tooltip) {
super.getTooltip(tooltip);
tooltip.add(value.getName());
tooltip.add(value.getColorName());
}
}
@@ -1,24 +1,25 @@
package binnie.botany.craftgui;
import binnie.botany.api.IColourMix;
import binnie.botany.api.IColorMix;
import binnie.core.craftgui.IWidget;
import binnie.core.craftgui.controls.listbox.ControlListBox;
public class ControlColorMixBox extends ControlListBox<IColourMix> {
public class ControlColorMixBox extends ControlListBox<IColorMix> {
private int index;
private Type type;
public ControlColorMixBox(IWidget parent, int x, int y, int width, int height, Type type) {
super(parent, x, y, width, height, 12.0f);
super(parent, x, y, width, height, 12);
this.type = type;
}
@Override
public IWidget createOption(IColourMix value, int y) {
public IWidget createOption(IColorMix value, int y) {
return new ControlColorMixItem(getContent(), value, y);
}
enum Type {
Resultant,
Further
RESULTANT,
FURTHER,
}
}
@@ -1,30 +1,23 @@
package binnie.botany.craftgui;
import binnie.botany.api.IColourMix;
import binnie.botany.api.IColorMix;
import binnie.core.craftgui.controls.listbox.ControlList;
import binnie.core.craftgui.controls.listbox.ControlOption;
public class ControlColorMixItem extends ControlOption<IColourMix> {
protected ControlColorDisplay itemWidget1;
protected ControlColorDisplay itemWidget2;
protected ControlColorDisplay itemWidget3;
protected ControlColourMixSymbol addSymbol;
protected ControlColourMixSymbol arrowSymbol;
public class ControlColorMixItem extends ControlOption<IColorMix> {
private final ControlColorDisplay itemWidget1;
private final ControlColorDisplay itemWidget2;
private final ControlColorDisplay itemWidget3;
private final ControlColorMixSymbol addSymbol;
private final ControlColorMixSymbol arrowSymbol;
public ControlColorMixItem(ControlList<IColourMix> controlList, IColourMix option, int y) {
public ControlColorMixItem(ControlList<IColorMix> controlList, IColorMix option, int y) {
super(controlList, option, y);
itemWidget1 = new ControlColorDisplay(this, 4.0f, 4.0f);
itemWidget2 = new ControlColorDisplay(this, 44.0f, 4.0f);
itemWidget3 = new ControlColorDisplay(this, 104.0f, 4.0f);
addSymbol = new ControlColourMixSymbol(this, 24, 4, 0);
arrowSymbol = new ControlColourMixSymbol(this, 64, 4, 1);
if (getValue() != null) {
itemWidget1.setValue(getValue().getColor1());
itemWidget2.setValue(getValue().getColor2());
itemWidget3.setValue(getValue().getResult());
addSymbol.setValue(getValue());
arrowSymbol.setValue(getValue());
}
IColorMix value = getValue();
itemWidget1 = new ControlColorDisplay(this, 4, 4, value.getColorFirst());
itemWidget2 = new ControlColorDisplay(this, 44, 4, value.getColorSecond());
itemWidget3 = new ControlColorDisplay(this, 104, 4, value.getResult());
addSymbol = new ControlColorMixSymbol(this, 24, 4, 0, value);
arrowSymbol = new ControlColorMixSymbol(this, 64, 4, 1, value);
}
}
@@ -0,0 +1,55 @@
package binnie.botany.craftgui;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import binnie.botany.api.IColorMix;
import binnie.core.craftgui.Attribute;
import binnie.core.craftgui.CraftGUI;
import binnie.core.craftgui.ITooltip;
import binnie.core.craftgui.IWidget;
import binnie.core.craftgui.Tooltip;
import binnie.core.craftgui.controls.core.Control;
import binnie.core.craftgui.geometry.Point;
import binnie.core.craftgui.resource.Texture;
import binnie.core.craftgui.resource.minecraft.CraftGUITextureSheet;
import binnie.core.craftgui.resource.minecraft.StandardTexture;
import binnie.core.util.I18N;
public class ControlColorMixSymbol extends Control implements ITooltip {
static Texture MutationPlus = new StandardTexture(2, 94, 16, 16, CraftGUITextureSheet.Controls2);
static Texture MutationArrow = new StandardTexture(20, 94, 32, 16, CraftGUITextureSheet.Controls2);
IColorMix value;
int type;
protected ControlColorMixSymbol(IWidget parent, int x, int y, int type, IColorMix value) {
super(parent, x, y, 16 + type * 16, 16);
this.value = value;
this.type = type;
addAttribute(Attribute.MouseOver);
}
@Override
@SideOnly(Side.CLIENT)
public void onRenderBackground(int guiWidth, int guiHeight) {
super.onRenderBackground(guiWidth, guiHeight);
if (type == 0) {
CraftGUI.render.texture(ControlColorMixSymbol.MutationPlus, Point.ZERO);
} else {
CraftGUI.render.texture(ControlColorMixSymbol.MutationArrow, Point.ZERO);
}
}
public void setValue(IColorMix value) {
this.value = value;
setColor(0xffffff);
}
@Override
public void getTooltip(Tooltip tooltip) {
if (type == 1) {
float chance = value.getChance();
tooltip.add(I18N.localise("botany.gui.controls.color_mix_symbol.chance", chance));
}
}
}
@@ -1,28 +1,32 @@
package binnie.botany.craftgui;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import binnie.botany.api.IFlowerColor;
import binnie.core.craftgui.Attribute;
import binnie.core.craftgui.CraftGUI;
import binnie.core.craftgui.WidgetAttribute;
import binnie.core.craftgui.controls.listbox.ControlList;
import binnie.core.craftgui.controls.listbox.ControlTextOption;
import binnie.core.craftgui.geometry.CraftGUIUtil;
import binnie.core.craftgui.geometry.IPoint;
import binnie.core.craftgui.geometry.Point;
@SideOnly(Side.CLIENT)
public class ControlColorOption extends ControlTextOption<IFlowerColor> {
protected ControlColorDisplay controlBee;
protected IPoint boxPosition;
private ControlColorDisplay controlBee;
private Point boxPosition;
public ControlColorOption(ControlList<IFlowerColor> controlList, IFlowerColor option, int y) {
super(controlList, option, option.getName(), y);
setSize(new IPoint(getSize().x(), 20.0f));
(controlBee = new ControlColorDisplay(this, 2.0f, 2.0f)).setValue(option);
addAttribute(WidgetAttribute.MOUSE_OVER);
CraftGUIUtil.moveWidget(textWidget, new IPoint(22.0f, 0.0f));
textWidget.setSize(textWidget.getSize().sub(new IPoint(24.0f, 0.0f)));
int th = (int) CraftGUI.render.textHeight(textWidget.getValue(), textWidget.getSize().x());
super(controlList, option, option.getColorName(), y);
setSize(new Point(getSize().x(), 20));
controlBee = new ControlColorDisplay(this, 2, 2, option);
addAttribute(Attribute.MouseOver);
CraftGUIUtil.moveWidget(textWidget, new Point(22, 0));
textWidget.setSize(textWidget.getSize().sub(new Point(24, 0)));
int th = CraftGUI.render.textHeight(textWidget.getValue(), textWidget.getSize().x());
int height = Math.max(20, th + 6);
setSize(new IPoint(size().x(), height));
textWidget.setSize(new IPoint(textWidget.getSize().x(), height));
boxPosition = new IPoint(2.0f, (height - 18) / 2);
setSize(new Point(size().x(), height));
textWidget.setSize(new Point(textWidget.getSize().x(), height));
boxPosition = new Point(2, (height - 18) / 2);
}
}
@@ -1,52 +0,0 @@
package binnie.botany.craftgui;
import binnie.botany.api.IColourMix;
import binnie.core.craftgui.CraftGUI;
import binnie.core.craftgui.ITooltip;
import binnie.core.craftgui.IWidget;
import binnie.core.craftgui.Tooltip;
import binnie.core.craftgui.WidgetAttribute;
import binnie.core.craftgui.controls.core.Control;
import binnie.core.craftgui.geometry.IPoint;
import binnie.core.craftgui.resource.Texture;
import binnie.core.craftgui.resource.minecraft.CraftGUITextureSheet;
import binnie.core.craftgui.resource.minecraft.StandardTexture;
import binnie.core.util.I18N;
public class ControlColourMixSymbol extends Control implements ITooltip {
protected static Texture MutationPlus = new StandardTexture(2, 94, 16, 16, CraftGUITextureSheet.Controls2);
protected static Texture MutationArrow = new StandardTexture(20, 94, 32, 16, CraftGUITextureSheet.Controls2);
protected IColourMix value;
protected int type;
protected ControlColourMixSymbol(IWidget parent, int x, int y, int type) {
super(parent, x, y, 16 + type * 16, 16.0f);
this.type = type;
value = null;
addAttribute(WidgetAttribute.MOUSE_OVER);
}
@Override
public void onRenderBackground() {
super.onRenderBackground();
if (type == 0) {
CraftGUI.render.texture(ControlColourMixSymbol.MutationPlus, IPoint.ZERO);
} else {
CraftGUI.render.texture(ControlColourMixSymbol.MutationArrow, IPoint.ZERO);
}
}
public void setValue(IColourMix value) {
this.value = value;
setColor(0xffffff);
}
@Override
public void getTooltip(Tooltip tooltip) {
if (type == 1) {
float chance = value.getChance();
tooltip.add(I18N.localise("botany.gui.controls.colorMixSymbol.chance", chance));
}
}
}
@@ -1,6 +1,9 @@
package binnie.botany.craftgui;
import binnie.botany.api.IColourMix;
import java.util.ArrayList;
import java.util.List;
import binnie.botany.api.IColorMix;
import binnie.botany.api.IFlowerColor;
import binnie.botany.core.BotanyCore;
import binnie.core.craftgui.IWidget;
@@ -10,27 +13,24 @@ import binnie.core.craftgui.database.DatabaseTab;
import binnie.core.craftgui.database.PageAbstract;
import binnie.core.util.I18N;
import java.util.ArrayList;
import java.util.List;
public class PageColorMix extends PageAbstract<IFlowerColor> {
ControlText title;
ControlColorMixBox list;
ControlText pageSpeciesFurther_Title;
ControlColorMixBox pageSpeciesFurther_List;
public PageColorMix(IWidget parent, DatabaseTab tab) {
super(parent, tab);
title = new ControlTextCentered(this, 8.0f, I18N.localise("botany.gui.controls.pageColorFurtherTitle"));
list = new ControlColorMixBox(this, 4, 20, 136, 152, ControlColorMixBox.Type.Further);
pageSpeciesFurther_Title = new ControlTextCentered(this, 8, I18N.localise("botany.gui.controls.page.color_further.title"));
pageSpeciesFurther_List = new ControlColorMixBox(this, 4, 20, 136, 152, ControlColorMixBox.Type.FURTHER);
}
@Override
public void onValueChanged(IFlowerColor colour) {
List<IColourMix> mixes = new ArrayList<>();
for (IColourMix mix : BotanyCore.getFlowerRoot().getColourMixes(false)) {
if (mix.getColor1() == colour || mix.getColor2() == colour) {
List<IColorMix> mixes = new ArrayList<>();
for (IColorMix mix : BotanyCore.getFlowerRoot().getColorMixes(false)) {
if (mix.getColorFirst() == colour || mix.getColorSecond() == colour) {
mixes.add(mix);
}
}
list.setOptions(mixes);
pageSpeciesFurther_List.setOptions(mixes);
}
}
@@ -1,6 +1,9 @@
package binnie.botany.craftgui;
import binnie.botany.api.IColourMix;
import java.util.ArrayList;
import java.util.List;
import binnie.botany.api.IColorMix;
import binnie.botany.api.IFlowerColor;
import binnie.botany.core.BotanyCore;
import binnie.core.craftgui.IWidget;
@@ -10,27 +13,24 @@ import binnie.core.craftgui.database.DatabaseTab;
import binnie.core.craftgui.database.PageAbstract;
import binnie.core.util.I18N;
import java.util.ArrayList;
import java.util.List;
public class PageColorMixResultant extends PageAbstract<IFlowerColor> {
protected ControlText title;
protected ControlColorMixBox list;
ControlText pageSpeciesFurther_Title;
ControlColorMixBox pageSpeciesFurther_List;
public PageColorMixResultant(IWidget parent, DatabaseTab tab) {
super(parent, tab);
title = new ControlTextCentered(this, 8.0f, I18N.localise("botany.gui.controls.pageSpeciesFurtherTitle"));
list = new ControlColorMixBox(this, 4, 20, 136, 152, ControlColorMixBox.Type.Resultant);
pageSpeciesFurther_Title = new ControlTextCentered(this, 8, I18N.localise("botany.gui.controls.page.species_further.title"));
pageSpeciesFurther_List = new ControlColorMixBox(this, 4, 20, 136, 152, ControlColorMixBox.Type.RESULTANT);
}
@Override
public void onValueChanged(IFlowerColor color) {
List<IColourMix> mixes = new ArrayList<>();
for (IColourMix mix : BotanyCore.getFlowerRoot().getColourMixes(false)) {
if (mix.getResult() == color) {
public void onValueChanged(IFlowerColor colour) {
List<IColorMix> mixes = new ArrayList<>();
for (IColorMix mix : BotanyCore.getFlowerRoot().getColorMixes(false)) {
if (mix.getResult() == colour) {
mixes.add(mix);
}
}
list.setOptions(mixes);
pageSpeciesFurther_List.setOptions(mixes);
}
}
@@ -1,5 +1,11 @@
package binnie.botany.craftgui;
import net.minecraft.item.ItemStack;
import forestry.api.genetics.IAllele;
import forestry.api.genetics.IAlleleSpecies;
import forestry.api.genetics.IIndividual;
import binnie.Binnie;
import binnie.botany.api.EnumFlowerChromosome;
import binnie.botany.api.EnumFlowerStage;
@@ -13,76 +19,72 @@ import binnie.core.craftgui.controls.core.Control;
import binnie.core.craftgui.controls.scroll.ControlScrollableContent;
import binnie.core.craftgui.database.DatabaseTab;
import binnie.core.craftgui.database.PageSpecies;
import binnie.core.craftgui.geometry.IArea;
import binnie.core.craftgui.geometry.IPoint;
import binnie.core.craftgui.geometry.Area;
import binnie.core.craftgui.geometry.Point;
import binnie.core.craftgui.geometry.TextJustification;
import binnie.core.craftgui.minecraft.control.ControlItemDisplay;
import binnie.core.util.I18N;
import binnie.genetics.genetics.AlleleHelper;
import forestry.api.genetics.IAllele;
import forestry.api.genetics.IAlleleSpecies;
import forestry.api.genetics.IIndividual;
import net.minecraft.item.ItemStack;
public class PageSpeciesFlowerGenome extends PageSpecies {
public PageSpeciesFlowerGenome(IWidget parent, DatabaseTab tab) {
super(parent, tab);
}
public static String tolerated(boolean t) {
if (t) {
return "Tolerated";
}
return "Not Tolerated";
}
@Override
public void onValueChanged(IAlleleSpecies species) {
deleteAllChildren();
IAllele[] template = Binnie.Genetics.getFlowerRoot().getTemplate(species.getUID());
IAllele[] template = Binnie.GENETICS.getFlowerRoot().getTemplate(species.getUID());
if (template == null) {
return;
}
IFlower tree = Binnie.Genetics.getFlowerRoot().templateAsIndividual(template);
if (tree == null) {
return;
}
IFlower tree = Binnie.GENETICS.getFlowerRoot().templateAsIndividual(template);
IFlowerGenome genome = tree.getGenome();
IAlleleFlowerSpecies treeSpecies = genome.getPrimary();
int w = 144;
int h = 176;
new ControlText(this, new IArea(0.0f, 4.0f, w, 16.0f), I18N.localise("botany.gui.database.tab.genome"), TextJustification.MIDDLE_CENTER);
ControlScrollableContent scrollable = new ControlScrollableContent(this, 4.0f, 20.0f, w - 8, h - 8 - 16, 12.0f);
Control contents = new Control(scrollable, 0.0f, 0.0f, w - 8 - 12, h - 8 - 16);
new ControlText(this, new Area(0, 4, w, 16), I18N.localise("botany.gui.database.tab.genome"), TextJustification.MIDDLE_CENTER);
ControlScrollableContent scrollable = new ControlScrollableContent(this, 4, 20, w - 8, h - 8 - 16, 12);
Control contents = new Control(scrollable, 0, 0, w - 8 - 12, h - 8 - 16);
int tw = w - 8 - 12;
int w2 = 55;
int w3 = tw - 50;
int y = 0;
int th = 14;
int valueX = w2 + 4;
new ControlText(contents, new IArea(0.0f, y, w2, th), I18N.localise("botany.gui.database.tab.genome.temp"), TextJustification.MIDDLE_RIGHT);
new ControlText(contents, new IArea(valueX, y, w3, th), AlleleHelper.toDisplay(treeSpecies.getTemperature()), TextJustification.MIDDLE_LEFT);
y += th;
int th2 = 18;
new ControlText(contents, new Area(0, y, w2, th), I18N.localise("botany.gui.database.tab.genome.temp"), TextJustification.MIDDLE_RIGHT);
new ControlText(contents, new Area(w2, y, w3, th), treeSpecies.getTemperature().getName(), TextJustification.MIDDLE_LEFT);
new ControlText(contents, new IArea(0.0f, y, w2, th), I18N.localise("botany.gui.database.tab.genome.moist"), TextJustification.MIDDLE_RIGHT);
new ControlText(contents, new IArea(valueX, y, w3, th), AlleleHelper.toDisplay(treeSpecies.getMoisture()), TextJustification.MIDDLE_LEFT);
y += th;
new ControlText(contents, new Area(0, y, w2, th), I18N.localise("botany.gui.database.tab.genome.moist"), TextJustification.MIDDLE_RIGHT);
new ControlText(contents, new Area(w2, y, w3, th), treeSpecies.getMoisture().getLocalisedName(false), TextJustification.MIDDLE_LEFT);
new ControlText(contents, new IArea(0.0f, y, w2, th), I18N.localise("botany.gui.database.tab.genome.ph"), TextJustification.MIDDLE_RIGHT);
new ControlText(contents, new IArea(valueX, y, w3, th), AlleleHelper.toDisplay(treeSpecies.getPH()), TextJustification.MIDDLE_LEFT);
y += th;
new ControlText(contents, new Area(0, y, w2, th), I18N.localise("botany.gui.database.tab.genome.ph"), TextJustification.MIDDLE_RIGHT);
new ControlText(contents, new Area(w2, y, w3, th), treeSpecies.getPH().getLocalisedName(false), TextJustification.MIDDLE_LEFT);
new ControlText(contents, new IArea(0.0f, y, w2, th), I18N.localise("botany.gui.database.tab.genome.fertility"), TextJustification.MIDDLE_RIGHT);
new ControlText(contents, new IArea(valueX, y, w3, th), genome.getFertility() + "x", TextJustification.MIDDLE_LEFT);
y += th;
new ControlText(contents, new Area(0, y, w2, th), I18N.localise("botany.gui.database.tab.genome.fertility"), TextJustification.MIDDLE_RIGHT);
new ControlText(contents, new Area(w2, y, w3, th), genome.getFertility() + "x", TextJustification.MIDDLE_LEFT);
y += th;
float lifespan = genome.getLifespan() * 68.27f / genome.getAgeChance() / 24000.0f;
String lifespanValue = String.format("%.2f", lifespan);
new ControlText(contents, new IArea(0.0f, y, w2, th), I18N.localise("botany.gui.database.tab.genome.lifespan"), TextJustification.MIDDLE_RIGHT);
new ControlText(contents, new IArea(valueX, y, w3, th), I18N.localise("botany.gui.database.tab.genome.lifespan.value", lifespanValue), TextJustification.MIDDLE_LEFT);
y += th;
new ControlText(contents, new Area(0, y, w2, th), I18N.localise("botany.gui.database.tab.genome.lifespan"), TextJustification.MIDDLE_RIGHT);
new ControlText(contents, new Area(w2, y, w3, th), I18N.localise("botany.gui.database.tab.genome.lifespan.value", lifespanValue), TextJustification.MIDDLE_LEFT);
new ControlText(contents, new IArea(0.0f, y, w2, th), I18N.localise("botany.gui.database.tab.genome.nectar"), TextJustification.MIDDLE_RIGHT);
new ControlText(contents, new IArea(valueX, y, w3, th), genome.getActiveAllele(EnumFlowerChromosome.SAPPINESS).getName(), TextJustification.MIDDLE_LEFT);
y += th;
new ControlText(contents, new Area(0, y, w2, th), I18N.localise("botany.gui.database.tab.genome.nectar"), TextJustification.MIDDLE_RIGHT);
new ControlText(contents, new Area(w2, y, w3, th), genome.getActiveAllele(EnumFlowerChromosome.SAPPINESS).getName(), TextJustification.MIDDLE_LEFT);
y += th;
int x = w2;
int tot = 0;
for (IIndividual vid : BotanyCore.getFlowerRoot().getIndividualTemplates()) {
@@ -91,18 +93,18 @@ public class PageSpeciesFlowerGenome extends PageSpecies {
x -= 54;
y += 18;
}
ItemStack stack = BotanyCore.getFlowerRoot().getMemberStack(vid, EnumFlowerStage.FLOWER.ordinal());
ItemStack stack = BotanyCore.getFlowerRoot().getMemberStack(vid, EnumFlowerStage.FLOWER);
ControlItemDisplay display = new ControlItemDisplay(contents, x, y);
display.setItemStack(stack);
tot++;
++tot;
x += 18;
}
}
int numOfLines = 1 + (tot - 1) / 3;
new ControlText(contents, new IArea(0.0f, y - (numOfLines - 1) * 18, w2, 4 + 18 * numOfLines), I18N.localise("botany.gui.database.tab.genome.varieties"), TextJustification.MIDDLE_RIGHT);
new ControlText(contents, new Area(0, y - (numOfLines - 1) * 18, w2, 4 + 18 * numOfLines), I18N.localise("botany.gui.database.tab.genome.varieties"), TextJustification.MIDDLE_RIGHT);
y += th;
contents.setSize(new IPoint(contents.size().x(), y));
contents.setSize(new Point(contents.size().x(), y));
scrollable.setScrollableContent(contents);
}
}
@@ -1,5 +1,14 @@
package binnie.botany.craftgui;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import binnie.Binnie;
import binnie.botany.Botany;
import binnie.botany.api.IFlowerColor;
@@ -17,19 +26,15 @@ import binnie.core.craftgui.database.PageSpeciesMutations;
import binnie.core.craftgui.database.PageSpeciesOverview;
import binnie.core.craftgui.database.PageSpeciesResultant;
import binnie.core.craftgui.database.WindowAbstractDatabase;
import binnie.core.craftgui.geometry.IArea;
import binnie.core.craftgui.geometry.Area;
import binnie.core.craftgui.minecraft.Window;
import binnie.core.util.I18N;
import cpw.mods.fml.relauncher.Side;
import net.minecraft.entity.player.EntityPlayer;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class WindowBotanistDatabase extends WindowAbstractDatabase {
private ControlListBox<EnumFlowerColor> selectionBoxColors;
public WindowBotanistDatabase(EntityPlayer player, Side side, boolean nei) {
super(player, side, nei, Binnie.Genetics.flowerBreedingSystem, 130.0f);
super(player, side, nei, Binnie.GENETICS.flowerBreedingSystem, 130);
}
public static Window create(EntityPlayer player, Side side, boolean nei) {
@@ -37,18 +42,19 @@ public class WindowBotanistDatabase extends WindowAbstractDatabase {
}
@Override
@SideOnly(Side.CLIENT)
protected void addTabs() {
new PageSpeciesOverview(getInfoPages(Mode.Species), new DatabaseTab(Botany.instance, "species.overview"));
new PageSpeciesFlowerGenome(getInfoPages(Mode.Species), new DatabaseTab(Botany.instance, "genome"));
new PageSpeciesClassification(getInfoPages(Mode.Species), new DatabaseTab(Botany.instance, "species.classification"));
new PageSpeciesResultant(getInfoPages(Mode.Species), new DatabaseTab(Botany.instance, "species.resultant"));
new PageSpeciesMutations(getInfoPages(Mode.Species), new DatabaseTab(Botany.instance, "species.further"));
new PageBranchOverview(getInfoPages(Mode.Branches), new DatabaseTab(Botany.instance, "branches.overview"));
new PageBranchSpecies(getInfoPages(Mode.Branches), new DatabaseTab(Botany.instance, "branches.species"));
createMode(FlowerMode.COLOR, new ColorModeWidget());
new PageColorMixResultant(getInfoPages(FlowerMode.COLOR), new DatabaseTab(Botany.instance, "colour.resultant"));
new PageColorMix(getInfoPages(FlowerMode.COLOR), new DatabaseTab(Botany.instance, "colour.further"));
new PageBreeder(getInfoPages(Mode.Breeder), getUsername(), new DatabaseTab(Botany.instance, "breeder"));
new PageSpeciesOverview(getInfoPages(Mode.SPECIES), new DatabaseTab(Botany.instance, "species.overview", 0));
new PageSpeciesFlowerGenome(getInfoPages(Mode.SPECIES), new DatabaseTab(Botany.instance, "genome", 0));
new PageSpeciesClassification(getInfoPages(Mode.SPECIES), new DatabaseTab(Botany.instance, "species.classification", 0));
new PageSpeciesResultant(getInfoPages(Mode.SPECIES), new DatabaseTab(Botany.instance, "species.resultant", 0));
new PageSpeciesMutations(getInfoPages(Mode.SPECIES), new DatabaseTab(Botany.instance, "species.further", 0));
new PageBranchOverview(getInfoPages(Mode.BRANCHES), new DatabaseTab(Botany.instance, "branches.overview", 0));
new PageBranchSpecies(getInfoPages(Mode.BRANCHES), new DatabaseTab(Botany.instance, "branches.species", 0));
createMode(FlowerMode.Color, new FlowerColorModeWidgets());
new PageColorMixResultant(getInfoPages(FlowerMode.Color), new DatabaseTab(Botany.instance, "color.resultant", 0));
new PageColorMix(getInfoPages(FlowerMode.Color), new DatabaseTab(Botany.instance, "color.further", 0));
new PageBreeder(getInfoPages(Mode.BREEDER), getUsername(), new DatabaseTab(Botany.instance, "breeder", 0));
}
@Override
@@ -57,12 +63,12 @@ public class WindowBotanistDatabase extends WindowAbstractDatabase {
}
@Override
protected String getName() {
return I18N.localise("botany.gui.database.name");
protected String getBackgroundTextureName() {
return "FlowerDatabase";
}
enum FlowerMode implements IDatabaseMode {
COLOR;
Color;
@Override
public String getName() {
@@ -70,21 +76,22 @@ public class WindowBotanistDatabase extends WindowAbstractDatabase {
}
}
private class ColorModeWidget extends ModeWidgets {
public ColorModeWidget() {
super(FlowerMode.COLOR, WindowBotanistDatabase.this);
@SideOnly(Side.CLIENT)
private class FlowerColorModeWidgets extends ModeWidgets {
public FlowerColorModeWidgets() {
super(FlowerMode.Color, WindowBotanistDatabase.this);
}
@Override
public void createListBox(IArea area) {
listBox = new ControlListBox<IFlowerColor>(modePage, area.x(), area.y(), area.w(), area.h(), 12.0f) {
public void createListBox(Area area) {
listBox = new ControlListBox<IFlowerColor>(modePage, area.xPos(), area.yPos(), area.width(), area.height(), 12) {
@Override
public IWidget createOption(IFlowerColor value, int y) {
return new ControlColorOption(getContent(), value, y);
}
};
List<IFlowerColor> colors = new ArrayList<>();
Collections.addAll(colors, EnumFlowerColor.values());
List<IFlowerColor> colors = Arrays.stream(EnumFlowerColor.values()).map(c -> c.getFlowerColorAllele()).collect(Collectors.toList());
listBox.setOptions(colors);
}
}
@@ -0,0 +1,9 @@
@ParametersAreNonnullByDefault
@MethodsReturnNonnullByDefault
@FieldsAreNonnullByDefault
package binnie.botany.craftgui;
import javax.annotation.ParametersAreNonnullByDefault;
import binnie.core.util.FieldsAreNonnullByDefault;
import mcp.MethodsReturnNonnullByDefault;
@@ -1,74 +1,63 @@
package binnie.botany.farm;
import com.google.common.base.Preconditions;
import javax.annotation.Nullable;
import net.minecraft.item.ItemStack;
import net.minecraft.util.text.TextFormatting;
import forestry.api.circuits.ChipsetManager;
import forestry.api.circuits.ICircuitLayout;
import forestry.api.farming.FarmDirection;
import forestry.api.farming.IFarmHousing;
import binnie.botany.api.EnumAcidity;
import binnie.botany.api.EnumMoisture;
import binnie.core.circuits.BinnieCircuit;
import binnie.core.util.I18N;
import forestry.api.circuits.ChipsetManager;
import forestry.api.farming.FarmDirection;
import forestry.api.farming.IFarmHousing;
import net.minecraft.item.ItemStack;
import net.minecraft.util.EnumChatFormatting;
public class CircuitGarden extends BinnieCircuit {
private boolean isManual;
private boolean isFertilised;
private ItemStack icon;
private EnumMoisture moisture;
private EnumAcidity acidity;
private GardenLogic logic;
public CircuitGarden(EnumMoisture moisture, EnumAcidity ph, boolean manual, boolean fertilised, ItemStack recipe, ItemStack icon) {
super("garden." + moisture.getID() + ((ph != null) ? ("." + ph.getID()) : "") + (manual ? ".manual" : "") + (fertilised ? ".fert" : ""), 4, manual ? ChipsetManager.circuitRegistry.getLayout("forestry.farms.manual") : ChipsetManager.circuitRegistry.getLayout("forestry.farms.managed"), recipe);
this.moisture = moisture;
this.icon = icon;
public CircuitGarden(EnumMoisture moisture, @Nullable EnumAcidity ph, boolean manual, boolean fertilised, ItemStack recipe, ItemStack icon) {
super(getName(moisture, ph, manual, fertilised), 4, getLayout(manual), recipe);
isManual = manual;
isFertilised = fertilised;
acidity = ph;
String info = "";
if (moisture == EnumMoisture.DRY) {
info += EnumChatFormatting.YELLOW
+ I18N.localise("botany.moisture.dry")
+ EnumChatFormatting.RESET;
logic = new GardenLogic(moisture, ph, isManual, fertilised, icon, I18N.localise(getUnlocalizedName()));
String info = I18N.localise("botany.moisture") + ": " + moisture.getLocalisedName(true);
if (ph != null) {
info += TextFormatting.GRAY + ", " + I18N.localise("botany.ph") + ": " + moisture.getLocalisedName(true);
}
String fertilizedKey = fertilised ? "for.binnie.circuit.garden.fertilized" : "for.binnie.circuit.garden.unfertilized";
info += TextFormatting.GRAY + " " + I18N.localise(fertilizedKey);
addTooltipString(I18N.localise("for.binnie.circuit.garden.info", info));
}
if (moisture == EnumMoisture.DAMP) {
info += EnumChatFormatting.YELLOW
+ I18N.localise("botany.moisture.damp")
+ EnumChatFormatting.RESET;
}
private static ICircuitLayout getLayout(boolean manual) {
String layoutUid = manual ? "forestry.farms.manual" : "forestry.farms.managed";
ICircuitLayout layout = ChipsetManager.circuitRegistry.getLayout(layoutUid);
Preconditions.checkState(layout != null, "Couldn't find Forestry circuit layout %s.", layoutUid);
return layout;
}
if (acidity == EnumAcidity.ACID) {
if (info.length() > 0) {
info += ", ";
}
info += EnumChatFormatting.RED
+ I18N.localise("botany.ph.acid")
+ EnumChatFormatting.RESET;
private static String getName(EnumMoisture moisture, @Nullable EnumAcidity ph, boolean manual, boolean fertilised) {
String name = "garden." + moisture.getName();
if (ph != null) {
name += "." + ph.getName();
}
if (manual) {
name += ".manual";
}
if (fertilised) {
name += ".fert";
}
return name;
}
if (acidity == EnumAcidity.NEUTRAL) {
if (info.length() > 0) {
info += ", ";
}
info += EnumChatFormatting.GREEN
+ I18N.localise("botany.ph.neutral")
+ EnumChatFormatting.RESET;
}
if (acidity == EnumAcidity.ALKALINE) {
if (info.length() > 0) {
info += ", ";
}
info += EnumChatFormatting.AQUA
+ I18N.localise("botany.ph.alkaline")
+ EnumChatFormatting.RESET;
}
if (info.length() > 0) {
info = " (" + info + EnumChatFormatting.RESET + ")";
}
addTooltipString(I18N.localise("botany.circuit.flowers") + info);
public CircuitGarden setManual() {
isManual = true;
return this;
}
@Override
@@ -76,15 +65,24 @@ public class CircuitGarden extends BinnieCircuit {
return tile instanceof IFarmHousing;
}
@Nullable
private IFarmHousing getCircuitable(Object tile) {
if (!isCircuitable(tile)) {
return null;
}
return (IFarmHousing) tile;
}
@Override
public void onInsertion(int slot, Object tile) {
if (!isCircuitable(tile)) {
IFarmHousing housing = getCircuitable(tile);
if (housing == null) {
return;
}
GardenLogic logic = new GardenLogic((IFarmHousing) tile);
logic.setData(moisture, acidity, isManual, isFertilised, icon, I18N.localise(getName()));
((IFarmHousing) tile).setFarmLogic(FarmDirection.values()[slot], logic);
logic.setManual(isManual);
housing.setFarmLogic(FarmDirection.values()[slot], logic);
}
@Override
@@ -94,14 +92,16 @@ public class CircuitGarden extends BinnieCircuit {
@Override
public void onRemoval(int slot, Object tile) {
if (!isCircuitable(tile)) {
IFarmHousing farmHousing = getCircuitable(tile);
if (farmHousing == null) {
return;
}
((IFarmHousing) tile).resetFarmLogic(FarmDirection.values()[slot]);
farmHousing.resetFarmLogic(FarmDirection.values()[slot]);
}
@Override
public void onTick(int arg0, Object arg1) {
public void onTick(int slot, Object tile) {
// ignored
}
}
+20 -29
View File
@@ -1,22 +1,16 @@
package binnie.botany.farm;
import forestry.api.farming.FarmDirection;
import forestry.api.farming.IFarmHousing;
import forestry.api.farming.IFarmLogic;
import forestry.core.utils.vect.Vect;
import net.minecraft.block.Block;
import net.minecraft.block.state.IBlockState;
import net.minecraft.init.Blocks;
import net.minecraft.item.ItemStack;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
public abstract class FarmLogic implements IFarmLogic {
protected World world;
protected IFarmHousing housing;
protected boolean isManual;
import forestry.api.farming.IFarmLogic;
public FarmLogic(IFarmHousing housing) {
this.housing = housing;
}
public abstract class FarmLogic implements IFarmLogic {
boolean isManual;
@Override
public IFarmLogic setManual(boolean flag) {
@@ -24,35 +18,32 @@ public abstract class FarmLogic implements IFarmLogic {
return this;
}
protected boolean isAirBlock(Vect position) {
return world.isAirBlock(position.x, position.y, position.z);
protected final boolean isAirBlock(World world, BlockPos pos) {
return world.isAirBlock(pos);
}
protected boolean isWaterBlock(Vect position) {
return world.getBlock(position.x, position.y, position.z) == Blocks.water;
protected final IBlockState getBlockState(World world, BlockPos pos) {
return world.getBlockState(pos);
}
protected Block getBlock(Vect position) {
return world.getBlock(position.x, position.y, position.z);
protected final Block getBlock(World world, BlockPos pos) {
return getBlockState(world, pos).getBlock();
}
protected int getBlockMeta(Vect position) {
return world.getBlockMetadata(position.x, position.y, position.z);
protected final int getBlockMeta(World world, BlockPos pos) {
IBlockState blockState = world.getBlockState(pos);
return blockState.getBlock().getMetaFromState(blockState);
}
protected ItemStack getAsItemStack(Vect position) {
return new ItemStack(getBlock(position), 1, getBlockMeta(position));
protected final ItemStack getAsItemStack(World world, BlockPos position) {
return new ItemStack(getBlock(world, position), 1, getBlockMeta(world, position));
}
protected Vect translateWithOffset(int x, int y, int z, FarmDirection direction, int step) {
return new Vect(
x + direction.getForgeDirection().offsetX * step,
y + direction.getForgeDirection().offsetY * step,
z + direction.getForgeDirection().offsetZ * step
);
protected final boolean isWaterBlock(World world, BlockPos pos) {
return getBlock(world, pos) == Blocks.WATER;
}
protected void setBlock(Vect position, Block block, int meta) {
world.setBlock(position.x, position.y, position.z, block, meta, 2);
protected final void setBlock(World world, BlockPos pos, Block block, int meta) {
world.setBlockState(pos, block.getStateFromMeta(meta), 2);
}
}
@@ -1,30 +1,54 @@
package binnie.botany.farm;
import javax.annotation.Nullable;
import net.minecraft.block.state.IBlockState;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.init.Blocks;
import net.minecraft.item.ItemStack;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import forestry.api.farming.ICrop;
import forestry.api.farming.IFarmable;
import binnie.botany.Botany;
import binnie.botany.api.EnumFlowerStage;
import binnie.botany.api.IFlower;
import binnie.botany.api.IFlowerRoot;
import binnie.botany.core.BotanyCore;
import binnie.botany.gardening.Gardening;
import forestry.api.farming.ICrop;
import forestry.api.farming.IFarmable;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.world.World;
import binnie.botany.flower.TileEntityFlower;
public class FarmableFlower implements IFarmable {
@Override
public boolean isSaplingAt(World world, int x, int y, int z) {
return world.getBlock(x, y, z) == Botany.flower;
public boolean isSaplingAt(World world, BlockPos pos) {
return world.getBlockState(pos) == Botany.flower;
}
@Nullable
@Override
public ICrop getCropAt(World world, int x, int y, int z) {
public ICrop getCropAt(World world, BlockPos pos, IBlockState blockState) {
IFlower flower = null;
if (world.getTileEntity(pos) instanceof TileEntityFlower) {
flower = ((TileEntityFlower) world.getTileEntity(pos)).getFlower();
}
// TODO Look at TileEntityFlower::onShear logic
if (flower != null && flower.getAge() > 1) {
IFlowerRoot flowerRoot = BotanyCore.getFlowerRoot();
ItemStack mature = flowerRoot.getMemberStack(flower, EnumFlowerStage.FLOWER);
ItemStack seed = flowerRoot.getMemberStack(flower, EnumFlowerStage.SEED);
if (mature != null && seed != null) {
world.setBlockState(pos, Blocks.AIR.getDefaultState(), 2);
return new FlowerCrop(pos, mature, seed);
}
}
return null;
}
@Override
public boolean isGermling(ItemStack itemstack) {
EnumFlowerStage stage = BotanyCore.speciesRoot.getStageType(itemstack);
EnumFlowerStage stage = BotanyCore.getFlowerRoot().getType(itemstack);
return stage == EnumFlowerStage.FLOWER || stage == EnumFlowerStage.SEED;
}
@@ -34,9 +58,10 @@ public class FarmableFlower implements IFarmable {
}
@Override
public boolean plantSaplingAt(EntityPlayer player, ItemStack germling, World world, int x, int y, int z) {
IFlower flower = BotanyCore.getFlowerRoot().getMember(germling);
Gardening.plant(world, x, y, z, flower, player.getGameProfile());
public boolean plantSaplingAt(EntityPlayer player, ItemStack germling, World world, BlockPos pos) {
IFlowerRoot flowerRoot = BotanyCore.getFlowerRoot();
IFlower flower = flowerRoot.getMember(germling);
flowerRoot.plant(world, pos, flower, player.getGameProfile());
return true;
}
}
@@ -1,12 +1,14 @@
package binnie.botany.farm;
import binnie.botany.api.IFlower;
import binnie.botany.core.BotanyCore;
import binnie.botany.gardening.Gardening;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import binnie.botany.api.IFlower;
import binnie.botany.api.IFlowerRoot;
import binnie.botany.core.BotanyCore;
public class FarmableVanillaFlower extends FarmableFlower {
@Override
public boolean isGermling(ItemStack itemstack) {
@@ -14,8 +16,9 @@ public class FarmableVanillaFlower extends FarmableFlower {
}
@Override
public boolean plantSaplingAt(EntityPlayer player, ItemStack germling, World world, int x, int y, int z) {
IFlower flower = BotanyCore.getFlowerRoot().getConversion(germling);
return Gardening.plant(world, x, y, z, flower, player.getGameProfile());
public boolean plantSaplingAt(EntityPlayer player, ItemStack germling, World world, BlockPos pos) {
IFlowerRoot flowerRoot = BotanyCore.getFlowerRoot();
IFlower flower = flowerRoot.getConversion(germling);
return flowerRoot.plant(world, pos, flower, player.getGameProfile());
}
}
@@ -0,0 +1,31 @@
package binnie.botany.farm;
import javax.annotation.Nullable;
import java.util.Collections;
import net.minecraft.item.ItemStack;
import net.minecraft.util.NonNullList;
import net.minecraft.util.math.BlockPos;
import forestry.api.farming.ICrop;
public class FlowerCrop implements ICrop {
NonNullList<ItemStack> drops = NonNullList.create();
BlockPos position;
public FlowerCrop(BlockPos pos, ItemStack... drops) {
Collections.addAll(this.drops, drops);
position = pos;
}
@Nullable
@Override
public NonNullList<ItemStack> harvest() {
return drops;
}
@Override
public BlockPos getPosition() {
return position;
}
}
+228 -237
View File
@@ -1,22 +1,13 @@
package binnie.botany.farm;
import binnie.Binnie;
import binnie.botany.Botany;
import binnie.botany.api.EnumAcidity;
import binnie.botany.api.EnumMoisture;
import binnie.botany.api.EnumSoilType;
import binnie.botany.api.gardening.IBlockSoil;
import binnie.botany.flower.TileEntityFlower;
import binnie.botany.gardening.Gardening;
import com.mojang.authlib.GameProfile;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import forestry.api.farming.FarmDirection;
import forestry.api.farming.ICrop;
import forestry.api.farming.IFarmHousing;
import forestry.api.farming.IFarmable;
import forestry.core.access.IOwnable;
import forestry.core.utils.vect.Vect;
import javax.annotation.Nullable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
import net.minecraft.block.Block;
import net.minecraft.client.renderer.texture.TextureMap;
import net.minecraft.init.Blocks;
@@ -24,30 +15,53 @@ import net.minecraft.item.Item;
import net.minecraft.item.ItemBlock;
import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.IIcon;
import net.minecraft.util.NonNullList;
import net.minecraft.util.ResourceLocation;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import net.minecraftforge.fluids.FluidStack;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import forestry.api.farming.FarmDirection;
import forestry.api.farming.ICrop;
import forestry.api.farming.IFarmHousing;
import forestry.api.farming.IFarmable;
import forestry.core.owner.IOwnedTile;
import forestry.core.utils.BlockUtil;
import binnie.Binnie;
import binnie.botany.Botany;
import binnie.botany.api.EnumAcidity;
import binnie.botany.api.EnumMoisture;
import binnie.botany.api.EnumSoilType;
import binnie.botany.api.IBlockSoil;
import binnie.botany.api.IGardeningManager;
import binnie.botany.core.BotanyCore;
import binnie.botany.flower.TileEntityFlower;
import binnie.core.liquid.ManagerLiquid;
public class GardenLogic extends FarmLogic {
protected EnumMoisture moisture;
protected EnumAcidity acidity;
protected boolean fertilised;
protected String name;
protected ArrayList<ItemStack> produce;
protected List<IFarmable> farmables;
List<IFarmable> farmables;
private EnumMoisture moisture;
@Nullable
private EnumAcidity acidity;
private boolean fertilised;
private String name;
private NonNullList<ItemStack> produce;
private ItemStack icon;
public GardenLogic(IFarmHousing housing) {
super(housing);
produce = new ArrayList<>();
public GardenLogic(EnumMoisture moisture2, @Nullable EnumAcidity acidity2, boolean isManual, boolean isFertilised, ItemStack icon2, String name2) {
this.isManual = isManual;
produce = NonNullList.create();
farmables = new ArrayList<>();
farmables.add(new FarmableFlower());
farmables.add(new FarmableVanillaFlower());
moisture = moisture2;
acidity = acidity2;
fertilised = isFertilised;
icon = icon2;
name = name2;
}
@Override
@@ -61,114 +75,96 @@ public class GardenLogic extends FarmLogic {
}
@Override
public boolean isAcceptedResource(ItemStack stack) {
Item item = stack.getItem();
return Gardening.isSoil(item)
|| item == Item.getItemFromBlock(Blocks.sand)
|| item == Item.getItemFromBlock(Blocks.dirt)
|| Gardening.isAcidFertiliser(stack)
|| Gardening.isAlkalineFertiliser(stack);
public boolean isAcceptedResource(ItemStack itemstack) {
IGardeningManager gardening = BotanyCore.getGardening();
return gardening.isSoil(itemstack.getItem()) ||
itemstack.getItem() == Item.getItemFromBlock(Blocks.SAND) ||
itemstack.getItem() == Item.getItemFromBlock(Blocks.DIRT) ||
gardening.isAcidFertiliser(itemstack) ||
gardening.isAlkalineFertiliser(itemstack);
}
@Override
public Collection<ItemStack> collect() {
Collection<ItemStack> products = produce;
produce = new ArrayList<>();
public NonNullList<ItemStack> collect(World world, IFarmHousing farmHousing) {
NonNullList<ItemStack> products = produce;
produce = NonNullList.create();
return products;
}
@Override
public boolean cultivate(int x, int y, int z, FarmDirection direction, int extent) {
world = housing.getWorld();
return maintainSoil(x, y, z, direction, extent)
|| !isManual && maintainWater(x, y, z, direction, extent)
|| maintainCrops(x, y + 1, z, direction, extent);
public boolean cultivate(World world, IFarmHousing farmHousing, BlockPos pos, FarmDirection direction, int extent) {
return maintainSoil(world, pos, direction, extent, farmHousing) ||
(!isManual && maintainWater(world, pos, direction, extent, farmHousing)) ||
maintainCrops(world, pos.up(), direction, extent, farmHousing);
}
private boolean isWaste(ItemStack stack) {
return stack.getItem() == Item.getItemFromBlock(Blocks.dirt);
return stack.getItem() == Item.getItemFromBlock(Blocks.DIRT);
}
private boolean maintainSoil(int x, int y, int z, FarmDirection direction, int extent) {
private boolean maintainSoil(World world, BlockPos pos, FarmDirection direction, int extent, IFarmHousing housing) {
IGardeningManager gardening = BotanyCore.getGardening();
for (int i = 0; i < extent; ++i) {
Vect position = translateWithOffset(x, y, z, direction, i);
boolean isSoil = Gardening.isSoil(world.getBlock(position.x, position.y, position.z));
// remove unnecessary blocks
if (!isManual && !isSoil && !isAirBlock(position)) {
Block block = world.getBlock(position.x, position.y, position.z);
if (moisture == EnumMoisture.DAMP) {
if (block != Blocks.water) {
dropBlockAsProduction(position);
}
} else if (moisture == EnumMoisture.DRY) {
if (block != Blocks.sand) {
dropBlockAsProduction(position);
}
} else {
dropBlockAsProduction(position);
}
}
if (fertilised && isSoil) {
IBlockSoil soil = (IBlockSoil) world.getBlock(position.x, position.y, position.z);
if (soil.fertilise(world, position.x, position.y, position.z, EnumSoilType.FLOWERBED)) {
BlockPos position = pos.offset(direction.getFacing(), i);
if (fertilised && gardening.isSoil(getBlock(world, position))) {
IBlockSoil soil = (IBlockSoil) getBlock(world, position);
if (soil.fertilise(world, position, EnumSoilType.FLOWERBED)) {
continue;
}
}
if (world.getBlock(position.x, position.y + 1, position.z) == Botany.plant) {
world.setBlockToAir(position.x, position.y + 1, position.z);
continue;
}
if (acidity != null && isSoil) {
IBlockSoil soil = (IBlockSoil) world.getBlock(position.x, position.y, position.z);
EnumAcidity pH = soil.getPH(world, position.x, position.y, position.z);
if (pH.ordinal() < acidity.ordinal()) {
ItemStack stack = getAvailableAlkaline();
if (stack != null && soil.setPH(world, position.x, position.y, position.z, EnumAcidity.values()[pH.ordinal() + 1])) {
housing.getFarmInventory().removeResources(new ItemStack[]{stack});
continue;
if (getBlock(world, position.up()) == Botany.plant) {
world.setBlockToAir(position.up());
} else {
if (acidity != null && gardening.isSoil(getBlock(world, position))) {
IBlockSoil soil = (IBlockSoil) getBlock(world, position);
EnumAcidity pH = soil.getPH(world, position);
if (pH.ordinal() < acidity.ordinal()) {
ItemStack stack = getAvailableAlkaline(housing);
if (!stack.isEmpty() && soil.setPH(world, position, EnumAcidity.values()[pH.ordinal() + 1])) {
NonNullList<ItemStack> resources = NonNullList.create();
resources.add(stack);
housing.getFarmInventory().removeResources(resources);
continue;
}
}
if (pH.ordinal() > acidity.ordinal()) {
ItemStack stack = getAvailableAcid(housing);
if (!stack.isEmpty() && soil.setPH(world, position, EnumAcidity.values()[pH.ordinal() - 1])) {
NonNullList<ItemStack> resources = NonNullList.create();
resources.add(stack);
housing.getFarmInventory().removeResources(resources);
continue;
}
}
}
if (pH.ordinal() > acidity.ordinal()) {
ItemStack stack = getAvailableAcid();
if (stack != null && soil.setPH(world, position.x, position.y, position.z, EnumAcidity.values()[pH.ordinal() - 1])) {
housing.getFarmInventory().removeResources(new ItemStack[]{stack});
continue;
if (!isAirBlock(world, position) && !BlockUtil.isReplaceableBlock(getBlockState(world, position), world, position)) {
ItemStack block = getAsItemStack(world, position);
ItemStack loam = getAvailableLoam(housing);
if (isWaste(block) && !loam.isEmpty()) {
produce.addAll(Blocks.DIRT.getDrops(world, position, Block.getBlockFromItem(block.getItem()).getStateFromMeta(block.getItemDamage()), 0));
setBlock(world, position, Blocks.AIR, 0);
return trySetSoil(world, position, loam, housing);
}
}
}
if (!isAirBlock(position) && !world.getBlock(position.x, position.y, position.z).isReplaceable(world, position.x, position.y, position.z)) {
ItemStack block = getAsItemStack(position);
ItemStack loam = getAvailableLoam();
if (isWaste(block) && loam != null) {
produce.addAll(Blocks.dirt.getDrops(world, position.x, position.y, position.z, block.getItemDamage(), 0));
setBlock(position, Blocks.air, 0);
return trySetSoil(position, loam);
}
} else if (!isManual) {
if (!isWaterBlock(position)) {
if (i % 2 == 0) {
return trySetSoil(position);
}
FarmDirection cclock = FarmDirection.EAST;
if (direction == FarmDirection.EAST) {
cclock = FarmDirection.SOUTH;
} else if (direction == FarmDirection.SOUTH) {
cclock = FarmDirection.EAST;
} else if (direction == FarmDirection.WEST) {
cclock = FarmDirection.SOUTH;
}
Vect previous = translateWithOffset(position.x, position.y, position.z, cclock, 1);
ItemStack soil2 = getAsItemStack(previous);
if (!Gardening.isSoil(soil2.getItem())) {
trySetSoil(position);
} else if (!isManual) {
if (!isWaterBlock(world, position)) {
if (i % 2 == 0) {
return trySetSoil(world, position, housing);
}
FarmDirection cclock = FarmDirection.EAST;
if (direction == FarmDirection.EAST) {
cclock = FarmDirection.SOUTH;
} else if (direction == FarmDirection.SOUTH) {
cclock = FarmDirection.EAST;
} else if (direction == FarmDirection.WEST) {
cclock = FarmDirection.SOUTH;
}
BlockPos previous = position.offset(cclock.getFacing());
ItemStack soil2 = getAsItemStack(world, previous);
if (!gardening.isSoil(soil2.getItem())) {
trySetSoil(world, position, housing);
}
}
}
}
@@ -176,164 +172,158 @@ public class GardenLogic extends FarmLogic {
return false;
}
private boolean maintainWater(int x, int y, int z, FarmDirection direction, int extent) {
private boolean maintainWater(World world, BlockPos pos, FarmDirection direction, int extent, IFarmHousing housing) {
for (int i = 0; i < extent; ++i) {
Vect position = translateWithOffset(x, y, z, direction, i);
if (!isAirBlock(position) && !world.getBlock(x, y, z).isReplaceable(world, position.x, position.y, position.z)) {
BlockPos position = pos.offset(direction.getFacing(), i);
if (!isAirBlock(world, position) && !BlockUtil.isReplaceableBlock(getBlockState(world, position), world, position)) {
continue;
}
if (isWaterBlock(position)) {
if (isWaterBlock(world, position)) {
continue;
}
boolean isEnclosed = true;
if (world.isAirBlock(position.x + 1, position.y, position.z)) {
if (world.isAirBlock(position.east())) {
isEnclosed = false;
} else if (world.isAirBlock(position.x - 1, position.y, position.z)) {
} else if (world.isAirBlock(position.west())) {
isEnclosed = false;
} else if (world.isAirBlock(position.x, position.y, position.z + 1)) {
} else if (world.isAirBlock(position.south())) {
isEnclosed = false;
} else if (world.isAirBlock(position.x, position.y, position.z - 1)) {
} else if (world.isAirBlock(position.north())) {
isEnclosed = false;
}
isEnclosed = (isEnclosed || moisture != EnumMoisture.DAMP);
if (isEnclosed) {
return trySetWater(position);
return trySetWater(world, position, housing);
}
}
return false;
}
private ItemStack getAvailableLoam() {
private ItemStack getAvailableLoam(IFarmHousing housing) {
EnumMoisture[] moistures;
if (moisture == EnumMoisture.DAMP) {
moistures = new EnumMoisture[]{
EnumMoisture.DAMP,
EnumMoisture.NORMAL,
EnumMoisture.DRY
EnumMoisture.DAMP,
EnumMoisture.NORMAL,
EnumMoisture.DRY
};
} else if (moisture == EnumMoisture.DRY) {
moistures = new EnumMoisture[]{
EnumMoisture.DRY,
EnumMoisture.DAMP,
EnumMoisture.DRY
EnumMoisture.DRY,
EnumMoisture.DAMP,
EnumMoisture.DRY
};
} else {
moistures = new EnumMoisture[]{
EnumMoisture.DRY,
EnumMoisture.NORMAL,
EnumMoisture.DAMP
EnumMoisture.DRY,
EnumMoisture.NORMAL,
EnumMoisture.DAMP
};
}
EnumAcidity[] acidities = {
EnumAcidity.NEUTRAL,
EnumAcidity.ACID,
EnumAcidity.ALKALINE
EnumAcidity.NEUTRAL,
EnumAcidity.ACID,
EnumAcidity.ALKALINE
};
for (EnumMoisture moist : moistures) {
for (EnumAcidity acid : acidities) {
for (Block type : new Block[]{Botany.flowerbed, Botany.loam, Botany.soil}) {
int meta = acid.ordinal() * 3 + moist.ordinal();
ItemStack[] resource = {new ItemStack(type, 1, meta)};
if (housing.getFarmInventory().hasResources(resource)) {
return resource[0];
NonNullList<ItemStack> resources = NonNullList.create();
ItemStack resourceStack = new ItemStack(type, 1, meta);
resources.add(resourceStack);
if (housing.getFarmInventory().hasResources(resources)) {
return resourceStack;
}
}
}
}
if (housing.getFarmInventory().hasResources(new ItemStack[]{new ItemStack(Blocks.dirt)})) {
return new ItemStack(Blocks.dirt);
NonNullList<ItemStack> resources = NonNullList.create();
ItemStack resourceStack = new ItemStack(Blocks.DIRT);
resources.add(resourceStack);
if (housing.getFarmInventory().hasResources(resources)) {
return new ItemStack(Blocks.DIRT);
}
return null;
return ItemStack.EMPTY;
}
private boolean trySetSoil(Vect position) {
return trySetSoil(position, getAvailableLoam());
private boolean trySetSoil(World world, BlockPos position, IFarmHousing housing) {
return trySetSoil(world, position, getAvailableLoam(housing), housing);
}
private boolean trySetSoil(Vect position, ItemStack loam) {
private boolean trySetSoil(World world, BlockPos position, ItemStack loam, IFarmHousing housing) {
ItemStack copy = loam;
if (loam == null) {
if (loam.isEmpty()) {
return false;
}
if (loam.getItem() == Item.getItemFromBlock(Blocks.dirt)) {
loam = new ItemStack(Botany.soil, 0, 4);
if (loam.getItem() == Item.getItemFromBlock(Blocks.DIRT)) {
loam = new ItemStack(Botany.soil, 1, 4);
}
setBlock(position, ((ItemBlock) loam.getItem()).field_150939_a, loam.getItemDamage());
housing.getFarmInventory().removeResources(new ItemStack[]{copy});
setBlock(world, position, ((ItemBlock) loam.getItem()).getBlock(), loam.getItemDamage());
NonNullList<ItemStack> resources = NonNullList.create();
resources.add(copy);
housing.getFarmInventory().removeResources(resources);
return true;
}
private boolean trySetWater(Vect position) {
FluidStack water = Binnie.Liquid.getLiquidStack("water", 1000);
private boolean trySetWater(World world, BlockPos position, IFarmHousing housing) {
FluidStack water = Binnie.LIQUID.getFluidStack(ManagerLiquid.WATER, 1000);
if (moisture == EnumMoisture.DAMP) {
if (!housing.hasLiquid(water)) {
if (water == null || !housing.hasLiquid(water)) {
return false;
}
setBlock(position, Blocks.water, 0);
setBlock(world, position, Blocks.WATER, 0);
housing.removeLiquid(water);
return true;
}
if (moisture != EnumMoisture.DRY) {
return trySetSoil(position);
return trySetSoil(world, position, housing);
}
ItemStack[] sand = {new ItemStack(Blocks.sand, 1)};
if (!housing.getFarmInventory().hasResources(sand)) {
ItemStack sand = new ItemStack(Blocks.SAND, 1);
NonNullList<ItemStack> resources = NonNullList.create();
resources.add(sand);
if (!housing.getFarmInventory().hasResources(resources)) {
return false;
}
setBlock(position, Blocks.sand, 0);
housing.getFarmInventory().removeResources(sand);
setBlock(world, position, Blocks.SAND, 0);
housing.getFarmInventory().removeResources(resources);
return true;
}
private void dropBlockAsProduction(Vect position) {
ItemStack stack = new ItemStack(world.getBlock(position.x, position.y, position.z));
if (stack.getItem() == null) {
return;
}
produce.add(stack);
world.setBlockToAir(position.x, position.y, position.z);
}
@Override
public boolean isAcceptedGermling(ItemStack stack) {
for (IFarmable farmable : farmables) {
if (farmable.isGermling(stack)) {
return true;
}
}
return false;
}
@Override
public Collection<ICrop> harvest(int x, int y, int z, FarmDirection direction, int extent) {
return null;
}
@Override
@SideOnly(Side.CLIENT)
public IIcon getIcon() {
return icon.getIconIndex();
}
public void setIcon(ItemStack icon) {
this.icon = icon;
}
@Override
public ResourceLocation getSpriteSheet() {
return TextureMap.locationBlocksTexture;
public boolean isAcceptedGermling(ItemStack itemstack) {
for (IFarmable farmable : farmables) {
if (farmable.isGermling(itemstack)) {
return true;
}
}
return false;
}
@Override
public Collection<ICrop> harvest(World world, BlockPos pos, FarmDirection direction, int extent) {
if (isManual) {
return Collections.emptyList();
}
return farmables.stream().map(farmable -> farmable.getCropAt(world, pos.up(), world.getBlockState(pos.up())))
.filter(Objects::nonNull).collect(Collectors.toList());
}
@Override
public ResourceLocation getTextureMap() {
return TextureMap.LOCATION_BLOCKS_TEXTURE;
}
@Override
@@ -341,67 +331,68 @@ public class GardenLogic extends FarmLogic {
return name;
}
protected boolean maintainCrops(int x, int y, int z, FarmDirection direction, int extent) {
@Override
public ItemStack getIconItemStack() {
return icon;
}
protected boolean maintainCrops(World world, BlockPos pos, FarmDirection direction, int extent, IFarmHousing housing) {
IGardeningManager gardening = BotanyCore.getGardening();
for (int i = 0; i < extent; ++i) {
Vect position = translateWithOffset(x, y, z, direction, i);
if (isAirBlock(position) || world.getBlock(x, y, z).isReplaceable(world, position.x, position.y, position.z)) {
ItemStack below = getAsItemStack(position.add(new Vect(0, -1, 0)));
if (Gardening.isSoil(below.getItem())) {
return trySetCrop(position);
BlockPos position = pos.offset(direction.getFacing(), i);
if (isAirBlock(world, position) || BlockUtil.isReplaceableBlock(getBlockState(world, position), world, position)) {
ItemStack below = getAsItemStack(world, position.down());
if (gardening.isSoil(below.getItem())) {
return trySetCrop(world, position, housing);
}
}
}
return false;
}
private boolean trySetCrop(Vect position) {
private boolean trySetCrop(World world, BlockPos position, IFarmHousing housing) {
for (IFarmable farmable : farmables) {
boolean success = housing.plantGermling(farmable, world, position.x, position.y, position.z);
if (!success || !(housing instanceof IOwnable)) {
if (!housing.plantGermling(farmable, world, position)) {
continue;
}
TileEntity tile = housing.getWorld().getTileEntity(position.x, position.y, position.z);
if (!(tile instanceof TileEntityFlower)) {
return true;
}
if (housing instanceof IOwnedTile) {
TileEntity tile = world.getTileEntity(position);
if (tile instanceof TileEntityFlower) {
TileEntityFlower flower = (TileEntityFlower) tile;
IOwnedTile owned = (IOwnedTile) housing;
try {
IOwnable housing2 = (IOwnable) housing;
GameProfile prof = (GameProfile) IOwnable.class.getMethod("getOwnerProfile", new Class[0]).invoke(housing2);
((TileEntityFlower) tile).setOwner(prof);
} catch (Exception ex) {
// ignored
flower.setOwner(owned.getOwnerHandler().getOwner());
}
}
return true;
}
return false;
}
public ItemStack getAvailableAcid() {
for (ItemStack stack : Gardening.getAcidFertilisers()) {
if (stack != null && stack.getItem() != null && housing.getFarmInventory().hasResources(new ItemStack[]{stack})) {
return stack;
public ItemStack getAvailableAcid(IFarmHousing housing) {
for (ItemStack stack : BotanyCore.getGardening().getAcidFertilisers()) {
if (!stack.isEmpty()) {
NonNullList<ItemStack> resources = NonNullList.create();
resources.add(stack);
if (housing.getFarmInventory().hasResources(resources)) {
return stack;
}
}
}
return null;
return ItemStack.EMPTY;
}
public ItemStack getAvailableAlkaline() {
for (ItemStack stack : Gardening.getAlkalineFertilisers()) {
if (stack != null && stack.getItem() != null && housing.getFarmInventory().hasResources(new ItemStack[]{stack})) {
return stack;
public ItemStack getAvailableAlkaline(IFarmHousing housing) {
for (ItemStack stack : BotanyCore.getGardening().getAlkalineFertilisers()) {
if (!stack.isEmpty()) {
NonNullList<ItemStack> resources = NonNullList.create();
resources.add(stack);
if (housing.getFarmInventory().hasResources(resources)) {
return stack;
}
}
}
return null;
}
public void setData(EnumMoisture moisture, EnumAcidity acidity, boolean isManual, boolean fertilised, ItemStack icon, String name) {
this.moisture = moisture;
this.acidity = acidity;
this.isManual = isManual;
this.fertilised = fertilised;
this.icon = icon;
this.name = name;
return ItemStack.EMPTY;
}
}
@@ -0,0 +1,9 @@
@ParametersAreNonnullByDefault
@MethodsReturnNonnullByDefault
@FieldsAreNonnullByDefault
package binnie.botany.farm;
import javax.annotation.ParametersAreNonnullByDefault;
import binnie.core.util.FieldsAreNonnullByDefault;
import mcp.MethodsReturnNonnullByDefault;
@@ -1,232 +1,320 @@
package binnie.botany.flower;
import binnie.botany.Botany;
import binnie.botany.api.EnumFlowerStage;
import binnie.botany.api.IFlower;
import binnie.botany.api.IFlowerType;
import binnie.botany.core.BotanyCore;
import binnie.botany.gardening.Gardening;
import binnie.botany.genetics.EnumFlowerType;
import binnie.core.BinnieCore;
import com.mojang.authlib.GameProfile;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import net.minecraft.block.Block;
import net.minecraft.block.BlockContainer;
import net.minecraft.block.material.Material;
import net.minecraft.client.renderer.texture.IIconRegister;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.init.Blocks;
import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.AxisAlignedBB;
import net.minecraft.util.IIcon;
import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
public class BlockFlower extends BlockContainer {
public BlockFlower() {
super(Material.plants);
float f = 0.2f;
setBlockBounds(0.5f - f, 0.0f, 0.5f - f, 0.5f + f, f * 3.0f, 0.5f + f);
setTickRandomly(true);
setBlockName("flower");
setStepSound(Block.soundTypeGrass);
}
@Override
public String getUnlocalizedName() {
return "botany.flower";
}
@Override
public int getRenderType() {
return RendererBotany.renderID;
}
@Override
@SideOnly(Side.CLIENT)
public void registerBlockIcons(IIconRegister register) {
for (EnumFlowerType type : EnumFlowerType.values()) {
type.registerIcons(register);
}
}
@Override
public TileEntity createNewTileEntity(World world, int meta) {
return new TileEntityFlower();
}
@Override
public AxisAlignedBB getCollisionBoundingBoxFromPool(World world, int x, int y, int z) {
return null;
}
@Override
public boolean isOpaqueCube() {
return false;
}
@Override
public boolean renderAsNormalBlock() {
return false;
}
@Override
public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase entity, ItemStack stack) {
super.onBlockPlacedBy(world, x, y, z, entity, stack);
TileEntity flower = world.getTileEntity(x, y, z);
if (!BinnieCore.proxy.isSimulating(world)) {
if (flower != null && flower instanceof TileEntityFlower) {
IFlower f = BotanyCore.getFlowerRoot().getMember(stack);
((TileEntityFlower) flower).setRender(new TileEntityFlower.RenderInfo(f, (TileEntityFlower) flower));
}
return;
}
TileEntity below = world.getTileEntity(x, y - 1, z);
if (flower != null && flower instanceof TileEntityFlower) {
if (below instanceof TileEntityFlower) {
((TileEntityFlower) flower).setSection(((TileEntityFlower) below).getSection());
} else {
GameProfile owner = (entity instanceof EntityPlayer) ? ((EntityPlayer) entity).getGameProfile() : null;
((TileEntityFlower) flower).create(stack, owner);
}
}
Gardening.tryGrowSection(world, x, y, z);
}
@Override
@SideOnly(Side.CLIENT)
public IIcon getIcon(IBlockAccess world, int x, int y, int z, int side) {
TileEntity tile = world.getTileEntity(x, y, z);
if (!(tile instanceof TileEntityFlower)) {
return super.getIcon(world, x, y, z, side);
}
TileEntityFlower f = (TileEntityFlower) tile;
EnumFlowerStage stage = (f.getAge() == 0) ? EnumFlowerStage.SEED : EnumFlowerStage.FLOWER;
IFlowerType flower = f.getType();
int section = f.getRenderSection();
boolean flowered = f.isFlowered();
if (RendererBotany.pass == 0) {
return flower.getStem(stage, flowered, section);
}
return (RendererBotany.pass == 1) ?
flower.getPetalIcon(stage, flowered, section) :
flower.getVariantIcon(stage, flowered, section);
}
@Override
@SideOnly(Side.CLIENT)
public int colorMultiplier(IBlockAccess world, int x, int y, int z) {
TileEntity tile = world.getTileEntity(x, y, z);
if (tile instanceof TileEntityFlower) {
TileEntityFlower f = (TileEntityFlower) tile;
if (RendererBotany.pass == 0) {
return f.getStemColour();
}
return (RendererBotany.pass == 1) ?
f.getPrimaryColor() :
f.getSecondaryColor();
}
return 0xffffff;
}
@Override
public boolean canPlaceBlockAt(World world, int x, int y, int z) {
return super.canPlaceBlockAt(world, x, y, z)
&& canBlockStay(world, x, y, z);
}
protected boolean canPlaceBlockOn(Block block) {
return block == Blocks.grass
|| block == Blocks.dirt
|| block == Blocks.farmland
|| Gardening.isSoil(block);
}
@Override
public void onNeighborBlockChange(World world, int x, int y, int z, Block block) {
super.onNeighborBlockChange(world, x, y, z, block);
checkAndDropBlock(world, x, y, z);
TileEntity tile = world.getTileEntity(x, y, z);
if (!(tile instanceof TileEntityFlower)) {
return;
}
TileEntityFlower flower = (TileEntityFlower) tile;
if (flower.getSection() == 0
&& flower.getFlower() != null
&& flower.getFlower().getAge() > 0
&& flower.getFlower().getGenome().getPrimary().getType().getSections() > 1
&& world.getBlock(x, y + 1, z) != Botany.flower) {
dropBlockAsItem(world, x, y, z, world.getBlockMetadata(x, y, z), 0);
world.setBlockToAir(x, y, z);
}
}
@Override
public void updateTick(World world, int x, int y, int z, Random rand) {
TileEntity tile = world.getTileEntity(x, y, z);
if (tile instanceof TileEntityFlower) {
((TileEntityFlower) tile).randomUpdate(rand);
checkAndDropBlock(world, x, y, z);
return;
}
world.setBlockToAir(x, y, z);
}
protected void checkAndDropBlock(World world, int x, int y, int z) {
if (!canBlockStay(world, x, y, z)) {
dropBlockAsItem(world, x, y, z, world.getBlockMetadata(x, y, z), 0);
world.setBlockToAir(x, y, z);
}
}
@Override
public boolean canBlockStay(World world, int x, int y, int z) {
TileEntity tile = world.getTileEntity(x, y, z);
if (tile instanceof TileEntityFlower && ((TileEntityFlower) tile).getSection() > 0) {
return world.getBlock(x, y - 1, z) == Botany.flower;
}
return canPlaceBlockOn(world.getBlock(x, y - 1, z));
}
@Override
public ArrayList<ItemStack> getDrops(World world, int x, int y, int z, int blockMeta, int fortune) {
ArrayList<ItemStack> drops = new ArrayList<>();
TileEntity tile = world.getTileEntity(x, y, z);
if (tile instanceof TileEntityFlower && ((TileEntityFlower) tile).getSection() == 0) {
ItemStack flower = ((TileEntityFlower) tile).getItemStack();
if (flower != null) {
drops.add(flower);
}
}
return drops;
}
@Override
public boolean removedByPlayer(World world, EntityPlayer player, int x, int y, int z, boolean willHarvest) {
List<ItemStack> drops = getDrops(world, x, y, z, world.getBlockMetadata(x, y, z), 0);
boolean hasBeenBroken = world.setBlockToAir(x, y, z);
if (hasBeenBroken && BinnieCore.proxy.isSimulating(world) && drops.size() > 0 && (player == null || !player.capabilities.isCreativeMode)) {
for (ItemStack drop : drops) {
dropBlockAsItem(world, x, y, z, drop);
}
}
return hasBeenBroken;
}
@Override
@SideOnly(Side.CLIENT)
public IIcon getIcon(int meta, int side) {
return Blocks.yellow_flower.getIcon(0, 0);
}
}
package binnie.botany.flower;
import javax.annotation.Nullable;
import java.util.List;
import java.util.Random;
import net.minecraft.block.Block;
import net.minecraft.block.BlockContainer;
import net.minecraft.block.SoundType;
import net.minecraft.block.material.Material;
import net.minecraft.block.properties.PropertyBool;
import net.minecraft.block.properties.PropertyInteger;
import net.minecraft.block.state.BlockStateContainer;
import net.minecraft.block.state.IBlockState;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.init.Blocks;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.BlockRenderLayer;
import net.minecraft.util.EnumBlockRenderType;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.EnumHand;
import net.minecraft.util.NonNullList;
import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World;
import com.mojang.authlib.GameProfile;
import net.minecraftforge.client.model.ModelLoader;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import forestry.api.core.IStateMapperRegister;
import forestry.core.blocks.IColoredBlock;
import binnie.botany.Botany;
import binnie.botany.api.IFlower;
import binnie.botany.api.IFlowerGenome;
import binnie.botany.api.IFlowerRoot;
import binnie.botany.api.IFlowerType;
import binnie.botany.core.BotanyCore;
import binnie.botany.genetics.EnumFlowerType;
import binnie.botany.genetics.FlowerDefinition;
import binnie.botany.network.PacketID;
import binnie.core.BinnieCore;
import binnie.core.network.packet.MessageNBT;
import binnie.core.util.TileUtil;
public class BlockFlower extends BlockContainer implements IColoredBlock, IStateMapperRegister {
public static final AxisAlignedBB FLOWER_BLOCK_AABB = new AxisAlignedBB(0.3D, 0.0D, 0.3D, 0.7D, 0.6D, 0.7D);
/* PROPERTIES */
public static final PropertyFlower FLOWER = new PropertyFlower("flower", IFlowerType.class);
public static final PropertyInteger SECTION = PropertyInteger.create("section", 0, EnumFlowerType.highestSection - 1);
public static final PropertyBool FLOWERED = PropertyBool.create("flowered");
public static final PropertyBool SEED = PropertyBool.create("seed");
public BlockFlower() {
super(Material.PLANTS);
setTickRandomly(true);
setRegistryName("flower");
setSoundType(SoundType.PLANT);
}
@Override
public TileEntity createNewTileEntity(World world, int meta) {
return new TileEntityFlower();
}
@Override
@SideOnly(Side.CLIENT)
public void registerStateMapper() {
ModelLoader.setCustomStateMapper(this, new StateMapperFlower());
}
@Override
public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ) {
ItemStack heldItem = player.getHeldItemMainhand();
if (heldItem.isEmpty() || heldItem.getItem() != BinnieCore.getFieldKit() || !player.isSneaking()) {
return false;
}
if (world.isRemote) {
return true;
}
TileEntity tile = world.getTileEntity(pos);
if (!(tile instanceof TileEntityFlower)) {
return true;
}
TileEntityFlower tileFlower = (TileEntityFlower) tile;
IFlower flower = tileFlower.getFlower();
if (flower == null) {
return true;
}
IFlowerGenome flowerGenome = flower.getGenome();
NBTTagCompound info = new NBTTagCompound();
info.setString("Species", flowerGenome.getPrimary().getUID());
info.setString("Species2", flowerGenome.getSecondary().getUID());
info.setFloat("Age", flower.getAge() / flowerGenome.getLifespan());
info.setShort("Colour", (short) flowerGenome.getPrimaryColor().getID());
info.setShort("Colour2", (short) flowerGenome.getSecondaryColor().getID());
info.setBoolean("Wilting", flower.isWilted());
info.setBoolean("Flowered", flower.hasFlowered());
Botany.proxy.sendToPlayer(new MessageNBT(PacketID.FIELDKIT.ordinal(), info), player);
heldItem.damageItem(1, player);
return true;
}
@Override
@Nullable
public AxisAlignedBB getCollisionBoundingBox(IBlockState blockState, IBlockAccess worldIn, BlockPos pos) {
return null;
}
@Override
public AxisAlignedBB getBoundingBox(IBlockState state, IBlockAccess source, BlockPos pos) {
TileEntity tile = source.getTileEntity(pos);
if (tile instanceof TileEntityFlower) {
TileEntityFlower flower = (TileEntityFlower) tile;
if (flower.getType().getSections() > 1) {
return FULL_BLOCK_AABB;
}
}
return FLOWER_BLOCK_AABB;
}
@Override
public AxisAlignedBB getSelectedBoundingBox(IBlockState state, World world, BlockPos pos) {
TileEntity tile = world.getTileEntity(pos);
if (tile instanceof TileEntityFlower) {
TileEntityFlower flower = (TileEntityFlower) tile;
if (flower.getType().getSections() > 1) {
return FULL_BLOCK_AABB.offset(pos);
}
}
return FLOWER_BLOCK_AABB.offset(pos);
}
@Override
public boolean isOpaqueCube(IBlockState state) {
return false;
}
@Override
public boolean isFullCube(IBlockState state) {
return false;
}
@Override
public void onBlockPlacedBy(World world, BlockPos pos, IBlockState state, EntityLivingBase placer, ItemStack stack) {
super.onBlockPlacedBy(world, pos, state, placer, stack);
IFlowerRoot flowerRoot = BotanyCore.getFlowerRoot();
TileEntity flower = world.getTileEntity(pos);
if (!BinnieCore.getBinnieProxy().isSimulating(world)) {
if (flower != null && flower instanceof TileEntityFlower) {
IFlower f = flowerRoot.getMember(stack);
if (f != null) {
((TileEntityFlower) flower).setRender(new TileEntityFlower.RenderInfo(f, (TileEntityFlower) flower));
}
}
return;
}
TileEntity below = world.getTileEntity(pos.down());
if (flower != null && flower instanceof TileEntityFlower) {
if (below instanceof TileEntityFlower) {
((TileEntityFlower) flower).setSection(((TileEntityFlower) below).getSection());
} else {
GameProfile owner = (placer instanceof EntityPlayer) ? ((EntityPlayer) placer).getGameProfile() : null;
((TileEntityFlower) flower).create(stack, owner);
}
}
flowerRoot.tryGrowSection(world, pos);
}
@Override
@SideOnly(Side.CLIENT)
public int colorMultiplier(IBlockState state, @Nullable IBlockAccess world, @Nullable BlockPos pos, int tintIndex) {
if (world != null && pos != null) {
TileEntity tile = world.getTileEntity(pos);
if (tile instanceof TileEntityFlower) {
TileEntityFlower flower = (TileEntityFlower) tile;
if (tintIndex == 0) {
return flower.getStemColour();
} else if (tintIndex == 1) {
return flower.getPrimaryColour();
}
return flower.getSecondaryColour();
}
}
return 0xffffff;
}
@Override
public boolean canPlaceBlockAt(World world, BlockPos pos) {
return super.canPlaceBlockAt(world, pos) && canBlockStay(world, pos);
}
public boolean canBlockStay(World world, BlockPos pos) {
TileEntity tile = world.getTileEntity(pos);
IBlockState downState = world.getBlockState(pos.down());
if (tile instanceof TileEntityFlower && ((TileEntityFlower) tile).getSection() > 0) {
return downState.getBlock() == Botany.flower;
}
return canPlaceBlockOn(downState.getBlock());
}
protected boolean canPlaceBlockOn(Block block) {
return block == Blocks.GRASS
|| block == Blocks.DIRT
|| block == Blocks.FARMLAND
|| BotanyCore.getGardening().isSoil(block);
}
@Override
@SideOnly(Side.CLIENT)
public EnumBlockRenderType getRenderType(IBlockState state) {
return EnumBlockRenderType.MODEL;
}
@Override
@SideOnly(Side.CLIENT)
public EnumOffsetType getOffsetType() {
return EnumOffsetType.XZ;
}
@Override
@SideOnly(Side.CLIENT)
public IBlockState getActualState(IBlockState state, IBlockAccess world, BlockPos pos) {
TileEntityFlower flower = TileUtil.getTile(world, pos, TileEntityFlower.class);
if (flower != null && flower.getType() != null) {
state = state.withProperty(FLOWER, flower.getType());
state = state.withProperty(FLOWERED, flower.isFlowered());
state = state.withProperty(SECTION, flower.getRenderSection());
state = state.withProperty(SEED, flower.getAge() == 0);
} else {
state = state.withProperty(FLOWER, FlowerDefinition.Dandelion.getSpecies().getType());
state = state.withProperty(FLOWERED, false);
state = state.withProperty(SEED, false);
}
return state;
}
@Override
protected BlockStateContainer createBlockState() {
return new BlockStateContainer(this, FLOWER, FLOWERED, SECTION, SEED);
}
@Override
public int getMetaFromState(IBlockState state) {
return 0;
}
@Override
public BlockRenderLayer getBlockLayer() {
return BlockRenderLayer.CUTOUT;
}
@Override
public void neighborChanged(IBlockState state, World worldIn, BlockPos pos, Block blockIn, BlockPos fromPos) {
checkAndDropBlock(worldIn, pos);
TileEntity tile = worldIn.getTileEntity(pos);
if (tile instanceof TileEntityFlower) {
TileEntityFlower flower = (TileEntityFlower) tile;
if (flower.getSection() == 0 && flower.getFlower() != null && flower.getFlower().getAge() > 0 && flower.getFlower().getGenome().getPrimary().getType().getSections() > 1 && worldIn.getBlockState(pos.up()).getBlock() != Botany.flower) {
dropBlockAsItem(worldIn, pos, worldIn.getBlockState(pos), 0);
worldIn.setBlockToAir(pos);
}
}
}
@Override
public void updateTick(World world, BlockPos pos, IBlockState state, Random rand) {
TileEntity tile = world.getTileEntity(pos);
if (tile instanceof TileEntityFlower) {
((TileEntityFlower) tile).randomUpdate(rand);
checkAndDropBlock(world, pos);
return;
}
world.setBlockToAir(pos);
}
protected void checkAndDropBlock(World world, BlockPos pos) {
if (!canBlockStay(world, pos)) {
dropBlockAsItem(world, pos, world.getBlockState(pos), 0);
world.setBlockToAir(pos);
}
}
@Override
public NonNullList<ItemStack> getDrops(IBlockAccess world, BlockPos pos, IBlockState state, int fortune) {
NonNullList<ItemStack> drops = NonNullList.create();
TileEntity tile = world.getTileEntity(pos);
if (tile instanceof TileEntityFlower && ((TileEntityFlower) tile).getSection() == 0) {
ItemStack flower = ((TileEntityFlower) tile).getItemStack();
if (!flower.isEmpty()) {
drops.add(flower);
}
}
return drops;
}
@Override
public boolean removedByPlayer(IBlockState state, World world, BlockPos pos, EntityPlayer player, boolean willHarvest) {
List<ItemStack> drops = getDrops(world, pos, world.getBlockState(pos), 0);
boolean hasBeenBroken = world.setBlockToAir(pos);
if (hasBeenBroken && BinnieCore.getBinnieProxy().isSimulating(world) && drops.size() > 0 && (player == null || !player.capabilities.isCreativeMode)) {
for (ItemStack drop : drops) {
spawnAsEntity(world, pos, drop);
}
}
return hasBeenBroken;
}
}
@@ -0,0 +1,60 @@
package binnie.botany.flower;
import net.minecraft.init.Blocks;
import net.minecraft.item.ItemStack;
import binnie.core.util.I18N;
enum EnumTubeInsulate {
CLAY(0xa1aacc, "clay"),
COBBLE(0x7b7b7b, "cobblestone"),
SAND(0xefeab5, "sandstone"),
HARDENED_CLAY(0x935c43, "hardened_clay"),
STONE(0x6d6d6d, "stone"),
SANDSTONE(0xc1b989, "sandstone");
public static final EnumTubeInsulate[] VALUES = values();
int color;
String name;
EnumTubeInsulate(int color, String name) {
this.color = color;
this.name = name;
}
public static EnumTubeInsulate get(int meta) {
return VALUES[meta / 128 % VALUES.length];
}
public int getColor() {
return color;
}
public String getDisplayName() {
return I18N.localise("botany.tube.insulate." + name + ".name");
}
public ItemStack getStack() {
switch (this) {
case CLAY:
return new ItemStack(Blocks.CLAY);
case COBBLE:
return new ItemStack(Blocks.COBBLESTONE);
case HARDENED_CLAY:
return new ItemStack(Blocks.HARDENED_CLAY);
case SAND:
return new ItemStack(Blocks.SAND);
case SANDSTONE:
return new ItemStack(Blocks.SANDSTONE);
case STONE:
return new ItemStack(Blocks.STONE);
}
throw new IllegalStateException("Unknown insulated tube type: " + this);
}
}
@@ -0,0 +1,32 @@
package binnie.botany.flower;
import binnie.core.util.I18N;
enum EnumTubeMaterial {
COPPER(0xe3b78e, "copper"),
TIN(0xe1eef4, "tin"),
BRONZE(0xddc276, "bronze"),
IRON(0xd8d8d8, "iron");
public static final EnumTubeMaterial[] VALUES = values();
int color;
String name;
EnumTubeMaterial(int color, String name) {
this.color = color;
this.name = name;
}
public static EnumTubeMaterial get(int meta) {
return VALUES[meta % VALUES.length];
}
public int getColor() {
return color;
}
public String getDisplayName() {
return I18N.localise("botany.tube.material." + name + ".name");
}
}
@@ -0,0 +1,96 @@
package binnie.botany.flower;
import javax.annotation.Nullable;
import java.util.HashMap;
import java.util.Map;
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import binnie.Binnie;
import binnie.botany.Botany;
import binnie.botany.api.IFlowerType;
import binnie.core.resource.BinnieSprite;
public class FlowerSpriteManager {
private static final Map<IFlowerType, FlowerSprites> flowerSprites = new HashMap<>();
public static void initSprites(IFlowerType type) {
if (flowerSprites.containsKey(type)) {
return;
}
flowerSprites.put(type, new FlowerSprites(type));
}
@Nullable
@SideOnly(Side.CLIENT)
public static TextureAtlasSprite getStem(IFlowerType type, int section, boolean flowered) {
FlowerSprites flower = flowerSprites.get(type);
if (flower == null) {
return null;
}
return flower.getStem(type, section, flowered);
}
@Nullable
@SideOnly(Side.CLIENT)
public static TextureAtlasSprite getPetal(IFlowerType type, int section, boolean flowered) {
FlowerSprites flower = flowerSprites.get(type);
if (flower == null) {
return null;
}
return flower.getPetal(type, section, flowered);
}
@Nullable
@SideOnly(Side.CLIENT)
public static TextureAtlasSprite getVariant(IFlowerType type, int section, boolean flowered) {
FlowerSprites flower = flowerSprites.get(type);
if (flower == null) {
return null;
}
return flower.getVariant(type, section, flowered);
}
private static class FlowerSprites {
private BinnieSprite[] stem;
private BinnieSprite[] variant;
private BinnieSprite[] petal;
private BinnieSprite[] unflowered;
private int sections;
public FlowerSprites(IFlowerType type) {
sections = type.getSections();
stem = new BinnieSprite[sections];
petal = new BinnieSprite[sections];
variant = new BinnieSprite[sections];
unflowered = new BinnieSprite[sections];
for (int section = 0; section < sections; ++section) {
String suf = (section == 0) ? "" : ("" + (section + 1));
String pre = (sections == 1) ? "" : "double/";
stem[section] = Binnie.RESOURCE.getBlockSprite(Botany.instance, "flowers/" + pre + type.toString().toLowerCase() + suf + ".0");
petal[section] = Binnie.RESOURCE.getBlockSprite(Botany.instance, "flowers/" + pre + type.toString().toLowerCase() + suf + ".1");
variant[section] = Binnie.RESOURCE.getBlockSprite(Botany.instance, "flowers/" + pre + type.toString().toLowerCase() + suf + ".2");
unflowered[section] = Binnie.RESOURCE.getBlockSprite(Botany.instance, "flowers/" + pre + type.toString().toLowerCase() + suf + ".3");
}
}
@SideOnly(Side.CLIENT)
public TextureAtlasSprite getStem(IFlowerType type, int section, boolean flowered) {
return stem[section % sections].getSprite();
}
@SideOnly(Side.CLIENT)
public TextureAtlasSprite getPetal(IFlowerType type, int section, boolean flowered) {
return (flowered ? petal[section % sections] : unflowered[section % sections]).getSprite();
}
@Nullable
@SideOnly(Side.CLIENT)
public TextureAtlasSprite getVariant(IFlowerType type, int section, boolean flowered) {
return flowered ? variant[section % sections].getSprite() : null;
}
}
}
+154 -187
View File
@@ -1,50 +1,68 @@
package binnie.botany.flower;
import com.google.common.base.Preconditions;
import javax.annotation.Nullable;
import java.util.List;
import net.minecraft.block.Block;
import net.minecraft.block.SoundType;
import net.minecraft.block.state.IBlockState;
import net.minecraft.client.gui.GuiScreen;
import net.minecraft.client.renderer.ItemMeshDefinition;
import net.minecraft.client.renderer.block.model.ModelResourceLocation;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.Item;
import net.minecraft.item.ItemBlock;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.EnumActionResult;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.EnumHand;
import net.minecraft.util.NonNullList;
import net.minecraft.util.SoundCategory;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.text.TextFormatting;
import net.minecraft.world.World;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import forestry.api.core.IItemModelRegister;
import forestry.api.core.IModelManager;
import forestry.api.genetics.IIndividual;
import forestry.api.genetics.IPollinatable;
import forestry.core.config.Config;
import forestry.core.items.IColoredItem;
import binnie.Binnie;
import binnie.botany.Botany;
import binnie.botany.CreativeTabBotany;
import binnie.botany.api.EnumFlowerChromosome;
import binnie.botany.api.EnumFlowerStage;
import binnie.botany.api.IAlleleFlowerSpecies;
import binnie.botany.api.IFlower;
import binnie.botany.api.IFlowerColor;
import binnie.botany.api.IFlowerGenome;
import binnie.botany.api.IFlowerType;
import binnie.botany.core.BotanyCore;
import binnie.botany.genetics.EnumFlowerType;
import binnie.botany.genetics.Flower;
import binnie.core.BinnieCore;
import binnie.core.util.I18N;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import forestry.api.genetics.IIndividual;
import forestry.api.genetics.IPollinatable;
import forestry.core.config.Config;
import net.minecraft.block.Block;
import net.minecraft.client.renderer.texture.IIconRegister;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.init.Blocks;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.EnumChatFormatting;
import net.minecraft.util.IIcon;
import net.minecraft.world.World;
import java.util.List;
public class ItemBotany extends Item implements IColoredItem, IItemModelRegister {
private EnumFlowerStage type;
private String tag;
public abstract class ItemBotany extends Item {
public ItemBotany(String name) {
public ItemBotany(String name, EnumFlowerStage type, String tag) {
this.type = type;
this.tag = tag;
setCreativeTab(CreativeTabBotany.instance);
setUnlocalizedName(name);
setRegistryName(name);
hasSubtypes = true;
}
@Override
@SideOnly(Side.CLIENT)
public int getSpriteNumber() {
return 0;
}
@Override
public boolean isDamageable() {
return false;
@@ -61,229 +79,178 @@ public abstract class ItemBotany extends Item {
}
@Override
public boolean hasEffect(ItemStack stack, int pass) {
if (!stack.hasTagCompound()) {
public boolean hasEffect(ItemStack itemstack) {
if (!itemstack.hasTagCompound()) {
return false;
}
IIndividual individual = getIndividual(stack);
return individual != null
&& individual.getGenome() != null
&& individual.hasEffect();
}
@Override
public void addInformation(ItemStack itemstack, EntityPlayer player, List tooltip, boolean flag) {
if (!itemstack.hasTagCompound()) {
return;
}
IFlower individual = (IFlower) getIndividual(itemstack);
if (individual == null) {
tooltip.add(I18N.localise("botany.item.tooltip.bugged"));
return;
}
IFlowerGenome genome = individual.getGenome();
IFlowerColor primaryColor = genome.getPrimaryColor();
IFlowerColor secondColor = genome.getSecondaryColor();
IFlowerColor stemColor = genome.getStemColor();
if (primaryColor == secondColor) {
tooltip.add(EnumChatFormatting.YELLOW + I18N.localise("botany.item.tooltip.flowerColor1", primaryColor.getName(), stemColor.getName()));
} else {
tooltip.add(EnumChatFormatting.YELLOW + I18N.localise("botany.item.tooltip.flowerColor2", primaryColor.getName(), secondColor.getName(), stemColor.getName()));
}
if (individual.isAnalyzed()) {
if (BinnieCore.proxy.isShiftDown()) {
individual.addTooltip(tooltip);
} else {
tooltip.add(EnumChatFormatting.GRAY + I18N.localise("botany.item.tooltip.holdMore"));
}
} else {
tooltip.add(I18N.localise("botany.item.tooltip.unknownGenome"));
}
IIndividual individual = getIndividual(itemstack);
return individual != null && individual.hasEffect();
}
@Override
@SideOnly(Side.CLIENT)
public void registerIcons(IIconRegister par1IconRegister) {
public void addInformation(ItemStack itemStack, EntityPlayer player, List<String> list, boolean flag) {
IFlower individual = (IFlower) getIndividual(itemStack);
if (individual == null) {
list.add(TextFormatting.DARK_RED + I18N.localise("item.botany.flower.destroy"));
return;
}
IFlowerGenome genome = individual.getGenome();
//Colors
String primaryColor = genome.getPrimaryColor().getColorName();
String secondaryColor = genome.getSecondaryColor().getColorName();
String stemColor = genome.getStemColor().getColorName();
String colorInfo;
if (!primaryColor.equals(secondaryColor)) {
colorInfo = I18N.localise("item.botany.grammar.flower.secondary");
} else {
colorInfo = I18N.localise("item.botany.grammar.flower");
}
list.add(TextFormatting.YELLOW + colorInfo.replaceAll("%PRIMARY", primaryColor).replaceAll("%SECONDARY", secondaryColor).replaceAll("%STEM", stemColor));
if (individual.isAnalyzed()) {
if (GuiScreen.isShiftKeyDown()) {
individual.addTooltip(list);
} else {
list.add(TextFormatting.ITALIC + "<" + I18N.localise("for.gui.tooltip.tmi") + ">");
}
} else {
list.add("<" + I18N.localise("for.gui.unknown") + ">");
}
}
@Nullable
protected IIndividual getIndividual(ItemStack itemstack) {
return new Flower(itemstack.getTagCompound());
NBTTagCompound tagCompound = itemstack.getTagCompound();
if (tagCompound == null) {
return null;
}
return new Flower(tagCompound);
}
private IAlleleFlowerSpecies getPrimarySpecies(ItemStack itemstack) {
IFlower tree = BotanyCore.getFlowerRoot().getMember(itemstack);
if (tree == null) {
return (IAlleleFlowerSpecies) BotanyCore.getFlowerRoot().getDefaultTemplate()[EnumFlowerChromosome.SPECIES.ordinal()];
}
return tree.getGenome().getPrimary();
}
@Override
public String getItemStackDisplayName(ItemStack itemstack) {
if (!itemstack.hasTagCompound()) {
return I18N.localise("botany.item.tooltip.unknown");
return I18N.localise("item.botany.flower.corrupted.name");
}
IIndividual individual = getIndividual(itemstack);
if (individual != null && individual.getGenome() != null) {
String tag = getTag();
if (tag == null || tag.isEmpty()) {
return individual.getDisplayName();
}
return I18N.localise("botany.item.botany.name", individual.getDisplayName(), tag);
if (individual != null) {
return individual.getDisplayName() + (!tag.isEmpty() ? " " + I18N.localise("item.botany." + tag + ".name") : "");
}
return I18N.localise("botany.item.flowerCorrupted.name");
return I18N.localise("item.botany.flower.corrupted.name");
}
@Override
public void getSubItems(Item item, CreativeTabs par2CreativeTabs, List itemList) {
public void getSubItems(Item item, CreativeTabs tab, NonNullList<ItemStack> itemList) {
addCreativeItems(itemList, true);
}
public void addCreativeItems(List itemList, boolean hideSecrets) {
for (IIndividual individual : BotanyCore.speciesRoot.getIndividualTemplates()) {
public void addCreativeItems(NonNullList<ItemStack> itemList, boolean hideSecrets) {
for (IIndividual individual : BotanyCore.getFlowerRoot().getIndividualTemplates()) {
if (hideSecrets && individual.isSecret() && !Config.isDebug) {
continue;
}
itemList.add(BotanyCore.speciesRoot.getMemberStack(individual.copy(), getStage().ordinal()));
itemList.add(BotanyCore.getFlowerRoot().getMemberStack(individual.copy(), type));
}
}
@Override
public int getColorFromItemStack(ItemStack itemstack, int renderPass) {
IFlower flower = BotanyCore.speciesRoot.getMember(itemstack);
if (flower == null || flower.getGenome() == null) {
public int getColorFromItemstack(ItemStack stack, int tintIndex) {
IFlower flower = BotanyCore.getFlowerRoot().getMember(stack);
if (flower == null) {
return 0xffffff;
}
if (renderPass == 0) {
if (tintIndex == 0) {
return flower.getGenome().getStemColor().getColor(flower.isWilted());
}
return (renderPass == 1) ?
flower.getGenome().getPrimaryColor().getColor(flower.isWilted()) :
flower.getGenome().getSecondaryColor().getColor(flower.isWilted());
}
@Override
public boolean requiresMultipleRenderPasses() {
return true;
}
@Override
public int getRenderPasses(int metadata) {
return 3;
return (tintIndex == 1)
? flower.getGenome().getPrimaryColor().getColor(flower.isWilted())
: flower.getGenome().getSecondaryColor().getColor(flower.isWilted());
}
@Override
@SideOnly(Side.CLIENT)
public IIcon getIcon(ItemStack itemstack, int renderPass) {
IFlower flower = BotanyCore.speciesRoot.getMember(itemstack);
if (flower == null || flower.getGenome() == null || flower.getGenome().getPrimary() == null) {
return EnumFlowerType.ALLIUM.getBlank();
public void registerModel(Item item, IModelManager manager) {
for (IFlowerType flowerType : (List<IFlowerType>) BlockFlower.FLOWER.getAllowedValues()) {
flowerType.registerModels(item, manager, type);
}
IFlowerType type = flower.getGenome().getPrimary().getType();
if (renderPass == 0) {
return type.getStem(getStage(), flower.hasFlowered(), type.getSections() - 1);
}
if (renderPass == 1) {
return type.getPetalIcon(getStage(), flower.hasFlowered(), type.getSections() - 1);
}
return type.getVariantIcon(getStage(), flower.hasFlowered(), type.getSections() - 1);
manager.registerItemModel(item, new BotanyMeshDefinition());
}
@Override
public boolean onItemUse(ItemStack itemstack, EntityPlayer player, World world, int x, int y, int z, int side, float px, float py, float pz) {
if (getStage() == EnumFlowerStage.POLLEN) {
IFlower flower = Binnie.Genetics.getFlowerRoot().getMember(itemstack);
TileEntity target = world.getTileEntity(x, y, z);
public EnumActionResult onItemUse(EntityPlayer player, World world, BlockPos pos, EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ) {
ItemStack stack = player.getHeldItem(hand);
if (type == EnumFlowerStage.POLLEN) {
IFlower flower = Binnie.GENETICS.getFlowerRoot().getMember(stack);
TileEntity target = world.getTileEntity(pos);
if (!(target instanceof IPollinatable)) {
return false;
return EnumActionResult.PASS;
}
IPollinatable pollinatable = (IPollinatable) target;
if (!pollinatable.canMateWith(flower)) {
return false;
return EnumActionResult.FAIL;
}
pollinatable.mateWith(flower);
if (!player.capabilities.isCreativeMode) {
itemstack.stackSize--;
stack.shrink(1);
}
return true;
return EnumActionResult.SUCCESS;
}
Block blockFlower = Botany.flower;
Block blockAlreadyThere = world.getBlock(x, y, z);
if (blockAlreadyThere == Blocks.snow_layer && (world.getBlockMetadata(x, y, z) & 0x7) < 1) {
side = 1;
} else if (blockAlreadyThere != Blocks.vine && blockAlreadyThere != Blocks.tallgrass && blockAlreadyThere != Blocks.deadbush && !blockAlreadyThere.isReplaceable(world, x, y, z)) {
if (side == 0) {
y--;
} else if (side == 1) {
y++;
} else if (side == 2) {
z--;
} else if (side == 3) {
z++;
} else if (side == 4) {
x--;
} else if (side == 5) {
x++;
}
IBlockState iblockstate = world.getBlockState(pos);
Block block = iblockstate.getBlock();
if (!block.isReplaceable(world, pos)) {
pos = pos.offset(facing);
}
if (itemstack.stackSize == 0 || !player.canPlayerEdit(x, y, z, side, itemstack)) {
return false;
}
if (y == 255 && blockFlower.getMaterial().isSolid()) {
return false;
}
if (stack.getCount() != 0 && player.canPlayerEdit(pos, facing, stack) && world.mayPlace(Botany.flower, pos, false, facing, null)) {
int i = getMetadata(stack.getMetadata());
IBlockState iblockstate1 = Botany.flower.getStateForPlacement(world, pos, facing, hitX, hitY, hitZ, i, player, hand);
if (world.canPlaceEntityOnSide(blockFlower, x, y, z, false, side, player, itemstack)) {
int i1 = getMetadata(itemstack.getItemDamage());
int j1 = blockFlower.onBlockPlaced(world, x, y, z, side, px, py, pz, i1);
if (placeBlockAt(itemstack, player, world, x, y, z, side, px, py, pz, j1)) {
world.playSoundEffect(x + 0.5f, y + 0.5f, z + 0.5f, blockFlower.stepSound.func_150496_b(), (blockFlower.stepSound.getVolume() + 1.0f) / 2.0f, blockFlower.stepSound.getPitch() * 0.8f);
itemstack.stackSize--;
if (placeBlockAt(stack, player, world, pos, facing, hitX, hitY, hitZ, iblockstate1)) {
SoundType soundtype = world.getBlockState(pos).getBlock().getSoundType(world.getBlockState(pos), world, pos, player);
world.playSound(player, pos, soundtype.getPlaceSound(), SoundCategory.BLOCKS, (soundtype.getVolume() + 1.0F) / 2.0F, soundtype.getPitch() * 0.8F);
stack.shrink(1);
}
return true;
return EnumActionResult.SUCCESS;
}
return false;
return EnumActionResult.FAIL;
}
@SideOnly(Side.CLIENT)
public boolean func_150936_a(World world, int x, int y, int z, int side, EntityPlayer player, ItemStack stack) {
Block field_150939_a = Botany.flower;
Block block = world.getBlock(x, y, z);
if (block == Blocks.snow_layer) {
side = 1;
} else if (block != Blocks.vine && block != Blocks.tallgrass && block != Blocks.deadbush && !block.isReplaceable(world, x, y, z)) {
if (side == 0) {
y--;
} else if (side == 1) {
y++;
} else if (side == 2) {
z--;
} else if (side == 3) {
z++;
} else if (side == 4) {
x--;
} else if (side == 5) {
x++;
}
}
return world.canPlaceEntityOnSide(field_150939_a, x, y, z, false, side, null, stack);
}
public boolean placeBlockAt(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int side, float hitX, float hitY, float hitZ, int metadata) {
Block block = Botany.flower;
if (!world.setBlock(x, y, z, block, metadata, 3)) {
public boolean placeBlockAt(ItemStack stack, EntityPlayer player, World world, BlockPos pos, EnumFacing side, float hitX, float hitY, float hitZ, IBlockState newState) {
if (!world.setBlockState(pos, newState, 3)) {
return false;
}
if (world.getBlock(x, y, z) == block) {
block.onBlockPlacedBy(world, x, y, z, player, stack);
block.onPostBlockPlaced(world, x, y, z, metadata);
IBlockState state = world.getBlockState(pos);
if (state.getBlock() == Botany.flower) {
ItemBlock.setTileEntityNBT(world, player, pos, stack);
Botany.flower.onBlockPlacedBy(world, pos, state, player, stack);
}
return true;
}
public abstract EnumFlowerStage getStage();
public abstract String getTag();
@SideOnly(Side.CLIENT)
private class BotanyMeshDefinition implements ItemMeshDefinition {
@Override
public ModelResourceLocation getModelLocation(ItemStack stack) {
IFlower flower = BotanyCore.getFlowerRoot().getMember(stack);
Preconditions.checkNotNull(flower);
IAlleleFlowerSpecies flowerSpecies = flower.getGenome().getPrimary();
IFlowerType flowerType = flowerSpecies.getType();
return flowerSpecies.getFlowerModel(type, flower.hasFlowered());
}
}
}
@@ -1,19 +0,0 @@
package binnie.botany.flower;
import binnie.botany.api.EnumFlowerStage;
public class ItemFlower extends ItemBotany {
public ItemFlower() {
super("itemFlower");
}
@Override
public EnumFlowerStage getStage() {
return EnumFlowerStage.FLOWER;
}
@Override
public String getTag() {
return "";
}
}
@@ -1,167 +1,121 @@
package binnie.botany.flower;
import binnie.botany.Botany;
import binnie.botany.CreativeTabBotany;
import binnie.core.util.I18N;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import net.minecraft.client.renderer.texture.IIconRegister;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.init.Blocks;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.util.IIcon;
import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.Multimap;
import java.util.Collection;
import java.util.List;
public class ItemInsulatedTube extends Item {
IIcon[] icons;
import net.minecraft.client.gui.GuiScreen;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.util.NonNullList;
import net.minecraft.util.text.TextFormatting;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import forestry.api.circuits.ChipsetManager;
import forestry.api.circuits.ICircuit;
import forestry.api.circuits.ICircuitLayout;
import forestry.api.core.IModelManager;
import forestry.core.circuits.SolderManager;
import forestry.core.items.IColoredItem;
import forestry.core.utils.Translator;
import binnie.botany.CreativeTabBotany;
import binnie.core.item.ItemCore;
import binnie.core.util.I18N;
public class ItemInsulatedTube extends ItemCore implements IColoredItem {
public ItemInsulatedTube() {
icons = new IIcon[3];
setUnlocalizedName("insulatedTube");
super("insulated_tube");
setUnlocalizedName("botany.insulated_tube");
setCreativeTab(CreativeTabBotany.instance);
setHasSubtypes(true);
}
private static Multimap<ICircuitLayout, ICircuit> getCircuits(ItemStack itemStack) {
Multimap<ICircuitLayout, ICircuit> circuits = ArrayListMultimap.create();
Collection<ICircuitLayout> allLayouts = ChipsetManager.circuitRegistry.getRegisteredLayouts().values();
for (ICircuitLayout circuitLayout : allLayouts) {
ICircuit circuit = SolderManager.getCircuit(circuitLayout, itemStack);
if (circuit != null) {
circuits.put(circuitLayout, circuit);
}
}
return circuits;
}
public static String getInsulate(ItemStack stack) {
return EnumTubeInsulate.get(stack.getItemDamage()).getDisplayName();
}
public static ItemStack getInsulateStack(ItemStack stack) {
return Insulate.get(stack.getItemDamage()).getStack();
return EnumTubeInsulate.get(stack.getItemDamage()).getStack();
}
@Override
@SideOnly(Side.CLIENT)
public void getSubItems(Item item, CreativeTabs tab, List list) {
for (Material mat : Material.values()) {
for (Insulate ins : Insulate.values()) {
list.add(new ItemStack(this, 1, mat.ordinal() + ins.ordinal() * 128));
public void getSubItems(Item item, CreativeTabs tab, NonNullList<ItemStack> subItems) {
for (EnumTubeMaterial mat : EnumTubeMaterial.values()) {
for (EnumTubeInsulate ins : EnumTubeInsulate.values()) {
subItems.add(new ItemStack(this, 1, mat.ordinal() + ins.ordinal() * 128));
}
}
}
@SideOnly(Side.CLIENT)
@Override
public void registerModel(Item item, IModelManager manager) {
for (EnumTubeMaterial mat : EnumTubeMaterial.values()) {
for (EnumTubeInsulate ins : EnumTubeInsulate.values()) {
manager.registerItemModel(item, mat.ordinal() + ins.ordinal() * 128);
}
}
}
@Override
@SideOnly(Side.CLIENT)
public void registerIcons(IIconRegister register) {
for (int i = 0; i < 3; ++i) {
icons[i] = Botany.proxy.getIcon(register, "insulatedTube." + i);
}
}
@Override
@SideOnly(Side.CLIENT)
public int getColorFromItemStack(ItemStack stack, int pass) {
if (pass == 0) {
public int getColorFromItemstack(ItemStack stack, int tintIndex) {
if (tintIndex == 0) {
return 0xffffff;
} else if (tintIndex == 1) {
return EnumTubeMaterial.get(stack.getItemDamage()).getColor();
}
return (pass == 1)
? Material.get(stack.getItemDamage()).getColor()
: Insulate.get(stack.getItemDamage()).getColor();
return EnumTubeInsulate.get(stack.getItemDamage()).getColor();
}
@Override
@SideOnly(Side.CLIENT)
public void addInformation(ItemStack stack, EntityPlayer player, List tooltip, boolean advanced) {
super.addInformation(stack, player, tooltip, advanced);
tooltip.add(Insulate.get(stack.getItemDamage()).getName());
}
@Override
public String getItemStackDisplayName(ItemStack stack) {
return Material.get(stack.getItemDamage()).getName() + " "
+ I18N.localise("botany.tube.name");
}
@Override
public int getRenderPasses(int metadata) {
return 3;
}
@Override
public IIcon getIcon(ItemStack stack, int pass) {
return icons[pass % 3];
}
@Override
public boolean requiresMultipleRenderPasses() {
return true;
}
enum Material {
Copper(0xe3b78e, "cooper"),
Tin(0xe1eef4, "tin"),
Bronze(0xddc276, "bronze"),
Iron(0xd8d8d8, "iron");
protected int color;
protected String name;
Material(int color, String name) {
this.color = color;
this.name = name;
}
public static Material get(int i) {
return values()[i % values().length];
}
public int getColor() {
return color;
}
public String getName() {
return I18N.localise("botany.tube." + name);
}
}
enum Insulate {
Clay(0xa1aacc, "clay"),
Cobble(0x7b7b7b, "cobblestone"),
Sand(0xefeab5, "sand"),
HardenedClay(0x935c43, "hardenedClay"),
Stone(0x6d6d6d, "smoothStone"),
Sandstone(0xc1b989, "sandstone");
protected int color;
protected String name;
Insulate(int color, String name) {
this.color = color;
this.name = name;
}
public static Insulate get(int i) {
return values()[i / 128 % values().length];
}
public int getColor() {
return color;
}
public String getName() {
return I18N.localise("botany.tube.insulate." + name);
}
public ItemStack getStack() {
switch (this) {
case Clay:
return new ItemStack(Blocks.clay);
case Cobble:
return new ItemStack(Blocks.cobblestone);
case HardenedClay:
return new ItemStack(Blocks.hardened_clay);
case Sand:
return new ItemStack(Blocks.sand);
case Sandstone:
return new ItemStack(Blocks.sandstone);
case Stone:
return new ItemStack(Blocks.stone);
public void addInformation(ItemStack itemstack, EntityPlayer player, List<String> list, boolean flag) {
super.addInformation(itemstack, player, list, flag);
Multimap<ICircuitLayout, ICircuit> circuits = getCircuits(itemstack);
if (!circuits.isEmpty()) {
if (GuiScreen.isShiftKeyDown()) {
for (ICircuitLayout circuitLayout : circuits.keys()) {
String circuitLayoutName = circuitLayout.getUsage();
list.add(TextFormatting.WHITE.toString() + TextFormatting.UNDERLINE + circuitLayoutName);
for (ICircuit circuit : circuits.get(circuitLayout)) {
circuit.addTooltip(list);
}
}
} else {
list.add(TextFormatting.ITALIC + "<" + Translator.translateToLocal("for.gui.tooltip.tmi") + ">");
}
return null;
} else {
list.add("<" + Translator.translateToLocal("for.gui.noeffect") + ">");
}
}
@Override
public String getItemStackDisplayName(ItemStack itemStack) {
int meta = itemStack.getMetadata();
return I18N.localise(
"item.botany.insulated_tube.name",
EnumTubeMaterial.get(meta).getDisplayName(),
EnumTubeInsulate.get(meta).getDisplayName()
);
}
}
@@ -1,20 +0,0 @@
package binnie.botany.flower;
import binnie.botany.api.EnumFlowerStage;
import binnie.core.util.I18N;
public class ItemPollen extends ItemBotany {
public ItemPollen() {
super("pollen");
}
@Override
public EnumFlowerStage getStage() {
return EnumFlowerStage.POLLEN;
}
@Override
public String getTag() {
return I18N.localise("botany.item.pollen.tag.name");
}
}
@@ -1,20 +0,0 @@
package binnie.botany.flower;
import binnie.botany.api.EnumFlowerStage;
import binnie.core.util.I18N;
public class ItemSeed extends ItemBotany {
public ItemSeed() {
super("seed");
}
@Override
public EnumFlowerStage getStage() {
return EnumFlowerStage.SEED;
}
@Override
public String getTag() {
return I18N.localise("botany.item.germling.tag.name");
}
}
@@ -0,0 +1,53 @@
package binnie.botany.flower;
import com.google.common.base.Optional;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import net.minecraft.block.properties.PropertyHelper;
import forestry.api.genetics.AlleleManager;
import forestry.api.genetics.IAllele;
import binnie.botany.api.IAlleleFlowerSpecies;
import binnie.botany.api.IFlowerType;
public class PropertyFlower<I extends IFlowerType<I>> extends PropertyHelper<I> {
public PropertyFlower(String name, Class<I> flowerTypeClass) {
super(name, flowerTypeClass);
}
@Override
public List<I> getAllowedValues() {
List<I> flowerTypes = new ArrayList<>();
for (IAllele allele : AlleleManager.alleleRegistry.getRegisteredAlleles().values()) {
if (allele instanceof IAlleleFlowerSpecies) {
IFlowerType flowerType = ((IAlleleFlowerSpecies) allele).getType();
if (!flowerTypes.contains(flowerType)) {
flowerTypes.add((I) flowerType);
}
}
}
return flowerTypes;
}
/**
* Get the name for the given value.
*/
@Override
public String getName(IFlowerType value) {
return value.getName().toLowerCase(Locale.ENGLISH);
}
@Override
public Optional<I> parseValue(String value) {
IAllele allele = AlleleManager.alleleRegistry.getAllele(value);
if (IAlleleFlowerSpecies.class.isInstance(allele)) {
IAlleleFlowerSpecies alleleValue = IAlleleFlowerSpecies.class.cast(allele);
return Optional.of((I) alleleValue.getType());
}
return Optional.absent();
}
}
@@ -1,60 +0,0 @@
package binnie.botany.flower;
import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler;
import net.minecraft.block.Block;
import net.minecraft.client.renderer.EntityRenderer;
import net.minecraft.client.renderer.RenderBlocks;
import net.minecraft.client.renderer.Tessellator;
import net.minecraft.util.IIcon;
import net.minecraft.world.IBlockAccess;
public class RendererBotany implements ISimpleBlockRenderingHandler {
public static int renderID;
public static int pass;
@Override
public void renderInventoryBlock(Block block, int metadata, int modelID, RenderBlocks renderer) {
// ignored
}
@Override
public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, RenderBlocks renderer) {
Tessellator tessellator = Tessellator.instance;
tessellator.setBrightness(block.getMixedBrightnessForBlock(renderer.blockAccess, x, y, z));
double d1 = x;
double d2 = y;
double d3 = z;
long i1 = x * 3129871 ^ z * 116129781L;
i1 = i1 * i1 * 42317861L + i1 * 11L;
d1 += ((i1 >> 16 & 0xFL) / 15.0f - 0.5) * 0.3;
d3 += ((i1 >> 24 & 0xFL) / 15.0f - 0.5) * 0.3;
for (int j = 0; j < 3; ++j) {
RendererBotany.pass = j;
int l = block.colorMultiplier(renderer.blockAccess, x, y, z);
float f = (l >> 16 & 0xFF) / 255.0f;
float f2 = (l >> 8 & 0xFF) / 255.0f;
float f3 = (l & 0xFF) / 255.0f;
if (EntityRenderer.anaglyphEnable) {
f = (f * 30.0f + f2 * 59.0f + f3 * 11.0f) / 100.0f;
f2 = (f * 30.0f + f2 * 70.0f) / 100.0f;
f3 = (f * 30.0f + f3 * 70.0f) / 100.0f;
}
tessellator.setColorOpaque_F(f, f2, f3);
IIcon iicon = block.getIcon(world, x, y, z, 0);
renderer.drawCrossedSquares(iicon, d1, d2, d3, 1.0f);
}
return false;
}
@Override
public boolean shouldRender3DInInventory(int i) {
return false;
}
@Override
public int getRenderId() {
return RendererBotany.renderID;
}
}
@@ -0,0 +1,39 @@
package binnie.botany.flower;
import com.google.common.collect.Maps;
import java.util.Map;
import net.minecraft.block.properties.IProperty;
import net.minecraft.block.state.IBlockState;
import net.minecraft.client.renderer.block.model.ModelResourceLocation;
import net.minecraft.client.renderer.block.statemap.StateMapperBase;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import binnie.Constants;
import binnie.botany.api.IFlowerType;
@SideOnly(Side.CLIENT)
public class StateMapperFlower extends StateMapperBase {
@Override
protected ModelResourceLocation getModelResourceLocation(IBlockState state) {
Map<IProperty<?>, Comparable<?>> properties = Maps.newLinkedHashMap(state.getProperties());
IFlowerType flowerType = (IFlowerType) state.getValue(BlockFlower.FLOWER);
if (flowerType.getSections() < 2) {
properties.remove(BlockFlower.SECTION);
} else if (flowerType.getSections() <= state.getValue(BlockFlower.SECTION)) {
properties.put(BlockFlower.SECTION, flowerType.getSections() - 1);
}
if (state.getValue(BlockFlower.SEED)) {
properties.remove(BlockFlower.SECTION);
properties.remove(BlockFlower.FLOWER);
properties.remove(BlockFlower.FLOWERED);
} else {
properties.remove(BlockFlower.SEED);
}
return new ModelResourceLocation(Constants.BOTANY_MOD_ID + ":flower", getPropertyString(properties));
}
}
@@ -1,5 +1,35 @@
package binnie.botany.flower;
import javax.annotation.Nullable;
import java.util.HashSet;
import java.util.Random;
import java.util.Set;
import net.minecraft.block.Block;
import net.minecraft.block.state.IBlockState;
import net.minecraft.entity.item.EntityItem;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTUtil;
import net.minecraft.network.NetworkManager;
import net.minecraft.network.play.server.SPacketUpdateTileEntity;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import net.minecraft.world.biome.Biome;
import com.mojang.authlib.GameProfile;
import net.minecraftforge.common.EnumPlantType;
import forestry.api.core.EnumHumidity;
import forestry.api.core.EnumTemperature;
import forestry.api.core.IErrorState;
import forestry.api.genetics.IIndividual;
import forestry.api.genetics.IPollinatable;
import forestry.api.lepidopterology.IButterfly;
import forestry.api.lepidopterology.IButterflyNursery;
import binnie.Binnie;
import binnie.botany.Botany;
import binnie.botany.api.EnumFlowerStage;
@@ -8,46 +38,27 @@ import binnie.botany.api.IAlleleFlowerSpecies;
import binnie.botany.api.IFlower;
import binnie.botany.api.IFlowerColor;
import binnie.botany.api.IFlowerGenome;
import binnie.botany.api.IFlowerRoot;
import binnie.botany.api.IFlowerType;
import binnie.botany.api.IGardeningManager;
import binnie.botany.core.BotanyCore;
import binnie.botany.gardening.BlockPlant;
import binnie.botany.gardening.Gardening;
import binnie.botany.gardening.PlantType;
import binnie.botany.genetics.EnumFlowerColor;
import binnie.botany.genetics.EnumFlowerType;
import binnie.botany.genetics.Flower;
import binnie.botany.network.MessageFlowerUpdate;
import binnie.core.BinnieCore;
import com.mojang.authlib.GameProfile;
import forestry.api.core.EnumHumidity;
import forestry.api.core.EnumTemperature;
import forestry.api.genetics.IIndividual;
import forestry.api.genetics.IPollinatable;
import forestry.api.lepidopterology.IButterfly;
import forestry.api.lepidopterology.IButterflyNursery;
import forestry.lepidopterology.entities.EntityButterfly;
import net.minecraft.block.Block;
import net.minecraft.entity.item.EntityItem;
import net.minecraft.init.Blocks;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTUtil;
import net.minecraft.network.Packet;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.ChunkCoordinates;
import net.minecraft.world.World;
import net.minecraft.world.biome.BiomeGenBase;
import net.minecraftforge.common.EnumPlantType;
import java.util.EnumSet;
import java.util.Random;
public class TileEntityFlower extends TileEntity implements IPollinatable, IButterflyNursery {
protected IFlower flower;
protected GameProfile owner;
protected int section;
protected RenderInfo renderInfo;
protected IButterfly caterpillar;
protected int matureTime;
@Nullable
IFlower flower;
@Nullable
GameProfile owner;
int section;
@Nullable
RenderInfo renderInfo;
@Nullable
IButterfly caterpillar;
int matureTime;
public TileEntityFlower() {
flower = null;
@@ -57,49 +68,61 @@ public class TileEntityFlower extends TileEntity implements IPollinatable, IButt
}
@Override
public void readFromNBT(NBTTagCompound nbttagcompound) {
flower = new Flower(nbttagcompound);
section = nbttagcompound.getByte("section");
if (flower.getAge() == 0) {
flower.setFlowered(false);
public void readFromNBT(NBTTagCompound nbtCompound) {
if (nbtCompound.hasKey("Flower")) {
flower = new Flower(nbtCompound.getCompoundTag("Flower"));
if (flower.getAge() == 0) {
flower.setFlowered(false);
}
}
owner = NBTUtil.func_152459_a(nbttagcompound.getCompoundTag("owner"));
if (nbttagcompound.hasKey("CATER") && BinnieCore.isLepidopteryActive()) {
matureTime = nbttagcompound.getInteger("caterTime");
caterpillar = Binnie.Genetics.getButterflyRoot().getMember(nbttagcompound.getCompoundTag("cater"));
if (nbtCompound.hasKey("section")) {
section = nbtCompound.getByte("section");
}
super.readFromNBT(nbttagcompound);
if (nbtCompound.hasKey("owner")) {
owner = NBTUtil.readGameProfileFromNBT(nbtCompound.getCompoundTag("owner"));
}
if (nbtCompound.hasKey("CATER") && BinnieCore.isLepidopteryActive()) {
matureTime = nbtCompound.getInteger("caterTime");
caterpillar = Binnie.GENETICS.getButterflyRoot().getMember(nbtCompound.getCompoundTag("cater"));
}
readRenderInfo(nbtCompound);
super.readFromNBT(nbtCompound);
}
@Override
public void writeToNBT(NBTTagCompound nbttagcompound) {
public NBTTagCompound writeToNBT(NBTTagCompound nbtCompound) {
if (flower != null) {
flower.writeToNBT(nbttagcompound);
nbtCompound.setTag("Flower", flower.writeToNBT(new NBTTagCompound()));
}
if (owner != null) {
NBTTagCompound nbt = new NBTTagCompound();
NBTUtil.func_152460_a(nbt, owner);
nbttagcompound.setTag("owner", nbt);
NBTUtil.writeGameProfile(nbt, owner);
nbtCompound.setTag("owner", nbt);
}
if (caterpillar != null) {
nbttagcompound.setInteger("caterTime", matureTime);
nbtCompound.setInteger("caterTime", matureTime);
NBTTagCompound subcompound = new NBTTagCompound();
caterpillar.writeToNBT(subcompound);
nbttagcompound.setTag("cater", subcompound);
nbtCompound.setTag("cater", subcompound);
}
nbttagcompound.setByte("section", (byte) getSection());
super.writeToNBT(nbttagcompound);
nbtCompound.setByte("section", (byte) getSection());
return super.writeToNBT(nbtCompound);
}
public void create(ItemStack stack, GameProfile owner) {
create(BotanyCore.getFlowerRoot().getMember(stack), owner);
public void create(ItemStack stack, @Nullable GameProfile owner) {
IFlower flower = BotanyCore.getFlowerRoot().getMember(stack);
create(flower, owner);
}
public void create(IFlower stack, GameProfile owner) {
flower = stack;
public void create(IFlower flower, @Nullable GameProfile owner) {
this.flower = flower;
if (flower.getAge() == 0) {
flower.setFlowered(false);
}
@@ -109,11 +132,12 @@ public class TileEntityFlower extends TileEntity implements IPollinatable, IButt
}
@Override
public EnumSet<EnumPlantType> getPlantType() {
return EnumSet.of(EnumPlantType.Plains);
public EnumPlantType getPlantType() {
return EnumPlantType.Plains;
}
@Override
@Nullable
public IIndividual getPollen() {
return getFlower();
}
@@ -121,11 +145,11 @@ public class TileEntityFlower extends TileEntity implements IPollinatable, IButt
@Override
public boolean canMateWith(IIndividual individual) {
return isBreeding()
&& individual instanceof IFlower
&& getFlower() != null
&& getFlower().getMate() == null
&& getFlower().hasFlowered()
&& !getFlower().isGeneticEqual(individual);
&& individual instanceof IFlower
&& getFlower() != null
&& getFlower().getMate() == null
&& getFlower().hasFlowered()
&& !getFlower().isGeneticEqual(individual);
}
@Override
@@ -136,18 +160,19 @@ public class TileEntityFlower extends TileEntity implements IPollinatable, IButt
IAlleleFlowerSpecies primary = (IAlleleFlowerSpecies) individual.getGenome().getPrimary();
IAlleleFlowerSpecies primary2 = getFlower().getGenome().getPrimary();
if (primary == primary2 || worldObj.rand.nextInt(4) == 0) {
if (primary == primary2 || world.rand.nextInt(4) == 0) {
getFlower().mate((IFlower) individual);
worldObj.markBlockForUpdate(xCoord, yCoord, zCoord);
world.markBlockRangeForRenderUpdate(pos, pos);
}
}
@Nullable
public IFlower getFlower() {
if (getSection() <= 0) {
return flower;
}
TileEntity tile = worldObj.getTileEntity(xCoord, yCoord - getSection(), zCoord);
TileEntity tile = world.getTileEntity(pos.down(getSection()));
if (tile instanceof TileEntityFlower) {
return ((TileEntityFlower) tile).getFlower();
}
@@ -155,19 +180,23 @@ public class TileEntityFlower extends TileEntity implements IPollinatable, IButt
}
public boolean isBreeding() {
Block roots = getWorldObj().getBlock(xCoord, yCoord - 1, zCoord);
return Gardening.isSoil(roots);
Block roots = getWorld().getBlockState(getPos().down()).getBlock();
return BotanyCore.getGardening().isSoil(roots);
}
public void randomUpdate(Random rand) {
if (worldObj.getBlock(xCoord, yCoord, zCoord) != Botany.flower) {
if (world.getBlockState(pos).getBlock() != Botany.flower) {
invalidate();
return;
}
if (getSection() > 0 || flower == null) {
if (getSection() > 0) {
return;
}
if (flower == null) {
return;
}
// TODO always false?
if (flower.getGenome() == null) {
invalidate();
return;
@@ -176,17 +205,18 @@ public class TileEntityFlower extends TileEntity implements IPollinatable, IButt
return;
}
float light = worldObj.getBlockLightValue(xCoord, yCoord, zCoord);
float light = world.getLight(pos);
if (light < 6.0f) {
for (int dx = -2; dx <= 2; ++dx) {
for (int dy = -2; dy <= 2; ++dy) {
light -= (worldObj.canBlockSeeTheSky(xCoord, yCoord, zCoord) ? 0.0f : 0.5f);
light -= (world.canBlockSeeSky(pos) ? 0.0f : 0.5f);
}
}
}
boolean canTolerate = Gardening.canTolerate(getFlower(), worldObj, xCoord, yCoord, zCoord);
EnumSoilType soil = Gardening.getSoilType(worldObj, xCoord, yCoord, zCoord);
IGardeningManager gardening = BotanyCore.getGardening();
boolean canTolerate = gardening.canTolerate(getFlower(), world, pos);
EnumSoilType soil = gardening.getSoilType(world, pos.down());
if (rand.nextFloat() < getFlower().getGenome().getAgeChance()) {
if (flower.getAge() < 1) {
if (canTolerate && light > 6.0f) {
@@ -200,6 +230,7 @@ public class TileEntityFlower extends TileEntity implements IPollinatable, IButt
if (canTolerate && flower.getAge() > 1 && !flower.isWilted() && light > 6.0f) {
flower.setFlowered(true);
}
if (!canTolerate && flower.isWilted() && rand.nextInt(2 + Math.max(flower.getAge(), 2)) == 0) {
kill();
return;
@@ -216,32 +247,28 @@ public class TileEntityFlower extends TileEntity implements IPollinatable, IButt
flower.setWilted(false);
}
float chanceDispersal = 0.8f;
chanceDispersal += 0.2f * flower.getGenome().getFertility();
chanceDispersal *= 1.0f + soil.ordinal() * 0.5f;
float chancePollinate = 1.0f;
chancePollinate += 0.25f * flower.getGenome().getFertility();
chancePollinate *= 1.0f + soil.ordinal() * 0.5f;
float chanceSelfPollinate = 0.2f * chancePollinate;
if (worldObj.rand.nextFloat() < chanceDispersal && flower.hasFlowered() && !flower.isWilted()) {
float CHANCE_DISPERSAL = 0.8f;
CHANCE_DISPERSAL += 0.2f * flower.getGenome().getFertility();
CHANCE_DISPERSAL *= 1.0f + soil.ordinal() * 0.5f;
float CHANCE_POLLINATE = 1.0f;
CHANCE_POLLINATE += 0.25f * flower.getGenome().getFertility();
CHANCE_POLLINATE *= 1.0f + soil.ordinal() * 0.5f;
float CHANCE_SELFPOLLINATE = 0.2f * CHANCE_POLLINATE;
if (world.rand.nextFloat() < CHANCE_DISPERSAL && flower.hasFlowered() && !flower.isWilted()) {
IFlowerGenome mate = flower.getMate();
if (mate != null) {
boolean dispersed = false;
for (int a = 0; a < 5 && !dispersed; ++a) {
int dx2 = 0;
int dz = 0;
while (dx2 == 0 && dz == 0) {
dx2 = rand.nextInt(3) - 1;
dz = rand.nextInt(3) - 1;
int dx2;
int dz;
for (dx2 = 0, dz = 0; dx2 == 0 && dz == 0; dx2 = rand.nextInt(3) - 1, dz = rand.nextInt(3) - 1) {
}
Block b = getWorldObj().getBlock(xCoord + dx2, yCoord, zCoord + dz);
Block b2 = getWorldObj().getBlock(xCoord + dx2, yCoord - 1, zCoord + dz);
if (b == Blocks.air && Gardening.isSoil(b2)) {
IFlower offspring = flower.getOffspring(getWorldObj());
Block b2 = world.getBlockState(pos.add(dx2, -1, dz)).getBlock();
if (world.isAirBlock(pos.add(dx2, 0, dz)) && BotanyCore.getGardening().isSoil(b2)) {
IFlower offspring = flower.getOffspring(world, pos);
if (offspring != null) {
Gardening.plant(getWorldObj(), xCoord + dx2, yCoord, zCoord + dz, offspring, getOwner());
BotanyCore.getFlowerRoot().plant(world, pos.add(dx2, 0, dz), offspring, getOwner());
flower.removeMate();
dispersed = true;
}
@@ -250,23 +277,20 @@ public class TileEntityFlower extends TileEntity implements IPollinatable, IButt
}
}
if (worldObj.rand.nextFloat() < chancePollinate && flower.hasFlowered() && !flower.isWilted()) {
if (world.rand.nextFloat() < CHANCE_POLLINATE && flower.hasFlowered() && !flower.isWilted()) {
for (int a2 = 0; a2 < 4; ++a2) {
int dx3 = 0;
int dz2 = 0;
while (dx3 == 0 && dz2 == 0) {
dx3 = rand.nextInt(5) - 2;
dz2 = rand.nextInt(5) - 2;
int dx3;
int dz2;
for (dx3 = 0, dz2 = 0; dx3 == 0 && dz2 == 0; dx3 = rand.nextInt(5) - 2, dz2 = rand.nextInt(5) - 2) {
}
TileEntity tile = getWorldObj().getTileEntity(xCoord + dx3, yCoord, zCoord + dz2);
TileEntity tile = world.getTileEntity(pos.add(dx3, 0, dz2));
if (tile instanceof IPollinatable && ((IPollinatable) tile).canMateWith(getFlower())) {
((IPollinatable) tile).mateWith(getFlower());
}
}
}
if (worldObj.rand.nextFloat() < chanceSelfPollinate && flower.hasFlowered() && flower.getMate() == null) {
if (world.rand.nextFloat() < CHANCE_SELFPOLLINATE && flower.hasFlowered() && flower.getMate() == null) {
mateWith(getFlower());
}
spawnButterflies();
@@ -277,24 +301,67 @@ public class TileEntityFlower extends TileEntity implements IPollinatable, IButt
private void doFlowerAge() {
getFlower().age();
if (getFlower().getAge() != 1) {
return;
if (getFlower().getAge() == 1) {
IFlowerRoot flowerRoot = BotanyCore.getFlowerRoot();
flowerRoot.onGrowFromSeed(world, pos);
if (getOwner() != null && getFlower() != null) {
flowerRoot.getBreedingTracker(world, getOwner()).registerBirth(getFlower());
}
}
}
Gardening.onGrowFromSeed(worldObj, xCoord, yCoord, zCoord);
if (getOwner() != null && getFlower() != null) {
BotanyCore.getFlowerRoot().getBreedingTracker(getWorldObj(), getOwner()).registerBirth(getFlower());
private NBTTagCompound writeRenderInfo(NBTTagCompound tag) {
if (renderInfo != null) {
NBTTagCompound nbtRenderInfo = new NBTTagCompound();
nbtRenderInfo.setByte("primary", (byte) renderInfo.primary.getID());
nbtRenderInfo.setByte("secondary", (byte) renderInfo.secondary.getID());
nbtRenderInfo.setByte("stem", (byte) renderInfo.stem.getID());
nbtRenderInfo.setByte("type", (byte) renderInfo.type.ordinal());
nbtRenderInfo.setByte("age", renderInfo.age);
nbtRenderInfo.setByte("section", renderInfo.section);
nbtRenderInfo.setBoolean("wilted", renderInfo.wilted);
nbtRenderInfo.setBoolean("flowered", renderInfo.flowered);
tag.setTag("renderinfo", nbtRenderInfo);
}
return tag;
}
private void readRenderInfo(NBTTagCompound tag) {
if (tag.hasKey("renderinfo")) {
NBTTagCompound infotag = tag.getCompoundTag("renderinfo");
RenderInfo info = new RenderInfo();
info.primary = EnumFlowerColor.values()[infotag.getByte("primary")].getFlowerColorAllele();
info.secondary = EnumFlowerColor.values()[infotag.getByte("secondary")].getFlowerColorAllele();
info.stem = EnumFlowerColor.values()[infotag.getByte("stem")].getFlowerColorAllele();
info.type = EnumFlowerType.values()[infotag.getByte("type")];
info.age = infotag.getByte("age");
info.section = infotag.getByte("section");
info.wilted = infotag.getBoolean("wilted");
info.flowered = infotag.getBoolean("flowered");
setRender(info);
}
}
@Override
public Packet getDescriptionPacket() {
public void onDataPacket(NetworkManager net, SPacketUpdateTileEntity pkt) {
super.onDataPacket(net, pkt);
// TODO client only call?
readRenderInfo(pkt.getNbtCompound());
}
@Override
public NBTTagCompound getUpdateTag() {
updateRender(true);
return writeRenderInfo(super.getUpdateTag());
}
@Override
public SPacketUpdateTileEntity getUpdatePacket() {
// TODO getFlower().getGenome() != null always true?
if (renderInfo == null && getFlower() != null && getFlower().getGenome() != null) {
renderInfo = new RenderInfo(getFlower(), this);
}
return (renderInfo != null) ?
Botany.instance.getNetworkWrapper().getPacketFrom(new MessageFlowerUpdate(xCoord, yCoord, zCoord, renderInfo).getMessage()) :
null;
return (renderInfo != null) ? new SPacketUpdateTileEntity(pos, 0, getUpdateTag()) : null;
}
public void updateRender(boolean update) {
@@ -305,7 +372,7 @@ public class TileEntityFlower extends TileEntity implements IPollinatable, IButt
}
}
TileEntity above = worldObj.getTileEntity(xCoord, yCoord + 1, zCoord);
TileEntity above = world.getTileEntity(pos.up());
if (above instanceof TileEntityFlower) {
((TileEntityFlower) above).updateRender(true);
}
@@ -317,26 +384,25 @@ public class TileEntityFlower extends TileEntity implements IPollinatable, IButt
public void setSection(int i) {
section = i;
if (BinnieCore.proxy.isSimulating(worldObj)) {
if (BinnieCore.getBinnieProxy().isSimulating(world)) {
updateRender(true);
}
}
public ItemStack getItemStack() {
IFlower flower = getFlower();
if (flower == null) {
return null;
return ItemStack.EMPTY;
}
int stage = (flower.getAge() == 0) ? EnumFlowerStage.SEED.ordinal() : EnumFlowerStage.FLOWER.ordinal();
return Binnie.Genetics.getFlowerRoot().getMemberStack(getFlower(), stage);
return Binnie.GENETICS.getFlowerRoot().getMemberStack(flower, EnumFlowerStage.getStage(flower));
}
@Nullable
private TileEntityFlower getRoot() {
if (getSection() == 0) {
return null;
}
TileEntity tile = worldObj.getTileEntity(xCoord, yCoord - getSection(), zCoord);
TileEntity tile = world.getTileEntity(pos.down(getSection()));
return (tile instanceof TileEntityFlower) ? ((TileEntityFlower) tile) : null;
}
@@ -352,15 +418,14 @@ public class TileEntityFlower extends TileEntity implements IPollinatable, IButt
Random rand = new Random();
IFlower cutting = (IFlower) getFlower().copy();
cutting.setAge(0);
ItemStack cuttingStack = BotanyCore.getFlowerRoot().getMemberStack(cutting, EnumFlowerStage.SEED.ordinal());
ItemStack cuttingStack = BotanyCore.getFlowerRoot().getMemberStack(cutting, EnumFlowerStage.SEED);
float f = 0.7f;
double d = rand.nextFloat() * f + (1.0f - f) * 0.5;
double d2 = rand.nextFloat() * f + (1.0f - f) * 0.5;
double d3 = rand.nextFloat() * f + (1.0f - f) * 0.5;
EntityItem entityitem = new EntityItem(worldObj, xCoord + d, yCoord + d2, zCoord + d3, cuttingStack);
entityitem.delayBeforeCanPickup = 10;
worldObj.spawnEntityInWorld(entityitem);
EntityItem entityitem = new EntityItem(world, pos.getX() + d, pos.getY() + d2, pos.getZ() + d3, cuttingStack);
entityitem.setPickupDelay(10);
world.spawnEntity(entityitem);
for (int maxAge = getFlower().getMaxAge(), i = 0; i < maxAge; ++i) {
if (rand.nextBoolean()) {
getFlower().age();
@@ -376,53 +441,58 @@ public class TileEntityFlower extends TileEntity implements IPollinatable, IButt
return getRoot().checkIfDead(wasCut);
}
EnumSoilType soil = Gardening.getSoilType(worldObj, xCoord, yCoord, zCoord);
EnumSoilType soil = BotanyCore.getGardening().getSoilType(world, pos);
int maxAge = (int) (flower.getMaxAge() * (1.0f + soil.ordinal() * 0.25f));
if (flower.getAge() <= maxAge) {
return false;
}
if (!wasCut && flower.getMate() != null) {
worldObj.setBlockToAir(xCoord, yCoord, zCoord);
IFlower offspring = flower.getOffspring(getWorldObj());
TileEntity above = worldObj.getTileEntity(xCoord, yCoord + 1, zCoord);
if (above instanceof TileEntityFlower) {
worldObj.setBlockToAir(xCoord, yCoord + 1, zCoord);
if (flower.getAge() > maxAge) {
if (!wasCut && flower.getMate() != null) {
world.setBlockToAir(pos);
IFlower offspring = flower.getOffspring(world, pos.down());
TileEntity above = world.getTileEntity(pos.up());
if (above instanceof TileEntityFlower) {
world.setBlockToAir(pos.up());
}
BotanyCore.getFlowerRoot().plant(world, pos, offspring, getOwner());
} else {
kill();
}
Gardening.plant(worldObj, xCoord, yCoord, zCoord, offspring, getOwner());
} else {
kill();
return true;
}
return true;
return false;
}
public void kill() {
if (flower.getAge() > 0) {
worldObj.setBlock(xCoord, yCoord, zCoord, Botany.plant, BlockPlant.Type.DeadFlower.ordinal(), 2);
world.setBlockState(pos, Botany.plant.getStateFromMeta(PlantType.DEAD_FLOWER.ordinal()), 2);
} else {
worldObj.setBlockToAir(xCoord, yCoord, zCoord);
world.setBlockToAir(pos);
}
for (int i = 1; worldObj.getTileEntity(xCoord, yCoord + i, zCoord) instanceof TileEntityFlower; ++i) {
worldObj.setBlockToAir(xCoord, yCoord + i, zCoord);
for (int i = 1; world.getTileEntity(pos.up(i)) instanceof TileEntityFlower; ++i) {
world.setBlockToAir(pos.up(i));
}
}
public boolean onBonemeal() {
if (getFlower() == null || !isBreeding() || getFlower().isWilted()) {
if (getFlower() == null) {
return false;
}
if (!isBreeding()) {
return false;
}
if (getFlower().isWilted()) {
return false;
}
doFlowerAge();
//this.doFlowerAge();
if (getFlower().getAge() > 1 && !getFlower().hasFlowered()) {
getFlower().setFlowered(true);
}
checkIfDead(false);
updateRender(true);
return true;
}
@Nullable
public GameProfile getOwner() {
return owner;
}
@@ -432,73 +502,88 @@ public class TileEntityFlower extends TileEntity implements IPollinatable, IButt
}
public void spawnButterflies() {
if (!BinnieCore.isLepidopteryActive()) {
/*if (!BinnieCore.isLepidopteryActive()) {
return;
}
int x = xCoord;
int y = yCoord;
int z = zCoord;
World world = worldObj;
if (getCaterpillar() != null) {
final int x = this.xCoord;
final int y = this.yCoord;
final int z = this.zCoord;
final World world = this.worldObj;
if (this.getCaterpillar() != null) {
return;
}
if (world.rand.nextFloat() >= getFlower().getGenome().getSappiness()) {
if (world.rand.nextFloat() >= this.getFlower().getGenome().getSappiness()) {
return;
}
if (worldObj.rand.nextFloat() >= 0.2f) {
if (this.worldObj.rand.nextFloat() >= 0.2f) {
return;
}
IButterfly spawn = Binnie.Genetics.getButterflyRoot().getIndividualTemplates().get(worldObj.rand.nextInt(Binnie.Genetics.getButterflyRoot().getIndividualTemplates().size()));
if (worldObj.rand.nextFloat() >= spawn.getGenome().getPrimary().getRarity() * 0.5f) {
final IButterfly spawn = Binnie.Genetics.getButterflyRoot().getIndividualTemplates().get(this.worldObj.rand.nextInt(Binnie.Genetics.getButterflyRoot().getIndividualTemplates().size()));
if (this.worldObj.rand.nextFloat() >= spawn.getGenome().getPrimary().getRarity() * 0.5f) {
return;
}
if (worldObj.countEntities(EntityButterfly.class) > 100) {
if (this.worldObj.countEntities(EntityButterfly.class) > 100) {
return;
}
if (!spawn.canSpawn(worldObj, x, y, z)) {
if (!spawn.canSpawn(this.worldObj, x, y, z)) {
return;
}
if (world.isAirBlock(x, y + 1, z)) {
attemptButterflySpawn(world, spawn, x, y + 1, z);
} else if (world.isAirBlock(x - 1, y, z)) {
attemptButterflySpawn(world, spawn, x - 1, y, z);
} else if (world.isAirBlock(x + 1, y, z)) {
attemptButterflySpawn(world, spawn, x + 1, y, z);
} else if (world.isAirBlock(x, y, z - 1)) {
attemptButterflySpawn(world, spawn, x, y, z - 1);
} else if (world.isAirBlock(x, y, z + 1)) {
attemptButterflySpawn(world, spawn, x, y, z + 1);
this.attemptButterflySpawn(world, spawn, x, y + 1, z);
}
else if (world.isAirBlock(x - 1, y, z)) {
this.attemptButterflySpawn(world, spawn, x - 1, y, z);
}
else if (world.isAirBlock(x + 1, y, z)) {
this.attemptButterflySpawn(world, spawn, x + 1, y, z);
}
else if (world.isAirBlock(x, y, z - 1)) {
this.attemptButterflySpawn(world, spawn, x, y, z - 1);
}
else if (world.isAirBlock(x, y, z + 1)) {
this.attemptButterflySpawn(world, spawn, x, y, z + 1);
}*/
}
private void attemptButterflySpawn(World world, IButterfly butterfly, double x, double y, double z) {
if (BinnieCore.isLepidopteryActive()) {
Binnie.Genetics.getButterflyRoot().spawnButterflyInWorld(world, butterfly.copy(), x, y + 0.10000000149011612, z);
Binnie.GENETICS.getButterflyRoot().spawnButterflyInWorld(world, butterfly.copy(), x, y + 0.10000000149011612, z);
}
}
public World getWorld() {
return getWorldObj();
}
public EnumTemperature getTemperature() {
return EnumTemperature.getFromValue(worldObj.getBiomeGenForCoords(xCoord, zCoord).temperature);
}
public EnumHumidity getHumidity() {
return EnumHumidity.getFromValue(worldObj.getBiomeGenForCoords(xCoord, zCoord).rainfall);
public GameProfile getOwnerName() {
return getOwner();
}
@Override
public EnumTemperature getTemperature() {
return EnumTemperature.getFromValue(world.getBiome(getPos()).getTemperature());
}
@Override
public EnumHumidity getHumidity() {
return EnumHumidity.getFromValue(world.getBiome(getPos()).getRainfall());
}
public void setErrorState(int state) {
}
public int getErrorOrdinal() {
return 0;
}
public boolean addProduct(ItemStack product, boolean all) {
return false;
}
@Override
@Nullable
public IButterfly getCaterpillar() {
return caterpillar;
}
@Override
public void setCaterpillar(IButterfly butterfly) {
public void setCaterpillar(@Nullable IButterfly butterfly) {
caterpillar = butterfly;
matureTime = 0;
}
@@ -514,31 +599,40 @@ public class TileEntityFlower extends TileEntity implements IPollinatable, IButt
}
private void matureCaterpillar() {
if (getCaterpillar() == null) {
//TODO Spawn the caterpillar in a cocon on the next Tree or other thing
/*if (this.getCaterpillar() == null) {
return;
}
matureTime++;
if (matureTime >= caterpillar.getGenome().getLifespan() / (caterpillar.getGenome().getFertility() * 2) && caterpillar.canTakeFlight(worldObj, xCoord, yCoord, zCoord)) {
if (worldObj.isAirBlock(xCoord, yCoord + 1, zCoord)) {
attemptButterflySpawn(worldObj, caterpillar, xCoord, yCoord + 1, zCoord);
} else if (worldObj.isAirBlock(xCoord - 1, yCoord, zCoord)) {
attemptButterflySpawn(worldObj, caterpillar, xCoord - 1, yCoord, zCoord);
} else if (worldObj.isAirBlock(xCoord + 1, yCoord, zCoord)) {
attemptButterflySpawn(worldObj, caterpillar, xCoord + 1, yCoord, zCoord);
} else if (worldObj.isAirBlock(xCoord, yCoord, zCoord - 1)) {
attemptButterflySpawn(worldObj, caterpillar, xCoord, yCoord, zCoord - 1);
} else if (worldObj.isAirBlock(xCoord, yCoord, zCoord + 1)) {
attemptButterflySpawn(worldObj, caterpillar, xCoord, yCoord, zCoord + 1);
++this.matureTime;
if (this.matureTime >= this.caterpillar.getGenome().getLifespan() / (this.caterpillar.getGenome().getFertility() * 2) && this.caterpillar.canTakeFlight(this.worldObj, this.xCoord, this.yCoord, this.zCoord)) {
if (this.worldObj.isAirBlock(this.xCoord, this.yCoord + 1, this.zCoord)) {
this.attemptButterflySpawn(this.worldObj, this.caterpillar, this.xCoord, this.yCoord + 1, this.zCoord);
}
setCaterpillar(null);
}
else if (this.worldObj.isAirBlock(this.xCoord - 1, this.yCoord, this.zCoord)) {
this.attemptButterflySpawn(this.worldObj, this.caterpillar, this.xCoord - 1, this.yCoord, this.zCoord);
}
else if (this.worldObj.isAirBlock(this.xCoord + 1, this.yCoord, this.zCoord)) {
this.attemptButterflySpawn(this.worldObj, this.caterpillar, this.xCoord + 1, this.yCoord, this.zCoord);
}
else if (this.worldObj.isAirBlock(this.xCoord, this.yCoord, this.zCoord - 1)) {
this.attemptButterflySpawn(this.worldObj, this.caterpillar, this.xCoord, this.yCoord, this.zCoord - 1);
}
else if (this.worldObj.isAirBlock(this.xCoord, this.yCoord, this.zCoord + 1)) {
this.attemptButterflySpawn(this.worldObj, this.caterpillar, this.xCoord, this.yCoord, this.zCoord + 1);
}
this.setCaterpillar(null);
}*/
}
public void setRender(RenderInfo render) {
renderInfo = render;
section = renderInfo.section;
worldObj.markBlockForUpdate(xCoord, yCoord, zCoord);
if (!world.isRemote) {
IBlockState blockState = world.getBlockState(pos);
world.notifyBlockUpdate(pos, blockState, blockState, 0);
} else {
world.markBlockRangeForRenderUpdate(pos, pos);
}
}
public int getAge() {
@@ -557,45 +651,66 @@ public class TileEntityFlower extends TileEntity implements IPollinatable, IButt
return renderInfo == null || renderInfo.flowered;
}
public int getPrimaryColor() {
return (renderInfo == null) ?
EnumFlowerColor.RED.getColor(false) :
renderInfo.primary.getColor(isWilted());
public int getPrimaryColour() {
return (renderInfo == null)
? EnumFlowerColor.Red.getFlowerColorAllele().getColor(false)
: renderInfo.primary.getColor(isWilted());
}
public int getSecondaryColor() {
return (renderInfo == null) ?
EnumFlowerColor.RED.getColor(false) :
renderInfo.secondary.getColor(isWilted());
public int getSecondaryColour() {
return (renderInfo == null)
? EnumFlowerColor.Red.getFlowerColorAllele().getColor(false)
: renderInfo.secondary.getColor(isWilted());
}
public int getStemColour() {
return (renderInfo == null) ?
EnumFlowerColor.GREEN.getColor(false) :
renderInfo.stem.getColor(isWilted());
return (renderInfo == null)
? EnumFlowerColor.Green.getFlowerColorAllele().getColor(false)
: renderInfo.stem.getColor(isWilted());
}
public IFlowerType getType() {
return (renderInfo == null) ?
EnumFlowerType.POPPY :
renderInfo.type;
}
public BiomeGenBase getBiome() {
return getWorld().getBiomeGenForCoords(xCoord, zCoord);
return (renderInfo == null)
? EnumFlowerType.Poppy
: renderInfo.type;
}
@Override
public ChunkCoordinates getCoordinates() {
return new ChunkCoordinates(xCoord, yCoord, zCoord);
public Biome getBiome() {
return getWorld().getBiome(getPos());
}
@Nullable
public IErrorState getErrorState() {
return null;
}
public void setErrorState(IErrorState state) {
}
public boolean setErrorCondition(boolean condition, IErrorState errorState) {
return false;
}
public Set<IErrorState> getErrorStates() {
return new HashSet<>();
}
@Override
public BlockPos getCoordinates() {
return getPos();
}
// TODO ??
@Override
public boolean isPollinated() {
return isBreeding();
}
@Override
public World getWorldObj() {
return world;
}
public static class RenderInfo {
public IFlowerColor primary;
public IFlowerColor secondary;
@@ -624,13 +739,7 @@ public class TileEntityFlower extends TileEntity implements IPollinatable, IButt
public boolean equals(Object obj) {
if (obj instanceof RenderInfo) {
RenderInfo o = (RenderInfo) obj;
return o.age == age
&& o.wilted == wilted
&& o.flowered == flowered
&& o.primary == primary
&& o.secondary == secondary
&& o.stem == stem
&& o.type == type;
return o.age == age && o.wilted == wilted && o.flowered == flowered && o.primary == primary && o.secondary == secondary && o.stem == stem && o.type == type;
}
return super.equals(obj);
}
@@ -0,0 +1,9 @@
@ParametersAreNonnullByDefault
@MethodsReturnNonnullByDefault
@FieldsAreNonnullByDefault
package binnie.botany.flower;
import javax.annotation.ParametersAreNonnullByDefault;
import binnie.core.util.FieldsAreNonnullByDefault;
import mcp.MethodsReturnNonnullByDefault;
@@ -1,157 +1,154 @@
package binnie.botany.gardening;
import binnie.botany.Botany;
import binnie.botany.CreativeTabBotany;
import binnie.botany.api.EnumSoilType;
import binnie.botany.api.gardening.IBlockSoil;
import binnie.core.util.I18N;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import net.minecraft.block.Block;
import net.minecraft.block.BlockBush;
import net.minecraft.client.renderer.texture.IIconRegister;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.util.IIcon;
import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
public class BlockPlant extends BlockBush {
import net.minecraft.block.Block;
import net.minecraft.block.BlockBush;
import net.minecraft.block.SoundType;
import net.minecraft.block.properties.PropertyEnum;
import net.minecraft.block.state.BlockStateContainer;
import net.minecraft.block.state.IBlockState;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.util.NonNullList;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import forestry.api.core.IItemModelRegister;
import forestry.api.core.IModelManager;
import binnie.botany.CreativeTabBotany;
import binnie.botany.api.EnumSoilType;
import binnie.botany.api.IBlockSoil;
import binnie.botany.core.BotanyCore;
public class BlockPlant extends BlockBush implements IItemModelRegister {
public static final PropertyEnum<PlantType> PLANT_TYPE = PropertyEnum.create("plant_type", PlantType.class);
public BlockPlant() {
setBlockName("plant");
setRegistryName("plant");
setCreativeTab(CreativeTabBotany.instance);
setTickRandomly(true);
setStepSound(Block.soundTypeGrass);
setSoundType(SoundType.PLANT);
}
public static boolean isWeed(IBlockAccess world, int x, int y, int z) {
if (!(world.getBlock(x, y, z) instanceof BlockPlant)) {
public static boolean isWeed(IBlockAccess world, BlockPos pos) {
IBlockState blockState = world.getBlockState(pos);
if (!(blockState.getBlock() instanceof BlockPlant)) {
return false;
}
Type type = Type.get(world.getBlockMetadata(x, y, z));
return type == Type.Weeds
|| type == Type.WeedsLong
|| type == Type.WeedsVeryLong;
PlantType type = blockState.getValue(PLANT_TYPE);
return type.isWeed();
}
@Override
public ArrayList<ItemStack> getDrops(World world, int x, int y, int z, int metadata, int fortune) {
@SideOnly(Side.CLIENT)
public void registerModel(Item item, IModelManager manager) {
int index = 0;
for (PlantType type : PlantType.values()) {
manager.registerItemModel(item, index, type.getName());
index++;
}
}
@Override
protected BlockStateContainer createBlockState() {
return new BlockStateContainer(this, PLANT_TYPE);
}
@Override
public int getMetaFromState(IBlockState state) {
return state.getValue(PLANT_TYPE).ordinal();
}
@Override
public IBlockState getStateFromMeta(int meta) {
return getDefaultState().withProperty(PLANT_TYPE, PlantType.values()[meta]);
}
@Override
public List<ItemStack> getDrops(IBlockAccess world, BlockPos pos, IBlockState state, int fortune) {
return new ArrayList<>();
}
@Override
public boolean canPlaceBlockAt(World worldIn, BlockPos pos) {
return super.canPlaceBlockAt(worldIn, pos) || BotanyCore.getGardening().isSoil(worldIn.getBlockState(pos).getBlock());
}
@Override
public int damageDropped(IBlockState state) {
return getMetaFromState(state);
}
@Override
@SideOnly(Side.CLIENT)
public void registerBlockIcons(IIconRegister register) {
for (Type t : Type.values()) {
t.icon = Botany.proxy.getIcon(register, t.name().toLowerCase());
public void getSubBlocks(Item p_149666_1_, CreativeTabs p_149666_2_, NonNullList<ItemStack> subBlocks) {
for (PlantType type : PlantType.values()) {
subBlocks.add(type.get());
}
}
@Override
protected boolean canPlaceBlockOn(Block block) {
return super.canPlaceBlockOn(block) || Gardening.isSoil(block);
}
@Override
@SideOnly(Side.CLIENT)
public IIcon getIcon(int side, int meta) {
return Type.values()[meta % Type.values().length].icon;
}
@Override
public int damageDropped(int damage) {
return damage;
}
@Override
@SideOnly(Side.CLIENT)
public void getSubBlocks(Item item, CreativeTabs tab, List list) {
for (Type type : Type.values()) {
list.add(type.get());
}
}
@Override
public void updateTick(World world, int x, int y, int z, Random random) {
Type type = Type.get(world.getBlockMetadata(x, y, z));
if (random.nextInt(4) == 0) {
if (type == Type.Weeds) {
world.setBlockMetadataWithNotify(x, y, z, Type.WeedsLong.ordinal(), 2);
} else if (type == Type.WeedsLong) {
world.setBlockMetadataWithNotify(x, y, z, Type.WeedsVeryLong.ordinal(), 2);
} else if (type == Type.DeadFlower) {
world.setBlockMetadataWithNotify(x, y, z, Type.DecayingFlower.ordinal(), 2);
} else if (type == Type.DecayingFlower) {
world.setBlockToAir(x, y, z);
public void updateTick(World world, BlockPos pos, IBlockState state, Random rand) {
PlantType type = state.getValue(PLANT_TYPE);
if (rand.nextInt(4) == 0) {
if (type == PlantType.WEEDS) {
world.setBlockState(pos, state.withProperty(PLANT_TYPE, PlantType.WEEDS_LONG), 2);
} else if (type == PlantType.WEEDS_LONG) {
world.setBlockState(pos, state.withProperty(PLANT_TYPE, PlantType.WEEDS_VERY_LONG), 2);
} else if (type == PlantType.DEAD_FLOWER) {
world.setBlockState(pos, state.withProperty(PLANT_TYPE, PlantType.DECAYING_FLOWER), 2);
} else if (type == PlantType.DECAYING_FLOWER) {
world.setBlockToAir(pos);
return;
}
}
if (random.nextInt(6) == 0) {
if (type == Type.Weeds) {
world.setBlockToAir(x, y, z);
} else if (type == Type.WeedsLong) {
world.setBlockMetadataWithNotify(x, y, z, Type.Weeds.ordinal(), 2);
} else if (type == Type.WeedsVeryLong) {
world.setBlockMetadataWithNotify(x, y, z, Type.WeedsLong.ordinal(), 2);
if (rand.nextInt(6) == 0) {
if (type == PlantType.WEEDS) {
world.setBlockToAir(pos);
} else if (type == PlantType.WEEDS_LONG) {
world.setBlockState(pos, state.withProperty(PLANT_TYPE, PlantType.WEEDS), 2);
} else if (type == PlantType.WEEDS_VERY_LONG) {
world.setBlockState(pos, state.withProperty(PLANT_TYPE, PlantType.WEEDS_LONG), 2);
}
}
Block below = world.getBlock(x, y - 1, z);
if (!Gardening.isSoil(below)) {
Block below = world.getBlockState(pos.down()).getBlock();
if (!BotanyCore.getGardening().isSoil(below)) {
return;
}
IBlockSoil soil = (IBlockSoil) below;
if (random.nextInt(3) != 0) {
if (rand.nextInt(3) != 0) {
return;
}
if (type == Type.Weeds || type == Type.WeedsLong || type == Type.WeedsVeryLong) {
if (!soil.degrade(world, x, y - 1, z, EnumSoilType.LOAM)) {
soil.degrade(world, x, y - 1, z, EnumSoilType.SOIL);
if (type.isWeed()) {
if (!soil.degrade(world, pos.down(), EnumSoilType.LOAM)) {
soil.degrade(world, pos.down(), EnumSoilType.SOIL);
}
} else if (type == Type.DecayingFlower && !soil.fertilise(world, x, y - 1, z, EnumSoilType.LOAM)) {
soil.fertilise(world, x, y - 1, z, EnumSoilType.FLOWERBED);
} else if (type == PlantType.DECAYING_FLOWER && !soil.fertilise(world, pos.down(), EnumSoilType.LOAM)) {
soil.fertilise(world, pos.down(), EnumSoilType.FLOWERBED);
}
}
@Override
public boolean isReplaceable(IBlockAccess world, int x, int y, int z) {
public boolean isReplaceable(IBlockAccess worldIn, BlockPos pos) {
return true;
}
public enum Type {
Weeds("weeds"),
WeedsLong("longWeeds"),
WeedsVeryLong("veryLongWeeds"),
DeadFlower("deadFlower"),
DecayingFlower("decayingFlower");
public IIcon icon;
protected String name;
Type(String name) {
this.name = name;
}
public static Type get(int id) {
return values()[id % values().length];
}
public ItemStack get() {
return new ItemStack(Botany.plant, 1, ordinal());
}
public String getName() {
return I18N.localise("botany.plant." + name);
}
@Override
public EnumOffsetType getOffsetType() {
return EnumOffsetType.XZ;
}
}
@@ -1,60 +1,142 @@
package binnie.botany.gardening;
import javax.annotation.Nullable;
import java.util.Random;
import net.minecraft.block.Block;
import net.minecraft.block.SoundType;
import net.minecraft.block.material.Material;
import net.minecraft.block.properties.PropertyEnum;
import net.minecraft.block.state.BlockStateContainer;
import net.minecraft.block.state.IBlockState;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.init.Blocks;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.NonNullList;
import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.text.TextFormatting;
import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World;
import net.minecraftforge.common.IPlantable;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import forestry.api.core.IItemModelRegister;
import forestry.api.core.IModelManager;
import binnie.botany.Botany;
import binnie.botany.CreativeTabBotany;
import binnie.botany.api.EnumAcidity;
import binnie.botany.api.EnumMoisture;
import binnie.botany.api.EnumSoilType;
import binnie.botany.api.gardening.IBlockSoil;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
import net.minecraft.client.renderer.texture.IIconRegister;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.init.Blocks;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.util.AxisAlignedBB;
import net.minecraft.util.IIcon;
import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World;
import net.minecraftforge.common.IPlantable;
import net.minecraftforge.common.util.ForgeDirection;
import binnie.botany.api.IBlockSoil;
import binnie.botany.core.BotanyCore;
import binnie.core.util.I18N;
import java.util.List;
import java.util.Random;
public class BlockSoil extends Block implements IBlockSoil {
protected boolean weedKilled;
protected IIcon[] iconsTop;
protected IIcon[] iconsSide;
protected IIcon[] iconsNoWeed;
protected EnumSoilType type;
public class BlockSoil extends Block implements IBlockSoil, IItemModelRegister {
public static final PropertyEnum<EnumMoisture> MOISTURE = PropertyEnum.create("moisture", EnumMoisture.class);
public static final PropertyEnum<EnumAcidity> ACIDITY = PropertyEnum.create("acidity", EnumAcidity.class);
public static final AxisAlignedBB SOIL_BLOCK_AABB = new AxisAlignedBB(0.0D, 0.0D, 0.0D, 1.0D, 0.9375D, 1.0D);
private final boolean weedKilled;
private final EnumSoilType type;
public BlockSoil(EnumSoilType type, String blockName, boolean weedKilled) {
super(Material.ground);
super(Material.GROUND);
this.type = type;
this.weedKilled = weedKilled;
iconsTop = new IIcon[9];
iconsSide = new IIcon[9];
iconsNoWeed = new IIcon[9];
setUnlocalizedName("botany.soil." + type.getName());
setCreativeTab(CreativeTabBotany.instance);
setBlockName(blockName);
setRegistryName(blockName);
setTickRandomly(true);
setBlockBounds(0.0f, 0.0f, 0.0f, 1.0f, 0.9375f, 1.0f);
setLightOpacity(255);
setHardness(0.5f);
setStepSound(Block.soundTypeGravel);
setSoundType(SoundType.GROUND);
}
public static int getMeta(EnumAcidity acid, EnumMoisture moisture) {
return acid.ordinal() * 3 + moisture.ordinal();
}
public static String getPH(ItemStack stack, boolean withColor, boolean byNeutralNone) {
EnumAcidity ph = EnumAcidity.values()[stack.getItemDamage() / 3];
if (byNeutralNone) {
if (ph == EnumAcidity.NEUTRAL) {
return "";
}
}
return TextFormatting.GRAY + I18N.localise("botany.ph") + ": " + ph.getLocalisedName(withColor);
}
public static String getMoisture(ItemStack stack, boolean withColor, boolean byNormalNone) {
EnumMoisture moisure = EnumMoisture.values()[stack.getItemDamage() % 3];
if (byNormalNone) {
if (moisure == EnumMoisture.NORMAL) {
return "";
}
}
return TextFormatting.GRAY + I18N.localise("botany.moisture") + ": " + moisure.getLocalisedName(withColor);
}
@Override
@SideOnly(Side.CLIENT)
public void getSubBlocks(Item item, CreativeTabs tab, List list) {
public boolean shouldSideBeRendered(IBlockState blockState, IBlockAccess blockAccess, BlockPos pos, EnumFacing side) {
switch (side) {
case UP:
return true;
case NORTH:
case SOUTH:
case WEST:
case EAST:
IBlockState iblockstate = blockAccess.getBlockState(pos.offset(side));
Block block = iblockstate.getBlock();
return !iblockstate.isOpaqueCube() && block != Blocks.FARMLAND && block != Blocks.GRASS_PATH && block != this;
}
return super.shouldSideBeRendered(blockState, blockAccess, pos, side);
}
/**
* Used to determine ambient occlusion and culling when rebuilding chunks for render
*/
@Override
public boolean isOpaqueCube(IBlockState state) {
return false;
}
@Override
public boolean isFullCube(IBlockState state) {
return false;
}
@Override
public String getUnlocalizedName() {
return super.getUnlocalizedName().replaceFirst("tile.", "");
}
@Override
public AxisAlignedBB getBoundingBox(IBlockState state, IBlockAccess source, BlockPos pos) {
return SOIL_BLOCK_AABB;
}
@Nullable
@Override
public AxisAlignedBB getCollisionBoundingBox(IBlockState blockState, IBlockAccess worldIn, BlockPos pos) {
return SOIL_BLOCK_AABB;
}
@Override
public AxisAlignedBB getSelectedBoundingBox(IBlockState state, World worldIn, BlockPos pos) {
return SOIL_BLOCK_AABB;
}
@Override
@SideOnly(Side.CLIENT)
public void getSubBlocks(Item itemIn, CreativeTabs tab, NonNullList<ItemStack> list) {
for (int i = 0; i < 9; ++i) {
list.add(new ItemStack(this, 1, i));
}
@@ -62,153 +144,172 @@ public class BlockSoil extends Block implements IBlockSoil {
@Override
@SideOnly(Side.CLIENT)
public IIcon getIcon(IBlockAccess world, int x, int y, int z, int side) {
return getIcon(side, world.getBlockMetadata(x, y, z));
}
public void registerModel(Item item, IModelManager manager) {
for (EnumAcidity acidity : EnumAcidity.values()) {
for (EnumMoisture moisture : EnumMoisture.values()) {
String modelName = "";
if (acidity != EnumAcidity.NEUTRAL) {
modelName += acidity.getName();
}
@Override
@SideOnly(Side.CLIENT)
public IIcon getIcon(int side, int meta) {
meta = ((meta >= 9) ? 8 : meta);
if (side == 1) {
return weedKilled ? iconsNoWeed[meta] : iconsTop[meta];
}
return (side == 0) ? Blocks.dirt.getIcon(side, 0) : iconsSide[meta];
}
if (moisture != EnumMoisture.NORMAL) {
if (!modelName.isEmpty()) {
modelName += "_";
}
modelName += moisture.getName();
}
@Override
@SideOnly(Side.CLIENT)
public void registerBlockIcons(IIconRegister register) {
for (EnumMoisture moisture : EnumMoisture.values()) {
for (EnumAcidity pH : EnumAcidity.values()) {
int index = moisture.ordinal() + pH.ordinal() * 3;
String id = "soil/" + getType().getID() + "." + pH.getID() + "." + moisture.getID();
iconsTop[index] = Botany.proxy.getIcon(register, id + ".0");
iconsSide[index] = Botany.proxy.getIcon(register, id + ".1");
iconsNoWeed[index] = Botany.proxy.getIcon(register, id + ".2");
if (modelName.isEmpty()) {
modelName = "normal";
}
String identifier;
if (weedKilled) {
identifier = type.getName() + "_no_weed/" + modelName;
} else {
identifier = type.getName() + "/" + modelName;
}
manager.registerItemModel(item, moisture.ordinal() + acidity.ordinal() * 3, identifier);
}
}
}
@Override
protected BlockStateContainer createBlockState() {
return new BlockStateContainer(this, MOISTURE, ACIDITY);
}
@Override
public int getMetaFromState(IBlockState state) {
return getMeta(state.getValue(ACIDITY), state.getValue(MOISTURE));
}
@Override
public IBlockState getStateFromMeta(int meta) {
EnumMoisture moisture = EnumMoisture.values()[meta % 3];
EnumAcidity acidity = EnumAcidity.values()[meta / 3];
return getDefaultState().withProperty(MOISTURE, moisture).withProperty(ACIDITY, acidity);
}
public EnumSoilType getType() {
return type;
}
@Override
public int damageDropped(int damage) {
return damage;
public int damageDropped(IBlockState state) {
return getMetaFromState(state);
}
@Override
public void updateTick(World world, int x, int y, int z, Random random) {
int meta = world.getBlockMetadata(x, y, z);
EnumMoisture moisture = EnumMoisture.values()[meta % 3];
EnumAcidity acidity = EnumAcidity.values()[meta / 3];
EnumMoisture desiredMoisture = Gardening.getNaturalMoisture(world, x, y, z);
public void updateTick(World world, BlockPos pos, IBlockState state, Random rand) {
EnumMoisture moisture = state.getValue(MOISTURE);
EnumMoisture desiredMoisture = BotanyCore.getGardening().getNaturalMoisture(world, pos);
if (desiredMoisture.ordinal() > moisture.ordinal()) {
moisture = ((moisture == EnumMoisture.DRY) ? EnumMoisture.NORMAL : EnumMoisture.DAMP);
}
if (desiredMoisture.ordinal() < moisture.ordinal()) {
} else if (desiredMoisture.ordinal() < moisture.ordinal()) {
moisture = ((moisture == EnumMoisture.DAMP) ? EnumMoisture.NORMAL : EnumMoisture.DRY);
}
int meta2 = getMeta(acidity, moisture);
if (meta != meta2) {
world.setBlockMetadataWithNotify(x, y, z, meta2, 2);
IBlockState blockState = state.withProperty(MOISTURE, moisture);
if (state != blockState) {
world.setBlockState(pos, blockState, 2);
}
if (!weedKilled && random.nextInt(5 - getType(world, x, y, z).ordinal()) == 0 && world.getBlock(x, y + 1, z) == Blocks.air) {
world.setBlock(x, y + 1, z, Botany.plant, BlockPlant.Type.Weeds.ordinal(), 2);
if (!weedKilled) {
if (rand.nextInt(5 - getType(world, pos).ordinal()) != 0) {
return;
}
pos = pos.up();
if (!world.isAirBlock(pos)) {
return;
}
world.setBlockState(pos, Botany.plant.getStateFromMeta(PlantType.WEEDS.ordinal()), 2);
}
}
@Override
public AxisAlignedBB getCollisionBoundingBoxFromPool(World world, int x, int y, int z) {
return AxisAlignedBB.getBoundingBox(x, y, z, x + 1, y + 1, z + 1);
public void neighborChanged(IBlockState state, World worldIn, BlockPos pos, Block blockIn, BlockPos fromPos) {
super.neighborChanged(state, worldIn, pos, blockIn, fromPos);
if (worldIn.getBlockState(pos.up()).getMaterial().isSolid()) {
worldIn.setBlockState(pos, Blocks.DIRT.getDefaultState());
}
}
@Override
public boolean isOpaqueCube() {
return false;
public EnumAcidity getPH(World world, BlockPos pos) {
return world.getBlockState(pos).getValue(ACIDITY);
}
@Override
public boolean renderAsNormalBlock() {
return false;
public EnumMoisture getMoisture(World world, BlockPos pos) {
return world.getBlockState(pos).getValue(MOISTURE);
}
@Override
public EnumAcidity getPH(World world, int x, int y, int z) {
return EnumAcidity.values()[world.getBlockMetadata(x, y, z) / 3];
}
@Override
public EnumMoisture getMoisture(World world, int x, int y, int z) {
return EnumMoisture.values()[world.getBlockMetadata(x, y, z) % 3];
}
@Override
public EnumSoilType getType(World world, int x, int y, int z) {
public EnumSoilType getType(World world, BlockPos pos) {
return type;
}
@Override
public boolean fertilise(World world, int x, int y, int z, EnumSoilType maxLevel) {
EnumSoilType type = getType(world, x, y, z);
public boolean fertilise(World world, BlockPos pos, EnumSoilType maxLevel) {
EnumSoilType type = getType(world, pos);
if (type.ordinal() >= maxLevel.ordinal()) {
return false;
}
int meta = world.getBlockMetadata(x, y, z);
return world.setBlock(x, y, z, Gardening.getSoilBlock(maxLevel, weedKilled), meta, 2);
IBlockState old = world.getBlockState(pos);
return world.setBlockState(pos, BotanyCore.getGardening().getSoilBlock(maxLevel, weedKilled).getDefaultState().withProperty(ACIDITY, old.getValue(ACIDITY)).withProperty(MOISTURE, old.getValue(MOISTURE)), 2);
}
@Override
public boolean degrade(World world, int x, int y, int z, EnumSoilType minLevel) {
EnumSoilType type = getType(world, x, y, z);
public boolean degrade(World world, BlockPos pos, EnumSoilType minLevel) {
EnumSoilType type = getType(world, pos);
if (type.ordinal() <= minLevel.ordinal()) {
return false;
}
int meta = world.getBlockMetadata(x, y, z);
return world.setBlock(x, y, z, Gardening.getSoilBlock(minLevel, weedKilled), meta, 2);
IBlockState old = world.getBlockState(pos);
return world.setBlockState(pos, BotanyCore.getGardening().getSoilBlock(minLevel, weedKilled).getDefaultState().withProperty(ACIDITY, old.getValue(ACIDITY)).withProperty(MOISTURE, old.getValue(MOISTURE)), 2);
}
@Override
public boolean setPH(World world, int x, int y, int z, EnumAcidity pH) {
int meta = getMeta(pH, getMoisture(world, x, y, z));
return world.setBlockMetadataWithNotify(x, y, z, meta, 2);
public boolean setPH(World world, BlockPos pos, EnumAcidity pH) {
IBlockState blockState = world.getBlockState(pos);
return world.setBlockState(pos, blockState.withProperty(ACIDITY, pH));
}
@Override
public boolean setMoisture(World world, int x, int y, int z, EnumMoisture moisture) {
int meta = getMeta(getPH(world, x, y, z), moisture);
return world.setBlockMetadataWithNotify(x, y, z, meta, 2);
public boolean setMoisture(World world, BlockPos pos, EnumMoisture moisture) {
IBlockState blockState = world.getBlockState(pos);
return world.setBlockState(pos, blockState.withProperty(MOISTURE, moisture));
}
@Override
public void onNeighborBlockChange(World world, int x, int y, int z, Block block) {
super.onNeighborBlockChange(world, x, y, z, block);
if (world.isSideSolid(x, y + 1, z, ForgeDirection.DOWN, false)) {
world.setBlock(x, y, z, Blocks.dirt, 0, 2);
public void onNeighborChange(IBlockAccess world, BlockPos pos, BlockPos neighbor) {
super.onNeighborChange(world, pos, neighbor);
if (world.isSideSolid(pos.up(), EnumFacing.DOWN, false)) {
((World) world).setBlockState(pos, Blocks.DIRT.getDefaultState(), 2);
}
}
@Override
public boolean canSustainPlant(IBlockAccess world, int x, int y, int z, ForgeDirection direction, IPlantable plantable) {
Block plant = plantable.getPlant(world, x, y + 1, z);
if (plant == Botany.flower) {
public boolean canSustainPlant(IBlockState state, IBlockAccess world, BlockPos pos, EnumFacing direction, IPlantable plantable) {
IBlockState plant = plantable.getPlant(world, pos.up());
if (plant.getBlock() == Botany.flower) {
return true;
}
if (plant == Botany.plant) {
return !weedKilled || !BlockPlant.isWeed(world, x, y, z);
if (plant.getBlock() == Botany.plant) {
return !weedKilled || !BlockPlant.isWeed(world, pos);
}
return world instanceof World
&& Blocks.dirt.canSustainPlant(world, x, y, z, direction, plantable);
return world instanceof World && Blocks.DIRT.canSustainPlant(state, world, pos, direction, plantable);
}
@Override
public boolean resistsWeeds(World world, int x, int y, int z) {
public boolean resistsWeeds(World world, BlockPos pos) {
return weedKilled;
}
public boolean isWeedKilled() {
return weedKilled;
}
}
@@ -1,213 +1,197 @@
package binnie.botany.gardening;
import javax.annotation.Nullable;
import java.util.Collection;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.Map;
import net.minecraft.block.Block;
import net.minecraft.block.state.IBlockState;
import net.minecraft.init.Blocks;
import net.minecraft.item.Item;
import net.minecraft.item.ItemBlock;
import net.minecraft.item.ItemStack;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import net.minecraft.world.biome.Biome;
import forestry.api.climate.IClimateInfo;
import forestry.api.core.EnumTemperature;
import forestry.api.core.ForestryAPI;
import binnie.botany.Botany;
import binnie.botany.api.EnumAcidity;
import binnie.botany.api.EnumMoisture;
import binnie.botany.api.EnumSoilType;
import binnie.botany.api.IBlockSoil;
import binnie.botany.api.IFlower;
import binnie.botany.api.gardening.IBlockSoil;
import binnie.botany.flower.TileEntityFlower;
import binnie.botany.api.IGardeningManager;
import binnie.botany.items.BotanyItems;
import binnie.core.BinnieCore;
import com.mojang.authlib.GameProfile;
import forestry.api.core.EnumTemperature;
import net.minecraft.block.Block;
import net.minecraft.init.Blocks;
import net.minecraft.item.Item;
import net.minecraft.item.ItemBlock;
import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.world.World;
import net.minecraft.world.biome.BiomeGenBase;
import java.util.Collection;
import java.util.LinkedHashMap;
import java.util.Map;
public class Gardening implements IGardeningManager {
private final Map<ItemStack, Integer> fertiliserAcid = new LinkedHashMap<>();
private final Map<ItemStack, Integer> fertiliserAlkaline = new LinkedHashMap<>();
private final Map<ItemStack, Integer> fertiliserNutrient = new LinkedHashMap<>();
public class Gardening {
public static Map<ItemStack, Integer> fertiliserAcid = new LinkedHashMap<>();
public static Map<ItemStack, Integer> fertiliserAlkaline = new LinkedHashMap<>();
public static Map<ItemStack, Integer> fertiliserNutrient = new LinkedHashMap<>();
public Gardening() {
// ignored
}
public static boolean isSoil(Block block) {
@Override
public boolean isSoil(Block block) {
return block instanceof IBlockSoil;
}
public static boolean isSoil(Item item) {
return item instanceof ItemBlock
&& isSoil(((ItemBlock) item).field_150939_a);
@Override
public boolean isSoil(Item item) {
return item instanceof ItemBlock && isSoil(((ItemBlock) item).getBlock());
}
public static EnumMoisture getNaturalMoisture(World world, int x, int y, int z) {
float bias = getBiomeMoisture(world.getBiomeGenForCoords(x, z), y);
@Override
public boolean isSoil(ItemStack item) {
return isSoil(item.getItem());
}
@Override
public EnumMoisture getNaturalMoisture(World world, BlockPos pos) {
float bias = getBiomeMoisture(world, pos);
for (int dx = -1; dx < 2; ++dx) {
for (int dz = -1; dz < 2; ++dz) {
if (dx != 0 || dz != 0) {
if (world.getBlock(x + dx, y, z + dz) == Blocks.sand) {
if (world.getBlockState(pos.add(dx, 0, dz)) == Blocks.SAND) {
bias -= 1.5;
} else if (world.getBlock(x + dx, y, z + dz) == Blocks.water) {
} else if (world.getBlockState(pos.add(dx, 0, dz)) == Blocks.WATER) {
bias += 1.5;
}
}
}
}
if (world.isRaining() && world.canBlockSeeTheSky(x, y + 1, z) && world.getPrecipitationHeight(x, z) <= y + 1) {
if (world.isRaining() && world.canBlockSeeSky(pos.up()) && world.getPrecipitationHeight(pos).getY() <= pos.getY() + 1) {
bias += 1.5;
}
for (int dx = -1; dx < 2; ++dx) {
for (int dz = -1; dz < 2; ++dz) {
if (dx != 0 || dz != 0) {
if (world.getBlock(x + dx, y, z + dz) == Blocks.gravel && bias > 0.0f) {
if (world.getBlockState(pos.add(dx, 0, dz)).getBlock() == Blocks.GRAVEL && bias > 0.0f) {
bias *= 0.4f;
}
}
}
}
if (bias <= -1.0f) {
return EnumMoisture.DRY;
}
return (bias >= 1.0f) ? EnumMoisture.DAMP : EnumMoisture.NORMAL;
return (bias <= -1.0f) ? EnumMoisture.DRY : ((bias >= 1.0f) ? EnumMoisture.DAMP : EnumMoisture.NORMAL);
}
public static EnumAcidity getNaturalPH(World world, int x, int y, int z) {
float bias = getBiomePH(world.getBiomeGenForCoords(x, z), y);
@Override
public EnumAcidity getNaturalPH(World world, BlockPos pos) {
float bias = getBiomePH(world, pos);
if (bias <= -1.0f) {
return EnumAcidity.ACID;
}
return (bias >= 1.0f) ? EnumAcidity.ALKALINE : EnumAcidity.NEUTRAL;
}
public static float getBiomeMoisture(BiomeGenBase biome, int H) {
double R = biome.rainfall;
double T = biome.temperature;
double m = 3.2 * (R - 0.5) - 0.4 * (1.0 + T + 0.5 * T * T) + 1.1 - 1.6 * (T - 0.9) * (T - 0.9) - 0.002 * (H - 64);
if (m == 0.0) {
return (float) m;
}
if (m < 0.0){
return (float) -Math.sqrt(m * m);
}
return (float) Math.sqrt(m * m);
@Override
public float getBiomeMoisture(World world, BlockPos pos) {
IClimateInfo info = ForestryAPI.climateManager.getInfo(world, pos);
double humidity = info.getHumidity();
double temperature = info.getTemperature();
double m = 3.2 * (humidity - 0.5) - 0.4 * (1.0 + temperature + 0.5 * temperature * temperature) + 1.1 - 1.6 * (temperature - 0.9) * (temperature - 0.9) - 0.002 * (pos.getY() - 64);
return (float) ((m == 0.0) ? m : ((m < 0.0) ? (-Math.sqrt(m * m)) : Math.sqrt(m * m)));
}
public static float getBiomePH(BiomeGenBase biome, int H) {
double R = biome.rainfall;
double T = biome.temperature;
return (float) (-3.0 * (R - 0.5) + 0.5 * (T - 0.699999988079071) * (T - 0.699999988079071) + 0.02f * (H - 64) - 0.15000000596046448);
@Override
public float getBiomePH(World world, BlockPos pos) {
IClimateInfo info = ForestryAPI.climateManager.getInfo(world, pos);
double humidity = info.getHumidity();
double temperature = info.getTemperature();
return (float) (-3.0 * (humidity - 0.5) + 0.5 * (temperature - 0.699999988079071) * (temperature - 0.699999988079071) + 0.02f * (pos.getY() - 64) - 0.15000000596046448);
}
public static void createSoil(World world, int x, int y, int z, EnumSoilType soil, EnumMoisture moisture, EnumAcidity acidity) {
@Override
public void plantSoil(World world, BlockPos pos, EnumSoilType soil, EnumMoisture moisture, EnumAcidity acidity) {
int meta = moisture.ordinal() + acidity.ordinal() * 3;
world.setBlock(x, y, z, getSoilBlock(soil), meta, 2);
world.setBlockState(pos, getSoilBlock(soil).getStateFromMeta(meta), 2);
}
public static boolean plant(World world, int x, int y, int z, IFlower flower, GameProfile owner) {
boolean set = world.setBlock(x, y, z, Botany.flower, 0, 2);
if (!set) {
return false;
}
TileEntity tileFlower = world.getTileEntity(x, y, z);
TileEntity below = world.getTileEntity(x, y - 1, z);
if (tileFlower != null && tileFlower instanceof TileEntityFlower) {
if (below instanceof TileEntityFlower) {
((TileEntityFlower) tileFlower).setSection(((TileEntityFlower) below).getSection());
} else {
((TileEntityFlower) tileFlower).create(flower, owner);
}
}
tryGrowSection(world, x, y, z);
return true;
@Override
public Collection<ItemStack> getAcidFertilisers() {
return Collections.unmodifiableSet(fertiliserAcid.keySet());
}
public static void tryGrowSection(World world, int x, int y, int z) {
if (!BinnieCore.proxy.isSimulating(world)) {
return;
}
TileEntity flower = world.getTileEntity(x, y, z);
if (flower == null || !(flower instanceof TileEntityFlower)) {
return;
}
IFlower iflower = ((TileEntityFlower) flower).getFlower();
int section = ((TileEntityFlower) flower).getSection();
if (iflower == null || section >= iflower.getGenome().getPrimary().getType().getSections() - 1 || iflower.getAge() <= 0) {
return;
}
world.setBlock(x, y + 1, z, Botany.flower, 0, 2);
TileEntity tileFlower = world.getTileEntity(x, y + 1, z);
if (tileFlower != null && tileFlower instanceof TileEntityFlower) {
((TileEntityFlower) tileFlower).setSection(section + 1);
}
@Override
public Collection<ItemStack> getAlkalineFertilisers() {
return Collections.unmodifiableSet(fertiliserAlkaline.keySet());
}
public static void onGrowFromSeed(World world, int x, int y, int z) {
tryGrowSection(world, x, y, z);
@Override
public Collection<ItemStack> getNutrientFertilisers() {
return Collections.unmodifiableSet(fertiliserNutrient.keySet());
}
public static Collection<ItemStack> getAcidFertilisers() {
return Gardening.fertiliserAcid.keySet();
@Override
public void registerAcidFertiliser(ItemStack stack, int strength) {
ModuleGardening.queuedAcidFertilisers.put(stack, strength);
fertiliserAcid.put(stack, strength);
}
public static Collection<ItemStack> getAlkalineFertilisers() {
return Gardening.fertiliserAlkaline.keySet();
@Override
public void registerAlkalineFertiliser(ItemStack stack, int strength) {
ModuleGardening.queuedAlkalineFertilisers.put(stack, strength);
fertiliserAlkaline.put(stack, strength);
}
public static Collection<ItemStack> getNutrientFertilisers() {
return Gardening.fertiliserNutrient.keySet();
@Override
public void registerNutrientFertiliser(ItemStack stack, int strength) {
ModuleGardening.queuedNutrientFertilisers.put(stack, strength);
fertiliserNutrient.put(stack, strength);
}
public static boolean isAcidFertiliser(ItemStack itemstack) {
@Override
public boolean isAcidFertiliser(ItemStack itemstack) {
for (ItemStack stack : getAcidFertilisers()) {
if (stack != null && stack.isItemEqual(itemstack)) {
if (!stack.isEmpty() && stack.isItemEqual(itemstack)) {
return true;
}
}
return false;
}
public static boolean isAlkalineFertiliser(ItemStack itemstack) {
@Override
public boolean isAlkalineFertiliser(ItemStack itemstack) {
for (ItemStack stack : getAlkalineFertilisers()) {
if (stack != null && stack.isItemEqual(itemstack)) {
if (!stack.isEmpty() && stack.isItemEqual(itemstack)) {
return true;
}
}
return false;
}
public static boolean isNutrientFertiliser(ItemStack itemstack) {
@Override
public boolean isNutrientFertiliser(ItemStack itemstack) {
for (ItemStack stack : getNutrientFertilisers()) {
if (stack != null && stack.isItemEqual(itemstack)) {
if (!stack.isEmpty() && stack.isItemEqual(itemstack)) {
return true;
}
}
return false;
}
public static int getFertiliserStrength(ItemStack stack) {
if (stack == null) {
return 1;
}
for (Map.Entry<ItemStack, Integer> entry : Gardening.fertiliserAcid.entrySet()) {
@Override
public int getFertiliserStrength(ItemStack stack) {
for (Map.Entry<ItemStack, Integer> entry : fertiliserAcid.entrySet()) {
if (entry.getKey().isItemEqual(stack)) {
return entry.getValue();
}
}
for (Map.Entry<ItemStack, Integer> entry : Gardening.fertiliserAlkaline.entrySet()) {
for (Map.Entry<ItemStack, Integer> entry : fertiliserAlkaline.entrySet()) {
if (entry.getKey().isItemEqual(stack)) {
return entry.getValue();
}
}
for (Map.Entry<ItemStack, Integer> entry : Gardening.fertiliserNutrient.entrySet()) {
for (Map.Entry<ItemStack, Integer> entry : fertiliserNutrient.entrySet()) {
if (entry.getKey().isItemEqual(stack)) {
return entry.getValue();
}
@@ -215,59 +199,73 @@ public class Gardening {
return 1;
}
public static boolean canTolerate(IFlower flower, World world, int x, int y, int z) {
if (flower == null || flower.getGenome() == null) {
@Override
public boolean canTolerate(@Nullable IFlower flower, World world, BlockPos pos) {
if (flower == null) {
return false;
}
int soilMeta = world.getBlockMetadata(x, y - 1, z);
BiomeGenBase biome = world.getBiomeGenForCoords(x, z);
return canTolerate(flower, EnumAcidity.values()[soilMeta / 3 % 3], EnumMoisture.values()[soilMeta % 3], EnumTemperature.getFromValue(biome.temperature));
IBlockState soil = world.getBlockState(pos.down());
Block soilBlock = soil.getBlock();
int soilMeta = soilBlock.getMetaFromState(soil);
Biome biome = world.getBiome(pos);
return canTolerate(
flower,
EnumAcidity.values()[soilMeta / 3 % 3],
EnumMoisture.values()[soilMeta % 3],
EnumTemperature.getFromValue(biome.getTemperature())
);
}
public static EnumSoilType getSoilType(World world, int x, int y, int z) {
if (world.getBlock(x, y, z) instanceof IBlockSoil) {
return ((IBlockSoil) world.getBlock(x, y, z)).getType(world, x, y, z);
@Override
public EnumSoilType getSoilType(World world, BlockPos pos) {
if (world.getBlockState(pos).getBlock() instanceof IBlockSoil) {
return ((IBlockSoil) world.getBlockState(pos).getBlock()).getType(world, pos);
}
return EnumSoilType.SOIL;
}
public static Block getSoilBlock(EnumSoilType type) {
@Override
public Block getSoilBlock(EnumSoilType type) {
return getSoilBlock(type, false);
}
public static Block getSoilBlock(EnumSoilType type, boolean weedkill) {
@Override
public Block getSoilBlock(EnumSoilType type, boolean weedKill) {
switch (type) {
case FLOWERBED:
return weedkill ? Botany.flowerbedNoWeed : Botany.flowerbed;
return weedKill ? Botany.flowerbedNoWeed : Botany.flowerbed;
case LOAM:
return weedkill ? Botany.loamNoWeed : Botany.loam;
return weedKill ? Botany.loamNoWeed : Botany.loam;
}
return weedkill ? Botany.soilNoWeed : Botany.soil;
return weedKill ? Botany.soilNoWeed : Botany.soil;
}
public static boolean canTolerate(IFlower flower, EnumAcidity ePH, EnumMoisture eMoisture, EnumTemperature eTemp) {
return flower.getGenome().canTolerate(ePH)
&& flower.getGenome().canTolerate(eMoisture)
&& flower.getGenome().canTolerate(eTemp);
@Override
public boolean canTolerate(IFlower flower, EnumAcidity acidity, EnumMoisture moisture, EnumTemperature temperature) {
return flower.getGenome().canTolerate(acidity)
&& flower.getGenome().canTolerate(moisture)
&& flower.getGenome().canTolerate(temperature);
}
public static boolean isWeedkiller(ItemStack heldItem) {
return heldItem != null
&& heldItem.isItemEqual(BotanyItems.Weedkiller.get(1));
@Override
public boolean isWeedkiller(ItemStack heldItem) {
return heldItem.isItemEqual(BotanyItems.WEEDKILLER.get(1));
}
public static boolean addWeedKiller(World world, int x, int y, int z) {
if (!(world.getBlock(x, y, z) instanceof IBlockSoil)) {
@Override
public boolean addWeedKiller(World world, BlockPos pos) {
if (!(world.getBlockState(pos).getBlock() instanceof IBlockSoil)) {
return false;
}
EnumSoilType type = getSoilType(world, x, y, z);
EnumSoilType type = getSoilType(world, pos);
Block block = getSoilBlock(type, true);
boolean done = world.setBlock(x, y, z, block, world.getBlockMetadata(x, y, z), 2);
if (done && BlockPlant.isWeed(world, x, y + 1, z)) {
world.setBlockToAir(x, y + 1, z);
IBlockState oldState = world.getBlockState(pos);
IBlockState newState = block.getStateFromMeta(oldState.getBlock().getMetaFromState(oldState));
boolean done = world.setBlockState(pos, newState, 2);
if (done && BlockPlant.isWeed(world, pos.up())) {
world.setBlockToAir(pos.up());
}
return done;
}
@@ -1,86 +1,55 @@
package binnie.botany.gardening;
import binnie.botany.api.EnumAcidity;
import binnie.botany.api.EnumMoisture;
import binnie.botany.api.EnumSoilType;
import binnie.core.util.I18N;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import net.minecraft.block.Block;
import java.util.List;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemBlock;
import net.minecraft.item.ItemStack;
import net.minecraft.util.EnumChatFormatting;
import net.minecraft.util.text.TextFormatting;
import java.util.List;
import java.util.Locale;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import binnie.botany.api.EnumSoilType;
import binnie.core.util.I18N;
public class ItemSoil extends ItemBlock {
protected EnumSoilType type;
private final EnumSoilType type;
private final boolean noWeed;
private boolean noWeed;
public ItemSoil(Block block) {
public ItemSoil(BlockSoil block) {
super(block);
type = ((BlockSoil) field_150939_a).getType();
noWeed = ((BlockSoil) field_150939_a).weedKilled;
type = block.getType();
noWeed = block.isWeedKilled();
hasSubtypes = true;
}
@Override
@SideOnly(Side.CLIENT)
public void addInformation(ItemStack stack, EntityPlayer player, List tooltip, boolean advanced) {
super.addInformation(stack, player, tooltip, advanced);
EnumMoisture moisture = EnumMoisture.values()[stack.getItemDamage() % 3];
EnumAcidity acidity = EnumAcidity.values()[stack.getItemDamage() / 3];
public void addInformation(ItemStack stack, EntityPlayer playerIn, List<String> tooltip, boolean advanced) {
String info = "";
if (moisture == EnumMoisture.DRY) {
info += EnumChatFormatting.YELLOW
+ I18N.localise("botany.moisture.dry")
+ EnumChatFormatting.RESET;
}
if (moisture == EnumMoisture.DAMP) {
info += EnumChatFormatting.YELLOW
+ I18N.localise("botany.moisture.damp")
+ EnumChatFormatting.RESET;
}
if (acidity == EnumAcidity.ACID) {
if (info.length() > 0) {
info += ", ";
}
info += EnumChatFormatting.YELLOW
+ I18N.localise("botany.ph.acid")
+ EnumChatFormatting.RESET;
}
if (acidity == EnumAcidity.ALKALINE) {
if (info.length() > 0) {
info += ", ";
}
info += EnumChatFormatting.YELLOW
+ I18N.localise("botany.ph.alkaline")
+ EnumChatFormatting.RESET;
info += BlockSoil.getMoisture(stack, true, true);
if (info.length() > 0) {
info += ", ";
}
info += BlockSoil.getPH(stack, true, true);
if (info.length() > 0) {
tooltip.add(info);
}
if (noWeed) {
tooltip.add(I18N.localise("botany.soil.weedkiller"));
tooltip.add(TextFormatting.GREEN + I18N.localise("botany.soil.weedkiller"));
}
}
@Override
public String getItemStackDisplayName(ItemStack stack) {
String soilName = type.name().toLowerCase(Locale.ENGLISH);
return I18N.localise("botany.soil." + soilName);
return getUnlocalizedNameInefficiently(stack).trim();
}
@Override
public int getMetadata(int meta) {
return meta;
public int getMetadata(int damage) {
return damage;
}
}
@@ -1,84 +1,93 @@
package binnie.botany.gardening;
import binnie.botany.Botany;
import binnie.botany.CreativeTabBotany;
import binnie.botany.api.EnumAcidity;
import binnie.botany.api.EnumMoisture;
import binnie.botany.api.EnumSoilType;
import binnie.botany.api.gardening.IBlockSoil;
import binnie.core.BinnieCore;
import binnie.core.util.I18N;
import binnie.genetics.genetics.AlleleHelper;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import net.minecraft.block.Block;
import net.minecraft.client.renderer.texture.IIconRegister;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.util.ChatComponentText;
import net.minecraft.util.EnumChatFormatting;
import net.minecraft.util.IChatComponent;
import net.minecraft.util.EnumActionResult;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.EnumHand;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.text.ITextComponent;
import net.minecraft.util.text.TextComponentString;
import net.minecraft.util.text.TextFormatting;
import net.minecraft.world.World;
public class ItemSoilMeter extends Item {
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import forestry.api.core.IItemModelRegister;
import forestry.api.core.IModelManager;
import binnie.botany.CreativeTabBotany;
import binnie.botany.api.EnumAcidity;
import binnie.botany.api.EnumMoisture;
import binnie.botany.api.IBlockSoil;
import binnie.botany.api.IGardeningManager;
import binnie.botany.core.BotanyCore;
import binnie.core.BinnieCore;
import binnie.core.util.I18N;
public class ItemSoilMeter extends Item implements IItemModelRegister {
public ItemSoilMeter() {
setCreativeTab(CreativeTabBotany.instance);
setUnlocalizedName("soilMeter");
setUnlocalizedName("botany.soil_meter");
setMaxStackSize(1);
setRegistryName("soil_meter");
}
@Override
public boolean onItemUse(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int side, float blockX, float blockY, float blockZ) {
Block block = world.getBlock(x, y, z);
if (!Gardening.isSoil(block)) {
y--;
block = world.getBlock(x, y, z);
public static String getPH(ItemStack stack, boolean withColor, boolean byNeutralNone) {
EnumAcidity ph = EnumAcidity.values()[stack.getItemDamage() / 3];
if (byNeutralNone) {
if (ph == EnumAcidity.NEUTRAL) {
return "";
}
}
if (Gardening.isSoil(block) && !BinnieCore.proxy.isSimulating(world)) {
IBlockSoil soil = (IBlockSoil) block;
EnumSoilType type = soil.getType(world, x, y, z);
EnumMoisture moisture = soil.getMoisture(world, x, y, z);
EnumAcidity pH = soil.getPH(world, x, y, z);
EnumChatFormatting[] colors = new EnumChatFormatting[]{
EnumChatFormatting.DARK_GRAY,
EnumChatFormatting.GOLD,
EnumChatFormatting.LIGHT_PURPLE,
};
String info = I18N.localise("botany.soil.tooltip.type") + " ";
info += colors[type.ordinal()] + AlleleHelper.toDisplay(type) + EnumChatFormatting.RESET;
colors = new EnumChatFormatting[]{
EnumChatFormatting.YELLOW,
EnumChatFormatting.GRAY,
EnumChatFormatting.BLUE,
};
info += ", " + I18N.localise("botany.soil.tooltip.moisture") + " ";
info += colors[moisture.ordinal()] + AlleleHelper.toDisplay(moisture) + EnumChatFormatting.RESET;
colors = new EnumChatFormatting[]{
EnumChatFormatting.RED,
EnumChatFormatting.GREEN,
EnumChatFormatting.AQUA,
};
info += ", " + I18N.localise("botany.soil.tooltip.pH") + " ";
info += colors[pH.ordinal()] + AlleleHelper.toDisplay(pH) + EnumChatFormatting.RESET;
IChatComponent chat = new ChatComponentText(info);
player.addChatMessage(chat);
}
return super.onItemUse(stack, player, world, x, y, z, side, blockX, blockY, blockZ);
return TextFormatting.GRAY + I18N.localise("botany.ph") + ": " + ph.getLocalisedName(withColor);
}
public static String getMoisture(ItemStack stack, boolean withColor, boolean byNormalNone) {
EnumMoisture moisure = EnumMoisture.values()[stack.getItemDamage() % 3];
if (byNormalNone) {
if (moisure == EnumMoisture.NORMAL) {
return "";
}
}
return TextFormatting.GRAY + I18N.localise("botany.moisture") + ": " + moisure.getLocalisedName(withColor);
}
@Override
@SideOnly(Side.CLIENT)
public void registerIcons(IIconRegister register) {
itemIcon = Botany.proxy.getIcon(register, "soilMeter");
@Override
public void registerModel(Item item, IModelManager manager) {
manager.registerItemModel(item, 0);
}
@Override
public String getItemStackDisplayName(ItemStack stack) {
return I18N.localise("botany.item.soilMeter.name");
public EnumActionResult onItemUse(EntityPlayer player, World worldIn, BlockPos pos, EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ) {
Block block = worldIn.getBlockState(pos).getBlock();
IGardeningManager gardening = BotanyCore.getGardening();
if (!gardening.isSoil(block)) {
pos = pos.down();
block = worldIn.getBlockState(pos).getBlock();
}
if (!gardening.isSoil(block)) {
pos = pos.down();
block = worldIn.getBlockState(pos).getBlock();
}
if (gardening.isSoil(block) && !BinnieCore.getBinnieProxy().isSimulating(worldIn)) {
IBlockSoil soil = (IBlockSoil) block;
String info = I18N.localise("botany.soil.type") + ": "
+ soil.getType(worldIn, pos).getTranslated() + ", "
+ TextFormatting.WHITE + I18N.localise("botany.moisture") + ": "
+ soil.getMoisture(worldIn, pos).getLocalisedName(true) + ", "
+ TextFormatting.WHITE + I18N.localise("botany.ph") + ": "
+ soil.getPH(worldIn, pos).getLocalisedName(true);
ITextComponent chat = new TextComponentString(info);
player.sendStatusMessage(chat, false);
}
return EnumActionResult.SUCCESS;
}
}
Loaded 100 of 2642 files, more files were not shown because too many files have changed in this diff. Show more