mirror of
https://github.com/GTNewHorizons/ForestryMC.git
synced 2026-10-25 20:22:26 +00:00
Initial commit for GitHub.
This commit is contained in:
commit
cfa8d53025
1787 files changed
+97372
No files matched your search
@@ -0,0 +1,11 @@
|
||||
FORESTRY INDIVIDUAL CONTRIBUTOR LICENSE AGREEMENT
|
||||
␍Thank you for your interest in contributing to Forestry ("We" or "Us").
|
||||
␍This contributor agreement ("Agreement") documents the rights granted by contributors to Us. To make this document effective, please sign it and send it to Us by electronic submission using CLAHub (http://www.clahub.com/). This is a legally binding document, so please read it carefully before agreeing to it. The Agreement may cover more than one software project managed by Us.␍␍1. Definitions␍␍"You" means the individual who Submits a Contribution to Us.␍␍"Contribution" means any work of authorship that is Submitted by You to Us in which You own or assert ownership of the Copyright.␍␍"Copyright" means all rights protecting works of authorship owned or controlled by You, including copyright, moral and neighboring rights, as appropriate, for the full term of their existence including any extensions by You.␍␍"Material" means the work of authorship which is made available by Us to third parties. When this Agreement covers more than one software project, the Material means the work of authorship to which the Contribution was Submitted. After You Submit the Contribution, it may be included in the Material.␍␍"Submit" means any form of electronic, verbal, or written communication sent to Us or our representatives, including but not limited to electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, Us for the purpose of discussing and improving the Material, but excluding communication that is conspicuously marked or otherwise designated in writing by You as "Not a Contribution."␍␍"Submission Date" means the date on which You Submit a Contribution to Us.␍␍"Effective Date" means the date You execute this Agreement or the date You first Submit a Contribution to Us, whichever is earlier.␍␍"Media" means any portion of a Contribution which is not software.␍␍2. Grant of Rights␍␍2.1 Copyright License␍␍(a) You retain ownership of the Copyright in Your Contribution and have the same rights to use or license the Contribution which You would have had without entering into the Agreement.␍␍(b) To the maximum extent permitted by the relevant law, You grant to Us a perpetual, worldwide, non-exclusive, transferable, royalty-free, irrevocable license under the Copyright covering the Contribution, with the right to sublicense such rights through multiple tiers of sublicensees, to reproduce, modify, display, perform and distribute the Contribution as part of the Material; provided that this license is conditioned upon compliance with Section 2.3.␍␍2.2 Patent License␍␍For patent claims including, without limitation, method, process, and apparatus claims which You own, control or have the right to grant, now or in the future, You grant to Us a perpetual, worldwide, non-exclusive, transferable, royalty-free, irrevocable patent license, with the right to sublicense these rights to multiple tiers of sublicensees, to make, have made, use, sell, offer for sale, import and otherwise transfer the Contribution and the Contribution in combination with the Material (and portions of such combination). This license is granted only to the extent that the exercise of the licensed rights infringes such patent claims; and provided that this license is conditioned upon compliance with Section 2.3.␍␍2.3 Outbound License␍␍Based on the grant of rights in Sections 2.1 and 2.2, if We include Your Contribution in a Material, We may license the Contribution under any license, including copyleft, permissive, commercial, or proprietary licenses.
|
||||
␍2.4 Moral Rights.
|
||||
|
||||
If moral rights apply to the Contribution, to the maximum extent permitted by law, You waive and agree not to assert such moral rights against Us or our successors in interest, or any of our licensees, either direct or indirect.␍␍2.5 Our Rights.
|
||||
|
||||
You acknowledge that We are not obligated to use Your Contribution as part of the Material and may decide to include any Contribution We consider appropriate.␍␍2.6 Reservation of Rights.
|
||||
|
||||
Any rights not expressly assigned or licensed under this section are expressly reserved by You.␍␍3. Agreement␍␍You confirm that:␍␍(a) You have the legal authority to enter into this Agreement.␍(b) You own the Copyright and patent claims covering the Contribution which are required to grant the rights under Section 2.␍(c) The grant of rights under Section 2 does not violate any grant of rights which You have made to third parties, including Your employer. If You are an employee, You have had Your employer approve this Agreement. If You are less than eighteen years old, please have Your parents or guardian sign the Agreement.␍␍4. Disclaimer␍␍EXCEPT FOR THE EXPRESS WARRANTIES IN SECTION 3, THE CONTRIBUTION IS PROVIDED "AS IS". MORE PARTICULARLY, ALL EXPRESS OR IMPLIED WARRANTIES INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE EXPRESSLY DISCLAIMED BY YOU TO US AND BY US TO YOU. TO THE EXTENT THAT ANY SUCH WARRANTIES CANNOT BE DISCLAIMED, SUCH WARRANTY IS LIMITED IN DURATION TO THE MINIMUM PERIOD PERMITTED BY LAW.
|
||||
␍5. Consequential Damage Waiver␍␍TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, IN NO EVENT WILL YOU OR US BE LIABLE FOR ANY LOSS OF PROFITS, LOSS OF ANTICIPATED SAVINGS, LOSS OF DATA, INDIRECT, SPECIAL, INCIDENTAL, CONSEQUENTIAL AND EXEMPLARY DAMAGES ARISING OUT OF THIS AGREEMENT REGARDLESS OF THE LEGAL OR EQUITABLE THEORY (CONTRACT, TORT OR OTHERWISE) UPON WHICH THE CLAIM IS BASED.␍␍6. Miscellaneous␍␍6.1 This Agreement will be governed by and construed in accordance with the laws of Germany excluding its conflicts of law provisions. Under certain circumstances, the governing law in this section might be superseded by the United Nations Convention on Contracts for the International Sale of Goods ("UN Convention") and the parties intend to avoid the application of the UN Convention to this Agreement and, thus, exclude the application of the UN Convention in its entirety to this Agreement.␍␍6.2 This Agreement sets out the entire agreement between You and Us for Your Contributions to Us and overrides all other agreements or understandings.␍␍6.3 If You or We assign the rights or obligations received through this Agreement to a third party, as a condition of the assignment, that third party must agree in writing to abide by all the rights and obligations in the Agreement.␍␍6.4 The failure of either party to require performance by the other party of any provision of this Agreement in one situation shall not affect the right of a party to require such performance at any time in the future. A waiver of performance under a provision in one situation shall not be considered a waiver of the performance of the provision in the future or a waiver of the provision in its entirety.␍␍6.5 If any provision of this Agreement is found void and unenforceable, such provision will be replaced to the extent possible with a provision that comes closest to the meaning of the original provision and which is enforceable. The terms and conditions set forth in this Agreement shall apply notwithstanding any failure of essential purpose of this Agreement or any limited remedy to the maximum extent possible under law.
|
||||
Executable
+16
@@ -0,0 +1,16 @@
|
||||
How to contribute to Forestry
|
||||
====================================
|
||||
|
||||
### Contributor License Agreement
|
||||
|
||||
Before pull requests can be accepted, the contributor needs to sign a contributor license agreement. (Essentially giving a license for using his code and/or media and for re-licensing it, for details read the agreement linked below.)
|
||||
|
||||
### How do I sign?
|
||||
|
||||
To keep the hassle for everyone involved to a minimum, Forestry uses CLAHub to manage the agreements. To get started, <a href="https://www.clahub.com/agreements/ForestryMC/ForestryMC">sign the Contributor License Agreement</a>.
|
||||
|
||||
### Why is this needed?
|
||||
|
||||
Without CLAs it at some point becomes essentially impossible to change the license of a project which accepts contributions from third parties. Without an explicit agreement every contributor would still own the copyright to his code. So as long as it (or parts of it) remain in the code base, he would have to agree to every license change. If enough time has passed, there may be dozens, perhaps even hundreds of contributors involved and it will be very hard to track down each and every one of them and get them to agree on a new license.
|
||||
|
||||
This would make it impossible to change the license to a more permissive one at a later date, so the code would be locked into CC BY-NC-ND 3.0 until it passes into the public domain about a hundred years from now. This situation is to be avoided and that’s why you are being bothered with this CLA.
|
||||
Executable
+64
@@ -0,0 +1,64 @@
|
||||
License (CC BY-NC-ND 3.0)
|
||||
|
||||
THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED.
|
||||
|
||||
BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE TO BE BOUND BY THE TERMS OF THIS LICENSE. TO THE EXTENT THIS LICENSE MAY BE CONSIDERED TO BE A CONTRACT, THE LICENSOR GRANTS YOU THE RIGHTS CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND CONDITIONS.
|
||||
|
||||
1. Definitions
|
||||
|
||||
"Adaptation" means a work based upon the Work, or upon the Work and other pre-existing works, such as a translation, adaptation, derivative work, arrangement of music or other alterations of a literary or artistic work, or phonogram or performance and includes cinematographic adaptations or any other form in which the Work may be recast, transformed, or adapted including in any form recognizably derived from the original, except that a work that constitutes a Collection will not be considered an Adaptation for the purpose of this License. For the avoidance of doubt, where the Work is a musical work, performance or phonogram, the synchronization of the Work in timed-relation with a moving image ("synching") will be considered an Adaptation for the purpose of this License.
|
||||
"Collection" means a collection of literary or artistic works, such as encyclopedias and anthologies, or performances, phonograms or broadcasts, or other works or subject matter other than works listed in Section 1(f) below, which, by reason of the selection and arrangement of their contents, constitute intellectual creations, in which the Work is included in its entirety in unmodified form along with one or more other contributions, each constituting separate and independent works in themselves, which together are assembled into a collective whole. A work that constitutes a Collection will not be considered an Adaptation (as defined above) for the purposes of this License.
|
||||
"Distribute" means to make available to the public the original and copies of the Work through sale or other transfer of ownership.
|
||||
"Licensor" means the individual, individuals, entity or entities that offer(s) the Work under the terms of this License.
|
||||
"Original Author" means, in the case of a literary or artistic work, the individual, individuals, entity or entities who created the Work or if no individual or entity can be identified, the publisher; and in addition (i) in the case of a performance the actors, singers, musicians, dancers, and other persons who act, sing, deliver, declaim, play in, interpret or otherwise perform literary or artistic works or expressions of folklore; (ii) in the case of a phonogram the producer being the person or legal entity who first fixes the sounds of a performance or other sounds; and, (iii) in the case of broadcasts, the organization that transmits the broadcast.
|
||||
"Work" means the literary and/or artistic work offered under the terms of this License including without limitation any production in the literary, scientific and artistic domain, whatever may be the mode or form of its expression including digital form, such as a book, pamphlet and other writing; a lecture, address, sermon or other work of the same nature; a dramatic or dramatico-musical work; a choreographic work or entertainment in dumb show; a musical composition with or without words; a cinematographic work to which are assimilated works expressed by a process analogous to cinematography; a work of drawing, painting, architecture, sculpture, engraving or lithography; a photographic work to which are assimilated works expressed by a process analogous to photography; a work of applied art; an illustration, map, plan, sketch or three-dimensional work relative to geography, topography, architecture or science; a performance; a broadcast; a phonogram; a compilation of data to the extent it is protected as a copyrightable work; or a work performed by a variety or circus performer to the extent it is not otherwise considered a literary or artistic work.
|
||||
"You" means an individual or entity exercising rights under this License who has not previously violated the terms of this License with respect to the Work, or who has received express permission from the Licensor to exercise rights under this License despite a previous violation.
|
||||
"Publicly Perform" means to perform public recitations of the Work and to communicate to the public those public recitations, by any means or process, including by wire or wireless means or public digital performances; to make available to the public Works in such a way that members of the public may access these Works from a place and at a place individually chosen by them; to perform the Work to the public by any means or process and the communication to the public of the performances of the Work, including by public digital performance; to broadcast and rebroadcast the Work by any means including signs, sounds or images.
|
||||
"Reproduce" means to make copies of the Work by any means including without limitation by sound or visual recordings and the right of fixation and reproducing fixations of the Work, including storage of a protected performance or phonogram in digital form or other electronic medium.
|
||||
|
||||
2. Fair Dealing Rights.
|
||||
|
||||
Nothing in this License is intended to reduce, limit, or restrict any uses free from copyright or rights arising from limitations or exceptions that are provided for in connection with the copyright protection under copyright law or other applicable laws.
|
||||
|
||||
3. License Grant.
|
||||
|
||||
Subject to the terms and conditions of this License, Licensor hereby grants You a worldwide, royalty-free, non-exclusive, perpetual (for the duration of the applicable copyright) license to exercise the rights in the Work as stated below:
|
||||
|
||||
to Reproduce the Work, to incorporate the Work into one or more Collections, and to Reproduce the Work as incorporated in the Collections; and,
|
||||
to Distribute and Publicly Perform the Work including as incorporated in Collections.
|
||||
The above rights may be exercised in all media and formats whether now known or hereafter devised. The above rights include the right to make such modifications as are technically necessary to exercise the rights in other media and formats, but otherwise you have no rights to make Adaptations. Subject to 8(f), all rights not expressly granted by Licensor are hereby reserved, including but not limited to the rights set forth in Section 4(d).
|
||||
|
||||
4. Restrictions.
|
||||
|
||||
The license granted in Section 3 above is expressly made subject to and limited by the following restrictions:
|
||||
|
||||
You may Distribute or Publicly Perform the Work only under the terms of this License. You must include a copy of, or the Uniform Resource Identifier (URI) for, this License with every copy of the Work You Distribute or Publicly Perform. You may not offer or impose any terms on the Work that restrict the terms of this License or the ability of the recipient of the Work to exercise the rights granted to that recipient under the terms of the License. You may not sublicense the Work. You must keep intact all notices that refer to this License and to the disclaimer of warranties with every copy of the Work You Distribute or Publicly Perform. When You Distribute or Publicly Perform the Work, You may not impose any effective technological measures on the Work that restrict the ability of a recipient of the Work from You to exercise the rights granted to that recipient under the terms of the License. This Section 4(a) applies to the Work as incorporated in a Collection, but this does not require the Collection apart from the Work itself to be made subject to the terms of this License. If You create a Collection, upon notice from any Licensor You must, to the extent practicable, remove from the Collection any credit as required by Section 4(c), as requested.
|
||||
You may not exercise any of the rights granted to You in Section 3 above in any manner that is primarily intended for or directed toward commercial advantage or private monetary compensation. The exchange of the Work for other copyrighted works by means of digital file-sharing or otherwise shall not be considered to be intended for or directed toward commercial advantage or private monetary compensation, provided there is no payment of any monetary compensation in connection with the exchange of copyrighted works.
|
||||
If You Distribute, or Publicly Perform the Work or Collections, You must, unless a request has been made pursuant to Section 4(a), keep intact all copyright notices for the Work and provide, reasonable to the medium or means You are utilizing: (i) the name of the Original Author (or pseudonym, if applicable) if supplied, and/or if the Original Author and/or Licensor designate another party or parties (e.g., a sponsor institute, publishing entity, journal) for attribution ("Attribution Parties") in Licensor's copyright notice, terms of service or by other reasonable means, the name of such party or parties; (ii) the title of the Work if supplied; (iii) to the extent reasonably practicable, the URI, if any, that Licensor specifies to be associated with the Work, unless such URI does not refer to the copyright notice or licensing information for the Work. The credit required by this Section 4(c) may be implemented in any reasonable manner; provided, however, that in the case of a Collection, at a minimum such credit will appear, if a credit for all contributing authors of Collection appears, then as part of these credits and in a manner at least as prominent as the credits for the other contributing authors. For the avoidance of doubt, You may only use the credit required by this Section for the purpose of attribution in the manner set out above and, by exercising Your rights under this License, You may not implicitly or explicitly assert or imply any connection with, sponsorship or endorsement by the Original Author, Licensor and/or Attribution Parties, as appropriate, of You or Your use of the Work, without the separate, express prior written permission of the Original Author, Licensor and/or Attribution Parties.
|
||||
For the avoidance of doubt:
|
||||
|
||||
Non-waivable Compulsory License Schemes. In those jurisdictions in which the right to collect royalties through any statutory or compulsory licensing scheme cannot be waived, the Licensor reserves the exclusive right to collect such royalties for any exercise by You of the rights granted under this License;
|
||||
Waivable Compulsory License Schemes. In those jurisdictions in which the right to collect royalties through any statutory or compulsory licensing scheme can be waived, the Licensor reserves the exclusive right to collect such royalties for any exercise by You of the rights granted under this License if Your exercise of such rights is for a purpose or use which is otherwise than noncommercial as permitted under Section 4(b) and otherwise waives the right to collect royalties through any statutory or compulsory licensing scheme; and,
|
||||
Voluntary License Schemes. The Licensor reserves the right to collect royalties, whether individually or, in the event that the Licensor is a member of a collecting society that administers voluntary licensing schemes, via that society, from any exercise by You of the rights granted under this License that is for a purpose or use which is otherwise than noncommercial as permitted under Section 4(b).
|
||||
Except as otherwise agreed in writing by the Licensor or as may be otherwise permitted by applicable law, if You Reproduce, Distribute or Publicly Perform the Work either by itself or as part of any Collections, You must not distort, mutilate, modify or take other derogatory action in relation to the Work which would be prejudicial to the Original Author's honor or reputation.
|
||||
|
||||
5. Representations, Warranties and Disclaimer
|
||||
|
||||
UNLESS OTHERWISE MUTUALLY AGREED BY THE PARTIES IN WRITING, LICENSOR OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY KIND CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE, INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS, WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY TO YOU.
|
||||
|
||||
6. Limitation on Liability.
|
||||
|
||||
EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||
|
||||
7. Termination
|
||||
|
||||
This License and the rights granted hereunder will terminate automatically upon any breach by You of the terms of this License. Individuals or entities who have received Collections from You under this License, however, will not have their licenses terminated provided such individuals or entities remain in full compliance with those licenses. Sections 1, 2, 5, 6, 7, and 8 will survive any termination of this License.
|
||||
Subject to the above terms and conditions, the license granted here is perpetual (for the duration of the applicable copyright in the Work). Notwithstanding the above, Licensor reserves the right to release the Work under different license terms or to stop distributing the Work at any time; provided, however that any such election will not serve to withdraw this License (or any other license that has been, or is required to be, granted under the terms of this License), and this License will continue in full force and effect unless terminated as stated above.
|
||||
|
||||
8. Miscellaneous
|
||||
|
||||
Each time You Distribute or Publicly Perform the Work or a Collection, the Licensor offers to the recipient a license to the Work on the same terms and conditions as the license granted to You under this License.
|
||||
If any provision of this License is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this License, and without further action by the parties to this agreement, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable.
|
||||
No term or provision of this License shall be deemed waived and no breach consented to unless such waiver or consent shall be in writing and signed by the party to be charged with such waiver or consent.
|
||||
This License constitutes the entire agreement between the parties with respect to the Work licensed here. There are no understandings, agreements or representations with respect to the Work not specified here. Licensor shall not be bound by any additional provisions that may appear in any communication from You. This License may not be modified without the mutual written agreement of the Licensor and You.
|
||||
The rights granted under, and the subject matter referenced, in this License were drafted utilizing the terminology of the Berne Convention for the Protection of Literary and Artistic Works (as amended on September 28, 1979), the Rome Convention of 1961, the WIPO Copyright Treaty of 1996, the WIPO Performances and Phonograms Treaty of 1996 and the Universal Copyright Convention (as revised on July 24, 1971). These rights and subject matter take effect in the relevant jurisdiction in which the License terms are sought to be enforced according to the corresponding provisions of the implementation of those treaty provisions in the applicable national law. If the standard suite of rights granted under applicable copyright law includes additional rights not granted under this License, such additional rights are deemed to be included in the License; this License is not intended to restrict the license of any rights under applicable law.
|
||||
Executable
+28
@@ -0,0 +1,28 @@
|
||||
Forestry
|
||||
====================================
|
||||
|
||||
### What is it?
|
||||
|
||||
Forestry is a modification for the game Minecraft and known primarily for its farms and bees.
|
||||
|
||||
### Homepage
|
||||
|
||||
[Wiki](http://forestry.sengir.net/)
|
||||
|
||||
[Forums](http://forestry.sengir.net/forum/)
|
||||
|
||||
[IRC #forestry on esper.net](http://webchat.esper.net/?nick=ForestryWiki...&channels=forestry&prompt=1)
|
||||
|
||||
### Notes
|
||||
|
||||
Beware of ugly code.
|
||||
|
||||
The API resides in its own repository. You will need it to compile this 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. There is no way around that, since otherwise changing the license later - even to something more permissive! - , becomes close to impossible.
|
||||
|
||||
### License & Copyright
|
||||
|
||||
Forestry is (c) 2011 - 2014 SirSengir and licensed under CC BY-NC-ND 3.0. See the LICENSE.txt for all the gory details or go to http://creativecommons.org/licenses/by-nc-nd/3.0/ for more information. Forestry also contains code contributed by CovertJaguar, Player, MysteriousAges, Binnie, RichardG, cpw and others.
|
||||
Executable
+123
@@ -0,0 +1,123 @@
|
||||
buildscript {
|
||||
repositories {
|
||||
mavenCentral()
|
||||
maven {
|
||||
name = "forge"
|
||||
url = "http://files.minecraftforge.net/maven"
|
||||
}
|
||||
maven {
|
||||
name = "sonatype"
|
||||
url = "https://oss.sonatype.org/content/repositories/snapshots/"
|
||||
}
|
||||
}
|
||||
dependencies {
|
||||
classpath 'net.minecraftforge.gradle:ForgeGradle:1.1-SNAPSHOT'
|
||||
}
|
||||
}
|
||||
|
||||
apply plugin: 'forge'
|
||||
|
||||
ext.buildnumber = createBuildNumber()
|
||||
version = "2.4.0.0-" + buildnumber
|
||||
group= "net.sengir.forestry" // http://maven.apache.org/guides/mini/guide-naming-conventions.html
|
||||
archivesBaseName = "forestry"
|
||||
|
||||
ext.langDir = "../Forestry-Localization"
|
||||
ext.srcbcDir = "../BuildCraft/common"
|
||||
ext.srcIc2Dir = "../IC2/src"
|
||||
ext.srcCraftguideDir = "../CraftGuide/src"
|
||||
|
||||
minecraft {
|
||||
version = "1.7.2-10.12.0.1032"
|
||||
assetDir = "eclipse/assets"
|
||||
|
||||
replace '@VERSION@', project.version
|
||||
replace '@BUILD_NUMBER@', project.buildnumber
|
||||
replace '$___$', rndString()
|
||||
replace '$____$', rndString()
|
||||
replace '$_____$', rndString()
|
||||
replace '$______$', rndString()
|
||||
replace '$_______$', rndString()
|
||||
replace '$________$', rndString()
|
||||
replace '$_________$', rndString()
|
||||
replace '$__________$', rndString()
|
||||
}
|
||||
|
||||
sourceSets {
|
||||
api {
|
||||
java {
|
||||
srcDir project.srcCraftguideDir
|
||||
include '**/CraftGuide/api/**'
|
||||
}
|
||||
}
|
||||
|
||||
main {
|
||||
java {
|
||||
srcDirs file('forestry_common').listFiles()
|
||||
include 'forestry/**'
|
||||
|
||||
srcDir project.srcbcDir
|
||||
include 'buildcraft/api/**'
|
||||
|
||||
srcDir project.srcIc2Dir
|
||||
include 'api/**'
|
||||
}
|
||||
resources {
|
||||
srcDir 'forestry_resources'
|
||||
srcDir project.langDir
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
processResources {
|
||||
// replace stuff in mcmod.info, nothing else
|
||||
from(sourceSets.main.resources.srcDirs) {
|
||||
include 'mcmod.info'
|
||||
|
||||
// replace version and mcversion
|
||||
expand 'version':project.version, 'mcversion':project.minecraft.version
|
||||
}
|
||||
|
||||
// copy everything else, thats not the mcmod.info
|
||||
from(sourceSets.main.resources.srcDirs) {
|
||||
exclude 'mcmod.info'
|
||||
exclude '**/*.md'
|
||||
}
|
||||
}
|
||||
|
||||
task apiZip(type: Jar) {
|
||||
from sourceSets.main.allSource
|
||||
include 'forestry/api/**'
|
||||
classifier = 'api'
|
||||
extension = 'zip'
|
||||
}
|
||||
|
||||
task deobfJar(type: Jar) {
|
||||
from sourceSets.main.output
|
||||
classifier = 'dev'
|
||||
}
|
||||
|
||||
build.dependsOn apiZip, deobfJar
|
||||
|
||||
def rndString() {
|
||||
String AB = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
|
||||
Random rnd = new Random()
|
||||
String ret = ""
|
||||
int max = rnd.nextInt(18) + 3
|
||||
|
||||
for (int i = 0; i < max; i++) {
|
||||
ret += AB.charAt(rnd.nextInt(AB.length()))
|
||||
}
|
||||
|
||||
int rndStart = rnd.nextInt(6) + 2
|
||||
rndStart = rndStart >= ret.length() - 4 ? 3 : rndStart;
|
||||
|
||||
return ret.substring(0, rndStart).toLowerCase(Locale.ENGLISH) + ret.substring(rndStart)
|
||||
}
|
||||
|
||||
def createBuildNumber() {
|
||||
ant.buildnumber()
|
||||
|
||||
return ant.antProject.properties['build.number']
|
||||
}
|
||||
|
||||
Executable
+3
@@ -0,0 +1,3 @@
|
||||
#Build Number for ANT. Do not edit!
|
||||
#Mon Mar 31 06:46:14 CEST 2014
|
||||
build.number=712
|
||||
@@ -0,0 +1,352 @@
|
||||
<project name="Forestry" basedir="../../../" default="main">
|
||||
|
||||
<property name="build.dir" value="build/forestry" />
|
||||
<property name="classes.dir" value="${build.dir}/classes" />
|
||||
<property name="api.dir" value="${build.dir}/api" />
|
||||
<property name="jar.dir" value="build/jar" />
|
||||
<property name="resource.dir" value="build/mc.dev" />
|
||||
|
||||
<property name="src.dir" value="sources/forestry" />
|
||||
<property name="lang.dir" value="sources/forestry-localization" />
|
||||
<property name="src.bc.dir" value="sources/buildcraft" />
|
||||
<property name="src.ic2.dir" value="sources/ic2" />
|
||||
<property name="src.craftguide.dir" value="sources/CraftGuide/src" />
|
||||
|
||||
<property name="forge.dir" value="${build.dir}/forge" />
|
||||
<property name="mcp.dir" value="${forge.dir}/mcp" />
|
||||
|
||||
<property name="clientsrc.dir" value="${mcp.dir}/src/minecraft" />
|
||||
|
||||
<property name="mc.version" value="1.6.4"/>
|
||||
<property name="forge.version" value="9.11.1.942"/>
|
||||
<property name="forestry.version" value="2.3.1.1"/>
|
||||
<property name="api.version" value="2.3.1.0"/>
|
||||
|
||||
<!-- for local deployment only, not used by main -->
|
||||
<property name="key.dir" value="forestryKey" />
|
||||
<property name="deploy.type" value="releases" />
|
||||
<property name="deploy.root" value="c:\users\kanzlei\Dropbox\Public\forestry" />
|
||||
<property name="deploy.dir" value="${deploy.root}\${deploy.type}" />
|
||||
<property name="deploy.javadoc" value="${deploy.root}\javadoc" />
|
||||
<property name="share.dir" value="c:\users\kanzlei\Dropbox\Shared\forestry" />
|
||||
<property name="local.dir" value="%appdata%\.minecraft\mods" />
|
||||
|
||||
<!-- TARGETS -->
|
||||
<target name="clean">
|
||||
<delete dir="${clientsrc.dir}" />
|
||||
<mkdir dir="${clientsrc.dir}" />
|
||||
<copy todir="${clientsrc.dir}">
|
||||
<fileset dir="${clientsrc.dir}.orig" />
|
||||
</copy>
|
||||
|
||||
<delete dir="${mcp.dir}/reobf" />
|
||||
</target>
|
||||
|
||||
<target name="forgeclean">
|
||||
<!-- Extract Forge -->
|
||||
<echo message="Unpacking Forge..." />
|
||||
<unzip dest="${build.dir}">
|
||||
<fileset dir="${resource.dir}">
|
||||
<include name="minecraftforge-src-${mc.version}-${forge.version}.zip"/>
|
||||
</fileset>
|
||||
</unzip>
|
||||
|
||||
<chmod file="${forge.dir}/install.sh" perm="+x"/>
|
||||
|
||||
<!-- Install forge -->
|
||||
<echo message="Installing Forge..." />
|
||||
<exec dir="${forge.dir}" executable="cmd" osfamily="windows">
|
||||
<arg line="/c install.cmd"/>
|
||||
</exec>
|
||||
|
||||
<exec dir="${forge.dir}" executable="sh" osfamily="unix">
|
||||
<arg value="install.sh" />
|
||||
</exec>
|
||||
|
||||
<mkdir dir="${clientsrc.dir}.orig" />
|
||||
<copy todir="${clientsrc.dir}.orig">
|
||||
<fileset dir="${clientsrc.dir}" />
|
||||
</copy>
|
||||
</target>
|
||||
|
||||
<target name="setup.base">
|
||||
|
||||
<javac srcdir="${src.dir}/forestry_resources/" includes="RandString.java" failonerror="true" />
|
||||
<java classpath="${src.dir}/forestry_resources/" classname="RandString" failonerror="true" />
|
||||
|
||||
<loadfile property="rn.weird0" srcFile="${build.dir}/rnd.string.0.txt"/>
|
||||
<loadfile property="rn.weird1" srcFile="${build.dir}/rnd.string.1.txt"/>
|
||||
<loadfile property="rn.weird2" srcFile="${build.dir}/rnd.string.2.txt"/>
|
||||
<loadfile property="rn.weird3" srcFile="${build.dir}/rnd.string.3.txt"/>
|
||||
<loadfile property="rn.weird4" srcFile="${build.dir}/rnd.string.4.txt"/>
|
||||
<loadfile property="rn.weird5" srcFile="${build.dir}/rnd.string.5.txt"/>
|
||||
<loadfile property="rn.weird6" srcFile="${build.dir}/rnd.string.6.txt"/>
|
||||
<loadfile property="rn.weird7" srcFile="${build.dir}/rnd.string.7.txt"/>
|
||||
|
||||
<!-- Pull localizations -->
|
||||
<echo message="Pulling localizations..." />
|
||||
<exec dir="${lang.dir}" executable="git" osfamily="windows" failonerror="true">
|
||||
<arg line="pull" />
|
||||
</exec>
|
||||
|
||||
<!-- Copy IC2 API -->
|
||||
<echo message="Adding IC2 API..." />
|
||||
<copy todir="${clientsrc.dir}">
|
||||
<fileset dir="${src.ic2.dir}" />
|
||||
</copy>
|
||||
|
||||
<!-- Copy CraftGuide API -->
|
||||
<echo message="Adding CraftGuide API..." />
|
||||
<copy todir="${clientsrc.dir}">
|
||||
<fileset dir="${src.craftguide.dir}">
|
||||
<include name="**/api/**" />
|
||||
</fileset>
|
||||
</copy>
|
||||
|
||||
<!-- Set build number -->
|
||||
<buildnumber file="${src.dir}/forestry_resources/build.number"/>
|
||||
|
||||
<!-- Copy Forestry source -->
|
||||
<echo message="Adding Forestry..." />
|
||||
<copy todir="${clientsrc.dir}">
|
||||
<fileset dir="${src.dir}/forestry_common">
|
||||
<include name="**/forestry/**" />
|
||||
</fileset>
|
||||
</copy>
|
||||
|
||||
<!--<loadfile srcfile="${key.dir}/fingerprint.txt" property="key.fingerprint" />-->
|
||||
|
||||
<copy todir="${clientsrc.dir}" overwrite="true" failonerror="true">
|
||||
<fileset dir="${src.dir}/forestry_common">
|
||||
<include name="**/Version.java" />
|
||||
<include name="**/package-info.java" />
|
||||
</fileset>
|
||||
<filterset>
|
||||
<filter token="VERSION" value="${forestry.version}" />
|
||||
<filter token="BUILD_NUMBER" value="${build.number}" />
|
||||
<!--<filter token="FINGERPRINT" value="${key.fingerprint}" />-->
|
||||
</filterset>
|
||||
</copy>
|
||||
|
||||
<copy todir="${clientsrc.dir}" overwrite="true" failonerror="true">
|
||||
<fileset dir="${src.dir}/forestry_common">
|
||||
<include name="**/PluginCore.java" />
|
||||
</fileset>
|
||||
<filterset begintoken="$" endtoken="$">
|
||||
<filter token="___" value="${rn.weird0}" />
|
||||
<filter token="____" value="${rn.weird1}" />
|
||||
<filter token="_____" value="${rn.weird2}" />
|
||||
<filter token="______" value="${rn.weird3}" />
|
||||
<filter token="_______" value="${rn.weird4}" />
|
||||
<filter token="________" value="${rn.weird5}" />
|
||||
<filter token="_________" value="${rn.weird6}" />
|
||||
<filter token="__________" value="${rn.weird7}" />
|
||||
</filterset>
|
||||
</copy>
|
||||
|
||||
</target>
|
||||
|
||||
<!-- SETUP FOR BC 3 -->
|
||||
<target name="setup" depends="setup.base">
|
||||
|
||||
<!-- Copy BC source -->
|
||||
<echo message="Adding BuildCraft..." />
|
||||
<copy todir="${clientsrc.dir}">
|
||||
<fileset dir="${src.bc.dir}/common">
|
||||
<exclude name="**/buildcraft/devel/*"/>
|
||||
</fileset>
|
||||
</copy>
|
||||
<!-- Copy integration -->
|
||||
<copy todir="${clientsrc.dir}">
|
||||
<fileset dir="${src.dir}/pipes_common">
|
||||
<include name="**/forestry/**" />
|
||||
</fileset>
|
||||
</copy>
|
||||
</target>
|
||||
|
||||
<!-- COMPILATION -->
|
||||
<target name="compile">
|
||||
|
||||
<!-- Recompile -->
|
||||
<exec dir="${mcp.dir}" executable="cmd" osfamily="windows">
|
||||
<arg line="/c recompile.bat"/>
|
||||
</exec>
|
||||
|
||||
<exec dir="${mcp.dir}" executable="sh" osfamily="unix">
|
||||
<arg value="recompile.sh" />
|
||||
</exec>
|
||||
|
||||
<!-- Reobf -->
|
||||
<exec dir="${mcp.dir}" executable="cmd" osfamily="windows">
|
||||
<arg line="/c reobfuscate_srg.bat"/>
|
||||
</exec>
|
||||
|
||||
<exec dir="${mcp.dir}" executable="sh" osfamily="unix">
|
||||
<arg value="reobfuscate_srg.sh" />
|
||||
</exec>
|
||||
|
||||
<!-- Copy unobfuscated classes for dev jar -->
|
||||
<copy todir="${classes.dir}/unobf">
|
||||
<fileset dir="${mcp.dir}/bin/minecraft">
|
||||
<include name="**/forestry/**" />
|
||||
<exclude name="**/forestry/api/**" />
|
||||
</fileset>
|
||||
</copy>
|
||||
<copy todir="${classes.dir}/unobf_api">
|
||||
<fileset dir="${mcp.dir}/bin/minecraft">
|
||||
<include name="**/forestry/api/**" />
|
||||
<include name="**/ic2/api/**" />
|
||||
<include name="**/buildcraft/api/**" />
|
||||
</fileset>
|
||||
</copy>
|
||||
<copy todir="${classes.dir}/unobf_api">
|
||||
<fileset dir="${src.dir}/forestry_resources">
|
||||
<exclude name="build.xml"/>
|
||||
<exclude name="build.number"/>
|
||||
<exclude name="RandString.java"/>
|
||||
<exclude name="RandString.class"/>
|
||||
</fileset>
|
||||
</copy>
|
||||
<copy todir="${classes.dir}/unobf_api" overwrite="true" failonerror="true">
|
||||
<fileset dir="${src.dir}/forestry_resources">
|
||||
<include name="mcmod.info"/>
|
||||
</fileset>
|
||||
<filterset>
|
||||
<filter token="VERSION" value="${forestry.version}_dev (${build.number}_dev)" />
|
||||
<filter token="MCVERSION" value="${mc.version}" />
|
||||
</filterset>
|
||||
</copy>
|
||||
|
||||
<!-- Copy Forestry classes -->
|
||||
<copy todir="${classes.dir}/client">
|
||||
<fileset dir="${mcp.dir}/reobf/minecraft">
|
||||
<include name="**/forestry/**" />
|
||||
<exclude name="**/forestry/api/**" />
|
||||
</fileset>
|
||||
</copy>
|
||||
|
||||
<!-- Copy Forestry resources -->
|
||||
<copy todir="${classes.dir}/api">
|
||||
<fileset dir="${src.dir}/forestry_resources">
|
||||
<exclude name="build.xml"/>
|
||||
<exclude name="build.number"/>
|
||||
<exclude name="RandString.java"/>
|
||||
<exclude name="RandString.class"/>
|
||||
</fileset>
|
||||
</copy>
|
||||
<copy todir="${classes.dir}/api" overwrite="true" failonerror="true">
|
||||
<fileset dir="${src.dir}/forestry_resources">
|
||||
<include name="mcmod.info"/>
|
||||
</fileset>
|
||||
<filterset>
|
||||
<filter token="VERSION" value="${forestry.version} (${build.number})" />
|
||||
<filter token="MCVERSION" value="${mc.version}" />
|
||||
</filterset>
|
||||
</copy>
|
||||
<!-- Copy localizations -->
|
||||
<copy todir="${classes.dir}/api">
|
||||
<fileset dir="${lang.dir}">
|
||||
<exclude name="README.md"/>
|
||||
</fileset>
|
||||
</copy>
|
||||
|
||||
<!-- Copy compiled API seperately to not sign them -->
|
||||
<copy todir="${classes.dir}/api">
|
||||
<fileset dir="${mcp.dir}/reobf/minecraft">
|
||||
<include name="**/forestry/api/**" />
|
||||
<include name="**/ic2/api/**" />
|
||||
<include name="**/buildcraft/api/**" />
|
||||
</fileset>
|
||||
</copy>
|
||||
|
||||
<!-- Copy Forestry api -->
|
||||
<copy todir="${api.dir}" overwrite="true">
|
||||
<fileset dir="${src.dir}/forestry_common/core">
|
||||
<include name="**/forestry/api/**" />
|
||||
</fileset>
|
||||
</copy>
|
||||
|
||||
|
||||
</target>
|
||||
|
||||
<target name="javadoc">
|
||||
<javadoc
|
||||
destdir="${deploy.javadoc}"
|
||||
classpath="${mcp.dir}/bin/minecraft"
|
||||
windowtitle="Forestry API ${forestry.version}"
|
||||
author="true"
|
||||
version="true">
|
||||
<packageset dir="${clientsrc.dir}/core" defaultexcludes="yes">
|
||||
<include name="forestry/api/**"/>
|
||||
</packageset>
|
||||
</javadoc>
|
||||
</target>
|
||||
|
||||
<!-- Package the jars -->
|
||||
<target name="package" depends="clean,setup,compile">
|
||||
|
||||
<!--<loadfile srcfile="${key.dir}/pass.txt" property="key.pass" />-->
|
||||
|
||||
<copy todir="${jar.dir}">
|
||||
<fileset dir="${classes.dir}/client">
|
||||
<include name="CHANGELOG.txt" />
|
||||
</fileset>
|
||||
</copy>
|
||||
|
||||
<echo message="Packaging dev jar..." />
|
||||
<jar destfile="${jar.dir}/forestry-A-${forestry.version}_dev.jar" basedir="${classes.dir}/unobf"/>
|
||||
<!--<signjar jar="${jar.dir}/forestry-A-${forestry.version}_dev.jar" keystore="${key.dir}/forestryKey" alias="sirsengir" storepass="${key.pass}"/>-->
|
||||
<zip update="true" destfile="${jar.dir}/forestry-A-${forestry.version}_dev.jar">
|
||||
<fileset dir="${classes.dir}/unobf_api" />
|
||||
</zip>
|
||||
|
||||
<echo message="Packaging basic jar..." />
|
||||
<jar destfile="${jar.dir}/forestry-A-${forestry.version}-${build.number}.jar" basedir="${classes.dir}/client"/>
|
||||
<!--<echo message="Signing basic jar..." />
|
||||
<signjar jar="${jar.dir}/forestry-A-${forestry.version}.jar" keystore="${key.dir}/forestryKey" alias="sirsengir" storepass="${key.pass}"/>-->
|
||||
|
||||
<echo message="Adding APIs to signed jar..." />
|
||||
<zip update="true" destfile="${jar.dir}/forestry-A-${forestry.version}-${build.number}.jar">
|
||||
<fileset dir="${classes.dir}/api" />
|
||||
</zip>
|
||||
|
||||
<echo message="Packaging API source distribution..." />
|
||||
<zip destfile="${jar.dir}/forestry-api-${api.version}.zip" basedir="${api.dir}" update="true" />
|
||||
</target>
|
||||
|
||||
<!-- Deploy to private share -->
|
||||
<target name="deploy.private" depends="clean,package">
|
||||
<copy todir="${local.dir}">
|
||||
<fileset dir="${jar.dir}">
|
||||
<include name="forestry-*.jar" />
|
||||
</fileset>
|
||||
</copy>
|
||||
<copy todir="${share.dir}/${forestry.version}">
|
||||
<fileset dir="${jar.dir}">
|
||||
<include name="forestry-*.jar" />
|
||||
<include name="forestry-api-*.zip" />
|
||||
<include name="CHANGELOG.txt" />
|
||||
</fileset>
|
||||
</copy>
|
||||
</target>
|
||||
|
||||
<!-- Deploy to public share -->
|
||||
<target name="deploy.public" depends="deploy.private,javadoc">
|
||||
<copy todir="${deploy.dir}/${forestry.version}">
|
||||
<fileset dir="${jar.dir}">
|
||||
<include name="forestry-*.jar" />
|
||||
<include name="forestry-api-*.zip" />
|
||||
</fileset>
|
||||
</copy>
|
||||
|
||||
<copy todir="${deploy.root}/changelog">
|
||||
<fileset dir="${src.dir}/forestry_resources/changelog">
|
||||
<include name="*" />
|
||||
</fileset>
|
||||
</copy>
|
||||
</target>
|
||||
|
||||
<!-- Clean build target without copying of jars -->
|
||||
<target name="main" depends="package" />
|
||||
|
||||
</project>
|
||||
@@ -0,0 +1,325 @@
|
||||
/*******************************************************************************
|
||||
* Copyright 2011-2014 by SirSengir
|
||||
*
|
||||
* This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.
|
||||
*
|
||||
* To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/3.0/.
|
||||
******************************************************************************/
|
||||
package forestry.apiculture;
|
||||
|
||||
import java.util.Stack;
|
||||
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.nbt.NBTTagCompound;
|
||||
import net.minecraft.nbt.NBTTagList;
|
||||
|
||||
import forestry.api.apiculture.EnumBeeType;
|
||||
import forestry.api.apiculture.IApiaristTracker;
|
||||
import forestry.api.apiculture.IBee;
|
||||
import forestry.api.apiculture.IBeeHousing;
|
||||
import forestry.api.apiculture.IBeekeepingLogic;
|
||||
import forestry.api.genetics.IEffectData;
|
||||
import forestry.api.genetics.IIndividual;
|
||||
import forestry.core.EnumErrorCode;
|
||||
import forestry.core.config.Defaults;
|
||||
import forestry.core.config.ForestryItem;
|
||||
import forestry.core.proxy.Proxies;
|
||||
import forestry.plugins.PluginApiculture;
|
||||
|
||||
public class BeekeepingLogic implements IBeekeepingLogic {
|
||||
|
||||
private static final int MAX_POLLINATION_ATTEMPTS = 20;
|
||||
IBeeHousing housing;
|
||||
// Breeding
|
||||
private int breedingTime;
|
||||
private final int totalBreedingTime = Defaults.APIARY_BREEDING_TIME;
|
||||
private int throttle;
|
||||
private IEffectData effectData[] = new IEffectData[2];
|
||||
private IBee queen;
|
||||
private IIndividual pollen;
|
||||
private int attemptedPollinations = 0;
|
||||
private final Stack<ItemStack> spawn = new Stack<ItemStack>();
|
||||
|
||||
public BeekeepingLogic(IBeeHousing housing) {
|
||||
this.housing = housing;
|
||||
}
|
||||
|
||||
// / SAVING & LOADING
|
||||
@Override
|
||||
public void readFromNBT(NBTTagCompound nbttagcompound) {
|
||||
breedingTime = nbttagcompound.getInteger("BreedingTime");
|
||||
throttle = nbttagcompound.getInteger("Throttle");
|
||||
|
||||
NBTTagList nbttaglist = new NBTTagList();
|
||||
while (!spawn.isEmpty()) {
|
||||
NBTTagCompound nbttagcompound1 = new NBTTagCompound();
|
||||
spawn.pop().writeToNBT(nbttagcompound1);
|
||||
nbttaglist.appendTag(nbttagcompound1);
|
||||
}
|
||||
nbttagcompound.setTag("Offspring", nbttaglist);
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void writeToNBT(NBTTagCompound nbttagcompound) {
|
||||
nbttagcompound.setInteger("BreedingTime", breedingTime);
|
||||
nbttagcompound.setInteger("Throttle", throttle);
|
||||
|
||||
NBTTagList nbttaglist = nbttagcompound.getTagList("Offspring", 10);
|
||||
for (int i = 0; i < nbttaglist.tagCount(); i++) {
|
||||
spawn.add(ItemStack.loadItemStackFromNBT(nbttaglist.getCompoundTagAt(i)));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// / STATE INFORMATION
|
||||
@Override
|
||||
public int getBreedingTime() {
|
||||
return this.breedingTime;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getTotalBreedingTime() {
|
||||
return this.totalBreedingTime;
|
||||
}
|
||||
|
||||
@Override
|
||||
public IBee getQueen() {
|
||||
return this.queen;
|
||||
}
|
||||
|
||||
@Override
|
||||
public IBeeHousing getHousing() {
|
||||
return this.housing;
|
||||
}
|
||||
|
||||
@Override
|
||||
public IEffectData[] getEffectData() {
|
||||
return this.effectData;
|
||||
}
|
||||
|
||||
/* UPDATING */
|
||||
@Override
|
||||
public void update() {
|
||||
|
||||
resetQueen(null);
|
||||
|
||||
// Still something to spawn, try it
|
||||
while (!spawn.isEmpty()) {
|
||||
ItemStack next = spawn.peek();
|
||||
if (housing.addProduct(next, true)) {
|
||||
spawn.pop();
|
||||
housing.setErrorState(EnumErrorCode.OK.ordinal());
|
||||
} else
|
||||
housing.setErrorState(EnumErrorCode.NOSPACE.ordinal());
|
||||
return;
|
||||
}
|
||||
|
||||
// No queen? And no princess?
|
||||
if (housing.getQueen() == null) {
|
||||
housing.setErrorState(EnumErrorCode.NOQUEEN.ordinal());
|
||||
return;
|
||||
}
|
||||
|
||||
// Princess available? Try to breed!
|
||||
if (ForestryItem.beePrincessGE.isItemEqual(housing.getQueen())) {
|
||||
if (ForestryItem.beeDroneGE.isItemEqual(housing.getDrone()))
|
||||
housing.setErrorState(EnumErrorCode.NODRONE.ordinal());
|
||||
else
|
||||
housing.setErrorState(EnumErrorCode.OK.ordinal());
|
||||
tickBreed();
|
||||
return;
|
||||
}
|
||||
|
||||
// Can't continue if an item of the wrong type is in the queen slot.
|
||||
if (!ForestryItem.beeQueenGE.isItemEqual(housing.getQueen())) {
|
||||
housing.setErrorState(EnumErrorCode.NOQUEEN.ordinal());
|
||||
return;
|
||||
}
|
||||
|
||||
IBee queen = PluginApiculture.beeInterface.getMember(housing.getQueen());
|
||||
// Kill dying queens
|
||||
if (!queen.isAlive()) {
|
||||
killQueen(queen);
|
||||
housing.setErrorState(EnumErrorCode.OK.ordinal());
|
||||
return;
|
||||
}
|
||||
|
||||
resetQueen(queen);
|
||||
|
||||
// Not while raining, at night or without light
|
||||
EnumErrorCode state = EnumErrorCode.values()[queen.isWorking(housing)];
|
||||
if (state != EnumErrorCode.OK) {
|
||||
housing.setErrorState(state.ordinal());
|
||||
return;
|
||||
} else if (housing.getErrorOrdinal() != EnumErrorCode.NOFLOWER.ordinal())
|
||||
housing.setErrorState(EnumErrorCode.OK.ordinal());
|
||||
|
||||
// Effects only fire when queen can work.
|
||||
effectData = queen.doEffect(effectData, housing);
|
||||
|
||||
// We have a queen, work!
|
||||
throttle++;
|
||||
|
||||
if (throttle >= PluginApiculture.beeCycleTicks)
|
||||
throttle = 0;
|
||||
else
|
||||
return;
|
||||
|
||||
// Need a flower
|
||||
if (!queen.hasFlower(housing)) {
|
||||
housing.setErrorState(EnumErrorCode.NOFLOWER.ordinal());
|
||||
return;
|
||||
} else
|
||||
housing.setErrorState(EnumErrorCode.OK.ordinal());
|
||||
|
||||
// Produce and add stacks
|
||||
ItemStack[] products = queen.produceStacks(housing);
|
||||
housing.wearOutEquipment(1);
|
||||
for (ItemStack stack : products) {
|
||||
housing.addProduct(stack, false);
|
||||
}
|
||||
|
||||
// Plant a flower
|
||||
queen.plantFlowerRandom(housing);
|
||||
// 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;
|
||||
}
|
||||
}
|
||||
|
||||
// Age the queen
|
||||
queen.age(housing.getWorld(), housing.getLifespanModifier(queen.getGenome(), queen.getMate(), 0f));
|
||||
|
||||
// Write the changed queen back into the item stack.
|
||||
NBTTagCompound nbttagcompound = new NBTTagCompound();
|
||||
queen.writeToNBT(nbttagcompound);
|
||||
housing.getQueen().setTagCompound(nbttagcompound);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
private void resetQueen(IBee bee) {
|
||||
this.queen = bee;
|
||||
}
|
||||
|
||||
// / BREEDING
|
||||
private void tickBreed() {
|
||||
if (!tryBreed()) {
|
||||
breedingTime = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
if (breedingTime < totalBreedingTime)
|
||||
breedingTime++;
|
||||
if (breedingTime < totalBreedingTime)
|
||||
return;
|
||||
|
||||
// Breeding done, create new queen if slot available
|
||||
if (!ForestryItem.beePrincessGE.isItemEqual(housing.getQueen()))
|
||||
return;
|
||||
|
||||
// Replace
|
||||
IBee princess = PluginApiculture.beeInterface.getMember(housing.getQueen());
|
||||
IBee drone = PluginApiculture.beeInterface.getMember(housing.getDrone());
|
||||
princess.mate(drone);
|
||||
|
||||
NBTTagCompound nbttagcompound = new NBTTagCompound();
|
||||
princess.writeToNBT(nbttagcompound);
|
||||
ItemStack queen = ForestryItem.beeQueenGE.getItemStack();
|
||||
queen.setTagCompound(nbttagcompound);
|
||||
|
||||
housing.setQueen(queen);
|
||||
housing.onQueenChange(housing.getQueen());
|
||||
|
||||
// Register the new queen with the breeding tracker
|
||||
PluginApiculture.beeInterface.getBreedingTracker(housing.getWorld(), housing.getOwnerName()).registerQueen(princess);
|
||||
|
||||
// Remove drone
|
||||
housing.getDrone().stackSize--;
|
||||
if (housing.getDrone().stackSize <= 0)
|
||||
housing.setDrone(null);
|
||||
|
||||
// Reset breeding time
|
||||
breedingTime = 0;
|
||||
}
|
||||
|
||||
private boolean tryBreed() {
|
||||
if (housing.getDrone() == null || housing.getQueen() == null)
|
||||
return false;
|
||||
|
||||
if (!ForestryItem.beeDroneGE.isItemEqual(housing.getDrone()) || !ForestryItem.beePrincessGE.isItemEqual(housing.getQueen()))
|
||||
return false;
|
||||
|
||||
if (!housing.canBreed())
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
private void killQueen(IBee queen) {
|
||||
if (queen.canSpawn()) {
|
||||
spawnOffspring(queen);
|
||||
housing.getQueen().stackSize = 0;
|
||||
housing.setQueen(null);
|
||||
} else {
|
||||
Proxies.log.warning("Tried to spawn offspring off an unmated queen. Devolving her to a princess.");
|
||||
|
||||
ItemStack convert = ForestryItem.beePrincessGE.getItemStack();
|
||||
NBTTagCompound nbttagcompound = new NBTTagCompound();
|
||||
queen.writeToNBT(nbttagcompound);
|
||||
convert.setTagCompound(nbttagcompound);
|
||||
|
||||
spawn.add(convert);
|
||||
housing.setQueen(null);
|
||||
}
|
||||
housing.onQueenChange(housing.getQueen());
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates the succeeding princess and between one and three drones.
|
||||
*/
|
||||
private void spawnOffspring(IBee queen) {
|
||||
|
||||
Stack<ItemStack> offspring = new Stack<ItemStack>();
|
||||
IApiaristTracker breedingTracker = PluginApiculture.beeInterface.getBreedingTracker(housing.getWorld(), housing.getOwnerName());
|
||||
|
||||
housing.onQueenDeath(getQueen());
|
||||
|
||||
// Princess
|
||||
IBee heiress = queen.spawnPrincess(housing);
|
||||
if (heiress != null) {
|
||||
ItemStack princess = PluginApiculture.beeInterface.getMemberStack(heiress, EnumBeeType.PRINCESS.ordinal());
|
||||
breedingTracker.registerPrincess(heiress);
|
||||
offspring.push(princess);
|
||||
}
|
||||
|
||||
// Drones
|
||||
IBee[] larvae = queen.spawnDrones(housing);
|
||||
for (IBee larva : larvae) {
|
||||
ItemStack drone = PluginApiculture.beeInterface.getMemberStack(larva, EnumBeeType.DRONE.ordinal());
|
||||
breedingTracker.registerDrone(larva);
|
||||
offspring.push(drone);
|
||||
}
|
||||
|
||||
while (!offspring.isEmpty()) {
|
||||
ItemStack spawned = offspring.pop();
|
||||
if (!housing.addProduct(spawned, true))
|
||||
spawn.add(spawned);
|
||||
}
|
||||
|
||||
housing.onPostQueenDeath(getQueen());
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,245 @@
|
||||
/*******************************************************************************
|
||||
* Copyright 2011-2014 by SirSengir
|
||||
*
|
||||
* This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.
|
||||
*
|
||||
* To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/3.0/.
|
||||
******************************************************************************/
|
||||
package forestry.apiculture;
|
||||
|
||||
import java.io.BufferedWriter;
|
||||
import java.io.File;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.OutputStreamWriter;
|
||||
import java.text.DateFormat;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
|
||||
import net.minecraft.command.CommandException;
|
||||
import net.minecraft.command.ICommand;
|
||||
import net.minecraft.command.ICommandSender;
|
||||
import net.minecraft.command.WrongUsageException;
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
import forestry.api.apiculture.IAlleleBeeSpecies;
|
||||
import forestry.api.apiculture.IApiaristTracker;
|
||||
import forestry.api.apiculture.IBeekeepingMode;
|
||||
import forestry.api.genetics.AlleleManager;
|
||||
import forestry.api.genetics.IAllele;
|
||||
import forestry.core.config.Defaults;
|
||||
import forestry.core.config.Version;
|
||||
import forestry.core.proxy.Proxies;
|
||||
import forestry.core.utils.CommandMC;
|
||||
import forestry.core.utils.StringUtil;
|
||||
import forestry.plugins.PluginApiculture;
|
||||
|
||||
public class CommandBeekeepingMode extends CommandMC {
|
||||
|
||||
String[] modeStrings;
|
||||
|
||||
public CommandBeekeepingMode() {
|
||||
modeStrings = new String[PluginApiculture.beeInterface.getBeekeepingModes().size()];
|
||||
for (int i = 0; i < PluginApiculture.beeInterface.getBeekeepingModes().size(); i++)
|
||||
modeStrings[i] = PluginApiculture.beeInterface.getBeekeepingModes().get(i).getName();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int compareTo(Object arg0) {
|
||||
return this.getCommandName().compareTo(((ICommand) arg0).getCommandName());
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getCommandName() {
|
||||
return "beekeeping";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getCommandUsage(ICommandSender var1) {
|
||||
return "/" + this.getCommandName() + " help";
|
||||
}
|
||||
|
||||
@SuppressWarnings("rawtypes")
|
||||
@Override
|
||||
public List getCommandAliases() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void processCommand(ICommandSender sender, String[] arguments) {
|
||||
|
||||
if (arguments.length <= 0)
|
||||
throw new WrongUsageException("Type '" + this.getCommandUsage(sender) + "' for help.");
|
||||
|
||||
if (arguments[0].matches("list"))
|
||||
listModes(sender, arguments);
|
||||
else if (arguments[0].matches("info"))
|
||||
listModeInfo(sender, arguments);
|
||||
else if (arguments[0].matches("set")) {
|
||||
if (arguments.length <= 1)
|
||||
throw new WrongUsageException("/" + this.getCommandName() + " set [<world-#>] <mode-name>");
|
||||
|
||||
World world = getWorld(sender, arguments);
|
||||
String desired = arguments[arguments.length - 1];
|
||||
|
||||
IBeekeepingMode mode = PluginApiculture.beeInterface.getBeekeepingMode(desired);
|
||||
if (mode == null)
|
||||
throw new CommandException("A bekeeping mode called '%s' is not available.", desired);
|
||||
|
||||
PluginApiculture.beeInterface.setBeekeepingMode(world, mode.getName());
|
||||
notifyAdmins(sender, "Beekeeping mode set to %s.", mode.getName());
|
||||
|
||||
} else if (arguments[0].matches("save")) {
|
||||
if (arguments.length <= 1)
|
||||
throw new WrongUsageException("/" + this.getCommandName() + " save <player-name>");
|
||||
|
||||
saveStatistics(sender, arguments);
|
||||
} else if (arguments[0].matches("help")) {
|
||||
sendChatMessage(sender, "Format: '/" + this.getCommandName() + " <command> <arguments>'");
|
||||
sendChatMessage(sender, "Available commands:");
|
||||
sendChatMessage(sender, "- list [<world-#>]: lists current and available beekeeping modes.");
|
||||
sendChatMessage(sender, "- info <mode-name> : information on beekeeping mode.");
|
||||
sendChatMessage(sender, "- set [<world-#>] <mode-name>: set beekeeping mode for world.");
|
||||
sendChatMessage(sender, "- save [<world-#>] <player-name>: save beekeeping statistics for the given player.");
|
||||
}
|
||||
}
|
||||
|
||||
private void saveStatistics(ICommandSender sender, String[] arguments) {
|
||||
|
||||
String newLine = System.getProperty("line.separator");
|
||||
World world = getWorld(sender, arguments);
|
||||
|
||||
String player = arguments[1];
|
||||
Collection<String> statistics = new ArrayList<String>();
|
||||
|
||||
statistics.add(String.format("Beekeeping statistics for %s on %s:", player, DateFormat.getInstance().format(new Date())));
|
||||
statistics.add("");
|
||||
statistics.add("MODE: " + PluginApiculture.beeInterface.getBeekeepingMode(world).getName());
|
||||
statistics.add("");
|
||||
|
||||
IApiaristTracker tracker = PluginApiculture.beeInterface.getBreedingTracker(world, player);
|
||||
if (tracker == null)
|
||||
statistics.add("No statistics found.");
|
||||
else {
|
||||
statistics.add("BRED:");
|
||||
statistics.add("-----");
|
||||
statistics.add("");
|
||||
|
||||
statistics.add("Queens:\t\t" + tracker.getQueenCount());
|
||||
statistics.add("Princesses:\t" + tracker.getPrincessCount());
|
||||
statistics.add("Drones:\t\t" + tracker.getDroneCount());
|
||||
statistics.add("");
|
||||
|
||||
Collection<IAlleleBeeSpecies> species = new ArrayList<IAlleleBeeSpecies>();
|
||||
for (IAllele allele : AlleleManager.alleleRegistry.getRegisteredAlleles().values())
|
||||
if (allele instanceof IAlleleBeeSpecies)
|
||||
species.add((IAlleleBeeSpecies) allele);
|
||||
|
||||
statistics.add(String.format("SPECIES (%s):", species.size()));
|
||||
statistics.add("-------------");
|
||||
statistics.add("");
|
||||
|
||||
for (IAlleleBeeSpecies allele : species)
|
||||
statistics.add(generateSpeciesListEntry(allele, tracker));
|
||||
}
|
||||
|
||||
File file = new File(Proxies.common.getForestryRoot(), "config/" + Defaults.MOD.toLowerCase(Locale.ENGLISH) + "/stats/" + player + ".log");
|
||||
try {
|
||||
|
||||
if (file.getParentFile() != null)
|
||||
file.getParentFile().mkdirs();
|
||||
|
||||
if (!file.exists() && !file.createNewFile()) {
|
||||
sendChatMessage(sender, "Log file could not be created. Failed to save statistics.");
|
||||
return;
|
||||
}
|
||||
|
||||
if (!file.canWrite()) {
|
||||
sendChatMessage(sender, "Cannot write to log file. Failed to save statistics.");
|
||||
return;
|
||||
}
|
||||
|
||||
FileOutputStream fileout = new FileOutputStream(file);
|
||||
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(fileout, "UTF-8"));
|
||||
|
||||
writer.write("# " + Defaults.MOD + newLine + "# " + Version.getVersion() + newLine);
|
||||
|
||||
for (String line : statistics)
|
||||
writer.write(line + newLine);
|
||||
|
||||
writer.close();
|
||||
|
||||
} catch (Exception ex) {
|
||||
sendChatMessage(sender, "Write operation threw an exception. Failed to save statistics.");
|
||||
ex.printStackTrace();
|
||||
}
|
||||
|
||||
sendChatMessage(sender, "Saved statistics for player " + player);
|
||||
}
|
||||
|
||||
private String generateSpeciesListEntry(IAlleleBeeSpecies species, IApiaristTracker tracker) {
|
||||
String discovered = "[ ]";
|
||||
if (tracker.isDiscovered(species))
|
||||
discovered = "[ X ]";
|
||||
String blacklisted = "[ ]";
|
||||
if (AlleleManager.alleleRegistry.isBlacklisted(species.getUID()))
|
||||
blacklisted = "[ BL ]";
|
||||
String notcounted = "[ ]";
|
||||
if (!species.isCounted())
|
||||
notcounted = "[ NC ]";
|
||||
|
||||
return String.format("%s %s %s\t%-40s %-20s %-20s", discovered, blacklisted, notcounted, species.getUID(), species.getName(), species.getAuthority());
|
||||
}
|
||||
|
||||
private void listModes(ICommandSender sender, String[] arguments) {
|
||||
World world = getWorld(sender, arguments);
|
||||
|
||||
sendChatMessage(sender, "Current: " + PluginApiculture.beeInterface.getBeekeepingMode(world).getName() + " (#" + world.getWorldInfo().getSaveVersion() + ")");
|
||||
|
||||
String help = "";
|
||||
for (IBeekeepingMode mode : PluginApiculture.beeInterface.getBeekeepingModes()) {
|
||||
if (!help.isEmpty())
|
||||
help += ", ";
|
||||
help += mode.getName();
|
||||
}
|
||||
sendChatMessage(sender, "Available modes: " + help);
|
||||
return;
|
||||
}
|
||||
|
||||
private void listModeInfo(ICommandSender sender, String[] arguments) {
|
||||
if (arguments.length <= 1)
|
||||
throw new WrongUsageException("/" + this.getCommandName() + " info <mode-name>");
|
||||
|
||||
IBeekeepingMode found = null;
|
||||
for (IBeekeepingMode mode : PluginApiculture.beeInterface.getBeekeepingModes())
|
||||
if (mode.getName().equalsIgnoreCase(arguments[1])) {
|
||||
found = mode;
|
||||
break;
|
||||
}
|
||||
|
||||
if (found == null)
|
||||
throw new CommandException("No beekeeping mode called '%s' is available.", arguments[1]);
|
||||
|
||||
sendChatMessage(sender, "\u00A7aMode: " + found.getName());
|
||||
for (String desc : found.getDescription())
|
||||
sendChatMessage(sender, StringUtil.localize(desc));
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canCommandSenderUseCommand(ICommandSender sender) {
|
||||
if (sender instanceof EntityPlayer)
|
||||
return Proxies.common.isOp((EntityPlayer) sender);
|
||||
else
|
||||
return sender.canCommandSenderUseCommand(4, getCommandName());
|
||||
}
|
||||
|
||||
@SuppressWarnings("rawtypes")
|
||||
@Override
|
||||
public List addTabCompletionOptions(ICommandSender sender, String[] incomplete) {
|
||||
return getListOfStringsMatchingLastWord(incomplete, modeStrings);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,117 @@
|
||||
/*******************************************************************************
|
||||
* Copyright 2011-2014 by SirSengir
|
||||
*
|
||||
* This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.
|
||||
*
|
||||
* To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/3.0/.
|
||||
******************************************************************************/
|
||||
package forestry.apiculture;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import net.minecraft.command.ICommandSender;
|
||||
import net.minecraft.command.WrongUsageException;
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.item.ItemStack;
|
||||
|
||||
import forestry.api.apiculture.EnumBeeType;
|
||||
import forestry.api.apiculture.IAlleleBeeSpecies;
|
||||
import forestry.api.apiculture.IBee;
|
||||
import forestry.api.apiculture.IBeeGenome;
|
||||
import forestry.api.genetics.AlleleManager;
|
||||
import forestry.api.genetics.IAllele;
|
||||
import forestry.api.genetics.IAlleleSpecies;
|
||||
import forestry.core.utils.CommandMC;
|
||||
import forestry.plugins.PluginApiculture;
|
||||
|
||||
public class CommandGiveBee extends CommandMC {
|
||||
|
||||
EnumBeeType type;
|
||||
|
||||
public CommandGiveBee(EnumBeeType type) {
|
||||
this.type = type;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getCommandName() {
|
||||
return "give" + type.toString().toLowerCase();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getCommandUsage(ICommandSender par1ICommandSender) {
|
||||
return "/" + getCommandName() + " <player-name> <species-name>";
|
||||
}
|
||||
|
||||
@Override
|
||||
public void processCommand(ICommandSender sender, String[] arguments) {
|
||||
if (arguments.length >= 2) {
|
||||
|
||||
EntityPlayer player = getPlayerFromName(arguments[0]);
|
||||
|
||||
String parameter = arguments[1];
|
||||
|
||||
IAlleleBeeSpecies species = null;
|
||||
|
||||
search: for (String uid : AlleleManager.alleleRegistry.getRegisteredAlleles().keySet()) {
|
||||
|
||||
if (!uid.equals(parameter))
|
||||
continue;
|
||||
|
||||
if (AlleleManager.alleleRegistry.getAllele(uid) instanceof IAlleleBeeSpecies) {
|
||||
species = (IAlleleBeeSpecies) AlleleManager.alleleRegistry.getAllele(uid);
|
||||
break search;
|
||||
}
|
||||
}
|
||||
|
||||
search: if (species == null)
|
||||
for (IAllele allele : AlleleManager.alleleRegistry.getRegisteredAlleles().values())
|
||||
if (allele instanceof IAlleleBeeSpecies)
|
||||
if (((IAlleleBeeSpecies) allele).getName().equals(parameter)) {
|
||||
species = (IAlleleBeeSpecies) allele;
|
||||
break search;
|
||||
}
|
||||
|
||||
if (species == null)
|
||||
throw new SpeciesNotFoundException(parameter);
|
||||
|
||||
IAllele[] template = PluginApiculture.beeInterface.getTemplate(species.getUID());
|
||||
|
||||
if (template == null)
|
||||
throw new TemplateNotFoundException(species);
|
||||
|
||||
IBeeGenome genome = PluginApiculture.beeInterface.templateAsGenome(template);
|
||||
|
||||
IBee bee = PluginApiculture.beeInterface.getBee(player.worldObj, genome);
|
||||
|
||||
ItemStack beestack = PluginApiculture.beeInterface.getMemberStack(bee, type.ordinal());
|
||||
player.dropPlayerItemWithRandomChoice(beestack, true);
|
||||
notifyAdmins(sender, "Player %s was given a %s bee.", player.getCommandSenderName(), ((IAlleleSpecies) template[0]).getName());
|
||||
} else
|
||||
throw new WrongUsageException("/" + getCommandName() + " <player-name> <species-name>");
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds the strings available in this command to the given list of tab completion options.
|
||||
*/
|
||||
@SuppressWarnings("rawtypes")
|
||||
@Override
|
||||
public List addTabCompletionOptions(ICommandSender sender, String[] parameters) {
|
||||
if (parameters.length == 1)
|
||||
return getListOfStringsMatchingLastWord(parameters, this.getPlayers());
|
||||
else if (parameters.length == 2)
|
||||
return getListOfStringsMatchingLastWord(parameters, this.getSpecies());
|
||||
else
|
||||
return null;
|
||||
}
|
||||
|
||||
protected String[] getSpecies() {
|
||||
List<String> species = new ArrayList<String>();
|
||||
|
||||
for (IAllele allele : AlleleManager.alleleRegistry.getRegisteredAlleles().values())
|
||||
if (allele instanceof IAlleleBeeSpecies)
|
||||
species.add(((IAlleleSpecies) allele).getName());
|
||||
|
||||
return species.toArray(new String[] {});
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,81 @@
|
||||
/*******************************************************************************
|
||||
* Copyright 2011-2014 by SirSengir
|
||||
*
|
||||
* This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.
|
||||
*
|
||||
* To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/3.0/.
|
||||
******************************************************************************/
|
||||
package forestry.apiculture;
|
||||
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.init.Blocks;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
import net.minecraftforge.common.EnumPlantType;
|
||||
|
||||
import forestry.api.genetics.IFlowerProvider;
|
||||
import forestry.api.genetics.IIndividual;
|
||||
import forestry.api.genetics.IPollinatable;
|
||||
import forestry.core.config.Defaults;
|
||||
import forestry.core.utils.StringUtil;
|
||||
|
||||
public class FlowerProviderCacti implements IFlowerProvider {
|
||||
|
||||
@Override
|
||||
public boolean isAcceptedFlower(World world, IIndividual individual, int x, int y, int z) {
|
||||
Block block = world.getBlock(x, y, z);
|
||||
|
||||
// Specific check for flower pots.
|
||||
if (block == Blocks.flower_pot)
|
||||
return checkFlowerPot(world.getBlockMetadata(x, y, z));
|
||||
|
||||
return block == Blocks.cactus;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isAcceptedPollinatable(World world, IPollinatable pollinatable) {
|
||||
return pollinatable.getPlantType().contains(EnumPlantType.Desert);
|
||||
}
|
||||
|
||||
private boolean checkFlowerPot(int meta) {
|
||||
if (meta == 9)
|
||||
return true;
|
||||
else
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean growFlower(World world, IIndividual individual, int x, int y, int z) {
|
||||
Block block = world.getBlock(x, y, z);
|
||||
|
||||
if (block == Blocks.flower_pot && world.getBlockMetadata(x, y, z) == 0)
|
||||
return growInPot(world, x, y, z);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
private boolean growInPot(World world, int x, int y, int z) {
|
||||
if (world.rand.nextBoolean())
|
||||
world.setBlock(x, y, z, Blocks.flower_pot, 9, Defaults.FLAG_BLOCK_SYNCH);
|
||||
else
|
||||
world.setBlock(x, y, z, Blocks.flower_pot, 10, Defaults.FLAG_BLOCK_SYNCH);
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getDescription() {
|
||||
return StringUtil.localize("flowers.cacti");
|
||||
}
|
||||
|
||||
@Override
|
||||
public ItemStack[] affectProducts(World world, IIndividual individual, int x, int y, int z, ItemStack[] products) {
|
||||
return products;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ItemStack[] getItemStacks() {
|
||||
return new ItemStack[] { new ItemStack(Blocks.cactus) };
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,58 @@
|
||||
/*******************************************************************************
|
||||
* Copyright 2011-2014 by SirSengir
|
||||
*
|
||||
* This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.
|
||||
*
|
||||
* To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/3.0/.
|
||||
******************************************************************************/
|
||||
package forestry.apiculture;
|
||||
|
||||
import java.util.EnumSet;
|
||||
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.init.Blocks;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
import net.minecraftforge.common.EnumPlantType;
|
||||
|
||||
import forestry.api.genetics.IFlowerProvider;
|
||||
import forestry.api.genetics.IIndividual;
|
||||
import forestry.api.genetics.IPollinatable;
|
||||
import forestry.core.utils.StringUtil;
|
||||
|
||||
public class FlowerProviderEnd implements IFlowerProvider {
|
||||
|
||||
@Override
|
||||
public boolean isAcceptedFlower(World world, IIndividual individual, int x, int y, int z) {
|
||||
Block block = world.getBlock(x, y, z);
|
||||
return block == Blocks.dragon_egg;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isAcceptedPollinatable(World world, IPollinatable pollinatable) {
|
||||
EnumSet<EnumPlantType> types = pollinatable.getPlantType();
|
||||
return types.size() > 1 || !types.contains(EnumPlantType.Nether);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean growFlower(World world, IIndividual individual, int x, int y, int z) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getDescription() {
|
||||
return StringUtil.localize("flowers.end");
|
||||
}
|
||||
|
||||
@Override
|
||||
public ItemStack[] affectProducts(World world, IIndividual individual, int x, int y, int z, ItemStack[] products) {
|
||||
return products;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ItemStack[] getItemStacks() {
|
||||
return new ItemStack[] { new ItemStack(Blocks.dragon_egg) };
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,76 @@
|
||||
/*******************************************************************************
|
||||
* Copyright 2011-2014 by SirSengir
|
||||
*
|
||||
* This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.
|
||||
*
|
||||
* To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/3.0/.
|
||||
******************************************************************************/
|
||||
package forestry.apiculture;
|
||||
|
||||
import java.util.EnumSet;
|
||||
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.init.Blocks;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
import net.minecraftforge.common.EnumPlantType;
|
||||
|
||||
import forestry.api.genetics.IFlowerProvider;
|
||||
import forestry.api.genetics.IIndividual;
|
||||
import forestry.api.genetics.IPollinatable;
|
||||
import forestry.core.config.Defaults;
|
||||
import forestry.core.utils.StringUtil;
|
||||
|
||||
public class FlowerProviderGourd implements IFlowerProvider {
|
||||
|
||||
@Override
|
||||
public boolean isAcceptedFlower(World world, IIndividual individual, int x, int y, int z) {
|
||||
Block block = world.getBlock(x, y, z);
|
||||
return block == Blocks.pumpkin_stem || block == Blocks.melon_stem;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isAcceptedPollinatable(World world, IPollinatable pollinatable) {
|
||||
EnumSet<EnumPlantType> types = pollinatable.getPlantType();
|
||||
return types.size() > 1 || !types.contains(EnumPlantType.Nether);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean growFlower(World world, IIndividual individual, int x, int y, int z) {
|
||||
|
||||
Block block = world.getBlock(x, y, z);
|
||||
|
||||
// We only grow wheat, we don't plant it
|
||||
if (block != Blocks.pumpkin_stem && block != Blocks.melon_stem)
|
||||
return false;
|
||||
|
||||
int meta = world.getBlockMetadata(x, y, z);
|
||||
if (meta > 6)
|
||||
return false;
|
||||
|
||||
if (meta < 6)
|
||||
meta += 2;
|
||||
else
|
||||
meta = 7;
|
||||
|
||||
world.setBlockMetadataWithNotify(x, y, z, meta, Defaults.FLAG_BLOCK_SYNCH);
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getDescription() {
|
||||
return StringUtil.localize("flowers.gourd");
|
||||
}
|
||||
|
||||
@Override
|
||||
public ItemStack[] affectProducts(World world, IIndividual individual, int x, int y, int z, ItemStack[] products) {
|
||||
return products;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ItemStack[] getItemStacks() {
|
||||
return new ItemStack[] { new ItemStack(Blocks.wheat, 1, 8) };
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,82 @@
|
||||
/*******************************************************************************
|
||||
* Copyright 2011-2014 by SirSengir
|
||||
*
|
||||
* This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.
|
||||
*
|
||||
* To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/3.0/.
|
||||
******************************************************************************/
|
||||
package forestry.apiculture;
|
||||
|
||||
import java.util.EnumSet;
|
||||
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.init.Blocks;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
import net.minecraftforge.common.EnumPlantType;
|
||||
|
||||
import forestry.api.genetics.IFlowerProvider;
|
||||
import forestry.api.genetics.IIndividual;
|
||||
import forestry.api.genetics.IPollinatable;
|
||||
import forestry.core.config.Defaults;
|
||||
import forestry.core.utils.StringUtil;
|
||||
|
||||
public class FlowerProviderJungle implements IFlowerProvider {
|
||||
|
||||
@Override
|
||||
public boolean isAcceptedFlower(World world, IIndividual individual, int x, int y, int z) {
|
||||
Block block = world.getBlock(x, y, z);
|
||||
int meta = world.getBlockMetadata(x, y, z);
|
||||
|
||||
// Specific check for flower pots.
|
||||
if (block == Blocks.flower_pot)
|
||||
return checkFlowerPot(meta);
|
||||
|
||||
return block == Blocks.vine || (block == Blocks.tallgrass && meta == 2);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isAcceptedPollinatable(World world, IPollinatable pollinatable) {
|
||||
EnumSet<EnumPlantType> types = pollinatable.getPlantType();
|
||||
return types.size() > 1 || !types.contains(EnumPlantType.Nether);
|
||||
}
|
||||
|
||||
private boolean checkFlowerPot(int meta) {
|
||||
if (meta == 11)
|
||||
return true;
|
||||
else
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean growFlower(World world, IIndividual individual, int x, int y, int z) {
|
||||
Block block = world.getBlock(x, y, z);
|
||||
|
||||
if (block == Blocks.flower_pot)
|
||||
return growInPot(world, x, y, z);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
private boolean growInPot(World world, int x, int y, int z) {
|
||||
world.setBlock(x, y, z, Blocks.flower_pot, 11, Defaults.FLAG_BLOCK_SYNCH);
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getDescription() {
|
||||
return StringUtil.localize("flowers.jungle");
|
||||
}
|
||||
|
||||
@Override
|
||||
public ItemStack[] affectProducts(World world, IIndividual individual, int x, int y, int z, ItemStack[] products) {
|
||||
return products;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ItemStack[] getItemStacks() {
|
||||
return new ItemStack[] { new ItemStack(Blocks.vine), new ItemStack(Blocks.tallgrass, 1, 2) };
|
||||
}
|
||||
|
||||
}
|
||||
+100
@@ -0,0 +1,100 @@
|
||||
/*******************************************************************************
|
||||
* Copyright 2011-2014 by SirSengir
|
||||
*
|
||||
* This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.
|
||||
*
|
||||
* To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/3.0/.
|
||||
******************************************************************************/
|
||||
package forestry.apiculture;
|
||||
|
||||
import java.util.EnumSet;
|
||||
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.init.Blocks;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
import net.minecraftforge.common.EnumPlantType;
|
||||
|
||||
import forestry.api.genetics.IFlowerProvider;
|
||||
import forestry.api.genetics.IIndividual;
|
||||
import forestry.api.genetics.IPollinatable;
|
||||
import forestry.core.config.Defaults;
|
||||
import forestry.core.utils.StringUtil;
|
||||
|
||||
public class FlowerProviderMushroom implements IFlowerProvider {
|
||||
|
||||
@Override
|
||||
public boolean isAcceptedFlower(World world, IIndividual individual, int x, int y, int z) {
|
||||
Block block = world.getBlock(x, y, z);
|
||||
|
||||
// Specific check for flower pots.
|
||||
if (block == Blocks.flower_pot)
|
||||
return checkFlowerPot(world.getBlockMetadata(x, y, z));
|
||||
|
||||
return block == Blocks.brown_mushroom || block == Blocks.red_mushroom;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isAcceptedPollinatable(World world, IPollinatable pollinatable) {
|
||||
EnumSet<EnumPlantType> types = pollinatable.getPlantType();
|
||||
return types.size() > 1 || !types.contains(EnumPlantType.Nether);
|
||||
}
|
||||
|
||||
private boolean checkFlowerPot(int meta) {
|
||||
if (meta == 7 || meta == 8)
|
||||
return true;
|
||||
else
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean growFlower(World world, IIndividual individual, int x, int y, int z) {
|
||||
Block block = world.getBlock(x, y, z);
|
||||
|
||||
if (!block.isAir(world, x, y, z))
|
||||
if (block == Blocks.flower_pot)
|
||||
return growInPot(world, x, y, z);
|
||||
else
|
||||
return false;
|
||||
|
||||
// Check ground
|
||||
Block ground = world.getBlock(x, y - 1, z);
|
||||
|
||||
if (ground != Blocks.mycelium)
|
||||
return false;
|
||||
|
||||
Block mushroom;
|
||||
if (world.rand.nextBoolean())
|
||||
mushroom = Blocks.brown_mushroom;
|
||||
else
|
||||
mushroom = Blocks.red_mushroom;
|
||||
|
||||
world.setBlock(x, y, z, mushroom, 0, Defaults.FLAG_BLOCK_SYNCH);
|
||||
return true;
|
||||
}
|
||||
|
||||
private boolean growInPot(World world, int x, int y, int z) {
|
||||
if (world.rand.nextBoolean())
|
||||
world.setBlock(x, y, z, Blocks.flower_pot, 7, Defaults.FLAG_BLOCK_SYNCH);
|
||||
else
|
||||
world.setBlock(x, y, z, Blocks.flower_pot, 8, Defaults.FLAG_BLOCK_SYNCH);
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getDescription() {
|
||||
return StringUtil.localize("flowers.mushroom");
|
||||
}
|
||||
|
||||
@Override
|
||||
public ItemStack[] affectProducts(World world, IIndividual individual, int x, int y, int z, ItemStack[] products) {
|
||||
return products;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ItemStack[] getItemStacks() {
|
||||
return new ItemStack[] { new ItemStack(Blocks.brown_mushroom), new ItemStack(Blocks.red_mushroom) };
|
||||
}
|
||||
|
||||
}
|
||||
+73
@@ -0,0 +1,73 @@
|
||||
/*******************************************************************************
|
||||
* Copyright 2011-2014 by SirSengir
|
||||
*
|
||||
* This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.
|
||||
*
|
||||
* To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/3.0/.
|
||||
******************************************************************************/
|
||||
package forestry.apiculture;
|
||||
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.init.Blocks;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
import net.minecraftforge.common.EnumPlantType;
|
||||
|
||||
import forestry.api.genetics.IFlowerProvider;
|
||||
import forestry.api.genetics.IIndividual;
|
||||
import forestry.api.genetics.IPollinatable;
|
||||
import forestry.core.config.Defaults;
|
||||
import forestry.core.utils.StringUtil;
|
||||
|
||||
public class FlowerProviderNetherwart implements IFlowerProvider {
|
||||
|
||||
@Override
|
||||
public boolean isAcceptedFlower(World world, IIndividual individual, int x, int y, int z) {
|
||||
Block block = world.getBlock(x, y, z);
|
||||
return block == Blocks.nether_wart;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isAcceptedPollinatable(World world, IPollinatable pollinatable) {
|
||||
return pollinatable.getPlantType().contains(EnumPlantType.Nether);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean growFlower(World world, IIndividual individual, int x, int y, int z) {
|
||||
|
||||
Block block = world.getBlock(x, y, z);
|
||||
|
||||
// We only grow netherwart, we don't plant it
|
||||
if (block != Blocks.nether_wart)
|
||||
return false;
|
||||
|
||||
int meta = world.getBlockMetadata(x, y, z);
|
||||
if (meta >= 3)
|
||||
return false;
|
||||
|
||||
if (meta == 2)
|
||||
meta = 3;
|
||||
else
|
||||
meta = 2;
|
||||
|
||||
world.setBlockMetadataWithNotify(x, y, z, meta, Defaults.FLAG_BLOCK_SYNCH);
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getDescription() {
|
||||
return StringUtil.localize("flowers.nether");
|
||||
}
|
||||
|
||||
@Override
|
||||
public ItemStack[] affectProducts(World world, IIndividual individual, int x, int y, int z, ItemStack[] products) {
|
||||
return products;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ItemStack[] getItemStacks() {
|
||||
return new ItemStack[] { new ItemStack(Blocks.nether_wart) };
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,109 @@
|
||||
/*******************************************************************************
|
||||
* Copyright 2011-2014 by SirSengir
|
||||
*
|
||||
* This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.
|
||||
*
|
||||
* To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/3.0/.
|
||||
******************************************************************************/
|
||||
package forestry.apiculture;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.EnumSet;
|
||||
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.init.Blocks;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
import net.minecraftforge.common.EnumPlantType;
|
||||
|
||||
import forestry.api.apiculture.FlowerManager;
|
||||
import forestry.api.genetics.IFlowerProvider;
|
||||
import forestry.api.genetics.IIndividual;
|
||||
import forestry.api.genetics.IPollinatable;
|
||||
import forestry.core.config.Defaults;
|
||||
import forestry.core.utils.StackUtils;
|
||||
import forestry.core.utils.StringUtil;
|
||||
|
||||
public class FlowerProviderVanilla implements IFlowerProvider {
|
||||
|
||||
@Override
|
||||
public boolean isAcceptedFlower(World world, IIndividual individual, int x, int y, int z) {
|
||||
|
||||
Block block = world.getBlock(x, y, z);
|
||||
int meta = world.getBlockMetadata(x, y, z);
|
||||
|
||||
// Specific check for flower pots.
|
||||
if (block == Blocks.flower_pot)
|
||||
return checkFlowerPot(meta);
|
||||
|
||||
ItemStack flower = new ItemStack(block, 1, meta);
|
||||
|
||||
for (ItemStack stack : FlowerManager.plainFlowers)
|
||||
if (flower.isItemEqual(stack))
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isAcceptedPollinatable(World world, IPollinatable pollinatable) {
|
||||
EnumSet<EnumPlantType> types = pollinatable.getPlantType();
|
||||
return types.size() > 1 || !types.contains(EnumPlantType.Nether);
|
||||
}
|
||||
|
||||
private boolean checkFlowerPot(int meta) {
|
||||
if (meta == 1 || meta == 2)
|
||||
return true;
|
||||
else
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean growFlower(World world, IIndividual individual, int x, int y, int z) {
|
||||
|
||||
Block block = world.getBlock(x, y, z);
|
||||
|
||||
if (!block.isAir(world, x, y, z))
|
||||
if (block == Blocks.flower_pot && world.getBlockMetadata(x, y, z) == 0)
|
||||
return growInPot(world, x, y, z);
|
||||
else
|
||||
return false;
|
||||
|
||||
// Check ground
|
||||
Block ground = world.getBlock(x, y - 1, z);
|
||||
|
||||
if (ground != Blocks.dirt && ground != Blocks.grass)
|
||||
return false;
|
||||
|
||||
// Determine flower to plant
|
||||
Collections.shuffle(FlowerManager.plainFlowers);
|
||||
ItemStack flower = FlowerManager.plainFlowers.get(world.rand.nextInt(FlowerManager.plainFlowers.size() - 1));
|
||||
world.setBlock(x, y, z, StackUtils.getBlock(flower), flower.getItemDamage(), Defaults.FLAG_BLOCK_SYNCH);
|
||||
return true;
|
||||
}
|
||||
|
||||
private boolean growInPot(World world, int x, int y, int z) {
|
||||
if (world.rand.nextBoolean())
|
||||
world.setBlock(x, y, z, Blocks.flower_pot, 1, Defaults.FLAG_BLOCK_SYNCH);
|
||||
else
|
||||
world.setBlock(x, y, z, Blocks.flower_pot, 2, Defaults.FLAG_BLOCK_SYNCH);
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getDescription() {
|
||||
return StringUtil.localize("flowers.vanilla");
|
||||
}
|
||||
|
||||
@Override
|
||||
public ItemStack[] affectProducts(World world, IIndividual individual, int x, int y, int z, ItemStack[] products) {
|
||||
return products;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ItemStack[] getItemStacks() {
|
||||
return FlowerManager.plainFlowers.toArray(new ItemStack[0]);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,76 @@
|
||||
/*******************************************************************************
|
||||
* Copyright 2011-2014 by SirSengir
|
||||
*
|
||||
* This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.
|
||||
*
|
||||
* To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/3.0/.
|
||||
******************************************************************************/
|
||||
package forestry.apiculture;
|
||||
|
||||
import java.util.EnumSet;
|
||||
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.init.Blocks;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
import net.minecraftforge.common.EnumPlantType;
|
||||
|
||||
import forestry.api.genetics.IFlowerProvider;
|
||||
import forestry.api.genetics.IIndividual;
|
||||
import forestry.api.genetics.IPollinatable;
|
||||
import forestry.core.config.Defaults;
|
||||
import forestry.core.utils.StringUtil;
|
||||
|
||||
public class FlowerProviderWheat implements IFlowerProvider {
|
||||
|
||||
@Override
|
||||
public boolean isAcceptedFlower(World world, IIndividual individual, int x, int y, int z) {
|
||||
Block block = world.getBlock(x, y, z);
|
||||
return block == Blocks.wheat;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isAcceptedPollinatable(World world, IPollinatable pollinatable) {
|
||||
EnumSet<EnumPlantType> types = pollinatable.getPlantType();
|
||||
return types.size() > 1 || !types.contains(EnumPlantType.Nether);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean growFlower(World world, IIndividual individual, int x, int y, int z) {
|
||||
|
||||
Block block = world.getBlock(x, y, z);
|
||||
|
||||
// We only grow wheat, we don't plant it
|
||||
if (block != Blocks.wheat)
|
||||
return false;
|
||||
|
||||
int meta = world.getBlockMetadata(x, y, z);
|
||||
if (meta > 6)
|
||||
return false;
|
||||
|
||||
if (meta < 6)
|
||||
meta += 2;
|
||||
else
|
||||
meta = 7;
|
||||
|
||||
world.setBlockMetadataWithNotify(x, y, z, meta, Defaults.FLAG_BLOCK_SYNCH);
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getDescription() {
|
||||
return StringUtil.localize("flowers.wheat");
|
||||
}
|
||||
|
||||
@Override
|
||||
public ItemStack[] affectProducts(World world, IIndividual individual, int x, int y, int z, ItemStack[] products) {
|
||||
return products;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ItemStack[] getItemStacks() {
|
||||
return new ItemStack[] { new ItemStack(Blocks.wheat, 1, 8) };
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,164 @@
|
||||
/*******************************************************************************
|
||||
* Copyright 2011-2014 by SirSengir
|
||||
*
|
||||
* This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.
|
||||
*
|
||||
* To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/3.0/.
|
||||
******************************************************************************/
|
||||
package forestry.apiculture;
|
||||
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
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.ContainerBeealyzer;
|
||||
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.ItemBiomefinder.BiomefinderInventory;
|
||||
import forestry.apiculture.items.ItemImprinter.ImprinterInventory;
|
||||
import forestry.core.GuiHandlerBase;
|
||||
import forestry.core.network.GuiId;
|
||||
import forestry.plugins.PluginApiculture;
|
||||
|
||||
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, (TileAlvearyPlain) getTileForestry(world, x, y, z));
|
||||
|
||||
case AlvearySieveGUI:
|
||||
return new GuiAlvearySieve(player.inventory, (TileAlvearySieve) getTileForestry(world, x, y, z));
|
||||
|
||||
case AlvearySwarmerGUI:
|
||||
return new GuiAlvearySwarmer(player.inventory, (TileAlvearySwarmer) getTileForestry(world, x, y, z));
|
||||
|
||||
case ApiaristChestGUI:
|
||||
return getNaturalistChestGui(BeeHelper.UID, player, world, x, y, z, guiData);
|
||||
|
||||
case ApiaryGUI:
|
||||
return new GuiApiary(player.inventory, (TileApiary) getTileForestry(world, x, y, z));
|
||||
|
||||
case BeealyzerGUI:
|
||||
equipped = getEquippedItem(player);
|
||||
if (equipped == null)
|
||||
return null;
|
||||
|
||||
return new GuiBeealyzer(player, new BeealyzerInventory(player, equipped));
|
||||
|
||||
case BeehouseGUI:
|
||||
return new GuiApiary(player.inventory, (TileBeehouse) getTileForestry(world, x, y, z));
|
||||
|
||||
case HabitatLocatorGUI:
|
||||
equipped = getEquippedItem(player);
|
||||
if (equipped == null)
|
||||
return null;
|
||||
|
||||
return new GuiHabitatLocator(player.inventory, new BiomefinderInventory(equipped));
|
||||
|
||||
case HygroregulatorGUI:
|
||||
return new GuiAlvearyHygroregulator(player.inventory, (TileAlvearyHygroregulator) getTileForestry(world, x, y, z));
|
||||
|
||||
case ImprinterGUI:
|
||||
return new GuiImprinter(player.inventory, new ImprinterInventory(player));
|
||||
|
||||
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, (TileAlvearyPlain) getTileForestry(world, x, y, z));
|
||||
|
||||
case AlvearySieveGUI:
|
||||
return new ContainerAlvearySieve(player.inventory, (TileAlvearySieve) getTileForestry(world, x, y, z));
|
||||
|
||||
case AlvearySwarmerGUI:
|
||||
return new ContainerAlvearySwarmer(player.inventory, (TileAlvearySwarmer) getTileForestry(world, x, y, z));
|
||||
|
||||
case ApiaristChestGUI:
|
||||
return getNaturalistChestContainer(BeeHelper.UID, player, world, x, y, z, guiData);
|
||||
|
||||
case ApiaryGUI:
|
||||
synchApiaristTracker(world, player);
|
||||
return new ContainerApiary(player.inventory, (TileApiary) getTileForestry(world, x, y, z), true);
|
||||
|
||||
case BeealyzerGUI:
|
||||
equipped = getEquippedItem(player);
|
||||
if (equipped == null)
|
||||
return null;
|
||||
|
||||
synchApiaristTracker(world, player);
|
||||
return new ContainerBeealyzer(player.inventory, new BeealyzerInventory(player, equipped));
|
||||
|
||||
case BeehouseGUI:
|
||||
synchApiaristTracker(world, player);
|
||||
return new ContainerApiary(player.inventory, (TileBeehouse) getTileForestry(world, x, y, z), false);
|
||||
|
||||
case HabitatLocatorGUI:
|
||||
equipped = getEquippedItem(player);
|
||||
if (equipped == null)
|
||||
return null;
|
||||
|
||||
return new ContainerHabitatLocator(player.inventory, new BiomefinderInventory(equipped));
|
||||
|
||||
case HygroregulatorGUI:
|
||||
return new ContainerAlvearyHygroregulator(player.inventory, (TileAlvearyHygroregulator) getTileForestry(world, x, y, z));
|
||||
|
||||
case ImprinterGUI:
|
||||
synchApiaristTracker(world, player);
|
||||
return new ContainerImprinter(player.inventory, new ImprinterInventory(player));
|
||||
|
||||
default:
|
||||
return null;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
private void synchApiaristTracker(World world, EntityPlayer player) {
|
||||
PluginApiculture.beeInterface.getBreedingTracker(world, player.getGameProfile().getId()).synchToPlayer(player);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
/*******************************************************************************
|
||||
* Copyright 2011-2014 by SirSengir
|
||||
*
|
||||
* This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.
|
||||
*
|
||||
* To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/3.0/.
|
||||
******************************************************************************/
|
||||
package forestry.apiculture;
|
||||
|
||||
import net.minecraft.block.material.MapColor;
|
||||
import net.minecraft.block.material.Material;
|
||||
|
||||
public class MaterialBeehive extends Material {
|
||||
|
||||
public MaterialBeehive(boolean noHarvest) {
|
||||
super(MapColor.stoneColor);
|
||||
if (noHarvest)
|
||||
this.setRequiresTool();
|
||||
setImmovableMobility();
|
||||
}
|
||||
|
||||
}
|
||||
+51
@@ -0,0 +1,51 @@
|
||||
/*******************************************************************************
|
||||
* Copyright 2011-2014 by SirSengir
|
||||
*
|
||||
* This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.
|
||||
*
|
||||
* To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/3.0/.
|
||||
******************************************************************************/
|
||||
package forestry.apiculture;
|
||||
|
||||
import java.io.DataInputStream;
|
||||
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
|
||||
import forestry.apiculture.gui.ContainerImprinter;
|
||||
import forestry.core.interfaces.IPacketHandler;
|
||||
import forestry.core.network.PacketCoordinates;
|
||||
import forestry.core.network.PacketIds;
|
||||
import forestry.core.proxy.Proxies;
|
||||
|
||||
public class PacketHandlerApiculture implements IPacketHandler {
|
||||
|
||||
@Override
|
||||
public void onPacketData(int packetID, DataInputStream data, EntityPlayer player) {
|
||||
|
||||
try {
|
||||
|
||||
switch (packetID) {
|
||||
case PacketIds.HABITAT_BIOME_POINTER:
|
||||
PacketCoordinates packetC = new PacketCoordinates();
|
||||
packetC.readData(data);
|
||||
Proxies.common.setBiomefinderCoordinates(player, packetC.getCoordinates());
|
||||
break;
|
||||
case PacketIds.IMPRINT_SELECTION_GET:
|
||||
onImprintSelectionGet(player);
|
||||
break;
|
||||
}
|
||||
} catch (Exception ex) {
|
||||
ex.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
private void onImprintSelectionGet(EntityPlayer playerEntity) {
|
||||
|
||||
if (!(playerEntity.openContainer instanceof ContainerImprinter))
|
||||
return;
|
||||
|
||||
((ContainerImprinter) playerEntity.openContainer).sendSelection(playerEntity);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
+30
@@ -0,0 +1,30 @@
|
||||
/*******************************************************************************
|
||||
* Copyright 2011-2014 by SirSengir
|
||||
*
|
||||
* This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.
|
||||
*
|
||||
* To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/3.0/.
|
||||
******************************************************************************/
|
||||
package forestry.apiculture;
|
||||
|
||||
import net.minecraft.world.World;
|
||||
|
||||
import forestry.core.interfaces.ISaveEventHandler;
|
||||
import forestry.plugins.PluginApiculture;
|
||||
|
||||
public class SaveEventHandlerApiculture implements ISaveEventHandler {
|
||||
|
||||
@Override
|
||||
public void onWorldLoad(World world) {
|
||||
PluginApiculture.beeInterface.resetBeekeepingMode();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onWorldSave(World world) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onWorldUnload(World world) {
|
||||
}
|
||||
|
||||
}
|
||||
+20
@@ -0,0 +1,20 @@
|
||||
/*******************************************************************************
|
||||
* Copyright 2011-2014 by SirSengir
|
||||
*
|
||||
* This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.
|
||||
*
|
||||
* To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/3.0/.
|
||||
******************************************************************************/
|
||||
package forestry.apiculture;
|
||||
|
||||
import net.minecraft.command.CommandException;
|
||||
|
||||
public class SpeciesNotFoundException extends CommandException {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
public SpeciesNotFoundException(String title) {
|
||||
super("Could not find bee species with Name or UID %s", title);
|
||||
}
|
||||
|
||||
}
|
||||
+22
@@ -0,0 +1,22 @@
|
||||
/*******************************************************************************
|
||||
* Copyright 2011-2014 by SirSengir
|
||||
*
|
||||
* This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.
|
||||
*
|
||||
* To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/3.0/.
|
||||
******************************************************************************/
|
||||
package forestry.apiculture;
|
||||
|
||||
import net.minecraft.command.CommandException;
|
||||
|
||||
import forestry.api.genetics.IAlleleSpecies;
|
||||
|
||||
public class TemplateNotFoundException extends CommandException {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
public TemplateNotFoundException(IAlleleSpecies species) {
|
||||
super("Could not find template for species %s with UID %s", species.getName(), species.getUID());
|
||||
}
|
||||
|
||||
}
|
||||
+74
@@ -0,0 +1,74 @@
|
||||
/*******************************************************************************
|
||||
* Copyright 2011-2014 by SirSengir
|
||||
*
|
||||
* This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.
|
||||
*
|
||||
* To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/3.0/.
|
||||
******************************************************************************/
|
||||
package forestry.apiculture;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Random;
|
||||
|
||||
import net.minecraft.entity.passive.EntityVillager;
|
||||
import net.minecraft.init.Blocks;
|
||||
import net.minecraft.init.Items;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.util.MathHelper;
|
||||
import net.minecraft.village.MerchantRecipe;
|
||||
import net.minecraft.village.MerchantRecipeList;
|
||||
import net.minecraft.world.gen.structure.MapGenStructureIO;
|
||||
import net.minecraft.world.gen.structure.StructureVillagePieces;
|
||||
|
||||
import cpw.mods.fml.common.registry.VillagerRegistry.IVillageCreationHandler;
|
||||
import cpw.mods.fml.common.registry.VillagerRegistry.IVillageTradeHandler;
|
||||
|
||||
import forestry.api.apiculture.EnumBeeType;
|
||||
import forestry.apiculture.genetics.BeeTemplates;
|
||||
import forestry.apiculture.items.ItemHoneycomb;
|
||||
import forestry.apiculture.worldgen.ComponentVillageBeeHouse;
|
||||
import forestry.core.config.Defaults;
|
||||
import forestry.core.config.ForestryBlock;
|
||||
import forestry.core.config.ForestryItem;
|
||||
import forestry.plugins.PluginApiculture;
|
||||
|
||||
public class VillageHandlerApiculture implements IVillageCreationHandler, IVillageTradeHandler {
|
||||
|
||||
public static void registerVillageComponents() {
|
||||
try {
|
||||
MapGenStructureIO.func_143031_a(ComponentVillageBeeHouse.class, "Forestry:BeeHouse");
|
||||
} catch (Throwable e) {
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@Override
|
||||
public void manipulateTradesForVillager(EntityVillager villager, MerchantRecipeList recipeList, Random random) {
|
||||
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), new ItemStack(ForestryBlock.apiculture, 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),
|
||||
PluginApiculture.beeInterface.getMemberStack(
|
||||
PluginApiculture.beeInterface.getBee(villager.worldObj, PluginApiculture.beeInterface.templateAsGenome(BeeTemplates.getMonasticTemplate())),
|
||||
EnumBeeType.DRONE.ordinal())));
|
||||
}
|
||||
|
||||
@Override
|
||||
public StructureVillagePieces.PieceWeight getVillagePieceWeight(Random random, int size) {
|
||||
return new StructureVillagePieces.PieceWeight(ComponentVillageBeeHouse.class, 15, MathHelper.getRandomIntegerInRange(random, 0 + size, 1 + size));
|
||||
}
|
||||
|
||||
@Override
|
||||
public Class<?> getComponentClass() {
|
||||
return ComponentVillageBeeHouse.class;
|
||||
}
|
||||
|
||||
@SuppressWarnings("rawtypes")
|
||||
@Override
|
||||
public Object buildComponent(StructureVillagePieces.PieceWeight villagePiece, StructureVillagePieces.Start startPiece, List pieces, Random random, int p1, int p2,
|
||||
int p3, int p4, int p5) {
|
||||
return ComponentVillageBeeHouse.buildComponent(startPiece, pieces, random, p1, p2, p3, p4, p5);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,88 @@
|
||||
/*******************************************************************************
|
||||
* Copyright 2011-2014 by SirSengir
|
||||
*
|
||||
* This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.
|
||||
*
|
||||
* To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/3.0/.
|
||||
******************************************************************************/
|
||||
package forestry.apiculture.entities;
|
||||
|
||||
import net.minecraft.entity.EntityCreature;
|
||||
import net.minecraft.entity.passive.IAnimals;
|
||||
import net.minecraft.util.ResourceLocation;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
import cpw.mods.fml.relauncher.Side;
|
||||
import cpw.mods.fml.relauncher.SideOnly;
|
||||
|
||||
import forestry.api.apiculture.EnumBeeType;
|
||||
import forestry.api.apiculture.IAlleleBeeSpecies;
|
||||
import forestry.api.apiculture.IBee;
|
||||
import forestry.core.config.Defaults;
|
||||
import forestry.core.utils.ForestryResource;
|
||||
import forestry.plugins.PluginApiculture;
|
||||
|
||||
public class EntityBee extends EntityCreature implements IAnimals {
|
||||
|
||||
private static final String DEFAULT_TEXTURE = Defaults.TEXTURE_PATH_ENTITIES + "/bees/honeyBee.png";
|
||||
|
||||
IBee contained;
|
||||
IAlleleBeeSpecies species;
|
||||
EnumBeeType type = EnumBeeType.DRONE;
|
||||
|
||||
private String beeTexture = DEFAULT_TEXTURE;
|
||||
private long lastUpdate;
|
||||
|
||||
public EntityBee(World world) {
|
||||
super(world);
|
||||
}
|
||||
|
||||
private void resetAppearance() {
|
||||
beeTexture = species.getEntityTexture();
|
||||
}
|
||||
|
||||
public EntityBee setIndividual(IBee bee) {
|
||||
if(bee != null)
|
||||
contained = bee;
|
||||
else
|
||||
contained = PluginApiculture.beeInterface.templateAsIndividual(PluginApiculture.beeInterface.getDefaultTemplate());
|
||||
|
||||
//isImmuneToFire = contained.getGenome().getFireResist();
|
||||
setSpecies(contained.getGenome().getPrimary());
|
||||
//dataWatcher.updateObject(DATAWATCHER_ID_SPECIES, species.getUID());
|
||||
//dataWatcher.updateObject(DATAWATCHER_ID_SCALE, (int)(contained.getSize() * 100));
|
||||
return this;
|
||||
}
|
||||
|
||||
public IBee getBee() {
|
||||
return contained;
|
||||
}
|
||||
|
||||
public EntityBee setType(EnumBeeType type) {
|
||||
this.type = type;
|
||||
return this;
|
||||
}
|
||||
|
||||
public EnumBeeType getType() {
|
||||
return type;
|
||||
}
|
||||
|
||||
public EntityBee setSpecies(IAlleleBeeSpecies species) {
|
||||
this.species = species;
|
||||
resetAppearance();
|
||||
lastUpdate = worldObj.getTotalWorldTime();
|
||||
return this;
|
||||
}
|
||||
|
||||
@SideOnly(Side.CLIENT)
|
||||
private ResourceLocation textureResource;
|
||||
private long lastTextureUpdate;
|
||||
@SideOnly(Side.CLIENT)
|
||||
public ResourceLocation getTexture() {
|
||||
if(textureResource == null || lastTextureUpdate != lastUpdate)
|
||||
textureResource = new ForestryResource(beeTexture);
|
||||
|
||||
return textureResource;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,229 @@
|
||||
/*******************************************************************************
|
||||
* Copyright 2011-2014 by SirSengir
|
||||
*
|
||||
* This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.
|
||||
*
|
||||
* To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/3.0/.
|
||||
******************************************************************************/
|
||||
package forestry.apiculture.gadgets;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.client.renderer.texture.IIconRegister;
|
||||
import net.minecraft.creativetab.CreativeTabs;
|
||||
import net.minecraft.item.Item;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
import net.minecraft.util.IIcon;
|
||||
import net.minecraft.world.IBlockAccess;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
import cpw.mods.fml.relauncher.Side;
|
||||
import cpw.mods.fml.relauncher.SideOnly;
|
||||
|
||||
import forestry.api.core.Tabs;
|
||||
import forestry.apiculture.MaterialBeehive;
|
||||
import forestry.core.gadgets.BlockStructure;
|
||||
import forestry.core.render.TextureManager;
|
||||
|
||||
public class BlockAlveary extends BlockStructure {
|
||||
|
||||
public BlockAlveary() {
|
||||
super(new MaterialBeehive(false));
|
||||
setHardness(1.0f);
|
||||
setCreativeTab(Tabs.tabApiculture);
|
||||
}
|
||||
|
||||
@SuppressWarnings({ "rawtypes", "unchecked" })
|
||||
@Override
|
||||
@SideOnly(Side.CLIENT)
|
||||
public void getSubBlocks(Item item, CreativeTabs tab, List list) {
|
||||
for (int i = 0; i < 8; i++) {
|
||||
if (i == 1)
|
||||
continue;
|
||||
list.add(new ItemStack(item, 1, i));
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getRenderType() {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean renderAsNormalBlock() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ArrayList<ItemStack> getDrops(World world, int x, int y, int z, int metadata, int fortune) {
|
||||
ArrayList<ItemStack> drop = new ArrayList<ItemStack>();
|
||||
drop.add(new ItemStack(this, 1, metadata != 1 ? metadata : 0));
|
||||
return drop;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getDamageValue(World world, int x, int y, int z) {
|
||||
int meta = world.getBlockMetadata(x, y, z);
|
||||
return meta != 1 ? meta : 0;
|
||||
}
|
||||
|
||||
/* TILE ENTITY CREATION */
|
||||
@Override
|
||||
public TileEntity createTileEntity(World world, int metadata) {
|
||||
switch (metadata) {
|
||||
case TileAlvearySwarmer.BLOCK_META:
|
||||
return new TileAlvearySwarmer();
|
||||
case TileAlvearyFan.BLOCK_META:
|
||||
return new TileAlvearyFan();
|
||||
case TileAlvearyHeater.BLOCK_META:
|
||||
return new TileAlvearyHeater();
|
||||
case TileAlvearyHygroregulator.BLOCK_META:
|
||||
return new TileAlvearyHygroregulator();
|
||||
case TileAlvearyStabiliser.BLOCK_META:
|
||||
return new TileAlvearyStabiliser();
|
||||
case TileAlvearySieve.BLOCK_META:
|
||||
return new TileAlvearySieve();
|
||||
default:
|
||||
return new TileAlvearyPlain();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public TileEntity createNewTileEntity(World world, int meta) {
|
||||
return createTileEntity(world, meta);
|
||||
}
|
||||
|
||||
/* ICONS */
|
||||
public static final int PLAIN = 0;
|
||||
public static final int ENTRANCE = 1;
|
||||
public static final int BOTTOM = 2;
|
||||
public static final int LEFT = 3;
|
||||
public static final int RIGHT = 4;
|
||||
public static final int TX_55_SWOF = 5;
|
||||
public static final int TX_56_SWON = 6;
|
||||
public static final int TX_57_HTOF = 7;
|
||||
public static final int TX_58_HTON = 8;
|
||||
public static final int TX_71_FNOF = 9;
|
||||
public static final int TX_72_FNON = 10;
|
||||
public static final int TX_73_VLVE = 11;
|
||||
public static final int STABILISER = 12;
|
||||
public static final int SIEVE = 13;
|
||||
|
||||
@SideOnly(Side.CLIENT)
|
||||
private IIcon[] icons;
|
||||
|
||||
@SideOnly(Side.CLIENT)
|
||||
@Override
|
||||
public void registerBlockIcons(IIconRegister register) {
|
||||
icons = new IIcon[14];
|
||||
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 == TileAlvearySieve.BLOCK_META || metadata == TileAlvearySwarmer.BLOCK_META || metadata == TileAlvearyStabiliser.BLOCK_META)
|
||||
&& (side == 1 || side == 0))
|
||||
return icons[BOTTOM];
|
||||
|
||||
switch (metadata) {
|
||||
case 1:
|
||||
return icons[ENTRANCE];
|
||||
case TileAlvearySwarmer.BLOCK_META:
|
||||
return icons[TX_55_SWOF];
|
||||
case TileAlvearyFan.BLOCK_META:
|
||||
return icons[TX_71_FNOF];
|
||||
case TileAlvearyHeater.BLOCK_META:
|
||||
return icons[TX_57_HTOF];
|
||||
case TileAlvearyHygroregulator.BLOCK_META:
|
||||
return icons[TX_73_VLVE];
|
||||
case TileAlvearyStabiliser.BLOCK_META:
|
||||
return icons[STABILISER];
|
||||
case TileAlvearySieve.BLOCK_META:
|
||||
return icons[SIEVE];
|
||||
default:
|
||||
return icons[PLAIN];
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@SideOnly(Side.CLIENT)
|
||||
@Override
|
||||
public IIcon getIcon(IBlockAccess world, int x, int y, int z, int side) {
|
||||
int meta = world.getBlockMetadata(x, y, z);
|
||||
|
||||
if (meta == 1)
|
||||
return this.getIcon(side, meta);
|
||||
else if (meta > 1)
|
||||
return getBlockTextureFromSideAndTile(world, x, y, z, side);
|
||||
|
||||
Block blockXP = world.getBlock(x + 1, y, z);
|
||||
Block blockXM = world.getBlock(x - 1, y, z);
|
||||
|
||||
if (blockXP == this && blockXM != this) {
|
||||
|
||||
if (world.getBlockMetadata(x + 1, y, z) == 1) {
|
||||
|
||||
if (world.getBlock(x, y, z + 1) != this)
|
||||
return switchForSide(42, side);
|
||||
else
|
||||
return switchForSide(41, side);
|
||||
|
||||
} else
|
||||
return this.getIcon(side, meta);
|
||||
|
||||
} else if (blockXP != this && blockXM == this)
|
||||
if (world.getBlockMetadata(x - 1, y, z) == 1) {
|
||||
|
||||
if (world.getBlock(x, y, z + 1) != this)
|
||||
return switchForSide(41, side);
|
||||
else
|
||||
return switchForSide(42, side);
|
||||
|
||||
} else
|
||||
return this.getIcon(side, meta);
|
||||
|
||||
return this.getIcon(side, meta);
|
||||
}
|
||||
|
||||
@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 == null || !(tile instanceof TileAlveary))
|
||||
return getIcon(side, 0);
|
||||
|
||||
return icons[((TileAlveary) tile).getIcon(side, world.getBlockMetadata(x, y, z))];
|
||||
}
|
||||
|
||||
@SideOnly(Side.CLIENT)
|
||||
private IIcon switchForSide(int textureId, int side) {
|
||||
|
||||
if (side == 4 || side == 5) {
|
||||
if (textureId == 41)
|
||||
return icons[LEFT];
|
||||
else
|
||||
return icons[RIGHT];
|
||||
} else if (textureId == 41)
|
||||
return icons[RIGHT];
|
||||
else
|
||||
return icons[LEFT];
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,166 @@
|
||||
/*******************************************************************************
|
||||
* Copyright 2011-2014 by SirSengir
|
||||
*
|
||||
* This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.
|
||||
*
|
||||
* To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/3.0/.
|
||||
******************************************************************************/
|
||||
package forestry.apiculture.gadgets;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
import net.minecraft.block.BlockContainer;
|
||||
import net.minecraft.client.renderer.texture.IIconRegister;
|
||||
import net.minecraft.creativetab.CreativeTabs;
|
||||
import net.minecraft.entity.Entity;
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.item.Item;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
import net.minecraft.util.IIcon;
|
||||
import net.minecraft.world.IBlockAccess;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
import cpw.mods.fml.relauncher.Side;
|
||||
import cpw.mods.fml.relauncher.SideOnly;
|
||||
|
||||
import forestry.api.apiculture.BeeManager;
|
||||
import forestry.api.apiculture.IHiveDrop;
|
||||
import forestry.api.core.Tabs;
|
||||
import forestry.apiculture.MaterialBeehive;
|
||||
import forestry.core.config.Config;
|
||||
import forestry.core.render.TextureManager;
|
||||
import forestry.core.utils.StackUtils;
|
||||
|
||||
public class BlockBeehives extends BlockContainer {
|
||||
|
||||
public BlockBeehives() {
|
||||
super(new MaterialBeehive(true));
|
||||
setLightLevel(0.8f);
|
||||
setHardness(1.0f);
|
||||
setCreativeTab(Tabs.tabApiculture);
|
||||
}
|
||||
|
||||
@Override
|
||||
public TileEntity createNewTileEntity(World world, int meta) {
|
||||
return new TileSwarm();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canEntityDestroy(IBlockAccess world, int x, int y, int z, Entity entity) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean removedByPlayer(World world, EntityPlayer player, int x, int y, int z) {
|
||||
if (canHarvestBlock(player, world.getBlockMetadata(x, y, z))) {
|
||||
// Handle TE'd beehives
|
||||
TileEntity tile = world.getTileEntity(x, y, z);
|
||||
|
||||
if (tile instanceof TileSwarm) {
|
||||
TileSwarm swarm = (TileSwarm) tile;
|
||||
if (swarm.containsBees())
|
||||
for (ItemStack beeStack : swarm.contained.getStacks())
|
||||
if (beeStack != null)
|
||||
StackUtils.dropItemStackAsEntity(beeStack, world, x, y, z);
|
||||
}
|
||||
}
|
||||
|
||||
return world.setBlockToAir(x, y, z);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ArrayList<ItemStack> getDrops(World world, int x, int y, int z, int metadata, int fortune) {
|
||||
ArrayList<ItemStack> ret = new ArrayList<ItemStack>();
|
||||
|
||||
// Handle legacy block
|
||||
if (metadata == 0) {
|
||||
ret.add(new ItemStack(this));
|
||||
return ret;
|
||||
}
|
||||
|
||||
ArrayList<IHiveDrop> dropList = BeeManager.hiveDrops[metadata - 1];
|
||||
|
||||
Collections.shuffle(dropList);
|
||||
// Grab a princess
|
||||
int tries = 0;
|
||||
boolean hasPrincess = false;
|
||||
while (tries <= 10 && !hasPrincess) {
|
||||
tries++;
|
||||
|
||||
for (IHiveDrop drop : dropList)
|
||||
if (world.rand.nextInt(100) < drop.getChance(world, x, y, z)) {
|
||||
ret.add(drop.getPrincess(world, x, y, z, fortune));
|
||||
hasPrincess = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Grab drones
|
||||
for (IHiveDrop drop : dropList)
|
||||
if (world.rand.nextInt(100) < drop.getChance(world, x, y, z)) {
|
||||
ret.addAll(drop.getDrones(world, x, y, z, fortune));
|
||||
break;
|
||||
}
|
||||
// Grab anything else on offer
|
||||
for (IHiveDrop drop : dropList)
|
||||
if (world.rand.nextInt(100) < drop.getChance(world, x, y, z)) {
|
||||
ret.addAll(drop.getAdditional(world, x, y, z, fortune));
|
||||
break;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
// / CREATIVE INVENTORY
|
||||
@Override
|
||||
public int damageDropped(int meta) {
|
||||
return meta;
|
||||
}
|
||||
|
||||
@SuppressWarnings({ "rawtypes", "unchecked" })
|
||||
@Override
|
||||
public void getSubBlocks(Item item, CreativeTabs par2CreativeTabs, List itemList) {
|
||||
itemList.add(new ItemStack(this, 1, 1));
|
||||
itemList.add(new ItemStack(this, 1, 2));
|
||||
itemList.add(new ItemStack(this, 1, 3));
|
||||
itemList.add(new ItemStack(this, 1, 4));
|
||||
if (Config.isDebug) {
|
||||
itemList.add(new ItemStack(this, 1 ,5));
|
||||
}
|
||||
itemList.add(new ItemStack(this, 1, 6));
|
||||
itemList.add(new ItemStack(this, 1, 7));
|
||||
// Swarm hive not added
|
||||
}
|
||||
|
||||
/* ICONS */
|
||||
@SideOnly(Side.CLIENT)
|
||||
private IIcon[] icons;
|
||||
|
||||
@Override
|
||||
@SideOnly(Side.CLIENT)
|
||||
public void registerBlockIcons(IIconRegister register) {
|
||||
icons = new IIcon[18];
|
||||
for (int i = 1; i < 9; i++) {
|
||||
icons[i * 2] = TextureManager.getInstance().registerTex(register, "beehives/beehive." + i + ".top");
|
||||
icons[(i * 2) + 1] = TextureManager.getInstance().registerTex(register, "beehives/beehive." + i + ".side");
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@SideOnly(Side.CLIENT)
|
||||
public IIcon getIcon(int i, int j) {
|
||||
if (i == 0 || i == 1) {
|
||||
if (j * 2 < icons.length && icons[j * 2] != null)
|
||||
return icons[j * 2];
|
||||
else
|
||||
return icons[2];
|
||||
} else if (j * 2 + 1 < icons.length && icons[j * 2 + 1] != null)
|
||||
return icons[j * 2 + 1];
|
||||
else
|
||||
return icons[3];
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,416 @@
|
||||
/*******************************************************************************
|
||||
* Copyright 2011-2014 by SirSengir
|
||||
*
|
||||
* This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.
|
||||
*
|
||||
* To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/3.0/.
|
||||
******************************************************************************/
|
||||
package forestry.apiculture.gadgets;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Random;
|
||||
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.block.BlockTorch;
|
||||
import net.minecraft.client.renderer.texture.IIconRegister;
|
||||
import net.minecraft.creativetab.CreativeTabs;
|
||||
import net.minecraft.entity.EntityLivingBase;
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.init.Blocks;
|
||||
import net.minecraft.init.Items;
|
||||
import net.minecraft.item.Item;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.nbt.NBTTagCompound;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
import net.minecraft.util.IIcon;
|
||||
import net.minecraft.world.IBlockAccess;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
import cpw.mods.fml.relauncher.Side;
|
||||
import cpw.mods.fml.relauncher.SideOnly;
|
||||
|
||||
import net.minecraftforge.common.util.ForgeDirection;
|
||||
import net.minecraftforge.oredict.OreDictionary;
|
||||
|
||||
import forestry.api.core.Tabs;
|
||||
import forestry.core.ForestryClient;
|
||||
import forestry.core.config.Defaults;
|
||||
import forestry.core.render.TextureManager;
|
||||
import forestry.core.utils.StackUtils;
|
||||
|
||||
public class BlockCandle extends BlockTorch {
|
||||
|
||||
private final ArrayList<Item> lightingItems = new ArrayList<Item>();
|
||||
|
||||
@SideOnly(Side.CLIENT)
|
||||
private IIcon litStump;
|
||||
@SideOnly(Side.CLIENT)
|
||||
private IIcon litTip;
|
||||
@SideOnly(Side.CLIENT)
|
||||
private IIcon unlitStump;
|
||||
@SideOnly(Side.CLIENT)
|
||||
private IIcon unlitTip;
|
||||
|
||||
public BlockCandle() {
|
||||
super();
|
||||
this.setHardness(0.0F);
|
||||
this.setStepSound(soundTypeWood);
|
||||
setCreativeTab(Tabs.tabApiculture);
|
||||
|
||||
lightingItems.add(Items.flint_and_steel);
|
||||
lightingItems.add(Items.flint);
|
||||
lightingItems.add(Item.getItemFromBlock(Blocks.torch));
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasTileEntity(int metadata) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public TileEntity createTileEntity(World world, int metadata) {
|
||||
return new TileCandle();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getRenderType() {
|
||||
return ForestryClient.candleRenderId;
|
||||
}
|
||||
|
||||
@SideOnly(Side.CLIENT)
|
||||
@Override
|
||||
public void registerBlockIcons(IIconRegister register) {
|
||||
String fileBase = this.getUnlocalizedName().replace("tile.", "");
|
||||
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
|
||||
public int getLightValue(IBlockAccess world, int x, int y, int z) {
|
||||
int meta = world.getBlockMetadata(x, y, z);
|
||||
return (isLit(meta))? 14 : 0;
|
||||
}
|
||||
|
||||
/*@SideOnly(Side.CLIENT)
|
||||
@Override
|
||||
public IIcon getIcon(IBlockAccess world, int x, int y, int z, int side) {
|
||||
IIcon i = this.unlitStump;
|
||||
if (this.isLit(world.getBlockMetadata(x, y, z))) {
|
||||
i = this.litStump;
|
||||
}
|
||||
return i;
|
||||
}*/
|
||||
|
||||
@SideOnly(Side.CLIENT)
|
||||
public IIcon getTextureFromPassAndMeta(int meta, int pass) {
|
||||
IIcon i = this.unlitStump;
|
||||
if (pass == 0) {
|
||||
if (isLit(meta)) {
|
||||
i = this.litTip;
|
||||
}
|
||||
else {
|
||||
i = this.unlitTip;
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (isLit(meta)) {
|
||||
i = this.litStump;
|
||||
}
|
||||
else {
|
||||
i = this.unlitStump;
|
||||
}
|
||||
}
|
||||
return i;
|
||||
}
|
||||
|
||||
public int getColourFromItemStack(ItemStack stack) {
|
||||
int colour = 0xffffff;
|
||||
if (stack.hasTagCompound()) {
|
||||
NBTTagCompound tag = stack.getTagCompound();
|
||||
colour = (tag.getByte("red") << 16) | (tag.getByte("green") << 8) | tag.getByte("blue");
|
||||
}
|
||||
return colour;
|
||||
}
|
||||
|
||||
@SuppressWarnings({ "rawtypes", "unchecked" })
|
||||
@Override
|
||||
public void getSubBlocks(Item item, CreativeTabs par2CreativeTabs, List itemList) {
|
||||
itemList.add(new ItemStack(this, 1, 0));
|
||||
}
|
||||
|
||||
// Dye names correspond to colour values as below.
|
||||
private static final String[] dyes = { "dyeWhite", "dyeOrange", "dyeMagenta", "dyeLightBlue",
|
||||
"dyeYellow", "dyeLime", "dyePink", "dyeGray",
|
||||
"dyeLightGray", "dyeCyan", "dyePurple", "dyeBlue",
|
||||
"dyeBrown", "dyeGreen", "dyeRed", "dyeBlack" };
|
||||
|
||||
private static final int[][] colours = { { 255, 255, 255 } , { 219, 125, 62 } , { 255, 20, 255 } , { 107, 138, 201 } ,
|
||||
{ 255, 255, 20 } , { 20, 255, 20 } , { 208, 132, 153 } , { 74, 74, 74 } ,
|
||||
{ 154, 161, 161 } , { 20, 255, 255 } , { 126, 61, 181 } , { 20, 20, 255 } ,
|
||||
{ 79, 50, 31 } , { 53, 70, 27 } , { 150, 52, 48 } , { 20, 20, 20 } };
|
||||
|
||||
public static final String colourTagName = "colour";
|
||||
|
||||
@Override
|
||||
public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int facing, float facingX, float facingY, float facingZ) {
|
||||
boolean flag = false;
|
||||
int meta = world.getBlockMetadata(x, y, z);
|
||||
boolean toggleLitState = true;
|
||||
ItemStack held = player.getCurrentEquippedItem();
|
||||
|
||||
if (!isLit(meta)) {
|
||||
if (held == null || !lightingItems.contains(held.getItem())) {
|
||||
toggleLitState = false;
|
||||
}
|
||||
else if (StackUtils.equals(this, held) && isLit(held)) {
|
||||
toggleLitState = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (held != null) {
|
||||
// Ensure a TileEntity exists. May be able to remove this in future versions.
|
||||
TileCandle te = (TileCandle)world.getTileEntity(x, y, z);
|
||||
if (te == null) {
|
||||
world.setTileEntity(x, y, z, this.createTileEntity(world, meta));
|
||||
}
|
||||
|
||||
if (StackUtils.equals(this, held)) {
|
||||
if (!isLit(held)) {
|
||||
// Copy the colour of an unlit, coloured candle.
|
||||
if (held.hasTagCompound() && held.getTagCompound().hasKey(colourTagName)) {
|
||||
te.setColour(held.getTagCompound().getInteger(colourTagName));
|
||||
}
|
||||
else {
|
||||
// Reset to white if item has no
|
||||
te.setColour(0xffffff);
|
||||
}
|
||||
}
|
||||
else {
|
||||
toggleLitState = true;
|
||||
}
|
||||
flag = true;
|
||||
}
|
||||
else {
|
||||
// Check for dye-able ness.
|
||||
boolean matched = false;
|
||||
for (int i = 0; i < dyes.length; ++i) {
|
||||
for (ItemStack stack : OreDictionary.getOres(dyes[i])) {
|
||||
if (OreDictionary.itemMatches(stack, held, true)) {
|
||||
if (isLit(meta)) {
|
||||
te.setColour(colours[i][0], colours[i][1], colours[i][2]);
|
||||
}
|
||||
else {
|
||||
te.addColour(colours[i][0], colours[i][1], colours[i][2]);
|
||||
}
|
||||
world.markBlockForUpdate(x, y, z);
|
||||
matched = true;
|
||||
toggleLitState = false;
|
||||
flag = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (matched) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (toggleLitState) {
|
||||
meta = this.toggleLitStatus(meta);
|
||||
world.setBlockMetadataWithNotify(x, y, z, meta, Defaults.FLAG_BLOCK_SYNCH | Defaults.FLAG_BLOCK_UPDATE);
|
||||
flag = true;
|
||||
}
|
||||
return flag;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void breakBlock(World world, int x, int y, int z, Block block, int meta) {
|
||||
if (!world.isRemote) {
|
||||
TileCandle tc = (TileCandle)world.getTileEntity(x, y, z);
|
||||
int newMeta = isLit(meta) ? 1 : 0;
|
||||
ItemStack stack = new ItemStack(this, 1, newMeta);
|
||||
if (tc != null && tc.getColour() != 0xffffff) {
|
||||
// When dropped, tag new item stack with colour. Unless it's white, then do no such thing for maximum stacking.
|
||||
NBTTagCompound tag = new NBTTagCompound();
|
||||
tag.setInteger(colourTagName, tc.getColour());
|
||||
stack.setTagCompound(tag);
|
||||
}
|
||||
this.dropBlockAsItem(world, x, y, z, stack);
|
||||
}
|
||||
super.breakBlock(world, x, y, z, block, meta);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase player, ItemStack itemStack) {
|
||||
TileCandle tc = (TileCandle)(world.getTileEntity(x, y, z));
|
||||
tc.setColour(this.getColourValueFromItemStack(itemStack));
|
||||
if (isLit(itemStack)) {
|
||||
int meta = world.getBlockMetadata(x, y, z);
|
||||
world.setBlockMetadataWithNotify(x, y, z, this.toggleLitStatus(meta), Defaults.FLAG_BLOCK_SYNCH | Defaults.FLAG_BLOCK_UPDATE);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void dropBlockAsItemWithChance(World par1World, int par2, int par3, int par4, int par5, float par6, int par7) {
|
||||
// Does nothing to prevent extra candles from falling.
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBlockHarvested(World par1World, int par2, int par3, int par4, int par5, EntityPlayer par6EntityPlayer) {
|
||||
// Does nothing to prevent extra candles from falling.
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean func_150109_e(World world, int x, int y, int z) {
|
||||
// Slightly tweaked version of BlockTorch's version to account for TE nonsense.
|
||||
if (!this.canPlaceBlockAt(world, x, y, z)) {
|
||||
if (world.getBlock(x, y, z) == this) {
|
||||
world.setBlockToAir(x, y, z);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
else {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@SideOnly(Side.CLIENT)
|
||||
public void randomDisplayTick(World world, int x, int y, int z, Random random) {
|
||||
if (isLit(world.getBlockMetadata(x, y, z))) {
|
||||
int l = world.getBlockMetadata(x, y, z) & 0x07;
|
||||
double d0 = x + 0.5F;
|
||||
double d1 = y + 0.7F;
|
||||
double d2 = z + 0.5F;
|
||||
double d3 = 0.2199999988079071D;
|
||||
double d4 = 0.27000001072883606D;
|
||||
|
||||
if (l == 1)
|
||||
{
|
||||
world.spawnParticle("smoke", d0 - d4, d1 + d3, d2, 0.0D, 0.0D, 0.0D);
|
||||
world.spawnParticle("flame", d0 - d4, d1 + d3, d2, 0.0D, 0.0D, 0.0D);
|
||||
}
|
||||
else if (l == 2)
|
||||
{
|
||||
world.spawnParticle("smoke", d0 + d4, d1 + d3, d2, 0.0D, 0.0D, 0.0D);
|
||||
world.spawnParticle("flame", d0 + d4, d1 + d3, d2, 0.0D, 0.0D, 0.0D);
|
||||
}
|
||||
else if (l == 3)
|
||||
{
|
||||
world.spawnParticle("smoke", d0, d1 + d3, d2 - d4, 0.0D, 0.0D, 0.0D);
|
||||
world.spawnParticle("flame", d0, d1 + d3, d2 - d4, 0.0D, 0.0D, 0.0D);
|
||||
}
|
||||
else if (l == 4)
|
||||
{
|
||||
world.spawnParticle("smoke", d0, d1 + d3, d2 + d4, 0.0D, 0.0D, 0.0D);
|
||||
world.spawnParticle("flame", d0, d1 + d3, d2 + d4, 0.0D, 0.0D, 0.0D);
|
||||
}
|
||||
else
|
||||
{
|
||||
world.spawnParticle("smoke", d0, d1, d2, 0.0D, 0.0D, 0.0D);
|
||||
world.spawnParticle("flame", d0, d1, d2, 0.0D, 0.0D, 0.0D);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean func_150108_b(World par1World, int par2, int par3, int par4, Block block)
|
||||
{
|
||||
if (this.func_150109_e(par1World, par2, par3, par4))
|
||||
{
|
||||
int i1 = par1World.getBlockMetadata(par2, par3, par4) & 0x07;
|
||||
boolean flag = false;
|
||||
|
||||
if (!par1World.isSideSolid(par2 - 1, par3, par4, ForgeDirection.EAST, true) && i1 == 1)
|
||||
{
|
||||
flag = true;
|
||||
}
|
||||
|
||||
if (!par1World.isSideSolid(par2 + 1, par3, par4, ForgeDirection.WEST, true) && i1 == 2)
|
||||
{
|
||||
flag = true;
|
||||
}
|
||||
|
||||
if (!par1World.isSideSolid(par2, par3, par4 - 1, ForgeDirection.SOUTH, true) && i1 == 3)
|
||||
{
|
||||
flag = true;
|
||||
}
|
||||
|
||||
if (!par1World.isSideSolid(par2, par3, par4 + 1, ForgeDirection.NORTH, true) && i1 == 4)
|
||||
{
|
||||
flag = true;
|
||||
}
|
||||
|
||||
if (!this.canPlaceTorchOn(par1World, par2, par3 - 1, par4) && i1 == 5)
|
||||
{
|
||||
flag = true;
|
||||
}
|
||||
|
||||
if (flag)
|
||||
{
|
||||
this.dropBlockAsItem(par1World, par2, par3, par4, par1World.getBlockMetadata(par2, par3, par4), 0);
|
||||
par1World.setBlockToAir(par2, par3, par4);
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
// Yes, function hiding. Go away.
|
||||
public boolean canPlaceTorchOn(World par1World, int par2, int par3, int par4)
|
||||
{
|
||||
if (World.doesBlockHaveSolidTopSurface(par1World, par2, par3, par4))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
Block block = par1World.getBlock(par2, par3, par4);
|
||||
return block.canPlaceTorchOnTop(par1World, par2, par3, par4);
|
||||
}
|
||||
}
|
||||
|
||||
protected int getColourValueFromItemStack(ItemStack itemStack) {
|
||||
int value = 0xffffff; // default to white.
|
||||
if (itemStack.hasTagCompound()) {
|
||||
NBTTagCompound tag = itemStack.getTagCompound();
|
||||
if (tag.hasKey(colourTagName)) {
|
||||
value = tag.getInteger(colourTagName);
|
||||
}
|
||||
}
|
||||
return value;
|
||||
}
|
||||
|
||||
public static boolean isLit(int meta) {
|
||||
return (meta & 0x08) > 0;
|
||||
}
|
||||
|
||||
public static boolean isLit(ItemStack itemStack) {
|
||||
return itemStack.getItemDamage() > 0;
|
||||
}
|
||||
|
||||
protected int toggleLitStatus(int meta) {
|
||||
return meta ^ 0x08;
|
||||
}
|
||||
|
||||
public void addItemToLightingList(Item item) {
|
||||
if (item == null) throw new NullPointerException();
|
||||
|
||||
if (!this.lightingItems.contains(item)) {
|
||||
this.lightingItems.add(item);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,80 @@
|
||||
/*******************************************************************************
|
||||
* Copyright 2011-2014 by SirSengir
|
||||
*
|
||||
* This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.
|
||||
*
|
||||
* To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/3.0/.
|
||||
******************************************************************************/
|
||||
package forestry.apiculture.gadgets;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Random;
|
||||
|
||||
import net.minecraft.block.BlockTorch;
|
||||
import net.minecraft.client.renderer.texture.IIconRegister;
|
||||
import net.minecraft.creativetab.CreativeTabs;
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.init.Blocks;
|
||||
import net.minecraft.init.Items;
|
||||
import net.minecraft.item.Item;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
import cpw.mods.fml.relauncher.Side;
|
||||
import cpw.mods.fml.relauncher.SideOnly;
|
||||
|
||||
import forestry.api.core.Tabs;
|
||||
import forestry.core.config.Defaults;
|
||||
import forestry.core.config.ForestryBlock;
|
||||
import forestry.core.render.TextureManager;
|
||||
import forestry.core.utils.StackUtils;
|
||||
|
||||
public class BlockStump extends BlockTorch {
|
||||
|
||||
public BlockStump() {
|
||||
super();
|
||||
this.setHardness(0.0F);
|
||||
this.setStepSound(soundTypeWood);
|
||||
setCreativeTab(Tabs.tabApiculture);
|
||||
}
|
||||
|
||||
@SideOnly(Side.CLIENT)
|
||||
@Override
|
||||
public void registerBlockIcons(IIconRegister register) {
|
||||
this.blockIcon = TextureManager.getInstance().registerTex(register, this.getUnlocalizedName().replace("tile.", ""));
|
||||
}
|
||||
|
||||
@SuppressWarnings({ "rawtypes", "unchecked" })
|
||||
@Override
|
||||
public void getSubBlocks(Item item, CreativeTabs par2CreativeTabs, List itemList) {
|
||||
itemList.add(new ItemStack(this, 1, 0));
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int facing, float facingX, float facingY, float facingZ) {
|
||||
|
||||
ItemStack held = player.getCurrentEquippedItem();
|
||||
if (held != null &&
|
||||
(held.getItem() == Items.flint_and_steel ||
|
||||
held.getItem() == Items.flint ||
|
||||
StackUtils.equals(Blocks.torch, held))) {
|
||||
world.setBlock(x, y, z, ForestryBlock.candle, 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);
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
@SideOnly(Side.CLIENT)
|
||||
public int getRenderColor(int par1) {
|
||||
return 0xee0000;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void randomDisplayTick(World par1World, int par2, int par3, int par4, Random par5Random) {
|
||||
}
|
||||
}
|
||||
+116
@@ -0,0 +1,116 @@
|
||||
/*******************************************************************************
|
||||
* Copyright 2011-2014 by SirSengir
|
||||
*
|
||||
* This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.
|
||||
*
|
||||
* To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/3.0/.
|
||||
******************************************************************************/
|
||||
package forestry.apiculture.gadgets;
|
||||
|
||||
import java.util.HashSet;
|
||||
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.init.Blocks;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
|
||||
import forestry.api.apiculture.IAlvearyComponent;
|
||||
import forestry.api.core.ITileStructure;
|
||||
import forestry.core.config.ForestryBlock;
|
||||
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.utils.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);
|
||||
|
||||
public static HashSet<Block> slabBlocks = new HashSet<Block>();
|
||||
static {
|
||||
slabBlocks.add(Blocks.stone_slab);
|
||||
slabBlocks.add(Blocks.wooden_slab);
|
||||
slabBlocks.add(ForestryBlock.slabs1);
|
||||
slabBlocks.add(ForestryBlock.slabs2);
|
||||
slabBlocks.add(ForestryBlock.slabs3);
|
||||
if (ForestryBlock.slabs4 != null)
|
||||
slabBlocks.add(ForestryBlock.slabs4);
|
||||
}
|
||||
|
||||
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 (!slabBlocks.contains(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;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,262 @@
|
||||
/*******************************************************************************
|
||||
* Copyright 2011-2014 by SirSengir
|
||||
*
|
||||
* This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.
|
||||
*
|
||||
* To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/3.0/.
|
||||
******************************************************************************/
|
||||
package forestry.apiculture.gadgets;
|
||||
|
||||
import java.util.LinkedList;
|
||||
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.inventory.IInventory;
|
||||
import net.minecraft.nbt.NBTTagCompound;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
|
||||
import buildcraft.api.gates.ITrigger;
|
||||
|
||||
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.core.config.Defaults;
|
||||
import forestry.core.config.ForestryBlock;
|
||||
import forestry.core.gadgets.TileForestry;
|
||||
import forestry.core.network.PacketPayload;
|
||||
import forestry.core.proxy.Proxies;
|
||||
import forestry.core.triggers.ForestryTrigger;
|
||||
import forestry.core.utils.TileInventoryAdapter;
|
||||
import forestry.core.utils.Utils;
|
||||
|
||||
public abstract class TileAlveary extends TileForestry implements IAlvearyComponent {
|
||||
|
||||
protected TileInventoryAdapter inventory;
|
||||
protected final int componentBlockMeta;
|
||||
|
||||
public TileAlveary(int componentBlockMeta) {
|
||||
this.structureLogic = new StructureLogicAlveary(this);
|
||||
this.componentBlockMeta = componentBlockMeta;
|
||||
}
|
||||
|
||||
/* UPDATING */
|
||||
@Override
|
||||
public void initialize() {
|
||||
Block block = worldObj.getBlock(xCoord, yCoord, zCoord);
|
||||
if (block != ForestryBlock.alveary) {
|
||||
Proxies.log.info("Updating alveary block at %s/%s/%s.", xCoord, yCoord, zCoord);
|
||||
worldObj.setBlock(xCoord, yCoord, zCoord, ForestryBlock.alveary, componentBlockMeta, Defaults.FLAG_BLOCK_SYNCH);
|
||||
validate();
|
||||
worldObj.setTileEntity(xCoord, yCoord, zCoord, this);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateEntity() {
|
||||
if (!Proxies.common.isSimulating(worldObj))
|
||||
updateClientSide();
|
||||
else {
|
||||
if (!isInited) {
|
||||
initialize();
|
||||
isInited = true;
|
||||
}
|
||||
|
||||
// Periodic validation if needed
|
||||
if (worldObj.getTotalWorldTime() % 200 == 0 && (!isIntegratedIntoStructure() || isMaster()))
|
||||
validateStructure();
|
||||
|
||||
updateServerSide();
|
||||
}
|
||||
}
|
||||
|
||||
protected void updateServerSide() {
|
||||
}
|
||||
|
||||
protected void updateClientSide() {
|
||||
}
|
||||
|
||||
/* TEXTURES */
|
||||
public int getIcon(int side, int metadata) {
|
||||
return BlockAlveary.PLAIN;
|
||||
}
|
||||
|
||||
/* LOADING & SAVING */
|
||||
@Override
|
||||
public void readFromNBT(NBTTagCompound nbttagcompound) {
|
||||
super.readFromNBT(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();
|
||||
|
||||
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 fromPacketPayload(PacketPayload payload) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public PacketPayload getPacketPayload() {
|
||||
return null;
|
||||
}
|
||||
|
||||
/* ITILESTRUCTURE */
|
||||
IStructureLogic structureLogic;
|
||||
|
||||
private boolean isMaster;
|
||||
protected int masterX, masterZ;
|
||||
protected int masterY = -99;
|
||||
|
||||
@Override
|
||||
public String getTypeUID() {
|
||||
return structureLogic.getTypeUID();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void validateStructure() {
|
||||
structureLogic.validateStructure();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void makeMaster() {
|
||||
setCentralTE(null);
|
||||
isMaster = true;
|
||||
|
||||
if (inventory == null)
|
||||
createInventory();
|
||||
}
|
||||
|
||||
@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 IInventory getInventory() {
|
||||
return inventory;
|
||||
}
|
||||
|
||||
/* 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
|
||||
@Override
|
||||
public LinkedList<ITrigger> getCustomTriggers() {
|
||||
LinkedList<ITrigger> res = new LinkedList<ITrigger>();
|
||||
res.add(ForestryTrigger.missingQueen);
|
||||
res.add(ForestryTrigger.missingDrone);
|
||||
return res;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isUseableByPlayer(EntityPlayer player) {
|
||||
return Utils.isUseableByPlayer(player, this, worldObj, xCoord, yCoord, zCoord);
|
||||
}
|
||||
|
||||
}
|
||||
+157
@@ -0,0 +1,157 @@
|
||||
/*******************************************************************************
|
||||
* Copyright 2011-2014 by SirSengir
|
||||
*
|
||||
* This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.
|
||||
*
|
||||
* To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/3.0/.
|
||||
******************************************************************************/
|
||||
package forestry.apiculture.gadgets;
|
||||
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.nbt.NBTTagCompound;
|
||||
|
||||
import net.minecraftforge.common.util.ForgeDirection;
|
||||
|
||||
import buildcraft.api.power.IPowerReceptor;
|
||||
import buildcraft.api.power.PowerHandler;
|
||||
import buildcraft.api.power.PowerHandler.PowerReceiver;
|
||||
import buildcraft.api.power.PowerHandler.Type;
|
||||
|
||||
import forestry.api.apiculture.IAlvearyComponent;
|
||||
import forestry.core.network.PacketPayload;
|
||||
|
||||
public abstract class TileAlvearyClimatiser extends TileAlveary implements IPowerReceptor {
|
||||
|
||||
public static class ClimateControl {
|
||||
|
||||
final float changePerTransfer;
|
||||
final float boundaryUp;
|
||||
final float boundaryDown;
|
||||
|
||||
public ClimateControl(float changePerTransfer, float boundaryDown, float boundaryUp) {
|
||||
this.changePerTransfer = changePerTransfer;
|
||||
this.boundaryDown = boundaryDown;
|
||||
this.boundaryUp = boundaryUp;
|
||||
}
|
||||
}
|
||||
PowerHandler powerProvider;
|
||||
ClimateControl climateControl;
|
||||
private int transferTime = 0;
|
||||
private int animationDelay = 0;
|
||||
private final int textureOff;
|
||||
private final int textureOn;
|
||||
|
||||
public TileAlvearyClimatiser(ClimateControl control, int textureOff, int textureOn, int componentBlockMeta) {
|
||||
super(componentBlockMeta);
|
||||
this.climateControl = control;
|
||||
powerProvider = new PowerHandler(this, Type.MACHINE);
|
||||
powerProvider.configure(10, 100, 25, 200);
|
||||
this.textureOff = textureOff;
|
||||
this.textureOn = textureOn;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void openGui(EntityPlayer player) {
|
||||
}
|
||||
|
||||
/* UPDATING */
|
||||
@Override
|
||||
protected void updateServerSide() {
|
||||
super.updateServerSide();
|
||||
|
||||
// BC Power
|
||||
if (powerProvider != null) {
|
||||
powerProvider.update();
|
||||
}
|
||||
|
||||
if (!this.hasMaster())
|
||||
return;
|
||||
|
||||
if (transferTime > 0) {
|
||||
transferTime--;
|
||||
IAlvearyComponent component = (IAlvearyComponent) this.getCentralTE();
|
||||
if (component != null)
|
||||
component.addTemperatureChange(climateControl.changePerTransfer, climateControl.boundaryDown, climateControl.boundaryUp);
|
||||
}
|
||||
|
||||
if (animationDelay > 0) {
|
||||
animationDelay--;
|
||||
if (animationDelay <= 0)
|
||||
sendNetworkUpdate();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasFunction() {
|
||||
return true;
|
||||
}
|
||||
|
||||
/* TEXTURES */
|
||||
@Override
|
||||
public int getIcon(int side, int metadata) {
|
||||
if (animationDelay > 0)
|
||||
return textureOn;
|
||||
else
|
||||
return textureOff;
|
||||
}
|
||||
|
||||
/* IPOWERRECEPTOR */
|
||||
@Override
|
||||
public void doWork(PowerHandler workProvider) {
|
||||
if (!this.hasMaster())
|
||||
return;
|
||||
|
||||
if (powerProvider.useEnergy(powerProvider.getActivationEnergy(), powerProvider.getEnergyStored(), false) < powerProvider.getActivationEnergy())
|
||||
return;
|
||||
|
||||
transferTime = (int) Math.round(powerProvider.useEnergy(powerProvider.getActivationEnergy(), powerProvider.getEnergyStored(), true));
|
||||
|
||||
if (animationDelay <= 0) {
|
||||
animationDelay = 100;
|
||||
sendNetworkUpdate();
|
||||
} else
|
||||
animationDelay = 100;
|
||||
}
|
||||
|
||||
@Override
|
||||
public PowerReceiver getPowerReceiver(ForgeDirection side) {
|
||||
return powerProvider.getPowerReceiver();
|
||||
}
|
||||
|
||||
/* LOADING & SAVING */
|
||||
@Override
|
||||
public void readFromNBT(NBTTagCompound nbttagcompound) {
|
||||
super.readFromNBT(nbttagcompound);
|
||||
powerProvider.readFromNBT(nbttagcompound);
|
||||
transferTime = nbttagcompound.getInteger("Heating");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void writeToNBT(NBTTagCompound nbttagcompound) {
|
||||
super.writeToNBT(nbttagcompound);
|
||||
powerProvider.writeToNBT(nbttagcompound);
|
||||
nbttagcompound.setInteger("Heating", transferTime);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getInventoryName() {
|
||||
return "tile.alveary.climatiser";
|
||||
}
|
||||
|
||||
/* NETWORK */
|
||||
@Override
|
||||
public void fromPacketPayload(PacketPayload payload) {
|
||||
short delay = payload.shortPayload[0];
|
||||
if (animationDelay != delay) {
|
||||
animationDelay = delay;
|
||||
worldObj.func_147479_m(xCoord, yCoord, zCoord);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public PacketPayload getPacketPayload() {
|
||||
PacketPayload payload = new PacketPayload(0, 1);
|
||||
payload.shortPayload[0] = (short) animationDelay;
|
||||
return payload;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
/*******************************************************************************
|
||||
* Copyright 2011-2014 by SirSengir
|
||||
*
|
||||
* This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.
|
||||
*
|
||||
* To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/3.0/.
|
||||
******************************************************************************/
|
||||
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.TX_71_FNOF, BlockAlveary.TX_72_FNON, BLOCK_META);
|
||||
}
|
||||
|
||||
}
|
||||
+22
@@ -0,0 +1,22 @@
|
||||
/*******************************************************************************
|
||||
* Copyright 2011-2014 by SirSengir
|
||||
*
|
||||
* This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.
|
||||
*
|
||||
* To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/3.0/.
|
||||
******************************************************************************/
|
||||
package forestry.apiculture.gadgets;
|
||||
|
||||
public class TileAlvearyHeater extends TileAlvearyClimatiser {
|
||||
|
||||
public static final int TEXTURE_OFF = 57;
|
||||
public static final int TEXTURE_ON = 58;
|
||||
|
||||
/* CONSTANTS */
|
||||
public static final int BLOCK_META = 4;
|
||||
|
||||
public TileAlvearyHeater() {
|
||||
super(new ClimateControl(0.01f, 0.0f, 2.5f), BlockAlveary.TX_57_HTOF, BlockAlveary.TX_58_HTON, BLOCK_META);
|
||||
}
|
||||
|
||||
}
|
||||
+294
@@ -0,0 +1,294 @@
|
||||
/*******************************************************************************
|
||||
* Copyright 2011-2014 by SirSengir
|
||||
*
|
||||
* This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.
|
||||
*
|
||||
* To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/3.0/.
|
||||
******************************************************************************/
|
||||
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.FluidContainerRegistry.FluidContainerData;
|
||||
import net.minecraftforge.fluids.FluidRegistry;
|
||||
import net.minecraftforge.fluids.FluidStack;
|
||||
|
||||
import forestry.api.apiculture.IAlvearyComponent;
|
||||
import forestry.api.core.ForestryAPI;
|
||||
import forestry.core.config.Defaults;
|
||||
import forestry.core.interfaces.ILiquidTankContainer;
|
||||
import forestry.core.network.GuiId;
|
||||
import forestry.core.proxy.Proxies;
|
||||
import forestry.core.utils.ForestryTank;
|
||||
import forestry.core.utils.InventoryAdapter;
|
||||
import forestry.core.utils.LiquidHelper;
|
||||
import forestry.core.utils.StackUtils;
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
private final HygroregulatorRecipe[] recipes;
|
||||
|
||||
/* MEMBERS */
|
||||
InventoryAdapter canInventory = new InventoryAdapter(1, "CanInv");
|
||||
private ForestryTank liquidTank = new ForestryTank(Defaults.PROCESSOR_TANK_CAPACITY);
|
||||
|
||||
private HygroregulatorRecipe currentRecipe;
|
||||
private int transferTime;
|
||||
|
||||
public TileAlvearyHygroregulator() {
|
||||
super(BLOCK_META);
|
||||
|
||||
recipes = new HygroregulatorRecipe[] { new HygroregulatorRecipe(new FluidStack(LiquidHelper.getFluid(Defaults.LIQUID_WATER), 1), 1, 0.01f, -0.005f),
|
||||
new HygroregulatorRecipe(new FluidStack(LiquidHelper.getFluid(Defaults.LIQUID_LAVA), 1), 10, -0.01f, +0.005f),
|
||||
new HygroregulatorRecipe(new FluidStack(LiquidHelper.getFluid(Defaults.LIQUID_ICE), 1), 10, 0.02f, -0.01f) };
|
||||
}
|
||||
|
||||
@Override
|
||||
public void openGui(EntityPlayer player) {
|
||||
player.openGui(ForestryAPI.instance, GuiId.HygroregulatorGUI.ordinal(), worldObj, xCoord, yCoord, zCoord);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getInventoryName() {
|
||||
return "tile.alveary.5";
|
||||
}
|
||||
|
||||
/* UPDATING */
|
||||
private HygroregulatorRecipe getRecipe(FluidStack liquid) {
|
||||
HygroregulatorRecipe recipe = null;
|
||||
for (HygroregulatorRecipe rec : recipes)
|
||||
if (rec.liquid.isFluidEqual(liquid)) {
|
||||
recipe = rec;
|
||||
break;
|
||||
}
|
||||
return recipe;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void updateServerSide() {
|
||||
super.updateServerSide();
|
||||
|
||||
if (transferTime <= 0 && liquidTank.getFluidAmount() > 0) {
|
||||
currentRecipe = getRecipe(liquidTank.getFluid());
|
||||
|
||||
if (currentRecipe != null) {
|
||||
liquidTank.drain(currentRecipe.liquid.amount, true);
|
||||
transferTime = currentRecipe.transferTime;
|
||||
}
|
||||
}
|
||||
|
||||
if (transferTime > 0) {
|
||||
|
||||
transferTime--;
|
||||
if (currentRecipe != null) {
|
||||
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 (worldObj.getTotalWorldTime() % 20 * 10 != 0)
|
||||
return;
|
||||
|
||||
// Check if we have suitable items waiting in the item slot
|
||||
if (canInventory.getStackInSlot(0) != null) {
|
||||
FluidContainerData container = LiquidHelper.getLiquidContainer(canInventory.getStackInSlot(0));
|
||||
if (container != null &&
|
||||
(container.fluid.getFluid() == FluidRegistry.WATER || container.fluid.getFluid() == FluidRegistry.LAVA)) {
|
||||
|
||||
canInventory.setInventorySlotContents(0, StackUtils.replenishByContainer(this, canInventory.getStackInSlot(0), container, liquidTank));
|
||||
if (canInventory.getStackInSlot(0).stackSize <= 0)
|
||||
canInventory.setInventorySlotContents(0, null);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasFunction() {
|
||||
return true;
|
||||
}
|
||||
|
||||
/* SAVING & LOADING */
|
||||
@Override
|
||||
public void readFromNBT(NBTTagCompound nbttagcompound) {
|
||||
super.readFromNBT(nbttagcompound);
|
||||
|
||||
canInventory.readFromNBT(nbttagcompound);
|
||||
|
||||
liquidTank = new ForestryTank(Defaults.PROCESSOR_TANK_CAPACITY);
|
||||
if (nbttagcompound.hasKey("LiquidTank"))
|
||||
liquidTank.readFromNBT(nbttagcompound.getCompoundTag("LiquidTank"));
|
||||
|
||||
transferTime = nbttagcompound.getInteger("TransferTime");
|
||||
|
||||
if (nbttagcompound.hasKey("CurrentLiquid")) {
|
||||
FluidStack liquid = FluidStack.loadFluidStackFromNBT(nbttagcompound.getCompoundTag("CurrentLiquid"));
|
||||
currentRecipe = getRecipe(liquid);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void writeToNBT(NBTTagCompound nbttagcompound) {
|
||||
super.writeToNBT(nbttagcompound);
|
||||
|
||||
canInventory.writeToNBT(nbttagcompound);
|
||||
|
||||
NBTTagCompound NBTresourceSlot = new NBTTagCompound();
|
||||
liquidTank.writeToNBT(NBTresourceSlot);
|
||||
nbttagcompound.setTag("LiquidTank", NBTresourceSlot);
|
||||
|
||||
nbttagcompound.setInteger("TransferTime", transferTime);
|
||||
if (currentRecipe != null) {
|
||||
NBTTagCompound subcompound = new NBTTagCompound();
|
||||
currentRecipe.liquid.writeToNBT(subcompound);
|
||||
nbttagcompound.setTag("CurrentLiquid", subcompound);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/* TEXTURES */
|
||||
@Override
|
||||
public int getIcon(int side, int metadata) {
|
||||
return BlockAlveary.TX_73_VLVE;
|
||||
}
|
||||
|
||||
@Override
|
||||
public IInventory getInventory() {
|
||||
return canInventory;
|
||||
}
|
||||
|
||||
/* IINVENTORY */
|
||||
@Override
|
||||
public int getSizeInventory() {
|
||||
if (canInventory != null)
|
||||
return canInventory.getSizeInventory();
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ItemStack getStackInSlot(int slotIndex) {
|
||||
if (canInventory != null)
|
||||
return canInventory.getStackInSlot(slotIndex);
|
||||
else
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ItemStack decrStackSize(int slotIndex, int amount) {
|
||||
if (canInventory != null)
|
||||
return canInventory.decrStackSize(slotIndex, amount);
|
||||
else
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ItemStack getStackInSlotOnClosing(int slotIndex) {
|
||||
if (canInventory != null)
|
||||
return canInventory.getStackInSlotOnClosing(slotIndex);
|
||||
else
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setInventorySlotContents(int slotIndex, ItemStack itemstack) {
|
||||
// Client side handling for container synch
|
||||
if (canInventory == null && !Proxies.common.isSimulating(worldObj))
|
||||
createInventory();
|
||||
|
||||
if (canInventory != null)
|
||||
canInventory.setInventorySlotContents(slotIndex, itemstack);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getInventoryStackLimit() {
|
||||
if (canInventory != null)
|
||||
return canInventory.getInventoryStackLimit();
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void openInventory() {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void closeInventory() {
|
||||
}
|
||||
|
||||
/**
|
||||
* TODO: just a specialsource workaround
|
||||
*/
|
||||
@Override
|
||||
public boolean isUseableByPlayer(EntityPlayer player) {
|
||||
return super.isUseableByPlayer(player);
|
||||
}
|
||||
|
||||
/**
|
||||
* TODO: just a specialsource workaround
|
||||
*/
|
||||
@Override
|
||||
public boolean hasCustomInventoryName() {
|
||||
return super.hasCustomInventoryName();
|
||||
}
|
||||
|
||||
/**
|
||||
* TODO: just a specialsource workaround
|
||||
*/
|
||||
@Override
|
||||
public boolean isItemValidForSlot(int slotIndex, ItemStack itemstack) {
|
||||
return super.isItemValidForSlot(slotIndex, itemstack);
|
||||
}
|
||||
|
||||
/* ILIQUIDTANKCONTAINER */
|
||||
@Override
|
||||
public int fill(ForgeDirection from, FluidStack resource, boolean doFill) {
|
||||
return liquidTank.fill(resource, doFill);
|
||||
}
|
||||
|
||||
@Override
|
||||
public FluidStack drain(ForgeDirection from, int maxDrain, boolean doDrain) {
|
||||
return liquidTank.drain(maxDrain, doDrain);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ForestryTank[] getTanks() {
|
||||
return new ForestryTank[] { liquidTank };
|
||||
}
|
||||
|
||||
/* SMP GUI */
|
||||
public void getGUINetworkData(int i, int j) {
|
||||
}
|
||||
|
||||
public void sendGUINetworkData(Container container, ICrafting iCrafting) {
|
||||
}
|
||||
|
||||
}
|
||||
+839
@@ -0,0 +1,839 @@
|
||||
/*******************************************************************************
|
||||
* Copyright 2011-2014 by SirSengir
|
||||
*
|
||||
* This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.
|
||||
*
|
||||
* To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/3.0/.
|
||||
******************************************************************************/
|
||||
package forestry.apiculture.gadgets;
|
||||
|
||||
import java.util.LinkedHashSet;
|
||||
import java.util.Set;
|
||||
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.inventory.ICrafting;
|
||||
import net.minecraft.inventory.IInventory;
|
||||
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 net.minecraftforge.common.util.ForgeDirection;
|
||||
|
||||
import buildcraft.api.inventory.ISpecialInventory;
|
||||
|
||||
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.EnumHumidity;
|
||||
import forestry.api.core.EnumTemperature;
|
||||
import forestry.api.core.ForestryAPI;
|
||||
import forestry.api.core.ITileStructure;
|
||||
import forestry.api.genetics.IIndividual;
|
||||
import forestry.apiculture.gui.ContainerAlveary;
|
||||
import forestry.core.EnumErrorCode;
|
||||
import forestry.core.config.Config;
|
||||
import forestry.core.config.ForestryItem;
|
||||
import forestry.core.interfaces.IClimatised;
|
||||
import forestry.core.interfaces.IErrorSource;
|
||||
import forestry.core.interfaces.IHintSource;
|
||||
import forestry.core.network.GuiId;
|
||||
import forestry.core.network.PacketIds;
|
||||
import forestry.core.network.PacketInventoryStack;
|
||||
import forestry.core.proxy.Proxies;
|
||||
import forestry.core.utils.InventoryAdapter;
|
||||
import forestry.core.utils.TileInventoryAdapter;
|
||||
import forestry.plugins.PluginApiculture;
|
||||
|
||||
public class TileAlvearyPlain extends TileAlveary implements ISidedInventory, ISpecialInventory, IBeeHousing, IClimatised, IHintSource {
|
||||
|
||||
// / 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_PRODUCTION_COUNT = 7;
|
||||
// / MEMBERS
|
||||
protected IBeekeepingLogic beekeepingLogic;
|
||||
protected int biomeId;
|
||||
protected float temperature;
|
||||
protected float humidity;
|
||||
protected float tempChange = 0.0f;
|
||||
protected float humidChange = 0.0f;
|
||||
private int displayHealthMax = 0;
|
||||
private int displayHealth = 0;
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
/* LOADING & SAVING */
|
||||
@Override
|
||||
public void readFromNBT(NBTTagCompound nbttagcompound) {
|
||||
super.readFromNBT(nbttagcompound);
|
||||
|
||||
this.tempChange = nbttagcompound.getFloat("TempChange");
|
||||
this.humidChange = nbttagcompound.getFloat("HumidChange");
|
||||
|
||||
if (inventory != null)
|
||||
inventory.readFromNBT(nbttagcompound);
|
||||
if (beekeepingLogic != null)
|
||||
beekeepingLogic.readFromNBT(nbttagcompound);
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void writeToNBT(NBTTagCompound nbttagcompound) {
|
||||
super.writeToNBT(nbttagcompound);
|
||||
|
||||
nbttagcompound.setFloat("TempChange", tempChange);
|
||||
nbttagcompound.setFloat("HumidChange", humidChange);
|
||||
|
||||
if (inventory != null)
|
||||
inventory.writeToNBT(nbttagcompound);
|
||||
if (beekeepingLogic != null)
|
||||
beekeepingLogic.writeToNBT(nbttagcompound);
|
||||
|
||||
}
|
||||
|
||||
/* UPDATING */
|
||||
@Override
|
||||
public void initialize() {
|
||||
super.initialize();
|
||||
BiomeGenBase biome = worldObj.getBiomeGenForCoordsBody(xCoord, zCoord);
|
||||
this.biomeId = biome.biomeID;
|
||||
this.temperature = biome.temperature;
|
||||
this.humidity = biome.rainfall;
|
||||
setErrorState(EnumErrorCode.OK);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void updateServerSide() {
|
||||
|
||||
if (beekeepingLogic == null)
|
||||
return;
|
||||
if (!isMaster())
|
||||
return;
|
||||
|
||||
beekeepingLogic.update();
|
||||
|
||||
// Equalize humidity and temperature
|
||||
equalizeTemperature();
|
||||
equalizeHumidity();
|
||||
|
||||
IBee queen = beekeepingLogic.getQueen();
|
||||
if (queen == null)
|
||||
return;
|
||||
|
||||
// Add swarm effects
|
||||
if (worldObj.getTotalWorldTime() % 200 * 10 == 0)
|
||||
onQueenChange(inventory.getStackInSlot(SLOT_QUEEN));
|
||||
if (getErrorState() == EnumErrorCode.OK)
|
||||
queen.doFX(beekeepingLogic.getEffectData(), this);
|
||||
|
||||
if (getErrorState() == EnumErrorCode.OK && worldObj.getTotalWorldTime() % 50 == 0) {
|
||||
float f = xCoord + 0.5F;
|
||||
float f1 = yCoord + 0.0F + (worldObj.rand.nextFloat() * 6F) / 16F;
|
||||
float f2 = zCoord + 0.5F;
|
||||
float f3 = 0.52F;
|
||||
float f4 = worldObj.rand.nextFloat() * 0.6F - 0.3F;
|
||||
|
||||
Proxies.common.addEntitySwarmFX(worldObj, (f - f3), f1, (f2 + f4), 0F, 0F, 0F);
|
||||
Proxies.common.addEntitySwarmFX(worldObj, (f + f3), f1, (f2 + f4), 0F, 0F, 0F);
|
||||
Proxies.common.addEntitySwarmFX(worldObj, (f + f4), f1, (f2 - f3), 0F, 0F, 0F);
|
||||
Proxies.common.addEntitySwarmFX(worldObj, (f + f4), f1, (f2 + f3), 0F, 0F, 0F);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void updateClientSide() {
|
||||
|
||||
if (!isMaster())
|
||||
return;
|
||||
|
||||
if (inventory == null)
|
||||
return;
|
||||
|
||||
// / Multiplayer FX
|
||||
if (PluginApiculture.beeInterface.isMated(inventory.getStackInSlot(SLOT_QUEEN)))
|
||||
if (getErrorState() == EnumErrorCode.OK && worldObj.getTotalWorldTime() % 2 == 0) {
|
||||
IBee displayQueen = PluginApiculture.beeInterface.getMember(inventory.getStackInSlot(SLOT_QUEEN));
|
||||
displayQueen.doFX(beekeepingLogic.getEffectData(), this);
|
||||
}
|
||||
return;
|
||||
|
||||
}
|
||||
|
||||
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 (inventory == null || inventory.getStackInSlot(SLOT_QUEEN) == null)
|
||||
return 0;
|
||||
|
||||
if (PluginApiculture.beeInterface.isMated(inventory.getStackInSlot(SLOT_QUEEN)))
|
||||
return PluginApiculture.beeInterface.getMember(inventory.getStackInSlot(SLOT_QUEEN)).getHealth();
|
||||
else if (!PluginApiculture.beeInterface.isDrone(inventory.getStackInSlot(SLOT_QUEEN)))
|
||||
return displayHealth;
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
private int getMaxHealthDisplay() {
|
||||
if (inventory == null || inventory.getStackInSlot(SLOT_QUEEN) == null)
|
||||
return 0;
|
||||
|
||||
if (PluginApiculture.beeInterface.isMated(inventory.getStackInSlot(SLOT_QUEEN)))
|
||||
return PluginApiculture.beeInterface.getMember(inventory.getStackInSlot(SLOT_QUEEN)).getMaxHealth();
|
||||
else if (!PluginApiculture.beeInterface.isDrone(inventory.getStackInSlot(SLOT_QUEEN)))
|
||||
return displayHealthMax;
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
public int getHealthScaled(int i) {
|
||||
if (getMaxHealthDisplay() == 0)
|
||||
return 0;
|
||||
|
||||
return (getHealthDisplay() * i) / getMaxHealthDisplay();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean allowsInteraction(EntityPlayer player) {
|
||||
if (!super.allowsInteraction(player))
|
||||
return false;
|
||||
|
||||
return this.isIntegratedIntoStructure();
|
||||
}
|
||||
|
||||
/* STRUCTURE MANAGMENT */
|
||||
@Override
|
||||
protected void createInventory() {
|
||||
this.inventory = new TileInventoryAdapter(this, 9, "Items");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void makeMaster() {
|
||||
super.makeMaster();
|
||||
if (beekeepingLogic == null)
|
||||
this.beekeepingLogic = PluginApiculture.beeInterface.createBeekeepingLogic(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStructureReset() {
|
||||
super.onStructureReset();
|
||||
modifiers.clear();
|
||||
eventHandlers.clear();
|
||||
}
|
||||
|
||||
/* 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) {
|
||||
tempChange = Math.min(boundaryUp - temperature, Math.max(boundaryDown - temperature, tempChange + change));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addHumidityChange(float change, float boundaryDown, float boundaryUp) {
|
||||
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 void setDrone(ItemStack itemstack) {
|
||||
setInventorySlotContents(SLOT_DRONE, itemstack);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getBiomeId() {
|
||||
return this.biomeId;
|
||||
}
|
||||
|
||||
@Override
|
||||
public EnumTemperature getTemperature() {
|
||||
if (EnumTemperature.isBiomeHellish(biomeId) && 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 void setErrorState(int state) {
|
||||
setErrorState(EnumErrorCode.values()[state]);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getErrorOrdinal() {
|
||||
return getErrorState().ordinal();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canBreed() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean addProduct(ItemStack product, boolean all) {
|
||||
if (inventory == null)
|
||||
return false;
|
||||
|
||||
return inventory.tryAddStack(product, SLOT_PRODUCT_1, inventory.getSizeInventory() - SLOT_PRODUCT_1, all);
|
||||
}
|
||||
|
||||
@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;
|
||||
|
||||
Proxies.net.sendNetworkPacket(new PacketInventoryStack(PacketIds.IINVENTORY_STACK, xCoord, yCoord, zCoord, SLOT_QUEEN, queenStack), xCoord, yCoord,
|
||||
zCoord);
|
||||
|
||||
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() {
|
||||
for (IBeeModifier modifier : modifiers) {
|
||||
if (modifier.isHellish())
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/* IINVENTORY */
|
||||
@Override
|
||||
public InventoryAdapter getInternalInventory() {
|
||||
return (InventoryAdapter) getStructureInventory();
|
||||
}
|
||||
|
||||
private IInventory getStructureInventory() {
|
||||
|
||||
if (inventory != null) {
|
||||
if (isMaster() || !Proxies.common.isSimulating(worldObj))
|
||||
return inventory;
|
||||
} else if (hasMaster()) {
|
||||
ITileStructure central = getCentralTE();
|
||||
if (central != null)
|
||||
return central.getInventory();
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getSizeInventory() {
|
||||
IInventory inv = getStructureInventory();
|
||||
if (inv != null)
|
||||
return inv.getSizeInventory();
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ItemStack getStackInSlot(int slotIndex) {
|
||||
IInventory inv = getStructureInventory();
|
||||
if (inv != null)
|
||||
return inv.getStackInSlot(slotIndex);
|
||||
else
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ItemStack decrStackSize(int slotIndex, int amount) {
|
||||
IInventory inv = getStructureInventory();
|
||||
if (inv != null)
|
||||
return inv.decrStackSize(slotIndex, amount);
|
||||
else
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ItemStack getStackInSlotOnClosing(int slotIndex) {
|
||||
IInventory inv = getStructureInventory();
|
||||
if (inv != null)
|
||||
return inv.getStackInSlotOnClosing(slotIndex);
|
||||
else
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setInventorySlotContents(int slotIndex, ItemStack itemstack) {
|
||||
// Client side handling for container synch
|
||||
if (inventory == null && !Proxies.common.isSimulating(worldObj))
|
||||
createInventory();
|
||||
|
||||
IInventory inv = getStructureInventory();
|
||||
if (inv != null)
|
||||
inv.setInventorySlotContents(slotIndex, itemstack);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getInventoryName() {
|
||||
return "alveary.0";
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getInventoryStackLimit() {
|
||||
IInventory inv = getStructureInventory();
|
||||
if (inv != null)
|
||||
return inv.getInventoryStackLimit();
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean canTakeStackFromSide(int slotIndex, ItemStack itemstack, int side) {
|
||||
|
||||
if (!super.canTakeStackFromSide(slotIndex, itemstack, side))
|
||||
return false;
|
||||
|
||||
if (slotIndex != SLOT_QUEEN && slotIndex != SLOT_DRONE)
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean canPutStackFromSide(int slotIndex, ItemStack itemstack, int side) {
|
||||
|
||||
if (!super.canPutStackFromSide(slotIndex, itemstack, side))
|
||||
return false;
|
||||
|
||||
if (slotIndex == SLOT_QUEEN && PluginApiculture.beeInterface.isMember(itemstack)
|
||||
&& !PluginApiculture.beeInterface.isDrone(itemstack))
|
||||
return true;
|
||||
if (slotIndex == SLOT_DRONE && PluginApiculture.beeInterface.isDrone(itemstack))
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void openInventory() {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void closeInventory() {
|
||||
}
|
||||
|
||||
/**
|
||||
* TODO: just a specialsource workaround
|
||||
*/
|
||||
@Override
|
||||
public boolean isUseableByPlayer(EntityPlayer player) {
|
||||
return super.isUseableByPlayer(player);
|
||||
}
|
||||
|
||||
/**
|
||||
* TODO: just a specialsource workaround
|
||||
*/
|
||||
@Override
|
||||
public boolean hasCustomInventoryName() {
|
||||
return super.hasCustomInventoryName();
|
||||
}
|
||||
|
||||
/**
|
||||
* TODO: just a specialsource workaround
|
||||
*/
|
||||
@Override
|
||||
public boolean isItemValidForSlot(int slotIndex, ItemStack itemstack) {
|
||||
return super.isItemValidForSlot(slotIndex, itemstack);
|
||||
}
|
||||
|
||||
/**
|
||||
* TODO: just a specialsource workaround
|
||||
*/
|
||||
@Override
|
||||
public boolean canInsertItem(int i, ItemStack itemstack, int j) {
|
||||
return super.canInsertItem(i, itemstack, j);
|
||||
}
|
||||
|
||||
/**
|
||||
* TODO: just a specialsource workaround
|
||||
*/
|
||||
@Override
|
||||
public boolean canExtractItem(int i, ItemStack itemstack, int j) {
|
||||
return super.canExtractItem(i, itemstack, j);
|
||||
}
|
||||
|
||||
/**
|
||||
* TODO: just a specialsource workaround
|
||||
*/
|
||||
@Override
|
||||
public int[] getAccessibleSlotsFromSide(int side) {
|
||||
return super.getAccessibleSlotsFromSide(side);
|
||||
}
|
||||
|
||||
/* ISPECIALINVENTORY */
|
||||
@Override
|
||||
public int addItem(ItemStack stack, boolean doAdd, ForgeDirection from) {
|
||||
|
||||
IInventory inv = getStructureInventory();
|
||||
if (inv == null)
|
||||
return 0;
|
||||
|
||||
// Princesses && Queens
|
||||
if (ForestryItem.beePrincessGE.isItemEqual(stack) || ForestryItem.beeQueenGE.isItemEqual(stack))
|
||||
if (inv.getStackInSlot(SLOT_QUEEN) == null) {
|
||||
if (doAdd) {
|
||||
inv.setInventorySlotContents(SLOT_QUEEN, stack.copy());
|
||||
inv.getStackInSlot(SLOT_QUEEN).stackSize = 1;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
// Drones
|
||||
if (ForestryItem.beeDroneGE.isItemEqual(stack)) {
|
||||
|
||||
ItemStack droneStack = inv.getStackInSlot(SLOT_DRONE);
|
||||
if (droneStack == null) {
|
||||
if (doAdd)
|
||||
inv.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;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ItemStack[] extractItem(boolean doRemove, ForgeDirection from, int maxItemCount) {
|
||||
|
||||
IInventory inv = getStructureInventory();
|
||||
if (inv == null)
|
||||
return new ItemStack[0];
|
||||
|
||||
ItemStack product = null;
|
||||
|
||||
for (int i = SLOT_PRODUCT_1; i < inv.getSizeInventory(); i++) {
|
||||
if (inv.getStackInSlot(i) == null)
|
||||
continue;
|
||||
|
||||
ItemStack stack = inv.getStackInSlot(i);
|
||||
|
||||
if (doRemove)
|
||||
product = inv.decrStackSize(i, 1);
|
||||
else {
|
||||
product = stack.copy();
|
||||
product.stackSize = 1;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
return new ItemStack[] { product };
|
||||
}
|
||||
|
||||
/* SMP GUI */
|
||||
public void getGUINetworkData(int i, int j) {
|
||||
switch (i) {
|
||||
case 0:
|
||||
displayHealth = j;
|
||||
break;
|
||||
case 1:
|
||||
displayHealthMax = j;
|
||||
break;
|
||||
case 2:
|
||||
this.temperature = (float) j / 100;
|
||||
break;
|
||||
case 3:
|
||||
this.humidity = (float) j / 100;
|
||||
break;
|
||||
case 4:
|
||||
this.tempChange = (float) j / 100;
|
||||
break;
|
||||
case 5:
|
||||
this.humidChange = (float) j / 100;
|
||||
break;
|
||||
case 6:
|
||||
this.biomeId = 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, 2, Math.round(temperature * 100));
|
||||
iCrafting.sendProgressBarUpdate(container, 3, Math.round(humidity * 100));
|
||||
iCrafting.sendProgressBarUpdate(container, 4, Math.round(tempChange * 100));
|
||||
iCrafting.sendProgressBarUpdate(container, 5, Math.round(humidChange * 100));
|
||||
iCrafting.sendProgressBarUpdate(container, 6, biomeId);
|
||||
}
|
||||
|
||||
/* IERRORSOURCE */
|
||||
@Override
|
||||
public EnumErrorCode getErrorState() {
|
||||
if (hasMaster()) {
|
||||
ITileStructure tile = this.getCentralTE();
|
||||
if (tile != null)
|
||||
return ((IErrorSource) tile).getErrorState();
|
||||
}
|
||||
|
||||
return errorState;
|
||||
}
|
||||
|
||||
/* ICLIMATISED */
|
||||
@Override
|
||||
public boolean isClimatized() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public float getExactTemperature() {
|
||||
return this.temperature + this.tempChange;
|
||||
}
|
||||
|
||||
@Override
|
||||
public float getExactHumidity() {
|
||||
return this.humidity + this.humidChange;
|
||||
}
|
||||
|
||||
/* IHINTSOURCE */
|
||||
@Override
|
||||
public boolean hasHints() {
|
||||
return Config.hints.get("alveary").length > 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String[] getHints() {
|
||||
return Config.hints.get("alveary");
|
||||
}
|
||||
|
||||
/* IOWNABLE */
|
||||
@Override
|
||||
public boolean isOwnable() {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
+179
@@ -0,0 +1,179 @@
|
||||
/*******************************************************************************
|
||||
* Copyright 2011-2014 by SirSengir
|
||||
*
|
||||
* This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.
|
||||
*
|
||||
* To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/3.0/.
|
||||
******************************************************************************/
|
||||
package forestry.apiculture.gadgets;
|
||||
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.nbt.NBTTagCompound;
|
||||
|
||||
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.interfaces.ICrafter;
|
||||
import forestry.core.network.GuiId;
|
||||
import forestry.core.utils.InventoryAdapter;
|
||||
|
||||
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;
|
||||
|
||||
InventoryAdapter inventory = new InventoryAdapter(5, "Items", 1);
|
||||
|
||||
public TileAlvearySieve() {
|
||||
super(BLOCK_META);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void openGui(EntityPlayer player) {
|
||||
player.openGui(ForestryAPI.instance, GuiId.AlvearySieveGUI.ordinal(), worldObj, xCoord, yCoord, zCoord);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getInventoryName() {
|
||||
return "tile.alveary.7";
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasFunction() {
|
||||
return true;
|
||||
}
|
||||
|
||||
/* UPDATING */
|
||||
@Override
|
||||
public void initialize() {
|
||||
super.initialize();
|
||||
|
||||
if(!hasMaster() || !isIntegratedIntoStructure())
|
||||
return;
|
||||
|
||||
((IAlvearyComponent)getCentralTE()).registerBeeListener(this);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
protected void updateServerSide() {
|
||||
super.updateServerSide();
|
||||
if(worldObj.getTotalWorldTime() % 200 != 0)
|
||||
return;
|
||||
|
||||
if(!hasMaster() || !isIntegratedIntoStructure())
|
||||
return;
|
||||
|
||||
((IAlvearyComponent)getCentralTE()).registerBeeListener(this);
|
||||
}
|
||||
|
||||
/* SAVING & LOADING */
|
||||
@Override
|
||||
public void readFromNBT(NBTTagCompound nbttagcompound) {
|
||||
super.readFromNBT(nbttagcompound);
|
||||
inventory.readFromNBT(nbttagcompound);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void writeToNBT(NBTTagCompound nbttagcompound) {
|
||||
super.writeToNBT(nbttagcompound);
|
||||
inventory.writeToNBT(nbttagcompound);
|
||||
}
|
||||
|
||||
/* TEXTURES & INTERNAL */
|
||||
@Override
|
||||
public int getIcon(int side, int metadata) {
|
||||
if(side == 0 || side == 1)
|
||||
return BlockAlveary.BOTTOM;
|
||||
return BlockAlveary.SIEVE;
|
||||
}
|
||||
|
||||
private void destroySieve() {
|
||||
inventory.setInventorySlotContents(SLOT_SIEVE, null);
|
||||
}
|
||||
private void destroyPollen() {
|
||||
for(int i = SLOT_POLLEN_1; i < SLOT_POLLEN_1 + SLOTS_POLLEN_COUNT; i++) {
|
||||
inventory.setInventorySlotContents(i, null);
|
||||
}
|
||||
}
|
||||
|
||||
private boolean canStorePollen() {
|
||||
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) {
|
||||
for(int i = SLOT_POLLEN_1; i < SLOT_POLLEN_1 + SLOTS_POLLEN_COUNT; i++) {
|
||||
if(inventory.getStackInSlot(i) == null) {
|
||||
inventory.setInventorySlotContents(i, itemstack);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* INVENTORY */
|
||||
public InventoryAdapter getInternalInventory() {
|
||||
return inventory;
|
||||
}
|
||||
|
||||
/* ICRAFTER */
|
||||
@Override
|
||||
public boolean canTakeStack(int slotIndex) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ItemStack takenFromSlot(int slotIndex, boolean consumeRecipe, EntityPlayer player) {
|
||||
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 isHandled;
|
||||
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;
|
||||
}
|
||||
}
|
||||
+115
@@ -0,0 +1,115 @@
|
||||
/*******************************************************************************
|
||||
* Copyright 2011-2014 by SirSengir
|
||||
*
|
||||
* This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.
|
||||
*
|
||||
* To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/3.0/.
|
||||
******************************************************************************/
|
||||
package forestry.apiculture.gadgets;
|
||||
|
||||
import forestry.api.apiculture.IAlvearyComponent;
|
||||
import forestry.api.apiculture.IBeeGenome;
|
||||
import forestry.api.apiculture.IBeeModifier;
|
||||
|
||||
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())
|
||||
return;
|
||||
|
||||
((IAlvearyComponent)getCentralTE()).registerBeeModifier(this);
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void updateServerSide() {
|
||||
super.updateServerSide();
|
||||
if(worldObj.getTotalWorldTime() % 200 != 0)
|
||||
return;
|
||||
|
||||
if(!hasMaster() || !isIntegratedIntoStructure())
|
||||
return;
|
||||
|
||||
((IAlvearyComponent)getCentralTE()).registerBeeModifier(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getInventoryName() {
|
||||
return "tile.alveary.6";
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasFunction() {
|
||||
return true;
|
||||
}
|
||||
|
||||
/* TEXTURES */
|
||||
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;
|
||||
}
|
||||
|
||||
}
|
||||
+305
@@ -0,0 +1,305 @@
|
||||
/*******************************************************************************
|
||||
* Copyright 2011-2014 by SirSengir
|
||||
*
|
||||
* This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.
|
||||
*
|
||||
* To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/3.0/.
|
||||
******************************************************************************/
|
||||
package forestry.apiculture.gadgets;
|
||||
|
||||
import java.util.Map.Entry;
|
||||
import java.util.Stack;
|
||||
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.inventory.IInventory;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.nbt.NBTTagCompound;
|
||||
import net.minecraft.nbt.NBTTagList;
|
||||
|
||||
import net.minecraftforge.common.util.ForgeDirection;
|
||||
|
||||
import buildcraft.api.inventory.ISpecialInventory;
|
||||
|
||||
import forestry.api.apiculture.BeeManager;
|
||||
import forestry.api.apiculture.EnumBeeType;
|
||||
import forestry.api.apiculture.IAlvearyComponent;
|
||||
import forestry.api.apiculture.IBee;
|
||||
import forestry.api.apiculture.IBeeHousing;
|
||||
import forestry.api.core.ForestryAPI;
|
||||
import forestry.apiculture.worldgen.WorldGenHive;
|
||||
import forestry.apiculture.worldgen.WorldGenHiveSwamer;
|
||||
import forestry.core.network.GuiId;
|
||||
import forestry.core.proxy.Proxies;
|
||||
import forestry.core.utils.TileInventoryAdapter;
|
||||
import forestry.plugins.PluginApiculture;
|
||||
|
||||
public class TileAlvearySwarmer extends TileAlveary implements ISpecialInventory {
|
||||
|
||||
/* CONSTANTS */
|
||||
public static final int BLOCK_META = 2;
|
||||
|
||||
TileInventoryAdapter swarmerInventory;
|
||||
private final Stack<ItemStack> pendingSpawns = new Stack<ItemStack>();
|
||||
|
||||
public TileAlvearySwarmer() {
|
||||
super(BLOCK_META);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void initialize() {
|
||||
super.initialize();
|
||||
if (swarmerInventory == null)
|
||||
createInventory();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void openGui(EntityPlayer player) {
|
||||
player.openGui(ForestryAPI.instance, GuiId.AlvearySwarmerGUI.ordinal(), worldObj, xCoord, yCoord, zCoord);
|
||||
}
|
||||
|
||||
/* UPDATING */
|
||||
@Override
|
||||
protected void updateServerSide() {
|
||||
super.updateServerSide();
|
||||
|
||||
if (worldObj.getTotalWorldTime() % 100 != 0)
|
||||
if (pendingSpawns.size() > 0)
|
||||
trySpawnSwarm();
|
||||
|
||||
if (worldObj.getTotalWorldTime() % 500 != 0)
|
||||
return;
|
||||
|
||||
if (!this.hasMaster())
|
||||
return;
|
||||
|
||||
IAlvearyComponent master = (IAlvearyComponent) this.getCentralTE();
|
||||
if (!(master instanceof IBeeHousing))
|
||||
return;
|
||||
|
||||
IBeeHousing housing = (IBeeHousing) master;
|
||||
ItemStack queenstack = housing.getQueen();
|
||||
if (queenstack == null)
|
||||
return;
|
||||
if (!PluginApiculture.beeInterface.isMated(queenstack))
|
||||
return;
|
||||
|
||||
// Calculate chance
|
||||
int slot = getInducerSlot();
|
||||
if (slot < 0)
|
||||
return;
|
||||
int chance = getChanceFor(swarmerInventory.getStackInSlot(slot));
|
||||
|
||||
// Remove resource
|
||||
swarmerInventory.decrStackSize(slot, 1);
|
||||
|
||||
// Try to spawn princess
|
||||
if (worldObj.rand.nextInt(1000) >= chance)
|
||||
return;
|
||||
|
||||
// Queue swarm spawn
|
||||
IBee spawn = PluginApiculture.beeInterface.getMember(queenstack);
|
||||
spawn.setIsNatural(false);
|
||||
pendingSpawns.push(PluginApiculture.beeInterface.getMemberStack(spawn, EnumBeeType.PRINCESS.ordinal()));
|
||||
|
||||
}
|
||||
|
||||
private int getChanceFor(ItemStack stack) {
|
||||
for (Entry<ItemStack, Integer> entry : BeeManager.inducers.entrySet()) {
|
||||
if (entry.getKey().isItemEqual(stack))
|
||||
return entry.getValue();
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
private int getInducerSlot() {
|
||||
for (int i = 0; i < swarmerInventory.getSizeInventory(); i++) {
|
||||
if (swarmerInventory.getStackInSlot(i) == null)
|
||||
continue;
|
||||
for (Entry<ItemStack, Integer> entry : BeeManager.inducers.entrySet()) {
|
||||
if (entry.getKey().isItemEqual(swarmerInventory.getStackInSlot(i)))
|
||||
return i;
|
||||
}
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
private void trySpawnSwarm() {
|
||||
|
||||
ItemStack toSpawn = pendingSpawns.peek();
|
||||
WorldGenHive generator = new WorldGenHiveSwamer(new ItemStack[] { toSpawn });
|
||||
|
||||
int i = 0;
|
||||
while (i < 10) {
|
||||
i++;
|
||||
int spawnX = xCoord + worldObj.rand.nextInt(40 * 2) - 40;
|
||||
int spawnY = yCoord + worldObj.rand.nextInt(40);
|
||||
int spawnZ = zCoord + worldObj.rand.nextInt(40 * 2) - 40;
|
||||
if (generator.generate(worldObj, worldObj.rand, spawnX, spawnY, spawnZ)) {
|
||||
pendingSpawns.pop();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasFunction() {
|
||||
return true;
|
||||
}
|
||||
|
||||
/* TEXTURES */
|
||||
@Override
|
||||
public int getIcon(int side, int metadata) {
|
||||
if(side == 0 || side == 1)
|
||||
return BlockAlveary.BOTTOM;
|
||||
|
||||
if (pendingSpawns.size() > 0)
|
||||
return BlockAlveary.TX_56_SWON;
|
||||
else
|
||||
return BlockAlveary.TX_55_SWOF;
|
||||
}
|
||||
|
||||
/* SAVING & LOADING */
|
||||
@Override
|
||||
public void readFromNBT(NBTTagCompound nbttagcompound) {
|
||||
super.readFromNBT(nbttagcompound);
|
||||
if (swarmerInventory == null)
|
||||
createInventory();
|
||||
swarmerInventory.readFromNBT(nbttagcompound);
|
||||
|
||||
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);
|
||||
if (swarmerInventory != null)
|
||||
swarmerInventory.writeToNBT(nbttagcompound);
|
||||
|
||||
NBTTagList nbttaglist = new NBTTagList();
|
||||
ItemStack[] offspring = pendingSpawns.toArray(new ItemStack[pendingSpawns.size()]);
|
||||
for (int i = 0; i < offspring.length; i++)
|
||||
if (offspring[i] != null) {
|
||||
NBTTagCompound nbttagcompound1 = new NBTTagCompound();
|
||||
nbttagcompound1.setByte("Slot", (byte) i);
|
||||
offspring[i].writeToNBT(nbttagcompound1);
|
||||
nbttaglist.appendTag(nbttagcompound1);
|
||||
}
|
||||
nbttagcompound.setTag("PendingSpawns", nbttaglist);
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void createInventory() {
|
||||
swarmerInventory = new TileInventoryAdapter(this, 4, "SwarmInv");
|
||||
}
|
||||
|
||||
@Override
|
||||
public IInventory getInventory() {
|
||||
return swarmerInventory;
|
||||
}
|
||||
|
||||
/* ISPECIALINVENTORY */
|
||||
@Override
|
||||
public int addItem(ItemStack stack, boolean doAdd, ForgeDirection from) {
|
||||
if (swarmerInventory != null)
|
||||
return swarmerInventory.addStack(stack, false, doAdd);
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ItemStack[] extractItem(boolean doRemove, ForgeDirection from, int maxItemCount) {
|
||||
return null;
|
||||
}
|
||||
|
||||
/* IINVENTORY */
|
||||
@Override
|
||||
public int getSizeInventory() {
|
||||
if (swarmerInventory != null)
|
||||
return swarmerInventory.getSizeInventory();
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ItemStack getStackInSlot(int slotIndex) {
|
||||
if (swarmerInventory != null)
|
||||
return swarmerInventory.getStackInSlot(slotIndex);
|
||||
else
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ItemStack decrStackSize(int slotIndex, int amount) {
|
||||
if (swarmerInventory != null)
|
||||
return swarmerInventory.decrStackSize(slotIndex, amount);
|
||||
else
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ItemStack getStackInSlotOnClosing(int slotIndex) {
|
||||
if (swarmerInventory != null)
|
||||
return swarmerInventory.getStackInSlotOnClosing(slotIndex);
|
||||
else
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setInventorySlotContents(int slotIndex, ItemStack itemstack) {
|
||||
// Client side handling for container synch
|
||||
if (swarmerInventory == null && !Proxies.common.isSimulating(worldObj))
|
||||
createInventory();
|
||||
|
||||
if (swarmerInventory != null)
|
||||
swarmerInventory.setInventorySlotContents(slotIndex, itemstack);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getInventoryName() {
|
||||
return "tile.alveary.2";
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getInventoryStackLimit() {
|
||||
if (swarmerInventory != null)
|
||||
return swarmerInventory.getInventoryStackLimit();
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override public void openInventory() {}
|
||||
@Override public void closeInventory() {}
|
||||
|
||||
/**
|
||||
* TODO: just a specialsource workaround
|
||||
*/
|
||||
@Override
|
||||
public boolean isUseableByPlayer(EntityPlayer player) {
|
||||
return super.isUseableByPlayer(player);
|
||||
}
|
||||
|
||||
/**
|
||||
* TODO: just a specialsource workaround
|
||||
*/
|
||||
@Override
|
||||
public boolean hasCustomInventoryName() {
|
||||
return super.hasCustomInventoryName();
|
||||
}
|
||||
|
||||
/**
|
||||
* TODO: just a specialsource workaround
|
||||
*/
|
||||
@Override
|
||||
public boolean isItemValidForSlot(int slotIndex, ItemStack itemstack) {
|
||||
return super.isItemValidForSlot(slotIndex, itemstack);
|
||||
}
|
||||
}
|
||||
+21
@@ -0,0 +1,21 @@
|
||||
/*******************************************************************************
|
||||
* Copyright 2011-2014 by SirSengir
|
||||
*
|
||||
* This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.
|
||||
*
|
||||
* To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/3.0/.
|
||||
******************************************************************************/
|
||||
package forestry.apiculture.gadgets;
|
||||
|
||||
import forestry.api.genetics.AlleleManager;
|
||||
import forestry.apiculture.genetics.BeeHelper;
|
||||
import forestry.core.gadgets.TileNaturalistChest;
|
||||
import forestry.core.network.GuiId;
|
||||
|
||||
public class TileApiaristChest extends TileNaturalistChest {
|
||||
|
||||
public TileApiaristChest() {
|
||||
super(AlleleManager.alleleRegistry.getSpeciesRoot(BeeHelper.UID), GuiId.ApiaristChestGUI.ordinal());
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,352 @@
|
||||
/*******************************************************************************
|
||||
* Copyright 2011-2014 by SirSengir
|
||||
*
|
||||
* This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.
|
||||
*
|
||||
* To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/3.0/.
|
||||
******************************************************************************/
|
||||
package forestry.apiculture.gadgets;
|
||||
|
||||
import java.util.LinkedList;
|
||||
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.inventory.ISidedInventory;
|
||||
import net.minecraft.item.ItemStack;
|
||||
|
||||
import buildcraft.api.gates.ITrigger;
|
||||
|
||||
import forestry.api.apiculture.IBeeGenome;
|
||||
import forestry.api.apiculture.IHiveFrame;
|
||||
import forestry.api.core.ForestryAPI;
|
||||
import forestry.core.gadgets.TileBase;
|
||||
import forestry.core.network.GuiId;
|
||||
import forestry.core.triggers.ForestryTrigger;
|
||||
import forestry.plugins.PluginApiculture;
|
||||
|
||||
public class TileApiary extends TileBeehouse implements ISidedInventory {
|
||||
|
||||
@Override
|
||||
public String getInventoryName() {
|
||||
return "apiculture.0";
|
||||
}
|
||||
|
||||
@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) {
|
||||
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) {
|
||||
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) {
|
||||
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) {
|
||||
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) {
|
||||
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) {
|
||||
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) {
|
||||
int wear = Math.round(amount * PluginApiculture.beeInterface.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),
|
||||
PluginApiculture.beeInterface.getMember(inventory.getStackInSlot(SLOT_QUEEN)), wear));
|
||||
}
|
||||
}
|
||||
|
||||
/* IINVENTORY */
|
||||
@Override
|
||||
protected boolean canTakeStackFromSide(int slotIndex, ItemStack itemstack, int side) {
|
||||
if (!super.canTakeStackFromSide(slotIndex, itemstack, side))
|
||||
return false;
|
||||
|
||||
switch (slotIndex) {
|
||||
case SLOT_QUEEN:
|
||||
case SLOT_DRONE:
|
||||
case SLOT_FRAMES_1:
|
||||
case SLOT_FRAMES_2:
|
||||
case SLOT_FRAMES_3:
|
||||
return false;
|
||||
default:
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean canPutStackFromSide(int slotIndex, ItemStack itemstack, int side) {
|
||||
if (!super.canPutStackFromSide(slotIndex, itemstack, side))
|
||||
return false;
|
||||
|
||||
if (slotIndex == SLOT_QUEEN && PluginApiculture.beeInterface.isMember(itemstack)
|
||||
&& !PluginApiculture.beeInterface.isDrone(itemstack))
|
||||
return true;
|
||||
|
||||
if (slotIndex == SLOT_DRONE && PluginApiculture.beeInterface.isDrone(itemstack))
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* TODO: just a specialsource workaround
|
||||
*/
|
||||
@Override
|
||||
public ItemStack getStackInSlot(int i) {
|
||||
return super.getStackInSlot(i);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setInventorySlotContents(int i, ItemStack itemstack) {
|
||||
super.setSlotContents(i, itemstack);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getSizeInventory() {
|
||||
return inventory.getSizeInventory();
|
||||
}
|
||||
|
||||
@Override
|
||||
public ItemStack decrStackSize(int i, int j) {
|
||||
return inventory.decrStackSize(i, j);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ItemStack getStackInSlotOnClosing(int slot) {
|
||||
return inventory.getStackInSlotOnClosing(slot);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getInventoryStackLimit() {
|
||||
return inventory.getInventoryStackLimit();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void openInventory() {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void closeInventory() {
|
||||
}
|
||||
|
||||
/**
|
||||
* TODO: just a specialsource workaround
|
||||
*/
|
||||
@Override
|
||||
public boolean isUseableByPlayer(EntityPlayer player) {
|
||||
return super.isUseableByPlayer(player);
|
||||
}
|
||||
|
||||
/**
|
||||
* TODO: just a specialsource workaround
|
||||
*/
|
||||
@Override
|
||||
public boolean hasCustomInventoryName() {
|
||||
return super.hasCustomInventoryName();
|
||||
}
|
||||
|
||||
/**
|
||||
* TODO: just a specialsource workaround
|
||||
*/
|
||||
@Override
|
||||
public boolean isItemValidForSlot(int slotIndex, ItemStack itemstack) {
|
||||
return super.isItemValidForSlot(slotIndex, itemstack);
|
||||
}
|
||||
|
||||
/**
|
||||
* TODO: just a specialsource workaround
|
||||
*/
|
||||
@Override
|
||||
public boolean canInsertItem(int i, ItemStack itemstack, int j) {
|
||||
return super.canInsertItem(i, itemstack, j);
|
||||
}
|
||||
|
||||
/**
|
||||
* TODO: just a specialsource workaround
|
||||
*/
|
||||
@Override
|
||||
public boolean canExtractItem(int i, ItemStack itemstack, int j) {
|
||||
return super.canExtractItem(i, itemstack, j);
|
||||
}
|
||||
|
||||
/**
|
||||
* TODO: just a specialsource workaround
|
||||
*/
|
||||
@Override
|
||||
public int[] getAccessibleSlotsFromSide(int side) {
|
||||
return super.getAccessibleSlotsFromSide(side);
|
||||
}
|
||||
|
||||
/* 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 */
|
||||
@Override
|
||||
public LinkedList<ITrigger> getCustomTriggers() {
|
||||
LinkedList<ITrigger> res = new LinkedList<ITrigger>();
|
||||
res.add(ForestryTrigger.missingQueen);
|
||||
res.add(ForestryTrigger.missingDrone);
|
||||
res.add(PluginApiculture.triggerNoFrames);
|
||||
return res;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,438 @@
|
||||
/*******************************************************************************
|
||||
* Copyright 2011-2014 by SirSengir
|
||||
*
|
||||
* This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.
|
||||
*
|
||||
* To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/3.0/.
|
||||
******************************************************************************/
|
||||
package forestry.apiculture.gadgets;
|
||||
|
||||
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 forestry.api.apiculture.IBee;
|
||||
import forestry.api.apiculture.IBeeGenome;
|
||||
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.genetics.IIndividual;
|
||||
import forestry.core.EnumErrorCode;
|
||||
import forestry.core.config.Config;
|
||||
import forestry.core.config.ForestryItem;
|
||||
import forestry.core.gadgets.TileBase;
|
||||
import forestry.core.interfaces.IClimatised;
|
||||
import forestry.core.network.GuiId;
|
||||
import forestry.core.network.PacketIds;
|
||||
import forestry.core.network.PacketInventoryStack;
|
||||
import forestry.core.network.PacketTileUpdate;
|
||||
import forestry.core.proxy.Proxies;
|
||||
import forestry.core.utils.InventoryAdapter;
|
||||
import forestry.core.utils.Utils;
|
||||
import forestry.plugins.PluginApiculture;
|
||||
|
||||
public class TileBeehouse extends TileBase implements IBeeHousing, IClimatised {
|
||||
|
||||
// CONSTANTS
|
||||
public static final int SLOT_QUEEN = 0;
|
||||
public static final int SLOT_DRONE = 1;
|
||||
public static final int SLOT_INVENTORY_1 = 2;
|
||||
protected static int SLOT_PRODUCT_1 = 2;
|
||||
protected static int SLOT_PRODUCT_COUNT = 7;
|
||||
public static final int SLOT_FRAMES_1 = 9;
|
||||
public static final int SLOT_FRAMES_2 = 10;
|
||||
public static final int SLOT_FRAMES_3 = 11;
|
||||
public static final int SLOT_INVENTORY_COUNT = 7;
|
||||
public static final int SLOT_FRAMES_COUNT = 3;
|
||||
// Inventory
|
||||
protected InventoryAdapter inventory = new InventoryAdapter(12, "Items");
|
||||
private final IBeekeepingLogic logic;
|
||||
private int biomeId = -1;
|
||||
private float temperature;
|
||||
private float humidity;
|
||||
private int displayHealthMax = 0;
|
||||
private int displayHealth = 0;
|
||||
|
||||
public TileBeehouse() {
|
||||
setHints(Config.hints.get("apiary"));
|
||||
logic = PluginApiculture.beeInterface.createBeekeepingLogic(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getInventoryName() {
|
||||
return "apiculture.2";
|
||||
}
|
||||
|
||||
@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.setFloat("Temp", temperature);
|
||||
nbttagcompound.setFloat("Humidity", humidity);
|
||||
nbttagcompound.setInteger("BiomeId", biomeId);
|
||||
|
||||
inventory.writeToNBT(nbttagcompound);
|
||||
if (logic != null)
|
||||
logic.writeToNBT(nbttagcompound);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void readFromNBT(NBTTagCompound nbttagcompound) {
|
||||
super.readFromNBT(nbttagcompound);
|
||||
|
||||
temperature = nbttagcompound.getFloat("Temp");
|
||||
humidity = nbttagcompound.getFloat("Humidity");
|
||||
biomeId = nbttagcompound.getInteger("BiomeId");
|
||||
|
||||
inventory.readFromNBT(nbttagcompound);
|
||||
logic.readFromNBT(nbttagcompound);
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void initialize() {
|
||||
super.initialize();
|
||||
updateBiome();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void validate() {
|
||||
updateBiome();
|
||||
}
|
||||
|
||||
/* ICLIMATISED */
|
||||
@Override
|
||||
public boolean isClimatized() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public EnumTemperature getTemperature() {
|
||||
if (EnumTemperature.isBiomeHellish(biomeId))
|
||||
return EnumTemperature.HELLISH;
|
||||
return EnumTemperature.getFromValue(temperature);
|
||||
}
|
||||
|
||||
@Override
|
||||
public EnumHumidity getHumidity() {
|
||||
return EnumHumidity.getFromValue(humidity);
|
||||
}
|
||||
|
||||
@Override
|
||||
public float getExactTemperature() {
|
||||
return this.temperature;
|
||||
}
|
||||
|
||||
@Override
|
||||
public float getExactHumidity() {
|
||||
return this.humidity;
|
||||
}
|
||||
|
||||
/* UPDATING */
|
||||
@Override
|
||||
public void updateClientSide() {
|
||||
|
||||
// / Multiplayer FX
|
||||
if (PluginApiculture.beeInterface.isMated(inventory.getStackInSlot(SLOT_QUEEN)))
|
||||
if (getErrorState() == EnumErrorCode.OK && worldObj.getTotalWorldTime() % 2 % 2 == 0) {
|
||||
IBee displayQueen = PluginApiculture.beeInterface.getMember(inventory.getStackInSlot(SLOT_QUEEN));
|
||||
displayQueen.doFX(logic.getEffectData(), this);
|
||||
}
|
||||
return;
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateServerSide() {
|
||||
|
||||
logic.update();
|
||||
|
||||
IBee queen = logic.getQueen();
|
||||
if (queen == null)
|
||||
return;
|
||||
|
||||
// Add swarm effects
|
||||
if (worldObj.getTotalWorldTime() % 200 * 10 == 0)
|
||||
onQueenChange(inventory.getStackInSlot(SLOT_QUEEN));
|
||||
/* These should get already done on the client / doesn't work server-side anyway
|
||||
if (getErrorState() == EnumErrorCode.OK && worldObj.getTotalWorldTime() % 2 % 2 == 0)
|
||||
queen.doFX(logic.getEffectData(), this);
|
||||
|
||||
if (getErrorState() == EnumErrorCode.OK && worldObj.getTotalWorldTime() % 50 == 0) {
|
||||
float f = xCoord + 0.5F;
|
||||
float f1 = yCoord + 0.0F + (worldObj.rand.nextFloat() * 6F) / 16F;
|
||||
float f2 = zCoord + 0.5F;
|
||||
float f3 = 0.52F;
|
||||
float f4 = worldObj.rand.nextFloat() * 0.6F - 0.3F;
|
||||
|
||||
Proxies.common.addEntitySwarmFX(worldObj, (f - f3), f1, (f2 + f4), 0F, 0F, 0F);
|
||||
Proxies.common.addEntitySwarmFX(worldObj, (f + f3), f1, (f2 + f4), 0F, 0F, 0F);
|
||||
Proxies.common.addEntitySwarmFX(worldObj, (f + f4), f1, (f2 - f3), 0F, 0F, 0F);
|
||||
Proxies.common.addEntitySwarmFX(worldObj, (f + f4), f1, (f2 + f3), 0F, 0F, 0F);
|
||||
}*/
|
||||
|
||||
}
|
||||
|
||||
// @Override
|
||||
public boolean isWorking() {
|
||||
return getErrorState() == EnumErrorCode.OK;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean addProduct(ItemStack product, boolean all) {
|
||||
return inventory.tryAddStack(product, SLOT_PRODUCT_1, SLOT_PRODUCT_COUNT, all, true);
|
||||
}
|
||||
|
||||
/* NETWORK SYNCH */
|
||||
@Override
|
||||
public void onQueenChange(ItemStack queenStack) {
|
||||
if (!Proxies.common.isSimulating(worldObj))
|
||||
return;
|
||||
|
||||
Proxies.net.sendNetworkPacket(new PacketInventoryStack(PacketIds.IINVENTORY_STACK, xCoord, yCoord, zCoord, SLOT_QUEEN, queenStack), xCoord, yCoord,
|
||||
zCoord);
|
||||
Proxies.net.sendNetworkPacket(new PacketTileUpdate(this), xCoord, yCoord, zCoord);
|
||||
}
|
||||
|
||||
/* STATE INFORMATION */
|
||||
private int getHealthDisplay() {
|
||||
if (inventory.getStackInSlot(SLOT_QUEEN) == null)
|
||||
return 0;
|
||||
|
||||
if (ForestryItem.beeQueenGE.isItemEqual(inventory.getStackInSlot(SLOT_QUEEN)))
|
||||
return PluginApiculture.beeInterface.getMember(inventory.getStackInSlot(SLOT_QUEEN)).getHealth();
|
||||
else if (ForestryItem.beePrincessGE.isItemEqual(inventory.getStackInSlot(SLOT_QUEEN)))
|
||||
return displayHealth;
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
private int getMaxHealthDisplay() {
|
||||
if (inventory.getStackInSlot(SLOT_QUEEN) == null)
|
||||
return 0;
|
||||
|
||||
if (ForestryItem.beeQueenGE.isItemEqual(inventory.getStackInSlot(SLOT_QUEEN)))
|
||||
return PluginApiculture.beeInterface.getMember(inventory.getStackInSlot(SLOT_QUEEN)).getMaxHealth();
|
||||
else if (ForestryItem.beePrincessGE.isItemEqual(inventory.getStackInSlot(SLOT_QUEEN)))
|
||||
return displayHealthMax;
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns scaled queen health or breeding progress
|
||||
*
|
||||
* @param i
|
||||
* @return
|
||||
*/
|
||||
public int getHealthScaled(int i) {
|
||||
if (getMaxHealthDisplay() == 0)
|
||||
return 0;
|
||||
|
||||
return (getHealthDisplay() * i) / getMaxHealthDisplay();
|
||||
}
|
||||
|
||||
public int getTemperatureScaled(int i) {
|
||||
return Math.round(i * (temperature / 2));
|
||||
}
|
||||
|
||||
public int getHumidityScaled(int i) {
|
||||
return Math.round(i * humidity);
|
||||
}
|
||||
|
||||
public void updateBiome() {
|
||||
if (worldObj != null) {
|
||||
BiomeGenBase biome = Utils.getBiomeAt(worldObj, xCoord, zCoord);
|
||||
if (biome != null) {
|
||||
this.biomeId = biome.biomeID;
|
||||
this.temperature = biome.temperature;
|
||||
this.humidity = biome.rainfall;
|
||||
setErrorState(EnumErrorCode.OK);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* 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());
|
||||
}
|
||||
|
||||
/* INVENTORY MANAGMENT */
|
||||
@Override
|
||||
public InventoryAdapter getInternalInventory() {
|
||||
return inventory;
|
||||
}
|
||||
|
||||
public ItemStack getStackInSlot(int i) {
|
||||
return inventory.getStackInSlot(i);
|
||||
}
|
||||
|
||||
public void setSlotContents(int i, ItemStack itemstack) {
|
||||
inventory.setInventorySlotContents(i, itemstack);
|
||||
}
|
||||
|
||||
// / IBEEHOUSING
|
||||
@Override
|
||||
public int getXCoord() {
|
||||
return xCoord;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getYCoord() {
|
||||
return yCoord;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getZCoord() {
|
||||
return zCoord;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getBiomeId() {
|
||||
return this.biomeId;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ItemStack getQueen() {
|
||||
return getStackInSlot(SLOT_QUEEN);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ItemStack getDrone() {
|
||||
return getStackInSlot(SLOT_DRONE);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setQueen(ItemStack itemstack) {
|
||||
setSlotContents(SLOT_QUEEN, itemstack);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setDrone(ItemStack itemstack) {
|
||||
setSlotContents(SLOT_DRONE, itemstack);
|
||||
}
|
||||
|
||||
@Override
|
||||
public World getWorld() {
|
||||
return worldObj;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setErrorState(int state) {
|
||||
setErrorState(EnumErrorCode.values()[state]);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getErrorOrdinal() {
|
||||
return getErrorState().ordinal();
|
||||
}
|
||||
|
||||
@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;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,82 @@
|
||||
/*******************************************************************************
|
||||
* Copyright 2011-2014 by SirSengir
|
||||
*
|
||||
* This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.
|
||||
*
|
||||
* To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/3.0/.
|
||||
******************************************************************************/
|
||||
package forestry.apiculture.gadgets;
|
||||
|
||||
import net.minecraft.nbt.NBTTagCompound;
|
||||
import net.minecraft.network.NetworkManager;
|
||||
import net.minecraft.network.Packet;
|
||||
import net.minecraft.network.play.server.S35PacketUpdateTileEntity;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
|
||||
public class TileCandle extends TileEntity {
|
||||
private int colour;
|
||||
|
||||
// This is a non-ticking Tile Entity.
|
||||
@Override
|
||||
public boolean canUpdate() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Packet getDescriptionPacket() {
|
||||
NBTTagCompound nbt = new NBTTagCompound();
|
||||
writeToNBT(nbt);
|
||||
|
||||
return new S35PacketUpdateTileEntity(xCoord, yCoord, zCoord, 0, nbt);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity pkt) {
|
||||
readFromNBT(pkt.func_148857_g());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void readFromNBT(NBTTagCompound tagRoot) {
|
||||
super.readFromNBT(tagRoot);
|
||||
this.setColour(tagRoot.getInteger("colour"));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void writeToNBT(NBTTagCompound tagRoot) {
|
||||
super.writeToNBT(tagRoot);
|
||||
tagRoot.setInteger("colour", this.colour);
|
||||
}
|
||||
|
||||
public int getColour() {
|
||||
return this.colour;
|
||||
}
|
||||
|
||||
public void setColour(int value) {
|
||||
this.colour = value;
|
||||
}
|
||||
|
||||
public void setColour(int red, int green, int blue) {
|
||||
this.colour = toIntColour(red, green, blue);
|
||||
}
|
||||
|
||||
/*public void setColour(int[] cs) {
|
||||
this.colour = toIntColour(cs[0], cs[1], cs[2]);
|
||||
}*/
|
||||
|
||||
public void addColour(int red, int green, int blue) {
|
||||
int[] myColour = fromIntColour(this.colour);
|
||||
this.colour = toIntColour((red + myColour[0]) / 2, (green + myColour[0]) / 2, (blue + myColour[2]) / 2);
|
||||
}
|
||||
|
||||
private static int[] fromIntColour(int value) {
|
||||
int[] cs = new int[3];
|
||||
cs[0] = (value & 0xff0000) >> 16;
|
||||
cs[1] = (value & 0x00ff00) >> 8;
|
||||
cs[2] = value & 0x0000ff;
|
||||
return cs;
|
||||
}
|
||||
|
||||
private static int toIntColour(int r, int g, int b) {
|
||||
return r << 16 | g << 8 | b;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,52 @@
|
||||
/*******************************************************************************
|
||||
* Copyright 2011-2014 by SirSengir
|
||||
*
|
||||
* This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.
|
||||
*
|
||||
* To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/3.0/.
|
||||
******************************************************************************/
|
||||
package forestry.apiculture.gadgets;
|
||||
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.nbt.NBTTagCompound;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
|
||||
import forestry.core.utils.InventoryAdapter;
|
||||
|
||||
public class TileSwarm extends TileEntity {
|
||||
|
||||
public InventoryAdapter contained = new InventoryAdapter(2, "Contained");
|
||||
|
||||
@Override
|
||||
public boolean canUpdate() {
|
||||
return false;
|
||||
}
|
||||
|
||||
public TileSwarm setContained(ItemStack[] bees) {
|
||||
for (ItemStack itemstack : bees)
|
||||
contained.addStack(itemstack, false, true);
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
public boolean containsBees() {
|
||||
for (int i = 0; i < contained.getSizeInventory(); i++)
|
||||
if (contained.getStackInSlot(i) != null)
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void readFromNBT(NBTTagCompound nbttagcompound) {
|
||||
super.readFromNBT(nbttagcompound);
|
||||
contained.readFromNBT(nbttagcompound);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void writeToNBT(NBTTagCompound nbttagcompound) {
|
||||
super.writeToNBT(nbttagcompound);
|
||||
contained.writeToNBT(nbttagcompound);
|
||||
}
|
||||
|
||||
}
|
||||
+87
@@ -0,0 +1,87 @@
|
||||
/*******************************************************************************
|
||||
* Copyright 2011-2014 by SirSengir
|
||||
*
|
||||
* This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.
|
||||
*
|
||||
* To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/3.0/.
|
||||
******************************************************************************/
|
||||
package forestry.apiculture.genetics;
|
||||
|
||||
import net.minecraft.entity.EntityCreature;
|
||||
import net.minecraft.entity.ai.EntityAIBase;
|
||||
import net.minecraft.entity.ai.RandomPositionGenerator;
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.pathfinding.PathEntity;
|
||||
import net.minecraft.pathfinding.PathNavigate;
|
||||
import net.minecraft.util.Vec3;
|
||||
|
||||
public class AIAvoidPlayers extends EntityAIBase {
|
||||
|
||||
private EntityCreature mob;
|
||||
|
||||
private float farSpeed;
|
||||
private float nearSpeed;
|
||||
private float minDistance;
|
||||
|
||||
private PathEntity pathing;
|
||||
|
||||
private PathNavigate pathNavigator;
|
||||
|
||||
private EntityPlayer player;
|
||||
|
||||
public AIAvoidPlayers(EntityCreature mob, float minDistance, float farSpeed, float nearSpeed) {
|
||||
this.mob = mob;
|
||||
this.minDistance = minDistance;
|
||||
this.farSpeed = farSpeed;
|
||||
this.nearSpeed = nearSpeed;
|
||||
this.pathNavigator = mob.getNavigator();
|
||||
this.setMutexBits(1);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean shouldExecute() {
|
||||
|
||||
player = mob.worldObj.getClosestPlayerToEntity(mob, minDistance);
|
||||
|
||||
if (player == null)
|
||||
return false;
|
||||
|
||||
if (!mob.getEntitySenses().canSee(player))
|
||||
return false;
|
||||
|
||||
Vec3 randomTarget = RandomPositionGenerator.findRandomTargetBlockAwayFrom(mob, 16, 7,
|
||||
mob.worldObj.getWorldVec3Pool().getVecFromPool(player.posX, player.posY, player.posZ));
|
||||
|
||||
if (randomTarget == null)
|
||||
return false;
|
||||
|
||||
if (player.getDistanceSq(randomTarget.xCoord, randomTarget.yCoord, randomTarget.zCoord) < player.getDistanceSqToEntity(mob))
|
||||
return false;
|
||||
|
||||
pathing = pathNavigator.getPathToXYZ(randomTarget.xCoord, randomTarget.yCoord, randomTarget.zCoord);
|
||||
return pathing == null ? false : pathing.isDestinationSame(randomTarget);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean continueExecuting() {
|
||||
return !this.pathNavigator.noPath();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void startExecuting() {
|
||||
this.pathNavigator.setPath(pathing, farSpeed);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void resetTask() {
|
||||
player = null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateTask() {
|
||||
if (mob.getDistanceSqToEntity(player) < 49.0D)
|
||||
mob.getNavigator().setSpeed(nearSpeed);
|
||||
else
|
||||
mob.getNavigator().setSpeed(farSpeed);
|
||||
}
|
||||
}
|
||||
+233
@@ -0,0 +1,233 @@
|
||||
/*******************************************************************************
|
||||
* Copyright 2011-2014 by SirSengir
|
||||
*
|
||||
* This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.
|
||||
*
|
||||
* To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/3.0/.
|
||||
******************************************************************************/
|
||||
package forestry.apiculture.genetics;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.Locale;
|
||||
|
||||
import net.minecraft.client.renderer.texture.IIconRegister;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.util.IIcon;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
import cpw.mods.fml.relauncher.Side;
|
||||
import cpw.mods.fml.relauncher.SideOnly;
|
||||
|
||||
import forestry.api.apiculture.EnumBeeChromosome;
|
||||
import forestry.api.apiculture.EnumBeeType;
|
||||
import forestry.api.apiculture.IAlleleBeeSpecies;
|
||||
import forestry.api.apiculture.IBeeGenome;
|
||||
import forestry.api.apiculture.IBeeHousing;
|
||||
import forestry.api.apiculture.IBeeRoot;
|
||||
import forestry.api.core.IIconProvider;
|
||||
import forestry.api.genetics.AlleleManager;
|
||||
import forestry.api.genetics.IAllele;
|
||||
import forestry.api.genetics.IClassification;
|
||||
import forestry.api.genetics.IIndividual;
|
||||
import forestry.api.genetics.IMutation;
|
||||
import forestry.core.config.Defaults;
|
||||
import forestry.core.genetics.AlleleSpecies;
|
||||
import forestry.core.render.TextureManager;
|
||||
import forestry.core.utils.StackUtils;
|
||||
|
||||
public class AlleleBeeSpecies extends AlleleSpecies implements IAlleleBeeSpecies, IIconProvider {
|
||||
|
||||
public IJubilanceProvider jubilanceProvider;
|
||||
|
||||
private IBeeRoot root;
|
||||
|
||||
private HashMap<ItemStack, Integer> products = new HashMap<ItemStack, Integer>();
|
||||
private HashMap<ItemStack, Integer> specialty = new HashMap<ItemStack, Integer>();
|
||||
|
||||
private String texture;
|
||||
private int primaryColour;
|
||||
private int secondaryColour;
|
||||
|
||||
private String iconType = "default";
|
||||
|
||||
public AlleleBeeSpecies(String uid, boolean dominant, String name, IClassification branch, int primaryColor, int secondaryColor) {
|
||||
this(uid, dominant, name, branch, null, primaryColor, secondaryColor);
|
||||
}
|
||||
|
||||
public AlleleBeeSpecies(String uid, boolean dominant, String name, IClassification branch, String binomial, int primaryColor, int secondaryColor) {
|
||||
this(uid, dominant, name, branch, binomial, primaryColor, secondaryColor, new JubilanceDefault());
|
||||
}
|
||||
|
||||
public AlleleBeeSpecies(String uid, boolean dominant, String name, IClassification branch, String binomial, int primaryColor, int secondaryColor,
|
||||
IJubilanceProvider jubilanceProvider) {
|
||||
super(uid, dominant, name, branch, binomial);
|
||||
|
||||
this.root = (IBeeRoot)AlleleManager.alleleRegistry.getSpeciesRoot("rootBees");
|
||||
this.primaryColour = primaryColor;
|
||||
this.secondaryColour = secondaryColor;
|
||||
this.jubilanceProvider = jubilanceProvider;
|
||||
texture = Defaults.TEXTURE_PATH_ENTITIES + "/bees/honeyBee.png";
|
||||
}
|
||||
|
||||
@Override
|
||||
public IBeeRoot getRoot() {
|
||||
return root;
|
||||
}
|
||||
|
||||
public AlleleBeeSpecies setEntityTexture(String texture) {
|
||||
this.texture = Defaults.TEXTURE_PATH_ENTITIES + "/bees/" + texture + ".png";
|
||||
return this;
|
||||
}
|
||||
|
||||
public AlleleBeeSpecies addProduct(ItemStack product, int chance) {
|
||||
this.products.put(product, chance);
|
||||
return this;
|
||||
}
|
||||
|
||||
public AlleleBeeSpecies addSpecialty(ItemStack specialty, int chance) {
|
||||
this.specialty.put(specialty, chance);
|
||||
return this;
|
||||
}
|
||||
|
||||
public AlleleBeeSpecies setJubilanceProvider(IJubilanceProvider provider) {
|
||||
this.jubilanceProvider = provider;
|
||||
return this;
|
||||
}
|
||||
|
||||
/* RESEARCH */
|
||||
@Override
|
||||
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.ordinal())) {
|
||||
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);
|
||||
}
|
||||
|
||||
@Override
|
||||
public float getResearchSuitability(ItemStack itemstack) {
|
||||
if(itemstack == null)
|
||||
return 0f;
|
||||
|
||||
for(ItemStack stack : products.keySet())
|
||||
if(stack.isItemEqual(itemstack))
|
||||
return 1.0f;
|
||||
for(ItemStack stack : specialty.keySet())
|
||||
if(stack.isItemEqual(itemstack))
|
||||
return 1.0f;
|
||||
|
||||
return super.getResearchSuitability(itemstack);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ItemStack[] getResearchBounty(World world, String researcher, IIndividual individual, int bountyLevel) {
|
||||
ArrayList<ItemStack> bounty = new ArrayList<ItemStack>();
|
||||
for(ItemStack stack : super.getResearchBounty(world, researcher, individual, bountyLevel))
|
||||
bounty.add(stack);
|
||||
|
||||
if(bountyLevel > 10) {
|
||||
for(ItemStack stack : specialty.keySet()) {
|
||||
bounty.add(StackUtils.copyWithRandomSize(stack, (int)((float)bountyLevel / 2), world.rand));
|
||||
}
|
||||
}
|
||||
for(ItemStack stack : products.keySet()) {
|
||||
bounty.add(StackUtils.copyWithRandomSize(stack, (int)((float)bountyLevel / 2), world.rand));
|
||||
}
|
||||
return bounty.toArray(StackUtils.EMPTY_STACK_ARRAY);
|
||||
}
|
||||
|
||||
/* OTHER */
|
||||
@Override
|
||||
public boolean isNocturnal() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public HashMap<ItemStack, Integer> getProducts() {
|
||||
return products;
|
||||
}
|
||||
|
||||
@Override
|
||||
public HashMap<ItemStack, Integer> getSpecialty() {
|
||||
return specialty;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isJubilant(IBeeGenome genome, IBeeHousing housing) {
|
||||
return jubilanceProvider.isJubilant(this, genome, housing);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getEntityTexture() {
|
||||
return texture;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getIconColour(int renderPass) {
|
||||
if (renderPass == 0)
|
||||
return primaryColour;
|
||||
if (renderPass == 1)
|
||||
return secondaryColour;
|
||||
return 0xffffff;
|
||||
}
|
||||
|
||||
@SideOnly(Side.CLIENT)
|
||||
private static IIcon[][] icons;
|
||||
|
||||
@SideOnly(Side.CLIENT)
|
||||
@Override
|
||||
public void registerIcons(IIconRegister register) {
|
||||
icons = new IIcon[EnumBeeType.values().length][3];
|
||||
|
||||
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];
|
||||
}
|
||||
|
||||
@Override
|
||||
@SideOnly(Side.CLIENT)
|
||||
public IIconProvider getIconProvider() {
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
@SideOnly(Side.CLIENT)
|
||||
public IIcon getIcon(short texUID) {
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
+67
@@ -0,0 +1,67 @@
|
||||
/*******************************************************************************
|
||||
* Copyright 2011-2014 by SirSengir
|
||||
*
|
||||
* This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.
|
||||
*
|
||||
* To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/3.0/.
|
||||
******************************************************************************/
|
||||
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.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 {
|
||||
|
||||
public static DamageSource damageSourceBeeAggressive = new DamageSourceForestry("bee.aggressive");
|
||||
|
||||
public AlleleEffectAggressive(String uid) {
|
||||
super(uid, "aggressive", true, 40, false, false);
|
||||
}
|
||||
|
||||
@Override
|
||||
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;
|
||||
|
||||
// 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);
|
||||
}
|
||||
|
||||
return storedData;
|
||||
}
|
||||
|
||||
}
|
||||
+111
@@ -0,0 +1,111 @@
|
||||
/*******************************************************************************
|
||||
* Copyright 2011-2014 by SirSengir
|
||||
*
|
||||
* This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.
|
||||
*
|
||||
* To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/3.0/.
|
||||
******************************************************************************/
|
||||
package forestry.apiculture.genetics;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
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.core.genetics.EffectData;
|
||||
|
||||
public class AlleleEffectCreeper extends AlleleEffectThrottled {
|
||||
|
||||
private final int explosionChance = 50;
|
||||
byte defaultForce = 12;
|
||||
byte indexExplosionTimer = 1;
|
||||
byte indexExplosionForce = 2;
|
||||
|
||||
public AlleleEffectCreeper(String uid) {
|
||||
super(uid, "creeper", true, 20, false, true);
|
||||
}
|
||||
|
||||
@Override
|
||||
public IEffectData validateStorage(IEffectData storedData) {
|
||||
if (!(storedData instanceof EffectData))
|
||||
return new EffectData(3, 0);
|
||||
|
||||
if (((EffectData) storedData).getIntSize() < 3)
|
||||
return new EffectData(3, 0);
|
||||
|
||||
return storedData;
|
||||
}
|
||||
|
||||
@Override
|
||||
public IEffectData doEffect(IBeeGenome genome, IEffectData storedData, IBeeHousing housing) {
|
||||
|
||||
World world = housing.getWorld();
|
||||
|
||||
if (isHalted(storedData, housing))
|
||||
return storedData;
|
||||
|
||||
// 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);
|
||||
|
||||
// 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) {
|
||||
chance = 5;
|
||||
storedData.setInteger(indexExplosionForce, 6);
|
||||
} else if (count > 1) {
|
||||
chance = 20;
|
||||
storedData.setInteger(indexExplosionForce, 8);
|
||||
} else if (count > 0) {
|
||||
chance = 35;
|
||||
storedData.setInteger(indexExplosionForce, 10);
|
||||
}
|
||||
|
||||
if (world.rand.nextInt(1000) >= chance)
|
||||
continue;
|
||||
|
||||
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
|
||||
}
|
||||
|
||||
return storedData;
|
||||
}
|
||||
|
||||
private void progressExplosion(IEffectData storedData, World world, int x, int y, int z) {
|
||||
|
||||
int explosionTimer = storedData.getInteger(indexExplosionTimer);
|
||||
explosionTimer--;
|
||||
storedData.setInteger(indexExplosionTimer, explosionTimer);
|
||||
|
||||
if (explosionTimer > 0)
|
||||
return;
|
||||
|
||||
world.createExplosion(null, x, y, z, storedData.getInteger(indexExplosionForce), false);
|
||||
}
|
||||
|
||||
}
|
||||
+43
@@ -0,0 +1,43 @@
|
||||
/*******************************************************************************
|
||||
* Copyright 2011-2014 by SirSengir
|
||||
*
|
||||
* This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.
|
||||
*
|
||||
* To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/3.0/.
|
||||
******************************************************************************/
|
||||
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;
|
||||
import forestry.api.genetics.IEffectData;
|
||||
|
||||
public class AlleleEffectExploration extends AlleleEffectThrottled {
|
||||
|
||||
public AlleleEffectExploration(String uid) {
|
||||
super(uid, "exploration", false, 80, true, false);
|
||||
}
|
||||
|
||||
@Override
|
||||
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);
|
||||
}
|
||||
|
||||
return storedData;
|
||||
}
|
||||
|
||||
}
|
||||
+70
@@ -0,0 +1,70 @@
|
||||
/*******************************************************************************
|
||||
* Copyright 2011-2014 by SirSengir
|
||||
*
|
||||
* This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.
|
||||
*
|
||||
* To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/3.0/.
|
||||
******************************************************************************/
|
||||
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.proxy.Proxies;
|
||||
import forestry.core.utils.Vect;
|
||||
|
||||
public class AlleleEffectGlacial extends AlleleEffectThrottled {
|
||||
|
||||
public AlleleEffectGlacial(String uid) {
|
||||
super(uid, "glacial", false, 200, true, false);
|
||||
}
|
||||
|
||||
@Override
|
||||
public IEffectData doEffect(IBeeGenome genome, IEffectData storedData, IBeeHousing housing) {
|
||||
|
||||
World world = housing.getWorld();
|
||||
|
||||
if (isHalted(storedData, housing))
|
||||
return storedData;
|
||||
|
||||
EnumTemperature temp = EnumTemperature.getFromValue(BiomeGenBase.getBiome(housing.getBiomeId()).temperature);
|
||||
|
||||
switch (temp) {
|
||||
case HELLISH:
|
||||
case HOT:
|
||||
case WARM:
|
||||
return storedData;
|
||||
default:
|
||||
}
|
||||
|
||||
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 < 10; i++) {
|
||||
|
||||
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);
|
||||
if (block != Blocks.water)
|
||||
continue;
|
||||
|
||||
if (!world.isAirBlock(posBlock.x, posBlock.y + 1, posBlock.z))
|
||||
continue;
|
||||
|
||||
Proxies.common.setBlockWithNotify(world, posBlock.x, posBlock.y, posBlock.z, Blocks.ice);
|
||||
}
|
||||
|
||||
return storedData;
|
||||
}
|
||||
}
|
||||
+44
@@ -0,0 +1,44 @@
|
||||
/*******************************************************************************
|
||||
* Copyright 2011-2014 by SirSengir
|
||||
*
|
||||
* This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.
|
||||
*
|
||||
* To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/3.0/.
|
||||
******************************************************************************/
|
||||
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;
|
||||
|
||||
public class AlleleEffectHeroic extends AlleleEffectThrottled {
|
||||
|
||||
public AlleleEffectHeroic(String uid) {
|
||||
super(uid, "heroic", false, 40, true, false);
|
||||
}
|
||||
|
||||
@Override
|
||||
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;
|
||||
}
|
||||
|
||||
}
|
||||
+92
@@ -0,0 +1,92 @@
|
||||
/*******************************************************************************
|
||||
* Copyright 2011-2014 by SirSengir
|
||||
*
|
||||
* This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.
|
||||
*
|
||||
* To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/3.0/.
|
||||
******************************************************************************/
|
||||
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 {
|
||||
|
||||
int ignitionChance = 50;
|
||||
int fireDuration = 500;
|
||||
|
||||
public AlleleEffectIgnition(String uid) {
|
||||
super(uid, "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;
|
||||
}
|
||||
|
||||
}
|
||||
+86
@@ -0,0 +1,86 @@
|
||||
/*******************************************************************************
|
||||
* Copyright 2011-2014 by SirSengir
|
||||
*
|
||||
* This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.
|
||||
*
|
||||
* To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/3.0/.
|
||||
******************************************************************************/
|
||||
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 final int infectionChance = 50;
|
||||
|
||||
public AlleleEffectMiasmic(String uid) {
|
||||
super(uid, "misasmic", 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;
|
||||
}
|
||||
|
||||
}
|
||||
+64
@@ -0,0 +1,64 @@
|
||||
/*******************************************************************************
|
||||
* Copyright 2011-2014 by SirSengir
|
||||
*
|
||||
* This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.
|
||||
*
|
||||
* To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/3.0/.
|
||||
******************************************************************************/
|
||||
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.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 {
|
||||
|
||||
public static DamageSource damageSourceBeeEnd = new DamageSourceForestry("bee.end");
|
||||
|
||||
public AlleleEffectMisanthrope(String uid) {
|
||||
super(uid, "misanthrope", true, 20, false, false);
|
||||
}
|
||||
|
||||
@Override
|
||||
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;
|
||||
|
||||
// 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);
|
||||
}
|
||||
|
||||
return storedData;
|
||||
}
|
||||
|
||||
}
|
||||
+69
@@ -0,0 +1,69 @@
|
||||
/*******************************************************************************
|
||||
* Copyright 2011-2014 by SirSengir
|
||||
*
|
||||
* This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.
|
||||
*
|
||||
* To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/3.0/.
|
||||
******************************************************************************/
|
||||
package forestry.apiculture.genetics;
|
||||
|
||||
import net.minecraft.world.World;
|
||||
|
||||
import forestry.api.apiculture.IAlleleBeeEffect;
|
||||
import forestry.api.apiculture.IBeeGenome;
|
||||
import forestry.api.apiculture.IBeeHousing;
|
||||
import forestry.api.genetics.IEffectData;
|
||||
import forestry.core.genetics.Allele;
|
||||
import forestry.plugins.PluginApiculture;
|
||||
|
||||
public class AlleleEffectNone extends Allele implements IAlleleBeeEffect {
|
||||
|
||||
public AlleleEffectNone(String uid) {
|
||||
super(uid, 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 doEffect(genome, storedData, housing.getWorld(), housing.getBiomeId(), housing.getXCoord(), housing.getYCoord(), housing.getZCoord());
|
||||
}
|
||||
|
||||
protected IEffectData doEffect(IBeeGenome genome, IEffectData storedData, World world, int biomeid, int x, int y, int z) {
|
||||
return storedData;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return "None";
|
||||
}
|
||||
|
||||
@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;
|
||||
}
|
||||
|
||||
}
|
||||
+50
@@ -0,0 +1,50 @@
|
||||
/*******************************************************************************
|
||||
* Copyright 2011-2014 by SirSengir
|
||||
*
|
||||
* This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.
|
||||
*
|
||||
* To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/3.0/.
|
||||
******************************************************************************/
|
||||
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 forestry.api.apiculture.IBeeGenome;
|
||||
import forestry.api.apiculture.IBeeHousing;
|
||||
import forestry.api.genetics.IEffectData;
|
||||
|
||||
public class AlleleEffectPotion extends AlleleEffectThrottled {
|
||||
|
||||
private int potionId = 0;
|
||||
private final int duration;
|
||||
|
||||
public AlleleEffectPotion(String uid, String name, boolean isDominant, Potion potion, int duration, boolean requiresWorking) {
|
||||
super(uid, name, isDominant, 200, requiresWorking, false);
|
||||
potionId = potion.getId();
|
||||
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);
|
||||
@SuppressWarnings("rawtypes")
|
||||
List list = housing.getWorld().getEntitiesWithinAABB(EntityPlayer.class, beatifyBox);
|
||||
|
||||
for (Object obj : list) {
|
||||
EntityPlayer player = (EntityPlayer) obj;
|
||||
player.addPotionEffect(new PotionEffect(potionId, duration, 0));
|
||||
}
|
||||
|
||||
return storedData;
|
||||
}
|
||||
|
||||
}
|
||||
+122
@@ -0,0 +1,122 @@
|
||||
/*******************************************************************************
|
||||
* Copyright 2011-2014 by SirSengir
|
||||
*
|
||||
* This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.
|
||||
*
|
||||
* To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/3.0/.
|
||||
******************************************************************************/
|
||||
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.utils.Vect;
|
||||
|
||||
public class AlleleEffectRadioactive extends AlleleEffectThrottled {
|
||||
|
||||
public static DamageSource damageSourceBeeRadioactive = new DamageSourceForestry("bee.radioactive");
|
||||
|
||||
public AlleleEffectRadioactive(String uid) {
|
||||
super(uid, "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.getAABBPool().getAABB(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;
|
||||
}
|
||||
}
|
||||
+55
@@ -0,0 +1,55 @@
|
||||
/*******************************************************************************
|
||||
* Copyright 2011-2014 by SirSengir
|
||||
*
|
||||
* This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.
|
||||
*
|
||||
* To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/3.0/.
|
||||
******************************************************************************/
|
||||
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;
|
||||
|
||||
public class AlleleEffectRepulsion extends AlleleEffectThrottled {
|
||||
|
||||
public AlleleEffectRepulsion(String uid) {
|
||||
super(uid, "repulsion", false, 100, true, true);
|
||||
}
|
||||
|
||||
@Override
|
||||
public IEffectData doEffect(IBeeGenome genome, IEffectData storedData, IBeeHousing housing) {
|
||||
if (isHalted(storedData, housing))
|
||||
return storedData;
|
||||
|
||||
if (housing.getOwnerName() == null || housing.getOwnerName().isEmpty())
|
||||
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;
|
||||
}
|
||||
|
||||
}
|
||||
+108
@@ -0,0 +1,108 @@
|
||||
/*******************************************************************************
|
||||
* Copyright 2011-2014 by SirSengir
|
||||
*
|
||||
* This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.
|
||||
*
|
||||
* To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/3.0/.
|
||||
******************************************************************************/
|
||||
package forestry.apiculture.genetics;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
import net.minecraft.entity.EntityLiving;
|
||||
import net.minecraft.entity.boss.EntityDragon;
|
||||
import net.minecraft.entity.item.EntityItem;
|
||||
import net.minecraft.entity.monster.EntityBlaze;
|
||||
import net.minecraft.entity.monster.EntityCaveSpider;
|
||||
import net.minecraft.entity.monster.EntityCreeper;
|
||||
import net.minecraft.entity.monster.EntityEnderman;
|
||||
import net.minecraft.entity.monster.EntityGhast;
|
||||
import net.minecraft.entity.monster.EntitySkeleton;
|
||||
import net.minecraft.entity.monster.EntitySpider;
|
||||
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.StackUtils;
|
||||
import forestry.core.utils.Utils;
|
||||
|
||||
public class AlleleEffectResurrection extends AlleleEffectThrottled {
|
||||
|
||||
public static class Resurrectable {
|
||||
public final ItemStack res;
|
||||
public final Class<? extends EntityLiving> risen;
|
||||
|
||||
public Resurrectable(ItemStack res, Class<? extends EntityLiving> risen) {
|
||||
this.res = res;
|
||||
this.risen = risen;
|
||||
}
|
||||
}
|
||||
|
||||
public static List<Resurrectable> getReanimationList() {
|
||||
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));
|
||||
list.add(new Resurrectable(new ItemStack(Items.blaze_rod), EntityBlaze.class));
|
||||
return list;
|
||||
}
|
||||
|
||||
public static List<Resurrectable> getResurrectionList() {
|
||||
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));
|
||||
list.add(new Resurrectable(new ItemStack(Items.spider_eye), EntitySpider.class));
|
||||
list.add(new Resurrectable(new ItemStack(Items.string), EntityCaveSpider.class));
|
||||
list.add(new Resurrectable(new ItemStack(Items.spider_eye), EntityCaveSpider.class));
|
||||
list.add(new Resurrectable(new ItemStack(Items.ghast_tear), EntityGhast.class));
|
||||
list.add(new Resurrectable(new ItemStack(Blocks.dragon_egg), EntityDragon.class));
|
||||
return list;
|
||||
}
|
||||
|
||||
private final List<Resurrectable> resurrectables;
|
||||
|
||||
public AlleleEffectResurrection(String uid, String name, List<Resurrectable> resurrectables) {
|
||||
super(uid, name, true, 40, true, true);
|
||||
this.resurrectables = resurrectables;
|
||||
}
|
||||
|
||||
@Override
|
||||
public IEffectData doEffect(IBeeGenome genome, IEffectData storedData, IBeeHousing housing) {
|
||||
if (isHalted(storedData, housing))
|
||||
return storedData;
|
||||
|
||||
AxisAlignedBB bounding = getBounding(genome, housing, 1.0f);
|
||||
@SuppressWarnings("rawtypes")
|
||||
List list = housing.getWorld().getEntitiesWithinAABB(EntityItem.class, bounding);
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
}
|
||||
+79
@@ -0,0 +1,79 @@
|
||||
/*******************************************************************************
|
||||
* Copyright 2011-2014 by SirSengir
|
||||
*
|
||||
* This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.
|
||||
*
|
||||
* To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/3.0/.
|
||||
******************************************************************************/
|
||||
package forestry.apiculture.genetics;
|
||||
|
||||
import net.minecraft.init.Blocks;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraft.world.biome.BiomeGenBase;
|
||||
|
||||
import net.minecraftforge.common.util.ForgeDirection;
|
||||
|
||||
import forestry.api.apiculture.IBeeGenome;
|
||||
import forestry.api.apiculture.IBeeHousing;
|
||||
import forestry.api.core.EnumTemperature;
|
||||
import forestry.api.genetics.IEffectData;
|
||||
import forestry.core.proxy.Proxies;
|
||||
import forestry.core.utils.Vect;
|
||||
|
||||
public class AlleleEffectSnowing extends AlleleEffectThrottled {
|
||||
|
||||
public AlleleEffectSnowing(String uid) {
|
||||
super(uid, "snowing", false, 20, true, true);
|
||||
}
|
||||
|
||||
@Override
|
||||
public IEffectData doEffect(IBeeGenome genome, IEffectData storedData, IBeeHousing housing) {
|
||||
|
||||
World world = housing.getWorld();
|
||||
|
||||
if (isHalted(storedData, housing))
|
||||
return storedData;
|
||||
|
||||
EnumTemperature temp = EnumTemperature.getFromValue(BiomeGenBase.getBiome(housing.getBiomeId()).temperature);
|
||||
|
||||
switch (temp) {
|
||||
case HELLISH:
|
||||
case HOT:
|
||||
case WARM:
|
||||
return storedData;
|
||||
default:
|
||||
}
|
||||
|
||||
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 = 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);
|
||||
|
||||
// Put snow on the ground
|
||||
if (!world.isSideSolid(posBlock.x, posBlock.y - 1, posBlock.z, ForgeDirection.UP, false))
|
||||
continue;
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
@Override
|
||||
public IEffectData doFX(IBeeGenome genome, IEffectData storedData, IBeeHousing housing) {
|
||||
if (housing.getWorld().rand.nextInt(3) == 0) {
|
||||
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;
|
||||
}
|
||||
}
|
||||
+114
@@ -0,0 +1,114 @@
|
||||
/*******************************************************************************
|
||||
* Copyright 2011-2014 by SirSengir
|
||||
*
|
||||
* This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.
|
||||
*
|
||||
* To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/3.0/.
|
||||
******************************************************************************/
|
||||
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.Allele;
|
||||
import forestry.core.genetics.EffectData;
|
||||
import forestry.core.utils.StringUtil;
|
||||
import forestry.core.utils.Vect;
|
||||
import forestry.plugins.PluginApiculture;
|
||||
|
||||
public abstract class AlleleEffectThrottled extends Allele implements IAlleleBeeEffect {
|
||||
|
||||
private String name;
|
||||
private boolean isCombinable = false;
|
||||
private int throttle;
|
||||
private boolean requiresWorkingQueen = false;
|
||||
|
||||
public AlleleEffectThrottled(String uid, String name, boolean isDominant, int throttle, boolean requiresWorking, boolean isCombinable) {
|
||||
super(uid, isDominant);
|
||||
this.name = "apiculture.effect." + name;
|
||||
this.throttle = throttle;
|
||||
this.isCombinable = isCombinable;
|
||||
this.requiresWorkingQueen = requiresWorking;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return StringUtil.localize(name);
|
||||
}
|
||||
|
||||
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.getErrorOrdinal() != EnumErrorCode.OK.ordinal())
|
||||
return true;
|
||||
|
||||
int throttle = storedData.getInteger(0);
|
||||
throttle++;
|
||||
storedData.setInteger(0, throttle);
|
||||
|
||||
if (throttle < 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.getAABBPool().getAABB(min.x, min.y, min.z, max.x, max.y, max.z);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,37 @@
|
||||
/*******************************************************************************
|
||||
* Copyright 2011-2014 by SirSengir
|
||||
*
|
||||
* This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.
|
||||
*
|
||||
* To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/3.0/.
|
||||
******************************************************************************/
|
||||
package forestry.apiculture.genetics;
|
||||
|
||||
import forestry.api.genetics.IAlleleFlowers;
|
||||
import forestry.api.genetics.IFlowerProvider;
|
||||
import forestry.core.genetics.Allele;
|
||||
|
||||
public class AlleleFlowers extends Allele implements IAlleleFlowers {
|
||||
|
||||
IFlowerProvider provider;
|
||||
|
||||
public AlleleFlowers(String uid, IFlowerProvider provider) {
|
||||
this(uid, provider, false);
|
||||
}
|
||||
|
||||
public AlleleFlowers(String uid, IFlowerProvider provider, boolean isDominant) {
|
||||
super(uid, isDominant);
|
||||
this.provider = provider;
|
||||
}
|
||||
|
||||
@Override
|
||||
public IFlowerProvider getProvider() {
|
||||
return provider;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return getProvider().getDescription();
|
||||
}
|
||||
|
||||
}
|
||||
+110
@@ -0,0 +1,110 @@
|
||||
/*******************************************************************************
|
||||
* Copyright 2011-2014 by SirSengir
|
||||
*
|
||||
* This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.
|
||||
*
|
||||
* To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/3.0/.
|
||||
******************************************************************************/
|
||||
package forestry.apiculture.genetics;
|
||||
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.nbt.NBTTagCompound;
|
||||
|
||||
import forestry.api.apiculture.IApiaristTracker;
|
||||
import forestry.api.genetics.IBreedingTracker;
|
||||
import forestry.api.genetics.IIndividual;
|
||||
import forestry.core.genetics.BreedingTracker;
|
||||
import forestry.plugins.PluginApiculture;
|
||||
|
||||
public class ApiaristTracker extends BreedingTracker implements IApiaristTracker {
|
||||
|
||||
public ApiaristTracker(String s) {
|
||||
this(s, "");
|
||||
}
|
||||
|
||||
public ApiaristTracker(String s, String player) {
|
||||
super(s, player);
|
||||
}
|
||||
|
||||
private int queensTotal = 0;
|
||||
private int dronesTotal = 0;
|
||||
private int princessesTotal = 0;
|
||||
|
||||
@Override
|
||||
public void readFromNBT(NBTTagCompound nbttagcompound) {
|
||||
|
||||
queensTotal = nbttagcompound.getInteger("QueensTotal");
|
||||
princessesTotal = nbttagcompound.getInteger("PrincessesTotal");
|
||||
dronesTotal = nbttagcompound.getInteger("DronesTotal");
|
||||
|
||||
super.readFromNBT(nbttagcompound);
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void writeToNBT(NBTTagCompound nbttagcompound) {
|
||||
|
||||
nbttagcompound.setInteger("QueensTotal", queensTotal);
|
||||
nbttagcompound.setInteger("PrincessesTotal", princessesTotal);
|
||||
nbttagcompound.setInteger("DronesTotal", dronesTotal);
|
||||
|
||||
super.writeToNBT(nbttagcompound);
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void registerPickup(IIndividual individual) {
|
||||
if(!individual.getGenome().getPrimary().getRoot().getUID().equals(BeeHelper.UID))
|
||||
return;
|
||||
if(!individual.isPureBred(0))
|
||||
return;
|
||||
if(PluginApiculture.beeInterface.getCombinations(individual.getGenome().getPrimary()).size() > 0)
|
||||
return;
|
||||
|
||||
registerSpecies(individual.getGenome().getPrimary());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void registerQueen(IIndividual bee) {
|
||||
queensTotal++;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getQueenCount() {
|
||||
return queensTotal;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void registerPrincess(IIndividual bee) {
|
||||
|
||||
princessesTotal++;
|
||||
registerBirth(bee);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getPrincessCount() {
|
||||
return princessesTotal;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void registerDrone(IIndividual bee) {
|
||||
dronesTotal++;
|
||||
registerBirth(bee);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getDroneCount() {
|
||||
return dronesTotal;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected IBreedingTracker getCommonTracker(EntityPlayer player) {
|
||||
return PluginApiculture.beeInterface.getBreedingTracker(player.worldObj, "__COMMON_");
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String getPacketTag() {
|
||||
return BeeHelper.UID;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,713 @@
|
||||
/*******************************************************************************
|
||||
* Copyright 2011-2014 by SirSengir
|
||||
*
|
||||
* This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.
|
||||
*
|
||||
* To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/3.0/.
|
||||
******************************************************************************/
|
||||
package forestry.apiculture.genetics;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.nbt.NBTTagCompound;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraft.world.biome.BiomeGenBase;
|
||||
|
||||
import net.minecraftforge.common.BiomeDictionary;
|
||||
|
||||
import forestry.api.apiculture.EnumBeeChromosome;
|
||||
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.IBeeMutation;
|
||||
import forestry.api.apiculture.IBeekeepingMode;
|
||||
import forestry.api.core.EnumHumidity;
|
||||
import forestry.api.core.EnumTemperature;
|
||||
import forestry.api.genetics.AlleleManager;
|
||||
import forestry.api.genetics.EnumTolerance;
|
||||
import forestry.api.genetics.IAllele;
|
||||
import forestry.api.genetics.IChromosome;
|
||||
import forestry.api.genetics.IEffectData;
|
||||
import forestry.api.genetics.IFlowerProvider;
|
||||
import forestry.api.genetics.IGenome;
|
||||
import forestry.api.genetics.IIndividual;
|
||||
import forestry.api.genetics.IPollinatable;
|
||||
import forestry.core.EnumErrorCode;
|
||||
import forestry.core.config.Defaults;
|
||||
import forestry.core.genetics.Chromosome;
|
||||
import forestry.core.genetics.ClimateHelper;
|
||||
import forestry.core.genetics.GenericRatings;
|
||||
import forestry.core.genetics.IndividualLiving;
|
||||
import forestry.core.proxy.Proxies;
|
||||
import forestry.core.utils.StackUtils;
|
||||
import forestry.core.utils.StringUtil;
|
||||
import forestry.core.utils.Utils;
|
||||
import forestry.core.utils.Vect;
|
||||
import forestry.plugins.PluginApiculture;
|
||||
|
||||
public class Bee extends IndividualLiving implements IBee {
|
||||
|
||||
public IBeeGenome genome;
|
||||
public IBeeGenome mate;
|
||||
|
||||
/* CONSTRUCTOR */
|
||||
public Bee(NBTTagCompound nbttagcompound) {
|
||||
readFromNBT(nbttagcompound);
|
||||
}
|
||||
|
||||
public Bee(World world, IBeeGenome genome, IBee mate) {
|
||||
this(world, genome);
|
||||
this.mate = mate.getGenome();
|
||||
this.isIrregularMating = mate.isNatural() != this.isNatural;
|
||||
}
|
||||
|
||||
public Bee(IBeeGenome genome, IBee mate) {
|
||||
this(genome);
|
||||
this.mate = mate.getGenome();
|
||||
this.isIrregularMating = mate.isNatural() != this.isNatural;
|
||||
}
|
||||
|
||||
public Bee(World world, IBeeGenome genome) {
|
||||
this(world, genome, true, 0);
|
||||
}
|
||||
|
||||
public Bee(IBeeGenome genome) {
|
||||
this(genome, true, 0);
|
||||
}
|
||||
|
||||
public Bee(World world, IBeeGenome genome, boolean isNatural, int generation) {
|
||||
super(genome.getLifespan(), isNatural, generation);
|
||||
this.genome = genome;
|
||||
}
|
||||
|
||||
public Bee(IBeeGenome genome, boolean isNatural, int generation) {
|
||||
super(genome.getLifespan(), isNatural, generation);
|
||||
this.genome = genome;
|
||||
}
|
||||
|
||||
/* SAVING & LOADING */
|
||||
@Override
|
||||
public void readFromNBT(NBTTagCompound nbttagcompound) {
|
||||
|
||||
if (nbttagcompound == null) {
|
||||
this.genome = PluginApiculture.beeInterface.templateAsGenome(BeeTemplates.getForestTemplate());
|
||||
return;
|
||||
}
|
||||
|
||||
super.readFromNBT(nbttagcompound);
|
||||
|
||||
if (nbttagcompound.hasKey("Genome"))
|
||||
genome = new BeeGenome(nbttagcompound.getCompoundTag("Genome"));
|
||||
else
|
||||
genome = PluginApiculture.beeInterface.templateAsGenome(BeeTemplates.getForestTemplate());
|
||||
if (nbttagcompound.hasKey("Mate"))
|
||||
mate = new BeeGenome(nbttagcompound.getCompoundTag("Mate"));
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void mate(IIndividual individual) {
|
||||
if(!(individual instanceof IBee))
|
||||
return;
|
||||
|
||||
IBee drone = (IBee)individual;
|
||||
mate = drone.getGenome();
|
||||
this.isIrregularMating = drone.isNatural() != this.isNatural;
|
||||
}
|
||||
|
||||
/* EFFECTS */
|
||||
@Override
|
||||
public IEffectData[] doEffect(IEffectData[] storedData, IBeeHousing housing) {
|
||||
IAlleleBeeEffect effect = genome.getEffect();
|
||||
|
||||
if (effect == null)
|
||||
return null;
|
||||
|
||||
storedData[0] = doEffect(effect, storedData[0], housing);
|
||||
|
||||
// Return here if the primary can already not be combined
|
||||
if (!effect.isCombinable())
|
||||
return storedData;
|
||||
|
||||
IAlleleBeeEffect secondary = (IAlleleBeeEffect) genome.getInactiveAllele(EnumBeeChromosome.EFFECT.ordinal());
|
||||
if (!secondary.isCombinable())
|
||||
return storedData;
|
||||
|
||||
storedData[1] = doEffect(secondary, storedData[1], housing);
|
||||
|
||||
return storedData;
|
||||
}
|
||||
|
||||
private IEffectData doEffect(IAlleleBeeEffect effect, IEffectData storedData, IBeeHousing housing) {
|
||||
storedData = effect.validateStorage(storedData);
|
||||
return effect.doEffect(genome, storedData, housing);
|
||||
}
|
||||
|
||||
@Override
|
||||
public IEffectData[] doFX(IEffectData[] storedData, IBeeHousing housing) {
|
||||
IAlleleBeeEffect effect = genome.getEffect();
|
||||
|
||||
if (effect == null)
|
||||
return null;
|
||||
|
||||
storedData[0] = doFX(effect, storedData[0], housing);
|
||||
|
||||
// Return here if the primary can already not be combined
|
||||
if (!effect.isCombinable())
|
||||
return storedData;
|
||||
|
||||
IAlleleBeeEffect secondary = (IAlleleBeeEffect) genome.getInactiveAllele(EnumBeeChromosome.EFFECT.ordinal());
|
||||
if (!secondary.isCombinable())
|
||||
return storedData;
|
||||
|
||||
storedData[1] = doFX(secondary, storedData[1], housing);
|
||||
|
||||
return storedData;
|
||||
}
|
||||
|
||||
private IEffectData doFX(IAlleleBeeEffect effect, IEffectData storedData, IBeeHousing housing) {
|
||||
return effect.doFX(genome, storedData, housing);
|
||||
}
|
||||
|
||||
// / INFORMATION
|
||||
@Override
|
||||
public IBeeGenome getGenome() {
|
||||
return genome;
|
||||
}
|
||||
|
||||
@Override
|
||||
public IBeeGenome getMate() {
|
||||
return mate;
|
||||
}
|
||||
|
||||
@Override
|
||||
public IBee copy() {
|
||||
NBTTagCompound nbttagcompound = new NBTTagCompound();
|
||||
this.writeToNBT(nbttagcompound);
|
||||
return new Bee(nbttagcompound);
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canSpawn() {
|
||||
return mate != null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int isWorking(IBeeHousing housing) {
|
||||
|
||||
World world = housing.getWorld();
|
||||
// / Rain needs tolerant flyers
|
||||
if (world.isRaining() && !genome.getTolerantFlyer() && housing.getHumidity() != EnumHumidity.ARID && !housing.isSealed())
|
||||
return EnumErrorCode.ISRAINING.ordinal();
|
||||
|
||||
// / Night or darkness requires nocturnal species
|
||||
if(world.isDaytime()) {
|
||||
if(!canWorkDuringDay())
|
||||
return EnumErrorCode.NOTNIGHT.ordinal();
|
||||
} else if (!canWorkAtNight() && !housing.isSelfLighted())
|
||||
return EnumErrorCode.NOTDAY.ordinal();
|
||||
|
||||
if (world.getBlockLightValue(housing.getXCoord(), housing.getYCoord() + 2, housing.getZCoord()) > Defaults.APIARY_MIN_LEVEL_LIGHT) {
|
||||
if(!canWorkDuringDay())
|
||||
return EnumErrorCode.NOTGLOOMY.ordinal();
|
||||
} else if(!canWorkAtNight() && !housing.isSelfLighted())
|
||||
return EnumErrorCode.NOTLUCID.ordinal();
|
||||
|
||||
// / No sky, except if in hell
|
||||
BiomeGenBase biome = BiomeGenBase.getBiome(housing.getBiomeId());
|
||||
if(biome == null)
|
||||
return EnumErrorCode.NOSKY.ordinal();
|
||||
if (!BiomeDictionary.isBiomeOfType(biome, BiomeDictionary.Type.NETHER) && !world.canBlockSeeTheSky(housing.getXCoord(), housing.getYCoord() + 3, housing.getZCoord())
|
||||
&& !genome.getCaveDwelling() && !housing.isSunlightSimulated())
|
||||
return EnumErrorCode.NOSKY.ordinal();
|
||||
|
||||
// / And finally biome check
|
||||
if (!checkBiomeHazard(world, housing.getTemperature(), housing.getHumidity(), housing.getXCoord(), housing.getYCoord(), housing.getZCoord()))
|
||||
return EnumErrorCode.INVALIDBIOME.ordinal();
|
||||
|
||||
return EnumErrorCode.OK.ordinal();
|
||||
}
|
||||
|
||||
private boolean canWorkAtNight() {
|
||||
return genome.getPrimary().isNocturnal() || genome.getNocturnal();
|
||||
}
|
||||
|
||||
private boolean canWorkDuringDay() {
|
||||
return !genome.getPrimary().isNocturnal() || genome.getNocturnal();
|
||||
}
|
||||
|
||||
private boolean checkBiomeHazard(World world, EnumTemperature temperature, EnumHumidity humidity, int x, int y, int z) {
|
||||
|
||||
return ClimateHelper.isWithinLimits(temperature, humidity,
|
||||
genome.getPrimary().getTemperature(), genome.getToleranceTemp(),
|
||||
genome.getPrimary().getHumidity(), genome.getToleranceHumid());
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasFlower(IBeeHousing housing) {
|
||||
|
||||
IFlowerProvider provider = genome.getFlowerProvider();
|
||||
|
||||
Vect coords = new Vect(housing.getXCoord(), housing.getYCoord(), housing.getZCoord());
|
||||
Vect posCurrent = new Vect(0, 0, 0);
|
||||
int[] areaAr = genome.getTerritory();
|
||||
Vect area = new Vect(areaAr[0], areaAr[1], areaAr[2]).multiply(housing.getTerritoryModifier(genome, 1f));
|
||||
|
||||
if (area.x < 1)
|
||||
area.x = 1;
|
||||
if (area.y < 1)
|
||||
area.y = 1;
|
||||
if (area.z < 1)
|
||||
area.z = 1;
|
||||
|
||||
Vect offset = new Vect(-Math.round(area.x / 2), -Math.round(area.y / 2), -Math.round(area.z / 2));
|
||||
|
||||
boolean hasFlower = false;
|
||||
|
||||
while (advancePosition(posCurrent, area)) {
|
||||
|
||||
Vect posBlock = posCurrent.add(coords);
|
||||
posBlock = posBlock.add(offset);
|
||||
|
||||
if (provider.isAcceptedFlower(housing.getWorld(), this, posBlock.x, posBlock.y, posBlock.z)) {
|
||||
hasFlower = true;
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return hasFlower;
|
||||
}
|
||||
|
||||
private boolean advancePosition(Vect posCurrent, Vect area) {
|
||||
// Increment z first until end reached
|
||||
if (posCurrent.z < area.z - 1)
|
||||
posCurrent.z++;
|
||||
else {
|
||||
posCurrent.z = 0;
|
||||
|
||||
if (posCurrent.x < area.x - 1)
|
||||
posCurrent.x++;
|
||||
else {
|
||||
posCurrent.x = 0;
|
||||
|
||||
if (posCurrent.y < area.y - 1)
|
||||
posCurrent.y++;
|
||||
else
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ArrayList<Integer> getSuitableBiomeIds() {
|
||||
EnumTemperature temperature = genome.getPrimary().getTemperature();
|
||||
EnumTolerance temperatureTolerance = genome.getToleranceTemp();
|
||||
|
||||
ArrayList<EnumTemperature> toleratedTemperatures = ClimateHelper.getToleratedTemperature(temperature, temperatureTolerance);
|
||||
|
||||
EnumHumidity humidity = genome.getPrimary().getHumidity();
|
||||
EnumTolerance humidityTolerance = genome.getToleranceHumid();
|
||||
|
||||
ArrayList<EnumHumidity> toleratedHumidities = ClimateHelper.getToleratedHumidity(humidity, humidityTolerance);
|
||||
|
||||
ArrayList<Integer> biomeIdsTemp = new ArrayList<Integer>();
|
||||
for (EnumTemperature temp : toleratedTemperatures)
|
||||
biomeIdsTemp.addAll(EnumTemperature.getBiomeIds(temp));
|
||||
|
||||
ArrayList<Integer> biomeIdsHumid = new ArrayList<Integer>();
|
||||
for (EnumHumidity humid : toleratedHumidities)
|
||||
biomeIdsHumid.addAll(EnumHumidity.getBiomeIds(humid));
|
||||
|
||||
biomeIdsTemp.retainAll(biomeIdsHumid);
|
||||
|
||||
return biomeIdsTemp;
|
||||
}
|
||||
|
||||
@SuppressWarnings({ "rawtypes", "unchecked" })
|
||||
@Override
|
||||
public void addTooltip(List list) {
|
||||
|
||||
// No info 4 u!
|
||||
if (!isAnalyzed) {
|
||||
list.add("<" + StringUtil.localize("gui.unknown") + ">");
|
||||
return;
|
||||
}
|
||||
|
||||
// You analyzed it? Juicy tooltip coming up!
|
||||
IAlleleBeeSpecies primary = genome.getPrimary();
|
||||
IAlleleBeeSpecies secondary = genome.getSecondary();
|
||||
if (!isPureBred(EnumBeeChromosome.SPECIES.ordinal()))
|
||||
list.add("\u00A79" + primary.getName() + StringUtil.localize("bees.hyphen.adj.add") + "-" + secondary.getName()
|
||||
+ StringUtil.localize("bees.hybrid.adj.add") + " " + StringUtil.localize("gui.hybrid"));
|
||||
list.add(genome.getActiveAllele(EnumBeeChromosome.SPEED.ordinal()).getName() + " " + StringUtil.localize("gui.worker"));
|
||||
list.add(genome.getActiveAllele(EnumBeeChromosome.LIFESPAN.ordinal()).getName() + " " + StringUtil.localize("gui.life"));
|
||||
list.add("\u00A7aT: " + ClimateHelper.toDisplay(genome.getPrimary().getTemperature()) + " / "
|
||||
+ StringUtil.capitalize(genome.getToleranceTemp().name()));
|
||||
list.add("\u00A7aH: " + ClimateHelper.toDisplay(genome.getPrimary().getHumidity()) + " / "
|
||||
+ StringUtil.capitalize(genome.getToleranceHumid().name()));
|
||||
list.add(StringUtil.localize(genome.getFlowerProvider().getDescription()));
|
||||
if (genome.getNocturnal())
|
||||
list.add("\u00A7c" + GenericRatings.rateActivityTime(genome.getNocturnal(), false));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void age(World world, float housingLifespanModifier) {
|
||||
IBeekeepingMode mode = PluginApiculture.beeInterface.getBeekeepingMode(world);
|
||||
float finalModifier = housingLifespanModifier * mode.getLifespanModifier(genome, mate, housingLifespanModifier);
|
||||
|
||||
super.age(world, finalModifier);
|
||||
}
|
||||
|
||||
// / PRODUCTION
|
||||
@Override
|
||||
public ItemStack[] getProduceList() {
|
||||
ArrayList<ItemStack> products = new ArrayList<ItemStack>();
|
||||
|
||||
IAlleleBeeSpecies primary = genome.getPrimary();
|
||||
IAlleleBeeSpecies secondary = genome.getSecondary();
|
||||
|
||||
products.addAll(primary.getProducts().keySet());
|
||||
|
||||
Set<ItemStack> secondaryProducts = secondary.getProducts().keySet();
|
||||
// Remove duplicates
|
||||
for (ItemStack second : secondaryProducts) {
|
||||
boolean skip = false;
|
||||
|
||||
for (ItemStack compare : products)
|
||||
if (second.isItemEqual(compare)) {
|
||||
skip = true;
|
||||
break;
|
||||
}
|
||||
|
||||
if (!skip)
|
||||
products.add(second);
|
||||
|
||||
}
|
||||
|
||||
return products.toArray(new ItemStack[0]);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ItemStack[] getSpecialtyList() {
|
||||
return genome.getPrimary().getSpecialty().keySet().toArray(new ItemStack[0]);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ItemStack[] produceStacks(IBeeHousing housing) {
|
||||
if (!hasFlower(housing))
|
||||
return null;
|
||||
|
||||
if (housing == null) {
|
||||
Proxies.log.warning("Failed to produce in an apiary because the beehousing was null.");
|
||||
return null;
|
||||
}
|
||||
IBeekeepingMode mode = PluginApiculture.beeInterface.getBeekeepingMode(housing.getWorld());
|
||||
if (mode == null) {
|
||||
Proxies.log.warning("Failed to produce in an apiary because the beekeeping mode was null.");
|
||||
return null;
|
||||
}
|
||||
|
||||
ArrayList<ItemStack> products = new ArrayList<ItemStack>();
|
||||
|
||||
IAlleleBeeSpecies primary = genome.getPrimary();
|
||||
IAlleleBeeSpecies secondary = genome.getSecondary();
|
||||
|
||||
// All work and no play makes queen a dull girl.
|
||||
if(mode.isOverworked(this, housing))
|
||||
setIsNatural(false);
|
||||
|
||||
// Bee genetic speed * beehousing * beekeeping mode
|
||||
float speed = genome.getSpeed() * housing.getProductionModifier(genome, 1f) * mode.getProductionModifier(genome, 1f);
|
||||
|
||||
// / Primary Products
|
||||
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, Integer> entry : secondary.getProducts().entrySet())
|
||||
if (housing.getWorld().rand.nextInt(100) < Math.round(entry.getValue() / 2) * speed)
|
||||
products.add(entry.getKey().copy());
|
||||
|
||||
// We are done if the we are not jubilant.
|
||||
if (!primary.isJubilant(genome, housing) || !secondary.isJubilant(genome, housing))
|
||||
return products.toArray(StackUtils.EMPTY_STACK_ARRAY);
|
||||
|
||||
// / Specialty products
|
||||
for (Map.Entry<ItemStack, Integer> entry : primary.getSpecialty().entrySet())
|
||||
if (housing.getWorld().rand.nextInt(100) < entry.getValue() * speed)
|
||||
products.add(entry.getKey().copy());
|
||||
|
||||
return genome.getFlowerProvider().affectProducts(housing.getWorld(), this, housing.getXCoord(), housing.getYCoord(), housing.getZCoord(),
|
||||
products.toArray(StackUtils.EMPTY_STACK_ARRAY));
|
||||
}
|
||||
|
||||
/* REPRODUCTION */
|
||||
@Override
|
||||
public IBee spawnPrincess(IBeeHousing housing) {
|
||||
|
||||
// We need a mated queen to produce offspring.
|
||||
if (mate == null)
|
||||
return null;
|
||||
|
||||
// Fatigued queens do not produce princesses.
|
||||
if (PluginApiculture.beeInterface.getBeekeepingMode(housing.getWorld()).isFatigued(this, housing))
|
||||
return null;
|
||||
|
||||
return createOffspring(housing, getGeneration() + 1);
|
||||
}
|
||||
|
||||
@Override
|
||||
public IBee[] spawnDrones(IBeeHousing housing) {
|
||||
|
||||
World world = housing.getWorld();
|
||||
|
||||
// We need a mated queen to produce offspring.
|
||||
if (mate == null)
|
||||
return null;
|
||||
|
||||
ArrayList<IBee> bees = new ArrayList<IBee>();
|
||||
|
||||
int toCreate = PluginApiculture.beeInterface.getBeekeepingMode(world).getFinalFertility(this, world, housing.getXCoord(), housing.getYCoord(),
|
||||
housing.getZCoord());
|
||||
|
||||
if (toCreate <= 0)
|
||||
toCreate = 1;
|
||||
|
||||
for (int i = 0; i < toCreate; i++) {
|
||||
IBee offspring = createOffspring(housing, -1);
|
||||
if (offspring != null) {
|
||||
offspring.setIsNatural(true);
|
||||
bees.add(offspring);
|
||||
}
|
||||
}
|
||||
|
||||
if (bees.size() > 0)
|
||||
return bees.toArray(new IBee[0]);
|
||||
else
|
||||
return null;
|
||||
}
|
||||
|
||||
private IBee createOffspring(IBeeHousing housing, int generation) {
|
||||
|
||||
World world = housing.getWorld();
|
||||
|
||||
IChromosome[] chromosomes = new IChromosome[genome.getChromosomes().length];
|
||||
IChromosome[] parent1 = genome.getChromosomes();
|
||||
IChromosome[] parent2 = mate.getChromosomes();
|
||||
|
||||
// Check for mutation. Replace one of the parents with the mutation
|
||||
// template if mutation occured.
|
||||
IChromosome[] mutated1 = mutateSpecies(housing, genome, mate);
|
||||
if (mutated1 != null)
|
||||
parent1 = mutated1;
|
||||
IChromosome[] mutated2 = mutateSpecies(housing, mate, genome);
|
||||
if (mutated2 != null)
|
||||
parent2 = mutated2;
|
||||
|
||||
for (int i = 0; i < parent1.length; i++)
|
||||
if (parent1[i] != null && parent2[i] != null)
|
||||
chromosomes[i] = Chromosome.inheritChromosome(world.rand, parent1[i], parent2[i]);
|
||||
|
||||
IBeekeepingMode mode = PluginApiculture.beeInterface.getBeekeepingMode(world);
|
||||
IBee offspring = new Bee(world, new BeeGenome(chromosomes), mode.isNaturalOffspring(this), generation);
|
||||
|
||||
/* Disabling the mutation rate nerf
|
||||
// All mutation and no play makes queen a dull girl.
|
||||
if(mode.isDegenerating(this, offspring, housing))
|
||||
offspring.setIsNatural(false);*/
|
||||
|
||||
return offspring;
|
||||
}
|
||||
|
||||
private IChromosome[] mutateSpecies(IBeeHousing housing, IGenome genomeOne, IGenome genomeTwo) {
|
||||
|
||||
World world = housing.getWorld();
|
||||
|
||||
IChromosome[] parent1 = genomeOne.getChromosomes();
|
||||
IChromosome[] parent2 = genomeTwo.getChromosomes();
|
||||
|
||||
IGenome genome0;
|
||||
IGenome genome1;
|
||||
IAllele allele0;
|
||||
IAllele allele1;
|
||||
|
||||
if (world.rand.nextBoolean()) {
|
||||
allele0 = parent1[EnumBeeChromosome.SPECIES.ordinal()].getPrimaryAllele();
|
||||
allele1 = parent2[EnumBeeChromosome.SPECIES.ordinal()].getSecondaryAllele();
|
||||
|
||||
genome0 = genomeOne;
|
||||
genome1 = genomeTwo;
|
||||
} else {
|
||||
allele0 = parent2[EnumBeeChromosome.SPECIES.ordinal()].getPrimaryAllele();
|
||||
allele1 = parent1[EnumBeeChromosome.SPECIES.ordinal()].getSecondaryAllele();
|
||||
|
||||
genome0 = genomeTwo;
|
||||
genome1 = genomeOne;
|
||||
}
|
||||
|
||||
for (IBeeMutation mutation : PluginApiculture.beeInterface.getMutations(true)) {
|
||||
float chance = 0;
|
||||
|
||||
if ((chance = mutation.getChance(housing, allele0, allele1, genome0, genome1)) > 0)
|
||||
if (world.rand.nextFloat()*100 < chance) {
|
||||
IApiaristTracker breedingTracker = PluginApiculture.beeInterface.getBreedingTracker(world, housing.getOwnerName());
|
||||
breedingTracker.registerMutation(mutation);
|
||||
return PluginApiculture.beeInterface.templateAsChromosomes(mutation.getTemplate());
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/* FLOWERS */
|
||||
@Override
|
||||
public IIndividual retrievePollen(IBeeHousing housing) {
|
||||
|
||||
int chance = (int) (genome.getFlowering() * housing.getFloweringModifier(getGenome(), 1f));
|
||||
|
||||
// Correct speed
|
||||
if (housing.getWorld().rand.nextInt(100) >= chance)
|
||||
return null;
|
||||
|
||||
int[] areaAr = genome.getTerritory();
|
||||
Vect area = new Vect(areaAr[0], areaAr[1], areaAr[2]).multiply(housing.getTerritoryModifier(genome, 1f)).multiply(3.0f);
|
||||
Vect offset = new Vect(-Math.round(area.x / 2), -Math.round(area.y / 2), -Math.round(area.z / 2));
|
||||
|
||||
if (area.x < 1)
|
||||
area.x = 1;
|
||||
if (area.y < 1)
|
||||
area.y = 1;
|
||||
if (area.z < 1)
|
||||
area.z = 1;
|
||||
|
||||
// We have up to ten attempts
|
||||
for (int i = 0; i < 20; i++) {
|
||||
|
||||
Vect randomPos = new Vect(housing.getWorld().rand.nextInt(area.x), housing.getWorld().rand.nextInt(area.y), housing.getWorld().rand.nextInt(area.z));
|
||||
|
||||
Vect posBlock = randomPos.add(new Vect(housing.getXCoord(), housing.getYCoord(), housing.getZCoord()));
|
||||
posBlock = posBlock.add(offset);
|
||||
|
||||
TileEntity tile = housing.getWorld().getTileEntity(posBlock.x, posBlock.y, posBlock.z);
|
||||
if (!(tile instanceof IPollinatable)) {
|
||||
if (housing.getWorld().isAirBlock(posBlock.x, posBlock.y, posBlock.z))
|
||||
continue;
|
||||
|
||||
// Test for ersatz genomes
|
||||
for (Map.Entry<ItemStack, IIndividual> entry : AlleleManager.ersatzSpecimen.entrySet()) {
|
||||
if (!StackUtils.equals(housing.getWorld().getBlock(posBlock.x, posBlock.y, posBlock.z), entry.getKey()))
|
||||
continue;
|
||||
if (entry.getKey().getItemDamage() != housing.getWorld().getBlockMetadata(posBlock.x, posBlock.y, posBlock.z))
|
||||
continue;
|
||||
|
||||
// We matched, return ersatz genome
|
||||
return entry.getValue().copy();
|
||||
}
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
IPollinatable pitcher = (IPollinatable) tile;
|
||||
if (!genome.getFlowerProvider().isAcceptedPollinatable(housing.getWorld(), pitcher))
|
||||
continue;
|
||||
|
||||
IIndividual pollen = pitcher.getPollen();
|
||||
|
||||
if (pollen != null)
|
||||
return pollen;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean pollinateRandom(IBeeHousing housing, IIndividual pollen) {
|
||||
|
||||
int chance = (int) (genome.getFlowering() * housing.getFloweringModifier(getGenome(), 1f));
|
||||
|
||||
// Correct speed
|
||||
if (housing.getWorld().rand.nextInt(100) >= chance)
|
||||
return false;
|
||||
|
||||
int[] areaAr = genome.getTerritory();
|
||||
Vect area = new Vect(areaAr[0], areaAr[1], areaAr[2]).multiply(housing.getTerritoryModifier(genome, 1f)).multiply(3.0f);
|
||||
Vect offset = new Vect(-Math.round(area.x / 2), -Math.round(area.y / 4), -Math.round(area.z / 2));
|
||||
|
||||
if (area.x < 1)
|
||||
area.x = 1;
|
||||
if (area.y < 1)
|
||||
area.y = 1;
|
||||
if (area.z < 1)
|
||||
area.z = 1;
|
||||
|
||||
// We have up to ten attempts
|
||||
for (int i = 0; i < 30; i++) {
|
||||
|
||||
Vect randomPos = new Vect(housing.getWorld().rand.nextInt(area.x), housing.getWorld().rand.nextInt(area.y), housing.getWorld().rand.nextInt(area.z));
|
||||
|
||||
Vect posBlock = randomPos.add(new Vect(housing.getXCoord(), housing.getYCoord(), housing.getZCoord()));
|
||||
posBlock = posBlock.add(offset);
|
||||
|
||||
IPollinatable receiver = Utils.getOrCreatePollinatable(housing.getOwnerName(), housing.getWorld(), posBlock.x, posBlock.y, posBlock.z);
|
||||
if(receiver == null)
|
||||
continue;
|
||||
|
||||
if (!genome.getFlowerProvider().isAcceptedPollinatable(housing.getWorld(), receiver))
|
||||
continue;
|
||||
if (!receiver.canMateWith(pollen))
|
||||
continue;
|
||||
|
||||
receiver.mateWith(pollen);
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void plantFlowerRandom(IBeeHousing housing) {
|
||||
|
||||
int chance = (int) (genome.getFlowering() * housing.getFloweringModifier(getGenome(), 1f));
|
||||
|
||||
// Correct speed
|
||||
if (housing.getWorld().rand.nextInt(100) >= chance)
|
||||
return;
|
||||
|
||||
// Gather required info
|
||||
IFlowerProvider provider = genome.getFlowerProvider();
|
||||
int[] areaAr = genome.getTerritory();
|
||||
Vect area = new Vect(areaAr[0], areaAr[1], areaAr[2]).multiply(housing.getTerritoryModifier(genome, 1f)).multiply(3.0f);
|
||||
Vect offset = new Vect(-Math.round(area.x / 2), -Math.round(area.y / 4), -Math.round(area.z / 2));
|
||||
|
||||
if (area.x < 1)
|
||||
area.x = 1;
|
||||
if (area.y < 1)
|
||||
area.y = 1;
|
||||
if (area.z < 1)
|
||||
area.z = 1;
|
||||
|
||||
// We have up to ten attempts
|
||||
for (int i = 0; i < 10; i++) {
|
||||
|
||||
Vect randomPos = new Vect(housing.getWorld().rand.nextInt(area.x), housing.getWorld().rand.nextInt(area.y), housing.getWorld().rand.nextInt(area.z));
|
||||
|
||||
Vect posBlock = randomPos.add(new Vect(housing.getXCoord(), housing.getYCoord(), housing.getZCoord()));
|
||||
posBlock = posBlock.add(offset);
|
||||
|
||||
if (provider.growFlower(housing.getWorld(), this, posBlock.x, posBlock.y, posBlock.z))
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,145 @@
|
||||
/*******************************************************************************
|
||||
* Copyright 2011-2014 by SirSengir
|
||||
*
|
||||
* This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.
|
||||
*
|
||||
* To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/3.0/.
|
||||
******************************************************************************/
|
||||
package forestry.apiculture.genetics;
|
||||
|
||||
import net.minecraft.nbt.NBTTagCompound;
|
||||
|
||||
import forestry.api.apiculture.EnumBeeChromosome;
|
||||
import forestry.api.apiculture.IAlleleBeeEffect;
|
||||
import forestry.api.apiculture.IAlleleBeeSpecies;
|
||||
import forestry.api.apiculture.IBeeGenome;
|
||||
import forestry.api.genetics.EnumTolerance;
|
||||
import forestry.api.genetics.IAlleleFloat;
|
||||
import forestry.api.genetics.IAlleleFlowers;
|
||||
import forestry.api.genetics.IAlleleInteger;
|
||||
import forestry.api.genetics.IChromosome;
|
||||
import forestry.api.genetics.IFlowerProvider;
|
||||
import forestry.api.genetics.ISpeciesRoot;
|
||||
import forestry.core.genetics.AlleleArea;
|
||||
import forestry.core.genetics.AlleleBoolean;
|
||||
import forestry.core.genetics.AlleleTolerance;
|
||||
import forestry.core.genetics.Genome;
|
||||
import forestry.core.utils.Vect;
|
||||
import forestry.plugins.PluginApiculture;
|
||||
|
||||
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
|
||||
*/
|
||||
/* CONSTRUCTOR */
|
||||
public BeeGenome(NBTTagCompound nbttagcompound) {
|
||||
super(nbttagcompound);
|
||||
}
|
||||
|
||||
public BeeGenome(IChromosome[] chromosomes) {
|
||||
super(chromosomes);
|
||||
}
|
||||
|
||||
// / INFORMATION RETRIEVAL
|
||||
@Override
|
||||
public IAlleleBeeSpecies getPrimary() {
|
||||
return (IAlleleBeeSpecies) getActiveAllele(EnumBeeChromosome.SPECIES.ordinal());
|
||||
}
|
||||
|
||||
@Override
|
||||
public IAlleleBeeSpecies getSecondary() {
|
||||
return (IAlleleBeeSpecies) getInactiveAllele(EnumBeeChromosome.SPECIES.ordinal());
|
||||
}
|
||||
|
||||
@Override
|
||||
public float getSpeed() {
|
||||
return ((IAlleleFloat) getActiveAllele(EnumBeeChromosome.SPEED.ordinal())).getValue();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getLifespan() {
|
||||
return ((IAlleleInteger) getActiveAllele(EnumBeeChromosome.LIFESPAN.ordinal())).getValue();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getFertility() {
|
||||
return ((IAlleleInteger) getActiveAllele(EnumBeeChromosome.FERTILITY.ordinal())).getValue();
|
||||
}
|
||||
|
||||
@Override
|
||||
public EnumTolerance getToleranceTemp() {
|
||||
return ((AlleleTolerance) getActiveAllele(EnumBeeChromosome.TEMPERATURE_TOLERANCE.ordinal())).getValue();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean getNocturnal() {
|
||||
return ((AlleleBoolean) getActiveAllele(EnumBeeChromosome.NOCTURNAL.ordinal())).getValue();
|
||||
}
|
||||
|
||||
@Override
|
||||
public EnumTolerance getToleranceHumid() {
|
||||
return ((AlleleTolerance) getActiveAllele(EnumBeeChromosome.HUMIDITY_TOLERANCE.ordinal())).getValue();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean getTolerantFlyer() {
|
||||
return ((AlleleBoolean) getActiveAllele(EnumBeeChromosome.TOLERANT_FLYER.ordinal())).getValue();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean getCaveDwelling() {
|
||||
return ((AlleleBoolean) getActiveAllele(EnumBeeChromosome.CAVE_DWELLING.ordinal())).getValue();
|
||||
}
|
||||
|
||||
@Override
|
||||
public IFlowerProvider getFlowerProvider() {
|
||||
return ((IAlleleFlowers) getActiveAllele(EnumBeeChromosome.FLOWER_PROVIDER.ordinal())).getProvider();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getFlowering() {
|
||||
return ((IAlleleInteger) getActiveAllele(EnumBeeChromosome.FLOWERING.ordinal())).getValue();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int[] getTerritory() {
|
||||
Vect area = ((AlleleArea) getActiveAllele(EnumBeeChromosome.TERRITORY.ordinal())).getArea();
|
||||
return new int[] { area.x, area.y, area.z };
|
||||
}
|
||||
|
||||
@Override
|
||||
public IAlleleBeeEffect getEffect() {
|
||||
return (IAlleleBeeEffect) getActiveAllele(EnumBeeChromosome.EFFECT.ordinal());
|
||||
}
|
||||
|
||||
@Override
|
||||
public ISpeciesRoot getSpeciesRoot() {
|
||||
return PluginApiculture.beeInterface;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,331 @@
|
||||
/*******************************************************************************
|
||||
* Copyright 2011-2014 by SirSengir
|
||||
*
|
||||
* This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.
|
||||
*
|
||||
* To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/3.0/.
|
||||
******************************************************************************/
|
||||
package forestry.apiculture.genetics;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.Iterator;
|
||||
import java.util.Locale;
|
||||
import java.util.Map.Entry;
|
||||
|
||||
import net.minecraft.item.Item;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.nbt.NBTTagCompound;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
import cpw.mods.fml.common.FMLCommonHandler;
|
||||
|
||||
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.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.IChromosomeType;
|
||||
import forestry.api.genetics.IIndividual;
|
||||
import forestry.api.genetics.IMutation;
|
||||
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 {
|
||||
|
||||
public static int beeSpeciesCount = -1;
|
||||
public static final String UID = "rootBees";
|
||||
|
||||
@Override
|
||||
public String getUID() {
|
||||
return UID;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Class<? extends IIndividual> getMemberClass() {
|
||||
return IBee.class;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getSpeciesCount() {
|
||||
if (beeSpeciesCount < 0) {
|
||||
beeSpeciesCount = 0;
|
||||
Iterator<Entry<String, IAllele> > it = AlleleManager.alleleRegistry.getRegisteredAlleles().entrySet().iterator();
|
||||
while (it.hasNext()) {
|
||||
Entry<String, IAllele> entry = it.next();
|
||||
if (entry.getValue() instanceof IAlleleBeeSpecies)
|
||||
if (((IAlleleBeeSpecies) entry.getValue()).isCounted())
|
||||
beeSpeciesCount++;
|
||||
}
|
||||
}
|
||||
|
||||
return beeSpeciesCount;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isMember(ItemStack stack) {
|
||||
return getType(stack) != EnumBeeType.NONE;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isMember(ItemStack stack, int type) {
|
||||
return getType(stack).ordinal() == type;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isMember(IIndividual individual) {
|
||||
return individual instanceof IBee;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ItemStack getMemberStack(IIndividual bee, int type) {
|
||||
if (!isMember(bee))
|
||||
return null;
|
||||
|
||||
Item beeItem = null;
|
||||
switch (EnumBeeType.VALUES[type]) {
|
||||
case QUEEN:
|
||||
beeItem = ForestryItem.beeQueenGE.item();
|
||||
break;
|
||||
case PRINCESS:
|
||||
beeItem = ForestryItem.beePrincessGE.item();
|
||||
break;
|
||||
case DRONE:
|
||||
beeItem = ForestryItem.beeDroneGE.item();
|
||||
break;
|
||||
case LARVAE:
|
||||
beeItem = ForestryItem.beeLarvaeGE.item();
|
||||
break;
|
||||
default:
|
||||
throw new RuntimeException("Cannot instantiate a bee of type " + type);
|
||||
|
||||
}
|
||||
|
||||
NBTTagCompound nbttagcompound = new NBTTagCompound();
|
||||
bee.writeToNBT(nbttagcompound);
|
||||
ItemStack beeStack = new ItemStack(beeItem);
|
||||
beeStack.setTagCompound(nbttagcompound);
|
||||
return beeStack;
|
||||
}
|
||||
|
||||
@Override
|
||||
public EnumBeeType getType(ItemStack stack) {
|
||||
if (stack == null)
|
||||
return EnumBeeType.NONE;
|
||||
|
||||
if (ForestryItem.beeDroneGE.isItemEqual(stack))
|
||||
return EnumBeeType.DRONE;
|
||||
else if (ForestryItem.beePrincessGE.isItemEqual(stack))
|
||||
return EnumBeeType.PRINCESS;
|
||||
else if (ForestryItem.beeQueenGE.isItemEqual(stack))
|
||||
return EnumBeeType.QUEEN;
|
||||
else if (ForestryItem.beeLarvaeGE.isItemEqual(stack))
|
||||
return EnumBeeType.LARVAE;
|
||||
|
||||
return EnumBeeType.NONE;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isDrone(ItemStack stack) {
|
||||
return getType(stack) == EnumBeeType.DRONE;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isMated(ItemStack stack) {
|
||||
if (getType(stack) != EnumBeeType.QUEEN)
|
||||
return false;
|
||||
|
||||
IBee bee = getMember(stack);
|
||||
return bee.getMate() != null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public IBee getMember(ItemStack stack) {
|
||||
if (!ForestryItem.beeQueenGE.isItemEqual(stack) && !ForestryItem.beePrincessGE.isItemEqual(stack)
|
||||
&& !ForestryItem.beeDroneGE.isItemEqual(stack) && !ForestryItem.beeLarvaeGE.isItemEqual(stack))
|
||||
return null;
|
||||
|
||||
return new Bee(stack.getTagCompound());
|
||||
}
|
||||
|
||||
@Override
|
||||
public IBee getMember(NBTTagCompound compound) {
|
||||
return new Bee(compound);
|
||||
}
|
||||
|
||||
@Override
|
||||
public IBee getBee(World world, IBeeGenome genome) {
|
||||
return new Bee(world, genome);
|
||||
}
|
||||
|
||||
@Override
|
||||
public IBee getBee(World world, IBeeGenome genome, IBee mate) {
|
||||
return new Bee(world, genome, mate);
|
||||
}
|
||||
|
||||
/* GENOME CONVERSIONS */
|
||||
@Override
|
||||
public IBeeGenome templateAsGenome(IAllele[] template) {
|
||||
return new BeeGenome(templateAsChromosomes(template));
|
||||
}
|
||||
|
||||
@Override
|
||||
public IBeeGenome templateAsGenome(IAllele[] templateActive, IAllele[] templateInactive) {
|
||||
return new BeeGenome(templateAsChromosomes(templateActive, templateInactive));
|
||||
}
|
||||
|
||||
@Override
|
||||
public IBee templateAsIndividual(IAllele[] template) {
|
||||
return new Bee(templateAsGenome(template));
|
||||
}
|
||||
|
||||
@Override
|
||||
public IBee templateAsIndividual(IAllele[] templateActive, IAllele[] templateInactive) {
|
||||
return new Bee(templateAsGenome(templateActive, templateInactive));
|
||||
}
|
||||
|
||||
/* TEMPLATES */
|
||||
public static ArrayList<IBee> beeTemplates = new ArrayList<IBee>();
|
||||
|
||||
@Override
|
||||
public ArrayList<IBee> getIndividualTemplates() {
|
||||
return beeTemplates;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void registerTemplate(String identifier, IAllele[] template) {
|
||||
beeTemplates.add(new Bee(PluginApiculture.beeInterface.templateAsGenome(template)));
|
||||
speciesTemplates.put(identifier, template);
|
||||
}
|
||||
|
||||
@Override
|
||||
public IAllele[] getDefaultTemplate() {
|
||||
return BeeTemplates.getDefaultTemplate();
|
||||
}
|
||||
|
||||
/* MUTATIONS */
|
||||
/**
|
||||
* List of possible mutations on species alleles.
|
||||
*/
|
||||
private static ArrayList<IBeeMutation> beeMutations = new ArrayList<IBeeMutation>();
|
||||
|
||||
@Override
|
||||
public Collection<IBeeMutation> getMutations(boolean shuffle) {
|
||||
if (shuffle)
|
||||
Collections.shuffle(beeMutations);
|
||||
return beeMutations;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void registerMutation(IMutation mutation) {
|
||||
if (AlleleManager.alleleRegistry.isBlacklisted(mutation.getTemplate()[0].getUID()))
|
||||
return;
|
||||
if (AlleleManager.alleleRegistry.isBlacklisted(mutation.getAllele0().getUID()))
|
||||
return;
|
||||
if (AlleleManager.alleleRegistry.isBlacklisted(mutation.getAllele1().getUID()))
|
||||
return;
|
||||
|
||||
beeMutations.add((IBeeMutation) mutation);
|
||||
}
|
||||
|
||||
/* BREEDING MODES */
|
||||
ArrayList<IBeekeepingMode> beekeepingModes = new ArrayList<IBeekeepingMode>();
|
||||
public static IBeekeepingMode activeBeekeepingMode;
|
||||
|
||||
@Override
|
||||
public void resetBeekeepingMode() {
|
||||
activeBeekeepingMode = null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ArrayList<IBeekeepingMode> getBeekeepingModes() {
|
||||
return this.beekeepingModes;
|
||||
}
|
||||
|
||||
@Override
|
||||
public IBeekeepingMode getBeekeepingMode(World world) {
|
||||
if (activeBeekeepingMode != null)
|
||||
return activeBeekeepingMode;
|
||||
|
||||
// No beekeeping mode yet, get it.
|
||||
IApiaristTracker tracker = getBreedingTracker(world, "__COMMON_");
|
||||
String mode = tracker.getModeName();
|
||||
if (mode == null || mode.isEmpty())
|
||||
mode = PluginApiculture.beekeepingMode;
|
||||
|
||||
setBeekeepingMode(world, mode);
|
||||
FMLCommonHandler.instance().getFMLLogger().debug("Set beekeeping mode for a world to " + mode);
|
||||
|
||||
return activeBeekeepingMode;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void registerBeekeepingMode(IBeekeepingMode mode) {
|
||||
beekeepingModes.add(mode);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setBeekeepingMode(World world, String name) {
|
||||
activeBeekeepingMode = getBeekeepingMode(name);
|
||||
getBreedingTracker(world, "__COMMON_").setModeName(name);
|
||||
}
|
||||
|
||||
@Override
|
||||
public IBeekeepingMode getBeekeepingMode(String name) {
|
||||
for (IBeekeepingMode mode : beekeepingModes) {
|
||||
if (mode.getName().equals(name) || mode.getName().equals(name.toLowerCase(Locale.ENGLISH)))
|
||||
return mode;
|
||||
}
|
||||
|
||||
FMLCommonHandler.instance().getFMLLogger().debug("Failed to find a beekeeping mode called '%s', reverting to fallback.");
|
||||
return beekeepingModes.get(0);
|
||||
}
|
||||
|
||||
@Override
|
||||
public IApiaristTracker getBreedingTracker(World world, String player) {
|
||||
String filename = "ApiaristTracker." + player;
|
||||
ApiaristTracker tracker = (ApiaristTracker) world.loadItemData(ApiaristTracker.class, filename);
|
||||
|
||||
// Create a tracker if there is none yet.
|
||||
if (tracker == null) {
|
||||
tracker = new ApiaristTracker(filename, player);
|
||||
world.setItemData(filename, tracker);
|
||||
}
|
||||
|
||||
return tracker;
|
||||
}
|
||||
|
||||
@Override
|
||||
public IBeekeepingLogic createBeekeepingLogic(IBeeHousing housing) {
|
||||
return new BeekeepingLogic(housing);
|
||||
}
|
||||
|
||||
@Override
|
||||
public IStructureLogic createAlvearyStructureLogic(IAlvearyComponent structure) {
|
||||
return new StructureLogicAlveary(structure);
|
||||
}
|
||||
|
||||
@Override
|
||||
public IChromosomeType[] getKaryotype() {
|
||||
return EnumBeeChromosome.values();
|
||||
}
|
||||
|
||||
@Override
|
||||
public IChromosomeType getKaryotypeKey() {
|
||||
return EnumBeeChromosome.SPECIES;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,126 @@
|
||||
/*******************************************************************************
|
||||
* Copyright 2011-2014 by SirSengir
|
||||
*
|
||||
* This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.
|
||||
*
|
||||
* To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/3.0/.
|
||||
******************************************************************************/
|
||||
package forestry.apiculture.genetics;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraft.world.biome.BiomeGenBase;
|
||||
|
||||
import net.minecraftforge.common.BiomeDictionary;
|
||||
|
||||
import forestry.api.apiculture.IBeeGenome;
|
||||
import forestry.api.apiculture.IBeeHousing;
|
||||
import forestry.api.apiculture.IBeeMutation;
|
||||
import forestry.api.apiculture.IBeeRoot;
|
||||
import forestry.api.genetics.AlleleManager;
|
||||
import forestry.api.genetics.IAllele;
|
||||
import forestry.api.genetics.IGenome;
|
||||
import forestry.core.genetics.Mutation;
|
||||
import forestry.plugins.PluginApiculture;
|
||||
|
||||
public class BeeMutation extends Mutation implements IBeeMutation {
|
||||
|
||||
private final IBeeRoot root;
|
||||
|
||||
boolean requiresDay = false;
|
||||
boolean requiresNight = false;
|
||||
|
||||
private final ArrayList<BiomeDictionary.Type> restrictBiomeTypes = new ArrayList<BiomeDictionary.Type>();
|
||||
private boolean strictBiomeCheck = false;
|
||||
|
||||
public BeeMutation(IAllele allele0, IAllele allele1, IAllele[] template, int chance) {
|
||||
super(allele0, allele1, template, chance);
|
||||
|
||||
root = (IBeeRoot)AlleleManager.alleleRegistry.getSpeciesRoot("rootBees");
|
||||
PluginApiculture.beeInterface.registerMutation(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public IBeeRoot getRoot() {
|
||||
return root;
|
||||
}
|
||||
|
||||
public BeeMutation enableStrictBiomeCheck() {
|
||||
strictBiomeCheck = true;
|
||||
return this;
|
||||
}
|
||||
|
||||
public BeeMutation restrictBiomeType(BiomeDictionary.Type type) {
|
||||
restrictBiomeTypes.add(type);
|
||||
specialConditions.add(String.format("Is restricted to %s-like environments.", type.toString()));
|
||||
return this;
|
||||
}
|
||||
|
||||
public BeeMutation requireDay() {
|
||||
requiresDay = true;
|
||||
requiresNight = false;
|
||||
specialConditions.add("Can only occur during the day.");
|
||||
return this;
|
||||
}
|
||||
|
||||
public BeeMutation requireNight() {
|
||||
requiresDay = false;
|
||||
requiresNight = true;
|
||||
specialConditions.add("Can only occur during the night.");
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public float getChance(IBeeHousing housing, IAllele allele0, IAllele allele1, IGenome genome0, IGenome genome1) {
|
||||
|
||||
World world = housing.getWorld();
|
||||
if (requiresDay && !world.isDaytime())
|
||||
return 0;
|
||||
|
||||
if (requiresNight && world.isDaytime())
|
||||
return 0;
|
||||
|
||||
// Skip if we are restricted by biomes and this one does not match.
|
||||
if (restrictBiomeTypes.size() > 0) {
|
||||
boolean noneMatched = true;
|
||||
|
||||
BiomeGenBase biome = BiomeGenBase.getBiome(housing.getBiomeId());
|
||||
if(strictBiomeCheck) {
|
||||
BiomeDictionary.Type[] types = BiomeDictionary.getTypesForBiome(biome);
|
||||
if(types.length == 1 && restrictBiomeTypes.contains(types[0]))
|
||||
noneMatched = false;
|
||||
} else {
|
||||
for(BiomeDictionary.Type type : restrictBiomeTypes) {
|
||||
if(BiomeDictionary.isBiomeOfType(biome, type)) {
|
||||
noneMatched = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (noneMatched)
|
||||
return 0;
|
||||
}
|
||||
|
||||
BiomeGenBase biome = world.getWorldChunkManager().getBiomeGenAt(housing.getXCoord(), housing.getZCoord());
|
||||
if (biome.temperature < minTemperature || biome.temperature > maxTemperature)
|
||||
return 0;
|
||||
if (biome.rainfall < minRainfall || biome.rainfall > maxRainfall)
|
||||
return 0;
|
||||
|
||||
float processedChance = chance * housing.getMutationModifier((IBeeGenome) genome0, (IBeeGenome) genome1, 1f)
|
||||
* PluginApiculture.beeInterface.getBeekeepingMode(world).getMutationModifier((IBeeGenome) genome0, (IBeeGenome) genome1, 1f);
|
||||
if(processedChance <= 0)
|
||||
return 0;
|
||||
|
||||
if (this.allele0.getUID().equals(allele0.getUID()) && this.allele1.getUID().equals(allele1.getUID()))
|
||||
return processedChance;
|
||||
if (this.allele1.getUID().equals(allele0.getUID()) && this.allele0.getUID().equals(allele1.getUID()))
|
||||
return processedChance;
|
||||
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,595 @@
|
||||
/*******************************************************************************
|
||||
* Copyright 2011-2014 by SirSengir
|
||||
*
|
||||
* This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.
|
||||
*
|
||||
* To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/3.0/.
|
||||
******************************************************************************/
|
||||
package forestry.apiculture.genetics;
|
||||
|
||||
import forestry.api.apiculture.EnumBeeChromosome;
|
||||
import forestry.api.genetics.IAllele;
|
||||
import forestry.api.genetics.IMutation;
|
||||
import forestry.core.genetics.Allele;
|
||||
|
||||
public class BeeTemplates {
|
||||
|
||||
// / MUTATIONS
|
||||
public static IMutation commonA;
|
||||
|
||||
public static IMutation commonB;
|
||||
public static IMutation commonC;
|
||||
|
||||
public static IMutation commonD;
|
||||
public static IMutation commonE;
|
||||
public static IMutation commonF;
|
||||
|
||||
public static IMutation commonG;
|
||||
public static IMutation commonH;
|
||||
public static IMutation commonI;
|
||||
public static IMutation commonJ;
|
||||
|
||||
public static IMutation commonK;
|
||||
public static IMutation commonL;
|
||||
public static IMutation commonM;
|
||||
public static IMutation commonN;
|
||||
public static IMutation commonO;
|
||||
|
||||
public static IMutation cultivatedA;
|
||||
public static IMutation cultivatedB;
|
||||
public static IMutation cultivatedC;
|
||||
public static IMutation cultivatedD;
|
||||
public static IMutation cultivatedE;
|
||||
public static IMutation cultivatedF;
|
||||
|
||||
public static IMutation nobleA;
|
||||
public static IMutation majesticA;
|
||||
public static IMutation imperialA;
|
||||
|
||||
public static IMutation diligentA;
|
||||
public static IMutation unwearyA;
|
||||
public static IMutation industriousA;
|
||||
|
||||
public static IMutation heroicA;
|
||||
|
||||
public static IMutation sinisterA;
|
||||
public static IMutation sinisterB;
|
||||
public static IMutation fiendishA;
|
||||
public static IMutation fiendishB;
|
||||
public static IMutation fiendishC;
|
||||
public static IMutation demonicA;
|
||||
|
||||
// Austere branch
|
||||
public static IMutation frugalA;
|
||||
public static IMutation frugalB;
|
||||
public static IMutation austereA;
|
||||
|
||||
// Tropical branch
|
||||
public static IMutation exoticA;
|
||||
public static IMutation edenicA;
|
||||
|
||||
// Wintry branch
|
||||
public static IMutation icyA;
|
||||
public static IMutation glacialA;
|
||||
|
||||
// Festive branch
|
||||
public static IMutation leporineA;
|
||||
public static IMutation merryA;
|
||||
public static IMutation tipsyA;
|
||||
public static IMutation trickyA;
|
||||
|
||||
// Agrarian branch
|
||||
public static IMutation ruralA;
|
||||
|
||||
// Monastic branch
|
||||
public static IMutation secludedA;
|
||||
public static IMutation hermiticA;
|
||||
|
||||
// End branch
|
||||
public static IMutation spectralA;
|
||||
public static IMutation phantasmalA;
|
||||
|
||||
public static IMutation vindictiveA;
|
||||
|
||||
public static IMutation vengefulA;
|
||||
public static IMutation vengefulB;
|
||||
public static IMutation avengingA;
|
||||
|
||||
public static IAllele[] getDefaultTemplate() {
|
||||
IAllele[] alleles = new IAllele[EnumBeeChromosome.values().length];
|
||||
|
||||
alleles[EnumBeeChromosome.SPECIES.ordinal()] = Allele.speciesForest;
|
||||
alleles[EnumBeeChromosome.SPEED.ordinal()] = Allele.speedSlowest;
|
||||
alleles[EnumBeeChromosome.LIFESPAN.ordinal()] = Allele.lifespanShorter;
|
||||
alleles[EnumBeeChromosome.FERTILITY.ordinal()] = Allele.fertilityNormal;
|
||||
alleles[EnumBeeChromosome.TEMPERATURE_TOLERANCE.ordinal()] = Allele.toleranceNone;
|
||||
alleles[EnumBeeChromosome.NOCTURNAL.ordinal()] = Allele.boolFalse;
|
||||
alleles[EnumBeeChromosome.HUMIDITY_TOLERANCE.ordinal()] = Allele.toleranceNone;
|
||||
alleles[EnumBeeChromosome.TOLERANT_FLYER.ordinal()] = Allele.boolFalse;
|
||||
alleles[EnumBeeChromosome.CAVE_DWELLING.ordinal()] = Allele.boolFalse;
|
||||
alleles[EnumBeeChromosome.FLOWER_PROVIDER.ordinal()] = Allele.flowersVanilla;
|
||||
alleles[EnumBeeChromosome.FLOWERING.ordinal()] = Allele.floweringSlowest;
|
||||
alleles[EnumBeeChromosome.TERRITORY.ordinal()] = Allele.territoryDefault;
|
||||
alleles[EnumBeeChromosome.EFFECT.ordinal()] = Allele.effectNone;
|
||||
|
||||
return alleles;
|
||||
}
|
||||
|
||||
// / COMMON BRANCH
|
||||
|
||||
public static IAllele[] getForestTemplate() {
|
||||
IAllele[] alleles = getDefaultTemplate();
|
||||
alleles[EnumBeeChromosome.FLOWERING.ordinal()] = Allele.floweringSlower;
|
||||
alleles[EnumBeeChromosome.FERTILITY.ordinal()] = Allele.fertilityHigh;
|
||||
return alleles;
|
||||
}
|
||||
|
||||
public static IAllele[] getForestRainResistTemplate() {
|
||||
IAllele[] alleles = getForestTemplate();
|
||||
alleles[EnumBeeChromosome.TOLERANT_FLYER.ordinal()] = Allele.boolTrue;
|
||||
return alleles;
|
||||
}
|
||||
|
||||
public static IAllele[] getMeadowsTemplate() {
|
||||
IAllele[] alleles = getDefaultTemplate();
|
||||
alleles[EnumBeeChromosome.SPECIES.ordinal()] = Allele.speciesMeadows;
|
||||
alleles[EnumBeeChromosome.FLOWERING.ordinal()] = Allele.floweringSlower;
|
||||
return alleles;
|
||||
}
|
||||
|
||||
public static IAllele[] getCommonTemplate() {
|
||||
IAllele[] alleles = getDefaultTemplate();
|
||||
alleles[EnumBeeChromosome.SPECIES.ordinal()] = Allele.speciesCommon;
|
||||
alleles[EnumBeeChromosome.SPEED.ordinal()] = Allele.speedSlower;
|
||||
return alleles;
|
||||
}
|
||||
|
||||
public static IAllele[] getCultivatedTemplate() {
|
||||
IAllele[] alleles = getDefaultTemplate();
|
||||
alleles[EnumBeeChromosome.SPECIES.ordinal()] = Allele.speciesCultivated;
|
||||
alleles[EnumBeeChromosome.SPEED.ordinal()] = Allele.speedFast;
|
||||
alleles[EnumBeeChromosome.LIFESPAN.ordinal()] = Allele.lifespanShortest;
|
||||
return alleles;
|
||||
}
|
||||
|
||||
// / NOBLE BRANCH
|
||||
|
||||
public static IAllele[] getNobleTemplate() {
|
||||
IAllele[] alleles = getDefaultTemplate();
|
||||
alleles[EnumBeeChromosome.SPECIES.ordinal()] = Allele.speciesNoble;
|
||||
alleles[EnumBeeChromosome.SPEED.ordinal()] = Allele.speedSlower;
|
||||
alleles[EnumBeeChromosome.LIFESPAN.ordinal()] = Allele.lifespanShort;
|
||||
alleles[EnumBeeChromosome.FLOWERING.ordinal()] = Allele.floweringSlow;
|
||||
return alleles;
|
||||
}
|
||||
|
||||
public static IAllele[] getMajesticTemplate() {
|
||||
IAllele[] alleles = getDefaultTemplate();
|
||||
alleles[EnumBeeChromosome.SPECIES.ordinal()] = Allele.speciesMajestic;
|
||||
alleles[EnumBeeChromosome.SPEED.ordinal()] = Allele.speedNorm;
|
||||
alleles[EnumBeeChromosome.LIFESPAN.ordinal()] = Allele.lifespanShortened;
|
||||
alleles[EnumBeeChromosome.FERTILITY.ordinal()] = Allele.fertilityMaximum;
|
||||
return alleles;
|
||||
}
|
||||
|
||||
public static IAllele[] getImperialTemplate() {
|
||||
IAllele[] alleles = getDefaultTemplate();
|
||||
alleles[EnumBeeChromosome.SPECIES.ordinal()] = Allele.speciesImperial;
|
||||
alleles[EnumBeeChromosome.SPEED.ordinal()] = Allele.speedSlower;
|
||||
alleles[EnumBeeChromosome.LIFESPAN.ordinal()] = Allele.lifespanNormal;
|
||||
alleles[EnumBeeChromosome.EFFECT.ordinal()] = Allele.effectBeatific;
|
||||
return alleles;
|
||||
}
|
||||
|
||||
// / INDUSTRIOUS BRANCH
|
||||
|
||||
public static IAllele[] getDiligentTemplate() {
|
||||
IAllele[] alleles = getDefaultTemplate();
|
||||
alleles[EnumBeeChromosome.SPECIES.ordinal()] = Allele.speciesDiligent;
|
||||
alleles[EnumBeeChromosome.SPEED.ordinal()] = Allele.speedSlower;
|
||||
alleles[EnumBeeChromosome.LIFESPAN.ordinal()] = Allele.lifespanShort;
|
||||
alleles[EnumBeeChromosome.FLOWERING.ordinal()] = Allele.floweringSlow;
|
||||
return alleles;
|
||||
}
|
||||
|
||||
public static IAllele[] getUnwearyTemplate() {
|
||||
IAllele[] alleles = getDefaultTemplate();
|
||||
alleles[EnumBeeChromosome.SPECIES.ordinal()] = Allele.speciesUnweary;
|
||||
alleles[EnumBeeChromosome.SPEED.ordinal()] = Allele.speedNorm;
|
||||
alleles[EnumBeeChromosome.LIFESPAN.ordinal()] = Allele.lifespanShortened;
|
||||
return alleles;
|
||||
}
|
||||
|
||||
public static IAllele[] getIndustriousTemplate() {
|
||||
IAllele[] alleles = getDefaultTemplate();
|
||||
alleles[EnumBeeChromosome.SPECIES.ordinal()] = Allele.speciesIndustrious;
|
||||
alleles[EnumBeeChromosome.SPEED.ordinal()] = Allele.speedSlower;
|
||||
alleles[EnumBeeChromosome.LIFESPAN.ordinal()] = Allele.lifespanNormal;
|
||||
alleles[EnumBeeChromosome.FLOWERING.ordinal()] = Allele.floweringFast;
|
||||
return alleles;
|
||||
}
|
||||
|
||||
// / HEROIC BRANCH
|
||||
|
||||
public static IAllele[] getSteadfastTemplate() {
|
||||
IAllele[] alleles = getDefaultTemplate();
|
||||
alleles[EnumBeeChromosome.SPECIES.ordinal()] = Allele.speciesSteadfast;
|
||||
alleles[EnumBeeChromosome.SPEED.ordinal()] = Allele.speedSlower;
|
||||
alleles[EnumBeeChromosome.LIFESPAN.ordinal()] = Allele.lifespanNormal;
|
||||
alleles[EnumBeeChromosome.NOCTURNAL.ordinal()] = Allele.boolTrue;
|
||||
alleles[EnumBeeChromosome.CAVE_DWELLING.ordinal()] = Allele.boolTrue;
|
||||
return alleles;
|
||||
}
|
||||
|
||||
public static IAllele[] getValiantTemplate() {
|
||||
IAllele[] alleles = getDefaultTemplate();
|
||||
alleles[EnumBeeChromosome.SPECIES.ordinal()] = Allele.speciesValiant;
|
||||
alleles[EnumBeeChromosome.SPEED.ordinal()] = Allele.speedSlow;
|
||||
alleles[EnumBeeChromosome.LIFESPAN.ordinal()] = Allele.lifespanLong;
|
||||
alleles[EnumBeeChromosome.NOCTURNAL.ordinal()] = Allele.boolTrue;
|
||||
alleles[EnumBeeChromosome.CAVE_DWELLING.ordinal()] = Allele.boolTrue;
|
||||
return alleles;
|
||||
}
|
||||
|
||||
public static IAllele[] getHeroicTemplate() {
|
||||
IAllele[] alleles = getDefaultTemplate();
|
||||
alleles[EnumBeeChromosome.SPECIES.ordinal()] = Allele.speciesHeroic;
|
||||
alleles[EnumBeeChromosome.SPEED.ordinal()] = Allele.speedSlow;
|
||||
alleles[EnumBeeChromosome.LIFESPAN.ordinal()] = Allele.lifespanLong;
|
||||
alleles[EnumBeeChromosome.NOCTURNAL.ordinal()] = Allele.boolTrue;
|
||||
alleles[EnumBeeChromosome.CAVE_DWELLING.ordinal()] = Allele.boolTrue;
|
||||
alleles[EnumBeeChromosome.EFFECT.ordinal()] = Allele.effectHeroic;
|
||||
return alleles;
|
||||
}
|
||||
|
||||
// / INFERNAL BRANCH
|
||||
|
||||
public static IAllele[] getBranchInfernalTemplate() {
|
||||
IAllele[] alleles = getDefaultTemplate();
|
||||
alleles[EnumBeeChromosome.TEMPERATURE_TOLERANCE.ordinal()] = Allele.toleranceDown2;
|
||||
alleles[EnumBeeChromosome.NOCTURNAL.ordinal()] = Allele.boolTrue;
|
||||
alleles[EnumBeeChromosome.FLOWER_PROVIDER.ordinal()] = Allele.flowersNether;
|
||||
alleles[EnumBeeChromosome.FLOWERING.ordinal()] = Allele.floweringAverage;
|
||||
return alleles;
|
||||
}
|
||||
|
||||
public static IAllele[] getSinisterTemplate() {
|
||||
IAllele[] alleles = getBranchInfernalTemplate();
|
||||
alleles[EnumBeeChromosome.SPECIES.ordinal()] = Allele.speciesSinister;
|
||||
alleles[EnumBeeChromosome.SPEED.ordinal()] = Allele.speedSlower;
|
||||
alleles[EnumBeeChromosome.LIFESPAN.ordinal()] = Allele.lifespanNormal;
|
||||
alleles[EnumBeeChromosome.EFFECT.ordinal()] = Allele.effectAggressive;
|
||||
return alleles;
|
||||
}
|
||||
|
||||
public static IAllele[] getFiendishTemplate() {
|
||||
IAllele[] alleles = getBranchInfernalTemplate();
|
||||
alleles[EnumBeeChromosome.SPECIES.ordinal()] = Allele.speciesFiendish;
|
||||
alleles[EnumBeeChromosome.SPEED.ordinal()] = Allele.speedNorm;
|
||||
alleles[EnumBeeChromosome.LIFESPAN.ordinal()] = Allele.lifespanLong;
|
||||
alleles[EnumBeeChromosome.EFFECT.ordinal()] = Allele.effectAggressive;
|
||||
return alleles;
|
||||
}
|
||||
|
||||
public static IAllele[] getDemonicTemplate() {
|
||||
IAllele[] alleles = getBranchInfernalTemplate();
|
||||
alleles[EnumBeeChromosome.SPECIES.ordinal()] = Allele.speciesDemonic;
|
||||
alleles[EnumBeeChromosome.SPEED.ordinal()] = Allele.speedSlower;
|
||||
alleles[EnumBeeChromosome.LIFESPAN.ordinal()] = Allele.lifespanLonger;
|
||||
alleles[EnumBeeChromosome.EFFECT.ordinal()] = Allele.effectIgnition;
|
||||
return alleles;
|
||||
}
|
||||
|
||||
// / AUSTERE BRANCH
|
||||
|
||||
public static IAllele[] getAustereBranchTemplate() {
|
||||
IAllele[] alleles = getDefaultTemplate();
|
||||
alleles[EnumBeeChromosome.TEMPERATURE_TOLERANCE.ordinal()] = Allele.toleranceBoth1;
|
||||
alleles[EnumBeeChromosome.HUMIDITY_TOLERANCE.ordinal()] = Allele.toleranceUp1;
|
||||
alleles[EnumBeeChromosome.NOCTURNAL.ordinal()] = Allele.boolTrue;
|
||||
alleles[EnumBeeChromosome.FLOWER_PROVIDER.ordinal()] = Allele.flowersCacti;
|
||||
return alleles;
|
||||
}
|
||||
|
||||
public static IAllele[] getModestTemplate() {
|
||||
IAllele[] alleles = getAustereBranchTemplate();
|
||||
alleles[EnumBeeChromosome.SPECIES.ordinal()] = Allele.speciesModest;
|
||||
alleles[EnumBeeChromosome.SPEED.ordinal()] = Allele.speedSlower;
|
||||
alleles[EnumBeeChromosome.LIFESPAN.ordinal()] = Allele.lifespanShort;
|
||||
return alleles;
|
||||
}
|
||||
|
||||
public static IAllele[] getFrugalTemplate() {
|
||||
IAllele[] alleles = getAustereBranchTemplate();
|
||||
alleles[EnumBeeChromosome.SPECIES.ordinal()] = Allele.speciesFrugal;
|
||||
alleles[EnumBeeChromosome.SPEED.ordinal()] = Allele.speedNorm;
|
||||
alleles[EnumBeeChromosome.LIFESPAN.ordinal()] = Allele.lifespanLong;
|
||||
return alleles;
|
||||
}
|
||||
|
||||
public static IAllele[] getAustereTemplate() {
|
||||
IAllele[] alleles = getAustereBranchTemplate();
|
||||
alleles[EnumBeeChromosome.SPECIES.ordinal()] = Allele.speciesAustere;
|
||||
alleles[EnumBeeChromosome.SPEED.ordinal()] = Allele.speedSlowest;
|
||||
alleles[EnumBeeChromosome.LIFESPAN.ordinal()] = Allele.lifespanLonger;
|
||||
alleles[EnumBeeChromosome.TEMPERATURE_TOLERANCE.ordinal()] = Allele.toleranceDown2;
|
||||
alleles[EnumBeeChromosome.EFFECT.ordinal()] = Allele.effectCreeper;
|
||||
return alleles;
|
||||
}
|
||||
|
||||
// / TROPICAL BRANCH
|
||||
public static IAllele[] getTropicalBranchTemplate() {
|
||||
IAllele[] alleles = getDefaultTemplate();
|
||||
alleles[EnumBeeChromosome.TEMPERATURE_TOLERANCE.ordinal()] = Allele.toleranceBoth1;
|
||||
alleles[EnumBeeChromosome.HUMIDITY_TOLERANCE.ordinal()] = Allele.toleranceDown1;
|
||||
alleles[EnumBeeChromosome.FLOWER_PROVIDER.ordinal()] = Allele.flowersJungle;
|
||||
alleles[EnumBeeChromosome.EFFECT.ordinal()] = Allele.effectMiasmic;
|
||||
return alleles;
|
||||
}
|
||||
|
||||
public static IAllele[] getTropicalTemplate() {
|
||||
IAllele[] alleles = getTropicalBranchTemplate();
|
||||
alleles[EnumBeeChromosome.SPECIES.ordinal()] = Allele.speciesTropical;
|
||||
alleles[EnumBeeChromosome.SPEED.ordinal()] = Allele.speedSlower;
|
||||
alleles[EnumBeeChromosome.LIFESPAN.ordinal()] = Allele.lifespanShort;
|
||||
return alleles;
|
||||
}
|
||||
|
||||
public static IAllele[] getExoticTemplate() {
|
||||
IAllele[] alleles = getTropicalBranchTemplate();
|
||||
alleles[EnumBeeChromosome.SPECIES.ordinal()] = Allele.speciesExotic;
|
||||
alleles[EnumBeeChromosome.SPEED.ordinal()] = Allele.speedNorm;
|
||||
alleles[EnumBeeChromosome.LIFESPAN.ordinal()] = Allele.lifespanLong;
|
||||
return alleles;
|
||||
}
|
||||
|
||||
public static IAllele[] getEdenicTemplate() {
|
||||
IAllele[] alleles = getTropicalBranchTemplate();
|
||||
alleles[EnumBeeChromosome.SPECIES.ordinal()] = Allele.speciesEdenic;
|
||||
alleles[EnumBeeChromosome.SPEED.ordinal()] = Allele.speedSlowest;
|
||||
alleles[EnumBeeChromosome.LIFESPAN.ordinal()] = Allele.lifespanLonger;
|
||||
alleles[EnumBeeChromosome.TEMPERATURE_TOLERANCE.ordinal()] = Allele.toleranceBoth2;
|
||||
alleles[EnumBeeChromosome.EFFECT.ordinal()] = Allele.effectExploration;
|
||||
return alleles;
|
||||
}
|
||||
|
||||
// / END BRANCH
|
||||
public static IAllele[] getEndBranchTemplate() {
|
||||
IAllele[] alleles = getDefaultTemplate();
|
||||
alleles[EnumBeeChromosome.FERTILITY.ordinal()] = Allele.fertilityLow;
|
||||
alleles[EnumBeeChromosome.SPEED.ordinal()] = Allele.speedSlower;
|
||||
alleles[EnumBeeChromosome.LIFESPAN.ordinal()] = Allele.lifespanLonger;
|
||||
alleles[EnumBeeChromosome.TEMPERATURE_TOLERANCE.ordinal()] = Allele.toleranceUp1;
|
||||
alleles[EnumBeeChromosome.TERRITORY.ordinal()] = Allele.territoryLarge;
|
||||
alleles[EnumBeeChromosome.FLOWER_PROVIDER.ordinal()] = Allele.flowersEnd;
|
||||
alleles[EnumBeeChromosome.NOCTURNAL.ordinal()] = Allele.boolTrue;
|
||||
alleles[EnumBeeChromosome.EFFECT.ordinal()] = Allele.effectMisanthrope;
|
||||
return alleles;
|
||||
}
|
||||
|
||||
public static IAllele[] getEnderTemplate() {
|
||||
IAllele[] alleles = getEndBranchTemplate();
|
||||
alleles[EnumBeeChromosome.SPECIES.ordinal()] = Allele.speciesEnded;
|
||||
return alleles;
|
||||
}
|
||||
|
||||
public static IAllele[] getSpectralTemplate() {
|
||||
IAllele[] alleles = getEndBranchTemplate();
|
||||
alleles[EnumBeeChromosome.SPECIES.ordinal()] = Allele.speciesSpectral;
|
||||
alleles[EnumBeeChromosome.EFFECT.ordinal()] = Allele.effectReanimation;
|
||||
return alleles;
|
||||
}
|
||||
|
||||
public static IAllele[] getPhantasmalTemplate() {
|
||||
IAllele[] alleles = getEndBranchTemplate();
|
||||
alleles[EnumBeeChromosome.SPECIES.ordinal()] = Allele.speciesPhantasmal;
|
||||
alleles[EnumBeeChromosome.SPEED.ordinal()] = Allele.speedSlowest;
|
||||
alleles[EnumBeeChromosome.LIFESPAN.ordinal()] = Allele.lifespanLongest;
|
||||
alleles[EnumBeeChromosome.EFFECT.ordinal()] = Allele.effectResurrection;
|
||||
return alleles;
|
||||
}
|
||||
|
||||
// / FROZEN BRANCH
|
||||
public static IAllele[] getFrozenBranchTemplate() {
|
||||
IAllele[] alleles = getDefaultTemplate();
|
||||
alleles[EnumBeeChromosome.TEMPERATURE_TOLERANCE.ordinal()] = Allele.toleranceUp1;
|
||||
alleles[EnumBeeChromosome.FLOWER_PROVIDER.ordinal()] = Allele.flowersSnow;
|
||||
alleles[EnumBeeChromosome.EFFECT.ordinal()] = Allele.effectGlacial;
|
||||
return alleles;
|
||||
}
|
||||
|
||||
public static IAllele[] getWintryTemplate() {
|
||||
IAllele[] alleles = getFrozenBranchTemplate();
|
||||
alleles[EnumBeeChromosome.SPECIES.ordinal()] = Allele.speciesWintry;
|
||||
alleles[EnumBeeChromosome.SPEED.ordinal()] = Allele.speedSlower;
|
||||
alleles[EnumBeeChromosome.LIFESPAN.ordinal()] = Allele.lifespanShort;
|
||||
alleles[EnumBeeChromosome.FERTILITY.ordinal()] = Allele.fertilityMaximum;
|
||||
return alleles;
|
||||
}
|
||||
|
||||
public static IAllele[] getIcyTemplate() {
|
||||
IAllele[] alleles = getFrozenBranchTemplate();
|
||||
alleles[EnumBeeChromosome.SPECIES.ordinal()] = Allele.speciesIcy;
|
||||
alleles[EnumBeeChromosome.SPEED.ordinal()] = Allele.speedSlow;
|
||||
alleles[EnumBeeChromosome.LIFESPAN.ordinal()] = Allele.lifespanShort;
|
||||
return alleles;
|
||||
}
|
||||
|
||||
public static IAllele[] getGlacialTemplate() {
|
||||
IAllele[] alleles = getFrozenBranchTemplate();
|
||||
alleles[EnumBeeChromosome.SPECIES.ordinal()] = Allele.speciesGlacial;
|
||||
alleles[EnumBeeChromosome.SPEED.ordinal()] = Allele.speedSlower;
|
||||
alleles[EnumBeeChromosome.LIFESPAN.ordinal()] = Allele.lifespanShort;
|
||||
return alleles;
|
||||
}
|
||||
|
||||
// / VENGEFUL BRANCH
|
||||
public static IAllele[] getVengefulBranchTemplate() {
|
||||
IAllele[] alleles = getDefaultTemplate();
|
||||
alleles[EnumBeeChromosome.TERRITORY.ordinal()] = Allele.territoryLargest;
|
||||
alleles[EnumBeeChromosome.EFFECT.ordinal()] = Allele.effectRadioactive;
|
||||
return alleles;
|
||||
}
|
||||
|
||||
public static IAllele[] getVindictiveTemplate() {
|
||||
IAllele[] alleles = getVengefulBranchTemplate();
|
||||
alleles[EnumBeeChromosome.SPECIES.ordinal()] = Allele.speciesVindictive;
|
||||
alleles[EnumBeeChromosome.SPEED.ordinal()] = Allele.speedSlower;
|
||||
alleles[EnumBeeChromosome.LIFESPAN.ordinal()] = Allele.lifespanNormal;
|
||||
return alleles;
|
||||
}
|
||||
|
||||
public static IAllele[] getVengefulTemplate() {
|
||||
IAllele[] alleles = getVengefulBranchTemplate();
|
||||
alleles[EnumBeeChromosome.SPECIES.ordinal()] = Allele.speciesVengeful;
|
||||
alleles[EnumBeeChromosome.SPEED.ordinal()] = Allele.speedNorm;
|
||||
alleles[EnumBeeChromosome.LIFESPAN.ordinal()] = Allele.lifespanLonger;
|
||||
return alleles;
|
||||
}
|
||||
|
||||
public static IAllele[] getAvengingTemplate() {
|
||||
IAllele[] alleles = getVengefulBranchTemplate();
|
||||
alleles[EnumBeeChromosome.SPECIES.ordinal()] = Allele.speciesAvenging;
|
||||
alleles[EnumBeeChromosome.SPEED.ordinal()] = Allele.speedSlowest;
|
||||
alleles[EnumBeeChromosome.LIFESPAN.ordinal()] = Allele.lifespanLongest;
|
||||
return alleles;
|
||||
}
|
||||
|
||||
// / REDDENED BRANCH
|
||||
public static IAllele[] getReddenedBranchTemplate() {
|
||||
IAllele[] alleles = getDefaultTemplate();
|
||||
alleles[EnumBeeChromosome.SPEED.ordinal()] = Allele.speedSlow;
|
||||
alleles[EnumBeeChromosome.LIFESPAN.ordinal()] = Allele.lifespanNormal;
|
||||
alleles[EnumBeeChromosome.TEMPERATURE_TOLERANCE.ordinal()] = Allele.toleranceBoth2;
|
||||
alleles[EnumBeeChromosome.HUMIDITY_TOLERANCE.ordinal()] = Allele.toleranceBoth1;
|
||||
return alleles;
|
||||
}
|
||||
|
||||
public static IAllele[] getDarkenedTemplate() {
|
||||
IAllele[] alleles = getDefaultTemplate();
|
||||
alleles[EnumBeeChromosome.SPECIES.ordinal()] = Allele.speciesDarkened;
|
||||
return alleles;
|
||||
}
|
||||
|
||||
public static IAllele[] getReddenedTemplate() {
|
||||
IAllele[] alleles = getDefaultTemplate();
|
||||
alleles[EnumBeeChromosome.SPECIES.ordinal()] = Allele.speciesReddened;
|
||||
return alleles;
|
||||
}
|
||||
|
||||
public static IAllele[] getOmegaTemplate() {
|
||||
IAllele[] alleles = getDefaultTemplate();
|
||||
alleles[EnumBeeChromosome.SPECIES.ordinal()] = Allele.speciesOmega;
|
||||
return alleles;
|
||||
}
|
||||
|
||||
// / FESTIVE BRANCH
|
||||
public static IAllele[] getFestiveBranchTemplate() {
|
||||
IAllele[] alleles = getDefaultTemplate();
|
||||
alleles[EnumBeeChromosome.SPEED.ordinal()] = Allele.speedSlower;
|
||||
alleles[EnumBeeChromosome.TEMPERATURE_TOLERANCE.ordinal()] = Allele.toleranceBoth2;
|
||||
alleles[EnumBeeChromosome.HUMIDITY_TOLERANCE.ordinal()] = Allele.toleranceBoth1;
|
||||
alleles[EnumBeeChromosome.LIFESPAN.ordinal()] = Allele.lifespanNormal;
|
||||
return alleles;
|
||||
}
|
||||
|
||||
public static IAllele[] getLeporineTemplate() {
|
||||
IAllele[] alleles = getFestiveBranchTemplate();
|
||||
alleles[EnumBeeChromosome.SPECIES.ordinal()] = Allele.speciesLeporine;
|
||||
alleles[EnumBeeChromosome.EFFECT.ordinal()] = Allele.effectFestiveEaster;
|
||||
return alleles;
|
||||
}
|
||||
|
||||
public static IAllele[] getMerryTemplate() {
|
||||
IAllele[] alleles = getFestiveBranchTemplate();
|
||||
alleles[EnumBeeChromosome.SPECIES.ordinal()] = Allele.speciesMerry;
|
||||
alleles[EnumBeeChromosome.NOCTURNAL.ordinal()] = Allele.boolTrue;
|
||||
alleles[EnumBeeChromosome.EFFECT.ordinal()] = Allele.effectSnowing;
|
||||
return alleles;
|
||||
}
|
||||
|
||||
public static IAllele[] getTipsyTemplate() {
|
||||
IAllele[] alleles = getFestiveBranchTemplate();
|
||||
alleles[EnumBeeChromosome.SPECIES.ordinal()] = Allele.speciesTipsy;
|
||||
alleles[EnumBeeChromosome.NOCTURNAL.ordinal()] = Allele.boolTrue;
|
||||
alleles[EnumBeeChromosome.EFFECT.ordinal()] = Allele.effectDrunkard;
|
||||
return alleles;
|
||||
}
|
||||
|
||||
public static IAllele[] getTrickyTemplate() {
|
||||
IAllele[] alleles = getFestiveBranchTemplate();
|
||||
alleles[EnumBeeChromosome.SPECIES.ordinal()] = Allele.speciesTricky;
|
||||
alleles[EnumBeeChromosome.NOCTURNAL.ordinal()] = Allele.boolTrue;
|
||||
alleles[EnumBeeChromosome.TOLERANT_FLYER.ordinal()] = Allele.boolTrue;
|
||||
alleles[EnumBeeChromosome.FLOWER_PROVIDER.ordinal()] = Allele.flowersGourd;
|
||||
return alleles;
|
||||
}
|
||||
|
||||
// / AGRARIAN BRANCH
|
||||
public static IAllele[] getAgrarianBranchTemplate() {
|
||||
IAllele[] alleles = getDefaultTemplate();
|
||||
alleles[EnumBeeChromosome.SPEED.ordinal()] = Allele.speedSlower;
|
||||
alleles[EnumBeeChromosome.LIFESPAN.ordinal()] = Allele.lifespanShorter;
|
||||
alleles[EnumBeeChromosome.FLOWER_PROVIDER.ordinal()] = Allele.flowersWheat;
|
||||
alleles[EnumBeeChromosome.FLOWERING.ordinal()] = Allele.floweringFaster;
|
||||
return alleles;
|
||||
}
|
||||
|
||||
public static IAllele[] getRuralTemplate() {
|
||||
IAllele[] alleles = getAgrarianBranchTemplate();
|
||||
alleles[EnumBeeChromosome.SPECIES.ordinal()] = Allele.speciesRural;
|
||||
return alleles;
|
||||
}
|
||||
|
||||
// / BOGGY BRANCH
|
||||
public static IAllele[] getBoggyBranchTemplate() {
|
||||
IAllele[] alleles = getDefaultTemplate();
|
||||
alleles[EnumBeeChromosome.FLOWER_PROVIDER.ordinal()] = Allele.flowersMushrooms;
|
||||
alleles[EnumBeeChromosome.FLOWERING.ordinal()] = Allele.floweringSlower;
|
||||
alleles[EnumBeeChromosome.HUMIDITY_TOLERANCE.ordinal()] = Allele.toleranceBoth1;
|
||||
alleles[EnumBeeChromosome.TEMPERATURE_TOLERANCE.ordinal()] = Allele.toleranceBoth1;
|
||||
return alleles;
|
||||
}
|
||||
|
||||
public static IAllele[] getMarshyTemplate() {
|
||||
IAllele[] alleles = getBoggyBranchTemplate();
|
||||
alleles[EnumBeeChromosome.SPECIES.ordinal()] = Allele.speciesMarshy;
|
||||
return alleles;
|
||||
}
|
||||
|
||||
/* MONASTIC BRANCH */
|
||||
public static IAllele[] getMonasticBranchTemplate() {
|
||||
IAllele[] alleles = getDefaultTemplate();
|
||||
alleles[EnumBeeChromosome.SPEED.ordinal()] = Allele.speedSlower;
|
||||
alleles[EnumBeeChromosome.LIFESPAN.ordinal()] = Allele.lifespanLong;
|
||||
alleles[EnumBeeChromosome.FERTILITY.ordinal()] = Allele.fertilityLow;
|
||||
alleles[EnumBeeChromosome.FLOWERING.ordinal()] = Allele.floweringFaster;
|
||||
alleles[EnumBeeChromosome.HUMIDITY_TOLERANCE.ordinal()] = Allele.toleranceBoth1;
|
||||
alleles[EnumBeeChromosome.TEMPERATURE_TOLERANCE.ordinal()] = Allele.toleranceBoth1;
|
||||
alleles[EnumBeeChromosome.CAVE_DWELLING.ordinal()] = Allele.boolTrue;
|
||||
alleles[EnumBeeChromosome.FLOWER_PROVIDER.ordinal()] = Allele.flowersWheat;
|
||||
return alleles;
|
||||
}
|
||||
|
||||
public static IAllele[] getMonasticTemplate() {
|
||||
IAllele[] alleles = getMonasticBranchTemplate();
|
||||
alleles[EnumBeeChromosome.SPECIES.ordinal()] = Allele.speciesMonastic;
|
||||
return alleles;
|
||||
}
|
||||
|
||||
public static IAllele[] getSecludedTemplate() {
|
||||
IAllele[] alleles = getMonasticBranchTemplate();
|
||||
alleles[EnumBeeChromosome.SPECIES.ordinal()] = Allele.speciesSecluded;
|
||||
alleles[EnumBeeChromosome.FLOWERING.ordinal()] = Allele.floweringFastest;
|
||||
return alleles;
|
||||
}
|
||||
|
||||
public static IAllele[] getHermiticTemplate() {
|
||||
IAllele[] alleles = getMonasticBranchTemplate();
|
||||
alleles[EnumBeeChromosome.SPECIES.ordinal()] = Allele.speciesHermitic;
|
||||
alleles[EnumBeeChromosome.FLOWERING.ordinal()] = Allele.floweringFastest;
|
||||
alleles[EnumBeeChromosome.EFFECT.ordinal()] = Allele.effectRepulsion;
|
||||
return alleles;
|
||||
}
|
||||
|
||||
}
|
||||
+174
@@ -0,0 +1,174 @@
|
||||
/*******************************************************************************
|
||||
* Copyright 2011-2014 by SirSengir
|
||||
*
|
||||
* This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.
|
||||
*
|
||||
* To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/3.0/.
|
||||
******************************************************************************/
|
||||
package forestry.apiculture.genetics;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Locale;
|
||||
import java.util.Random;
|
||||
|
||||
import net.minecraft.world.World;
|
||||
|
||||
import forestry.api.apiculture.IBee;
|
||||
import forestry.api.apiculture.IBeeGenome;
|
||||
import forestry.api.apiculture.IBeeHousing;
|
||||
import forestry.api.apiculture.IBeekeepingMode;
|
||||
|
||||
public class BeekeepingMode implements IBeekeepingMode {
|
||||
|
||||
public static IBeekeepingMode easy = new BeekeepingMode("EASY", 2.0f, 1.0f, 1.0f, false, false);
|
||||
public static IBeekeepingMode normal = new BeekeepingMode("NORMAL", 1.0f, 1.0f, 1.0f, false, true);
|
||||
public static IBeekeepingMode hard = new BeekeepingMode("HARD", 0.75f, 1.5f, 1.0f, false, true);
|
||||
public static IBeekeepingMode hardcore = new BeekeepingMode("HARDCORE", 0.5f, 5.0f, 0.8f, true, true);
|
||||
public static IBeekeepingMode insane = new BeekeepingMode("INSANE", 0.2f, 10.0f, 0.6f, true, true);
|
||||
|
||||
final Random rand;
|
||||
final String name;
|
||||
final float mutationModifier;
|
||||
final float lifespanModifier;
|
||||
final float speedModifier;
|
||||
final boolean reducesFertility;
|
||||
final boolean canFatigue;
|
||||
|
||||
public BeekeepingMode(String name, float mutationModifier, float lifespanModifier, float speedModifier, boolean reducesFertility, boolean canFatigue) {
|
||||
this.rand = new Random();
|
||||
this.name = name;
|
||||
this.mutationModifier = mutationModifier;
|
||||
this.lifespanModifier = lifespanModifier;
|
||||
this.speedModifier = speedModifier;
|
||||
this.reducesFertility = reducesFertility;
|
||||
this.canFatigue = canFatigue;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return this.name;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ArrayList<String> getDescription() {
|
||||
ArrayList<String> ret = new ArrayList<String>();
|
||||
ret.add("beemode." + name.toLowerCase(Locale.ENGLISH) + ".desc");
|
||||
return ret;
|
||||
}
|
||||
|
||||
@Override
|
||||
public float getWearModifier() {
|
||||
return 1.0f;
|
||||
}
|
||||
|
||||
@Override
|
||||
public float getMutationModifier(IBeeGenome genome, IBeeGenome mate, float currentModifier) {
|
||||
return this.mutationModifier;
|
||||
}
|
||||
|
||||
@Override
|
||||
public float getLifespanModifier(IBeeGenome genome, IBeeGenome mate, float currentModifier) {
|
||||
return this.lifespanModifier;
|
||||
}
|
||||
|
||||
@Override
|
||||
public float getProductionModifier(IBeeGenome genome, float currentModifier) {
|
||||
return this.speedModifier;
|
||||
}
|
||||
|
||||
@Override
|
||||
public float getTerritoryModifier(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 int getFinalFertility(IBee queen, World world, int x, int y, int z) {
|
||||
int toCreate = queen.getGenome().getFertility();
|
||||
|
||||
if (reducesFertility)
|
||||
toCreate = new Random().nextInt(toCreate);
|
||||
|
||||
return toCreate;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isFatigued(IBee queen, IBeeHousing housing) {
|
||||
if (!canFatigue)
|
||||
return false;
|
||||
|
||||
if (queen.isNatural())
|
||||
return false;
|
||||
|
||||
if (queen.getGeneration() > 96 + rand.nextInt(6) + rand.nextInt(6) &&
|
||||
rand.nextFloat() < 0.02f * housing.getGeneticDecay(queen.getGenome(), 1f))
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isOverworked(IBee queen, IBeeHousing housing) {
|
||||
float productionModifier = housing.getProductionModifier(queen.getGenome(), 1f);
|
||||
if(productionModifier > 16) {
|
||||
if(housing.getWorld().rand.nextFloat()*100 < 0.01 * ((productionModifier*productionModifier) - 100))
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isDegenerating(IBee queen, IBee offspring, IBeeHousing housing) {
|
||||
float mutationModifier = housing.getMutationModifier(queen.getGenome(), queen.getMate(), 1.0f);
|
||||
if(mutationModifier > 10) {
|
||||
if(housing.getWorld().rand.nextFloat()*100 < 0.4 * ((mutationModifier*mutationModifier) - 100))
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isNaturalOffspring(IBee queen) {
|
||||
if (!queen.isNatural())
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean mayMultiplyPrincess(IBee queen) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isSealed() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isSelfLighted() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isSunlightSimulated() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isHellish() {
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
/*******************************************************************************
|
||||
* Copyright 2011-2014 by SirSengir
|
||||
*
|
||||
* This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.
|
||||
*
|
||||
* To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/3.0/.
|
||||
******************************************************************************/
|
||||
package forestry.apiculture.genetics;
|
||||
|
||||
import forestry.core.genetics.Branch;
|
||||
|
||||
public class BranchBees extends Branch {
|
||||
|
||||
public BranchBees(String uid, String scientific) {
|
||||
super("bees." + uid, scientific);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,75 @@
|
||||
/*******************************************************************************
|
||||
* Copyright 2011-2014 by SirSengir
|
||||
*
|
||||
* This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.
|
||||
*
|
||||
* To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/3.0/.
|
||||
******************************************************************************/
|
||||
package forestry.apiculture.genetics;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
import forestry.api.apiculture.EnumBeeType;
|
||||
import forestry.api.apiculture.IBee;
|
||||
import forestry.api.apiculture.IHiveDrop;
|
||||
import forestry.api.genetics.IAllele;
|
||||
import forestry.plugins.PluginApiculture;
|
||||
|
||||
public class HiveDrop implements IHiveDrop {
|
||||
|
||||
private IAllele[] template;
|
||||
private ArrayList<ItemStack> additional = new ArrayList<ItemStack>();
|
||||
private int chance;
|
||||
private float ignobleShare = 0.0f;
|
||||
|
||||
public HiveDrop(IAllele[] template, ItemStack[] bonus, int chance) {
|
||||
this.template = template;
|
||||
this.chance = chance;
|
||||
|
||||
for (ItemStack stack : bonus)
|
||||
this.additional.add(stack);
|
||||
}
|
||||
|
||||
public HiveDrop setIgnobleShare(float share) {
|
||||
this.ignobleShare = share;
|
||||
return this;
|
||||
}
|
||||
|
||||
private IBee createBee(World world) {
|
||||
IBee bee = PluginApiculture.beeInterface.getBee(world, PluginApiculture.beeInterface.templateAsGenome(template));
|
||||
if(world.rand.nextFloat() < ignobleShare)
|
||||
bee.setIsNatural(false);
|
||||
return bee;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ItemStack getPrincess(World world, int x, int y, int z, int fortune) {
|
||||
return PluginApiculture.beeInterface.getMemberStack(createBee(world), EnumBeeType.PRINCESS.ordinal());
|
||||
}
|
||||
|
||||
@Override
|
||||
public ArrayList<ItemStack> getDrones(World world, int x, int y, int z, int fortune) {
|
||||
ArrayList<ItemStack> ret = new ArrayList<ItemStack>();
|
||||
ret.add(PluginApiculture.beeInterface.getMemberStack(createBee(world),
|
||||
EnumBeeType.DRONE.ordinal()));
|
||||
return ret;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ArrayList<ItemStack> getAdditional(World world, int x, int y, int z, int fortune) {
|
||||
ArrayList<ItemStack> ret = new ArrayList<ItemStack>();
|
||||
for (ItemStack stack : additional)
|
||||
ret.add(stack.copy());
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getChance(World world, int x, int y, int z) {
|
||||
return chance;
|
||||
}
|
||||
|
||||
}
|
||||
+16
@@ -0,0 +1,16 @@
|
||||
/*******************************************************************************
|
||||
* Copyright 2011-2014 by SirSengir
|
||||
*
|
||||
* This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.
|
||||
*
|
||||
* To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/3.0/.
|
||||
******************************************************************************/
|
||||
package forestry.apiculture.genetics;
|
||||
|
||||
import forestry.api.apiculture.IAlleleBeeSpecies;
|
||||
import forestry.api.apiculture.IBeeGenome;
|
||||
import forestry.api.apiculture.IBeeHousing;
|
||||
|
||||
public interface IJubilanceProvider {
|
||||
boolean isJubilant(IAlleleBeeSpecies species, IBeeGenome genome, IBeeHousing housing);
|
||||
}
|
||||
+44
@@ -0,0 +1,44 @@
|
||||
/*******************************************************************************
|
||||
* Copyright 2011-2014 by SirSengir
|
||||
*
|
||||
* This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.
|
||||
*
|
||||
* To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/3.0/.
|
||||
******************************************************************************/
|
||||
package forestry.apiculture.genetics;
|
||||
|
||||
import net.minecraft.util.AxisAlignedBB;
|
||||
import net.minecraft.world.biome.BiomeGenBase;
|
||||
|
||||
import forestry.api.apiculture.IAlleleBeeSpecies;
|
||||
import forestry.api.apiculture.IBeeGenome;
|
||||
import forestry.api.apiculture.IBeeHousing;
|
||||
import forestry.api.core.EnumHumidity;
|
||||
import forestry.api.core.EnumTemperature;
|
||||
import forestry.core.utils.Vect;
|
||||
|
||||
public class JubilanceDefault implements IJubilanceProvider {
|
||||
|
||||
@Override
|
||||
public boolean isJubilant(IAlleleBeeSpecies species, IBeeGenome genome, IBeeHousing housing) {
|
||||
BiomeGenBase biome = BiomeGenBase.getBiome(housing.getBiomeId());
|
||||
|
||||
if (EnumTemperature.getFromValue(biome.temperature) != species.getTemperature() ||
|
||||
EnumHumidity.getFromValue(biome.rainfall) != species.getHumidity())
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
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));
|
||||
|
||||
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.getAABBPool().getAABB(min.x, min.y, min.z, max.x, max.y, max.z);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
/*******************************************************************************
|
||||
* Copyright 2011-2014 by SirSengir
|
||||
*
|
||||
* This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.
|
||||
*
|
||||
* To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/3.0/.
|
||||
******************************************************************************/
|
||||
package forestry.apiculture.genetics;
|
||||
|
||||
import forestry.api.apiculture.IAlleleBeeSpecies;
|
||||
import forestry.api.apiculture.IBeeGenome;
|
||||
import forestry.api.apiculture.IBeeHousing;
|
||||
|
||||
public class JubilanceNone implements IJubilanceProvider {
|
||||
|
||||
@Override
|
||||
public boolean isJubilant(IAlleleBeeSpecies species, IBeeGenome genome, IBeeHousing housing) {
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
+36
@@ -0,0 +1,36 @@
|
||||
/*******************************************************************************
|
||||
* Copyright 2011-2014 by SirSengir
|
||||
*
|
||||
* This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.
|
||||
*
|
||||
* To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/3.0/.
|
||||
******************************************************************************/
|
||||
package forestry.apiculture.genetics;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import net.minecraft.entity.EntityLiving;
|
||||
import net.minecraft.util.AxisAlignedBB;
|
||||
|
||||
import forestry.api.apiculture.IAlleleBeeSpecies;
|
||||
import forestry.api.apiculture.IBeeGenome;
|
||||
import forestry.api.apiculture.IBeeHousing;
|
||||
|
||||
/**
|
||||
* Hermits will not produce if there are any other living creatures nearby.
|
||||
*/
|
||||
public class JubilanceProviderHermit extends JubilanceDefault {
|
||||
|
||||
@Override
|
||||
public boolean isJubilant(IAlleleBeeSpecies species, IBeeGenome genome, IBeeHousing housing) {
|
||||
AxisAlignedBB bounding = this.getBounding(genome, housing, 1.0f);
|
||||
|
||||
@SuppressWarnings("rawtypes")
|
||||
List list = housing.getWorld().getEntitiesWithinAABB(EntityLiving.class, bounding);
|
||||
if (list.size() > 0)
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
+40
@@ -0,0 +1,40 @@
|
||||
/*******************************************************************************
|
||||
* Copyright 2011-2014 by SirSengir
|
||||
*
|
||||
* This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.
|
||||
*
|
||||
* To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/3.0/.
|
||||
******************************************************************************/
|
||||
package forestry.apiculture.genetics;
|
||||
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.item.ItemStack;
|
||||
|
||||
import forestry.api.apiculture.IAlleleBeeSpecies;
|
||||
import forestry.api.apiculture.IBeeGenome;
|
||||
import forestry.api.apiculture.IBeeHousing;
|
||||
import forestry.core.utils.StackUtils;
|
||||
|
||||
public class JubilanceReqRes implements IJubilanceProvider {
|
||||
|
||||
private final ItemStack blockRequired;
|
||||
|
||||
public JubilanceReqRes(ItemStack blockRequired) {
|
||||
this.blockRequired = blockRequired;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isJubilant(IAlleleBeeSpecies species, IBeeGenome genome, IBeeHousing housing) {
|
||||
|
||||
if (blockRequired == null)
|
||||
return true;
|
||||
|
||||
Block block = housing.getWorld().getBlock(housing.getXCoord(), housing.getYCoord() - 1, housing.getZCoord());
|
||||
int meta = housing.getWorld().getBlockMetadata(housing.getXCoord(), housing.getYCoord() - 1, housing.getZCoord());
|
||||
if (StackUtils.equals(block, blockRequired) && meta == blockRequired.getItemDamage())
|
||||
return true;
|
||||
else
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,93 @@
|
||||
/*******************************************************************************
|
||||
* Copyright 2011-2014 by SirSengir
|
||||
*
|
||||
* This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.
|
||||
*
|
||||
* To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/3.0/.
|
||||
******************************************************************************/
|
||||
package forestry.apiculture.genetics;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
import forestry.api.apiculture.IBeeHousing;
|
||||
import forestry.api.genetics.IAllele;
|
||||
import forestry.api.genetics.IGenome;
|
||||
import forestry.core.proxy.Proxies;
|
||||
import forestry.core.utils.Vect;
|
||||
|
||||
public class MutationEMC extends MutationReqRes {
|
||||
|
||||
int emcRequired = 0;
|
||||
Class<?> condenserClass;
|
||||
Field emcField;
|
||||
|
||||
public MutationEMC(IAllele allele0, IAllele allele1, IAllele[] template, int chance, ItemStack blockRequired, Class<?> condenserClass, Field emcField,
|
||||
int emcRequired) {
|
||||
super(allele0, allele1, template, chance, blockRequired);
|
||||
|
||||
this.condenserClass = condenserClass;
|
||||
this.emcField = emcField;
|
||||
this.emcRequired = emcRequired;
|
||||
}
|
||||
|
||||
@Override
|
||||
public float getChance(IBeeHousing housing, IAllele allele0, IAllele allele1, IGenome genome0, IGenome genome1) {
|
||||
float chance = super.getChance(housing, allele0, allele1, genome0, genome1);
|
||||
|
||||
// If we don't have any chance, return at once.
|
||||
if (chance <= 0)
|
||||
return 0;
|
||||
|
||||
if (emcRequired <= 0)
|
||||
return chance;
|
||||
|
||||
World world = housing.getWorld();
|
||||
|
||||
Vect[] possibleTargets = new Vect[] { new Vect(housing.getXCoord() + 1, housing.getYCoord(), housing.getZCoord()),
|
||||
new Vect(housing.getXCoord() - 1, housing.getYCoord(), housing.getZCoord()),
|
||||
new Vect(housing.getXCoord(), housing.getYCoord(), housing.getZCoord() + 1),
|
||||
new Vect(housing.getXCoord(), housing.getYCoord(), housing.getZCoord() - 1) };
|
||||
|
||||
for (Vect target : possibleTargets) {
|
||||
if (!world.blockExists(target.x, target.y, target.z))
|
||||
continue;
|
||||
|
||||
TileEntity entity = world.getTileEntity(target.x, target.y, target.z);
|
||||
if (entity == null)
|
||||
continue;
|
||||
|
||||
if (!condenserClass.isInstance(entity)) {
|
||||
Proxies.log.warning("Did not find a relay at " + target.toString());
|
||||
continue;
|
||||
}
|
||||
|
||||
int emc = 0;
|
||||
try {
|
||||
emc = emcField.getInt(entity);
|
||||
} catch (Exception ex) {
|
||||
Proxies.log.warning("Failed to fetch EMC information.");
|
||||
}
|
||||
|
||||
if (emc < emcRequired * 80)
|
||||
continue;
|
||||
|
||||
boolean removedEMC = false;
|
||||
try {
|
||||
emcField.set(entity, emc - (emcRequired * 80));
|
||||
removedEMC = true;
|
||||
} catch (Exception ex) {
|
||||
Proxies.log.warning("Failed to set EMC information.");
|
||||
}
|
||||
|
||||
if (removedEMC)
|
||||
return chance;
|
||||
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
+47
@@ -0,0 +1,47 @@
|
||||
/*******************************************************************************
|
||||
* Copyright 2011-2014 by SirSengir
|
||||
*
|
||||
* This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.
|
||||
*
|
||||
* To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/3.0/.
|
||||
******************************************************************************/
|
||||
package forestry.apiculture.genetics;
|
||||
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
import forestry.api.apiculture.IBeeHousing;
|
||||
import forestry.api.genetics.IAllele;
|
||||
import forestry.api.genetics.IGenome;
|
||||
import forestry.core.utils.StackUtils;
|
||||
|
||||
public class MutationReqRes extends BeeMutation {
|
||||
|
||||
private final ItemStack blockRequired;
|
||||
|
||||
public MutationReqRes(IAllele allele0, IAllele allele1, IAllele[] template, int chance, ItemStack blockRequired) {
|
||||
super(allele0, allele1, template, chance);
|
||||
this.blockRequired = blockRequired;
|
||||
}
|
||||
|
||||
@Override
|
||||
public float getChance(IBeeHousing housing, IAllele allele0, IAllele allele1, IGenome genome0, IGenome genome1) {
|
||||
float chance = super.getChance(housing, allele0, allele1, genome0, genome1);
|
||||
|
||||
// If we have no chance anyway, we don't need to check.
|
||||
if (chance <= 0)
|
||||
return 0;
|
||||
|
||||
World world = housing.getWorld();
|
||||
if (blockRequired == null)
|
||||
return chance;
|
||||
|
||||
Block block = world.getBlock(housing.getXCoord(), housing.getYCoord() - 1, housing.getZCoord());
|
||||
int meta = world.getBlockMetadata(housing.getXCoord(), housing.getYCoord() - 1, housing.getZCoord());
|
||||
if (StackUtils.equals(block, blockRequired) && meta == blockRequired.getItemDamage())
|
||||
return chance;
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
+137
@@ -0,0 +1,137 @@
|
||||
/*******************************************************************************
|
||||
* Copyright 2011-2014 by SirSengir
|
||||
*
|
||||
* This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.
|
||||
*
|
||||
* To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/3.0/.
|
||||
******************************************************************************/
|
||||
package forestry.apiculture.genetics;
|
||||
|
||||
import java.util.Calendar;
|
||||
|
||||
import forestry.api.apiculture.IBeeHousing;
|
||||
import forestry.api.genetics.IAllele;
|
||||
import forestry.api.genetics.IGenome;
|
||||
|
||||
public class MutationTimeLimited extends BeeMutation {
|
||||
|
||||
/**
|
||||
* Fed up with Date and Calendar and their shinenigans
|
||||
*/
|
||||
public static class DayMonth {
|
||||
|
||||
public int day;
|
||||
public int month;
|
||||
|
||||
public DayMonth() {
|
||||
this.day = Calendar.getInstance().get(Calendar.DAY_OF_MONTH);
|
||||
this.month = Calendar.getInstance().get(Calendar.MONTH) + 1;
|
||||
}
|
||||
|
||||
public DayMonth(int day, int month) {
|
||||
this.day = day;
|
||||
this.month = month;
|
||||
}
|
||||
|
||||
public boolean between(DayMonth start, DayMonth end) {
|
||||
if (equals(start) || equals(end))
|
||||
return true;
|
||||
if (start.month > end.month)
|
||||
return after(start) || before(end);
|
||||
return after(start) && before(end);
|
||||
}
|
||||
|
||||
public boolean before(DayMonth other) {
|
||||
|
||||
if (other.month > this.month)
|
||||
return true;
|
||||
|
||||
if (other.month < this.month)
|
||||
return false;
|
||||
|
||||
return this.day < other.day;
|
||||
}
|
||||
|
||||
public boolean after(DayMonth other) {
|
||||
|
||||
if (other.month < this.month)
|
||||
return true;
|
||||
|
||||
if (other.month > this.month)
|
||||
return false;
|
||||
|
||||
return this.day > other.day;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
int hash = 7;
|
||||
hash = 89 * hash + this.day;
|
||||
hash = 89 * hash + this.month;
|
||||
return hash;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object obj) {
|
||||
if (obj == null)
|
||||
return false;
|
||||
if (getClass() != obj.getClass())
|
||||
return false;
|
||||
final DayMonth other = (DayMonth) obj;
|
||||
if (this.day != other.day)
|
||||
return false;
|
||||
if (this.month != other.month)
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return day + "." + month;
|
||||
}
|
||||
}
|
||||
DayMonth start;
|
||||
DayMonth end;
|
||||
|
||||
public MutationTimeLimited(IAllele allele0, IAllele allele1, IAllele[] template, int chance, DayMonth start) {
|
||||
this(allele0, allele1, template, chance, start, null);
|
||||
}
|
||||
|
||||
public MutationTimeLimited(IAllele allele0, IAllele allele1, IAllele[] template, int chance, DayMonth start, DayMonth end) {
|
||||
super(allele0, allele1, template, chance);
|
||||
this.start = start;
|
||||
this.end = end;
|
||||
}
|
||||
|
||||
@Override
|
||||
public float getChance(IBeeHousing housing, IAllele allele0, IAllele allele1, IGenome genome0, IGenome genome1) {
|
||||
float chance = super.getChance(housing, allele0, allele1, genome0, genome1);
|
||||
|
||||
if (chance == 0)
|
||||
return 0;
|
||||
|
||||
if (start == null && end == null)
|
||||
return chance;
|
||||
|
||||
DayMonth now = new DayMonth();
|
||||
|
||||
// If we are equal to start day, return chance.
|
||||
if (Calendar.getInstance().get(Calendar.DAY_OF_MONTH) == start.day && Calendar.getInstance().get(Calendar.MONTH) + 1 == start.month)
|
||||
return chance;
|
||||
|
||||
// Still here but not time span? No mutation!
|
||||
if (end == null)
|
||||
return 0;
|
||||
|
||||
// Equal to end date, return chance.
|
||||
if (Calendar.getInstance().get(Calendar.DAY_OF_MONTH) == end.day && Calendar.getInstance().get(Calendar.MONTH) + 1 == end.month)
|
||||
return chance;
|
||||
|
||||
// Still a chance we are in between
|
||||
if (now.between(start, end))
|
||||
return chance;
|
||||
|
||||
// Now we finally failed.
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,66 @@
|
||||
/*******************************************************************************
|
||||
* Copyright 2011-2014 by SirSengir
|
||||
*
|
||||
* This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.
|
||||
*
|
||||
* To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/3.0/.
|
||||
******************************************************************************/
|
||||
package forestry.apiculture.gui;
|
||||
|
||||
import net.minecraft.entity.player.InventoryPlayer;
|
||||
import net.minecraft.inventory.ICrafting;
|
||||
import net.minecraft.inventory.Slot;
|
||||
|
||||
import forestry.apiculture.gadgets.TileAlvearyPlain;
|
||||
import forestry.core.config.ForestryItem;
|
||||
import forestry.core.gui.ContainerForestry;
|
||||
import forestry.core.gui.slots.SlotClosed;
|
||||
import forestry.core.gui.slots.SlotCustom;
|
||||
|
||||
public class ContainerAlveary extends ContainerForestry {
|
||||
|
||||
private TileAlvearyPlain tile;
|
||||
|
||||
public ContainerAlveary(InventoryPlayer player, TileAlvearyPlain tile) {
|
||||
super(tile);
|
||||
|
||||
this.tile = tile;
|
||||
tile.sendNetworkUpdate();
|
||||
|
||||
// Queen/Princess
|
||||
this.addSlot(new SlotCustom(tile, TileAlvearyPlain.SLOT_QUEEN, 29, 39, new Object[] { ForestryItem.beePrincessGE, ForestryItem.beeQueenGE }));
|
||||
|
||||
// Drone
|
||||
this.addSlot(new SlotCustom(tile, TileAlvearyPlain.SLOT_DRONE, 29, 65, new Object[] { ForestryItem.beeDroneGE }));
|
||||
|
||||
// Product Inventory
|
||||
this.addSlot(new SlotClosed(tile, 2, 116, 52));
|
||||
this.addSlot(new SlotClosed(tile, 3, 137, 39));
|
||||
this.addSlot(new SlotClosed(tile, 4, 137, 65));
|
||||
this.addSlot(new SlotClosed(tile, 5, 116, 78));
|
||||
this.addSlot(new SlotClosed(tile, 6, 95, 65));
|
||||
this.addSlot(new SlotClosed(tile, 7, 95, 39));
|
||||
this.addSlot(new SlotClosed(tile, 8, 116, 26));
|
||||
|
||||
// Player inventory
|
||||
for (int i = 0; i < 3; i++)
|
||||
for (int j = 0; j < 9; j++)
|
||||
addSlot(new Slot(player, j + i * 9 + 9, 8 + j * 18, 108 + i * 18));
|
||||
// Player hotbar
|
||||
for (int i = 0; i < 9; i++)
|
||||
addSlot(new Slot(player, i, 8 + i * 18, 166));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateProgressBar(int i, int j) {
|
||||
tile.getGUINetworkData(i, j);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void detectAndSendChanges() {
|
||||
super.detectAndSendChanges();
|
||||
for (int i = 0; i < crafters.size(); i++)
|
||||
tile.sendGUINetworkData(this, (ICrafting) crafters.get(i));
|
||||
}
|
||||
|
||||
}
|
||||
+50
@@ -0,0 +1,50 @@
|
||||
/*******************************************************************************
|
||||
* Copyright 2011-2014 by SirSengir
|
||||
*
|
||||
* This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.
|
||||
*
|
||||
* To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/3.0/.
|
||||
******************************************************************************/
|
||||
package forestry.apiculture.gui;
|
||||
|
||||
import net.minecraft.inventory.ICrafting;
|
||||
import net.minecraft.inventory.IInventory;
|
||||
import net.minecraft.inventory.Slot;
|
||||
|
||||
import forestry.apiculture.gadgets.TileAlvearyHygroregulator;
|
||||
import forestry.core.gui.ContainerLiquidTanks;
|
||||
import forestry.core.gui.slots.SlotLiquidContainer;
|
||||
|
||||
public class ContainerAlvearyHygroregulator extends ContainerLiquidTanks {
|
||||
|
||||
TileAlvearyHygroregulator tile;
|
||||
|
||||
public ContainerAlvearyHygroregulator(IInventory inventory, TileAlvearyHygroregulator tile) {
|
||||
super(inventory, tile);
|
||||
|
||||
this.tile = tile;
|
||||
this.addSlot(new SlotLiquidContainer(tile, 0, 56, 38));
|
||||
|
||||
for (int i = 0; i < 3; ++i)
|
||||
for (int var4 = 0; var4 < 9; ++var4)
|
||||
this.addSlot(new Slot(inventory, var4 + i * 9 + 9, 8 + var4 * 18, 84 + i * 18));
|
||||
|
||||
for (int i = 0; i < 9; ++i)
|
||||
this.addSlot(new Slot(inventory, i, 8 + i * 18, 142));
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateProgressBar(int i, int j) {
|
||||
tile.getGUINetworkData(i, j);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void detectAndSendChanges() {
|
||||
super.detectAndSendChanges();
|
||||
|
||||
for (int i = 0; i < crafters.size(); i++)
|
||||
tile.sendGUINetworkData(this, (ICrafting) crafters.get(i));
|
||||
}
|
||||
|
||||
}
|
||||
+54
@@ -0,0 +1,54 @@
|
||||
/*******************************************************************************
|
||||
* Copyright 2011-2014 by SirSengir
|
||||
*
|
||||
* This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.
|
||||
*
|
||||
* To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/3.0/.
|
||||
******************************************************************************/
|
||||
package forestry.apiculture.gui;
|
||||
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.entity.player.InventoryPlayer;
|
||||
import net.minecraft.inventory.IInventory;
|
||||
import net.minecraft.inventory.Slot;
|
||||
|
||||
import forestry.apiculture.gadgets.TileAlvearySieve;
|
||||
import forestry.core.config.ForestryItem;
|
||||
import forestry.core.gui.ContainerForestry;
|
||||
import forestry.core.gui.slots.SlotCustom;
|
||||
|
||||
public class ContainerAlvearySieve extends ContainerForestry {
|
||||
|
||||
TileAlvearySieve tile;
|
||||
|
||||
public ContainerAlvearySieve(InventoryPlayer player, TileAlvearySieve tile) {
|
||||
super(tile.getInternalInventory());
|
||||
|
||||
this.tile = tile;
|
||||
IInventory inventory = tile.getInternalInventory();
|
||||
|
||||
addSlot(new SlotCustom(inventory, 0, 94, 52, new Object[0]).setCrafter(tile));
|
||||
addSlot(new SlotCustom(inventory, 1, 115, 39, new Object[0]).setCrafter(tile));
|
||||
addSlot(new SlotCustom(inventory, 2, 73, 39, new Object[0]).setCrafter(tile));
|
||||
addSlot(new SlotCustom(inventory, 3, 94, 26, new Object[0]).setCrafter(tile));
|
||||
|
||||
addSlot(new SlotCustom(inventory, TileAlvearySieve.SLOT_SIEVE, 43, 39, ForestryItem.craftingMaterial.getItemStack(1, 3)).setCrafter(tile));
|
||||
|
||||
// Player inventory
|
||||
for (int i = 0; i < 3; i++) {
|
||||
for (int j = 0; j < 9; j++) {
|
||||
addSlot(new Slot(player, j + i * 9 + 9, 8 + j * 18, 87 + i * 18));
|
||||
}
|
||||
}
|
||||
// Player hotbar
|
||||
for (int i = 0; i < 9; i++) {
|
||||
addSlot(new Slot(player, i, 8 + i * 18, 145));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canInteractWith(EntityPlayer entityplayer) {
|
||||
return tile.isUseableByPlayer(entityplayer);
|
||||
}
|
||||
}
|
||||
+41
@@ -0,0 +1,41 @@
|
||||
/*******************************************************************************
|
||||
* Copyright 2011-2014 by SirSengir
|
||||
*
|
||||
* This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.
|
||||
*
|
||||
* To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/3.0/.
|
||||
******************************************************************************/
|
||||
package forestry.apiculture.gui;
|
||||
|
||||
import net.minecraft.entity.player.InventoryPlayer;
|
||||
import net.minecraft.inventory.Slot;
|
||||
|
||||
import forestry.api.apiculture.BeeManager;
|
||||
import forestry.apiculture.gadgets.TileAlvearySwarmer;
|
||||
import forestry.core.gui.ContainerForestry;
|
||||
import forestry.core.gui.slots.SlotCustom;
|
||||
|
||||
public class ContainerAlvearySwarmer extends ContainerForestry {
|
||||
|
||||
public ContainerAlvearySwarmer(InventoryPlayer player, TileAlvearySwarmer tile) {
|
||||
super(tile);
|
||||
|
||||
this.addSlot(new SlotCustom(tile, 0, 79, 52, getInducerItems()));
|
||||
this.addSlot(new SlotCustom(tile, 1, 100, 39, getInducerItems()));
|
||||
this.addSlot(new SlotCustom(tile, 2, 58, 39, getInducerItems()));
|
||||
this.addSlot(new SlotCustom(tile, 3, 79, 26, getInducerItems()));
|
||||
|
||||
// Player inventory
|
||||
for (int i = 0; i < 3; i++)
|
||||
for (int j = 0; j < 9; j++)
|
||||
addSlot(new Slot(player, j + i * 9 + 9, 8 + j * 18, 87 + i * 18));
|
||||
// Player hotbar
|
||||
for (int i = 0; i < 9; i++)
|
||||
addSlot(new Slot(player, i, 8 + i * 18, 145));
|
||||
|
||||
}
|
||||
|
||||
private Object[] getInducerItems() {
|
||||
return BeeManager.inducers.keySet().toArray(new Object[0]);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,86 @@
|
||||
/*******************************************************************************
|
||||
* Copyright 2011-2014 by SirSengir
|
||||
*
|
||||
* This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.
|
||||
*
|
||||
* To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/3.0/.
|
||||
******************************************************************************/
|
||||
package forestry.apiculture.gui;
|
||||
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.entity.player.InventoryPlayer;
|
||||
import net.minecraft.inventory.ICrafting;
|
||||
import net.minecraft.inventory.IInventory;
|
||||
import net.minecraft.inventory.Slot;
|
||||
|
||||
import forestry.api.apiculture.IHiveFrame;
|
||||
import forestry.apiculture.gadgets.TileBeehouse;
|
||||
import forestry.core.config.ForestryItem;
|
||||
import forestry.core.gui.ContainerForestry;
|
||||
import forestry.core.gui.slots.SlotClosed;
|
||||
import forestry.core.gui.slots.SlotCustom;
|
||||
import forestry.core.utils.Utils;
|
||||
|
||||
public class ContainerApiary extends ContainerForestry {
|
||||
|
||||
private final TileBeehouse tile;
|
||||
|
||||
public ContainerApiary(InventoryPlayer player, TileBeehouse tile, boolean hasFrames) {
|
||||
super(tile.getInternalInventory());
|
||||
|
||||
this.tile = tile;
|
||||
tile.sendNetworkUpdate();
|
||||
IInventory inventory = tile.getInternalInventory();
|
||||
|
||||
// Queen/Princess
|
||||
this.addSlot(new SlotCustom(inventory, TileBeehouse.SLOT_QUEEN, 29, 39, ForestryItem.beePrincessGE, ForestryItem.beeQueenGE));
|
||||
|
||||
// Drone
|
||||
this.addSlot(new SlotCustom(inventory, TileBeehouse.SLOT_DRONE, 29, 65, ForestryItem.beeDroneGE));
|
||||
|
||||
// Frames
|
||||
if (hasFrames) {
|
||||
this.addSlot(new SlotCustom(inventory, TileBeehouse.SLOT_FRAMES_1, 66, 23, IHiveFrame.class));
|
||||
this.addSlot(new SlotCustom(inventory, TileBeehouse.SLOT_FRAMES_1 + 1, 66, 52, IHiveFrame.class));
|
||||
this.addSlot(new SlotCustom(inventory, TileBeehouse.SLOT_FRAMES_1 + 2, 66, 81, IHiveFrame.class));
|
||||
}
|
||||
|
||||
// Product Inventory
|
||||
this.addSlot(new SlotClosed(inventory, 2, 116, 52));
|
||||
this.addSlot(new SlotClosed(inventory, 3, 137, 39));
|
||||
this.addSlot(new SlotClosed(inventory, 4, 137, 65));
|
||||
this.addSlot(new SlotClosed(inventory, 5, 116, 78));
|
||||
this.addSlot(new SlotClosed(inventory, 6, 95, 65));
|
||||
this.addSlot(new SlotClosed(inventory, 7, 95, 39));
|
||||
this.addSlot(new SlotClosed(inventory, 8, 116, 26));
|
||||
|
||||
// Player inventory
|
||||
for (int i1 = 0; i1 < 3; i1++) {
|
||||
for (int l1 = 0; l1 < 9; l1++) {
|
||||
addSlot(new Slot(player, l1 + i1 * 9 + 9, 8 + l1 * 18, 108 + i1 * 18));
|
||||
}
|
||||
}
|
||||
// Player hotbar
|
||||
for (int j1 = 0; j1 < 9; j1++) {
|
||||
addSlot(new Slot(player, j1, 8 + j1 * 18, 166));
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateProgressBar(int i, int j) {
|
||||
tile.getGUINetworkData(i, j);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void detectAndSendChanges() {
|
||||
super.detectAndSendChanges();
|
||||
for (int i = 0; i < crafters.size(); i++) {
|
||||
tile.sendGUINetworkData(this, (ICrafting) crafters.get(i));
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canInteractWith(EntityPlayer entityplayer) {
|
||||
return Utils.isUseableByPlayer(entityplayer, tile, tile.getWorld(), tile.xCoord, tile.yCoord, tile.zCoord);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,80 @@
|
||||
/*******************************************************************************
|
||||
* Copyright 2011-2014 by SirSengir
|
||||
*
|
||||
* This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.
|
||||
*
|
||||
* To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/3.0/.
|
||||
******************************************************************************/
|
||||
package forestry.apiculture.gui;
|
||||
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.entity.player.InventoryPlayer;
|
||||
import net.minecraft.item.ItemStack;
|
||||
|
||||
import forestry.apiculture.items.ItemBeeGE;
|
||||
import forestry.apiculture.items.ItemBeealyzer.BeealyzerInventory;
|
||||
import forestry.core.config.ForestryItem;
|
||||
import forestry.core.gui.ContainerItemInventory;
|
||||
import forestry.core.gui.slots.SlotCustom;
|
||||
import forestry.core.proxy.Proxies;
|
||||
|
||||
public class ContainerBeealyzer extends ContainerItemInventory {
|
||||
|
||||
BeealyzerInventory inventory;
|
||||
|
||||
public ContainerBeealyzer(InventoryPlayer inventoryplayer, BeealyzerInventory inventory) {
|
||||
super(inventory, inventoryplayer.player);
|
||||
|
||||
this.inventory = inventory;
|
||||
|
||||
// Energy
|
||||
this.addSlot(new SlotCustom(inventory, BeealyzerInventory.SLOT_ENERGY, 172, 8, new Object[] { ForestryItem.honeydew, ForestryItem.honeyDrop }));
|
||||
|
||||
// Bee to analyze
|
||||
this.addSlot(new SlotCustom(inventory, BeealyzerInventory.SLOT_SPECIMEN, 172, 26, new Object[] { ItemBeeGE.class }));
|
||||
|
||||
// Analyzed bee
|
||||
this.addSlot(new SlotCustom(inventory, BeealyzerInventory.SLOT_ANALYZE_1, 172, 57, new Object[] { ItemBeeGE.class }));
|
||||
this.addSlot(new SlotCustom(inventory, BeealyzerInventory.SLOT_ANALYZE_2, 172, 75, new Object[] { ItemBeeGE.class }));
|
||||
this.addSlot(new SlotCustom(inventory, BeealyzerInventory.SLOT_ANALYZE_3, 172, 93, new Object[] { ItemBeeGE.class }));
|
||||
this.addSlot(new SlotCustom(inventory, BeealyzerInventory.SLOT_ANALYZE_4, 172, 111, new Object[] { ItemBeeGE.class }));
|
||||
this.addSlot(new SlotCustom(inventory, BeealyzerInventory.SLOT_ANALYZE_5, 172, 129, new Object[] { ItemBeeGE.class }));
|
||||
|
||||
// Player inventory
|
||||
for (int i1 = 0; i1 < 3; i1++)
|
||||
for (int l1 = 0; l1 < 9; l1++)
|
||||
addSecuredSlot(inventoryplayer, l1 + i1 * 9 + 9, 18 + l1 * 18, 156 + i1 * 18);
|
||||
// Player hotbar
|
||||
for (int j1 = 0; j1 < 9; j1++)
|
||||
addSecuredSlot(inventoryplayer, j1, 18 + j1 * 18, 214);
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onContainerClosed(EntityPlayer entityplayer) {
|
||||
|
||||
if (!Proxies.common.isSimulating(entityplayer.worldObj))
|
||||
return;
|
||||
|
||||
// Last slot is the energy slot, so we don't save that one.
|
||||
for (int i = 0; i < inventory.getSizeInventory(); i++) {
|
||||
if (i == BeealyzerInventory.SLOT_ENERGY)
|
||||
continue;
|
||||
ItemStack stack = inventory.getStackInSlot(i);
|
||||
if (stack == null)
|
||||
continue;
|
||||
|
||||
Proxies.common.dropItemPlayer(entityplayer, stack);
|
||||
inventory.setInventorySlotContents(i, null);
|
||||
}
|
||||
|
||||
inventory.onGuiSaved(entityplayer);
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean isAcceptedItem(EntityPlayer player, ItemStack stack) {
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
+74
@@ -0,0 +1,74 @@
|
||||
/*******************************************************************************
|
||||
* Copyright 2011-2014 by SirSengir
|
||||
*
|
||||
* This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.
|
||||
*
|
||||
* To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/3.0/.
|
||||
******************************************************************************/
|
||||
package forestry.apiculture.gui;
|
||||
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.entity.player.InventoryPlayer;
|
||||
import net.minecraft.item.ItemStack;
|
||||
|
||||
import forestry.apiculture.items.ItemBeeGE;
|
||||
import forestry.apiculture.items.ItemBiomefinder;
|
||||
import forestry.apiculture.items.ItemBiomefinder.BiomefinderInventory;
|
||||
import forestry.core.config.ForestryItem;
|
||||
import forestry.core.gui.ContainerItemInventory;
|
||||
import forestry.core.gui.slots.SlotCustom;
|
||||
import forestry.core.proxy.Proxies;
|
||||
|
||||
public class ContainerHabitatLocator extends ContainerItemInventory {
|
||||
|
||||
public BiomefinderInventory inventory;
|
||||
|
||||
public ContainerHabitatLocator(InventoryPlayer inventoryplayer, BiomefinderInventory inventory) {
|
||||
super(inventory, inventoryplayer.player);
|
||||
|
||||
this.inventory = inventory;
|
||||
|
||||
// Energy
|
||||
this.addSlot(new SlotCustom(inventory, 2, 152, 8, new Object[] { ForestryItem.honeydew, ForestryItem.honeyDrop }));
|
||||
|
||||
// Bee to analyze
|
||||
this.addSlot(new SlotCustom(inventory, 0, 152, 32, new Object[] { ItemBeeGE.class }));
|
||||
// Analyzed bee
|
||||
this.addSlot(new SlotCustom(inventory, 1, 152, 75, new Object[] { ItemBeeGE.class }));
|
||||
|
||||
// Player inventory
|
||||
for (int i1 = 0; i1 < 3; i1++)
|
||||
for (int l1 = 0; l1 < 9; l1++)
|
||||
addSecuredSlot(inventoryplayer, l1 + i1 * 9 + 9, 8 + l1 * 18, 102 + i1 * 18);
|
||||
// Player hotbar
|
||||
for (int j1 = 0; j1 < 9; j1++)
|
||||
addSecuredSlot(inventoryplayer, j1, 8 + j1 * 18, 160);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onContainerClosed(EntityPlayer entityplayer) {
|
||||
|
||||
if (!Proxies.common.isSimulating(entityplayer.worldObj))
|
||||
return;
|
||||
|
||||
((ItemBiomefinder) ForestryItem.biomeFinder.item()).startBiomeSearch(entityplayer.worldObj, entityplayer, inventory.biomesToSearch);
|
||||
|
||||
for (int i = 0; i < inventory.getSizeInventory() - 1; i++) {
|
||||
ItemStack stack = inventory.getStackInSlot(i);
|
||||
if (stack == null)
|
||||
continue;
|
||||
|
||||
Proxies.common.dropItemPlayer(entityplayer, stack);
|
||||
inventory.setInventorySlotContents(i, null);
|
||||
}
|
||||
|
||||
inventory.onGuiSaved(entityplayer);
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean isAcceptedItem(EntityPlayer player, ItemStack stack) {
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
+121
@@ -0,0 +1,121 @@
|
||||
/*******************************************************************************
|
||||
* Copyright 2011-2014 by SirSengir
|
||||
*
|
||||
* This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.
|
||||
*
|
||||
* To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/3.0/.
|
||||
******************************************************************************/
|
||||
package forestry.apiculture.gui;
|
||||
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.entity.player.InventoryPlayer;
|
||||
import net.minecraft.inventory.Slot;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
import forestry.apiculture.items.ItemBeeGE;
|
||||
import forestry.apiculture.items.ItemImprinter.ImprinterInventory;
|
||||
import forestry.core.gui.ContainerForestry;
|
||||
import forestry.core.gui.IGuiSelectable;
|
||||
import forestry.core.gui.slots.SlotCustom;
|
||||
import forestry.core.network.PacketIds;
|
||||
import forestry.core.network.PacketPayload;
|
||||
import forestry.core.network.PacketUpdate;
|
||||
import forestry.core.proxy.Proxies;
|
||||
|
||||
public class ContainerImprinter extends ContainerForestry implements IGuiSelectable {
|
||||
|
||||
public ImprinterInventory inventory;
|
||||
private boolean isNetSynched = false;
|
||||
|
||||
public ContainerImprinter(InventoryPlayer inventoryplayer, ImprinterInventory inventory) {
|
||||
super(inventory);
|
||||
|
||||
this.inventory = inventory;
|
||||
// Input
|
||||
this.addSlot(new SlotCustom(inventory, 0, 152, 12, new Object[] { ItemBeeGE.class }));
|
||||
// Output
|
||||
this.addSlot(new SlotCustom(inventory, 1, 152, 72, new Object[] { ItemBeeGE.class }));
|
||||
|
||||
// Player inventory
|
||||
for (int i1 = 0; i1 < 3; i1++)
|
||||
for (int l1 = 0; l1 < 9; l1++)
|
||||
addSlot(new Slot(inventoryplayer, l1 + i1 * 9 + 9, 8 + l1 * 18, 103 + i1 * 18));
|
||||
// Player hotbar
|
||||
for (int j1 = 0; j1 < 9; j1++)
|
||||
addSlot(new Slot(inventoryplayer, j1, 8 + j1 * 18, 161));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onContainerClosed(EntityPlayer entityplayer) {
|
||||
|
||||
if (!Proxies.common.isSimulating(entityplayer.worldObj))
|
||||
return;
|
||||
|
||||
// Drop everything still in there.
|
||||
for (int i = 0; i < inventory.getSizeInventory(); i++) {
|
||||
ItemStack stack = inventory.getStackInSlot(i);
|
||||
if (stack == null)
|
||||
continue;
|
||||
|
||||
Proxies.common.dropItemPlayer(entityplayer, stack);
|
||||
inventory.setInventorySlotContents(i, null);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public void advanceSelection(int index, World world) {
|
||||
PacketPayload payload = new PacketPayload(2, 0, 0);
|
||||
payload.intPayload[0] = index;
|
||||
payload.intPayload[1] = 0;
|
||||
sendSelectionChange(payload);
|
||||
}
|
||||
|
||||
public void regressSelection(int index, World world) {
|
||||
PacketPayload payload = new PacketPayload(2, 0, 0);
|
||||
payload.intPayload[0] = index;
|
||||
payload.intPayload[1] = 1;
|
||||
sendSelectionChange(payload);
|
||||
}
|
||||
|
||||
private void sendSelectionChange(PacketPayload payload) {
|
||||
PacketUpdate packet = new PacketUpdate(PacketIds.GUI_SELECTION_CHANGE, payload);
|
||||
Proxies.net.sendToServer(packet);
|
||||
isNetSynched = false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setSelection(PacketUpdate packet) {
|
||||
inventory.setPrimaryIndex(packet.payload.intPayload[0]);
|
||||
inventory.setSecondaryIndex(packet.payload.intPayload[1]);
|
||||
}
|
||||
|
||||
public void updateContainer(World world) {
|
||||
if (!isNetSynched && !Proxies.common.isSimulating(world)) {
|
||||
isNetSynched = true;
|
||||
Proxies.net.sendToServer(new PacketUpdate(PacketIds.IMPRINT_SELECTION_GET));
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void handleSelectionChange(EntityPlayer player, PacketUpdate packet) {
|
||||
|
||||
if (packet.payload.intPayload[1] == 0) {
|
||||
if (packet.payload.intPayload[0] == 0)
|
||||
inventory.advancePrimary();
|
||||
else
|
||||
inventory.advanceSecondary();
|
||||
|
||||
} else if (packet.payload.intPayload[0] == 0)
|
||||
inventory.regressPrimary();
|
||||
else
|
||||
inventory.regressSecondary();
|
||||
}
|
||||
|
||||
public void sendSelection(EntityPlayer player) {
|
||||
PacketPayload payload = new PacketPayload(2, 0, 0);
|
||||
payload.intPayload[0] = inventory.getPrimaryIndex();
|
||||
payload.intPayload[1] = inventory.getSecondaryIndex();
|
||||
Proxies.net.sendToPlayer(new PacketUpdate(PacketIds.GUI_SELECTION, payload), player);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,65 @@
|
||||
/*******************************************************************************
|
||||
* Copyright 2011-2014 by SirSengir
|
||||
*
|
||||
* This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.
|
||||
*
|
||||
* To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/3.0/.
|
||||
******************************************************************************/
|
||||
package forestry.apiculture.gui;
|
||||
|
||||
import net.minecraft.entity.player.InventoryPlayer;
|
||||
|
||||
import forestry.apiculture.gadgets.TileAlvearyPlain;
|
||||
import forestry.core.config.Defaults;
|
||||
import forestry.core.gui.GuiForestry;
|
||||
import forestry.core.utils.EnumTankLevel;
|
||||
import forestry.core.utils.StringUtil;
|
||||
import forestry.core.utils.Utils;
|
||||
|
||||
public class GuiAlveary extends GuiForestry<TileAlvearyPlain> {
|
||||
|
||||
public GuiAlveary(InventoryPlayer inventory, TileAlvearyPlain tile) {
|
||||
super(Defaults.TEXTURE_PATH_GUI + "/alveary.png", new ContainerAlveary(inventory, tile), tile);
|
||||
|
||||
ySize = 190;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void drawGuiContainerForegroundLayer(int mouseX, int mouseY) {
|
||||
super.drawGuiContainerForegroundLayer(mouseX, mouseY);
|
||||
String title = StringUtil.localize("tile." + tile.getInventoryName());
|
||||
this.fontRendererObj.drawString(title, getCenteredOffset(title), 6, fontColor.get("gui.title"));
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void drawGuiContainerBackgroundLayer(float var1, int mouseX, int mouseY) {
|
||||
super.drawGuiContainerBackgroundLayer(var1, mouseX, mouseY);
|
||||
|
||||
TileAlvearyPlain machine = tile;
|
||||
drawHealthMeter(guiLeft + 20, guiTop + 37, machine.getHealthScaled(46), Utils.rateTankLevel(machine.getHealthScaled(100)));
|
||||
}
|
||||
|
||||
private void drawHealthMeter(int x, int y, int height, EnumTankLevel rated) {
|
||||
int i = 176;
|
||||
int k = 0;
|
||||
switch (rated) {
|
||||
case EMPTY:
|
||||
break;
|
||||
case LOW:
|
||||
i += 4;
|
||||
break;
|
||||
case MEDIUM:
|
||||
i += 8;
|
||||
break;
|
||||
case HIGH:
|
||||
i += 12;
|
||||
break;
|
||||
case MAXIMUM:
|
||||
i += 16;
|
||||
break;
|
||||
}
|
||||
|
||||
this.drawTexturedModalRect(x, y + 46 - height, i, k + 46 - height, 4, height);
|
||||
}
|
||||
|
||||
}
|
||||
+33
@@ -0,0 +1,33 @@
|
||||
/*******************************************************************************
|
||||
* Copyright 2011-2014 by SirSengir
|
||||
*
|
||||
* This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.
|
||||
*
|
||||
* To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/3.0/.
|
||||
******************************************************************************/
|
||||
package forestry.apiculture.gui;
|
||||
|
||||
import net.minecraft.entity.player.InventoryPlayer;
|
||||
|
||||
import forestry.apiculture.gadgets.TileAlvearyHygroregulator;
|
||||
import forestry.core.config.Defaults;
|
||||
import forestry.core.gui.GuiForestry;
|
||||
import forestry.core.gui.widgets.TankWidget;
|
||||
import forestry.core.utils.StringUtil;
|
||||
|
||||
public class GuiAlvearyHygroregulator extends GuiForestry<TileAlvearyHygroregulator> {
|
||||
|
||||
public GuiAlvearyHygroregulator(InventoryPlayer inventory, TileAlvearyHygroregulator tile) {
|
||||
super(Defaults.TEXTURE_PATH_GUI + "/hygroregulator.png", new ContainerAlvearyHygroregulator(inventory, tile));
|
||||
|
||||
widgetManager.add(new TankWidget(this.widgetManager, 104, 17, 0));
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void drawGuiContainerForegroundLayer(int mouseX, int mouseY) {
|
||||
super.drawGuiContainerForegroundLayer(mouseX, mouseY);
|
||||
String name = StringUtil.localize("tile.alveary.5");
|
||||
this.fontRendererObj.drawString(name, getCenteredOffset(name), 6, fontColor.get("gui.title"));
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
/*******************************************************************************
|
||||
* Copyright 2011-2014 by SirSengir
|
||||
*
|
||||
* This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.
|
||||
*
|
||||
* To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/3.0/.
|
||||
******************************************************************************/
|
||||
package forestry.apiculture.gui;
|
||||
|
||||
import net.minecraft.entity.player.InventoryPlayer;
|
||||
|
||||
import forestry.apiculture.gadgets.TileAlvearySieve;
|
||||
import forestry.core.config.Defaults;
|
||||
import forestry.core.gui.GuiForestry;
|
||||
|
||||
public class GuiAlvearySieve extends GuiForestry<TileAlvearySieve> {
|
||||
|
||||
public GuiAlvearySieve(InventoryPlayer inventory, TileAlvearySieve tile) {
|
||||
super(Defaults.TEXTURE_PATH_GUI + "/sieve.png", new ContainerAlvearySieve(inventory, tile));
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
/*******************************************************************************
|
||||
* Copyright 2011-2014 by SirSengir
|
||||
*
|
||||
* This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.
|
||||
*
|
||||
* To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/3.0/.
|
||||
******************************************************************************/
|
||||
package forestry.apiculture.gui;
|
||||
|
||||
import net.minecraft.entity.player.InventoryPlayer;
|
||||
|
||||
import forestry.apiculture.gadgets.TileAlvearySwarmer;
|
||||
import forestry.core.config.Defaults;
|
||||
import forestry.core.gui.GuiForestry;
|
||||
|
||||
public class GuiAlvearySwarmer extends GuiForestry<TileAlvearySwarmer> {
|
||||
|
||||
public GuiAlvearySwarmer(InventoryPlayer inventory, TileAlvearySwarmer tile) {
|
||||
super(Defaults.TEXTURE_PATH_GUI + "/swarmer.png", new ContainerAlvearySwarmer(inventory, tile));
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,72 @@
|
||||
/*******************************************************************************
|
||||
* Copyright 2011-2014 by SirSengir
|
||||
*
|
||||
* This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.
|
||||
*
|
||||
* To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/3.0/.
|
||||
******************************************************************************/
|
||||
package forestry.apiculture.gui;
|
||||
|
||||
import net.minecraft.entity.player.InventoryPlayer;
|
||||
|
||||
import forestry.apiculture.gadgets.TileApiary;
|
||||
import forestry.apiculture.gadgets.TileBeehouse;
|
||||
import forestry.core.config.Defaults;
|
||||
import forestry.core.gui.GuiForestry;
|
||||
import forestry.core.utils.EnumTankLevel;
|
||||
import forestry.core.utils.StringUtil;
|
||||
import forestry.core.utils.Utils;
|
||||
|
||||
public class GuiApiary extends GuiForestry<TileBeehouse> {
|
||||
|
||||
public GuiApiary(InventoryPlayer inventory, TileApiary tile) {
|
||||
super(Defaults.TEXTURE_PATH_GUI + "/apiary.png", new ContainerApiary(inventory, tile, true), tile);
|
||||
|
||||
ySize = 190;
|
||||
}
|
||||
|
||||
public GuiApiary(InventoryPlayer inventory, TileBeehouse tile) {
|
||||
super(Defaults.TEXTURE_PATH_GUI + "/alveary.png", new ContainerApiary(inventory, tile, false), tile);
|
||||
|
||||
ySize = 190;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void drawGuiContainerForegroundLayer(int mouseX, int mouseY) {
|
||||
super.drawGuiContainerForegroundLayer(mouseX, mouseY);
|
||||
String name = StringUtil.localize("tile.for." + tile.getInventoryName());
|
||||
this.fontRendererObj.drawString(name, getCenteredOffset(name), 6, fontColor.get("gui.title"));
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void drawGuiContainerBackgroundLayer(float var1, int mouseX, int mouseY) {
|
||||
super.drawGuiContainerBackgroundLayer(var1, mouseX, mouseY);
|
||||
|
||||
TileBeehouse machine = tile;
|
||||
drawHealthMeter(guiLeft + 20, guiTop + 37, machine.getHealthScaled(46), Utils.rateTankLevel(machine.getHealthScaled(100)));
|
||||
}
|
||||
|
||||
private void drawHealthMeter(int x, int y, int height, EnumTankLevel rated) {
|
||||
int i = 176;
|
||||
int k = 0;
|
||||
switch (rated) {
|
||||
case EMPTY:
|
||||
break;
|
||||
case LOW:
|
||||
i += 4;
|
||||
break;
|
||||
case MEDIUM:
|
||||
i += 8;
|
||||
break;
|
||||
case HIGH:
|
||||
i += 12;
|
||||
break;
|
||||
case MAXIMUM:
|
||||
i += 16;
|
||||
break;
|
||||
}
|
||||
|
||||
this.drawTexturedModalRect(x, y + 46 - height, i, k + 46 - height, 4, height);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,321 @@
|
||||
/*******************************************************************************
|
||||
* Copyright 2011-2014 by SirSengir
|
||||
*
|
||||
* This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.
|
||||
*
|
||||
* To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/3.0/.
|
||||
******************************************************************************/
|
||||
package forestry.apiculture.gui;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.item.ItemStack;
|
||||
|
||||
import forestry.api.apiculture.EnumBeeChromosome;
|
||||
import forestry.api.apiculture.EnumBeeType;
|
||||
import forestry.api.apiculture.IAlleleBeeEffect;
|
||||
import forestry.api.apiculture.IBee;
|
||||
import forestry.api.genetics.AlleleManager;
|
||||
import forestry.api.genetics.IAlleleFlowers;
|
||||
import forestry.api.genetics.IAlleleInteger;
|
||||
import forestry.apiculture.items.ItemBeeGE;
|
||||
import forestry.apiculture.items.ItemBeealyzer.BeealyzerInventory;
|
||||
import forestry.core.config.ForestryItem;
|
||||
import forestry.core.genetics.AlleleArea;
|
||||
import forestry.core.genetics.AlleleBoolean;
|
||||
import forestry.core.genetics.AlleleTolerance;
|
||||
import forestry.core.genetics.ClimateHelper;
|
||||
import forestry.core.gui.GuiAlyzer;
|
||||
import forestry.core.utils.StringUtil;
|
||||
import forestry.core.utils.Vect;
|
||||
import forestry.plugins.PluginApiculture;
|
||||
|
||||
public class GuiBeealyzer extends GuiAlyzer {
|
||||
|
||||
private ItemStack[] tempProductList;
|
||||
|
||||
public GuiBeealyzer(EntityPlayer player, BeealyzerInventory inventory) {
|
||||
super(AlleleManager.alleleRegistry.getSpeciesRoot("rootBees"), player,
|
||||
new ContainerBeealyzer(player.inventory, inventory), inventory, 1, inventory.getSizeInventory());
|
||||
|
||||
xSize = 196;
|
||||
ySize = 238;
|
||||
|
||||
ArrayList<ItemStack> beeList = new ArrayList<ItemStack>();
|
||||
((ItemBeeGE) ForestryItem.beeDroneGE.item()).addCreativeItems(beeList, false);
|
||||
for (ItemStack beeStack : beeList)
|
||||
iconStacks.put(PluginApiculture.beeInterface.getMember(beeStack).getIdent(), beeStack);
|
||||
|
||||
breedingTracker = PluginApiculture.beeInterface.getBreedingTracker(player.worldObj, player.getGameProfile().getId());
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void drawGuiContainerBackgroundLayer(float var1, int mouseX, int mouseY) {
|
||||
super.drawGuiContainerBackgroundLayer(var1, mouseX, mouseY);
|
||||
|
||||
int page = 0;
|
||||
IBee bee = null;
|
||||
EnumBeeType beeType = EnumBeeType.DRONE;
|
||||
for (int k = 1; k < BeealyzerInventory.SLOT_ANALYZE_5 + 1; k++) {
|
||||
if (k == BeealyzerInventory.SLOT_ENERGY)
|
||||
continue;
|
||||
|
||||
if (inventory.getStackInSlot(k) == null)
|
||||
continue;
|
||||
bee = PluginApiculture.beeInterface.getMember(inventory.getStackInSlot(k));
|
||||
beeType = PluginApiculture.beeInterface.getType(inventory.getStackInSlot(k));
|
||||
if (bee == null || !bee.isAnalyzed())
|
||||
continue;
|
||||
|
||||
page = k;
|
||||
break;
|
||||
}
|
||||
|
||||
switch (page) {
|
||||
case 1:
|
||||
drawAnalyticsPage1(bee, beeType);
|
||||
break;
|
||||
case 2:
|
||||
drawAnalyticsPage2(bee, beeType);
|
||||
break;
|
||||
case 3:
|
||||
drawAnalyticsPage3(bee, beeType);
|
||||
break;
|
||||
case 4:
|
||||
drawAnalyticsPage4(bee);
|
||||
break;
|
||||
case 6:
|
||||
drawAnalyticsPageClassification(bee);
|
||||
break;
|
||||
default:
|
||||
drawAnalyticsOverview();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private void drawAnalyticsOverview() {
|
||||
|
||||
startPage();
|
||||
|
||||
newLine();
|
||||
String title = StringUtil.localize("gui.beealyzer").toUpperCase();
|
||||
drawCenteredLine(title, 8, 158);
|
||||
newLine();
|
||||
|
||||
fontRendererObj.drawSplitString(StringUtil.localize("gui.beealyzer.help"), (int) ((guiLeft + COLUMN_0 + 4) * (1 / factor)),
|
||||
(int) ((guiTop + 42) * (1 / factor)), (int) (158 * (1 / factor)), fontColor.get("gui.screen"));
|
||||
newLine();
|
||||
newLine();
|
||||
newLine();
|
||||
newLine();
|
||||
|
||||
drawLine(StringUtil.localize("gui.beealyzer.overview") + ":", COLUMN_0 + 4);
|
||||
newLine();
|
||||
drawLine("I : " + StringUtil.localize("gui.general"), COLUMN_0 + 4);
|
||||
newLine();
|
||||
drawLine("II : " + StringUtil.localize("gui.environment"), COLUMN_0 + 4);
|
||||
newLine();
|
||||
drawLine("III: " + StringUtil.localize("gui.produce"), COLUMN_0 + 4);
|
||||
newLine();
|
||||
drawLine("IV : " + StringUtil.localize("gui.evolution"), COLUMN_0 + 4);
|
||||
|
||||
newLine();
|
||||
|
||||
String mode = breedingTracker.getModeName();
|
||||
if (mode != null && !mode.isEmpty()) {
|
||||
newLine();
|
||||
String rules = StringUtil.localize("gui.beealyzer.behaviour") + ": " + StringUtil.capitalize(mode);
|
||||
drawLine(rules, 8 + getCenteredOffset(title, 158), fontColor.get("gui.beealyzer.binomial"));
|
||||
}
|
||||
|
||||
endPage();
|
||||
|
||||
}
|
||||
|
||||
private void drawAnalyticsPage1(IBee bee, EnumBeeType type) {
|
||||
|
||||
startPage(COLUMN_0, COLUMN_1, COLUMN_2);
|
||||
|
||||
drawLine(StringUtil.localize("gui.active"), COLUMN_1);
|
||||
drawLine(StringUtil.localize("gui.inactive"), COLUMN_2);
|
||||
|
||||
newLine();
|
||||
newLine();
|
||||
|
||||
drawSpeciesRow(StringUtil.localize("gui.species"), bee, EnumBeeChromosome.SPECIES);
|
||||
|
||||
drawRow(StringUtil.localize("gui.lifespan"), bee.getGenome().getActiveAllele(EnumBeeChromosome.LIFESPAN.ordinal()).getName(),
|
||||
bee.getGenome().getInactiveAllele(EnumBeeChromosome.LIFESPAN.ordinal()).getName(), bee,
|
||||
EnumBeeChromosome.LIFESPAN);
|
||||
|
||||
drawRow(StringUtil.localize("gui.speed"), bee.getGenome().getActiveAllele(EnumBeeChromosome.SPEED.ordinal()).getName(),
|
||||
bee.getGenome().getInactiveAllele(EnumBeeChromosome.SPEED.ordinal()).getName(), bee, EnumBeeChromosome.SPEED);
|
||||
|
||||
drawRow(StringUtil.localize("gui.pollination"), bee.getGenome().getActiveAllele(EnumBeeChromosome.FLOWERING.ordinal()).getName(),
|
||||
bee.getGenome().getInactiveAllele(EnumBeeChromosome.FLOWERING.ordinal()).getName(), bee,
|
||||
EnumBeeChromosome.FLOWERING);
|
||||
|
||||
drawRow(StringUtil.localize("gui.flowers"), StringUtil.localize(bee.getGenome().getFlowerProvider().getDescription()),
|
||||
StringUtil.localize(((IAlleleFlowers) bee.getGenome().getInactiveAllele(EnumBeeChromosome.FLOWER_PROVIDER.ordinal())).getProvider()
|
||||
.getDescription()), bee, EnumBeeChromosome.FLOWER_PROVIDER);
|
||||
|
||||
drawLine(StringUtil.localize("gui.fertility"), COLUMN_0);
|
||||
drawFertilityInfo(bee.getGenome().getFertility(), COLUMN_1, getColorCoding(bee.getGenome().getActiveAllele(EnumBeeChromosome.FERTILITY.ordinal())
|
||||
.isDominant()), 0);
|
||||
drawFertilityInfo(((IAlleleInteger) bee.getGenome().getInactiveAllele(EnumBeeChromosome.FERTILITY.ordinal())).getValue(), COLUMN_2, getColorCoding(bee
|
||||
.getGenome().getInactiveAllele(EnumBeeChromosome.FERTILITY.ordinal()).isDominant()), 0);
|
||||
|
||||
newLine();
|
||||
|
||||
int[] areaAr = bee.getGenome().getTerritory();
|
||||
Vect area = new Vect(areaAr[0], areaAr[1], areaAr[2]);
|
||||
drawRow(StringUtil.localize("gui.area"), area.toString(), ((AlleleArea) bee.getGenome().getInactiveAllele(EnumBeeChromosome.TERRITORY.ordinal()))
|
||||
.getArea().toString(), bee, EnumBeeChromosome.TERRITORY);
|
||||
|
||||
drawRow(StringUtil.localize("gui.effect"), StringUtil.localize(bee.getGenome().getEffect().getName()),
|
||||
StringUtil.localize(((IAlleleBeeEffect) bee.getGenome().getInactiveAllele(EnumBeeChromosome.EFFECT.ordinal())).getName()), bee,
|
||||
EnumBeeChromosome.EFFECT);
|
||||
|
||||
newLine();
|
||||
|
||||
endPage();
|
||||
}
|
||||
|
||||
private void drawAnalyticsPage2(IBee bee, EnumBeeType type) {
|
||||
|
||||
startPage(COLUMN_0, COLUMN_1, COLUMN_2);
|
||||
|
||||
drawLine(StringUtil.localize("gui.active"), COLUMN_1);
|
||||
drawLine(StringUtil.localize("gui.inactive"), COLUMN_2);
|
||||
|
||||
newLine();
|
||||
newLine();
|
||||
|
||||
drawRow(StringUtil.localize("gui.climate"), ClimateHelper.toDisplay(bee.getGenome().getPrimary().getTemperature()),
|
||||
ClimateHelper.toDisplay(bee.getGenome().getSecondary().getTemperature()), bee, EnumBeeChromosome.SPECIES);
|
||||
|
||||
drawLine(StringUtil.localize("gui.temptol"), COLUMN_0);
|
||||
drawToleranceInfo(bee.getGenome().getToleranceTemp(), COLUMN_1,
|
||||
getColorCoding(bee.getGenome().getActiveAllele(EnumBeeChromosome.TEMPERATURE_TOLERANCE.ordinal()).isDominant()));
|
||||
drawToleranceInfo(((AlleleTolerance) bee.getGenome().getInactiveAllele(EnumBeeChromosome.TEMPERATURE_TOLERANCE.ordinal())).getValue(), COLUMN_2,
|
||||
getColorCoding(bee.getGenome().getInactiveAllele(EnumBeeChromosome.TEMPERATURE_TOLERANCE.ordinal()).isDominant()));
|
||||
|
||||
newLine();
|
||||
|
||||
drawRow(StringUtil.localize("gui.humidity"), ClimateHelper.toDisplay(bee.getGenome().getPrimary().getHumidity()),
|
||||
ClimateHelper.toDisplay(bee.getGenome().getSecondary().getHumidity()), bee, EnumBeeChromosome.SPECIES);
|
||||
|
||||
drawLine(StringUtil.localize("gui.humidtol"), COLUMN_0);
|
||||
drawToleranceInfo(bee.getGenome().getToleranceHumid(), COLUMN_1,
|
||||
getColorCoding(bee.getGenome().getActiveAllele(EnumBeeChromosome.HUMIDITY_TOLERANCE.ordinal()).isDominant()));
|
||||
drawToleranceInfo(((AlleleTolerance) bee.getGenome().getInactiveAllele(EnumBeeChromosome.HUMIDITY_TOLERANCE.ordinal())).getValue(), COLUMN_2,
|
||||
getColorCoding(bee.getGenome().getInactiveAllele(EnumBeeChromosome.HUMIDITY_TOLERANCE.ordinal()).isDominant()));
|
||||
|
||||
newLine();
|
||||
newLine();
|
||||
|
||||
String yes = StringUtil.localize("yes");
|
||||
String no = StringUtil.localize("no");
|
||||
|
||||
String diurnal0, diurnal1, nocturnal0, nocturnal1;
|
||||
if(bee.getGenome().getNocturnal()) {
|
||||
nocturnal0 = diurnal0 = yes;
|
||||
} else {
|
||||
nocturnal0 = bee.getGenome().getPrimary().isNocturnal() ? yes : no;
|
||||
diurnal0 = !bee.getGenome().getPrimary().isNocturnal() ? yes : no;
|
||||
}
|
||||
if(((AlleleBoolean) bee.getGenome().getInactiveAllele(EnumBeeChromosome.NOCTURNAL.ordinal())).getValue()) {
|
||||
nocturnal1 = diurnal1 = yes;
|
||||
} else {
|
||||
nocturnal1 = bee.getGenome().getSecondary().isNocturnal() ? yes : no;
|
||||
diurnal1 = !bee.getGenome().getSecondary().isNocturnal() ? yes : no;
|
||||
}
|
||||
|
||||
drawLine(StringUtil.localize("gui.diurnal"), COLUMN_0);
|
||||
drawLine(diurnal0, COLUMN_1, getColorCoding(false));
|
||||
drawLine(diurnal1, COLUMN_2, getColorCoding(false));
|
||||
newLine();
|
||||
|
||||
drawLine(StringUtil.localize("gui.nocturnal"), COLUMN_0);
|
||||
drawLine(nocturnal0, COLUMN_1, getColorCoding(false));
|
||||
drawLine(nocturnal1, COLUMN_2, getColorCoding(false));
|
||||
newLine();
|
||||
|
||||
String primary = StringUtil.readableBoolean(bee.getGenome().getTolerantFlyer(), yes, no);
|
||||
String secondary = StringUtil.readableBoolean(((AlleleBoolean) bee.getGenome().getInactiveAllele(EnumBeeChromosome.TOLERANT_FLYER.ordinal())).getValue(), yes,
|
||||
no);
|
||||
|
||||
drawRow(StringUtil.localize("gui.flyer"), primary, secondary, bee, EnumBeeChromosome.TOLERANT_FLYER);
|
||||
|
||||
primary = StringUtil.readableBoolean(bee.getGenome().getCaveDwelling(), yes, no);
|
||||
secondary = StringUtil.readableBoolean(((AlleleBoolean) bee.getGenome().getInactiveAllele(EnumBeeChromosome.CAVE_DWELLING.ordinal())).getValue(), yes,
|
||||
no);
|
||||
|
||||
drawRow(StringUtil.localize("gui.cave"), primary, secondary, bee, EnumBeeChromosome.CAVE_DWELLING);
|
||||
|
||||
newLine();
|
||||
|
||||
String displayText;
|
||||
if (type == EnumBeeType.PRINCESS || type == EnumBeeType.QUEEN) {
|
||||
displayText = "bees.stock.pristine";
|
||||
if (!bee.isNatural())
|
||||
displayText = "bees.stock.ignoble";
|
||||
displayText = StringUtil.localize(displayText);
|
||||
// int offset = (int)(((158 - fontRendererObj.getStringWidth(origin)) / 2)*(1/factor));
|
||||
drawCenteredLine(displayText, 8, 158, fontColor.get("gui.beealyzer.binomial"));;
|
||||
}
|
||||
|
||||
if (bee.getGeneration() >= 0) {
|
||||
newLine();
|
||||
|
||||
displayText = bee.getGeneration() + " " + StringUtil.localize("gui.beealyzer.generations");
|
||||
// offset = (int)(((158 - fontRendererObj.getStringWidth(origin)) / 2)*(1/factor));
|
||||
drawCenteredLine(displayText, 8, 158, fontColor.get("gui.beealyzer.binomial"));
|
||||
}
|
||||
|
||||
endPage();
|
||||
}
|
||||
|
||||
private void drawAnalyticsPage3(IBee bee, EnumBeeType type) {
|
||||
|
||||
tempProductList = bee.getProduceList();
|
||||
|
||||
startPage(COLUMN_0, COLUMN_1, COLUMN_2);
|
||||
|
||||
drawLine(StringUtil.localize("gui.beealyzer.produce") + ":", COLUMN_0);
|
||||
|
||||
newLine();
|
||||
|
||||
int x = COLUMN_0;
|
||||
for (ItemStack stack : tempProductList) {
|
||||
itemRender.renderItemIntoGUI(fontRendererObj, mc.renderEngine, stack, (int) ((guiLeft + x) * (1 / factor)),
|
||||
(int) ((guiTop + getLineY()) * (1 / factor)));
|
||||
x += 18;
|
||||
if (x > adjustToFactor(148)) {
|
||||
x = COLUMN_0;
|
||||
newLine();
|
||||
}
|
||||
}
|
||||
|
||||
newLine();
|
||||
newLine();
|
||||
|
||||
drawLine(StringUtil.localize("gui.beealyzer.specialty") + ":", COLUMN_0);
|
||||
newLine();
|
||||
|
||||
x = COLUMN_0;
|
||||
for (ItemStack stack : bee.getSpecialtyList()) {
|
||||
itemRender.renderItemIntoGUI(fontRendererObj, mc.renderEngine, stack, (int) ((guiLeft + x) * (1 / factor)),
|
||||
(int) ((guiTop + getLineY()) * (1 / factor)));
|
||||
x += 18;
|
||||
if (x > adjustToFactor(148)) {
|
||||
x = COLUMN_0;
|
||||
newLine();
|
||||
}
|
||||
}
|
||||
|
||||
endPage();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,189 @@
|
||||
/*******************************************************************************
|
||||
* Copyright 2011-2014 by SirSengir
|
||||
*
|
||||
* This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.
|
||||
*
|
||||
* To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/3.0/.
|
||||
******************************************************************************/
|
||||
package forestry.apiculture.gui;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.Locale;
|
||||
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.entity.player.InventoryPlayer;
|
||||
import net.minecraft.util.IIcon;
|
||||
import net.minecraft.world.biome.BiomeGenBase;
|
||||
|
||||
import org.lwjgl.opengl.GL11;
|
||||
|
||||
import forestry.apiculture.items.ItemBiomefinder.BiomefinderInventory;
|
||||
import forestry.core.config.Defaults;
|
||||
import forestry.core.gadgets.TileForestry;
|
||||
import forestry.core.gui.GuiForestry;
|
||||
import forestry.core.gui.widgets.Widget;
|
||||
import forestry.core.proxy.Proxies;
|
||||
import forestry.core.render.SpriteSheet;
|
||||
import forestry.core.render.TextureManager;
|
||||
import forestry.core.utils.StringUtil;
|
||||
|
||||
public class GuiHabitatLocator extends GuiForestry<TileForestry> {
|
||||
|
||||
public class HabitatSlot extends Widget {
|
||||
|
||||
private final int slot;
|
||||
private final String name;
|
||||
private final String iconIndex;
|
||||
public boolean isActive = false;
|
||||
|
||||
public HabitatSlot(int slot, String name) {
|
||||
super(widgetManager, 0, 0);
|
||||
this.slot = slot;
|
||||
this.name = name;
|
||||
this.iconIndex = "habitats/" + name.toLowerCase(Locale.ENGLISH);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getLegacyTooltip(EntityPlayer player) {
|
||||
return name;
|
||||
}
|
||||
|
||||
public IIcon getIcon() {
|
||||
return TextureManager.getInstance().getDefault(iconIndex);
|
||||
}
|
||||
|
||||
public void setPosition(int x, int y) {
|
||||
this.xPos = x;
|
||||
this.yPos = y;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void draw(int startX, int startY) {
|
||||
|
||||
if (getIcon() != null) {
|
||||
GL11.glDisable(GL11.GL_LIGHTING);
|
||||
|
||||
if (!isActive)
|
||||
GL11.glColor4f(0.2f, 0.2f, 0.2f, 0.2f);
|
||||
|
||||
Proxies.common.bindTexture(SpriteSheet.ITEMS);
|
||||
manager.gui.drawTexturedModelRectFromIcon(startX + xPos, startY + yPos, getIcon(), 16, 16);
|
||||
GL11.glEnable(GL11.GL_LIGHTING);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private final HabitatSlot[] habitatSlots = new HabitatSlot[] { new HabitatSlot(0, "Ocean"), // ocean
|
||||
// +
|
||||
// beach
|
||||
new HabitatSlot(1, "Plains"), new HabitatSlot(2, "Desert"), // desert
|
||||
// +
|
||||
// desert
|
||||
// hills
|
||||
new HabitatSlot(3, "Forest"), // forest, forestHills, river
|
||||
new HabitatSlot(4, "Jungle"), // jungle, jungleHills
|
||||
new HabitatSlot(5, "Taiga"), // taiga, taigaHills
|
||||
new HabitatSlot(6, "Hills"), // extremeHills, extremeHillsEdge
|
||||
new HabitatSlot(7, "Swampland"), new HabitatSlot(8, "Snow"), // Ice
|
||||
// plains,
|
||||
// mountains,
|
||||
// frozen
|
||||
// rivers,
|
||||
// frozen
|
||||
// oceans
|
||||
new HabitatSlot(9, "Mushroom"), // Ice plains, mountains, frozen
|
||||
// rivers, frozen oceans
|
||||
new HabitatSlot(10, "Hell"), new HabitatSlot(11, "End") };
|
||||
private final HashMap<Integer, HabitatSlot> biomeToHabitat = new HashMap<Integer, HabitatSlot>();
|
||||
|
||||
private int startX;
|
||||
private int startY;
|
||||
|
||||
public GuiHabitatLocator(InventoryPlayer inventory, BiomefinderInventory item) {
|
||||
super(Defaults.TEXTURE_PATH_GUI + "/biomefinder.png", new ContainerHabitatLocator(inventory, item), item);
|
||||
|
||||
xSize = 176;
|
||||
ySize = 184;
|
||||
|
||||
int x;
|
||||
int y;
|
||||
for (HabitatSlot slot : habitatSlots) {
|
||||
|
||||
if (slot.slot > 5) {
|
||||
x = 18 + (slot.slot - 6) * 20;
|
||||
y = 50;
|
||||
} else {
|
||||
x = 18 + slot.slot * 20;
|
||||
y = 32;
|
||||
}
|
||||
|
||||
slot.setPosition(x, y);
|
||||
this.widgetManager.add(slot);
|
||||
}
|
||||
|
||||
biomeToHabitat.put(BiomeGenBase.ocean.biomeID, habitatSlots[0]);
|
||||
biomeToHabitat.put(BiomeGenBase.beach.biomeID, habitatSlots[0]);
|
||||
biomeToHabitat.put(BiomeGenBase.plains.biomeID, habitatSlots[1]);
|
||||
biomeToHabitat.put(BiomeGenBase.desert.biomeID, habitatSlots[2]);
|
||||
// biomeToHabitat.put(BiomeGenBase.desertHills.biomeID,
|
||||
// habitatSlots[2]); // Removed for TFC compatibility
|
||||
biomeToHabitat.put(BiomeGenBase.forest.biomeID, habitatSlots[3]);
|
||||
biomeToHabitat.put(BiomeGenBase.forestHills.biomeID, habitatSlots[3]);
|
||||
biomeToHabitat.put(BiomeGenBase.river.biomeID, habitatSlots[3]);
|
||||
biomeToHabitat.put(BiomeGenBase.jungle.biomeID, habitatSlots[4]);
|
||||
biomeToHabitat.put(BiomeGenBase.jungleHills.biomeID, habitatSlots[4]);
|
||||
biomeToHabitat.put(BiomeGenBase.taiga.biomeID, habitatSlots[5]);
|
||||
biomeToHabitat.put(BiomeGenBase.taigaHills.biomeID, habitatSlots[5]);
|
||||
biomeToHabitat.put(BiomeGenBase.extremeHills.biomeID, habitatSlots[6]);
|
||||
biomeToHabitat.put(BiomeGenBase.extremeHillsEdge.biomeID, habitatSlots[6]);
|
||||
biomeToHabitat.put(BiomeGenBase.swampland.biomeID, habitatSlots[7]);
|
||||
biomeToHabitat.put(BiomeGenBase.frozenOcean.biomeID, habitatSlots[8]);
|
||||
biomeToHabitat.put(BiomeGenBase.frozenRiver.biomeID, habitatSlots[8]);
|
||||
biomeToHabitat.put(BiomeGenBase.iceMountains.biomeID, habitatSlots[8]);
|
||||
biomeToHabitat.put(BiomeGenBase.icePlains.biomeID, habitatSlots[8]);
|
||||
biomeToHabitat.put(BiomeGenBase.mushroomIsland.biomeID, habitatSlots[9]);
|
||||
biomeToHabitat.put(BiomeGenBase.mushroomIslandShore.biomeID, habitatSlots[9]);
|
||||
biomeToHabitat.put(BiomeGenBase.hell.biomeID, habitatSlots[10]);
|
||||
biomeToHabitat.put(BiomeGenBase.sky.biomeID, habitatSlots[11]);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void drawGuiContainerBackgroundLayer(float var1, int mouseX, int mouseY) {
|
||||
super.drawGuiContainerBackgroundLayer(var1, mouseX, mouseY);
|
||||
|
||||
String str = StringUtil.localize("gui.habitatlocator").toUpperCase();
|
||||
fontRendererObj.drawString(str, startX + 8 + getCenteredOffset(str, 138), startY + 16, fontColor.get("gui.screen"));
|
||||
|
||||
str = "(" + StringUtil.localize("gui.closetosearch") + ")";
|
||||
fontRendererObj.drawString(str, startX + 8 + getCenteredOffset(str, 138), startY + 76, fontColor.get("gui.table.header"));
|
||||
|
||||
// Reset habitat slots
|
||||
for (HabitatSlot slot : habitatSlots)
|
||||
slot.isActive = false;
|
||||
|
||||
// Set according to valid biomes.
|
||||
ArrayList<Integer> biomeids = ((ContainerHabitatLocator) inventorySlots).inventory.biomesToSearch;
|
||||
for (int biomeid : biomeids) {
|
||||
if (!biomeToHabitat.containsKey(biomeid))
|
||||
continue;
|
||||
|
||||
biomeToHabitat.get(biomeid).isActive = true;
|
||||
}
|
||||
|
||||
for (HabitatSlot slot : habitatSlots)
|
||||
slot.draw(startX, startY);
|
||||
GL11.glColor4f(1.0f, 1.0f, 1.0f, 1.0f); // Reset afterwards.
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void initGui() {
|
||||
super.initGui();
|
||||
|
||||
startX = (this.width - this.xSize) / 2;
|
||||
startY = (this.height - this.ySize) / 2;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,127 @@
|
||||
/*******************************************************************************
|
||||
* Copyright 2011-2014 by SirSengir
|
||||
*
|
||||
* This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.
|
||||
*
|
||||
* To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/3.0/.
|
||||
******************************************************************************/
|
||||
package forestry.apiculture.gui;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
|
||||
import net.minecraft.entity.player.InventoryPlayer;
|
||||
import net.minecraft.item.ItemStack;
|
||||
|
||||
import forestry.api.apiculture.IAlleleBeeSpecies;
|
||||
import forestry.apiculture.items.ItemBeeGE;
|
||||
import forestry.apiculture.items.ItemImprinter.ImprinterInventory;
|
||||
import forestry.core.config.Defaults;
|
||||
import forestry.core.config.ForestryItem;
|
||||
import forestry.core.gadgets.TileForestry;
|
||||
import forestry.core.gui.GuiForestry;
|
||||
import forestry.core.proxy.Proxies;
|
||||
import forestry.plugins.PluginApiculture;
|
||||
|
||||
public class GuiImprinter extends GuiForestry<TileForestry> {
|
||||
|
||||
private final ImprinterInventory inventory;
|
||||
private final ContainerImprinter container;
|
||||
|
||||
private int startX;
|
||||
private int startY;
|
||||
|
||||
private final HashMap<String, ItemStack> iconStacks = new HashMap<String, ItemStack>();
|
||||
|
||||
public GuiImprinter(InventoryPlayer inventoryplayer, ImprinterInventory inventory) {
|
||||
super(Defaults.TEXTURE_PATH_GUI + "/imprinter.png", new ContainerImprinter(inventoryplayer, inventory), inventory);
|
||||
|
||||
this.inventory = inventory;
|
||||
this.container = (ContainerImprinter) inventorySlots;
|
||||
|
||||
xSize = 176;
|
||||
ySize = 185;
|
||||
|
||||
ArrayList<ItemStack> beeList = new ArrayList<ItemStack>();
|
||||
((ItemBeeGE) ForestryItem.beeDroneGE.item()).addCreativeItems(beeList, false);
|
||||
for (ItemStack beeStack : beeList)
|
||||
iconStacks.put(PluginApiculture.beeInterface.getMember(beeStack).getIdent(), beeStack);
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void drawGuiContainerBackgroundLayer(float var1, int mouseX, int mouseY) {
|
||||
container.updateContainer(Proxies.common.getRenderWorld());
|
||||
super.drawGuiContainerBackgroundLayer(var1, mouseX, mouseY);
|
||||
|
||||
int offset = (138 - fontRendererObj.getStringWidth("GENOME IMPRINTER")) / 2;
|
||||
fontRendererObj.drawString("GENOME IMPRINTER", startX + 8 + offset, startY + 16, fontColor.get("gui.screen"));
|
||||
|
||||
IAlleleBeeSpecies primary = inventory.getPrimary();
|
||||
drawBeeSpeciesIcon(primary, startX + 12, startY + 32);
|
||||
fontRendererObj.drawString(primary.getName(), startX + 32, startY + 36, fontColor.get("gui.screen"));
|
||||
|
||||
IAlleleBeeSpecies secondary = inventory.getSecondary();
|
||||
drawBeeSpeciesIcon(secondary, startX + 12, startY + 52);
|
||||
fontRendererObj.drawString(secondary.getName(), startX + 32, startY + 56, fontColor.get("gui.screen"));
|
||||
|
||||
String youCheater = "(You Cheater!)";
|
||||
offset = (138 - fontRendererObj.getStringWidth(youCheater)) / 2;
|
||||
fontRendererObj.drawString(youCheater, startX + 8 + offset, startY + 76, fontColor.get("gui.screen"));
|
||||
|
||||
}
|
||||
|
||||
private void drawBeeSpeciesIcon(IAlleleBeeSpecies bee, int x, int y) {
|
||||
|
||||
/*
|
||||
* GL11.glDisable(GL11.GL_LIGHTING); mc.renderEngine.func_98187_b(Defaults.TEXTURE_BEES);
|
||||
*
|
||||
* for (int i = 0; i < ForestryItem.beeDroneGE.getRenderPasses(0); ++i) {
|
||||
*
|
||||
* int iconIndex = ForestryItem.beeDroneGE.getIconIndex(iconStacks.get(bee.getUID()), i); int color = ((ItemGE)
|
||||
* ForestryItem.beeDroneGE).getColorFromItemStack(iconStacks.get(bee.getUID()), i); float colorR = (color >> 16 & 255) / 255.0F; float colorG = (color
|
||||
* >> 8 & 255) / 255.0F; float colorB = (color & 255) / 255.0F;
|
||||
*
|
||||
* GL11.glColor4f(colorR, colorG, colorB, 1.0F); drawTexturedModalRect(x, y, iconIndex % 16 * 16, iconIndex / 16 * 16, 16, 16);
|
||||
*
|
||||
* } GL11.glEnable(GL11.GL_LIGHTING);
|
||||
*/
|
||||
|
||||
}
|
||||
|
||||
private int getHabitatSlotAtPosition(int i, int j) {
|
||||
int[] xPos = new int[] { 12, 12 };
|
||||
int[] yPos = new int[] { 32, 52 };
|
||||
|
||||
for (int l = 0; l < xPos.length; l++)
|
||||
if (i >= xPos[l] && i <= xPos[l] + 16 && j >= yPos[l] && j <= yPos[l] + 16)
|
||||
return l;
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void mouseClicked(int i, int j, int k) {
|
||||
super.mouseClicked(i, j, k);
|
||||
|
||||
int cornerX = (width - xSize) / 2;
|
||||
int cornerY = (height - ySize) / 2;
|
||||
|
||||
int slot = 0;
|
||||
if ((slot = getHabitatSlotAtPosition(i - cornerX, j - cornerY)) < 0)
|
||||
return;
|
||||
|
||||
if (k == 0)
|
||||
container.advanceSelection(slot, Proxies.common.getRenderWorld());
|
||||
else
|
||||
container.regressSelection(slot, Proxies.common.getRenderWorld());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void initGui() {
|
||||
super.initGui();
|
||||
|
||||
startX = (this.width - this.xSize) / 2;
|
||||
startY = (this.height - this.ySize) / 2;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
/*******************************************************************************
|
||||
* Copyright 2011-2014 by SirSengir
|
||||
*
|
||||
* This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.
|
||||
*
|
||||
* To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/3.0/.
|
||||
******************************************************************************/
|
||||
package forestry.apiculture.items;
|
||||
|
||||
import net.minecraft.block.Block;
|
||||
|
||||
import forestry.core.gadgets.IStructureBlockItem;
|
||||
import forestry.core.items.ItemForestryBlock;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author CovertJaguar <http://www.railcraft.info/>
|
||||
*/
|
||||
public class ItemAlvearyBlock extends ItemForestryBlock implements IStructureBlockItem {
|
||||
|
||||
public ItemAlvearyBlock(Block block) {
|
||||
super(block);
|
||||
}
|
||||
}
|
||||
+125
@@ -0,0 +1,125 @@
|
||||
/*******************************************************************************
|
||||
* Copyright 2011-2014 by SirSengir
|
||||
*
|
||||
* This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.
|
||||
*
|
||||
* To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/3.0/.
|
||||
******************************************************************************/
|
||||
package forestry.apiculture.items;
|
||||
|
||||
import net.minecraft.client.renderer.texture.IIconRegister;
|
||||
import net.minecraft.entity.Entity;
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.item.ItemArmor;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.util.IIcon;
|
||||
|
||||
import cpw.mods.fml.relauncher.Side;
|
||||
import cpw.mods.fml.relauncher.SideOnly;
|
||||
|
||||
import forestry.api.apiculture.IArmorApiarist;
|
||||
import forestry.api.core.IArmorNaturalist;
|
||||
import forestry.api.core.Tabs;
|
||||
import forestry.core.config.Defaults;
|
||||
import forestry.core.config.ForestryItem;
|
||||
import forestry.core.render.TextureManager;
|
||||
import forestry.core.utils.StringUtil;
|
||||
|
||||
public class ItemArmorApiarist extends ItemArmor implements IArmorApiarist, IArmorNaturalist {
|
||||
|
||||
public ItemArmorApiarist(int slot) {
|
||||
super(ArmorMaterial.CLOTH, 0, slot);
|
||||
this.setMaxDamage(100);
|
||||
setCreativeTab(Tabs.tabApiculture);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getArmorTexture(ItemStack stack, Entity entity, int slot, String type) {
|
||||
if (ForestryItem.apiaristLegs.isItemEqual(stack))
|
||||
return Defaults.ID + ":" + Defaults.TEXTURE_APIARIST_ARMOR_SECONDARY;
|
||||
else
|
||||
return Defaults.ID + ":" + Defaults.TEXTURE_APIARIST_ARMOR_PRIMARY;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getItemStackDisplayName(ItemStack itemstack) {
|
||||
return StringUtil.localize(getUnlocalizedName(itemstack));
|
||||
}
|
||||
|
||||
@SideOnly(Side.CLIENT)
|
||||
@Override
|
||||
public void registerIcons(IIconRegister register) {
|
||||
itemIcon = TextureManager.getInstance().registerTex(register, getUnlocalizedName().replace("item.", ""));
|
||||
}
|
||||
|
||||
@SideOnly(Side.CLIENT)
|
||||
@Override
|
||||
public IIcon getIconFromDamageForRenderPass(int par1, int par2) {
|
||||
return itemIcon;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean requiresMultipleRenderPasses() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getColorFromItemStack(ItemStack itemstack, int renderPass) {
|
||||
return 0xffffff;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasColor(ItemStack itemstack) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean protectPlayer(EntityPlayer player, ItemStack armor, String cause, boolean doProtect) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canSeePollination(EntityPlayer player, ItemStack armor, boolean doSee) {
|
||||
return armorType == 0;
|
||||
}
|
||||
|
||||
public static boolean wearsHelmet(EntityPlayer player, String cause, boolean protect) {
|
||||
ItemStack armorItem = player.inventory.armorInventory[3];
|
||||
return armorItem != null && armorItem.getItem() instanceof IArmorApiarist
|
||||
&& ((IArmorApiarist) armorItem.getItem()).protectPlayer(player, armorItem, cause, protect);
|
||||
}
|
||||
|
||||
public static boolean wearsChest(EntityPlayer player, String cause, boolean protect) {
|
||||
ItemStack armorItem = player.inventory.armorInventory[2];
|
||||
return armorItem != null && armorItem.getItem() instanceof IArmorApiarist
|
||||
&& ((IArmorApiarist) armorItem.getItem()).protectPlayer(player, armorItem, cause, protect);
|
||||
}
|
||||
|
||||
public static boolean wearsLegs(EntityPlayer player, String cause, boolean protect) {
|
||||
ItemStack armorItem = player.inventory.armorInventory[1];
|
||||
return armorItem != null && armorItem.getItem() instanceof IArmorApiarist
|
||||
&& ((IArmorApiarist) armorItem.getItem()).protectPlayer(player, armorItem, cause, protect);
|
||||
}
|
||||
|
||||
public static boolean wearsBoots(EntityPlayer player, String cause, boolean protect) {
|
||||
ItemStack armorItem = player.inventory.armorInventory[0];
|
||||
return armorItem != null && armorItem.getItem() instanceof IArmorApiarist
|
||||
&& ((IArmorApiarist) armorItem.getItem()).protectPlayer(player, armorItem, cause, protect);
|
||||
}
|
||||
|
||||
public static int wearsItems(EntityPlayer player, String cause, boolean protect) {
|
||||
int count = 0;
|
||||
|
||||
if (wearsHelmet(player, cause, protect))
|
||||
count++;
|
||||
if (wearsChest(player, cause, protect))
|
||||
count++;
|
||||
if (wearsLegs(player, cause, protect))
|
||||
count++;
|
||||
if (wearsBoots(player, cause, protect))
|
||||
count++;
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,168 @@
|
||||
/*******************************************************************************
|
||||
* Copyright 2011-2014 by SirSengir
|
||||
*
|
||||
* This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.
|
||||
*
|
||||
* To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/3.0/.
|
||||
******************************************************************************/
|
||||
package forestry.apiculture.items;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import net.minecraft.client.renderer.texture.IIconRegister;
|
||||
import net.minecraft.creativetab.CreativeTabs;
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.item.Item;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.nbt.NBTTagCompound;
|
||||
import net.minecraft.util.IIcon;
|
||||
|
||||
import cpw.mods.fml.relauncher.Side;
|
||||
import cpw.mods.fml.relauncher.SideOnly;
|
||||
|
||||
import forestry.api.apiculture.EnumBeeChromosome;
|
||||
import forestry.api.apiculture.EnumBeeType;
|
||||
import forestry.api.apiculture.IAlleleBeeSpecies;
|
||||
import forestry.api.apiculture.IBee;
|
||||
import forestry.api.core.Tabs;
|
||||
import forestry.api.genetics.AlleleManager;
|
||||
import forestry.api.genetics.IAllele;
|
||||
import forestry.api.genetics.IAlleleSpecies;
|
||||
import forestry.api.genetics.IIndividual;
|
||||
import forestry.apiculture.genetics.Bee;
|
||||
import forestry.core.config.Config;
|
||||
import forestry.core.genetics.ItemGE;
|
||||
import forestry.core.utils.StringUtil;
|
||||
import forestry.plugins.PluginApiculture;
|
||||
|
||||
public class ItemBeeGE extends ItemGE {
|
||||
|
||||
EnumBeeType type;
|
||||
|
||||
public ItemBeeGE(EnumBeeType type) {
|
||||
super();
|
||||
this.type = type;
|
||||
setCreativeTab(Tabs.tabApiculture);
|
||||
if (type != EnumBeeType.DRONE)
|
||||
setMaxStackSize(1);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected IIndividual getIndividual(ItemStack itemstack) {
|
||||
return new Bee(itemstack.getTagCompound());
|
||||
}
|
||||
|
||||
@Override
|
||||
protected int getDefaultPrimaryColour() {
|
||||
return 0xffffff;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected int getDefaultSecondaryColour() {
|
||||
return 0xffdc16;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getItemStackDisplayName(ItemStack itemstack) {
|
||||
|
||||
if (itemstack.getTagCompound() == null)
|
||||
return StringUtil.localize(type.getName());
|
||||
|
||||
IBee individual = new Bee(itemstack.getTagCompound());
|
||||
return individual.getDisplayName() + StringUtil.localize(type.getName() + ".adj.add") + " " + StringUtil.localize(type.getName());
|
||||
}
|
||||
|
||||
@SuppressWarnings({ "rawtypes", "unchecked" })
|
||||
@Override
|
||||
public void addInformation(ItemStack itemstack, EntityPlayer player, List list, boolean flag) {
|
||||
if(!itemstack.hasTagCompound())
|
||||
return;
|
||||
|
||||
if(type != EnumBeeType.DRONE) {
|
||||
IBee individual = new Bee(itemstack.getTagCompound());
|
||||
if (individual.isNatural())
|
||||
list.add("\u00A7e\u00A7o" + StringUtil.localize("bees.stock.pristine"));
|
||||
else
|
||||
list.add("\u00A7e" + StringUtil.localize("bees.stock.ignoble"));
|
||||
}
|
||||
|
||||
super.addInformation(itemstack, player, list, flag);
|
||||
}
|
||||
|
||||
@SuppressWarnings("rawtypes")
|
||||
@Override
|
||||
public void getSubItems(Item item, CreativeTabs par2CreativeTabs, List itemList) {
|
||||
if (type == EnumBeeType.QUEEN)
|
||||
return;
|
||||
|
||||
addCreativeItems(itemList, true);
|
||||
}
|
||||
|
||||
@SuppressWarnings({ "rawtypes", "unchecked" })
|
||||
public void addCreativeItems(List itemList, boolean hideSecrets) {
|
||||
|
||||
for (IIndividual individual : PluginApiculture.beeInterface.getIndividualTemplates()) {
|
||||
// Don't show secret bees unless ordered to.
|
||||
if (hideSecrets && individual.isSecret() && !Config.isDebug)
|
||||
continue;
|
||||
|
||||
NBTTagCompound nbttagcompound = new NBTTagCompound();
|
||||
ItemStack someStack = new ItemStack(this);
|
||||
individual.writeToNBT(nbttagcompound);
|
||||
someStack.setTagCompound(nbttagcompound);
|
||||
itemList.add(someStack);
|
||||
}
|
||||
}
|
||||
|
||||
/* RENDERING */
|
||||
@Override
|
||||
public int getColorFromItemStack(ItemStack itemstack, int renderPass) {
|
||||
if (!itemstack.hasTagCompound())
|
||||
return super.getColorFromItemStack(itemstack, renderPass);
|
||||
|
||||
return getColourFromSpecies(PluginApiculture.beeInterface.getMember(itemstack).getGenome().getPrimary(), renderPass);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getColourFromSpecies(IAlleleSpecies species, int renderPass) {
|
||||
|
||||
if (species != null && species instanceof IAlleleBeeSpecies)
|
||||
return ((IAlleleBeeSpecies) species).getIconColour(renderPass);
|
||||
else
|
||||
return 0xffffff;
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean requiresMultipleRenderPasses() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getRenderPasses(int metadata) {
|
||||
return 3;
|
||||
}
|
||||
|
||||
/* ICONS */
|
||||
@Override
|
||||
@SideOnly(Side.CLIENT)
|
||||
public void registerIcons(IIconRegister register) {
|
||||
for (IAllele allele : AlleleManager.alleleRegistry.getRegisteredAlleles().values())
|
||||
if (allele instanceof IAlleleBeeSpecies)
|
||||
((IAlleleBeeSpecies) allele).getIconProvider().registerIcons(register);
|
||||
}
|
||||
|
||||
@SideOnly(Side.CLIENT)
|
||||
@Override
|
||||
public IIcon getIcon(ItemStack itemstack, int renderPass) {
|
||||
return getIconFromSpecies(PluginApiculture.beeInterface.getMember(itemstack).getGenome().getPrimary(), renderPass);
|
||||
}
|
||||
|
||||
@SideOnly(Side.CLIENT)
|
||||
public IIcon getIconFromSpecies(IAlleleBeeSpecies species, int renderPass) {
|
||||
if (species == null)
|
||||
species = (IAlleleBeeSpecies) PluginApiculture.beeInterface.getDefaultTemplate()[EnumBeeChromosome.SPECIES.ordinal()];
|
||||
|
||||
return species.getIcon(type, renderPass);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,164 @@
|
||||
/*******************************************************************************
|
||||
* Copyright 2011-2014 by SirSengir
|
||||
*
|
||||
* This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.
|
||||
*
|
||||
* To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/3.0/.
|
||||
******************************************************************************/
|
||||
package forestry.apiculture.items;
|
||||
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.nbt.NBTTagCompound;
|
||||
import net.minecraft.nbt.NBTTagList;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
import forestry.api.apiculture.IBee;
|
||||
import forestry.api.core.ForestryAPI;
|
||||
import forestry.api.core.Tabs;
|
||||
import forestry.core.EnumErrorCode;
|
||||
import forestry.core.config.Config;
|
||||
import forestry.core.config.ForestryItem;
|
||||
import forestry.core.interfaces.IErrorSource;
|
||||
import forestry.core.interfaces.IHintSource;
|
||||
import forestry.core.items.ItemInventoried;
|
||||
import forestry.core.network.GuiId;
|
||||
import forestry.core.proxy.Proxies;
|
||||
import forestry.core.utils.ItemInventory;
|
||||
import forestry.plugins.PluginApiculture;
|
||||
|
||||
public class ItemBeealyzer extends ItemInventoried {
|
||||
|
||||
public static class BeealyzerInventory extends ItemInventory implements IErrorSource, IHintSource {
|
||||
|
||||
public static final int SLOT_SPECIMEN = 0;
|
||||
public static final int SLOT_ANALYZE_1 = 1;
|
||||
public static final int SLOT_ANALYZE_2 = 2;
|
||||
public static final int SLOT_ANALYZE_3 = 3;
|
||||
public static final int SLOT_ANALYZE_4 = 4;
|
||||
public static final int SLOT_ANALYZE_5 = 6;
|
||||
public static final int SLOT_ENERGY = 5;
|
||||
|
||||
EntityPlayer player;
|
||||
|
||||
public BeealyzerInventory(EntityPlayer player) {
|
||||
super(ItemBeealyzer.class, 7);
|
||||
this.player = player;
|
||||
}
|
||||
|
||||
public BeealyzerInventory(EntityPlayer player, ItemStack itemStack) {
|
||||
super(ItemBeealyzer.class, 7, itemStack);
|
||||
this.player = player;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void writeToNBT(NBTTagCompound nbttagcompound) {
|
||||
|
||||
NBTTagList nbttaglist = new NBTTagList();
|
||||
for (int i = SLOT_ENERGY; i < SLOT_ENERGY + 1; i++)
|
||||
if (inventoryStacks[i] != null) {
|
||||
NBTTagCompound nbttagcompound1 = new NBTTagCompound();
|
||||
nbttagcompound1.setByte("Slot", (byte) i);
|
||||
inventoryStacks[i].writeToNBT(nbttagcompound1);
|
||||
nbttaglist.appendTag(nbttagcompound1);
|
||||
}
|
||||
nbttagcompound.setTag("Items", nbttaglist);
|
||||
|
||||
}
|
||||
|
||||
private boolean isEnergy(ItemStack itemstack) {
|
||||
if (itemstack == null || itemstack.stackSize <= 0)
|
||||
return false;
|
||||
|
||||
return ForestryItem.honeyDrop.isItemEqual(itemstack) || ForestryItem.honeydew.isItemEqual(itemstack);
|
||||
}
|
||||
|
||||
private void tryAnalyze() {
|
||||
|
||||
// Analyzed slot occupied, abort
|
||||
if (inventoryStacks[SLOT_ANALYZE_1] != null || inventoryStacks[SLOT_ANALYZE_2] != null || inventoryStacks[SLOT_ANALYZE_3] != null
|
||||
|| inventoryStacks[SLOT_ANALYZE_4] != null || inventoryStacks[SLOT_ANALYZE_5] != null)
|
||||
return;
|
||||
|
||||
// Source slot to analyze empty
|
||||
if (getStackInSlot(SLOT_SPECIMEN) == null)
|
||||
return;
|
||||
|
||||
IBee bee = PluginApiculture.beeInterface.getMember(getStackInSlot(SLOT_SPECIMEN));
|
||||
// No bee, abort
|
||||
if (bee == null)
|
||||
return;
|
||||
|
||||
// Analyze if necessary
|
||||
if (!bee.isAnalyzed()) {
|
||||
|
||||
// Requires energy
|
||||
if (!isEnergy(getStackInSlot(SLOT_ENERGY)))
|
||||
return;
|
||||
|
||||
bee.analyze();
|
||||
if(player != null) {
|
||||
PluginApiculture.beeInterface.getBreedingTracker(player.worldObj, player.getGameProfile().getId()).registerSpecies(bee.getGenome().getPrimary());
|
||||
PluginApiculture.beeInterface.getBreedingTracker(player.worldObj, player.getGameProfile().getId()).registerSpecies(bee.getGenome().getSecondary());
|
||||
}
|
||||
|
||||
NBTTagCompound nbttagcompound = new NBTTagCompound();
|
||||
bee.writeToNBT(nbttagcompound);
|
||||
getStackInSlot(SLOT_SPECIMEN).setTagCompound(nbttagcompound);
|
||||
|
||||
// Decrease energy
|
||||
decrStackSize(SLOT_ENERGY, 1);
|
||||
}
|
||||
|
||||
setInventorySlotContents(SLOT_ANALYZE_1, getStackInSlot(SLOT_SPECIMEN));
|
||||
setInventorySlotContents(SLOT_SPECIMEN, null);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void markDirty() {
|
||||
// if (!Proxies.common.isSimulating(player.worldObj))
|
||||
// return;
|
||||
tryAnalyze();
|
||||
}
|
||||
|
||||
// / IHINTSOURCE
|
||||
@Override
|
||||
public boolean hasHints() {
|
||||
return Config.hints.get("beealyzer") != null && Config.hints.get("beealyzer").length > 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String[] getHints() {
|
||||
return Config.hints.get("beealyzer");
|
||||
}
|
||||
|
||||
// / IERRORSOURCE
|
||||
@Override
|
||||
public boolean throwsErrors() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public EnumErrorCode getErrorState() {
|
||||
if (PluginApiculture.beeInterface.isMember(inventoryStacks[SLOT_SPECIMEN]) && !isEnergy(getStackInSlot(SLOT_ENERGY)))
|
||||
return EnumErrorCode.NOHONEY;
|
||||
|
||||
return EnumErrorCode.OK;
|
||||
}
|
||||
}
|
||||
|
||||
public ItemBeealyzer() {
|
||||
super();
|
||||
setMaxStackSize(1);
|
||||
setCreativeTab(Tabs.tabApiculture);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ItemStack onItemRightClick(ItemStack itemstack, World world, EntityPlayer entityplayer) {
|
||||
if (Proxies.common.isSimulating(world))
|
||||
entityplayer.openGui(ForestryAPI.instance, GuiId.BeealyzerGUI.ordinal(), world, (int) entityplayer.posX, (int) entityplayer.posY,
|
||||
(int) entityplayer.posZ);
|
||||
|
||||
return itemstack;
|
||||
}
|
||||
}
|
||||
Loaded 100 of 1787 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user