Compare commits

..
184 Commits
Author SHA1 Message Date
mezz 1ef2f23604 Update for latest Forestry, add modId to genetic item tooltips 2017-10-03 00:25:17 -07:00
mezz de6028e85d Update to 1.12.2 2017-09-19 21:51:24 -07:00
mezz 4689fef8c3 Revert "Downgrade gradle to 2.14"
This reverts commit f13bfc0a63.
2017-08-28 23:46:11 -07:00
mezz f13bfc0a63 Downgrade gradle to 2.14 2017-08-28 23:13:00 -07:00
mezz 9342817813 Cleanup 2017-08-28 22:59:23 -07:00
mezz caa307e72e Fix #293 Crash when opening Arborist database 2017-08-27 14:58:05 -07:00
mezz 1a9b0839a1 Disable gradle daemon 2017-08-26 16:20:41 -07:00
mezz 03f562a300 Revert "Update gradle to 4.1"
This reverts commit f1e7a198e5.
2017-08-26 16:17:20 -07:00
mezz f1e7a198e5 Update gradle to 4.1 2017-08-26 14:12:10 -07:00
mezz 925649c486 Try adding more ram for gradle 2017-08-26 13:46:37 -07:00
mezz 72ea6b71be Update dependencies 2017-08-26 13:39:38 -07:00
Nedelosk 2794bd076a Update Forestry 2017-08-26 20:34:40 +02:00
mezz 4566890273 Fix #274 Fix stone hive generation, increase water hive generation.
(Thanks to @p-schneider)
2017-08-26 00:00:31 -07:00
mezz 4c03896354 Fix #288 Fix compartments have two tabs selected when first opened 2017-08-25 23:53:58 -07:00
mezz 266657a3ab Cleanup unused imports 2017-08-25 23:13:08 -07:00
mezz 1d97fc17e6 Fix errors when placing fruit press 2017-08-25 23:13:00 -07:00
mezz adef8dc0e4 Fix #290 Compartment Crash on Opening 2017-08-25 23:12:39 -07:00
mezz 37c3231624 Try increasing gradle ram 2017-08-24 23:45:04 -07:00
mezz 06ad753490 Try disabling the gradle daemon 2017-08-24 23:36:47 -07:00
mezz 76cfaaed83 Fix #287 Missing design project from main jar 2017-08-24 23:22:27 -07:00
mezz f400985ab3 Register error states explicitly 2017-08-24 23:03:52 -07:00
mezz a12e293eed Convert anonymous inner classes to static inner classes.
Should fix the build issue, which is caused by the bug described here:
https://github.com/MinecraftForge/Srg2Source/pull/17
2017-08-20 23:48:43 -07:00
mezz de33285994 #284 Fix hive pickblock (fixes Just Enough Resources worldgen recipes) 2017-08-20 21:52:46 -07:00
mezz 6873c36d81 Remove ExtraTrees dependency from Botany
Move shared code to a new Design library mod
2017-08-19 12:49:58 -07:00
mezz 3fc36f8e37 Add 1.12 to accepted Forge versions 2017-08-18 23:23:01 -07:00
mezz 134efac45b Move some block classes from core-api to core 2017-08-18 21:53:02 -07:00
mezz a19fccc5d0 Update to 1.12.1 2017-08-18 21:29:25 -07:00
mezz fc2f1c5930 Improve lumber mill recipe handling 2017-08-17 21:46:38 -07:00
mezz ca4da294b4 Fix #273 Crash with Dimensional Control mod 2017-08-16 22:03:17 -07:00
Nedelosk a41e6d32a1 Merge remote-tracking branch 'origin/master-MC1.12' into master-MC1.12 2017-08-16 23:28:57 +02:00
Nedelosk 12f4f55799 Fix #272 Fruit Name Issue 2017-08-16 23:28:38 +02:00
mezz 9fe388beee Remove genetics-main dependency from extrabees and extratrees 2017-08-16 00:10:34 -07:00
Nedelosk a0f239bd92 Fix missing Planks 2017-08-15 21:41:37 +02:00
Nedelosk 7d88eb7ebb Fix #264 Move recipe registration from postInit to init 2017-08-14 14:55:29 +02:00
Nedelosk 53aa5fc6d6 Fix #263 It Crashes (game won't start) MC1.12 Forge 2443 2017-08-14 14:17:36 +02:00
mezz 57d30512e3 Mark as working on 1.12.1 on CurseForge 2017-08-13 22:04:58 -07:00
mezz 7de1c86d29 Remove the genetics dependency on botany-api 2017-08-13 21:53:59 -07:00
mezz 8fa3d5ece8 Fix a broken translation format string 2017-08-13 20:44:31 -07:00
mezz efc88324c6 Fix cases where we use the Forestry log 2017-08-13 20:44:18 -07:00
mezz 527044da56 Move the apiarist database out of genetics and in to extrabees 2017-08-13 20:42:53 -07:00
mezz 50a0887329 Remove extrabees-api 2017-08-13 19:34:20 -07:00
mezz 79ea282f9b Remove genetics dependency on extrabees 2017-08-13 17:16:08 -07:00
mezz 60395a0ec7 Untangle the Genetics Analyst from the other modules 2017-08-13 16:23:14 -07:00
Nedelosk 5ecb465d01 Clean Up Extra Trees Planks 2017-08-13 21:47:32 +02:00
Nedelosk e9556c44f9 Clean Up Extra Trees 2017-08-13 19:09:18 +02:00
Nedelosk 868cedbf6f Clean Up StyleSheets 2017-08-13 17:11:03 +02:00
Nedelosk 7ede85dfb8 Create punnett stylesheet json file 2017-08-13 15:04:39 +02:00
Nedelosk fab5b82cbe Clean Up Stylesheet loading 2017-08-13 14:43:52 +02:00
Nedelosk fdb9a14962 Merge branch 'master-MC1.12' of https://github.com/ForestryMC/Binnie into master-MC1.12 2017-08-13 12:39:01 +02:00
Nedelosk 92cc62950e Move Tree Breeding System 2017-08-13 12:38:54 +02:00
mezz ef90f2228b Split "api" into one api module for every module 2017-08-12 21:16:54 -07:00
mezz 8600dc9e66 Fix missing core api from output jar 2017-08-12 18:51:18 -07:00
mezz 0f5861f015 Clean up IBorder 2017-08-12 18:42:37 -07:00
mezz 68e966800e Make core only depend on its own api, nothing else 2017-08-12 18:42:37 -07:00
Nedelosk 767723fc02 Remove Unused Import 2017-08-13 02:56:40 +02:00
Nedelosk 7d5b6da9a4 Merge branch 'master-MC1.12' of https://github.com/ForestryMC/Binnie into master-MC1.12 2017-08-13 02:53:27 +02:00
Nedelosk 78687099cd Clean Up Gui 2017-08-13 02:53:20 +02:00
mezz 151ce90672 Clean up EnumFlowerColor 2017-08-12 16:51:58 -07:00
Nedelosk 1a717e2e2c Update Readme.md 2017-08-13 01:26:22 +02:00
Nedelosk 9acfedfa16 Fix #261 Ceramic block issues 2017-08-12 23:48:56 +02:00
Nedelosk f968bfdb38 Clean Up Cocktail Liquid 2017-08-12 22:38:25 +02:00
Nedelosk c247bd1243 Clean Up Fluids 2017-08-12 21:40:55 +02:00
Nedelosk 40f8c11a1b Clean Up Extra Trees Modules 2017-08-12 18:41:48 +02:00
Nedelosk f68d62671f Fix Extra Trees Config property 2017-08-12 17:51:08 +02:00
Nedelosk c7ebb39486 Remove duplicated mcmod.info files 2017-08-12 17:47:50 +02:00
Nedelosk 228958f1d0 Add config handler to the module system 2017-08-12 17:25:44 +02:00
Nedelosk 96b753d37f Move Mutation Item Registration to the Mutation Handler 2017-08-12 16:57:35 +02:00
Nedelosk 9dfe741f38 Fix #258 Crash With Thermal Dynamics 2017-08-12 16:45:52 +02:00
Nedelosk c0f18b9f6a Fix Hive Name 2017-08-12 16:16:59 +02:00
Nedelosk b4568bba62 Clean Up Extra Bee Products 2017-08-12 16:12:02 +02:00
Nedelosk 555f18dd99 Fix #259 All Hives drop the same bee 2017-08-12 14:46:44 +02:00
Nedelosk 7e9bd507d0 Fix #259 All Hives drop the same bee 2017-08-12 14:24:59 +02:00
Nedelosk 7c623fd9a8 Fix design item models 2017-08-12 13:45:18 +02:00
Nedelosk 64e443eda7 Split mcmod.info and add logos 2017-08-12 12:56:49 +02:00
mezz 6ad9c979d6 Refactor Binnie's mods into separate modules (#260) 2017-08-11 22:52:39 -07:00
Nedelosk cd82361a39 Clean Up ModuleManager and remove unused parameter 2017-08-09 23:44:26 +02:00
mezz a502020e47 Fix #253 Additional fixes for game crashes when you open GUI on some blocks 2017-08-08 22:31:00 -07:00
mezz a9a2db67f4 Remove some dead code that is not related to unfinished features 2017-08-08 22:30:59 -07:00
mezz 5b1250ce8a Use lambdas for event handlers 2017-08-08 22:30:59 -07:00
mezz 6668392bd7 Fix bug with ceramic brick in debug world 2017-08-08 22:30:58 -07:00
mezz d3a93abb25 Cleanup 2017-08-08 22:30:50 -07:00
Nedelosk 8a2f686264 Fix #254 Mod Modules are not disabled if the mod is disabled 2017-08-08 16:53:06 +02:00
Nedelosk 2eca542f87 Refactoring Extra Tree Modules 2017-08-08 16:10:35 +02:00
Nedelosk 4421d2ce44 Refactoring Extra Tree Modules 2017-08-08 15:20:44 +02:00
mezz 78b98f07db Fix #253 Game crashes when you open GUI on some blocks 2017-08-07 21:37:31 -07:00
Nedelosk ad20fa2ffc Fix #252 Server startup Crash 2017-08-07 16:56:17 +02:00
Nedelosk b18c195aa9 Refactoring Botany Modules and Fix #252 2017-08-07 16:53:13 +02:00
mezz e2a49158f3 Update to 1.12 2017-08-06 19:41:48 -07:00
Nedelosk 235dfca751 Improve Modules 2017-08-06 23:19:40 +02:00
Nedelosk cb81d0ead4 Fix #246 Gene Database Issue 2017-08-04 22:12:08 +02:00
Nedelosk 21728bcab1 Add CraftTweaker Support for Extra Trees Machines 2017-08-04 21:21:52 +02:00
Nedelosk dbdb5478c2 Clean Up Flowers 2017-08-04 13:10:34 +02:00
Nedelosk 46c5b95d82 Remove FieldsAreNonnullByDefault Annotation from the api 2017-08-03 23:19:53 +02:00
Nedelosk e6547caacc Create Distillery and Fruit Press Recipe Api 2017-08-03 21:10:23 +02:00
Nedelosk f7b1805e95 Create Lumbermill Recipe Api 2017-08-03 19:54:47 +02:00
Nedelosk 123b47f038 Create Brewery Recipe Api 2017-08-03 19:09:40 +02:00
Nedelosk c96ab68f19 Fix Refresh Packet 2017-08-03 14:48:54 +02:00
Nedelosk 35d6304a96 Clean Up Biology Page 2017-08-02 18:22:47 +02:00
Nedelosk 8f69af62f8 Clean Up Fence Model 2017-08-02 16:50:31 +02:00
Nedelosk d2b14b6320 Fix #236 Extra Bees config incorrectly located and clean up honey combs 2017-08-02 16:36:49 +02:00
Nedelosk 65431e73d4 Clean Up Flower 2017-08-02 15:42:10 +02:00
Nedelosk fa4a5b0a17 Clean Up Flower TileEntity 2017-08-02 03:37:05 +02:00
Nedelosk 714ba830d7 Fix Analyst Window 2017-08-02 03:13:41 +02:00
Nedelosk ed3cfe12a1 Clean Up Analyst Window 2017-08-02 03:05:45 +02:00
Nedelosk d2a9e62cb2 Clean Up Mutation Page 2017-08-02 02:41:39 +02:00
Nedelosk cbfb25647a Clean Up Bee Effects 2017-08-02 01:39:55 +02:00
Nedelosk 6587200dd3 Fix NPE 2017-08-01 23:59:46 +02:00
Nedelosk b488570a5f Fix some Refactoring Fails 2017-08-01 23:37:26 +02:00
Nedelosk 40a1c94a86 Clean Up more Widget Code 2017-08-01 22:40:43 +02:00
Nedelosk 79c303b12d Fix Extra Trees error code 2017-08-01 17:03:32 +02:00
Nedelosk 065d795622 Refactoring some Gui Classes 2017-08-01 16:57:04 +02:00
Nedelosk 2b54db9342 Fix tolerance allele 2017-08-01 15:11:06 +02:00
Nedelosk 8f8e497f58 Clean Genesis Class 2017-08-01 14:32:41 +02:00
Nedelosk 34fda5ddd1 Clean Up More Gui Classes 2017-08-01 14:18:10 +02:00
Nedelosk ab1a2eeb89 Clean Up Point Code 2017-08-01 12:16:01 +02:00
Nedelosk 5c40de2eba Rename Widget some Methods 2017-08-01 12:08:46 +02:00
Nedelosk b0503fe523 Rename Widget some Methods 2017-08-01 00:43:43 +02:00
Nedelosk 3e3c9c30a4 Start Clean Up Gui 2017-08-01 00:37:15 +02:00
Nedelosk 1b338efca9 Fix machine fx rendering and add item cloning 2017-07-31 23:42:16 +02:00
Nedelosk ddc9764a23 Fix item rendering 2017-07-31 21:54:39 +02:00
Nedelosk f23e28deaf Fix Field Kit Animation 2017-07-31 20:32:12 +02:00
Nedelosk afb9a62686 Fix #235 Field Kit GUI missing 2017-07-31 20:09:58 +02:00
Nedelosk 79a49341e9 Fix Error States on Server 2017-07-31 16:36:57 +02:00
Nedelosk 5a93a3d0a9 Fix Extra Trees Machine Localisation 2017-07-31 16:05:52 +02:00
Nedelosk 2afb3c52f3 Improve Extra Trees Machine Localisation 2017-07-31 16:01:07 +02:00
Nedelosk cbe86e814f Fix #160 Ceramic Brick Block Meta 2017-07-31 13:32:58 +02:00
Nedelosk c5f2368e1d Move Botany Gardening Items 2017-07-31 12:27:36 +02:00
Nedelosk 7e4e518d7b Localise Analyst Title and Description 2017-07-31 12:14:16 +02:00
Nedelosk 21aa0c43a6 Clean Up Gui 2017-07-31 12:09:50 +02:00
Nedelosk 724c3d1fbd Fix item wrong lang key 2017-07-31 10:45:34 +02:00
Nedelosk 6c3d7d3bb0 Fix item rendering 2017-07-31 01:37:04 +02:00
Nedelosk afb9460ff9 Clean Up 2017-07-31 01:28:14 +02:00
Nedelosk 687c440c69 Change IAllele.getName() to IAllele.getAlleleName() 2017-07-30 23:40:19 +02:00
Nedelosk 1b722df37a More localisation 2017-07-30 23:34:07 +02:00
Nedelosk dcdf4b1cac Clean Up and Move some classes 2017-07-30 22:31:16 +02:00
Nedelosk 705581b9ac Fix #210 Database missed description 2017-07-30 22:04:25 +02:00
Nedelosk 2a451bc72e Fix item slot rendering 2017-07-30 21:01:59 +02:00
Nedelosk faf2b88ed8 Fix some bugs 2017-07-30 20:25:33 +02:00
Nedelosk fcef87b3da Fix #234 Analyst Eating Items 2017-07-30 19:58:20 +02:00
Nedelosk fcbbd06c63 Fix Mod Support and Fix #208 Added Tech Reborn Support 2017-07-30 19:17:54 +02:00
Nedelosk 1b3b452900 Refactoring bee species 2017-07-30 16:23:27 +02:00
Alexander Kornilov 0726954433 Feature/lang Simplify en_GB and add missing keys (#220) 2017-07-29 15:09:54 -07:00
Nedelosk 6ff11f4eea Fix jenkins link 2017-07-29 23:57:33 +02:00
Nedelosk 03eaa2510c Update README.md 2017-07-29 23:55:03 +02:00
Nedelosk a3103bce5e Update README.md 2017-07-29 23:44:46 +02:00
Nedelosk a9030ef60b Update README.md 2017-07-29 23:37:27 +02:00
Nedelosk 4062adee6c Fix possible NPE 2017-07-29 23:23:25 +02:00
Nedelosk 2ca2cef6a2 Merge remote-tracking branch 'origin/master-MC1.11.2' into master-MC1.11.2 2017-07-29 23:21:17 +02:00
Nedelosk 95dca83465 Fix #232 2017-07-29 23:21:02 +02:00
mezz f977a29ad6 Fix mcmod.info 2017-07-29 12:25:23 -07:00
Nedelosk 68ed8a1511 Fix #229 Game Crash from looking at wood in JEI 2017-07-29 21:07:41 +02:00
Nedelosk c9d3001b47 Merge remote-tracking branch 'origin/master-MC1.11.2' into master-MC1.11.2 2017-07-29 21:01:07 +02:00
Nedelosk 75c875868a Fix #230 Crash when opening a diamond compartment 2017-07-29 21:00:50 +02:00
mezz c51a9273f9 Fix gradle 2017-07-28 22:38:29 -07:00
mezz 4edd2e9d5d Update mcmodinfo 2017-07-28 22:11:49 -07:00
mezz bc310023df Fix version number in filename 2017-07-28 21:48:22 -07:00
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
5205 changed files with 42230 additions and 38589 deletions

No files matched your search

+7 -22
View File
@@ -1,28 +1,13 @@
# everything
/*
.gradle
# IntelliJ
/build
/run
/out
.idea
.idea/
*.iml
*.ipr
*.iws
classes/
# folders
!/gradle/wrapper
!/src
# files
!/.gitignore
!/LICENSE.txt
!/license-header.txt
!/README.md
!/gradle.properties
!/build.gradle
!/gradlew
!/gradlew.bat
.gradle/
classes/
build/
run/
out/
/changelog.html
+40 -1
View File
@@ -1,4 +1,43 @@
## Binnie mods
[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.12 ](http://jenkins.ic2.player.to/job/Binnie's%201.12/)
### 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
### Building
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}
+9
View File
@@ -0,0 +1,9 @@
archivesBaseName = 'all-' + mcversion
dependencies {
runtimeOnly project(":botany")
runtimeOnly project(":core")
runtimeOnly project(":extrabees")
runtimeOnly project(":extratrees")
runtimeOnly project(":genetics")
}
+5
View File
@@ -0,0 +1,5 @@
archivesBaseName = 'botany-api-' + mcversion
dependencies {
compile project(":core-api")
}
@@ -1,6 +1,10 @@
package binnie.botany.api;
public class FlowerManager {
import binnie.botany.api.gardening.IGardeningManager;
import binnie.botany.api.genetics.IFlowerFactory;
import binnie.botany.api.genetics.IFlowerRoot;
public class BotanyAPI {
/**
* Convenient access to AlleleManager.alleleRegistry.getSpeciesRoot("rootFlowers")
*/
@@ -10,7 +14,7 @@ public class FlowerManager {
* Used to create new flowers.
*/
public static IFlowerFactory flowerFactory;
/**
* Used to manager soil.
*/
@@ -1,4 +1,4 @@
package binnie.botany.api;
package binnie.botany.api.gardening;
import javax.annotation.Nullable;
@@ -12,6 +12,7 @@ public enum EnumAcidity implements IStringSerializable {
ALKALINE(TextFormatting.AQUA);
@Nullable
private final
TextFormatting color;
EnumAcidity(@Nullable TextFormatting color) {
@@ -20,14 +21,24 @@ public enum EnumAcidity implements IStringSerializable {
@Override
public String getName() {
return this.name().toLowerCase();
return name().toLowerCase();
}
public String getLocalisedName(boolean withColor) {
String localisedName = I18n.translateToLocal("botany.ph." + getName());
if(withColor && color != null){
localisedName +=color;
if (withColor && color != null) {
localisedName = color + localisedName;
}
return localisedName;
}
public static EnumAcidity getFromValue(float rawAcidity) {
if(rawAcidity <= -1.0f){
return EnumAcidity.ACID;
}else if(rawAcidity >= 1.0f){
return EnumAcidity.ALKALINE;
}else{
return EnumAcidity.NEUTRAL;
}
}
}
@@ -0,0 +1,5 @@
package binnie.botany.api.gardening;
public enum EnumFertiliserType {
ACID, ALKALINE, NUTRIENT
}
@@ -1,9 +1,10 @@
package binnie.botany.api;
package binnie.botany.api.gardening;
import javax.annotation.Nullable;
import net.minecraft.util.IStringSerializable;
import net.minecraft.util.text.TextFormatting;
import net.minecraft.util.text.translation.I18n;
public enum EnumMoisture implements IStringSerializable {
@@ -12,7 +13,7 @@ public enum EnumMoisture implements IStringSerializable {
DAMP(TextFormatting.DARK_BLUE);
@Nullable
final TextFormatting color;
private final TextFormatting color;
EnumMoisture(@Nullable TextFormatting color) {
this.color = color;
@@ -25,9 +26,19 @@ public enum EnumMoisture implements IStringSerializable {
public String getLocalisedName(boolean withColor) {
String localisedName = I18n.translateToLocal("botany.moisture." + getName());
if(withColor && color != null){
localisedName +=color;
if (withColor && color != null) {
localisedName = color + localisedName + TextFormatting.GRAY;
}
return localisedName;
}
public static EnumMoisture getFromValue(float rawMoisture) {
if(rawMoisture <= -1.0f){
return EnumMoisture.DRY;
}else if(rawMoisture >= 1.0f){
return EnumMoisture.DAMP;
}else{
return EnumMoisture.NORMAL;
}
}
}
@@ -1,10 +1,10 @@
package binnie.botany.api;
package binnie.botany.api.gardening;
import javax.annotation.Nullable;
import java.util.Locale;
import net.minecraft.util.IStringSerializable;
import net.minecraft.util.text.TextFormatting;
import net.minecraft.util.text.translation.I18n;
public enum EnumSoilType implements IStringSerializable {
@@ -12,19 +12,18 @@ public enum EnumSoilType implements IStringSerializable {
LOAM(TextFormatting.GOLD),
FLOWERBED(TextFormatting.LIGHT_PURPLE);
@Nullable
final TextFormatting color;
private final TextFormatting color;
EnumSoilType(@Nullable TextFormatting color) {
EnumSoilType(TextFormatting color) {
this.color = color;
}
@Override
public String getName() {
return this.name().toLowerCase(Locale.ENGLISH);
return name().toLowerCase(Locale.ENGLISH);
}
public String getTranslated(boolean withColor) {
return (withColor && color != null ? color : "") + I18n.translateToLocal("botany.soil." + getName());
public String getTranslated() {
return color + I18n.translateToLocal("botany.soil." + getName());
}
}
@@ -1,4 +1,4 @@
package binnie.botany.api;
package binnie.botany.api.gardening;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
@@ -1,9 +1,12 @@
package binnie.botany.api;
package binnie.botany.api.gardening;
import javax.annotation.Nullable;
import java.util.Collection;
import java.util.Map;
import net.minecraft.block.Block;
import net.minecraft.block.state.IBlockState;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.util.math.BlockPos;
@@ -11,58 +14,54 @@ import net.minecraft.world.World;
import forestry.api.core.EnumTemperature;
import binnie.botany.api.genetics.IFlower;
public interface IGardeningManager {
default boolean isSoil(final Block block) {
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);
IBlockState getSoil(EnumSoilType soil, boolean weedKill, EnumMoisture moisture, EnumAcidity acidity);
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);
Collection<ItemStack> getFertilisers(EnumFertiliserType type);
Map<EnumFertiliserType, Map<ItemStack, Integer>> getFertilisers();
void registerFertiliser(EnumFertiliserType type, ItemStack stack, int strength);
boolean isFertiliser(EnumFertiliserType type, 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 ePH, EnumMoisture eMoisture, EnumTemperature eTemp);
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);
boolean onFertiliseSoil(ItemStack heldItem, IBlockSoil soil, World world, BlockPos pos, EntityPlayer player);
}
@@ -0,0 +1,7 @@
@ParametersAreNonnullByDefault
@MethodsReturnNonnullByDefault
package binnie.botany.api.gardening;
import javax.annotation.ParametersAreNonnullByDefault;
import mcp.MethodsReturnNonnullByDefault;
@@ -1,4 +1,4 @@
package binnie.botany.api;
package binnie.botany.api.genetics;
import java.util.Locale;
@@ -25,20 +25,20 @@ public enum EnumFlowerChromosome implements IChromosomeType {
SAPPINESS(IAlleleFloat.class),
STEM(IAlleleInteger.class);
private Class<? extends IAllele> cls;
private final Class<? extends IAllele> cls;
EnumFlowerChromosome(final Class<? extends IAllele> cls) {
EnumFlowerChromosome(Class<? extends IAllele> cls) {
this.cls = cls;
}
@Override
public Class<? extends IAllele> getAlleleClass() {
return this.cls;
return cls;
}
@Override
public String getName() {
return this.toString().toLowerCase(Locale.ENGLISH);
return toString().toLowerCase(Locale.ENGLISH);
}
@Override
@@ -0,0 +1,130 @@
package binnie.botany.api.genetics;
import java.awt.Color;
import binnie.botany.api.BotanyAPI;
import net.minecraft.util.IStringSerializable;
import net.minecraft.util.text.translation.I18n;
public enum EnumFlowerColor implements IStringSerializable {
Aquamarine("aquamarine", new Color(8388564)),
Black("black", new Color(2631720)),
Blue("blue", new Color(255)),
Brown("brown", new Color(10824234)),
CadetBlue("cadetBlue", new Color(6266528)),
Chocolate("chocolate", new Color(13789470)),
Coral("coral", new Color(16744272)),
Crimson("crimson", new Color(14423100)),
Cyan("cyan", new Color(65535)),
DarkGoldenrod("darkGoldenrod", new Color(12092939)),
DarkGray("darkGray", new Color(11119017)),
DarkGreen("darkGreen", new Color(25600)),
DarkKhaki("darkKhaki", new Color(12433259)),
DarkOliveGreen("darkOliveGreen", new Color(5597999)),
DarkOrange("darkOrange", new Color(16747520)),
DarkSalmon("darkSalmon", new Color(15308410)),
DarkSeaGreen("darkSeaGreen", new Color(9419915)),
DarkSlateBlue("darkSlateBlue", new Color(4734347)),
DarkSlateGray("darkSlateGray", new Color(3100495)),
DarkTurquoise("darkTurquoise", new Color(52945)),
DarkViolet("darkViolet", new Color(9699539)),
DeepPink("deepPink", new Color(16716947)),
DeepSkyBlue("deepSkyBlue", new Color(49151)),
DimGray("dimGray", new Color(6908265)),
DodgerBlue("dodgerBlue", new Color(2003199)),
Gold("gold", new Color(16766720)),
Goldenrod("goldenrod", new Color(14329120)),
Gray("gray", new Color(8421504)),
Green("green", new Color(32768)),
HotPink("hotPink", new Color(16738740)),
IndianRed("indianRed", new Color(13458524)),
Indigo("indigo", new Color(4915330)),
Khaki("khaki", new Color(15787660)),
Lavender("lavender", new Color(15132410)),
LemonChiffon("lemonChiffon", new Color(16775885)),
LightGray("lightGray", new Color(13882323)),
LightSeaGreen("lightSeaGreen", new Color(2142890)),
LightSteelBlue("lightSteelBlue", new Color(11584734)),
Lime("lime", new Color(65280)),
LimeGreen("limeGreen", new Color(3329330)),
Magenta("magenta", new Color(16711935)),
Maroon("maroon", new Color(8388608)),
MediumAquamarine("mediumAquamarine", new Color(6737322)),
MediumOrchid("mediumOrchid", new Color(12211667)),
MediumPurple("mediumPurple", new Color(9662683)),
MediumSeaGreen("mediumSeaGreen", new Color(3978097)),
MediumVioletRed("mediumVioletRed", new Color(13047173)),
MistyRose("mistyRose", new Color(16770273)),
Navy("navy", new Color(128)),
Olive("olive", new Color(8421376)),
OliveDrab("oliveDrab", new Color(7048739)),
Orange("orange", new Color(16753920)),
PaleGreen("paleGreen", new Color(10025880)),
PaleTurquoise("paleTurquoise", new Color(11529966)),
PaleVioletRed("paleVioletRed", new Color(14381203)),
Peru("peru", new Color(13468991)),
Pink("pink", new Color(16761035)),
Plum("plum", new Color(14524637)),
Purple("purple", new Color(8388736)),
Red("red", new Color(16711680)),
RosyBrown("rosyBrown", new Color(12357519)),
RoyalBlue("royalBlue", new Color(4286945)),
Salmon("salmon", new Color(16416882)),
SandyBrown("sandyBrown", new Color(16032864)),
SeaGreen("seaGreen", new Color(3050327)),
Sienna("sienna", new Color(10506797)),
SkyBlue("skyBlue", new Color(8900331)),
SlateBlue("slateBlue", new Color(6970061)),
SlateGray("slateGray", new Color(7372944)),
SpringGreen("springGreen", new Color(65407)),
SteelBlue("steelBlue", new Color(4620980)),
Tan("tan", new Color(13808780)),
Teal("teal", new Color(32896)),
Thistle("thistle", new Color(14204888)),
Turquoise("turquoise", new Color(4251856)),
Violet("violet", new Color(15631086)),
Wheat("wheat", new Color(16113331)),
White("white", new Color(16777215)),
Yellow("yellow", new Color(16776960)),
YellowGreen("yellowGreen", new Color(10145074));
public static final EnumFlowerColor[] VALUES = values();
private final String ident;
private final IAlleleFlowerColor allele;
EnumFlowerColor(String ident, Color color) {
this.ident = ident;
int r = color.getRed();
int g = color.getGreen();
int b = color.getBlue();
r = (int) (0.45 * (r + 214));
g = (int) (0.45 * (g + 174));
b = (int) (0.45 * (b + 131));
Color colorWilted = new Color(r, g, b);
String uid = "botany.color" + name();
allele = BotanyAPI.flowerFactory.createFlowerColorAllele(uid, ordinal(), color, colorWilted, name().toLowerCase(), uid, true);
}
public String getIdent() {
return ident;
}
public static EnumFlowerColor get(int i) {
return values()[Math.max(0, i) % values().length];
}
public String getDisplayName() {
return I18n.translateToLocal("botany.color." + getName());
}
@Override
public String getName() {
return name().toLowerCase();
}
public IAlleleFlowerColor getFlowerColorAllele() {
return allele;
}
}
@@ -1,4 +1,4 @@
package binnie.botany.api;
package binnie.botany.api.genetics;
import forestry.api.genetics.ISpeciesType;
@@ -8,9 +8,9 @@ public enum EnumFlowerStage implements ISpeciesType {
POLLEN("Pollen");
public static final EnumFlowerStage[] VALUES = values();
String name;
private final String name;
EnumFlowerStage(final String name) {
EnumFlowerStage(String name) {
this.name = name;
}
@@ -19,13 +19,11 @@ public enum EnumFlowerStage implements ISpeciesType {
}
public static EnumFlowerStage getStage(int age) {
return age == 0
? EnumFlowerStage.SEED
: EnumFlowerStage.FLOWER;
return age == 0 ? EnumFlowerStage.SEED : EnumFlowerStage.FLOWER;
}
public String getName() {
return this.name;
return name;
}
}
@@ -0,0 +1,6 @@
package binnie.botany.api.genetics;
import forestry.api.genetics.IAlleleInteger;
public interface IAlleleFlowerColor extends IFlowerColor, IAlleleInteger {
}
@@ -1,4 +1,4 @@
package binnie.botany.api;
package binnie.botany.api.genetics;
import net.minecraft.world.World;
@@ -6,5 +6,5 @@ import forestry.api.genetics.IAlleleEffect;
import forestry.api.genetics.IEffectData;
public interface IAlleleFlowerEffect extends IAlleleEffect {
IEffectData doEffect(final IFlowerGenome p0, final IEffectData p1, final World p2, final int p3, final int p4, final int p5);
IEffectData doEffect(IFlowerGenome genome, IEffectData effect, World world, int x, int y, int z);
}
@@ -1,4 +1,4 @@
package binnie.botany.api;
package binnie.botany.api.genetics;
import net.minecraft.client.renderer.block.model.ModelResourceLocation;
import net.minecraft.item.Item;
@@ -10,6 +10,9 @@ import forestry.api.core.IModelManager;
import forestry.api.genetics.IAlleleProperty;
import forestry.api.genetics.IAlleleSpecies;
import binnie.botany.api.gardening.EnumAcidity;
import binnie.botany.api.gardening.EnumMoisture;
public interface IAlleleFlowerSpecies extends IAlleleSpecies, IAlleleProperty<IAlleleFlowerSpecies> {
IFlowerType getType();
@@ -18,7 +21,7 @@ public interface IAlleleFlowerSpecies extends IAlleleSpecies, IAlleleProperty<IA
EnumMoisture getMoisture();
@SideOnly(Side.CLIENT)
int getFlowerColour(EnumFlowerStage type, int renderPass);
int getFlowerColor(EnumFlowerStage type, int renderPass);
@SideOnly(Side.CLIENT)
ModelResourceLocation getFlowerModel(EnumFlowerStage type, boolean flowered);
@@ -1,7 +1,10 @@
package binnie.botany.api;
package binnie.botany.api.genetics;
import forestry.api.genetics.IAlleleSpeciesBuilder;
import binnie.botany.api.gardening.EnumAcidity;
import binnie.botany.api.gardening.EnumMoisture;
public interface IAlleleFlowerSpeciesBuilder extends IAlleleSpeciesBuilder {
@Override
IAlleleFlowerSpecies build();
@@ -1,4 +1,4 @@
package binnie.botany.api;
package binnie.botany.api.genetics;
import forestry.api.genetics.IBreedingTracker;
@@ -0,0 +1,13 @@
package binnie.botany.api.genetics;
public interface IColorMix {
IFlowerColor getColorFirst();
IFlowerColor getColorSecond();
boolean isMutation(IFlowerColor colorFirst, IFlowerColor colorSecond);
int getChance();
IFlowerColor getResult();
}
@@ -0,0 +1,76 @@
package binnie.botany.api.genetics;
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 {
/**
* @return Flowers's genetic information.
*/
@Override
IFlowerGenome getGenome();
/**
* @return Genetic information of the flower's mate, null if unmated.
*/
@Nullable
IFlowerGenome getMate();
/**
* Mate with the given flower.
*
* @param flower the {@link IFlower} to mate this one with.
*/
void mate(IFlower flower);
/**
* Remove the mate of the flower.
*/
void removeMate();
IFlower getOffspring(World world, BlockPos pos);
/**
* @return The current age of the flower.
*/
int getAge();
/**
* Set the current age of the flower.
*/
void setAge(int age);
/**
* Age the flower.
*/
void age();
/**
* @return Maximum age of the flower.
*/
int getMaxAge();
/**
* @return true if the flower is wilted.
*/
boolean isWilted();
/**
* Set that the flower is wilted.
*/
void setWilted(boolean wilted);
/**
* @return true if the flower has flowered.
*/
boolean hasFlowered();
/**
* Set that the flower has flowered.
*/
void setFlowered(boolean flowered);
}
@@ -0,0 +1,13 @@
package binnie.botany.api.genetics;
import forestry.api.genetics.IAlleleInteger;
public interface IFlowerColor {
int getColor(boolean dis);
IAlleleInteger getAllele();
int getID();
String getColorName();
}
@@ -1,4 +1,4 @@
package binnie.botany.api;
package binnie.botany.api.genetics;
import net.minecraft.item.ItemStack;
@@ -0,0 +1,14 @@
package binnie.botany.api.genetics;
import java.awt.Color;
import forestry.api.genetics.IAllele;
import forestry.api.genetics.IClassification;
public interface IFlowerFactory {
IAlleleFlowerSpeciesBuilder createSpecies(String modId, 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);
IAlleleFlowerColor createFlowerColorAllele(String uid, int id, Color color, Color colorWilted, String name, String unlocalizedName, boolean isDominant);
}
@@ -1,9 +1,12 @@
package binnie.botany.api;
package binnie.botany.api.genetics;
import forestry.api.core.EnumTemperature;
import forestry.api.genetics.EnumTolerance;
import forestry.api.genetics.IGenome;
import binnie.botany.api.gardening.EnumAcidity;
import binnie.botany.api.gardening.EnumMoisture;
public interface IFlowerGenome extends IGenome {
@Override
IAlleleFlowerSpecies getPrimary();
@@ -11,11 +14,11 @@ public interface IFlowerGenome extends IGenome {
@Override
IAlleleFlowerSpecies getSecondary();
IFlowerColour getPrimaryColor();
IFlowerColor getPrimaryColor();
IFlowerColour getSecondaryColor();
IFlowerColor getSecondaryColor();
IFlowerColour getStemColor();
IFlowerColor getStemColor();
int getFertility();
@@ -33,9 +36,9 @@ public interface IFlowerGenome extends IGenome {
float getSappiness();
boolean canTolerate(final EnumAcidity p0);
boolean canTolerate(EnumAcidity acidity);
boolean canTolerate(final EnumMoisture p0);
boolean canTolerate(EnumMoisture moisture);
boolean canTolerate(final EnumTemperature p0);
boolean canTolerate(EnumTemperature temperature);
}
@@ -1,4 +1,4 @@
package binnie.botany.api;
package binnie.botany.api.genetics;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
@@ -9,5 +9,5 @@ public interface IFlowerMutation extends IMutation {
@Override
IFlowerRoot getRoot();
float getChance(final World world, final BlockPos pos, final IAlleleFlowerSpecies p0, final IAlleleFlowerSpecies p1, final IFlowerGenome p2, final IFlowerGenome p3);
float getChance(World world, BlockPos pos, IAlleleFlowerSpecies allele0, IAlleleFlowerSpecies allele1, IFlowerGenome genome0, IFlowerGenome genome1);
}
@@ -1,4 +1,4 @@
package binnie.botany.api;
package binnie.botany.api.genetics;
import forestry.api.genetics.IMutationBuilder;
@@ -1,4 +1,4 @@
package binnie.botany.api;
package binnie.botany.api.genetics;
import javax.annotation.Nullable;
import java.util.Collection;
@@ -28,7 +28,7 @@ public interface IFlowerRoot extends ISpeciesRoot {
IFlowerGenome templateAsGenome(IAllele[] template);
@Override
IFlowerGenome templateAsGenome(IAllele[] templateFrist, IAllele[] templateSecond);
IFlowerGenome templateAsGenome(IAllele[] templateActive, IAllele[] templateInactive);
@Override
IBotanistTracker getBreedingTracker(World world, @Nullable GameProfile profile);
@@ -47,13 +47,13 @@ public interface IFlowerRoot extends ISpeciesRoot {
@Nullable
IFlower getConversion(ItemStack memberStack);
Collection<IColourMix> getColourMixes(boolean p0);
Collection<IColorMix> getColorMixes(boolean shuffle);
void registerColourMix(IColorMix colorMix);
void registerColourMix(IColourMix colourMix);
boolean plant(World world, BlockPos pos, IFlower flower, GameProfile owner);
void tryGrowSection(World world, BlockPos pos);
void onGrowFromSeed(World world, BlockPos pos);
}
@@ -1,4 +1,4 @@
package binnie.botany.api;
package binnie.botany.api.genetics;
import net.minecraft.client.renderer.block.model.ModelResourceLocation;
import net.minecraft.item.Item;
@@ -17,8 +17,6 @@ public interface IFlowerType<I extends IFlowerType<I>> extends Comparable<I> {
String getName();
int getID();
int getSections();
int ordinal();
@@ -0,0 +1,7 @@
@ParametersAreNonnullByDefault
@MethodsReturnNonnullByDefault
package binnie.botany.api.genetics;
import javax.annotation.ParametersAreNonnullByDefault;
import mcp.MethodsReturnNonnullByDefault;
+9
View File
@@ -0,0 +1,9 @@
archivesBaseName = 'botany-' + mcversion
dependencies {
compile project(":core")
compile project(":botany-api")
compile project(":extratrees-api")
compile project(":genetics-api")
compile project(":design")
}
@@ -0,0 +1,120 @@
package binnie.botany;
import binnie.genetics.api.analyst.IAnalystManager;
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 binnie.botany.api.genetics.EnumFlowerChromosome;
import binnie.botany.genetics.TolerancePh;
import binnie.botany.genetics.gui.analyst.FlowerAnalystPagePlugin;
import binnie.botany.gui.BotanyGUI;
import binnie.botany.network.PacketID;
import binnie.botany.proxy.Proxy;
import binnie.core.BinnieCore;
import binnie.core.Constants;
import binnie.core.gui.IBinnieGUID;
import binnie.core.modules.BlankModuleContainer;
import binnie.core.network.BinniePacketHandler;
import binnie.core.network.IPacketID;
import binnie.core.proxy.IProxyCore;
import binnie.genetics.api.GeneticsApi;
import binnie.genetics.api.acclimatiser.IAcclimatiserManager;
@Mod(
modid = Constants.BOTANY_MOD_ID,
name = "Binnie's Botany",
acceptedMinecraftVersions = Constants.ACCEPTED_MINECRAFT_VERSIONS,
dependencies = "required-after:" + Constants.CORE_MOD_ID + ";"
+ "after:" + Constants.GENETICS_MOD_ID + ";"
+ "after:" + Constants.DESIGN_MOD_ID + ";"
)
public class Botany extends BlankModuleContainer {
public static final float AGE_CHANCE = 0.2f;
@SuppressWarnings("NullableProblems")
@Mod.Instance(Constants.BOTANY_MOD_ID)
public static Botany instance;
@SuppressWarnings("NullableProblems")
@SidedProxy(clientSide = "binnie.botany.proxy.ProxyClient", serverSide = "binnie.botany.proxy.ProxyServer")
public static Proxy proxy;
@Mod.EventHandler
public void preInit(FMLPreInitializationEvent evt) {
super.preInit(evt);
IAnalystManager analystManager = GeneticsApi.analystManager;
if (analystManager != null) {
analystManager.registerAnalystPagePlugin(new FlowerAnalystPagePlugin());
}
IAcclimatiserManager acclimatiserManager = GeneticsApi.acclimatiserManager;
if(acclimatiserManager != null) {
acclimatiserManager.addTolerance(EnumFlowerChromosome.HUMIDITY_TOLERANCE, acclimatiserManager.getHumidityToleranceType());
acclimatiserManager.addTolerance(EnumFlowerChromosome.TEMPERATURE_TOLERANCE, acclimatiserManager.getTemperatureToleranceType());
acclimatiserManager.addTolerance(EnumFlowerChromosome.PH_TOLERANCE, new TolerancePh());
}
}
@Mod.EventHandler
public void init(FMLInitializationEvent evt) {
super.init(evt);
}
@Mod.EventHandler
public void postInit(FMLPostInitializationEvent evt) {
super.postInit(evt);
}
@Override
protected void registerModules() {
}
@Override
public IBinnieGUID[] getGUIDs() {
return BotanyGUI.values();
}
@Override
public Class<?>[] getConfigs() {
return new Class[0];
}
@Override
public IPacketID[] getPacketIDs() {
return PacketID.values();
}
@Override
public IProxyCore getProxy() {
return Botany.proxy;
}
@Override
public String getChannel() {
return "BOT";
}
@Override
public String getModId() {
return Constants.BOTANY_MOD_ID;
}
@Override
protected Class<? extends BinniePacketHandler> getPacketHandler() {
return PacketHandler.class;
}
@Override
public boolean isAvailable() {
return BinnieCore.isBotanyActive();
}
public static class PacketHandler extends BinniePacketHandler {
public PacketHandler() {
super(Botany.instance);
}
}
}
@@ -10,21 +10,16 @@ import net.minecraftforge.fml.relauncher.SideOnly;
import binnie.core.util.I18N;
public class CreativeTabBotany extends CreativeTabs {
public static CreativeTabs instance = new CreativeTabBotany();
public static final CreativeTabs INSTANCE = new CreativeTabBotany();
public CreativeTabBotany() {
super("Botany");
}
@Override
public ItemStack getIconItemStack() {
return new ItemStack(Blocks.RED_FLOWER, 1, 5);
}
@Override
@SideOnly(Side.CLIENT)
public String getTranslatedTabLabel() {
return this.getTabLabel();
return getTabLabel();
}
@Override
@@ -36,6 +31,6 @@ public class CreativeTabBotany extends CreativeTabs {
@Override
@SideOnly(Side.CLIENT)
public ItemStack getTabIconItem() {
return new ItemStack(Blocks.YELLOW_FLOWER);
return new ItemStack(Blocks.RED_FLOWER, 1, 5);
}
}
@@ -0,0 +1,274 @@
package binnie.botany;
import javax.annotation.Nullable;
import java.util.Collection;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Set;
import net.minecraft.block.Block;
import net.minecraft.block.state.IBlockState;
import net.minecraft.entity.player.EntityPlayer;
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.api.gardening.EnumAcidity;
import binnie.botany.api.gardening.EnumFertiliserType;
import binnie.botany.api.gardening.EnumMoisture;
import binnie.botany.api.gardening.EnumSoilType;
import binnie.botany.api.gardening.IBlockSoil;
import binnie.botany.api.gardening.IGardeningManager;
import binnie.botany.api.genetics.IFlower;
import binnie.botany.api.genetics.IFlowerGenome;
import binnie.botany.blocks.BlockPlant;
import binnie.botany.blocks.BlockSoil;
import binnie.botany.modules.ModuleGardening;
import binnie.core.util.OreDictionaryUtil;
public class GardeningManager implements IGardeningManager {
private final Map<EnumFertiliserType, Map<ItemStack, Integer>> fertilisers = new LinkedHashMap<>();
public GardeningManager() {
for(EnumFertiliserType type : EnumFertiliserType.values()){
fertilisers.put(type, new LinkedHashMap<>());
}
}
@Override
public boolean isSoil(Block block) {
return block instanceof IBlockSoil;
}
@Override
public boolean isSoil(Item item) {
return item instanceof ItemBlock && isSoil(((ItemBlock) item).getBlock());
}
@Override
public boolean isSoil(ItemStack item) {
return isSoil(item.getItem());
}
@Override
public EnumMoisture getNaturalMoisture(World world, BlockPos pos) {
float moisture = getBiomeMoisture(world, pos);
for (int offsetX = -1; offsetX < 2; ++offsetX) {
for (int offsetY = -1; offsetY < 2; ++offsetY) {
if (offsetX != 0 || offsetY != 0) {
Block block = world.getBlockState(pos.add(offsetX, 0, offsetY)).getBlock();
if (block == Blocks.SAND) {
moisture -= 1.5;
} else if (block == Blocks.WATER) {
moisture += 1.5;
}
}
}
}
if (world.isRainingAt(pos.up())) {
moisture += 1.5;
}
for (int offsetX = -1; offsetX < 2; ++offsetX) {
for (int offsetY = -1; offsetY < 2; ++offsetY) {
if (offsetX != 0 || offsetY != 0) {
Block block = world.getBlockState(pos.add(offsetX, 0, offsetY)).getBlock();
if (block == Blocks.GRAVEL && moisture > 0.0f) {
moisture *= 0.4f;
}
}
}
}
return EnumMoisture.getFromValue(moisture);
}
@Override
public EnumAcidity getNaturalPH(World world, BlockPos pos) {
float acidity = getBiomePH(world, pos);
return EnumAcidity.getFromValue(acidity);
}
@Override
public float getBiomeMoisture(World world, BlockPos pos) {
IClimateInfo info = ForestryAPI.climateManager.getInfo(world, pos);
double humidity = info.getHumidity();
double temperature = info.getTemperature();
double moisture = 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) ((moisture == 0.0) ? moisture : ((moisture < 0.0) ? (-Math.sqrt(moisture * moisture)) : Math.sqrt(moisture * moisture)));
}
@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);
}
@Override
public IBlockState getSoil(EnumSoilType soil, boolean weedKill, EnumMoisture moisture, EnumAcidity acidity) {
IBlockState blockState = getSoilBlock(soil, weedKill).getDefaultState();
return blockState.withProperty(BlockSoil.MOISTURE, moisture).withProperty(BlockSoil.ACIDITY, acidity);
}
@Override
public void plantSoil(World world, BlockPos pos, EnumSoilType soil, EnumMoisture moisture, EnumAcidity acidity) {
IBlockState blockState = getSoil(soil, false, moisture, acidity);
world.setBlockState(pos, blockState, 2);
}
public Map<EnumFertiliserType, Map<ItemStack, Integer>> getFertilisers() {
return fertilisers;
}
@Override
public Collection<ItemStack> getFertilisers(EnumFertiliserType type) {
Set<ItemStack> items = fertilisers.get(type).keySet();
return Collections.unmodifiableSet(items);
}
@Override
public boolean isFertiliser(EnumFertiliserType type, ItemStack stack) {
Collection<ItemStack> fertilisers = getFertilisers(type);
for (ItemStack fertiliser : fertilisers) {
if (!fertiliser.isEmpty() && fertiliser.isItemEqual(stack)) {
return true;
}
}
return false;
}
@Override
public void registerFertiliser(EnumFertiliserType type, ItemStack stack, int strength) {
fertilisers.get(type).put(stack, strength);
}
@Override
public int getFertiliserStrength(ItemStack stack) {
for(EnumFertiliserType type : EnumFertiliserType.values()) {
for (Map.Entry<ItemStack, Integer> entry : fertilisers.get(type).entrySet()) {
if (entry.getKey().isItemEqual(stack)) {
return entry.getValue();
}
}
}
return 1;
}
@Override
public boolean onFertiliseSoil(ItemStack heldItem, IBlockSoil soil, World world, BlockPos pos, EntityPlayer player) {
int fertiliserStrength = getFertiliserStrength(heldItem);
if (isFertiliser(EnumFertiliserType.NUTRIENT, 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])) {
if(!player.capabilities.isCreativeMode) {
heldItem.shrink(1);
}
return true;
}
}
if (isFertiliser(EnumFertiliserType.ACID, 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])) {
if(!player.capabilities.isCreativeMode) {
heldItem.shrink(1);
}
return true;
}
}
if (isFertiliser(EnumFertiliserType.ALKALINE, 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])) {
if(!player.capabilities.isCreativeMode) {
heldItem.shrink(1);
}
return true;
}
}
return false;
}
@Override
public boolean canTolerate(@Nullable IFlower flower, World world, BlockPos pos) {
if (flower == null) {
return false;
}
IBlockState soil = world.getBlockState(pos.down());
Biome biome = world.getBiome(pos);
EnumAcidity acidity = soil.getValue(BlockSoil.ACIDITY);
EnumMoisture moisture = soil.getValue(BlockSoil.MOISTURE);
EnumTemperature temperature = EnumTemperature.getFromValue(biome.getTemperature());
return canTolerate(flower, acidity, moisture, temperature);
}
@Override
public EnumSoilType getSoilType(World world, BlockPos pos) {
IBlockState blockState = world.getBlockState(pos);
if (blockState.getBlock() instanceof IBlockSoil) {
IBlockSoil soil = ((IBlockSoil) blockState.getBlock());
return soil.getType(world, pos);
}
return EnumSoilType.SOIL;
}
@Override
public Block getSoilBlock(EnumSoilType type) {
return getSoilBlock(type, false);
}
@Override
public Block getSoilBlock(EnumSoilType type, boolean weedKill) {
switch (type) {
case FLOWERBED:
return weedKill ? ModuleGardening.flowerbedNoWeed : ModuleGardening.flowerbed;
case LOAM:
return weedKill ? ModuleGardening.loamNoWeed : ModuleGardening.loam;
default:
return weedKill ? ModuleGardening.soilNoWeed : ModuleGardening.soil;
}
}
@Override
public boolean canTolerate(IFlower flower, EnumAcidity acidity, EnumMoisture moisture, EnumTemperature temperature) {
IFlowerGenome genome = flower.getGenome();
return genome.canTolerate(acidity) && genome.canTolerate(moisture) && genome.canTolerate(temperature);
}
@Override
public boolean isWeedkiller(ItemStack heldItem) {
return OreDictionaryUtil.hasOreName(heldItem, "weedkiller");
}
@Override
public boolean addWeedKiller(World world, BlockPos pos) {
IBlockState oldState = world.getBlockState(pos);
if (!(oldState.getBlock() instanceof IBlockSoil)) {
return false;
}
EnumSoilType type = getSoilType(world, pos);
IBlockState newState = getSoil(type, true, oldState.getValue(BlockSoil.MOISTURE), oldState.getValue(BlockSoil.ACIDITY));
boolean done = world.setBlockState(pos, newState, 2);
if (done && BlockPlant.isWeed(world, pos.up())) {
world.setBlockToAir(pos.up());
}
return done;
}
}
@@ -1,4 +1,4 @@
package binnie.botany.ceramic;
package binnie.botany.blocks;
import javax.annotation.Nullable;
import java.util.ArrayList;
@@ -28,30 +28,30 @@ 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.botany.api.genetics.EnumFlowerColor;
import binnie.botany.tile.TileCeramic;
import binnie.core.util.TileUtil;
public class BlockCeramic extends Block implements IColoredBlock, IItemModelRegister {
public BlockCeramic() {
super(Material.ROCK);
this.setHardness(1.0f);
this.setResistance(5.0f);
this.setRegistryName("ceramic");
this.setCreativeTab(CreativeTabBotany.instance);
setHardness(1.0f);
setResistance(5.0f);
setRegistryName("ceramic");
setCreativeTab(CreativeTabBotany.INSTANCE);
}
@Override
@SideOnly(Side.CLIENT)
public void registerModel(Item item, IModelManager manager) {
for (final EnumFlowerColor c : EnumFlowerColor.values()) {
for (EnumFlowerColor c : EnumFlowerColor.values()) {
manager.registerItemModel(item, c.ordinal());
}
}
@Override
public List<ItemStack> getDrops(IBlockAccess world, BlockPos pos, IBlockState state, int fortune) {
return Collections.emptyList();
public void getDrops(NonNullList<ItemStack> drops, IBlockAccess world, BlockPos pos, IBlockState state, int fortune) {
}
@Override
@@ -62,7 +62,7 @@ public class BlockCeramic extends Block implements IColoredBlock, IItemModelRegi
drops = Collections.singletonList(ceramic.getStack());
}
boolean hasBeenBroken = world.setBlockToAir(pos);
if (hasBeenBroken && BinnieCore.getBinnieProxy().isSimulating(world) && drops.size() > 0 && (player == null || !player.capabilities.isCreativeMode)) {
if (hasBeenBroken && !world.isRemote && drops.size() > 0 && (player == null || !player.capabilities.isCreativeMode)) {
for (ItemStack drop : drops) {
spawnAsEntity(world, pos, drop);
}
@@ -89,10 +89,9 @@ public class BlockCeramic extends Block implements IColoredBlock, IItemModelRegi
}
@Override
@SideOnly(Side.CLIENT)
public void getSubBlocks(final Item item, final CreativeTabs tab, final NonNullList<ItemStack> itemList) {
public void getSubBlocks(CreativeTabs tab, NonNullList<ItemStack> itemList) {
for (EnumFlowerColor c : EnumFlowerColor.values()) {
itemList.add(new ItemStack(item, 1, c.getFlowerColorAllele().getID()));
itemList.add(new ItemStack(this, 1, c.getFlowerColorAllele().getID()));
}
}
@@ -1,4 +1,4 @@
package binnie.botany.ceramic.brick;
package binnie.botany.blocks;
import javax.annotation.Nullable;
import java.util.ArrayList;
@@ -50,11 +50,13 @@ import forestry.core.blocks.properties.UnlistedBlockAccess;
import forestry.core.blocks.properties.UnlistedBlockPos;
import forestry.core.models.BlockModelEntry;
import binnie.Constants;
import binnie.core.Constants;
import binnie.botany.CreativeTabBotany;
import binnie.botany.ceramic.TileCeramic;
import binnie.botany.genetics.EnumFlowerColor;
import binnie.core.BinnieCore;
import binnie.botany.ceramic.brick.CeramicBrickPair;
import binnie.botany.ceramic.brick.CeramicBrickType;
import binnie.botany.api.genetics.EnumFlowerColor;
import binnie.botany.tile.TileCeramic;
import binnie.botany.tile.TileCeramicBrick;
import binnie.core.block.IMultipassBlock;
import binnie.core.models.DefaultStateMapper;
import binnie.core.models.ModelManager;
@@ -66,15 +68,15 @@ public class BlockCeramicBrick extends Block implements IMultipassBlock<CeramicB
public BlockCeramicBrick() {
super(Material.ROCK);
this.setHardness(1.0f);
this.setResistance(5.0f);
this.setRegistryName("ceramicBrick");
this.setCreativeTab(CreativeTabBotany.instance);
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();
public void getDrops(NonNullList<ItemStack> drops, IBlockAccess world, BlockPos pos, IBlockState state, int fortune) {
}
@Override
@@ -85,7 +87,7 @@ public class BlockCeramicBrick extends Block implements IMultipassBlock<CeramicB
drops = Collections.singletonList(ceramic.getStack());
}
boolean hasBeenBroken = world.setBlockToAir(pos);
if (hasBeenBroken && BinnieCore.getBinnieProxy().isSimulating(world) && drops.size() > 0 && (player == null || !player.capabilities.isCreativeMode)) {
if (hasBeenBroken && !world.isRemote && drops.size() > 0 && (player == null || !player.capabilities.isCreativeMode)) {
for (ItemStack drop : drops) {
spawnAsEntity(world, pos, drop);
}
@@ -103,20 +105,19 @@ public class BlockCeramicBrick extends Block implements IMultipassBlock<CeramicB
return true;
}
@SideOnly(Side.CLIENT)
@Override
public void getSubBlocks(Item item, final CreativeTabs tab, final NonNullList<ItemStack> itemList) {
for (final EnumFlowerColor color : EnumFlowerColor.values()) {
itemList.add(new CeramicBrickPair(color, color, CeramicBrickType.Tile).getStack(1));
public void getSubBlocks(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.LargeBrick).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)
@@ -125,9 +126,10 @@ public class BlockCeramicBrick extends Block implements IMultipassBlock<CeramicB
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
new ModelResourceLocation(resourceLocation, "normal"),
new ModelResourceLocation(resourceLocation, "inventory"),
new ModelMutlipass<>(BlockCeramicBrick.class),
this
));
}
@@ -139,7 +141,14 @@ public class BlockCeramicBrick extends Block implements IMultipassBlock<CeramicB
@Override
protected BlockStateContainer createBlockState() {
return new ExtendedBlockState(this, new IProperty[]{TYPE}, new IUnlistedProperty[]{UnlistedBlockPos.POS, UnlistedBlockAccess.BLOCKACCESS});
return new ExtendedBlockState(
this,
new IProperty[]{TYPE},
new IUnlistedProperty[]{
UnlistedBlockPos.POS,
UnlistedBlockAccess.BLOCKACCESS
}
);
}
@Override
@@ -159,15 +168,17 @@ public class BlockCeramicBrick extends Block implements IMultipassBlock<CeramicB
@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));
ItemStack stack = placer.getHeldItem(hand);
CeramicBrickPair pair = new CeramicBrickPair(stack);
return getDefaultState().withProperty(TYPE, pair.getType());
}
@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));
CeramicBrickPair pair = new CeramicBrickPair(stack);
ceramic.setColors(pair.getColorFirst(), pair.getColorSecond());
}
}
@@ -193,7 +204,7 @@ public class BlockCeramicBrick extends Block implements IMultipassBlock<CeramicB
}
}
}
return 16777215;
return 0xffffff;
}
@SideOnly(Side.CLIENT)
@@ -224,7 +235,7 @@ public class BlockCeramicBrick extends Block implements IMultipassBlock<CeramicB
if (ceramic != null) {
return ceramic.pair();
}
return null;
return CeramicBrickPair.EMPTY;
}
@Override
@@ -238,14 +249,16 @@ public class BlockCeramicBrick extends Block implements IMultipassBlock<CeramicB
public void registerSprites(ITextureManager manager) {
TextureMap textureMap = Minecraft.getMinecraft().getTextureMapBlocks();
for (CeramicBrickType type : CeramicBrickType.VALUES) {
type.sprites = new TextureAtlasSprite[3];
TextureAtlasSprite[] 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));
ResourceLocation location = new ResourceLocation(Constants.BOTANY_MOD_ID + ":blocks/ceramic." + type.getId() + "." + i);
sprites[i] = textureMap.registerSprite(location);
}
type.setSprites(sprites);
}
}
private class CeramicBrickMeshDefinition implements ItemMeshDefinition {
private static class CeramicBrickMeshDefinition implements ItemMeshDefinition {
@Override
public ModelResourceLocation getModelLocation(ItemStack stack) {
return new ModelResourceLocation(Constants.BOTANY_MOD_ID + ":ceramicBrick", "inventory");
@@ -0,0 +1,32 @@
package binnie.botany.blocks;
import binnie.design.DesignHelper;
import binnie.design.blocks.BlockDesign;
import binnie.design.blocks.DesignBlock;
import net.minecraft.block.material.Material;
import net.minecraft.item.ItemStack;
import binnie.botany.ceramic.CeramicColor;
import binnie.botany.ceramic.CeramicDesignSystem;
import binnie.botany.api.genetics.EnumFlowerColor;
import binnie.core.util.I18N;
import binnie.design.api.IDesign;
public class BlockCeramicPatterned extends BlockDesign {
public BlockCeramicPatterned() {
super(CeramicDesignSystem.instance, Material.ROCK);
setHardness(1.0f);
setResistance(5.0f);
setRegistryName("ceramicPattern");
}
@Override
public ItemStack getCreativeStack(IDesign design) {
return DesignHelper.getItemStack(this, CeramicColor.get(EnumFlowerColor.White), CeramicColor.get(EnumFlowerColor.Black), design);
}
@Override
public String getBlockName(DesignBlock design) {
return I18N.localise("botany.ceramic.block.name", design.getDesign().getName());
}
}
@@ -1,313 +1,311 @@
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);
/* PROPERTYS */
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);
final float f = 0.2f;
this.setTickRandomly(true);
this.setRegistryName("flower");
this.setSoundType(SoundType.PLANT);
}
@Override
public TileEntity createNewTileEntity(final World var1, final int i) {
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()) {
if (world.isRemote) {
return true;
}
TileEntity tile = world.getTileEntity(pos);
if (tile instanceof TileEntityFlower) {
TileEntityFlower tileFlower = (TileEntityFlower) tile;
IFlower flower = tileFlower.getFlower();
if (flower != null) {
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;
}
return false;
}
@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();
final TileEntity flower = world.getTileEntity(pos);
if (!BinnieCore.getBinnieProxy().isSimulating(world)) {
if (flower != null && flower instanceof TileEntityFlower) {
final IFlower f = flowerRoot.getMember(stack);
if (f != null) {
((TileEntityFlower) flower).setRender(new TileEntityFlower.RenderInfo(f, (TileEntityFlower) flower));
}
}
return;
}
final TileEntity below = world.getTileEntity(pos.down());
if (flower != null && flower instanceof TileEntityFlower) {
if (below instanceof TileEntityFlower) {
((TileEntityFlower) flower).setSection(((TileEntityFlower) below).getSection());
} else {
final 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();
} else {
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 this.canPlaceBlockOn(downState.getBlock());
}
protected boolean canPlaceBlockOn(final 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) {
this.checkAndDropBlock(worldIn, pos);
final TileEntity tile = worldIn.getTileEntity(pos);
if (tile instanceof TileEntityFlower) {
final 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) {
this.dropBlockAsItem(worldIn, pos, worldIn.getBlockState(pos), 0);
worldIn.setBlockToAir(pos);
}
}
}
@Override
public void updateTick(World world, BlockPos pos, IBlockState state, Random rand) {
final TileEntity tile = world.getTileEntity(pos);
if (tile instanceof TileEntityFlower) {
((TileEntityFlower) tile).randomUpdate(rand);
this.checkAndDropBlock(world, pos);
return;
}
world.setBlockToAir(pos);
}
protected void checkAndDropBlock(final World world, final BlockPos pos) {
if (!this.canBlockStay(world, pos)) {
this.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) {
final List<ItemStack> drops = this.getDrops(world, pos, world.getBlockState(pos), 0);
final boolean hasBeenBroken = world.setBlockToAir(pos);
if (hasBeenBroken && BinnieCore.getBinnieProxy().isSimulating(world) && drops.size() > 0 && (player == null || !player.capabilities.isCreativeMode)) {
for (final ItemStack drop : drops) {
spawnAsEntity(world, pos, drop);
}
}
return hasBeenBroken;
}
}
package binnie.botany.blocks;
import javax.annotation.Nullable;
import java.util.List;
import java.util.Random;
import binnie.botany.tile.FlowerRenderInfo;
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.genetics.IFlower;
import binnie.botany.api.genetics.IFlowerGenome;
import binnie.botany.api.genetics.IFlowerRoot;
import binnie.botany.api.genetics.IFlowerType;
import binnie.botany.blocks.properties.PropertyFlower;
import binnie.botany.core.BotanyCore;
import binnie.botany.genetics.EnumFlowerType;
import binnie.botany.genetics.FlowerDefinition;
import binnie.botany.models.StateMapperFlower;
import binnie.botany.modules.ModuleFlowers;
import binnie.botany.network.PacketID;
import binnie.botany.tile.TileEntityFlower;
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.offset(getOffset(state, source, 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 (!!world.isRemote) {
if (flower != null && flower instanceof TileEntityFlower) {
IFlower f = flowerRoot.getMember(stack);
if (f != null) {
((TileEntityFlower) flower).setRender(new FlowerRenderInfo(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() == ModuleFlowers.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() != ModuleFlowers.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 void getDrops(NonNullList<ItemStack> drops, IBlockAccess world, BlockPos pos, IBlockState state, int fortune) {
TileEntity tile = world.getTileEntity(pos);
if (tile instanceof TileEntityFlower && ((TileEntityFlower) tile).getSection() == 0) {
ItemStack flower = ((TileEntityFlower) tile).getItemStack();
if (!flower.isEmpty()) {
drops.add(flower);
}
}
}
@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 && !world.isRemote && drops.size() > 0 && (player == null || !player.capabilities.isCreativeMode)) {
for (ItemStack drop : drops) {
spawnAsEntity(world, pos, drop);
}
}
return hasBeenBroken;
}
}
@@ -0,0 +1,150 @@
package binnie.botany.blocks;
import java.util.Random;
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.gardening.EnumSoilType;
import binnie.botany.api.gardening.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() {
setRegistryName("plant");
setCreativeTab(CreativeTabBotany.INSTANCE);
setTickRandomly(true);
setSoundType(SoundType.PLANT);
}
public static boolean isWeed(IBlockAccess world, BlockPos pos) {
IBlockState blockState = world.getBlockState(pos);
if (!(blockState.getBlock() instanceof BlockPlant)) {
return false;
}
PlantType type = blockState.getValue(PLANT_TYPE);
return type.isWeed();
}
@Override
@SideOnly(Side.CLIENT)
public void registerModel(Item item, IModelManager manager) {
for (int i = 0;i < PlantType.values().length;i++) {
PlantType type = PlantType.getType(i);
manager.registerItemModel(item, i, type.getName());
}
}
@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.getType(meta));
}
@Override
public void getDrops(NonNullList<ItemStack> drops, IBlockAccess world, BlockPos pos, IBlockState state, int fortune) {
}
@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
public void getSubBlocks(CreativeTabs p_149666_2_, NonNullList<ItemStack> subBlocks) {
for (PlantType type : PlantType.values()) {
subBlocks.add(type.get());
}
}
@Override
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 (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.getBlockState(pos.down()).getBlock();
if (!BotanyCore.getGardening().isSoil(below)) {
return;
}
IBlockSoil soil = (IBlockSoil) below;
if (rand.nextInt(3) != 0) {
return;
}
if (type.isWeed()) {
if (!soil.degrade(world, pos.down(), EnumSoilType.LOAM)) {
soil.degrade(world, pos.down(), EnumSoilType.SOIL);
}
} 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 worldIn, BlockPos pos) {
return true;
}
@Override
public EnumOffsetType getOffsetType() {
return EnumOffsetType.XZ;
}
}
@@ -1,4 +1,4 @@
package binnie.botany.gardening;
package binnie.botany.blocks;
import javax.annotation.Nullable;
import java.util.Random;
@@ -29,14 +29,18 @@ import net.minecraftforge.fml.relauncher.SideOnly;
import forestry.api.core.IItemModelRegister;
import forestry.api.core.IModelManager;
import binnie.botany.Botany;
import binnie.core.Constants;
import binnie.botany.CreativeTabBotany;
import binnie.botany.api.EnumAcidity;
import binnie.botany.api.EnumMoisture;
import binnie.botany.api.EnumSoilType;
import binnie.botany.api.IBlockSoil;
import binnie.botany.api.gardening.EnumAcidity;
import binnie.botany.api.gardening.EnumMoisture;
import binnie.botany.api.gardening.EnumSoilType;
import binnie.botany.api.gardening.IBlockSoil;
import binnie.botany.core.BotanyCore;
import binnie.core.modules.BotanyModuleUIDs;
import binnie.botany.modules.ModuleFlowers;
import binnie.botany.modules.ModuleGardening;
import binnie.core.util.I18N;
import binnie.core.modules.ModuleManager;
public class BlockSoil extends Block implements IBlockSoil, IItemModelRegister {
public static final PropertyEnum<EnumMoisture> MOISTURE = PropertyEnum.create("moisture", EnumMoisture.class);
@@ -47,18 +51,18 @@ public class BlockSoil extends Block implements IBlockSoil, IItemModelRegister {
public BlockSoil(EnumSoilType type, String blockName, boolean weedKilled) {
super(Material.GROUND);
this.type = type;
this.weedKilled = weedKilled;
setUnlocalizedName("botany.soil." + type.getName());
this.setCreativeTab(CreativeTabBotany.instance);
this.setRegistryName(blockName);
this.setTickRandomly(true);
this.setLightOpacity(255);
this.setHardness(0.5f);
this.setSoundType(SoundType.GROUND);
this.type = type;
setCreativeTab(CreativeTabBotany.INSTANCE);
setRegistryName(blockName);
setTickRandomly(true);
setLightOpacity(255);
setHardness(0.5f);
setSoundType(SoundType.GROUND);
}
public static int getMeta(final EnumAcidity acid, final EnumMoisture moisture) {
public static int getMeta(EnumAcidity acid, EnumMoisture moisture) {
return acid.ordinal() * 3 + moisture.ordinal();
}
@@ -88,6 +92,7 @@ public class BlockSoil extends Block implements IBlockSoil, IItemModelRegister {
switch (side) {
case UP:
return true;
case NORTH:
case SOUTH:
case WEST:
@@ -95,9 +100,8 @@ public class BlockSoil extends Block implements IBlockSoil, IItemModelRegister {
IBlockState iblockstate = blockAccess.getBlockState(pos.offset(side));
Block block = iblockstate.getBlock();
return !iblockstate.isOpaqueCube() && block != Blocks.FARMLAND && block != Blocks.GRASS_PATH && block != this;
default:
return super.shouldSideBeRendered(blockState, blockAccess, pos, side);
}
return super.shouldSideBeRendered(blockState, blockAccess, pos, side);
}
/**
@@ -135,8 +139,7 @@ public class BlockSoil extends Block implements IBlockSoil, IItemModelRegister {
}
@Override
@SideOnly(Side.CLIENT)
public void getSubBlocks(final Item itemIn, final CreativeTabs tab, final NonNullList<ItemStack> list) {
public void getSubBlocks(CreativeTabs tab, NonNullList<ItemStack> list) {
for (int i = 0; i < 9; ++i) {
list.add(new ItemStack(this, 1, i));
}
@@ -151,16 +154,19 @@ public class BlockSoil extends Block implements IBlockSoil, IItemModelRegister {
if (acidity != EnumAcidity.NEUTRAL) {
modelName += acidity.getName();
}
if (moisture != EnumMoisture.NORMAL) {
if (!modelName.isEmpty()) {
modelName += "_";
}
modelName += moisture.getName();
}
if (modelName.isEmpty()) {
modelName = "normal";
}
final String identifier;
String identifier;
if (weedKilled) {
identifier = type.getName() + "_no_weed/" + modelName;
} else {
@@ -183,13 +189,13 @@ public class BlockSoil extends Block implements IBlockSoil, IItemModelRegister {
@Override
public IBlockState getStateFromMeta(int meta) {
final EnumMoisture moisture = EnumMoisture.values()[meta % 3];
final EnumAcidity acidity = EnumAcidity.values()[meta / 3];
EnumMoisture moisture = EnumMoisture.values()[meta % 3];
EnumAcidity acidity = EnumAcidity.values()[meta / 3];
return getDefaultState().withProperty(MOISTURE, moisture).withProperty(ACIDITY, acidity);
}
public EnumSoilType getType() {
return this.type;
return type;
}
@Override
@@ -203,23 +209,24 @@ public class BlockSoil extends Block implements IBlockSoil, IItemModelRegister {
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);
}
IBlockState blockState = state.withProperty(MOISTURE, moisture);
if (state != blockState) {
world.setBlockState(pos, blockState, 2);
}
if(!weedKilled){
if(rand.nextInt(5 - getType(world, pos).ordinal()) != 0){
if (!weedKilled) {
if (rand.nextInt(5 - getType(world, pos).ordinal()) != 0) {
return;
}
pos = pos.up();
if(!world.isAirBlock(pos)){
if (!world.isAirBlock(pos)) {
return;
}
world.setBlockState(pos, Botany.plant.getStateFromMeta(BlockPlant.Type.Weeds.ordinal()), 2);
world.setBlockState(pos, ModuleGardening.plant.getStateFromMeta(PlantType.WEEDS.ordinal()), 2);
}
}
@@ -233,48 +240,50 @@ public class BlockSoil extends Block implements IBlockSoil, IItemModelRegister {
}
@Override
public EnumAcidity getPH(final World world, final BlockPos pos) {
public EnumAcidity getPH(World world, BlockPos pos) {
return world.getBlockState(pos).getValue(ACIDITY);
}
@Override
public EnumMoisture getMoisture(final World world, final BlockPos pos) {
public EnumMoisture getMoisture(World world, BlockPos pos) {
return world.getBlockState(pos).getValue(MOISTURE);
}
@Override
public EnumSoilType getType(final World world, final BlockPos pos) {
return this.type;
public EnumSoilType getType(World world, BlockPos pos) {
return type;
}
@Override
public boolean fertilise(final World world, final BlockPos pos, final EnumSoilType maxLevel) {
final EnumSoilType type = this.getType(world, pos);
public boolean fertilise(World world, BlockPos pos, EnumSoilType maxLevel) {
EnumSoilType type = getType(world, pos);
if (type.ordinal() >= maxLevel.ordinal()) {
return false;
}
final IBlockState old = world.getBlockState(pos);
return world.setBlockState(pos, BotanyCore.getGardening().getSoilBlock(maxLevel, this.weedKilled).getDefaultState().withProperty(ACIDITY, old.getValue(ACIDITY)).withProperty(MOISTURE, old.getValue(MOISTURE)), 2);
IBlockState old = world.getBlockState(pos);
IBlockState newState = BotanyCore.getGardening().getSoil(maxLevel, weedKilled, old.getValue(MOISTURE), old.getValue(ACIDITY));
return world.setBlockState(pos, newState, 2);
}
@Override
public boolean degrade(final World world, final BlockPos pos, final EnumSoilType minLevel) {
final EnumSoilType type = this.getType(world, pos);
public boolean degrade(World world, BlockPos pos, EnumSoilType minLevel) {
EnumSoilType type = getType(world, pos);
if (type.ordinal() <= minLevel.ordinal()) {
return false;
}
final IBlockState old = world.getBlockState(pos);
return world.setBlockState(pos, BotanyCore.getGardening().getSoilBlock(minLevel, this.weedKilled).getDefaultState().withProperty(ACIDITY, old.getValue(ACIDITY)).withProperty(MOISTURE, old.getValue(MOISTURE)), 2);
IBlockState old = world.getBlockState(pos);
IBlockState newState = BotanyCore.getGardening().getSoil(minLevel, weedKilled, old.getValue(MOISTURE), old.getValue(ACIDITY));
return world.setBlockState(pos, newState, 2);
}
@Override
public boolean setPH(final World world, final BlockPos pos, final EnumAcidity pH) {
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(final World world, final BlockPos pos, final EnumMoisture moisture) {
public boolean setMoisture(World world, BlockPos pos, EnumMoisture moisture) {
IBlockState blockState = world.getBlockState(pos);
return world.setBlockState(pos, blockState.withProperty(MOISTURE, moisture));
}
@@ -290,18 +299,21 @@ public class BlockSoil extends Block implements IBlockSoil, IItemModelRegister {
@Override
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(ModuleManager.isModuleEnabled(Constants.BOTANY_MOD_ID, BotanyModuleUIDs.FLOWERS)) {
if (plant.getBlock() == ModuleFlowers.flower) {
return true;
}
}
if (plant.getBlock() == Botany.plant) {
return !this.weedKilled || !BlockPlant.isWeed(world, pos);
if (plant.getBlock() == ModuleGardening.plant) {
return !weedKilled || !BlockPlant.isWeed(world, pos);
}
return world instanceof World && Blocks.DIRT.canSustainPlant(state, world, pos, direction, plantable);
}
@Override
public boolean resistsWeeds(final World world, final BlockPos pos) {
return this.weedKilled;
public boolean resistsWeeds(World world, BlockPos pos) {
return weedKilled;
}
public boolean isWeedKilled() {
@@ -1,7 +1,7 @@
package binnie.botany.ceramic;
package binnie.botany.blocks;
import javax.annotation.Nullable;
import java.util.Collections;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
@@ -35,7 +35,7 @@ import forestry.api.core.IModelManager;
import forestry.core.blocks.IColoredBlock;
import binnie.botany.CreativeTabBotany;
import binnie.botany.genetics.EnumFlowerColor;
import binnie.botany.api.genetics.EnumFlowerColor;
import binnie.core.block.BlockMetadata;
import binnie.core.block.IBlockMetadata;
import binnie.core.block.TileEntityMetadata;
@@ -44,17 +44,17 @@ import binnie.core.util.I18N;
public class BlockStainedGlass extends Block implements IBlockMetadata, IColoredBlock, IItemModelRegister {
public BlockStainedGlass() {
super(Material.GLASS);
this.setCreativeTab(CreativeTabBotany.instance);
this.setRegistryName("stained");
this.setSoundType(SoundType.GLASS);
this.setHardness(0.3F);
setCreativeTab(CreativeTabBotany.INSTANCE);
setRegistryName("stained");
setSoundType(SoundType.GLASS);
setHardness(0.3F);
}
@Override
public int quantityDropped(final Random rand) {
public int quantityDropped(Random rand) {
return 0;
}
@Override
public boolean isOpaqueCube(IBlockState state) {
return false;
@@ -81,22 +81,22 @@ public class BlockStainedGlass extends Block implements IBlockMetadata, IColored
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) {
java.util.List<ItemStack> items = new java.util.ArrayList<ItemStack>();
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);
@@ -105,12 +105,12 @@ public class BlockStainedGlass extends Block implements IBlockMetadata, IColored
}
@Override
public List<ItemStack> getDrops(IBlockAccess world, BlockPos pos, IBlockState state, int fortune) {
return Collections.emptyList();
public void getDrops(NonNullList<ItemStack> drops, IBlockAccess world, BlockPos pos, IBlockState state, int fortune) {
}
@Override
public TileEntity createNewTileEntity(final World var1, final int i) {
public TileEntity createNewTileEntity(World var1, int i) {
return new TileEntityMetadata();
}
@@ -126,7 +126,7 @@ public class BlockStainedGlass extends Block implements IBlockMetadata, IColored
}
@Override
public int getPlacedMeta(final ItemStack stack, final World world, final BlockPos pos, final EnumFacing clickedBlock) {
public int getPlacedMeta(ItemStack stack, World world, BlockPos pos, EnumFacing clickedBlock) {
return TileEntityMetadata.getItemDamage(stack);
}
@@ -136,15 +136,15 @@ public class BlockStainedGlass extends Block implements IBlockMetadata, IColored
}
@Override
public String getDisplayName(final ItemStack itemStack) {
final int meta = TileEntityMetadata.getItemDamage(itemStack);
return EnumFlowerColor.get(meta).getFlowerColorAllele().getColourName() + " " + I18N.localise("tile.botany.pigmented.glass.name");
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(final Item itemIn, final CreativeTabs tab, final NonNullList<ItemStack> itemList) {
for (final EnumFlowerColor c : EnumFlowerColor.values()) {
itemList.add(TileEntityMetadata.getItemStack(this, c.ordinal()));
public void getSubBlocks(CreativeTabs tab, NonNullList<ItemStack> itemList) {
for (EnumFlowerColor color : EnumFlowerColor.values()) {
itemList.add(TileEntityMetadata.getItemStack(this, color.ordinal()));
}
}
@@ -178,6 +178,7 @@ public class BlockStainedGlass extends Block implements IBlockMetadata, IColored
if (worldIn == null || pos == null) {
return 0;
}
return EnumFlowerColor.get(TileEntityMetadata.getTileMetadata(worldIn, pos)).getFlowerColorAllele().getColor(false);
EnumFlowerColor color = EnumFlowerColor.get(TileEntityMetadata.getTileMetadata(worldIn, pos));
return color.getFlowerColorAllele().getColor(false);
}
}
@@ -0,0 +1,46 @@
package binnie.botany.blocks;
import net.minecraft.item.ItemStack;
import net.minecraft.util.IStringSerializable;
import binnie.botany.modules.ModuleGardening;
public enum PlantType implements IStringSerializable {
WEEDS("weeds", true),
WEEDS_LONG("weeds_long", true),
WEEDS_VERY_LONG("weeds_very_long", true),
DEAD_FLOWER("dead_flower"),
DECAYING_FLOWER("decaying_flower");
private final String name;
private final boolean isWeed;
PlantType(String name) {
this(name, false);
}
PlantType(String name, boolean isWeed) {
this.name = name;
this.isWeed = isWeed;
}
public static PlantType getType(int meta){
if(meta >= values().length){
meta = values().length-1;
}
return values()[meta];
}
public ItemStack get() {
return new ItemStack(ModuleGardening.plant, 1, ordinal());
}
public boolean isWeed() {
return isWeed;
}
@Override
public String getName() {
return name;
}
}
@@ -1,7 +1,7 @@
@ParametersAreNonnullByDefault
@MethodsReturnNonnullByDefault
@FieldsAreNonnullByDefault
package binnie.botany.flower;
package binnie.botany.blocks;
import javax.annotation.ParametersAreNonnullByDefault;
@@ -1,4 +1,4 @@
package binnie.botany.flower;
package binnie.botany.blocks.properties;
import com.google.common.base.Optional;
@@ -11,8 +11,8 @@ 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;
import binnie.botany.api.genetics.IAlleleFlowerSpecies;
import binnie.botany.api.genetics.IFlowerType;
public class PropertyFlower<I extends IFlowerType<I>> extends PropertyHelper<I> {
public PropertyFlower(String name, Class<I> flowerTypeClass) {
@@ -0,0 +1,9 @@
@ParametersAreNonnullByDefault
@MethodsReturnNonnullByDefault
@FieldsAreNonnullByDefault
package binnie.botany.blocks.properties;
import javax.annotation.ParametersAreNonnullByDefault;
import binnie.core.util.FieldsAreNonnullByDefault;
import mcp.MethodsReturnNonnullByDefault;
@@ -5,33 +5,33 @@ import java.util.Map;
import net.minecraft.item.ItemStack;
import binnie.botany.Botany;
import binnie.botany.genetics.EnumFlowerColor;
import binnie.botany.api.genetics.EnumFlowerColor;
import binnie.botany.modules.ModuleCeramic;
import binnie.core.block.TileEntityMetadata;
import binnie.extratrees.api.IDesignMaterial;
import binnie.design.api.IDesignMaterial;
public class CeramicColor implements IDesignMaterial {
private final static Map<EnumFlowerColor, CeramicColor> map = new LinkedHashMap<>();
static {
for (final EnumFlowerColor c : EnumFlowerColor.values()) {
for (EnumFlowerColor c : EnumFlowerColor.values()) {
CeramicColor.map.put(c, new CeramicColor(c));
}
}
EnumFlowerColor color;
private final EnumFlowerColor color;
CeramicColor(final EnumFlowerColor color) {
CeramicColor(EnumFlowerColor color) {
this.color = color;
}
public static CeramicColor get(final EnumFlowerColor c) {
public static CeramicColor get(EnumFlowerColor c) {
return CeramicColor.map.get(c);
}
@Override
public ItemStack getStack() {
return TileEntityMetadata.getItemStack(Botany.ceramic, this.color.ordinal());
return TileEntityMetadata.getItemStack(ModuleCeramic.ceramic, color.ordinal());
}
@Override
@@ -41,11 +41,15 @@ public class CeramicColor implements IDesignMaterial {
@Override
public String getDesignMaterialName() {
return this.color.getName();
return color.getName();
}
@Override
public int getColour() {
return this.color.getFlowerColorAllele().getColor(false);
return color.getFlowerColorAllele().getColor(false);
}
public int getMaterialIndex() {
return color.ordinal();
}
}
@@ -4,6 +4,7 @@ import javax.annotation.Nullable;
import java.util.HashMap;
import java.util.Map;
import binnie.design.Design;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
import net.minecraft.client.renderer.texture.TextureMap;
@@ -15,24 +16,23 @@ 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.extratrees.api.IDesignMaterial;
import binnie.extratrees.api.IDesignSystem;
import binnie.extratrees.api.IPattern;
import binnie.extratrees.carpentry.DesignerManager;
import binnie.extratrees.carpentry.EnumPattern;
import binnie.botany.api.genetics.EnumFlowerColor;
import binnie.botany.items.CeramicItems;
import binnie.botany.modules.ModuleCeramic;
import binnie.design.api.IDesignMaterial;
import binnie.design.api.IDesignSystem;
import binnie.design.api.IPattern;
import binnie.design.EnumPattern;
public class CeramicDesignSystem implements IDesignSystem {
public static CeramicDesignSystem instance = new CeramicDesignSystem();
Map<Integer, TextureAtlasSprite> primary;
Map<Integer, TextureAtlasSprite> secondary;
public static final CeramicDesignSystem instance = new CeramicDesignSystem();
private final Map<Integer, TextureAtlasSprite> primary;
private final Map<Integer, TextureAtlasSprite> secondary;
CeramicDesignSystem() {
this.primary = new HashMap<>();
this.secondary = new HashMap<>();
DesignerManager.instance.registerDesignSystem(this);
primary = new HashMap<>();
secondary = new HashMap<>();
Design.getDesignManager().registerDesignSystem(this);
}
@Override
@@ -46,13 +46,13 @@ public class CeramicDesignSystem implements IDesignSystem {
}
@Override
public IDesignMaterial getMaterial(final int id) {
public IDesignMaterial getMaterial(int id) {
return CeramicColor.get(EnumFlowerColor.get(id));
}
@Override
public int getMaterialIndex(final IDesignMaterial id) {
return ((CeramicColor) id).color.ordinal();
public int getMaterialIndex(IDesignMaterial id) {
return ((CeramicColor) id).getMaterialIndex();
}
public String getTexturePath() {
@@ -63,8 +63,9 @@ public class CeramicDesignSystem implements IDesignSystem {
@Nullable
@SideOnly(Side.CLIENT)
public TextureAtlasSprite getPrimarySprite(IPattern pattern) {
if (pattern instanceof EnumPattern) {
return this.primary.get(((EnumPattern) pattern).ordinal());
int index = pattern.getIndex();
if (index >= 0 && index < primary.size()) {
return primary.get(index);
}
return null;
}
@@ -73,8 +74,9 @@ public class CeramicDesignSystem implements IDesignSystem {
@Nullable
@SideOnly(Side.CLIENT)
public TextureAtlasSprite getSecondarySprite(IPattern pattern) {
if (pattern instanceof EnumPattern) {
return this.secondary.get(((EnumPattern) pattern).ordinal());
int index = pattern.getIndex();
if (index >= 0 && index < secondary.size()) {
return secondary.get(index);
}
return null;
}
@@ -84,25 +86,27 @@ public class CeramicDesignSystem implements IDesignSystem {
public void registerSprites() {
TextureMap textureMap = Minecraft.getMinecraft().getTextureMapBlocks();
for (EnumPattern pattern : EnumPattern.values()) {
ResourceLocation primaryLocation = new ResourceLocation(getMod().getModID(), getTexturePath() + "/" + pattern.toString().toLowerCase() + ".0");
ResourceLocation secondaryLocation = new ResourceLocation(getMod().getModID(), getTexturePath() + "/" + pattern.toString().toLowerCase() + ".1");
this.primary.put(pattern.ordinal(), textureMap.registerSprite(primaryLocation));
this.secondary.put(pattern.ordinal(), textureMap.registerSprite(secondaryLocation));
ResourceLocation primaryLocation = new ResourceLocation(getModId(), getTexturePath() + "/" + pattern.toString().toLowerCase() + ".0");
ResourceLocation secondaryLocation = new ResourceLocation(getModId(), getTexturePath() + "/" + pattern.toString().toLowerCase() + ".1");
primary.put(pattern.getIndex(), textureMap.registerSprite(primaryLocation));
secondary.put(pattern.getIndex(), textureMap.registerSprite(secondaryLocation));
}
}
public AbstractMod getMod() {
return Botany.instance;
public String getModId() {
return Botany.instance.getModId();
}
@Override
public ItemStack getAdhesive() {
return BotanyItems.Mortar.get(1);
return CeramicItems.MORTAR.get(1);
}
@Override
@Nullable
public IDesignMaterial getMaterial(final ItemStack itemStack) {
return (itemStack.getItem() == Item.getItemFromBlock(Botany.ceramic)) ? this.getMaterial(itemStack.getItemDamage()) : null;
public IDesignMaterial getMaterial(ItemStack itemStack) {
return (itemStack.getItem() == Item.getItemFromBlock(ModuleCeramic.ceramic))
? getMaterial(itemStack.getItemDamage())
: null;
}
}
@@ -0,0 +1,106 @@
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.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagInt;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import binnie.botany.api.genetics.EnumFlowerColor;
import binnie.botany.modules.ModuleCeramic;
import binnie.core.util.I18N;
public class CeramicBrickPair {
public static final CeramicBrickPair EMPTY = new CeramicBrickPair(EnumFlowerColor.DarkSeaGreen, EnumFlowerColor.DarkSeaGreen, CeramicBrickType.TILE);
private final EnumFlowerColor colorFirst;
private final EnumFlowerColor colorSecond;
private CeramicBrickType type;
private int ordinal;
public 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(getId(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 static int getId(ItemStack stack){
if(!stack.hasTagCompound()){
return EMPTY.ordinal();
}
NBTTagCompound nbtTagCompound = stack.getTagCompound();
return nbtTagCompound.getInteger("id");
}
public ItemStack getStack(int i) {
ItemStack stack = new ItemStack(ModuleCeramic.ceramicBrick, i);
stack.setTagInfo("id", new NBTTagInt(ordinal()));
return stack;
}
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.getId() + ".name", name);
}
public int ordinal() {
return ordinal;
}
@SideOnly(Side.CLIENT)
public TextureAtlasSprite getSprite(int pass) {
TextureAtlasSprite[] sprites = type.getSprites();
Preconditions.checkState(sprites != null, "Sprites have not been registered.");
return sprites[pass];
}
@Override
public int hashCode() {
return Integer.hashCode(type.ordinal());
}
@Override
public boolean equals(Object obj) {
return obj instanceof CeramicBrickPair
&& ((CeramicBrickPair) obj).type == type;
}
public EnumFlowerColor getColorFirst() {
return colorFirst;
}
public EnumFlowerColor getColorSecond() {
return colorSecond;
}
public CeramicBrickType getType() {
return type;
}
public void setType(CeramicBrickType type) {
this.type = type;
}
}
@@ -2,7 +2,6 @@ package binnie.botany.ceramic.brick;
import javax.annotation.Nullable;
import java.util.List;
import java.util.Locale;
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
import net.minecraft.item.Item;
@@ -12,13 +11,13 @@ 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.botany.api.genetics.EnumFlowerColor;
import binnie.botany.items.CeramicItems;
import binnie.botany.modules.ModuleCeramic;
import binnie.core.block.TileEntityMetadata;
public enum CeramicBrickType implements IStringSerializable {
Tile("tile", "Ceramic Tile") {
TILE("tile") {
@Override
public ItemStack getRecipe(List<ItemStack> stacks) {
if (stacks.size() != 4) {
@@ -27,15 +26,15 @@ public enum CeramicBrickType implements IStringSerializable {
int mortars = 0;
int blocks = 0;
int blockColor = -1;
for (final ItemStack stack : stacks) {
if (this.isMortar(stack)) {
for (ItemStack stack : stacks) {
if (isMortar(stack)) {
++mortars;
} else {
if (stack.getItem() != Item.getItemFromBlock(Botany.ceramic)) {
if (stack.getItem() != Item.getItemFromBlock(ModuleCeramic.ceramic)) {
return ItemStack.EMPTY;
}
++blocks;
final int color = TileEntityMetadata.getItemDamage(stack);
int color = TileEntityMetadata.getItemDamage(stack);
if (blockColor == -1) {
blockColor = color;
} else {
@@ -48,30 +47,30 @@ public enum CeramicBrickType implements IStringSerializable {
if (mortars != 1) {
return ItemStack.EMPTY;
}
final EnumFlowerColor c = EnumFlowerColor.get(blockColor);
return new CeramicBrickPair(c, c, CeramicBrickType.Tile).getStack(3);
EnumFlowerColor c = EnumFlowerColor.get(blockColor);
return new CeramicBrickPair(c, c, CeramicBrickType.TILE).getStack(3);
}
},
Brick("brick", "Ceramic Bricks") {
BRICK("brick") {
@Override
public ItemStack getRecipe(List<ItemStack> stacks) {
return getBrickRecipe(this, stacks);
}
},
StripeBrick("brickstripe", "Striped Ceramic Bricks") {
STRIPE_BRICK("brickstripe") {
@Override
public ItemStack getRecipe(List<ItemStack> stacks) {
return getBrickRecipe(this, stacks);
}
},
LargeBrick("bricklarge", "Large Ceramic Bricks") {
LARGE_BRICK("bricklarge") {
@Override
public ItemStack getRecipe(List<ItemStack> stacks) {
if (stacks.size() == 1) {
final ItemStack stack3 = stacks.get(0);
final CeramicBrickPair type3 = new CeramicBrickPair(stack3);
if (type3.type == CeramicBrickType.VerticalLargeBrick) {
type3.type = this;
ItemStack stack3 = stacks.get(0);
CeramicBrickPair type3 = new CeramicBrickPair(stack3);
if (type3.getType() == CeramicBrickType.VERTICAL_LARGE_BRICK) {
type3.setType(this);
return type3.getStack(1);
}
return ItemStack.EMPTY;
@@ -79,58 +78,58 @@ public enum CeramicBrickType implements IStringSerializable {
if (stacks.size() != 3) {
return ItemStack.EMPTY;
}
final int[] colors = {-1, -1};
int[] colors = {-1, -1};
int a = 0;
int b = 0;
for (final ItemStack stack4 : stacks) {
if (stack4.getItem() != Item.getItemFromBlock(Botany.ceramicBrick)) {
for (ItemStack stack4 : stacks) {
if (stack4.getItem() != Item.getItemFromBlock(ModuleCeramic.ceramicBrick)) {
return ItemStack.EMPTY;
}
final CeramicBrickPair type4 = new CeramicBrickPair(stack4);
if (type4.type != CeramicBrickType.Tile) {
CeramicBrickPair type4 = new CeramicBrickPair(stack4);
if (type4.getType() != CeramicBrickType.TILE) {
return ItemStack.EMPTY;
}
final int color5 = type4.colorFirst.ordinal();
int color5 = type4.getColorFirst().ordinal();
if (colors[0] == -1) {
colors[0] = color5;
++a;
a++;
} else if (colors[0] == color5) {
++a;
a++;
} else if (colors[1] == -1) {
colors[1] = color5;
++b;
b++;
} else {
if (colors[1] != color5) {
return ItemStack.EMPTY;
}
++b;
b++;
}
}
if (colors[1] == -1) {
colors[1] = colors[0];
}
return new CeramicBrickPair(EnumFlowerColor.get(colors[0]), EnumFlowerColor.get(colors[1]), CeramicBrickType.LargeBrick).getStack(3);
return new CeramicBrickPair(EnumFlowerColor.get(colors[0]), EnumFlowerColor.get(colors[1]), CeramicBrickType.LARGE_BRICK).getStack(3);
}
}
},
Split("split", "Split Ceramic Tile") {
SPLIT("split") {
@Override
public ItemStack getRecipe(List<ItemStack> stacks) {
if (stacks.size() != 4) {
return ItemStack.EMPTY;
}
final int[] colors = {-1, -1};
int[] colors = {-1, -1};
int altCounter = 0;
for (final ItemStack stack2 : stacks) {
final int alt = (altCounter != 0 && altCounter != 3) ? 1 : 0;
if (stack2.getItem() != Item.getItemFromBlock(Botany.ceramicBrick)) {
for (ItemStack stack2 : stacks) {
int alt = (altCounter != 0 && altCounter != 3) ? 1 : 0;
if (stack2.getItem() != Item.getItemFromBlock(ModuleCeramic.ceramicBrick)) {
return ItemStack.EMPTY;
}
final CeramicBrickPair type = new CeramicBrickPair(stack2);
if (type.type != CeramicBrickType.Tile) {
CeramicBrickPair type = new CeramicBrickPair(stack2);
if (type.getType() != CeramicBrickType.TILE) {
return ItemStack.EMPTY;
}
final int color2 = type.colorFirst.ordinal();
int color2 = type.getColorFirst().ordinal();
if (colors[alt] == -1) {
colors[alt] = color2;
} else if (colors[alt] != color2) {
@@ -138,26 +137,26 @@ public enum CeramicBrickType implements IStringSerializable {
}
++altCounter;
}
return new CeramicBrickPair(EnumFlowerColor.get(colors[0]), EnumFlowerColor.get(colors[1]), CeramicBrickType.Split).getStack(4);
return new CeramicBrickPair(EnumFlowerColor.get(colors[0]), EnumFlowerColor.get(colors[1]), CeramicBrickType.SPLIT).getStack(4);
}
},
Chequered("cheque", "Chequered Ceramic Tile") {
CHEQUERED("cheque") {
@Override
public ItemStack getRecipe(List<ItemStack> stacks) {
if (stacks.size() != 4) {
return ItemStack.EMPTY;
}
final int[] colors = {-1, -1};
for (final ItemStack stack2 : stacks) {
if (stack2.getItem() != Item.getItemFromBlock(Botany.ceramicBrick)) {
int[] colors = {-1, -1};
for (ItemStack stack2 : stacks) {
if (stack2.getItem() != Item.getItemFromBlock(ModuleCeramic.ceramicBrick)) {
return ItemStack.EMPTY;
}
final CeramicBrickPair type2 = new CeramicBrickPair(stack2);
if (type2.type != CeramicBrickType.Split) {
CeramicBrickPair type2 = new CeramicBrickPair(stack2);
if (type2.getType() != CeramicBrickType.SPLIT) {
return ItemStack.EMPTY;
}
final int color3 = type2.colorFirst.ordinal();
final int color4 = type2.colorSecond.ordinal();
int color3 = type2.getColorFirst().ordinal();
int color4 = type2.getColorSecond().ordinal();
if (colors[0] == -1) {
colors[0] = color3;
colors[1] = color4;
@@ -167,32 +166,32 @@ public enum CeramicBrickType implements IStringSerializable {
}
}
}
return new CeramicBrickPair(EnumFlowerColor.get(colors[0]), EnumFlowerColor.get(colors[1]), CeramicBrickType.Chequered).getStack(4);
return new CeramicBrickPair(EnumFlowerColor.get(colors[0]), EnumFlowerColor.get(colors[1]), CeramicBrickType.CHEQUERED).getStack(4);
}
},
Mixed("mixed", "Mixed Ceramic Tile") {
MIXED("mixed") {
@Override
public ItemStack getRecipe(List<ItemStack> stacks) {
if (stacks.size() != 4) {
return ItemStack.EMPTY;
}
final int[] colors = {-1, -1};
for (final ItemStack stack2 : stacks) {
if (stack2.getItem() != Item.getItemFromBlock(Botany.ceramicBrick)) {
int[] colors = {-1, -1};
for (ItemStack stack2 : stacks) {
if (stack2.getItem() != Item.getItemFromBlock(ModuleCeramic.ceramicBrick)) {
return ItemStack.EMPTY;
}
final CeramicBrickPair type2 = new CeramicBrickPair(stack2);
CeramicBrickPair type2 = new CeramicBrickPair(stack2);
if (type2.isTwoColors()) {
return ItemStack.EMPTY;
}
final int color3 = type2.colorFirst.ordinal();
if (type2.type == CeramicBrickType.Split) {
int color3 = type2.getColorFirst().ordinal();
if (type2.getType() == CeramicBrickType.SPLIT) {
if (colors[1] != -1) {
return ItemStack.EMPTY;
}
colors[1] = color3;
} else {
if (type2.type != CeramicBrickType.Chequered) {
if (type2.getType() != CeramicBrickType.CHEQUERED) {
return ItemStack.EMPTY;
}
if (colors[0] == -1) {
@@ -201,27 +200,27 @@ public enum CeramicBrickType implements IStringSerializable {
return ItemStack.EMPTY;
}
}
final int color4 = type2.colorSecond.ordinal();
int color4 = type2.getColorSecond().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);
return new CeramicBrickPair(EnumFlowerColor.get(colors[0]), EnumFlowerColor.get(colors[1]), CeramicBrickType.MIXED).getStack(4);
}
},
VerticalBrick("verticalbrick", "Vertical Ceramic Bricks") {
VERTICAL_BRICK("verticalbrick") {
@Override
public ItemStack getRecipe(List<ItemStack> stacks) {
return getVerticalBrickRecipe(stacks);
}
},
VerticalStripeBrick("verticalbrickstripe", "Vertical Striped Ceramic Bricks") {
VERTICAL_STRIPE_BRICK("verticalbrickstripe") {
@Override
public ItemStack getRecipe(List<ItemStack> stacks) {
return getVerticalBrickRecipe(stacks);
}
},
VerticalLargeBrick("verticalbricklarge", "Large Vertical Ceramic Bricks") {
VERTICAL_LARGE_BRICK("verticalbricklarge") {
@Override
public ItemStack getRecipe(List<ItemStack> stacks) {
return getVerticalBrickRecipe(stacks);
@@ -230,24 +229,22 @@ public enum CeramicBrickType implements IStringSerializable {
public static final CeramicBrickType[] VALUES = values();
String id;
String name;
private final String id;
@SideOnly(Side.CLIENT)
@Nullable
TextureAtlasSprite[] sprites;
private TextureAtlasSprite[] sprites;
CeramicBrickType(final String id, final String name) {
CeramicBrickType(String id) {
this.id = id;
this.name = name;
}
public static CeramicBrickType get(final int id) {
public static CeramicBrickType get(int id) {
return VALUES[id % VALUES.length];
}
public boolean canDouble() {
return this != CeramicBrickType.Tile;
return this != CeramicBrickType.TILE;
}
public abstract ItemStack getRecipe(List<ItemStack> stacks);
@@ -256,18 +253,20 @@ public enum CeramicBrickType implements IStringSerializable {
if (stacks.size() != 1) {
return ItemStack.EMPTY;
}
final ItemStack stack5 = stacks.get(0);
final CeramicBrickPair type = new CeramicBrickPair(stack5);
if (type.type == CeramicBrickType.LargeBrick) {
type.type = CeramicBrickType.VerticalLargeBrick;
ItemStack stack5 = stacks.get(0);
CeramicBrickPair type = new CeramicBrickPair(stack5);
if (type.getType() == CeramicBrickType.LARGE_BRICK) {
type.setType(CeramicBrickType.VERTICAL_LARGE_BRICK);
return type.getStack(1);
}
if (type.type == CeramicBrickType.Brick) {
type.type = CeramicBrickType.VerticalBrick;
if (type.getType() == CeramicBrickType.BRICK) {
type.setType(CeramicBrickType.VERTICAL_BRICK);
return type.getStack(1);
}
if (type.type == CeramicBrickType.StripeBrick) {
type.type = CeramicBrickType.VerticalStripeBrick;
if (type.getType() == CeramicBrickType.STRIPE_BRICK) {
type.setType(CeramicBrickType.VERTICAL_STRIPE_BRICK);
return type.getStack(1);
}
return ItemStack.EMPTY;
@@ -275,34 +274,38 @@ public enum CeramicBrickType implements IStringSerializable {
protected ItemStack getBrickRecipe(CeramicBrickType ceramicType, List<ItemStack> stacks) {
if (stacks.size() == 1) {
final ItemStack stack5 = stacks.get(0);
final CeramicBrickPair type = new CeramicBrickPair(stack5);
if (type.type == CeramicBrickType.VerticalBrick) {
type.type = ceramicType;
ItemStack stack5 = stacks.get(0);
CeramicBrickPair type = new CeramicBrickPair(stack5);
if (type.getType() == CeramicBrickType.VERTICAL_BRICK) {
type.setType(ceramicType);
return type.getStack(1);
}
if (type.type == CeramicBrickType.StripeBrick) {
type.type = ceramicType;
if (type.getType() == CeramicBrickType.STRIPE_BRICK) {
type.setType(ceramicType);
return type.getStack(1);
}
return ItemStack.EMPTY;
} else if (stacks.size() == 4) {
final int[] colors = {-1, -1};
int[] colors = {-1, -1};
for (int index2 = 0; index2 < stacks.size(); ++index2) {
final ItemStack stack4 = stacks.get(index2);
if (stack4.getItem() != Item.getItemFromBlock(Botany.ceramicBrick)) {
ItemStack stack4 = stacks.get(index2);
if (stack4.getItem() != Item.getItemFromBlock(ModuleCeramic.ceramicBrick)) {
return ItemStack.EMPTY;
}
final CeramicBrickPair type4 = new CeramicBrickPair(stack4);
if (type4.type != CeramicBrickType.LargeBrick) {
CeramicBrickPair type4 = new CeramicBrickPair(stack4);
if (type4.getType() != CeramicBrickType.LARGE_BRICK) {
return ItemStack.EMPTY;
}
final int color5 = type4.colorFirst.ordinal();
final int color6 = type4.colorSecond.ordinal();
int color5 = type4.getColorFirst().ordinal();
int color6 = type4.getColorSecond().ordinal();
int alt2 = (index2 != 0 && index2 != 3) ? 1 : 0;
if (ceramicType == CeramicBrickType.StripeBrick) {
if (ceramicType == CeramicBrickType.STRIPE_BRICK) {
alt2 = 0;
}
if (colors[alt2] == -1) {
colors[alt2] = color5;
colors[1 - alt2] = color6;
@@ -311,17 +314,31 @@ public enum CeramicBrickType implements IStringSerializable {
}
}
return new CeramicBrickPair(EnumFlowerColor.get(colors[0]), EnumFlowerColor.get(colors[1]), ceramicType).getStack(4);
} else {
return ItemStack.EMPTY;
}
return ItemStack.EMPTY;
}
protected boolean isMortar(final ItemStack stack) {
return stack.getItem() == Botany.misc && stack.getItemDamage() == BotanyItems.Mortar.ordinal();
protected boolean isMortar(ItemStack stack) {
return stack.getItem() == ModuleCeramic.misc && stack.getItemDamage() == CeramicItems.MORTAR.ordinal();
}
@Override
public String getName() {
return name().toLowerCase(Locale.ENGLISH);
return id;
}
public String getId() {
return id;
}
@Nullable
@SideOnly(Side.CLIENT)
public TextureAtlasSprite[] getSprites() {
return sprites;
}
@SideOnly(Side.CLIENT)
public void setSprites(TextureAtlasSprite[] sprites) {
this.sprites = sprites;
}
}
@@ -0,0 +1,25 @@
package binnie.botany.core;
import binnie.botany.GardeningManager;
import binnie.botany.api.BotanyAPI;
import binnie.botany.api.gardening.IGardeningManager;
import binnie.botany.api.genetics.IFlowerRoot;
import binnie.botany.genetics.FlowerRoot;
public class BotanyCore {
public static final int CHANCE_INTERPOLLINATION = 20;
public static IFlowerRoot getFlowerRoot() {
if (BotanyAPI.flowerRoot == null) {
BotanyAPI.flowerRoot = new FlowerRoot();
}
return BotanyAPI.flowerRoot;
}
public static IGardeningManager getGardening() {
if (BotanyAPI.gardening == null) {
BotanyAPI.gardening = new GardeningManager();
}
return BotanyAPI.gardening;
}
}
@@ -1,4 +1,4 @@
package binnie.botany.farm;
package binnie.botany.farming;
import com.google.common.base.Preconditions;
@@ -12,38 +12,26 @@ 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.botany.api.gardening.EnumAcidity;
import binnie.botany.api.gardening.EnumMoisture;
import binnie.core.circuits.BinnieCircuit;
import binnie.core.util.I18N;
public class CircuitGarden extends BinnieCircuit {
private boolean isManual;
private GardenLogic logic;
private final GardenLogic logic;
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);
this.isManual = manual;
this.logic = new GardenLogic(moisture, ph, this.isManual, fertilised, icon, I18N.localise(this.getUnlocalizedName()));
StringBuilder info = new StringBuilder("Flowers (")
.append(TextFormatting.GRAY.toString())
.append(I18N.localise("botany.moisture"))
.append(": ")
.append(moisture.getLocalisedName(true));
isManual = manual;
logic = new GardenLogic(moisture, ph, isManual, fertilised, icon, I18N.localise(getUnlocalizedName()));
String info = I18N.localise("botany.moisture") + ": " + moisture.getLocalisedName(true) + TextFormatting.GRAY + ", ";
if (ph != null) {
info.append(TextFormatting.GRAY.toString())
.append(", ")
.append(I18N.localise("botany.ph"))
.append(": ")
.append(ph.getLocalisedName(true));
info += I18N.localise("botany.ph") + ": " + ph.getLocalisedName(true) + TextFormatting.GRAY + ", ";
}
String fertilizedKey = fertilised ? "for.binnie.circuit.garden.fertilized" : "for.binnie.circuit.garden.unfertilized";
info.append(TextFormatting.RESET.toString())
.append(" ")
.append(I18N.localise(fertilizedKey))
.append(")");
this.addTooltipString(info.toString());
info += (fertilised ? TextFormatting.GREEN : TextFormatting.RED) + I18N.localise(fertilizedKey) + TextFormatting.GRAY;
addTooltipString(I18N.localise("for.binnie.circuit.garden.info", info));
}
private static ICircuitLayout getLayout(boolean manual) {
@@ -114,5 +102,6 @@ public class CircuitGarden extends BinnieCircuit {
@Override
public void onTick(int slot, Object tile) {
// ignored
}
}
@@ -1,4 +1,4 @@
package binnie.botany.farm;
package binnie.botany.farming;
import net.minecraft.block.Block;
import net.minecraft.block.state.IBlockState;
@@ -10,11 +10,11 @@ import net.minecraft.world.World;
import forestry.api.farming.IFarmLogic;
public abstract class FarmLogic implements IFarmLogic {
boolean isManual;
private boolean isManual;
@Override
public IFarmLogic setManual(final boolean flag) {
this.isManual = flag;
public IFarmLogic setManual(boolean flag) {
isManual = flag;
return this;
}
@@ -43,7 +43,11 @@ public abstract class FarmLogic implements IFarmLogic {
return getBlock(world, pos) == Blocks.WATER;
}
protected final void setBlock(World world, BlockPos pos, final Block block, final int meta) {
protected final void setBlock(World world, BlockPos pos, Block block, int meta) {
world.setBlockState(pos, block.getStateFromMeta(meta), 2);
}
public boolean isManual() {
return isManual;
}
}
@@ -1,4 +1,4 @@
package binnie.botany.farm;
package binnie.botany.farming;
import javax.annotation.Nullable;
@@ -12,17 +12,17 @@ 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.api.genetics.EnumFlowerStage;
import binnie.botany.api.genetics.IFlower;
import binnie.botany.api.genetics.IFlowerRoot;
import binnie.botany.core.BotanyCore;
import binnie.botany.flower.TileEntityFlower;
import binnie.botany.modules.ModuleFlowers;
import binnie.botany.tile.TileEntityFlower;
public class FarmableFlower implements IFarmable {
@Override
public boolean isSaplingAt(final World world, final BlockPos pos) {
return world.getBlockState(pos) == Botany.flower;
public boolean isSaplingAt(World world, BlockPos pos) {
return world.getBlockState(pos) == ModuleFlowers.flower;
}
@Nullable
@@ -32,33 +32,33 @@ public class FarmableFlower implements IFarmable {
if (world.getTileEntity(pos) instanceof TileEntityFlower) {
flower = ((TileEntityFlower) world.getTileEntity(pos)).getFlower();
}
// Look at TileEntityFlower::onShear logic
// 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) {
if (!mature.isEmpty() && !seed.isEmpty()) {
world.setBlockState(pos, Blocks.AIR.getDefaultState(), 2);
return new FlowerCrop(pos, mature, seed);
}
}
return null;
}
@Override
public boolean isGermling(final ItemStack itemstack) {
final EnumFlowerStage stage = BotanyCore.getFlowerRoot().getType(itemstack);
public boolean isGermling(ItemStack itemstack) {
EnumFlowerStage stage = BotanyCore.getFlowerRoot().getType(itemstack);
return stage == EnumFlowerStage.FLOWER || stage == EnumFlowerStage.SEED;
}
@Override
public boolean isWindfall(final ItemStack itemstack) {
public boolean isWindfall(ItemStack itemstack) {
return false;
}
@Override
public boolean plantSaplingAt(final EntityPlayer player, final ItemStack germling, final World world, final BlockPos pos) {
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());
@@ -1,22 +1,22 @@
package binnie.botany.farm;
package binnie.botany.farming;
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.api.genetics.IFlower;
import binnie.botany.api.genetics.IFlowerRoot;
import binnie.botany.core.BotanyCore;
public class FarmableVanillaFlower extends FarmableFlower {
@Override
public boolean isGermling(final ItemStack itemstack) {
public boolean isGermling(ItemStack itemstack) {
return BotanyCore.getFlowerRoot().getConversion(itemstack) != null;
}
@Override
public boolean plantSaplingAt(final EntityPlayer player, final ItemStack germling, final World world, final BlockPos pos) {
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());
@@ -1,7 +1,7 @@
package binnie.botany.farm;
package binnie.botany.farming;
import javax.annotation.Nullable;
import java.util.Arrays;
import java.util.Collections;
import net.minecraft.item.ItemStack;
import net.minecraft.util.NonNullList;
@@ -10,11 +10,11 @@ import net.minecraft.util.math.BlockPos;
import forestry.api.farming.ICrop;
public class FlowerCrop implements ICrop {
NonNullList<ItemStack> drops = NonNullList.create();
BlockPos position;
private final NonNullList<ItemStack> drops = NonNullList.create();
private final BlockPos position;
public FlowerCrop(BlockPos pos, ItemStack... drops) {
Arrays.stream(drops).forEach(drop -> this.drops.add(drop));
Collections.addAll(this.drops, drops);
position = pos;
}
@@ -0,0 +1,393 @@
package binnie.botany.farming;
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.block.state.IBlockState;
import net.minecraft.client.renderer.texture.TextureMap;
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.util.NonNullList;
import net.minecraft.util.ResourceLocation;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import net.minecraftforge.fluids.FluidStack;
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.core.Binnie;
import binnie.botany.api.gardening.EnumAcidity;
import binnie.botany.api.gardening.EnumFertiliserType;
import binnie.botany.api.gardening.EnumMoisture;
import binnie.botany.api.gardening.EnumSoilType;
import binnie.botany.api.gardening.IBlockSoil;
import binnie.botany.api.gardening.IGardeningManager;
import binnie.botany.core.BotanyCore;
import binnie.botany.modules.ModuleGardening;
import binnie.botany.tile.TileEntityFlower;
import binnie.core.liquid.ManagerLiquid;
public class GardenLogic extends FarmLogic {
private final List<IFarmable> farmables;
private final EnumMoisture moisture;
@Nullable
private final EnumAcidity acidity;
private final boolean fertilised;
private final String name;
private NonNullList<ItemStack> produce;
private ItemStack icon;
public GardenLogic(EnumMoisture moisture, @Nullable EnumAcidity acidity, boolean isManual, boolean isFertilised, ItemStack icon, String name) {
this.setManual(isManual);
this.moisture = moisture;
this.acidity = acidity;
this.fertilised = isFertilised;
this.icon = icon;
this.name = name;
produce = NonNullList.create();
farmables = new ArrayList<>();
farmables.add(new FarmableFlower());
farmables.add(new FarmableVanillaFlower());
}
@Override
public int getFertilizerConsumption() {
return fertilised ? 8 : 2;
}
@Override
public int getWaterConsumption(float hydrationModifier) {
return (int) (moisture.ordinal() * 40 * hydrationModifier);
}
@Override
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.isFertiliser(EnumFertiliserType.ACID, itemstack) ||
gardening.isFertiliser(EnumFertiliserType.ALKALINE, itemstack);
}
@Override
public NonNullList<ItemStack> collect(World world, IFarmHousing farmHousing) {
NonNullList<ItemStack> products = produce;
produce = NonNullList.create();
return products;
}
@Override
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);
}
private boolean maintainSoil(World world, BlockPos pos, FarmDirection direction, int extent, IFarmHousing housing) {
IGardeningManager gardening = BotanyCore.getGardening();
for (int i = 0; i < extent; ++i) {
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 (getBlock(world, position.up()) == ModuleGardening.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 = getAvailableFertiliser(housing, EnumFertiliserType.ALKALINE);
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 = getAvailableFertiliser(housing, EnumFertiliserType.ACID);
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 (!isAirBlock(world, position) && !BlockUtil.isReplaceableBlock(getBlockState(world, position), world, position)) {
ItemStack block = getAsItemStack(world, position);
ItemStack loam = getAvailableLoam(housing);
if (isWaste(block) && !loam.isEmpty()) {
IBlockState blockState = Block.getBlockFromItem(block.getItem()).getStateFromMeta(block.getItemDamage());
Blocks.DIRT.getDrops(produce, world, position, blockState, 0);
setBlock(world, position, Blocks.AIR, 0);
return trySetSoil(world, position, loam, housing);
}
} 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);
}
}
}
}
}
return false;
}
private boolean maintainWater(World world, BlockPos pos, FarmDirection direction, int extent, IFarmHousing housing) {
for (int i = 0; i < extent; ++i) {
BlockPos position = pos.offset(direction.getFacing(), i);
if (!isAirBlock(world, position) && !BlockUtil.isReplaceableBlock(getBlockState(world, position), world, position)) {
continue;
}
if (isWaterBlock(world, position)) {
continue;
}
boolean isEnclosed = true;
if (world.isAirBlock(position.east())) {
isEnclosed = false;
} else if (world.isAirBlock(position.west())) {
isEnclosed = false;
} else if (world.isAirBlock(position.south())) {
isEnclosed = false;
} else if (world.isAirBlock(position.north())) {
isEnclosed = false;
}
isEnclosed = (isEnclosed || moisture != EnumMoisture.DAMP);
if (isEnclosed) {
return trySetWater(world, position, housing);
}
}
return false;
}
private ItemStack getAvailableLoam(IFarmHousing housing) {
EnumMoisture[] moistures;
if (moisture == EnumMoisture.DAMP) {
moistures = new EnumMoisture[]{
EnumMoisture.DAMP,
EnumMoisture.NORMAL,
EnumMoisture.DRY
};
} else if (moisture == EnumMoisture.DRY) {
moistures = new EnumMoisture[]{
EnumMoisture.DRY,
EnumMoisture.DAMP,
EnumMoisture.DRY
};
} else {
moistures = new EnumMoisture[]{
EnumMoisture.DRY,
EnumMoisture.NORMAL,
EnumMoisture.DAMP
};
}
EnumAcidity[] acidities = {
EnumAcidity.NEUTRAL,
EnumAcidity.ACID,
EnumAcidity.ALKALINE
};
for (EnumMoisture moist : moistures) {
for (EnumAcidity acid : acidities) {
for (Block type : new Block[]{ModuleGardening.flowerbed, ModuleGardening.loam, ModuleGardening.soil}) {
int meta = acid.ordinal() * 3 + moist.ordinal();
NonNullList<ItemStack> resources = NonNullList.create();
ItemStack resourceStack = new ItemStack(type, 1, meta);
resources.add(resourceStack);
if (housing.getFarmInventory().hasResources(resources)) {
return resourceStack;
}
}
}
}
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 ItemStack.EMPTY;
}
private boolean trySetSoil(World world, BlockPos position, IFarmHousing housing) {
return trySetSoil(world, position, getAvailableLoam(housing), housing);
}
private boolean trySetSoil(World world, BlockPos position, ItemStack loam, IFarmHousing housing) {
ItemStack copy = loam;
if (loam.isEmpty()) {
return false;
}
if (loam.getItem() == Item.getItemFromBlock(Blocks.DIRT)) {
loam = new ItemStack(ModuleGardening.soil, 1, 4);
}
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(World world, BlockPos position, IFarmHousing housing) {
FluidStack water = Binnie.LIQUID.getFluidStack(ManagerLiquid.WATER, 1000);
if (moisture == EnumMoisture.DAMP) {
if (water == null || !housing.hasLiquid(water)) {
return false;
}
setBlock(world, position, Blocks.WATER, 0);
housing.removeLiquid(water);
return true;
}
if (moisture != EnumMoisture.DRY) {
return trySetSoil(world, position, housing);
}
ItemStack sand = new ItemStack(Blocks.SAND, 1);
NonNullList<ItemStack> resources = NonNullList.create();
resources.add(sand);
if (!housing.getFarmInventory().hasResources(resources)) {
return false;
}
setBlock(world, position, Blocks.SAND, 0);
housing.getFarmInventory().removeResources(resources);
return true;
}
public void setIcon(ItemStack icon) {
this.icon = icon;
}
@Override
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 void addSoil(ItemStack resource, IBlockState soilState, boolean hasMetaData) {
// all {@link IBlockSoil} are soil, and nothing else
}
@Override
public ResourceLocation getTextureMap() {
return TextureMap.LOCATION_BLOCKS_TEXTURE;
}
@Override
public String getName() {
return name;
}
@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) {
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(World world, BlockPos position, IFarmHousing housing) {
for (IFarmable farmable : farmables) {
if (!housing.plantGermling(farmable, world, position)) {
continue;
}
if (housing instanceof IOwnedTile) {
TileEntity tile = world.getTileEntity(position);
if (tile instanceof TileEntityFlower) {
TileEntityFlower flower = (TileEntityFlower) tile;
IOwnedTile owned = (IOwnedTile) housing;
flower.setOwner(owned.getOwnerHandler().getOwner());
}
}
return true;
}
return false;
}
public ItemStack getAvailableFertiliser(IFarmHousing housing, EnumFertiliserType type) {
for (ItemStack stack : BotanyCore.getGardening().getFertilisers(type)) {
if (!stack.isEmpty()) {
NonNullList<ItemStack> resources = NonNullList.create();
resources.add(stack);
if (housing.getFarmInventory().hasResources(resources)) {
return stack;
}
}
}
return ItemStack.EMPTY;
}
}
@@ -0,0 +1,9 @@
@ParametersAreNonnullByDefault
@MethodsReturnNonnullByDefault
@FieldsAreNonnullByDefault
package binnie.botany.farming;
import javax.annotation.ParametersAreNonnullByDefault;
import binnie.core.util.FieldsAreNonnullByDefault;
import mcp.MethodsReturnNonnullByDefault;
@@ -0,0 +1,77 @@
package binnie.botany.genetics;
import java.awt.Color;
import binnie.botany.api.genetics.IAlleleFlowerColor;
import binnie.core.util.I18N;
import forestry.api.genetics.IAlleleInteger;
public class AlleleFlowerColor implements IAlleleFlowerColor {
private final int color;
private final String uid;
private final boolean isDominant;
private final String name;
private final String unlocalizedName;
private final int colorWilted;
private final int id;
public AlleleFlowerColor(String uid, int id, Color color, Color colorWilted, String name, String unlocalizedName, boolean isDominant) {
this.color = color.getRGB();
this.uid = uid;
this.isDominant = isDominant;
this.name = name;
this.unlocalizedName = unlocalizedName;
this.colorWilted = colorWilted.getRGB();
this.id = id;
}
@Override
public int getValue() {
return color;
}
@Override
public String getUID() {
return uid;
}
@Override
public boolean isDominant() {
return isDominant;
}
@Override
public String getName() {
return name;
}
@Override
public String getAlleleName() {
return name;
}
@Override
public String getUnlocalizedName() {
return unlocalizedName;
}
@Override
public int getColor(boolean wilted) {
return wilted ? colorWilted : color;
}
@Override
public IAlleleInteger getAllele() {
return this;
}
@Override
public int getID() {
return id;
}
@Override
public String getColorName() {
return I18N.localise("botany.color." + getAlleleName());
}
}
@@ -1,26 +1,26 @@
package binnie.botany.genetics;
import binnie.botany.api.BotanyAPI;
import net.minecraft.entity.player.EntityPlayer;
import forestry.api.genetics.IBreedingTracker;
import forestry.api.genetics.IIndividual;
import forestry.core.genetics.BreedingTracker;
import binnie.Binnie;
import binnie.botany.api.IBotanistTracker;
import binnie.botany.api.genetics.IBotanistTracker;
public class BotanistTracker extends BreedingTracker implements IBotanistTracker {
public BotanistTracker(final String s) {
public BotanistTracker(String s) {
super(s, "NORMAL");
}
@Override
public void registerPickup(final IIndividual individual) {
public void registerPickup(IIndividual individual) {
}
@Override
protected IBreedingTracker getBreedingTracker(final EntityPlayer player) {
return Binnie.GENETICS.getFlowerRoot().getBreedingTracker(player.world, player.getGameProfile());
protected IBreedingTracker getBreedingTracker(EntityPlayer player) {
return BotanyAPI.flowerRoot.getBreedingTracker(player.world, player.getGameProfile());
}
@Override
@@ -0,0 +1,43 @@
package binnie.botany.genetics;
import binnie.botany.api.genetics.IColorMix;
import binnie.botany.api.genetics.IFlowerColor;
public final class ColorMix implements IColorMix {
private final IFlowerColor colorFirst;
private final IFlowerColor colorSecond;
private final IFlowerColor result;
private final int chance;
public ColorMix(IFlowerColor colorFirst, IFlowerColor colorSecond, IFlowerColor result, int chance) {
this.colorFirst = colorFirst;
this.colorSecond = colorSecond;
this.result = result;
this.chance = chance;
}
@Override
public IFlowerColor getColorFirst() {
return colorFirst;
}
@Override
public IFlowerColor getColorSecond() {
return colorSecond;
}
@Override
public boolean isMutation(IFlowerColor colorFirst, IFlowerColor colorSecond) {
return (colorFirst == this.colorFirst && colorSecond == this.colorSecond) || (colorFirst == this.colorSecond && colorSecond == this.colorFirst);
}
@Override
public int getChance() {
return chance;
}
@Override
public IFlowerColor getResult() {
return result;
}
}
@@ -11,79 +11,79 @@ import net.minecraftforge.fml.relauncher.SideOnly;
import forestry.api.core.IModelManager;
import binnie.Constants;
import binnie.botany.api.EnumFlowerStage;
import binnie.botany.api.IFlowerType;
import binnie.core.Constants;
import binnie.botany.api.genetics.EnumFlowerStage;
import binnie.botany.api.genetics.IFlowerType;
public enum EnumFlowerType implements IFlowerType<EnumFlowerType> {
Dandelion,
Poppy,
Orchid,
Allium,
Bluet,
Tulip,
Daisy,
Cornflower,
Pansy,
Iris,
Lavender(2),
Viola,
Daffodil,
Dahlia,
Peony(2),
Rose(2),
Lilac(2),
Hydrangea(2),
Foxglove(2),
Zinnia,
Mums,
Marigold,
Geranium,
Azalea,
Primrose,
Aster,
Carnation,
Lily,
Yarrow,
DANDELION,
POPPY,
ORCHID,
ALLIUM,
BLUET,
TULIP,
DAISY,
CORNFLOWER,
PANSY,
IRIS,
LAVENDER(2),
VIOLA,
DAFFODIL,
DAHLIA,
PEONY(2),
ROSE(2),
LILAC(2),
HYDRANGEA(2),
FOXGLOVE(2),
ZINNIA,
MUMS,
MARIGOLD,
GERANIUM,
AZALEA,
PRIMROSE,
ASTER,
CARNATION,
LILY,
YARROW,
Petunia,
Agapanthus,
Fuchsia,
Dianthus,
Forget,
Anemone,
Aquilegia,
Edelweiss,
Scabious,
Coneflower,
Gaillardia,
Auricula,
Camellia(2),
Goldenrod(2),
Althea(2),
Penstemon(2),
Delphinium(2),
Hollyhock(2);
AGAPANTHUS,
FUCHSIA,
DIANTHUS,
FORGET,
ANEMONE,
AQUILEGIA,
EDELWEISS,
SCABIOUS,
CONEFLOWER,
GAILLARDIA,
AURICULA,
CAMELLIA(2),
GOLDENROD(2),
ALTHEA(2),
PENSTEMON(2),
DELPHINIUM(2),
HOLLYHOCK(2);
public static EnumFlowerType[] VALUES = values();
public static int highestSection = 2;
int sections;
ModelResourceLocation flower;
ModelResourceLocation seed;
ModelResourceLocation pollen;
private final int sections;
private ModelResourceLocation flower;
private ModelResourceLocation seed;
private ModelResourceLocation pollen;
EnumFlowerType() {
this(1);
}
EnumFlowerType(final int sections) {
EnumFlowerType(int sections) {
this.sections = sections;
}
@Override
@SideOnly(Side.CLIENT)
public void registerModels(Item item, IModelManager manager, EnumFlowerStage type) {
String pre = (this.sections == 1) ? "" : "double/";
String pre = (sections == 1) ? "" : "double/";
flower = new ModelResourceLocation(Constants.BOTANY_MOD_ID + ":flowers/" + pre + getName(), "inventory");
seed = new ModelResourceLocation(Constants.BOTANY_MOD_ID + ":flowers/seed", "inventory");
pollen = new ModelResourceLocation(Constants.BOTANY_MOD_ID + ":flowers/pollen", "inventory");
@@ -97,19 +97,13 @@ public enum EnumFlowerType implements IFlowerType<EnumFlowerType> {
return seed;
} else if (type == EnumFlowerStage.POLLEN) {
return pollen;
} else {
return flower;
}
}
@Override
public int getID() {
return this.ordinal();
return flower;
}
@Override
public int getSections() {
return this.sections;
return sections;
}
@Override
@@ -0,0 +1,269 @@
package binnie.botany.genetics;
import javax.annotation.Nullable;
import java.util.List;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.text.TextFormatting;
import net.minecraft.world.World;
import forestry.api.arboriculture.EnumTreeChromosome;
import forestry.api.genetics.IChromosome;
import forestry.core.genetics.Chromosome;
import forestry.core.genetics.Individual;
import forestry.core.utils.Translator;
import binnie.botany.api.genetics.EnumFlowerChromosome;
import binnie.botany.api.genetics.IAlleleFlowerSpecies;
import binnie.botany.api.genetics.IColorMix;
import binnie.botany.api.genetics.IFlower;
import binnie.botany.api.genetics.IFlowerColor;
import binnie.botany.api.genetics.IFlowerGenome;
import binnie.botany.api.genetics.IFlowerMutation;
import binnie.botany.core.BotanyCore;
import binnie.core.util.I18N;
public class Flower extends Individual implements IFlower {
private final IFlowerGenome genome;
@Nullable
private IFlowerGenome mate;
private int age;
private boolean wilting;
private boolean flowered;
public Flower(NBTTagCompound compound) {
super(compound);
if (compound.hasKey("Age")) {
age = compound.getInteger("Age");
} else {
age = 0;
}
wilting = compound.hasKey("Wilt") && compound.getBoolean("Wilt");
if (compound.hasKey("Flowered")) {
flowered = compound.getBoolean("Flowered");
} else {
flowered = age > 0;
}
if (compound.hasKey("Genome")) {
genome = new FlowerGenome(compound.getCompoundTag("Genome"));
} else {
genome = BotanyCore.getFlowerRoot().templateAsGenome(BotanyCore.getFlowerRoot().getDefaultTemplate());
}
if (compound.hasKey("Mate")) {
mate = new FlowerGenome(compound.getCompoundTag("Mate"));
}
}
public Flower(IFlowerGenome genome, int age) {
this.genome = genome;
this.age = age;
wilting = false;
flowered = age > 0;
}
@Override
public String getDisplayName() {
IAlleleFlowerSpecies species = getGenome().getPrimary();
String name = species.getAlleleName();
if (age == 0) {
name += "";
}
return name;
}
@Override
public void addTooltip(List<String> list) {
IAlleleFlowerSpecies primary = genome.getPrimary();
IAlleleFlowerSpecies secondary = genome.getSecondary();
if (!isPureBred(EnumFlowerChromosome.SPECIES)) {
list.add(TextFormatting.BLUE + Translator.translateToLocal("for.bees.hybrid").replaceAll("%PRIMARY", primary.getAlleleName()).replaceAll("%SECONDARY", secondary.getAlleleName()));
}
list.add(TextFormatting.GOLD + I18N.localise("item.botany.flower.age", getAge()));
list.add(TextFormatting.GREEN + "T: " + getGenome().getPrimary().getTemperature() + " / " + getGenome().getToleranceTemperature());
list.add(TextFormatting.AQUA + "M: " + getGenome().getPrimary().getMoisture() + " / " + getGenome().getToleranceMoisture());
list.add(TextFormatting.AQUA + "pH: " + getGenome().getPrimary().getHumidity() + " / " + getGenome().getTolerancePH());
list.add(TextFormatting.GOLD + "Fert: " + getGenome().getFertility() + "x");
}
@Override
public String getIdent() {
return getGenome().getPrimary().getUID();
}
@Override
public NBTTagCompound writeToNBT(NBTTagCompound compound) {
super.writeToNBT(compound);
compound.setInteger("Age", age);
compound.setBoolean("Wilt", wilting);
compound.setBoolean("Flowered", flowered);
NBTTagCompound compoundGenome = new NBTTagCompound();
genome.writeToNBT(compoundGenome);
compound.setTag("Genome", compoundGenome);
if (mate != null) {
NBTTagCompound compundMate = new NBTTagCompound();
mate.writeToNBT(compundMate);
compound.setTag("Mate", compundMate);
}
return compound;
}
@Override
public IFlowerGenome getGenome() {
return genome;
}
@Override
public void mate(IFlower other) {
mate = new FlowerGenome(other.getGenome().getChromosomes());
}
@Override
@Nullable
public IFlowerGenome getMate() {
return mate;
}
@Override
public IFlower copy() {
NBTTagCompound compound = new NBTTagCompound();
writeToNBT(compound);
return new Flower(compound);
}
@Override
public int getAge() {
return age;
}
@Override
public void setAge(int i) {
age = i;
}
@Override
public void age() {
if (age < 15) {
age++;
}
}
@Override
public int getMaxAge() {
return getGenome().getLifespan();
}
@Override
public boolean isWilted() {
return wilting;
}
@Override
public void setWilted(boolean wilted) {
wilting = wilted;
}
@Override
public boolean hasFlowered() {
return flowered;
}
@Override
public void setFlowered(boolean flowered) {
this.flowered = flowered;
}
@Override
public void removeMate() {
mate = null;
}
@Override
public IFlower getOffspring(World world, BlockPos pos) {
if (mate != null) {
IChromosome[] chromosomes = new IChromosome[genome.getChromosomes().length];
IChromosome[] parentFirst = mutateSpecies(world, pos, genome, mate);
IChromosome[] parentSecond = mutateSpecies(world, pos, mate, genome);
for (int i = 0; i < parentFirst.length; ++i) {
if (parentFirst[i] != null && parentSecond[i] != null) {
chromosomes[i] = Chromosome.inheritChromosome(world.rand, parentFirst[i], parentSecond[i]);
}
}
return new Flower(new FlowerGenome(chromosomes), 0);
}
NBTTagCompound nbt = new NBTTagCompound();
writeToNBT(nbt);
return new Flower(nbt);
}
private IChromosome[] mutateSpecies(World world, BlockPos pos, IFlowerGenome genomeFirst, IFlowerGenome genomeSecond) {
IChromosome[] parentFirst = genomeFirst.getChromosomes();
IChromosome[] parentSecond = genomeSecond.getChromosomes();
IAlleleFlowerSpecies alleleFirst;
IAlleleFlowerSpecies alleleSecond;
IFlowerGenome genome0;
IFlowerGenome genome2;
if (world.rand.nextBoolean()) {
alleleFirst = (IAlleleFlowerSpecies) parentFirst[EnumTreeChromosome.SPECIES.ordinal()].getPrimaryAllele();
alleleSecond = (IAlleleFlowerSpecies) parentSecond[EnumTreeChromosome.SPECIES.ordinal()].getSecondaryAllele();
genome0 = genomeFirst;
genome2 = genomeSecond;
} else {
alleleFirst = (IAlleleFlowerSpecies) parentSecond[EnumTreeChromosome.SPECIES.ordinal()].getPrimaryAllele();
alleleSecond = (IAlleleFlowerSpecies) parentFirst[EnumTreeChromosome.SPECIES.ordinal()].getSecondaryAllele();
genome0 = genomeSecond;
genome2 = genomeFirst;
}
IFlowerColor colorFirst = genome0.getPrimaryColor();
IFlowerColor colorSecond = genome2.getPrimaryColor();
if (colorFirst != colorSecond) {
for (IColorMix mutation : BotanyCore.getFlowerRoot().getColorMixes(true)) {
if (mutation.isMutation(colorFirst, colorSecond) && world.rand.nextFloat() * 100.0f < mutation.getChance()) {
parentFirst[EnumFlowerChromosome.PRIMARY.ordinal()] = new Chromosome(mutation.getResult().getAllele());
}
}
}
colorFirst = genome0.getSecondaryColor();
colorSecond = genome2.getSecondaryColor();
if (colorFirst != colorSecond) {
for (IColorMix mutation : BotanyCore.getFlowerRoot().getColorMixes(true)) {
if (mutation.isMutation(colorFirst, colorSecond) && world.rand.nextFloat() * 100.0f < mutation.getChance()) {
parentFirst[EnumFlowerChromosome.SECONDARY.ordinal()] = new Chromosome(mutation.getResult().getAllele());
}
}
}
colorFirst = genome0.getStemColor();
colorSecond = genome2.getStemColor();
if (colorFirst != colorSecond) {
for (IColorMix mutation : BotanyCore.getFlowerRoot().getColorMixes(true)) {
if (mutation.isMutation(colorFirst, colorSecond) && world.rand.nextFloat() * 100.0f < mutation.getChance()) {
parentFirst[EnumFlowerChromosome.STEM.ordinal()] = new Chromosome(mutation.getResult().getAllele());
}
}
}
IChromosome[] template = null;
for (IFlowerMutation mutation2 : BotanyCore.getFlowerRoot().getMutations(true)) {
float chance = mutation2.getChance(world, pos, alleleFirst, alleleSecond, genome0, genome2);
if (chance > 0.0f && world.rand.nextFloat() * 100.0f < chance && template == null) {
template = BotanyCore.getFlowerRoot().templateAsChromosomes(mutation2.getTemplate());
}
}
if (template != null) {
parentFirst = template;
}
return parentFirst;
}
}
@@ -18,12 +18,12 @@ import net.minecraftforge.fml.relauncher.SideOnly;
import forestry.api.genetics.IAlleleInteger;
import forestry.api.genetics.IAlyzerPlugin;
import binnie.botany.api.EnumFlowerChromosome;
import binnie.botany.api.EnumFlowerStage;
import binnie.botany.api.FlowerManager;
import binnie.botany.api.IFlower;
import binnie.core.craftgui.geometry.Area;
import binnie.core.craftgui.renderer.RenderUtil;
import binnie.botany.api.BotanyAPI;
import binnie.botany.api.genetics.EnumFlowerChromosome;
import binnie.botany.api.genetics.EnumFlowerStage;
import binnie.botany.api.genetics.IFlower;
import binnie.core.gui.geometry.Area;
import binnie.core.gui.renderer.RenderUtil;
import binnie.core.util.I18N;
// TODO write flower alyzer plugin
@@ -32,12 +32,6 @@ public class FlowerAlyzerPlugin implements IAlyzerPlugin {
public static final int COLUMN_0 = 12;
public static final int COLUMN_1 = 90;
public static final int COLUMN_2 = 155;
private int lastTopOffset;
private int rowSize = 12;
private int margin = 10;
private int guiLeft;
private int guiTop;
private HashMap<String, ItemStack> iconStacks = new HashMap<>();
private static final EnumFlowerChromosome[] firstPageChromosome = new EnumFlowerChromosome[]{
EnumFlowerChromosome.SPECIES,
EnumFlowerChromosome.SAPPINESS,
@@ -46,39 +40,45 @@ public class FlowerAlyzerPlugin implements IAlyzerPlugin {
EnumFlowerChromosome.EFFECT,
EnumFlowerChromosome.LIFESPAN
};
private static final EnumFlowerChromosome[] secondPageColorChromosome = new EnumFlowerChromosome[]{
EnumFlowerChromosome.PRIMARY,
EnumFlowerChromosome.SECONDARY,
EnumFlowerChromosome.STEM,
};
private static final EnumFlowerChromosome[] secondPageToleranceChromosome = new EnumFlowerChromosome[]{
EnumFlowerChromosome.TEMPERATURE_TOLERANCE,
EnumFlowerChromosome.HUMIDITY_TOLERANCE,
EnumFlowerChromosome.PH_TOLERANCE
};
private int lastTopOffset;
private final int rowSize = 12;
private final int margin = 10;
private int guiLeft;
private int guiTop;
private final HashMap<String, ItemStack> iconStacks = new HashMap<>();
public FlowerAlyzerPlugin() {
for(FlowerDefinition def : FlowerDefinition.values()){
for (FlowerDefinition def : FlowerDefinition.values()) {
iconStacks.put(def.getSpecies().getUID(), def.getMemberStack(EnumFlowerStage.FLOWER));
}
}
public void drawLine(GuiScreen gui, int xOffset, String msg, int color){
gui.mc.fontRendererObj.drawString(msg, guiLeft + xOffset, guiTop + lastTopOffset + margin, color);
@SideOnly(Side.CLIENT)
public void drawLine(GuiScreen gui, int xOffset, String msg, int color) {
gui.mc.fontRenderer.drawString(msg, guiLeft + xOffset, guiTop + lastTopOffset + margin, color);
}
public void drawChromosom(GuiScreen gui, EnumFlowerChromosome chromosome, IFlower flower){
@SideOnly(Side.CLIENT)
public void drawChromosome(GuiScreen gui, EnumFlowerChromosome chromosome, IFlower flower) {
drawLine(gui, COLUMN_0, StringUtils.capitalize(chromosome.getName()), 0xEEEEEE);
drawLine(gui, COLUMN_1, I18N.localise(flower.getGenome().getActiveAllele(chromosome).getUnlocalizedName()), 0xEEEEEE);
drawLine(gui, COLUMN_2, I18N.localise(flower.getGenome().getInactiveAllele(chromosome).getUnlocalizedName()), 0xEEEEEE);
lastTopOffset += rowSize;
}
public void newLine(){
public void newLine() {
lastTopOffset += rowSize;
}
@@ -88,7 +88,7 @@ public class FlowerAlyzerPlugin implements IAlyzerPlugin {
lastTopOffset = 10;
guiLeft = (gui.width - 246) / 2;
guiTop = (gui.height - 238) / 2;
IFlower flower = FlowerManager.flowerRoot.getMember(itemStack);
IFlower flower = BotanyAPI.flowerRoot.getMember(itemStack);
if (flower == null) {
return;
}
@@ -97,21 +97,21 @@ public class FlowerAlyzerPlugin implements IAlyzerPlugin {
ItemStack renderS = getIconStacks().get(flower.getGenome().getSecondary().getUID());
gui.mc.fontRendererObj.drawString("Active", guiLeft + 10 + COLUMN_1, guiTop + 10, 0xffffff);
gui.mc.fontRendererObj.drawString("Inactive", guiLeft + 10 + COLUMN_2, guiTop + 10, 0xffffff);
gui.mc.fontRenderer.drawString("Active", guiLeft + 10 + COLUMN_1, guiTop + 10, 0xffffff);
gui.mc.fontRenderer.drawString("Inactive", guiLeft + 10 + COLUMN_2, guiTop + 10, 0xffffff);
if (renderP != null && renderS!=null){
if (renderP != null && renderS != null) {
RenderItem itemRender = Minecraft.getMinecraft().getRenderItem();
itemRender.renderItemAndEffectIntoGUI(renderP, guiLeft + 10 + COLUMN_1, guiTop + 10 +12);
itemRender.renderItemOverlayIntoGUI(gui.mc.fontRendererObj, renderP, guiLeft + 10 + COLUMN_1, guiTop + 10 + 12, null);
itemRender.renderItemAndEffectIntoGUI(renderP, guiLeft + 10 + COLUMN_1, guiTop + 10 + 12);
itemRender.renderItemOverlayIntoGUI(gui.mc.fontRenderer, renderP, guiLeft + 10 + COLUMN_1, guiTop + 10 + 12, null);
itemRender.renderItemAndEffectIntoGUI(renderS, guiLeft + 10 + COLUMN_2, guiTop +10 +12);
itemRender.renderItemOverlayIntoGUI(gui.mc.fontRendererObj, renderS, guiLeft + 10 + COLUMN_1, guiTop +10 + 12, null);
itemRender.renderItemAndEffectIntoGUI(renderS, guiLeft + 10 + COLUMN_2, guiTop + 10 + 12);
itemRender.renderItemOverlayIntoGUI(gui.mc.fontRenderer, renderS, guiLeft + 10 + COLUMN_1, guiTop + 10 + 12, null);
}
guiTop += rowSize * 3;
for (EnumFlowerChromosome chromosom : firstPageChromosome) {
drawChromosom(gui, chromosom, flower);
drawChromosome(gui, chromosom, flower);
}
@@ -124,17 +124,17 @@ public class FlowerAlyzerPlugin implements IAlyzerPlugin {
guiLeft = (gui.width - 246) / 2;
guiTop = (gui.height - 238) / 2;
IFlower f = FlowerManager.flowerRoot.getMember(itemStack);
IFlower f = BotanyAPI.flowerRoot.getMember(itemStack);
for (EnumFlowerChromosome chromosome : secondPageColorChromosome) {
drawChromosom(gui, chromosome, f);
RenderUtil.drawSolidRect(new Area(guiLeft + COLUMN_1, guiTop + lastTopOffset + margin, 50, 10), ((IAlleleInteger)f.getGenome().getActiveAllele(chromosome)).getValue());
RenderUtil.drawSolidRect(new Area(guiLeft + COLUMN_2, guiTop + lastTopOffset + margin, 50, 10), ((IAlleleInteger)f.getGenome().getInactiveAllele(chromosome)).getValue());
drawChromosome(gui, chromosome, f);
RenderUtil.drawSolidRect(new Area(guiLeft + COLUMN_1, guiTop + lastTopOffset + margin, 50, 10), ((IAlleleInteger) f.getGenome().getActiveAllele(chromosome)).getValue());
RenderUtil.drawSolidRect(new Area(guiLeft + COLUMN_2, guiTop + lastTopOffset + margin, 50, 10), ((IAlleleInteger) f.getGenome().getInactiveAllele(chromosome)).getValue());
newLine();
}
for (EnumFlowerChromosome chromosome : secondPageToleranceChromosome) {
drawChromosom(gui, chromosome, f);
drawChromosome(gui, chromosome, f);
newLine();
}
@@ -0,0 +1,177 @@
package binnie.botany.genetics;
import java.util.HashMap;
import java.util.Map;
import java.util.TreeSet;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import forestry.api.genetics.IAllele;
import forestry.api.genetics.IAlleleSpecies;
import forestry.api.genetics.IBreedingTracker;
import forestry.api.genetics.IChromosomeType;
import forestry.api.genetics.IIndividual;
import forestry.api.genetics.IMutation;
import forestry.api.genetics.ISpeciesRoot;
import forestry.api.genetics.ISpeciesType;
import binnie.botany.api.BotanyAPI;
import binnie.botany.api.genetics.EnumFlowerChromosome;
import binnie.botany.api.genetics.EnumFlowerColor;
import binnie.botany.api.genetics.EnumFlowerStage;
import binnie.botany.api.genetics.IBotanistTracker;
import binnie.botany.core.BotanyCore;
import binnie.core.Binnie;
import binnie.core.api.genetics.IFieldKitPlugin;
import binnie.core.api.gui.IPoint;
import binnie.core.api.gui.ITexture;
import binnie.core.genetics.BreedingSystem;
import binnie.core.genetics.ForestryAllele;
import binnie.core.genetics.Tolerance;
import binnie.core.gui.geometry.Point;
import binnie.core.gui.resource.textures.StandardTexture;
import binnie.core.texture.BinnieCoreTexture;
import binnie.core.util.I18N;
public class FlowerBreedingSystem extends BreedingSystem {
public FlowerBreedingSystem() {
iconUndiscovered = Binnie.RESOURCE.getUndiscoveredBeeSprite();
iconDiscovered = Binnie.RESOURCE.getDiscoveredBeeSprite();
}
@Override
public float getChance(IMutation mutation, EntityPlayer player, IAlleleSpecies firstSpecies, IAlleleSpecies secondSpecies) {
return mutation.getBaseChance();
}
@Override
public ISpeciesRoot getSpeciesRoot() {
return BotanyAPI.flowerRoot;
}
@Override
public int getColour() {
return 14563127;
}
@Override
public Class<? extends IBreedingTracker> getTrackerClass() {
return IBotanistTracker.class;
}
@Override
public String getAlleleName(IChromosomeType chromosome, IAllele allele) {
if (chromosome == EnumFlowerChromosome.FERTILITY) {
if (allele.getUID().contains("Low")) {
return I18N.localise("binniecore.allele.fertility.low");
}
if (allele.getUID().contains("Normal")) {
return I18N.localise("binniecore.allele.fertility.normal");
}
if (allele.getUID().contains("High")) {
return I18N.localise("binniecore.allele.fertility.high");
}
if (allele.getUID().contains("Maximum")) {
return I18N.localise("binniecore.allele.fertility.maximum");
}
}
return super.getAlleleName(chromosome, allele);
}
@Override
public boolean isDNAManipulable(ItemStack member) {
ISpeciesType type = getSpeciesRoot().getType(member);
return type != null && isDNAManipulable(type);
}
@Override
public boolean isDNAManipulable(ISpeciesType type) {
return type == EnumFlowerStage.POLLEN;
}
@Override
public IIndividual getConversion(ItemStack stack) {
return BotanyCore.getFlowerRoot().getConversion(stack);
}
@Override
public ISpeciesType[] getActiveTypes() {
return new ISpeciesType[]{EnumFlowerStage.FLOWER, EnumFlowerStage.POLLEN, EnumFlowerStage.SEED};
}
@Override
public void addExtraAlleles(IChromosomeType chromosome, TreeSet<IAllele> alleles) {
switch ((EnumFlowerChromosome) chromosome) {
case FERTILITY:
for (ForestryAllele.Fertility fertility : ForestryAllele.Fertility.values()) {
alleles.add(fertility.getAllele());
}
break;
case LIFESPAN:
for (ForestryAllele.Lifespan lifespan : ForestryAllele.Lifespan.values()) {
alleles.add(lifespan.getAllele());
}
break;
case HUMIDITY_TOLERANCE:
case PH_TOLERANCE:
case TEMPERATURE_TOLERANCE:
for (Tolerance tolerance : Tolerance.values()) {
alleles.add(tolerance.getAllele());
}
break;
case PRIMARY:
case SECONDARY:
case STEM:
for (EnumFlowerColor color : EnumFlowerColor.values()) {
alleles.add(color.getFlowerColorAllele());
}
break;
case SAPPINESS:
for (ForestryAllele.Sappiness sappiness : ForestryAllele.Sappiness.values()) {
alleles.add(sappiness.getAllele());
}
break;
case TERRITORY:
for (ForestryAllele.Territory territory : ForestryAllele.Territory.values()) {
alleles.add(territory.getAllele());
}
break;
}
}
@Override
public IFieldKitPlugin getFieldKitPlugin() {
return new FieldKitPlugin();
}
private static class FieldKitPlugin implements IFieldKitPlugin {
@Override
public Map<IChromosomeType, IPoint> getChromosomePickerPositions() {
Map<IChromosomeType, IPoint> positions = new HashMap<>();
positions.put(EnumFlowerChromosome.SPECIES, new Point(35, 81));
positions.put(EnumFlowerChromosome.PRIMARY, new Point(36, 28));
positions.put(EnumFlowerChromosome.SECONDARY, new Point(27, 13));
positions.put(EnumFlowerChromosome.FERTILITY, new Point(47, 15));
positions.put(EnumFlowerChromosome.TERRITORY, new Point(54, 31));
positions.put(EnumFlowerChromosome.EFFECT, new Point(15, 55));
positions.put(EnumFlowerChromosome.LIFESPAN, new Point(23, 38));
positions.put(EnumFlowerChromosome.TEMPERATURE_TOLERANCE, new Point(17, 77));
positions.put(EnumFlowerChromosome.HUMIDITY_TOLERANCE, new Point(52, 51));
positions.put(EnumFlowerChromosome.PH_TOLERANCE, new Point(54, 80));
positions.put(EnumFlowerChromosome.SAPPINESS, new Point(41, 42));
positions.put(EnumFlowerChromosome.STEM, new Point(37, 63));
return positions;
}
@Override
public ITexture getTypeTexture() {
return new StandardTexture(0, 96, 96, 96, BinnieCoreTexture.GUI_BREEDING);
}
}
}
File diff suppressed because it is too large. Load diff
@@ -6,6 +6,7 @@ import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import binnie.botany.api.genetics.EnumFlowerColor;
import net.minecraft.init.Blocks;
import net.minecraft.item.ItemStack;
@@ -23,24 +24,24 @@ import forestry.api.genetics.IClassification;
import forestry.core.genetics.alleles.AlleleHelper;
import forestry.core.genetics.alleles.EnumAllele;
import binnie.Constants;
import binnie.botany.api.EnumAcidity;
import binnie.botany.api.EnumFlowerChromosome;
import binnie.botany.api.EnumFlowerStage;
import binnie.botany.api.EnumMoisture;
import binnie.botany.api.FlowerManager;
import binnie.botany.api.IAlleleFlowerSpecies;
import binnie.botany.api.IAlleleFlowerSpeciesBuilder;
import binnie.botany.api.IFlower;
import binnie.botany.api.IFlowerDefinition;
import binnie.botany.api.IFlowerGenome;
import binnie.botany.api.IFlowerMutationBuilder;
import binnie.botany.api.IFlowerRoot;
import binnie.botany.api.IFlowerType;
import binnie.core.Constants;
import binnie.botany.api.BotanyAPI;
import binnie.botany.api.gardening.EnumAcidity;
import binnie.botany.api.gardening.EnumMoisture;
import binnie.botany.api.genetics.EnumFlowerChromosome;
import binnie.botany.api.genetics.EnumFlowerStage;
import binnie.botany.api.genetics.IAlleleFlowerSpecies;
import binnie.botany.api.genetics.IAlleleFlowerSpeciesBuilder;
import binnie.botany.api.genetics.IFlower;
import binnie.botany.api.genetics.IFlowerDefinition;
import binnie.botany.api.genetics.IFlowerGenome;
import binnie.botany.api.genetics.IFlowerMutationBuilder;
import binnie.botany.api.genetics.IFlowerRoot;
import binnie.botany.api.genetics.IFlowerType;
import binnie.botany.core.BotanyCore;
public enum FlowerDefinition implements IFlowerDefinition {
Dandelion("Dandelion", "taraxacum", "officinale", EnumFlowerType.Dandelion, EnumFlowerColor.Yellow) {
Dandelion("Dandelion", "taraxacum", "officinale", EnumFlowerType.DANDELION, EnumFlowerColor.Yellow) {
@Override
protected void setSpeciesProperties(IAlleleFlowerSpeciesBuilder flowerSpecies) {
}
@@ -59,7 +60,7 @@ public enum FlowerDefinition implements IFlowerDefinition {
// vanilla
}
},
Poppy("Poppy", "papaver", "rhoeas", EnumFlowerType.Poppy, EnumFlowerColor.Red) {
Poppy("Poppy", "papaver", "rhoeas", EnumFlowerType.POPPY, EnumFlowerColor.Red) {
@Override
protected void setSpeciesProperties(IAlleleFlowerSpeciesBuilder flowerSpecies) {
flowerSpecies.setTemperature(EnumTemperature.WARM);
@@ -79,7 +80,7 @@ public enum FlowerDefinition implements IFlowerDefinition {
// vanilla
}
},
Orchid("Orchid", "vanda", "coerulea", EnumFlowerType.Orchid, EnumFlowerColor.DeepSkyBlue) {
Orchid("Orchid", "vanda", "coerulea", EnumFlowerType.ORCHID, EnumFlowerColor.DeepSkyBlue) {
@Override
protected void setSpeciesProperties(IAlleleFlowerSpeciesBuilder flowerSpecies) {
flowerSpecies.setPH(EnumAcidity.ACID);
@@ -97,7 +98,7 @@ public enum FlowerDefinition implements IFlowerDefinition {
// vanilla
}
},
Allium("Allium", "allium", "giganteum", EnumFlowerType.Allium, EnumFlowerColor.MediumPurple) {
Allium("Allium", "allium", "giganteum", EnumFlowerType.ALLIUM, EnumFlowerColor.MediumPurple) {
@Override
protected void setSpeciesProperties(IAlleleFlowerSpeciesBuilder flowerSpecies) {
flowerSpecies.setPH(EnumAcidity.ALKALINE);
@@ -115,7 +116,7 @@ public enum FlowerDefinition implements IFlowerDefinition {
// vanilla
}
},
Bluet("Bluet", "houstonia", "caerulea", EnumFlowerType.Bluet, EnumFlowerColor.Lavender, EnumFlowerColor.Khaki) {
Bluet("Bluet", "houstonia", "caerulea", EnumFlowerType.BLUET, EnumFlowerColor.Lavender, EnumFlowerColor.Khaki) {
@Override
protected void setSpeciesProperties(IAlleleFlowerSpeciesBuilder flowerSpecies) {
flowerSpecies.setMoisture(EnumMoisture.DAMP);
@@ -134,7 +135,7 @@ public enum FlowerDefinition implements IFlowerDefinition {
// vanilla
}
},
Tulip("Tulip", "tulipa", "agenensis", EnumFlowerType.Tulip, EnumFlowerColor.Violet) {
Tulip("Tulip", "tulipa", "agenensis", EnumFlowerType.TULIP, EnumFlowerColor.Violet) {
@Override
protected void setSpeciesProperties(IAlleleFlowerSpeciesBuilder flowerSpecies) {
}
@@ -152,7 +153,7 @@ public enum FlowerDefinition implements IFlowerDefinition {
// vanilla
}
},
Daisy("Daisy", "leucanthemum", "vulgare", EnumFlowerType.Daisy, EnumFlowerColor.White, EnumFlowerColor.Yellow) {
Daisy("Daisy", "leucanthemum", "vulgare", EnumFlowerType.DAISY, EnumFlowerColor.White, EnumFlowerColor.Yellow) {
@Override
protected void setSpeciesProperties(IAlleleFlowerSpeciesBuilder flowerSpecies) {
flowerSpecies.setTemperature(EnumTemperature.WARM);
@@ -172,7 +173,7 @@ public enum FlowerDefinition implements IFlowerDefinition {
// vanilla
}
},
Cornflower("Cornflower", "centaurea", "cyanus", EnumFlowerType.Cornflower, EnumFlowerColor.SkyBlue) {
Cornflower("Cornflower", "centaurea", "cyanus", EnumFlowerType.CORNFLOWER, EnumFlowerColor.SkyBlue) {
@Override
protected void setSpeciesProperties(IAlleleFlowerSpeciesBuilder flowerSpecies) {
}
@@ -191,7 +192,7 @@ public enum FlowerDefinition implements IFlowerDefinition {
registerMutation(Dandelion, Tulip, 10);
}
},
Pansy("Pansy", "viola", "tricolor", EnumFlowerType.Pansy, EnumFlowerColor.Pink, EnumFlowerColor.Purple) {
Pansy("Pansy", "viola", "tricolor", EnumFlowerType.PANSY, EnumFlowerColor.Pink, EnumFlowerColor.Purple) {
@Override
protected void setSpeciesProperties(IAlleleFlowerSpeciesBuilder flowerSpecies) {
flowerSpecies.setPH(EnumAcidity.ACID);
@@ -210,7 +211,7 @@ public enum FlowerDefinition implements IFlowerDefinition {
registerMutation(Tulip, Viola, 5);
}
},
Iris("Iris", "iris", "germanica", EnumFlowerType.Iris, EnumFlowerColor.LightGray, EnumFlowerColor.Purple) {
Iris("Iris", "iris", "germanica", EnumFlowerType.IRIS, EnumFlowerColor.LightGray, EnumFlowerColor.Purple) {
@Override
protected void setSpeciesProperties(IAlleleFlowerSpeciesBuilder flowerSpecies) {
flowerSpecies.setPH(EnumAcidity.ACID);
@@ -229,7 +230,7 @@ public enum FlowerDefinition implements IFlowerDefinition {
registerMutation(Orchid, Viola, 10);
}
},
Lavender("Lavender", "Lavandula", "angustifolia", EnumFlowerType.Lavender, EnumFlowerColor.MediumOrchid) {
Lavender("Lavender", "Lavandula", "angustifolia", EnumFlowerType.LAVENDER, EnumFlowerColor.MediumOrchid) {
@Override
protected void setSpeciesProperties(IAlleleFlowerSpeciesBuilder flowerSpecies) {
flowerSpecies.setTemperature(EnumTemperature.WARM);
@@ -249,7 +250,7 @@ public enum FlowerDefinition implements IFlowerDefinition {
registerMutation(Allium, Viola, 10);
}
},
Viola("Viola", "viola", "odorata", EnumFlowerType.Viola, EnumFlowerColor.MediumPurple, EnumFlowerColor.SlateBlue) {
Viola("Viola", "viola", "odorata", EnumFlowerType.VIOLA, EnumFlowerColor.MediumPurple, EnumFlowerColor.SlateBlue) {
@Override
protected void setSpeciesProperties(IAlleleFlowerSpeciesBuilder flowerSpecies) {
flowerSpecies.setPH(EnumAcidity.ACID);
@@ -267,7 +268,7 @@ public enum FlowerDefinition implements IFlowerDefinition {
registerMutation(Orchid, Poppy, 15);
}
},
Daffodil("Daffodil", "narcissus", "pseudonarcissus", EnumFlowerType.Daffodil, EnumFlowerColor.Yellow, EnumFlowerColor.Gold) {
Daffodil("Daffodil", "narcissus", "pseudonarcissus", EnumFlowerType.DAFFODIL, EnumFlowerColor.Yellow, EnumFlowerColor.Gold) {
@Override
protected void setSpeciesProperties(IAlleleFlowerSpeciesBuilder flowerSpecies) {
}
@@ -284,7 +285,7 @@ public enum FlowerDefinition implements IFlowerDefinition {
registerMutation(Dandelion, Poppy, 10);
}
},
Dahlia("Dahlia", "dahlia", "variabilis", EnumFlowerType.Dahlia, EnumFlowerColor.HotPink, EnumFlowerColor.DeepPink) {
Dahlia("Dahlia", "dahlia", "variabilis", EnumFlowerType.DAHLIA, EnumFlowerColor.HotPink, EnumFlowerColor.DeepPink) {
@Override
protected void setSpeciesProperties(IAlleleFlowerSpeciesBuilder flowerSpecies) {
}
@@ -302,7 +303,7 @@ public enum FlowerDefinition implements IFlowerDefinition {
registerMutation(Daisy, Allium, 15);
}
},
Peony("Peony", "paeonia", "suffruticosa", EnumFlowerType.Peony, EnumFlowerColor.Thistle) {
Peony("Peony", "paeonia", "suffruticosa", EnumFlowerType.PEONY, EnumFlowerColor.Thistle) {
@Override
protected void setSpeciesProperties(IAlleleFlowerSpeciesBuilder flowerSpecies) {
flowerSpecies.setPH(EnumAcidity.ALKALINE);
@@ -322,7 +323,7 @@ public enum FlowerDefinition implements IFlowerDefinition {
// vanilla
}
},
Rose("Rose", "rosa", "rubiginosa", EnumFlowerType.Rose, EnumFlowerColor.Red) {
Rose("ROSE", "rosa", "rubiginosa", EnumFlowerType.ROSE, EnumFlowerColor.Red) {
@Override
protected void setSpeciesProperties(IAlleleFlowerSpeciesBuilder flowerSpecies) {
flowerSpecies.setPH(EnumAcidity.ACID);
@@ -341,7 +342,7 @@ public enum FlowerDefinition implements IFlowerDefinition {
// vanilla
}
},
Lilac("Lilac", "syringa", "vulgaris", EnumFlowerType.Lilac, EnumFlowerColor.Plum) {
Lilac("Lilac", "syringa", "vulgaris", EnumFlowerType.LILAC, EnumFlowerColor.Plum) {
@Override
protected void setSpeciesProperties(IAlleleFlowerSpeciesBuilder flowerSpecies) {
flowerSpecies.setPH(EnumAcidity.ALKALINE);
@@ -359,7 +360,7 @@ public enum FlowerDefinition implements IFlowerDefinition {
protected void registerMutations() {
}
},
Hydrangea("Hydrangea", "hydrangea", "macrophylla", EnumFlowerType.Hydrangea, EnumFlowerColor.DeepSkyBlue) {
Hydrangea("Hydrangea", "hydrangea", "macrophylla", EnumFlowerType.HYDRANGEA, EnumFlowerColor.DeepSkyBlue) {
@Override
protected void setSpeciesProperties(IAlleleFlowerSpeciesBuilder flowerSpecies) {
flowerSpecies.setMoisture(EnumMoisture.DAMP);
@@ -379,7 +380,7 @@ public enum FlowerDefinition implements IFlowerDefinition {
registerMutation(Peony, Bluet, 10);
}
},
Foxglove("Foxglove", "digitalis", "purpurea", EnumFlowerType.Foxglove, EnumFlowerColor.HotPink) {
Foxglove("Foxglove", "digitalis", "purpurea", EnumFlowerType.FOXGLOVE, EnumFlowerColor.HotPink) {
@Override
protected void setSpeciesProperties(IAlleleFlowerSpeciesBuilder flowerSpecies) {
}
@@ -400,7 +401,7 @@ public enum FlowerDefinition implements IFlowerDefinition {
// vanilla
}
},
Zinnia("Zinnia", "zinnia", "elegans", EnumFlowerType.Zinnia, EnumFlowerColor.MediumVioletRed, EnumFlowerColor.Yellow) {
Zinnia("Zinnia", "zinnia", "elegans", EnumFlowerType.ZINNIA, EnumFlowerColor.MediumVioletRed, EnumFlowerColor.Yellow) {
@Override
protected void setSpeciesProperties(IAlleleFlowerSpeciesBuilder flowerSpecies) {
}
@@ -419,7 +420,7 @@ public enum FlowerDefinition implements IFlowerDefinition {
Zinnia.registerMutation(Dahlia, Marigold, 5);
}
},
Chrysanthemum("Chrysanthemum", "chrysanthemum", "\u00ef?? grandiflorum", EnumFlowerType.Mums, EnumFlowerColor.Violet) {
Chrysanthemum("Chrysanthemum", "chrysanthemum", "\u00ef?? grandiflorum", EnumFlowerType.MUMS, EnumFlowerColor.Violet) {
@Override
protected void setSpeciesProperties(IAlleleFlowerSpeciesBuilder flowerSpecies) {
}
@@ -439,7 +440,7 @@ public enum FlowerDefinition implements IFlowerDefinition {
registerMutation(Geranium, Rose, 10);
}
},
Marigold("Marigold", "calendula", "officinalis", EnumFlowerType.Marigold, EnumFlowerColor.Gold, EnumFlowerColor.DarkOrange) {
Marigold("Marigold", "calendula", "officinalis", EnumFlowerType.MARIGOLD, EnumFlowerColor.Gold, EnumFlowerColor.DarkOrange) {
@Override
protected void setSpeciesProperties(IAlleleFlowerSpeciesBuilder flowerSpecies) {
flowerSpecies.setTemperature(EnumTemperature.WARM);
@@ -459,7 +460,7 @@ public enum FlowerDefinition implements IFlowerDefinition {
registerMutation(Daisy, Dandelion, 10);
}
},
Geranium("Geranium", "geranium", "maderense", EnumFlowerType.Geranium, EnumFlowerColor.DeepPink) {
Geranium("Geranium", "geranium", "maderense", EnumFlowerType.GERANIUM, EnumFlowerColor.DeepPink) {
@Override
protected void setSpeciesProperties(IAlleleFlowerSpeciesBuilder flowerSpecies) {
flowerSpecies.setTemperature(EnumTemperature.WARM);
@@ -480,7 +481,7 @@ public enum FlowerDefinition implements IFlowerDefinition {
registerMutation(Tulip, Orchid, 15);
}
},
Azalea("Azalea", "rhododendrons", "aurigeranum", EnumFlowerType.Azalea, EnumFlowerColor.HotPink) {
Azalea("Azalea", "rhododendrons", "aurigeranum", EnumFlowerType.AZALEA, EnumFlowerColor.HotPink) {
@Override
protected void setSpeciesProperties(IAlleleFlowerSpeciesBuilder flowerSpecies) {
flowerSpecies.setPH(EnumAcidity.ACID);
@@ -495,7 +496,7 @@ public enum FlowerDefinition implements IFlowerDefinition {
registerMutation(Orchid, Geranium, 5);
}
},
Primrose("Primrose", "primula", "vulgaris", EnumFlowerType.Primrose, EnumFlowerColor.Red, EnumFlowerColor.Gold) {
Primrose("Primrose", "primula", "vulgaris", EnumFlowerType.PRIMROSE, EnumFlowerColor.Red, EnumFlowerColor.Gold) {
@Override
protected void setSpeciesProperties(IAlleleFlowerSpeciesBuilder flowerSpecies) {
flowerSpecies.setPH(EnumAcidity.ACID);
@@ -513,7 +514,7 @@ public enum FlowerDefinition implements IFlowerDefinition {
registerMutation(Chrysanthemum, Auricula, 5);
}
},
Aster("Aster", "aster", "amellus", EnumFlowerType.Aster, EnumFlowerColor.MediumPurple, EnumFlowerColor.Goldenrod) {
Aster("Aster", "aster", "amellus", EnumFlowerType.ASTER, EnumFlowerColor.MediumPurple, EnumFlowerColor.Goldenrod) {
@Override
protected void setSpeciesProperties(IAlleleFlowerSpeciesBuilder flowerSpecies) {
}
@@ -529,7 +530,7 @@ public enum FlowerDefinition implements IFlowerDefinition {
registerMutation(Daisy, Tulip, 10);
}
},
Carnation("Carnation", "dianthus", "caryophyllus", EnumFlowerType.Carnation, EnumFlowerColor.Crimson, EnumFlowerColor.White) {
Carnation("Carnation", "dianthus", "caryophyllus", EnumFlowerType.CARNATION, EnumFlowerColor.Crimson, EnumFlowerColor.White) {
@Override
protected void setSpeciesProperties(IAlleleFlowerSpeciesBuilder flowerSpecies) {
flowerSpecies.setPH(EnumAcidity.ALKALINE);
@@ -547,7 +548,7 @@ public enum FlowerDefinition implements IFlowerDefinition {
registerMutation(Dianthus, Rose, 5);
}
},
Lily("Lily", "lilium", "auratum", EnumFlowerType.Lily, EnumFlowerColor.Pink, EnumFlowerColor.Gold) {
Lily("Lily", "lilium", "auratum", EnumFlowerType.LILY, EnumFlowerColor.Pink, EnumFlowerColor.Gold) {
@Override
protected void setSpeciesProperties(IAlleleFlowerSpeciesBuilder flowerSpecies) {
flowerSpecies.setTemperature(EnumTemperature.WARM);
@@ -567,7 +568,7 @@ public enum FlowerDefinition implements IFlowerDefinition {
registerMutation(Tulip, Chrysanthemum, 5);
}
},
Yarrow("Yarrow", "achillea", "millefolium", EnumFlowerType.Yarrow, EnumFlowerColor.Yellow) {
Yarrow("Yarrow", "achillea", "millefolium", EnumFlowerType.YARROW, EnumFlowerColor.Yellow) {
@Override
protected void setSpeciesProperties(IAlleleFlowerSpeciesBuilder flowerSpecies) {
flowerSpecies.setPH(EnumAcidity.ACID);
@@ -606,7 +607,7 @@ public enum FlowerDefinition implements IFlowerDefinition {
registerMutation(Tulip, Dahlia, 5);
}
},
Agapanthus("Agapanthus", "agapanthus", "praecox", EnumFlowerType.Agapanthus, EnumFlowerColor.DeepSkyBlue) {
Agapanthus("Agapanthus", "agapanthus", "praecox", EnumFlowerType.AGAPANTHUS, EnumFlowerColor.DeepSkyBlue) {
@Override
protected void setSpeciesProperties(IAlleleFlowerSpeciesBuilder flowerSpecies) {
flowerSpecies.setTemperature(EnumTemperature.WARM);
@@ -626,7 +627,7 @@ public enum FlowerDefinition implements IFlowerDefinition {
registerMutation(Allium, Geranium, 5);
}
},
Fuchsia("Fuchsia", "fuchsia", "magellanica", EnumFlowerType.Fuchsia, EnumFlowerColor.DeepPink, EnumFlowerColor.MediumOrchid) {
Fuchsia("Fuchsia", "fuchsia", "magellanica", EnumFlowerType.FUCHSIA, EnumFlowerColor.DeepPink, EnumFlowerColor.MediumOrchid) {
@Override
protected void setSpeciesProperties(IAlleleFlowerSpeciesBuilder flowerSpecies) {
flowerSpecies.setTemperature(EnumTemperature.WARM);
@@ -646,7 +647,7 @@ public enum FlowerDefinition implements IFlowerDefinition {
registerMutation(Foxglove, Dahlia, 5);
}
},
Dianthus("Dianthus", "dianthus", "barbatus", EnumFlowerType.Dianthus, EnumFlowerColor.Crimson, EnumFlowerColor.HotPink) {
Dianthus("Dianthus", "dianthus", "barbatus", EnumFlowerType.DIANTHUS, EnumFlowerColor.Crimson, EnumFlowerColor.HotPink) {
@Override
protected void setSpeciesProperties(IAlleleFlowerSpeciesBuilder flowerSpecies) {
flowerSpecies.setPH(EnumAcidity.ALKALINE);
@@ -667,7 +668,7 @@ public enum FlowerDefinition implements IFlowerDefinition {
registerMutation(Tulip, Poppy, 15);
}
},
Forget("Forget-me-nots", "myosotis", "arvensis", EnumFlowerType.Forget, EnumFlowerColor.LightSteelBlue) {
Forget("Forget-me-nots", "myosotis", "arvensis", EnumFlowerType.FORGET, EnumFlowerColor.LightSteelBlue) {
@Override
protected void setSpeciesProperties(IAlleleFlowerSpeciesBuilder flowerSpecies) {
flowerSpecies.setPH(EnumAcidity.ACID);
@@ -686,7 +687,7 @@ public enum FlowerDefinition implements IFlowerDefinition {
registerMutation(Orchid, Bluet, 10);
}
},
Anemone("Anemone", "anemone", "coronaria", EnumFlowerType.Anemone, EnumFlowerColor.Red, EnumFlowerColor.MistyRose) {
Anemone("Anemone", "anemone", "coronaria", EnumFlowerType.ANEMONE, EnumFlowerColor.Red, EnumFlowerColor.MistyRose) {
@Override
protected void setSpeciesProperties(IAlleleFlowerSpeciesBuilder flowerSpecies) {
}
@@ -705,7 +706,7 @@ public enum FlowerDefinition implements IFlowerDefinition {
FlowerDefinition.Anemone.registerMutation(FlowerDefinition.Aquilegia, FlowerDefinition.Rose, 5);
}
},
Aquilegia("Aquilegia", "aquilegia", "vulgaris", EnumFlowerType.Aquilegia, EnumFlowerColor.SlateBlue, EnumFlowerColor.Thistle) {
Aquilegia("Aquilegia", "aquilegia", "vulgaris", EnumFlowerType.AQUILEGIA, EnumFlowerColor.SlateBlue, EnumFlowerColor.Thistle) {
@Override
protected void setSpeciesProperties(IAlleleFlowerSpeciesBuilder flowerSpecies) {
}
@@ -721,7 +722,7 @@ public enum FlowerDefinition implements IFlowerDefinition {
registerMutation(Iris, Poppy, 5);
}
},
Edelweiss("Edelweiss", "leontopodium", "alpinum", EnumFlowerType.Edelweiss, EnumFlowerColor.White, EnumFlowerColor.Khaki) {
Edelweiss("Edelweiss", "leontopodium", "alpinum", EnumFlowerType.EDELWEISS, EnumFlowerColor.White, EnumFlowerColor.Khaki) {
@Override
protected void setSpeciesProperties(IAlleleFlowerSpeciesBuilder flowerSpecies) {
flowerSpecies.setPH(EnumAcidity.ALKALINE);
@@ -742,7 +743,7 @@ public enum FlowerDefinition implements IFlowerDefinition {
FlowerDefinition.Edelweiss.registerMutation(FlowerDefinition.Peony, FlowerDefinition.Bluet, 5);
}
},
Scabious("Scabious", "scabiosa", "columbaria", EnumFlowerType.Scabious, EnumFlowerColor.RoyalBlue) {
Scabious("Scabious", "scabiosa", "columbaria", EnumFlowerType.SCABIOUS, EnumFlowerColor.RoyalBlue) {
@Override
protected void setSpeciesProperties(IAlleleFlowerSpeciesBuilder flowerSpecies) {
}
@@ -761,7 +762,7 @@ public enum FlowerDefinition implements IFlowerDefinition {
registerMutation(Allium, Cornflower, 5);
}
},
Coneflower("Coneflower", "echinacea", "purpurea", EnumFlowerType.Coneflower, EnumFlowerColor.Violet, EnumFlowerColor.DarkOrange) {
Coneflower("Coneflower", "echinacea", "purpurea", EnumFlowerType.CONEFLOWER, EnumFlowerColor.Violet, EnumFlowerColor.DarkOrange) {
@Override
protected void setSpeciesProperties(IAlleleFlowerSpeciesBuilder flowerSpecies) {
}
@@ -778,7 +779,7 @@ public enum FlowerDefinition implements IFlowerDefinition {
registerMutation(Tulip, Cornflower, 5);
}
},
Gaillardia("Gaillardia", "gaillardia", "aristata", EnumFlowerType.Gaillardia, EnumFlowerColor.DarkOrange, EnumFlowerColor.Yellow) {
Gaillardia("Gaillardia", "gaillardia", "aristata", EnumFlowerType.GAILLARDIA, EnumFlowerColor.DarkOrange, EnumFlowerColor.Yellow) {
@Override
protected void setSpeciesProperties(IAlleleFlowerSpeciesBuilder flowerSpecies) {
flowerSpecies.setMoisture(EnumMoisture.DAMP);
@@ -800,7 +801,7 @@ public enum FlowerDefinition implements IFlowerDefinition {
registerMutation(Dandelion, Marigold, 5);
}
},
Auricula("Auricula", "primula", "auricula", EnumFlowerType.Auricula, EnumFlowerColor.Red, EnumFlowerColor.Yellow) {
Auricula("Auricula", "primula", "auricula", EnumFlowerType.AURICULA, EnumFlowerColor.Red, EnumFlowerColor.Yellow) {
@Override
protected void setSpeciesProperties(IAlleleFlowerSpeciesBuilder flowerSpecies) {
flowerSpecies.setPH(EnumAcidity.ACID);
@@ -820,7 +821,7 @@ public enum FlowerDefinition implements IFlowerDefinition {
registerMutation(Poppy, Geranium, 10);
}
},
Camellia("Camellia", "camellia", "japonica", EnumFlowerType.Camellia, EnumFlowerColor.Crimson) {
Camellia("Camellia", "camellia", "japonica", EnumFlowerType.CAMELLIA, EnumFlowerColor.Crimson) {
@Override
protected void setSpeciesProperties(IAlleleFlowerSpeciesBuilder flowerSpecies) {
flowerSpecies.setPH(EnumAcidity.ACID);
@@ -840,7 +841,7 @@ public enum FlowerDefinition implements IFlowerDefinition {
registerMutation(Hydrangea, Rose, 5);
}
},
Goldenrod("Goldenrod", "solidago", "canadensis", EnumFlowerType.Goldenrod, EnumFlowerColor.Gold) {
Goldenrod("Goldenrod", "solidago", "canadensis", EnumFlowerType.GOLDENROD, EnumFlowerColor.Gold) {
@Override
protected void setSpeciesProperties(IAlleleFlowerSpeciesBuilder flowerSpecies) {
}
@@ -858,7 +859,7 @@ public enum FlowerDefinition implements IFlowerDefinition {
registerMutation(Lilac, Marigold, 10);
}
},
Althea("Althea", "althaea", "officinalis", EnumFlowerType.Althea, EnumFlowerColor.Thistle, EnumFlowerColor.MediumOrchid) {
Althea("Althea", "althaea", "officinalis", EnumFlowerType.ALTHEA, EnumFlowerColor.Thistle, EnumFlowerColor.MediumOrchid) {
@Override
protected void setSpeciesProperties(IAlleleFlowerSpeciesBuilder flowerSpecies) {
flowerSpecies.setTemperature(EnumTemperature.WARM);
@@ -879,7 +880,7 @@ public enum FlowerDefinition implements IFlowerDefinition {
registerMutation(Hydrangea, Iris, 5);
}
},
Penstemon("Penstemon", "penstemon", "digitalis", EnumFlowerType.Penstemon, EnumFlowerColor.MediumOrchid, EnumFlowerColor.Thistle) {
Penstemon("Penstemon", "penstemon", "digitalis", EnumFlowerType.PENSTEMON, EnumFlowerColor.MediumOrchid, EnumFlowerColor.Thistle) {
@Override
protected void setSpeciesProperties(IAlleleFlowerSpeciesBuilder flowerSpecies) {
flowerSpecies.setMoisture(EnumMoisture.DRY);
@@ -901,7 +902,7 @@ public enum FlowerDefinition implements IFlowerDefinition {
registerMutation(Peony, Lilac, 5);
}
},
Delphinium("Delphinium", "delphinium", "staphisagria", EnumFlowerType.Delphinium, EnumFlowerColor.DarkSlateBlue) {
Delphinium("Delphinium", "delphinium", "staphisagria", EnumFlowerType.DELPHINIUM, EnumFlowerColor.DarkSlateBlue) {
@Override
protected void setSpeciesProperties(IAlleleFlowerSpeciesBuilder flowerSpecies) {
flowerSpecies.setMoisture(EnumMoisture.DAMP);
@@ -922,7 +923,7 @@ public enum FlowerDefinition implements IFlowerDefinition {
registerMutation(Lilac, Bluet, 5);
}
},
Hollyhock("Hollyhock", "Alcea", "rosea", EnumFlowerType.Hollyhock, EnumFlowerColor.Black, EnumFlowerColor.Gold) {
Hollyhock("Hollyhock", "Alcea", "rosea", EnumFlowerType.HOLLYHOCK, EnumFlowerColor.Black, EnumFlowerColor.Gold) {
@Override
protected void setSpeciesProperties(IAlleleFlowerSpeciesBuilder flowerSpecies) {
}
@@ -943,45 +944,43 @@ public enum FlowerDefinition implements IFlowerDefinition {
public static FlowerDefinition[] VALUES = values();
private final IAlleleFlowerSpecies species;
IFlowerType<EnumFlowerType> type;
String name;
String binomial;
String branchName;
List<IAllele[]> variantTemplates;
private final IFlowerType<EnumFlowerType> type;
private final String name;
private final String binomial;
private final String branchName;
private final List<IAllele[]> variantTemplates;
@Nullable
IClassification branch;
EnumFlowerColor primaryColor, secondaryColor;
private IClassification branch;
private final EnumFlowerColor primaryColor;
private final EnumFlowerColor secondaryColor;
private IAllele[] template;
private IFlowerGenome genome;
FlowerDefinition(final String name, final String branch, final String binomial, final IFlowerType<EnumFlowerType> type, final EnumFlowerColor colour) {
FlowerDefinition(String name, String branch, String binomial, IFlowerType<EnumFlowerType> type, EnumFlowerColor colour) {
this(name, branch, binomial, type, false, colour, colour);
}
FlowerDefinition(final String name, final String branch, final String binomial, final IFlowerType<EnumFlowerType> type, final EnumFlowerColor primaryColor, final EnumFlowerColor secondaryColor) {
FlowerDefinition(String name, String branch, String binomial, IFlowerType<EnumFlowerType> type, EnumFlowerColor primaryColor, EnumFlowerColor secondaryColor) {
this(name, branch, binomial, type, true, primaryColor, secondaryColor);
}
FlowerDefinition(final String name, final String branch, final String binomial, final IFlowerType<EnumFlowerType> type, final boolean isDominant, final EnumFlowerColor colour) {
this(name, branch, binomial, type, isDominant, colour, colour);
}
FlowerDefinition(final String name, final String branch, final String binomial, final IFlowerType<EnumFlowerType> flowerType, final boolean isDominant, final EnumFlowerColor primaryColor, final EnumFlowerColor secondaryColor) {
String uid = Constants.BOTANY_MOD_ID + ".flower" + this;
FlowerDefinition(String name, String branch, String binomial, IFlowerType<EnumFlowerType> flowerType, boolean isDominant, EnumFlowerColor primaryColor, EnumFlowerColor secondaryColor) {
String modId = Constants.BOTANY_MOD_ID;
String uid = modId + ".flower" + this;
String unlocalizedDescription = "botany.description.flower" + this;
String unlocalizedName = "botany.flowers.species." + name;
this.variantTemplates = new ArrayList<>();
variantTemplates = new ArrayList<>();
this.name = name;
this.binomial = binomial;
this.branchName = branch;
this.type = flowerType;
branchName = branch;
type = flowerType;
this.primaryColor = primaryColor;
this.secondaryColor = secondaryColor;
IAlleleFlowerSpeciesBuilder speciesBuilder = FlowerManager.flowerFactory.createSpecies(uid, unlocalizedName, "Binnie's Mod Team", unlocalizedDescription, isDominant, getBranch(), binomial, flowerType);
IAlleleFlowerSpeciesBuilder speciesBuilder = BotanyAPI.flowerFactory.createSpecies(modId, uid, unlocalizedName, "Binnie's Mod Team", unlocalizedDescription, isDominant, getBranch(), binomial, flowerType);
setSpeciesProperties(speciesBuilder);
this.species = speciesBuilder.build();
species = speciesBuilder.build();
if (this.branch != null) {
this.branch.addMemberSpecies(species);
}
@@ -1005,7 +1004,7 @@ public enum FlowerDefinition implements IFlowerDefinition {
}
public static void preInitFlowers() {
MinecraftForge.EVENT_BUS.post(new AlleleSpeciesRegisterEvent(FlowerManager.flowerRoot, IAlleleFlowerSpecies.class));
MinecraftForge.EVENT_BUS.post(new AlleleSpeciesRegisterEvent(BotanyAPI.flowerRoot, IAlleleFlowerSpecies.class));
for (FlowerDefinition def : values()) {
@SuppressWarnings("unchecked")
IFlowerType<EnumFlowerType> type = def.species.getType();
@@ -1039,36 +1038,36 @@ public enum FlowerDefinition implements IFlowerDefinition {
protected abstract void registerMutations();
private IAllele[] addVariant(final EnumFlowerColor a, final EnumFlowerColor b) {
final IAllele[] template = this.getTemplate();
private IAllele[] addVariant(EnumFlowerColor a, EnumFlowerColor b) {
IAllele[] template = getTemplate();
template[EnumFlowerChromosome.PRIMARY.ordinal()] = a.getFlowerColorAllele();
template[EnumFlowerChromosome.SECONDARY.ordinal()] = b.getFlowerColorAllele();
this.variantTemplates.add(template);
variantTemplates.add(template);
return template;
}
private IAllele[] addVariant(final EnumFlowerColor a) {
return this.addVariant(a, a);
private IAllele[] addVariant(EnumFlowerColor a) {
return addVariant(a, a);
}
public List<IAllele[]> getVariants() {
return this.variantTemplates;
return variantTemplates;
}
public IClassification getBranch() {
if (branch == null) {
final String scientific = branchName.substring(0, 1).toUpperCase() + branchName.substring(1).toLowerCase();
final String uid = "flowers." + branchName.toLowerCase();
String scientific = branchName.substring(0, 1).toUpperCase() + branchName.substring(1).toLowerCase();
String uid = "flowers." + branchName.toLowerCase();
IClassification branch = AlleleManager.alleleRegistry.getClassification("genus." + uid);
if (branch == null) {
branch = AlleleManager.alleleRegistry.createAndRegisterClassification(IClassification.EnumClassLevel.GENUS, uid, scientific);
}
this.branch = branch;
}
return this.branch;
return branch;
}
public void setBranch(final IClassification branch) {
public void setBranch(IClassification branch) {
this.branch = branch;
}
@@ -1106,7 +1105,7 @@ public enum FlowerDefinition implements IFlowerDefinition {
markAllelesAsValid(EnumBeeChromosome.HUMIDITY_TOLERANCE, EnumFlowerChromosome.PH_TOLERANCE);
markAllelesAsValid(EnumTreeChromosome.SAPPINESS, EnumFlowerChromosome.SAPPINESS);
template = Arrays.copyOf(FlowerTemplates.getDefaultTemplate(), EnumFlowerChromosome.values().length);
template = Arrays.copyOf(BotanyAPI.flowerRoot.getDefaultTemplate(), EnumFlowerChromosome.values().length);
AlleleHelper.getInstance().set(template, EnumFlowerChromosome.SPECIES, species);
AlleleHelper.getInstance().set(template, EnumFlowerChromosome.TEMPERATURE_TOLERANCE, EnumAllele.Tolerance.BOTH_1);
AlleleHelper.getInstance().set(template, EnumFlowerChromosome.PRIMARY, primaryColor.getFlowerColorAllele());
@@ -1121,7 +1120,7 @@ public enum FlowerDefinition implements IFlowerDefinition {
}
}
protected final IFlowerMutationBuilder registerMutation(final FlowerDefinition parent1, final FlowerDefinition parent2, final int chance) {
return FlowerManager.flowerFactory.createMutation(parent1.species, parent2.species, getTemplate(), chance);
protected final IFlowerMutationBuilder registerMutation(FlowerDefinition parent1, FlowerDefinition parent2, int chance) {
return BotanyAPI.flowerFactory.createMutation(parent1.species, parent2.species, getTemplate(), chance);
}
}
@@ -0,0 +1,36 @@
package binnie.botany.genetics;
import java.awt.Color;
import binnie.botany.api.genetics.IAlleleFlowerColor;
import forestry.api.genetics.IAllele;
import forestry.api.genetics.IClassification;
import binnie.botany.api.BotanyAPI;
import binnie.botany.api.genetics.IAlleleFlowerSpecies;
import binnie.botany.api.genetics.IAlleleFlowerSpeciesBuilder;
import binnie.botany.api.genetics.IFlowerFactory;
import binnie.botany.api.genetics.IFlowerMutationBuilder;
import binnie.botany.api.genetics.IFlowerType;
import binnie.botany.genetics.allele.AlleleFlowerSpecies;
import binnie.botany.models.FlowerSpriteManager;
public class FlowerFactory implements IFlowerFactory {
@Override
public IAlleleFlowerSpeciesBuilder createSpecies(String modId, String uid, String unlocalizedName, String authority, String unlocalizedDescription, boolean isDominant, IClassification branch, String binomial, IFlowerType flowerType) {
FlowerSpriteManager.initSprites(flowerType);
return new AlleleFlowerSpecies(modId, uid, unlocalizedName, authority, unlocalizedDescription, isDominant, branch, binomial, flowerType);
}
@Override
public IFlowerMutationBuilder createMutation(IAlleleFlowerSpecies allele0, IAlleleFlowerSpecies allele1, IAllele[] result, int chance) {
FlowerMutation mutation = new FlowerMutation(allele0, allele1, result, chance);
BotanyAPI.flowerRoot.registerMutation(mutation);
return mutation;
}
@Override
public IAlleleFlowerColor createFlowerColorAllele(String uid, int id, Color color, Color colorWilted, String name, String unlocalizedName, boolean isDominant) {
return new AlleleFlowerColor(uid, id, color, colorWilted, name, unlocalizedName, isDominant);
}
}
@@ -0,0 +1,143 @@
package binnie.botany.genetics;
import javax.annotation.Nullable;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import forestry.api.core.EnumTemperature;
import forestry.api.genetics.EnumTolerance;
import forestry.api.genetics.IAlleleFloat;
import forestry.api.genetics.IAlleleInteger;
import forestry.api.genetics.IAlleleSpecies;
import forestry.api.genetics.IAlleleTolerance;
import forestry.api.genetics.IChromosome;
import forestry.api.genetics.ISpeciesRoot;
import forestry.core.genetics.Genome;
import binnie.core.Binnie;
import binnie.botany.api.BotanyAPI;
import binnie.botany.api.gardening.EnumAcidity;
import binnie.botany.api.gardening.EnumMoisture;
import binnie.botany.api.genetics.EnumFlowerChromosome;
import binnie.botany.api.genetics.IAlleleFlowerSpecies;
import binnie.botany.api.genetics.IFlowerGenome;
import binnie.botany.api.genetics.IFlowerType;
import binnie.botany.core.BotanyCore;
public class FlowerGenome extends Genome implements IFlowerGenome {
public FlowerGenome(NBTTagCompound nbttagcompound) {
super(nbttagcompound);
}
public FlowerGenome(IChromosome[] chromosomes) {
super(chromosomes);
}
@Nullable
public static IAlleleFlowerSpecies getSpecies(ItemStack itemStack) {
if (!BotanyAPI.flowerRoot.isMember(itemStack)) {
return null;
}
IAlleleSpecies species = getSpeciesDirectly(BotanyAPI.flowerRoot, itemStack);
if (species instanceof IAlleleFlowerSpecies) {
return (IAlleleFlowerSpecies) species;
}
return (IAlleleFlowerSpecies) getActiveAllele(itemStack, EnumFlowerChromosome.SPECIES, BotanyAPI.flowerRoot);
}
@Override
public IAlleleFlowerSpecies getPrimary() {
return (IAlleleFlowerSpecies) getChromosomes()[EnumFlowerChromosome.SPECIES.ordinal()].getPrimaryAllele();
}
@Override
public IAlleleFlowerSpecies getSecondary() {
return (IAlleleFlowerSpecies) getChromosomes()[EnumFlowerChromosome.SPECIES.ordinal()].getSecondaryAllele();
}
@Override
public ISpeciesRoot getSpeciesRoot() {
return BotanyCore.getFlowerRoot();
}
@Override
public AlleleFlowerColor getPrimaryColor() {
return ((AlleleFlowerColor) getActiveAllele(EnumFlowerChromosome.PRIMARY));
}
@Override
public AlleleFlowerColor getSecondaryColor() {
return ((AlleleFlowerColor) getActiveAllele(EnumFlowerChromosome.SECONDARY));
}
@Override
public AlleleFlowerColor getStemColor() {
return ((AlleleFlowerColor) getActiveAllele(EnumFlowerChromosome.STEM));
}
@Override
public int getFertility() {
return ((IAlleleInteger) getActiveAllele(EnumFlowerChromosome.FERTILITY)).getValue();
}
@Override
public int getLifespan() {
return ((IAlleleInteger) getActiveAllele(EnumFlowerChromosome.LIFESPAN)).getValue() / 5;
}
@Override
public IFlowerType getType() {
return getPrimary().getType();
}
@Override
public EnumTolerance getToleranceTemperature() {
return ((IAlleleTolerance) getActiveAllele(EnumFlowerChromosome.TEMPERATURE_TOLERANCE)).getValue();
}
@Override
public EnumTolerance getToleranceMoisture() {
return ((IAlleleTolerance) getActiveAllele(EnumFlowerChromosome.HUMIDITY_TOLERANCE)).getValue();
}
@Override
public EnumTolerance getTolerancePH() {
return ((IAlleleTolerance) getActiveAllele(EnumFlowerChromosome.PH_TOLERANCE)).getValue();
}
@Override
public float getAgeChance() {
return 1.0f * (float) Math.sqrt(2.0f / getLifespan());
}
@Override
public float getSappiness() {
return ((IAlleleFloat) getActiveAllele(EnumFlowerChromosome.SAPPINESS)).getValue();
}
@Override
public boolean canTolerate(EnumAcidity acidity) {
int pH = acidity.ordinal();
int[] pHTol = Binnie.GENETICS.getTolerance(getTolerancePH());
int fPH = getPrimary().getPH().ordinal();
return pH >= fPH + pHTol[0] && pH <= fPH + pHTol[1];
}
@Override
public boolean canTolerate(EnumMoisture moist) {
int moisture = moist.ordinal();
int[] moistTol = Binnie.GENETICS.getTolerance(getToleranceMoisture());
int fMoisture = getPrimary().getMoisture().ordinal();
return moisture >= fMoisture + moistTol[0] && moisture <= fMoisture + moistTol[1];
}
@Override
public boolean canTolerate(EnumTemperature temperature) {
int temp = temperature.ordinal();
int[] tempTol = Binnie.GENETICS.getTolerance(getToleranceTemperature());
int fTemp = getPrimary().getTemperature().ordinal();
return temp >= fTemp + tempTol[0] && temp <= fTemp + tempTol[1];
}
}
@@ -8,15 +8,15 @@ import forestry.api.genetics.IAllele;
import forestry.api.genetics.IMutation;
import forestry.core.genetics.mutations.Mutation;
import binnie.botany.api.IAlleleFlowerSpecies;
import binnie.botany.api.IFlowerGenome;
import binnie.botany.api.IFlowerMutation;
import binnie.botany.api.IFlowerMutationBuilder;
import binnie.botany.api.IFlowerRoot;
import binnie.botany.api.genetics.IAlleleFlowerSpecies;
import binnie.botany.api.genetics.IFlowerGenome;
import binnie.botany.api.genetics.IFlowerMutation;
import binnie.botany.api.genetics.IFlowerMutationBuilder;
import binnie.botany.api.genetics.IFlowerRoot;
import binnie.botany.core.BotanyCore;
public class FlowerMutation extends Mutation implements IFlowerMutation, IFlowerMutationBuilder {
public FlowerMutation(final IAlleleFlowerSpecies allele0, final IAlleleFlowerSpecies allele1, final IAllele[] template, final int chance) {
public FlowerMutation(IAlleleFlowerSpecies allele0, IAlleleFlowerSpecies allele1, IAllele[] template, int chance) {
super(allele0, allele1, template, chance);
}
@@ -31,8 +31,8 @@ public class FlowerMutation extends Mutation implements IFlowerMutation, IFlower
}
@Override
public float getChance(World world, BlockPos pos, IAlleleFlowerSpecies a0, IAlleleFlowerSpecies a1, IFlowerGenome g0, IFlowerGenome g1) {
float processedChance = super.getChance(world, pos, a0, a1, g0, g1, ForestryAPI.climateManager.getDefaultClimate(world, pos));
public float getChance(World world, BlockPos pos, IAlleleFlowerSpecies allele0, IAlleleFlowerSpecies allele1, IFlowerGenome genome0, IFlowerGenome genome1) {
float processedChance = getChance(world, pos, allele0, allele1, genome0, genome1, ForestryAPI.climateManager.getDefaultClimate(world, pos));
if (processedChance <= 0) {
return 0;
}
@@ -0,0 +1,348 @@
package binnie.botany.genetics;
import javax.annotation.Nullable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
import binnie.botany.api.genetics.EnumFlowerColor;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import com.mojang.authlib.GameProfile;
import forestry.api.genetics.AlleleManager;
import forestry.api.genetics.IAllele;
import forestry.api.genetics.IAlyzerPlugin;
import forestry.api.genetics.IChromosomeType;
import forestry.api.genetics.IIndividual;
import forestry.api.genetics.IMutation;
import forestry.api.genetics.ISpeciesType;
import forestry.core.genetics.SpeciesRoot;
import forestry.core.genetics.alleles.AlleleHelper;
import forestry.core.genetics.alleles.EnumAllele;
import binnie.botany.api.genetics.EnumFlowerChromosome;
import binnie.botany.api.genetics.EnumFlowerStage;
import binnie.botany.api.genetics.IAlleleFlowerSpecies;
import binnie.botany.api.genetics.IBotanistTracker;
import binnie.botany.api.genetics.IColorMix;
import binnie.botany.api.genetics.IFlower;
import binnie.botany.api.genetics.IFlowerGenome;
import binnie.botany.api.genetics.IFlowerMutation;
import binnie.botany.api.genetics.IFlowerRoot;
import binnie.botany.modules.ModuleFlowers;
import binnie.botany.tile.TileEntityFlower;
public class FlowerRoot extends SpeciesRoot implements IFlowerRoot {
private static final String UID = "rootFlowers";
private static int flowerSpeciesCount = -1;
private static final ArrayList<IFlower> flowerTemplates = new ArrayList<>();
private static final ArrayList<IFlowerMutation> flowerMutations = new ArrayList<>();
private static final ArrayList<IColorMix> colourMixes = new ArrayList<>();
private final Map<ItemStack, IFlower> conversions;
public FlowerRoot() {
conversions = new HashMap<>();
}
@Override
public String getUID() {
return UID;
}
@Override
public int getSpeciesCount() {
if (FlowerRoot.flowerSpeciesCount < 0) {
FlowerRoot.flowerSpeciesCount = 0;
for (Map.Entry<String, IAllele> entry : AlleleManager.alleleRegistry.getRegisteredAlleles().entrySet()) {
if (entry.getValue() instanceof IAlleleFlowerSpecies && ((IAlleleFlowerSpecies) entry.getValue()).isCounted()) {
++FlowerRoot.flowerSpeciesCount;
}
}
}
return FlowerRoot.flowerSpeciesCount;
}
@Override
public boolean isMember(ItemStack stack) {
return !stack.isEmpty() && getType(stack) != null;
}
@Override
public boolean isMember(ItemStack stack, ISpeciesType type) {
return getType(stack) == type;
}
@Override
public boolean isMember(IIndividual individual) {
return individual instanceof IFlower;
}
@Override
public IAlyzerPlugin getAlyzerPlugin() {
return FlowerAlyzerPlugin.INSTANCE;
}
@Override
public ISpeciesType getIconType() {
return EnumFlowerStage.FLOWER;
}
@Override
@Nullable
public EnumFlowerStage getType(ItemStack stack) {
Item item = stack.getItem();
if (ModuleFlowers.flowerItem == item) {
return EnumFlowerStage.SEED;
} else if (ModuleFlowers.pollen == item) {
return EnumFlowerStage.POLLEN;
} else if (ModuleFlowers.seed == item) {
return EnumFlowerStage.SEED;
}
return null;
}
@Override
public ItemStack getMemberStack(IIndividual flower, ISpeciesType type) {
if (!isMember(flower)) {
return ItemStack.EMPTY;
}
Item flowerItem = ModuleFlowers.flowerItem;
if (type == EnumFlowerStage.SEED) {
flowerItem = ModuleFlowers.seed;
} else if (type == EnumFlowerStage.POLLEN) {
flowerItem = ModuleFlowers.pollen;
}
if (flowerItem != ModuleFlowers.flowerItem) {
((IFlower) flower).setAge(0);
}
NBTTagCompound nbttagcompound = new NBTTagCompound();
flower.writeToNBT(nbttagcompound);
ItemStack flowerStack = new ItemStack(flowerItem);
flowerStack.setTagCompound(nbttagcompound);
return flowerStack;
}
@Override
@Nullable
public IFlower getMember(ItemStack stack) {
if (!isMember(stack) || stack.getTagCompound() == null) {
return null;
}
return new Flower(stack.getTagCompound());
}
@Override
public IFlower getFlower(IFlowerGenome genome) {
return new Flower(genome, 2);
}
@Override
public IFlowerGenome templateAsGenome(IAllele[] template) {
return new FlowerGenome(templateAsChromosomes(template));
}
@Override
public IFlowerGenome templateAsGenome(IAllele[] templateActive, IAllele[] templateInactive) {
return new FlowerGenome(templateAsChromosomes(templateActive, templateInactive));
}
@Override
public IFlower templateAsIndividual(IAllele[] template) {
return new Flower(templateAsGenome(template), 2);
}
@Override
public IFlower templateAsIndividual(IAllele[] templateActive, IAllele[] templateInactive) {
return new Flower(templateAsGenome(templateActive, templateInactive), 2);
}
@Override
public ArrayList<IFlower> getIndividualTemplates() {
return FlowerRoot.flowerTemplates;
}
@Override
public void registerTemplate(IAllele[] template) {
registerTemplate(template[0].getUID(), template);
}
@Override
public void registerTemplate(String identifier, IAllele[] template) {
FlowerRoot.flowerTemplates.add(new Flower(templateAsGenome(template), 2));
if (!speciesTemplates.containsKey(identifier)) {
speciesTemplates.put(identifier, template);
}
}
@Override
public IAllele[] getTemplate(String identifier) {
return speciesTemplates.get(identifier);
}
@Override
public IAllele[] getDefaultTemplate() {
IAllele[] alleles = new IAllele[EnumFlowerChromosome.values().length];
AlleleHelper.getInstance().set(alleles, EnumFlowerChromosome.SPECIES, FlowerDefinition.Poppy.getSpecies());
AlleleHelper.getInstance().set(alleles, EnumFlowerChromosome.PRIMARY, EnumFlowerColor.Red.getFlowerColorAllele());
AlleleHelper.getInstance().set(alleles, EnumFlowerChromosome.SECONDARY, EnumFlowerColor.Red.getFlowerColorAllele());
AlleleHelper.getInstance().set(alleles, EnumFlowerChromosome.FERTILITY, EnumAllele.Fertility.NORMAL);
AlleleHelper.getInstance().set(alleles, EnumFlowerChromosome.TERRITORY, EnumAllele.Territory.AVERAGE);
AlleleHelper.getInstance().set(alleles, EnumFlowerChromosome.EFFECT, ModuleFlowers.alleleEffectNone);
AlleleHelper.getInstance().set(alleles, EnumFlowerChromosome.LIFESPAN, EnumAllele.Lifespan.NORMAL);
AlleleHelper.getInstance().set(alleles, EnumFlowerChromosome.TEMPERATURE_TOLERANCE, EnumAllele.Tolerance.NONE);
AlleleHelper.getInstance().set(alleles, EnumFlowerChromosome.HUMIDITY_TOLERANCE, EnumAllele.Tolerance.NONE);
AlleleHelper.getInstance().set(alleles, EnumFlowerChromosome.PH_TOLERANCE, EnumAllele.Tolerance.NONE);
AlleleHelper.getInstance().set(alleles, EnumFlowerChromosome.SAPPINESS, EnumAllele.Sappiness.AVERAGE);
AlleleHelper.getInstance().set(alleles, EnumFlowerChromosome.STEM, EnumFlowerColor.Green.getFlowerColorAllele());
return alleles;
}
@Override
public IAllele[] getRandomTemplate(Random rand) {
return speciesTemplates.values().toArray(new IAllele[0][])[rand.nextInt(speciesTemplates.values().size())];
}
@Override
public ArrayList<IFlowerMutation> getMutations(boolean shuffle) {
if (shuffle) {
Collections.shuffle(FlowerRoot.flowerMutations);
}
return FlowerRoot.flowerMutations;
}
@Override
public void registerMutation(IMutation mutation) {
if (AlleleManager.alleleRegistry.isBlacklisted(mutation.getTemplate()[0].getUID())) {
return;
}
if (AlleleManager.alleleRegistry.isBlacklisted(mutation.getAllele0().getUID())) {
return;
}
if (AlleleManager.alleleRegistry.isBlacklisted(mutation.getAllele1().getUID())) {
return;
}
FlowerRoot.flowerMutations.add((IFlowerMutation) mutation);
}
@Override
public IBotanistTracker getBreedingTracker(World world, @Nullable GameProfile player) {
String filename = "BotanistTracker." + ((player == null) ? "common" : player.getId());
BotanistTracker tracker = (BotanistTracker) world.loadData(BotanistTracker.class, filename);
if (tracker == null) {
tracker = new BotanistTracker(filename);
world.setData(filename, tracker);
}
return tracker;
}
@Override
public IIndividual getMember(NBTTagCompound compound) {
return new Flower(compound);
}
@Override
public Class<IFlower> getMemberClass() {
return IFlower.class;
}
@Override
public IChromosomeType[] getKaryotype() {
return EnumFlowerChromosome.values();
}
@Override
public IChromosomeType getSpeciesChromosomeType() {
return EnumFlowerChromosome.SPECIES;
}
@Override
public void addConversion(ItemStack itemstack, IAllele[] template) {
IFlower flower = getFlower(templateAsGenome(template));
conversions.put(itemstack, flower);
}
@Override
@Nullable
public IFlower getConversion(ItemStack itemstack) {
for (Map.Entry<ItemStack, IFlower> entry : conversions.entrySet()) {
if (entry.getKey().isItemEqual(itemstack)) {
return (IFlower) entry.getValue().copy();
}
}
return null;
}
@Override
public void registerColourMix(IColorMix colorMix) {
FlowerRoot.colourMixes.add(colorMix);
}
@Override
public Collection<IColorMix> getColorMixes(boolean shuffle) {
if (shuffle) {
Collections.shuffle(FlowerRoot.colourMixes);
}
return FlowerRoot.colourMixes;
}
public boolean plant(World world, BlockPos pos, IFlower flower, GameProfile owner) {
boolean set = world.setBlockState(pos, ModuleFlowers.flower.getDefaultState());
if (!set) {
return false;
}
TileEntity tile = world.getTileEntity(pos);
TileEntity below = world.getTileEntity(pos.down());
if (tile != null && tile instanceof TileEntityFlower) {
TileEntityFlower tileFlower = (TileEntityFlower) tile;
if (below instanceof TileEntityFlower) {
tileFlower.setSection(((TileEntityFlower) below).getSection());
} else {
tileFlower.create(flower, owner);
}
}
tryGrowSection(world, pos);
return true;
}
@Override
public void tryGrowSection(World world, BlockPos pos) {
if (world.isRemote) {
return;
}
TileEntity tileFlower = world.getTileEntity(pos);
if (tileFlower == null || !(tileFlower instanceof TileEntityFlower)) {
return;
}
IFlower flower = ((TileEntityFlower) tileFlower).getFlower();
int section = ((TileEntityFlower) tileFlower).getSection();
if (flower == null || section >= flower.getGenome().getPrimary().getType().getSections() - 1 || flower.getAge() <= 0) {
return;
}
world.setBlockState(pos.up(), ModuleFlowers.flower.getDefaultState());
TileEntity flowerAbove = world.getTileEntity(pos.up());
if (flowerAbove != null && flowerAbove instanceof TileEntityFlower) {
((TileEntityFlower) flowerAbove).setSection(section + 1);
}
}
@Override
public void onGrowFromSeed(World world, BlockPos pos) {
tryGrowSection(world, pos);
}
}
@@ -0,0 +1,21 @@
package binnie.botany.genetics;
import binnie.botany.api.BotanyAPI;
import binnie.botany.api.gardening.EnumFertiliserType;
import binnie.botany.api.gardening.IGardeningManager;
import binnie.genetics.api.acclimatiser.IToleranceType;
import net.minecraft.item.ItemStack;
public class TolerancePh implements IToleranceType {
@Override
public float getEffect(ItemStack stack) {
IGardeningManager gardening = BotanyAPI.gardening;
if (gardening.isFertiliser(EnumFertiliserType.ACID, stack)) {
return -0.5f * gardening.getFertiliserStrength(stack);
}
if (gardening.isFertiliser(EnumFertiliserType.ALKALINE, stack)) {
return 0.5f * gardening.getFertiliserStrength(stack);
}
return 0;
}
}
@@ -1,11 +1,11 @@
package binnie.botany.genetics;
package binnie.botany.genetics.allele;
import net.minecraft.world.World;
import forestry.api.genetics.IEffectData;
import binnie.botany.api.IAlleleFlowerEffect;
import binnie.botany.api.IFlowerGenome;
import binnie.botany.api.genetics.IAlleleFlowerEffect;
import binnie.botany.api.genetics.IFlowerGenome;
public class AlleleEffectNone implements IAlleleFlowerEffect {
@Override
@@ -14,7 +14,7 @@ public class AlleleEffectNone implements IAlleleFlowerEffect {
}
@Override
public IEffectData validateStorage(final IEffectData storedData) {
public IEffectData validateStorage(IEffectData storedData) {
return storedData;
}
@@ -34,12 +34,12 @@ public class AlleleEffectNone implements IAlleleFlowerEffect {
}
@Override
public IEffectData doEffect(final IFlowerGenome genome, final IEffectData storedData, final World world, final int x, final int y, final int z) {
return storedData;
public IEffectData doEffect(IFlowerGenome genome, IEffectData effect, World world, int x, int y, int z) {
return effect;
}
@Override
public String getUnlocalizedName() {
return this.getUID();
return getUID();
}
}
@@ -1,4 +1,4 @@
package binnie.botany.genetics;
package binnie.botany.genetics.allele;
import net.minecraft.client.renderer.block.model.ModelResourceLocation;
import net.minecraft.item.Item;
@@ -12,13 +12,13 @@ import forestry.api.genetics.IClassification;
import forestry.api.genetics.ISpeciesRoot;
import forestry.core.genetics.alleles.AlleleSpecies;
import binnie.botany.api.EnumAcidity;
import binnie.botany.api.EnumFlowerChromosome;
import binnie.botany.api.EnumFlowerStage;
import binnie.botany.api.EnumMoisture;
import binnie.botany.api.IAlleleFlowerSpecies;
import binnie.botany.api.IAlleleFlowerSpeciesBuilder;
import binnie.botany.api.IFlowerType;
import binnie.botany.api.gardening.EnumAcidity;
import binnie.botany.api.gardening.EnumMoisture;
import binnie.botany.api.genetics.EnumFlowerChromosome;
import binnie.botany.api.genetics.EnumFlowerStage;
import binnie.botany.api.genetics.IAlleleFlowerSpecies;
import binnie.botany.api.genetics.IAlleleFlowerSpeciesBuilder;
import binnie.botany.api.genetics.IFlowerType;
import binnie.botany.core.BotanyCore;
public class AlleleFlowerSpecies extends AlleleSpecies implements IAlleleFlowerSpecies, IAlleleFlowerSpeciesBuilder {
@@ -27,15 +27,16 @@ public class AlleleFlowerSpecies extends AlleleSpecies implements IAlleleFlowerS
private EnumMoisture moisture = EnumMoisture.NORMAL;
public AlleleFlowerSpecies(
String uid,
String unlocalizedName,
String authority,
String unlocalizedDescription,
boolean isDominant,
IClassification branch,
String binomial,
IFlowerType flowerType) {
super(uid, unlocalizedName, authority, unlocalizedDescription, isDominant, branch, binomial);
String modId,
String uid,
String unlocalizedName,
String authority,
String unlocalizedDescription,
boolean isDominant,
IClassification branch,
String binomial,
IFlowerType flowerType) {
super(modId, uid, unlocalizedName, authority, unlocalizedDescription, isDominant, branch, binomial);
this.flowerType = flowerType;
}
@@ -83,7 +84,7 @@ public class AlleleFlowerSpecies extends AlleleSpecies implements IAlleleFlowerS
}
@Override
public int getFlowerColour(EnumFlowerStage type, int renderPass) {
public int getFlowerColor(EnumFlowerStage type, int renderPass) {
return 0;
}
@@ -0,0 +1,9 @@
@ParametersAreNonnullByDefault
@MethodsReturnNonnullByDefault
@FieldsAreNonnullByDefault
package binnie.botany.genetics.allele;
import javax.annotation.ParametersAreNonnullByDefault;
import binnie.core.util.FieldsAreNonnullByDefault;
import mcp.MethodsReturnNonnullByDefault;
@@ -0,0 +1,94 @@
package binnie.botany.genetics.gui.analyst;
import binnie.core.api.gui.IArea;
import binnie.core.api.gui.ITitledWidget;
import binnie.core.gui.controls.core.Control;
import net.minecraft.client.renderer.GlStateManager;
import net.minecraft.util.text.TextFormatting;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import forestry.api.genetics.IAlleleSpecies;
import binnie.botany.api.genetics.IFlower;
import binnie.botany.api.genetics.IFlowerGenome;
import binnie.botany.api.genetics.IFlowerType;
import binnie.botany.gui.database.ControlColorDisplay;
import binnie.botany.models.FlowerSpriteManager;
import binnie.core.api.gui.IWidget;
import binnie.core.gui.controls.ControlTextCentered;
import binnie.core.gui.geometry.Point;
import binnie.core.gui.minecraft.control.ControlIconDisplay;
import binnie.core.gui.renderer.RenderUtil;
import binnie.core.util.I18N;
import binnie.genetics.api.analyst.AnalystConstants;
@SideOnly(Side.CLIENT)
public class AnalystPageAppearance extends Control implements ITitledWidget {
public AnalystPageAppearance(IWidget parent, IArea area, IFlower flower) {
super(parent, area);
setColor(3355443);
int y = 4;
IFlowerGenome genome = flower.getGenome();
IAlleleSpecies species = genome.getPrimary();
new ControlTextCentered(this, y, TextFormatting.UNDERLINE + getTitle()).setColor(getColor());
y += 12;
ControlColorDisplay a = new ControlColorDisplay(this, getWidth() / 2 - 28, y, genome.getPrimaryColor());
a.addTooltip(I18N.localise(AnalystConstants.APPEARANCE_KEY + ".primary"));
ControlColorDisplay b = new ControlColorDisplay(this, getWidth() / 2 - 8, y, genome.getSecondaryColor());
b.addTooltip(I18N.localise(AnalystConstants.APPEARANCE_KEY + ".secondary"));
ControlColorDisplay c = new ControlColorDisplay(this, getWidth() / 2 + 12, y, genome.getStemColor());
c.addTooltip(I18N.localise(AnalystConstants.APPEARANCE_KEY + ".stem"));
y += 26;
IFlowerType type = genome.getType();
int sections = type.getSections();
int width = (sections > 1) ? 50 : 100;
new FlowerIconDisplay(this, width, y, sections, flower, type);
}
@Override
public String getTitle() {
return I18N.localise(AnalystConstants.APPEARANCE_KEY + ".title");
}
private static class FlowerIconDisplay extends ControlIconDisplay {
private final int width;
private final int sections;
private final IFlower flower;
private final IFlowerType type;
public FlowerIconDisplay(AnalystPageAppearance analystPageAppearance, int width, int y, int sections, IFlower flower, IFlowerType type) {
super(analystPageAppearance, (analystPageAppearance.getWidth() - width) / 2, y - ((sections == 1) ? 0 : 0));
this.width = width;
this.sections = sections;
this.flower = flower;
this.type = type;
}
@Override
@SideOnly(Side.CLIENT)
public void onRenderForeground(int guiWidth, int guiHeight) {
GlStateManager.pushMatrix();
float scale = width / 16.0f;
int dy = (sections > 1) ? 16 : 0;
GlStateManager.scale(scale, scale, 1.0f);
RenderUtil.setColour(flower.getGenome().getStemColor().getColor(false));
if (sections > 1) {
RenderUtil.drawSprite(Point.ZERO, FlowerSpriteManager.getStem(type, 1, true));
}
RenderUtil.drawSprite(new Point(0, dy), FlowerSpriteManager.getStem(type, 0, true));
RenderUtil.setColour(flower.getGenome().getPrimaryColor().getColor(false));
if (sections > 1) {
RenderUtil.drawSprite(Point.ZERO, FlowerSpriteManager.getPetal(type, 1, true));
}
RenderUtil.drawSprite(new Point(0, dy), FlowerSpriteManager.getPetal(type, 0, true));
RenderUtil.setColour(flower.getGenome().getSecondaryColor().getColor(false));
if (sections > 1) {
RenderUtil.drawSprite(Point.ZERO, FlowerSpriteManager.getVariant(type, 1, true));
}
RenderUtil.drawSprite(new Point(0, dy), FlowerSpriteManager.getVariant(type, 0, true));
GlStateManager.popMatrix();
}
}
}
@@ -0,0 +1,154 @@
package binnie.botany.genetics.gui.analyst;
import java.util.ArrayList;
import java.util.EnumSet;
import java.util.List;
import binnie.botany.api.gardening.EnumAcidity;
import binnie.botany.api.gardening.EnumMoisture;
import binnie.botany.api.genetics.IFlower;
import binnie.botany.blocks.BlockSoil;
import binnie.botany.modules.ModuleGardening;
import binnie.core.api.gui.IArea;
import binnie.core.api.gui.ITitledWidget;
import binnie.core.api.gui.IWidget;
import binnie.core.genetics.Tolerance;
import binnie.core.gui.controls.ControlText;
import binnie.core.gui.controls.ControlTextCentered;
import binnie.core.gui.controls.ControlToleranceBar;
import binnie.core.gui.controls.core.Control;
import binnie.core.gui.geometry.Area;
import binnie.core.gui.geometry.TextJustification;
import binnie.core.gui.minecraft.control.ControlItemDisplay;
import binnie.core.util.I18N;
import binnie.genetics.api.analyst.AnalystConstants;
import net.minecraft.item.ItemStack;
import net.minecraft.util.text.TextFormatting;
public class AnalystPageSoil extends Control implements ITitledWidget {
public AnalystPageSoil(IWidget parent, IArea area, IFlower flower) {
super(parent, area);
setColor(6697728);
EnumMoisture moisture = flower.getGenome().getPrimary().getMoisture();
forestry.api.genetics.EnumTolerance moistureTol = flower.getGenome().getToleranceMoisture();
EnumAcidity pH = flower.getGenome().getPrimary().getPH();
forestry.api.genetics.EnumTolerance pHTol = flower.getGenome().getTolerancePH();
int y = 4;
new ControlTextCentered(this, y, TextFormatting.UNDERLINE + getTitle()).setColor(getColor());
y += 16;
new ControlText(this, new Area(4, y, getWidth() - 8, 14), I18N.localise(AnalystConstants.SOIL_KEY + ".tolerance.moisture"), TextJustification.MIDDLE_CENTER).setColor(getColor());
y += 12;
createMoisture(this, (getWidth() - 100) / 2, y, 100, 10, moisture, moistureTol);
y += 16;
new ControlText(this, new Area(4, y, getWidth() - 8, 14), I18N.localise(AnalystConstants.SOIL_KEY + ".tolerance.ph"), TextJustification.MIDDLE_CENTER).setColor(getColor());
y += 12;
createAcidity(this, (getWidth() - 100) / 2, y, 100, 10, pH, pHTol);
y += 16;
new ControlText(this, new Area(4, y, getWidth() - 8, 14), I18N.localise(AnalystConstants.SOIL_KEY + ".recommended"), TextJustification.MIDDLE_CENTER).setColor(getColor());
y += 12;
EnumMoisture recomMoisture = EnumMoisture.NORMAL;
boolean canTolNormal = Tolerance.canTolerate(moisture, EnumMoisture.NORMAL, moistureTol);
boolean canTolDamp = Tolerance.canTolerate(moisture, EnumMoisture.DAMP, moistureTol);
boolean canTolDry = Tolerance.canTolerate(moisture, EnumMoisture.DRY, moistureTol);
if (canTolNormal) {
if (canTolDamp && !canTolDry) {
recomMoisture = EnumMoisture.DAMP;
} else if (canTolDry && !canTolDamp) {
recomMoisture = EnumMoisture.DRY;
}
} else {
if (canTolDamp) {
recomMoisture = EnumMoisture.DAMP;
}
if (canTolDry) {
recomMoisture = EnumMoisture.DRY;
}
}
EnumAcidity recomPH = EnumAcidity.NEUTRAL;
boolean canTolNeutral = Tolerance.canTolerate(pH, EnumAcidity.NEUTRAL, pHTol);
boolean canTolAcid = Tolerance.canTolerate(pH, EnumAcidity.ACID, pHTol);
boolean canTolAlkaline = Tolerance.canTolerate(pH, EnumAcidity.ALKALINE, pHTol);
if (canTolNeutral) {
if (canTolAcid && !canTolAlkaline) {
recomPH = EnumAcidity.ACID;
} else if (canTolAlkaline && !canTolAcid) {
recomPH = EnumAcidity.ALKALINE;
}
} else {
if (canTolAcid) {
recomPH = EnumAcidity.ACID;
}
if (canTolAlkaline) {
recomPH = EnumAcidity.ALKALINE;
}
}
ItemStack stack = new ItemStack(ModuleGardening.soil, 1, BlockSoil.getMeta(recomPH, recomMoisture));
ControlItemDisplay recomSoil = new ControlItemDisplay(this, (getWidth() - 24) / 2, y, 24);
recomSoil.setItemStack(stack);
recomSoil.setTooltip();
y += 32;
new ControlText(this, new Area(4, y, getWidth() - 8, 14), I18N.localise(AnalystConstants.SOIL_KEY + ".other"), TextJustification.MIDDLE_CENTER).setColor(getColor());
y += 12;
List<ItemStack> stacks = new ArrayList<>();
for (EnumAcidity a : EnumSet.range(EnumAcidity.ACID, EnumAcidity.ALKALINE)) {
for (EnumMoisture b : EnumSet.range(EnumMoisture.DRY, EnumMoisture.DAMP)) {
if (Tolerance.canTolerate(pH, a, pHTol) && Tolerance.canTolerate(moisture, b, moistureTol) && (a != recomPH || b != recomMoisture)) {
stacks.add(new ItemStack(ModuleGardening.soil, 1, BlockSoil.getMeta(a, b)));
}
}
}
int soilListWidth = 17 * stacks.size() - 1;
int soilListX = (getWidth() - soilListWidth) / 2;
int t = 0;
for (ItemStack soilStack : stacks) {
ControlItemDisplay display = new ControlItemDisplay(this, soilListX + 17 * t++, y);
display.setItemStack(soilStack);
display.setTooltip();
}
}
protected void createMoisture(IWidget parent, int x, int y, int w, int h, EnumMoisture value, forestry.api.genetics.EnumTolerance tol) {
new MoistureBar(parent, x, y, w, h).setValues(value, tol);
}
protected void createAcidity(IWidget parent, int x, int y, int w, int h, EnumAcidity value, forestry.api.genetics.EnumTolerance tol) {
new AcidityBar(parent, x, y, w, h).setValues(value, tol);
}
@Override
public String getTitle() {
return I18N.localise(AnalystConstants.SOIL_KEY + ".title");
}
private static class MoistureBar extends ControlToleranceBar<EnumMoisture> {
public MoistureBar(IWidget parent, int x, int y, int w, int h) {
super(parent, x, y, w, h, EnumMoisture.class);
}
@Override
protected String getName(EnumMoisture value) {
return value.getLocalisedName(false);
}
@Override
protected int getColour(EnumMoisture value) {
return (new int[]{13434828, 6737151, 3368703})[value.ordinal()];
}
}
private static class AcidityBar extends ControlToleranceBar<EnumAcidity> {
public AcidityBar(IWidget parent, int x, int y, int w, int h) {
super(parent, x, y, w, h, EnumAcidity.class);
}
@Override
protected String getName(EnumAcidity value) {
return value.getLocalisedName(false);
}
@Override
protected int getColour(EnumAcidity value) {
return (new int[]{16711782, 65280, 26367})[value.ordinal()];
}
}
}
@@ -0,0 +1,118 @@
package binnie.botany.genetics.gui.analyst;
import java.util.List;
import binnie.botany.api.genetics.EnumFlowerChromosome;
import binnie.botany.api.genetics.IFlower;
import binnie.botany.api.genetics.IFlowerGenome;
import binnie.core.Constants;
import binnie.core.api.gui.IArea;
import binnie.core.api.gui.ITitledWidget;
import binnie.core.api.gui.IWidget;
import binnie.core.gui.controls.ControlTextCentered;
import binnie.core.util.I18N;
import binnie.core.util.TimeUtil;
import binnie.genetics.api.analyst.IAnalystManager;
import binnie.genetics.api.analyst.IAnalystPagePlugin;
import binnie.genetics.api.analyst.IBiologyPlugin;
import binnie.genetics.api.analyst.IClimatePlugin;
import binnie.genetics.api.analyst.AnalystConstants;
import forestry.api.genetics.EnumTolerance;
import forestry.api.genetics.IAlleleTolerance;
import forestry.api.genetics.IIndividual;
import net.minecraft.util.text.TextFormatting;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
public class FlowerAnalystPagePlugin implements IAnalystPagePlugin<IFlower> {
@Override
public boolean handles(IIndividual individual) {
return individual instanceof IFlower;
}
@Override
@SideOnly(Side.CLIENT)
public void addAnalystPages(IFlower individual, IWidget parent, IArea pageSize, List<ITitledWidget> analystPages, IAnalystManager analystManager) {
analystPages.add(analystManager.createClimatePage(parent, pageSize, individual, new ClimatePlugin()));
analystPages.add(new AnalystPageSoil(parent, pageSize, individual));
analystPages.add(analystManager.createBiologyPage(parent, pageSize, individual, new BiologyPlugin()));
analystPages.add(new AnalystPageAppearance(parent, pageSize, individual));
}
private static class BiologyPlugin implements IBiologyPlugin<IFlower> {
@Override
@SideOnly(Side.CLIENT)
public int addBiologyPages(IFlower flower, IWidget parent, int y, IAnalystManager analystManager) {
y += 10;
int butterflySpawn2 = Math.round(Constants.SPAWN_KOEF / (flower.getGenome().getSappiness() * 0.2f));
new ControlTextCentered(parent, y, I18N.localise(AnalystConstants.BIOLOGY_KEY + ".mothSpawn", TimeUtil.getTimeString(butterflySpawn2)))
.setColor(parent.getColor());
y += 30;
int fertility = flower.getGenome().getFertility();
float chanceDispersal = 0.8f;
chanceDispersal += 0.2f * fertility;
if (chanceDispersal > 1.0f) {
chanceDispersal = 1.0f;
}
float chancePollinate = 0.6f;
chancePollinate += 0.25f * fertility;
if (chancePollinate > 1.0f) {
chancePollinate = 1.0f;
}
float maxAge = flower.getMaxAge();
float ageChance = flower.getGenome().getAgeChance();
float dispersalTime = Constants.SPAWN_KOEF / chanceDispersal;
float pollinateTime = Constants.SPAWN_KOEF / chancePollinate;
float lifespan2 = maxAge * 20.0f * 68.27f / ageChance;
float floweringLifespan = (maxAge - 1) * 20.0f * 68.27f / ageChance - Constants.SPAWN_KOEF;
new ControlTextCentered(parent, y, I18N.localise(AnalystConstants.BIOLOGY_KEY + ".averageLifespan"))
.setColor(parent.getColor());
y += 12;
new ControlTextCentered(parent, y, TextFormatting.BOLD + TimeUtil.getMCDayString(lifespan2))
.setColor(parent.getColor());
y += 22;
new ControlTextCentered(parent, y, I18N.localise(AnalystConstants.BIOLOGY_KEY + ".seedDispersal"))
.setColor(parent.getColor());
y += 12;
new ControlTextCentered(parent, y, TextFormatting.ITALIC + I18N.localise(AnalystConstants.BIOLOGY_KEY + ".perLifetime", (int) (floweringLifespan / dispersalTime)))
.setColor(parent.getColor());
y += 22;
new ControlTextCentered(parent, y, I18N.localise(AnalystConstants.BIOLOGY_KEY + ".pollination"))
.setColor(parent.getColor());
y += 12;
new ControlTextCentered(parent, y, TextFormatting.ITALIC + I18N.localise(AnalystConstants.BIOLOGY_KEY + ".perLifetime", (int) (floweringLifespan / pollinateTime)))
.setColor(parent.getColor());
y += 22;
return y;
}
}
private static class ClimatePlugin implements IClimatePlugin<IFlower> {
@Override
public EnumTolerance getTemperatureTolerance(IFlower flower) {
IFlowerGenome genome = flower.getGenome();
IAlleleTolerance tolerance = (IAlleleTolerance) genome.getActiveAllele(EnumFlowerChromosome.TEMPERATURE_TOLERANCE);
return tolerance.getValue();
}
@Override
public EnumTolerance getHumidityTolerance(IFlower flower) {
return EnumTolerance.BOTH_5;
}
@Override
public boolean showHumiditySection() {
return false;
}
}
}
@@ -0,0 +1,9 @@
@ParametersAreNonnullByDefault
@MethodsReturnNonnullByDefault
@FieldsAreNonnullByDefault
package binnie.botany.genetics.gui.analyst;
import javax.annotation.ParametersAreNonnullByDefault;
import binnie.core.util.FieldsAreNonnullByDefault;
import mcp.MethodsReturnNonnullByDefault;
@@ -1,5 +1,6 @@
package binnie.botany.core;
package binnie.botany.gui;
import binnie.design.gui.WindowDesigner;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.IInventory;
import net.minecraft.tileentity.TileEntity;
@@ -8,26 +9,31 @@ import net.minecraft.world.World;
import net.minecraftforge.fml.relauncher.Side;
import binnie.botany.craftgui.WindowBotanistDatabase;
import binnie.core.craftgui.minecraft.Window;
import binnie.botany.gui.database.WindowBotanistDatabase;
import binnie.core.gui.IBinnieGUID;
import binnie.core.gui.minecraft.Window;
public enum BotanyGUI implements IBinnieGUID {
Database,
DatabaseNEI;
DATABASE,
DATABASE_MASTER,
TILEWORKER;
@Override
public Window getWindow(final EntityPlayer player, final World world, final int x, final int y, final int z, final Side side) {
public Window getWindow(EntityPlayer player, World world, int x, int y, int z, Side side) {
Window window = null;
final TileEntity tileEntity = world.getTileEntity(new BlockPos(x, y, z));
IInventory object = null;
IInventory inventory = null;
if (tileEntity instanceof IInventory) {
object = (IInventory) tileEntity;
inventory = (IInventory) tileEntity;
}
switch (this) {
case Database:
case DatabaseNEI: {
window = WindowBotanistDatabase.create(player, side, this != BotanyGUI.Database);
case DATABASE:
case DATABASE_MASTER: {
window = WindowBotanistDatabase.create(player, side, this != BotanyGUI.DATABASE);
break;
}
case TILEWORKER: {
window = WindowDesigner.create(player, inventory, side);
break;
}
}
@@ -0,0 +1,48 @@
package binnie.botany.gui.database;
import net.minecraft.client.util.ITooltipFlag;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import binnie.botany.api.genetics.IFlowerColor;
import binnie.core.gui.Attribute;
import binnie.core.gui.ITooltip;
import binnie.core.api.gui.IWidget;
import binnie.core.gui.Tooltip;
import binnie.core.gui.controls.core.Control;
import binnie.core.gui.controls.core.IControlValue;
import binnie.core.gui.renderer.RenderUtil;
public class ControlColorDisplay extends Control implements IControlValue<IFlowerColor>, ITooltip {
private IFlowerColor value;
public ControlColorDisplay(IWidget parent, int x, int y, IFlowerColor value) {
super(parent, x, y, 16, 16);
this.value = value;
addAttribute(Attribute.MOUSE_OVER);
}
@Override
public IFlowerColor getValue() {
return value;
}
@Override
public void setValue(IFlowerColor value) {
this.value = value;
}
@Override
@SideOnly(Side.CLIENT)
public void onRenderBackground(int guiWidth, int guiHeight) {
RenderUtil.drawSolidRect(getArea(), -1);
RenderUtil.drawSolidRect(getArea().inset(1), 0xff000000 + getValue().getColor(false));
}
@Override
@SideOnly(Side.CLIENT)
public void getTooltip(Tooltip tooltip, ITooltipFlag tooltipFlag) {
super.getTooltip(tooltip, tooltipFlag);
tooltip.add(value.getColorName());
}
}
@@ -0,0 +1,25 @@
package binnie.botany.gui.database;
import binnie.botany.api.genetics.IColorMix;
import binnie.core.api.gui.IWidget;
import binnie.core.gui.controls.listbox.ControlListBox;
public class ControlColorMixBox extends ControlListBox<IColorMix> {
private int index;
private final Type type;
public ControlColorMixBox(IWidget parent, int x, int y, int width, int height, Type type) {
super(parent, x, y, width, height, 12);
this.type = type;
}
@Override
public IWidget createOption(IColorMix value, int y) {
return new ControlColorMixItem(getContent(), value, y);
}
enum Type {
RESULTANT,
FURTHER,
}
}
@@ -0,0 +1,23 @@
package binnie.botany.gui.database;
import binnie.botany.api.genetics.IColorMix;
import binnie.core.gui.controls.listbox.ControlList;
import binnie.core.gui.controls.listbox.ControlOption;
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<IColorMix> controlList, IColorMix option, int y) {
super(controlList, option, y);
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,52 @@
package binnie.botany.gui.database;
import net.minecraft.client.util.ITooltipFlag;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import binnie.botany.api.genetics.IColorMix;
import binnie.core.gui.Attribute;
import binnie.core.gui.CraftGUI;
import binnie.core.gui.ITooltip;
import binnie.core.api.gui.IWidget;
import binnie.core.gui.Tooltip;
import binnie.core.gui.controls.core.Control;
import binnie.core.gui.database.DatabaseConstants;
import binnie.core.gui.geometry.Point;
import binnie.core.gui.resource.textures.Texture;
import binnie.core.gui.resource.textures.CraftGUITextureSheet;
import binnie.core.gui.resource.textures.StandardTexture;
import binnie.core.util.I18N;
public class ControlColorMixSymbol extends Control implements ITooltip {
private static final Texture MUTATION_PLUS = new StandardTexture(2, 94, 16, 16, CraftGUITextureSheet.CONTROLS);
private static final Texture MUTATION_ARROW = new StandardTexture(20, 94, 32, 16, CraftGUITextureSheet.CONTROLS);
private final IColorMix value;
private final 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.MOUSE_OVER);
}
@Override
@SideOnly(Side.CLIENT)
public void onRenderBackground(int guiWidth, int guiHeight) {
super.onRenderBackground(guiWidth, guiHeight);
if (type == 0) {
CraftGUI.RENDER.texture(ControlColorMixSymbol.MUTATION_PLUS, Point.ZERO);
} else {
CraftGUI.RENDER.texture(ControlColorMixSymbol.MUTATION_ARROW, Point.ZERO);
}
}
@Override
public void getTooltip(Tooltip tooltip, ITooltipFlag tooltipFlag) {
if (type == 1) {
float chance = value.getChance();
tooltip.add(I18N.localise(DatabaseConstants.BOTANY_CONTROL_KEY + ".color_mix_symbol.chance", chance));
}
}
}
@@ -0,0 +1,32 @@
package binnie.botany.gui.database;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import binnie.botany.api.genetics.IFlowerColor;
import binnie.core.gui.Attribute;
import binnie.core.gui.CraftGUI;
import binnie.core.gui.controls.listbox.ControlList;
import binnie.core.gui.controls.listbox.ControlTextOption;
import binnie.core.gui.geometry.CraftGUIUtil;
import binnie.core.gui.geometry.Point;
@SideOnly(Side.CLIENT)
public class ControlColorOption extends ControlTextOption<IFlowerColor> {
private final ControlColorDisplay controlBee;
private final Point boxPosition;
public ControlColorOption(ControlList<IFlowerColor> controlList, IFlowerColor option, int y) {
super(controlList, option, option.getColorName(), y);
setSize(new Point(getSize().xPos(), 20));
controlBee = new ControlColorDisplay(this, 2, 2, option);
addAttribute(Attribute.MOUSE_OVER);
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().xPos());
int height = Math.max(20, th + 6);
setSize(new Point(this.getSize().xPos(), height));
textWidget.setSize(new Point(textWidget.getSize().xPos(), height));
boxPosition = new Point(2, (height - 18) / 2);
}
}
@@ -0,0 +1,37 @@
package binnie.botany.gui.database;
import java.util.ArrayList;
import java.util.List;
import binnie.botany.api.genetics.IColorMix;
import binnie.botany.api.genetics.IFlowerColor;
import binnie.botany.core.BotanyCore;
import binnie.core.api.gui.IWidget;
import binnie.core.gui.controls.ControlText;
import binnie.core.gui.controls.ControlTextCentered;
import binnie.core.gui.database.DatabaseConstants;
import binnie.core.gui.database.DatabaseTab;
import binnie.core.gui.database.PageAbstract;
import binnie.core.util.I18N;
public class PageColorMix extends PageAbstract<IFlowerColor> {
private final ControlText title;
private final ControlColorMixBox list;
public PageColorMix(IWidget parent, DatabaseTab tab) {
super(parent, tab);
title = new ControlTextCentered(this, 8, I18N.localise(DatabaseConstants.BOTANY_PAGES_KEY + ".color_further.title"));
list = new ControlColorMixBox(this, 4, 20, 136, 152, ControlColorMixBox.Type.FURTHER);
}
@Override
public void onValueChanged(IFlowerColor 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);
}
}
@@ -0,0 +1,37 @@
package binnie.botany.gui.database;
import java.util.ArrayList;
import java.util.List;
import binnie.botany.api.genetics.IColorMix;
import binnie.botany.api.genetics.IFlowerColor;
import binnie.botany.core.BotanyCore;
import binnie.core.api.gui.IWidget;
import binnie.core.gui.controls.ControlText;
import binnie.core.gui.controls.ControlTextCentered;
import binnie.core.gui.database.DatabaseConstants;
import binnie.core.gui.database.DatabaseTab;
import binnie.core.gui.database.PageAbstract;
import binnie.core.util.I18N;
public class PageColorMixResultant extends PageAbstract<IFlowerColor> {
private final ControlText pageSpeciesFurtherTitle;
private final ControlColorMixBox pageSpeciesFurtherList;
public PageColorMixResultant(IWidget parent, DatabaseTab tab) {
super(parent, tab);
pageSpeciesFurtherTitle = new ControlTextCentered(this, 8, I18N.localise(DatabaseConstants.BOTANY_PAGES_KEY + ".species_further.title"));
pageSpeciesFurtherList = new ControlColorMixBox(this, 4, 20, 136, 152, ControlColorMixBox.Type.RESULTANT);
}
@Override
public void onValueChanged(IFlowerColor colour) {
List<IColorMix> mixes = new ArrayList<>();
for (IColorMix mix : BotanyCore.getFlowerRoot().getColorMixes(false)) {
if (mix.getResult() == colour) {
mixes.add(mix);
}
}
pageSpeciesFurtherList.setOptions(mixes);
}
}
@@ -0,0 +1,104 @@
package binnie.botany.gui.database;
import binnie.botany.api.BotanyAPI;
import net.minecraft.item.ItemStack;
import forestry.api.genetics.IAllele;
import forestry.api.genetics.IAlleleSpecies;
import forestry.api.genetics.IIndividual;
import binnie.botany.api.genetics.EnumFlowerChromosome;
import binnie.botany.api.genetics.EnumFlowerStage;
import binnie.botany.api.genetics.IAlleleFlowerSpecies;
import binnie.botany.api.genetics.IFlower;
import binnie.botany.api.genetics.IFlowerGenome;
import binnie.botany.core.BotanyCore;
import binnie.core.api.gui.IWidget;
import binnie.core.gui.controls.ControlText;
import binnie.core.gui.controls.core.Control;
import binnie.core.gui.controls.scroll.ControlScrollableContent;
import binnie.core.gui.database.DatabaseConstants;
import binnie.core.gui.database.DatabaseTab;
import binnie.core.gui.database.PageSpecies;
import binnie.core.gui.geometry.Area;
import binnie.core.gui.geometry.Point;
import binnie.core.gui.geometry.TextJustification;
import binnie.core.gui.minecraft.control.ControlItemDisplay;
import binnie.core.util.I18N;
public class PageSpeciesFlowerGenome extends PageSpecies {
public PageSpeciesFlowerGenome(IWidget parent, DatabaseTab tab) {
super(parent, tab);
}
@Override
public void onValueChanged(IAlleleSpecies species) {
deleteAllChildren();
IAllele[] template = BotanyAPI.flowerRoot.getTemplate(species.getUID());
if (template == null) {
return;
}
IFlower flower = BotanyAPI.flowerRoot.templateAsIndividual(template);
IFlowerGenome genome = flower.getGenome();
IAlleleFlowerSpecies flowerSpecies = genome.getPrimary();
int w = 144;
int h = 176;
new ControlText(this, new Area(0, 4, w, 16), I18N.localise(DatabaseConstants.BOTANY_GENOME_KEY + ".title"), 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 th2 = 18;
new ControlText(contents, new Area(0, y, w2, th), I18N.localise(DatabaseConstants.BOTANY_GENOME_KEY + ".temp"), TextJustification.MIDDLE_RIGHT);
new ControlText(contents, new Area(w2, y, w3, th), flowerSpecies.getTemperature().getName(), TextJustification.MIDDLE_LEFT);
y += th;
new ControlText(contents, new Area(0, y, w2, th), I18N.localise(DatabaseConstants.BOTANY_GENOME_KEY + ".moist"), TextJustification.MIDDLE_RIGHT);
new ControlText(contents, new Area(w2, y, w3, th), flowerSpecies.getMoisture().getLocalisedName(false), TextJustification.MIDDLE_LEFT);
y += th;
new ControlText(contents, new Area(0, y, w2, th), I18N.localise(DatabaseConstants.BOTANY_GENOME_KEY + ".ph"), TextJustification.MIDDLE_RIGHT);
new ControlText(contents, new Area(w2, y, w3, th), flowerSpecies.getPH().getLocalisedName(false), TextJustification.MIDDLE_LEFT);
y += th;
new ControlText(contents, new Area(0, y, w2, th), I18N.localise(DatabaseConstants.BOTANY_GENOME_KEY + ".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 Area(0, y, w2, th), I18N.localise(DatabaseConstants.BOTANY_GENOME_KEY + ".lifespan"), TextJustification.MIDDLE_RIGHT);
new ControlText(contents, new Area(w2, y, w3, th), I18N.localise(DatabaseConstants.BOTANY_GENOME_KEY + ".lifespan.value", lifespanValue), TextJustification.MIDDLE_LEFT);
y += th;
new ControlText(contents, new Area(0, y, w2, th), I18N.localise(DatabaseConstants.BOTANY_GENOME_KEY + ".nectar"), TextJustification.MIDDLE_RIGHT);
new ControlText(contents, new Area(w2, y, w3, th), genome.getActiveAllele(EnumFlowerChromosome.SAPPINESS).getAlleleName(), TextJustification.MIDDLE_LEFT);
y += th;
int x = w2;
int tot = 0;
for (IIndividual vid : BotanyCore.getFlowerRoot().getIndividualTemplates()) {
if (vid.getGenome().getPrimary() == flowerSpecies) {
if (tot > 0 && tot % 3 == 0) {
x -= 54;
y += 18;
}
ItemStack stack = BotanyCore.getFlowerRoot().getMemberStack(vid, EnumFlowerStage.FLOWER);
ControlItemDisplay display = new ControlItemDisplay(contents, x, y);
display.setItemStack(stack);
++tot;
x += 18;
}
}
int numOfLines = 1 + (tot - 1) / 3;
new ControlText(contents, new Area(0, y - (numOfLines - 1) * 18, w2, 4 + 18 * numOfLines), I18N.localise(DatabaseConstants.BOTANY_GENOME_KEY + ".varieties"), TextJustification.MIDDLE_RIGHT);
y += th;
contents.setSize(new Point(contents.getSize().xPos(), y));
scrollable.setScrollableContent(contents);
}
}
@@ -0,0 +1,95 @@
package binnie.botany.gui.database;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import binnie.core.api.gui.IArea;
import binnie.core.gui.controls.page.ControlPage;
import binnie.core.gui.database.ModeWidgets;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import binnie.botany.Botany;
import binnie.botany.api.genetics.IFlowerColor;
import binnie.botany.api.genetics.EnumFlowerColor;
import binnie.botany.modules.ModuleFlowers;
import binnie.core.api.gui.IWidget;
import binnie.core.gui.controls.listbox.ControlListBox;
import binnie.core.gui.database.DatabaseConstants;
import binnie.core.gui.database.DatabaseTab;
import binnie.core.gui.database.IDatabaseMode;
import binnie.core.gui.database.PageBranchOverview;
import binnie.core.gui.database.PageBranchSpecies;
import binnie.core.gui.database.PageBreeder;
import binnie.core.gui.database.PageSpeciesClassification;
import binnie.core.gui.database.PageSpeciesMutations;
import binnie.core.gui.database.PageSpeciesOverview;
import binnie.core.gui.database.PageSpeciesResultant;
import binnie.core.gui.database.WindowAbstractDatabase;
import binnie.core.gui.minecraft.Window;
import binnie.core.util.I18N;
public class WindowBotanistDatabase extends WindowAbstractDatabase {
public WindowBotanistDatabase(EntityPlayer player, Side side, boolean nei) {
super(player, side, nei, ModuleFlowers.flowerBreedingSystem, 130);
}
public static Window create(EntityPlayer player, Side side, boolean nei) {
return new WindowBotanistDatabase(player, side, nei);
}
@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.title"));
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 ModeWidgets(FlowerMode.Color, this, (area, modePage) -> {
FlowerColorControlListBox listBox = new FlowerColorControlListBox(modePage, area);
List<IFlowerColor> colors = Arrays.stream(EnumFlowerColor.values()).map(EnumFlowerColor::getFlowerColorAllele).collect(Collectors.toList());
listBox.setOptions(colors);
return listBox;
}));
new PageColorMixResultant(getInfoPages(FlowerMode.Color), new DatabaseTab(Botany.instance, "color.resultant"));
new PageColorMix(getInfoPages(FlowerMode.Color), new DatabaseTab(Botany.instance, "color.further"));
new PageBreeder(getInfoPages(Mode.BREEDER), getUsername(), new DatabaseTab(Botany.instance, "breeder"));
}
@Override
protected String getModId() {
return Botany.instance.getModId();
}
@Override
protected String getBackgroundTextureName() {
return "FlowerDatabase";
}
enum FlowerMode implements IDatabaseMode {
Color;
@Override
public String getName() {
return I18N.localise(DatabaseConstants.BOTANY_TAB_KEY + "." + name().toLowerCase());
}
}
@SideOnly(Side.CLIENT)
private static class FlowerColorControlListBox extends ControlListBox<IFlowerColor> {
public FlowerColorControlListBox(ControlPage<IDatabaseMode> modePage, IArea area) {
super(modePage, area.xPos(), area.yPos(), area.width(), area.height(), 12);
}
@Override
public IWidget createOption(IFlowerColor value, int y) {
return new ControlColorOption(getContent(), value, y);
}
}
}
@@ -0,0 +1,9 @@
@ParametersAreNonnullByDefault
@MethodsReturnNonnullByDefault
@FieldsAreNonnullByDefault
package binnie.botany.gui.database;
import javax.annotation.ParametersAreNonnullByDefault;
import binnie.core.util.FieldsAreNonnullByDefault;
import mcp.MethodsReturnNonnullByDefault;
@@ -1,7 +1,7 @@
@ParametersAreNonnullByDefault
@MethodsReturnNonnullByDefault
@FieldsAreNonnullByDefault
package binnie.botany.farm;
package binnie.botany.gui;
import javax.annotation.ParametersAreNonnullByDefault;
@@ -0,0 +1,58 @@
package binnie.botany.items;
import java.util.List;
import java.util.Locale;
import net.minecraft.item.ItemStack;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import binnie.botany.modules.ModuleGardening;
import binnie.core.item.IItemMiscProvider;
import binnie.core.util.I18N;
public enum BotanyItems implements IItemMiscProvider {
POWDER_ASH,
POWDER_PULP,
POWDER_MULCH,
POWDER_SULPHUR,
POWDER_FERTILISER,
POWDER_COMPOST,
MORTAR,
WEEDKILLER;
private final String name;
BotanyItems() {
name = name().toLowerCase(Locale.ENGLISH);
}
@Override
@SideOnly(Side.CLIENT)
public void addInformation(List<String> tooltip) {
if(this == MORTAR){
tooltip.add(I18N.localise("item.botany.mortar.tooltip"));
}
}
@Override
public String getDisplayName(ItemStack stack) {
return I18N.localise("item.botany." + name + ".name");
}
@Override
public String getModelPath() {
return name;
}
@Override
public ItemStack get(int size) {
return new ItemStack(ModuleGardening.misc, size, ordinal());
}
@Override
public boolean isActive() {
return true;
}
}
@@ -0,0 +1,49 @@
package binnie.botany.items;
import java.util.List;
import java.util.Locale;
import net.minecraft.item.ItemStack;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import binnie.botany.modules.ModuleCeramic;
import binnie.core.item.IItemMiscProvider;
import binnie.core.util.I18N;
public enum CeramicItems implements IItemMiscProvider {
MORTAR;
private final String name;
CeramicItems() {
name = name().toLowerCase(Locale.ENGLISH);
}
@Override
@SideOnly(Side.CLIENT)
public void addInformation(List<String> tooltip) {
// ignored
}
@Override
public String getDisplayName(ItemStack stack) {
return I18N.localise("item.botany." + name + ".name");
}
@Override
public String getModelPath() {
return name;
}
@Override
public ItemStack get(int size) {
return new ItemStack(ModuleCeramic.misc, size, ordinal());
}
@Override
public boolean isActive() {
return true;
}
}
@@ -0,0 +1,64 @@
package binnie.botany.items;
import net.minecraft.init.Blocks;
import net.minecraft.item.ItemStack;
import binnie.core.util.I18N;
public 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();
private final int color;
private final String uid;
EnumTubeInsulate(int color, String uid) {
this.color = color;
this.uid = uid;
}
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." + uid + ".name");
}
public String getUid() {
return uid;
}
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,36 @@
package binnie.botany.items;
import binnie.core.util.I18N;
public enum EnumTubeMaterial {
COPPER(0xe3b78e, "copper"),
TIN(0xe1eef4, "tin"),
BRONZE(0xddc276, "bronze"),
IRON(0xd8d8d8, "iron");
public static final EnumTubeMaterial[] VALUES = values();
private final int color;
private final String uid;
EnumTubeMaterial(int color, String uid) {
this.color = color;
this.uid = uid;
}
public static EnumTubeMaterial get(int meta) {
return VALUES[meta % VALUES.length];
}
public String getUid() {
return uid;
}
public int getColor() {
return color;
}
public String getDisplayName() {
return I18N.localise("botany.tube.material." + uid + ".name");
}
}
Loaded 100 of 5205 files, more files were not shown because too many files have changed in this diff. Show more