diff --git a/build.gradle b/build.gradle index 3eb19a26..6274cb25 100644 --- a/build.gradle +++ b/build.gradle @@ -1,4 +1,4 @@ -//version: 1704751096 +//version: 1705357285 /* DO NOT CHANGE THIS FILE! Also, you may replace this file at any time if there is an update available. @@ -122,6 +122,7 @@ propertyDefaultIfUnset("modrinthProjectId", "") propertyDefaultIfUnset("modrinthRelations", "") propertyDefaultIfUnset("curseForgeProjectId", "") propertyDefaultIfUnset("curseForgeRelations", "") +propertyDefaultIfUnset("versionPattern", "") propertyDefaultIfUnset("minimizeShadowedDependencies", true) propertyDefaultIfUnset("relocateShadowedDependencies", true) // Deprecated properties (kept for backwards compat) @@ -370,6 +371,7 @@ catch (Exception ignored) { // Pulls version first from the VERSION env and then git tag String identifiedVersion String versionOverride = System.getenv("VERSION") ?: null +boolean checkVersion = false try { // Produce a version based on the tag, or for branches something like 0.2.2-configurable-maven-and-extras.38+43090270b6-dirty if (versionOverride == null) { @@ -388,6 +390,8 @@ try { } } else if (isDirty) { identifiedVersion += "-${branchName}+${gitDetails.gitHash}-dirty" + } else { + checkVersion = true } } else { identifiedVersion = versionOverride @@ -409,6 +413,8 @@ ext { if (identifiedVersion == versionOverride) { out.style(Style.Failure).text('Override version to ').style(Style.Identifier).text(modVersion).style(Style.Failure).println('!\7') +} else if (checkVersion && versionPattern && !(identifiedVersion ==~ versionPattern)) { + throw new GradleException("Invalid version: '$identifiedVersion' does not match version pattern '$versionPattern'") } group = "com.github.GTNewHorizons" @@ -428,18 +434,31 @@ minecraft { for (f in replaceGradleTokenInFile.split(',')) { tagReplacementFiles.add f } + out.style(Style.Info).text('replaceGradleTokenInFile is deprecated! Consider using generateGradleTokenClass.').println() } if (gradleTokenModId) { - injectedTags.put gradleTokenModId, modId + if (replaceGradleTokenInFile) { + injectedTags.put gradleTokenModId, modId + } else { + out.style(Style.Failure).text('gradleTokenModId is deprecated! The field will no longer be generated.').println() + } } if (gradleTokenModName) { - injectedTags.put gradleTokenModName, modName + if (replaceGradleTokenInFile) { + injectedTags.put gradleTokenModName, modName + } else { + out.style(Style.Failure).text('gradleTokenModName is deprecated! The field will no longer be generated.').println() + } } if (gradleTokenVersion) { injectedTags.put gradleTokenVersion, modVersion } if (gradleTokenGroupName) { - injectedTags.put gradleTokenGroupName, modGroup + if (replaceGradleTokenInFile) { + injectedTags.put gradleTokenGroupName, modGroup + } else { + out.style(Style.Failure).text('gradleTokenGroupName is deprecated! The field will no longer be generated.').println() + } } if (enableGenericInjection.toBoolean()) { injectMissingGenerics.set(true) diff --git a/dependencies.gradle b/dependencies.gradle index c209af96..1a6d1d24 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -4,11 +4,10 @@ dependencies { compile('com.github.GTNewHorizons:ForestryMC:4.8.2:dev') compileOnly('com.github.GTNewHorizons:BloodMagic:1.5.0:dev') - compileOnly('com.github.GTNewHorizons:ThaumicHorizons:1.5.0:dev') + compileOnly('com.github.GTNewHorizons:ThaumicHorizons:1.5.1:dev') compileOnly('com.github.GTNewHorizons:Baubles:1.0.4:dev') {transitive = false} - compileOnly('com.github.GTNewHorizons:Botania:1.10.4-GTNH:api') {transitive = false} + compileOnly('com.github.GTNewHorizons:Botania:1.10.5-GTNH:api') {transitive = false} compileOnly('thaumcraft:Thaumcraft:1.7.10-4.2.3.5:dev') {transitive = false} - compileOnly('com.github.GTNewHorizons:GT5-Unofficial:5.09.45.25:dev') { transitive = false } - + compileOnly('com.github.GTNewHorizons:GT5-Unofficial:5.09.45.41:dev') } diff --git a/src/main/java/magicbees/bees/BeeGenomeManager.java b/src/main/java/magicbees/bees/BeeGenomeManager.java index 16f27a73..92f2152c 100644 --- a/src/main/java/magicbees/bees/BeeGenomeManager.java +++ b/src/main/java/magicbees/bees/BeeGenomeManager.java @@ -836,6 +836,15 @@ public static IAllele[] getTemplateTCChaos() { return genome; } + public static IAllele[] getTemplateTCEssentia() { + IAllele[] genome = getTemplateTCBase(); + + genome[EnumBeeChromosome.SPECIES.ordinal()] = BeeSpecies.TC_ESSENTIA.getSpecies(); + genome[EnumBeeChromosome.FERTILITY.ordinal()] = Allele.getBaseAllele("fertilityNormal"); + + return genome; + } + public static IAllele[] getTemplateTCAir() { IAllele[] genome = getTemplateTCBase(); diff --git a/src/main/java/magicbees/bees/BeeMutation.java b/src/main/java/magicbees/bees/BeeMutation.java index 8f114855..cedcd118 100644 --- a/src/main/java/magicbees/bees/BeeMutation.java +++ b/src/main/java/magicbees/bees/BeeMutation.java @@ -488,6 +488,11 @@ public static void setupMutations() { BeeSpecies.SUPERNATURAL.getSpecies(), BeeSpecies.TC_CHAOS.getGenome(), 8).requireResource(ThaumcraftHelper.crystal, ThaumcraftHelper.ShardType.CHAOS.ordinal()); + beeMutationFactory.createMutation( + BeeSpecies.TC_ORDER.getSpecies(), + BeeSpecies.TC_CHAOS.getSpecies(), + BeeSpecies.TC_ESSENTIA.getGenome(), + 8).requireResource(ThaumcraftHelper.crystal, ThaumcraftHelper.ShardType.CHAOS.ordinal()); beeMutationFactory.createMutation( BeeSpecies.ETHEREAL.getSpecies(), diff --git a/src/main/java/magicbees/bees/BeeSpecies.java b/src/main/java/magicbees/bees/BeeSpecies.java index eb642a7d..60716f75 100644 --- a/src/main/java/magicbees/bees/BeeSpecies.java +++ b/src/main/java/magicbees/bees/BeeSpecies.java @@ -186,6 +186,8 @@ public enum BeeSpecies { EnumTemperature.NORMAL, EnumHumidity.NORMAL, true, true), TC_CHAOS("TCChaos", "tenebrarum", BeeClassification.THAUMIC, 0xCCCCCC, BodyColours.THAUMCRAFT_SHARD, EnumTemperature.NORMAL, EnumHumidity.NORMAL, true, false), + TC_ESSENTIA("TCEssentia", "defaultium essentia apis", BeeClassification.THAUMIC, 0xCCCCCC, + BodyColours.THAUMCRAFT_SHARD, EnumTemperature.NORMAL, EnumHumidity.NORMAL, true, false), TC_VIS("TCVis", "arcanus saecula", BeeClassification.THAUMIC, 0x004c99, BodyColours.THAUMCRAFT_NODE, EnumTemperature.NORMAL, EnumHumidity.NORMAL, false, false), @@ -398,6 +400,7 @@ public static void setupBeeSpecies() { TC_EARTH.registerGenomeTemplate(BeeGenomeManager.getTemplateTCEarth()); TC_ORDER.registerGenomeTemplate(BeeGenomeManager.getTemplateTCOrder()); TC_CHAOS.registerGenomeTemplate(BeeGenomeManager.getTemplateTCChaos()); + TC_ESSENTIA.registerGenomeTemplate(BeeGenomeManager.getTemplateTCEssentia()); TC_VIS.registerGenomeTemplate(BeeGenomeManager.getTemplateTCVis()); TC_REJUVENATING.registerGenomeTemplate(BeeGenomeManager.getTemplateTCRejuvinating()); TC_EMPOWERING.registerGenomeTemplate(BeeGenomeManager.getTemplateTCEmpowering()); @@ -461,6 +464,7 @@ public static void setupBeeSpecies() { TC_WATER.setInactive(); TC_EARTH.setInactive(); TC_ORDER.setInactive(); + TC_ESSENTIA.setInactive(); TC_VIS.setInactive(); TC_REJUVENATING.setInactive(); diff --git a/src/main/java/magicbees/bees/MagicApiaryInventory.java b/src/main/java/magicbees/bees/MagicApiaryInventory.java new file mode 100644 index 00000000..4ac5b881 --- /dev/null +++ b/src/main/java/magicbees/bees/MagicApiaryInventory.java @@ -0,0 +1,172 @@ +package magicbees.bees; + +import java.util.ArrayList; +import java.util.Collection; + +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraftforge.common.util.Constants; + +import forestry.api.apiculture.IBee; +import forestry.api.apiculture.IBeeHousing; +import forestry.api.apiculture.IBeekeepingMode; +import forestry.api.apiculture.IHiveFrame; +import forestry.apiculture.inventory.IApiaryInventory; +import magicbees.main.utils.ItemStackUtils; +import magicbees.tileentity.TileEntityMagicApiary; + +public class MagicApiaryInventory implements IApiaryInventory { + + public static final int SLOT_QUEEN = 0; + public static final int SLOT_DRONE = 1; + public static final int SLOT_FRAME_START = 2; + public static final int SLOT_FRAME_COUNT = 3; + public static final int SLOT_PRODUCTS_START = 5; + public static final int SLOT_PRODUCTS_COUNT = 7; + + private final TileEntityMagicApiary magicApiary; + private final ItemStack[] items; + + public MagicApiaryInventory(TileEntityMagicApiary magicApiary) { + this.magicApiary = magicApiary; + this.items = new ItemStack[12]; + } + + @Override + public ItemStack getQueen() { + return magicApiary.getStackInSlot(SLOT_QUEEN); + } + + @Override + public ItemStack getDrone() { + return magicApiary.getStackInSlot(SLOT_DRONE); + } + + @Override + public void setQueen(ItemStack itemstack) { + magicApiary.setInventorySlotContents(SLOT_QUEEN, itemstack); + } + + @Override + public void setDrone(ItemStack itemstack) { + magicApiary.setInventorySlotContents(SLOT_DRONE, itemstack); + } + + @Override + public boolean addProduct(ItemStack product, boolean all) { + int countAdded = ItemStackUtils + .addItemToInventory(magicApiary, product, SLOT_PRODUCTS_START, SLOT_PRODUCTS_COUNT); + + if (all) { + return countAdded == product.stackSize; + } + return countAdded > 0; + } + + public int getSizeInventory() { + return items.length; + } + + public ItemStack getStackInSlot(int i) { + return items[i]; + } + + public void setInventorySlotContents(int i, ItemStack itemStack) { + items[i] = itemStack; + if (itemStack != null && itemStack.stackSize > getInventoryStackLimit()) { + itemStack.stackSize = getInventoryStackLimit(); + } + } + + public int[] getAccessibleSlotsFromSide(int side) { + if (side == 0 || side == 1) { + return new int[] { SLOT_QUEEN, SLOT_DRONE }; + } + int[] slots = new int[SLOT_PRODUCTS_COUNT]; + for (int i = 0, slot = SLOT_PRODUCTS_START; i < SLOT_PRODUCTS_COUNT; ++i, ++slot) { + slots[i] = slot; + } + return slots; + } + + public boolean canInsertItem(int slot, ItemStack itemStack, int side) { + if (slot == SLOT_QUEEN && BeeManager.beeRoot.isMember(itemStack) && !BeeManager.beeRoot.isDrone(itemStack)) { + return true; + } else if (slot == SLOT_DRONE && BeeManager.beeRoot.isDrone(itemStack)) { + return true; + } + return slot == SLOT_DRONE && BeeManager.beeRoot.isDrone(itemStack); + } + + public boolean canExtractItem(int slot, ItemStack itemStack, int side) { + return slot >= SLOT_FRAME_START && slot <= SLOT_FRAME_START + 2; + } + + public int getInventoryStackLimit() { + return 64; + } + + public Collection getFrames() { + Collection hiveFrames = new ArrayList(SLOT_FRAME_COUNT); + for (int i = SLOT_FRAME_START; i < SLOT_FRAME_START + SLOT_FRAME_COUNT; i++) { + ItemStack stackInSlot = magicApiary.getStackInSlot(i); + if (stackInSlot == null) { + continue; + } + + Item itemInSlot = stackInSlot.getItem(); + if (itemInSlot instanceof IHiveFrame) { + hiveFrames.add((IHiveFrame) itemInSlot); + } + } + return hiveFrames; + } + + public void wearOutFrames(IBeeHousing beeHousing, int amount) { + IBeekeepingMode beekeepingMode = BeeManager.beeRoot.getBeekeepingMode(magicApiary.getWorldObj()); + int wear = Math.round(amount * beekeepingMode.getWearModifier()); + for (int i = MagicApiaryInventory.SLOT_FRAME_START; i + < MagicApiaryInventory.SLOT_FRAME_START + MagicApiaryInventory.SLOT_FRAME_COUNT; i++) { + ItemStack hiveFrameStack = magicApiary.getStackInSlot(i); + if (hiveFrameStack == null) { + continue; + } + Item hiveFrameItem = hiveFrameStack.getItem(); + if (!(hiveFrameItem instanceof IHiveFrame)) { + continue; + } + IHiveFrame hiveFrame = (IHiveFrame) hiveFrameItem; + ItemStack queenStack = magicApiary.getBeeInventory().getQueen(); + IBee queen = BeeManager.beeRoot.getMember(queenStack); + ItemStack usedFrame = hiveFrame.frameUsed(magicApiary, hiveFrameStack, queen, wear); + magicApiary.setInventorySlotContents(i, usedFrame); + } + } + + public void writeToNBT(NBTTagCompound compound) { + NBTTagList itemsNBT = new NBTTagList(); + for (int i = 0; i < items.length; i++) { + ItemStack itemStack = items[i]; + if (itemStack != null) { + NBTTagCompound item = new NBTTagCompound(); + item.setByte("Slot", (byte) i); + itemStack.writeToNBT(item); + itemsNBT.appendTag(item); + } + } + compound.setTag("Items", itemsNBT); + } + + public void readFromNBT(NBTTagCompound compound) { + NBTTagList items = compound.getTagList("Items", Constants.NBT.TAG_COMPOUND); + for (int i = 0; i < items.tagCount(); i++) { + NBTTagCompound item = items.getCompoundTagAt(i); + int slot = item.getByte("Slot"); + if (slot >= 0 && slot < getSizeInventory()) { + setInventorySlotContents(slot, ItemStack.loadItemStackFromNBT(item)); + } + } + } +} diff --git a/src/main/java/magicbees/block/BlockApimancersDrainer.java b/src/main/java/magicbees/block/BlockApimancersDrainer.java new file mode 100644 index 00000000..2c42ff1f --- /dev/null +++ b/src/main/java/magicbees/block/BlockApimancersDrainer.java @@ -0,0 +1,93 @@ +package magicbees.block; + +import net.minecraft.block.BlockContainer; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ChatComponentTranslation; +import net.minecraft.util.IIcon; +import net.minecraft.world.World; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import magicbees.main.CommonProxy; +import magicbees.main.utils.TabMagicBees; +import magicbees.tileentity.TileEntityApimancersDrainerCommon; +import thaumcraft.api.aspects.Aspect; +import thaumcraft.api.aspects.IEssentiaContainerItem; + +public class BlockApimancersDrainer extends BlockContainer { + + @SideOnly(Side.CLIENT) + private IIcon[] icons; + + public static Class drainer = TileEntityApimancersDrainerCommon.class; + + public BlockApimancersDrainer() { + super(Material.rock); + this.setCreativeTab(TabMagicBees.tabMagicBees); + this.setBlockName("apimancersDrainer"); + this.setHardness(1f); + this.setResistance(1.5f); + this.setHarvestLevel("pickaxe", 0); + } + + @Override + public TileEntity createNewTileEntity(World world, int metadata) { + try { + return drainer.newInstance(); + } catch (Exception e) { + return null; + } + } + + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float par7, + float par8, float par9) { + if (world.isRemote) { + return false; + } else { + TileEntity tile = world.getTileEntity(x, y, z); + if (tile instanceof TileEntityApimancersDrainerCommon && side != 1) { + ItemStack tItemStack = player.getHeldItem(); + if (tItemStack != null) { + Item tItem = tItemStack.getItem(); + if (tItem instanceof IEssentiaContainerItem + && ((IEssentiaContainerItem) tItem).getAspects(player.getHeldItem()) != null + && ((IEssentiaContainerItem) tItem).getAspects(player.getHeldItem()).size() > 0) { + Aspect tLocked = ((IEssentiaContainerItem) tItem).getAspects(player.getHeldItem()) + .getAspects()[0]; + ((TileEntityApimancersDrainerCommon) tile).setAspect(tLocked); + + player.addChatMessage( + new ChatComponentTranslation("Producing " + tLocked.getLocalizedDescription())); + } + } else { + ((TileEntityApimancersDrainerCommon) tile).setAspect(null); + player.addChatMessage(new ChatComponentTranslation("Cleared production specifier")); + } + world.markBlockForUpdate(x, y, z); + return true; + } + return false; + } + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(int side, int meta) { + return icons[side <= 1 ? side : 2]; + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister register) { + icons = new IIcon[4]; + for (int i = 0; i < icons.length; i++) { + icons[i] = register.registerIcon(CommonProxy.DOMAIN + ":apimancersdrainer." + i); + } + } +} diff --git a/src/main/java/magicbees/main/Config.java b/src/main/java/magicbees/main/Config.java index bbae998c..32fd247f 100644 --- a/src/main/java/magicbees/main/Config.java +++ b/src/main/java/magicbees/main/Config.java @@ -14,12 +14,14 @@ import net.minecraftforge.oredict.OreDictionary; import cpw.mods.fml.client.event.ConfigChangedEvent; +import cpw.mods.fml.common.Loader; import cpw.mods.fml.common.event.FMLInterModComms; import cpw.mods.fml.common.eventhandler.SubscribeEvent; import cpw.mods.fml.common.registry.GameRegistry; import forestry.api.apiculture.BeeManager; import forestry.api.storage.BackpackManager; import forestry.api.storage.EnumBackpackType; +import magicbees.block.BlockApimancersDrainer; import magicbees.block.BlockEffectJar; import magicbees.block.BlockEnchantedEarth; import magicbees.block.BlockHive; @@ -56,6 +58,7 @@ import magicbees.main.utils.compat.BotaniaHelper; import magicbees.main.utils.compat.ThaumcraftHelper; import magicbees.storage.BackpackDefinition; +import magicbees.tileentity.TileEntityApimancersDrainerGT; import magicbees.tileentity.TileEntityEffectJar; import magicbees.tileentity.TileEntityMagicApiary; import magicbees.tileentity.TileEntityManaAuraProvider; @@ -89,6 +92,9 @@ public class Config { public static double thaumcraftSaplingDroprate; public static int aromaticLumpSwarmerRate; public static int thaumcraftNodeMaxSize; + public static int drainerTimeBetween; + public static int drainerAmount; + public static int drainerCapacity; public static boolean arsMagicaActive; public static boolean baublesActive; @@ -112,6 +118,7 @@ public class Config { public static BlockEffectJar effectJar; public static BlockHive hive; public static BlockMagicApiary magicApiary; + public static BlockApimancersDrainer apimancersDrainer; public static BlockManaAuraProvider manaAuraProvider; public static BlockVisAuraProvider visAuraProvider; @@ -156,6 +163,10 @@ public class Config { // ----- Config State info ---------------------------------- public static Configuration configuration; + // ---- Loaded mods ----------------------------------------- + public static boolean isGTLoaded = Loader.isModLoaded("gregtech"); + public static boolean isGTNHCoreModLoaded = Loader.isModLoaded("gregtech") && Loader.isModLoaded("dreamcraft"); + public Config(File configFile) { configuration = new Configuration(configFile); configuration.load(); @@ -332,6 +343,31 @@ private void doGeneralConfigs() { 32767); thaumcraftNodeMaxSize = p.getInt(256); + p = configuration.get( + CATEGORY_GENERAL, + "drainerTimeBetween", + 200, + "The time in ticks between Apimancer's Drainer essentia generation", + 1, + 32767); + drainerTimeBetween = p.getInt(200); + p = configuration.get( + CATEGORY_GENERAL, + "drainerAmount", + 1, + "The amount that the Apimancer's Drainer generates on every round", + 1, + 32767); + drainerAmount = p.getInt(1); + p = configuration.get( + CATEGORY_GENERAL, + "drainerCapacity", + 512, + "The amount that the Apimancer's Drainer can hold of each aspect", + 1, + 32767); + drainerCapacity = p.getInt(512); + p = configuration.get(CATEGORY_GENERAL, "moonDialShowText", false); p.comment = "set to true to show the current moon phase in mouse-over text."; moonDialShowsPhaseInText = p.getBoolean(false); @@ -471,6 +507,11 @@ private void setupThaumcraftBlocks() { visAuraProvider = new BlockVisAuraProvider(); GameRegistry.registerBlock(visAuraProvider, "visAuraProvider"); GameRegistry.registerTileEntity(TileEntityVisAuraProvider.class, "visAuraProvider"); + + if (isGTNHCoreModLoaded) BlockApimancersDrainer.drainer = TileEntityApimancersDrainerGT.class; + apimancersDrainer = new BlockApimancersDrainer(); + GameRegistry.registerBlock(apimancersDrainer, "apimancersDrainer"); + GameRegistry.registerTileEntity(BlockApimancersDrainer.drainer, "apimancersDrainer"); } } @@ -520,7 +561,7 @@ private void setupThaumcraftBackpacks() { private void setupMiscForestryItemHooks() { // Make Aromatic Lumps a swarmer inducer. Chance is /1000. if (aromaticLumpSwarmerRate > 0) { - aromaticLumpSwarmerRate = (aromaticLumpSwarmerRate >= 1000) ? 1000 : aromaticLumpSwarmerRate; + aromaticLumpSwarmerRate = Math.min(aromaticLumpSwarmerRate, 1000); BeeManager.inducers.put(miscResources.getStackForType(ResourceType.AROMATIC_LUMP), aromaticLumpSwarmerRate); } } diff --git a/src/main/java/magicbees/main/utils/compat/ThaumcraftHelper.java b/src/main/java/magicbees/main/utils/compat/ThaumcraftHelper.java index abf9dbac..70fb15f7 100644 --- a/src/main/java/magicbees/main/utils/compat/ThaumcraftHelper.java +++ b/src/main/java/magicbees/main/utils/compat/ThaumcraftHelper.java @@ -33,151 +33,11 @@ import thaumcraft.api.research.ResearchCategories; import thaumcraft.api.research.ResearchItem; import thaumcraft.api.research.ResearchPage; +import thaumcraft.common.config.ConfigBlocks; public class ThaumcraftHelper implements IModHelper { - public enum MiscResource { - ALUMENTUM, - NITOR, - THAUMIUM, - QUICKSILVER, - MAGIC_TALLOW, - BRAIN_DEPRECATED, - AMBER, - ENCHANTED_FABRIC, - VIS_FILTER, - KNOWLEDGE_FRAGMENT, - MIRRORED_GLASS, - TAINTED_GOO, - TAINTED_TENDRIL, - JAR_LABEL, - SALIS, - CHARM, - VOID_INGOT, - VOID_SEED, - COIN,; - } - - public enum NuggetType { - IRON, - COPPER, - TIN, - SILVER, - LEAD, - QUICKSILVER, - THAUMIUM, - VOID_METAL, - _8, - _9, - _10, - _11, - _12, - _13, - _14, - _15, - NATIVE_IRON, - NATIVE_COPPER, - NATIVE_TIN, - NATIVE_SILVER, - NATIVE_LEAD, - NATIVE_CINNABAR, - _22, - _23, - _24, - _25, - _26, - _27, - _28, - _29, - _30, - NATIVE_GOLD,; - } - - public enum ShardType { - AIR, - FIRE, - WATER, - EARTH, - ORDER, - CHAOS, - BALANCED,; - } - - public enum MetalDeviceType { - CRUCIBLE, - ALEMBIC, - VIS_CHARGE_RELAY, - ADVANCED_ALCHEMICAL_CONSTRUCT, - _4, - ITEM_GRATE, - _6, - ARCANE_LAMP, - LAMP_OF_GROWTH, - ALCHEMICAL_CONSTRUCT, - THAUMATORIUM, - _11, - MNEMONIC_MATRIX, - LAMP_OF_FERTILITY, - VIS_RELAY,; - } - - public enum WoodenDeviceType { - BELLOWS, - EAR, - PRESSURE_PLATE, - PRESSURE_PLATE_B, - BORE_BASE, - BORE, - PLANKS_GREATWOOD, - PLANKS_SILVERWOOD, - BANNER,; - } - - public enum AiryBlockType { - NODE, - NITOR, - _2, - _3, - WARDING_STONE_FENCE, - ENERGIZED_NODE,; - } - - public enum Entity { - - BRAINY_ZOMBIE("entBrainyZombie", "EntityBrainyZombie"), - GIANT_BRAINY_ZOMBIE("entGiantBrainyZombie", "EntityGiantBrainyZombie"), - WISP("entWisp", "EntityWisp"), - FIREBAT("entFirebat", "EntityFireBat"),; - - private static String packageName = "thaumcraft.common.entities.monster."; - - public String entityID; - private String className; - - private Entity(String id, String clazz) { - this.entityID = id; - this.className = clazz; - } - - public String getClassName() { - return packageName + this.className; - } - } - - public enum BlockPlant { - GREATWOOD_SAPLING, - SILVERWOOD_SAPLING, - SHIMMERLEAF, - CINDERPEARL, - PURIFYING_PLANT, - VISHROOM,; - } - - public enum TreeType { - GREATWOOD, - SILVERWOOD,; - } - + public static final String Name = "Thaumcraft"; public static Block plant; public static Block candle; public static Block crystal; @@ -191,7 +51,6 @@ public enum TreeType { public static Block airy; public static Block fluxGas; public static Block fluxGoo; - public static Item filledJar; public static Item miscResource; public static Item shard; @@ -201,63 +60,17 @@ public enum TreeType { public static Item nuggetBeef; public static Item nuggetPork; public static Item zombieBrain; - public static ResearchItem bloodFramePage; public static ResearchPage bloodFrame1; public static ResearchPage bloodFrame2; - public static ResearchItem frenzyFramePage; public static ResearchPage frenzyFrame1; public static ResearchPage frenzyFrame2; - public static Class nodeClass; - - public static final String Name = "Thaumcraft"; + public static Object bloodFrame; + public static Object frenziedFrame; private static boolean isThaumcraftPresent = false; - - public static boolean isActive() { - return isThaumcraftPresent; - } - - public void preInit() { - if (Loader.isModLoaded(Name) && Config.thaumcraftActive) { - isThaumcraftPresent = true; - aspectTime = new Aspect( - "tempus", - 0xB68CFF, - new Aspect[] { Aspect.VOID, Aspect.ORDER }, - new ResourceLocation(CommonProxy.DOMAIN, CommonProxy.TEXTURE + "aspects/tempus.png"), - 1); - MagicBeesAPI.thaumcraftAspectTempus = aspectTime; - } else { - // Switch off TC-dependant items. - ResourceType.LORE_FRAGMENT.setHidden(); - ResourceType.TC_DUST_AIR.setHidden(); - ResourceType.TC_DUST_CHAOS.setHidden(); - ResourceType.TC_DUST_EARTH.setHidden(); - ResourceType.TC_DUST_FIRE.setHidden(); - ResourceType.TC_DUST_ORDER.setHidden(); - ResourceType.TC_DUST_WATER.setHidden(); - } - } - - public void init() { - if (isActive()) { - getBlocks(); - getItems(); - } - } - - public void postInit() { - if (isActive()) { - setupItemAspects(); - setupCrafting(); - setupResearch(); - } - } - private static Object aspectTime; - private static Object frameMagic; private static Object thaumScoop; private static Object thaumGrafter; @@ -271,12 +84,13 @@ public void postInit() { private static Object essenceTime; private static Object essenceOblivion; private static Object visAuraProvider; - - public static Object bloodFrame; - public static Object frenziedFrame; - private static Object voidScoop; private static Object voidGrafter; + private static InfusionRecipe apimancersDrainer; + + public static boolean isActive() { + return isThaumcraftPresent; + } private static void getBlocks() { plant = BlockInterface.getBlock(Name, "blockCustomPlant"); @@ -340,32 +154,56 @@ private static void setupCrafting() { "MB_Scoop", new ItemStack(Config.thaumiumScoop), new AspectList().add(Aspect.ORDER, 2), - new Object[] { "sWs", "sTs", " T ", 's', Items.stick, 'W', Blocks.wool, 'T', - new ItemStack(miscResource, 1, MiscResource.THAUMIUM.ordinal()) }); + "sWs", + "sTs", + " T ", + 's', + Items.stick, + 'W', + Blocks.wool, + 'T', + new ItemStack(miscResource, 1, MiscResource.THAUMIUM.ordinal())); thaumGrafter = ThaumcraftApi.addArcaneCraftingRecipe( "MB_Grafter", new ItemStack(Config.thaumiumGrafter), new AspectList().add(Aspect.ORDER, 5), - new Object[] { " T", " s ", "s ", 's', Items.stick, 'T', - new ItemStack(miscResource, 1, MiscResource.THAUMIUM.ordinal()) }); + " T", + " s ", + "s ", + 's', + Items.stick, + 'T', + new ItemStack(miscResource, 1, MiscResource.THAUMIUM.ordinal())); frameMagic = ThaumcraftApi.addArcaneCraftingRecipe( "MB_FrameMagic", new ItemStack(Config.hiveFrameMagic), new AspectList().add(Aspect.ORDER, 5).add(Aspect.AIR, 2).add(Aspect.EARTH, 2), - new Object[] { "sss", "sCs", "sss", 's', Items.stick, 'C', - new ItemStack(miscResource, 1, MiscResource.ENCHANTED_FABRIC.ordinal()) }); + "sss", + "sCs", + "sss", + 's', + Items.stick, + 'C', + new ItemStack(miscResource, 1, MiscResource.ENCHANTED_FABRIC.ordinal())); visAuraProvider = ThaumcraftApi.addArcaneCraftingRecipe( "MB_VisAuraProvider", new ItemStack(Config.visAuraProvider), new AspectList().add(Aspect.ORDER, 60).add(Aspect.AIR, 60).add(Aspect.ENTROPY, 60) .add(Aspect.WATER, 60), - new Object[] { "ngn", "gvg", "npn", 'n', Items.gold_nugget, 'g', - new ItemStack(wooden, 1, WoodenDeviceType.PLANKS_GREATWOOD.ordinal()), 'v', - new ItemStack(metal, 1, MetalDeviceType.VIS_RELAY.ordinal()), 'p', - Config.pollen.getStackForType(PollenType.UNUSUAL) }); + "ngn", + "gvg", + "npn", + 'n', + Items.gold_nugget, + 'g', + new ItemStack(wooden, 1, WoodenDeviceType.PLANKS_GREATWOOD.ordinal()), + 'v', + new ItemStack(metal, 1, MetalDeviceType.VIS_RELAY.ordinal()), + 'p', + Config.pollen.getStackForType(PollenType.UNUSUAL)); essenceLife = ThaumcraftApi.addCrucibleRecipe( "MB_EssenceLife", @@ -426,22 +264,49 @@ private static void setupCrafting() { "MB_EssenceOblivion", Config.miscResources.getStackForType(ResourceType.ESSENCE_SCORNFUL_OBLIVION), new AspectList().add(Aspect.ENTROPY, 25).add(Aspect.AIR, 40).add(Aspect.ORDER, 15), - new Object[] { Config.miscResources.getStackForType(ResourceType.DIMENSIONAL_SINGULARITY), - Blocks.dragon_egg, }); + Config.miscResources.getStackForType(ResourceType.DIMENSIONAL_SINGULARITY), + Blocks.dragon_egg); voidScoop = ThaumcraftApi.addArcaneCraftingRecipe( "MB_ScoopVoid", new ItemStack(Config.voidScoop), new AspectList().add(Aspect.ORDER, 2), - new Object[] { "sWs", "sTs", " T ", 's', Items.stick, 'W', Blocks.wool, 'T', - new ItemStack(miscResource, 1, MiscResource.VOID_INGOT.ordinal()) }); + "sWs", + "sTs", + " T ", + 's', + Items.stick, + 'W', + Blocks.wool, + 'T', + new ItemStack(miscResource, 1, MiscResource.VOID_INGOT.ordinal())); voidGrafter = ThaumcraftApi.addArcaneCraftingRecipe( "MB_GrafterVoid", new ItemStack(Config.voidGrafter), new AspectList().add(Aspect.ORDER, 5), - new Object[] { " T", " s ", "s ", 's', Items.stick, 'T', - new ItemStack(miscResource, 1, MiscResource.VOID_INGOT.ordinal()) }); + " T", + " s ", + "s ", + 's', + Items.stick, + 'T', + new ItemStack(miscResource, 1, MiscResource.VOID_INGOT.ordinal())); + + ItemStack centrifuge = new ItemStack(ConfigBlocks.blockTube); + centrifuge.setItemDamage(2); + apimancersDrainer = ThaumcraftApi.addInfusionCraftingRecipe( + "MB_ApimancersDrainer", + new ItemStack(Config.apimancersDrainer), + 6, + new AspectList().add(Aspect.MAGIC, 40).add(Aspect.HARVEST, 20).add(Aspect.EXCHANGE, 20) + .add(Aspect.ELDRITCH, 20), + new ItemStack(ConfigBlocks.blockEssentiaReservoir), + new ItemStack[] { centrifuge, Config.pollen.getStackForType(PollenType.UNUSUAL), + Config.pollen.getStackForType(PollenType.PHASED), + Config.miscResources.getStackForType(ResourceType.DIMENSIONAL_SINGULARITY), + Config.pollen.getStackForType(PollenType.UNUSUAL), + Config.pollen.getStackForType(PollenType.PHASED) }); } private static void setupResearch() { @@ -686,6 +551,19 @@ private static void setupResearch() { new ResearchPage((IArcaneRecipe) visAuraProvider)) .setParentsHidden("VISPOWER").registerResearchItem(); + new ResearchItem( + "MB_ApimancersDrainer", + category, + new AspectList().add(Aspect.ELDRITCH, 1).add(Aspect.HARVEST, 1).add(Aspect.MAGIC, 1) + .add((Aspect) aspectTime, 1), + -3, + 5, + 4, + new ItemStack(Config.apimancersDrainer)) + .setPages(getResearchPage("MB_ApimancersDrainer.1"), new ResearchPage(apimancersDrainer)) + .setParentsHidden("VOIDMETAL", "ESSENTIARESERVOIR").setParents("MB_EssenceUnstable") + .setConcealed().registerResearchItem(); + } private static ResearchPage getResearchPage(String ident) { @@ -883,4 +761,183 @@ private static void setupItemAspects() { new AspectList().add(Aspect.VOID, 6).add((Aspect) aspectTime, 8)); } + + public void preInit() { + if (Loader.isModLoaded(Name) && Config.thaumcraftActive) { + isThaumcraftPresent = true; + aspectTime = new Aspect( + "tempus", + 0xB68CFF, + new Aspect[] { Aspect.VOID, Aspect.ORDER }, + new ResourceLocation(CommonProxy.DOMAIN, CommonProxy.TEXTURE + "aspects/tempus.png"), + 1); + MagicBeesAPI.thaumcraftAspectTempus = aspectTime; + } else { + // Switch off TC-dependant items. + ResourceType.LORE_FRAGMENT.setHidden(); + ResourceType.TC_DUST_AIR.setHidden(); + ResourceType.TC_DUST_CHAOS.setHidden(); + ResourceType.TC_DUST_EARTH.setHidden(); + ResourceType.TC_DUST_FIRE.setHidden(); + ResourceType.TC_DUST_ORDER.setHidden(); + ResourceType.TC_DUST_WATER.setHidden(); + } + } + + public void init() { + if (isActive()) { + getBlocks(); + getItems(); + } + } + + public void postInit() { + if (isActive()) { + setupItemAspects(); + setupCrafting(); + setupResearch(); + } + } + + public enum MiscResource { + ALUMENTUM, + NITOR, + THAUMIUM, + QUICKSILVER, + MAGIC_TALLOW, + BRAIN_DEPRECATED, + AMBER, + ENCHANTED_FABRIC, + VIS_FILTER, + KNOWLEDGE_FRAGMENT, + MIRRORED_GLASS, + TAINTED_GOO, + TAINTED_TENDRIL, + JAR_LABEL, + SALIS, + CHARM, + VOID_INGOT, + VOID_SEED, + COIN, + } + + public enum NuggetType { + IRON, + COPPER, + TIN, + SILVER, + LEAD, + QUICKSILVER, + THAUMIUM, + VOID_METAL, + _8, + _9, + _10, + _11, + _12, + _13, + _14, + _15, + NATIVE_IRON, + NATIVE_COPPER, + NATIVE_TIN, + NATIVE_SILVER, + NATIVE_LEAD, + NATIVE_CINNABAR, + _22, + _23, + _24, + _25, + _26, + _27, + _28, + _29, + _30, + NATIVE_GOLD, + } + + public enum ShardType { + AIR, + FIRE, + WATER, + EARTH, + ORDER, + CHAOS, + BALANCED, + } + + public enum MetalDeviceType { + CRUCIBLE, + ALEMBIC, + VIS_CHARGE_RELAY, + ADVANCED_ALCHEMICAL_CONSTRUCT, + _4, + ITEM_GRATE, + _6, + ARCANE_LAMP, + LAMP_OF_GROWTH, + ALCHEMICAL_CONSTRUCT, + THAUMATORIUM, + _11, + MNEMONIC_MATRIX, + LAMP_OF_FERTILITY, + VIS_RELAY, + } + + public enum WoodenDeviceType { + BELLOWS, + EAR, + PRESSURE_PLATE, + PRESSURE_PLATE_B, + BORE_BASE, + BORE, + PLANKS_GREATWOOD, + PLANKS_SILVERWOOD, + BANNER, + } + + public enum AiryBlockType { + NODE, + NITOR, + _2, + _3, + WARDING_STONE_FENCE, + ENERGIZED_NODE, + } + + public enum Entity { + + BRAINY_ZOMBIE("entBrainyZombie", "EntityBrainyZombie"), + GIANT_BRAINY_ZOMBIE("entGiantBrainyZombie", "EntityGiantBrainyZombie"), + WISP("entWisp", "EntityWisp"), + FIREBAT("entFirebat", "EntityFireBat"),; + + private static final String packageName = "thaumcraft.common.entities.monster."; + + public String entityID; + private final String className; + + Entity(String id, String clazz) { + this.entityID = id; + this.className = clazz; + } + + public String getClassName() { + return packageName + this.className; + } + } + + public enum BlockPlant { + GREATWOOD_SAPLING, + SILVERWOOD_SAPLING, + SHIMMERLEAF, + CINDERPEARL, + PURIFYING_PLANT, + VISHROOM, + } + + public enum TreeType { + GREATWOOD, + SILVERWOOD, + } } diff --git a/src/main/java/magicbees/tileentity/TileEntityApimancersDrainerCommon.java b/src/main/java/magicbees/tileentity/TileEntityApimancersDrainerCommon.java new file mode 100644 index 00000000..5692f1e6 --- /dev/null +++ b/src/main/java/magicbees/tileentity/TileEntityApimancersDrainerCommon.java @@ -0,0 +1,272 @@ +package magicbees.tileentity; + +import java.util.Objects; + +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.common.util.ForgeDirection; + +import forestry.api.apiculture.EnumBeeType; +import forestry.api.apiculture.IAlleleBeeSpecies; +import forestry.api.apiculture.IBee; +import forestry.api.apiculture.IBeeGenome; +import forestry.api.apiculture.IBeeHousing; +import forestry.api.apiculture.IBeeModifier; +import forestry.api.apiculture.IBeekeepingLogic; +import forestry.apiculture.genetics.BeeGenome; +import magicbees.bees.BeeManager; +import magicbees.bees.BeeSpecies; +import magicbees.main.Config; +import thaumcraft.api.aspects.Aspect; +import thaumcraft.api.aspects.AspectList; +import thaumcraft.api.aspects.IAspectContainer; +import thaumcraft.api.aspects.IEssentiaTransport; + +public class TileEntityApimancersDrainerCommon extends TileEntity implements IAspectContainer, IEssentiaTransport { + + public Aspect aspect; + public AspectList essentia = new AspectList(); + + public final int maxAmount = Config.drainerCapacity; + + protected int increment = 0; + + public void setAspect(Aspect sAspect) { + aspect = sAspect; + } + + @Override + public void updateEntity() { + // If there's no stored aspect we shouldn't even check for the above block. + // We also don't need to run all the logic if the cabinet is full. + if (aspect == null || essentia.visSize() == maxAmount) return; + + if (increment >= Config.drainerTimeBetween) { + increment = 0; + try { + TileEntity above = worldObj.getTileEntity(this.xCoord, this.yCoord + 1, this.zCoord); + IBeeHousing beeHousing = beeHousing(above); + if (beeHousing != null) { + // This performs all the checks to see if the bee is a living queen and if the species conditions + // are met. + if (!canWork(beeHousing, above)) return; + // The beeRoot.isMember call will treat null the same as EnumBeeType.NONE which leads getSpecies to + // return null. + ItemStack queenStack = getQueen(beeHousing, above); + IAlleleBeeSpecies queenSpecies = BeeGenome.getSpecies(queenStack); + if (queenSpecies == null) return; + if (BeeManager.beeRoot.getType(queenStack) != EnumBeeType.QUEEN) return; + if (Objects.equals(queenSpecies.getUID(), BeeSpecies.TC_ESSENTIA.getSpecies().getUID())) { + IBeeModifier modifier = BeeManager.beeRoot.createBeeHousingModifier(beeHousing); + IBee queen = BeeManager.beeRoot.getMember(queenStack); + int amount = Config.drainerAmount * getProductionMultiplier(modifier, queen, above); + addToContainer(aspect, amount); + drainQueen(beeHousing, modifier, queen); + } + } + } catch (Exception ignored) {} + } + + increment++; + } + + protected IBeeHousing beeHousing(TileEntity above) { + return above instanceof IBeeHousing ? (IBeeHousing) above : null; + } + + protected boolean canWork(IBeeHousing beeHousing, TileEntity above) { + IBeekeepingLogic beekeepingLogic = beeHousing.getBeekeepingLogic(); + return beekeepingLogic.canWork(); + } + + protected ItemStack getQueen(IBeeHousing beeHousing, TileEntity te) { + return beeHousing.getBeeInventory().getQueen(); + } + + protected int getProductionMultiplier(IBeeModifier modifier, IBee queen, TileEntity te) { + IBeeGenome queenGenome = queen.getGenome(); + float productionMultiplier = modifier.getProductionModifier(queenGenome, 1.0F); + float minimum = Math.max(productionMultiplier, 1.0F); + return (int) Math.ceil(minimum); + } + + private void drainQueen(IBeeHousing housing, IBeeModifier modifier, IBee queen) { + float lifespanModifier = modifier.getLifespanModifier(queen.getGenome(), queen.getMate(), 1.0f); + queen.age(housing.getWorld(), lifespanModifier); + // Write the changed queen back into the item stack. + NBTTagCompound nbttagcompound = new NBTTagCompound(); + queen.writeToNBT(nbttagcompound); + housing.getBeeInventory().getQueen().setTagCompound(nbttagcompound); + } + + @Override + public AspectList getAspects() { + return this.essentia; + } + + @Override + public void setAspects(AspectList aspects) { + this.essentia = aspects; + } + + @Override + public boolean doesContainerAccept(Aspect tag) { + return false; + } + + @Override + public int addToContainer(Aspect tag, int am) { + int toAdd = Math.min(maxAmount - essentia.visSize(), am); + if (aspect.equals(tag) && toAdd > 0) { + essentia.add(aspect, toAdd); + markDirty(); + return am - toAdd; + } + markDirty(); + return am; + } + + @Override + public boolean takeFromContainer(Aspect tag, int amount) { + if (!this.worldObj.isRemote) { + this.worldObj.markBlockForUpdate(this.xCoord, this.yCoord, this.zCoord); + } + if (this.essentia.getAmount(tag) >= amount) { + this.essentia.reduce(tag, amount); + return true; + } + return false; + } + + @Override + public boolean takeFromContainer(AspectList ot) { + // TODO Auto-generated method stub + boolean hasIt = true; + if (!this.worldObj.isRemote) { + this.worldObj.markBlockForUpdate(this.xCoord, this.yCoord, this.zCoord); + } + for (Aspect next : ot.aspects.keySet()) { + if (this.essentia.getAmount(next) < ot.getAmount(next)) hasIt = false; + } + if (hasIt) { + for (Aspect next : ot.aspects.keySet()) { + essentia.reduce(next, ot.getAmount(next)); + } + return true; + } + return false; + } + + @Override + public boolean doesContainerContainAmount(Aspect tag, int amount) { + return this.essentia.getAmount(tag) >= amount; + } + + @Override + public boolean doesContainerContain(AspectList ot) { + boolean hasIt = true; + for (Aspect next : ot.aspects.keySet()) { + if (this.essentia.getAmount(next) < ot.getAmount(next)) hasIt = false; + } + return hasIt; + } + + @Override + public int containerContains(Aspect tag) { + return this.essentia.getAmount(tag); + } + + @Override + public boolean isConnectable(ForgeDirection face) { + return (face != ForgeDirection.UP); + } + + @Override + public boolean canInputFrom(ForgeDirection face) { + return false; + } + + @Override + public boolean canOutputTo(ForgeDirection face) { + return (face != ForgeDirection.UP); + } + + @Override + public int takeEssentia(Aspect aspect, int amount, ForgeDirection face) { + if (face != ForgeDirection.UP) { + if (!this.worldObj.isRemote) { + this.worldObj.markBlockForUpdate(this.xCoord, this.yCoord, this.zCoord); + } + if (amount > this.essentia.getAmount(aspect)) { + int total = this.essentia.getAmount(aspect); + this.essentia.reduce(aspect, total); + return total; + } + this.essentia.reduce(aspect, amount); + return amount; + } + return 0; + } + + @Override + public void setSuction(Aspect aspect, int amount) {} + + @Override + public int getMinimumSuction() { + return -1; + } + + @Override + public int getSuctionAmount(ForgeDirection face) { + return -1; + } + + @Override + public boolean renderExtendedTube() { + return false; + } + + @Override + public Aspect getSuctionType(ForgeDirection face) { + return null; + } + + @Override + public Aspect getEssentiaType(ForgeDirection face) { + return this.essentia.size() > 0 + ? this.essentia.getAspects()[this.worldObj.rand.nextInt(this.essentia.getAspects().length)] + : null; + } + + @Override + public int getEssentiaAmount(ForgeDirection face) { + return this.essentia.visSize(); + } + + @Override + public int addEssentia(Aspect aspect, int amount, ForgeDirection face) { + return this.canInputFrom(face) ? amount - this.addToContainer(aspect, amount) : 0; + } + + /* Saving and loading */ + @Override + public void writeToNBT(NBTTagCompound compound) { + super.writeToNBT(compound); + + this.essentia.writeToNBT(compound); + if (aspect != null) compound.setString("aspect", aspect.getTag()); + compound.setInteger("increment", increment); + } + + @Override + public void readFromNBT(NBTTagCompound compound) { + super.readFromNBT(compound); + this.essentia.readFromNBT(compound); + if (this.essentia.visSize() > this.maxAmount) { + this.essentia = new AspectList(); + } + if (compound.hasKey("aspect")) aspect = Aspect.getAspect(compound.getString("aspect")); + increment = compound.getInteger("increment"); + } +} diff --git a/src/main/java/magicbees/tileentity/TileEntityApimancersDrainerGT.java b/src/main/java/magicbees/tileentity/TileEntityApimancersDrainerGT.java new file mode 100644 index 00000000..373da1c3 --- /dev/null +++ b/src/main/java/magicbees/tileentity/TileEntityApimancersDrainerGT.java @@ -0,0 +1,89 @@ +package magicbees.tileentity; + +import java.util.stream.Collectors; + +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.EnumChatFormatting; + +import forestry.api.apiculture.IBee; +import forestry.api.apiculture.IBeeHousing; +import forestry.api.apiculture.IBeeModifier; +import gregtech.api.interfaces.metatileentity.IMetaTileEntity; +import gregtech.api.interfaces.tileentity.IGregTechDeviceInformation; +import gregtech.api.metatileentity.BaseMetaTileEntity; +import gregtech.common.tileentities.machines.basic.GT_MetaTileEntity_IndustrialApiary; + +public class TileEntityApimancersDrainerGT extends TileEntityApimancersDrainerCommon + implements IGregTechDeviceInformation { + + @Override + public boolean isGivingInformation() { + return true; + } + + @Override + public String[] getInfoData() { + String aspects = essentia.aspects.entrySet().stream() + .map( + e -> EnumChatFormatting.LIGHT_PURPLE + e.getKey().getName() + + ": " + + EnumChatFormatting.GREEN + + e.getValue()) + .collect(Collectors.joining(EnumChatFormatting.RESET + ", " + EnumChatFormatting.RESET)); + + return new String[] { EnumChatFormatting.DARK_PURPLE + "Apimancer's Drainer" + EnumChatFormatting.RESET, + aspect != null ? "Attuned: " + aspect.getName() : "Not attuned", "Stored Essentia:", aspects }; + } + + @Override + protected IBeeHousing beeHousing(TileEntity above) { + IBeeHousing regularCheck = super.beeHousing(above); + if (regularCheck != null) return regularCheck; + BaseMetaTileEntity GTMetaTileEntity = getGTTileEntity(above); + if (GTMetaTileEntity != null) { + IMetaTileEntity underlyingMetaTileEntity = GTMetaTileEntity.getMetaTileEntity(); + if (!(underlyingMetaTileEntity instanceof GT_MetaTileEntity_IndustrialApiary)) return null; + return (IBeeHousing) underlyingMetaTileEntity; + } + + return null; + } + + @Override + protected boolean canWork(IBeeHousing beeHousing, TileEntity te) { + BaseMetaTileEntity GTMetaTileEntity = getGTTileEntity(te); + return GTMetaTileEntity != null ? GTMetaTileEntity.isActive() : super.canWork(beeHousing, te); + } + + @Override + protected ItemStack getQueen(IBeeHousing beeHousing, TileEntity te) { + BaseMetaTileEntity GTMetaTileEntity = getGTTileEntity(te); + GT_MetaTileEntity_IndustrialApiary industrialApiary = getGTIndustrialApiary(GTMetaTileEntity); + return industrialApiary != null ? industrialApiary.getUsedQueen() : super.getQueen(beeHousing, te); + } + + @Override + protected int getProductionMultiplier(IBeeModifier modifier, IBee queen, TileEntity te) { + BaseMetaTileEntity GTMetaTileEntity = getGTTileEntity(te); + GT_MetaTileEntity_IndustrialApiary industrialApiary = getGTIndustrialApiary(GTMetaTileEntity); + int housingProductionMultiplier = super.getProductionMultiplier(modifier, queen, te); + return industrialApiary != null + ? housingProductionMultiplier * (int) Math.ceil(Math.sqrt(industrialApiary.mSpeed)) + : housingProductionMultiplier; + } + + private BaseMetaTileEntity getGTTileEntity(TileEntity te) { + boolean isGTMetaTileEntity = te instanceof BaseMetaTileEntity; + return isGTMetaTileEntity ? (BaseMetaTileEntity) te : null; + } + + private GT_MetaTileEntity_IndustrialApiary getGTIndustrialApiary(BaseMetaTileEntity bmte) { + if (bmte != null) { + IMetaTileEntity underlyingMetaTileEntity = bmte.getMetaTileEntity(); + if (!(underlyingMetaTileEntity instanceof GT_MetaTileEntity_IndustrialApiary)) return null; + return (GT_MetaTileEntity_IndustrialApiary) underlyingMetaTileEntity; + } + return null; + } +} diff --git a/src/main/java/magicbees/tileentity/TileEntityMagicApiary.java b/src/main/java/magicbees/tileentity/TileEntityMagicApiary.java index d3484617..36191e89 100644 --- a/src/main/java/magicbees/tileentity/TileEntityMagicApiary.java +++ b/src/main/java/magicbees/tileentity/TileEntityMagicApiary.java @@ -1,7 +1,6 @@ package magicbees.tileentity; import java.util.ArrayList; -import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.Map; @@ -10,10 +9,8 @@ import net.minecraft.inventory.Container; import net.minecraft.inventory.ICrafting; import net.minecraft.inventory.ISidedInventory; -import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.nbt.NBTTagList; import net.minecraft.network.Packet; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.ChunkCoordinates; @@ -22,35 +19,33 @@ import net.minecraft.world.World; import net.minecraft.world.biome.BiomeGenBase; import net.minecraft.world.chunk.Chunk; -import net.minecraftforge.common.util.Constants; import com.mojang.authlib.GameProfile; -import forestry.api.apiculture.DefaultBeeListener; import forestry.api.apiculture.DefaultBeeModifier; -import forestry.api.apiculture.IBee; import forestry.api.apiculture.IBeeGenome; -import forestry.api.apiculture.IBeeHousing; import forestry.api.apiculture.IBeeHousingInventory; import forestry.api.apiculture.IBeeListener; import forestry.api.apiculture.IBeeModifier; import forestry.api.apiculture.IBeekeepingLogic; -import forestry.api.apiculture.IBeekeepingMode; import forestry.api.apiculture.IHiveFrame; import forestry.api.core.EnumHumidity; import forestry.api.core.EnumTemperature; import forestry.api.core.ForestryAPI; import forestry.api.core.IErrorLogic; +import forestry.apiculture.ApiaryBeeListener; +import forestry.apiculture.IApiary; +import forestry.apiculture.inventory.IApiaryInventory; import magicbees.api.bees.IMagicApiaryAuraProvider; import magicbees.bees.AuraCharge; import magicbees.bees.BeeManager; +import magicbees.bees.MagicApiaryInventory; import magicbees.main.CommonProxy; import magicbees.main.utils.ChunkCoords; -import magicbees.main.utils.ItemStackUtils; import magicbees.main.utils.net.EventAuraChargeUpdate; import magicbees.main.utils.net.NetworkEventHandler; -public class TileEntityMagicApiary extends TileEntity implements ISidedInventory, IBeeHousing, ITileEntityAuraCharged { +public class TileEntityMagicApiary extends TileEntity implements ISidedInventory, IApiary, ITileEntityAuraCharged { // Constants private static final int AURAPROVIDER_SEARCH_RADIUS = 6; @@ -62,21 +57,13 @@ public class TileEntityMagicApiary extends TileEntity implements ISidedInventory private BiomeGenBase biome; private int breedingProgressPercent = 0; - private final IBeekeepingLogic beeLogic; - private final IErrorLogic errorLogic; - private final IBeeListener beeListener; - private final IBeeModifier beeModifier; - private final MagicApiaryInventory inventory; + private final IBeekeepingLogic beeLogic = BeeManager.beeRoot.createBeekeepingLogic(this); + private final IBeeListener beeListener = new ApiaryBeeListener(this); + private final IBeeModifier beeModifier = new MagicApiaryBeeModifier(this); + private final MagicApiaryInventory inventory = new MagicApiaryInventory(this); + private final IErrorLogic errorLogic = ForestryAPI.errorStateRegistry.createErrorLogic(); private final AuraCharges auraCharges = new AuraCharges(); - public TileEntityMagicApiary() { - beeLogic = BeeManager.beeRoot.createBeekeepingLogic(this); - beeModifier = new MagicApiaryBeeModifier(this); - beeListener = new MagicApiaryBeeListener(this); - inventory = new MagicApiaryInventory(this); - errorLogic = ForestryAPI.errorStateRegistry.createErrorLogic(); - } - @Override public Iterable getBeeModifiers() { List beeModifiers = new ArrayList(); @@ -101,12 +88,13 @@ public IBeeHousingInventory getBeeInventory() { } @Override - public IBeekeepingLogic getBeekeepingLogic() { - return beeLogic; + public IApiaryInventory getApiaryInventory() { + return inventory; } - public void setOwner(EntityPlayer player) { - this.ownerProfile = player.getGameProfile(); + @Override + public IBeekeepingLogic getBeekeepingLogic() { + return beeLogic; } @Override @@ -236,14 +224,6 @@ public int getHealthScaled(int i) { return (breedingProgressPercent * i) / 100; } - public int getTemperatureScaled(int i) { - return Math.round(i * (getExactTemperature() / 2)); - } - - public int getHumidityScaled(int i) { - return Math.round(i * getExactHumidity()); - } - /* Saving and loading */ @Override public void writeToNBT(NBTTagCompound compound) { @@ -272,10 +252,6 @@ public Packet getDescriptionPacket() { return event.getPacket(); } - public float getExactTemperature() { - return getBiome().getFloatTemperature(xCoord, yCoord, zCoord); - } - public float getExactHumidity() { return getBiome().rainfall; } @@ -480,156 +456,6 @@ public boolean canExtractItem(int i, ItemStack itemStack, int i1) { return inventory.canExtractItem(i, itemStack, i1); } - private static class MagicApiaryInventory implements IBeeHousingInventory { - - public static final int SLOT_QUEEN = 0; - public static final int SLOT_DRONE = 1; - public static final int SLOT_FRAME_START = 2; - public static final int SLOT_FRAME_COUNT = 3; - public static final int SLOT_PRODUCTS_START = 5; - public static final int SLOT_PRODUCTS_COUNT = 7; - - private final TileEntityMagicApiary magicApiary; - private ItemStack[] items; - - public MagicApiaryInventory(TileEntityMagicApiary magicApiary) { - this.magicApiary = magicApiary; - this.items = new ItemStack[12]; - } - - @Override - public ItemStack getQueen() { - return magicApiary.getStackInSlot(SLOT_QUEEN); - } - - @Override - public ItemStack getDrone() { - return magicApiary.getStackInSlot(SLOT_DRONE); - } - - @Override - public void setQueen(ItemStack itemstack) { - magicApiary.setInventorySlotContents(SLOT_QUEEN, itemstack); - } - - @Override - public void setDrone(ItemStack itemstack) { - magicApiary.setInventorySlotContents(SLOT_DRONE, itemstack); - } - - @Override - public boolean addProduct(ItemStack product, boolean all) { - int countAdded = ItemStackUtils - .addItemToInventory(magicApiary, product, SLOT_PRODUCTS_START, SLOT_PRODUCTS_COUNT); - - if (all) { - return countAdded == product.stackSize; - } else { - return countAdded > 0; - } - } - - public int getSizeInventory() { - return items.length; - } - - public ItemStack getStackInSlot(int i) { - return items[i]; - } - - public void setInventorySlotContents(int i, ItemStack itemStack) { - items[i] = itemStack; - - if (itemStack != null && itemStack.stackSize > getInventoryStackLimit()) { - itemStack.stackSize = getInventoryStackLimit(); - } - } - - public int[] getAccessibleSlotsFromSide(int side) { - if (side == 0 || side == 1) { - return new int[] { SLOT_QUEEN, SLOT_DRONE }; - } else { - int[] slots = new int[SLOT_PRODUCTS_COUNT]; - for (int i = 0, slot = SLOT_PRODUCTS_START; i < SLOT_PRODUCTS_COUNT; ++i, ++slot) { - slots[i] = slot; - } - return slots; - } - } - - public boolean canInsertItem(int slot, ItemStack itemStack, int side) { - if (slot == SLOT_QUEEN && BeeManager.beeRoot.isMember(itemStack) - && !BeeManager.beeRoot.isDrone(itemStack)) { - return true; - } else if (slot == SLOT_DRONE && BeeManager.beeRoot.isDrone(itemStack)) { - return true; - } - return slot == SLOT_DRONE && BeeManager.beeRoot.isDrone(itemStack); - } - - public boolean canExtractItem(int slot, ItemStack itemStack, int side) { - switch (slot) { - case SLOT_FRAME_START: - case SLOT_FRAME_START + 1: - case SLOT_FRAME_START + 2: - return false; - default: - return true; - } - } - - public int getInventoryStackLimit() { - return 64; - } - - public Collection getFrames() { - Collection hiveFrames = new ArrayList(SLOT_FRAME_COUNT); - - for (int i = SLOT_FRAME_START; i < SLOT_FRAME_START + SLOT_FRAME_COUNT; i++) { - ItemStack stackInSlot = magicApiary.getStackInSlot(i); - if (stackInSlot == null) { - continue; - } - - Item itemInSlot = stackInSlot.getItem(); - if (itemInSlot instanceof IHiveFrame) { - hiveFrames.add((IHiveFrame) itemInSlot); - } - } - - return hiveFrames; - } - - public void writeToNBT(NBTTagCompound compound) { - NBTTagList itemsNBT = new NBTTagList(); - - for (int i = 0; i < items.length; i++) { - ItemStack itemStack = items[i]; - - if (itemStack != null) { - NBTTagCompound item = new NBTTagCompound(); - item.setByte("Slot", (byte) i); - itemStack.writeToNBT(item); - itemsNBT.appendTag(item); - } - } - compound.setTag("Items", itemsNBT); - } - - public void readFromNBT(NBTTagCompound compound) { - NBTTagList items = compound.getTagList("Items", Constants.NBT.TAG_COMPOUND); - - for (int i = 0; i < items.tagCount(); i++) { - NBTTagCompound item = items.getCompoundTagAt(i); - int slot = item.getByte("Slot"); - - if (slot >= 0 && slot < getSizeInventory()) { - setInventorySlotContents(slot, ItemStack.loadItemStackFromNBT(item)); - } - } - } - } - private static class MagicApiaryBeeModifier extends DefaultBeeModifier { private final TileEntityMagicApiary magicApiary; @@ -640,29 +466,17 @@ public MagicApiaryBeeModifier(TileEntityMagicApiary magicApiary) { @Override public float getMutationModifier(IBeeGenome genome, IBeeGenome mate, float currentModifier) { - float mod = 1.0f; - if (magicApiary.isMutationBoosted()) { - mod = mod * 2f; - } - return mod; + return magicApiary.isMutationBoosted() ? 2f : 1f; } @Override public float getLifespanModifier(IBeeGenome genome, IBeeGenome mate, float currentModifier) { - float mod = 1.0f; - if (magicApiary.isDeathRateBoosted()) { - mod = mod / 2f; - } - return mod; + return magicApiary.isDeathRateBoosted() ? 2f : 1f; } @Override public float getProductionModifier(IBeeGenome genome, float currentModifier) { - float mod = -0.1f;// was 0.9x, now -0.1 - if (magicApiary.isProductionBoosted()) { - mod = 0.8f;// was 1.8x, now +0.8 - } - return mod; + return magicApiary.isProductionBoosted() ? 0.8f : -0.1f; } @Override @@ -670,40 +484,4 @@ public float getGeneticDecay(IBeeGenome genome, float currentModifier) { return 0.8f; } } - - private static class MagicApiaryBeeListener extends DefaultBeeListener { - - private final TileEntityMagicApiary magicApiary; - - public MagicApiaryBeeListener(TileEntityMagicApiary magicApiary) { - this.magicApiary = magicApiary; - } - - @Override - public void wearOutEquipment(int amount) { - IBeekeepingMode beekeepingMode = BeeManager.beeRoot.getBeekeepingMode(magicApiary.getWorldObj()); - int wear = Math.round(amount * beekeepingMode.getWearModifier()); - - for (int i = MagicApiaryInventory.SLOT_FRAME_START; i - < MagicApiaryInventory.SLOT_FRAME_START + MagicApiaryInventory.SLOT_FRAME_COUNT; i++) { - ItemStack hiveFrameStack = magicApiary.getStackInSlot(i); - if (hiveFrameStack == null) { - continue; - } - - Item hiveFrameItem = hiveFrameStack.getItem(); - if (!(hiveFrameItem instanceof IHiveFrame)) { - continue; - } - - IHiveFrame hiveFrame = (IHiveFrame) hiveFrameItem; - - ItemStack queenStack = magicApiary.getBeeInventory().getQueen(); - IBee queen = BeeManager.beeRoot.getMember(queenStack); - ItemStack usedFrame = hiveFrame.frameUsed(magicApiary, hiveFrameStack, queen, wear); - - magicApiary.setInventorySlotContents(i, usedFrame); - } - } - } } diff --git a/src/main/resources/assets/magicbees/lang/en_US.lang b/src/main/resources/assets/magicbees/lang/en_US.lang index d11776f8..f271190f 100644 --- a/src/main/resources/assets/magicbees/lang/en_US.lang +++ b/src/main/resources/assets/magicbees/lang/en_US.lang @@ -38,6 +38,7 @@ item.beeRing.name=Collector's Bee Ring tile.effectJar.name=Bee Collector's Jar tile.magicApiary.name=Magic Apiary tile.visAuraProvider.name=Vis Apiary Booster +tile.apimancersDrainer.name=Apimancer's Drainer tile.manaAuraProvider.name=Mana Apiary Booster tile.hive.curious.name=Curious Hive tile.hive.unusual.name=Unusual Hive @@ -403,6 +404,8 @@ magicbees.speciesTCOrder=Ordered magicbees.speciesTCOrder.description=Their combs are nearly perfect, each part mirroring the pattern of the whole.|Apinomicon magicbees.speciesTCChaos=Chaotic magicbees.speciesTCChaos.description=The social structure of their hives seems to vary day by day, making it more flexible and resillient than others, but significantly more unpredictable.|Apinomicon +magicbees.speciesTCEssentia=Essentia +magicbees.speciesTCEssentia.description="Why spam Essentia Condensers when you can just use bees?"|Quantumly, Condenser Enjoyer magicbees.speciesTCVis=Vis magicbees.speciesTCVis.description="They can feel changes in the aura, but are not yet able to affect it."|Azanor, research notes magicbees.speciesTCRejuvenating=Rejuvenating @@ -682,6 +685,10 @@ tc.research_name.MB_VisAuraProvider=Vis Apiary Booster tc.research_text.MB_VisAuraProvider=Vis? What about Bis? tc.research_page.MB_VisAuraProvider.1=Infusing Unusual Pollen with vis and combining it with gold creates an unusual crystal that, when fed centivis from an aura node, creates an energizing aura that bees are naturally attracted to when attuned to the environment within a Magic Apiary.§3Aqua§0 CV will double mutation rate
§8Perditio§0 CV will halve lifespan
§6Aer§0 CV will double production rate +tc.research_name.MB_ApimancersDrainer=Apimancer's Drainer +tc.research_text.MB_ApimancersDrainer=How long will your queen last? +tc.research_page.MB_ApimancersDrainer.1=The Apimancer's Drainer is an innovative device in the field of Apimancy, designed to extract essentia from the life force of bees. It is placed beneath an apiary, establishing a direct connection with the apiary above.
To determine the type of essentia it produces, the Drainer is attuned by tapping it with the desired essentia.
Once attuned, the Drainer converts the life energy of the queen into the selected essentia... + tc.research_name.MB_ScoopVoid=Void Scoop tc.research_text.MB_ScoopVoid=The dark net tc.research_page.MB_ScoopVoid.1=Void metal is a curious thing, and it's time to see what it can bring to Apimancy. Its self-regenerative properties have seeped their way into the net as well, creating a most unsettling mesh.
Hopefully it won't affect the bees too much... diff --git a/src/main/resources/assets/magicbees/textures/blocks/apimancersdrainer.0.png b/src/main/resources/assets/magicbees/textures/blocks/apimancersdrainer.0.png new file mode 100644 index 00000000..6d6197a6 Binary files /dev/null and b/src/main/resources/assets/magicbees/textures/blocks/apimancersdrainer.0.png differ diff --git a/src/main/resources/assets/magicbees/textures/blocks/apimancersdrainer.1.png b/src/main/resources/assets/magicbees/textures/blocks/apimancersdrainer.1.png new file mode 100644 index 00000000..6d6197a6 Binary files /dev/null and b/src/main/resources/assets/magicbees/textures/blocks/apimancersdrainer.1.png differ diff --git a/src/main/resources/assets/magicbees/textures/blocks/apimancersdrainer.2.png b/src/main/resources/assets/magicbees/textures/blocks/apimancersdrainer.2.png new file mode 100644 index 00000000..8c7c7983 Binary files /dev/null and b/src/main/resources/assets/magicbees/textures/blocks/apimancersdrainer.2.png differ