mirror of
https://github.com/GTNewHorizons/ForestryMC.git
synced 2026-11-15 09:34:57 +00:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
af55bd86a2 | ||
|
|
7aa840282f | ||
|
|
a5d57c4788 | ||
|
|
4d0c2d1ea2 | ||
|
|
840331b7d5 | ||
|
|
df91b47b35 | ||
|
|
f400241ff4 | ||
|
|
8639148f20 | ||
|
|
28e7b561ea | ||
|
|
ba7ef4228c | ||
|
|
fcd3ee6feb | ||
|
|
6ddc9f3079 | ||
|
|
cc53894473 | ||
|
|
2cd76bdad7 | ||
|
|
92eab8d47a | ||
|
|
12f5d7be6c | ||
|
|
ab88e7d57c | ||
|
|
725d85181d | ||
|
|
23c9b2071b | ||
|
|
ae025a92fc | ||
|
|
fbf30b1a73 | ||
|
|
4ba3370fc9 | ||
|
|
c1a590961d | ||
|
|
a1f7a678c1 | ||
|
|
1117b820f1 | ||
|
|
4681bf4cfb | ||
|
|
b9dd19a556 | ||
|
|
f97a737185 | ||
|
|
68fb27410e |
No files matched your search
+3
-3
@@ -1,10 +1,10 @@
|
||||
mcversion=1.9.4
|
||||
forgeversion=12.17.0.1950
|
||||
forgeversion=12.17.0.1957
|
||||
mcp_mappings=snapshot_20160525
|
||||
|
||||
jei_version=3.4.0.+
|
||||
jei_version=3.6.0.+
|
||||
ic2_version=2.5.5-ex19
|
||||
|
||||
version_major=5
|
||||
version_minor=0
|
||||
version_patch=9
|
||||
version_patch=13
|
||||
+1
-1
Submodule lang updated: 50cc3f6cfc...9be86d3c99.
@@ -57,6 +57,7 @@ import forestry.plugins.PluginManager;
|
||||
+ "after:IC2@[2.3.235,);"
|
||||
+ "after:Natura@[2.2.0,);"
|
||||
+ "after:HardcoreEnderExpansion;"
|
||||
+ "after:JEI@[3.6.0,);"
|
||||
+ "after:basemetals;")
|
||||
public class Forestry {
|
||||
|
||||
|
||||
@@ -36,6 +36,12 @@ public interface IBeekeepingLogic extends INbtWritable, INbtReadable {
|
||||
*/
|
||||
void doWork();
|
||||
|
||||
/**
|
||||
* Force the logic to refresh any cached values and error states.
|
||||
* Call this when a player opens the gui so that all errors are up to date.
|
||||
*/
|
||||
void clearCachedValues();
|
||||
|
||||
|
||||
/* CLIENT */
|
||||
|
||||
|
||||
@@ -5,6 +5,8 @@
|
||||
******************************************************************************/
|
||||
package forestry.api.apiculture.hives;
|
||||
|
||||
import java.util.Random;
|
||||
|
||||
import net.minecraft.block.state.IBlockState;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.world.World;
|
||||
@@ -46,5 +48,5 @@ public interface IHiveDescription {
|
||||
* Called after successful hive generation.
|
||||
* world, x, y, z give the location of the new hive.
|
||||
**/
|
||||
void postGen(World world, BlockPos pos);
|
||||
void postGen(World world, Random rand, BlockPos pos);
|
||||
}
|
||||
@@ -5,6 +5,8 @@
|
||||
******************************************************************************/
|
||||
package forestry.api.recipes;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
import net.minecraft.item.ItemStack;
|
||||
|
||||
import net.minecraftforge.fluids.FluidStack;
|
||||
@@ -24,6 +26,7 @@ public interface ISqueezerRecipe extends IForestryRecipe {
|
||||
/**
|
||||
* @return Item stack representing the possible remnants from this recipe. (i.e. tin left over from tin cans)
|
||||
*/
|
||||
@Nullable
|
||||
ItemStack getRemnants();
|
||||
|
||||
/**
|
||||
|
||||
@@ -197,6 +197,8 @@ public class BeekeepingLogic implements IBeekeepingLogic, IStreamable {
|
||||
if (!ItemStack.areItemStacksEqual(this.queenStack, queenStack)) {
|
||||
this.queen = BeeManager.beeRoot.getMember(queenStack);
|
||||
this.queenStack = queenStack;
|
||||
hasFlowersCache.clear();
|
||||
queenCanWorkCache.clear();
|
||||
}
|
||||
|
||||
if (errorLogic.setCondition(queen == null, EnumErrorCode.NO_QUEEN)) {
|
||||
@@ -235,6 +237,13 @@ public class BeekeepingLogic implements IBeekeepingLogic, IStreamable {
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void clearCachedValues() {
|
||||
hasFlowersCache.clear();
|
||||
queenCanWorkCache.clear();
|
||||
canWork();
|
||||
}
|
||||
|
||||
private void queenWorkTick(IBee queen) {
|
||||
if (queen == null) {
|
||||
beeProgress = 0;
|
||||
@@ -505,6 +514,11 @@ public class BeekeepingLogic implements IBeekeepingLogic, IStreamable {
|
||||
|
||||
return queenCanWorkCached;
|
||||
}
|
||||
|
||||
public void clear() {
|
||||
queenCanWorkCached.clear();
|
||||
queenCanWorkCooldown = 0;
|
||||
}
|
||||
}
|
||||
|
||||
private static class PollenHandler {
|
||||
|
||||
@@ -37,6 +37,11 @@ public class FakeBeekeepingLogic implements IBeekeepingLogic {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void clearCachedValues() {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void syncToClient() {
|
||||
|
||||
|
||||
@@ -97,6 +97,11 @@ public class HasFlowersCache implements INbtWritable, INbtReadable, IStreamable
|
||||
return returnVal;
|
||||
}
|
||||
|
||||
public void clear() {
|
||||
flowerCoords.clear();
|
||||
cooldown = 0;
|
||||
}
|
||||
|
||||
@Nonnull
|
||||
public List<BlockPos> getFlowerCoords() {
|
||||
return Collections.unmodifiableList(flowerCoords);
|
||||
|
||||
@@ -130,16 +130,12 @@ public class PluginApiculture extends BlankForestryPlugin {
|
||||
public static String beekeepingMode = "NORMAL";
|
||||
private static float secondPrincessChance = 0;
|
||||
public static final int ticksPerBeeWorkCycle = 550;
|
||||
public static boolean fancyRenderedBees = false;
|
||||
|
||||
public static ItemRegistryApiculture items;
|
||||
public static BlockRegistryApiculture blocks;
|
||||
|
||||
public static HiveRegistry hiveRegistry;
|
||||
|
||||
private final Map<String, String[]> defaultAcceptedFlowers = new HashMap<>();
|
||||
private final Map<String, String[]> defaultPlantableFlowers = new HashMap<>();
|
||||
|
||||
public static VillagerRegistry.VillagerProfession villagerApiarist;
|
||||
|
||||
@Override
|
||||
@@ -275,9 +271,12 @@ public class PluginApiculture extends BlankForestryPlugin {
|
||||
villagerRegistry.register(villagerApiarist);
|
||||
|
||||
ItemStack wildcardPrincess = new ItemStack(items.beePrincessGE, 1);
|
||||
ItemStack wildcardDrone = new ItemStack(items.beeDroneGE, 1);
|
||||
ItemStack apiary = new ItemStack(blocks.apiary);
|
||||
ItemStack provenFrames = items.frameProven.getItemStack();
|
||||
ItemStack monasticDrone = BeeDefinition.MONASTIC.getMemberStack(EnumBeeType.DRONE);
|
||||
ItemStack endDrone = BeeDefinition.ENDED.getMemberStack(EnumBeeType.DRONE);
|
||||
ItemStack propolis = new ItemStack(PluginApiculture.items.propolis,1);
|
||||
|
||||
VillagerRegistry.VillagerCareer apiaristCareer = new VillagerRegistry.VillagerCareer(villagerApiarist, "apiarist");
|
||||
apiaristCareer.addTrade(1,
|
||||
@@ -287,14 +286,16 @@ public class PluginApiculture extends BlankForestryPlugin {
|
||||
);
|
||||
apiaristCareer.addTrade(2,
|
||||
new VillagerTradeLists.GiveItemForEmeralds(new EntityVillager.PriceInfo(1, 4), new ItemStack(items.smoker), null),
|
||||
new VillagerTradeLists.GiveItemForLogsAndEmeralds(apiary, new EntityVillager.PriceInfo(1, 1), new EntityVillager.PriceInfo(16, 32), new EntityVillager.PriceInfo(1, 2))
|
||||
new VillagerTradeLists.GiveItemForLogsAndEmeralds(apiary, new EntityVillager.PriceInfo(1, 1), new EntityVillager.PriceInfo(16, 32), new EntityVillager.PriceInfo(1, 2)),
|
||||
new VillagerApiaristTrades.GiveRandomHiveDroneForItems(propolis, null, wildcardDrone, new EntityVillager.PriceInfo(2, 4))
|
||||
);
|
||||
apiaristCareer.addTrade(3,
|
||||
new VillagerTradeLists.GiveEmeraldForItems(wildcardPrincess, null),
|
||||
new VillagerTradeLists.GiveItemForEmeralds(new EntityVillager.PriceInfo(1, 2), provenFrames, new EntityVillager.PriceInfo(1, 6))
|
||||
);
|
||||
apiaristCareer.addTrade(4,
|
||||
new VillagerTradeLists.GiveItemForItemAndEmerald(wildcardPrincess, null, new EntityVillager.PriceInfo(10, 64), monasticDrone, null)
|
||||
new VillagerTradeLists.GiveItemForItemAndEmerald(wildcardPrincess, null, new EntityVillager.PriceInfo(10, 64), monasticDrone, null),
|
||||
new VillagerTradeLists.GiveItemForTwoItems(wildcardPrincess, null,new ItemStack(Items.ENDER_EYE),new EntityVillager.PriceInfo(12, 16),endDrone, null)
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -9,6 +9,9 @@ import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.village.MerchantRecipe;
|
||||
import net.minecraft.village.MerchantRecipeList;
|
||||
|
||||
import forestry.api.apiculture.EnumBeeType;
|
||||
import forestry.apiculture.genetics.BeeDefinition;
|
||||
|
||||
public class VillagerApiaristTrades {
|
||||
|
||||
public static class GiveRandomCombsForItems implements EntityVillager.ITradeList {
|
||||
@@ -42,5 +45,46 @@ public class VillagerApiaristTrades {
|
||||
recipeList.add(new MerchantRecipe(itemToBuy, randomComb));
|
||||
}
|
||||
}
|
||||
public static class GiveRandomHiveDroneForItems implements EntityVillager.ITradeList {
|
||||
@Nonnull
|
||||
public ItemStack buyingItemStack;
|
||||
@Nullable
|
||||
public EntityVillager.PriceInfo buyingPriceInfo;
|
||||
@Nonnull
|
||||
public ItemStack buyingItemStackTwo;
|
||||
@Nullable
|
||||
public EntityVillager.PriceInfo buyingPriceItemTwoInfo;
|
||||
|
||||
public GiveRandomHiveDroneForItems(
|
||||
@Nonnull ItemStack buyingItemStack,
|
||||
@Nullable EntityVillager.PriceInfo buyingPriceInfo,
|
||||
@Nonnull ItemStack buyingItemStackTwo,
|
||||
@Nullable EntityVillager.PriceInfo buyingPriceItemTwoInfo) {
|
||||
this.buyingItemStack = buyingItemStack;
|
||||
this.buyingPriceInfo = buyingPriceInfo;
|
||||
this.buyingItemStackTwo = buyingItemStackTwo;
|
||||
this.buyingPriceItemTwoInfo = buyingPriceItemTwoInfo;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void modifyMerchantRecipeList(@Nonnull MerchantRecipeList recipeList, @Nonnull Random random) {
|
||||
|
||||
int buyAmount = 1;
|
||||
if (this.buyingPriceInfo != null) {
|
||||
buyAmount = this.buyingPriceInfo.getPrice(random);
|
||||
}
|
||||
|
||||
int buyTwoAmount = 1;
|
||||
if (this.buyingPriceItemTwoInfo != null) {
|
||||
buyTwoAmount = this.buyingPriceItemTwoInfo.getPrice(random);
|
||||
}
|
||||
BeeDefinition [] forestryMundane = new BeeDefinition[] { BeeDefinition.FOREST, BeeDefinition.MEADOWS, BeeDefinition.MODEST, BeeDefinition.WINTRY, BeeDefinition.TROPICAL, BeeDefinition.MARSHY };
|
||||
ItemStack randomHiveDrone = forestryMundane[random.nextInt(forestryMundane.length)].getMemberStack(EnumBeeType.DRONE);
|
||||
ItemStack buyItemStack = this.buyingItemStack.copy();
|
||||
buyItemStack.stackSize = buyAmount;
|
||||
ItemStack buyItemStackTwo = this.buyingItemStackTwo.copy();
|
||||
buyItemStackTwo.stackSize = buyTwoAmount;
|
||||
recipeList.add(new MerchantRecipe(buyItemStack, buyItemStackTwo, randomHiveDrone));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,15 +1,20 @@
|
||||
package forestry.apiculture.compat;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
import javax.annotation.Nullable;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.nbt.NBTTagCompound;
|
||||
|
||||
import forestry.api.genetics.IAlleleSpecies;
|
||||
import forestry.apiculture.PluginApiculture;
|
||||
import forestry.apiculture.genetics.BeeGenome;
|
||||
|
||||
import mezz.jei.api.BlankModPlugin;
|
||||
import mezz.jei.api.IModRegistry;
|
||||
import mezz.jei.api.INbtRegistry;
|
||||
import mezz.jei.api.JEIPlugin;
|
||||
|
||||
@JEIPlugin
|
||||
@@ -34,5 +39,21 @@ public class ApicultureJeiPlugin extends BlankModPlugin {
|
||||
registry.addDescription(new ItemStack(PluginApiculture.items.habitatLocator), "for.jei.description.habitat.locator");
|
||||
|
||||
registry.addDescription(new ItemStack(PluginApiculture.items.scoop), "for.jei.description.scoop");
|
||||
|
||||
INbtRegistry nbtRegistry = registry.getJeiHelpers().getNbtRegistry();
|
||||
nbtRegistry.registerNbtInterpreter(PluginApiculture.items.beeDroneGE, BeeNbtInterpreter.INSTANCE);
|
||||
nbtRegistry.registerNbtInterpreter(PluginApiculture.items.beePrincessGE, BeeNbtInterpreter.INSTANCE);
|
||||
nbtRegistry.registerNbtInterpreter(PluginApiculture.items.beeQueenGE, BeeNbtInterpreter.INSTANCE);
|
||||
}
|
||||
|
||||
private static class BeeNbtInterpreter implements INbtRegistry.INbtInterpreter {
|
||||
public static BeeNbtInterpreter INSTANCE = new BeeNbtInterpreter();
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
public String getSubtypeInfoFromNbt(@Nonnull NBTTagCompound nbtTagCompound) {
|
||||
IAlleleSpecies species = BeeGenome.getSpeciesDirectly(nbtTagCompound);
|
||||
return species == null ? null : species.getUID();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -22,6 +22,8 @@ public class ContainerAlveary extends ContainerTile<TileAlveary> {
|
||||
public ContainerAlveary(InventoryPlayer player, TileAlveary tile) {
|
||||
super(tile, player, 8, 108);
|
||||
ContainerBeeHelper.addSlots(this, tile, false);
|
||||
|
||||
tile.getBeekeepingLogic().clearCachedValues();
|
||||
}
|
||||
|
||||
private int beeProgress = -1;
|
||||
|
||||
@@ -22,6 +22,8 @@ public class ContainerBeeHousing extends ContainerTile<TileBeeHousingBase> imple
|
||||
public ContainerBeeHousing(InventoryPlayer player, TileBeeHousingBase tile, boolean hasFrames) {
|
||||
super(tile, player, 8, 108);
|
||||
ContainerBeeHelper.addSlots(this, tile, hasFrames);
|
||||
|
||||
tile.getBeekeepingLogic().clearCachedValues();
|
||||
}
|
||||
|
||||
private int beeProgress = -1;
|
||||
|
||||
@@ -21,6 +21,8 @@ public class ContainerMinecartBeehouse extends ContainerEntity<EntityMinecartBee
|
||||
public ContainerMinecartBeehouse(InventoryPlayer player, EntityMinecartBeeHousingBase entity, boolean hasFrames) {
|
||||
super(entity, player, 8, 108);
|
||||
ContainerBeeHelper.addSlots(this, entity, hasFrames);
|
||||
|
||||
entity.getBeekeepingLogic().clearCachedValues();
|
||||
}
|
||||
|
||||
private int beeProgress = -1;
|
||||
|
||||
@@ -137,7 +137,7 @@ public class TileAlvearySwarmer extends TileAlveary implements ISidedInventory,
|
||||
int x = getPos().getX() + worldObj.rand.nextInt(40 * 2) - 40;
|
||||
int z = getPos().getZ() + worldObj.rand.nextInt(40 * 2) - 40;
|
||||
|
||||
if (HiveDecorator.tryGenHive(worldObj, x, z, hive)) {
|
||||
if (HiveDecorator.tryGenHive(worldObj, worldObj.rand, x, z, hive)) {
|
||||
pendingSpawns.pop();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,6 +13,7 @@ package forestry.apiculture.worldgen;
|
||||
import javax.annotation.Nullable;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Random;
|
||||
|
||||
import net.minecraft.block.state.IBlockState;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
@@ -52,8 +53,8 @@ public final class Hive {
|
||||
return hiveDescription.getGenChance();
|
||||
}
|
||||
|
||||
public void postGen(World world, BlockPos pos) {
|
||||
hiveDescription.postGen(world, pos);
|
||||
public void postGen(World world, Random rand, BlockPos pos) {
|
||||
hiveDescription.postGen(world, rand, pos);
|
||||
}
|
||||
|
||||
public boolean isGoodBiome(Biome biome) {
|
||||
|
||||
@@ -48,7 +48,7 @@ public abstract class HiveDecorator {
|
||||
List<Hive> hives = PluginApiculture.hiveRegistry.getHives();
|
||||
|
||||
if (Config.generateBeehivesDebug) {
|
||||
decorateHivesDebug(world, chunkX, chunkZ, hives);
|
||||
decorateHivesDebug(world, rand, chunkX, chunkZ, hives);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -72,7 +72,7 @@ public abstract class HiveDecorator {
|
||||
for (Hive hive : hives) {
|
||||
if (hive.genChance() * Config.getBeehivesAmount() >= rand.nextFloat() * 100.0f) {
|
||||
if (hive.isGoodBiome(biome) && hive.isGoodHumidity(humidity)) {
|
||||
if (tryGenHive(world, x, z, hive)) {
|
||||
if (tryGenHive(world, rand, x, z, hive)) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
@@ -81,7 +81,7 @@ public abstract class HiveDecorator {
|
||||
}
|
||||
}
|
||||
|
||||
private static void decorateHivesDebug(World world, int chunkX, int chunkZ, List<Hive> hives) {
|
||||
private static void decorateHivesDebug(World world, Random rand, int chunkX, int chunkZ, List<Hive> hives) {
|
||||
int worldX = (chunkX << 4) + 8;
|
||||
int worldZ = (chunkZ << 4) + 8;
|
||||
Biome biome = world.getBiome(new BlockPos(chunkX, 0, chunkZ));
|
||||
@@ -95,13 +95,13 @@ public abstract class HiveDecorator {
|
||||
continue;
|
||||
}
|
||||
|
||||
tryGenHive(world, worldX + x, worldZ + z, hive);
|
||||
tryGenHive(world, rand, worldX + x, worldZ + z, hive);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static boolean tryGenHive(World world, int x, int z, Hive hive) {
|
||||
public static boolean tryGenHive(World world, Random rand, int x, int z, Hive hive) {
|
||||
|
||||
final BlockPos hivePos = hive.getPosForHive(world, x, z);
|
||||
|
||||
@@ -123,10 +123,10 @@ public abstract class HiveDecorator {
|
||||
return false;
|
||||
}
|
||||
|
||||
return setHive(world, hivePos, hive);
|
||||
return setHive(world, rand, hivePos, hive);
|
||||
}
|
||||
|
||||
private static boolean setHive(World world, BlockPos pos, Hive hive) {
|
||||
private static boolean setHive(World world, Random rand, BlockPos pos, Hive hive) {
|
||||
IBlockState hiveState = hive.getHiveBlockState();
|
||||
Block hiveBlock = hiveState.getBlock();
|
||||
boolean placed = world.setBlockState(pos, hiveState, Constants.FLAG_BLOCK_SYNC);
|
||||
@@ -143,7 +143,7 @@ public abstract class HiveDecorator {
|
||||
hiveBlock.onBlockAdded(world, pos, state);
|
||||
|
||||
if (!Config.generateBeehivesDebug) {
|
||||
hive.postGen(world, pos);
|
||||
hive.postGen(world, rand, pos);
|
||||
}
|
||||
|
||||
if (Config.logHivePlacement) {
|
||||
|
||||
@@ -13,6 +13,7 @@ package forestry.apiculture.worldgen;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Random;
|
||||
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.block.state.IBlockState;
|
||||
@@ -41,23 +42,23 @@ public enum HiveDescription implements IHiveDescription {
|
||||
|
||||
FOREST(IHiveRegistry.HiveType.FOREST, 3.0f, BeeDefinition.FOREST, HiveManager.genHelper.tree()) {
|
||||
@Override
|
||||
public void postGen(World world, BlockPos pos) {
|
||||
super.postGen(world, pos);
|
||||
postGenFlowers(world, pos, flowerStates);
|
||||
public void postGen(World world, Random rand, BlockPos pos) {
|
||||
super.postGen(world, rand, pos);
|
||||
postGenFlowers(world, rand, pos, flowerStates);
|
||||
}
|
||||
},
|
||||
MEADOWS(IHiveRegistry.HiveType.MEADOWS, 1.0f, BeeDefinition.MEADOWS, HiveManager.genHelper.ground(Blocks.DIRT, Blocks.GRASS)) {
|
||||
@Override
|
||||
public void postGen(World world, BlockPos pos) {
|
||||
super.postGen(world, pos);
|
||||
postGenFlowers(world, pos, flowerStates);
|
||||
public void postGen(World world, Random rand, BlockPos pos) {
|
||||
super.postGen(world, rand, pos);
|
||||
postGenFlowers(world, rand, pos, flowerStates);
|
||||
}
|
||||
},
|
||||
DESERT(IHiveRegistry.HiveType.DESERT, 1.0f, BeeDefinition.MODEST, HiveManager.genHelper.ground(Blocks.DIRT, Blocks.GRASS, Blocks.SAND, Blocks.SANDSTONE)) {
|
||||
@Override
|
||||
public void postGen(World world, BlockPos pos) {
|
||||
super.postGen(world, pos);
|
||||
postGenFlowers(world, pos, cactusStates);
|
||||
public void postGen(World world, Random rand, BlockPos pos) {
|
||||
super.postGen(world, rand, pos);
|
||||
postGenFlowers(world, rand, pos, cactusStates);
|
||||
}
|
||||
},
|
||||
JUNGLE(IHiveRegistry.HiveType.JUNGLE, 6.0f, BeeDefinition.TROPICAL, HiveManager.genHelper.tree()),
|
||||
@@ -69,21 +70,21 @@ public enum HiveDescription implements IHiveDescription {
|
||||
},
|
||||
SNOW(IHiveRegistry.HiveType.SNOW, 2.0f, BeeDefinition.WINTRY, HiveManager.genHelper.ground(Blocks.DIRT, Blocks.GRASS, Blocks.SNOW)) {
|
||||
@Override
|
||||
public void postGen(World world, BlockPos pos) {
|
||||
public void postGen(World world, Random rand, BlockPos pos) {
|
||||
BlockPos posAbove = pos.up();
|
||||
if (world.isAirBlock(posAbove)) {
|
||||
world.setBlockState(posAbove, Blocks.SNOW_LAYER.getDefaultState(), Constants.FLAG_BLOCK_SYNC);
|
||||
}
|
||||
|
||||
postGenFlowers(world, pos, flowerStates);
|
||||
postGenFlowers(world, rand, pos, flowerStates);
|
||||
}
|
||||
},
|
||||
SWAMP(IHiveRegistry.HiveType.SWAMP, 2.0f, BeeDefinition.MARSHY, HiveManager.genHelper.ground(Blocks.DIRT, Blocks.GRASS)) {
|
||||
@Override
|
||||
public void postGen(World world, BlockPos pos) {
|
||||
super.postGen(world, pos);
|
||||
public void postGen(World world, Random rand, BlockPos pos) {
|
||||
super.postGen(world, rand, pos);
|
||||
|
||||
postGenFlowers(world, pos, mushroomStates);
|
||||
postGenFlowers(world, rand, pos, mushroomStates);
|
||||
}
|
||||
};
|
||||
|
||||
@@ -146,15 +147,15 @@ public enum HiveDescription implements IHiveDescription {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void postGen(World world, BlockPos pos) {
|
||||
public void postGen(World world, Random rand, BlockPos pos) {
|
||||
|
||||
}
|
||||
|
||||
protected static void postGenFlowers(World world, BlockPos hivePos, List<IBlockState> flowerStates) {
|
||||
protected static void postGenFlowers(World world, Random rand, BlockPos hivePos, List<IBlockState> flowerStates) {
|
||||
int plantedCount = 0;
|
||||
for (int i = 0; i < 10; i++) {
|
||||
int xOffset = world.rand.nextInt(8) - 4;
|
||||
int zOffset = world.rand.nextInt(8) - 4;
|
||||
int xOffset = rand.nextInt(8) - 4;
|
||||
int zOffset = rand.nextInt(8) - 4;
|
||||
BlockPos blockPos = hivePos.add(xOffset, 0, zOffset);
|
||||
if ((xOffset == 0 && zOffset == 0) || !world.isBlockLoaded(blockPos)) {
|
||||
continue;
|
||||
@@ -165,7 +166,7 @@ public enum HiveDescription implements IHiveDescription {
|
||||
continue;
|
||||
}
|
||||
|
||||
IBlockState state = flowerStates.get(world.rand.nextInt(flowerStates.size()));
|
||||
IBlockState state = flowerStates.get(rand.nextInt(flowerStates.size()));
|
||||
Block block = state.getBlock();
|
||||
if (!block.canPlaceBlockAt(world, blockPos)) {
|
||||
continue;
|
||||
|
||||
@@ -12,6 +12,7 @@ package forestry.apiculture.worldgen;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.Random;
|
||||
|
||||
import net.minecraft.block.state.IBlockState;
|
||||
import net.minecraft.init.Blocks;
|
||||
@@ -68,7 +69,7 @@ public class HiveDescriptionSwarmer implements IHiveDescription {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void postGen(World world, BlockPos pos) {
|
||||
public void postGen(World world, Random rand, BlockPos pos) {
|
||||
TileEntity tile = world.getTileEntity(pos);
|
||||
if (tile instanceof TileHive) {
|
||||
((TileHive) tile).setContained(bees);
|
||||
|
||||
@@ -32,6 +32,7 @@ import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
|
||||
import net.minecraftforge.fml.relauncher.Side;
|
||||
import net.minecraftforge.fml.relauncher.SideOnly;
|
||||
import net.minecraftforge.oredict.OreDictionary;
|
||||
import net.minecraftforge.oredict.RecipeSorter;
|
||||
|
||||
import forestry.api.circuits.ChipsetManager;
|
||||
import forestry.api.core.ForestryAPI;
|
||||
@@ -61,6 +62,7 @@ import forestry.core.network.IPacketRegistry;
|
||||
import forestry.core.network.PacketRegistryCore;
|
||||
import forestry.core.proxy.Proxies;
|
||||
import forestry.core.recipes.RecipeUtil;
|
||||
import forestry.core.recipes.ShapedRecipeCustom;
|
||||
import forestry.core.render.TextureManager;
|
||||
import forestry.core.utils.ClimateUtil;
|
||||
import forestry.core.utils.ForestryModEnvWarningCallable;
|
||||
@@ -133,6 +135,8 @@ public class PluginCore extends BlankForestryPlugin {
|
||||
AlleleHelper.instance.init();
|
||||
|
||||
Proxies.render.initRendering();
|
||||
|
||||
RecipeSorter.register("forestry:shaped", ShapedRecipeCustom.class, RecipeSorter.Category.SHAPED, "");
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -10,6 +10,16 @@
|
||||
******************************************************************************/
|
||||
package forestry.core;
|
||||
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.item.ItemBlock;
|
||||
import net.minecraft.util.ResourceLocation;
|
||||
|
||||
import net.minecraftforge.fluids.Fluid;
|
||||
import net.minecraftforge.fluids.FluidRegistry;
|
||||
import net.minecraftforge.fluids.FluidStack;
|
||||
import net.minecraftforge.fml.common.registry.ForgeRegistries;
|
||||
import net.minecraftforge.fml.common.registry.GameRegistry;
|
||||
|
||||
import forestry.api.core.ForestryAPI;
|
||||
import forestry.api.fuels.FuelManager;
|
||||
import forestry.api.fuels.GeneratorFuel;
|
||||
@@ -23,14 +33,6 @@ import forestry.core.utils.Log;
|
||||
import forestry.plugins.BlankForestryPlugin;
|
||||
import forestry.plugins.ForestryPlugin;
|
||||
import forestry.plugins.ForestryPluginUids;
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.item.ItemBlock;
|
||||
import net.minecraft.util.ResourceLocation;
|
||||
import net.minecraftforge.fluids.Fluid;
|
||||
import net.minecraftforge.fluids.FluidRegistry;
|
||||
import net.minecraftforge.fluids.FluidStack;
|
||||
import net.minecraftforge.fml.common.registry.GameData;
|
||||
import net.minecraftforge.fml.common.registry.GameRegistry;
|
||||
|
||||
@ForestryPlugin(pluginID = ForestryPluginUids.FLUIDS, name = "Fluids", author = "mezz", url = Constants.URL, unlocalizedDescription = "for.plugin.fluids.description")
|
||||
public class PluginFluids extends BlankForestryPlugin {
|
||||
@@ -62,14 +64,20 @@ public class PluginFluids extends BlankForestryPlugin {
|
||||
if (fluidBlock != null) {
|
||||
String name = "fluid." + forestryFluid.getTag();
|
||||
fluidBlock.setUnlocalizedName("forestry." + name);
|
||||
GameRegistry.registerBlock(fluidBlock, ItemBlock.class, name);
|
||||
fluidBlock.setRegistryName(name);
|
||||
GameRegistry.register(fluidBlock);
|
||||
|
||||
ItemBlock itemBlock = new ItemBlock(fluidBlock);
|
||||
itemBlock.setRegistryName(name);
|
||||
GameRegistry.register(itemBlock);
|
||||
|
||||
Proxies.render.registerFluidStateMapper(fluidBlock, forestryFluid);
|
||||
if (forestryFluid.getOtherContainers().isEmpty()) {
|
||||
FluidRegistry.addBucketForFluid(fluid);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
ResourceLocation resourceLocation = GameData.getBlockRegistry().getNameForObject(fluidBlock);
|
||||
ResourceLocation resourceLocation = ForgeRegistries.BLOCKS.getKey(fluidBlock);
|
||||
Log.warning("Pre-existing {} fluid block detected, deferring to {}:{}, "
|
||||
+ "this may cause issues if the server/client have different mod load orders, "
|
||||
+ "recommended that you disable all but one instance of {} fluid blocks via your configs.", fluid.getName(), resourceLocation.getResourceDomain(), resourceLocation.getResourcePath(), fluid.getName());
|
||||
|
||||
@@ -115,11 +115,15 @@ public abstract class Genome implements IGenome {
|
||||
* Quickly gets the species without loading the whole genome.
|
||||
* We need this because the client uses the species for rendering.
|
||||
*/
|
||||
protected static IAlleleSpecies getSpeciesDirectly(ItemStack itemStack) {
|
||||
public static IAlleleSpecies getSpeciesDirectly(ItemStack itemStack) {
|
||||
NBTTagCompound nbtTagCompound = itemStack.getTagCompound();
|
||||
if (nbtTagCompound == null) {
|
||||
return null;
|
||||
}
|
||||
return getSpeciesDirectly(nbtTagCompound);
|
||||
}
|
||||
|
||||
public static IAlleleSpecies getSpeciesDirectly(@Nonnull NBTTagCompound nbtTagCompound) {
|
||||
|
||||
NBTTagCompound genomeNBT = nbtTagCompound.getCompoundTag("Genome");
|
||||
if (genomeNBT == null) {
|
||||
|
||||
@@ -16,18 +16,6 @@ public class ForestryTooltipCallback implements ITooltipCallback<ItemStack> {
|
||||
|
||||
private final ArrayListMultimap<Integer, String> tooltips = ArrayListMultimap.create();
|
||||
|
||||
public void addToTooltip(int index, List<String> tooltip) {
|
||||
tooltips.get(index).addAll(tooltip);
|
||||
}
|
||||
|
||||
public void addToTooltip(int index, String tooltip) {
|
||||
tooltips.get(index).add(tooltip);
|
||||
}
|
||||
|
||||
public List<String> getTooltip(int index) {
|
||||
return tooltips.get(index);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onTooltip(int index, boolean input, ItemStack ingredient, List<String> tooltip) {
|
||||
List<String> tip = tooltips.get(index);
|
||||
@@ -36,20 +24,18 @@ public class ForestryTooltipCallback implements ITooltipCallback<ItemStack> {
|
||||
}
|
||||
}
|
||||
|
||||
public void clearTooltip(){
|
||||
tooltips.clear();
|
||||
}
|
||||
|
||||
public void addChanceTooltip(int index, float chance) {
|
||||
if (chance <= 0.0F) {
|
||||
tooltips.get(index).add(TextFormatting.GRAY + String.format(Translator.translateToLocal("forestry.jei.chance"), Translator.translateToLocal("forestry.jei.chance.never")));
|
||||
} else if (chance < 0.01F) {
|
||||
tooltips.get(index).add(TextFormatting.GRAY + String.format(Translator.translateToLocal("forestry.jei.chance"), Translator.translateToLocal("forestry.jei.chance.lessThan1")));
|
||||
} else if (chance != 1.0F) {
|
||||
NumberFormat percentFormat = NumberFormat.getPercentInstance();
|
||||
percentFormat.setMaximumFractionDigits(2);
|
||||
tooltips.get(index).add(TextFormatting.GRAY + String.format(Translator.translateToLocal("forestry.jei.chance"), String.valueOf(percentFormat.format(chance))));
|
||||
if (chance < 0) {
|
||||
chance = 0;
|
||||
} else if (chance > 1.0) {
|
||||
chance = 1.0f;
|
||||
}
|
||||
|
||||
NumberFormat percentFormat = NumberFormat.getPercentInstance();
|
||||
percentFormat.setMaximumFractionDigits(2);
|
||||
String chanceString = String.valueOf(percentFormat.format(chance));
|
||||
|
||||
tooltips.get(index).add(TextFormatting.GRAY + Translator.translateToLocalFormatted("for.jei.chance", chanceString));
|
||||
}
|
||||
|
||||
}
|
||||
@@ -12,11 +12,54 @@ package forestry.core.tiles;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
|
||||
import net.minecraft.util.EnumFacing;
|
||||
|
||||
import net.minecraftforge.fluids.Fluid;
|
||||
import net.minecraftforge.fluids.FluidStack;
|
||||
import net.minecraftforge.fluids.FluidTankInfo;
|
||||
import net.minecraftforge.fluids.IFluidHandler;
|
||||
import net.minecraftforge.fluids.capability.IFluidTankProperties;
|
||||
|
||||
import forestry.core.fluids.ITankManager;
|
||||
|
||||
public interface ILiquidTankTile extends ILocatable {
|
||||
public interface ILiquidTankTile extends ILocatable, IFluidHandler {
|
||||
|
||||
@Nonnull
|
||||
ITankManager getTankManager();
|
||||
|
||||
@Override
|
||||
default int fill(EnumFacing from, FluidStack resource, boolean doFill) {
|
||||
return getTankManager().fill(resource, doFill);
|
||||
}
|
||||
|
||||
@Override
|
||||
default FluidStack drain(EnumFacing from, FluidStack resource, boolean doDrain) {
|
||||
return getTankManager().drain(resource, doDrain);
|
||||
}
|
||||
|
||||
@Override
|
||||
default FluidStack drain(EnumFacing from, int maxDrain, boolean doDrain) {
|
||||
return getTankManager().drain(maxDrain, doDrain);
|
||||
}
|
||||
|
||||
@Override
|
||||
default boolean canFill(EnumFacing from, Fluid fluid) {
|
||||
return getTankManager().canFillFluidType(new FluidStack(fluid, Fluid.BUCKET_VOLUME));
|
||||
}
|
||||
|
||||
@Override
|
||||
default boolean canDrain(EnumFacing from, Fluid fluid) {
|
||||
return getTankManager().canDrainFluidType(new FluidStack(fluid, Fluid.BUCKET_VOLUME));
|
||||
}
|
||||
|
||||
@Override
|
||||
default FluidTankInfo[] getTankInfo(EnumFacing from) {
|
||||
IFluidTankProperties[] tankProperties = getTankManager().getTankProperties();
|
||||
FluidTankInfo[] tankInfos = new FluidTankInfo[tankProperties.length];
|
||||
for (int i = 0; i < tankProperties.length; i++) {
|
||||
IFluidTankProperties fluidTankProperties = tankProperties[i];
|
||||
tankInfos[i] = new FluidTankInfo(fluidTankProperties.getContents(), fluidTankProperties.getCapacity());
|
||||
}
|
||||
return tankInfos;
|
||||
}
|
||||
}
|
||||
@@ -15,6 +15,7 @@ import java.io.IOException;
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.init.SoundEvents;
|
||||
import net.minecraft.util.SoundCategory;
|
||||
import net.minecraft.util.SoundEvent;
|
||||
import net.minecraft.util.math.AxisAlignedBB;
|
||||
|
||||
import forestry.api.genetics.ISpeciesRoot;
|
||||
@@ -68,7 +69,7 @@ public abstract class TileNaturalistChest extends TileBase implements IPagedInve
|
||||
prevLidAngle = lidAngle;
|
||||
|
||||
if (numPlayersUsing > 0 && lidAngle == 0.0F) {
|
||||
playLidSound("random.chestopen");
|
||||
playLidSound(SoundEvents.BLOCK_CHEST_OPEN);
|
||||
}
|
||||
|
||||
if (numPlayersUsing == 0 && lidAngle > 0.0F || numPlayersUsing > 0 && lidAngle < 1.0F) {
|
||||
@@ -83,13 +84,13 @@ public abstract class TileNaturalistChest extends TileBase implements IPagedInve
|
||||
lidAngle = Math.max(Math.min(lidAngle, 1), 0);
|
||||
|
||||
if (lidAngle < 0.5F && oldAngle >= 0.5F) {
|
||||
playLidSound("random.chestclosed");
|
||||
playLidSound(SoundEvents.BLOCK_CHEST_CLOSE);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void playLidSound(String sound) {
|
||||
this.worldObj.playSound(null, getPos(), SoundEvents.BLOCK_CHEST_OPEN, SoundCategory.BLOCKS, 0.5F, this.worldObj.rand.nextFloat() * 0.1F + 0.9F);
|
||||
private void playLidSound(SoundEvent sound) {
|
||||
this.worldObj.playSound(null, getPos(), sound, SoundCategory.BLOCKS, 0.5F, this.worldObj.rand.nextFloat() * 0.1F + 0.9F);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -23,12 +23,12 @@ import net.minecraft.item.Item;
|
||||
import net.minecraft.item.ItemBlock;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.nbt.NBTTagCompound;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.util.ResourceLocation;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
import net.minecraftforge.fml.common.registry.FMLControlledNamespacedRegistry;
|
||||
import net.minecraftforge.fml.common.registry.GameData;
|
||||
import net.minecraftforge.fml.common.registry.ForgeRegistries;
|
||||
import net.minecraftforge.fml.common.registry.IForgeRegistry;
|
||||
import net.minecraftforge.oredict.OreDictionary;
|
||||
|
||||
public abstract class ItemStackUtil {
|
||||
@@ -68,8 +68,8 @@ public abstract class ItemStackUtil {
|
||||
if (item == null) {
|
||||
return null;
|
||||
}
|
||||
FMLControlledNamespacedRegistry<Item> itemRegistry = GameData.getItemRegistry();
|
||||
return itemRegistry.getNameForObject(item);
|
||||
IForgeRegistry<Item> itemRegistry = ForgeRegistries.ITEMS;
|
||||
return itemRegistry.getKey(item);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -125,12 +125,8 @@ public abstract class ItemStackUtil {
|
||||
if (itemName == null) {
|
||||
return null;
|
||||
}
|
||||
FMLControlledNamespacedRegistry<Item> itemRegistry = GameData.getItemRegistry();
|
||||
int registryID = itemRegistry.getId(itemName);
|
||||
if (registryID == -1) {
|
||||
return null;
|
||||
}
|
||||
return itemRegistry.getRaw(registryID);
|
||||
IForgeRegistry<Item> itemRegistry = ForgeRegistries.ITEMS;
|
||||
return itemRegistry.getValue(itemName);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -141,8 +137,8 @@ public abstract class ItemStackUtil {
|
||||
if (block == null) {
|
||||
return null;
|
||||
}
|
||||
FMLControlledNamespacedRegistry<Block> blockRegistry = GameData.getBlockRegistry();
|
||||
return blockRegistry.getNameForObject(block);
|
||||
IForgeRegistry<Block> blockRegistry = ForgeRegistries.BLOCKS;
|
||||
return blockRegistry.getKey(block);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -169,12 +165,8 @@ public abstract class ItemStackUtil {
|
||||
if (itemName == null) {
|
||||
return null;
|
||||
}
|
||||
FMLControlledNamespacedRegistry<Block> blockRegistry = GameData.getBlockRegistry();
|
||||
int registryID = blockRegistry.getId(itemName);
|
||||
if (registryID == -1) {
|
||||
return null;
|
||||
}
|
||||
return blockRegistry.getRaw(registryID);
|
||||
IForgeRegistry<Block> blockRegistry = ForgeRegistries.BLOCKS;
|
||||
return blockRegistry.getValue(itemName);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -174,4 +174,59 @@ public class VillagerTradeLists {
|
||||
recipeList.add(new MerchantRecipe(randomLog, new ItemStack(Items.EMERALD, emeraldsAmount), itemToSell));
|
||||
}
|
||||
}
|
||||
public static class GiveItemForTwoItems implements EntityVillager.ITradeList {
|
||||
@Nonnull
|
||||
public ItemStack buyingItemStack;
|
||||
@Nullable
|
||||
public EntityVillager.PriceInfo buyingPriceInfo;
|
||||
@Nonnull
|
||||
public ItemStack buyingItemStackTwo;
|
||||
@Nullable
|
||||
public EntityVillager.PriceInfo buyingPriceItemTwoInfo;
|
||||
@Nonnull
|
||||
public ItemStack sellingItemstack;
|
||||
@Nullable
|
||||
public EntityVillager.PriceInfo sellingPriceInfo;
|
||||
|
||||
public GiveItemForTwoItems(
|
||||
@Nonnull ItemStack buyingItemStack,
|
||||
@Nullable EntityVillager.PriceInfo buyingPriceInfo,
|
||||
@Nonnull ItemStack buyingItemStackTwo,
|
||||
@Nullable EntityVillager.PriceInfo buyingPriceItemTwoInfo,
|
||||
@Nonnull ItemStack sellingItemstack,
|
||||
@Nullable EntityVillager.PriceInfo sellingPriceInfo) {
|
||||
this.buyingItemStack = buyingItemStack;
|
||||
this.buyingPriceInfo = buyingPriceInfo;
|
||||
this.buyingItemStackTwo = buyingItemStackTwo;
|
||||
this.buyingPriceItemTwoInfo = buyingPriceItemTwoInfo;
|
||||
this.sellingItemstack = sellingItemstack;
|
||||
this.sellingPriceInfo = sellingPriceInfo;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void modifyMerchantRecipeList(MerchantRecipeList recipeList, Random random) {
|
||||
int buyAmount = 1;
|
||||
if (this.buyingPriceInfo != null) {
|
||||
buyAmount = this.buyingPriceInfo.getPrice(random);
|
||||
}
|
||||
|
||||
int buyTwoAmount = 1;
|
||||
if (this.buyingPriceItemTwoInfo != null) {
|
||||
buyTwoAmount = this.buyingPriceItemTwoInfo.getPrice(random);
|
||||
}
|
||||
|
||||
int sellAmount = 1;
|
||||
if (this.sellingPriceInfo != null) {
|
||||
sellAmount = this.sellingPriceInfo.getPrice(random);
|
||||
}
|
||||
|
||||
ItemStack buyItemStack = this.buyingItemStack.copy();
|
||||
buyItemStack.stackSize = buyAmount;
|
||||
ItemStack buyItemStackTwo = this.buyingItemStackTwo.copy();
|
||||
buyItemStackTwo.stackSize = buyTwoAmount;
|
||||
ItemStack sellItemStack = this.sellingItemstack.copy();
|
||||
sellItemStack.stackSize = sellAmount;
|
||||
recipeList.add(new MerchantRecipe(buyItemStack, buyItemStackTwo, sellItemStack));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -10,6 +10,8 @@
|
||||
******************************************************************************/
|
||||
package forestry.factory.recipes;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
import net.minecraft.item.ItemStack;
|
||||
|
||||
import net.minecraftforge.fluids.FluidStack;
|
||||
@@ -21,10 +23,11 @@ public class SqueezerRecipe implements ISqueezerRecipe {
|
||||
private final int processingTime;
|
||||
private final ItemStack[] resources;
|
||||
private final FluidStack fluidOutput;
|
||||
@Nullable
|
||||
private final ItemStack remnants;
|
||||
private final float remnantsChance;
|
||||
|
||||
public SqueezerRecipe(int processingTime, ItemStack[] resources, FluidStack fluidOutput, ItemStack remnants, float remnantsChance) {
|
||||
public SqueezerRecipe(int processingTime, ItemStack[] resources, FluidStack fluidOutput, @Nullable ItemStack remnants, float remnantsChance) {
|
||||
this.processingTime = processingTime;
|
||||
this.resources = resources;
|
||||
this.fluidOutput = fluidOutput;
|
||||
@@ -38,6 +41,7 @@ public class SqueezerRecipe implements ISqueezerRecipe {
|
||||
}
|
||||
|
||||
@Override
|
||||
@Nullable
|
||||
public ItemStack getRemnants() {
|
||||
return remnants;
|
||||
}
|
||||
|
||||
@@ -22,6 +22,12 @@ public class BottlerRecipeHandler implements IRecipeHandler<BottlerRecipeWrapper
|
||||
return ForestryRecipeCategoryUid.BOTTLER;
|
||||
}
|
||||
|
||||
@Nonnull
|
||||
@Override
|
||||
public String getRecipeCategoryUid(@Nonnull BottlerRecipeWrapper recipe) {
|
||||
return ForestryRecipeCategoryUid.BOTTLER;
|
||||
}
|
||||
|
||||
@Nonnull
|
||||
@Override
|
||||
public IRecipeWrapper getRecipeWrapper(@Nonnull BottlerRecipeWrapper recipe) {
|
||||
|
||||
@@ -22,6 +22,12 @@ public class CarpenterRecipeHandler implements IRecipeHandler<CarpenterRecipeWra
|
||||
return ForestryRecipeCategoryUid.CARPENTER;
|
||||
}
|
||||
|
||||
@Nonnull
|
||||
@Override
|
||||
public String getRecipeCategoryUid(@Nonnull CarpenterRecipeWrapper recipe) {
|
||||
return ForestryRecipeCategoryUid.CARPENTER;
|
||||
}
|
||||
|
||||
@Nonnull
|
||||
@Override
|
||||
public IRecipeWrapper getRecipeWrapper(@Nonnull CarpenterRecipeWrapper recipe) {
|
||||
|
||||
+10
-11
@@ -5,6 +5,7 @@ import java.util.Comparator;
|
||||
import java.util.Map;
|
||||
import java.util.Map.Entry;
|
||||
import java.util.PriorityQueue;
|
||||
import java.util.Queue;
|
||||
import java.util.Set;
|
||||
|
||||
import net.minecraft.client.Minecraft;
|
||||
@@ -22,7 +23,6 @@ import mezz.jei.api.gui.IDrawableStatic;
|
||||
import mezz.jei.api.gui.IGuiItemStackGroup;
|
||||
import mezz.jei.api.gui.IRecipeLayout;
|
||||
import mezz.jei.api.recipe.IRecipeWrapper;
|
||||
import mezz.jei.gui.ingredients.GuiItemStackGroup;
|
||||
|
||||
public class CentrifugeRecipeCategory extends ForestryRecipeCategory {
|
||||
|
||||
@@ -41,8 +41,7 @@ public class CentrifugeRecipeCategory extends ForestryRecipeCategory {
|
||||
private final static ResourceLocation guiTexture = new ForestryResource("textures/gui/centrifugesocket.png");
|
||||
@Nonnull
|
||||
private final IDrawableAnimated arrow;
|
||||
private final ForestryTooltipCallback tooltip = new ForestryTooltipCallback();
|
||||
|
||||
|
||||
public CentrifugeRecipeCategory(IGuiHelper guiHelper) {
|
||||
super(guiHelper.createDrawable(guiTexture, 25, 18, 126, 54), "tile.for.centrifuge.name");
|
||||
|
||||
@@ -68,17 +67,17 @@ public class CentrifugeRecipeCategory extends ForestryRecipeCategory {
|
||||
guiItemStacks.init(inputSlot, true, 4, 18);
|
||||
guiItemStacks.setFromRecipe(inputSlot, recipeWrapper.getInputs());
|
||||
CentrifugeRecipeWrapper centrifugeWrapper = (CentrifugeRecipeWrapper) recipeWrapper;
|
||||
tooltip.clearTooltip();
|
||||
setResults(centrifugeWrapper.getRecipe().getAllProducts(), (GuiItemStackGroup) guiItemStacks);
|
||||
ForestryTooltipCallback tooltip = new ForestryTooltipCallback();
|
||||
setResults(tooltip, centrifugeWrapper.getRecipe().getAllProducts(), guiItemStacks);
|
||||
guiItemStacks.addTooltipCallback(tooltip);
|
||||
}
|
||||
|
||||
private void setResults(Map<ItemStack, Float> outputs, GuiItemStackGroup guiItemStacks) {
|
||||
private static void setResults(ForestryTooltipCallback tooltip, Map<ItemStack, Float> outputs, IGuiItemStackGroup guiItemStacks) {
|
||||
Set<Entry<ItemStack, Float>> entrySet = outputs.entrySet();
|
||||
if (entrySet.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
PriorityQueue<Entry<ItemStack, Float>> sortByChance = new PriorityQueue<>(entrySet.size(), highestChanceComparator);
|
||||
Queue<Entry<ItemStack, Float>> sortByChance = new PriorityQueue<>(entrySet.size(), highestChanceComparator);
|
||||
sortByChance.addAll(entrySet);
|
||||
|
||||
int i = 0;
|
||||
@@ -89,10 +88,10 @@ public class CentrifugeRecipeCategory extends ForestryRecipeCategory {
|
||||
}
|
||||
int x = 72 + OUTPUTS[i][0] * 18;
|
||||
int y = OUTPUTS[i][1] * 18;
|
||||
int ID = outputSlot + i;
|
||||
guiItemStacks.init(ID, false, x, y);
|
||||
guiItemStacks.set(ID, stack.getKey());
|
||||
tooltip.addChanceTooltip(ID + 1, stack.getValue());
|
||||
int slotIndex = outputSlot + i;
|
||||
guiItemStacks.init(slotIndex, false, x, y);
|
||||
guiItemStacks.set(slotIndex, stack.getKey());
|
||||
tooltip.addChanceTooltip(slotIndex, stack.getValue());
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -24,6 +24,12 @@ public class CentrifugeRecipeHandler implements IRecipeHandler<CentrifugeRecipeW
|
||||
return ForestryRecipeCategoryUid.CENTRIFUGE;
|
||||
}
|
||||
|
||||
@Nonnull
|
||||
@Override
|
||||
public String getRecipeCategoryUid(@Nonnull CentrifugeRecipeWrapper recipe) {
|
||||
return ForestryRecipeCategoryUid.CENTRIFUGE;
|
||||
}
|
||||
|
||||
@Nonnull
|
||||
@Override
|
||||
public IRecipeWrapper getRecipeWrapper(@Nonnull CentrifugeRecipeWrapper recipe) {
|
||||
|
||||
@@ -22,6 +22,12 @@ public class FabricatorRecipeHandler implements IRecipeHandler<FabricatorRecipeW
|
||||
return ForestryRecipeCategoryUid.FABRICATOR;
|
||||
}
|
||||
|
||||
@Nonnull
|
||||
@Override
|
||||
public String getRecipeCategoryUid(@Nonnull FabricatorRecipeWrapper recipe) {
|
||||
return ForestryRecipeCategoryUid.FABRICATOR;
|
||||
}
|
||||
|
||||
@Nonnull
|
||||
@Override
|
||||
public IRecipeWrapper getRecipeWrapper(@Nonnull FabricatorRecipeWrapper recipe) {
|
||||
|
||||
@@ -22,6 +22,12 @@ public class FermenterRecipeHandler implements IRecipeHandler<FermenterRecipeWra
|
||||
return ForestryRecipeCategoryUid.FERMENTER;
|
||||
}
|
||||
|
||||
@Nonnull
|
||||
@Override
|
||||
public String getRecipeCategoryUid(@Nonnull FermenterRecipeWrapper recipe) {
|
||||
return ForestryRecipeCategoryUid.FERMENTER;
|
||||
}
|
||||
|
||||
@Nonnull
|
||||
@Override
|
||||
public IRecipeWrapper getRecipeWrapper(@Nonnull FermenterRecipeWrapper recipe) {
|
||||
|
||||
@@ -22,6 +22,12 @@ public class MoistenerRecipeHandler implements IRecipeHandler<MoistenerRecipeWra
|
||||
return ForestryRecipeCategoryUid.MOISTENER;
|
||||
}
|
||||
|
||||
@Nonnull
|
||||
@Override
|
||||
public String getRecipeCategoryUid(@Nonnull MoistenerRecipeWrapper recipe) {
|
||||
return ForestryRecipeCategoryUid.MOISTENER;
|
||||
}
|
||||
|
||||
@Nonnull
|
||||
@Override
|
||||
public IRecipeWrapper getRecipeWrapper(@Nonnull MoistenerRecipeWrapper recipe) {
|
||||
|
||||
@@ -20,6 +20,12 @@ public class RainmakerRecipeHandler implements IRecipeHandler<RainmakerRecipeWra
|
||||
return ForestryRecipeCategoryUid.RAINMAKER;
|
||||
}
|
||||
|
||||
@Nonnull
|
||||
@Override
|
||||
public String getRecipeCategoryUid(@Nonnull RainmakerRecipeWrapper recipe) {
|
||||
return ForestryRecipeCategoryUid.RAINMAKER;
|
||||
}
|
||||
|
||||
@Nonnull
|
||||
@Override
|
||||
public IRecipeWrapper getRecipeWrapper(@Nonnull RainmakerRecipeWrapper recipe) {
|
||||
|
||||
@@ -35,8 +35,7 @@ public class SqueezerRecipeCategory extends ForestryRecipeCategory {
|
||||
private final IDrawableAnimated arrow;
|
||||
@Nonnull
|
||||
private final IDrawable tankOverlay;
|
||||
private final ForestryTooltipCallback tooltip = new ForestryTooltipCallback();
|
||||
|
||||
|
||||
public SqueezerRecipeCategory(@Nonnull IGuiHelper guiHelper) {
|
||||
super(guiHelper.createDrawable(guiTexture, 9, 16, 158, 62), "tile.for.squeezer.name");
|
||||
|
||||
@@ -70,7 +69,7 @@ public class SqueezerRecipeCategory extends ForestryRecipeCategory {
|
||||
|
||||
guiItemStacks.init(craftOutputSlot, false, 87, 43);
|
||||
guiItemStacks.set(craftOutputSlot, wrapper.getOutputs());
|
||||
tooltip.clearTooltip();
|
||||
ForestryTooltipCallback tooltip = new ForestryTooltipCallback();
|
||||
tooltip.addChanceTooltip(craftOutputSlot, chance);
|
||||
setIngredients(guiItemStacks, wrapper.getInputs());
|
||||
|
||||
|
||||
@@ -31,6 +31,12 @@ public class SqueezerRecipeHandler<R extends ForestryRecipeWrapper> implements I
|
||||
return ForestryRecipeCategoryUid.SQUEEZER;
|
||||
}
|
||||
|
||||
@Nonnull
|
||||
@Override
|
||||
public String getRecipeCategoryUid(@Nonnull R recipe) {
|
||||
return ForestryRecipeCategoryUid.SQUEEZER;
|
||||
}
|
||||
|
||||
@Nonnull
|
||||
@Override
|
||||
public IRecipeWrapper getRecipeWrapper(@Nonnull R recipe) {
|
||||
@@ -45,16 +51,7 @@ public class SqueezerRecipeHandler<R extends ForestryRecipeWrapper> implements I
|
||||
if (wrapper.getInputs() == null || wrapper.getInputs().isEmpty()) {
|
||||
return false;
|
||||
}
|
||||
if (wrapper.getOutputs() == null || wrapper.getOutputs().isEmpty()) {
|
||||
return false;
|
||||
}
|
||||
if (wrapper.getRecipe() instanceof ISqueezerContainerRecipe) {
|
||||
ISqueezerContainerRecipe recipe = (ISqueezerContainerRecipe) wrapper.getRecipe();
|
||||
return recipe.getProcessingTime() > 0 && recipe.getRemnantsChance() > 0;
|
||||
} else {
|
||||
ISqueezerRecipe recipe = (ISqueezerRecipe) wrapper.getRecipe();
|
||||
return recipe.getProcessingTime() > 0 && recipe.getRemnantsChance() > 0;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -34,7 +34,8 @@ public class SqueezerRecipeWrapper extends AbstractSqueezerRecipeWrapper<ISqueez
|
||||
@Nonnull
|
||||
@Override
|
||||
public List<ItemStack> getOutputs() {
|
||||
return Collections.singletonList(getRecipe().getRemnants());
|
||||
ItemStack remnants = getRecipe().getRemnants();
|
||||
return remnants == null ? Collections.emptyList() : Collections.singletonList(remnants);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -22,6 +22,12 @@ public class StillRecipeHandler implements IRecipeHandler<StillRecipeWrapper> {
|
||||
return ForestryRecipeCategoryUid.STILL;
|
||||
}
|
||||
|
||||
@Nonnull
|
||||
@Override
|
||||
public String getRecipeCategoryUid(@Nonnull StillRecipeWrapper recipe) {
|
||||
return ForestryRecipeCategoryUid.STILL;
|
||||
}
|
||||
|
||||
@Nonnull
|
||||
@Override
|
||||
public IRecipeWrapper getRecipeWrapper(@Nonnull StillRecipeWrapper recipe) {
|
||||
|
||||
@@ -13,6 +13,7 @@ package forestry.lepidopterology.commands;
|
||||
import net.minecraft.command.ICommandSender;
|
||||
import net.minecraft.command.WrongUsageException;
|
||||
import net.minecraft.server.MinecraftServer;
|
||||
import net.minecraft.util.EntitySelectors;
|
||||
|
||||
import forestry.core.commands.CommandHelpers;
|
||||
import forestry.core.commands.SubCommand;
|
||||
@@ -43,10 +44,8 @@ public class CommandButterfly extends SubCommand {
|
||||
CommandHelpers.throwWrongUsage(sender, this);
|
||||
}
|
||||
|
||||
for (Object entity : sender.getEntityWorld().getLoadedEntityList()) {
|
||||
if (entity instanceof EntityButterfly) {
|
||||
((EntityButterfly) entity).setDead();
|
||||
}
|
||||
for (EntityButterfly butterfly : sender.getEntityWorld().getEntities(EntityButterfly.class, EntitySelectors.IS_ALIVE)) {
|
||||
butterfly.setDead();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -131,9 +131,11 @@ public class EntityButterfly extends EntityCreature implements IEntityButterfly
|
||||
public void writeEntityToNBT(NBTTagCompound nbttagcompound) {
|
||||
super.writeEntityToNBT(nbttagcompound);
|
||||
|
||||
NBTTagCompound bio = new NBTTagCompound();
|
||||
contained.writeToNBT(bio);
|
||||
nbttagcompound.setTag("BTFLY", bio);
|
||||
if (contained != null) {
|
||||
NBTTagCompound bio = new NBTTagCompound();
|
||||
contained.writeToNBT(bio);
|
||||
nbttagcompound.setTag("BTFLY", bio);
|
||||
}
|
||||
|
||||
if (pollen != null) {
|
||||
NBTTagCompound pln = new NBTTagCompound();
|
||||
|
||||
@@ -21,4 +21,5 @@ public class ForestryPluginUids {
|
||||
public static final String BUILDCRAFT_TRANSPORT = "forestry.buildcraft.transport";
|
||||
public static final String CHISEL = "forestry.chisel";
|
||||
public static final String NATURA = "forestry.natura";
|
||||
public static final String INDUSTRIALCRAFT2 = "forestry.industrialcraft2";
|
||||
}
|
||||
@@ -67,7 +67,7 @@ import ic2.api.item.IC2Items;
|
||||
import ic2.api.recipe.RecipeInputItemStack;
|
||||
import ic2.api.recipe.Recipes;
|
||||
|
||||
@ForestryPlugin(pluginID = "IC2", name = "IndustrialCraft2", author = "SirSengir", url = Constants.URL, unlocalizedDescription = "for.plugin.ic2.description")
|
||||
@ForestryPlugin(pluginID = ForestryPluginUids.INDUSTRIALCRAFT2, name = "IndustrialCraft2", author = "SirSengir", url = Constants.URL, unlocalizedDescription = "for.plugin.ic2.description")
|
||||
public class PluginIC2 extends BlankForestryPlugin {
|
||||
public static final String modId = "IC2";
|
||||
public static PluginIC2 instance;
|
||||
|
||||
Reference in new issue
Block a user