Compare commits

..
96 Commits
Author SHA1 Message Date
mezz ccebafc4b5 Fix #893 Shift-Removing items from a machine prefers the hotbar
(cherry picked from commit 099e6f47e8)

Conflicts:
	src/main/java/forestry/core/utils/SlotHelper.java
2015-10-16 12:02:32 -07:00
mezz 4708ba94a8 Fix #877 TileStairs NullPointerException 2015-10-08 18:06:23 -07:00
mezz 141a1493a8 Bump version to 3.6.11 2015-10-06 21:29:45 -07:00
mezz b6c93ef188 Fix #870 Analyzer turns pollen into saplings
(cherry picked from commit 01245f32c5)

Conflicts:
	src/main/java/forestry/core/gadgets/TileAnalyzer.java
2015-10-06 21:29:28 -07:00
mezz e0fc9cbb64 Bump version to 3.6.10 2015-10-03 00:27:05 -07:00
mezz e9e48cea77 Fix #861 Worktable client crash 2015-10-03 00:27:01 -07:00
mezz 27b9b7bc57 Fix Carpenter output Dupe bug 2015-09-26 23:06:56 -07:00
Nirek-K 06b1f9fabf Allow Biogas Engine fuel tank to be drained externally.
(cherry picked from commit 81d2c1971c)
2015-09-26 19:51:33 -07:00
Nirek-K b00f92ab76 Fix #847 TradeStation not outputting items to automation (also fix insertion filtering)
(cherry picked from commit 9478ffb7c1)
2015-09-26 14:45:04 -07:00
mezz 83a41d41d3 Bump version to 3.6.8 2015-09-24 01:47:11 -07:00
Nirek-K a47fab4579 Make plantball value slightly less terrible (equal to 9 wheat, so 'slightly' better to combine wheat, still worse for things like saplings)
(cherry picked from commit 31bd1e82fd)
2015-09-24 01:46:48 -07:00
Nirek-K 07389fe1dc Fix #829 IC2 plantballs not working in fermenter
(cherry picked from commit b56a299f63)
2015-09-24 01:46:42 -07:00
mezz b276c5bb38 Fix #750 Worktable not working properly with GT Tools
(cherry picked from commit 37dd0efee2)
2015-09-24 01:09:19 -07:00
mezz b630540a26 Fix #834 Fix machine fluid handling for IFluidContainerItem
(cherry picked from commit f49bcfd020)
2015-09-22 23:20:04 -07:00
mezz 340ba2dc7c Fix #680 and Fix #750 worktable handling of tools and ItemCraftedEvent
Cleanup some derped refactoring

(cherry picked from commit 9f1b1cc474)
2015-09-12 16:59:59 -07:00
mezz 3e6c8407ff Bump version 2015-09-09 23:16:33 -07:00
mezz 87908d2a35 Merge pull request #818 from bdew/3.6-fixes
Fixes for 3.6.x - BeekeepingLogic overwriting queens with old data + OreDict use in Squeezer recipes
2015-09-09 23:13:21 -07:00
bdew a137cf8f12 Fixed BeekeepingLogic overwriting queen with old data 2015-09-09 13:38:26 +03:00
bdew 70f710231d Changed squeezer recipes to prioritize specific recipes over OD and fixed accepting items 2015-09-09 11:45:27 +03:00
mezz 7a68e04053 Fix #813 Found Chromosome with invalid Alleles 2015-09-08 13:45:16 -07:00
mezz 3c37a81617 Fix #816 Exception during loading Alveary Heater 2015-09-08 13:32:55 -07:00
mezz a9cc367623 Fix crash from missing Agrarian bee allele from older worlds 2015-07-13 20:51:45 -07:00
mezz 7757790b84 Bump version to 3.6.3 2015-06-30 20:51:04 -07:00
mezz bcdbec5b89 Fix #742 Hopper doesn't fill last spot of Carpenter inventory 2015-06-28 15:02:06 -07:00
mezz 3fcb927201 Fix issue with BeekeepingLogic cached canWork 2015-06-28 15:01:24 -07:00
mezz b374f0b23c Bump version to 3.6.2 2015-06-28 15:01:05 -07:00
mezz e9c4c416f5 Fix #739 Trade station crashes when loaded without name set 2015-06-27 21:16:48 -07:00
mezz 1b7d64a7b5 Fix #738 plain leaf blocks accept fertilizer and fruit pods do not grow 2015-06-26 22:31:37 -07:00
mezz 7b05cfd2f7 Bump version to 3.6.1 2015-06-26 22:31:37 -07:00
mezz 66fc9fbc9f Fix bees to pollinate vanilla trees again 2015-06-24 22:26:17 -07:00
mezz aa1ecd8c13 Fix #732 letter sizes 2015-06-24 21:18:36 -07:00
mezz c3453981c3 Fix #730 Crash with corrupted forestry leaves from MFR harvester 2015-06-20 20:38:19 -07:00
mezz 870eaf8725 Bump BC recipes compatible version range.
BuildcraftAPI|recipes got a breaking update in 7.0, but it only
breaks integration tables
2015-06-20 16:17:54 -07:00
mezz 2d07fea3ad Fix Analyzer block's display for trees and butterflies 2015-06-20 01:45:54 -07:00
mezz 95be941803 Fix #729 Leaves name doesn't show properly 2015-06-19 20:38:32 -07:00
mezz be16bf4491 Merge branch 'dev' into 3.6.0 2015-06-19 00:34:41 -07:00
mezz ce6aa27f44 Merge branch 'dev'
Conflicts:
	application.properties
	src/main/java/forestry/Forestry.java
	src/main/java/forestry/core/fluids/TankManager.java
	src/main/java/forestry/core/genetics/Allele.java
	src/main/java/forestry/factory/gadgets/MachineBottler.java
	src/main/java/forestry/factory/gadgets/MachineStill.java
	src/main/java/forestry/factory/gui/ContainerBottler.java
	src/main/java/forestry/plugins/PluginApiculture.java
	src/main/java/forestry/plugins/PluginCore.java
	src/main/java/forestry/plugins/PluginManager.java
	src/main/java/forestry/storage/items/ItemNaturalistBackpack.java
2015-05-21 00:48:20 -07:00
mezz bf179c91d9 Bump patch version to 3.5.6 2015-05-09 17:55:08 -07:00
Nirek-K 5fc1b10298 Add meta checking to flower weight adjustment
(cherry picked from commit 49deb75278)
2015-05-09 17:54:44 -07:00
Nirek-K 23b8f8b892 #Fix 646 Move plantables registration to not be smashed by acceptable.
(cherry picked from commit c705486472)
2015-05-09 17:52:54 -07:00
Nirek-K 1598946632 Fix #650 Fix logic errors in bee planting
(cherry picked from commit d29f4c0b79)
2015-05-09 17:52:34 -07:00
mezz aad6dbaa3f Bump patch version to 3.5.5 2015-05-09 17:41:13 -07:00
mezz ca6cc89015 Fix #652 Bottler liquid dupe bug on server
(cherry picked from commit d5296fbc60)
2015-05-09 17:39:52 -07:00
Nirek-K 7a22f1d939 Fix #644 Make Clockwork engine recipe OreDictionary aware. 2015-05-09 00:15:28 -07:00
mezz feda84fbc6 bump patch version 2015-04-18 13:13:39 -07:00
mezz f7b36e11d1 Fix compatibility with Forge 10.13.3.x fluid changes 2015-04-18 13:08:25 -07:00
mezz cfbab6b988 Fix #597 Crash from Butterfly Genome.getActiveAllele 2015-04-06 21:20:03 -07:00
mezz 3978a068d1 Bump minor patch version 2015-04-05 21:15:14 -07:00
mezz 9d2d0af432 Fix #594 Crash in Natura plugin
(cherry picked from commit 689adab411)
2015-04-05 21:14:56 -07:00
mezz d451309170 bump patch version to 3.5.1 2015-04-05 20:28:27 -07:00
mezz c82dd0fbfb Fix #592 Some Crates are missing a recipe 2015-04-05 20:22:21 -07:00
mezz 803911e10a Fix #588 crash on crate registry with disabled storage module and natura
(cherry picked from commit 536254af42)
2015-04-05 20:20:40 -07:00
Nirek-K 29eedf9011 Fix #588 Bulletproof null checks for Natura Plugin
(cherry picked from commit 3f6f12f7cc)
2015-04-05 20:15:05 -07:00
mezz 882848a00f Revert "Close #441 Add Underground Biomes Constructs integration"
This reverts commit b3b1a6a415.

Conflicts:
	lang
	src/main/java/forestry/Forestry.java
	src/main/java/forestry/plugins/PluginManager.java

(cherry picked from commit 1ca041a29f)

Conflicts:
	src/main/java/forestry/plugins/PluginManager.java
2015-04-04 19:44:15 -07:00
mezz 4d253e1dd6 Merge branch 'dev' into release_3.5
Conflicts:
	src/main/java/forestry/apiculture/worldgen/HiveGenHelper.java
2015-03-26 23:02:38 -07:00
mezz 4d7988ee0f Merge branch 'dev' into release_3.4
Conflicts:
	application.properties
	src/main/java/forestry/apiculture/gadgets/TileSwarm.java
	src/main/java/forestry/apiculture/genetics/Bee.java
	src/main/java/forestry/arboriculture/gadgets/ForestryBlockLeaves.java
	src/main/java/forestry/core/config/Config.java
	src/main/java/forestry/core/gui/widgets/ReservoirWidget.java
	src/main/java/forestry/core/utils/BlockUtil.java
	src/main/java/forestry/energy/EnergyManager.java
	src/main/java/forestry/factory/gadgets/MachineCarpenter.java
	src/main/java/forestry/mail/gui/GuiCatalogue.java
	src/main/java/forestry/plugins/PluginArboriculture.java
2015-02-16 15:00:16 -08:00
CovertJaguar fcad67a1c2 Update lang 2015-01-29 14:45:38 -08:00
mezz 1bd3b61df9 Fix #480 Increase hive spawn rate 25%, add config option for spawn rate
(cherry picked from commit 56dfae034d)

Conflicts:
	src/main/java/forestry/apiculture/worldgen/HiveDecorator.java
2015-01-29 00:11:35 -08:00
mezz 060ca1eb80 Fix #479 Try to make sure hives are always glowing
(cherry picked from commit 636201ce5a)
2015-01-29 00:09:47 -08:00
mezz 98a2d9c65e Fix bee biome temperature check for nether biomes
(cherry picked from commit c3f37a379a)
2015-01-25 22:26:39 -08:00
mezz eb010094ca Fix crash from missing block when a plugin mod is uninstalled
(cherry picked from commit 5a7bd9f57a)
2015-01-25 22:25:36 -08:00
mezz e6cbced8a2 #457 Add config option for village generation (forgot lumberjack) 2015-01-24 00:25:50 -08:00
mezz d300078227 Close #457 Add config option for village generation
(cherry picked from commit dab217eab0)
2015-01-24 00:21:56 -08:00
mezz 65c7f0242c Fix #470 Engines don't output to other mods' machines
(cherry picked from commit dffa845851)
2015-01-23 23:27:46 -08:00
mezz c4140ef9c3 Fix #472 Crash with Thaumic Tinkerer Ichorium Axe
(cherry picked from commit 1aefd5863e)
2015-01-23 23:26:54 -08:00
mezz 389e5e01e7 Fix #467 Carpenter automation
(cherry picked from commit c6dae0318c)
2015-01-23 22:34:21 -08:00
mezz a55b2645b7 Fix #465 crash after closing catalogue and opening another item gui
(cherry picked from commit dc1449855e)
2015-01-23 22:33:46 -08:00
mezz 9a36381ce0 Fix possible reservoir crash from thermionic fabricator
(cherry picked from commit 195c8fc524)
2015-01-23 22:32:37 -08:00
CovertJaguar 2565eea5ba Set version to 3.4 2015-01-17 20:44:55 -08:00
CovertJaguar 13ae9ece47 Fix submodule issues 2015-01-17 20:36:25 -08:00
CovertJaguar d3e87b1aaf Merge branch 'dev' into release_3.4
Conflicts:
	application.properties
	src/main/java/forestry/apiculture/gadgets/TileAlvearyHygroregulator.java
	src/main/java/forestry/apiculture/gadgets/TileAlvearyPlain.java
	src/main/java/forestry/apiculture/gadgets/TileAlvearySwarmer.java
	src/main/java/forestry/apiculture/worldgen/HiveDecorator.java
	src/main/java/forestry/apiculture/worldgen/HiveForest.java
	src/main/java/forestry/apiculture/worldgen/HiveGen.java
	src/main/java/forestry/apiculture/worldgen/HiveGenHelper.java
	src/main/java/forestry/apiculture/worldgen/HiveMeadows.java
	src/main/java/forestry/apiculture/worldgen/HiveSnow.java
	src/main/java/forestry/apiculture/worldgen/HiveSwamp.java
	src/main/java/forestry/apiculture/worldgen/HiveSwarmer.java
	src/main/java/forestry/core/gui/ContainerForestry.java
	src/main/java/forestry/core/utils/RecipeUtil.java
	src/main/java/forestry/factory/gadgets/TileWorktable.java
	src/main/java/forestry/factory/gui/ContainerFabricator.java
	src/main/java/forestry/factory/gui/ContainerWorktable.java
	src/main/java/forestry/factory/recipes/RecipeMemory.java
2015-01-17 20:33:15 -08:00
CovertJaguar 990d4990db Fix lang 2014-12-14 21:39:45 -08:00
mezz ce232e808e Fix Alveary Swarmer and Swarm Hive
(cherry picked from commit 2577ee9c930cdc91bdf3d207cbeaaebbe1141257)

Conflicts:
	src/main/java/forestry/apiculture/gadgets/TileAlvearySwarmer.java
2014-12-09 01:08:14 -08:00
mezz 31574a9c6e Cleanup
(cherry picked from commit 4f95ceab29)
2014-12-09 01:03:05 -08:00
mezz cd9a4110ee Refactor out worktable canCraftRecipe logic to RecipeUtil 2014-12-08 20:26:51 -08:00
mezz 6b35ff2ba1 Improve null safety of memorized recipe isValid check
(cherry picked from commit 23ffb78ab3)
2014-12-07 16:25:01 -08:00
mezz 5133e721cc Add blacklist to worktable memory, blacklist non-empty maps
(cherry picked from commit 2cb1959421)
2014-12-07 16:18:23 -08:00
mezz 09ced92f5b Support left click drag on Worktable
(cherry picked from commit 029604222c)
2014-12-07 16:18:17 -08:00
mezz 12477a7711 Fix crash when crafting with a Map on a Worktable 2014-12-07 16:17:21 -08:00
mezz b7dc4d9144 Fix #359 Crafting with a worktable does not trigger achievements.
(cherry picked from commit c010977a0b)
2014-12-07 16:16:24 -08:00
mezz da48d317ff Fix #362 Missing Analyzer Crafting recipe
(cherry picked from commit 7ffb9d5c1d)
2014-12-07 15:32:02 -08:00
mezz 5bfb11e952 Fix #353 Alveary heater/fan energy consumption, animation
(cherry picked from commit 475d99eae8)
2014-12-07 15:30:30 -08:00
mezz 4dffb9f352 Fix biome error in Alveary
(cherry picked from commit d0244ece32)
2014-12-07 15:30:20 -08:00
mezz beadb47539 Fix #356 Worktable using the wrong wood with Shift-use all
(cherry picked from commit 0105f36668)
2014-12-07 15:30:08 -08:00
mezz 6301d3c193 Fix #357 Forestry stained glass not silk touchable
(cherry picked from commit ab3ba0c4db)
2014-12-07 15:30:02 -08:00
mezz 883863e047 Safety check for IC2 Plugin. #351
(cherry picked from commit 38009bb32a)
2014-12-07 15:29:42 -08:00
mezz 2c14f02151 Fix #352 Backpack deletion/duplication bug
(cherry picked from commit d827a0f132)
2014-12-07 15:29:07 -08:00
CovertJaguar 00771b1a42 Bump version 2014-11-30 17:22:40 -08:00
CovertJaguar 46ec2f2740 Merge branch 'dev' into release_3.3 2014-11-30 17:21:03 -08:00
mezz ac653d46c1 Fix #326 decorative leaves should not pollinate 2014-11-15 04:15:20 -08:00
mezz 63d9935d01 Minor code cleanup 2014-11-15 04:15:14 -08:00
mezz ba695b977d Fix #325 Centrifuge dupe bug 2014-11-15 04:13:46 -08:00
CovertJaguar 6b1dfb1596 Set submodules 2014-11-15 04:12:44 -08:00
CovertJaguar fff02be71d Bump version to 3.2 2014-11-08 21:40:45 -08:00
CovertJaguar 0e5b9e4957 Merge branch 'dev' into release_3.2
Conflicts:
	src/main/resources/assets/forestry/textures/blocks/storage/apatite.png
	src/main/resources/assets/forestry/textures/blocks/storage/bronze.png
	src/main/resources/assets/forestry/textures/blocks/storage/copper.png
	src/main/resources/assets/forestry/textures/blocks/storage/tin.png
2014-11-08 21:39:26 -08:00
MysteriousAges 3415030fbf Revert "Storage block textures - Apatite, Bronze, Copper, Tin."
This reverts commit c8fd93873a.
2014-10-24 20:18:30 -07:00
1370 changed files with 41759 additions and 54950 deletions

No files matched your search

+2 -4
View File
@@ -6,7 +6,6 @@
!/gradle/wrapper
!/src
!/api
!/test
# files
!/.gitignore
@@ -16,9 +15,8 @@
!/LICENSE.txt
!/license-header.txt
!/README.md
!/gradle.properties
!/application.properties
!/build.gradle
!/build.xml
!/gradlew
!/gradlew.bat
.DS_Store
!/gradlew.bat
+1 -1
View File
@@ -3,7 +3,7 @@
url = https://github.com/ForestryMC/Forestry-Localization.git
[submodule "api/redstoneflux"]
path = api/redstoneflux
url = https://github.com/Texasjake95/RedstoneFlux-API.git
url = https://github.com/CoFH/RedstoneFlux-API.git
[submodule "api/forestry"]
path = api/forestry
url = https://github.com/ForestryMC/ForestryAPI.git
+1 -1
View File
@@ -31,7 +31,7 @@ Beware of ugly code.
Bugfixes are generally welcome. If you want to contribute something which changes game mechanics, please talk to someone with commit privileges first. Nothing is more frustrating than putting a lot of work and effort into a new game mechanic and then having the PR rejected because it doesn’t fit gameplay-wise.
**If you submit a PR you must accept the [Contributor License Agreement](https://cla-assistant.io/ForestryMC/ForestryMC). There is no way around that, since otherwise changing the license later - even to something more permissive! - , becomes close to impossible.**
**If you submit a PR you must accept the [Contributor License Agreement](https://www.clahub.com/agreements/ForestryMC/ForestryMC). There is no way around that, since otherwise changing the license later - even to something more permissive! - , becomes close to impossible.**
### License & Copyright
+5
View File
@@ -0,0 +1,5 @@
mcversion=1.7.10
forgeversion=10.13.3.1370-1.7.10
version_major=3
version_minor=6
version_patch=12
+164 -73
View File
@@ -19,7 +19,8 @@ buildscript {
apply plugin: 'forge'
apply plugin: 'maven'
apply plugin: 'java'
loadProperties()
version = version_major + '.' + version_minor + '.' + version_patch + '.' + getBuildNumber()
if (project.hasProperty('buildQualifier')) {
@@ -34,11 +35,8 @@ ext.dirLang = "./lang"
ext.apiForestry = "./api/forestry"
ext.apiRedstoneFlux = "./api/redstoneflux"
// java version
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
sourceCompatibility = 1.8
targetCompatibility = 1.8
ext.CraftGuideRepo = "https://github.com/Uristqwerty/CraftGuide.git"
ext.CraftGuideTmp = "build/tmp/CraftGuide"
minecraft {
version = mcversion + "-" + forgeversion
@@ -46,11 +44,16 @@ minecraft {
replace '@VERSION@', project.version
replace '@BUILD_NUMBER@', getBuildNumber()
srgExtra "PK: chylex/javacheck forestry/shade/javacheck"
}
sourceSets {
api {
java {
srcDir CraftGuideTmp + "/src"
include '**/CraftGuide/api/**'
}
}
main {
java {
srcDir project.apiForestry
@@ -71,39 +74,16 @@ repositories {
name "BuildCraft"
artifactPattern "http://www.mod-buildcraft.com/releases/BuildCraft/[revision]/[module]-[revision]-[classifier].[ext]"
}
maven {
name = "chickenbones"
url = "http://chickenbones.net/maven/"
}
maven{
name "tterrag Repo"
url "http://maven.tterrag.com/"
}
}
configurations {
api
compile.extendsFrom api
//shade
//compile.extendsFrom shade
}
dependencies {
api 'net.industrial-craft:industrialcraft-2:2.2.790-experimental:api'
api name: "buildcraft", version: "7.1.12", classifier: "api"
// http://files.minecraftforge.net/CodeChickenLib/
compile "codechicken:CodeChickenLib:1.7.10-1.1.3.140:dev"
// http://chickenbones.net/maven
compile "codechicken:CodeChickenCore:1.7.10-1.0.7.47:dev"
compile "codechicken:NotEnoughItems:1.7.10-1.0.5.111:dev"
compile "codechicken:NotEnoughItems:1.7.10-1.0.5.111:src"
// http://maven.tterrag.com/
//shade "chylex.javacheck:JavaChecker:v1.2-b1"
testCompile 'junit:junit:4.12'
api 'net.industrial-craft:industrialcraft-2:2.2.713-experimental:api'
api name: "buildcraft", version: "6.4.10", classifier: "dev"
}
processResources {
@@ -145,6 +125,62 @@ debugClient {
}
}
task echoVersion << {
printNextVersion()
}
def saveVersion() {
ant.propertyfile(
file: "application.properties") {
entry( key:"version_major", type:"int", value: version_major)
entry( key:"version_minor", type:"int", value: version_minor)
entry( key:"version_patch", type:"int", value: version_patch)
}
project.version = version_major + '.' + version_minor + '.' + version_patch + '.' + getBuildNumber()
printNextVersion()
}
def printNextVersion() {
println '*************************************************************'
println 'The next build will be version: ' + project.version
println '*************************************************************'
}
task bumpMajor << {
project.version_major = Integer.parseInt(project.version_major) + 1
project.version_minor = "0"
project.version_patch = "0"
saveVersion()
}
task bumpMinor << {
project.version_minor = Integer.parseInt(project.version_minor) + 1
project.version_patch = "0"
saveVersion()
}
task bumpPatch << {
project.version_patch = Integer.parseInt(project.version_patch) + 1
saveVersion()
}
import org.ajoberstar.grgit.Grgit
task initCraftGuide << {
def localRepo = file(CraftGuideTmp)
if (localRepo.exists()) {
println 'Updating CraftGuide repo'
def grgit = Grgit.open(localRepo)
grgit.pull()
grgit.close()
} else {
println 'Cloning CraftGuide repo'
def grgit = Grgit.clone(dir: localRepo, uri: CraftGuideRepo)
grgit.close()
}
}
jar {
destinationDir = file("build/tmp")
archiveName = "main.jar"
@@ -156,79 +192,124 @@ jar {
into ('cofh/api') {
from project.apiRedstoneFlux + "/LICENSE - LGPLv3.txt"
}
into ('invtweaks/api') {
from "./src/main/java/invtweaks/LICENSE.txt"
into ('buildcraft/api') {
from "./src/main/java/buildcraft/LICENSE-API"
}
//configurations.shade.each{ dep ->
// from(project.zipTree(dep)){
// exclude 'META-INF', 'META-INF/**', 'mcmod.info'
// }
//}
}
task mainJar(type: Jar, dependsOn: 'reobf') {
task mainJarSigned ( type: Jar, dependsOn: 'reobf' ) {
from (zipTree(jar.getArchivePath())) {
exclude '**/api/**'
exclude '**/codechicken/**'
}
duplicatesStrategy = DuplicatesStrategy.EXCLUDE
destinationDir = file("build/tmp")
archiveName = "signed.jar"
doLast {
if (project.hasProperty('signingKeystore')) {
ant.signjar(jar: getArchivePath(),
alias: signingAlias,
keystore: signingKeystore,
storepass: signingStorepass)
} else {
println 'Signing disabled, gradle.properties is missing.'
}
}
}
task mainJar ( type: Zip, dependsOn: mainJarSigned ) {
from (zipTree(mainJarSigned.getArchivePath())) {
include '**'
}
from (zipTree(jar.getArchivePath())) {
include '**'
exclude '**/codechicken/**'
exclude '**/uristqwerty/**'
}
destinationDir = file(dirDest)
duplicatesStrategy = DuplicatesStrategy.EXCLUDE
destinationDir = file(dirDest)
includeEmptyDirs = false
extension = 'jar'
}
manifest{
//attributes 'TweakClass': 'forestry.shade.javacheck.Java7Checker'
task devJarSigned ( type: Jar, dependsOn: 'classes' ) {
from(sourceSets.main.output) {
exclude '**/api/**'
exclude '**/codechicken/**'
}
destinationDir = file("build/tmp")
archiveName = "signed-dev.jar"
doLast {
if (project.hasProperty('signingKeystore')) {
ant.signjar(jar: getArchivePath(),
alias: signingAlias,
keystore: signingKeystore,
storepass: signingStorepass)
} else {
println 'Signing disabled, gradle.properties is missing.'
}
}
}
task devJar(type: Jar, dependsOn: 'classes') {
from (sourceSets.main.output) {
exclude '**/codechicken/**'
exclude '**/uristqwerty/**'
task devJar ( type: Zip, dependsOn: devJarSigned ) {
from (zipTree(devJarSigned.getArchivePath())) {
include '**'
}
from(sourceSets.main.allSource) {
include '**'
exclude '**/codechicken/**'
}
from(sourceSets.main.output) {
include '**'
exclude '**/codechicken/**'
}
destinationDir = file(dirDest)
duplicatesStrategy = DuplicatesStrategy.EXCLUDE
includeEmptyDirs = false
destinationDir = file(dirDest)
extension = 'jar'
classifier = 'dev'
}
task apiJar(type: Jar, dependsOn: 'classes') {
from project.apiForestry
from(sourceSets.main.output) {
from (sourceSets.main.output) {
include 'forestry/api/**'
}
destinationDir = file(dirDest)
duplicatesStrategy = DuplicatesStrategy.EXCLUDE
includeEmptyDirs = false
extension = 'jar'
classifier = 'api'
}
task sourceJar(type: Jar, dependsOn: 'classes') {
from (sourceSets.main.allSource) {
exclude '**/codechicken/**'
exclude '**/uristqwerty/**'
}
destinationDir = file(dirDest)
duplicatesStrategy = DuplicatesStrategy.EXCLUDE
includeEmptyDirs = false
classifier = 'sources'
task releaseInit << {
println '*************************************************************'
println 'This build will be version: ' + rootProject.version
println '*************************************************************'
}
task release (dependsOn: [mainJar, apiJar, devJar, sourceJar]) {
task release (dependsOn: [releaseInit, apiJar, devJar, mainJar]) {
}
mainJar.shouldRunAfter releaseInit
devJar.shouldRunAfter releaseInit
apiJar.shouldRunAfter releaseInit
afterEvaluate {
compileApiJava.dependsOn initCraftGuide
}
artifacts {
archives apiJar
archives devJar
archives sourceJar
}
uploadArchives {
@@ -243,9 +324,6 @@ uploadArchives {
addFilter('dev') { artifact, file ->
file == devJar.archivePath
}
addFilter('source') { artifact, file ->
file == sourceJar.archivePath
}
}
} else {
println 'Archives upload disabled, gradle.properties is missing.'
@@ -253,6 +331,19 @@ uploadArchives {
}
}
def loadProperties() {
println('loading application.properties')
file("application.properties").withReader { reader ->
def userProps = new Properties()
userProps.load(reader)
for (Map.Entry property in userProps) {
project.ext[property.getKey()] = property.getValue()
}
}
}
def getBuildNumber() {
return "$System.env.BUILD_NUMBER" != "null" ? "$System.env.BUILD_NUMBER" : "0"
}
-1
View File
@@ -3,4 +3,3 @@ samtrion;[email protected];2015-01-18
GenuineSounds;[email protected];2015-02-26
airbreather;[email protected];2015-04-10
ganymedes01;[email protected];2015-05-27
infinityraider;theoneandonlyraider@gmail;com;2015-10-03
-5
View File
@@ -1,5 +0,0 @@
mcversion=1.7.10
forgeversion=10.13.4.1614-1.7.10
version_major=4
version_minor=2
version_patch=20
+1 -1
View File
@@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-2.0-bin.zip
+1 -1
Submodule lang updated: 4cfdcf1595...e111b835ad.
@@ -1,21 +1,21 @@
The MIT License (MIT)
Copyright (c) 2013 "Erogenous Beef"
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
BuildCraft API License
Copyright (c) 2011-2014 SpaceToad and the BuildCraft team
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
@@ -0,0 +1,40 @@
/**
* Copyright (c) 2011-2014, SpaceToad and the BuildCraft Team
* http://www.mod-buildcraft.com
*
* The BuildCraft API is distributed under the terms of the MIT License.
* Please check the contents of the license, which should be located
* as "LICENSE.API" in the BuildCraft source code distribution.
*/
package buildcraft.api.tools;
import net.minecraft.entity.player.EntityPlayer;
/***
* Implement this interface on subclasses of Item to have that item work as a wrench for buildcraft
*/
public interface IToolWrench {
/***
* Called to ensure that the wrench can be used. To get the ItemStack that is used, check player.inventory.getCurrentItem()
*
* @param player
* - The player doing the wrenching
* @param x
* ,y,z - The coordinates for the block being wrenched
*
* @return true if wrenching is allowed, false if not
*/
boolean canWrench(EntityPlayer player, int x, int y, int z);
/***
* Callback after the wrench has been used. This can be used to decrease durability or for other purposes. To get the ItemStack that was used, check
* player.inventory.getCurrentItem()
*
* @param player
* - The player doing the wrenching
* @param x
* ,y,z - The coordinates of the block being wrenched
*/
void wrenchUsed(EntityPlayer player, int x, int y, int z);
}
@@ -0,0 +1,11 @@
/**
* Copyright (c) 2011-2014, SpaceToad and the BuildCraft Team
* http://www.mod-buildcraft.com
*
* The BuildCraft API is distributed under the terms of the MIT License.
* Please check the contents of the license, which should be located
* as "LICENSE.API" in the BuildCraft source code distribution.
*/
@API(apiVersion = "1.0", owner = "BuildCraftAPI|core", provides = "BuildCraftAPI|tools")
package buildcraft.api.tools;
import cpw.mods.fml.common.API;
@@ -1,21 +1,21 @@
The MIT License (MIT)
Copyright (c) 2014 Uristqwerty
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
The MIT License (MIT)
Copyright (c) 2014 ChickenBones
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
@@ -0,0 +1,38 @@
package codechicken.nei;
public class VisiblityData
{
public boolean showUtilityButtons = true;
public boolean showStateButtons = true;
/**
* Item panel and associated buttons
*/
public boolean showItemPanel = true;
/**
* Item and search section
*/
public boolean showItemSection = true;
/**
* Dropdown and Item search field
*/
public boolean showSearchSection = true;
/**
* All widgets except options button
*/
public boolean showWidgets = true;
/**
* The entire NEI interface, aka hidden
*/
public boolean showNEI = true;
public boolean enableDeleteMode = true;
public void translateDependancies()
{
if(!showNEI)
showWidgets = false;
if(!showWidgets)
showItemSection = showUtilityButtons = showStateButtons = false;
if(!showItemSection)
showSearchSection = showItemPanel = false;
}
}
@@ -0,0 +1,49 @@
package codechicken.nei.api;
import codechicken.nei.VisiblityData;
import net.minecraft.client.gui.inventory.GuiContainer;
import net.minecraft.item.ItemStack;
import java.util.List;
/**
* If this is implemented on a gui, it will be automatically registered
*/
public interface INEIGuiHandler
{
public VisiblityData modifyVisiblity(GuiContainer gui, VisiblityData currentVisibility);
/**
* NEI will give the specified item to the InventoryRange returned if the player's inventory is full.
* return null for no range
*/
public Iterable<Integer> getItemSpawnSlots(GuiContainer gui, ItemStack item);
/**
* @return A list of TaggedInventoryAreas that will be used with the savestates.
*/
public List<TaggedInventoryArea> getInventoryAreas(GuiContainer gui);
/**
* Handles clicks while an itemstack has been dragged from the item panel. Use this to set configurable slots and the like.
* Changes made to the stackSize of the dragged stack will be kept
* @param gui The current gui instance
* @param mousex The x position of the mouse
* @param mousey The y position of the mouse
* @param draggedStack The stack being dragged from the item panel
* @param button The button presed
* @return True if the drag n drop was handled. False to resume processing through other routes. The held stack will be deleted if draggedStack.stackSize == 0
*/
public boolean handleDragNDrop(GuiContainer gui, int mousex, int mousey, ItemStack draggedStack, int button);
/**
* Used to prevent the item panel from drawing on top of other gui elements.
* This function will also be called with a 1x1 size rectangle on the mouse position for determining if the given coordinate should override item panel functions such as scrolling
* @param x The x coordinate of the rectangle bounding the slot
* @param y The y coordinate of the rectangle bounding the slot
* @param w The w coordinate of the rectangle bounding the slot
* @param h The h coordinate of the rectangle bounding the slot
* @return true if the item panel slot within the specified rectangle should not be rendered.
*/
public boolean hideItemPanelSlot(GuiContainer gui, int x, int y, int w, int h);
}
@@ -0,0 +1,48 @@
package codechicken.nei.api;
import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.inventory.Container;
import net.minecraft.inventory.IInventory;
import net.minecraft.item.ItemStack;
import java.util.HashSet;
public class TaggedInventoryArea
{
public HashSet<Integer> slots = new HashSet<Integer>();
public String tagName;
/**
* Only for player inventories.
*/
private IInventory inventory;
/**
* Other inventories
*/
private Container container;
public TaggedInventoryArea(InventoryPlayer invPlayer)
{
this("InventoryPlayer", 0, 39, null);
inventory = invPlayer;
}
public TaggedInventoryArea(String name, int first, int last, Container container)
{
this.container = container;
tagName = name;
for(int i = first; i <= last; i++)
slots.add(i);
}
public ItemStack getStackInSlot(int i)
{
if(inventory != null)
return inventory.getStackInSlot(i);
return container.getSlot(i).getStack();
}
public boolean isContainer()
{
return inventory == null;
}
}
+69 -62
View File
@@ -11,43 +11,41 @@
package forestry;
import java.io.File;
import java.util.HashMap;
import java.util.Map;
import net.minecraft.block.Block;
import net.minecraft.item.Item;
import net.minecraftforge.common.MinecraftForge;
import cpw.mods.fml.common.FMLCommonHandler;
import cpw.mods.fml.common.Mod;
import cpw.mods.fml.common.Mod.EventHandler;
import cpw.mods.fml.common.SidedProxy;
import cpw.mods.fml.common.event.FMLInitializationEvent;
import cpw.mods.fml.common.event.FMLInterModComms;
import cpw.mods.fml.common.event.FMLInterModComms.IMCEvent;
import cpw.mods.fml.common.event.FMLMissingMappingsEvent;
import cpw.mods.fml.common.event.FMLMissingMappingsEvent.MissingMapping;
import cpw.mods.fml.common.event.FMLPostInitializationEvent;
import cpw.mods.fml.common.event.FMLPreInitializationEvent;
import cpw.mods.fml.common.event.FMLServerStartingEvent;
import cpw.mods.fml.common.network.NetworkRegistry;
import cpw.mods.fml.common.registry.GameRegistry;
import cpw.mods.fml.common.registry.GameRegistry.Type;
import forestry.api.core.ForestryAPI;
import forestry.core.EventHandlerCore;
import forestry.core.config.Config;
import forestry.core.config.Constants;
import forestry.core.config.GameMode;
import forestry.api.fuels.EngineBronzeFuel;
import forestry.api.fuels.EngineCopperFuel;
import forestry.api.fuels.FermenterFuel;
import forestry.api.fuels.FuelManager;
import forestry.api.fuels.GeneratorFuel;
import forestry.api.fuels.MoistenerFuel;
import forestry.api.fuels.RainSubstrate;
import forestry.core.ForestryCore;
import forestry.core.config.Defaults;
import forestry.core.config.ForestryItem;
import forestry.core.config.Version;
import forestry.core.errors.EnumErrorCode;
import forestry.core.errors.ErrorStateRegistry;
import forestry.core.gui.GuiHandler;
import forestry.core.multiblock.MultiblockEventHandler;
import forestry.core.network.PacketHandler;
import forestry.core.proxy.Proxies;
import forestry.core.utils.Log;
import forestry.core.utils.FluidMap;
import forestry.core.utils.ItemStackMap;
import forestry.core.utils.StringUtil;
import forestry.core.worldgen.WorldGenerator;
import forestry.plugins.PluginManager;
/**
* Forestry Minecraft Mod
@@ -55,103 +53,112 @@ import forestry.plugins.PluginManager;
* @author SirSengir
*/
@Mod(
modid = Constants.MOD,
modid = Defaults.MOD,
name = "Forestry",
version = Version.VERSION,
guiFactory = "forestry.core.config.ForestryGuiConfigFactory",
dependencies = "required-after:Forge@[10.13.4.1566,);"
dependencies = "required-after:Forge@[10.13.0.1207,);"
+ "after:Buildcraft|Core@[6.1.7,);"
+ "after:ExtrabiomesXL;"
+ "after:BiomesOPlenty;"
+ "after:IC2@[2.0.140,);"
+ "after:Natura@[2.2.0,);"
+ "after:HardcoreEnderExpansion;")
//, certificateFingerprint = Version.FINGERPRINT)
public class Forestry {
@Mod.Instance(Constants.MOD)
@Mod.Instance(Defaults.MOD)
public static Forestry instance;
private File configFolder;
public Forestry() {
ForestryAPI.instance = this;
ForestryAPI.forestryConstants = new Constants();
ForestryAPI.errorStateRegistry = new ErrorStateRegistry();
EnumErrorCode.init();
private static final Map<String, ForestryItem> mappedItems = new HashMap<String, ForestryItem>();
static {
mappedItems.put("Forestry:builderBackpack", ForestryItem.builderBackpack);
mappedItems.put("Forestry:builderBackpackT2", ForestryItem.builderBackpackT2);
mappedItems.put("Forestry:adventurerBackpack", ForestryItem.adventurerBackpack);
mappedItems.put("Forestry:adventurerBackpackT2", ForestryItem.adventurerBackpackT2);
mappedItems.put("Forestry:shortMead", ForestryItem.beverage);
mappedItems.put("Forestry:waterCan", ForestryItem.canWater);
mappedItems.put("Forestry:biofuelCan", ForestryItem.canEthanol);
mappedItems.put("Forestry:biomassCan", ForestryItem.canBiomass);
mappedItems.put("Forestry:bucketBiofuel", ForestryItem.bucketEthanol);
mappedItems.put("Forestry:refractoryBiofuel", ForestryItem.refractoryEthanol);
mappedItems.put("Forestry:waxCapsuleBiofuel", ForestryItem.waxCapsuleEthanol);
}
public Forestry() {
FuelManager.fermenterFuel = new ItemStackMap<FermenterFuel>();
FuelManager.moistenerResource = new ItemStackMap<MoistenerFuel>();
FuelManager.rainSubstrate = new ItemStackMap<RainSubstrate>();
FuelManager.bronzeEngineFuel = new FluidMap<EngineBronzeFuel>();
FuelManager.copperEngineFuel = new ItemStackMap<EngineCopperFuel>();
FuelManager.generatorFuel = new FluidMap<GeneratorFuel>();
}
@SidedProxy(clientSide = "forestry.core.ForestryClient", serverSide = "forestry.core.ForestryCore")
public static ForestryCore core = new ForestryCore();
public static PacketHandler packetHandler;
@EventHandler
public void preInit(FMLPreInitializationEvent event) {
packetHandler = new PacketHandler();
// Register event handler
EventHandlerCore eventHandlerCore = new EventHandlerCore();
MinecraftForge.EVENT_BUS.register(eventHandlerCore);
FMLCommonHandler.instance().bus().register(eventHandlerCore);
MinecraftForge.EVENT_BUS.register(new MultiblockEventHandler());
configFolder = new File(event.getModConfigurationDirectory(), "forestry");
Config.load();
PluginManager.runSetup();
ForestryAPI.activeMode = new GameMode(Config.gameMode);
PluginManager.runPreInit();
core.preInit(event.getSourceFile(), this);
}
@EventHandler
public void init(FMLInitializationEvent event) {
// Register gui handler
NetworkRegistry.INSTANCE.registerGuiHandler(this, new GuiHandler());
PluginManager.runInit();
core.init(this);
}
@EventHandler
public void postInit(FMLPostInitializationEvent event) {
PluginManager.runPostInit();
// Register world generator
WorldGenerator worldGenerator = new WorldGenerator();
GameRegistry.registerWorldGenerator(worldGenerator, 0);
// Register tick handlers
Proxies.common.registerTickHandlers(worldGenerator);
// Handle IMC messages.
PluginManager.processIMCMessages(FMLInterModComms.fetchRuntimeMessages(ForestryAPI.instance));
core.postInit();
}
@EventHandler
public void serverStarting(FMLServerStartingEvent event) {
PluginManager.serverStarting(event.getServer());
core.serverStarting(event.getServer());
}
public File getConfigFolder() {
return configFolder;
}
/*@EventHandler
public void fingerprintWarning(FMLFingerprintViolationEvent event) {
Proxies.log.info("Fingerprint of the mod jar is invalid. The jar file was tampered with.");
FMLInterModComms.sendMessage("Railcraft", "securityViolation", "Fingerprint of jar file did not match.");
FMLInterModComms.sendMessage("Thaumcraft", "securityViolation", "Fingerprint of jar file did not match.");
FMLInterModComms.sendMessage("IC2", "securityViolation", "Fingerprint of jar file did not match.");
}*/
@EventHandler
public void processIMCMessages(IMCEvent event) {
PluginManager.processIMCMessages(event.getMessages());
core.processIMCMessages(event.getMessages());
}
@EventHandler
public void missingMapping(FMLMissingMappingsEvent event) {
for (MissingMapping mapping : event.get()) {
if (mapping.type == Type.BLOCK) {
Block block = GameRegistry.findBlock(Constants.MOD, StringUtil.cleanTags(mapping.name));
Block block = GameRegistry.findBlock(Defaults.MOD, StringUtil.cleanTags(mapping.name));
if (block != null) {
mapping.remap(block);
Log.warning("Remapping block " + mapping.name + " to " + StringUtil.cleanBlockName(block));
Proxies.log.warning("Remapping block " + mapping.name + " to " + StringUtil.cleanBlockName(block));
}
} else {
Item item = GameRegistry.findItem(Constants.MOD, StringUtil.cleanTags(mapping.name));
if (item != null) {
mapping.remap(item);
Log.warning("Remapping item " + mapping.name + " to " + StringUtil.cleanItemName(item));
Block block = GameRegistry.findBlock(Defaults.MOD, StringUtil.cleanTags(mapping.name));
if (block != null) {
mapping.remap(Item.getItemFromBlock(block));
Proxies.log.warning("Remapping item " + mapping.name + " to " + StringUtil.cleanBlockName(block));
} else {
ForestryItem mappedItem = mappedItems.get(mapping.name);
if (mappedItem != null) {
mapping.remap(mappedItem.item());
Proxies.log.warning("Remapping item " + mapping.name + " to " + mappedItem.name());
}
}
}
}
@@ -1,21 +0,0 @@
/*******************************************************************************
* Copyright (c) 2011-2014 SirSengir.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU Lesser Public License v3
* which accompanies this distribution, and is available at
* http://www.gnu.org/licenses/lgpl-3.0.txt
*
* Various Contributors including, but not limited to:
* SirSengir (original work), CovertJaguar, Player, Binnie, MysteriousAges
******************************************************************************/
package forestry.apiculture;
import forestry.api.apiculture.DefaultBeeModifier;
import forestry.api.apiculture.IBeeGenome;
public class AlvearyBeeModifier extends DefaultBeeModifier {
@Override
public float getTerritoryModifier(IBeeGenome genome, float currentModifier) {
return 2.0f;
}
}
@@ -1,28 +0,0 @@
/*******************************************************************************
* Copyright (c) 2011-2014 SirSengir.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU Lesser Public License v3
* which accompanies this distribution, and is available at
* http://www.gnu.org/licenses/lgpl-3.0.txt
*
* Various Contributors including, but not limited to:
* SirSengir (original work), CovertJaguar, Player, Binnie, MysteriousAges
******************************************************************************/
package forestry.apiculture;
import forestry.api.apiculture.DefaultBeeListener;
import forestry.apiculture.inventory.IApiaryInventory;
public class ApiaryBeeListener extends DefaultBeeListener {
private final IApiary apiary;
public ApiaryBeeListener(IApiary apiary) {
this.apiary = apiary;
}
@Override
public void wearOutEquipment(int amount) {
IApiaryInventory apiaryInventory = apiary.getApiaryInventory();
apiaryInventory.wearOutFrames(apiary, amount);
}
}
@@ -1,21 +0,0 @@
/*******************************************************************************
* Copyright (c) 2011-2014 SirSengir.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU Lesser Public License v3
* which accompanies this distribution, and is available at
* http://www.gnu.org/licenses/lgpl-3.0.txt
*
* Various Contributors including, but not limited to:
* SirSengir (original work), CovertJaguar, Player, Binnie, MysteriousAges
******************************************************************************/
package forestry.apiculture;
import forestry.api.apiculture.DefaultBeeModifier;
import forestry.api.apiculture.IBeeGenome;
public class ApiaryBeeModifier extends DefaultBeeModifier {
@Override
public float getProductionModifier(IBeeGenome genome, float currentModifier) {
return 0.1f;
}
}
@@ -1,69 +0,0 @@
/*******************************************************************************
* Copyright (c) 2011-2014 SirSengir.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU Lesser Public License v3
* which accompanies this distribution, and is available at
* http://www.gnu.org/licenses/lgpl-3.0.txt
*
* Various Contributors including, but not limited to:
* SirSengir (original work), CovertJaguar, Player, Binnie, MysteriousAges
******************************************************************************/
package forestry.apiculture;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import forestry.api.apiculture.IArmorApiarist;
import forestry.api.apiculture.IArmorApiaristHelper;
public class ArmorApiaristHelper implements IArmorApiaristHelper {
@Override
public boolean isArmorApiarist(ItemStack stack, EntityLivingBase entity, String cause, boolean doProtect) {
if (stack == null) {
return false;
}
Item item = stack.getItem();
if (!(item instanceof IArmorApiarist)) {
return false;
}
IArmorApiarist armorApiarist = (IArmorApiarist) item;
try {
return armorApiarist.protectEntity(entity, stack, cause, doProtect);
} catch (Throwable ignored) { // protectEntity is new to the API and may not be implemented by the armor
if (entity instanceof EntityPlayer) {
return armorApiarist.protectPlayer((EntityPlayer) entity, stack, cause, doProtect);
} else {
return true; // fallback on assuming IArmorApiarist will protect the entity
}
}
}
@Override
public int wearsItems(EntityLivingBase entity, String cause, boolean doProtect) {
int count = 0;
for (int i = 1; i <= 4; i++) {
ItemStack armorItem = entity.getEquipmentInSlot(i);
if (isArmorApiarist(armorItem, entity, cause, doProtect)) {
count++;
}
}
return count;
}
@Override
public boolean isArmorApiarist(ItemStack stack, EntityPlayer player, String cause, boolean doProtect) {
return isArmorApiarist(stack, (EntityLivingBase) player, cause, doProtect);
}
@Override
public int wearsItems(EntityPlayer player, String cause, boolean doProtect) {
return wearsItems((EntityLivingBase) player, cause, doProtect);
}
}
@@ -1,49 +0,0 @@
/*******************************************************************************
* Copyright (c) 2011-2014 SirSengir.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU Lesser Public License v3
* which accompanies this distribution, and is available at
* http://www.gnu.org/licenses/lgpl-3.0.txt
*
* Various Contributors including, but not limited to:
* SirSengir (original work), CovertJaguar, Player, Binnie, MysteriousAges
******************************************************************************/
package forestry.apiculture;
import forestry.api.apiculture.IBeeHousing;
import forestry.api.apiculture.IBeeListener;
import forestry.api.genetics.IIndividual;
public class BeeHousingListener implements IBeeListener {
private final IBeeHousing beeHousing;
public BeeHousingListener(IBeeHousing beeHousing) {
this.beeHousing = beeHousing;
}
@Override
public void wearOutEquipment(int amount) {
for (IBeeListener beeListener : beeHousing.getBeeListeners()) {
beeListener.wearOutEquipment(amount);
}
}
@Override
public void onQueenDeath() {
for (IBeeListener beeListener : beeHousing.getBeeListeners()) {
beeListener.onQueenDeath();
}
}
@Override
public boolean onPollenRetrieved(IIndividual pollen) {
for (IBeeListener beeListener : beeHousing.getBeeListeners()) {
if (beeListener.onPollenRetrieved(pollen)) {
return true;
}
}
return false;
}
}
@@ -1,117 +0,0 @@
/*******************************************************************************
* Copyright (c) 2011-2014 SirSengir.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU Lesser Public License v3
* which accompanies this distribution, and is available at
* http://www.gnu.org/licenses/lgpl-3.0.txt
*
* Various Contributors including, but not limited to:
* SirSengir (original work), CovertJaguar, Player, Binnie, MysteriousAges
******************************************************************************/
package forestry.apiculture;
import forestry.api.apiculture.IBeeGenome;
import forestry.api.apiculture.IBeeHousing;
import forestry.api.apiculture.IBeeModifier;
public class BeeHousingModifier implements IBeeModifier {
private final IBeeHousing beeHousing;
public BeeHousingModifier(IBeeHousing beeHousing) {
this.beeHousing = beeHousing;
}
@Override
public float getTerritoryModifier(IBeeGenome genome, final float currentModifier) {
float modifierValue = 1.0f;
for (IBeeModifier modifier : beeHousing.getBeeModifiers()) {
modifierValue *= modifier.getTerritoryModifier(genome, modifierValue * currentModifier);
}
return modifierValue;
}
@Override
public float getMutationModifier(IBeeGenome genome, IBeeGenome mate, final float currentModifier) {
float modifierValue = 1.0f;
for (IBeeModifier modifier : beeHousing.getBeeModifiers()) {
modifierValue *= modifier.getMutationModifier(genome, mate, modifierValue * currentModifier);
}
return modifierValue;
}
@Override
public float getLifespanModifier(IBeeGenome genome, IBeeGenome mate, final float currentModifier) {
float modifierValue = 1.0f;
for (IBeeModifier modifier : beeHousing.getBeeModifiers()) {
modifierValue *= modifier.getLifespanModifier(genome, mate, modifierValue * currentModifier);
}
return modifierValue;
}
@Override
public float getProductionModifier(IBeeGenome genome, final float currentModifier) {
float modifierValue = 1.0f;
for (IBeeModifier modifier : beeHousing.getBeeModifiers()) {
modifierValue *= modifier.getProductionModifier(genome, modifierValue * currentModifier);
}
return modifierValue;
}
@Override
public float getFloweringModifier(IBeeGenome genome, final float currentModifier) {
float modifierValue = 1.0f;
for (IBeeModifier modifier : beeHousing.getBeeModifiers()) {
modifierValue *= modifier.getFloweringModifier(genome, modifierValue * currentModifier);
}
return modifierValue;
}
@Override
public float getGeneticDecay(IBeeGenome genome, final float currentModifier) {
float modifierValue = 1.0f;
for (IBeeModifier modifier : beeHousing.getBeeModifiers()) {
modifierValue *= modifier.getGeneticDecay(genome, modifierValue * currentModifier);
}
return modifierValue;
}
@Override
public boolean isSealed() {
for (IBeeModifier modifier : beeHousing.getBeeModifiers()) {
if (modifier.isSealed()) {
return true;
}
}
return false;
}
@Override
public boolean isSelfLighted() {
for (IBeeModifier modifier : beeHousing.getBeeModifiers()) {
if (modifier.isSelfLighted()) {
return true;
}
}
return false;
}
@Override
public boolean isSunlightSimulated() {
for (IBeeModifier modifier : beeHousing.getBeeModifiers()) {
if (modifier.isSunlightSimulated()) {
return true;
}
}
return false;
}
@Override
public boolean isHellish() {
for (IBeeModifier modifier : beeHousing.getBeeModifiers()) {
if (modifier.isHellish()) {
return true;
}
}
return false;
}
}
@@ -1,46 +0,0 @@
/*******************************************************************************
* Copyright (c) 2011-2014 SirSengir.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU Lesser Public License v3
* which accompanies this distribution, and is available at
* http://www.gnu.org/licenses/lgpl-3.0.txt
*
* Various Contributors including, but not limited to:
* SirSengir (original work), CovertJaguar, Player, Binnie, MysteriousAges
******************************************************************************/
package forestry.apiculture;
import forestry.api.apiculture.DefaultBeeModifier;
import forestry.api.apiculture.IBeeGenome;
public class BeehouseBeeModifier extends DefaultBeeModifier {
@Override
public float getTerritoryModifier(IBeeGenome genome, float currentModifier) {
return 1.0f;
}
@Override
public float getProductionModifier(IBeeGenome genome, float currentModifier) {
return 0.25f;
}
@Override
public float getMutationModifier(IBeeGenome genome, IBeeGenome mate, float currentModifier) {
return 0.0f;
}
@Override
public float getLifespanModifier(IBeeGenome genome, IBeeGenome mate, float currentModifier) {
return 3.0f;
}
@Override
public float getFloweringModifier(IBeeGenome genome, float currentModifier) {
return 3.0f;
}
@Override
public float getGeneticDecay(IBeeGenome genome, float currentModifier) {
return 0.0f;
}
}
@@ -10,226 +10,195 @@
******************************************************************************/
package forestry.apiculture;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Set;
import java.util.Stack;
import net.minecraft.entity.Entity;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.world.World;
import forestry.api.apiculture.BeeManager;
import forestry.api.apiculture.EnumBeeType;
import forestry.api.apiculture.IApiaristTracker;
import forestry.api.apiculture.IBee;
import forestry.api.apiculture.IBeeHousing;
import forestry.api.apiculture.IBeeHousingInventory;
import forestry.api.apiculture.IBeeListener;
import forestry.api.apiculture.IBeeModifier;
import forestry.api.apiculture.IBeekeepingLogic;
import forestry.api.core.IErrorLogic;
import forestry.api.core.IErrorState;
import forestry.api.genetics.IEffectData;
import forestry.api.genetics.IIndividual;
import forestry.apiculture.network.packets.PacketBeeLogicActive;
import forestry.apiculture.network.packets.PacketBeeLogicActiveEntity;
import forestry.core.config.Constants;
import forestry.core.errors.EnumErrorCode;
import forestry.core.network.DataInputStreamForestry;
import forestry.core.network.DataOutputStreamForestry;
import forestry.core.network.IStreamable;
import forestry.core.EnumErrorCode;
import forestry.core.config.Defaults;
import forestry.core.config.ForestryItem;
import forestry.core.proxy.Proxies;
import forestry.core.utils.Log;
import forestry.plugins.PluginApiculture;
public class BeekeepingLogic implements IBeekeepingLogic, IStreamable {
public class BeekeepingLogic implements IBeekeepingLogic {
private static final int totalBreedingTime = Constants.APIARY_BREEDING_TIME;
private static final int MAX_POLLINATION_ATTEMPTS = 20;
private static final int totalBreedingTime = Defaults.APIARY_BREEDING_TIME;
private static final int ticksPerCheckQueenCanWork = 10;
private final IBeeHousing housing;
private final IBeeModifier beeModifier;
private final IBeeListener beeListener;
private int beeProgress;
private int beeProgressMax;
private final boolean housingSupportsMultipleErrorStates;
// Breeding
private int breedingTime;
private int queenWorkCycleThrottle;
private IEffectData effectData[] = new IEffectData[2];
private final Stack<ItemStack> spawn = new Stack<>();
private final HasFlowersCache hasFlowersCache = new HasFlowersCache();
private final QueenCanWorkCache queenCanWorkCache = new QueenCanWorkCache();
private final PollenHandler pollenHandler = new PollenHandler();
// Client
private boolean active;
private ItemStack queenStack;
private IBee queen;
private ItemStack queenStack; // used to detect server changes and sync clientQueen
private IIndividual pollen;
private int attemptedPollinations = 0;
private final Stack<ItemStack> spawn = new Stack<ItemStack>();
// Cached flowers check
private boolean hasFlowersCached = false;
private int hasFlowersCooldown = 0;
private Set<IErrorState> queenCanWorkCached = Collections.emptySet();
private int queenCanWorkCooldown = 0;
public BeekeepingLogic(IBeeHousing housing) {
this.housing = housing;
this.beeModifier = BeeManager.beeRoot.createBeeHousingModifier(housing);
this.beeListener = BeeManager.beeRoot.createBeeHousingListener(housing);
Set<IErrorState> errorStateSet = null;
try {
errorStateSet = housing.getErrorStates();
} catch (Throwable ignored) {
}
housingSupportsMultipleErrorStates = (errorStateSet != null);
}
// / SAVING & LOADING
@Override
public void readFromNBT(NBTTagCompound nbttagcompound) {
beeProgress = nbttagcompound.getInteger("BreedingTime");
breedingTime = nbttagcompound.getInteger("BreedingTime");
queenWorkCycleThrottle = nbttagcompound.getInteger("Throttle");
NBTTagCompound queenNBT = nbttagcompound.getCompoundTag("queen");
queenStack = ItemStack.loadItemStackFromNBT(queenNBT);
queen = BeeManager.beeRoot.getMember(queenStack);
setActive(nbttagcompound.getBoolean("Active"));
hasFlowersCache.readFromNBT(nbttagcompound);
NBTTagList nbttaglist = nbttagcompound.getTagList("Offspring", 10);
for (int i = 0; i < nbttaglist.tagCount(); i++) {
spawn.add(ItemStack.loadItemStackFromNBT(nbttaglist.getCompoundTagAt(i)));
}
}
@Override
public void writeToNBT(NBTTagCompound nbttagcompound) {
nbttagcompound.setInteger("BreedingTime", beeProgress);
nbttagcompound.setInteger("BreedingTime", breedingTime);
nbttagcompound.setInteger("Throttle", queenWorkCycleThrottle);
if (queenStack != null) {
NBTTagCompound queenNBT = new NBTTagCompound();
queenStack.writeToNBT(queenNBT);
nbttagcompound.setTag("queen", queenNBT);
}
nbttagcompound.setBoolean("Active", active);
hasFlowersCache.writeToNBT(nbttagcompound);
Stack<ItemStack> spawnCopy = new Stack<>();
if (spawn.size()<128)
spawnCopy.addAll(spawn);
else
for (byte b=0;b<128;++b)
spawnCopy.add(spawn.get(b));
Stack<ItemStack> spawnCopy = new Stack<ItemStack>();
spawnCopy.addAll(spawn);
NBTTagList nbttaglist = new NBTTagList();
while (!spawnCopy.isEmpty() && spawnCopy.size()<=128) {
while (!spawnCopy.isEmpty()) {
NBTTagCompound nbttagcompound1 = new NBTTagCompound();
spawnCopy.pop().writeToNBT(nbttagcompound1);
nbttaglist.appendTag(nbttagcompound1);
}
nbttagcompound.setTag("Offspring", nbttaglist);
}
// / STATE INFORMATION
@Override
public int getBreedingTime() {
return this.breedingTime;
}
@Override
public void writeData(DataOutputStreamForestry data) throws IOException {
data.writeBoolean(active);
if (active) {
data.writeItemStack(queenStack);
}
public int getTotalBreedingTime() {
return totalBreedingTime;
}
@Override
public void readData(DataInputStreamForestry data) throws IOException {
boolean active = data.readBoolean();
setActive(active);
if (active) {
queenStack = data.readItemStack();
queen = BeeManager.beeRoot.getMember(queenStack);
}
public IBee getQueen() {
return this.queen;
}
/* Activatable */
private void setActive(boolean active) {
if (this.active == active) {
return;
}
this.active = active;
@Override
public IBeeHousing getHousing() {
return this.housing;
}
syncToClient();
@Override
public IEffectData[] getEffectData() {
return this.effectData;
}
/* UPDATING */
@Override
public boolean canWork() {
IErrorLogic errorLogic = housing.getErrorLogic();
errorLogic.clearErrors();
IBeeHousingInventory beeInventory = housing.getBeeInventory();
boolean hasSpace = addPendingProducts(beeInventory, spawn);
errorLogic.setCondition(!hasSpace, EnumErrorCode.NO_SPACE_INVENTORY);
ItemStack queenStack = beeInventory.getQueen();
EnumBeeType beeType = BeeManager.beeRoot.getType(queenStack);
// check if we're breeding
if (beeType == EnumBeeType.PRINCESS) {
boolean hasDrone = BeeManager.beeRoot.isDrone(beeInventory.getDrone());
errorLogic.setCondition(!hasDrone, EnumErrorCode.NO_DRONE);
setActive(false); // not active (no bee FX) when we are breeding
return !errorLogic.hasErrors();
}
if (beeType == EnumBeeType.QUEEN) {
if (!isQueenAlive(queenStack)) {
IBee dyingQueen = BeeManager.beeRoot.getMember(queenStack);
Collection<ItemStack> spawned = killQueen(dyingQueen, housing, beeListener);
spawn.addAll(spawned);
queenStack = null;
if (housingSupportsMultipleErrorStates) {
Set<IErrorState> errorStates = housing.getErrorStates();
for (IErrorState errorState : errorStates) {
housing.setErrorCondition(false, errorState);
}
} else {
queenStack = null;
}
if (!ItemStack.areItemStacksEqual(this.queenStack, queenStack)) {
this.queen = BeeManager.beeRoot.getMember(queenStack);
this.queenStack = queenStack;
boolean hasSpace = addPendingProducts();
if (hasBreedablePrincess()) {
return hasSpace;
}
if (errorLogic.setCondition(queen == null, EnumErrorCode.NO_QUEEN)) {
setActive(false);
beeProgress = 0;
return false;
if (hasHealthyQueen()) {
boolean canWork = queenCanWork();
boolean hasFlowers = hasFlowers();
return hasSpace && canWork && hasFlowers;
}
Set<IErrorState> queenErrors = queenCanWorkCache.queenCanWork(queen, housing);
for (IErrorState errorState : queenErrors) {
errorLogic.setCondition(true, errorState);
}
boolean hasFlowers = hasFlowersCache.hasFlowers(queen, housing);
errorLogic.setCondition(!hasFlowers, EnumErrorCode.NO_FLOWER);
boolean canWork = !errorLogic.hasErrors();
setActive(canWork);
return canWork;
return false;
}
@Override
public void doWork() {
IBeeHousingInventory beeInventory = housing.getBeeInventory();
ItemStack queenStack = beeInventory.getQueen();
EnumBeeType beeType = BeeManager.beeRoot.getType(queenStack);
if (beeType == EnumBeeType.PRINCESS) {
if (hasBreedablePrincess()) {
tickBreed();
} else {
queenWorkTick(queen);
} else if (queen != null) {
queenWorkTick();
}
}
private void queenWorkTick(IBee queen) {
@Override
public void update() {
if (canWork()) {
doWork();
}
}
private boolean hasFlowers() {
if (queen == null) {
return true;
}
if (hasFlowersCooldown <= 0) {
hasFlowersCached = queen.hasFlower(housing);
hasFlowersCooldown = PluginApiculture.ticksPerBeeWorkCycle;
// check more often if we haven't found flowers
if (!hasFlowersCached) {
hasFlowersCooldown /= 2;
}
} else {
hasFlowersCooldown--;
}
if (housingSupportsMultipleErrorStates) {
housing.setErrorCondition(!hasFlowersCached, EnumErrorCode.NOFLOWER);
} else {
if (hasFlowersCached) {
housing.setErrorState(EnumErrorCode.OK);
} else {
housing.setErrorState(EnumErrorCode.NOFLOWER);
}
}
return hasFlowersCached;
}
private void queenWorkTick() {
if (queen == null) {
return;
}
@@ -242,163 +211,298 @@ public class BeekeepingLogic implements IBeekeepingLogic, IStreamable {
if (queenWorkCycleThrottle >= PluginApiculture.ticksPerBeeWorkCycle) {
queenWorkCycleThrottle = 0;
doProduction(queen, housing, beeListener);
doProduction();
queen.plantFlowerRandom(housing);
pollenHandler.doPollination(queen, housing, beeListener);
doPollination();
// Age the queen
float lifespanModifier = beeModifier.getLifespanModifier(queen.getGenome(), queen.getMate(), 1.0f);
queen.age(housing.getWorld(), lifespanModifier);
// Write the changed queen back into the item stack.
NBTTagCompound nbttagcompound = new NBTTagCompound();
queen.writeToNBT(nbttagcompound);
housing.getBeeInventory().getQueen().setTagCompound(nbttagcompound);
queen.age(housing.getWorld(), housing.getLifespanModifier(queen.getGenome(), queen.getMate(), 0f));
updateQueenItemNBT();
}
beeProgress = queen.getHealth();
beeProgressMax = queen.getMaxHealth();
}
private static void doProduction(IBee queen, IBeeHousing beeHousing, IBeeListener beeListener) {
private void doProduction() {
if (queen == null) {
return;
}
// Produce and add stacks
ItemStack[] products = queen.produceStacks(beeHousing);
ItemStack[] products = queen.produceStacks(housing);
if (products == null) {
return;
}
beeListener.wearOutEquipment(1);
IBeeHousingInventory beeInventory = beeHousing.getBeeInventory();
housing.wearOutEquipment(1);
for (ItemStack stack : products) {
beeInventory.addProduct(stack, false);
housing.addProduct(stack, false);
}
}
private static boolean addPendingProducts(IBeeHousingInventory beeInventory, Stack<ItemStack> spawn) {
boolean housingHasSpace = true;
private void doPollination() {
if (queen == null) {
return;
}
// Get pollen if none available yet
if (pollen == null) {
pollen = queen.retrievePollen(housing);
attemptedPollinations = 0;
if (pollen != null) {
if (housing.onPollenRetrieved(queen, pollen, false)) {
pollen = null;
}
}
}
if (pollen != null) {
attemptedPollinations++;
if (queen.pollinateRandom(housing, pollen) || attemptedPollinations >= MAX_POLLINATION_ATTEMPTS) {
pollen = null;
}
}
}
private void updateQueenItemNBT() {
if (queen == null) {
return;
}
// Write the changed queen back into the item stack.
NBTTagCompound nbttagcompound = new NBTTagCompound();
queen.writeToNBT(nbttagcompound);
housing.getQueen().setTagCompound(nbttagcompound);
}
private boolean addPendingProducts() {
EnumErrorCode housingErrorState = null;
while (!spawn.isEmpty()) {
ItemStack next = spawn.peek();
if (beeInventory.addProduct(next, true)) {
if (housing.addProduct(next, true)) {
spawn.pop();
housingErrorState = EnumErrorCode.OK;
} else {
housingHasSpace = false;
housingErrorState = EnumErrorCode.NOSPACE;
break;
}
}
return housingHasSpace;
if (housingErrorState != null) {
if (housingSupportsMultipleErrorStates) {
boolean hasSpace = (housingErrorState == EnumErrorCode.OK);
housing.setErrorCondition(!hasSpace, EnumErrorCode.NOSPACE);
} else {
housing.setErrorState(housingErrorState);
}
}
return housingErrorState != EnumErrorCode.NOSPACE;
}
/** Checks if a queen is alive. Much faster than reading the whole bee nbt */
private static boolean isQueenAlive(ItemStack queenStack) {
if (queenStack == null) {
return false;
}
NBTTagCompound nbtTagCompound = queenStack.getTagCompound();
if (nbtTagCompound == null) {
return false;
}
int health = nbtTagCompound.getInteger("Health");
return health > 0;
}
private boolean hasHealthyQueen() {
boolean hasQueen = true;
EnumErrorCode housingErrorState = null;
ItemStack queenStack = housing.getQueen();
if (!ItemStack.areItemStacksEqual(this.queenStack, queenStack)) {
this.queen = BeeManager.beeRoot.getMember(queenStack);
this.queenStack = queenStack;
}
if (queenStack == null || !ForestryItem.beeQueenGE.isItemEqual(queenStack)) {
housingErrorState = EnumErrorCode.NOQUEEN;
hasQueen = false;
queen = null;
} else if (!isQueenAlive(queenStack)) {
if (queen == null) {
queen = BeeManager.beeRoot.getMember(queenStack);
}
killQueen();
housingErrorState = EnumErrorCode.OK;
hasQueen = false;
queen = null;
}
if (housingSupportsMultipleErrorStates) {
housing.setErrorCondition(!hasQueen, EnumErrorCode.NOQUEEN);
} else {
if (housingErrorState != null) {
housing.setErrorState(housingErrorState);
}
}
if (hasQueen && queen == null) {
queen = BeeManager.beeRoot.getMember(queenStack);
}
return hasQueen;
}
private boolean hasBreedablePrincess() {
boolean isBreedingPrincess = false;
if (ForestryItem.beePrincessGE.isItemEqual(housing.getQueen())) {
boolean hasDrone = ForestryItem.beeDroneGE.isItemEqual(housing.getDrone());
if (housingSupportsMultipleErrorStates) {
housing.setErrorCondition(!hasDrone, EnumErrorCode.NODRONE);
} else {
if (hasDrone) {
housing.setErrorState(EnumErrorCode.OK);
} else {
housing.setErrorState(EnumErrorCode.NODRONE);
}
}
isBreedingPrincess = true;
}
return isBreedingPrincess;
}
private boolean queenCanWork() {
if (queenCanWorkCooldown > 0) {
queenCanWorkCooldown--;
} else {
if (queen == null) {
return false;
}
queenCanWorkCached = checkQueenCanWork();
queenCanWorkCooldown = ticksPerCheckQueenCanWork;
}
Set<IErrorState> errorStates = queenCanWorkCached;
if (errorStates.size() > 0) {
if (housingSupportsMultipleErrorStates) {
for (IErrorState errorState : errorStates) {
housing.setErrorCondition(true, errorState);
}
} else {
IErrorState state = errorStates.iterator().next();
housing.setErrorState(state);
}
return false;
} else {
return true;
}
}
private Set<IErrorState> checkQueenCanWork() {
try {
return queen.getCanWork(housing);
} catch (Throwable ignored) {
// queen might not support getCanWork
}
IErrorState state = queen.canWork(housing);
if (state != EnumErrorCode.OK) {
return Collections.singleton(state);
}
return Collections.emptySet();
}
// / BREEDING
private void tickBreed() {
beeProgressMax = totalBreedingTime;
IBeeHousingInventory beeInventory = housing.getBeeInventory();
ItemStack droneStack = beeInventory.getDrone();
ItemStack princessStack = beeInventory.getQueen();
EnumBeeType droneType = BeeManager.beeRoot.getType(droneStack);
EnumBeeType princessType = BeeManager.beeRoot.getType(princessStack);
if (droneType != EnumBeeType.DRONE || princessType != EnumBeeType.PRINCESS) {
beeProgress = 0;
if (!tryBreed()) {
breedingTime = 0;
return;
}
if (beeProgress < totalBreedingTime) {
beeProgress++;
if (breedingTime < totalBreedingTime) {
breedingTime++;
}
if (beeProgress < totalBreedingTime) {
if (breedingTime < totalBreedingTime) {
return;
}
// Mate and replace princess with queen
IBee princess = BeeManager.beeRoot.getMember(princessStack);
IBee drone = BeeManager.beeRoot.getMember(droneStack);
// Breeding done, create new queen if slot available
if (!ForestryItem.beePrincessGE.isItemEqual(housing.getQueen())) {
return;
}
// Replace
IBee princess = BeeManager.beeRoot.getMember(housing.getQueen());
IBee drone = BeeManager.beeRoot.getMember(housing.getDrone());
princess.mate(drone);
NBTTagCompound nbttagcompound = new NBTTagCompound();
princess.writeToNBT(nbttagcompound);
queenStack = new ItemStack(PluginApiculture.items.beeQueenGE);
queenStack.setTagCompound(nbttagcompound);
ItemStack queen = ForestryItem.beeQueenGE.getItemStack();
queen.setTagCompound(nbttagcompound);
beeInventory.setQueen(queenStack);
housing.setQueen(queen);
housing.onQueenChange(housing.getQueen());
// Register the new queen with the breeding tracker
BeeManager.beeRoot.getBreedingTracker(housing.getWorld(), housing.getOwner()).registerQueen(princess);
BeeManager.beeRoot.getBreedingTracker(housing.getWorld(), housing.getOwnerName()).registerQueen(princess);
// Remove drone
beeInventory.getDrone().stackSize--;
if (beeInventory.getDrone().stackSize <= 0) {
beeInventory.setDrone(null);
housing.getDrone().stackSize--;
if (housing.getDrone().stackSize <= 0) {
housing.setDrone(null);
}
// Reset breeding time
queen = princess;
beeProgress = princess.getHealth();
beeProgressMax = princess.getMaxHealth();
breedingTime = 0;
}
private static Collection<ItemStack> killQueen(IBee queen, IBeeHousing beeHousing, IBeeListener beeListener) {
if (queen == null) {
return Collections.emptySet();
private boolean tryBreed() {
if (housing.getDrone() == null || housing.getQueen() == null) {
return false;
}
IBeeHousingInventory beeInventory = beeHousing.getBeeInventory();
if (!ForestryItem.beeDroneGE.isItemEqual(housing.getDrone()) || !ForestryItem.beePrincessGE.isItemEqual(housing.getQueen())) {
return false;
}
Collection<ItemStack> spawn;
return housing.canBreed();
}
private void killQueen() {
if (queen == null) {
return;
}
if (queen.canSpawn()) {
spawn = spawnOffspring(queen, beeHousing);
beeListener.onQueenDeath();
beeInventory.getQueen().stackSize = 0;
beeInventory.setQueen(null);
spawnOffspring(queen);
housing.getQueen().stackSize = 0;
housing.setQueen(null);
} else {
Log.warning("Tried to spawn offspring off an unmated queen. Devolving her to a princess.");
Proxies.log.warning("Tried to spawn offspring off an unmated queen. Devolving her to a princess.");
ItemStack convert = new ItemStack(PluginApiculture.items.beePrincessGE);
ItemStack convert = ForestryItem.beePrincessGE.getItemStack();
NBTTagCompound nbttagcompound = new NBTTagCompound();
queen.writeToNBT(nbttagcompound);
convert.setTagCompound(nbttagcompound);
spawn = Collections.singleton(convert);
beeInventory.setQueen(null);
spawn.add(convert);
housing.setQueen(null);
}
return spawn;
housing.onQueenChange(housing.getQueen());
}
/**
* Creates the succeeding princess and between one and three drones.
*/
private static Collection<ItemStack> spawnOffspring(IBee queen, IBeeHousing beeHousing) {
private void spawnOffspring(IBee queen) {
World world = beeHousing.getWorld();
Stack<ItemStack> offspring = new Stack<ItemStack>();
IApiaristTracker breedingTracker = BeeManager.beeRoot.getBreedingTracker(housing.getWorld(), housing.getOwnerName());
Stack<ItemStack> offspring = new Stack<>();
IApiaristTracker breedingTracker = BeeManager.beeRoot.getBreedingTracker(world, beeHousing.getOwner());
housing.onQueenDeath(getQueen());
// Princess
boolean secondPrincess = world.rand.nextInt(10000) < PluginApiculture.getSecondPrincessChance() * 100;
boolean secondPrincess = this.housing.getWorld().rand.nextInt(10000) < PluginApiculture.getSecondPrincessChance() * 100;
int count = secondPrincess ? 2 : 1;
while (count > 0) {
count--;
IBee heiress = queen.spawnPrincess(beeHousing);
IBee heiress = queen.spawnPrincess(housing);
if (heiress != null) {
ItemStack princess = BeeManager.beeRoot.getMemberStack(heiress, EnumBeeType.PRINCESS.ordinal());
breedingTracker.registerPrincess(heiress);
@@ -407,117 +511,21 @@ public class BeekeepingLogic implements IBeekeepingLogic, IStreamable {
}
// Drones
IBee[] drones = queen.spawnDrones(beeHousing);
for (IBee drone : drones) {
ItemStack droneStack = BeeManager.beeRoot.getMemberStack(drone, EnumBeeType.DRONE.ordinal());
breedingTracker.registerDrone(drone);
offspring.push(droneStack);
IBee[] larvae = queen.spawnDrones(housing);
for (IBee larva : larvae) {
ItemStack drone = BeeManager.beeRoot.getMemberStack(larva, EnumBeeType.DRONE.ordinal());
breedingTracker.registerDrone(larva);
offspring.push(drone);
}
IBeeHousingInventory beeInventory = beeHousing.getBeeInventory();
Collection<ItemStack> spawn = new ArrayList<>();
while (!offspring.isEmpty()) {
ItemStack spawned = offspring.pop();
if (!beeInventory.addProduct(spawned, true)) {
if (!housing.addProduct(spawned, true)) {
spawn.add(spawned);
}
}
return spawn;
housing.onPostQueenDeath(getQueen());
}
/* CLIENT */
@Override
public void syncToClient() {
World world = housing.getWorld();
if (world != null && !world.isRemote) {
if (housing instanceof Entity) {
Proxies.net.sendNetworkPacket(new PacketBeeLogicActiveEntity(housing, (Entity) housing), world);
} else {
Proxies.net.sendNetworkPacket(new PacketBeeLogicActive(housing), world);
}
}
}
@Override
public void syncToClient(EntityPlayerMP player) {
World world = housing.getWorld();
if (world != null && !world.isRemote) {
if (housing instanceof TileEntity) {
Proxies.net.sendToPlayer(new PacketBeeLogicActive(housing), player);
} else if (housing instanceof Entity) {
Proxies.net.sendToPlayer(new PacketBeeLogicActiveEntity(housing, (Entity) housing), player);
}
}
}
@Override
public int getBeeProgressPercent() {
if (beeProgressMax == 0) {
return 0;
}
return Math.round(beeProgress * 100f / beeProgressMax);
}
@Override
public boolean canDoBeeFX() {
return active;
}
@Override
public void doBeeFX() {
if (queen != null) {
queen.doFX(effectData, housing);
}
}
private static class QueenCanWorkCache {
private static final int ticksPerCheckQueenCanWork = 10;
private Set<IErrorState> queenCanWorkCached = Collections.emptySet();
private int queenCanWorkCooldown = 0;
public Set<IErrorState> queenCanWork(IBee queen, IBeeHousing beeHousing) {
if (queenCanWorkCooldown <= 0) {
queenCanWorkCached = queen.getCanWork(beeHousing);
queenCanWorkCooldown = ticksPerCheckQueenCanWork;
} else {
queenCanWorkCooldown--;
}
return queenCanWorkCached;
}
}
private static class PollenHandler {
private static final int MAX_POLLINATION_ATTEMPTS = 20;
private IIndividual pollen;
private int attemptedPollinations = 0;
public void doPollination(IBee queen, IBeeHousing beeHousing, IBeeListener beeListener) {
// Get pollen if none available yet
if (pollen == null) {
attemptedPollinations = 0;
pollen = queen.retrievePollen(beeHousing);
if (pollen != null) {
if (beeListener.onPollenRetrieved(pollen)) {
pollen = null;
}
}
}
if (pollen != null) {
attemptedPollinations++;
if (queen.pollinateRandom(beeHousing, pollen) || attemptedPollinations >= MAX_POLLINATION_ATTEMPTS) {
pollen = null;
}
}
}
}
}
@@ -1,69 +0,0 @@
/*******************************************************************************
* Copyright (c) 2011-2014 SirSengir.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU Lesser Public License v3
* which accompanies this distribution, and is available at
* http://www.gnu.org/licenses/lgpl-3.0.txt
*
* Various Contributors including, but not limited to:
* SirSengir (original work), CovertJaguar, Player, Binnie, MysteriousAges
******************************************************************************/
package forestry.apiculture;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.nbt.NBTTagCompound;
import forestry.api.apiculture.IBeekeepingLogic;
public class FakeBeekeepingLogic implements IBeekeepingLogic {
public static final FakeBeekeepingLogic instance = new FakeBeekeepingLogic();
private FakeBeekeepingLogic() {
}
@Override
public boolean canWork() {
return false;
}
@Override
public void doWork() {
}
@Override
public void syncToClient() {
}
@Override
public void syncToClient(EntityPlayerMP player) {
}
@Override
public int getBeeProgressPercent() {
return 0;
}
@Override
public boolean canDoBeeFX() {
return false;
}
@Override
public void doBeeFX() {
}
@Override
public void readFromNBT(NBTTagCompound nbttagcompound) {
}
@Override
public void writeToNBT(NBTTagCompound nbttagcompound) {
}
}
+181
View File
@@ -0,0 +1,181 @@
/*******************************************************************************
* Copyright (c) 2011-2014 SirSengir.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU Lesser Public License v3
* which accompanies this distribution, and is available at
* http://www.gnu.org/licenses/lgpl-3.0.txt
*
* Various Contributors including, but not limited to:
* SirSengir (original work), CovertJaguar, Player, Binnie, MysteriousAges
******************************************************************************/
package forestry.apiculture;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.world.World;
import forestry.api.apiculture.BeeManager;
import forestry.apiculture.gadgets.TileAlvearyHygroregulator;
import forestry.apiculture.gadgets.TileAlvearyPlain;
import forestry.apiculture.gadgets.TileAlvearySieve;
import forestry.apiculture.gadgets.TileAlvearySwarmer;
import forestry.apiculture.gadgets.TileApiary;
import forestry.apiculture.gadgets.TileBeehouse;
import forestry.apiculture.genetics.BeeHelper;
import forestry.apiculture.gui.ContainerAlveary;
import forestry.apiculture.gui.ContainerAlvearyHygroregulator;
import forestry.apiculture.gui.ContainerAlvearySieve;
import forestry.apiculture.gui.ContainerAlvearySwarmer;
import forestry.apiculture.gui.ContainerApiary;
import forestry.apiculture.gui.ContainerHabitatLocator;
import forestry.apiculture.gui.ContainerImprinter;
import forestry.apiculture.gui.GuiAlveary;
import forestry.apiculture.gui.GuiAlvearyHygroregulator;
import forestry.apiculture.gui.GuiAlvearySieve;
import forestry.apiculture.gui.GuiAlvearySwarmer;
import forestry.apiculture.gui.GuiApiary;
import forestry.apiculture.gui.GuiBeealyzer;
import forestry.apiculture.gui.GuiHabitatLocator;
import forestry.apiculture.gui.GuiImprinter;
import forestry.apiculture.items.ItemBeealyzer.BeealyzerInventory;
import forestry.apiculture.items.ItemHabitatLocator.HabitatLocatorInventory;
import forestry.apiculture.items.ItemImprinter.ImprinterInventory;
import forestry.core.GuiHandlerBase;
import forestry.core.gui.ContainerAlyzer;
import forestry.core.network.GuiId;
public class GuiHandlerApiculture extends GuiHandlerBase {
@Override
public Object getClientGuiElement(int id, EntityPlayer player, World world, int x, int y, int z) {
int cleanId = decodeGuiID(id);
int guiData = decodeGuiData(id);
if (cleanId >= GuiId.values().length) {
return null;
}
ItemStack equipped;
switch (GuiId.values()[cleanId]) {
case AlvearyGUI:
return new GuiAlveary(player.inventory, getTileForestry(world, x, y, z, player, TileAlvearyPlain.class));
case AlvearySieveGUI:
return new GuiAlvearySieve(player.inventory, getTileForestry(world, x, y, z, player, TileAlvearySieve.class));
case AlvearySwarmerGUI:
return new GuiAlvearySwarmer(player.inventory, getTileForestry(world, x, y, z, player, TileAlvearySwarmer.class));
case ApiaristChestGUI:
return getNaturalistChestGui(BeeHelper.UID, player, world, x, y, z, guiData);
case ApiaryGUI:
return new GuiApiary(player.inventory, getTileForestry(world, x, y, z, player, TileApiary.class));
case BeealyzerGUI:
equipped = player.getCurrentEquippedItem();
if (equipped == null) {
return null;
}
return new GuiBeealyzer(player, new BeealyzerInventory(player, equipped));
case BeehouseGUI:
return new GuiApiary(player.inventory, getTileForestry(world, x, y, z, player, TileBeehouse.class));
case HabitatLocatorGUI:
equipped = player.getCurrentEquippedItem();
if (equipped == null) {
return null;
}
return new GuiHabitatLocator(player, new HabitatLocatorInventory(player, equipped));
case HygroregulatorGUI:
return new GuiAlvearyHygroregulator(player.inventory, getTileForestry(world, x, y, z, player, TileAlvearyHygroregulator.class));
case ImprinterGUI:
equipped = player.getCurrentEquippedItem();
if (equipped == null) {
return null;
}
return new GuiImprinter(player.inventory, new ImprinterInventory(player, equipped));
default:
return null;
}
}
@Override
public Object getServerGuiElement(int id, EntityPlayer player, World world, int x, int y, int z) {
int cleanId = decodeGuiID(id);
int guiData = decodeGuiData(id);
if (cleanId >= GuiId.values().length) {
return null;
}
ItemStack equipped;
switch (GuiId.values()[cleanId]) {
case AlvearyGUI:
synchApiaristTracker(world, player);
return new ContainerAlveary(player.inventory, getTileForestry(world, x, y, z, player, TileAlvearyPlain.class));
case AlvearySieveGUI:
return new ContainerAlvearySieve(player.inventory, getTileForestry(world, x, y, z, player, TileAlvearySieve.class));
case AlvearySwarmerGUI:
return new ContainerAlvearySwarmer(player.inventory, getTileForestry(world, x, y, z, player, TileAlvearySwarmer.class));
case ApiaristChestGUI:
return getNaturalistChestContainer(BeeHelper.UID, player, world, x, y, z, guiData);
case ApiaryGUI:
synchApiaristTracker(world, player);
return new ContainerApiary(player.inventory, getTileForestry(world, x, y, z, player, TileApiary.class), true);
case BeealyzerGUI:
equipped = player.getCurrentEquippedItem();
if (equipped == null) {
return null;
}
synchApiaristTracker(world, player);
return new ContainerAlyzer(new BeealyzerInventory(player, equipped), player);
case BeehouseGUI:
synchApiaristTracker(world, player);
return new ContainerApiary(player.inventory, getTileForestry(world, x, y, z, player, TileBeehouse.class), false);
case HabitatLocatorGUI:
equipped = player.getCurrentEquippedItem();
if (equipped == null) {
return null;
}
return new ContainerHabitatLocator(player, new HabitatLocatorInventory(player, equipped));
case HygroregulatorGUI:
return new ContainerAlvearyHygroregulator(player.inventory, getTileForestry(world, x, y, z, player, TileAlvearyHygroregulator.class));
case ImprinterGUI:
synchApiaristTracker(world, player);
equipped = player.getCurrentEquippedItem();
if (equipped == null) {
return null;
}
return new ContainerImprinter(player.inventory, new ImprinterInventory(player, equipped));
default:
return null;
}
}
private static void synchApiaristTracker(World world, EntityPlayer player) {
BeeManager.beeRoot.getBreedingTracker(world, player.getGameProfile()).synchToPlayer(player);
}
}
@@ -1,115 +0,0 @@
/*******************************************************************************
* Copyright (c) 2011-2014 SirSengir.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU Lesser Public License v3
* which accompanies this distribution, and is available at
* http://www.gnu.org/licenses/lgpl-3.0.txt
*
* Various Contributors including, but not limited to:
* SirSengir (original work), CovertJaguar, Player, Binnie, MysteriousAges
******************************************************************************/
package forestry.apiculture;
import java.util.Random;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.ChunkCoordinates;
import net.minecraft.world.World;
import forestry.api.apiculture.BeeManager;
import forestry.api.apiculture.FlowerManager;
import forestry.api.apiculture.IBee;
import forestry.api.apiculture.IBeeHousing;
import forestry.api.apiculture.IBeeModifier;
import forestry.api.core.INBTTagable;
import forestry.api.genetics.IFlowerProvider;
import forestry.core.utils.vect.Vect;
import forestry.plugins.PluginApiculture;
public class HasFlowersCache implements INBTTagable {
private static final String nbtKey = "hasFlowerCache";
private static final Random random = new Random();
private static final int flowerCheckInterval = 128;
private final int flowerCheckTime = random.nextInt(flowerCheckInterval);
private ChunkCoordinates flowerCoords = null;
private int cooldown = 0;
public boolean hasFlowers(IBee queen, IBeeHousing beeHousing) {
IFlowerProvider flowerProvider = queen.getGenome().getFlowerProvider();
String flowerType = flowerProvider.getFlowerType();
World world = beeHousing.getWorld();
if (flowerCoords != null) {
if (world.getTotalWorldTime() % flowerCheckInterval != flowerCheckTime) {
return true;
}
IBeeModifier beeModifier = BeeManager.beeRoot.createBeeHousingModifier(beeHousing);
ChunkCoordinates housingCoords = beeHousing.getCoordinates();
int[] genomeTerritory = queen.getGenome().getTerritory();
float housingModifier = beeModifier.getTerritoryModifier(queen.getGenome(), 1f);
Vect area = new Vect(genomeTerritory).multiply(housingModifier * 3.0f);
Vect min = new Vect(area).multiply(-0.5f).add(housingCoords);
Vect max = new Vect(area).multiply(0.5f).add(housingCoords);
if (isFlowerValid(world, flowerType, min, max)) {
return true;
} else {
flowerCoords = null;
cooldown = 0;
}
}
if (cooldown <= 0) {
flowerCoords = FlowerManager.flowerRegistry.getAcceptedFlowerCoordinates(beeHousing, queen, flowerType);
cooldown = PluginApiculture.ticksPerBeeWorkCycle;
} else {
cooldown--;
}
return flowerCoords != null;
}
private boolean isFlowerValid(World world, String flowerType, Vect min, Vect max) {
if (!isFlowerCoordInRange(flowerCoords, min, max)) {
return false;
}
return FlowerManager.flowerRegistry.isAcceptedFlower(flowerType, world, flowerCoords.posX, flowerCoords.posY, flowerCoords.posZ);
}
private static boolean isFlowerCoordInRange(ChunkCoordinates flowerCoords, Vect min, Vect max) {
return flowerCoords.posX >= min.x && flowerCoords.posX <= max.x && flowerCoords.posY >= min.y && flowerCoords.posY <= max.y && flowerCoords.posZ >= min.z && flowerCoords.posZ <= max.z;
}
@Override
public void readFromNBT(NBTTagCompound nbttagcompound) {
if (!nbttagcompound.hasKey(nbtKey)) {
return;
}
NBTTagCompound hasFlowerCacheNBT = nbttagcompound.getCompoundTag(nbtKey);
if (hasFlowerCacheNBT.hasKey("flowerX")) {
int x = hasFlowerCacheNBT.getInteger("flowerX");
int y = hasFlowerCacheNBT.getInteger("flowerY");
int z = hasFlowerCacheNBT.getInteger("flowerZ");
flowerCoords = new ChunkCoordinates(x, y, z);
}
cooldown = hasFlowerCacheNBT.getInteger("cooldown");
}
@Override
public void writeToNBT(NBTTagCompound nbttagcompound) {
NBTTagCompound hasFlowerCacheNBT = new NBTTagCompound();
if (flowerCoords != null) {
hasFlowerCacheNBT.setInteger("flowerX", flowerCoords.posX);
hasFlowerCacheNBT.setInteger("flowerY", flowerCoords.posY);
hasFlowerCacheNBT.setInteger("flowerZ", flowerCoords.posZ);
}
hasFlowerCacheNBT.setInteger("cooldown", cooldown);
nbttagcompound.setTag(nbtKey, hasFlowerCacheNBT);
}
}
@@ -1,18 +0,0 @@
/*******************************************************************************
* Copyright (c) 2011-2014 SirSengir.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU Lesser Public License v3
* which accompanies this distribution, and is available at
* http://www.gnu.org/licenses/lgpl-3.0.txt
*
* Various Contributors including, but not limited to:
* SirSengir (original work), CovertJaguar, Player, Binnie, MysteriousAges
******************************************************************************/
package forestry.apiculture;
import forestry.api.apiculture.IBeeHousing;
import forestry.apiculture.inventory.IApiaryInventory;
public interface IApiary extends IBeeHousing {
IApiaryInventory getApiaryInventory();
}
@@ -1,78 +0,0 @@
/*******************************************************************************
* Copyright (c) 2011-2014 SirSengir.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU Lesser Public License v3
* which accompanies this distribution, and is available at
* http://www.gnu.org/licenses/lgpl-3.0.txt
*
* Various Contributors including, but not limited to:
* SirSengir (original work), CovertJaguar, Player, Binnie, MysteriousAges
******************************************************************************/
package forestry.apiculture;
import net.minecraft.item.ItemStack;
import forestry.api.apiculture.BeeManager;
import forestry.api.apiculture.EnumBeeType;
import forestry.api.apiculture.IBeeHousingInventory;
import forestry.core.access.IAccessHandler;
import forestry.core.inventory.InventoryAdapterRestricted;
import forestry.core.utils.InventoryUtil;
import forestry.core.utils.SlotUtil;
public class InventoryBeeHousing extends InventoryAdapterRestricted implements IBeeHousingInventory {
public static final int SLOT_QUEEN = 0;
public static final int SLOT_DRONE = 1;
public static final int SLOT_PRODUCT_1 = 2;
public static final int SLOT_PRODUCT_COUNT = 7;
public InventoryBeeHousing(int size, IAccessHandler accessHandler) {
super(size, "Items", accessHandler);
}
@Override
public boolean canSlotAccept(int slotIndex, ItemStack itemStack) {
EnumBeeType beeType = BeeManager.beeRoot.getType(itemStack);
if (slotIndex == SLOT_QUEEN) {
return beeType == EnumBeeType.QUEEN || beeType == EnumBeeType.PRINCESS;
} else if (slotIndex == SLOT_DRONE) {
return beeType == EnumBeeType.DRONE;
}
return false;
}
@Override
public boolean canExtractItem(int slotIndex, ItemStack itemstack, int side) {
if (!super.canExtractItem(slotIndex, itemstack, side)) {
return false;
}
return SlotUtil.isSlotInRange(slotIndex, SLOT_PRODUCT_1, SLOT_PRODUCT_COUNT);
}
@Override
public final ItemStack getQueen() {
return getStackInSlot(SLOT_QUEEN);
}
@Override
public final ItemStack getDrone() {
return getStackInSlot(SLOT_DRONE);
}
@Override
public final void setQueen(ItemStack itemstack) {
setInventorySlotContents(SLOT_QUEEN, itemstack);
}
@Override
public final void setDrone(ItemStack itemstack) {
setInventorySlotContents(SLOT_DRONE, itemstack);
}
@Override
public final boolean addProduct(ItemStack product, boolean all) {
return InventoryUtil.tryAddStack(this, product, SLOT_PRODUCT_1, SLOT_PRODUCT_COUNT, all, true);
}
}
@@ -13,7 +13,7 @@ package forestry.apiculture;
import net.minecraft.world.World;
import forestry.api.apiculture.BeeManager;
import forestry.core.ISaveEventHandler;
import forestry.core.interfaces.ISaveEventHandler;
public class SaveEventHandlerApiculture implements ISaveEventHandler {
@@ -23,17 +23,17 @@ import net.minecraft.village.MerchantRecipeList;
import net.minecraft.world.gen.structure.MapGenStructureIO;
import net.minecraft.world.gen.structure.StructureVillagePieces;
import net.minecraftforge.oredict.OreDictionary;
import cpw.mods.fml.common.registry.VillagerRegistry.IVillageCreationHandler;
import cpw.mods.fml.common.registry.VillagerRegistry.IVillageTradeHandler;
import forestry.api.apiculture.EnumBeeType;
import forestry.apiculture.blocks.BlockApicultureType;
import forestry.apiculture.genetics.BeeDefinition;
import forestry.apiculture.items.ItemHoneycomb;
import forestry.apiculture.worldgen.ComponentVillageBeeHouse;
import forestry.core.utils.Log;
import forestry.plugins.PluginApiculture;
import forestry.core.config.Defaults;
import forestry.core.config.ForestryBlock;
import forestry.core.config.ForestryItem;
import forestry.core.proxy.Proxies;
public class VillageHandlerApiculture implements IVillageCreationHandler, IVillageTradeHandler {
@@ -41,45 +41,18 @@ public class VillageHandlerApiculture implements IVillageCreationHandler, IVilla
try {
MapGenStructureIO.func_143031_a(ComponentVillageBeeHouse.class, "Forestry:BeeHouse");
} catch (Throwable e) {
Log.severe("Failed to register village beehouse.");
Proxies.log.severe("Failed to register village beehouse.");
}
}
@SuppressWarnings("unchecked")
@Override
public void manipulateTradesForVillager(EntityVillager villager, MerchantRecipeList recipeList, Random random) {
ItemStack wildcardPrincess = new ItemStack(PluginApiculture.items.beePrincessGE, 1, OreDictionary.WILDCARD_VALUE);
ItemStack wildcardDrone = new ItemStack(PluginApiculture.items.beeDroneGE, 4, OreDictionary.WILDCARD_VALUE);
recipeList.add(new MerchantRecipe(wildcardPrincess, new ItemStack(Items.emerald, 1)));
ItemStack randomComb = PluginApiculture.items.beeComb.getRandomComb(1, random, false);
recipeList.add(new MerchantRecipe(new ItemStack(Items.wheat, 2), randomComb));
ItemStack apiary = PluginApiculture.blocks.apiculture.get(BlockApicultureType.APIARY);
recipeList.add(new MerchantRecipe(new ItemStack(Blocks.log, 24, OreDictionary.WILDCARD_VALUE), apiary));
ItemStack provenFrames = PluginApiculture.items.frameProven.getItemStack(6);
recipeList.add(new MerchantRecipe(new ItemStack(Items.emerald, 1), provenFrames));
ItemStack monasticDrone = BeeDefinition.MONASTIC.getMemberStack(EnumBeeType.DRONE);
recipeList.add(new MerchantRecipe(new ItemStack(Items.emerald, 12), wildcardPrincess, monasticDrone));
ItemStack endDrone = BeeDefinition.ENDED.getMemberStack(EnumBeeType.DRONE);
recipeList.add(new MerchantRecipe(new ItemStack(Items.ender_eye, 16), wildcardPrincess, endDrone));
ItemStack propolis = new ItemStack(PluginApiculture.items.propolis,1);
ItemStack forestDrone = BeeDefinition.FOREST.getMemberStack(EnumBeeType.DRONE);
ItemStack meadowsDrone = BeeDefinition.MEADOWS.getMemberStack(EnumBeeType.DRONE);
ItemStack modestDrone = BeeDefinition.MODEST.getMemberStack(EnumBeeType.DRONE);
ItemStack tropicalDrone = BeeDefinition.TROPICAL.getMemberStack(EnumBeeType.DRONE);
ItemStack wintryDrone = BeeDefinition.WINTRY.getMemberStack(EnumBeeType.DRONE);
ItemStack marshyDrone = BeeDefinition.MARSHY.getMemberStack(EnumBeeType.DRONE);
recipeList.add(new MerchantRecipe(propolis, wildcardDrone, forestDrone));
recipeList.add(new MerchantRecipe(propolis, wildcardDrone, meadowsDrone));
recipeList.add(new MerchantRecipe(propolis, wildcardDrone, modestDrone));
recipeList.add(new MerchantRecipe(propolis, wildcardDrone, tropicalDrone));
recipeList.add(new MerchantRecipe(propolis, wildcardDrone, wintryDrone));
recipeList.add(new MerchantRecipe(propolis, wildcardDrone, marshyDrone));
recipeList.add(new MerchantRecipe(ForestryItem.beePrincessGE.getItemStack(1, Defaults.WILDCARD), new ItemStack(Items.emerald, 1)));
recipeList.add(new MerchantRecipe(new ItemStack(Items.wheat, 2), ItemHoneycomb.getRandomComb(1, random, false)));
recipeList.add(new MerchantRecipe(new ItemStack(Blocks.log, 24, Defaults.WILDCARD), ForestryBlock.apiculture.getItemStack(1, Defaults.DEFINITION_APIARY_META)));
recipeList.add(new MerchantRecipe(new ItemStack(Items.emerald, 1), ForestryItem.frameProven.getItemStack(6)));
recipeList.add(new MerchantRecipe(new ItemStack(Items.emerald, 12), ForestryItem.beePrincessGE.getItemStack(1, Defaults.WILDCARD), BeeDefinition.MONASTIC.getMemberStack(EnumBeeType.DRONE)));
}
@Override
@@ -1,22 +0,0 @@
/*******************************************************************************
* Copyright (c) 2011-2014 SirSengir.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU Lesser Public License v3
* which accompanies this distribution, and is available at
* http://www.gnu.org/licenses/lgpl-3.0.txt
*
* Various Contributors including, but not limited to:
* SirSengir (original work), CovertJaguar, Player, Binnie, MysteriousAges
******************************************************************************/
package forestry.apiculture.blocks;
import forestry.api.core.Tabs;
import forestry.core.blocks.BlockBase;
public class BlockApiculture extends BlockBase<BlockApicultureType> {
public BlockApiculture() {
super();
setCreativeTab(Tabs.tabApiculture);
setHarvestLevel("axe", 0);
}
}
@@ -1,58 +0,0 @@
/*******************************************************************************
* Copyright (c) 2011-2014 SirSengir.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU Lesser Public License v3
* which accompanies this distribution, and is available at
* http://www.gnu.org/licenses/lgpl-3.0.txt
*
* Various Contributors including, but not limited to:
* SirSengir (original work), CovertJaguar, Player, Binnie, MysteriousAges
******************************************************************************/
package forestry.apiculture.blocks;
import java.util.Locale;
import org.apache.commons.lang3.text.WordUtils;
import forestry.apiculture.tiles.TileApiaristChest;
import forestry.apiculture.tiles.TileApiary;
import forestry.apiculture.tiles.TileBeehouse;
import forestry.core.blocks.IMachineProperties;
import forestry.core.tiles.TileForestry;
public enum BlockApicultureType implements IMachineProperties {
APIARY(TileApiary.class),
APIARIST_CHEST_LEGACY(TileApiaristChest.class, "ApiaristChest"),
BEEHOUSE(TileBeehouse.class);
public static final BlockApicultureType[] VALUES = values();
private final String teIdent;
private final Class<? extends TileForestry> teClass;
BlockApicultureType(Class<? extends TileForestry> teClass) {
String name = toString().toLowerCase(Locale.ENGLISH);
this.teIdent = "forestry." + WordUtils.capitalize(name);
this.teClass = teClass;
}
BlockApicultureType(Class<? extends TileForestry> teClass, String name) {
this.teIdent = "forestry." + name;
this.teClass = teClass;
}
@Override
public int getMeta() {
return ordinal();
}
@Override
public String getTeIdent() {
return teIdent;
}
@Override
public Class<? extends TileForestry> getTeClass() {
return teClass;
}
}
@@ -1,41 +0,0 @@
/*******************************************************************************
* Copyright (c) 2011-2014 SirSengir.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU Lesser Public License v3
* which accompanies this distribution, and is available at
* http://www.gnu.org/licenses/lgpl-3.0.txt
*
* Various Contributors including, but not limited to:
* SirSengir (original work), CovertJaguar, Player, Binnie, MysteriousAges
******************************************************************************/
package forestry.apiculture.blocks;
import forestry.api.core.Tabs;
import forestry.apiculture.items.ItemBlockCandle;
import forestry.core.blocks.BlockBase;
import forestry.core.blocks.BlockRegistry;
import forestry.core.items.ItemBlockForestry;
public class BlockRegistryApiculture extends BlockRegistry {
public final BlockApiculture apiculture;
public final BlockBase apicultureChest;
public final BlockBeehives beehives;
public final BlockCandle candle;
public final BlockStump stump;
public final BlockAlveary alveary;
public BlockRegistryApiculture() {
apiculture = registerBlock(new BlockApiculture(), ItemBlockForestry.class, "apiculture");
apicultureChest = registerBlock(new BlockBase(true), ItemBlockForestry.class, "apicultureChest");
apicultureChest.setCreativeTab(Tabs.tabApiculture);
apicultureChest.setHarvestLevel("axe", 0);
beehives = registerBlock(new BlockBeehives(), ItemBlockForestry.class, "beehives");
candle = registerBlock(new BlockCandle(), ItemBlockCandle.class, "candle");
stump = registerBlock(new BlockStump(), ItemBlockForestry.class, "stump");
alveary = registerBlock(new BlockAlveary(), ItemBlockForestry.class, "alveary");
}
}
@@ -25,7 +25,7 @@ public class BeeModeHelper implements ICommandModeHelper {
public String[] getModeNames() {
ArrayList<IBeekeepingMode> beekeepingModes = BeeManager.beeRoot.getBeekeepingModes();
int modeStringCount = beekeepingModes.size();
List<String> modeStrings = new ArrayList<>(modeStringCount);
List<String> modeStrings = new ArrayList<String>(modeStringCount);
for (IBeekeepingMode mode : beekeepingModes) {
modeStrings.add(mode.getName());
}
@@ -53,7 +53,7 @@ public class BeeStatsSaveHelper implements IStatsSaveHelper {
@Override
public Collection<IAlleleSpecies> getSpecies() {
Collection<IAlleleSpecies> species = new ArrayList<>();
Collection<IAlleleSpecies> species = new ArrayList<IAlleleSpecies>();
for (IAllele allele : AlleleManager.alleleRegistry.getRegisteredAlleles().values()) {
if (allele instanceof IAlleleBeeSpecies) {
species.add((IAlleleBeeSpecies) allele);
@@ -39,7 +39,7 @@ public class CommandBeeGive extends SubCommand {
super("give");
setPermLevel(PermLevel.ADMIN);
List<String> beeTypeStrings = new ArrayList<>();
List<String> beeTypeStrings = new ArrayList<String>();
for (EnumBeeType type : EnumBeeType.values()) {
if (type == EnumBeeType.NONE) {
continue;
@@ -150,8 +150,8 @@ public class CommandBeeGive extends SubCommand {
return null;
}
private static String[] getSpecies() {
List<String> species = new ArrayList<>();
String[] getSpecies() {
List<String> species = new ArrayList<String>();
for (IAllele allele : AlleleManager.alleleRegistry.getRegisteredAlleles().values()) {
if (allele instanceof IAlleleBeeSpecies) {
@@ -162,7 +162,7 @@ public class CommandBeeGive extends SubCommand {
return species.toArray(new String[species.size()]);
}
private static EnumBeeType getBeeType(String beeTypeName) {
EnumBeeType getBeeType(String beeTypeName) {
for (EnumBeeType beeType : EnumBeeType.values()) {
if (beeType.getName().equalsIgnoreCase(beeTypeName)) {
return beeType;
@@ -22,16 +22,16 @@ import forestry.api.apiculture.BeeManager;
import forestry.api.apiculture.EnumBeeType;
import forestry.api.apiculture.IAlleleBeeSpecies;
import forestry.api.apiculture.IBee;
import forestry.core.config.Constants;
import forestry.core.render.ForestryResource;
import forestry.core.config.Defaults;
import forestry.core.utils.ForestryResource;
public class EntityBee extends EntityCreature implements IAnimals {
private static final String DEFAULT_TEXTURE = Constants.TEXTURE_PATH_ENTITIES + "/bees/honeyBee.png";
private static final String DEFAULT_TEXTURE = Defaults.TEXTURE_PATH_ENTITIES + "/bees/honeyBee.png";
private IBee contained;
private IAlleleBeeSpecies species;
private EnumBeeType type = EnumBeeType.DRONE;
IBee contained;
IAlleleBeeSpecies species;
EnumBeeType type = EnumBeeType.DRONE;
private String beeTexture = DEFAULT_TEXTURE;
private long lastUpdate;
@@ -1,121 +0,0 @@
/*******************************************************************************
* Copyright (c) 2011-2014 SirSengir.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU Lesser Public License v3
* which accompanies this distribution, and is available at
* http://www.gnu.org/licenses/lgpl-3.0.txt
*
* Various Contributors including, but not limited to:
* SirSengir (original work), CovertJaguar, Player, Binnie, MysteriousAges
******************************************************************************/
package forestry.apiculture.entities;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import net.minecraft.block.Block;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.world.World;
import forestry.api.apiculture.IBeeHousingInventory;
import forestry.api.apiculture.IBeeListener;
import forestry.api.apiculture.IBeeModifier;
import forestry.api.apiculture.IHiveFrame;
import forestry.apiculture.ApiaryBeeListener;
import forestry.apiculture.ApiaryBeeModifier;
import forestry.apiculture.IApiary;
import forestry.apiculture.blocks.BlockApicultureType;
import forestry.apiculture.gui.ContainerMinecartBeehouse;
import forestry.apiculture.gui.GuiBeeHousing;
import forestry.apiculture.inventory.IApiaryInventory;
import forestry.apiculture.inventory.InventoryApiary;
import forestry.core.config.Config;
import forestry.core.inventory.IInventoryAdapter;
import forestry.plugins.PluginApiculture;
public class EntityMinecartApiary extends EntityMinecartBeeHousingBase implements IApiary {
private static final IBeeModifier beeModifier = new ApiaryBeeModifier();
private final IBeeListener beeListener = new ApiaryBeeListener(this);
private final InventoryApiary inventory = new InventoryApiary(getAccessHandler());
@SuppressWarnings("unused")
public EntityMinecartApiary(World world) {
super(world);
}
public EntityMinecartApiary(World world, double posX, double posY, double posZ) {
super(world, posX, posY, posZ);
}
@Override
public List<String> getHints() {
return Config.hints.get("apiary");
}
@Override
protected IInventoryAdapter getInternalInventory() {
return inventory;
}
@Override
public IApiaryInventory getApiaryInventory() {
return inventory;
}
@Override
public IBeeHousingInventory getBeeInventory() {
return inventory;
}
@Override
public Block func_145820_n() {
return PluginApiculture.blocks.apiculture;
}
@Override
public int getDisplayTileData() {
return BlockApicultureType.APIARY.ordinal();
}
@Override
public ItemStack getCartItem() {
return PluginApiculture.items.minecartBeehouse.getApiaryMinecart();
}
@Override
public Collection<IBeeModifier> getBeeModifiers() {
List<IBeeModifier> beeModifiers = new ArrayList<>();
beeModifiers.add(beeModifier);
for (IHiveFrame frame : inventory.getFrames()) {
beeModifiers.add(frame.getBeeModifier());
}
return beeModifiers;
}
@Override
public Iterable<IBeeListener> getBeeListeners() {
return Collections.singleton(beeListener);
}
@Override
public Object getGui(EntityPlayer player, int data) {
ContainerMinecartBeehouse container = new ContainerMinecartBeehouse(player.inventory, this, true);
return new GuiBeeHousing<>(this, container, GuiBeeHousing.Icon.APIARY);
}
@Override
public Object getContainer(EntityPlayer player, int data) {
return new ContainerMinecartBeehouse(player.inventory, this, true);
}
@Override
public int getIdOfEntity() {
return getEntityId();
}
}
@@ -1,184 +0,0 @@
/*******************************************************************************
* Copyright (c) 2011-2014 SirSengir.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU Lesser Public License v3
* which accompanies this distribution, and is available at
* http://www.gnu.org/licenses/lgpl-3.0.txt
*
* Various Contributors including, but not limited to:
* SirSengir (original work), CovertJaguar, Player, Binnie, MysteriousAges
******************************************************************************/
package forestry.apiculture.entities;
import java.io.IOException;
import java.util.Random;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.ChunkCoordinates;
import net.minecraft.util.Vec3;
import net.minecraft.world.World;
import net.minecraft.world.biome.BiomeGenBase;
import com.mojang.authlib.GameProfile;
import forestry.api.apiculture.BeeManager;
import forestry.api.apiculture.IBeeHousing;
import forestry.api.apiculture.IBeekeepingLogic;
import forestry.api.core.EnumHumidity;
import forestry.api.core.EnumTemperature;
import forestry.api.core.ForestryAPI;
import forestry.api.core.IErrorLogic;
import forestry.apiculture.gui.IGuiBeeHousingInventory;
import forestry.apiculture.network.packets.PacketBeeLogicEntityRequest;
import forestry.apiculture.tiles.TileBeeHousingBase;
import forestry.core.entities.EntityMinecartContainerForestry;
import forestry.core.network.DataInputStreamForestry;
import forestry.core.network.DataOutputStreamForestry;
import forestry.core.network.IForestryPacketServer;
import forestry.core.network.IStreamableGui;
import forestry.core.proxy.Proxies;
import forestry.core.tiles.IClimatised;
public abstract class EntityMinecartBeeHousingBase extends EntityMinecartContainerForestry implements IBeeHousing, IGuiBeeHousingInventory, IClimatised, IStreamableGui {
private static final Random random = new Random();
private static final int beeFXInterval = 4;
private static final int pollenFXInterval = 50;
private final int beeFXTime = random.nextInt(beeFXInterval);
private final int pollenFXTime = random.nextInt(pollenFXInterval);
private final IBeekeepingLogic beeLogic = BeeManager.beeRoot.createBeekeepingLogic(this);
private final IErrorLogic errorLogic = ForestryAPI.errorStateRegistry.createErrorLogic();
// CLIENT
private int breedingProgressPercent = 0;
private boolean needsActiveUpdate = true;
@SuppressWarnings("unused")
public EntityMinecartBeeHousingBase(World world) {
super(world);
}
public EntityMinecartBeeHousingBase(World world, double posX, double posY, double posZ) {
super(world, posX, posY, posZ);
}
/* IBeeHousing */
@Override
public IBeekeepingLogic getBeekeepingLogic() {
return beeLogic;
}
@Override
public EnumTemperature getTemperature() {
return EnumTemperature.getFromBiome(getBiome(), (int) posX, (int) posY, (int) posZ);
}
@Override
public EnumHumidity getHumidity() {
return EnumHumidity.getFromValue(getBiome().rainfall);
}
@Override
public float getExactTemperature() {
return getBiome().temperature;
}
@Override
public float getExactHumidity() {
return getBiome().rainfall;
}
@Override
public int getBlockLightValue() {
return worldObj.getBlockLightValue((int) posX, (int) posY + 1, (int) posZ);
}
@Override
public boolean canBlockSeeTheSky() {
return worldObj.canBlockSeeTheSky((int) posX, (int) posY + 1, (int) posZ);
}
@Override
public World getWorld() {
return worldObj;
}
@Override
public BiomeGenBase getBiome() {
return worldObj.getBiomeGenForCoords((int) posX, (int) posZ);
}
@Override
public GameProfile getOwner() {
return getAccessHandler().getOwner();
}
@Override
public IErrorLogic getErrorLogic() {
return errorLogic;
}
@Override
public ChunkCoordinates getCoordinates() {
return new ChunkCoordinates((int) posX, (int) posY, (int) posZ);
}
@Override
public Vec3 getBeeFXCoordinates() {
return Vec3.createVectorHelper(posX, posY + 0.25, posZ);
}
@Override
public void writeGuiData(DataOutputStreamForestry data) throws IOException {
data.writeVarInt(beeLogic.getBeeProgressPercent());
}
@Override
public void readGuiData(DataInputStreamForestry data) throws IOException {
breedingProgressPercent = data.readVarInt();
}
@Override
public int getHealthScaled(int i) {
return (breedingProgressPercent * i) / 100;
}
@Override
public void onUpdate() {
super.onUpdate();
if (!worldObj.isRemote) {
if (beeLogic.canWork()) {
beeLogic.doWork();
}
} else {
if (needsActiveUpdate) {
IForestryPacketServer packet = new PacketBeeLogicEntityRequest(this);
Proxies.net.sendToServer(packet);
needsActiveUpdate = false;
}
if (beeLogic.canDoBeeFX()) {
if (worldObj.getTotalWorldTime() % beeFXInterval == beeFXTime) {
beeLogic.doBeeFX();
}
if (worldObj.getTotalWorldTime() % pollenFXInterval == pollenFXTime) {
TileBeeHousingBase.doPollenFX(worldObj, posX - 0.5, posY - 0.1, posZ - 0.5);
}
}
}
}
@Override
protected void readEntityFromNBT(NBTTagCompound nbtTagCompound) {
super.readEntityFromNBT(nbtTagCompound);
beeLogic.readFromNBT(nbtTagCompound);
}
@Override
protected void writeEntityToNBT(NBTTagCompound nbtTagCompound) {
super.writeEntityToNBT(nbtTagCompound);
beeLogic.writeToNBT(nbtTagCompound);
}
}
@@ -1,106 +0,0 @@
/*******************************************************************************
* Copyright (c) 2011-2014 SirSengir.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU Lesser Public License v3
* which accompanies this distribution, and is available at
* http://www.gnu.org/licenses/lgpl-3.0.txt
*
* Various Contributors including, but not limited to:
* SirSengir (original work), CovertJaguar, Player, Binnie, MysteriousAges
******************************************************************************/
package forestry.apiculture.entities;
import java.util.Collections;
import java.util.List;
import net.minecraft.block.Block;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.world.World;
import forestry.api.apiculture.DefaultBeeListener;
import forestry.api.apiculture.IBeeHousingInventory;
import forestry.api.apiculture.IBeeListener;
import forestry.api.apiculture.IBeeModifier;
import forestry.apiculture.BeehouseBeeModifier;
import forestry.apiculture.InventoryBeeHousing;
import forestry.apiculture.blocks.BlockApicultureType;
import forestry.apiculture.gui.ContainerMinecartBeehouse;
import forestry.apiculture.gui.GuiBeeHousing;
import forestry.core.config.Config;
import forestry.core.inventory.IInventoryAdapter;
import forestry.plugins.PluginApiculture;
public class EntityMinecartBeehouse extends EntityMinecartBeeHousingBase {
private static final IBeeModifier beeModifier = new BeehouseBeeModifier();
private static final IBeeListener beeListener = new DefaultBeeListener();
private final InventoryBeeHousing beeInventory = new InventoryBeeHousing(9, getAccessHandler());
@SuppressWarnings("unused")
public EntityMinecartBeehouse(World world) {
super(world);
beeInventory.disableAutomation();
}
public EntityMinecartBeehouse(World world, double posX, double posY, double posZ) {
super(world, posX, posY, posZ);
beeInventory.disableAutomation();
}
@Override
public List<String> getHints() {
return Config.hints.get("bee.house");
}
@Override
public Block func_145820_n() {
return PluginApiculture.blocks.apiculture;
}
@Override
public int getDisplayTileData() {
return BlockApicultureType.BEEHOUSE.ordinal();
}
@Override
public ItemStack getCartItem() {
return PluginApiculture.items.minecartBeehouse.getBeeHouseMinecart();
}
/* IBeeHousing */
@Override
public Iterable<IBeeModifier> getBeeModifiers() {
return Collections.singleton(beeModifier);
}
@Override
public Iterable<IBeeListener> getBeeListeners() {
return Collections.singleton(beeListener);
}
@Override
public IBeeHousingInventory getBeeInventory() {
return beeInventory;
}
@Override
protected IInventoryAdapter getInternalInventory() {
return beeInventory;
}
@Override
public Object getGui(EntityPlayer player, int data) {
ContainerMinecartBeehouse container = new ContainerMinecartBeehouse(player.inventory, this, false);
return new GuiBeeHousing<>(this, container, GuiBeeHousing.Icon.BEE_HOUSE);
}
@Override
public Object getContainer(EntityPlayer player, int data) {
return new ContainerMinecartBeehouse(player.inventory, this, false);
}
@Override
public int getIdOfEntity() {
return getEntityId();
}
}
@@ -10,10 +10,6 @@
******************************************************************************/
package forestry.apiculture.flowers;
import com.google.common.base.Objects;
import javax.annotation.Nonnull;
import net.minecraft.block.Block;
import net.minecraftforge.oredict.OreDictionary;
@@ -48,15 +44,10 @@ final class Flower implements IFlower {
}
@Override
public int compareTo(@Nonnull IFlower other) {
public int compareTo(IFlower other) {
return this.weight.compareTo(other.getWeight());
}
@Override
public int hashCode() {
return Objects.hashCode(block);
}
@Override
public Block getBlock() {
return block;
@@ -76,10 +67,4 @@ final class Flower implements IFlower {
public void setWeight(double weight) {
this.weight = weight;
}
@Override
public String toString() {
return Objects.toStringHelper(this).add("block", block).add("meta", meta).add("weight", weight).toString();
}
}
@@ -11,7 +11,7 @@
package forestry.apiculture.flowers;
import java.util.EnumSet;
import java.util.Set;
import java.util.List;
import net.minecraft.item.ItemStack;
import net.minecraft.world.World;
@@ -36,8 +36,8 @@ public class FlowerProvider implements IFlowerProvider {
}
@Override
public String getFlowerType() {
return flowerType;
public boolean isAcceptedFlower(World world, IIndividual individual, int x, int y, int z) {
return FlowerManager.flowerRegistry.isAcceptedFlower(this.flowerType, world, individual, x, y, z);
}
@Override
@@ -45,13 +45,12 @@ public class FlowerProvider implements IFlowerProvider {
EnumSet<EnumPlantType> plantTypes = pollinatable.getPlantType();
switch (flowerType) {
case FlowerManager.FlowerTypeNether:
return plantTypes.contains(EnumPlantType.Nether);
case FlowerManager.FlowerTypeCacti:
return plantTypes.contains(EnumPlantType.Desert);
default:
return plantTypes.size() > 1 || !plantTypes.contains(EnumPlantType.Nether);
if (flowerType.equals(FlowerManager.FlowerTypeNether)) {
return plantTypes.contains(EnumPlantType.Nether);
} else if (flowerType.equals(FlowerManager.FlowerTypeCacti)) {
return plantTypes.contains(EnumPlantType.Desert);
} else {
return plantTypes.size() > 1 || !plantTypes.contains(EnumPlantType.Nether);
}
}
@@ -71,7 +70,7 @@ public class FlowerProvider implements IFlowerProvider {
}
@Override
public Set<IFlower> getFlowers() {
public List<IFlower> getFlowers() {
return FlowerManager.flowerRegistry.getAcceptableFlowers(this.flowerType);
}
@@ -11,80 +11,46 @@
package forestry.apiculture.flowers;
import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.HashMultimap;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Sets;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.Set;
import java.util.TreeMap;
import net.minecraft.block.Block;
import net.minecraft.block.BlockFlowerPot;
import net.minecraft.init.Blocks;
import net.minecraft.init.Items;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.tileentity.TileEntityFlowerPot;
import net.minecraft.util.ChunkCoordinates;
import net.minecraft.world.World;
import net.minecraftforge.common.IPlantable;
import net.minecraftforge.oredict.OreDictionary;
import cpw.mods.fml.common.registry.GameRegistry;
import forestry.api.apiculture.BeeManager;
import forestry.api.apiculture.FlowerManager;
import forestry.api.apiculture.IBee;
import forestry.api.apiculture.IBeeGenome;
import forestry.api.apiculture.IBeeHousing;
import forestry.api.apiculture.IBeeModifier;
import forestry.api.genetics.IFlower;
import forestry.api.genetics.IFlowerAcceptableRule;
import forestry.api.genetics.IFlowerGrowthHelper;
import forestry.api.genetics.IFlowerGrowthRule;
import forestry.api.genetics.IFlowerRegistry;
import forestry.api.genetics.IIndividual;
import forestry.core.config.Constants;
import forestry.core.utils.Log;
import forestry.core.utils.vect.MutableVect;
import forestry.core.utils.vect.Vect;
import forestry.plugins.PluginManager;
public final class FlowerRegistry implements IFlowerRegistry, IFlowerGrowthHelper {
private final Set<String> defaultFlowerTypes = ImmutableSet.of(
FlowerManager.FlowerTypeVanilla,
FlowerManager.FlowerTypeNether,
FlowerManager.FlowerTypeCacti,
FlowerManager.FlowerTypeMushrooms,
FlowerManager.FlowerTypeEnd,
FlowerManager.FlowerTypeJungle,
FlowerManager.FlowerTypeSnow,
FlowerManager.FlowerTypeWheat,
FlowerManager.FlowerTypeGourd
);
private final HashMultimap<String, IFlowerAcceptableRule> registeredRules; // custom check
private final HashMultimap<String, Block> registeredBlocks; // quick first check
private final HashMultimap<String, Flower> registeredFlowers; // full check
public final class FlowerRegistry implements IFlowerRegistry {
private final ArrayListMultimap<String, IFlower> registeredFlowers;
private final ArrayListMultimap<String, IFlowerGrowthRule> growthRules;
private final Map<String, TreeMap<Double, Flower>> chances;
private final Map<String, TreeMap<Double, IFlower>> chances;
private boolean hasDeprecatedFlowersImported;
public FlowerRegistry() {
this.registeredRules = HashMultimap.create();
this.registeredBlocks = HashMultimap.create();
this.registeredFlowers = HashMultimap.create();
this.registeredFlowers = ArrayListMultimap.create();
this.growthRules = ArrayListMultimap.create();
this.chances = new HashMap<>();
this.chances = new HashMap<String, TreeMap<Double, IFlower>>();
this.hasDeprecatedFlowersImported = false;
registerVanillaFlowers();
registerVanillaGrowthRules();
}
@@ -98,17 +64,6 @@ public final class FlowerRegistry implements IFlowerRegistry, IFlowerGrowthHelpe
registerFlower(block, meta, 0.0, flowerTypes);
}
@Override
public void registerAcceptableFlowerRule(IFlowerAcceptableRule acceptableFlower, String... flowerTypes) {
for (String flowerType : flowerTypes) {
if (defaultFlowerTypes.contains(flowerType)) {
Log.severe("IFlowerAcceptableRules are too slow to be applied to Forestry's built-in flower type: " + flowerType + ".");
} else {
registeredRules.put(flowerType, acceptableFlower);
}
}
}
@Override
public void registerPlantableFlower(Block block, int meta, double weight, String... flowerTypes) {
registerFlower(block, meta, weight, flowerTypes);
@@ -126,141 +81,67 @@ public final class FlowerRegistry implements IFlowerRegistry, IFlowerGrowthHelpe
}
Flower newFlower = new Flower(block, meta, weight);
Integer index;
for (String flowerType : flowerTypes) {
if (flowerType == null) {
throw new NullPointerException("Tried to register flower with null type. " + block);
List<IFlower> flowers = this.registeredFlowers.get(flowerType);
index = flowers.indexOf(newFlower);
if (index == -1) {
flowers.add(newFlower);
} else if (flowers.get(index).getMeta() != newFlower.getMeta()) {
flowers.add(newFlower);
} else if (flowers.get(index).getWeight() < newFlower.getWeight() && flowers.get(index).getMeta() == newFlower.getMeta()) {
flowers.get(index).setWeight(newFlower.getWeight());
}
Set<Flower> flowers = this.registeredFlowers.get(flowerType);
flowers.add(newFlower);
Set<Block> blocks = this.registeredBlocks.get(flowerType);
blocks.add(block);
if (this.chances.containsKey(flowerType)) {
this.chances.remove(flowerType);
}
}
}
private static Vect getArea(IBeeGenome genome, IBeeModifier beeModifier) {
int[] genomeTerritory = genome.getTerritory();
float housingModifier = beeModifier.getTerritoryModifier(genome, 1f);
return new Vect(genomeTerritory).multiply(housingModifier * 3.0f);
Collections.sort(this.registeredFlowers.get(flowerType));
}
}
@Override
public ChunkCoordinates getAcceptedFlowerCoordinates(IBeeHousing beeHousing, IBee bee, String flowerType) {
if (!this.registeredFlowers.containsKey(flowerType)) {
return null;
}
Set<IFlowerAcceptableRule> acceptableRules = this.registeredRules.get(flowerType);
Set<Block> acceptedBlocks = this.registeredBlocks.get(flowerType);
Set<Flower> acceptedFlowers = this.registeredFlowers.get(flowerType);
World world = beeHousing.getWorld();
IBeeModifier beeModifier = BeeManager.beeRoot.createBeeHousingModifier(beeHousing);
Vect area = getArea(bee.getGenome(), beeModifier);
Vect housingPos = new Vect(beeHousing.getCoordinates()).add(-area.x / 2, -area.y / 2, -area.z / 2);
MutableVect posCurrent = new MutableVect(0, 0, 0);
while (posCurrent.advancePositionInArea(area)) {
Vect posBlock = Vect.add(housingPos, posCurrent);
for (IFlowerAcceptableRule acceptableRule : acceptableRules) {
if (acceptableRule.isAcceptableFlower(flowerType, world, posBlock.x, posBlock.y, posBlock.z)) {
return new ChunkCoordinates(posBlock.x, posBlock.y, posBlock.z);
}
}
if (isAcceptedFlower(flowerType, acceptedBlocks, acceptedFlowers, world, posBlock.x, posBlock.y, posBlock.z)) {
return new ChunkCoordinates(posBlock.x, posBlock.y, posBlock.z);
}
}
return null;
}
@Override
public boolean isAcceptedFlower(String flowerType, World world, int x, int y, int z) {
public boolean isAcceptedFlower(String flowerType, World world, IIndividual individual, int x, int y, int z) {
internalInitialize();
if (!this.registeredFlowers.containsKey(flowerType)) {
return false;
}
Set<IFlowerAcceptableRule> acceptedCustom = this.registeredRules.get(flowerType);
for (IFlowerAcceptableRule acceptableFlower : acceptedCustom) {
if (acceptableFlower.isAcceptableFlower(flowerType, world, x, y, z)) {
return true;
}
}
Set<Block> acceptedBlocks = this.registeredBlocks.get(flowerType);
Set<Flower> acceptedFlowers = this.registeredFlowers.get(flowerType);
return isAcceptedFlower(flowerType, acceptedBlocks, acceptedFlowers, world, x, y, z);
}
private static boolean isAcceptedFlower(String flowerType, Set<Block> acceptedBlocks, Set<Flower> acceptedFlowers, World world, int x, int y, int z) {
Block block = world.getBlock(x, y, z);
final int meta;
if (block.isAir(world, x, y, z) || block.equals(Blocks.bedrock) || block.equals(Blocks.dirt) || block.equals(Blocks.grass)) {
return false;
}
if (block instanceof BlockFlowerPot) {
TileEntity tile = world.getTileEntity(x, y, z);
int meta;
TileEntity tile = world.getTileEntity(x, y, z);
if (tile instanceof TileEntityFlowerPot) {
TileEntityFlowerPot tileFlowerPot = (TileEntityFlowerPot) tile;
Item item = tileFlowerPot.getFlowerPotItem();
block = Block.getBlockFromItem(item);
meta = tileFlowerPot.getFlowerPotData();
} else {
if (!acceptedBlocks.contains(block)) {
return false;
}
meta = world.getBlockMetadata(x, y, z);
}
if (PluginManager.Module.AGRICRAFT.isEnabled()) {
Block cropBlock = GameRegistry.findBlock("AgriCraft", "crops");
if (block == cropBlock) {
if (block instanceof IPlantable) {
//For agricraft versions which implement IPlantable in the BlockCrop class
block = ((IPlantable) block).getPlant(world, x, y, z);
} else {
//For earlier versions of AgriCraft
ArrayList<ItemStack> drops = block.getDrops(world, x, y, z, 7, 0);
if (drops.get(1).getItem() == Items.wheat_seeds && flowerType.equals(FlowerManager.FlowerTypeWheat)) {
return true;
}
if (drops.get(1).getItem() == Items.nether_wart && flowerType.equals(FlowerManager.FlowerTypeNether)) {
return true;
}
}
}
}
Flower flower = new Flower(block, meta, 0);
List<IFlower> acceptedFlowers = this.registeredFlowers.get(flowerType);
return acceptedFlowers.contains(flower);
}
@Override
public boolean growFlower(String flowerType, World world, IIndividual individual, int x, int y, int z) {
internalInitialize();
if (!this.growthRules.containsKey(flowerType)) {
return false;
}
for (IFlowerGrowthRule rule : this.growthRules.get(flowerType)) {
boolean success;
try {
success = rule.growFlower(this, flowerType, world, x, y, z);
} catch (Throwable ignored) {
// legacy method
success = rule.growFlower(this, flowerType, world, individual, x, y, z);
}
if (success) {
if (rule.growFlower(this, flowerType, world, individual, x, y, z)) {
return true;
}
}
@@ -269,8 +150,10 @@ public final class FlowerRegistry implements IFlowerRegistry, IFlowerGrowthHelpe
}
@Override
public Set<IFlower> getAcceptableFlowers(String flowerType) {
return ImmutableSet.<IFlower>copyOf(this.registeredFlowers.get(flowerType));
public List<IFlower> getAcceptableFlowers(String flowerType) {
internalInitialize();
return this.registeredFlowers.get(flowerType);
}
@Override
@@ -286,21 +169,16 @@ public final class FlowerRegistry implements IFlowerRegistry, IFlowerGrowthHelpe
@Override
public IFlower getRandomPlantableFlower(String flowerType, Random rand) {
TreeMap<Double, Flower> chancesMap = getChancesMap(flowerType);
TreeMap<Double, IFlower> chancesMap = getChancesMap(flowerType);
double maxKey = chancesMap.lastKey() + 1.0;
return chancesMap.get(chancesMap.lowerKey(rand.nextDouble() * maxKey));
}
@Override
public Collection<String> getFlowerTypes() {
return new ArrayList<>(Sets.union(defaultFlowerTypes, registeredFlowers.keySet()));
}
private TreeMap<Double, Flower> getChancesMap(String flowerType) {
private TreeMap<Double, IFlower> getChancesMap(String flowerType) {
if (!this.chances.containsKey(flowerType)) {
TreeMap<Double, Flower> flowerChances = new TreeMap<>();
TreeMap<Double, IFlower> flowerChances = new TreeMap<Double, IFlower>();
double count = 0.0;
for (Flower flower : this.registeredFlowers.get(flowerType)) {
for (IFlower flower : this.registeredFlowers.get(flowerType)) {
if (flower.isPlantable()) {
flowerChances.put(count, flower);
count += flower.getWeight();
@@ -311,20 +189,63 @@ public final class FlowerRegistry implements IFlowerRegistry, IFlowerGrowthHelpe
return this.chances.get(flowerType);
}
private void registerVanillaGrowthRules() {
registerGrowthRule(new GrowthRuleDirtGrass(), FlowerManager.FlowerTypeVanilla, FlowerManager.FlowerTypeSnow);
registerGrowthRule(new GrowthRuleSnow(), FlowerManager.FlowerTypeSnow);
registerGrowthRule(new GrowthRuleFlowerPot(), FlowerManager.FlowerTypeVanilla, FlowerManager.FlowerTypeSnow, FlowerManager.FlowerTypeMushrooms, FlowerManager.FlowerTypeCacti,
FlowerManager.FlowerTypeJungle);
registerGrowthRule(new GrowthRuleMycelium(), FlowerManager.FlowerTypeMushrooms);
registerGrowthRule(new GrowthRuleNone(), FlowerManager.FlowerTypeEnd);
registerGrowthRule(new GrowthRuleFertilize(Blocks.melon_stem, Blocks.pumpkin_stem), FlowerManager.FlowerTypeGourd);
registerGrowthRule(new GrowthRuleFertilize(Blocks.wheat), FlowerManager.FlowerTypeWheat);
/*
* Method to support deprecated FlowerManager.plainFlowers
*/
@SuppressWarnings("deprecation")
private void internalInitialize() {
if (!hasDeprecatedFlowersImported) {
for (ItemStack plainFlower : FlowerManager.plainFlowers) {
Block flowerBlock = Block.getBlockFromItem(plainFlower.getItem());
int meta = plainFlower.getItemDamage();
registerPlantableFlower(flowerBlock, meta, 1.0, FlowerManager.FlowerTypeVanilla, FlowerManager.FlowerTypeSnow);
}
hasDeprecatedFlowersImported = true;
}
}
@Override
public boolean plantRandomFlower(String flowerType, World world, int x, int y, int z) {
IFlower flower = getRandomPlantableFlower(flowerType, world.rand);
return world.setBlock(x, y, z, flower.getBlock(), flower.getMeta(), Constants.FLAG_BLOCK_SYNCH);
private void registerVanillaFlowers() {
// Register acceptable plants
registerAcceptableFlower(Blocks.red_flower, FlowerManager.FlowerTypeVanilla, FlowerManager.FlowerTypeSnow);
registerAcceptableFlower(Blocks.yellow_flower, FlowerManager.FlowerTypeVanilla, FlowerManager.FlowerTypeSnow);
registerAcceptableFlower(Blocks.brown_mushroom, FlowerManager.FlowerTypeMushrooms);
registerAcceptableFlower(Blocks.red_mushroom, FlowerManager.FlowerTypeMushrooms);
registerAcceptableFlower(Blocks.cactus, FlowerManager.FlowerTypeCacti);
registerAcceptableFlower(Blocks.dragon_egg, FlowerManager.FlowerTypeEnd);
registerAcceptableFlower(Blocks.vine, FlowerManager.FlowerTypeJungle);
registerAcceptableFlower(Blocks.tallgrass, FlowerManager.FlowerTypeJungle);
registerAcceptableFlower(Blocks.wheat, FlowerManager.FlowerTypeWheat);
registerAcceptableFlower(Blocks.pumpkin_stem, FlowerManager.FlowerTypeGourd);
registerAcceptableFlower(Blocks.melon_stem, FlowerManager.FlowerTypeGourd);
registerAcceptableFlower(Blocks.nether_wart, FlowerManager.FlowerTypeNether);
registerAcceptableFlower(Blocks.double_plant, 0, FlowerManager.FlowerTypeVanilla, FlowerManager.FlowerTypeSnow);
registerAcceptableFlower(Blocks.double_plant, 1, FlowerManager.FlowerTypeVanilla, FlowerManager.FlowerTypeSnow);
registerAcceptableFlower(Blocks.double_plant, 4, FlowerManager.FlowerTypeVanilla, FlowerManager.FlowerTypeSnow);
registerAcceptableFlower(Blocks.double_plant, 5, FlowerManager.FlowerTypeVanilla, FlowerManager.FlowerTypeSnow);
// Register plantable plants
for (int meta = 0; meta <= 8; meta++) {
registerPlantableFlower(Blocks.red_flower, meta, 1.0, FlowerManager.FlowerTypeVanilla, FlowerManager.FlowerTypeSnow);
}
registerPlantableFlower(Blocks.yellow_flower, 0, 1.0, FlowerManager.FlowerTypeVanilla, FlowerManager.FlowerTypeSnow);
registerPlantableFlower(Blocks.brown_mushroom, 0, 1.0, FlowerManager.FlowerTypeMushrooms);
registerPlantableFlower(Blocks.red_mushroom, 0, 1.0, FlowerManager.FlowerTypeMushrooms);
registerPlantableFlower(Blocks.cactus, 0, 1.0, FlowerManager.FlowerTypeCacti);
}
private void registerVanillaGrowthRules() {
registerGrowthRule(new VanillaDirtGrassGrowthRule(), FlowerManager.FlowerTypeVanilla, FlowerManager.FlowerTypeSnow);
registerGrowthRule(new VanillaSnowGrowthRule(), FlowerManager.FlowerTypeSnow);
registerGrowthRule(new VanillaFlowerPotGrowthRule(), FlowerManager.FlowerTypeVanilla, FlowerManager.FlowerTypeSnow, FlowerManager.FlowerTypeMushrooms, FlowerManager.FlowerTypeCacti,
FlowerManager.FlowerTypeJungle);
registerGrowthRule(new VanillaMyceliumGrowthRule(), FlowerManager.FlowerTypeMushrooms);
registerGrowthRule(new VanillaDefaultGrowthRule(), FlowerManager.FlowerTypeEnd);
registerGrowthRule(new VanillaFertilizeGrowthRule(Blocks.melon_stem, Blocks.pumpkin_stem), FlowerManager.FlowerTypeGourd);
registerGrowthRule(new VanillaFertilizeGrowthRule(Blocks.wheat), FlowerManager.FlowerTypeWheat);
}
}
@@ -12,21 +12,15 @@ package forestry.apiculture.flowers;
import net.minecraft.world.World;
import forestry.api.genetics.IFlowerGrowthHelper;
import forestry.api.genetics.IFlowerGrowthRule;
import forestry.api.genetics.IFlowerRegistry;
import forestry.api.genetics.IIndividual;
public class GrowthRuleNone implements IFlowerGrowthRule {
public class VanillaDefaultGrowthRule implements IFlowerGrowthRule {
@Override
public boolean growFlower(IFlowerRegistry fr, String flowerType, World world, IIndividual individual, int x, int y, int z) {
return true;
}
@Override
public boolean growFlower(IFlowerGrowthHelper helper, String flowerType, World world, int x, int y, int z) {
return true;
}
}
@@ -15,13 +15,12 @@ import net.minecraft.init.Blocks;
import net.minecraft.world.World;
import forestry.api.genetics.IFlower;
import forestry.api.genetics.IFlowerGrowthHelper;
import forestry.api.genetics.IFlowerGrowthRule;
import forestry.api.genetics.IFlowerRegistry;
import forestry.api.genetics.IIndividual;
import forestry.core.config.Constants;
import forestry.core.config.Defaults;
public class GrowthRuleDirtGrass implements IFlowerGrowthRule {
public class VanillaDirtGrassGrowthRule implements IFlowerGrowthRule {
@Override
public boolean growFlower(IFlowerRegistry flowerRegistry, String flowerType, World world, IIndividual individual, int x, int y, int z) {
@@ -35,21 +34,7 @@ public class GrowthRuleDirtGrass implements IFlowerGrowthRule {
}
IFlower flower = flowerRegistry.getRandomPlantableFlower(flowerType, world.rand);
return world.setBlock(x, y, z, flower.getBlock(), flower.getMeta(), Constants.FLAG_BLOCK_SYNCH);
}
@Override
public boolean growFlower(IFlowerGrowthHelper helper, String flowerType, World world, int x, int y, int z) {
if (!world.isAirBlock(x, y, z)) {
return false;
}
Block ground = world.getBlock(x, y - 1, z);
if (ground != Blocks.dirt && ground != Blocks.grass) {
return false;
}
return helper.plantRandomFlower(flowerType, world, x, y, z);
return world.setBlock(x, y, z, flower.getBlock(), flower.getMeta(), Defaults.FLAG_BLOCK_SYNCH);
}
}
@@ -16,30 +16,20 @@ import java.util.List;
import net.minecraft.block.Block;
import net.minecraft.world.World;
import forestry.api.genetics.IFlowerGrowthHelper;
import forestry.api.genetics.IFlowerGrowthRule;
import forestry.api.genetics.IFlowerRegistry;
import forestry.api.genetics.IIndividual;
public class GrowthRuleFertilize implements IFlowerGrowthRule {
public class VanillaFertilizeGrowthRule implements IFlowerGrowthRule {
private final List<Block> allowedItems;
public GrowthRuleFertilize(Block... allowedItems) {
public VanillaFertilizeGrowthRule(Block... allowedItems) {
this.allowedItems = Arrays.asList(allowedItems);
}
@Override
public boolean growFlower(IFlowerRegistry fr, String flowerType, World world, IIndividual individual, int x, int y, int z) {
return growFlower(world, x, y, z);
}
@Override
public boolean growFlower(IFlowerGrowthHelper helper, String flowerType, World world, int x, int y, int z) {
return growFlower(world, x, y, z);
}
private boolean growFlower(World world, int x, int y, int z) {
Block ground = world.getBlock(x, y, z);
int groundMeta;
for (Block b : this.allowedItems) {
@@ -17,24 +17,15 @@ import net.minecraft.tileentity.TileEntityFlowerPot;
import net.minecraft.world.World;
import forestry.api.apiculture.FlowerManager;
import forestry.api.genetics.IFlowerGrowthHelper;
import forestry.api.genetics.IFlowerGrowthRule;
import forestry.api.genetics.IFlowerRegistry;
import forestry.api.genetics.IIndividual;
public class GrowthRuleFlowerPot implements IFlowerGrowthRule {
public class VanillaFlowerPotGrowthRule implements IFlowerGrowthRule {
@Override
public boolean growFlower(IFlowerRegistry fr, String flowerType, World world, IIndividual individual, int x, int y, int z) {
return growFlower(flowerType, world, x, y, z);
}
@Override
public boolean growFlower(IFlowerGrowthHelper helper, String flowerType, World world, int x, int y, int z) {
return growFlower(flowerType, world, x, y, z);
}
private static boolean growFlower(String flowerType, World world, int x, int y, int z) {
TileEntity tile = world.getTileEntity(x, y, z);
if (!(tile instanceof TileEntityFlowerPot)) {
return false;
@@ -53,22 +44,16 @@ public class GrowthRuleFlowerPot implements IFlowerGrowthRule {
BlockFlowerPot flowerPot = (BlockFlowerPot) block;
int flower;
switch (flowerType) {
case FlowerManager.FlowerTypeVanilla:
case FlowerManager.FlowerTypeSnow:
flower = world.rand.nextInt(2) + 1;
break;
case FlowerManager.FlowerTypeJungle:
flower = 6;
break;
case FlowerManager.FlowerTypeCacti:
flower = world.rand.nextInt(2) + 9;
break;
case FlowerManager.FlowerTypeMushrooms:
flower = world.rand.nextInt(2) + 7;
break;
default:
return false;
if (flowerType.equals(FlowerManager.FlowerTypeVanilla) || flowerType.equals(FlowerManager.FlowerTypeSnow)) {
flower = world.rand.nextInt(2) + 1;
} else if (flowerType.equals(FlowerManager.FlowerTypeJungle)) {
flower = 6;
} else if (flowerType.equals(FlowerManager.FlowerTypeCacti)) {
flower = world.rand.nextInt(2) + 9;
} else if (flowerType.equals(FlowerManager.FlowerTypeMushrooms)) {
flower = world.rand.nextInt(2) + 7;
} else {
return false;
}
TileEntityFlowerPot newTile = (TileEntityFlowerPot) flowerPot.createNewTileEntity(world, flower);
@@ -15,13 +15,12 @@ import net.minecraft.init.Blocks;
import net.minecraft.world.World;
import forestry.api.genetics.IFlower;
import forestry.api.genetics.IFlowerGrowthHelper;
import forestry.api.genetics.IFlowerGrowthRule;
import forestry.api.genetics.IFlowerRegistry;
import forestry.api.genetics.IIndividual;
import forestry.core.config.Constants;
import forestry.core.config.Defaults;
public class GrowthRuleMycelium implements IFlowerGrowthRule {
public class VanillaMyceliumGrowthRule implements IFlowerGrowthRule {
@Override
public boolean growFlower(IFlowerRegistry fr, String flowerType, World world, IIndividual individual, int x, int y, int z) {
@@ -35,21 +34,7 @@ public class GrowthRuleMycelium implements IFlowerGrowthRule {
}
IFlower flower = fr.getRandomPlantableFlower(flowerType, world.rand);
return world.setBlock(x, y, z, flower.getBlock(), flower.getMeta(), Constants.FLAG_BLOCK_SYNCH);
}
@Override
public boolean growFlower(IFlowerGrowthHelper helper, String flowerType, World world, int x, int y, int z) {
if (!world.isAirBlock(x, y, z)) {
return false;
}
Block ground = world.getBlock(x, y - 1, z);
if (ground != Blocks.mycelium) {
return false;
}
return helper.plantRandomFlower(flowerType, world, x, y, z);
return world.setBlock(x, y, z, flower.getBlock(), flower.getMeta(), Defaults.FLAG_BLOCK_SYNCH);
}
}
@@ -15,13 +15,12 @@ import net.minecraft.init.Blocks;
import net.minecraft.world.World;
import forestry.api.genetics.IFlower;
import forestry.api.genetics.IFlowerGrowthHelper;
import forestry.api.genetics.IFlowerGrowthRule;
import forestry.api.genetics.IFlowerRegistry;
import forestry.api.genetics.IIndividual;
import forestry.core.config.Constants;
import forestry.core.config.Defaults;
public class GrowthRuleSnow implements IFlowerGrowthRule {
public class VanillaSnowGrowthRule implements IFlowerGrowthRule {
@Override
public boolean growFlower(IFlowerRegistry fr, String flowerType, World world, IIndividual individual, int x, int y, int z) {
@@ -35,21 +34,7 @@ public class GrowthRuleSnow implements IFlowerGrowthRule {
}
IFlower flower = fr.getRandomPlantableFlower(flowerType, world.rand);
return world.setBlock(x, y, z, flower.getBlock(), flower.getMeta(), Constants.FLAG_BLOCK_SYNCH);
}
@Override
public boolean growFlower(IFlowerGrowthHelper helper, String flowerType, World world, int x, int y, int z) {
if (world.getBlock(x, y, z) != Blocks.snow) {
return false;
}
Block ground = world.getBlock(x, y - 1, z);
if (ground != Blocks.dirt && ground != Blocks.grass) {
return false;
}
return helper.plantRandomFlower(flowerType, world, x, y, z);
return world.setBlock(x, y, z, flower.getBlock(), flower.getMeta(), Defaults.FLAG_BLOCK_SYNCH);
}
}
@@ -8,7 +8,7 @@
* Various Contributors including, but not limited to:
* SirSengir (original work), CovertJaguar, Player, Binnie, MysteriousAges
******************************************************************************/
package forestry.apiculture.blocks;
package forestry.apiculture.gadgets;
import java.util.ArrayList;
import java.util.List;
@@ -28,36 +28,15 @@ import cpw.mods.fml.relauncher.SideOnly;
import forestry.api.core.Tabs;
import forestry.apiculture.MaterialBeehive;
import forestry.apiculture.multiblock.TileAlveary;
import forestry.apiculture.multiblock.TileAlvearyFan;
import forestry.apiculture.multiblock.TileAlvearyHeater;
import forestry.apiculture.multiblock.TileAlvearyHygroregulator;
import forestry.apiculture.multiblock.TileAlvearyPlain;
import forestry.apiculture.multiblock.TileAlvearySieve;
import forestry.apiculture.multiblock.TileAlvearyStabiliser;
import forestry.apiculture.multiblock.TileAlvearySwarmer;
import forestry.core.blocks.BlockStructure;
import forestry.core.gadgets.BlockStructure;
import forestry.core.render.TextureManager;
public class BlockAlveary extends BlockStructure {
public enum Type {
PLAIN,
ENTRANCE,
SWARMER,
FAN,
HEATER,
HYGRO,
STABILIZER,
SIEVE;
public static final Type[] VALUES = values();
}
public BlockAlveary() {
super(new MaterialBeehive(false));
setHardness(1.0f);
setCreativeTab(Tabs.tabApiculture);
setHarvestLevel("axe", 0);
}
@SuppressWarnings({"rawtypes", "unchecked"})
@@ -84,7 +63,7 @@ public class BlockAlveary extends BlockStructure {
@Override
public ArrayList<ItemStack> getDrops(World world, int x, int y, int z, int metadata, int fortune) {
ArrayList<ItemStack> drop = new ArrayList<>();
ArrayList<ItemStack> drop = new ArrayList<ItemStack>();
drop.add(new ItemStack(this, 1, metadata != 1 ? metadata : 0));
return drop;
}
@@ -98,25 +77,19 @@ public class BlockAlveary extends BlockStructure {
/* TILE ENTITY CREATION */
@Override
public TileEntity createTileEntity(World world, int metadata) {
if (metadata < 0 || metadata > Type.VALUES.length) {
return null;
}
Type type = Type.VALUES[metadata];
switch (type) {
case SWARMER:
switch (metadata) {
case TileAlvearySwarmer.BLOCK_META:
return new TileAlvearySwarmer();
case FAN:
case TileAlvearyFan.BLOCK_META:
return new TileAlvearyFan();
case HEATER:
case TileAlvearyHeater.BLOCK_META:
return new TileAlvearyHeater();
case HYGRO:
case TileAlvearyHygroregulator.BLOCK_META:
return new TileAlvearyHygroregulator();
case STABILIZER:
case TileAlvearyStabiliser.BLOCK_META:
return new TileAlvearyStabiliser();
case SIEVE:
case TileAlvearySieve.BLOCK_META:
return new TileAlvearySieve();
case PLAIN:
default:
return new TileAlvearyPlain();
}
@@ -150,49 +123,47 @@ public class BlockAlveary extends BlockStructure {
@Override
public void registerBlockIcons(IIconRegister register) {
icons = new IIcon[14];
icons[0] = TextureManager.registerTex(register, "apiculture/alveary.plain");
icons[1] = TextureManager.registerTex(register, "apiculture/alveary.entrance");
icons[2] = TextureManager.registerTex(register, "apiculture/alveary.bottom");
icons[3] = TextureManager.registerTex(register, "apiculture/alveary.left");
icons[4] = TextureManager.registerTex(register, "apiculture/alveary.right");
icons[5] = TextureManager.registerTex(register, "apiculture/alveary.swarmer.off");
icons[6] = TextureManager.registerTex(register, "apiculture/alveary.swarmer.on");
icons[7] = TextureManager.registerTex(register, "apiculture/alveary.heater.off");
icons[8] = TextureManager.registerTex(register, "apiculture/alveary.heater.on");
icons[9] = TextureManager.registerTex(register, "apiculture/alveary.fan.off");
icons[10] = TextureManager.registerTex(register, "apiculture/alveary.fan.on");
icons[11] = TextureManager.registerTex(register, "apiculture/alveary.valve");
icons[12] = TextureManager.registerTex(register, "apiculture/alveary.stabiliser");
icons[13] = TextureManager.registerTex(register, "apiculture/alveary.sieve");
icons[0] = TextureManager.getInstance().registerTex(register, "apiculture/alveary.plain");
icons[1] = TextureManager.getInstance().registerTex(register, "apiculture/alveary.entrance");
icons[2] = TextureManager.getInstance().registerTex(register, "apiculture/alveary.bottom");
icons[3] = TextureManager.getInstance().registerTex(register, "apiculture/alveary.left");
icons[4] = TextureManager.getInstance().registerTex(register, "apiculture/alveary.right");
icons[5] = TextureManager.getInstance().registerTex(register, "apiculture/alveary.swarmer.off");
icons[6] = TextureManager.getInstance().registerTex(register, "apiculture/alveary.swarmer.on");
icons[7] = TextureManager.getInstance().registerTex(register, "apiculture/alveary.heater.off");
icons[8] = TextureManager.getInstance().registerTex(register, "apiculture/alveary.heater.on");
icons[9] = TextureManager.getInstance().registerTex(register, "apiculture/alveary.fan.off");
icons[10] = TextureManager.getInstance().registerTex(register, "apiculture/alveary.fan.on");
icons[11] = TextureManager.getInstance().registerTex(register, "apiculture/alveary.valve");
icons[12] = TextureManager.getInstance().registerTex(register, "apiculture/alveary.stabiliser");
icons[13] = TextureManager.getInstance().registerTex(register, "apiculture/alveary.sieve");
}
@SideOnly(Side.CLIENT)
@Override
public IIcon getIcon(int side, int metadata) {
if ((metadata <= 1
|| metadata == Type.SIEVE.ordinal() || metadata == Type.SWARMER.ordinal() || metadata == Type.STABILIZER.ordinal())
|| metadata == TileAlvearySieve.BLOCK_META || metadata == TileAlvearySwarmer.BLOCK_META || metadata == TileAlvearyStabiliser.BLOCK_META)
&& (side == 1 || side == 0)) {
return icons[BOTTOM];
}
Type type = Type.VALUES[metadata];
switch (type) {
case PLAIN:
switch (metadata) {
case TileAlvearyPlain.BLOCK_META:
return icons[PLAIN];
case ENTRANCE:
case 1:
return icons[ENTRANCE];
case SWARMER:
case TileAlvearySwarmer.BLOCK_META:
return icons[ALVEARY_SWARMER_OFF];
case FAN:
case TileAlvearyFan.BLOCK_META:
return icons[ALVEARY_FAN_OFF];
case HEATER:
case TileAlvearyHeater.BLOCK_META:
return icons[ALVEARY_HEATER_OFF];
case HYGRO:
case TileAlvearyHygroregulator.BLOCK_META:
return icons[ALVEARY_HYGRO];
case STABILIZER:
case TileAlvearyStabiliser.BLOCK_META:
return icons[STABILISER];
case SIEVE:
case TileAlvearySieve.BLOCK_META:
return icons[SIEVE];
default:
return null;
@@ -248,11 +219,11 @@ public class BlockAlveary extends BlockStructure {
@SideOnly(Side.CLIENT)
private IIcon getBlockTextureFromSideAndTile(IBlockAccess world, int x, int y, int z, int side) {
TileEntity tile = world.getTileEntity(x, y, z);
if (!(tile instanceof TileAlveary)) {
if (tile == null || !(tile instanceof TileAlveary)) {
return getIcon(side, 0);
}
return icons[((TileAlveary) tile).getIcon(side)];
return icons[((TileAlveary) tile).getIcon(side, world.getBlockMetadata(x, y, z))];
}
@SideOnly(Side.CLIENT)
@@ -271,21 +242,4 @@ public class BlockAlveary extends BlockStructure {
}
}
@Override
public void onNeighborBlockChange(World world, int x, int y, int z, Block block) {
super.onNeighborBlockChange(world, x, y, z, block);
TileEntity tileEntity = world.getTileEntity(x, y, z);
if (tileEntity instanceof TileAlveary) {
TileAlveary tileAlveary = (TileAlveary) tileEntity;
// We must check that the slabs on top were not removed
tileAlveary.getMultiblockLogic().getController().reassemble();
}
}
public ItemStack get(Type type) {
return new ItemStack(this, 1, type.ordinal());
}
}
@@ -8,7 +8,7 @@
* Various Contributors including, but not limited to:
* SirSengir (original work), CovertJaguar, Player, Binnie, MysteriousAges
******************************************************************************/
package forestry.apiculture.blocks;
package forestry.apiculture.gadgets;
import java.util.ArrayList;
import java.util.Collections;
@@ -32,20 +32,14 @@ import cpw.mods.fml.relauncher.SideOnly;
import forestry.api.apiculture.IHiveDrop;
import forestry.api.core.Tabs;
import forestry.apiculture.MaterialBeehive;
import forestry.apiculture.tiles.TileSwarm;
import forestry.apiculture.worldgen.HiveRegistry;
import forestry.core.config.Config;
import forestry.core.inventory.InvTools;
import forestry.core.render.TextureManager;
import forestry.core.utils.InventoryUtil;
import forestry.core.utils.ItemStackUtil;
import forestry.core.utils.StackUtils;
import forestry.plugins.PluginApiculture;
public class BlockBeehives extends BlockContainer {
public enum Type {
LEGACY,
FOREST,
MEADOWS;
}
public BlockBeehives() {
super(new MaterialBeehive(true));
@@ -74,9 +68,9 @@ public class BlockBeehives extends BlockContainer {
if (tile instanceof TileSwarm) {
TileSwarm swarm = (TileSwarm) tile;
if (swarm.containsBees()) {
for (ItemStack beeStack : InventoryUtil.getStacks(swarm.contained)) {
for (ItemStack beeStack : InvTools.getStacks(swarm.contained)) {
if (beeStack != null) {
ItemStackUtil.dropItemStackAsEntity(beeStack, world, x, y, z);
StackUtils.dropItemStackAsEntity(beeStack, world, x, y, z);
}
}
}
@@ -88,7 +82,7 @@ public class BlockBeehives extends BlockContainer {
@Override
public ArrayList<ItemStack> getDrops(World world, int x, int y, int z, int metadata, int fortune) {
ArrayList<ItemStack> ret = new ArrayList<>();
ArrayList<ItemStack> ret = new ArrayList<ItemStack>();
// Handle legacy block
if (metadata == 0) {
@@ -138,7 +132,7 @@ public class BlockBeehives extends BlockContainer {
return meta;
}
private static List<IHiveDrop> getDropsForHive(int meta) {
private List<IHiveDrop> getDropsForHive(int meta) {
String hiveName = getHiveNameForMeta(meta);
if (hiveName == null) {
return Collections.emptyList();
@@ -146,7 +140,7 @@ public class BlockBeehives extends BlockContainer {
return PluginApiculture.hiveRegistry.getDrops(hiveName);
}
private static String getHiveNameForMeta(int meta) {
private String getHiveNameForMeta(int meta) {
switch (meta) {
case 1:
return HiveRegistry.forest;
@@ -190,8 +184,8 @@ public class BlockBeehives extends BlockContainer {
public void registerBlockIcons(IIconRegister register) {
icons = new IIcon[18];
for (int i = 1; i < 9; i++) {
icons[i * 2] = TextureManager.registerTex(register, "beehives/beehive." + i + ".top");
icons[(i * 2) + 1] = TextureManager.registerTex(register, "beehives/beehive." + i + ".side");
icons[i * 2] = TextureManager.getInstance().registerTex(register, "beehives/beehive." + i + ".top");
icons[(i * 2) + 1] = TextureManager.getInstance().registerTex(register, "beehives/beehive." + i + ".side");
}
}
@@ -8,7 +8,7 @@
* Various Contributors including, but not limited to:
* SirSengir (original work), CovertJaguar, Player, Binnie, MysteriousAges
******************************************************************************/
package forestry.apiculture.blocks;
package forestry.apiculture.gadgets;
import com.google.common.collect.ImmutableMap;
@@ -43,10 +43,9 @@ import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import forestry.api.core.Tabs;
import forestry.apiculture.tiles.TileCandle;
import forestry.core.proxy.Proxies;
import forestry.core.ForestryClient;
import forestry.core.render.TextureManager;
import forestry.core.utils.ItemStackUtil;
import forestry.core.utils.StackUtils;
import forestry.core.utils.StringUtil;
public class BlockCandle extends BlockTorch {
@@ -75,7 +74,7 @@ public class BlockCandle extends BlockTorch {
.put("dyeBlack", new Color(20, 20, 20).getRGB())
.build();
lightingItems = new HashSet<>(Arrays.asList(
lightingItems = new HashSet<Item>(Arrays.asList(
Items.flint_and_steel,
Items.flint,
Item.getItemFromBlock(Blocks.torch)
@@ -110,18 +109,18 @@ public class BlockCandle extends BlockTorch {
@Override
public int getRenderType() {
return Proxies.render.getCandleRenderId();
return ForestryClient.candleRenderId;
}
@SideOnly(Side.CLIENT)
@Override
public void registerBlockIcons(IIconRegister register) {
String fileBase = StringUtil.cleanBlockName(this);
this.blockIcon = TextureManager.registerTex(register, "stump");
this.litStump = TextureManager.registerTex(register, fileBase + "StumpLit");
this.litTip = TextureManager.registerTex(register, fileBase + "TipLit");
this.unlitStump = TextureManager.registerTex(register, fileBase + "StumpUnlit");
this.unlitTip = TextureManager.registerTex(register, fileBase + "TipUnlit");
this.blockIcon = TextureManager.getInstance().registerTex(register, "stump");
this.litStump = TextureManager.getInstance().registerTex(register, fileBase + "StumpLit");
this.litTip = TextureManager.getInstance().registerTex(register, fileBase + "TipLit");
this.unlitStump = TextureManager.getInstance().registerTex(register, fileBase + "StumpUnlit");
this.unlitTip = TextureManager.getInstance().registerTex(register, fileBase + "TipUnlit");
}
@Override
@@ -175,13 +174,13 @@ public class BlockCandle extends BlockTorch {
if (!isLit) {
if (heldItem == null || !lightingItems.contains(heldItem.getItem())) {
toggleLitState = false;
} else if (ItemStackUtil.equals(this, heldItem) && isLit(heldItem)) {
} else if (StackUtils.equals(this, heldItem) && isLit(heldItem)) {
toggleLitState = true;
}
}
if (heldItem != null) {
if (ItemStackUtil.equals(this, heldItem)) {
if (StackUtils.equals(this, heldItem)) {
if (!isLit(heldItem)) {
// Copy the colour of an unlit, coloured candle.
if (heldItem.hasTagCompound() && heldItem.getTagCompound().hasKey(colourTagName)) {
@@ -214,6 +213,7 @@ public class BlockCandle extends BlockTorch {
private static boolean tryDye(ItemStack held, boolean isLit, TileCandle tileCandle) {
// Check for dye-able ness.
boolean matched = false;
for (Map.Entry<String, Integer> colour : colours.entrySet()) {
String colourName = colour.getKey();
for (ItemStack stack : OreDictionary.getOres(colourName)) {
@@ -233,7 +233,7 @@ public class BlockCandle extends BlockTorch {
/* DROP HANDLING */
// Hack: When harvesting we need to get the drops in onBlockHarvested,
// because Mojang destroys the block and tile before calling getDrops.
private final ThreadLocal<ItemStack> drop = new ThreadLocal<>();
protected ThreadLocal<ItemStack> drop = new ThreadLocal<ItemStack>();
@Override
public void onBlockHarvested(World world, int x, int y, int z, int metadata, EntityPlayer player) {
@@ -253,7 +253,7 @@ public class BlockCandle extends BlockTorch {
dropStack = getCandleDrop(world, x, y, z);
}
ArrayList<ItemStack> drops = new ArrayList<>(1);
ArrayList<ItemStack> drops = new ArrayList<ItemStack>(1);
drops.add(dropStack);
return drops;
@@ -301,7 +301,7 @@ public class BlockCandle extends BlockTorch {
}
}
private static int getColourValueFromItemStack(ItemStack itemStack) {
protected static int getColourValueFromItemStack(ItemStack itemStack) {
int value = 0xffffff; // default to white.
if (itemStack.hasTagCompound()) {
NBTTagCompound tag = itemStack.getTagCompound();
@@ -326,11 +326,4 @@ public class BlockCandle extends BlockTorch {
}
}
public ItemStack getUnlitCandle(int amount) {
return new ItemStack(this, amount, 0);
}
public ItemStack getLitCandle(int amount) {
return new ItemStack(this, amount, 1);
}
}
@@ -8,7 +8,7 @@
* Various Contributors including, but not limited to:
* SirSengir (original work), CovertJaguar, Player, Binnie, MysteriousAges
******************************************************************************/
package forestry.apiculture.blocks;
package forestry.apiculture.gadgets;
import java.util.List;
import java.util.Random;
@@ -27,12 +27,11 @@ import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import forestry.api.core.Tabs;
import forestry.apiculture.tiles.TileCandle;
import forestry.core.config.Constants;
import forestry.core.config.Defaults;
import forestry.core.config.ForestryBlock;
import forestry.core.render.TextureManager;
import forestry.core.utils.ItemStackUtil;
import forestry.core.utils.StackUtils;
import forestry.core.utils.StringUtil;
import forestry.plugins.PluginApiculture;
public class BlockStump extends BlockTorch {
@@ -46,7 +45,7 @@ public class BlockStump extends BlockTorch {
@SideOnly(Side.CLIENT)
@Override
public void registerBlockIcons(IIconRegister register) {
this.blockIcon = TextureManager.registerTex(register, StringUtil.cleanBlockName(this));
this.blockIcon = TextureManager.getInstance().registerTex(register, StringUtil.cleanBlockName(this));
}
@SuppressWarnings({"rawtypes", "unchecked"})
@@ -62,8 +61,8 @@ public class BlockStump extends BlockTorch {
if (held != null &&
(held.getItem() == Items.flint_and_steel ||
held.getItem() == Items.flint ||
ItemStackUtil.equals(Blocks.torch, held))) {
world.setBlock(x, y, z, PluginApiculture.blocks.candle, world.getBlockMetadata(x, y, z) | 0x08, Constants.FLAG_BLOCK_SYNCH);
StackUtils.equals(Blocks.torch, held))) {
world.setBlock(x, y, z, ForestryBlock.candle.block(), world.getBlockMetadata(x, y, z) | 0x08, Defaults.FLAG_BLOCK_SYNCH);
TileCandle tc = new TileCandle();
tc.setColour(0); // default to white
world.setTileEntity(x, y, z, tc);
@@ -0,0 +1,149 @@
/*******************************************************************************
* Copyright (c) 2011-2014 SirSengir.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU Lesser Public License v3
* which accompanies this distribution, and is available at
* http://www.gnu.org/licenses/lgpl-3.0.txt
*
* Various Contributors including, but not limited to:
* SirSengir (original work), CovertJaguar, Player, Binnie, MysteriousAges
******************************************************************************/
package forestry.apiculture.gadgets;
import java.util.HashSet;
import java.util.Set;
import net.minecraft.block.Block;
import net.minecraft.init.Blocks;
import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity;
import net.minecraftforge.oredict.OreDictionary;
import forestry.api.apiculture.IAlvearyComponent;
import forestry.api.core.ITileStructure;
import forestry.core.gadgets.BlockStructure.EnumStructureState;
import forestry.core.gadgets.StructureLogic;
import forestry.core.utils.Schemata;
import forestry.core.utils.Schemata.EnumStructureBlock;
import forestry.core.vect.Vect;
public class StructureLogicAlveary extends StructureLogic {
/* CONSTANTS */
public static final String UID_ALVEARY = "alveary";
public static final Schemata SCHEMATA_ALVEARY = new Schemata("alveary3x3", 5, 6, 5,
"FFFFF", "FFFFF", "FFFFF", "FFFFF", "FFFFF", "FFFFF",
"FFFFF", "FAAAF", "FAAAF", "FABAF", "FCCCF", "FFFFF",
"FFFFF", "FAAAF", "FAAAF", "FBMBF", "FCCCF", "FFFFF",
"FFFFF", "FAAAF", "FAAAF", "FABAF", "FCCCF", "FFFFF",
"FFFFF", "FFFFF", "FFFFF", "FFFFF", "FFFFF", "FFFFF").setOffsets(-2, -3, -2);
private static final Set<Block> slabBlocks = new HashSet<Block>();
private static final Set<Integer> slabOreDictIds = new HashSet<Integer>();
static {
int slabWoodId = OreDictionary.getOreID("slabWood");
slabOreDictIds.add(slabWoodId);
}
public StructureLogicAlveary(ITileStructure structure) {
super(UID_ALVEARY, structure);
schematas = new Schemata[]{SCHEMATA_ALVEARY};
metaOnValid.put(EnumStructureBlock.BLOCK_B, 1);
}
@Override
protected EnumStructureState determineMasterState(Schemata schemata, boolean rotate) {
Vect dimensions = schemata.getDimensions(rotate);
int offsetX = schemata.getxOffset();
int offsetZ = schemata.getzOffset();
if (rotate) {
offsetX = schemata.getzOffset();
offsetZ = schemata.getxOffset();
}
for (int i = 0; i < dimensions.x; i++) {
for (int j = 0; j < schemata.getHeight(); j++) {
for (int k = 0; k < dimensions.z; k++) {
int x = structureTile.xCoord + i + offsetX;
int y = structureTile.yCoord + j + schemata.getyOffset();
int z = structureTile.zCoord + k + offsetZ;
if (!structureTile.getWorldObj().blockExists(x, y, z)) {
return EnumStructureState.INDETERMINATE;
}
EnumStructureBlock required = schemata.getAt(i, j, k, rotate);
if (required == EnumStructureBlock.ANY) {
continue;
}
TileEntity tile = structureTile.getWorldObj().getTileEntity(x, y, z);
Block block = structureTile.getWorldObj().getBlock(x, y, z);
switch (required) {
case AIR:
if (!block.isAir(structureTile.getWorldObj(), x, y, z)) {
return EnumStructureState.INVALID;
}
break;
case BLOCK_A:
if (tile == null || !(tile instanceof IAlvearyComponent)) {
return EnumStructureState.INVALID;
}
if (!((ITileStructure) tile).getTypeUID().equals(UID_ALVEARY)) {
return EnumStructureState.INVALID;
}
break;
case MASTER:
case BLOCK_B:
if (tile == null || !(tile instanceof TileAlvearyPlain)) {
return EnumStructureState.INVALID;
}
break;
case BLOCK_C:
if (!isWoodSlabBlock(block)) {
return EnumStructureState.INVALID;
}
if ((structureTile.getWorldObj().getBlockMetadata(x, y, z) & 8) != 0) {
return EnumStructureState.INVALID;
}
break;
case BLOCK_D:
if (block != Blocks.spruce_stairs) {
return EnumStructureState.INVALID;
}
break;
case FOREIGN:
if (tile instanceof ITileStructure) {
return EnumStructureState.INVALID;
}
break;
default:
return EnumStructureState.INDETERMINATE;
}
}
}
}
return EnumStructureState.VALID;
}
private static boolean isWoodSlabBlock(Block block) {
int[] oreIds = OreDictionary.getOreIDs(new ItemStack(block));
for (int oreId : oreIds) {
if (slabOreDictIds.contains(oreId)) {
return true;
}
}
return slabBlocks.contains(block);
}
public static void addSlabBlock(Block block) {
slabBlocks.add(block);
}
}
+267
View File
@@ -0,0 +1,267 @@
/*******************************************************************************
* Copyright (c) 2011-2014 SirSengir.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU Lesser Public License v3
* which accompanies this distribution, and is available at
* http://www.gnu.org/licenses/lgpl-3.0.txt
*
* Various Contributors including, but not limited to:
* SirSengir (original work), CovertJaguar, Player, Binnie, MysteriousAges
******************************************************************************/
package forestry.apiculture.gadgets;
import java.io.IOException;
import java.util.Collection;
import java.util.LinkedList;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity;
import net.minecraftforge.common.util.ForgeDirection;
import cpw.mods.fml.common.Optional;
import forestry.api.apiculture.IAlvearyComponent;
import forestry.api.apiculture.IBeeListener;
import forestry.api.apiculture.IBeeModifier;
import forestry.api.core.IStructureLogic;
import forestry.api.core.ITileStructure;
import forestry.apiculture.trigger.ApicultureTriggers;
import forestry.core.config.Defaults;
import forestry.core.config.ForestryBlock;
import forestry.core.gadgets.TileForestry;
import forestry.core.inventory.FakeInventoryAdapter;
import forestry.core.inventory.IInventoryAdapter;
import forestry.core.network.DataInputStreamForestry;
import forestry.core.network.DataOutputStreamForestry;
import forestry.core.proxy.Proxies;
import buildcraft.api.statements.ITriggerExternal;
public abstract class TileAlveary extends TileForestry implements IAlvearyComponent {
private final IStructureLogic structureLogic;
private boolean isMaster;
protected int masterX, masterZ;
protected int masterY = -99;
protected final int componentBlockMeta;
public TileAlveary(int componentBlockMeta) {
this.structureLogic = new StructureLogicAlveary(this);
this.componentBlockMeta = componentBlockMeta;
}
/* UPDATING */
@Override
public void initialize() {
if (!ForestryBlock.alveary.isBlockEqual(worldObj, xCoord, yCoord, zCoord)) {
Proxies.log.info("Updating alveary block at %s/%s/%s.", xCoord, yCoord, zCoord);
worldObj.setBlock(xCoord, yCoord, zCoord, ForestryBlock.alveary.block(), componentBlockMeta, Defaults.FLAG_BLOCK_SYNCH);
validate();
worldObj.setTileEntity(xCoord, yCoord, zCoord, this);
}
}
protected void updateServerSide() {
// Periodic validation if needed
if (updateOnInterval(200) && (!isIntegratedIntoStructure() || isMaster())) {
validateStructure();
}
}
/* TEXTURES */
public int getIcon(int side, int metadata) {
return BlockAlveary.PLAIN;
}
/* LOADING & SAVING */
@Override
public void readFromNBT(NBTTagCompound nbttagcompound) {
this.isMaster = nbttagcompound.getBoolean("IsMaster");
this.masterX = nbttagcompound.getInteger("MasterX");
this.masterY = nbttagcompound.getInteger("MasterY");
this.masterZ = nbttagcompound.getInteger("MasterZ");
// Init for master state
if (isMaster) {
makeMaster();
}
super.readFromNBT(nbttagcompound);
structureLogic.readFromNBT(nbttagcompound);
}
@Override
public void writeToNBT(NBTTagCompound nbttagcompound) {
super.writeToNBT(nbttagcompound);
nbttagcompound.setBoolean("IsMaster", isMaster);
nbttagcompound.setInteger("MasterX", masterX);
nbttagcompound.setInteger("MasterY", masterY);
nbttagcompound.setInteger("MasterZ", masterZ);
structureLogic.writeToNBT(nbttagcompound);
}
protected void createInventory() {
}
@Override
public void writeData(DataOutputStreamForestry data) throws IOException {
super.writeData(data);
data.writeBoolean(isMaster);
// so the client can know if it is part of an integrated structure
data.writeVarInt(masterY);
}
@Override
public void readData(DataInputStreamForestry data) throws IOException {
super.readData(data);
if (data.readBoolean()) {
makeMaster();
}
// so the client can know if it is part of an integrated structure
masterY = data.readVarInt();
}
/* ITILESTRUCTURE */
@Override
public String getTypeUID() {
return structureLogic.getTypeUID();
}
@Override
public void validateStructure() {
structureLogic.validateStructure();
}
@Override
public void makeMaster() {
setCentralTE(null);
isMaster = true;
if (getInternalInventory() instanceof FakeInventoryAdapter) {
createInventory();
}
if (worldObj != null && !worldObj.isRemote) {
setNeedsNetworkUpdate();
}
}
@Override
public void onStructureReset() {
setCentralTE(null);
if (worldObj.getBlockMetadata(xCoord, yCoord, zCoord) == 1) {
worldObj.setBlockMetadataWithNotify(xCoord, yCoord, zCoord, 0, 0);
}
isMaster = false;
worldObj.markBlockForUpdate(xCoord, yCoord, zCoord);
}
@Override
public ITileStructure getCentralTE() {
if (!isIntegratedIntoStructure()) {
return null;
}
if (!isMaster()) {
TileEntity tile = worldObj.getTileEntity(masterX, masterY, masterZ);
if (tile instanceof ITileStructure) {
ITileStructure master = (ITileStructure) worldObj.getTileEntity(masterX, masterY, masterZ);
if (master.isMaster()) {
return master;
} else {
return null;
}
} else {
return null;
}
} else {
return this;
}
}
private boolean isSameTile(TileEntity tile) {
return tile.xCoord == xCoord && tile.yCoord == yCoord && tile.zCoord == zCoord;
}
@Override
public void setCentralTE(TileEntity tile) {
if (tile == null || tile == this || isSameTile(tile)) {
this.masterX = this.masterZ = 0;
this.masterY = -99;
return;
}
this.isMaster = false;
this.masterX = tile.xCoord;
this.masterY = tile.yCoord;
this.masterZ = tile.zCoord;
}
@Override
public boolean isMaster() {
return isMaster;
}
protected boolean hasMaster() {
return masterY >= 0;
}
@Override
public boolean isIntegratedIntoStructure() {
return isMaster || masterY >= 0;
}
@Override
public IInventoryAdapter getStructureInventory() {
return getInternalInventory();
}
/* IALVEARY COMPONENT */
@Override
public boolean hasFunction() {
return false;
}
@Override
public void addTemperatureChange(float change, float boundaryDown, float boundaryUp) {
}
@Override
public void addHumidityChange(float change, float boundaryDown, float boundaryUp) {
}
@Override
public void registerBeeModifier(IBeeModifier modifier) {
}
@Override
public void removeBeeModifier(IBeeModifier modifier) {
}
@Override
public void registerBeeListener(IBeeListener event) {
}
@Override
public void removeBeeListener(IBeeListener event) {
}
/* ITRIGGERPROVIDER */
@Optional.Method(modid = "BuildCraftAPI|statements")
@Override
public Collection<ITriggerExternal> getExternalTriggers(ForgeDirection side, TileEntity tile) {
LinkedList<ITriggerExternal> res = new LinkedList<ITriggerExternal>();
res.add(ApicultureTriggers.missingQueen);
res.add(ApicultureTriggers.missingDrone);
return res;
}
}
@@ -8,76 +8,94 @@
* Various Contributors including, but not limited to:
* SirSengir (original work), CovertJaguar, Player, Binnie, MysteriousAges
******************************************************************************/
package forestry.apiculture.multiblock;
package forestry.apiculture.gadgets;
import java.io.IOException;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraftforge.common.util.ForgeDirection;
import forestry.api.core.IClimateControlled;
import forestry.api.multiblock.IAlvearyComponent;
import forestry.apiculture.network.packets.PacketActiveUpdate;
import forestry.api.apiculture.IAlvearyComponent;
import forestry.apiculture.network.PacketActiveUpdate;
import forestry.core.interfaces.IActivatable;
import forestry.core.network.DataInputStreamForestry;
import forestry.core.network.DataOutputStreamForestry;
import forestry.core.proxy.Proxies;
import forestry.core.tiles.IActivatable;
import forestry.energy.EnergyManager;
import cofh.api.energy.IEnergyHandler;
public abstract class TileAlvearyClimatiser extends TileAlveary implements IEnergyHandler, IActivatable, IAlvearyComponent.Climatiser {
public abstract class TileAlvearyClimatiser extends TileAlveary implements IEnergyHandler, IActivatable {
private static final int WORK_CYCLES = 1;
private static final int ENERGY_PER_OPERATION = 50;
public static class ClimateControl {
protected interface IClimitiserDefinition {
float getChangePerTransfer();
final float changePerTransfer;
final float boundaryUp;
final float boundaryDown;
float getBoundaryUp();
float getBoundaryDown();
int getIconOff();
int getIconOn();
public ClimateControl(float changePerTransfer, float boundaryDown, float boundaryUp) {
this.changePerTransfer = changePerTransfer;
this.boundaryDown = boundaryDown;
this.boundaryUp = boundaryUp;
}
}
private final EnergyManager energyManager;
private final IClimitiserDefinition definition;
protected final EnergyManager energyManager;
private final ClimateControl climateControl;
private int workingTime = 0;
private final int textureOff;
private final int textureOn;
// CLIENT
private boolean active;
protected TileAlvearyClimatiser(IClimitiserDefinition definition) {
this.definition = definition;
this.energyManager = new EnergyManager(1000, 2000);
this.energyManager.setReceiveOnly();
public TileAlvearyClimatiser(ClimateControl control, int textureOff, int textureOn, int componentBlockMeta) {
super(componentBlockMeta);
this.climateControl = control;
energyManager = new EnergyManager(1000, 50, 2000);
energyManager.setReceiveOnly();
this.textureOff = textureOff;
this.textureOn = textureOn;
}
/* UPDATING */
@Override
public void changeClimate(int tick, IClimateControlled climateControlled) {
if (workingTime < 20 && energyManager.consumeEnergyToDoWork(WORK_CYCLES, ENERGY_PER_OPERATION)) {
// one tick of work for every 10 RF
workingTime += ENERGY_PER_OPERATION / 10;
protected void updateServerSide() {
super.updateServerSide();
if (!this.hasMaster()) {
return;
}
if (workingTime < 20 && energyManager.consumeEnergyToDoWork()) {
// consume 10 RF per tick of work
workingTime += energyManager.getEnergyPerWork() / 10;
}
if (workingTime > 0) {
workingTime--;
climateControlled.addTemperatureChange(definition.getChangePerTransfer(), definition.getBoundaryDown(), definition.getBoundaryUp());
IAlvearyComponent component = (IAlvearyComponent) this.getCentralTE();
if (component != null) {
component.addTemperatureChange(climateControl.changePerTransfer, climateControl.boundaryDown, climateControl.boundaryUp);
}
}
setActive(workingTime > 0);
}
@Override
public boolean hasFunction() {
return true;
}
/* TEXTURES */
@Override
public int getIcon(int side) {
public int getIcon(int side, int metadata) {
if (active) {
return definition.getIconOn();
return textureOn;
} else {
return definition.getIconOff();
return textureOff;
}
}
@@ -97,20 +115,19 @@ public abstract class TileAlvearyClimatiser extends TileAlveary implements IEner
nbttagcompound.setInteger("Heating", workingTime);
}
/* Network */
/* NETWORK */
@Override
protected void encodeDescriptionPacket(NBTTagCompound packetData) {
super.encodeDescriptionPacket(packetData);
packetData.setBoolean("Active", active);
public void writeData(DataOutputStreamForestry data) throws IOException {
super.writeData(data);
data.writeBoolean(active);
}
@Override
protected void decodeDescriptionPacket(NBTTagCompound packetData) {
super.decodeDescriptionPacket(packetData);
setActive(packetData.getBoolean("Active"));
public void readData(DataInputStreamForestry data) throws IOException {
super.readData(data);
setActive(data.readBoolean());
}
/* IActivatable */
@Override
public boolean isActive() {
return active;
@@ -128,7 +145,7 @@ public abstract class TileAlvearyClimatiser extends TileAlveary implements IEner
if (worldObj.isRemote) {
worldObj.func_147479_m(xCoord, yCoord, zCoord);
} else {
Proxies.net.sendNetworkPacket(new PacketActiveUpdate(this), worldObj);
Proxies.net.sendNetworkPacket(new PacketActiveUpdate(this));
}
}
}
@@ -158,5 +175,4 @@ public abstract class TileAlvearyClimatiser extends TileAlveary implements IEner
public boolean canConnectEnergy(ForgeDirection from) {
return energyManager.canConnectEnergy(from);
}
}
@@ -1,19 +1,22 @@
/*******************************************************************************
* Copyright (c) 2011-2014 SirSengir.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU Lesser Public License v3
* which accompanies this distribution, and is available at
* http://www.gnu.org/licenses/lgpl-3.0.txt
*
* Various Contributors including, but not limited to:
* SirSengir (original work), CovertJaguar, Player, Binnie, MysteriousAges
******************************************************************************/
package forestry.arboriculture.worldgen;
import forestry.api.world.ITreeGenData;
public abstract class WorldGenTreeVanilla extends WorldGenTree {
protected WorldGenTreeVanilla(ITreeGenData tree) {
super(tree, 5, 2);
}
}
/*******************************************************************************
* Copyright (c) 2011-2014 SirSengir.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU Lesser Public License v3
* which accompanies this distribution, and is available at
* http://www.gnu.org/licenses/lgpl-3.0.txt
*
* Various Contributors including, but not limited to:
* SirSengir (original work), CovertJaguar, Player, Binnie, MysteriousAges
******************************************************************************/
package forestry.apiculture.gadgets;
public class TileAlvearyFan extends TileAlvearyClimatiser {
/* CONSTANTS */
public static final int BLOCK_META = 3;
public TileAlvearyFan() {
super(new ClimateControl(-0.01f, 0.05f, 2.5f), BlockAlveary.ALVEARY_FAN_OFF, BlockAlveary.ALVEARY_FAN_ON, BLOCK_META);
}
}
@@ -1,24 +1,22 @@
/*******************************************************************************
* Copyright (c) 2011-2014 SirSengir.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU Lesser Public License v3
* which accompanies this distribution, and is available at
* http://www.gnu.org/licenses/lgpl-3.0.txt
*
* Various Contributors including, but not limited to:
* SirSengir (original work), CovertJaguar, Player, Binnie, MysteriousAges
******************************************************************************/
package forestry.core.network;
public class PacketRegistryDummy implements IPacketRegistry {
public static final PacketRegistryDummy instance = new PacketRegistryDummy();
private PacketRegistryDummy() {
}
@Override
public void registerPackets() {
}
}
/*******************************************************************************
* Copyright (c) 2011-2014 SirSengir.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU Lesser Public License v3
* which accompanies this distribution, and is available at
* http://www.gnu.org/licenses/lgpl-3.0.txt
*
* Various Contributors including, but not limited to:
* SirSengir (original work), CovertJaguar, Player, Binnie, MysteriousAges
******************************************************************************/
package forestry.apiculture.gadgets;
public class TileAlvearyHeater extends TileAlvearyClimatiser {
/* CONSTANTS */
public static final int BLOCK_META = 4;
public TileAlvearyHeater() {
super(new ClimateControl(0.01f, 0.0f, 2.5f), BlockAlveary.ALVEARY_HEATER_OFF, BlockAlveary.ALVEARY_HEATER_ON, BLOCK_META);
}
}
@@ -8,67 +8,84 @@
* Various Contributors including, but not limited to:
* SirSengir (original work), CovertJaguar, Player, Binnie, MysteriousAges
******************************************************************************/
package forestry.apiculture.multiblock;
package forestry.apiculture.gadgets;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.Container;
import net.minecraft.inventory.ICrafting;
import net.minecraft.inventory.IInventory;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraftforge.common.util.ForgeDirection;
import net.minecraftforge.fluids.Fluid;
import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.fluids.FluidTankInfo;
import net.minecraftforge.fluids.IFluidHandler;
import forestry.api.core.IClimateControlled;
import forestry.api.multiblock.IAlvearyComponent;
import forestry.apiculture.blocks.BlockAlveary;
import forestry.apiculture.gui.ContainerAlvearyHygroregulator;
import forestry.apiculture.gui.GuiAlvearyHygroregulator;
import forestry.apiculture.inventory.InventoryHygroregulator;
import forestry.core.config.Constants;
import forestry.api.apiculture.IAlvearyComponent;
import forestry.api.core.ForestryAPI;
import forestry.core.config.Defaults;
import forestry.core.fluids.FluidHelper;
import forestry.core.fluids.Fluids;
import forestry.core.fluids.TankManager;
import forestry.core.fluids.tanks.FilteredTank;
import forestry.core.interfaces.ILiquidTankContainer;
import forestry.core.inventory.IInventoryAdapter;
import forestry.core.tiles.ILiquidTankTile;
import forestry.core.inventory.TileInventoryAdapter;
import forestry.core.network.GuiId;
public class TileAlvearyHygroregulator extends TileAlveary implements IInventory, ILiquidTankContainer {
/* CONSTANTS */
public static final int BLOCK_META = 5;
/* RECIPE MANAGMENT */
private static class HygroregulatorRecipe {
public final FluidStack liquid;
public final int transferTime;
public final float humidChange;
public final float tempChange;
public HygroregulatorRecipe(FluidStack liquid, int transferTime, float humidChange, float tempChange) {
this.liquid = liquid;
this.transferTime = transferTime;
this.humidChange = humidChange;
this.tempChange = tempChange;
}
}
public static final short SLOT_INPUT = 0;
public class TileAlvearyHygroregulator extends TileAlveary implements IInventory, ILiquidTankTile, IFluidHandler, IAlvearyComponent.Climatiser {
private final HygroregulatorRecipe[] recipes;
/* MEMBERS */
private final TankManager tankManager;
private final FilteredTank liquidTank;
private final IInventoryAdapter inventory;
private HygroregulatorRecipe currentRecipe;
private int transferTime;
public TileAlvearyHygroregulator() {
super(BlockAlveary.Type.HYGRO);
super(BLOCK_META);
this.inventory = new InventoryHygroregulator(this);
setInternalInventory(new HygroInventoryAdapter(this));
Fluid water = Fluids.WATER.getFluid();
Fluid lava = Fluids.LAVA.getFluid();
Fluid liquidIce = Fluids.ICE.getFluid();
this.liquidTank = new FilteredTank(Constants.PROCESSOR_TANK_CAPACITY, water, lava, liquidIce);
this.tankManager = new TankManager(this, liquidTank);
liquidTank = new FilteredTank(Defaults.PROCESSOR_TANK_CAPACITY, water, lava, liquidIce);
tankManager = new TankManager(liquidTank);
this.recipes = new HygroregulatorRecipe[]{new HygroregulatorRecipe(new FluidStack(water, 1), 1, 0.01f, -0.005f),
recipes = new HygroregulatorRecipe[]{new HygroregulatorRecipe(new FluidStack(water, 1), 1, 0.01f, -0.005f),
new HygroregulatorRecipe(new FluidStack(lava, 1), 10, -0.01f, +0.005f),
new HygroregulatorRecipe(new FluidStack(liquidIce, 1), 10, 0.02f, -0.01f)};
}
@Override
public IInventoryAdapter getInternalInventory() {
return inventory;
}
@Override
public boolean allowsAutomation() {
return true;
public void openGui(EntityPlayer player) {
player.openGui(ForestryAPI.instance, GuiId.HygroregulatorGUI.ordinal(), worldObj, xCoord, yCoord, zCoord);
}
/* UPDATING */
@@ -84,7 +101,9 @@ public class TileAlvearyHygroregulator extends TileAlveary implements IInventory
}
@Override
public void changeClimate(int tickCount, IClimateControlled climateControlled) {
protected void updateServerSide() {
super.updateServerSide();
if (transferTime <= 0 && liquidTank.getFluidAmount() > 0) {
currentRecipe = getRecipe(liquidTank.getFluid());
@@ -98,24 +117,36 @@ public class TileAlvearyHygroregulator extends TileAlveary implements IInventory
transferTime--;
if (currentRecipe != null) {
climateControlled.addHumidityChange(currentRecipe.humidChange, 0.0f, 1.0f);
climateControlled.addTemperatureChange(currentRecipe.tempChange, 0.0f, 2.0f);
IAlvearyComponent component = (IAlvearyComponent) this.getCentralTE();
if (component != null) {
component.addHumidityChange(currentRecipe.humidChange, 0.0f, 1.0f);
component.addTemperatureChange(currentRecipe.tempChange, 0.0f, 2.0f);
}
} else {
transferTime = 0;
}
}
if (tickCount % 20 == 0) {
if (updateOnInterval(20)) {
IInventoryAdapter canInventory = getInternalInventory();
// Check if we have suitable items waiting in the item slot
FluidHelper.drainContainers(tankManager, this, 0);
if (canInventory.getStackInSlot(0) != null) {
FluidHelper.drainContainers(tankManager, canInventory, 0);
}
}
}
@Override
public boolean hasFunction() {
return true;
}
/* SAVING & LOADING */
@Override
public void readFromNBT(NBTTagCompound nbttagcompound) {
super.readFromNBT(nbttagcompound);
tankManager.readFromNBT(nbttagcompound);
tankManager.readTanksFromNBT(nbttagcompound);
transferTime = nbttagcompound.getInteger("TransferTime");
@@ -128,7 +159,7 @@ public class TileAlvearyHygroregulator extends TileAlveary implements IInventory
@Override
public void writeToNBT(NBTTagCompound nbttagcompound) {
super.writeToNBT(nbttagcompound);
tankManager.writeToNBT(nbttagcompound);
tankManager.writeTanksToNBT(nbttagcompound);
nbttagcompound.setInteger("TransferTime", transferTime);
if (currentRecipe != null) {
@@ -136,11 +167,12 @@ public class TileAlvearyHygroregulator extends TileAlveary implements IInventory
currentRecipe.liquid.writeToNBT(subcompound);
nbttagcompound.setTag("CurrentLiquid", subcompound);
}
}
/* TEXTURES */
@Override
public int getIcon(int side) {
public int getIcon(int side, int metadata) {
return BlockAlveary.ALVEARY_HYGRO;
}
@@ -181,26 +213,25 @@ public class TileAlvearyHygroregulator extends TileAlveary implements IInventory
}
@Override
public Object getGui(EntityPlayer player, int data) {
return new GuiAlvearyHygroregulator(player.inventory, this);
public void getGUINetworkData(int messageId, int data) {
}
@Override
public Object getContainer(EntityPlayer player, int data) {
return new ContainerAlvearyHygroregulator(player.inventory, this);
public void sendGUINetworkData(Container container, ICrafting iCrafting) {
}
private static class HygroregulatorRecipe {
public final FluidStack liquid;
public final int transferTime;
public final float humidChange;
public final float tempChange;
private static class HygroInventoryAdapter extends TileInventoryAdapter<TileAlvearyHygroregulator> {
public HygroInventoryAdapter(TileAlvearyHygroregulator alvearyHygroregulator) {
super(alvearyHygroregulator, 1, "CanInv");
}
public HygroregulatorRecipe(FluidStack liquid, int transferTime, float humidChange, float tempChange) {
this.liquid = liquid;
this.transferTime = transferTime;
this.humidChange = humidChange;
this.tempChange = tempChange;
@Override
public boolean canSlotAccept(int slotIndex, ItemStack itemStack) {
if (slotIndex == SLOT_INPUT) {
Fluid fluid = FluidHelper.getFluidInContainer(itemStack);
return tile.liquidTank.accepts(fluid);
}
return false;
}
}
}
@@ -0,0 +1,716 @@
/*******************************************************************************
* Copyright (c) 2011-2014 SirSengir.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU Lesser Public License v3
* which accompanies this distribution, and is available at
* http://www.gnu.org/licenses/lgpl-3.0.txt
*
* Various Contributors including, but not limited to:
* SirSengir (original work), CovertJaguar, Player, Binnie, MysteriousAges
******************************************************************************/
package forestry.apiculture.gadgets;
import java.io.IOException;
import java.util.LinkedHashSet;
import java.util.Set;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.ICrafting;
import net.minecraft.inventory.ISidedInventory;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.world.World;
import net.minecraft.world.biome.BiomeGenBase;
import com.mojang.authlib.GameProfile;
import forestry.api.apiculture.BeeManager;
import forestry.api.apiculture.IBee;
import forestry.api.apiculture.IBeeGenome;
import forestry.api.apiculture.IBeeHousing;
import forestry.api.apiculture.IBeeListener;
import forestry.api.apiculture.IBeeModifier;
import forestry.api.apiculture.IBeekeepingLogic;
import forestry.api.core.BiomeHelper;
import forestry.api.core.EnumHumidity;
import forestry.api.core.EnumTemperature;
import forestry.api.core.ForestryAPI;
import forestry.api.core.IErrorState;
import forestry.api.core.ITileStructure;
import forestry.api.genetics.IIndividual;
import forestry.apiculture.gui.ContainerAlveary;
import forestry.apiculture.network.PacketActiveUpdate;
import forestry.core.EnumErrorCode;
import forestry.core.config.Config;
import forestry.core.interfaces.IActivatable;
import forestry.core.interfaces.IClimatised;
import forestry.core.interfaces.IErrorSource;
import forestry.core.interfaces.IHintSource;
import forestry.core.inventory.IInventoryAdapter;
import forestry.core.inventory.InvTools;
import forestry.core.inventory.TileInventoryAdapter;
import forestry.core.network.DataInputStreamForestry;
import forestry.core.network.DataOutputStreamForestry;
import forestry.core.network.GuiId;
import forestry.core.proxy.Proxies;
public class TileAlvearyPlain extends TileAlveary implements ISidedInventory, IBeeHousing, IClimatised, IHintSource, IActivatable {
// / CONSTANTS
public static final int SLOT_QUEEN = 0;
public static final int SLOT_DRONE = 1;
public static final int SLOT_PRODUCT_1 = 2;
public static final int SLOT_PRODUCT_COUNT = 7;
public static final int BLOCK_META = 0;
// / MEMBERS
protected IBeekeepingLogic beekeepingLogic;
protected BiomeGenBase biome;
protected float tempChange = 0.0f;
protected float humidChange = 0.0f;
// CLIENT
private boolean active;
private int displayHealthMax = 0;
private int displayHealth = 0;
private IBee displayQueen;
public TileAlvearyPlain() {
super(0);
}
@Override
public void openGui(EntityPlayer player) {
if (isMaster()) {
player.openGui(ForestryAPI.instance, GuiId.AlvearyGUI.ordinal(), worldObj, xCoord, yCoord, zCoord);
} else if (this.hasMaster()) {
player.openGui(ForestryAPI.instance, GuiId.AlvearyGUI.ordinal(), worldObj, masterX, masterY, masterZ);
}
}
@Override
public void validate() {
super.validate();
setBiomeInformation();
}
private void setBiomeInformation() {
this.biome = worldObj.getBiomeGenForCoordsBody(xCoord, zCoord);
}
/* LOADING & SAVING */
@Override
public void readFromNBT(NBTTagCompound nbttagcompound) {
super.readFromNBT(nbttagcompound);
this.tempChange = nbttagcompound.getFloat("TempChange");
this.humidChange = nbttagcompound.getFloat("HumidChange");
if (beekeepingLogic != null) {
beekeepingLogic.readFromNBT(nbttagcompound);
}
}
@Override
public void writeToNBT(NBTTagCompound nbttagcompound) {
super.writeToNBT(nbttagcompound);
nbttagcompound.setFloat("TempChange", tempChange);
nbttagcompound.setFloat("HumidChange", humidChange);
if (beekeepingLogic != null) {
beekeepingLogic.writeToNBT(nbttagcompound);
}
}
@Override
public void writeData(DataOutputStreamForestry data) throws IOException {
super.writeData(data);
data.writeBoolean(active);
if (active) {
ItemStack queen = getStackInSlot(SLOT_QUEEN);
data.writeItemStack(queen);
}
}
@Override
public void readData(DataInputStreamForestry data) throws IOException {
super.readData(data);
active = data.readBoolean();
if (active) {
ItemStack queen = data.readItemStack();
setInventorySlotContents(SLOT_QUEEN, queen);
}
}
@Override
public boolean isActive() {
return active;
}
@Override
public void setActive(boolean active) {
if (this.active == active) {
return;
}
this.active = active;
if (worldObj != null && !worldObj.isRemote) {
Proxies.net.sendNetworkPacket(new PacketActiveUpdate(this));
}
}
/* UPDATING */
@Override
public void initialize() {
super.initialize();
setBiomeInformation();
}
@Override
protected void updateServerSide() {
super.updateServerSide();
if (beekeepingLogic == null) {
return;
}
if (!isMaster()) {
return;
}
boolean canWork = beekeepingLogic.canWork();
setActive(canWork);
if (canWork) {
beekeepingLogic.doWork();
}
// Equalize humidity and temperature
equalizeTemperature();
equalizeHumidity();
}
@Override
protected void updateClientSide() {
if (isMaster() && active && (displayQueen != null) && updateOnInterval(2)) {
displayQueen.doFX(beekeepingLogic.getEffectData(), this);
if (updateOnInterval(50)) {
float fxX = xCoord + 0.5F;
float fxY = yCoord + 0.25F + (worldObj.rand.nextFloat() * 6F) / 16F;
float fxZ = zCoord + 0.5F;
float f3 = 1.6F;
float f4 = worldObj.rand.nextFloat() * f3 - 0.5F;
Proxies.common.addEntitySwarmFX(worldObj, (fxX - f3), fxY, (fxZ + f4), 0F, 0F, 0F);
Proxies.common.addEntitySwarmFX(worldObj, (fxX + f3), fxY, (fxZ + f4), 0F, 0F, 0F);
Proxies.common.addEntitySwarmFX(worldObj, (fxX + f4), fxY, (fxZ - f3), 0F, 0F, 0F);
Proxies.common.addEntitySwarmFX(worldObj, (fxX + f4), fxY, (fxZ + f3), 0F, 0F, 0F);
}
}
}
private void equalizeTemperature() {
if (tempChange == 0) {
return;
}
tempChange -= 0.05f * tempChange;
if (tempChange <= 0.001f && tempChange >= -0.001f) {
tempChange = 0;
}
}
private void equalizeHumidity() {
if (humidChange == 0) {
return;
}
humidChange -= 0.05f * humidChange;
if (humidChange <= 0.001f && humidChange >= 0.001f) {
humidChange = 0;
}
}
/* STATE INFORMATION */
private int getHealthDisplay() {
if (displayQueen == null) {
return 0;
}
if (displayQueen.getMate() != null) {
return displayQueen.getHealth();
} else {
return displayHealth;
}
}
private int getMaxHealthDisplay() {
if (displayQueen == null) {
return 0;
}
if (displayQueen.getMate() != null) {
return displayQueen.getMaxHealth();
} else {
return displayHealthMax;
}
}
public int getHealthScaled(int i) {
if (getMaxHealthDisplay() == 0) {
return 0;
}
return (getHealthDisplay() * i) / getMaxHealthDisplay();
}
/* STRUCTURE MANAGMENT */
@Override
protected void createInventory() {
setInternalInventory(new AlvearyInventoryAdapter(this));
}
@Override
public void makeMaster() {
super.makeMaster();
if (beekeepingLogic == null) {
this.beekeepingLogic = BeeManager.beeRoot.createBeekeepingLogic(this);
}
}
@Override
public void onStructureReset() {
super.onStructureReset();
modifiers.clear();
eventHandlers.clear();
setActive(false);
}
/* IALVEARYCOMPONENT */
private final Set<IBeeModifier> modifiers = new LinkedHashSet<IBeeModifier>();
private final Set<IBeeListener> eventHandlers = new LinkedHashSet<IBeeListener>();
@Override
public void registerBeeModifier(IBeeModifier modifier) {
modifiers.add(modifier);
}
@Override
public void removeBeeModifier(IBeeModifier modifier) {
modifiers.remove(modifier);
}
@Override
public void registerBeeListener(IBeeListener modifier) {
eventHandlers.add(modifier);
}
@Override
public void removeBeeListener(IBeeListener modifier) {
eventHandlers.remove(modifier);
}
@Override
public void addTemperatureChange(float change, float boundaryDown, float boundaryUp) {
float temperature = biome.getFloatTemperature(xCoord, yCoord, zCoord);
tempChange = Math.min(boundaryUp - temperature, Math.max(boundaryDown - temperature, tempChange + change));
}
@Override
public void addHumidityChange(float change, float boundaryDown, float boundaryUp) {
float humidity = biome.rainfall;
humidChange = Math.min(boundaryUp - humidity, Math.max(boundaryDown - humidity, humidChange + change));
}
/* IBEEHOUSING */
@Override
public int getXCoord() {
return xCoord;
}
@Override
public int getYCoord() {
return yCoord;
}
@Override
public int getZCoord() {
return zCoord;
}
@Override
public ItemStack getQueen() {
return getStackInSlot(SLOT_QUEEN);
}
@Override
public ItemStack getDrone() {
return getStackInSlot(SLOT_DRONE);
}
@Override
public void setQueen(ItemStack itemstack) {
setInventorySlotContents(SLOT_QUEEN, itemstack);
}
@Override
public ItemStack decrStackSize(int slotIndex, int amount) {
ItemStack itemStack = super.decrStackSize(slotIndex, amount);
if (slotIndex == SLOT_QUEEN) {
handleQueenChange();
}
return itemStack;
}
@Override
public void setInventorySlotContents(int slotIndex, ItemStack itemStack) {
super.setInventorySlotContents(slotIndex, itemStack);
if (slotIndex == SLOT_QUEEN) {
handleQueenChange();
}
}
private void handleQueenChange() {
if (!Proxies.common.isSimulating(worldObj)) {
TileAlvearyPlain master = (TileAlvearyPlain) getCentralTE();
if (master != null) {
ItemStack itemStack = getStackInSlot(SLOT_QUEEN);
master.displayQueen = BeeManager.beeRoot.getMember(itemStack);
}
}
}
@Override
public void setDrone(ItemStack itemstack) {
setInventorySlotContents(SLOT_DRONE, itemstack);
}
@Override
public BiomeGenBase getBiome() {
return biome;
}
@Override
public EnumTemperature getTemperature() {
if (isHellish() && tempChange >= 0) {
return EnumTemperature.HELLISH;
}
return EnumTemperature.getFromValue(getExactTemperature());
}
@Override
public EnumHumidity getHumidity() {
return EnumHumidity.getFromValue(getExactHumidity());
}
@Override
public float getTerritoryModifier(IBeeGenome genome, float currentModifier) {
float mod = 2.0f;
for (IBeeModifier modifier : modifiers) {
mod *= modifier.getTerritoryModifier(genome, mod);
}
return mod;
}
@Override
public float getProductionModifier(IBeeGenome genome, float currentModifier) {
float mod = 1.0f;
for (IBeeModifier modifier : modifiers) {
mod *= modifier.getProductionModifier(genome, mod);
}
return mod;
}
@Override
public float getMutationModifier(IBeeGenome genome, IBeeGenome mate, float currentModifier) {
float mod = 1.0f;
for (IBeeModifier modifier : modifiers) {
mod *= modifier.getMutationModifier(genome, mate, mod);
}
return mod;
}
@Override
public float getLifespanModifier(IBeeGenome genome, IBeeGenome mate, float currentModifier) {
float mod = 1.0f;
for (IBeeModifier modifier : modifiers) {
mod *= modifier.getLifespanModifier(genome, mate, mod);
}
return mod;
}
@Override
public float getFloweringModifier(IBeeGenome genome, float currentModifier) {
float mod = 1.0f;
for (IBeeModifier modifier : modifiers) {
mod *= modifier.getFloweringModifier(genome, mod);
}
return mod;
}
@Override
public float getGeneticDecay(IBeeGenome genome, float currentModifier) {
float mod = 1.0f;
for (IBeeModifier modifier : modifiers) {
mod *= modifier.getGeneticDecay(genome, mod);
}
return mod;
}
@Override
public World getWorld() {
return worldObj;
}
@Override
public boolean canBreed() {
return true;
}
@Override
public boolean addProduct(ItemStack product, boolean all) {
IInventoryAdapter inventory = getStructureInventory();
if (inventory == null) {
return false;
}
return InvTools.tryAddStack(inventory, product, SLOT_PRODUCT_1, SLOT_PRODUCT_COUNT, all);
}
@Deprecated
@Override
public void setErrorState(IErrorState state) {
removeErrorStates();
if (state != EnumErrorCode.OK) {
addErrorState(state);
}
}
@Override
public void wearOutEquipment(int amount) {
for (IBeeListener eventHandler : eventHandlers) {
eventHandler.wearOutEquipment(amount);
}
}
@Override
public void onQueenChange(ItemStack queenStack) {
if (!Proxies.common.isSimulating(worldObj)) {
return;
}
for (IBeeListener eventHandler : eventHandlers) {
eventHandler.onQueenChange(queenStack);
}
}
@Override
public void onQueenDeath(IBee queen) {
for (IBeeListener eventHandler : eventHandlers) {
eventHandler.onQueenDeath(queen);
}
}
@Override
public void onPostQueenDeath(IBee queen) {
for (IBeeListener eventHandler : eventHandlers) {
eventHandler.onPostQueenDeath(queen);
}
}
@Override
public boolean onPollenRetrieved(IBee queen, IIndividual pollen, boolean isHandled) {
for (IBeeListener eventHandler : eventHandlers) {
if (eventHandler.onPollenRetrieved(queen, pollen, isHandled)) {
isHandled = true;
}
}
return isHandled;
}
@Override
public boolean onEggLaid(IBee queen) {
for (IBeeListener eventHandler : eventHandlers) {
if (eventHandler.onEggLaid(queen)) {
return true;
}
}
return false;
}
@Override
public boolean isSealed() {
for (IBeeModifier modifier : modifiers) {
if (modifier.isSealed()) {
return true;
}
}
return false;
}
@Override
public boolean isSelfLighted() {
for (IBeeModifier modifier : modifiers) {
if (modifier.isSelfLighted()) {
return true;
}
}
return false;
}
@Override
public boolean isSunlightSimulated() {
for (IBeeModifier modifier : modifiers) {
if (modifier.isSunlightSimulated()) {
return true;
}
}
return false;
}
@Override
public boolean isHellish() {
if (BiomeHelper.isBiomeHellish(biome)) {
return true;
}
for (IBeeModifier modifier : modifiers) {
if (modifier.isHellish()) {
return true;
}
}
return false;
}
/* IINVENTORY */
@Override
public IInventoryAdapter getInternalInventory() {
IInventoryAdapter inventory = super.getInternalInventory();
if (isMaster()) {
return inventory;
} else if (hasMaster()) {
ITileStructure central = getCentralTE();
if (central instanceof TileAlveary) {
return ((TileAlveary) central).getInternalInventory();
}
}
return inventory;
}
/* SMP GUI */
public void getGUINetworkData(int i, int j) {
switch (i) {
case 0:
displayHealth = j;
break;
case 1:
displayHealthMax = j;
break;
case 4:
this.tempChange = (float) j / 100;
break;
case 5:
this.humidChange = (float) j / 100;
break;
case 6: {
this.biome = BiomeGenBase.getBiome(j);
break;
}
}
}
public void sendGUINetworkData(ContainerAlveary container, ICrafting iCrafting) {
if (beekeepingLogic == null) {
return;
}
iCrafting.sendProgressBarUpdate(container, 0, beekeepingLogic.getBreedingTime());
iCrafting.sendProgressBarUpdate(container, 1, beekeepingLogic.getTotalBreedingTime());
iCrafting.sendProgressBarUpdate(container, 4, Math.round(tempChange * 100));
iCrafting.sendProgressBarUpdate(container, 5, Math.round(humidChange * 100));
iCrafting.sendProgressBarUpdate(container, 6, biome.biomeID);
}
/* IERRORSOURCE */
@Deprecated
@Override
public IErrorState getErrorState() {
Set<IErrorState> errorStates = null;
if (hasMaster()) {
ITileStructure tile = getCentralTE();
if (tile != null) {
errorStates = ((IErrorSource) tile).getErrorStates();
}
}
if (errorStates == null) {
errorStates = this.getErrorStates();
}
if (errorStates.size() == 0) {
return EnumErrorCode.OK;
} else {
return getErrorStates().iterator().next();
}
}
/* ICLIMATISED */
@Override
public boolean isClimatized() {
return true;
}
@Override
public float getExactTemperature() {
return biome.getFloatTemperature(xCoord, yCoord, zCoord) + this.tempChange;
}
@Override
public float getExactHumidity() {
return biome.rainfall + this.humidChange;
}
/* IHINTSOURCE */
@Override
public boolean hasHints() {
return Config.hints.get("alveary").length > 0;
}
@Override
public String[] getHints() {
return Config.hints.get("alveary");
}
/* IHousing */
@Override
public GameProfile getOwnerName() {
return this.getOwner();
}
private static class AlvearyInventoryAdapter extends TileInventoryAdapter<TileAlvearyPlain> {
public AlvearyInventoryAdapter(TileAlvearyPlain tileAlvearyPlain) {
super(tileAlvearyPlain, 9, "Items");
}
@Override
public boolean canSlotAccept(int slotIndex, ItemStack itemStack) {
if (slotIndex == SLOT_QUEEN) {
return BeeManager.beeRoot.isMember(itemStack) && !BeeManager.beeRoot.isDrone(itemStack);
} else if (slotIndex == SLOT_DRONE) {
return BeeManager.beeRoot.isDrone(itemStack);
}
return false;
}
@Override
public boolean canExtractItem(int slotIndex, ItemStack itemstack, int side) {
return slotIndex != SLOT_QUEEN && slotIndex != SLOT_DRONE;
}
}
}
@@ -0,0 +1,196 @@
/*******************************************************************************
* Copyright (c) 2011-2014 SirSengir.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU Lesser Public License v3
* which accompanies this distribution, and is available at
* http://www.gnu.org/licenses/lgpl-3.0.txt
*
* Various Contributors including, but not limited to:
* SirSengir (original work), CovertJaguar, Player, Binnie, MysteriousAges
******************************************************************************/
package forestry.apiculture.gadgets;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import forestry.api.apiculture.IAlvearyComponent;
import forestry.api.apiculture.IBee;
import forestry.api.apiculture.IBeeListener;
import forestry.api.arboriculture.EnumGermlingType;
import forestry.api.core.ForestryAPI;
import forestry.api.genetics.AlleleManager;
import forestry.api.genetics.IIndividual;
import forestry.core.config.ForestryItem;
import forestry.core.interfaces.ICrafter;
import forestry.core.inventory.IInventoryAdapter;
import forestry.core.inventory.TileInventoryAdapter;
import forestry.core.network.GuiId;
import forestry.core.proxy.Proxies;
import forestry.core.utils.StackUtils;
public class TileAlvearySieve extends TileAlveary implements ICrafter, IBeeListener {
/* CONSTANTS */
public static final int BLOCK_META = 7;
public static final int SLOT_POLLEN_1 = 0;
public static final int SLOTS_POLLEN_COUNT = 4;
public static final int SLOT_SIEVE = 4;
public TileAlvearySieve() {
super(BLOCK_META);
setInternalInventory(new AlvearySieveInventoryAdapter(this));
}
@Override
public void openGui(EntityPlayer player) {
player.openGui(ForestryAPI.instance, GuiId.AlvearySieveGUI.ordinal(), worldObj, xCoord, yCoord, zCoord);
}
@Override
public boolean hasFunction() {
return true;
}
/* UPDATING */
@Override
public void initialize() {
super.initialize();
if (!hasMaster() || !isIntegratedIntoStructure() || !Proxies.common.isSimulating(worldObj)) {
return;
}
((IAlvearyComponent) getCentralTE()).registerBeeListener(this);
}
@Override
protected void updateServerSide() {
super.updateServerSide();
if (!updateOnInterval(200)) {
return;
}
if (!hasMaster() || !isIntegratedIntoStructure()) {
return;
}
((IAlvearyComponent) getCentralTE()).registerBeeListener(this);
}
/* TEXTURES & INTERNAL */
@Override
public int getIcon(int side, int metadata) {
if (side == 0 || side == 1) {
return BlockAlveary.BOTTOM;
}
return BlockAlveary.SIEVE;
}
private void destroySieve() {
IInventoryAdapter inventory = getInternalInventory();
inventory.setInventorySlotContents(SLOT_SIEVE, null);
}
private void destroyPollen() {
IInventoryAdapter inventory = getInternalInventory();
for (int i = SLOT_POLLEN_1; i < SLOT_POLLEN_1 + SLOTS_POLLEN_COUNT; i++) {
inventory.setInventorySlotContents(i, null);
}
}
private boolean canStorePollen() {
IInventoryAdapter inventory = getInternalInventory();
if (inventory.getStackInSlot(SLOT_SIEVE) == null) {
return false;
}
for (int i = SLOT_POLLEN_1; i < SLOT_POLLEN_1 + SLOTS_POLLEN_COUNT; i++) {
if (inventory.getStackInSlot(i) == null) {
return true;
}
}
return false;
}
private void storePollenStack(ItemStack itemstack) {
IInventoryAdapter inventory = getInternalInventory();
for (int i = SLOT_POLLEN_1; i < SLOT_POLLEN_1 + SLOTS_POLLEN_COUNT; i++) {
if (inventory.getStackInSlot(i) == null) {
inventory.setInventorySlotContents(i, itemstack);
return;
}
}
}
/* ICRAFTER */
@Override
public boolean canTakeStack(int slotIndex) {
return true;
}
@Override
public ItemStack takenFromSlot(int slotIndex, EntityPlayer player) {
IInventoryAdapter inventory = getInternalInventory();
if (slotIndex == SLOT_SIEVE) {
destroyPollen();
return inventory.getStackInSlot(SLOT_SIEVE);
} else {
destroySieve();
return inventory.getStackInSlot(slotIndex);
}
}
@Override
public ItemStack getResult() {
return null;
}
/* IBEELISTENER */
@Override
public void onQueenChange(ItemStack queen) {
}
@Override
public void wearOutEquipment(int amount) {
}
@Override
public void onQueenDeath(IBee queen) {
}
@Override
public void onPostQueenDeath(IBee queen) {
}
@Override
public boolean onPollenRetrieved(IBee queen, IIndividual pollen, boolean isHandled) {
if (isHandled) {
return true;
}
if (!canStorePollen()) {
return false;
}
storePollenStack(AlleleManager.alleleRegistry.getSpeciesRoot(pollen.getClass()).getMemberStack(pollen, EnumGermlingType.POLLEN.ordinal()));
return true;
}
@Override
public boolean onEggLaid(IBee queen) {
return false;
}
private static class AlvearySieveInventoryAdapter extends TileInventoryAdapter<TileAlvearySieve> {
public AlvearySieveInventoryAdapter(TileAlvearySieve alvearySieve) {
super(alvearySieve, 5, "Items", 1);
}
@Override
public boolean canSlotAccept(int slotIndex, ItemStack itemStack) {
return StackUtils.isIdenticalItem(ForestryItem.craftingMaterial.getItemStack(1, 3), itemStack);
}
}
}
@@ -0,0 +1,120 @@
/*******************************************************************************
* Copyright (c) 2011-2014 SirSengir.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU Lesser Public License v3
* which accompanies this distribution, and is available at
* http://www.gnu.org/licenses/lgpl-3.0.txt
*
* Various Contributors including, but not limited to:
* SirSengir (original work), CovertJaguar, Player, Binnie, MysteriousAges
******************************************************************************/
package forestry.apiculture.gadgets;
import forestry.api.apiculture.IAlvearyComponent;
import forestry.api.apiculture.IBeeGenome;
import forestry.api.apiculture.IBeeModifier;
import forestry.core.proxy.Proxies;
public class TileAlvearyStabiliser extends TileAlveary implements IBeeModifier {
public static final int BLOCK_META = 6;
public TileAlvearyStabiliser() {
super(BLOCK_META);
}
/* UPDATING */
@Override
public void initialize() {
super.initialize();
if (!hasMaster() || !isIntegratedIntoStructure() || !Proxies.common.isSimulating(worldObj)) {
return;
}
((IAlvearyComponent) getCentralTE()).registerBeeModifier(this);
}
@Override
protected void updateServerSide() {
super.updateServerSide();
if (!updateOnInterval(200)) {
return;
}
if (!hasMaster() || !isIntegratedIntoStructure()) {
return;
}
((IAlvearyComponent) getCentralTE()).registerBeeModifier(this);
}
@Override
public boolean hasFunction() {
return true;
}
/* TEXTURES */
@Override
public int getIcon(int side, int metadata) {
if (side == 0 || side == 1) {
return BlockAlveary.BOTTOM;
}
return BlockAlveary.STABILISER;
}
/* IBEEMODIFIER */
@Override
public float getMutationModifier(IBeeGenome genome, IBeeGenome mate, float currentModifier) {
return 0.0f;
}
@Override
public float getTerritoryModifier(IBeeGenome genome, float currentModifier) {
return 1.0f;
}
@Override
public float getLifespanModifier(IBeeGenome genome, IBeeGenome mate, float currentModifier) {
return 1.0f;
}
@Override
public float getProductionModifier(IBeeGenome genome, float currentModifier) {
return 1.0f;
}
@Override
public float getFloweringModifier(IBeeGenome genome, float currentModifier) {
return 1.0f;
}
@Override
public float getGeneticDecay(IBeeGenome genome, float currentModifier) {
return 1.0f;
}
@Override
public boolean isSealed() {
return false;
}
@Override
public boolean isSelfLighted() {
return false;
}
@Override
public boolean isSunlightSimulated() {
return false;
}
@Override
public boolean isHellish() {
return false;
}
}
@@ -8,8 +8,9 @@
* Various Contributors including, but not limited to:
* SirSengir (original work), CovertJaguar, Player, Binnie, MysteriousAges
******************************************************************************/
package forestry.apiculture.multiblock;
package forestry.apiculture.gadgets;
import java.io.IOException;
import java.util.Map.Entry;
import java.util.Stack;
@@ -21,57 +22,57 @@ import net.minecraft.nbt.NBTTagList;
import forestry.api.apiculture.BeeManager;
import forestry.api.apiculture.EnumBeeType;
import forestry.api.apiculture.IAlvearyComponent;
import forestry.api.apiculture.IBee;
import forestry.api.multiblock.IAlvearyComponent;
import forestry.apiculture.blocks.BlockAlveary;
import forestry.apiculture.gui.ContainerAlvearySwarmer;
import forestry.apiculture.gui.GuiAlvearySwarmer;
import forestry.apiculture.inventory.InventorySwarmer;
import forestry.apiculture.network.packets.PacketActiveUpdate;
import forestry.api.apiculture.IBeeHousing;
import forestry.api.core.ForestryAPI;
import forestry.apiculture.network.PacketActiveUpdate;
import forestry.apiculture.worldgen.Hive;
import forestry.apiculture.worldgen.HiveDecorator;
import forestry.apiculture.worldgen.HiveDescriptionSwarmer;
import forestry.core.inventory.IInventoryAdapter;
import forestry.core.interfaces.IActivatable;
import forestry.core.inventory.TileInventoryAdapter;
import forestry.core.inventory.wrappers.IInvSlot;
import forestry.core.inventory.wrappers.InventoryIterator;
import forestry.core.network.DataInputStreamForestry;
import forestry.core.network.DataOutputStreamForestry;
import forestry.core.network.GuiId;
import forestry.core.proxy.Proxies;
import forestry.core.tiles.IActivatable;
import forestry.core.utils.ItemStackUtil;
import forestry.core.utils.StackUtils;
public class TileAlvearySwarmer extends TileAlveary implements ISidedInventory, IActivatable, IAlvearyComponent.Active {
public class TileAlvearySwarmer extends TileAlveary implements ISidedInventory, IActivatable {
private final InventorySwarmer inventory;
private final Stack<ItemStack> pendingSpawns = new Stack<>();
/* CONSTANTS */
public static final int BLOCK_META = 2;
private final Stack<ItemStack> pendingSpawns = new Stack<ItemStack>();
private boolean active;
public TileAlvearySwarmer() {
super(BlockAlveary.Type.SWARMER);
this.inventory = new InventorySwarmer(this);
super(BLOCK_META);
setInternalInventory(new SwarmerInventoryAdapter(this));
}
@Override
public IInventoryAdapter getInternalInventory() {
return inventory;
}
@Override
public boolean allowsAutomation() {
return true;
public void openGui(EntityPlayer player) {
player.openGui(ForestryAPI.instance, GuiId.AlvearySwarmerGUI.ordinal(), worldObj, xCoord, yCoord, zCoord);
}
/* UPDATING */
@Override
public void updateServer(int tickCount) {
protected void updateServerSide() {
super.updateServerSide();
if (pendingSpawns.size() > 0) {
setActive(true);
if (tickCount % 1000 == 0) {
if (updateOnInterval(1000)) {
trySpawnSwarm();
}
} else {
setActive(false);
}
if (tickCount % 500 != 0) {
if (!updateOnInterval(500)) {
return;
}
@@ -96,19 +97,23 @@ public class TileAlvearySwarmer extends TileAlveary implements ISidedInventory,
pendingSpawns.push(BeeManager.beeRoot.getMemberStack(princess, EnumBeeType.PRINCESS.ordinal()));
}
@Override
public void updateClient(int tickCount) {
}
private ItemStack getPrincessStack() {
ItemStack princessStack = getMultiblockLogic().getController().getBeeInventory().getQueen();
if (BeeManager.beeRoot.isMated(princessStack)) {
return princessStack;
if (!this.hasMaster()) {
return null;
}
return null;
IAlvearyComponent master = (IAlvearyComponent) this.getCentralTE();
if (!(master instanceof IBeeHousing)) {
return null;
}
IBeeHousing housing = (IBeeHousing) master;
ItemStack princessStack = housing.getQueen();
if (princessStack == null || !BeeManager.beeRoot.isMated(princessStack)) {
return null;
}
return princessStack;
}
private int consumeInducerAndGetChance() {
@@ -119,7 +124,7 @@ public class TileAlvearySwarmer extends TileAlveary implements ISidedInventory,
for (IInvSlot slot : InventoryIterator.getIterable(getInternalInventory())) {
ItemStack stack = slot.getStackInSlot();
for (Entry<ItemStack, Integer> entry : BeeManager.inducers.entrySet()) {
if (ItemStackUtil.isIdenticalItem(entry.getKey(), stack)) {
if (StackUtils.isIdenticalItem(entry.getKey(), stack)) {
slot.decreaseStackInSlot();
return entry.getValue();
}
@@ -138,7 +143,7 @@ public class TileAlvearySwarmer extends TileAlveary implements ISidedInventory,
int chunkX = (xCoord + worldObj.rand.nextInt(40 * 2) - 40) / 16;
int chunkZ = (zCoord + worldObj.rand.nextInt(40 * 2) - 40) / 16;
if (HiveDecorator.genHive(worldObj, worldObj.rand, chunkX, chunkZ, hive)) {
if (HiveDecorator.instance().genHive(worldObj, worldObj.rand, chunkX, chunkZ, hive)) {
pendingSpawns.pop();
}
}
@@ -146,20 +151,29 @@ public class TileAlvearySwarmer extends TileAlveary implements ISidedInventory,
/* NETWORK */
@Override
protected void encodeDescriptionPacket(NBTTagCompound packetData) {
super.encodeDescriptionPacket(packetData);
packetData.setBoolean("Active", active);
public void writeData(DataOutputStreamForestry data) throws IOException {
super.writeData(data);
data.writeBoolean(active);
}
@Override
protected void decodeDescriptionPacket(NBTTagCompound packetData) {
super.decodeDescriptionPacket(packetData);
setActive(packetData.getBoolean("Active"));
public void readData(DataInputStreamForestry data) throws IOException {
super.readData(data);
boolean active = data.readBoolean();
if (this.active != active) {
this.active = active;
worldObj.func_147479_m(xCoord, yCoord, zCoord);
}
}
@Override
public boolean hasFunction() {
return true;
}
/* TEXTURES */
@Override
public int getIcon(int side) {
public int getIcon(int side, int metadata) {
if (side == 0 || side == 1) {
return BlockAlveary.BOTTOM;
}
@@ -175,19 +189,18 @@ public class TileAlvearySwarmer extends TileAlveary implements ISidedInventory,
@Override
public void readFromNBT(NBTTagCompound nbttagcompound) {
super.readFromNBT(nbttagcompound);
setActive(nbttagcompound.getBoolean("Active"));
NBTTagList nbttaglist = nbttagcompound.getTagList("PendingSpawns", 10);
for (int i = 0; i < nbttaglist.tagCount(); i++) {
NBTTagCompound nbttagcompound1 = nbttaglist.getCompoundTagAt(i);
pendingSpawns.add(ItemStack.loadItemStackFromNBT(nbttagcompound1));
}
}
@Override
public void writeToNBT(NBTTagCompound nbttagcompound) {
super.writeToNBT(nbttagcompound);
nbttagcompound.setBoolean("Active", active);
NBTTagList nbttaglist = new NBTTagList();
ItemStack[] offspring = pendingSpawns.toArray(new ItemStack[pendingSpawns.size()]);
@@ -200,6 +213,7 @@ public class TileAlvearySwarmer extends TileAlveary implements ISidedInventory,
}
}
nbttagcompound.setTag("PendingSpawns", nbttaglist);
}
@Override
@@ -215,18 +229,19 @@ public class TileAlvearySwarmer extends TileAlveary implements ISidedInventory,
this.active = active;
if (!worldObj.isRemote) {
Proxies.net.sendNetworkPacket(new PacketActiveUpdate(this), worldObj);
if (worldObj != null && !worldObj.isRemote) {
Proxies.net.sendNetworkPacket(new PacketActiveUpdate(this));
}
}
@Override
public Object getGui(EntityPlayer player, int data) {
return new GuiAlvearySwarmer(player.inventory, this);
}
private static class SwarmerInventoryAdapter extends TileInventoryAdapter<TileAlvearySwarmer> {
public SwarmerInventoryAdapter(TileAlvearySwarmer alvearySwarmer) {
super(alvearySwarmer, 4, "SwarmInv");
}
@Override
public Object getContainer(EntityPlayer player, int data) {
return new ContainerAlvearySwarmer(player.inventory, this);
@Override
public boolean canSlotAccept(int slotIndex, ItemStack itemStack) {
return StackUtils.containsItemStack(BeeManager.inducers.keySet(), itemStack);
}
}
}
@@ -1,21 +1,23 @@
/*******************************************************************************
* Copyright (c) 2011-2014 SirSengir.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU Lesser Public License v3
* which accompanies this distribution, and is available at
* http://www.gnu.org/licenses/lgpl-3.0.txt
*
* Various Contributors including, but not limited to:
* SirSengir (original work), CovertJaguar, Player, Binnie, MysteriousAges
******************************************************************************/
package forestry.lepidopterology.genetics;
import java.util.Locale;
import forestry.core.genetics.Branch;
public class BranchButterflies extends Branch {
public BranchButterflies(String scientific) {
super("moth." + scientific.toLowerCase(Locale.ENGLISH), scientific);
}
}
/*******************************************************************************
* Copyright (c) 2011-2014 SirSengir.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU Lesser Public License v3
* which accompanies this distribution, and is available at
* http://www.gnu.org/licenses/lgpl-3.0.txt
*
* Various Contributors including, but not limited to:
* SirSengir (original work), CovertJaguar, Player, Binnie, MysteriousAges
******************************************************************************/
package forestry.apiculture.gadgets;
import forestry.api.apiculture.BeeManager;
import forestry.core.gadgets.TileNaturalistChest;
import forestry.core.network.GuiId;
public class TileApiaristChest extends TileNaturalistChest {
public TileApiaristChest() {
super(BeeManager.beeRoot, GuiId.ApiaristChestGUI.ordinal());
}
}
+259
View File
@@ -0,0 +1,259 @@
/*******************************************************************************
* Copyright (c) 2011-2014 SirSengir.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU Lesser Public License v3
* which accompanies this distribution, and is available at
* http://www.gnu.org/licenses/lgpl-3.0.txt
*
* Various Contributors including, but not limited to:
* SirSengir (original work), CovertJaguar, Player, Binnie, MysteriousAges
******************************************************************************/
package forestry.apiculture.gadgets;
import java.util.Collection;
import java.util.LinkedList;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.tileentity.TileEntity;
import net.minecraftforge.common.util.ForgeDirection;
import cpw.mods.fml.common.Optional;
import forestry.api.apiculture.BeeManager;
import forestry.api.apiculture.IBeeGenome;
import forestry.api.apiculture.IHiveFrame;
import forestry.api.core.ForestryAPI;
import forestry.apiculture.trigger.ApicultureTriggers;
import forestry.core.gadgets.TileBase;
import forestry.core.inventory.IInventoryAdapter;
import forestry.core.network.GuiId;
import buildcraft.api.statements.ITriggerExternal;
public class TileApiary extends TileBeehouse {
public TileApiary() {
setInternalInventory(new BeehouseInventoryAdapter(this, 12, "Items"));
}
@Override
public void openGui(EntityPlayer player, TileBase tile) {
player.openGui(ForestryAPI.instance, GuiId.ApiaryGUI.ordinal(), worldObj, xCoord, yCoord, zCoord);
}
/* IBEEHOUSING */
@Override
public float getTerritoryModifier(IBeeGenome genome, float currentModifier) {
IInventoryAdapter inventory = getInternalInventory();
float mod = 1.0f;
for (int i = SLOT_FRAMES_1; i < SLOT_FRAMES_1 + SLOT_FRAMES_COUNT; i++) {
if (inventory.getStackInSlot(i) == null) {
continue;
}
if (inventory.getStackInSlot(i).getItem() instanceof IHiveFrame) {
mod *= ((IHiveFrame) inventory.getStackInSlot(i).getItem()).getTerritoryModifier(genome, mod);
}
}
return mod;
}
@Override
public float getProductionModifier(IBeeGenome genome, float currentModifier) {
IInventoryAdapter inventory = getInternalInventory();
float mod = 0.1f;
for (int i = SLOT_FRAMES_1; i < SLOT_FRAMES_1 + SLOT_FRAMES_COUNT; i++) {
if (inventory.getStackInSlot(i) == null) {
continue;
}
if (inventory.getStackInSlot(i).getItem() instanceof IHiveFrame) {
mod *= ((IHiveFrame) inventory.getStackInSlot(i).getItem()).getProductionModifier(genome, mod);
}
}
return mod;
}
@Override
public float getMutationModifier(IBeeGenome genome, IBeeGenome mate, float currentModifier) {
IInventoryAdapter inventory = getInternalInventory();
float mod = 1.0f;
for (int i = SLOT_FRAMES_1; i < SLOT_FRAMES_1 + SLOT_FRAMES_COUNT; i++) {
if (inventory.getStackInSlot(i) == null) {
continue;
}
if (inventory.getStackInSlot(i).getItem() instanceof IHiveFrame) {
mod *= ((IHiveFrame) inventory.getStackInSlot(i).getItem()).getMutationModifier(genome, mate, mod);
}
}
return mod;
}
@Override
public float getLifespanModifier(IBeeGenome genome, IBeeGenome mate, float currentModifier) {
IInventoryAdapter inventory = getInternalInventory();
float mod = 1.0f;
for (int i = SLOT_FRAMES_1; i < SLOT_FRAMES_1 + SLOT_FRAMES_COUNT; i++) {
if (inventory.getStackInSlot(i) == null) {
continue;
}
if (inventory.getStackInSlot(i).getItem() instanceof IHiveFrame) {
mod *= ((IHiveFrame) inventory.getStackInSlot(i).getItem()).getLifespanModifier(genome, mate, mod);
}
}
return mod;
}
@Override
public float getFloweringModifier(IBeeGenome genome, float currentModifier) {
IInventoryAdapter inventory = getInternalInventory();
float mod = 1f;
for (int i = SLOT_FRAMES_1; i < SLOT_FRAMES_1 + SLOT_FRAMES_COUNT; i++) {
if (inventory.getStackInSlot(i) == null) {
continue;
}
if (inventory.getStackInSlot(i).getItem() instanceof IHiveFrame) {
mod *= ((IHiveFrame) inventory.getStackInSlot(i).getItem()).getFloweringModifier(genome, mod);
}
}
return mod;
}
@Override
public float getGeneticDecay(IBeeGenome genome, float currentModifier) {
IInventoryAdapter inventory = getInternalInventory();
float mod = 1f;
for (int i = SLOT_FRAMES_1; i < SLOT_FRAMES_1 + SLOT_FRAMES_COUNT; i++) {
if (inventory.getStackInSlot(i) == null) {
continue;
}
if (inventory.getStackInSlot(i).getItem() instanceof IHiveFrame) {
mod *= ((IHiveFrame) inventory.getStackInSlot(i).getItem()).getGeneticDecay(genome, mod);
}
}
return mod;
}
@Override
public void wearOutEquipment(int amount) {
IInventoryAdapter inventory = getInternalInventory();
int wear = Math.round(amount * BeeManager.beeRoot.getBeekeepingMode(worldObj).getWearModifier());
for (int i = SLOT_FRAMES_1; i < SLOT_FRAMES_1 + SLOT_FRAMES_COUNT; i++) {
if (inventory.getStackInSlot(i) == null) {
continue;
}
if (!(inventory.getStackInSlot(i).getItem() instanceof IHiveFrame)) {
continue;
}
inventory.setInventorySlotContents(
i,
((IHiveFrame) inventory.getStackInSlot(i).getItem()).frameUsed(this, inventory.getStackInSlot(i),
BeeManager.beeRoot.getMember(inventory.getStackInSlot(SLOT_QUEEN)), wear));
}
}
/* ISPECIALINVENTORY */
// @Override
// public ItemStack[] extractItem(boolean doRemove, ForgeDirection from, int maxItemCount) {
// ItemStack product = null;
//
// for (int i = SLOT_PRODUCT_1; i < SLOT_PRODUCT_1 + SLOT_PRODUCT_COUNT; i++) {
// if (inventory.getStackInSlot(i) == null)
// continue;
//
// // Princesses can only be extracted from top.
// if (ForestryItem.beePrincessGE.isItemEqual(inventory.getStackInSlot(i))) {
// if (PluginApiculture.apiarySideSensitive && from != ForgeDirection.UP)
// continue;
//
// product = inventory.getStackInSlot(i).copy();
// if (doRemove) {
// inventory.getStackInSlot(i).stackSize = 0;
// inventory.setInventorySlotContents(i, null);
// }
// break;
//
// // Drones can only be extracted from the bottom.
// } else if (ForestryItem.beeDroneGE.isItemEqual(inventory.getStackInSlot(i))) {
// if (PluginApiculture.apiarySideSensitive && from != ForgeDirection.DOWN)
// continue;
//
// product = StackUtils.createSplitStack(inventory.getStackInSlot(i), 1);
// product.stackSize = 1;
// if (doRemove) {
// inventory.getStackInSlot(i).stackSize--;
// if (inventory.getStackInSlot(i).stackSize <= 0)
// inventory.setInventorySlotContents(i, null);
// }
// break;
//
// // Everything else to be extracted from the sides
// } else {
// if (PluginApiculture.apiarySideSensitive && (from == ForgeDirection.UP || from == ForgeDirection.DOWN))
// continue;
//
// product = StackUtils.createSplitStack(inventory.getStackInSlot(i), 1);
// if (doRemove) {
// inventory.getStackInSlot(i).stackSize--;
// if (inventory.getStackInSlot(i).stackSize <= 0)
// inventory.setInventorySlotContents(i, null);
// }
// break;
// }
// }
//
// return new ItemStack[] { product };
// }
//
// @Override
// public int addItem(ItemStack stack, boolean doAdd, ForgeDirection from) {
// // Princesses && Queens
// if (ForestryItem.beePrincessGE.isItemEqual(stack) || ForestryItem.beeQueenGE.isItemEqual(stack))
// if (inventory.getStackInSlot(SLOT_QUEEN) == null) {
// if (doAdd) {
// inventory.setInventorySlotContents(SLOT_QUEEN, stack.copy());
// inventory.getStackInSlot(SLOT_QUEEN).stackSize = 1;
// }
//
// return 1;
// }
//
// // Drones
// if (ForestryItem.beeDroneGE.isItemEqual(stack)) {
//
// ItemStack droneStack = inventory.getStackInSlot(SLOT_DRONE);
// if (droneStack == null) {
// if (doAdd)
// inventory.setInventorySlotContents(SLOT_DRONE, stack.copy());
// return stack.stackSize;
// } else {
// if (!droneStack.isItemEqual(stack))
// return 0;
// if (!ItemStack.areItemStackTagsEqual(droneStack, stack))
// return 0;
// int space = droneStack.getMaxStackSize() - droneStack.stackSize;
// if (space <= 0)
// return 0;
//
// int added = space > stack.stackSize ? stack.stackSize : space;
// if (doAdd)
// droneStack.stackSize += added;
// return added;
// }
// }
//
// return 0;
// }
/* ITRIGGERPROVIDER */
@Optional.Method(modid = "BuildCraftAPI|statements")
@Override
public Collection<ITriggerExternal> getExternalTriggers(ForgeDirection side, TileEntity tile) {
LinkedList<ITriggerExternal> res = new LinkedList<ITriggerExternal>();
res.add(ApicultureTriggers.missingQueen);
res.add(ApicultureTriggers.missingDrone);
res.add(ApicultureTriggers.noFrames);
return res;
}
}
+486
View File
@@ -0,0 +1,486 @@
/*******************************************************************************
* Copyright (c) 2011-2014 SirSengir.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU Lesser Public License v3
* which accompanies this distribution, and is available at
* http://www.gnu.org/licenses/lgpl-3.0.txt
*
* Various Contributors including, but not limited to:
* SirSengir (original work), CovertJaguar, Player, Binnie, MysteriousAges
******************************************************************************/
package forestry.apiculture.gadgets;
import java.io.IOException;
import java.util.Set;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.Container;
import net.minecraft.inventory.ICrafting;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.world.World;
import net.minecraft.world.biome.BiomeGenBase;
import com.mojang.authlib.GameProfile;
import forestry.api.apiculture.BeeManager;
import forestry.api.apiculture.IBee;
import forestry.api.apiculture.IBeeGenome;
import forestry.api.apiculture.IBeeHousing;
import forestry.api.apiculture.IBeekeepingLogic;
import forestry.api.apiculture.IHiveFrame;
import forestry.api.core.EnumHumidity;
import forestry.api.core.EnumTemperature;
import forestry.api.core.ForestryAPI;
import forestry.api.core.IErrorState;
import forestry.api.genetics.IIndividual;
import forestry.apiculture.network.PacketActiveUpdate;
import forestry.core.EnumErrorCode;
import forestry.core.config.Config;
import forestry.core.gadgets.TileBase;
import forestry.core.interfaces.IActivatable;
import forestry.core.interfaces.IClimatised;
import forestry.core.inventory.InvTools;
import forestry.core.inventory.TileInventoryAdapter;
import forestry.core.network.DataInputStreamForestry;
import forestry.core.network.DataOutputStreamForestry;
import forestry.core.network.GuiId;
import forestry.core.proxy.Proxies;
import forestry.core.utils.GuiUtil;
public class TileBeehouse extends TileBase implements IBeeHousing, IClimatised, IActivatable {
// CONSTANTS
public static final int SLOT_QUEEN = 0;
public static final int SLOT_DRONE = 1;
public static final int SLOT_PRODUCT_1 = 2;
public static final int SLOT_PRODUCT_COUNT = 7;
public static final int SLOT_FRAMES_1 = 9;
public static final int SLOT_FRAMES_COUNT = 3;
private final IBeekeepingLogic logic;
private BiomeGenBase biome;
// CLIENT
private boolean active;
private int displayHealthMax = 0;
private int displayHealth = 0;
private IBee displayQueen;
public TileBeehouse() {
setHints(Config.hints.get("apiary"));
logic = BeeManager.beeRoot.createBeekeepingLogic(this);
setInternalInventory(new BeehouseInventoryAdapter(this, 12, "Items").disableAutomation());
}
@Override
public void openGui(EntityPlayer player, TileBase tile) {
player.openGui(ForestryAPI.instance, GuiId.BeehouseGUI.ordinal(), worldObj, xCoord, yCoord, zCoord);
}
/* LOADING & SAVING */
@Override
public void writeToNBT(NBTTagCompound nbttagcompound) {
super.writeToNBT(nbttagcompound);
nbttagcompound.setInteger("BiomeId", biome.biomeID);
if (logic != null) {
logic.writeToNBT(nbttagcompound);
}
}
@Override
public void readFromNBT(NBTTagCompound nbttagcompound) {
super.readFromNBT(nbttagcompound);
int biomeId = nbttagcompound.getInteger("BiomeId");
biome = BiomeGenBase.getBiome(biomeId);
logic.readFromNBT(nbttagcompound);
}
@Override
public void writeData(DataOutputStreamForestry data) throws IOException {
super.writeData(data);
data.writeBoolean(active);
if (active) {
ItemStack queen = getStackInSlot(SLOT_QUEEN);
data.writeItemStack(queen);
}
}
@Override
public void readData(DataInputStreamForestry data) throws IOException {
super.readData(data);
active = data.readBoolean();
if (active) {
ItemStack queen = data.readItemStack();
setInventorySlotContents(SLOT_QUEEN, queen);
}
}
@Override
public void initialize() {
super.initialize();
updateBiome();
}
@Override
public void validate() {
updateBiome();
}
/* ICLIMATISED */
@Override
public boolean isClimatized() {
return true;
}
@Override
public EnumTemperature getTemperature() {
return EnumTemperature.getFromBiome(biome, xCoord, yCoord, zCoord);
}
@Override
public EnumHumidity getHumidity() {
return EnumHumidity.getFromValue(getExactHumidity());
}
@Deprecated
@Override
public void setErrorState(IErrorState state) {
removeErrorStates();
if (state != EnumErrorCode.OK) {
addErrorState(state);
}
}
@Deprecated
@Override
public IErrorState getErrorState() {
Set<IErrorState> errorStates = getErrorStates();
if (errorStates.size() == 0) {
return EnumErrorCode.OK;
} else {
return getErrorStates().iterator().next();
}
}
@Override
public float getExactTemperature() {
return biome.getFloatTemperature(xCoord, yCoord, zCoord);
}
@Override
public float getExactHumidity() {
return biome.rainfall;
}
/* UPDATING */
@Override
public void updateClientSide() {
if (isActive() && (displayQueen != null) && updateOnInterval(4)) {
displayQueen.doFX(logic.getEffectData(), this);
if (updateOnInterval(50)) {
float fxX = xCoord + 0.5F;
float fxY = yCoord + 0.25F + (worldObj.rand.nextFloat() * 6F) / 16F;
float fxZ = zCoord + 0.5F;
float f3 = 0.6F;
float f4 = worldObj.rand.nextFloat() * f3 - 0.5F;
Proxies.common.addEntitySwarmFX(worldObj, (fxX - f3), fxY, (fxZ + f4), 0F, 0F, 0F);
Proxies.common.addEntitySwarmFX(worldObj, (fxX + f3), fxY, (fxZ + f4), 0F, 0F, 0F);
Proxies.common.addEntitySwarmFX(worldObj, (fxX + f4), fxY, (fxZ - f3), 0F, 0F, 0F);
Proxies.common.addEntitySwarmFX(worldObj, (fxX + f4), fxY, (fxZ + f3), 0F, 0F, 0F);
}
}
}
@Override
public void updateServerSide() {
boolean canWork = logic.canWork();
setActive(canWork);
if (canWork) {
logic.doWork();
}
}
// @Override
public boolean isWorking() {
return !hasErrorState();
}
@Override
public boolean addProduct(ItemStack product, boolean all) {
return InvTools.tryAddStack(getInternalInventory(), product, SLOT_PRODUCT_1, SLOT_PRODUCT_COUNT, all, true);
}
/* NETWORK SYNCH */
@Override
public void onQueenChange(ItemStack queenStack) {
}
/* STATE INFORMATION */
private int getHealthDisplay() {
if (displayQueen == null) {
return 0;
}
if (displayQueen.getMate() != null) {
return displayQueen.getHealth();
} else {
return displayHealth;
}
}
private int getMaxHealthDisplay() {
if (displayQueen == null) {
return 0;
}
if (displayQueen.getMate() != null) {
return displayQueen.getMaxHealth();
} else {
return displayHealthMax;
}
}
/**
* Returns scaled queen health or breeding progress
*/
public int getHealthScaled(int i) {
if (getMaxHealthDisplay() == 0) {
return 0;
}
return (getHealthDisplay() * i) / getMaxHealthDisplay();
}
public void updateBiome() {
if (worldObj != null) {
BiomeGenBase biome = worldObj.getBiomeGenForCoordsBody(xCoord, zCoord);
if (biome != null) {
this.biome = biome;
}
}
}
/* SMP */
// @Override
public void getGUINetworkData(int i, int j) {
if (logic == null) {
return;
}
switch (i) {
case 0:
displayHealth = j;
break;
case 1:
displayHealthMax = j;
break;
}
}
// @Override
public void sendGUINetworkData(Container container, ICrafting iCrafting) {
if (logic == null) {
return;
}
iCrafting.sendProgressBarUpdate(container, 0, logic.getBreedingTime());
iCrafting.sendProgressBarUpdate(container, 1, logic.getTotalBreedingTime());
}
// / IBEEHOUSING
@Override
public int getXCoord() {
return xCoord;
}
@Override
public int getYCoord() {
return yCoord;
}
@Override
public int getZCoord() {
return zCoord;
}
@Override
public BiomeGenBase getBiome() {
return biome;
}
@Override
public ItemStack getQueen() {
return getStackInSlot(SLOT_QUEEN);
}
@Override
public ItemStack getDrone() {
return getStackInSlot(SLOT_DRONE);
}
@Override
public void setQueen(ItemStack itemstack) {
setInventorySlotContents(SLOT_QUEEN, itemstack);
}
@Override
public ItemStack decrStackSize(int slotIndex, int amount) {
ItemStack itemStack = super.decrStackSize(slotIndex, amount);
if (slotIndex == SLOT_QUEEN) {
handleQueenChange();
}
return itemStack;
}
@Override
public void setInventorySlotContents(int slotIndex, ItemStack itemStack) {
super.setInventorySlotContents(slotIndex, itemStack);
if (slotIndex == SLOT_QUEEN) {
handleQueenChange();
}
}
private void handleQueenChange() {
if (!Proxies.common.isSimulating(worldObj)) {
ItemStack itemStack = getStackInSlot(SLOT_QUEEN);
displayQueen = BeeManager.beeRoot.getMember(itemStack);
}
}
@Override
public void setDrone(ItemStack itemstack) {
setInventorySlotContents(SLOT_DRONE, itemstack);
}
@Override
public World getWorld() {
return worldObj;
}
@Override
public boolean canBreed() {
return true;
}
@Override
public float getTerritoryModifier(IBeeGenome genome, float currentModifier) {
return 1.0f;
}
@Override
public float getProductionModifier(IBeeGenome genome, float currentModifier) {
return 0.25f;
}
@Override
public float getMutationModifier(IBeeGenome genome, IBeeGenome mate, float currentModifier) {
return 0.0f;
}
@Override
public float getLifespanModifier(IBeeGenome genome, IBeeGenome mate, float currentModifier) {
return 3.0f;
}
@Override
public float getFloweringModifier(IBeeGenome genome, float currentModifier) {
return 3.0f;
}
@Override
public float getGeneticDecay(IBeeGenome genome, float currentModifier) {
return 0.0f;
}
@Override
public void wearOutEquipment(int amount) {
}
@Override
public boolean isSealed() {
return false;
}
@Override
public boolean isSelfLighted() {
return false;
}
@Override
public boolean isSunlightSimulated() {
return false;
}
@Override
public boolean isHellish() {
return false;
}
@Override
public void onQueenDeath(IBee queen) {
}
@Override
public void onPostQueenDeath(IBee queen) {
}
@Override
public boolean onPollenRetrieved(IBee queen, IIndividual pollen, boolean isHandled) {
return false;
}
@Override
public boolean onEggLaid(IBee queen) {
return false;
}
/* IHousing */
@Override
public GameProfile getOwnerName() {
return this.getOwner();
}
@Override
public boolean isActive() {
return active;
}
@Override
public void setActive(boolean active) {
if (this.active == active) {
return;
}
this.active = active;
if (worldObj != null && !worldObj.isRemote) {
Proxies.net.sendNetworkPacket(new PacketActiveUpdate(this));
}
}
protected static class BeehouseInventoryAdapter extends TileInventoryAdapter<TileBeehouse> {
public BeehouseInventoryAdapter(TileBeehouse tile, int size, String name) {
super(tile, size, name);
}
@Override
public boolean canSlotAccept(int slotIndex, ItemStack itemStack) {
if (slotIndex == SLOT_QUEEN) {
return BeeManager.beeRoot.isMember(itemStack) && !BeeManager.beeRoot.isDrone(itemStack);
} else if (GuiUtil.isIndexInRange(slotIndex, SLOT_FRAMES_1, SLOT_FRAMES_COUNT)) {
return itemStack.getItem() instanceof IHiveFrame;
} else if (slotIndex == SLOT_DRONE) {
return BeeManager.beeRoot.isDrone(itemStack);
}
return false;
}
@Override
public boolean canExtractItem(int slotIndex, ItemStack itemstack, int side) {
return GuiUtil.isIndexInRange(slotIndex, SLOT_PRODUCT_1, SLOT_PRODUCT_COUNT);
}
}
}
@@ -8,13 +8,13 @@
* Various Contributors including, but not limited to:
* SirSengir (original work), CovertJaguar, Player, Binnie, MysteriousAges
******************************************************************************/
package forestry.apiculture.tiles;
package forestry.apiculture.gadgets;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.network.Packet;
import net.minecraft.tileentity.TileEntity;
import forestry.apiculture.network.packets.PacketCandleUpdate;
import forestry.apiculture.network.PacketUpdateCandle;
public class TileCandle extends TileEntity {
private int colour;
@@ -28,13 +28,13 @@ public class TileCandle extends TileEntity {
@Override
public Packet getDescriptionPacket() {
PacketCandleUpdate updateCandle = new PacketCandleUpdate(this);
PacketUpdateCandle updateCandle = new PacketUpdateCandle(this);
return updateCandle.getPacket();
}
public void onPacketUpdate(int colour, boolean isLit) {
this.colour = colour;
this.lit = isLit;
public void onPacketUpdate(PacketUpdateCandle updateCandle) {
colour = updateCandle.getColour();
lit = updateCandle.isLit();
}
@Override
@@ -8,15 +8,15 @@
* Various Contributors including, but not limited to:
* SirSengir (original work), CovertJaguar, Player, Binnie, MysteriousAges
******************************************************************************/
package forestry.apiculture.tiles;
package forestry.apiculture.gadgets;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.world.EnumSkyBlock;
import forestry.core.inventory.InvTools;
import forestry.core.inventory.InventoryAdapter;
import forestry.core.utils.InventoryUtil;
public class TileSwarm extends TileEntity {
@@ -43,7 +43,7 @@ public class TileSwarm extends TileEntity {
public TileSwarm setContained(ItemStack[] bees) {
for (ItemStack itemstack : bees) {
InventoryUtil.addStack(contained, itemstack, true);
InvTools.addStack(contained, itemstack, true);
}
return this;
@@ -8,7 +8,7 @@
* Various Contributors including, but not limited to:
* SirSengir (original work), CovertJaguar, Player, Binnie, MysteriousAges
******************************************************************************/
package forestry.apiculture.entities;
package forestry.apiculture.genetics;
import net.minecraft.entity.EntityCreature;
import net.minecraft.entity.ai.EntityAIBase;
@@ -8,11 +8,12 @@
* Various Contributors including, but not limited to:
* SirSengir (original work), CovertJaguar, Player, Binnie, MysteriousAges
******************************************************************************/
package forestry.apiculture.genetics.alleles;
package forestry.apiculture.genetics;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import net.minecraft.client.renderer.texture.IIconRegister;
@@ -26,38 +27,48 @@ import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import forestry.api.apiculture.BeeManager;
import forestry.api.apiculture.EnumBeeChromosome;
import forestry.api.apiculture.EnumBeeType;
import forestry.api.apiculture.IAlleleBeeSpeciesCustom;
import forestry.api.apiculture.IBeeGenome;
import forestry.api.apiculture.IBeeHousing;
import forestry.api.apiculture.IBeeIconColourProvider;
import forestry.api.apiculture.IBeeIconProvider;
import forestry.api.apiculture.IBeeRoot;
import forestry.api.apiculture.IJubilanceProvider;
import forestry.api.core.IIconProvider;
import forestry.api.genetics.IAllele;
import forestry.api.genetics.IClassification;
import forestry.api.genetics.IIndividual;
import forestry.apiculture.genetics.DefaultBeeIconColourProvider;
import forestry.apiculture.genetics.DefaultBeeIconProvider;
import forestry.apiculture.genetics.JubilanceDefault;
import forestry.api.genetics.IMutation;
import forestry.core.genetics.alleles.AlleleSpecies;
import forestry.core.utils.ItemStackUtil;
import forestry.core.render.TextureManager;
import forestry.core.utils.StackUtils;
public class AlleleBeeSpecies extends AlleleSpecies implements IAlleleBeeSpeciesCustom {
private final Map<ItemStack, Float> productChances = new HashMap<>();
private final Map<ItemStack, Float> specialtyChances = new HashMap<>();
@Deprecated
private final Map<ItemStack, Integer> products = new HashMap<ItemStack, Integer>();
@Deprecated
private final Map<ItemStack, Integer> specialty = new HashMap<ItemStack, Integer>();
private final Map<ItemStack, Float> productChances = new HashMap<ItemStack, Float>();
private final Map<ItemStack, Float> specialtyChances = new HashMap<ItemStack, Float>();
private final int primaryColour;
private final int secondaryColour;
private IBeeIconProvider beeIconProvider;
private IBeeIconColourProvider beeIconColourProvider;
private IJubilanceProvider jubilanceProvider;
private boolean nocturnal = false;
public AlleleBeeSpecies(String uid, String unlocalizedName, String authority, String unlocalizedDescription, boolean dominant, IClassification branch, String binomial, int primaryColor, int secondaryColor) {
super(uid, unlocalizedName, authority, unlocalizedDescription, dominant, branch, binomial);
super(uid, unlocalizedName, authority, unlocalizedDescription, dominant, branch, binomial, false);
beeIconProvider = DefaultBeeIconProvider.instance;
beeIconColourProvider = new DefaultBeeIconColourProvider(primaryColor, secondaryColor);
jubilanceProvider = JubilanceDefault.instance;
this.primaryColour = primaryColor;
this.secondaryColour = secondaryColor;
setCustomBeeIconProvider(DefaultBeeIconProvider.getInstance());
setJubilanceProvider(JubilanceDefault.getInstance());
}
@Override
@@ -74,6 +85,8 @@ public class AlleleBeeSpecies extends AlleleSpecies implements IAlleleBeeSpecies
throw new IllegalArgumentException("chance must be in the range (0, 1]");
}
this.productChances.put(product, chance);
int intChance = Math.max(1, Math.round(chance * 100));
this.products.put(product, intChance);
return this;
}
@@ -86,6 +99,8 @@ public class AlleleBeeSpecies extends AlleleSpecies implements IAlleleBeeSpecies
throw new IllegalArgumentException("chance must be in the range (0, 1]");
}
this.specialtyChances.put(specialty, chance);
int intChance = Math.max(1, Math.round(chance * 100));
this.specialty.put(specialty, intChance);
return this;
}
@@ -107,13 +122,36 @@ public class AlleleBeeSpecies extends AlleleSpecies implements IAlleleBeeSpecies
return this;
}
/* RESEARCH */
@Override
public IAlleleBeeSpeciesCustom setCustomBeeIconColourProvider(IBeeIconColourProvider beeIconColourProvider) {
this.beeIconColourProvider = beeIconColourProvider;
return this;
public int getComplexity() {
return 1 + getGeneticAdvancement(this, new ArrayList<IAllele>());
}
private int getGeneticAdvancement(IAllele species, ArrayList<IAllele> exclude) {
int own = 1;
int highest = 0;
exclude.add(species);
for (IMutation mutation : getRoot().getPaths(species, EnumBeeChromosome.SPECIES)) {
if (!exclude.contains(mutation.getAllele0())) {
int otherAdvance = getGeneticAdvancement(mutation.getAllele0(), exclude);
if (otherAdvance > highest) {
highest = otherAdvance;
}
}
if (!exclude.contains(mutation.getAllele1())) {
int otherAdvance = getGeneticAdvancement(mutation.getAllele1(), exclude);
if (otherAdvance > highest) {
highest = otherAdvance;
}
}
}
return own + (highest < 0 ? 0 : highest);
}
/* RESEARCH */
@Override
public float getResearchSuitability(ItemStack itemstack) {
if (itemstack == null) {
@@ -136,16 +174,16 @@ public class AlleleBeeSpecies extends AlleleSpecies implements IAlleleBeeSpecies
@Override
public ItemStack[] getResearchBounty(World world, GameProfile researcher, IIndividual individual, int bountyLevel) {
ArrayList<ItemStack> bounty = new ArrayList<>();
ArrayList<ItemStack> bounty = new ArrayList<ItemStack>();
Collections.addAll(bounty, super.getResearchBounty(world, researcher, individual, bountyLevel));
if (bountyLevel > 10) {
for (ItemStack stack : specialtyChances.keySet()) {
bounty.add(ItemStackUtil.copyWithRandomSize(stack, (int) ((float) bountyLevel / 2), world.rand));
bounty.add(StackUtils.copyWithRandomSize(stack, (int) ((float) bountyLevel / 2), world.rand));
}
}
for (ItemStack stack : productChances.keySet()) {
bounty.add(ItemStackUtil.copyWithRandomSize(stack, (int) ((float) bountyLevel / 2), world.rand));
bounty.add(StackUtils.copyWithRandomSize(stack, (int) ((float) bountyLevel / 2), world.rand));
}
return bounty.toArray(new ItemStack[bounty.size()]);
}
@@ -156,11 +194,21 @@ public class AlleleBeeSpecies extends AlleleSpecies implements IAlleleBeeSpecies
return nocturnal;
}
@Override
public Map<ItemStack, Integer> getProducts() {
return products;
}
@Override
public Map<ItemStack, Float> getProductChances() {
return productChances;
}
@Override
public Map<ItemStack, Integer> getSpecialty() {
return specialty;
}
@Override
public Map<ItemStack, Float> getSpecialtyChances() {
return specialtyChances;
@@ -184,7 +232,13 @@ public class AlleleBeeSpecies extends AlleleSpecies implements IAlleleBeeSpecies
@Override
public int getIconColour(int renderPass) {
return beeIconColourProvider.getIconColour(renderPass);
if (renderPass == 0) {
return primaryColour;
}
if (renderPass == 1) {
return secondaryColour;
}
return 0xffffff;
}
@Override
@@ -192,6 +246,48 @@ public class AlleleBeeSpecies extends AlleleSpecies implements IAlleleBeeSpecies
return null;
}
private static class DefaultBeeIconProvider implements IBeeIconProvider {
private static final String iconType = "default";
private static DefaultBeeIconProvider instance;
public static DefaultBeeIconProvider getInstance() {
if (instance == null) {
instance = new DefaultBeeIconProvider();
}
return instance;
}
private DefaultBeeIconProvider() {
}
private static final IIcon[][] icons = new IIcon[EnumBeeType.values().length][3];
@SideOnly(Side.CLIENT)
@Override
public void registerIcons(IIconRegister register) {
IIcon body1 = TextureManager.getInstance().registerTex(register, "bees/" + iconType + "/body1");
for (int i = 0; i < EnumBeeType.values().length; i++) {
if (EnumBeeType.values()[i] == EnumBeeType.NONE) {
continue;
}
icons[i][0] = TextureManager.getInstance().registerTex(register, "bees/" + iconType + '/' + EnumBeeType.values()[i].toString().toLowerCase(Locale.ENGLISH) + ".outline");
icons[i][1] = (EnumBeeType.values()[i] != EnumBeeType.LARVAE) ? body1
: TextureManager.getInstance().registerTex(register, "bees/" + iconType + '/' + EnumBeeType.values()[i].toString().toLowerCase(Locale.ENGLISH) + ".body");
icons[i][2] = TextureManager.getInstance().registerTex(register, "bees/" + iconType + '/' + EnumBeeType.values()[i].toString().toLowerCase(Locale.ENGLISH) + ".body2");
}
}
@Override
@SideOnly(Side.CLIENT)
public IIcon getIcon(EnumBeeType type, int renderPass) {
return icons[type.ordinal()][renderPass];
}
}
private static class BeeIconProviderWrapper implements IIconProvider {
private final IBeeIconProvider beeIconProvider;
@@ -8,37 +8,59 @@
* Various Contributors including, but not limited to:
* SirSengir (original work), CovertJaguar, Player, Binnie, MysteriousAges
******************************************************************************/
package forestry.apiculture.genetics.alleles;
package forestry.apiculture.genetics;
import java.util.List;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.util.AxisAlignedBB;
import net.minecraft.util.DamageSource;
import forestry.api.apiculture.BeeManager;
import forestry.api.apiculture.IBeeGenome;
import forestry.api.apiculture.IBeeHousing;
import forestry.api.genetics.IEffectData;
import forestry.apiculture.items.ItemArmorApiarist;
import forestry.core.utils.DamageSourceForestry;
public class AlleleEffectAggressive extends AlleleEffectThrottled {
private static final DamageSource damageSourceBeeAggressive = new DamageSourceForestry("bee.aggressive");
public static final DamageSource damageSourceBeeAggressive = new DamageSourceForestry("bee.aggressive");
public AlleleEffectAggressive() {
super("aggressive", true, 40, false, false);
}
@Override
public IEffectData doEffectThrottled(IBeeGenome genome, IEffectData storedData, IBeeHousing housing) {
List<EntityLivingBase> entities = getEntitiesInRange(genome, housing, EntityLivingBase.class);
for (EntityLivingBase entity : entities) {
public IEffectData doEffect(IBeeGenome genome, IEffectData storedData, IBeeHousing housing) {
if (isHalted(storedData, housing)) {
return storedData;
}
AxisAlignedBB hurtBox = getBounding(genome, housing, 1.0f);
@SuppressWarnings("rawtypes")
List list = housing.getWorld().getEntitiesWithinAABB(EntityLivingBase.class, hurtBox);
for (Object obj : list) {
EntityLivingBase entity = (EntityLivingBase) obj;
int damage = 4;
// Entities are not attacked if they wear a full set of apiarist's armor.
int count = BeeManager.armorApiaristHelper.wearsItems(entity, getUID(), true);
damage -= count;
if (damage <= 0) {
continue;
// Players are not attacked if they wear a full set of apiarist's
// armor.
if (entity instanceof EntityPlayer) {
int count = ItemArmorApiarist.wearsItems((EntityPlayer) entity, getUID(), true);
// Full set, no damage/effect
if (count > 3) {
continue;
} else if (count > 2) {
damage = 1;
} else if (count > 1) {
damage = 2;
} else if (count > 0) {
damage = 3;
}
}
entity.attackEntityFrom(damageSourceBeeAggressive, damage);
@@ -8,26 +8,26 @@
* Various Contributors including, but not limited to:
* SirSengir (original work), CovertJaguar, Player, Binnie, MysteriousAges
******************************************************************************/
package forestry.apiculture.genetics.alleles;
package forestry.apiculture.genetics;
import java.util.List;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.util.ChunkCoordinates;
import net.minecraft.util.AxisAlignedBB;
import net.minecraft.world.World;
import forestry.api.apiculture.BeeManager;
import forestry.api.apiculture.IBeeGenome;
import forestry.api.apiculture.IBeeHousing;
import forestry.api.genetics.IEffectData;
import forestry.apiculture.items.ItemArmorApiarist;
import forestry.core.genetics.EffectData;
public class AlleleEffectCreeper extends AlleleEffectThrottled {
private static final int explosionChance = 50;
private static final byte defaultForce = 12;
private static final byte indexExplosionTimer = 1;
private static final byte indexExplosionForce = 2;
private final byte indexExplosionTimer = 1;
private final byte indexExplosionForce = 2;
public AlleleEffectCreeper() {
super("creeper", true, 20, false, true);
@@ -47,26 +47,38 @@ public class AlleleEffectCreeper extends AlleleEffectThrottled {
}
@Override
public IEffectData doEffectThrottled(IBeeGenome genome, IEffectData storedData, IBeeHousing housing) {
public IEffectData doEffect(IBeeGenome genome, IEffectData storedData, IBeeHousing housing) {
World world = housing.getWorld();
ChunkCoordinates housingCoords = housing.getCoordinates();
// If we are already triggered, we continue the explosion sequence.
if (storedData.getInteger(indexExplosionTimer) > 0) {
progressExplosion(storedData, world, housingCoords.posX, housingCoords.posY, housingCoords.posZ);
if (isHalted(storedData, housing)) {
return storedData;
}
List<EntityPlayer> players = getEntitiesInRange(genome, housing, EntityPlayer.class);
for (EntityPlayer player : players) {
// If we are already triggered, we continue the explosion sequence.
if (storedData.getInteger(indexExplosionTimer) > 0) {
progressExplosion(storedData, world, housing.getXCoord(), housing.getYCoord(), housing.getZCoord());
return storedData;
}
AxisAlignedBB infectionBox = getBounding(genome, housing, 1.0f);
@SuppressWarnings("rawtypes")
List list = world.getEntitiesWithinAABB(EntityPlayer.class, infectionBox);
for (Object obj : list) {
EntityPlayer player = (EntityPlayer) obj;
int chance = explosionChance;
storedData.setInteger(indexExplosionForce, defaultForce);
// Entities are not attacked if they wear a full set of apiarist's armor.
int count = BeeManager.armorApiaristHelper.wearsItems(player, getUID(), true);
// Players are not attacked if they wear a full set of apiarist's
// armor.
int count = ItemArmorApiarist.wearsItems(player, getUID(), true);
// Full set, no damage/effect
if (count > 3) {
continue; // Full set, no damage/effect
continue;
} else if (count > 2) {
chance = 5;
storedData.setInteger(indexExplosionForce, 6);
@@ -82,15 +94,16 @@ public class AlleleEffectCreeper extends AlleleEffectThrottled {
continue;
}
world.playSoundEffect(housingCoords.posX, housingCoords.posY, housingCoords.posZ, "mob.creeper", 4F,
world.playSoundEffect(housing.getXCoord(), housing.getYCoord(), housing.getZCoord(), "mob.creeper", 4F,
(1.0F + (world.rand.nextFloat() - world.rand.nextFloat()) * 0.2F) * 0.7F);
storedData.setInteger(indexExplosionTimer, 2); // Set explosion timer
storedData.setInteger(indexExplosionTimer, 2); // Set explosion
// timer
}
return storedData;
}
private static void progressExplosion(IEffectData storedData, World world, int x, int y, int z) {
private void progressExplosion(IEffectData storedData, World world, int x, int y, int z) {
int explosionTimer = storedData.getInteger(indexExplosionTimer);
explosionTimer--;
@@ -8,11 +8,12 @@
* Various Contributors including, but not limited to:
* SirSengir (original work), CovertJaguar, Player, Binnie, MysteriousAges
******************************************************************************/
package forestry.apiculture.genetics.alleles;
package forestry.apiculture.genetics;
import java.util.List;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.util.AxisAlignedBB;
import forestry.api.apiculture.IBeeGenome;
import forestry.api.apiculture.IBeeHousing;
@@ -25,9 +26,18 @@ public class AlleleEffectExploration extends AlleleEffectThrottled {
}
@Override
public IEffectData doEffectThrottled(IBeeGenome genome, IEffectData storedData, IBeeHousing housing) {
List<EntityPlayer> players = getEntitiesInRange(genome, housing, EntityPlayer.class);
for (EntityPlayer player : players) {
public IEffectData doEffect(IBeeGenome genome, IEffectData storedData, IBeeHousing housing) {
if (isHalted(storedData, housing)) {
return storedData;
}
AxisAlignedBB beatifyBox = getBounding(genome, housing, 1.0f);
@SuppressWarnings("rawtypes")
List list = housing.getWorld().getEntitiesWithinAABB(EntityPlayer.class, beatifyBox);
for (Object obj : list) {
EntityPlayer player = (EntityPlayer) obj;
player.addExperience(2);
}
@@ -0,0 +1,61 @@
package forestry.apiculture.genetics;
import java.util.Random;
import net.minecraft.block.Block;
import net.minecraft.world.World;
import forestry.api.apiculture.IBeeGenome;
import forestry.api.apiculture.IBeeHousing;
import forestry.api.genetics.IEffectData;
public class AlleleEffectFertile extends AlleleEffectThrottled {
public static final int MAX_BLOCK_FIND_TRIES = 5;
public AlleleEffectFertile() {
super("fertile", false, 6, true, false);
}
@Override
public IEffectData doEffect(IBeeGenome genome, IEffectData storedData, IBeeHousing housing) {
if (isHalted(storedData, housing)) {
return storedData;
}
World world = housing.getWorld();
int territorySize[] = getModifiedArea(genome, housing);
int blockX = getRandomOffset(world.rand, housing.getXCoord(), territorySize[0]);
int blockZ = getRandomOffset(world.rand, housing.getZCoord(), territorySize[2]);
int blockMaxY = housing.getYCoord() + territorySize[1] / 2 + 1;
int blockMinY = housing.getYCoord() - (territorySize[1] / 2) - 1;
for (int attempt = 0; attempt < MAX_BLOCK_FIND_TRIES; ++attempt) {
if (tryTickColumn(world, blockX, blockZ, blockMaxY, blockMinY)) {
break;
}
blockX = getRandomOffset(world.rand, housing.getXCoord(), territorySize[0]);
blockZ = getRandomOffset(world.rand, housing.getZCoord(), territorySize[2]);
}
return storedData;
}
private int getRandomOffset(Random random, int centrePos, int offset) {
return centrePos + random.nextInt(offset) - (offset / 2);
}
private boolean tryTickColumn(World world, int x, int z, int maxY, int minY) {
for (int y = maxY; y >= minY; --y) {
if (!world.isAirBlock(x, y, z)) {
Block block = world.getBlock(x, y, z);
world.scheduleBlockUpdate(x, y, z, block, 5);
return true;
}
}
return false;
}
}
@@ -1,4 +1,4 @@
package forestry.apiculture.genetics.alleles;
package forestry.apiculture.genetics;
import java.util.List;
import java.util.Random;
@@ -7,7 +7,7 @@ import net.minecraft.block.Block;
import net.minecraft.entity.passive.EntityCow;
import net.minecraft.entity.passive.EntityMooshroom;
import net.minecraft.init.Blocks;
import net.minecraft.util.ChunkCoordinates;
import net.minecraft.util.AxisAlignedBB;
import net.minecraft.world.World;
import net.minecraft.world.gen.feature.WorldGenBigMushroom;
@@ -15,12 +15,11 @@ import forestry.api.apiculture.IBeeGenome;
import forestry.api.apiculture.IBeeHousing;
import forestry.api.genetics.IEffectData;
import forestry.core.genetics.EffectData;
import forestry.core.utils.vect.IVect;
public class AlleleEffectFungification extends AlleleEffectThrottled {
private static final int MAX_BLOCK_FIND_TRIES = 10;
private static final int ENTITY_THROTTLE = 6;
public static final int MAX_BLOCK_FIND_TRIES = 10;
public static final int ENTITY_THROTTLE = 6;
public AlleleEffectFungification() {
super("mycophilic", true, 10, false, false);
@@ -36,8 +35,11 @@ public class AlleleEffectFungification extends AlleleEffectThrottled {
}
@Override
public IEffectData doEffectThrottled(IBeeGenome genome, IEffectData storedData, IBeeHousing housing) {
public IEffectData doEffect(IBeeGenome genome, IEffectData storedData, IBeeHousing housing) {
if (isHalted(storedData, housing)) {
return storedData;
}
doBlockEffect(genome, housing);
int entityThrottle = storedData.getInteger(1);
@@ -54,12 +56,11 @@ public class AlleleEffectFungification extends AlleleEffectThrottled {
private void doBlockEffect(IBeeGenome genome, IBeeHousing housing) {
World world = housing.getWorld();
ChunkCoordinates housingCoordinates = housing.getCoordinates();
IVect area = getModifiedArea(genome, housing);
int territorySize[] = getModifiedArea(genome, housing);
int blockX = getRandomOffset(world.rand, housingCoordinates.posX, area.getX());
int blockY = getRandomOffset(world.rand, housingCoordinates.posY, area.getY());
int blockZ = getRandomOffset(world.rand, housingCoordinates.posZ, area.getZ());
int blockX = getRandomOffset(world.rand, housing.getXCoord(), territorySize[0]);
int blockY = getRandomOffset(world.rand, housing.getYCoord(), territorySize[1]);
int blockZ = getRandomOffset(world.rand, housing.getZCoord(), territorySize[2]);
for (int attempt = 0; attempt < MAX_BLOCK_FIND_TRIES; ++attempt) {
Block block = world.getBlock(blockX, blockY, blockZ);
@@ -70,36 +71,39 @@ public class AlleleEffectFungification extends AlleleEffectThrottled {
doMushroomGrowth(block, world, blockX, blockY, blockZ);
break;
}
blockX = getRandomOffset(world.rand, housingCoordinates.posX, area.getX());
blockY = getRandomOffset(world.rand, housingCoordinates.posY, area.getY());
blockZ = getRandomOffset(world.rand, housingCoordinates.posZ, area.getZ());
blockX = getRandomOffset(world.rand, housing.getXCoord(), territorySize[0]);
blockY = getRandomOffset(world.rand, housing.getYCoord(), territorySize[1]);
blockZ = getRandomOffset(world.rand, housing.getZCoord(), territorySize[2]);
}
}
private static void doEntityEffect(IBeeGenome genome, IBeeHousing housing) {
List<EntityCow> cows = getEntitiesInRange(genome, housing, EntityCow.class);
for (EntityCow cow : cows) {
convertCowToMooshroom(cow);
private void doEntityEffect(IBeeGenome genome, IBeeHousing housing) {
AxisAlignedBB aabb = this.getBounding(genome, housing, 1f);
World world = housing.getWorld();
List entities = world.getEntitiesWithinAABB(EntityCow.class, aabb);
for (Object entity : entities) {
if (entity instanceof EntityCow && !(entity instanceof EntityMooshroom)) {
convertCowToMooshroom((EntityCow) entity);
break;
}
}
}
private static int getRandomOffset(Random random, int centrePos, int offset) {
private int getRandomOffset(Random random, int centrePos, int offset) {
return centrePos + random.nextInt(offset) - (offset / 2);
}
private static boolean isSuitableForMycelium(World world, Block block, int blockX, int blockY, int blockZ) {
private boolean isSuitableForMycelium(World world, Block block, int blockX, int blockY, int blockZ) {
return block == Blocks.grass || (block == Blocks.dirt && world.canBlockSeeTheSky(blockX, blockY, blockZ));
}
private static boolean isSuitableForGrowth(Block block) {
private boolean isSuitableForGrowth(Block block) {
return block == Blocks.red_mushroom || block == Blocks.brown_mushroom;
}
private static void convertCowToMooshroom(EntityCow cow) {
if (cow instanceof EntityMooshroom) {
return;
}
World worldObj = cow.worldObj;
cow.setDead();
EntityMooshroom mooshroom = new EntityMooshroom(worldObj);
@@ -110,7 +114,7 @@ public class AlleleEffectFungification extends AlleleEffectThrottled {
worldObj.spawnParticle("largeexplode", cow.posX, cow.posY + (double) (cow.height / 2.0F), cow.posZ, 0.0D, 0.0D, 0.0D);
}
private static void doMushroomGrowth(Block block, World world, int blockX, int blockY, int blockZ) {
private void doMushroomGrowth(Block block, World world, int blockX, int blockY, int blockZ) {
WorldGenBigMushroom giantMushroomGenerator;
if (block == Blocks.brown_mushroom) {
@@ -8,18 +8,19 @@
* Various Contributors including, but not limited to:
* SirSengir (original work), CovertJaguar, Player, Binnie, MysteriousAges
******************************************************************************/
package forestry.apiculture.genetics.alleles;
package forestry.apiculture.genetics;
import net.minecraft.block.Block;
import net.minecraft.init.Blocks;
import net.minecraft.world.World;
import net.minecraft.world.biome.BiomeGenBase;
import forestry.api.apiculture.IBeeGenome;
import forestry.api.apiculture.IBeeHousing;
import forestry.api.core.EnumTemperature;
import forestry.api.genetics.IEffectData;
import forestry.core.config.Constants;
import forestry.core.utils.vect.Vect;
import forestry.core.proxy.Proxies;
import forestry.core.vect.Vect;
public class AlleleEffectGlacial extends AlleleEffectThrottled {
@@ -28,9 +29,14 @@ public class AlleleEffectGlacial extends AlleleEffectThrottled {
}
@Override
public IEffectData doEffectThrottled(IBeeGenome genome, IEffectData storedData, IBeeHousing housing) {
public IEffectData doEffect(IBeeGenome genome, IEffectData storedData, IBeeHousing housing) {
World world = housing.getWorld();
if (isHalted(storedData, housing)) {
return storedData;
}
EnumTemperature temp = housing.getTemperature();
switch (temp) {
@@ -42,14 +48,15 @@ public class AlleleEffectGlacial extends AlleleEffectThrottled {
}
int[] areaAr = genome.getTerritory();
Vect area = new Vect(areaAr);
Vect offset = area.multiply(-1 / 2.0f);
Vect housingCoords = new Vect(housing.getCoordinates());
Vect area = new Vect(areaAr[0], areaAr[1], areaAr[2]);
Vect offset = new Vect(-Math.round(area.x / 2), -Math.round(area.y / 2), -Math.round(area.z / 2));
for (int i = 0; i < 10; i++) {
Vect randomPos = Vect.getRandomPositionInArea(world.rand, area);
Vect posBlock = Vect.add(randomPos, housingCoords, offset);
Vect randomPos = new Vect(world.rand.nextInt(area.x), world.rand.nextInt(area.y), world.rand.nextInt(area.z));
Vect posBlock = randomPos.add(new Vect(housing.getXCoord(), housing.getYCoord(), housing.getZCoord()));
posBlock = posBlock.add(offset);
// Freeze water
Block block = world.getBlock(posBlock.x, posBlock.y, posBlock.z);
@@ -61,7 +68,7 @@ public class AlleleEffectGlacial extends AlleleEffectThrottled {
continue;
}
world.setBlock(posBlock.x, posBlock.y, posBlock.z, Blocks.ice, 0, Constants.FLAG_BLOCK_SYNCH_AND_UPDATE);
Proxies.common.setBlockWithNotify(world, posBlock.x, posBlock.y, posBlock.z, Blocks.ice);
}
return storedData;
@@ -8,32 +8,41 @@
* Various Contributors including, but not limited to:
* SirSengir (original work), CovertJaguar, Player, Binnie, MysteriousAges
******************************************************************************/
package forestry.apiculture.genetics.alleles;
package forestry.apiculture.genetics;
import java.util.List;
import net.minecraft.entity.monster.EntityMob;
import net.minecraft.util.AxisAlignedBB;
import net.minecraft.util.DamageSource;
import forestry.api.apiculture.IBeeGenome;
import forestry.api.apiculture.IBeeHousing;
import forestry.api.genetics.IEffectData;
import forestry.core.utils.DamageSourceForestry;
public class AlleleEffectHeroic extends AlleleEffectThrottled {
private static final DamageSource damageSourceBeeHeroic = new DamageSourceForestry("bee.heroic");
public AlleleEffectHeroic() {
super("heroic", false, 40, true, false);
}
@Override
public IEffectData doEffectThrottled(IBeeGenome genome, IEffectData storedData, IBeeHousing housing) {
List<EntityMob> mobs = getEntitiesInRange(genome, housing, EntityMob.class);
for (EntityMob mob : mobs) {
mob.attackEntityFrom(damageSourceBeeHeroic, 2);
public IEffectData doEffect(IBeeGenome genome, IEffectData storedData, IBeeHousing housing) {
if (isHalted(storedData, housing)) {
return storedData;
}
AxisAlignedBB hurtBox = getBounding(genome, housing, 1.0f);
@SuppressWarnings("rawtypes")
List list = housing.getWorld().getEntitiesWithinAABB(EntityMob.class, hurtBox);
for (Object obj : list) {
EntityMob mob = (EntityMob) obj;
mob.attackEntityFrom(DamageSource.generic, 2);
}
return storedData;
}
}
@@ -0,0 +1,98 @@
/*******************************************************************************
* Copyright (c) 2011-2014 SirSengir.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU Lesser Public License v3
* which accompanies this distribution, and is available at
* http://www.gnu.org/licenses/lgpl-3.0.txt
*
* Various Contributors including, but not limited to:
* SirSengir (original work), CovertJaguar, Player, Binnie, MysteriousAges
******************************************************************************/
package forestry.apiculture.genetics;
import java.util.List;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.util.AxisAlignedBB;
import net.minecraft.world.World;
import forestry.api.apiculture.IBeeGenome;
import forestry.api.apiculture.IBeeHousing;
import forestry.api.genetics.IEffectData;
import forestry.apiculture.items.ItemArmorApiarist;
import forestry.plugins.PluginApiculture;
public class AlleleEffectIgnition extends AlleleEffectThrottled {
private static final int ignitionChance = 50;
private static final int fireDuration = 500;
public AlleleEffectIgnition() {
super("ignition", false, 20, false, true);
}
@Override
public IEffectData doEffect(IBeeGenome genome, IEffectData storedData, IBeeHousing housing) {
World world = housing.getWorld();
if (isHalted(storedData, housing)) {
return storedData;
}
AxisAlignedBB hurtBox = getBounding(genome, housing, 1.0f);
@SuppressWarnings("rawtypes")
List list = world.getEntitiesWithinAABB(EntityLivingBase.class, hurtBox);
for (Object obj : list) {
EntityLivingBase entity = (EntityLivingBase) obj;
int chance = ignitionChance;
int duration = fireDuration;
// Players are not attacked if they wear a full set of apiarist's
// armor.
if (entity instanceof EntityPlayer) {
int count = ItemArmorApiarist.wearsItems((EntityPlayer) entity, getUID(), true);
// Full set, no damage/effect
if (count > 3) {
continue;
} else if (count > 2) {
chance = 5;
duration = 50;
} else if (count > 1) {
chance = 20;
duration = 200;
} else if (count > 0) {
chance = 35;
duration = 350;
}
}
if (world.rand.nextInt(1000) >= chance) {
continue;
}
entity.setFire(duration);
}
return storedData;
}
@Override
public IEffectData doFX(IBeeGenome genome, IEffectData storedData, IBeeHousing housing) {
int[] area = getModifiedArea(genome, housing);
if (housing.getWorld().rand.nextBoolean()) {
PluginApiculture.proxy.addBeeHiveFX("particles/swarm_bee", housing.getWorld(), housing.getXCoord(), housing.getYCoord(),
housing.getZCoord(), genome.getPrimary().getIconColour(0), area[0], area[1], area[2]);
} else {
PluginApiculture.proxy.addBeeHiveFX("particles/ember", housing.getWorld(), housing.getXCoord(), housing.getYCoord(),
housing.getZCoord(), 0xffffff, area[0], area[1], area[2]);
}
return storedData;
}
}
@@ -0,0 +1,93 @@
/*******************************************************************************
* Copyright (c) 2011-2014 SirSengir.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU Lesser Public License v3
* which accompanies this distribution, and is available at
* http://www.gnu.org/licenses/lgpl-3.0.txt
*
* Various Contributors including, but not limited to:
* SirSengir (original work), CovertJaguar, Player, Binnie, MysteriousAges
******************************************************************************/
package forestry.apiculture.genetics;
import java.util.List;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.potion.Potion;
import net.minecraft.potion.PotionEffect;
import net.minecraft.util.AxisAlignedBB;
import net.minecraft.world.World;
import forestry.api.apiculture.IBeeGenome;
import forestry.api.apiculture.IBeeHousing;
import forestry.api.genetics.IEffectData;
import forestry.apiculture.items.ItemArmorApiarist;
import forestry.plugins.PluginApiculture;
public class AlleleEffectMiasmic extends AlleleEffectThrottled {
private static final int infectionChance = 50;
public AlleleEffectMiasmic() {
super("miasmic", false, 50, false, false);
}
@Override
public IEffectData doEffect(IBeeGenome genome, IEffectData storedData, IBeeHousing housing) {
World world = housing.getWorld();
if (isHalted(storedData, housing)) {
return storedData;
}
AxisAlignedBB infectionBox = getBounding(genome, housing, 1.0f);
@SuppressWarnings("rawtypes")
List list = world.getEntitiesWithinAABB(EntityPlayer.class, infectionBox);
for (Object obj : list) {
if (world.rand.nextInt(1000) >= infectionChance) {
continue;
}
EntityPlayer player = (EntityPlayer) obj;
int duration = 800;
// Players are not attacked if they wear a full set of apiarist's
// armor.
int count = ItemArmorApiarist.wearsItems(player, getUID(), true);
// Full set, no damage/effect
if (count > 3) {
continue;
} else if (count > 2) {
duration = 200;
} else if (count > 1) {
duration = 400;
} else if (count > 0) {
duration = 600;
}
player.addPotionEffect(new PotionEffect(Potion.poison.id, duration, 0));
}
return storedData;
}
@Override
public IEffectData doFX(IBeeGenome genome, IEffectData storedData, IBeeHousing housing) {
int[] area = getModifiedArea(genome, housing);
if (housing.getWorld().rand.nextBoolean()) {
PluginApiculture.proxy.addBeeHiveFX("particles/swarm_bee", housing.getWorld(), housing.getXCoord(), housing.getYCoord(),
housing.getZCoord(), genome.getPrimary().getIconColour(0), area[0], area[1], area[2]);
} else {
PluginApiculture.proxy.addBeeHiveFX("particles/poison", housing.getWorld(), housing.getXCoord(), housing.getYCoord(),
housing.getZCoord(), 0xffffff, area[0], area[1], area[2]);
}
return storedData;
}
}
@@ -8,38 +8,56 @@
* Various Contributors including, but not limited to:
* SirSengir (original work), CovertJaguar, Player, Binnie, MysteriousAges
******************************************************************************/
package forestry.apiculture.genetics.alleles;
package forestry.apiculture.genetics;
import java.util.List;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.util.AxisAlignedBB;
import net.minecraft.util.DamageSource;
import forestry.api.apiculture.BeeManager;
import forestry.api.apiculture.IBeeGenome;
import forestry.api.apiculture.IBeeHousing;
import forestry.api.genetics.IEffectData;
import forestry.apiculture.items.ItemArmorApiarist;
import forestry.core.utils.DamageSourceForestry;
public class AlleleEffectMisanthrope extends AlleleEffectThrottled {
private static final DamageSource damageSourceBeeEnd = new DamageSourceForestry("bee.end");
public static final DamageSource damageSourceBeeEnd = new DamageSourceForestry("bee.end");
public AlleleEffectMisanthrope() {
super("misanthrope", true, 20, false, false);
}
@Override
public IEffectData doEffectThrottled(IBeeGenome genome, IEffectData storedData, IBeeHousing housing) {
List<EntityPlayer> players = getEntitiesInRange(genome, housing, EntityPlayer.class);
for (EntityPlayer player : players) {
public IEffectData doEffect(IBeeGenome genome, IEffectData storedData, IBeeHousing housing) {
if (isHalted(storedData, housing)) {
return storedData;
}
AxisAlignedBB beatifyBox = getBounding(genome, housing, 1.0f);
@SuppressWarnings("rawtypes")
List list = housing.getWorld().getEntitiesWithinAABB(EntityPlayer.class, beatifyBox);
for (Object obj : list) {
EntityPlayer player = (EntityPlayer) obj;
int damage = 4;
// Entities are not attacked if they wear a full set of apiarist's armor.
int count = BeeManager.armorApiaristHelper.wearsItems(player, getUID(), true);
damage -= count;
if (damage <= 0) {
// Players are not attacked if they wear a full set of apiarist's
// armor.
int count = ItemArmorApiarist.wearsItems(player, getUID(), true);
// Full set, no damage/effect
if (count > 3) {
continue;
} else if (count > 2) {
damage = 1;
} else if (count > 1) {
damage = 2;
} else if (count > 0) {
damage = 3;
}
player.attackEntityFrom(damageSourceBeeEnd, damage);
@@ -0,0 +1,64 @@
/*******************************************************************************
* Copyright (c) 2011-2014 SirSengir.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU Lesser Public License v3
* which accompanies this distribution, and is available at
* http://www.gnu.org/licenses/lgpl-3.0.txt
*
* Various Contributors including, but not limited to:
* SirSengir (original work), CovertJaguar, Player, Binnie, MysteriousAges
******************************************************************************/
package forestry.apiculture.genetics;
import forestry.api.apiculture.IAlleleBeeEffect;
import forestry.api.apiculture.IBeeGenome;
import forestry.api.apiculture.IBeeHousing;
import forestry.api.genetics.IEffectData;
import forestry.core.genetics.alleles.AlleleCategorized;
import forestry.plugins.PluginApiculture;
public class AlleleEffectNone extends AlleleCategorized implements IAlleleBeeEffect {
public AlleleEffectNone(String name) {
super("forestry", "effect", name, true);
}
@Override
public IEffectData validateStorage(IEffectData storedData) {
return null;
}
@Override
public boolean isCombinable() {
return false;
}
@Override
public IEffectData doEffect(IBeeGenome genome, IEffectData storedData, IBeeHousing housing) {
return storedData;
}
@Override
public IEffectData doFX(IBeeGenome genome, IEffectData storedData, IBeeHousing housing) {
int[] area = genome.getTerritory();
area[0] *= housing.getTerritoryModifier(genome, 1f);
area[1] *= housing.getTerritoryModifier(genome, 1f);
area[2] *= housing.getTerritoryModifier(genome, 1f);
if (area[0] < 1) {
area[0] = 1;
}
if (area[1] < 1) {
area[1] = 1;
}
if (area[2] < 1) {
area[2] = 1;
}
PluginApiculture.proxy.addBeeHiveFX("particles/swarm_bee", housing.getWorld(), housing.getXCoord(), housing.getYCoord(),
housing.getZCoord(), genome.getPrimary().getIconColour(0), area[0], area[1], area[2]);
return storedData;
}
}
@@ -0,0 +1,89 @@
/*******************************************************************************
* Copyright (c) 2011-2014 SirSengir.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU Lesser Public License v3
* which accompanies this distribution, and is available at
* http://www.gnu.org/licenses/lgpl-3.0.txt
*
* Various Contributors including, but not limited to:
* SirSengir (original work), CovertJaguar, Player, Binnie, MysteriousAges
******************************************************************************/
package forestry.apiculture.genetics;
import java.util.List;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.potion.Potion;
import net.minecraft.potion.PotionEffect;
import net.minecraft.util.AxisAlignedBB;
import cpw.mods.fml.relauncher.ReflectionHelper;
import forestry.api.apiculture.IBeeGenome;
import forestry.api.apiculture.IBeeHousing;
import forestry.api.genetics.IEffectData;
import forestry.apiculture.items.ItemArmorApiarist;
import forestry.core.proxy.Proxies;
public class AlleleEffectPotion extends AlleleEffectThrottled {
private final Potion potion;
private final boolean isBadEffect;
private final int duration;
public AlleleEffectPotion(String name, boolean isDominant, Potion potion, int duration, boolean requiresWorking) {
super(name, isDominant, 200, requiresWorking, false);
this.potion = potion;
this.isBadEffect = isBadEffect(potion);
this.duration = duration;
}
@Override
public IEffectData doEffect(IBeeGenome genome, IEffectData storedData, IBeeHousing housing) {
if (isHalted(storedData, housing)) {
return storedData;
}
AxisAlignedBB beatifyBox = getBounding(genome, housing, 1.0f);
List list = housing.getWorld().getEntitiesWithinAABB(EntityPlayer.class, beatifyBox);
for (Object entity : list) {
if (!(entity instanceof EntityPlayer)) {
continue;
}
EntityPlayer player = (EntityPlayer) entity;
int dur = this.duration;
if (isBadEffect) {
// Players are not attacked if they wear a full set of apiarist's armor.
int count = ItemArmorApiarist.wearsItems((EntityPlayer) entity, getUID(), true);
if (count >= 4) {
continue; // Full set, no damage/effect
} else if (count == 3) {
dur = this.duration / 4;
} else if (count == 2) {
dur = this.duration / 2;
} else if (count == 1) {
dur = this.duration * 3 / 4;
}
}
player.addPotionEffect(new PotionEffect(potion.getId(), dur, 0));
}
return storedData;
}
//FIXME: remove when Potion.isBadEffect() is available server-side
private static boolean isBadEffect(Potion potion) {
try {
return (Boolean) ReflectionHelper.getPrivateValue(Potion.class, potion, "field_76418_K", "isBadEffect");
} catch (ReflectionHelper.UnableToFindFieldException e) {
Proxies.log.severe("Could not access potion field isBadEffect.");
return false;
}
}
}
@@ -0,0 +1,134 @@
/*******************************************************************************
* Copyright (c) 2011-2014 SirSengir.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU Lesser Public License v3
* which accompanies this distribution, and is available at
* http://www.gnu.org/licenses/lgpl-3.0.txt
*
* Various Contributors including, but not limited to:
* SirSengir (original work), CovertJaguar, Player, Binnie, MysteriousAges
******************************************************************************/
package forestry.apiculture.genetics;
import java.util.List;
import java.util.Random;
import net.minecraft.block.Block;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.AxisAlignedBB;
import net.minecraft.util.DamageSource;
import net.minecraft.world.World;
import forestry.api.apiculture.IBeeGenome;
import forestry.api.apiculture.IBeeHousing;
import forestry.api.genetics.IEffectData;
import forestry.apiculture.gadgets.BlockAlveary;
import forestry.apiculture.gadgets.TileAlveary;
import forestry.apiculture.items.ItemArmorApiarist;
import forestry.core.utils.DamageSourceForestry;
import forestry.core.vect.Vect;
public class AlleleEffectRadioactive extends AlleleEffectThrottled {
public static final DamageSource damageSourceBeeRadioactive = new DamageSourceForestry("bee.radioactive");
public AlleleEffectRadioactive() {
super("radioactive", true, 40, false, true);
}
@Override
public IEffectData doEffect(IBeeGenome genome, IEffectData storedData, IBeeHousing housing) {
World world = housing.getWorld();
if (isHalted(storedData, housing)) {
return storedData;
}
int[] areaAr = genome.getTerritory();
Vect area = new Vect(areaAr[0] * 2, areaAr[1] * 2, areaAr[2] * 2);
Vect offset = new Vect(-Math.round(area.x / 2), -Math.round(area.y / 2), -Math.round(area.z / 2));
// Radioactivity hurts players and mobs
Vect min = new Vect(housing.getXCoord() + offset.x, housing.getYCoord() + offset.y, housing.getZCoord() + offset.z);
Vect max = new Vect(housing.getXCoord() + offset.x + area.x, housing.getYCoord() + offset.y + area.y, housing.getZCoord() + offset.z + area.z);
AxisAlignedBB hurtBox = AxisAlignedBB.getBoundingBox(min.x, min.y, min.z, max.x, max.y, max.z);
@SuppressWarnings("rawtypes")
List list = housing.getWorld().getEntitiesWithinAABB(EntityLivingBase.class, hurtBox);
for (Object obj : list) {
EntityLivingBase entity = (EntityLivingBase) obj;
int damage = 8;
// Players are not attacked if they wear a full set of apiarist's
// armor.
if (entity instanceof EntityPlayer) {
int count = ItemArmorApiarist.wearsItems((EntityPlayer) entity, getUID(), true);
// Full set, no damage/effect
if (count > 3) {
continue;
} else if (count > 2) {
damage = 1;
} else if (count > 1) {
damage = 2;
} else if (count > 0) {
damage = 3;
}
}
entity.attackEntityFrom(damageSourceBeeRadioactive, damage);
}
Random rand = housing.getWorld().rand;
// Radioactivity destroys environment
for (int i = 0; i < 20; i++) {
Vect randomPos = new Vect(rand.nextInt(area.x), rand.nextInt(area.y), rand.nextInt(area.z));
Vect posBlock = randomPos.add(new Vect(housing.getXCoord(), housing.getYCoord(), housing.getZCoord()));
posBlock = posBlock.add(offset);
if (posBlock.y <= 1 || posBlock.y >= housing.getWorld().getActualHeight()) {
continue;
}
// Don't destroy ourself and blocks below us.
if (posBlock.x == housing.getXCoord() && posBlock.z == housing.getZCoord() && posBlock.y <= housing.getYCoord()) {
continue;
}
if (world.isAirBlock(posBlock.x, posBlock.y, posBlock.z)) {
continue;
}
Block block = world.getBlock(posBlock.x, posBlock.y, posBlock.z);
if (block instanceof BlockAlveary) {
continue;
}
TileEntity tile = world.getTileEntity(posBlock.x, posBlock.y, posBlock.z);
if (tile instanceof IBeeHousing) {
continue;
}
if (tile instanceof TileAlveary) {
continue;
}
if (block.getBlockHardness(world, posBlock.x, posBlock.y, posBlock.z) < 0) {
continue;
}
world.setBlockToAir(posBlock.x, posBlock.y, posBlock.z);
break;
}
return storedData;
}
}
@@ -8,17 +8,17 @@
* Various Contributors including, but not limited to:
* SirSengir (original work), CovertJaguar, Player, Binnie, MysteriousAges
******************************************************************************/
package forestry.apiculture.genetics.alleles;
package forestry.apiculture.genetics;
import java.util.List;
import net.minecraft.entity.ai.EntityAITasks.EntityAITaskEntry;
import net.minecraft.entity.monster.EntityMob;
import net.minecraft.util.AxisAlignedBB;
import forestry.api.apiculture.IBeeGenome;
import forestry.api.apiculture.IBeeHousing;
import forestry.api.genetics.IEffectData;
import forestry.apiculture.entities.AIAvoidPlayers;
public class AlleleEffectRepulsion extends AlleleEffectThrottled {
@@ -27,25 +27,35 @@ public class AlleleEffectRepulsion extends AlleleEffectThrottled {
}
@Override
public IEffectData doEffectThrottled(IBeeGenome genome, IEffectData storedData, IBeeHousing housing) {
List<EntityMob> mobs = getEntitiesInRange(genome, housing, EntityMob.class);
for (EntityMob mob : mobs) {
if (!isMobAvoidingPlayers(mob)) {
mob.tasks.addTask(3, new AIAvoidPlayers(mob, 6.0f, 0.25f, 0.3f));
mob.tasks.onUpdateTasks();
public IEffectData doEffect(IBeeGenome genome, IEffectData storedData, IBeeHousing housing) {
if (isHalted(storedData, housing)) {
return storedData;
}
if (housing.getOwnerName() == null) {
return storedData;
}
AxisAlignedBB hurtBox = getBounding(genome, housing, 1.0f);
@SuppressWarnings("rawtypes")
List list = housing.getWorld().getEntitiesWithinAABB(EntityMob.class, hurtBox);
for (Object obj : list) {
EntityMob mob = (EntityMob) obj;
for (Object objT : mob.tasks.taskEntries) {
EntityAITaskEntry task = (EntityAITaskEntry) objT;
if (task.action instanceof AIAvoidPlayers) {
return storedData;
}
}
mob.tasks.addTask(3, new AIAvoidPlayers(mob, 6.0f, 0.25f, 0.3f));
mob.tasks.onUpdateTasks();
}
return storedData;
}
private boolean isMobAvoidingPlayers(EntityMob mob) {
for (Object objT : mob.tasks.taskEntries) {
EntityAITaskEntry task = (EntityAITaskEntry) objT;
if (task.action instanceof AIAvoidPlayers) {
return true;
}
}
return false;
}
}
@@ -8,7 +8,7 @@
* Various Contributors including, but not limited to:
* SirSengir (original work), CovertJaguar, Player, Binnie, MysteriousAges
******************************************************************************/
package forestry.apiculture.genetics.alleles;
package forestry.apiculture.genetics;
import java.util.ArrayList;
import java.util.Collections;
@@ -28,12 +28,13 @@ import net.minecraft.entity.monster.EntityZombie;
import net.minecraft.init.Blocks;
import net.minecraft.init.Items;
import net.minecraft.item.ItemStack;
import net.minecraft.util.AxisAlignedBB;
import forestry.api.apiculture.IBeeGenome;
import forestry.api.apiculture.IBeeHousing;
import forestry.api.genetics.IEffectData;
import forestry.core.utils.EntityUtil;
import forestry.core.utils.ItemStackUtil;
import forestry.core.utils.StackUtils;
import forestry.core.utils.Utils;
public class AlleleEffectResurrection extends AlleleEffectThrottled {
@@ -48,7 +49,7 @@ public class AlleleEffectResurrection extends AlleleEffectThrottled {
}
public static List<Resurrectable> getReanimationList() {
ArrayList<Resurrectable> list = new ArrayList<>();
ArrayList<Resurrectable> list = new ArrayList<Resurrectable>();
list.add(new Resurrectable(new ItemStack(Items.bone), EntitySkeleton.class));
list.add(new Resurrectable(new ItemStack(Items.arrow), EntitySkeleton.class));
list.add(new Resurrectable(new ItemStack(Items.rotten_flesh), EntityZombie.class));
@@ -57,7 +58,7 @@ public class AlleleEffectResurrection extends AlleleEffectThrottled {
}
public static List<Resurrectable> getResurrectionList() {
ArrayList<Resurrectable> list = new ArrayList<>();
ArrayList<Resurrectable> list = new ArrayList<Resurrectable>();
list.add(new Resurrectable(new ItemStack(Items.gunpowder), EntityCreeper.class));
list.add(new Resurrectable(new ItemStack(Items.ender_pearl), EntityEnderman.class));
list.add(new Resurrectable(new ItemStack(Items.string), EntitySpider.class));
@@ -77,38 +78,39 @@ public class AlleleEffectResurrection extends AlleleEffectThrottled {
}
@Override
public IEffectData doEffectThrottled(IBeeGenome genome, IEffectData storedData, IBeeHousing housing) {
List<EntityItem> entities = getEntitiesInRange(genome, housing, EntityItem.class);
if (entities.size() == 0) {
public IEffectData doEffect(IBeeGenome genome, IEffectData storedData, IBeeHousing housing) {
if (isHalted(storedData, housing)) {
return storedData;
}
Collections.shuffle(resurrectables);
AxisAlignedBB bounding = getBounding(genome, housing, 1.0f);
@SuppressWarnings("rawtypes")
List list = housing.getWorld().getEntitiesWithinAABB(EntityItem.class, bounding);
for (EntityItem entity : entities) {
if (resurrectEntity(entity)) {
break;
if (list.size() > 0) {
Collections.shuffle(resurrectables);
}
for (Object obj : list) {
EntityItem item = (EntityItem) obj;
if (item.isDead) {
continue;
}
ItemStack contained = item.getEntityItem();
for (Resurrectable entry : resurrectables) {
if (StackUtils.isIdenticalItem(entry.res, contained)) {
Utils.spawnEntity(housing.getWorld(), entry.risen, item.posX, item.posY, item.posZ);
contained.stackSize--;
if (contained.stackSize <= 0) {
item.setDead();
}
break;
}
}
}
return storedData;
}
private boolean resurrectEntity(EntityItem entity) {
if (entity.isDead) {
return false;
}
ItemStack contained = entity.getEntityItem();
for (Resurrectable entry : resurrectables) {
if (ItemStackUtil.isIdenticalItem(entry.res, contained)) {
EntityUtil.spawnEntity(entity.worldObj, entry.risen, entity.posX, entity.posY, entity.posZ);
contained.stackSize--;
if (contained.stackSize <= 0) {
entity.setDead();
}
return true;
}
}
return false;
}
}
@@ -8,12 +8,11 @@
* Various Contributors including, but not limited to:
* SirSengir (original work), CovertJaguar, Player, Binnie, MysteriousAges
******************************************************************************/
package forestry.apiculture.genetics.alleles;
package forestry.apiculture.genetics;
import net.minecraft.block.Block;
import net.minecraft.init.Blocks;
import net.minecraft.util.ChunkCoordinates;
import net.minecraft.world.World;
import net.minecraft.world.biome.BiomeGenBase;
import net.minecraftforge.common.util.ForgeDirection;
@@ -21,9 +20,8 @@ import forestry.api.apiculture.IBeeGenome;
import forestry.api.apiculture.IBeeHousing;
import forestry.api.core.EnumTemperature;
import forestry.api.genetics.IEffectData;
import forestry.core.config.Constants;
import forestry.core.proxy.Proxies;
import forestry.core.utils.vect.Vect;
import forestry.core.vect.Vect;
public class AlleleEffectSnowing extends AlleleEffectThrottled {
@@ -32,10 +30,14 @@ public class AlleleEffectSnowing extends AlleleEffectThrottled {
}
@Override
public IEffectData doEffectThrottled(IBeeGenome genome, IEffectData storedData, IBeeHousing housing) {
public IEffectData doEffect(IBeeGenome genome, IEffectData storedData, IBeeHousing housing) {
World world = housing.getWorld();
if (isHalted(storedData, housing)) {
return storedData;
}
EnumTemperature temp = housing.getTemperature();
switch (temp) {
@@ -46,14 +48,15 @@ public class AlleleEffectSnowing extends AlleleEffectThrottled {
default:
}
Vect area = getModifiedArea(genome, housing);
Vect offset = area.multiply(-1 / 2.0f);
int[] areaAr = genome.getTerritory();
Vect area = new Vect(areaAr[0], areaAr[1], areaAr[2]);
Vect offset = new Vect(-Math.round(area.x / 2), -Math.round(area.y / 2), -Math.round(area.z / 2));
for (int i = 0; i < 1; i++) {
Vect randomPos = Vect.getRandomPositionInArea(world.rand, area);
Vect randomPos = new Vect(world.rand.nextInt(area.x), world.rand.nextInt(area.y), world.rand.nextInt(area.z));
Vect posBlock = randomPos.add(new Vect(housing.getCoordinates()));
Vect posBlock = randomPos.add(new Vect(housing.getXCoord(), housing.getYCoord(), housing.getZCoord()));
posBlock = posBlock.add(offset);
// Put snow on the ground
@@ -61,16 +64,11 @@ public class AlleleEffectSnowing extends AlleleEffectThrottled {
continue;
}
Block block = world.getBlock(posBlock.x, posBlock.y, posBlock.z);
if (block == Blocks.snow_layer) {
int meta = world.getBlockMetadata(posBlock.x, posBlock.y, posBlock.z);
if (meta < 7) {
world.setBlockMetadataWithNotify(posBlock.x, posBlock.y, posBlock.z, meta + 1, Constants.FLAG_BLOCK_SYNCH_AND_UPDATE);
}
} else if (block.isReplaceable(world, posBlock.x, posBlock.y, posBlock.z)) {
world.setBlock(posBlock.x, posBlock.y, posBlock.z, Blocks.snow_layer, 0, Constants.FLAG_BLOCK_SYNCH_AND_UPDATE);
if (!world.isAirBlock(posBlock.x, posBlock.y, posBlock.z)) {
continue;
}
Proxies.common.setBlockWithNotify(world, posBlock.x, posBlock.y, posBlock.z, Blocks.snow_layer);
}
return storedData;
@@ -79,18 +77,9 @@ public class AlleleEffectSnowing extends AlleleEffectThrottled {
@Override
public IEffectData doFX(IBeeGenome genome, IEffectData storedData, IBeeHousing housing) {
if (housing.getWorld().rand.nextInt(3) == 0) {
Vect area = getModifiedArea(genome, housing);
Vect offset = area.multiply(-0.5F);
ChunkCoordinates coordinates = housing.getCoordinates();
World world = housing.getWorld();
Vect spawn = Vect.getRandomPositionInArea(world.rand, area).add(coordinates).add(offset);
Proxies.render.addEntitySnowFX(world, spawn.x, spawn.y, spawn.z);
return storedData;
} else {
return super.doFX(genome, storedData, housing);
int[] area = getModifiedArea(genome, housing);
Proxies.render.addSnowFX(housing.getWorld(), housing.getXCoord(), housing.getYCoord(), housing.getZCoord(), genome.getPrimary().getIconColour(0), area[0], area[1], area[2]);
}
return storedData;
}
}
@@ -0,0 +1,115 @@
/*******************************************************************************
* Copyright (c) 2011-2014 SirSengir.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU Lesser Public License v3
* which accompanies this distribution, and is available at
* http://www.gnu.org/licenses/lgpl-3.0.txt
*
* Various Contributors including, but not limited to:
* SirSengir (original work), CovertJaguar, Player, Binnie, MysteriousAges
******************************************************************************/
package forestry.apiculture.genetics;
import net.minecraft.util.AxisAlignedBB;
import forestry.api.apiculture.IAlleleBeeEffect;
import forestry.api.apiculture.IBeeGenome;
import forestry.api.apiculture.IBeeHousing;
import forestry.api.genetics.IEffectData;
import forestry.core.EnumErrorCode;
import forestry.core.genetics.EffectData;
import forestry.core.genetics.alleles.AlleleCategorized;
import forestry.core.vect.Vect;
import forestry.plugins.PluginApiculture;
public abstract class AlleleEffectThrottled extends AlleleCategorized implements IAlleleBeeEffect {
private boolean isCombinable = false;
private final int throttle;
private boolean requiresWorkingQueen = false;
public AlleleEffectThrottled(String name, boolean isDominant, int throttle, boolean requiresWorking, boolean isCombinable) {
super("forestry", "effect", name, isDominant);
this.throttle = throttle;
this.isCombinable = isCombinable;
this.requiresWorkingQueen = requiresWorking;
}
public int getThrottle() {
return throttle;
}
@Override
public boolean isCombinable() {
return isCombinable;
}
@Override
public IEffectData validateStorage(IEffectData storedData) {
if (storedData instanceof EffectData) {
return storedData;
}
return new EffectData(1, 0);
}
public boolean isHalted(IEffectData storedData, IBeeHousing housing) {
if (requiresWorkingQueen && housing.getErrorState() != EnumErrorCode.OK) {
return true;
}
int throt = storedData.getInteger(0);
throt++;
storedData.setInteger(0, throt);
if (throt < getThrottle()) {
return true;
}
// Reset since we are done throttling.
storedData.setInteger(0, 0);
return false;
}
@Override
public IEffectData doFX(IBeeGenome genome, IEffectData storedData, IBeeHousing housing) {
int[] area = getModifiedArea(genome, housing);
PluginApiculture.proxy.addBeeHiveFX("particles/swarm_bee", housing.getWorld(), housing.getXCoord(), housing.getYCoord(),
housing.getZCoord(), genome.getPrimary().getIconColour(0), area[0], area[1], area[2]);
return storedData;
}
protected int[] getModifiedArea(IBeeGenome genome, IBeeHousing housing) {
int[] area = genome.getTerritory();
area[0] *= housing.getTerritoryModifier(genome, 1f) * 3;
area[1] *= housing.getTerritoryModifier(genome, 1f) * 3;
area[2] *= housing.getTerritoryModifier(genome, 1f) * 3;
if (area[0] < 1) {
area[0] = 1;
}
if (area[1] < 1) {
area[1] = 1;
}
if (area[2] < 1) {
area[2] = 1;
}
return area;
}
protected AxisAlignedBB getBounding(IBeeGenome genome, IBeeHousing housing, float modifier) {
int[] areaAr = genome.getTerritory();
Vect area = new Vect(areaAr[0], areaAr[1], areaAr[2]).multiply(modifier);
Vect offset = new Vect(-Math.round(area.x / 2), -Math.round(area.y / 2), -Math.round(area.z / 2));
// Radioactivity hurts players and mobs
Vect min = new Vect(housing.getXCoord() + offset.x, housing.getYCoord() + offset.y, housing.getZCoord() + offset.z);
Vect max = new Vect(housing.getXCoord() + offset.x + area.x, housing.getYCoord() + offset.y + area.y, housing.getZCoord() + offset.z + area.z);
return AxisAlignedBB.getBoundingBox(min.x, min.y, min.z, max.x, max.y, max.z);
}
}
@@ -8,7 +8,7 @@
* Various Contributors including, but not limited to:
* SirSengir (original work), CovertJaguar, Player, Binnie, MysteriousAges
******************************************************************************/
package forestry.apiculture.genetics.alleles;
package forestry.apiculture.genetics;
import forestry.api.genetics.IAlleleFlowers;
import forestry.api.genetics.IFlowerProvider;
@@ -13,19 +13,24 @@ package forestry.apiculture.genetics;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.nbt.NBTTagCompound;
import com.mojang.authlib.GameProfile;
import forestry.api.apiculture.BeeManager;
import forestry.api.apiculture.EnumBeeChromosome;
import forestry.api.apiculture.IApiaristTracker;
import forestry.api.genetics.IBreedingTracker;
import forestry.api.genetics.IIndividual;
import forestry.api.genetics.ISpeciesRoot;
import forestry.core.genetics.BreedingTracker;
public class ApiaristTracker extends BreedingTracker implements IApiaristTracker {
/** Required for creation from map storage */
public ApiaristTracker(String s) {
super(s);
this(s, null);
}
public ApiaristTracker(String s, GameProfile player) {
super(s, player);
}
private int queensTotal = 0;
@@ -56,16 +61,13 @@ public class ApiaristTracker extends BreedingTracker implements IApiaristTracker
@Override
public void registerPickup(IIndividual individual) {
ISpeciesRoot speciesRoot = individual.getGenome().getPrimary().getRoot();
if (!speciesRoot.getUID().equals(speciesRootUID())) {
if (!individual.getGenome().getPrimary().getRoot().getUID().equals(BeeHelper.UID)) {
return;
}
if (!individual.isPureBred(EnumBeeChromosome.SPECIES)) {
return;
}
if (speciesRoot.getCombinations(individual.getGenome().getPrimary()).size() > 0) {
if (BeeManager.beeRoot.getCombinations(individual.getGenome().getPrimary()).size() > 0) {
return;
}
@@ -21,23 +21,18 @@ import net.minecraft.item.EnumRarity;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.ChunkCoordinates;
import net.minecraft.util.EnumChatFormatting;
import net.minecraft.world.World;
import net.minecraft.world.biome.BiomeGenBase;
import com.mojang.authlib.GameProfile;
import forestry.api.apiculture.BeeManager;
import forestry.api.apiculture.EnumBeeChromosome;
import forestry.api.apiculture.FlowerManager;
import forestry.api.apiculture.IAlleleBeeEffect;
import forestry.api.apiculture.IAlleleBeeSpecies;
import forestry.api.apiculture.IApiaristTracker;
import forestry.api.apiculture.IBee;
import forestry.api.apiculture.IBeeGenome;
import forestry.api.apiculture.IBeeHousing;
import forestry.api.apiculture.IBeeModifier;
import forestry.api.apiculture.IBeeMutation;
import forestry.api.apiculture.IBeekeepingMode;
import forestry.api.core.BiomeHelper;
@@ -45,35 +40,33 @@ import forestry.api.core.EnumHumidity;
import forestry.api.core.EnumTemperature;
import forestry.api.core.IErrorState;
import forestry.api.genetics.AlleleManager;
import forestry.api.genetics.EnumTolerance;
import forestry.api.genetics.IAllele;
import forestry.api.genetics.IAlleleTolerance;
import forestry.api.genetics.IChromosome;
import forestry.api.genetics.IEffectData;
import forestry.api.genetics.IFlowerProvider;
import forestry.api.genetics.IIndividual;
import forestry.api.genetics.IMutation;
import forestry.api.genetics.IPollinatable;
import forestry.arboriculture.genetics.pollination.FakePollinatable;
import forestry.arboriculture.genetics.pollination.ICheckPollinatable;
import forestry.core.config.Config;
import forestry.core.config.Constants;
import forestry.core.errors.EnumErrorCode;
import forestry.arboriculture.genetics.FakePollinatable;
import forestry.arboriculture.genetics.ICheckPollinatable;
import forestry.core.EnumErrorCode;
import forestry.core.config.Defaults;
import forestry.core.genetics.Chromosome;
import forestry.core.genetics.GenericRatings;
import forestry.core.genetics.IndividualLiving;
import forestry.core.proxy.Proxies;
import forestry.core.utils.GeneticsUtil;
import forestry.core.utils.Log;
import forestry.core.utils.StringUtil;
import forestry.core.utils.vect.Vect;
import forestry.core.vect.MutableVect;
import forestry.core.vect.Vect;
public class Bee extends IndividualLiving implements IBee {
private int generation;
private boolean isNatural = true;
protected int generation;
protected boolean isNatural = true;
private IBeeGenome genome;
private IBeeGenome mate;
public IBeeGenome genome;
public IBeeGenome mate;
/* CONSTRUCTOR */
public Bee(NBTTagCompound nbttagcompound) {
@@ -89,7 +82,7 @@ public class Bee extends IndividualLiving implements IBee {
this(genome, true, 0);
}
private Bee(IBeeGenome genome, boolean isNatural, int generation) {
public Bee(IBeeGenome genome, boolean isNatural, int generation) {
super(genome.getLifespan());
this.genome = genome;
this.isNatural = isNatural;
@@ -116,13 +109,13 @@ public class Bee extends IndividualLiving implements IBee {
}
if (nbttagcompound.hasKey("Genome")) {
genome = BeeGenome.fromNBT(nbttagcompound.getCompoundTag("Genome"));
genome = new BeeGenome(nbttagcompound.getCompoundTag("Genome"));
} else {
genome = BeeDefinition.FOREST.getGenome();
}
if (nbttagcompound.hasKey("Mate")) {
mate = BeeGenome.fromNBT(nbttagcompound.getCompoundTag("Mate"));
mate = new BeeGenome(nbttagcompound.getCompoundTag("Mate"));
}
}
@@ -252,93 +245,63 @@ public class Bee extends IndividualLiving implements IBee {
World world = housing.getWorld();
BiomeGenBase biome = housing.getBiome();
Set<IErrorState> errorStates = new HashSet<>();
IBeeModifier beeModifier = BeeManager.beeRoot.createBeeHousingModifier(housing);
Set<IErrorState> errorStates = new HashSet<IErrorState>();
// / Rain needs tolerant flyers
if (world.isRaining() && BiomeHelper.canRainOrSnow(biome) && !canFlyInRain(beeModifier)) {
errorStates.add(EnumErrorCode.IS_RAINING);
if (world.isRaining() && !genome.getTolerantFlyer() && BiomeHelper.canRainOrSnow(biome) && !housing.isSealed()) {
errorStates.add(EnumErrorCode.ISRAINING);
}
// / Night or darkness requires nocturnal species
if (world.isDaytime()) {
if (!canWorkDuringDay()) {
errorStates.add(EnumErrorCode.NOT_NIGHT);
}
} else {
if (!canWorkAtNight(beeModifier)) {
errorStates.add(EnumErrorCode.NOT_DAY);
errorStates.add(EnumErrorCode.NOTNIGHT);
}
} else if (!canWorkAtNight() && !housing.isSelfLighted()) {
errorStates.add(EnumErrorCode.NOTDAY);
}
if (housing.getBlockLightValue() > Constants.APIARY_MIN_LEVEL_LIGHT) {
if (world.getBlockLightValue(housing.getXCoord(), housing.getYCoord() + 2, housing.getZCoord()) > Defaults.APIARY_MIN_LEVEL_LIGHT) {
if (!canWorkDuringDay()) {
errorStates.add(EnumErrorCode.NOT_GLOOMY);
}
} else {
if (!canWorkAtNight(beeModifier)) {
errorStates.add(EnumErrorCode.NOT_BRIGHT);
errorStates.add(EnumErrorCode.NOTGLOOMY);
}
} else if (!canWorkAtNight() && !housing.isSelfLighted()) {
errorStates.add(EnumErrorCode.NOTLUCID);
}
// / Check for the sky, except if in hell
if (!world.provider.hasNoSky) {
if (!housing.canBlockSeeTheSky() && !canWorkUnderground(beeModifier)) {
errorStates.add(EnumErrorCode.NO_SKY);
}
// / No sky, except if in hell
if (biome != null && !BiomeHelper.isBiomeHellish(biome) && !world.canBlockSeeTheSky(housing.getXCoord(), housing.getYCoord() + 3, housing.getZCoord())
&& !genome.getCaveDwelling() && !housing.isSunlightSimulated()) {
errorStates.add(EnumErrorCode.NOSKY);
}
// / And finally climate check
IAlleleBeeSpecies species = genome.getPrimary();
{
EnumTemperature actualTemperature = housing.getTemperature();
EnumTemperature beeBaseTemperature = species.getTemperature();
EnumTolerance beeToleranceTemperature = genome.getToleranceTemp();
if (!AlleleManager.climateHelper.isWithinLimits(actualTemperature, beeBaseTemperature, beeToleranceTemperature)) {
if (beeBaseTemperature.ordinal() > actualTemperature.ordinal()) {
errorStates.add(EnumErrorCode.TOO_COLD);
} else {
errorStates.add(EnumErrorCode.TOO_HOT);
}
}
}
{
EnumHumidity actualHumidity = housing.getHumidity();
EnumHumidity beeBaseHumidity = species.getHumidity();
EnumTolerance beeToleranceHumidity = genome.getToleranceHumid();
if (!AlleleManager.climateHelper.isWithinLimits(actualHumidity, beeBaseHumidity, beeToleranceHumidity)) {
if (beeBaseHumidity.ordinal() > actualHumidity.ordinal()) {
errorStates.add(EnumErrorCode.TOO_ARID);
} else {
errorStates.add(EnumErrorCode.TOO_HUMID);
}
}
if (!isSuitableClimate(housing.getTemperature(), housing.getHumidity())) {
errorStates.add(EnumErrorCode.INVALIDBIOME);
}
return errorStates;
}
private boolean canWorkAtNight(IBeeModifier beeModifier) {
return genome.getPrimary().isNocturnal() || genome.getNocturnal() || beeModifier.isSelfLighted();
@Override
public IErrorState canWork(IBeeHousing housing) {
Set<IErrorState> errorStates = getCanWork(housing);
if (errorStates.size() == 0) {
return EnumErrorCode.OK;
} else {
return errorStates.iterator().next();
}
}
private boolean canWorkAtNight() {
return genome.getPrimary().isNocturnal() || genome.getNocturnal();
}
private boolean canWorkDuringDay() {
return !genome.getPrimary().isNocturnal() || genome.getNocturnal();
}
private boolean canWorkUnderground(IBeeModifier beeModifier) {
return genome.getCaveDwelling() || beeModifier.isSunlightSimulated();
}
private boolean canFlyInRain(IBeeModifier beeModifier) {
return genome.getTolerantFlyer() || beeModifier.isSealed();
}
private boolean isSuitableBiome(BiomeGenBase biome) {
public boolean isSuitableBiome(BiomeGenBase biome) {
if (biome == null) {
return false;
}
@@ -354,9 +317,35 @@ public class Bee extends IndividualLiving implements IBee {
genome.getPrimary().getHumidity(), genome.getToleranceHumid());
}
@Override
public boolean hasFlower(IBeeHousing housing) {
IFlowerProvider provider = genome.getFlowerProvider();
Vect housingPos = new Vect(housing.getXCoord(), housing.getYCoord(), housing.getZCoord());
Vect area = getArea(genome, housing);
Vect offset = new Vect(-area.x / 2, -area.y / 2, -area.z / 2);
boolean hasFlower = false;
MutableVect posCurrent = new MutableVect(0, 0, 0);
while (posCurrent.advancePositionInArea(area)) {
Vect posBlock = Vect.add(housingPos, posCurrent, offset);
if (provider.isAcceptedFlower(housing.getWorld(), this, posBlock.x, posBlock.y, posBlock.z)) {
hasFlower = true;
break;
}
}
return hasFlower;
}
@Override
public ArrayList<BiomeGenBase> getSuitableBiomes() {
ArrayList<BiomeGenBase> suitableBiomes = new ArrayList<>();
ArrayList<BiomeGenBase> suitableBiomes = new ArrayList<BiomeGenBase>();
for (BiomeGenBase biome : BiomeGenBase.getBiomeGenArray()) {
if (isSuitableBiome(biome)) {
suitableBiomes.add(biome);
@@ -433,8 +422,7 @@ public class Bee extends IndividualLiving implements IBee {
@Override
public void age(World world, float housingLifespanModifier) {
IBeekeepingMode mode = BeeManager.beeRoot.getBeekeepingMode(world);
IBeeModifier beeModifier = mode.getBeeModifier();
float finalModifier = housingLifespanModifier * beeModifier.getLifespanModifier(genome, mate, housingLifespanModifier);
float finalModifier = housingLifespanModifier * mode.getLifespanModifier(genome, mate, housingLifespanModifier);
super.age(world, finalModifier);
}
@@ -442,14 +430,14 @@ public class Bee extends IndividualLiving implements IBee {
// / PRODUCTION
@Override
public ItemStack[] getProduceList() {
ArrayList<ItemStack> products = new ArrayList<>();
ArrayList<ItemStack> products = new ArrayList<ItemStack>();
IAlleleBeeSpecies primary = genome.getPrimary();
IAlleleBeeSpecies secondary = genome.getSecondary();
products.addAll(primary.getProductChances().keySet());
products.addAll(primary.getProducts().keySet());
Set<ItemStack> secondaryProducts = secondary.getProductChances().keySet();
Set<ItemStack> secondaryProducts = secondary.getProducts().keySet();
// Remove duplicates
for (ItemStack second : secondaryProducts) {
boolean skip = false;
@@ -472,23 +460,23 @@ public class Bee extends IndividualLiving implements IBee {
@Override
public ItemStack[] getSpecialtyList() {
Set<ItemStack> specialties = genome.getPrimary().getSpecialtyChances().keySet();
Set<ItemStack> specialties = genome.getPrimary().getSpecialty().keySet();
return specialties.toArray(new ItemStack[specialties.size()]);
}
@Override
public ItemStack[] produceStacks(IBeeHousing housing) {
if (housing == null) {
Log.warning("Failed to produce in an apiary because the beehousing was null.");
Proxies.log.warning("Failed to produce in an apiary because the beehousing was null.");
return null;
}
IBeekeepingMode mode = BeeManager.beeRoot.getBeekeepingMode(housing.getWorld());
if (mode == null) {
Log.warning("Failed to produce in an apiary because the beekeeping mode was null.");
Proxies.log.warning("Failed to produce in an apiary because the beekeeping mode was null.");
return null;
}
List<ItemStack> products = new ArrayList<>();
List<ItemStack> products = new ArrayList<ItemStack>();
IAlleleBeeSpecies primary = genome.getPrimary();
IAlleleBeeSpecies secondary = genome.getSecondary();
@@ -498,37 +486,33 @@ public class Bee extends IndividualLiving implements IBee {
setIsNatural(false);
}
IBeeModifier beeHousingModifier = BeeManager.beeRoot.createBeeHousingModifier(housing);
IBeeModifier beeModeModifier = mode.getBeeModifier();
// Bee genetic speed * beehousing * beekeeping mode
float speed = genome.getSpeed() * beeHousingModifier.getProductionModifier(genome, 1f) * beeModeModifier.getProductionModifier(genome, 1f);
float speed = genome.getSpeed() * housing.getProductionModifier(genome, 1f) * mode.getProductionModifier(genome, 1f);
// / Primary Products
for (Map.Entry<ItemStack, Float> entry : primary.getProductChances().entrySet()) {
if (housing.getWorld().rand.nextFloat() < entry.getValue() * speed) {
for (Map.Entry<ItemStack, Integer> entry : primary.getProducts().entrySet()) {
if (housing.getWorld().rand.nextInt(100) < entry.getValue() * speed) {
products.add(entry.getKey().copy());
}
}
// / Secondary Products
for (Map.Entry<ItemStack, Float> entry : secondary.getProductChances().entrySet()) {
if (housing.getWorld().rand.nextFloat() < Math.round(entry.getValue() / 2) * speed) {
for (Map.Entry<ItemStack, Integer> entry : secondary.getProducts().entrySet()) {
if (housing.getWorld().rand.nextInt(100) < Math.round(entry.getValue() / 2) * speed) {
products.add(entry.getKey().copy());
}
}
// / Specialty products
if (primary.isJubilant(genome, housing) && secondary.isJubilant(genome, housing)) {
for (Map.Entry<ItemStack, Float> entry : primary.getSpecialtyChances().entrySet()) {
if (housing.getWorld().rand.nextFloat() < entry.getValue() * speed) {
for (Map.Entry<ItemStack, Integer> entry : primary.getSpecialty().entrySet()) {
if (housing.getWorld().rand.nextInt(100) < entry.getValue() * speed) {
products.add(entry.getKey().copy());
}
}
}
ItemStack[] productsArray = products.toArray(new ItemStack[products.size()]);
ChunkCoordinates housingCoordinates = housing.getCoordinates();
return genome.getFlowerProvider().affectProducts(housing.getWorld(), this, housingCoordinates.posX, housingCoordinates.posY, housingCoordinates.posZ, productsArray);
return genome.getFlowerProvider().affectProducts(housing.getWorld(), this, housing.getXCoord(), housing.getYCoord(), housing.getZCoord(), productsArray);
}
/* REPRODUCTION */
@@ -558,10 +542,10 @@ public class Bee extends IndividualLiving implements IBee {
return null;
}
List<IBee> bees = new ArrayList<>();
ArrayList<IBee> bees = new ArrayList<IBee>();
ChunkCoordinates housingCoordinates = housing.getCoordinates();
int toCreate = BeeManager.beeRoot.getBeekeepingMode(world).getFinalFertility(this, world, housingCoordinates.posX, housingCoordinates.posY, housingCoordinates.posZ);
int toCreate = BeeManager.beeRoot.getBeekeepingMode(world).getFinalFertility(this, world, housing.getXCoord(), housing.getYCoord(),
housing.getZCoord());
if (toCreate <= 0) {
toCreate = 1;
@@ -620,44 +604,27 @@ public class Bee extends IndividualLiving implements IBee {
IBeeGenome genome0;
IBeeGenome genome1;
IAlleleBeeSpecies allele0;
IAlleleBeeSpecies allele1;
IAllele allele0;
IAllele allele1;
if (world.rand.nextBoolean()) {
allele0 = (IAlleleBeeSpecies) parent1[EnumBeeChromosome.SPECIES.ordinal()].getPrimaryAllele();
allele1 = (IAlleleBeeSpecies) parent2[EnumBeeChromosome.SPECIES.ordinal()].getSecondaryAllele();
allele0 = parent1[EnumBeeChromosome.SPECIES.ordinal()].getPrimaryAllele();
allele1 = parent2[EnumBeeChromosome.SPECIES.ordinal()].getSecondaryAllele();
genome0 = genomeOne;
genome1 = genomeTwo;
} else {
allele0 = (IAlleleBeeSpecies) parent2[EnumBeeChromosome.SPECIES.ordinal()].getPrimaryAllele();
allele1 = (IAlleleBeeSpecies) parent1[EnumBeeChromosome.SPECIES.ordinal()].getSecondaryAllele();
allele0 = parent2[EnumBeeChromosome.SPECIES.ordinal()].getPrimaryAllele();
allele1 = parent1[EnumBeeChromosome.SPECIES.ordinal()].getSecondaryAllele();
genome0 = genomeTwo;
genome1 = genomeOne;
}
GameProfile playerProfile = housing.getOwner();
IApiaristTracker breedingTracker = BeeManager.beeRoot.getBreedingTracker(world, playerProfile);
List<IMutation> combinations = BeeManager.beeRoot.getCombinations(allele0, allele1, true);
for (IMutation mutation : combinations) {
IBeeMutation beeMutation = (IBeeMutation) mutation;
float chance = beeMutation.getChance(housing, allele0, allele1, genome0, genome1);
if (chance <= 0) {
continue;
}
// boost chance for researched mutations
if (breedingTracker.isResearched(beeMutation)) {
float mutationBoost = chance * (Config.researchMutationBoostMultiplier - 1.0f);
mutationBoost = Math.min(Config.maxResearchMutationBoostPercent, mutationBoost);
chance += mutationBoost;
}
for (IBeeMutation mutation : BeeManager.beeRoot.getMutations(true)) {
float chance = mutation.getChance(housing, allele0, allele1, genome0, genome1);
if (chance > world.rand.nextFloat() * 100) {
IApiaristTracker breedingTracker = BeeManager.beeRoot.getBreedingTracker(world, housing.getOwnerName());
breedingTracker.registerMutation(mutation);
return BeeManager.beeRoot.templateAsChromosomes(mutation.getTemplate());
}
@@ -670,9 +637,7 @@ public class Bee extends IndividualLiving implements IBee {
@Override
public IIndividual retrievePollen(IBeeHousing housing) {
IBeeModifier beeModifier = BeeManager.beeRoot.createBeeHousingModifier(housing);
int chance = Math.round(genome.getFlowering() * beeModifier.getFloweringModifier(getGenome(), 1f));
int chance = Math.round(genome.getFlowering() * housing.getFloweringModifier(getGenome(), 1f));
World world = housing.getWorld();
Random random = world.rand;
@@ -682,9 +647,9 @@ public class Bee extends IndividualLiving implements IBee {
return null;
}
Vect area = getArea(genome, beeModifier);
Vect area = getArea(genome, housing);
Vect offset = new Vect(-area.x / 2, -area.y / 4, -area.z / 2);
Vect housingPos = new Vect(housing.getCoordinates());
Vect housingPos = new Vect(housing.getXCoord(), housing.getYCoord(), housing.getZCoord());
IIndividual pollen = null;
@@ -713,9 +678,7 @@ public class Bee extends IndividualLiving implements IBee {
@Override
public boolean pollinateRandom(IBeeHousing housing, IIndividual pollen) {
IBeeModifier beeModifier = BeeManager.beeRoot.createBeeHousingModifier(housing);
int chance = (int) (genome.getFlowering() * beeModifier.getFloweringModifier(getGenome(), 1f));
int chance = (int) (genome.getFlowering() * housing.getFloweringModifier(getGenome(), 1f));
World world = housing.getWorld();
Random random = world.rand;
@@ -725,9 +688,9 @@ public class Bee extends IndividualLiving implements IBee {
return false;
}
Vect area = getArea(genome, beeModifier);
Vect area = getArea(genome, housing);
Vect offset = new Vect(-area.x / 2, -area.y / 4, -area.z / 2);
Vect housingPos = new Vect(housing.getCoordinates());
Vect housingPos = new Vect(housing.getXCoord(), housing.getYCoord(), housing.getZCoord());
for (int i = 0; i < 30; i++) {
@@ -746,7 +709,7 @@ public class Bee extends IndividualLiving implements IBee {
continue;
}
IPollinatable realPollinatable = GeneticsUtil.getOrCreatePollinatable(housing.getOwner(), world, posBlock.x, posBlock.y, posBlock.z);
IPollinatable realPollinatable = GeneticsUtil.getOrCreatePollinatable(housing.getOwnerName(), world, posBlock.x, posBlock.y, posBlock.z);
if (realPollinatable != null) {
realPollinatable.mateWith(pollen);
@@ -760,9 +723,7 @@ public class Bee extends IndividualLiving implements IBee {
@Override
public void plantFlowerRandom(IBeeHousing housing) {
IBeeModifier beeModifier = BeeManager.beeRoot.createBeeHousingModifier(housing);
int chance = Math.round(genome.getFlowering() * beeModifier.getFloweringModifier(getGenome(), 1f));
int chance = Math.round(genome.getFlowering() * housing.getFloweringModifier(getGenome(), 1f));
World world = housing.getWorld();
Random random = world.rand;
@@ -774,23 +735,23 @@ public class Bee extends IndividualLiving implements IBee {
// Gather required info
IFlowerProvider provider = genome.getFlowerProvider();
Vect area = getArea(genome, beeModifier);
Vect area = getArea(genome, housing);
Vect offset = new Vect(-area.x / 2, -area.y / 4, -area.z / 2);
Vect housingPos = new Vect(housing.getCoordinates());
Vect housingPos = new Vect(housing.getXCoord(), housing.getYCoord(), housing.getZCoord());
for (int i = 0; i < 10; i++) {
Vect randomPos = Vect.getRandomPositionInArea(random, area);
Vect posBlock = Vect.add(housingPos, randomPos, offset);
if (FlowerManager.flowerRegistry.growFlower(provider.getFlowerType(), world, this, posBlock.x, posBlock.y, posBlock.z)) {
if (provider.growFlower(world, this, posBlock.x, posBlock.y, posBlock.z)) {
break;
}
}
}
private static Vect getArea(IBeeGenome genome, IBeeModifier beeModifier) {
private static Vect getArea(IBeeGenome genome, IBeeHousing housing) {
int[] genomeTerritory = genome.getTerritory();
float housingModifier = beeModifier.getTerritoryModifier(genome, 1f);
float housingModifier = housing.getTerritoryModifier(genome, 1f);
return new Vect(genomeTerritory).multiply(housingModifier * 3.0f);
}
}
@@ -1,18 +1,15 @@
package forestry.apiculture.genetics;
import java.util.Arrays;
import java.util.Locale;
import forestry.api.apiculture.BeeManager;
import forestry.api.apiculture.EnumBeeChromosome;
import forestry.api.genetics.IAllele;
import forestry.api.genetics.IClassification;
import forestry.apiculture.genetics.alleles.AlleleEffect;
import forestry.core.genetics.IBranchDefinition;
import forestry.core.genetics.alleles.AlleleHelper;
import forestry.core.genetics.alleles.Allele;
import forestry.core.genetics.alleles.EnumAllele;
public enum BeeBranchDefinition implements IBranchDefinition {
public enum BeeBranchDefinition {
HONEY("Apis"),
NOBLE("Probapis"),
INDUSTRIOUS("Industrapis"),
@@ -20,117 +17,116 @@ public enum BeeBranchDefinition implements IBranchDefinition {
INFERNAL("Diapis") {
@Override
protected void setBranchProperties(IAllele[] alleles) {
AlleleHelper.instance.set(alleles, EnumBeeChromosome.TEMPERATURE_TOLERANCE, EnumAllele.Tolerance.DOWN_2);
AlleleHelper.instance.set(alleles, EnumBeeChromosome.NOCTURNAL, true);
AlleleHelper.instance.set(alleles, EnumBeeChromosome.FLOWER_PROVIDER, EnumAllele.Flowers.NETHER);
AlleleHelper.instance.set(alleles, EnumBeeChromosome.FLOWERING, EnumAllele.Flowering.AVERAGE);
Allele.helper.set(alleles, EnumBeeChromosome.TEMPERATURE_TOLERANCE, EnumAllele.Tolerance.DOWN_2);
Allele.helper.set(alleles, EnumBeeChromosome.NOCTURNAL, true);
Allele.helper.set(alleles, EnumBeeChromosome.FLOWER_PROVIDER, EnumAllele.Flowers.NETHER);
Allele.helper.set(alleles, EnumBeeChromosome.FLOWERING, EnumAllele.Flowering.AVERAGE);
}
},
AUSTERE("Modapis") {
@Override
protected void setBranchProperties(IAllele[] alleles) {
AlleleHelper.instance.set(alleles, EnumBeeChromosome.TEMPERATURE_TOLERANCE, EnumAllele.Tolerance.BOTH_1);
AlleleHelper.instance.set(alleles, EnumBeeChromosome.HUMIDITY_TOLERANCE, EnumAllele.Tolerance.DOWN_1);
AlleleHelper.instance.set(alleles, EnumBeeChromosome.NOCTURNAL, true);
AlleleHelper.instance.set(alleles, EnumBeeChromosome.FLOWER_PROVIDER, EnumAllele.Flowers.CACTI);
Allele.helper.set(alleles, EnumBeeChromosome.TEMPERATURE_TOLERANCE, EnumAllele.Tolerance.BOTH_1);
Allele.helper.set(alleles, EnumBeeChromosome.HUMIDITY_TOLERANCE, EnumAllele.Tolerance.DOWN_1);
Allele.helper.set(alleles, EnumBeeChromosome.NOCTURNAL, true);
Allele.helper.set(alleles, EnumBeeChromosome.FLOWER_PROVIDER, EnumAllele.Flowers.CACTI);
}
},
TROPICAL("Caldapis") {
@Override
protected void setBranchProperties(IAllele[] alleles) {
AlleleHelper.instance.set(alleles, EnumBeeChromosome.TEMPERATURE_TOLERANCE, EnumAllele.Tolerance.UP_1);
AlleleHelper.instance.set(alleles, EnumBeeChromosome.HUMIDITY_TOLERANCE, EnumAllele.Tolerance.UP_1);
AlleleHelper.instance.set(alleles, EnumBeeChromosome.FLOWER_PROVIDER, EnumAllele.Flowers.JUNGLE);
AlleleHelper.instance.set(alleles, EnumBeeChromosome.EFFECT, AlleleEffect.effectMiasmic);
Allele.helper.set(alleles, EnumBeeChromosome.TEMPERATURE_TOLERANCE, EnumAllele.Tolerance.UP_1);
Allele.helper.set(alleles, EnumBeeChromosome.HUMIDITY_TOLERANCE, EnumAllele.Tolerance.UP_1);
Allele.helper.set(alleles, EnumBeeChromosome.FLOWER_PROVIDER, EnumAllele.Flowers.JUNGLE);
Allele.helper.set(alleles, EnumBeeChromosome.EFFECT, Allele.effectMiasmic);
}
},
END("Finapis") {
@Override
protected void setBranchProperties(IAllele[] alleles) {
AlleleHelper.instance.set(alleles, EnumBeeChromosome.FERTILITY, EnumAllele.Fertility.LOW);
AlleleHelper.instance.set(alleles, EnumBeeChromosome.SPEED, EnumAllele.Speed.SLOWER);
AlleleHelper.instance.set(alleles, EnumBeeChromosome.LIFESPAN, EnumAllele.Lifespan.LONGER);
AlleleHelper.instance.set(alleles, EnumBeeChromosome.TEMPERATURE_TOLERANCE, EnumAllele.Tolerance.UP_1);
AlleleHelper.instance.set(alleles, EnumBeeChromosome.TERRITORY, EnumAllele.Territory.LARGE);
AlleleHelper.instance.set(alleles, EnumBeeChromosome.FLOWER_PROVIDER, EnumAllele.Flowers.END);
AlleleHelper.instance.set(alleles, EnumBeeChromosome.NOCTURNAL, true);
AlleleHelper.instance.set(alleles, EnumBeeChromosome.EFFECT, AlleleEffect.effectMisanthrope);
Allele.helper.set(alleles, EnumBeeChromosome.FERTILITY, EnumAllele.Fertility.LOW);
Allele.helper.set(alleles, EnumBeeChromosome.SPEED, EnumAllele.Speed.SLOWER);
Allele.helper.set(alleles, EnumBeeChromosome.LIFESPAN, EnumAllele.Lifespan.LONGER);
Allele.helper.set(alleles, EnumBeeChromosome.TEMPERATURE_TOLERANCE, EnumAllele.Tolerance.UP_1);
Allele.helper.set(alleles, EnumBeeChromosome.TERRITORY, EnumAllele.Territory.LARGE);
Allele.helper.set(alleles, EnumBeeChromosome.FLOWER_PROVIDER, EnumAllele.Flowers.END);
Allele.helper.set(alleles, EnumBeeChromosome.NOCTURNAL, true);
Allele.helper.set(alleles, EnumBeeChromosome.EFFECT, Allele.effectMisanthrope);
}
},
FROZEN("Coagapis") {
@Override
protected void setBranchProperties(IAllele[] alleles) {
AlleleHelper.instance.set(alleles, EnumBeeChromosome.TEMPERATURE_TOLERANCE, EnumAllele.Tolerance.UP_1);
AlleleHelper.instance.set(alleles, EnumBeeChromosome.HUMIDITY_TOLERANCE, EnumAllele.Tolerance.BOTH_1);
AlleleHelper.instance.set(alleles, EnumBeeChromosome.FLOWER_PROVIDER, EnumAllele.Flowers.SNOW);
AlleleHelper.instance.set(alleles, EnumBeeChromosome.EFFECT, AlleleEffect.effectGlacial);
Allele.helper.set(alleles, EnumBeeChromosome.TEMPERATURE_TOLERANCE, EnumAllele.Tolerance.UP_1);
Allele.helper.set(alleles, EnumBeeChromosome.HUMIDITY_TOLERANCE, EnumAllele.Tolerance.BOTH_1);
Allele.helper.set(alleles, EnumBeeChromosome.FLOWER_PROVIDER, EnumAllele.Flowers.SNOW);
Allele.helper.set(alleles, EnumBeeChromosome.EFFECT, Allele.effectGlacial);
}
},
VENGEFUL("Punapis") {
@Override
protected void setBranchProperties(IAllele[] alleles) {
AlleleHelper.instance.set(alleles, EnumBeeChromosome.TERRITORY, EnumAllele.Territory.LARGEST);
AlleleHelper.instance.set(alleles, EnumBeeChromosome.EFFECT, AlleleEffect.effectRadioactive);
Allele.helper.set(alleles, EnumBeeChromosome.TERRITORY, EnumAllele.Territory.LARGEST);
Allele.helper.set(alleles, EnumBeeChromosome.EFFECT, Allele.effectRadioactive);
}
},
FESTIVE("Festapis") {
@Override
protected void setBranchProperties(IAllele[] alleles) {
AlleleHelper.instance.set(alleles, EnumBeeChromosome.SPEED, EnumAllele.Speed.SLOWER);
AlleleHelper.instance.set(alleles, EnumBeeChromosome.TEMPERATURE_TOLERANCE, EnumAllele.Tolerance.BOTH_2);
AlleleHelper.instance.set(alleles, EnumBeeChromosome.HUMIDITY_TOLERANCE, EnumAllele.Tolerance.BOTH_1);
AlleleHelper.instance.set(alleles, EnumBeeChromosome.LIFESPAN, EnumAllele.Lifespan.NORMAL);
Allele.helper.set(alleles, EnumBeeChromosome.SPEED, EnumAllele.Speed.SLOWER);
Allele.helper.set(alleles, EnumBeeChromosome.TEMPERATURE_TOLERANCE, EnumAllele.Tolerance.BOTH_2);
Allele.helper.set(alleles, EnumBeeChromosome.HUMIDITY_TOLERANCE, EnumAllele.Tolerance.BOTH_1);
Allele.helper.set(alleles, EnumBeeChromosome.LIFESPAN, EnumAllele.Lifespan.NORMAL);
}
},
AGRARIAN("Rustapis") {
@Override
protected void setBranchProperties(IAllele[] alleles) {
AlleleHelper.instance.set(alleles, EnumBeeChromosome.SPEED, EnumAllele.Speed.SLOWER);
AlleleHelper.instance.set(alleles, EnumBeeChromosome.LIFESPAN, EnumAllele.Lifespan.SHORTER);
AlleleHelper.instance.set(alleles, EnumBeeChromosome.FLOWER_PROVIDER, EnumAllele.Flowers.WHEAT);
AlleleHelper.instance.set(alleles, EnumBeeChromosome.FLOWERING, EnumAllele.Flowering.FASTER);
Allele.helper.set(alleles, EnumBeeChromosome.SPEED, EnumAllele.Speed.SLOWER);
Allele.helper.set(alleles, EnumBeeChromosome.LIFESPAN, EnumAllele.Lifespan.SHORTER);
Allele.helper.set(alleles, EnumBeeChromosome.FLOWER_PROVIDER, EnumAllele.Flowers.WHEAT);
Allele.helper.set(alleles, EnumBeeChromosome.FLOWERING, EnumAllele.Flowering.FASTER);
}
},
BOGGY("Paludapis") {
@Override
protected void setBranchProperties(IAllele[] alleles) {
AlleleHelper.instance.set(alleles, EnumBeeChromosome.FLOWER_PROVIDER, EnumAllele.Flowers.MUSHROOMS);
AlleleHelper.instance.set(alleles, EnumBeeChromosome.FLOWERING, EnumAllele.Flowering.SLOWER);
AlleleHelper.instance.set(alleles, EnumBeeChromosome.TEMPERATURE_TOLERANCE, EnumAllele.Tolerance.BOTH_1);
Allele.helper.set(alleles, EnumBeeChromosome.FLOWER_PROVIDER, EnumAllele.Flowers.MUSHROOMS);
Allele.helper.set(alleles, EnumBeeChromosome.FLOWERING, EnumAllele.Flowering.SLOWER);
Allele.helper.set(alleles, EnumBeeChromosome.TEMPERATURE_TOLERANCE, EnumAllele.Tolerance.BOTH_1);
}
},
MONASTIC("Monapis") {
@Override
protected void setBranchProperties(IAllele[] alleles) {
AlleleHelper.instance.set(alleles, EnumBeeChromosome.SPEED, EnumAllele.Speed.SLOWER);
AlleleHelper.instance.set(alleles, EnumBeeChromosome.LIFESPAN, EnumAllele.Lifespan.LONG);
AlleleHelper.instance.set(alleles, EnumBeeChromosome.FERTILITY, EnumAllele.Fertility.LOW);
AlleleHelper.instance.set(alleles, EnumBeeChromosome.FLOWERING, EnumAllele.Flowering.FASTER);
AlleleHelper.instance.set(alleles, EnumBeeChromosome.HUMIDITY_TOLERANCE, EnumAllele.Tolerance.BOTH_1);
AlleleHelper.instance.set(alleles, EnumBeeChromosome.TEMPERATURE_TOLERANCE, EnumAllele.Tolerance.BOTH_1);
AlleleHelper.instance.set(alleles, EnumBeeChromosome.CAVE_DWELLING, true);
AlleleHelper.instance.set(alleles, EnumBeeChromosome.FLOWER_PROVIDER, EnumAllele.Flowers.WHEAT);
Allele.helper.set(alleles, EnumBeeChromosome.SPEED, EnumAllele.Speed.SLOWER);
Allele.helper.set(alleles, EnumBeeChromosome.LIFESPAN, EnumAllele.Lifespan.LONG);
Allele.helper.set(alleles, EnumBeeChromosome.FERTILITY, EnumAllele.Fertility.LOW);
Allele.helper.set(alleles, EnumBeeChromosome.FLOWERING, EnumAllele.Flowering.FASTER);
Allele.helper.set(alleles, EnumBeeChromosome.HUMIDITY_TOLERANCE, EnumAllele.Tolerance.BOTH_1);
Allele.helper.set(alleles, EnumBeeChromosome.TEMPERATURE_TOLERANCE, EnumAllele.Tolerance.BOTH_1);
Allele.helper.set(alleles, EnumBeeChromosome.CAVE_DWELLING, true);
Allele.helper.set(alleles, EnumBeeChromosome.FLOWER_PROVIDER, EnumAllele.Flowers.WHEAT);
}
};
}
;
private final IClassification branch;
BeeBranchDefinition(String scientific) {
branch = BeeManager.beeFactory.createBranch(this.name().toLowerCase(Locale.ENGLISH), scientific);
branch = BeeManager.beeFactory.createBranch(this.name().toLowerCase(), scientific);
}
protected void setBranchProperties(IAllele[] template) {
}
@Override
public final IAllele[] getTemplate() {
IAllele[] template = getDefaultTemplate();
setBranchProperties(template);
return template;
}
@Override
public final IClassification getBranch() {
return branch;
}
@@ -141,18 +137,18 @@ public enum BeeBranchDefinition implements IBranchDefinition {
if (defaultTemplate == null) {
defaultTemplate = new IAllele[EnumBeeChromosome.values().length];
AlleleHelper.instance.set(defaultTemplate, EnumBeeChromosome.SPEED, EnumAllele.Speed.SLOWEST);
AlleleHelper.instance.set(defaultTemplate, EnumBeeChromosome.LIFESPAN, EnumAllele.Lifespan.SHORTER);
AlleleHelper.instance.set(defaultTemplate, EnumBeeChromosome.FERTILITY, EnumAllele.Fertility.NORMAL);
AlleleHelper.instance.set(defaultTemplate, EnumBeeChromosome.TEMPERATURE_TOLERANCE, EnumAllele.Tolerance.NONE);
AlleleHelper.instance.set(defaultTemplate, EnumBeeChromosome.NOCTURNAL, false);
AlleleHelper.instance.set(defaultTemplate, EnumBeeChromosome.HUMIDITY_TOLERANCE, EnumAllele.Tolerance.NONE);
AlleleHelper.instance.set(defaultTemplate, EnumBeeChromosome.TOLERANT_FLYER, false);
AlleleHelper.instance.set(defaultTemplate, EnumBeeChromosome.CAVE_DWELLING, false);
AlleleHelper.instance.set(defaultTemplate, EnumBeeChromosome.FLOWER_PROVIDER, EnumAllele.Flowers.VANILLA);
AlleleHelper.instance.set(defaultTemplate, EnumBeeChromosome.FLOWERING, EnumAllele.Flowering.SLOWEST);
AlleleHelper.instance.set(defaultTemplate, EnumBeeChromosome.TERRITORY, EnumAllele.Territory.AVERAGE);
AlleleHelper.instance.set(defaultTemplate, EnumBeeChromosome.EFFECT, AlleleEffect.effectNone);
Allele.helper.set(defaultTemplate, EnumBeeChromosome.SPEED, EnumAllele.Speed.SLOWEST);
Allele.helper.set(defaultTemplate, EnumBeeChromosome.LIFESPAN, EnumAllele.Lifespan.SHORTER);
Allele.helper.set(defaultTemplate, EnumBeeChromosome.FERTILITY, EnumAllele.Fertility.NORMAL);
Allele.helper.set(defaultTemplate, EnumBeeChromosome.TEMPERATURE_TOLERANCE, EnumAllele.Tolerance.NONE);
Allele.helper.set(defaultTemplate, EnumBeeChromosome.NOCTURNAL, false);
Allele.helper.set(defaultTemplate, EnumBeeChromosome.HUMIDITY_TOLERANCE, EnumAllele.Tolerance.NONE);
Allele.helper.set(defaultTemplate, EnumBeeChromosome.TOLERANT_FLYER, false);
Allele.helper.set(defaultTemplate, EnumBeeChromosome.CAVE_DWELLING, false);
Allele.helper.set(defaultTemplate, EnumBeeChromosome.FLOWER_PROVIDER, EnumAllele.Flowers.VANILLA);
Allele.helper.set(defaultTemplate, EnumBeeChromosome.FLOWERING, EnumAllele.Flowering.SLOWEST);
Allele.helper.set(defaultTemplate, EnumBeeChromosome.TERRITORY, EnumAllele.Territory.AVERAGE);
Allele.helper.set(defaultTemplate, EnumBeeChromosome.EFFECT, Allele.effectNone);
}
return Arrays.copyOf(defaultTemplate, defaultTemplate.length);
}
@@ -1,13 +1,3 @@
/*******************************************************************************
* Copyright (c) 2011-2014 SirSengir.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU Lesser Public License v3
* which accompanies this distribution, and is available at
* http://www.gnu.org/licenses/lgpl-3.0.txt
*
* Various Contributors including, but not limited to:
* SirSengir (original work), CovertJaguar, Player, Binnie, MysteriousAges
******************************************************************************/
package forestry.apiculture.genetics;
import java.awt.Color;
@@ -32,26 +22,22 @@ import forestry.api.apiculture.IBeeMutationCustom;
import forestry.api.core.EnumHumidity;
import forestry.api.core.EnumTemperature;
import forestry.api.genetics.IAllele;
import forestry.apiculture.genetics.alleles.AlleleEffect;
import forestry.apiculture.items.EnumHoneyComb;
import forestry.apiculture.items.EnumPollenCluster;
import forestry.core.genetics.alleles.AlleleHelper;
import forestry.core.config.ForestryItem;
import forestry.core.genetics.alleles.Allele;
import forestry.core.genetics.alleles.EnumAllele;
import forestry.plugins.PluginApiculture;
import forestry.plugins.PluginCore;
public enum BeeDefinition implements IBeeDefinition {
/* HONEY BRANCH */
FOREST(BeeBranchDefinition.HONEY, "nigrocincta", true, new Color(0x19d0ec), new Color(0xffdc16)) {
@Override
protected void setSpeciesProperties(IAlleleBeeSpeciesCustom beeSpecies) {
beeSpecies.addProduct(PluginApiculture.items.beeComb.get(EnumHoneyComb.HONEY, 1), 0.30f);
beeSpecies.addProduct(ForestryItem.beeComb.getItemStack(1, 0), 0.30f);
}
@Override
protected void setAlleles(IAllele[] template) {
AlleleHelper.instance.set(template, EnumBeeChromosome.FLOWERING, EnumAllele.Flowering.SLOWER);
AlleleHelper.instance.set(template, EnumBeeChromosome.FERTILITY, EnumAllele.Fertility.HIGH);
Allele.helper.set(template, EnumBeeChromosome.FLOWERING, EnumAllele.Flowering.SLOWER);
Allele.helper.set(template, EnumBeeChromosome.FERTILITY, EnumAllele.Fertility.HIGH);
}
@Override
@@ -62,12 +48,12 @@ public enum BeeDefinition implements IBeeDefinition {
MEADOWS(BeeBranchDefinition.HONEY, "florea", true, new Color(0xef131e), new Color(0xffdc16)) {
@Override
protected void setSpeciesProperties(IAlleleBeeSpeciesCustom beeSpecies) {
beeSpecies.addProduct(PluginApiculture.items.beeComb.get(EnumHoneyComb.HONEY, 1), 0.30f);
beeSpecies.addProduct(ForestryItem.beeComb.getItemStack(1, 0), 0.30f);
}
@Override
protected void setAlleles(IAllele[] template) {
AlleleHelper.instance.set(template, EnumBeeChromosome.FLOWERING, EnumAllele.Flowering.SLOWER);
Allele.helper.set(template, EnumBeeChromosome.FLOWERING, EnumAllele.Flowering.SLOWER);
}
@Override
@@ -78,19 +64,19 @@ public enum BeeDefinition implements IBeeDefinition {
COMMON(BeeBranchDefinition.HONEY, "cerana", true, new Color(0xb2b2b2), new Color(0xffdc16)) {
@Override
protected void setSpeciesProperties(IAlleleBeeSpeciesCustom beeSpecies) {
beeSpecies.addProduct(PluginApiculture.items.beeComb.get(EnumHoneyComb.HONEY, 1), 0.35f);
beeSpecies.addProduct(ForestryItem.beeComb.getItemStack(1, 0), 0.35f);
}
@Override
protected void setAlleles(IAllele[] template) {
AlleleHelper.instance.set(template, EnumBeeChromosome.SPEED, EnumAllele.Speed.SLOWER);
Allele.helper.set(template, EnumBeeChromosome.SPEED, EnumAllele.Speed.SLOWER);
}
@Override
protected void registerMutations() {
for (BeeDefinition hiveBee0 : overworldHiveBees) {
for (BeeDefinition hiveBee1 : overworldHiveBees) {
if (hiveBee0.ordinal() < hiveBee1.ordinal()) {
if (hiveBee0 != hiveBee1) {
registerMutation(hiveBee0, hiveBee1, 15);
}
}
@@ -100,13 +86,13 @@ public enum BeeDefinition implements IBeeDefinition {
CULTIVATED(BeeBranchDefinition.HONEY, "mellifera", true, new Color(0x5734ec), new Color(0xffdc16)) {
@Override
protected void setSpeciesProperties(IAlleleBeeSpeciesCustom beeSpecies) {
beeSpecies.addProduct(PluginApiculture.items.beeComb.get(EnumHoneyComb.HONEY, 1), 0.40f);
beeSpecies.addProduct(ForestryItem.beeComb.getItemStack(1, 0), 0.40f);
}
@Override
protected void setAlleles(IAllele[] template) {
AlleleHelper.instance.set(template, EnumBeeChromosome.SPEED, EnumAllele.Speed.FAST);
AlleleHelper.instance.set(template, EnumBeeChromosome.LIFESPAN, EnumAllele.Lifespan.SHORTEST);
Allele.helper.set(template, EnumBeeChromosome.SPEED, EnumAllele.Speed.FAST);
Allele.helper.set(template, EnumBeeChromosome.LIFESPAN, EnumAllele.Lifespan.SHORTEST);
}
@Override
@@ -121,14 +107,14 @@ public enum BeeDefinition implements IBeeDefinition {
NOBLE(BeeBranchDefinition.NOBLE, "nobilis", false, new Color(0xec9a19), new Color(0xffdc16)) {
@Override
protected void setSpeciesProperties(IAlleleBeeSpeciesCustom beeSpecies) {
beeSpecies.addProduct(PluginApiculture.items.beeComb.get(EnumHoneyComb.DRIPPING, 1), 0.20f);
beeSpecies.addProduct(ForestryItem.beeComb.getItemStack(1, 5), 0.20f);
}
@Override
protected void setAlleles(IAllele[] template) {
AlleleHelper.instance.set(template, EnumBeeChromosome.SPEED, EnumAllele.Speed.SLOWER);
AlleleHelper.instance.set(template, EnumBeeChromosome.LIFESPAN, EnumAllele.Lifespan.SHORT);
AlleleHelper.instance.set(template, EnumBeeChromosome.FLOWERING, EnumAllele.Flowering.SLOW);
Allele.helper.set(template, EnumBeeChromosome.SPEED, EnumAllele.Speed.SLOWER);
Allele.helper.set(template, EnumBeeChromosome.LIFESPAN, EnumAllele.Lifespan.SHORT);
Allele.helper.set(template, EnumBeeChromosome.FLOWERING, EnumAllele.Flowering.SLOW);
}
@Override
@@ -139,14 +125,14 @@ public enum BeeDefinition implements IBeeDefinition {
MAJESTIC(BeeBranchDefinition.NOBLE, "regalis", true, new Color(0x7f0000), new Color(0xffdc16)) {
@Override
protected void setSpeciesProperties(IAlleleBeeSpeciesCustom beeSpecies) {
beeSpecies.addProduct(PluginApiculture.items.beeComb.get(EnumHoneyComb.DRIPPING, 1), 0.30f);
beeSpecies.addProduct(ForestryItem.beeComb.getItemStack(1, 5), 0.30f);
}
@Override
protected void setAlleles(IAllele[] template) {
AlleleHelper.instance.set(template, EnumBeeChromosome.SPEED, EnumAllele.Speed.NORMAL);
AlleleHelper.instance.set(template, EnumBeeChromosome.LIFESPAN, EnumAllele.Lifespan.SHORTENED);
AlleleHelper.instance.set(template, EnumBeeChromosome.FERTILITY, EnumAllele.Fertility.MAXIMUM);
Allele.helper.set(template, EnumBeeChromosome.SPEED, EnumAllele.Speed.NORMAL);
Allele.helper.set(template, EnumBeeChromosome.LIFESPAN, EnumAllele.Lifespan.SHORTENED);
Allele.helper.set(template, EnumBeeChromosome.FERTILITY, EnumAllele.Fertility.MAXIMUM);
}
@Override
@@ -157,16 +143,16 @@ public enum BeeDefinition implements IBeeDefinition {
IMPERIAL(BeeBranchDefinition.NOBLE, "imperatorius", false, new Color(0xa3e02f), new Color(0xffdc16)) {
@Override
protected void setSpeciesProperties(IAlleleBeeSpeciesCustom beeSpecies) {
beeSpecies.addProduct(PluginApiculture.items.beeComb.get(EnumHoneyComb.DRIPPING, 1), 0.20f)
.addProduct(PluginApiculture.items.royalJelly.getItemStack(), 0.15f)
beeSpecies.addProduct(ForestryItem.beeComb.getItemStack(1, 5), 0.20f)
.addProduct(ForestryItem.royalJelly.getItemStack(), 0.15f)
.setHasEffect();
}
@Override
protected void setAlleles(IAllele[] template) {
AlleleHelper.instance.set(template, EnumBeeChromosome.SPEED, EnumAllele.Speed.SLOWER);
AlleleHelper.instance.set(template, EnumBeeChromosome.LIFESPAN, EnumAllele.Lifespan.NORMAL);
AlleleHelper.instance.set(template, EnumBeeChromosome.EFFECT, AlleleEffect.effectBeatific);
Allele.helper.set(template, EnumBeeChromosome.SPEED, EnumAllele.Speed.SLOWER);
Allele.helper.set(template, EnumBeeChromosome.LIFESPAN, EnumAllele.Lifespan.NORMAL);
Allele.helper.set(template, EnumBeeChromosome.EFFECT, Allele.effectBeatific);
}
@Override
@@ -179,14 +165,14 @@ public enum BeeDefinition implements IBeeDefinition {
DILIGENT(BeeBranchDefinition.INDUSTRIOUS, "sedulus", false, new Color(0xc219ec), new Color(0xffdc16)) {
@Override
protected void setSpeciesProperties(IAlleleBeeSpeciesCustom beeSpecies) {
beeSpecies.addProduct(PluginApiculture.items.beeComb.get(EnumHoneyComb.STRINGY, 1), 0.20f);
beeSpecies.addProduct(ForestryItem.beeComb.getItemStack(1, 3), 0.20f);
}
@Override
protected void setAlleles(IAllele[] template) {
AlleleHelper.instance.set(template, EnumBeeChromosome.SPEED, EnumAllele.Speed.SLOWER);
AlleleHelper.instance.set(template, EnumBeeChromosome.LIFESPAN, EnumAllele.Lifespan.SHORT);
AlleleHelper.instance.set(template, EnumBeeChromosome.FLOWERING, EnumAllele.Flowering.SLOW);
Allele.helper.set(template, EnumBeeChromosome.SPEED, EnumAllele.Speed.SLOWER);
Allele.helper.set(template, EnumBeeChromosome.LIFESPAN, EnumAllele.Lifespan.SHORT);
Allele.helper.set(template, EnumBeeChromosome.FLOWERING, EnumAllele.Flowering.SLOW);
}
@Override
@@ -197,13 +183,13 @@ public enum BeeDefinition implements IBeeDefinition {
UNWEARY(BeeBranchDefinition.INDUSTRIOUS, "assiduus", true, new Color(0x19ec5a), new Color(0xffdc16)) {
@Override
protected void setSpeciesProperties(IAlleleBeeSpeciesCustom beeSpecies) {
beeSpecies.addProduct(PluginApiculture.items.beeComb.get(EnumHoneyComb.STRINGY, 1), 0.30f);
beeSpecies.addProduct(ForestryItem.beeComb.getItemStack(1, 3), 0.30f);
}
@Override
protected void setAlleles(IAllele[] template) {
AlleleHelper.instance.set(template, EnumBeeChromosome.SPEED, EnumAllele.Speed.NORMAL);
AlleleHelper.instance.set(template, EnumBeeChromosome.LIFESPAN, EnumAllele.Lifespan.SHORTENED);
Allele.helper.set(template, EnumBeeChromosome.SPEED, EnumAllele.Speed.NORMAL);
Allele.helper.set(template, EnumBeeChromosome.LIFESPAN, EnumAllele.Lifespan.SHORTENED);
}
@Override
@@ -214,16 +200,16 @@ public enum BeeDefinition implements IBeeDefinition {
INDUSTRIOUS(BeeBranchDefinition.INDUSTRIOUS, "industria", false, new Color(0xffffff), new Color(0xffdc16)) {
@Override
protected void setSpeciesProperties(IAlleleBeeSpeciesCustom beeSpecies) {
beeSpecies.addProduct(PluginApiculture.items.beeComb.get(EnumHoneyComb.STRINGY, 1), 0.20f)
.addProduct(PluginApiculture.items.pollenCluster.get(EnumPollenCluster.NORMAL, 1), 0.15f)
beeSpecies.addProduct(ForestryItem.beeComb.getItemStack(1, 3), 0.20f)
.addProduct(ForestryItem.pollenCluster.getItemStack(), 0.15f)
.setHasEffect();
}
@Override
protected void setAlleles(IAllele[] template) {
AlleleHelper.instance.set(template, EnumBeeChromosome.SPEED, EnumAllele.Speed.SLOWER);
AlleleHelper.instance.set(template, EnumBeeChromosome.LIFESPAN, EnumAllele.Lifespan.NORMAL);
AlleleHelper.instance.set(template, EnumBeeChromosome.FLOWERING, EnumAllele.Flowering.FAST);
Allele.helper.set(template, EnumBeeChromosome.SPEED, EnumAllele.Speed.SLOWER);
Allele.helper.set(template, EnumBeeChromosome.LIFESPAN, EnumAllele.Lifespan.NORMAL);
Allele.helper.set(template, EnumBeeChromosome.FLOWERING, EnumAllele.Flowering.FAST);
}
@Override
@@ -236,16 +222,16 @@ public enum BeeDefinition implements IBeeDefinition {
STEADFAST(BeeBranchDefinition.HEROIC, "legio", false, new Color(0x4d2b15), new Color(0xffdc16)) {
@Override
protected void setSpeciesProperties(IAlleleBeeSpeciesCustom beeSpecies) {
beeSpecies.addProduct(PluginApiculture.items.beeComb.get(EnumHoneyComb.COCOA, 1), 0.20f)
beeSpecies.addProduct(ForestryItem.beeComb.getItemStack(1, 1), 0.20f)
.setHasEffect();
}
@Override
protected void setAlleles(IAllele[] template) {
AlleleHelper.instance.set(template, EnumBeeChromosome.SPEED, EnumAllele.Speed.SLOWER);
AlleleHelper.instance.set(template, EnumBeeChromosome.LIFESPAN, EnumAllele.Lifespan.NORMAL);
AlleleHelper.instance.set(template, EnumBeeChromosome.NOCTURNAL, true);
AlleleHelper.instance.set(template, EnumBeeChromosome.CAVE_DWELLING, true);
Allele.helper.set(template, EnumBeeChromosome.SPEED, EnumAllele.Speed.SLOWER);
Allele.helper.set(template, EnumBeeChromosome.LIFESPAN, EnumAllele.Lifespan.NORMAL);
Allele.helper.set(template, EnumBeeChromosome.NOCTURNAL, true);
Allele.helper.set(template, EnumBeeChromosome.CAVE_DWELLING, true);
}
@Override
@@ -256,16 +242,16 @@ public enum BeeDefinition implements IBeeDefinition {
VALIANT(BeeBranchDefinition.HEROIC, "centurio", true, new Color(0x626bdd), new Color(0xffdc16)) {
@Override
protected void setSpeciesProperties(IAlleleBeeSpeciesCustom beeSpecies) {
beeSpecies.addProduct(PluginApiculture.items.beeComb.get(EnumHoneyComb.COCOA, 1), 0.30f)
beeSpecies.addProduct(ForestryItem.beeComb.getItemStack(1, 1), 0.30f)
.addSpecialty(new ItemStack(Items.sugar), 0.15f);
}
@Override
protected void setAlleles(IAllele[] template) {
AlleleHelper.instance.set(template, EnumBeeChromosome.SPEED, EnumAllele.Speed.SLOW);
AlleleHelper.instance.set(template, EnumBeeChromosome.LIFESPAN, EnumAllele.Lifespan.LONG);
AlleleHelper.instance.set(template, EnumBeeChromosome.NOCTURNAL, true);
AlleleHelper.instance.set(template, EnumBeeChromosome.CAVE_DWELLING, true);
Allele.helper.set(template, EnumBeeChromosome.SPEED, EnumAllele.Speed.SLOW);
Allele.helper.set(template, EnumBeeChromosome.LIFESPAN, EnumAllele.Lifespan.LONG);
Allele.helper.set(template, EnumBeeChromosome.NOCTURNAL, true);
Allele.helper.set(template, EnumBeeChromosome.CAVE_DWELLING, true);
}
@Override
@@ -276,17 +262,17 @@ public enum BeeDefinition implements IBeeDefinition {
HEROIC(BeeBranchDefinition.HEROIC, "kraphti", false, new Color(0xb3d5e4), new Color(0xffdc16)) {
@Override
protected void setSpeciesProperties(IAlleleBeeSpeciesCustom beeSpecies) {
beeSpecies.addProduct(PluginApiculture.items.beeComb.get(EnumHoneyComb.COCOA, 1), 0.40f)
beeSpecies.addProduct(ForestryItem.beeComb.getItemStack(1, 1), 0.40f)
.setHasEffect();
}
@Override
protected void setAlleles(IAllele[] template) {
AlleleHelper.instance.set(template, EnumBeeChromosome.SPEED, EnumAllele.Speed.SLOW);
AlleleHelper.instance.set(template, EnumBeeChromosome.LIFESPAN, EnumAllele.Lifespan.LONG);
AlleleHelper.instance.set(template, EnumBeeChromosome.NOCTURNAL, true);
AlleleHelper.instance.set(template, EnumBeeChromosome.CAVE_DWELLING, true);
AlleleHelper.instance.set(template, EnumBeeChromosome.EFFECT, AlleleEffect.effectHeroic);
Allele.helper.set(template, EnumBeeChromosome.SPEED, EnumAllele.Speed.SLOW);
Allele.helper.set(template, EnumBeeChromosome.LIFESPAN, EnumAllele.Lifespan.LONG);
Allele.helper.set(template, EnumBeeChromosome.NOCTURNAL, true);
Allele.helper.set(template, EnumBeeChromosome.CAVE_DWELLING, true);
Allele.helper.set(template, EnumBeeChromosome.EFFECT, Allele.effectHeroic);
}
@Override
@@ -300,16 +286,16 @@ public enum BeeDefinition implements IBeeDefinition {
SINISTER(BeeBranchDefinition.INFERNAL, "caecus", false, new Color(0xb3d5e4), new Color(0x9a2323)) {
@Override
protected void setSpeciesProperties(IAlleleBeeSpeciesCustom beeSpecies) {
beeSpecies.addProduct(PluginApiculture.items.beeComb.get(EnumHoneyComb.SIMMERING, 1), 0.45f)
beeSpecies.addProduct(ForestryItem.beeComb.getItemStack(1, 2), 0.45f)
.setTemperature(EnumTemperature.HELLISH)
.setHumidity(EnumHumidity.ARID);
}
@Override
protected void setAlleles(IAllele[] template) {
AlleleHelper.instance.set(template, EnumBeeChromosome.SPEED, EnumAllele.Speed.SLOWER);
AlleleHelper.instance.set(template, EnumBeeChromosome.LIFESPAN, EnumAllele.Lifespan.NORMAL);
AlleleHelper.instance.set(template, EnumBeeChromosome.EFFECT, AlleleEffect.effectAggressive);
Allele.helper.set(template, EnumBeeChromosome.SPEED, EnumAllele.Speed.SLOWER);
Allele.helper.set(template, EnumBeeChromosome.LIFESPAN, EnumAllele.Lifespan.NORMAL);
Allele.helper.set(template, EnumBeeChromosome.EFFECT, Allele.effectAggressive);
}
@Override
@@ -323,17 +309,17 @@ public enum BeeDefinition implements IBeeDefinition {
FIENDISH(BeeBranchDefinition.INFERNAL, "diabolus", true, new Color(0xd7bee5), new Color(0x9a2323)) {
@Override
protected void setSpeciesProperties(IAlleleBeeSpeciesCustom beeSpecies) {
beeSpecies.addProduct(PluginApiculture.items.beeComb.get(EnumHoneyComb.SIMMERING, 1), 0.55f)
.addProduct(PluginCore.items.ash.getItemStack(), 0.15f)
beeSpecies.addProduct(ForestryItem.beeComb.getItemStack(1, 2), 0.55f)
.addProduct(ForestryItem.ash.getItemStack(), 0.15f)
.setTemperature(EnumTemperature.HELLISH)
.setHumidity(EnumHumidity.ARID);
}
@Override
protected void setAlleles(IAllele[] template) {
AlleleHelper.instance.set(template, EnumBeeChromosome.SPEED, EnumAllele.Speed.NORMAL);
AlleleHelper.instance.set(template, EnumBeeChromosome.LIFESPAN, EnumAllele.Lifespan.LONG);
AlleleHelper.instance.set(template, EnumBeeChromosome.EFFECT, AlleleEffect.effectAggressive);
Allele.helper.set(template, EnumBeeChromosome.SPEED, EnumAllele.Speed.NORMAL);
Allele.helper.set(template, EnumBeeChromosome.LIFESPAN, EnumAllele.Lifespan.LONG);
Allele.helper.set(template, EnumBeeChromosome.EFFECT, Allele.effectAggressive);
}
@Override
@@ -347,7 +333,7 @@ public enum BeeDefinition implements IBeeDefinition {
DEMONIC(BeeBranchDefinition.INFERNAL, "draco", false, new Color(0xf4e400), new Color(0x9a2323)) {
@Override
protected void setSpeciesProperties(IAlleleBeeSpeciesCustom beeSpecies) {
beeSpecies.addProduct(PluginApiculture.items.beeComb.get(EnumHoneyComb.SIMMERING, 1), 0.45f)
beeSpecies.addProduct(ForestryItem.beeComb.getItemStack(1, 2), 0.45f)
.addProduct(new ItemStack(Items.glowstone_dust), 0.15f)
.setHasEffect()
.setTemperature(EnumTemperature.HELLISH)
@@ -356,9 +342,9 @@ public enum BeeDefinition implements IBeeDefinition {
@Override
protected void setAlleles(IAllele[] template) {
AlleleHelper.instance.set(template, EnumBeeChromosome.SPEED, EnumAllele.Speed.SLOWER);
AlleleHelper.instance.set(template, EnumBeeChromosome.LIFESPAN, EnumAllele.Lifespan.LONGER);
AlleleHelper.instance.set(template, EnumBeeChromosome.EFFECT, AlleleEffect.effectIgnition);
Allele.helper.set(template, EnumBeeChromosome.SPEED, EnumAllele.Speed.SLOWER);
Allele.helper.set(template, EnumBeeChromosome.LIFESPAN, EnumAllele.Lifespan.LONGER);
Allele.helper.set(template, EnumBeeChromosome.EFFECT, Allele.effectIgnition);
}
@Override
@@ -372,15 +358,15 @@ public enum BeeDefinition implements IBeeDefinition {
MODEST(BeeBranchDefinition.AUSTERE, "modicus", false, new Color(0xc5be86), new Color(0xffdc16)) {
@Override
protected void setSpeciesProperties(IAlleleBeeSpeciesCustom beeSpecies) {
beeSpecies.addProduct(PluginApiculture.items.beeComb.get(EnumHoneyComb.PARCHED, 1), 0.20f)
beeSpecies.addProduct(ForestryItem.beeComb.getItemStack(1, 7), 0.20f)
.setTemperature(EnumTemperature.HOT)
.setHumidity(EnumHumidity.ARID);
}
@Override
protected void setAlleles(IAllele[] template) {
AlleleHelper.instance.set(template, EnumBeeChromosome.SPEED, EnumAllele.Speed.SLOWER);
AlleleHelper.instance.set(template, EnumBeeChromosome.LIFESPAN, EnumAllele.Lifespan.SHORT);
Allele.helper.set(template, EnumBeeChromosome.SPEED, EnumAllele.Speed.SLOWER);
Allele.helper.set(template, EnumBeeChromosome.LIFESPAN, EnumAllele.Lifespan.SHORT);
}
@Override
@@ -391,15 +377,15 @@ public enum BeeDefinition implements IBeeDefinition {
FRUGAL(BeeBranchDefinition.AUSTERE, "permodestus", true, new Color(0xe8dcb1), new Color(0xffdc16)) {
@Override
protected void setSpeciesProperties(IAlleleBeeSpeciesCustom beeSpecies) {
beeSpecies.addProduct(PluginApiculture.items.beeComb.get(EnumHoneyComb.PARCHED, 1), 0.30f)
beeSpecies.addProduct(ForestryItem.beeComb.getItemStack(1, 7), 0.30f)
.setTemperature(EnumTemperature.HOT)
.setHumidity(EnumHumidity.ARID);
}
@Override
protected void setAlleles(IAllele[] template) {
AlleleHelper.instance.set(template, EnumBeeChromosome.SPEED, EnumAllele.Speed.NORMAL);
AlleleHelper.instance.set(template, EnumBeeChromosome.LIFESPAN, EnumAllele.Lifespan.LONG);
Allele.helper.set(template, EnumBeeChromosome.SPEED, EnumAllele.Speed.NORMAL);
Allele.helper.set(template, EnumBeeChromosome.LIFESPAN, EnumAllele.Lifespan.LONG);
}
@Override
@@ -415,8 +401,8 @@ public enum BeeDefinition implements IBeeDefinition {
AUSTERE(BeeBranchDefinition.AUSTERE, "correpere", false, new Color(0xfffac2), new Color(0xffdc16)) {
@Override
protected void setSpeciesProperties(IAlleleBeeSpeciesCustom beeSpecies) {
beeSpecies.addProduct(PluginApiculture.items.beeComb.get(EnumHoneyComb.PARCHED, 1), 0.20f)
.addSpecialty(PluginApiculture.items.beeComb.get(EnumHoneyComb.POWDERY, 1), 0.50f)
beeSpecies.addProduct(ForestryItem.beeComb.getItemStack(1, 7), 0.20f)
.addSpecialty(ForestryItem.beeComb.getItemStack(1, 10), 0.50f)
.setHasEffect()
.setTemperature(EnumTemperature.HOT)
.setHumidity(EnumHumidity.ARID);
@@ -424,10 +410,10 @@ public enum BeeDefinition implements IBeeDefinition {
@Override
protected void setAlleles(IAllele[] template) {
AlleleHelper.instance.set(template, EnumBeeChromosome.SPEED, EnumAllele.Speed.SLOWEST);
AlleleHelper.instance.set(template, EnumBeeChromosome.LIFESPAN, EnumAllele.Lifespan.LONGER);
AlleleHelper.instance.set(template, EnumBeeChromosome.TEMPERATURE_TOLERANCE, EnumAllele.Tolerance.DOWN_2);
AlleleHelper.instance.set(template, EnumBeeChromosome.EFFECT, AlleleEffect.effectCreeper);
Allele.helper.set(template, EnumBeeChromosome.SPEED, EnumAllele.Speed.SLOWEST);
Allele.helper.set(template, EnumBeeChromosome.LIFESPAN, EnumAllele.Lifespan.LONGER);
Allele.helper.set(template, EnumBeeChromosome.TEMPERATURE_TOLERANCE, EnumAllele.Tolerance.DOWN_2);
Allele.helper.set(template, EnumBeeChromosome.EFFECT, Allele.effectCreeper);
}
@Override
@@ -442,15 +428,15 @@ public enum BeeDefinition implements IBeeDefinition {
TROPICAL(BeeBranchDefinition.TROPICAL, "mendelia", false, new Color(0x378020), new Color(0xffdc16)) {
@Override
protected void setSpeciesProperties(IAlleleBeeSpeciesCustom beeSpecies) {
beeSpecies.addProduct(PluginApiculture.items.beeComb.get(EnumHoneyComb.SILKY, 1), 0.20f)
beeSpecies.addProduct(ForestryItem.beeComb.getItemStack(1, 6), 0.20f)
.setTemperature(EnumTemperature.WARM)
.setHumidity(EnumHumidity.DAMP);
}
@Override
protected void setAlleles(IAllele[] template) {
AlleleHelper.instance.set(template, EnumBeeChromosome.SPEED, EnumAllele.Speed.SLOWER);
AlleleHelper.instance.set(template, EnumBeeChromosome.LIFESPAN, EnumAllele.Lifespan.SHORT);
Allele.helper.set(template, EnumBeeChromosome.SPEED, EnumAllele.Speed.SLOWER);
Allele.helper.set(template, EnumBeeChromosome.LIFESPAN, EnumAllele.Lifespan.SHORT);
}
@Override
@@ -461,15 +447,15 @@ public enum BeeDefinition implements IBeeDefinition {
EXOTIC(BeeBranchDefinition.TROPICAL, "darwini", true, new Color(0x304903), new Color(0xffdc16)) {
@Override
protected void setSpeciesProperties(IAlleleBeeSpeciesCustom beeSpecies) {
beeSpecies.addProduct(PluginApiculture.items.beeComb.get(EnumHoneyComb.SILKY, 1), 0.30f)
beeSpecies.addProduct(ForestryItem.beeComb.getItemStack(1, 6), 0.30f)
.setTemperature(EnumTemperature.WARM)
.setHumidity(EnumHumidity.DAMP);
}
@Override
protected void setAlleles(IAllele[] template) {
AlleleHelper.instance.set(template, EnumBeeChromosome.SPEED, EnumAllele.Speed.NORMAL);
AlleleHelper.instance.set(template, EnumBeeChromosome.LIFESPAN, EnumAllele.Lifespan.LONG);
Allele.helper.set(template, EnumBeeChromosome.SPEED, EnumAllele.Speed.NORMAL);
Allele.helper.set(template, EnumBeeChromosome.LIFESPAN, EnumAllele.Lifespan.LONG);
}
@Override
@@ -480,7 +466,7 @@ public enum BeeDefinition implements IBeeDefinition {
EDENIC(BeeBranchDefinition.TROPICAL, "humboldti", false, new Color(0x393d0d), new Color(0xffdc16)) {
@Override
protected void setSpeciesProperties(IAlleleBeeSpeciesCustom beeSpecies) {
beeSpecies.addProduct(PluginApiculture.items.beeComb.get(EnumHoneyComb.SILKY, 1), 0.20f)
beeSpecies.addProduct(ForestryItem.beeComb.getItemStack(1, 6), 0.20f)
.setHasEffect()
.setTemperature(EnumTemperature.WARM)
.setHumidity(EnumHumidity.DAMP);
@@ -488,10 +474,10 @@ public enum BeeDefinition implements IBeeDefinition {
@Override
protected void setAlleles(IAllele[] template) {
AlleleHelper.instance.set(template, EnumBeeChromosome.SPEED, EnumAllele.Speed.SLOWEST);
AlleleHelper.instance.set(template, EnumBeeChromosome.LIFESPAN, EnumAllele.Lifespan.LONGER);
AlleleHelper.instance.set(template, EnumBeeChromosome.TEMPERATURE_TOLERANCE, EnumAllele.Tolerance.BOTH_2);
AlleleHelper.instance.set(template, EnumBeeChromosome.EFFECT, AlleleEffect.effectExploration);
Allele.helper.set(template, EnumBeeChromosome.SPEED, EnumAllele.Speed.SLOWEST);
Allele.helper.set(template, EnumBeeChromosome.LIFESPAN, EnumAllele.Lifespan.LONGER);
Allele.helper.set(template, EnumBeeChromosome.TEMPERATURE_TOLERANCE, EnumAllele.Tolerance.BOTH_2);
Allele.helper.set(template, EnumBeeChromosome.EFFECT, Allele.effectExploration);
}
@Override
@@ -504,7 +490,7 @@ public enum BeeDefinition implements IBeeDefinition {
ENDED(BeeBranchDefinition.END, "notchi", false, new Color(0xe079fa), new Color(0xd9de9e)) {
@Override
protected void setSpeciesProperties(IAlleleBeeSpeciesCustom beeSpecies) {
beeSpecies.addProduct(PluginApiculture.items.beeComb.get(EnumHoneyComb.MYSTERIOUS, 1), 0.30f)
beeSpecies.addProduct(ForestryItem.beeComb.getItemStack(1, 8), 0.30f)
.setTemperature(EnumTemperature.COLD);
}
@@ -519,15 +505,16 @@ public enum BeeDefinition implements IBeeDefinition {
}
},
SPECTRAL(BeeBranchDefinition.END, "idolum", true, new Color(0xa98bed), new Color(0xd9de9e)) {
@Override
protected void setSpeciesProperties(IAlleleBeeSpeciesCustom beeSpecies) {
beeSpecies.addProduct(PluginApiculture.items.beeComb.get(EnumHoneyComb.MYSTERIOUS, 1), 0.50f)
beeSpecies.addProduct(ForestryItem.beeComb.getItemStack(1, 8), 0.50f)
.setTemperature(EnumTemperature.COLD);
}
@Override
protected void setAlleles(IAllele[] template) {
AlleleHelper.instance.set(template, EnumBeeChromosome.EFFECT, AlleleEffect.effectReanimation);
Allele.helper.set(template, EnumBeeChromosome.EFFECT, Allele.effectReanimation);
}
@Override
@@ -536,18 +523,19 @@ public enum BeeDefinition implements IBeeDefinition {
}
},
PHANTASMAL(BeeBranchDefinition.END, "lemur", false, new Color(0xcc00fa), new Color(0xd9de9e)) {
@Override
protected void setSpeciesProperties(IAlleleBeeSpeciesCustom beeSpecies) {
beeSpecies.addProduct(PluginApiculture.items.beeComb.get(EnumHoneyComb.MYSTERIOUS, 1), 0.40f)
beeSpecies.addProduct(ForestryItem.beeComb.getItemStack(1, 8), 0.40f)
.setHasEffect()
.setTemperature(EnumTemperature.COLD);
}
@Override
protected void setAlleles(IAllele[] template) {
AlleleHelper.instance.set(template, EnumBeeChromosome.SPEED, EnumAllele.Speed.SLOWEST);
AlleleHelper.instance.set(template, EnumBeeChromosome.LIFESPAN, EnumAllele.Lifespan.LONGEST);
AlleleHelper.instance.set(template, EnumBeeChromosome.EFFECT, AlleleEffect.effectResurrection);
Allele.helper.set(template, EnumBeeChromosome.SPEED, EnumAllele.Speed.SLOWEST);
Allele.helper.set(template, EnumBeeChromosome.LIFESPAN, EnumAllele.Lifespan.LONGEST);
Allele.helper.set(template, EnumBeeChromosome.EFFECT, Allele.effectResurrection);
}
@Override
@@ -560,15 +548,15 @@ public enum BeeDefinition implements IBeeDefinition {
WINTRY(BeeBranchDefinition.FROZEN, "brumalis", false, new Color(0xa0ffc8), new Color(0xdaf5f3)) {
@Override
protected void setSpeciesProperties(IAlleleBeeSpeciesCustom beeSpecies) {
beeSpecies.addProduct(PluginApiculture.items.beeComb.get(EnumHoneyComb.FROZEN, 1), 0.30f)
beeSpecies.addProduct(ForestryItem.beeComb.getItemStack(1, 4), 0.30f)
.setTemperature(EnumTemperature.ICY);
}
@Override
protected void setAlleles(IAllele[] template) {
AlleleHelper.instance.set(template, EnumBeeChromosome.SPEED, EnumAllele.Speed.SLOWER);
AlleleHelper.instance.set(template, EnumBeeChromosome.LIFESPAN, EnumAllele.Lifespan.SHORT);
AlleleHelper.instance.set(template, EnumBeeChromosome.FERTILITY, EnumAllele.Fertility.MAXIMUM);
Allele.helper.set(template, EnumBeeChromosome.SPEED, EnumAllele.Speed.SLOWER);
Allele.helper.set(template, EnumBeeChromosome.LIFESPAN, EnumAllele.Lifespan.SHORT);
Allele.helper.set(template, EnumBeeChromosome.FERTILITY, EnumAllele.Fertility.MAXIMUM);
}
@Override
@@ -579,15 +567,15 @@ public enum BeeDefinition implements IBeeDefinition {
ICY(BeeBranchDefinition.FROZEN, "coagulis", true, new Color(0xa0ffff), new Color(0xdaf5f3)) {
@Override
protected void setSpeciesProperties(IAlleleBeeSpeciesCustom beeSpecies) {
beeSpecies.addProduct(PluginApiculture.items.beeComb.get(EnumHoneyComb.FROZEN, 1), 0.20f)
.addProduct(PluginCore.items.craftingMaterial.getIceShard(1), 0.20f)
beeSpecies.addProduct(ForestryItem.beeComb.getItemStack(1, 4), 0.20f)
.addProduct(ForestryItem.craftingMaterial.getItemStack(1, 5), 0.20f)
.setTemperature(EnumTemperature.ICY);
}
@Override
protected void setAlleles(IAllele[] template) {
AlleleHelper.instance.set(template, EnumBeeChromosome.SPEED, EnumAllele.Speed.SLOW);
AlleleHelper.instance.set(template, EnumBeeChromosome.LIFESPAN, EnumAllele.Lifespan.SHORT);
Allele.helper.set(template, EnumBeeChromosome.SPEED, EnumAllele.Speed.SLOW);
Allele.helper.set(template, EnumBeeChromosome.LIFESPAN, EnumAllele.Lifespan.SHORT);
}
@Override
@@ -599,16 +587,16 @@ public enum BeeDefinition implements IBeeDefinition {
GLACIAL(BeeBranchDefinition.FROZEN, "glacialis", false, new Color(0xefffff), new Color(0xdaf5f3)) {
@Override
protected void setSpeciesProperties(IAlleleBeeSpeciesCustom beeSpecies) {
beeSpecies.addProduct(PluginApiculture.items.beeComb.get(EnumHoneyComb.FROZEN, 1), 0.20f)
.addProduct(PluginCore.items.craftingMaterial.getIceShard(1), 0.40f)
beeSpecies.addProduct(ForestryItem.beeComb.getItemStack(1, 4), 0.20f)
.addProduct(ForestryItem.craftingMaterial.getItemStack(1, 5), 0.40f)
.setTemperature(EnumTemperature.ICY)
.setHasEffect();
}
@Override
protected void setAlleles(IAllele[] template) {
AlleleHelper.instance.set(template, EnumBeeChromosome.SPEED, EnumAllele.Speed.SLOWER);
AlleleHelper.instance.set(template, EnumBeeChromosome.LIFESPAN, EnumAllele.Lifespan.SHORT);
Allele.helper.set(template, EnumBeeChromosome.SPEED, EnumAllele.Speed.SLOWER);
Allele.helper.set(template, EnumBeeChromosome.LIFESPAN, EnumAllele.Lifespan.SHORT);
}
@Override
@@ -622,14 +610,14 @@ public enum BeeDefinition implements IBeeDefinition {
VINDICTIVE(BeeBranchDefinition.VENGEFUL, "ultio", false, new Color(0xeafff3), new Color(0xffdc16)) {
@Override
protected void setSpeciesProperties(IAlleleBeeSpeciesCustom beeSpecies) {
beeSpecies.addProduct(PluginApiculture.items.beeComb.get(EnumHoneyComb.IRRADIATED, 1), 0.25f)
beeSpecies.addProduct(ForestryItem.beeComb.getItemStack(1, 9), 0.25f)
.setIsNotCounted();
}
@Override
protected void setAlleles(IAllele[] template) {
AlleleHelper.instance.set(template, EnumBeeChromosome.SPEED, EnumAllele.Speed.SLOWER);
AlleleHelper.instance.set(template, EnumBeeChromosome.LIFESPAN, EnumAllele.Lifespan.NORMAL);
Allele.helper.set(template, EnumBeeChromosome.SPEED, EnumAllele.Speed.SLOWER);
Allele.helper.set(template, EnumBeeChromosome.LIFESPAN, EnumAllele.Lifespan.NORMAL);
}
@Override
@@ -640,14 +628,14 @@ public enum BeeDefinition implements IBeeDefinition {
VENGEFUL(BeeBranchDefinition.VENGEFUL, "punire", false, new Color(0xc2de00), new Color(0xffdc16)) {
@Override
protected void setSpeciesProperties(IAlleleBeeSpeciesCustom beeSpecies) {
beeSpecies.addProduct(PluginApiculture.items.beeComb.get(EnumHoneyComb.IRRADIATED, 1), 0.40f)
beeSpecies.addProduct(ForestryItem.beeComb.getItemStack(1, 9), 0.40f)
.setIsNotCounted();
}
@Override
protected void setAlleles(IAllele[] template) {
AlleleHelper.instance.set(template, EnumBeeChromosome.SPEED, EnumAllele.Speed.NORMAL);
AlleleHelper.instance.set(template, EnumBeeChromosome.LIFESPAN, EnumAllele.Lifespan.LONGER);
Allele.helper.set(template, EnumBeeChromosome.SPEED, EnumAllele.Speed.NORMAL);
Allele.helper.set(template, EnumBeeChromosome.LIFESPAN, EnumAllele.Lifespan.LONGER);
}
@Override
@@ -659,15 +647,15 @@ public enum BeeDefinition implements IBeeDefinition {
AVENGING(BeeBranchDefinition.VENGEFUL, "hostimentum", false, new Color(0xddff00), new Color(0xffdc16)) {
@Override
protected void setSpeciesProperties(IAlleleBeeSpeciesCustom beeSpecies) {
beeSpecies.addProduct(PluginApiculture.items.beeComb.get(EnumHoneyComb.IRRADIATED, 1), 0.40f)
beeSpecies.addProduct(ForestryItem.beeComb.getItemStack(1, 9), 0.40f)
.setHasEffect()
.setIsNotCounted();
}
@Override
protected void setAlleles(IAllele[] template) {
AlleleHelper.instance.set(template, EnumBeeChromosome.SPEED, EnumAllele.Speed.SLOWEST);
AlleleHelper.instance.set(template, EnumBeeChromosome.LIFESPAN, EnumAllele.Lifespan.LONGEST);
Allele.helper.set(template, EnumBeeChromosome.SPEED, EnumAllele.Speed.SLOWEST);
Allele.helper.set(template, EnumBeeChromosome.LIFESPAN, EnumAllele.Lifespan.LONGEST);
}
@Override
@@ -681,7 +669,7 @@ public enum BeeDefinition implements IBeeDefinition {
LEPORINE(BeeBranchDefinition.FESTIVE, "lepus", false, new Color(0xfeff8f), new Color(0x3cd757)) {
@Override
protected void setSpeciesProperties(IAlleleBeeSpeciesCustom beeSpecies) {
beeSpecies.addProduct(PluginApiculture.items.beeComb.get(EnumHoneyComb.SILKY, 1), 0.30f)
beeSpecies.addProduct(ForestryItem.beeComb.getItemStack(1, 6), 0.30f)
.addProduct(new ItemStack(Items.egg), 0.10f)
.setHasEffect()
.setIsNotCounted();
@@ -689,7 +677,7 @@ public enum BeeDefinition implements IBeeDefinition {
@Override
protected void setAlleles(IAllele[] template) {
AlleleHelper.instance.set(template, EnumBeeChromosome.EFFECT, AlleleEffect.effectFestiveEaster);
Allele.helper.set(template, EnumBeeChromosome.EFFECT, Allele.effectFestiveEaster);
}
@Override
@@ -703,8 +691,8 @@ public enum BeeDefinition implements IBeeDefinition {
MERRY(BeeBranchDefinition.FESTIVE, "feliciter", false, new Color(0xffffff), new Color(0xd40000)) {
@Override
protected void setSpeciesProperties(IAlleleBeeSpeciesCustom beeSpecies) {
beeSpecies.addProduct(PluginApiculture.items.beeComb.get(EnumHoneyComb.FROZEN, 1), 0.30f)
.addProduct(PluginCore.items.craftingMaterial.getIceShard(1), 0.20f)
beeSpecies.addProduct(ForestryItem.beeComb.getItemStack(1, 4), 0.30f)
.addProduct(ForestryItem.craftingMaterial.getItemStack(1, 5), 0.20f)
.setTemperature(EnumTemperature.ICY)
.setHasEffect()
.setIsNotCounted();
@@ -712,8 +700,8 @@ public enum BeeDefinition implements IBeeDefinition {
@Override
protected void setAlleles(IAllele[] template) {
AlleleHelper.instance.set(template, EnumBeeChromosome.NOCTURNAL, true);
AlleleHelper.instance.set(template, EnumBeeChromosome.EFFECT, AlleleEffect.effectSnowing);
Allele.helper.set(template, EnumBeeChromosome.NOCTURNAL, true);
Allele.helper.set(template, EnumBeeChromosome.EFFECT, Allele.effectSnowing);
}
@Override
@@ -727,8 +715,8 @@ public enum BeeDefinition implements IBeeDefinition {
TIPSY(BeeBranchDefinition.FESTIVE, "ebrius", false, new Color(0xffffff), new Color(0xc219ec)) {
@Override
protected void setSpeciesProperties(IAlleleBeeSpeciesCustom beeSpecies) {
beeSpecies.addProduct(PluginApiculture.items.beeComb.get(EnumHoneyComb.FROZEN, 1), 0.30f)
.addProduct(PluginCore.items.craftingMaterial.getIceShard(1), 0.20f)
beeSpecies.addProduct(ForestryItem.beeComb.getItemStack(1, 4), 0.30f)
.addProduct(ForestryItem.craftingMaterial.getItemStack(1, 5), 0.20f)
.setTemperature(EnumTemperature.ICY)
.setHasEffect()
.setIsNotCounted();
@@ -736,8 +724,8 @@ public enum BeeDefinition implements IBeeDefinition {
@Override
protected void setAlleles(IAllele[] template) {
AlleleHelper.instance.set(template, EnumBeeChromosome.NOCTURNAL, true);
AlleleHelper.instance.set(template, EnumBeeChromosome.EFFECT, AlleleEffect.effectDrunkard);
Allele.helper.set(template, EnumBeeChromosome.NOCTURNAL, true);
Allele.helper.set(template, EnumBeeChromosome.EFFECT, Allele.effectDrunkard);
}
@Override
@@ -752,7 +740,7 @@ public enum BeeDefinition implements IBeeDefinition {
TRICKY(BeeBranchDefinition.FESTIVE, "libita", false, new Color(0x49413B), new Color(0xFF6A00)) {
@Override
protected void setSpeciesProperties(IAlleleBeeSpeciesCustom beeSpecies) {
beeSpecies.addProduct(PluginApiculture.items.beeComb.get(EnumHoneyComb.HONEY, 1), 0.40f)
beeSpecies.addProduct(ForestryItem.beeComb.getItemStack(1, 0), 0.40f)
.addProduct(new ItemStack(Items.cookie), 0.15f)
.addSpecialty(new ItemStack(Items.skull, 1, 0), 0.02f)
.addSpecialty(new ItemStack(Items.skull, 1, 2), 0.02f)
@@ -764,9 +752,9 @@ public enum BeeDefinition implements IBeeDefinition {
@Override
protected void setAlleles(IAllele[] template) {
AlleleHelper.instance.set(template, EnumBeeChromosome.NOCTURNAL, true);
AlleleHelper.instance.set(template, EnumBeeChromosome.TOLERANT_FLYER, true);
AlleleHelper.instance.set(template, EnumBeeChromosome.FLOWER_PROVIDER, EnumAllele.Flowers.GOURD);
Allele.helper.set(template, EnumBeeChromosome.NOCTURNAL, true);
Allele.helper.set(template, EnumBeeChromosome.TOLERANT_FLYER, true);
Allele.helper.set(template, EnumBeeChromosome.FLOWER_PROVIDER, EnumAllele.Flowers.GOURD);
}
@Override
@@ -782,7 +770,7 @@ public enum BeeDefinition implements IBeeDefinition {
RURAL(BeeBranchDefinition.AGRARIAN, "rustico", false, new Color(0xfeff8f), new Color(0xffdc16)) {
@Override
protected void setSpeciesProperties(IAlleleBeeSpeciesCustom beeSpecies) {
beeSpecies.addProduct(PluginApiculture.items.beeComb.get(EnumHoneyComb.WHEATEN, 1), 0.20f);
beeSpecies.addProduct(ForestryItem.beeComb.getItemStack(1, 14), 0.20f);
}
@Override
@@ -799,13 +787,13 @@ public enum BeeDefinition implements IBeeDefinition {
FARMERLY(BeeBranchDefinition.AGRARIAN, "arator", true, new Color(0xD39728), new Color(0xffdc16)) {
@Override
protected void setSpeciesProperties(IAlleleBeeSpeciesCustom beeSpecies) {
beeSpecies.addProduct(PluginApiculture.items.beeComb.get(EnumHoneyComb.WHEATEN, 1), 0.27f);
beeSpecies.addProduct(ForestryItem.beeComb.getItemStack(1, 14), 0.27f);
}
@Override
protected void setAlleles(IAllele[] template) {
AlleleHelper.instance.set(template, EnumBeeChromosome.SPEED, EnumAllele.Speed.SLOW);
AlleleHelper.instance.set(template, EnumBeeChromosome.TERRITORY, EnumAllele.Territory.LARGE);
Allele.helper.set(template, EnumBeeChromosome.SPEED, EnumAllele.Speed.SLOW);
Allele.helper.set(template, EnumBeeChromosome.TERRITORY, EnumAllele.Territory.LARGE);
}
@Override
@@ -817,16 +805,16 @@ public enum BeeDefinition implements IBeeDefinition {
AGRARIAN(BeeBranchDefinition.AGRARIAN, "arator", true, new Color(0xFFCA75), new Color(0xFFE047)) {
@Override
protected void setSpeciesProperties(IAlleleBeeSpeciesCustom beeSpecies) {
beeSpecies.addProduct(PluginApiculture.items.beeComb.get(EnumHoneyComb.WHEATEN, 1), 0.35f)
beeSpecies.addProduct(ForestryItem.beeComb.getItemStack(1, 14), 0.35f)
.setHasEffect();
}
@Override
protected void setAlleles(IAllele[] template) {
AlleleHelper.instance.set(template, EnumBeeChromosome.SPEED, EnumAllele.Speed.SLOW);
AlleleHelper.instance.set(template, EnumBeeChromosome.HUMIDITY_TOLERANCE, EnumAllele.Tolerance.BOTH_2);
AlleleHelper.instance.set(template, EnumBeeChromosome.EFFECT, AlleleEffect.effectFertile);
AlleleHelper.instance.set(template, EnumBeeChromosome.TERRITORY, EnumAllele.Territory.LARGE);
Allele.helper.set(template, EnumBeeChromosome.SPEED, EnumAllele.Speed.SLOW);
Allele.helper.set(template, EnumBeeChromosome.HUMIDITY_TOLERANCE, EnumAllele.Tolerance.BOTH_2);
Allele.helper.set(template, EnumBeeChromosome.EFFECT, Allele.effectFertile);
Allele.helper.set(template, EnumBeeChromosome.TERRITORY, EnumAllele.Territory.LARGE);
}
@Override
@@ -840,7 +828,7 @@ public enum BeeDefinition implements IBeeDefinition {
MARSHY(BeeBranchDefinition.BOGGY, "adorasti", true, new Color(0x546626), new Color(0xffdc16)) {
@Override
protected void setSpeciesProperties(IAlleleBeeSpeciesCustom beeSpecies) {
beeSpecies.addProduct(PluginApiculture.items.beeComb.get(EnumHoneyComb.MOSSY, 1), 0.30f)
beeSpecies.addProduct(ForestryItem.beeComb.getItemStack(1, 15), 0.30f)
.setHumidity(EnumHumidity.DAMP);
}
@@ -857,15 +845,15 @@ public enum BeeDefinition implements IBeeDefinition {
MIRY(BeeBranchDefinition.BOGGY, "humidium", true, new Color(0x92AF42), new Color(0xffdc16)) {
@Override
protected void setSpeciesProperties(IAlleleBeeSpeciesCustom beeSpecies) {
beeSpecies.addProduct(PluginApiculture.items.beeComb.get(EnumHoneyComb.MOSSY, 1), 0.36f)
beeSpecies.addProduct(ForestryItem.beeComb.getItemStack(1, 15), 0.36f)
.setHumidity(EnumHumidity.DAMP);
}
@Override
protected void setAlleles(IAllele[] template) {
AlleleHelper.instance.set(template, EnumBeeChromosome.FERTILITY, EnumAllele.Fertility.MAXIMUM);
AlleleHelper.instance.set(template, EnumBeeChromosome.TOLERANT_FLYER, true);
AlleleHelper.instance.set(template, EnumBeeChromosome.NOCTURNAL, true);
Allele.helper.set(template, EnumBeeChromosome.FERTILITY, EnumAllele.Fertility.MAXIMUM);
Allele.helper.set(template, EnumBeeChromosome.TOLERANT_FLYER, true);
Allele.helper.set(template, EnumBeeChromosome.NOCTURNAL, true);
}
@Override
@@ -878,17 +866,17 @@ public enum BeeDefinition implements IBeeDefinition {
BOGGY(BeeBranchDefinition.BOGGY, "paluster", true, new Color(0x698948), new Color(0xffdc16)) {
@Override
protected void setSpeciesProperties(IAlleleBeeSpeciesCustom beeSpecies) {
beeSpecies.addProduct(PluginApiculture.items.beeComb.get(EnumHoneyComb.MOSSY, 1), 0.39f)
.addSpecialty(PluginCore.items.peat.getItemStack(), 0.08f)
beeSpecies.addProduct(ForestryItem.beeComb.getItemStack(1, 15), 0.39f)
.addSpecialty(ForestryItem.peat.getItemStack(), 0.08f)
.setHumidity(EnumHumidity.DAMP);
}
@Override
protected void setAlleles(IAllele[] template) {
AlleleHelper.instance.set(template, EnumBeeChromosome.TOLERANT_FLYER, true);
AlleleHelper.instance.set(template, EnumBeeChromosome.NOCTURNAL, true);
AlleleHelper.instance.set(template, EnumBeeChromosome.EFFECT, AlleleEffect.effectMycophilic);
AlleleHelper.instance.set(template, EnumBeeChromosome.TERRITORY, EnumAllele.Territory.LARGER);
Allele.helper.set(template, EnumBeeChromosome.TOLERANT_FLYER, true);
Allele.helper.set(template, EnumBeeChromosome.NOCTURNAL, true);
Allele.helper.set(template, EnumBeeChromosome.EFFECT, Allele.effectMycophilic);
Allele.helper.set(template, EnumBeeChromosome.TERRITORY, EnumAllele.Territory.LARGER);
}
@Override
@@ -903,8 +891,8 @@ public enum BeeDefinition implements IBeeDefinition {
MONASTIC(BeeBranchDefinition.MONASTIC, "monachus", false, new Color(0x42371c), new Color(0xfff7b6)) {
@Override
protected void setSpeciesProperties(IAlleleBeeSpeciesCustom beeSpecies) {
beeSpecies.addProduct(PluginApiculture.items.beeComb.get(EnumHoneyComb.WHEATEN, 1), 0.30f)
.addSpecialty(PluginApiculture.items.beeComb.get(EnumHoneyComb.MELLOW, 1), 0.10f)
beeSpecies.addProduct(ForestryItem.beeComb.getItemStack(1, 14), 0.30f)
.addSpecialty(ForestryItem.beeComb.getItemStack(1, 16), 0.10f)
.setJubilanceProvider(new JubilanceProviderHermit());
}
@@ -921,13 +909,13 @@ public enum BeeDefinition implements IBeeDefinition {
SECLUDED(BeeBranchDefinition.MONASTIC, "contractus", true, new Color(0x7b6634), new Color(0xfff7b6)) {
@Override
protected void setSpeciesProperties(IAlleleBeeSpeciesCustom beeSpecies) {
beeSpecies.addSpecialty(PluginApiculture.items.beeComb.get(EnumHoneyComb.MELLOW, 1), 0.20f)
beeSpecies.addSpecialty(ForestryItem.beeComb.getItemStack(1, 16), 0.20f)
.setJubilanceProvider(new JubilanceProviderHermit());
}
@Override
protected void setAlleles(IAllele[] template) {
AlleleHelper.instance.set(template, EnumBeeChromosome.FLOWERING, EnumAllele.Flowering.FASTEST);
Allele.helper.set(template, EnumBeeChromosome.FLOWERING, EnumAllele.Flowering.FASTEST);
}
@Override
@@ -938,15 +926,15 @@ public enum BeeDefinition implements IBeeDefinition {
HERMITIC(BeeBranchDefinition.MONASTIC, "anachoreta", false, new Color(0xffd46c), new Color(0xfff7b6)) {
@Override
protected void setSpeciesProperties(IAlleleBeeSpeciesCustom beeSpecies) {
beeSpecies.addSpecialty(PluginApiculture.items.beeComb.get(EnumHoneyComb.MELLOW, 1), 0.20f)
beeSpecies.addSpecialty(ForestryItem.beeComb.getItemStack(1, 16), 0.20f)
.setJubilanceProvider(new JubilanceProviderHermit())
.setHasEffect();
}
@Override
protected void setAlleles(IAllele[] template) {
AlleleHelper.instance.set(template, EnumBeeChromosome.FLOWERING, EnumAllele.Flowering.FASTEST);
AlleleHelper.instance.set(template, EnumBeeChromosome.EFFECT, AlleleEffect.effectRepulsion);
Allele.helper.set(template, EnumBeeChromosome.FLOWERING, EnumAllele.Flowering.FASTEST);
Allele.helper.set(template, EnumBeeChromosome.EFFECT, Allele.effectRepulsion);
}
@Override
@@ -955,7 +943,7 @@ public enum BeeDefinition implements IBeeDefinition {
}
};
private static final EnumSet<BeeDefinition> overworldHiveBees = EnumSet.of(FOREST, MARSHY, MEADOWS, MODEST, TROPICAL, WINTRY);
public static final EnumSet<BeeDefinition> overworldHiveBees = EnumSet.of(FOREST, MARSHY, MEADOWS, MODEST, TROPICAL, WINTRY);
private final BeeBranchDefinition branch;
private final IAlleleBeeSpeciesCustom species;
@@ -997,7 +985,7 @@ public enum BeeDefinition implements IBeeDefinition {
setSpeciesProperties(species);
template = branch.getTemplate();
AlleleHelper.instance.set(template, EnumBeeChromosome.SPECIES, species);
Allele.helper.set(template, EnumBeeChromosome.SPECIES, species);
setAlleles(template);
genome = BeeManager.beeRoot.templateAsGenome(template);
@@ -10,18 +10,16 @@
******************************************************************************/
package forestry.apiculture.genetics;
import forestry.api.apiculture.EnumBeeChromosome;
import forestry.api.apiculture.IAlleleBeeSpeciesCustom;
import forestry.api.apiculture.IBeeFactory;
import forestry.api.genetics.AlleleManager;
import forestry.api.genetics.IClassification;
import forestry.apiculture.genetics.alleles.AlleleBeeSpecies;
public class BeeFactory implements IBeeFactory {
@Override
public IAlleleBeeSpeciesCustom createSpecies(String uid, boolean dominant, String authority, String unlocalizedName, String unlocalizedDescription, IClassification branch, String binomial, int primaryColor, int secondaryColor) {
IAlleleBeeSpeciesCustom species = new AlleleBeeSpecies(uid, unlocalizedName, authority, unlocalizedDescription, dominant, branch, binomial, primaryColor, secondaryColor);
AlleleManager.alleleRegistry.registerAllele(species, EnumBeeChromosome.SPECIES);
AlleleManager.alleleRegistry.registerAllele(species);
return species;
}
@@ -10,22 +10,18 @@
******************************************************************************/
package forestry.apiculture.genetics;
import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache;
import javax.annotation.Nonnull;
import java.util.concurrent.TimeUnit;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
import forestry.api.apiculture.BeeManager;
import forestry.api.apiculture.EnumBeeChromosome;
import forestry.api.apiculture.IAlleleBeeEffect;
import forestry.api.apiculture.IAlleleBeeSpecies;
import forestry.api.apiculture.IBeeGenome;
import forestry.api.genetics.AlleleManager;
import forestry.api.genetics.EnumTolerance;
import forestry.api.genetics.IAllele;
import forestry.api.genetics.IAlleleFloat;
import forestry.api.genetics.IAlleleFlowers;
import forestry.api.genetics.IAlleleInteger;
@@ -33,50 +29,45 @@ import forestry.api.genetics.IAlleleSpecies;
import forestry.api.genetics.IChromosome;
import forestry.api.genetics.IFlowerProvider;
import forestry.api.genetics.ISpeciesRoot;
import forestry.core.genetics.Chromosome;
import forestry.core.genetics.Genome;
import forestry.core.genetics.alleles.AlleleArea;
import forestry.core.genetics.alleles.AlleleBoolean;
import forestry.core.genetics.alleles.AlleleTolerance;
import forestry.core.utils.vect.Vect;
import forestry.core.vect.Vect;
public class BeeGenome extends Genome implements IBeeGenome {
/**
* 0 - Species (determines product)
*
* 1 - Speed
*
* 2 - Lifespan
*
* 3 - Fertility (Maximum number of offspring)
*
* 4 - Preferred temperature Icy: Snow biomes Cold: Tundra/Steppe, Extreme Mountains/Hills? Normal: Plains, Forests, Mountains Hot: Desert Hellish: Nether
*
* 5 - Temperature tolerance (Range +/-)
*
* 6 - Nocturnal
*
* 7 - Preferred humidity (Arid - Normal - Damp)
*
* 8 - Humidity tolerance (Range +/-)
*
* 9 - Flight interference tolerance (stuff falling from the sky/other hindrances -> tolerates dampness + flight interference tolerance => rain resistance)
*
* 10 - Cave dwelling
*
* 11 - Required flowers
*
* 12 - Flower plant chance
*
* 13 - Territory
*/
private static final LoadingCache<NBTTagCompound, BeeGenome> beeGenomeCache = CacheBuilder.newBuilder()
.maximumSize(128)
.expireAfterAccess(1, TimeUnit.MINUTES)
.build(new CacheLoader<NBTTagCompound, BeeGenome>() {
@Override
public BeeGenome load(@Nonnull NBTTagCompound tagCompound) {
return new BeeGenome(tagCompound);
}
});
public static BeeGenome fromNBT(NBTTagCompound nbtTagCompound) {
if (nbtTagCompound == null) {
return null;
}
return beeGenomeCache.getUnchecked(nbtTagCompound);
}
/* CONSTRUCTOR */
private BeeGenome(NBTTagCompound nbttagcompound) {
public BeeGenome(NBTTagCompound nbttagcompound) {
super(nbttagcompound);
}
@@ -29,31 +29,30 @@ import forestry.api.apiculture.BeeManager;
import forestry.api.apiculture.EnumBeeChromosome;
import forestry.api.apiculture.EnumBeeType;
import forestry.api.apiculture.IAlleleBeeSpecies;
import forestry.api.apiculture.IAlvearyComponent;
import forestry.api.apiculture.IApiaristTracker;
import forestry.api.apiculture.IBee;
import forestry.api.apiculture.IBeeGenome;
import forestry.api.apiculture.IBeeHousing;
import forestry.api.apiculture.IBeeListener;
import forestry.api.apiculture.IBeeModifier;
import forestry.api.apiculture.IBeeMutation;
import forestry.api.apiculture.IBeeRoot;
import forestry.api.apiculture.IBeekeepingLogic;
import forestry.api.apiculture.IBeekeepingMode;
import forestry.api.core.IStructureLogic;
import forestry.api.genetics.AlleleManager;
import forestry.api.genetics.IAllele;
import forestry.api.genetics.IChromosome;
import forestry.api.genetics.IChromosomeType;
import forestry.api.genetics.IIndividual;
import forestry.api.genetics.IMutation;
import forestry.apiculture.BeeHousingListener;
import forestry.apiculture.BeeHousingModifier;
import forestry.apiculture.BeekeepingLogic;
import forestry.apiculture.gadgets.StructureLogicAlveary;
import forestry.core.config.ForestryItem;
import forestry.core.genetics.SpeciesRoot;
import forestry.plugins.PluginApiculture;
public class BeeHelper extends SpeciesRoot implements IBeeRoot {
private static int beeSpeciesCount = -1;
public static int beeSpeciesCount = -1;
public static final String UID = "rootBees";
@Override
@@ -98,29 +97,24 @@ public class BeeHelper extends SpeciesRoot implements IBeeRoot {
}
@Override
public ItemStack getMemberStack(IIndividual individual, int type) {
if (!isMember(individual)) {
public ItemStack getMemberStack(IIndividual bee, int type) {
if (!isMember(bee)) {
return null;
}
IBee bee = (IBee) individual;
Item beeItem;
switch (EnumBeeType.VALUES[type]) {
case QUEEN:
beeItem = PluginApiculture.items.beeQueenGE;
// ensure a queen is always mated
if (bee.getMate() == null) {
bee.mate(bee);
}
beeItem = ForestryItem.beeQueenGE.item();
break;
case PRINCESS:
beeItem = PluginApiculture.items.beePrincessGE;
beeItem = ForestryItem.beePrincessGE.item();
break;
case DRONE:
beeItem = PluginApiculture.items.beeDroneGE;
beeItem = ForestryItem.beeDroneGE.item();
break;
case LARVAE:
beeItem = PluginApiculture.items.beeLarvaeGE;
beeItem = ForestryItem.beeLarvaeGE.item();
break;
default:
throw new RuntimeException("Cannot instantiate a bee of type " + type);
@@ -139,15 +133,13 @@ public class BeeHelper extends SpeciesRoot implements IBeeRoot {
return EnumBeeType.NONE;
}
Item item = stack.getItem();
if (PluginApiculture.items.beeDroneGE == item) {
if (ForestryItem.beeDroneGE.isItemEqual(stack)) {
return EnumBeeType.DRONE;
} else if (PluginApiculture.items.beePrincessGE == item) {
} else if (ForestryItem.beePrincessGE.isItemEqual(stack)) {
return EnumBeeType.PRINCESS;
} else if (PluginApiculture.items.beeQueenGE == item) {
} else if (ForestryItem.beeQueenGE.isItemEqual(stack)) {
return EnumBeeType.QUEEN;
} else if (PluginApiculture.items.beeLarvaeGE == item) {
} else if (ForestryItem.beeLarvaeGE.isItemEqual(stack)) {
return EnumBeeType.LARVAE;
}
@@ -196,8 +188,7 @@ public class BeeHelper extends SpeciesRoot implements IBeeRoot {
/* GENOME CONVERSIONS */
@Override
public IBeeGenome templateAsGenome(IAllele[] template) {
IChromosome[] chromosomes = templateAsChromosomes(template);
return new BeeGenome(chromosomes);
return new BeeGenome(templateAsChromosomes(template));
}
@Override
@@ -216,7 +207,7 @@ public class BeeHelper extends SpeciesRoot implements IBeeRoot {
}
/* TEMPLATES */
private static final ArrayList<IBee> beeTemplates = new ArrayList<>();
public static final ArrayList<IBee> beeTemplates = new ArrayList<IBee>();
@Override
public ArrayList<IBee> getIndividualTemplates() {
@@ -225,9 +216,7 @@ public class BeeHelper extends SpeciesRoot implements IBeeRoot {
@Override
public void registerTemplate(String identifier, IAllele[] template) {
IBeeGenome beeGenome = BeeManager.beeRoot.templateAsGenome(template);
IBee bee = new Bee(beeGenome);
beeTemplates.add(bee);
beeTemplates.add(new Bee(BeeManager.beeRoot.templateAsGenome(template)));
speciesTemplates.put(identifier, template);
}
@@ -240,7 +229,7 @@ public class BeeHelper extends SpeciesRoot implements IBeeRoot {
/**
* List of possible mutations on species alleles.
*/
private static final ArrayList<IBeeMutation> beeMutations = new ArrayList<>();
private static final ArrayList<IBeeMutation> beeMutations = new ArrayList<IBeeMutation>();
@Override
public Collection<IBeeMutation> getMutations(boolean shuffle) {
@@ -266,8 +255,8 @@ public class BeeHelper extends SpeciesRoot implements IBeeRoot {
}
/* BREEDING MODES */
private final ArrayList<IBeekeepingMode> beekeepingModes = new ArrayList<>();
private static IBeekeepingMode activeBeekeepingMode;
final ArrayList<IBeekeepingMode> beekeepingModes = new ArrayList<IBeekeepingMode>();
public static IBeekeepingMode activeBeekeepingMode;
@Override
public void resetBeekeepingMode() {
@@ -328,13 +317,10 @@ public class BeeHelper extends SpeciesRoot implements IBeeRoot {
// Create a tracker if there is none yet.
if (tracker == null) {
tracker = new ApiaristTracker(filename);
tracker = new ApiaristTracker(filename, player);
world.setItemData(filename, tracker);
}
tracker.setUsername(player);
tracker.setWorld(world);
return tracker;
}
@@ -344,13 +330,8 @@ public class BeeHelper extends SpeciesRoot implements IBeeRoot {
}
@Override
public IBeeModifier createBeeHousingModifier(IBeeHousing housing) {
return new BeeHousingModifier(housing);
}
@Override
public IBeeListener createBeeHousingListener(IBeeHousing housing) {
return new BeeHousingListener(housing);
public IStructureLogic createAlvearyStructureLogic(IAlvearyComponent structure) {
return new StructureLogicAlveary(structure);
}
@Override
+24 -12
View File
@@ -10,18 +10,17 @@
******************************************************************************/
package forestry.apiculture.genetics;
import net.minecraft.util.ChunkCoordinates;
import net.minecraft.world.World;
import forestry.api.apiculture.BeeManager;
import forestry.api.apiculture.IAlleleBeeSpecies;
import forestry.api.apiculture.IBeeGenome;
import forestry.api.apiculture.IBeeHousing;
import forestry.api.apiculture.IBeeModifier;
import forestry.api.apiculture.IBeeMutationCustom;
import forestry.api.apiculture.IBeeRoot;
import forestry.api.genetics.IAllele;
import forestry.core.genetics.mutations.Mutation;
import forestry.api.genetics.IGenome;
import forestry.core.genetics.Mutation;
public class BeeMutation extends Mutation implements IBeeMutationCustom {
@@ -34,26 +33,39 @@ public class BeeMutation extends Mutation implements IBeeMutationCustom {
return BeeManager.beeRoot;
}
@Override
public float getChance(IBeeHousing housing, IAllele allele0, IAllele allele1, IGenome genome0, IGenome genome1) {
return getChance(housing, (IAlleleBeeSpecies) allele0, (IAlleleBeeSpecies) allele1, (IBeeGenome) genome0, (IBeeGenome) genome1);
}
@Override
public float getChance(IBeeHousing housing, IAlleleBeeSpecies allele0, IAlleleBeeSpecies allele1, IBeeGenome genome0, IBeeGenome genome1) {
World world = housing.getWorld();
ChunkCoordinates housingCoordinates = housing.getCoordinates();
int x = housingCoordinates.posX;
int y = housingCoordinates.posY;
int z = housingCoordinates.posZ;
int x = housing.getXCoord();
int y = housing.getYCoord();
int z = housing.getZCoord();
float processedChance = super.getChance(world, x, y, z, allele0, allele1, genome0, genome1);
if (processedChance <= 0) {
return 0;
}
IBeeModifier beeHousingModifier = BeeManager.beeRoot.createBeeHousingModifier(housing);
IBeeModifier beeModeModifier = BeeManager.beeRoot.getBeekeepingMode(world).getBeeModifier();
processedChance *= housing.getMutationModifier(genome0, genome1, 1f);
processedChance *= BeeManager.beeRoot.getBeekeepingMode(world).getMutationModifier(genome0, genome1, 1f);
if (processedChance <= 0) {
return 0;
}
processedChance *= beeHousingModifier.getMutationModifier(genome0, genome1, processedChance);
processedChance *= beeModeModifier.getMutationModifier(genome0, genome1, processedChance);
if (this.species0.getUID().equals(allele0.getUID()) && this.species1.getUID().equals(allele1.getUID())) {
return processedChance;
}
if (this.species1.getUID().equals(allele0.getUID()) && this.species0.getUID().equals(allele1.getUID())) {
return processedChance;
}
return 0;
return processedChance;
}
}
Loaded 100 of 1370 files, more files were not shown because too many files have changed in this diff. Show more