Compare commits

...
17 Commits
53 changed files with 761 additions and 554 deletions

No files matched your search

+1 -1
View File
@@ -9,7 +9,7 @@ Forestry is a modification for the game Minecraft and known primarily for its fa
[Wiki](http://forestry.sengir.net/)
[Latest Builds for 1.9](http://jenkins.ic2.player.to/job/Forestry_5/)
[Latest Builds for 1.10 / 1.10.2](http://jenkins.ic2.player.to/job/Forestry_5/)
[IRC #forestry on esper.net](http://webchat.esper.net/?nick=ForestryGithub...&channels=forestry&prompt=1)
+2 -2
View File
@@ -7,5 +7,5 @@ jei_version=3.7.3.221
ic2_version=2.6.5-ex110
version_major=5
version_minor=1
version_patch=11
version_minor=2
version_patch=2
+1 -1
Submodule lang updated: 82c5455d7b...0d52088d32.
@@ -10,10 +10,6 @@ import java.util.List;
public interface ICircuit {
String getUID();
boolean requiresDiscovery();
int getLimit();
String getUnlocalizedName();
boolean isCircuitable(Object tile);
@@ -5,43 +5,42 @@
******************************************************************************/
package forestry.api.storage;
import java.util.List;
import javax.annotation.Nonnull;
import java.util.function.Predicate;
import net.minecraft.item.ItemStack;
public interface IBackpackDefinition extends Predicate<ItemStack> {
/**
* To make your own backpack, create a backpack definition and register it with
* {@link IBackpackInterface#registerBackpackDefinition(String, IBackpackDefinition)}.
*/
public interface IBackpackDefinition {
/**
* @return Human-readable name of the backpack.
*/
@Nonnull
String getName(ItemStack backpack);
/**
* @return Primary colour for the backpack icon.
* @return Primary color for the backpack icon.
*/
int getPrimaryColour();
/**
* @return Secondary colour for backpack icon.
* @return Secondary color for backpack icon, normally white.
*/
int getSecondaryColour();
/**
* Adds an item as valid for this backpack.
* Filters items that can be put into a backpack.
*
* @param validItem
* For Backpack Implementers: you can create a new filter with
* {@link IBackpackInterface#createBackpackFilter()} or
* {@link IBackpackInterface#createNaturalistBackpackFilter(String)}
* or implement your own.
*
* @return the backpack's item filter.
*/
void addValidItem(ItemStack validItem);
void addValidItems(List<ItemStack> validItems);
void addValidOreDictName(String oreDictName);
/**
* Returns true if the ItemStack is a valid item for this backpack type.
*/
@Override
boolean test(ItemStack itemstack);
@Nonnull
Predicate<ItemStack> getFilter();
}
@@ -0,0 +1,45 @@
package forestry.api.storage;
import java.util.function.Predicate;
import net.minecraft.item.ItemStack;
import net.minecraftforge.oredict.OreDictionary;
/**
* A configurable backpack filter. Useful for implementers of {@link IBackpackDefinition}.
* Get a new instance from {@link IBackpackInterface#createBackpackFilter()}.
*/
public interface IBackpackFilterConfigurable extends Predicate<ItemStack> {
/**
* Adds an item as valid for this backpack to pick up.
*/
void acceptItem(ItemStack validItem);
/**
* Adds an item as invalid for this backpack, used to make exceptions to oreDictionary matches.
*
* @see #acceptOreDictName(String)
*/
void rejectItem(ItemStack invalidItem);
/**
* Adds an ore dictionary name as valid for this backpack.
* The backpack will pick up any item that has this oreDictName.
*
* @see OreDictionary
*/
void acceptOreDictName(String oreDictName);
/**
* Removes an ore dictionary name as valid for this backpack.
* The backpack will not pick up any item that has this oreDictName.
*
* @see OreDictionary
*/
void rejectOreDictName(String oreDictName);
/**
* Clear all the rules from this filter.
*/
void clear();
}
@@ -7,32 +7,83 @@ package forestry.api.storage;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import java.util.function.Predicate;
import forestry.api.genetics.ISpeciesRoot;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraftforge.fml.common.registry.GameRegistry;
import net.minecraftforge.fml.common.registry.IForgeRegistryEntry;
import net.minecraftforge.oredict.OreDictionary;
/**
* The Backpack Interface allows you to add items to Forestry backpacks or create your own backpacks.
* <p>
* To create your own backpack, create an {@link IBackpackDefinition}.
* Backpack definitions have a filter, which you can create here with
* {@link #createBackpackFilter()}
* or {@link #createNaturalistBackpackFilter(String)}
* or create your own.
* <p>
* After you've registered your backpack definition, create the item with
* {@link #createBackpack(String, EnumBackpackType)}
* or {@link #createNaturalistBackpack(String, ISpeciesRoot)}
* and then register the returned item with {@link GameRegistry#register(IForgeRegistryEntry)} like any other item.
*/
public interface IBackpackInterface {
/**
* Get a backpack with a given uid so you can add items to it or get information about it.
* returns null if there is no backpack for the given uid.
* Add an accepted item to a Forestry backpack.
*
* @param backpackUid The unique ID of the Forestry backpack. See {@link BackpackManager} for valid UIDs.
* @param itemStack The itemStack that the backpack should accept.
* {@link OreDictionary#WILDCARD_VALUE} can be used for meta value.
*/
void addItemToForestryBackpack(@Nonnull String backpackUid, @Nonnull ItemStack itemStack);
/**
* Register a backpack definition with a given uid.
*/
void registerBackpackDefinition(@Nonnull String backpackUid, @Nonnull IBackpackDefinition definition);
/**
* Get a backpack definition with a given uid.
*/
@Nullable
IBackpackDefinition getBackpack(@Nonnull String uid);
IBackpackDefinition getBackpackDefinition(@Nonnull String backpackUid);
/**
* Register a backpack with a given uid
*/
void registerBackpack(@Nonnull String uid, @Nonnull IBackpackDefinition definition);
/**
* Adds a backpack with the given definition and type, returning the item.
* Creates a backpack with the given UID and type, returning the item.
* The backpack's definition must first be registered with {@link #registerBackpackDefinition(String, IBackpackDefinition)}.
*
* @param definition
* Definition of backpack behaviour.
* @param type
* Type of backpack.
* @param backpackUid The unique ID of the backpack.
* @param type Type of backpack.
* @return Created backpack item.
*/
@Nonnull
Item createBackpack(@Nonnull IBackpackDefinition definition, @Nonnull EnumBackpackType type);
Item createBackpack(@Nonnull String backpackUid, @Nonnull EnumBackpackType type);
/**
* Create a backpack that can hold items from a specific {@link ISpeciesRoot}.
* The backpack's definition must first be registered with {@link #registerBackpackDefinition(String, IBackpackDefinition)}.
*
* @param backpackUid The unique ID of the backpack.
* @param speciesRoot The species root.
* @return Created backpack item.
*/
Item createNaturalistBackpack(@Nonnull String backpackUid, @Nonnull ISpeciesRoot speciesRoot);
/**
* Makes a new configurable backpack filter. Useful for implementing {@link IBackpackDefinition}.
*/
IBackpackFilterConfigurable createBackpackFilter();
/**
* Makes a new naturalist backpack filter. Only accepts items from a specific {@link ISpeciesRoot}.
* Useful for implementing {@link IBackpackDefinition} for naturalist's backpacks.
*
* @param speciesRootUid The species root's unique ID. See {@link ISpeciesRoot#getUID()}.
* @return a new backpack filter for the specified species root
* @see #createNaturalistBackpack(String, ISpeciesRoot)
*/
Predicate<ItemStack> createNaturalistBackpackFilter(String speciesRootUid);
}
@@ -3,7 +3,7 @@
*
* This work (the API) is licensed under the "MIT" License, see LICENSE.txt for details.
******************************************************************************/
@API(apiVersion = "3.0.0", owner = "ForestryAPI|core", provides = "ForestryAPI|storage")
@API(apiVersion = "5.0.0", owner = "ForestryAPI|core", provides = "ForestryAPI|storage")
package forestry.api.storage;
import net.minecraftforge.fml.common.API;
@@ -10,8 +10,6 @@
******************************************************************************/
package forestry.apiculture;
import com.google.common.collect.ImmutableMap;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
@@ -19,34 +17,7 @@ import java.util.Objects;
import java.util.Random;
import java.util.Set;
import net.minecraft.block.BlockFlower;
import net.minecraft.block.state.IBlockState;
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
import net.minecraft.entity.passive.EntityVillager;
import net.minecraft.init.Blocks;
import net.minecraft.init.Items;
import net.minecraft.item.ItemStack;
import net.minecraft.util.ResourceLocation;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import net.minecraft.world.biome.Biome;
import net.minecraft.world.chunk.IChunkGenerator;
import net.minecraft.world.storage.loot.LootTableList;
import net.minecraftforge.client.event.TextureStitchEvent;
import net.minecraftforge.common.BiomeDictionary;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.fluids.FluidRegistry;
import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.fml.common.FMLCommonHandler;
import net.minecraftforge.fml.common.SidedProxy;
import net.minecraftforge.fml.common.event.FMLInterModComms.IMCMessage;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import net.minecraftforge.fml.common.registry.GameRegistry;
import net.minecraftforge.fml.common.registry.VillagerRegistry;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import com.google.common.collect.ImmutableMap;
import forestry.Forestry;
import forestry.api.apiculture.BeeManager;
import forestry.api.apiculture.EnumBeeType;
@@ -119,6 +90,32 @@ import forestry.food.items.ItemRegistryFood;
import forestry.plugins.BlankForestryPlugin;
import forestry.plugins.ForestryPlugin;
import forestry.plugins.ForestryPluginUids;
import net.minecraft.block.BlockFlower;
import net.minecraft.block.state.IBlockState;
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
import net.minecraft.entity.passive.EntityVillager;
import net.minecraft.init.Blocks;
import net.minecraft.init.Items;
import net.minecraft.item.ItemStack;
import net.minecraft.util.ResourceLocation;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import net.minecraft.world.biome.Biome;
import net.minecraft.world.chunk.IChunkGenerator;
import net.minecraft.world.storage.loot.LootTableList;
import net.minecraftforge.client.event.TextureStitchEvent;
import net.minecraftforge.common.BiomeDictionary;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.fluids.FluidRegistry;
import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.fml.common.FMLCommonHandler;
import net.minecraftforge.fml.common.SidedProxy;
import net.minecraftforge.fml.common.event.FMLInterModComms.IMCMessage;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import net.minecraftforge.fml.common.registry.GameRegistry;
import net.minecraftforge.fml.common.registry.VillagerRegistry;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
@ForestryPlugin(pluginID = ForestryPluginUids.APICULTURE, name = "Apiculture", author = "SirSengir", url = Constants.URL, unlocalizedDescription = "for.plugin.apiculture.description")
public class PluginApiculture extends BlankForestryPlugin {
@@ -266,7 +263,7 @@ public class PluginApiculture extends BlankForestryPlugin {
VillagerRegistry villagerRegistry = VillagerRegistry.instance();
villagerRegistry.registerVillageCreationHandler(villageHandler);
villagerApiarist = new VillagerRegistry.VillagerProfession(Constants.ID_VILLAGER_APIARIST, Constants.TEXTURE_SKIN_BEEKPEEPER);
villagerApiarist = new VillagerRegistry.VillagerProfession(Constants.ID_VILLAGER_APIARIST, Constants.TEXTURE_SKIN_BEEKPEEPER, Constants.TEXTURE_SKIN_ZOMBIE_BEEKPEEPER);
villagerRegistry.register(villagerApiarist);
ItemStack wildcardPrincess = new ItemStack(items.beePrincessGE, 1);
@@ -1,9 +1,15 @@
package forestry.apiculture.genetics.alleles;
import java.util.List;
import java.util.Random;
import forestry.api.apiculture.IBeeGenome;
import forestry.api.apiculture.IBeeHousing;
import forestry.api.genetics.IEffectData;
import forestry.core.genetics.EffectData;
import forestry.core.utils.VectUtil;
import net.minecraft.block.Block;
import net.minecraft.block.BlockMushroom;
import net.minecraft.block.state.IBlockState;
import net.minecraft.entity.passive.EntityCow;
import net.minecraft.entity.passive.EntityMooshroom;
import net.minecraft.init.Blocks;
@@ -11,12 +17,6 @@ import net.minecraft.util.EnumParticleTypes;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Vec3i;
import net.minecraft.world.World;
import net.minecraft.world.gen.feature.WorldGenBigMushroom;
import forestry.api.apiculture.IBeeGenome;
import forestry.api.apiculture.IBeeHousing;
import forestry.api.genetics.IEffectData;
import forestry.core.genetics.EffectData;
public class AlleleEffectFungification extends AlleleEffectThrottled {
@@ -24,7 +24,7 @@ public class AlleleEffectFungification extends AlleleEffectThrottled {
private static final int ENTITY_THROTTLE = 6;
public AlleleEffectFungification() {
super("mycophilic", true, 10, false, false);
super("mycophilic", true, 20, false, false);
}
@Override
@@ -57,50 +57,51 @@ public class AlleleEffectFungification extends AlleleEffectThrottled {
World world = housing.getWorldObj();
BlockPos housingCoordinates = housing.getCoordinates();
Vec3i area = getModifiedArea(genome, housing);
int blockX = getRandomOffset(world.rand, housingCoordinates.getX(), area.getX());
int blockY = getRandomOffset(world.rand, housingCoordinates.getY(), area.getY());
int blockZ = getRandomOffset(world.rand, housingCoordinates.getZ(), area.getZ());
for (int attempt = 0; attempt < MAX_BLOCK_FIND_TRIES; ++attempt) {
BlockPos pos = new BlockPos(blockX, blockY, blockZ);
Block block = world.getBlockState(pos).getBlock();
if (isSuitableForMycelium(world, block, pos)) {
world.setBlockState(pos, Blocks.MYCELIUM.getDefaultState());
break;
} else if (isSuitableForGrowth(block)) {
doMushroomGrowth(block, world, pos);
break;
}
blockX = getRandomOffset(world.rand, housingCoordinates.getX(), area.getX());
blockY = getRandomOffset(world.rand, housingCoordinates.getY(), area.getY());
blockZ = getRandomOffset(world.rand, housingCoordinates.getZ(), area.getZ());
}
Vec3i halfArea = new Vec3i(area.getX() / 2, area.getY() / 2, area.getZ() / 2);
for (int attempt = 0; attempt < MAX_BLOCK_FIND_TRIES; ++attempt) {
BlockPos pos = VectUtil.getRandomPositionInArea(world.rand, area).subtract(halfArea).add(housingCoordinates);
IBlockState blockState = world.getBlockState(pos);
if (convertToMycelium(world, blockState, pos)) {
return;
} else if (growGiantMushroom(world, blockState, pos)) {
return;
}
}
}
private static void doEntityEffect(IBeeGenome genome, IBeeHousing housing) {
List<EntityCow> cows = getEntitiesInRange(genome, housing, EntityCow.class);
for (EntityCow cow : cows) {
convertCowToMooshroom(cow);
if (convertCowToMooshroom(cow)) {
return;
}
}
}
private static int getRandomOffset(Random random, int centrePos, int offset) {
return centrePos + random.nextInt(offset) - offset / 2;
}
private static boolean isSuitableForMycelium(World world, Block block, BlockPos pos) {
return block == Blocks.GRASS || block == Blocks.DIRT && world.canBlockSeeSky(pos);
private static boolean convertToMycelium(World world, IBlockState blockState, BlockPos pos) {
Block block = blockState.getBlock();
if (block == Blocks.GRASS || block == Blocks.DIRT && world.canBlockSeeSky(pos)) {
world.setBlockState(pos, Blocks.MYCELIUM.getDefaultState());
return true;
}
return false;
}
private static boolean isSuitableForGrowth(Block block) {
return block == Blocks.RED_MUSHROOM || block == Blocks.BROWN_MUSHROOM;
private static boolean growGiantMushroom(World world, IBlockState blockState, BlockPos pos) {
Block block = blockState.getBlock();
if (block instanceof BlockMushroom) {
BlockMushroom mushroom = (BlockMushroom) block;
mushroom.generateBigMushroom(world, pos, blockState, world.rand);
return true;
}
return false;
}
private static void convertCowToMooshroom(EntityCow cow) {
private static boolean convertCowToMooshroom(EntityCow cow) {
if (cow instanceof EntityMooshroom) {
return;
return false;
}
World worldObj = cow.worldObj;
cow.setDead();
@@ -110,14 +111,6 @@ public class AlleleEffectFungification extends AlleleEffectThrottled {
mooshroom.renderYawOffset = cow.renderYawOffset;
worldObj.spawnEntityInWorld(mooshroom);
worldObj.spawnParticle(EnumParticleTypes.EXPLOSION_LARGE, cow.posX, cow.posY + cow.height / 2.0F, cow.posZ, 0.0D, 0.0D, 0.0D);
}
private static void doMushroomGrowth(Block block, World world, BlockPos pos) {
WorldGenBigMushroom giantMushroomGenerator;
giantMushroomGenerator = new WorldGenBigMushroom(block);
world.setBlockToAir(pos);
giantMushroomGenerator.generate(world, world.rand, pos);
return true;
}
}
@@ -198,7 +198,7 @@ public class PluginArboriculture extends BlankForestryPlugin {
blocks.treeChest.init();
if (Config.enableVillagers) {
villagerArborist = new VillagerRegistry.VillagerProfession(Constants.ID_VILLAGER_ARBORIST, Constants.TEXTURE_SKIN_LUMBERJACK);
villagerArborist = new VillagerRegistry.VillagerProfession(Constants.ID_VILLAGER_ARBORIST, Constants.TEXTURE_SKIN_LUMBERJACK, Constants.TEXTURE_SKIN_ZOMBIE_LUMBERJACK);
VillagerRegistry.instance().register(villagerArborist);
VillagerRegistry.VillagerCareer arboristCareer = new VillagerRegistry.VillagerCareer(villagerArborist, "arborist");
@@ -19,35 +19,18 @@ import forestry.core.utils.Translator;
public abstract class Circuit implements ICircuit {
private final String uid;
private final boolean requiresDiscovery;
private int limit = 1;
protected Circuit(String uid, boolean requiresDiscovery) {
protected Circuit(String uid) {
this.uid = uid;
this.requiresDiscovery = requiresDiscovery;
ChipsetManager.circuitRegistry.registerCircuit(this);
}
protected void setLimit(int limit) {
this.limit = limit;
}
@Override
public String getUID() {
return "forestry." + this.uid;
}
@Override
public int getLimit() {
return this.limit;
}
@Override
public boolean requiresDiscovery() {
return this.requiresDiscovery;
}
@Override
public String getUnlocalizedName() {
return "for.circuit." + this.uid;
@@ -11,6 +11,7 @@
package forestry.core.circuits;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import java.util.ArrayList;
import java.util.List;
@@ -29,7 +30,7 @@ public class CircuitBoard<T> implements ICircuitBoard {
@Nonnull
private final EnumCircuitBoardType type;
@Nonnull
@Nullable
private final ICircuitLayout layout;
@Nonnull
private final ICircuit[] circuits;
@@ -80,19 +81,23 @@ public class CircuitBoard<T> implements ICircuitBoard {
public void addTooltip(List<String> list) {
if (layout != null) {
list.add(TextFormatting.GOLD + layout.getUsage() + ":");
}
List<String> extendedTooltip = new ArrayList<>();
for (ICircuit circuit : circuits) {
if (circuit != null) {
circuit.addTooltip(extendedTooltip);
List<String> extendedTooltip = new ArrayList<>();
for (ICircuit circuit : circuits) {
if (circuit != null) {
circuit.addTooltip(extendedTooltip);
}
}
}
if (Proxies.common.isShiftDown() || extendedTooltip.size() <= 4) {
list.addAll(extendedTooltip);
if (Proxies.common.isShiftDown() || extendedTooltip.size() <= 4) {
list.addAll(extendedTooltip);
} else {
list.add(TextFormatting.ITALIC + "<" + Translator.translateToLocal("for.gui.tooltip.tmi") + ">");
}
} else {
list.add(TextFormatting.ITALIC + "<" + Translator.translateToLocal("for.gui.tooltip.tmi") + ">");
int socketCount = type.getSockets();
String localizationKey = "item.for.circuitboard.tooltip." + (socketCount == 1 ? "singular" : "plural");
String tooltip = Translator.translateToLocalFormatted(localizationKey, type.getSockets());
list.add(tooltip);
}
}
@@ -11,20 +11,22 @@
package forestry.core.circuits;
public enum EnumCircuitBoardType {
BASIC((short) 1, 0x191919, 0x6dcff6), ENHANCED((short) 2, 0x191919, 0xcb7c32), REFINED((short) 3, 0x191919, 0xc9c9c9), INTRICATE((short) 4, 0x191919,
0xe2cb6b);
BASIC(1, 0x191919, 0x6dcff6),
ENHANCED(2, 0x191919, 0xcb7c32),
REFINED(3, 0x191919, 0xc9c9c9),
INTRICATE(4, 0x191919, 0xe2cb6b);
private final short sockets;
private final int sockets;
private final int primaryColor;
private final int secondaryColor;
EnumCircuitBoardType(short sockets, int primaryColor, int secondaryColor) {
EnumCircuitBoardType(int sockets, int primaryColor, int secondaryColor) {
this.sockets = sockets;
this.primaryColor = primaryColor;
this.secondaryColor = secondaryColor;
}
public short getSockets() {
public int getSockets() {
return sockets;
}
@@ -50,7 +50,7 @@ public class GuiSolderingIron extends GuiForestry<ContainerSolderingIron, ItemIn
if (recipe == null) {
description = "(" + Translator.translateToLocal("for.gui.noeffect") + ")";
} else {
description = Translator.translateToLocal(recipe.getCircuit().getUnlocalizedName()) + " (" + recipe.getCircuit().getLimit() + ")";
description = Translator.translateToLocal(recipe.getCircuit().getUnlocalizedName());
}
int row = i * 20;
@@ -41,7 +41,9 @@ public class Constants implements IForestryConstants {
public static final String TEXTURE_APIARIST_ARMOR_SECONDARY = TEXTURE_PATH_ITEMS + "/apiarist_armor_2.png";
public static final String TEXTURE_NATURALIST_ARMOR_PRIMARY = TEXTURE_PATH_ITEMS + "/naturalist_armor_1.png";
public static final String TEXTURE_SKIN_BEEKPEEPER = Constants.MOD_ID + ":" + TEXTURE_PATH_ENTITIES + "/beekeeper.png";
public static final String TEXTURE_SKIN_ZOMBIE_BEEKPEEPER = Constants.MOD_ID + ":" + TEXTURE_PATH_ENTITIES + "/zombie_beekeeper.png";
public static final String TEXTURE_SKIN_LUMBERJACK = Constants.MOD_ID + ":" + TEXTURE_PATH_ENTITIES + "/lumberjack.png";
public static final String TEXTURE_SKIN_ZOMBIE_LUMBERJACK = Constants.MOD_ID + ":" + TEXTURE_PATH_ENTITIES + "/zombie_lumberjack.png";
// Villagers
public static final String ID_VILLAGER_APIARIST = Constants.MOD_ID + ":apiarist";
@@ -37,8 +37,8 @@ public class ItemInventorySolderingIron extends ItemInventory implements IErrorS
private final RevolvingList<ICircuitLayout> layouts = new RevolvingList<>(ChipsetManager.circuitRegistry.getRegisteredLayouts().values());
private static final short blankSlot = 0;
private static final short finishedSlot = 1;
private static final short inputCircuitBoardSlot = 0;
private static final short finishedCircuitBoardSlot = 1;
private static final short ingredientSlot1 = 2;
private static final short ingredientSlotCount = 4;
@@ -84,11 +84,6 @@ public class ItemInventorySolderingIron extends ItemInventory implements IErrorS
continue;
}
// / Make sure we don't exceed this circuits limit per chipset
if (getCount(recipe.getCircuit(), circuits) >= recipe.getCircuit().getLimit()) {
continue;
}
if (doConsume) {
decrStackSize(ingredientSlot1 + i, recipe.getResource().stackSize);
}
@@ -104,39 +99,36 @@ public class ItemInventorySolderingIron extends ItemInventory implements IErrorS
return;
}
ItemStack blank = getStackInSlot(blankSlot);
// Requires blank slot
if (blank == null) {
ItemStack inputCircuitBoard = getStackInSlot(inputCircuitBoardSlot);
if (inputCircuitBoard == null || inputCircuitBoard.stackSize > 1) {
return;
}
if (blank.stackSize > 1) {
return;
}
if (getStackInSlot(finishedSlot) != null) {
if (getStackInSlot(finishedCircuitBoardSlot) != null) {
return;
}
// Need a chipset item
if (!ChipsetManager.circuitRegistry.isChipset(blank)) {
if (!ChipsetManager.circuitRegistry.isChipset(inputCircuitBoard)) {
return;
}
// Illegal type
if (blank.getItemDamage() < 0 || blank.getItemDamage() >= EnumCircuitBoardType.values().length) {
if (inputCircuitBoard.getItemDamage() < 0 || inputCircuitBoard.getItemDamage() >= EnumCircuitBoardType.values().length) {
return;
}
EnumCircuitBoardType type = EnumCircuitBoardType.values()[blank.getItemDamage()];
EnumCircuitBoardType type = EnumCircuitBoardType.values()[inputCircuitBoard.getItemDamage()];
if (getCircuitCount() != type.getSockets()) {
return;
}
ICircuit[] circuits = getCircuits(true);
ItemStack circuitBoard = ItemCircuitBoard.createCircuitboard(type, layouts.getCurrent(), circuits);
ItemStack outputCircuitBoard = ItemCircuitBoard.createCircuitboard(type, layouts.getCurrent(), circuits);
setInventorySlotContents(finishedSlot, circuitBoard);
setInventorySlotContents(blankSlot, null);
setInventorySlotContents(finishedCircuitBoardSlot, outputCircuitBoard);
setInventorySlotContents(inputCircuitBoardSlot, null);
}
private int getCircuitCount() {
@@ -150,16 +142,6 @@ public class ItemInventorySolderingIron extends ItemInventory implements IErrorS
return count;
}
public static int getCount(ICircuit circuit, ICircuit[] circuits) {
int count = 0;
for (ICircuit other : circuits) {
if (other != null && other.getUID().equals(circuit.getUID())) {
count++;
}
}
return count;
}
@Override
public ImmutableSet<IErrorState> getErrorStates() {
ImmutableSet.Builder<IErrorState> errorStates = ImmutableSet.builder();
@@ -168,7 +150,7 @@ public class ItemInventorySolderingIron extends ItemInventory implements IErrorS
errorStates.add(EnumErrorCode.NO_CIRCUIT_LAYOUT);
}
ItemStack blankCircuitBoard = getStackInSlot(blankSlot);
ItemStack blankCircuitBoard = getStackInSlot(inputCircuitBoardSlot);
if (blankCircuitBoard == null) {
errorStates.add(EnumErrorCode.NO_CIRCUIT_BOARD);
@@ -202,7 +184,7 @@ public class ItemInventorySolderingIron extends ItemInventory implements IErrorS
}
Item item = itemStack.getItem();
if (slotIndex == blankSlot) {
if (slotIndex == inputCircuitBoardSlot) {
return item instanceof ItemCircuitBoard;
} else if (slotIndex >= ingredientSlot1 && slotIndex < ingredientSlot1 + ingredientSlotCount) {
CircuitRecipe recipe = SolderManager.getMatchingRecipe(layouts.getCurrent(), itemStack);
@@ -10,6 +10,9 @@
******************************************************************************/
package forestry.core.items;
import java.util.List;
import forestry.core.utils.Translator;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
@@ -19,7 +22,13 @@ import forestry.core.circuits.ISolderingIron;
import forestry.core.inventory.ItemInventorySolderingIron;
public class ItemSolderingIron extends ItemWithGui implements ISolderingIron {
@Override
public void addInformation(ItemStack stack, EntityPlayer playerIn, List<String> tooltip, boolean advanced) {
super.addInformation(stack, playerIn, tooltip, advanced);
tooltip.add(Translator.translateToLocal("item.for.solderingIron.tooltip"));
}
@Override
public Object getGui(EntityPlayer player, ItemStack heldItem, int data) {
return new GuiSolderingIron(player, new ItemInventorySolderingIron(player, heldItem));
@@ -34,7 +34,7 @@ public class GameProfileDataSerializer implements DataSerializer<Optional<GamePr
}
@Override
public Optional<GameProfile> read(PacketBuffer buf) throws IOException {
public Optional<GameProfile> read(PacketBuffer buf) {
if (buf.readBoolean()) {
UUID uuid = buf.readUuid();
String name = buf.readStringFromBuffer(1024);
@@ -104,6 +104,8 @@ public class RenderEscritoire extends TileEntitySpecialRenderer<TileEscritoire>
rendermanager.doRenderEntity(dummyEntityItem, 0.0D, 0.0D, 0.0D, 0.0F, 0.0F, false);
}
GlStateManager.popMatrix();
dummyEntityItem.worldObj = null; // prevent leaking the world object
}
}
}
@@ -50,8 +50,8 @@ public class TextureManager implements ITextureManager {
public static void initDefaultSprites() {
String[] defaultIconNames = new String[]{"habitats/desert", "habitats/end", "habitats/forest", "habitats/hills", "habitats/jungle", "habitats/mushroom",
"habitats/nether", "habitats/ocean", "habitats/plains", "habitats/snow", "habitats/swamp", "habitats/taiga", "misc/access.private",
"misc/access.viewable", "misc/access.shared", "misc/energy", "misc/hint",
"habitats/nether", "habitats/ocean", "habitats/plains", "habitats/snow", "habitats/swamp", "habitats/taiga",
"misc/access.shared", "misc/energy", "misc/hint",
"analyzer/anything", "analyzer/bee", "analyzer/cave", "analyzer/closed", "analyzer/drone", "analyzer/flyer",
"analyzer/item", "analyzer/nocturnal", "analyzer/princess", "analyzer/pure_breed", "analyzer/pure_cave",
"analyzer/pure_flyer", "analyzer/pure_nocturnal", "analyzer/queen",
@@ -12,9 +12,8 @@ package forestry.energy.circuits;
public class CircuitElectricBoost extends CircuitElectricChange {
public CircuitElectricBoost(String uid, int limit, int eu, int rf) {
super(uid, false);
this.setLimit(limit);
public CircuitElectricBoost(String uid, int eu, int rf) {
super(uid);
this.configureChange(eu, rf);
}
@@ -18,8 +18,8 @@ public abstract class CircuitElectricChange extends Circuit {
private int euChange = 7;
private int rfChange = 20;
protected CircuitElectricChange(String uid, boolean requiresDiscovery) {
super(uid, requiresDiscovery);
protected CircuitElectricChange(String uid) {
super(uid);
}
protected void configureChange(int euChange, int rfChange) {
@@ -13,8 +13,7 @@ package forestry.energy.circuits;
public class CircuitElectricChoke extends CircuitElectricChange {
public CircuitElectricChoke(String uid) {
super(uid, false);
super(uid);
this.configureChange(-2, -10);
this.setLimit(1);
}
}
@@ -13,8 +13,7 @@ package forestry.energy.circuits;
public class CircuitElectricEfficiency extends CircuitElectricChange {
public CircuitElectricEfficiency(String uid) {
super(uid, false);
this.setLimit(1);
super(uid);
this.configureChange(-1, 0);
}
@@ -203,9 +203,9 @@ public class PluginFactory extends BlankForestryPlugin {
blocks.raintank.init();
blocks.worktable.init();
Circuit.machineSpeedUpgrade1 = new CircuitSpeedUpgrade("machine.speed.boost.1", 0.125f, 0.05f, 4);
Circuit.machineSpeedUpgrade2 = new CircuitSpeedUpgrade("machine.speed.boost.2", 0.250f, 0.10f, 4);
Circuit.machineEfficiencyUpgrade1 = new CircuitSpeedUpgrade("machine.efficiency.1", 0, -0.10f, 2);
Circuit.machineSpeedUpgrade1 = new CircuitSpeedUpgrade("machine.speed.boost.1", 0.125f, 0.05f);
Circuit.machineSpeedUpgrade2 = new CircuitSpeedUpgrade("machine.speed.boost.2", 0.250f, 0.10f);
Circuit.machineEfficiencyUpgrade1 = new CircuitSpeedUpgrade("machine.efficiency.1", 0, -0.10f);
}
@Override
@@ -18,9 +18,8 @@ public class CircuitSpeedUpgrade extends Circuit {
private final double speedBoost;
private final float powerDraw;
public CircuitSpeedUpgrade(String uid, double speedBoost, float powerDraw, int limit) {
super(uid, false);
this.setLimit(limit);
public CircuitSpeedUpgrade(String uid, double speedBoost, float powerDraw) {
super(uid);
this.speedBoost = speedBoost;
this.powerDraw = powerDraw;
}
@@ -21,9 +21,8 @@ public class CircuitFarmLogic extends Circuit {
private boolean isManual = false;
public CircuitFarmLogic(String uid, IFarmLogic logic) {
super(uid, false);
super(uid);
this.logic = logic;
setLimit(4);
}
public CircuitFarmLogic setManual() {
@@ -231,7 +231,7 @@ public class EntityButterfly extends EntityCreature implements IEntityButterfly
BlockPos posBelow = pos.down();
IBlockState blockStateBelow = worldObj.getBlockState(posBelow);
Block blockBelow = blockState.getBlock();
Block blockBelow = blockStateBelow.getBlock();
if (blockBelow.isLeaves(blockStateBelow, worldObj, posBelow)) {
weight += 2.5f;
} else if (blockBelow instanceof BlockFence) {
@@ -51,7 +51,7 @@ public class ModelButterflyItem extends BlankItemModel {
ImmutableMap.Builder<String, String> textures = ImmutableMap.builder();
textures.put("butterfly", butterfly.getGenome().getSecondary().getItemTexture());
IModel retexturedModel = ModelProcessingHelper.retexture(modelButterfly, textures.build());
return new TRSRBakedModel(retexturedModel.bake(ModelRotation.X0_Y0, DefaultVertexFormats.ITEM, textureGetter), -0.03125F, 0.0F, -0.03125F, butterfly.getSize() * 1.5F);
return new TRSRBakedModel(retexturedModel.bake(ModelRotation.X0_Y0, DefaultVertexFormats.ITEM, textureGetter), -0.03125F, 0.5F, -0.03125F, butterfly.getSize() * 1.5F);
}
private class ButterflyItemOverrideList extends ItemOverrideList {
@@ -3,6 +3,8 @@ package forestry.plugins.compat;
import javax.annotation.Nonnull;
import java.util.List;
import forestry.core.PluginCore;
import forestry.core.utils.OreDictUtil;
import net.minecraft.item.ItemStack;
import forestry.plugins.PluginManager;
@@ -12,6 +14,7 @@ import mezz.jei.api.IItemBlacklist;
import mezz.jei.api.IJeiHelpers;
import mezz.jei.api.IModRegistry;
import mezz.jei.api.JEIPlugin;
import net.minecraftforge.oredict.OreDictionary;
@JEIPlugin
public class ForestryJeiPlugin extends BlankModPlugin {
@@ -23,5 +26,9 @@ public class ForestryJeiPlugin extends BlankModPlugin {
for (ItemStack hiddenItem : hiddenItems) {
itemBlacklist.addItemToBlacklist(hiddenItem);
}
registry.addDescription(new ItemStack(PluginCore.items.solderingIron), "item.for.solderingIron.description");
registry.addDescription(new ItemStack(PluginCore.items.circuitboards, 1, OreDictionary.WILDCARD_VALUE), "item.for.circuitboard.description");
registry.addDescription(new ItemStack(PluginCore.items.tubes, 1, OreDictionary.WILDCARD_VALUE), "item.for.thermionicTubes.description");
}
}
@@ -13,19 +13,7 @@ package forestry.plugins.compat;
import java.util.ArrayList;
import java.util.List;
import net.minecraft.block.Block;
import net.minecraft.init.Blocks;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.fml.common.event.FMLInterModComms;
import net.minecraftforge.fml.common.registry.ForgeRegistries;
import net.minecraftforge.fml.common.registry.GameRegistry;
import net.minecraftforge.oredict.OreDictionary;
import forestry.api.core.ForestryAPI;
import forestry.api.farming.Farmables;
import forestry.api.recipes.RecipeManagers;
import forestry.api.storage.BackpackManager;
import forestry.core.PluginCore;
@@ -35,11 +23,17 @@ import forestry.core.recipes.RecipeUtil;
import forestry.core.utils.ItemStackUtil;
import forestry.core.utils.Log;
import forestry.core.utils.ModUtil;
import forestry.farming.logic.FarmableBasicAgricraft;
import forestry.farming.logic.FarmableGE;
import forestry.plugins.BlankForestryPlugin;
import forestry.plugins.ForestryPlugin;
import forestry.plugins.ForestryPluginUids;
import net.minecraft.block.Block;
import net.minecraft.init.Blocks;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.fml.common.event.FMLInterModComms;
import net.minecraftforge.fml.common.registry.ForgeRegistries;
import net.minecraftforge.oredict.OreDictionary;
@ForestryPlugin(pluginID = ForestryPluginUids.BIOMES_O_PLENTY, name = "BiomesOPlenty", author = "Nirek", url = Constants.URL, unlocalizedDescription = "for.plugin.biomesoplenty.description")
public class PluginBiomesOPlenty extends BlankForestryPlugin {
@@ -235,10 +229,15 @@ public class PluginBiomesOPlenty extends BlankForestryPlugin {
for (String blockName : blockNames) {
Block block = ForgeRegistries.BLOCKS.getValue(new ResourceLocation(BoP, blockName));
if (block != null) {
ItemStack blockStack = new ItemStack(block, 1, OreDictionary.WILDCARD_VALUE);
BackpackManager.backpackInterface.getBackpack(backpackUid).addValidItem(blockStack);
Item item = Item.getItemFromBlock(block);
if (item != null) {
ItemStack blockStack = new ItemStack(item, 1, OreDictionary.WILDCARD_VALUE);
BackpackManager.backpackInterface.addItemToForestryBackpack(backpackUid, blockStack);
} else {
Log.warning("Could not find an item for block: {}", blockName);
}
} else {
Log.warning("Missing block: ", blockName);
Log.warning("Missing block: {}", blockName);
}
}
}
@@ -10,19 +10,10 @@
******************************************************************************/
package forestry.plugins.compat;
import com.google.common.collect.ImmutableMap;
import javax.annotation.Nonnull;
import java.util.Set;
import net.minecraft.init.Blocks;
import net.minecraft.item.ItemStack;
import net.minecraftforge.fluids.Fluid;
import net.minecraftforge.fluids.FluidRegistry;
import net.minecraftforge.fml.common.Optional;
import net.minecraftforge.fml.common.event.FMLInterModComms;
import com.google.common.collect.ImmutableMap;
import forestry.api.circuits.ChipsetManager;
import forestry.api.circuits.CircuitSocketType;
import forestry.api.circuits.ICircuitLayout;
@@ -32,7 +23,6 @@ import forestry.api.fuels.EngineBronzeFuel;
import forestry.api.fuels.FuelManager;
import forestry.api.recipes.RecipeManagers;
import forestry.api.storage.BackpackManager;
import forestry.api.storage.IBackpackDefinition;
import forestry.api.storage.ICrateRegistry;
import forestry.api.storage.StorageManager;
import forestry.apiculture.PluginApiculture;
@@ -61,10 +51,15 @@ import forestry.farming.logic.FarmableBasicIC2Crop;
import forestry.plugins.BlankForestryPlugin;
import forestry.plugins.ForestryPlugin;
import forestry.plugins.ForestryPluginUids;
import ic2.api.item.IC2Items;
import ic2.api.recipe.RecipeInputItemStack;
import ic2.api.recipe.Recipes;
import net.minecraft.init.Blocks;
import net.minecraft.item.ItemStack;
import net.minecraftforge.fluids.Fluid;
import net.minecraftforge.fluids.FluidRegistry;
import net.minecraftforge.fml.common.Optional;
import net.minecraftforge.fml.common.event.FMLInterModComms;
@ForestryPlugin(pluginID = ForestryPluginUids.INDUSTRIALCRAFT2, name = "IndustrialCraft2", author = "SirSengir", url = Constants.URL, unlocalizedDescription = "for.plugin.ic2.description")
public class PluginIC2 extends BlankForestryPlugin {
@@ -138,8 +133,8 @@ public class PluginIC2 extends BlankForestryPlugin {
Circuit.energyElectricChoke1 = new CircuitElectricChoke("electric.choke.1");
Circuit.energyElectricEfficiency1 = new CircuitElectricEfficiency("electric.efficiency.1");
Circuit.energyElectricBoost1 = new CircuitElectricBoost("electric.boost.1", 2, 7, 20);
Circuit.energyElectricBoost2 = new CircuitElectricBoost("electric.boost.2", 2, 15, 40);
Circuit.energyElectricBoost1 = new CircuitElectricBoost("electric.boost.1", 7, 20);
Circuit.energyElectricBoost2 = new CircuitElectricBoost("electric.boost.2", 15, 40);
blocks.electricalEngine.init();
blocks.generator.init();
@@ -153,21 +148,18 @@ public class PluginIC2 extends BlankForestryPlugin {
return;
}
IBackpackDefinition forester = BackpackManager.backpackInterface.getBackpack(BackpackManager.FORESTER_UID);
if (forester != null) {
if (resin != null) {
forester.addValidItem(resin);
}
if (rubber != null) {
forester.addValidItem(rubber);
}
if (rubberSapling != null) {
forester.addValidItem(rubberSapling);
}
ItemStack rubberLeaves = IC2Items.getItem("leaves");
if (rubberLeaves != null) {
forester.addValidItem(rubberLeaves);
}
if (resin != null) {
BackpackManager.backpackInterface.addItemToForestryBackpack(BackpackManager.FORESTER_UID, resin);
}
if (rubber != null) {
BackpackManager.backpackInterface.addItemToForestryBackpack(BackpackManager.FORESTER_UID, rubber);
}
if (rubberSapling != null) {
BackpackManager.backpackInterface.addItemToForestryBackpack(BackpackManager.FORESTER_UID, rubberSapling);
}
ItemStack rubberLeaves = IC2Items.getItem("leaves");
if (rubberLeaves != null) {
BackpackManager.backpackInterface.addItemToForestryBackpack(BackpackManager.FORESTER_UID, rubberLeaves);
}
}
@@ -11,55 +11,47 @@
package forestry.storage;
import javax.annotation.Nonnull;
import java.awt.Color;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.awt.*;
import java.util.function.Predicate;
import forestry.api.storage.BackpackManager;
import forestry.api.storage.IBackpackDefinition;
import forestry.core.utils.Translator;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraftforge.oredict.OreDictionary;
import forestry.api.genetics.AlleleManager;
import forestry.api.genetics.ISpeciesRoot;
import forestry.api.storage.IBackpackDefinition;
import forestry.core.utils.ItemStackUtil;
import forestry.core.utils.Translator;
public class BackpackDefinition implements IBackpackDefinition {
private final int primaryColor;
private final int secondaryColor;
private final Set<String> validItemStacks = new HashSet<>();
private final Set<Integer> validOreIds = new HashSet<>();
public BackpackDefinition(@Nonnull Color primaryColor) {
this(primaryColor, new Color(0xffffff));
}
@Nonnull
private final Predicate<ItemStack> filter;
public BackpackDefinition(@Nonnull Color primaryColor, @Nonnull Color secondaryColor) {
this(primaryColor, secondaryColor, BackpackManager.backpackInterface.createBackpackFilter());
}
public BackpackDefinition(@Nonnull Color primaryColor, @Nonnull Color secondaryColor, @Nonnull Predicate<ItemStack> filter) {
this.primaryColor = primaryColor.getRGB();
this.secondaryColor = secondaryColor.getRGB();
this.filter = filter;
}
public Set<Integer> getValidOreIds() {
return validOreIds;
}
public Set<String> getValidItemStacks() {
return validItemStacks;
@Override
@Nonnull
public Predicate<ItemStack> getFilter() {
return filter;
}
@Nonnull
@Override
public String getName(ItemStack backpack) {
Item item = backpack.getItem();
String display = Translator.translateToLocal(item.getUnlocalizedNameInefficiently(backpack) + ".name").trim();
if (backpack.hasTagCompound() && backpack.getTagCompound().hasKey("display", 10)) {
NBTTagCompound nbt = backpack.getTagCompound().getCompoundTag("display");
NBTTagCompound tagCompound = backpack.getTagCompound();
if (tagCompound != null && tagCompound.hasKey("display", 10)) {
NBTTagCompound nbt = tagCompound.getCompoundTag("display");
if (nbt.hasKey("Name", 8)) {
display = nbt.getString("Name");
@@ -78,89 +70,4 @@ public class BackpackDefinition implements IBackpackDefinition {
public int getSecondaryColour() {
return secondaryColor;
}
@Override
public void addValidItem(ItemStack validItem) {
String itemStackString = ItemStackUtil.getStringForItemStack(validItem);
if (itemStackString != null) {
this.validItemStacks.add(itemStackString);
}
}
public void clearAllValid() {
validItemStacks.clear();
validOreIds.clear();
}
@Override
public void addValidItems(List<ItemStack> validItems) {
for (ItemStack validItem : validItems) {
addValidItem(validItem);
}
}
@Override
public void addValidOreDictName(String oreDictName) {
if (OreDictionary.doesOreNameExist(oreDictName)) {
int oreId = OreDictionary.getOreID(oreDictName);
validOreIds.add(oreId);
}
}
public void addValidOreDictNames(List<String> oreDictNames) {
for (String oreDictName : oreDictNames) {
addValidOreDictName(oreDictName);
}
}
@Override
public boolean test(ItemStack itemStack) {
if (itemStack == null) {
return false;
}
Item item = itemStack.getItem();
if (item == null) {
return false;
}
String itemStackStringWild = ItemStackUtil.getItemNameFromRegistryAsString(item);
if (validItemStacks.contains(itemStackStringWild)) {
return true;
}
int meta = itemStack.getItemDamage();
if (meta != OreDictionary.WILDCARD_VALUE) {
String itemStackString = itemStackStringWild + ':' + meta;
if (validItemStacks.contains(itemStackString)) {
return true;
}
}
int[] oreIds = OreDictionary.getOreIDs(itemStack);
for (int oreId : oreIds) {
if (validOreIds.contains(oreId)) {
validItemStacks.add(itemStackStringWild);
return true;
}
}
return false;
}
public static class BackpackDefinitionNaturalist extends BackpackDefinition {
@Nonnull
private final String speciesRootUid;
public BackpackDefinitionNaturalist(@Nonnull Color primaryColor, @Nonnull String speciesRootUid) {
super(primaryColor);
this.speciesRootUid = speciesRootUid;
}
@Override
public boolean test(ItemStack itemStack) {
ISpeciesRoot speciesRoot = AlleleManager.alleleRegistry.getSpeciesRoot(speciesRootUid);
return speciesRoot.isMember(itemStack);
}
}
}
@@ -0,0 +1,108 @@
package forestry.storage;
import java.util.HashSet;
import java.util.Set;
import forestry.api.storage.IBackpackFilterConfigurable;
import forestry.core.utils.ItemStackUtil;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraftforge.oredict.OreDictionary;
public class BackpackFilter implements IBackpackFilterConfigurable {
private final Set<String> acceptedItemStacks = new HashSet<>();
private final Set<String> rejectedItemStacks = new HashSet<>();
private final Set<Integer> validOreIds = new HashSet<>();
@Override
public void acceptItem(ItemStack validItem) {
String itemStackString = ItemStackUtil.getStringForItemStack(validItem);
if (itemStackString != null) {
this.acceptedItemStacks.add(itemStackString);
}
}
@Override
public void acceptOreDictName(String oreDictName) {
if (OreDictionary.doesOreNameExist(oreDictName)) {
int oreId = OreDictionary.getOreID(oreDictName);
this.validOreIds.add(oreId);
}
}
@Override
public void rejectOreDictName(String oreDictName) {
if (OreDictionary.doesOreNameExist(oreDictName)) {
int oreId = OreDictionary.getOreID(oreDictName);
this.validOreIds.remove(oreId);
}
}
@Override
public void rejectItem(ItemStack invalidItem) {
String itemStackString = ItemStackUtil.getStringForItemStack(invalidItem);
if (itemStackString != null) {
this.rejectedItemStacks.add(itemStackString);
}
}
@Override
public void clear() {
acceptedItemStacks.clear();
rejectedItemStacks.clear();
validOreIds.clear();
}
@Override
public boolean test(ItemStack itemStack) {
if (itemStack == null) {
return false;
}
Item item = itemStack.getItem();
if (item == null) {
return false;
}
String itemStackStringWild = ItemStackUtil.getItemNameFromRegistryAsString(item);
if (rejectedItemStacks.contains(itemStackStringWild)) {
return false;
}
if (acceptedItemStacks.contains(itemStackStringWild)) {
return true;
}
int meta = itemStack.getMetadata();
if (meta != OreDictionary.WILDCARD_VALUE) {
String itemStackString = itemStackStringWild + ':' + meta;
if (rejectedItemStacks.contains(itemStackString)) {
return false;
}
if (acceptedItemStacks.contains(itemStackString)) {
return true;
}
}
int[] oreIds = OreDictionary.getOreIDs(itemStack);
for (int oreId : oreIds) {
if (validOreIds.contains(oreId)) {
acceptedItemStacks.add(itemStackStringWild);
return true;
}
}
return false;
}
public Set<Integer> getValidOreIds() {
return validOreIds;
}
public Set<String> getAcceptedItemStacks() {
return acceptedItemStacks;
}
public Set<String> getRejectedItemStacks() {
return rejectedItemStacks;
}
}
@@ -0,0 +1,23 @@
package forestry.storage;
import javax.annotation.Nonnull;
import java.util.function.Predicate;
import forestry.api.genetics.AlleleManager;
import forestry.api.genetics.ISpeciesRoot;
import net.minecraft.item.ItemStack;
public class BackpackFilterNaturalist implements Predicate<ItemStack> {
@Nonnull
private final String speciesRootUid;
public BackpackFilterNaturalist(@Nonnull String speciesRootUid) {
this.speciesRootUid = speciesRootUid;
}
@Override
public boolean test(ItemStack itemStack) {
ISpeciesRoot speciesRoot = AlleleManager.alleleRegistry.getSpeciesRoot(speciesRootUid);
return speciesRoot.isMember(itemStack);
}
}
@@ -14,34 +14,109 @@ import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import java.util.HashMap;
import java.util.Map;
import java.util.function.Predicate;
import net.minecraft.item.Item;
import com.google.common.collect.HashMultimap;
import com.google.common.collect.Multimap;
import forestry.api.genetics.ISpeciesRoot;
import forestry.api.storage.EnumBackpackType;
import forestry.api.storage.IBackpackDefinition;
import forestry.api.storage.IBackpackFilterConfigurable;
import forestry.api.storage.IBackpackInterface;
import forestry.core.utils.ItemStackUtil;
import forestry.storage.items.ItemBackpack;
import forestry.storage.items.ItemBackpackNaturalist;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
public class BackpackInterface implements IBackpackInterface {
/**
* Only use this if you know what you are doing. Prefer backpackInterface.
*/
public final Map<String, IBackpackDefinition> definitions = new HashMap<>();
@Nullable
@Override
public IBackpackDefinition getBackpack(@Nonnull String uid) {
return definitions.get(uid);
private final Map<String, IBackpackDefinition> definitions = new HashMap<>();
private final Multimap<String, String> backpackAcceptedItems = HashMultimap.create();
public Multimap<String, String> getBackpackAcceptedItems() {
return backpackAcceptedItems;
}
@Override
public void registerBackpack(@Nonnull String uid, @Nonnull IBackpackDefinition definition) {
definitions.put(uid, definition);
public void addItemToForestryBackpack(@Nullable String backpackUid, @Nullable ItemStack itemStack) {
if (backpackUid == null) {
throw new NullPointerException("backpackUid must not be null");
}
if (itemStack == null) {
throw new NullPointerException("itemStack must not be null");
}
if (itemStack.getItem() == null) {
throw new NullPointerException("itemStack.getItem() must not be null");
}
String stringForItemStack = ItemStackUtil.getStringForItemStack(itemStack);
backpackAcceptedItems.put(backpackUid, stringForItemStack);
}
@Override
public void registerBackpackDefinition(@Nullable String backpackUid, @Nullable IBackpackDefinition definition) {
if (backpackUid == null) {
throw new NullPointerException("backpackUid must not be null");
}
if (definition == null) {
throw new NullPointerException("definition must not be null");
}
definitions.put(backpackUid, definition);
}
@Nullable
@Override
public IBackpackDefinition getBackpackDefinition(@Nullable String backpackUid) {
if (backpackUid == null) {
throw new NullPointerException("backpackUid must not be null");
}
return definitions.get(backpackUid);
}
@Nonnull
@Override
public Item createBackpack(@Nonnull IBackpackDefinition definition, @Nonnull EnumBackpackType type) {
public Item createBackpack(@Nullable String backpackUid, @Nullable EnumBackpackType type) {
if (backpackUid == null) {
throw new NullPointerException("backpackUid must not be null");
}
if (type == null) {
throw new NullPointerException("type must not be null");
}
if (type == EnumBackpackType.NATURALIST) {
throw new IllegalArgumentException("type must not be NATURALIST. Use createNaturalistBackpack instead.");
}
IBackpackDefinition definition = definitions.get(backpackUid);
if (definition == null) {
throw new IllegalArgumentException("No backpack definition was registered for UID: " + backpackUid);
}
return new ItemBackpack(definition, type);
}
@Override
public Item createNaturalistBackpack(@Nullable String backpackUid, @Nullable ISpeciesRoot speciesRoot) {
if (backpackUid == null) {
throw new NullPointerException("backpackUid must not be null");
}
if (speciesRoot == null) {
throw new NullPointerException("speciesRoot must not be null");
}
IBackpackDefinition definition = definitions.get(backpackUid);
if (definition == null) {
throw new IllegalArgumentException("No backpack definition was registered for UID: " + backpackUid);
}
return new ItemBackpackNaturalist(speciesRoot, definition);
}
@Override
public IBackpackFilterConfigurable createBackpackFilter() {
return new BackpackFilter();
}
@Override
public Predicate<ItemStack> createNaturalistBackpackFilter(String speciesRootUid) {
return new BackpackFilterNaturalist(speciesRootUid);
}
}
@@ -10,15 +10,14 @@
******************************************************************************/
package forestry.storage;
import net.minecraft.entity.item.EntityItem;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import forestry.api.storage.IBackpackDefinition;
import forestry.core.IPickupHandler;
import forestry.storage.gui.ContainerBackpack;
import forestry.storage.gui.ContainerNaturalistBackpack;
import forestry.storage.items.ItemBackpack;
import net.minecraft.entity.item.EntityItem;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
public class PickupHandlerStorage implements IPickupHandler {
@@ -54,7 +53,7 @@ public class PickupHandlerStorage implements IPickupHandler {
ItemBackpack backpack = (ItemBackpack) pack.getItem();
IBackpackDefinition backpackDefinition = backpack.getDefinition();
if (backpackDefinition.test(itemstack)) {
if (backpackDefinition.getFilter().test(itemstack)) {
ItemBackpack.tryStowing(player, pack, itemstack);
}
}
+147 -96
View File
@@ -10,43 +10,25 @@
******************************************************************************/
package forestry.storage;
import com.google.common.collect.HashMultimap;
import com.google.common.collect.Multimap;
import javax.annotation.Nonnull;
import java.awt.Color;
import java.awt.*;
import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.function.Predicate;
import net.minecraft.init.Blocks;
import net.minecraft.init.Items;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraftforge.client.event.ModelBakeEvent;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.common.config.Property;
import net.minecraftforge.fluids.Fluid;
import net.minecraftforge.fluids.FluidRegistry;
import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.fml.common.SidedProxy;
import net.minecraftforge.fml.common.event.FMLInterModComms.IMCMessage;
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 com.google.common.collect.HashMultimap;
import com.google.common.collect.Multimap;
import forestry.Forestry;
import forestry.api.core.ForestryAPI;
import forestry.api.recipes.RecipeManagers;
import forestry.api.storage.BackpackManager;
import forestry.api.storage.IBackpackDefinition;
import forestry.api.storage.IBackpackFilterConfigurable;
import forestry.api.storage.StorageManager;
import forestry.apiculture.PluginApiculture;
import forestry.apiculture.blocks.BlockRegistryApiculture;
@@ -70,6 +52,22 @@ import forestry.plugins.ForestryPlugin;
import forestry.plugins.ForestryPluginUids;
import forestry.storage.items.ItemRegistryStorage;
import forestry.storage.proxy.ProxyStorage;
import net.minecraft.init.Blocks;
import net.minecraft.init.Items;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraftforge.client.event.ModelBakeEvent;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.common.config.Property;
import net.minecraftforge.fluids.Fluid;
import net.minecraftforge.fluids.FluidRegistry;
import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.fml.common.SidedProxy;
import net.minecraftforge.fml.common.event.FMLInterModComms.IMCMessage;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import net.minecraftforge.oredict.OreDictionary;
@ForestryPlugin(pluginID = ForestryPluginUids.STORAGE, name = "Storage", author = "SirSengir", url = Constants.URL, unlocalizedDescription = "for.plugin.storage.description")
public class PluginStorage extends BlankForestryPlugin {
@@ -82,8 +80,10 @@ public class PluginStorage extends BlankForestryPlugin {
public static ItemRegistryStorage items;
private final Multimap<String, String> backpackOreDictRegexpDefaults = HashMultimap.create();
private final Multimap<String, String> backpackItemDefaults = HashMultimap.create();
private final Multimap<String, String> backpackAcceptedOreDictRegexpDefaults = HashMultimap.create();
private final Multimap<String, String> backpackRejectedOreDictRegexpDefaults = HashMultimap.create();
private final Multimap<String, String> backpackAcceptedItemDefaults = HashMultimap.create();
private final Multimap<String, String> backpackRejectedItemDefaults = HashMultimap.create();
private final List<String> forestryBackpackUids = Arrays.asList(
BackpackManager.MINER_UID,
@@ -105,32 +105,34 @@ public class PluginStorage extends BlankForestryPlugin {
BackpackDefinition definition;
if (ForestryAPI.enabledPlugins.contains(ForestryPluginUids.APICULTURE)) {
definition = new BackpackDefinition.BackpackDefinitionNaturalist(new Color(0xc4923d), "rootBees");
BackpackManager.backpackInterface.registerBackpack("apiarist", definition);
Predicate<ItemStack> filter = BackpackManager.backpackInterface.createNaturalistBackpackFilter("rootBees");
definition = new BackpackDefinition(new Color(0xc4923d), Color.WHITE, filter);
BackpackManager.backpackInterface.registerBackpackDefinition("apiarist", definition);
}
if (ForestryAPI.enabledPlugins.contains(ForestryPluginUids.LEPIDOPTEROLOGY)) {
definition = new BackpackDefinition.BackpackDefinitionNaturalist(new Color(0x995b31), "rootButterflies");
BackpackManager.backpackInterface.registerBackpack("lepidopterist", definition);
Predicate<ItemStack> filter = BackpackManager.backpackInterface.createNaturalistBackpackFilter("rootButterflies");
definition = new BackpackDefinition(new Color(0x995b31), Color.WHITE, filter);
BackpackManager.backpackInterface.registerBackpackDefinition("lepidopterist", definition);
}
definition = new BackpackDefinition(new Color(0x36187d));
BackpackManager.backpackInterface.registerBackpack(BackpackManager.MINER_UID, definition);
definition = new BackpackDefinition(new Color(0x36187d), Color.WHITE);
BackpackManager.backpackInterface.registerBackpackDefinition(BackpackManager.MINER_UID, definition);
definition = new BackpackDefinition(new Color(0x363cc5));
BackpackManager.backpackInterface.registerBackpack(BackpackManager.DIGGER_UID, definition);
definition = new BackpackDefinition(new Color(0x363cc5), Color.WHITE);
BackpackManager.backpackInterface.registerBackpackDefinition(BackpackManager.DIGGER_UID, definition);
definition = new BackpackDefinition(new Color(0x347427));
BackpackManager.backpackInterface.registerBackpack(BackpackManager.FORESTER_UID, definition);
definition = new BackpackDefinition(new Color(0x347427), Color.WHITE);
BackpackManager.backpackInterface.registerBackpackDefinition(BackpackManager.FORESTER_UID, definition);
definition = new BackpackDefinition(new Color(0x412215));
BackpackManager.backpackInterface.registerBackpack(BackpackManager.HUNTER_UID, definition);
definition = new BackpackDefinition(new Color(0x412215), Color.WHITE);
BackpackManager.backpackInterface.registerBackpackDefinition(BackpackManager.HUNTER_UID, definition);
definition = new BackpackDefinition(new Color(0x7fb8c2));
BackpackManager.backpackInterface.registerBackpack(BackpackManager.ADVENTURER_UID, definition);
definition = new BackpackDefinition(new Color(0x7fb8c2), Color.WHITE);
BackpackManager.backpackInterface.registerBackpackDefinition(BackpackManager.ADVENTURER_UID, definition);
definition = new BackpackDefinition(new Color(0xdd3a3a));
BackpackManager.backpackInterface.registerBackpack(BackpackManager.BUILDER_UID, definition);
definition = new BackpackDefinition(new Color(0xdd3a3a), Color.WHITE);
BackpackManager.backpackInterface.registerBackpackDefinition(BackpackManager.BUILDER_UID, definition);
proxy.registerCrateModel();
}
@@ -151,7 +153,13 @@ public class PluginStorage extends BlankForestryPlugin {
final String newConfig = CONFIG_CATEGORY + ".cfg";
File configFile = new File(Forestry.instance.getConfigFolder(), newConfig);
LocalizedConfiguration config = new LocalizedConfiguration(configFile, "1.0.0");
LocalizedConfiguration config = new LocalizedConfiguration(configFile, "2.0.0");
if (!config.getDefinedConfigVersion().equals(config.getLoadedConfigVersion())) {
boolean deleted = configFile.delete();
if (deleted) {
config = new LocalizedConfiguration(configFile, "2.0.0");
}
}
setDefaultsForConfig();
@@ -163,7 +171,7 @@ public class PluginStorage extends BlankForestryPlugin {
}
private void setDefaultsForConfig() {
backpackOreDictRegexpDefaults.get(BackpackManager.MINER_UID).addAll(Arrays.asList(
backpackAcceptedOreDictRegexpDefaults.get(BackpackManager.MINER_UID).addAll(Arrays.asList(
"obsidian",
"ore[A-Z].*",
"dust[A-Z].*",
@@ -175,7 +183,7 @@ public class PluginStorage extends BlankForestryPlugin {
"denseore[A-Z].*"
));
backpackOreDictRegexpDefaults.get(BackpackManager.DIGGER_UID).addAll(Arrays.asList(
backpackAcceptedOreDictRegexpDefaults.get(BackpackManager.DIGGER_UID).addAll(Arrays.asList(
"cobblestone",
"dirt",
"gravel",
@@ -185,7 +193,7 @@ public class PluginStorage extends BlankForestryPlugin {
"sand"
));
backpackOreDictRegexpDefaults.get(BackpackManager.HUNTER_UID).addAll(Arrays.asList(
backpackAcceptedOreDictRegexpDefaults.get(BackpackManager.HUNTER_UID).addAll(Arrays.asList(
"bone",
"egg",
"enderpearl",
@@ -197,7 +205,7 @@ public class PluginStorage extends BlankForestryPlugin {
"string"
));
backpackOreDictRegexpDefaults.get(BackpackManager.FORESTER_UID).addAll(Arrays.asList(
backpackAcceptedOreDictRegexpDefaults.get(BackpackManager.FORESTER_UID).addAll(Arrays.asList(
"logWood",
"stickWood",
"woodStick",
@@ -211,7 +219,7 @@ public class PluginStorage extends BlankForestryPlugin {
"tree[A-Z].*"
));
backpackOreDictRegexpDefaults.get(BackpackManager.BUILDER_UID).addAll(Arrays.asList(
backpackAcceptedOreDictRegexpDefaults.get(BackpackManager.BUILDER_UID).addAll(Arrays.asList(
"block[A-Z].*",
"paneGlass[A-Z].*",
"slabWood[A-Z].*",
@@ -234,7 +242,7 @@ public class PluginStorage extends BlankForestryPlugin {
"doorWood"
));
backpackItemDefaults.get(BackpackManager.MINER_UID).addAll(getItemStrings(Arrays.asList(
backpackAcceptedItemDefaults.get(BackpackManager.MINER_UID).addAll(getItemStrings(Arrays.asList(
new ItemStack(Blocks.COAL_ORE),
new ItemStack(Items.COAL),
PluginCore.items.bronzePickaxe.getItemStack(),
@@ -242,7 +250,7 @@ public class PluginStorage extends BlankForestryPlugin {
PluginCore.items.brokenBronzePickaxe.getItemStack()
)));
backpackItemDefaults.get(BackpackManager.DIGGER_UID).addAll(getItemStrings(Arrays.asList(
backpackAcceptedItemDefaults.get(BackpackManager.DIGGER_UID).addAll(getItemStrings(Arrays.asList(
new ItemStack(Blocks.DIRT, 1, OreDictionary.WILDCARD_VALUE),
new ItemStack(Items.FLINT),
new ItemStack(Blocks.SANDSTONE, 1, 0),
@@ -254,7 +262,7 @@ public class PluginStorage extends BlankForestryPlugin {
PluginCore.items.brokenBronzeShovel.getItemStack()
)));
backpackItemDefaults.get(BackpackManager.FORESTER_UID).addAll(getItemStrings(Arrays.asList(
backpackAcceptedItemDefaults.get(BackpackManager.FORESTER_UID).addAll(getItemStrings(Arrays.asList(
new ItemStack(Blocks.RED_MUSHROOM),
new ItemStack(Blocks.BROWN_MUSHROOM),
new ItemStack(Blocks.RED_FLOWER, 1, OreDictionary.WILDCARD_VALUE),
@@ -274,7 +282,7 @@ public class PluginStorage extends BlankForestryPlugin {
new ItemStack(Items.APPLE)
)));
backpackItemDefaults.get(BackpackManager.HUNTER_UID).addAll(getItemStrings(Arrays.asList(
backpackAcceptedItemDefaults.get(BackpackManager.HUNTER_UID).addAll(getItemStrings(Arrays.asList(
new ItemStack(Items.BLAZE_POWDER),
new ItemStack(Items.BLAZE_ROD),
new ItemStack(Items.ROTTEN_FLESH),
@@ -315,7 +323,7 @@ public class PluginStorage extends BlankForestryPlugin {
new ItemStack(Items.IRON_HORSE_ARMOR)
)));
backpackItemDefaults.get(BackpackManager.BUILDER_UID).addAll(getItemStrings(Arrays.asList(
backpackAcceptedItemDefaults.get(BackpackManager.BUILDER_UID).addAll(getItemStrings(Arrays.asList(
new ItemStack(Blocks.REDSTONE_TORCH),
new ItemStack(Blocks.REDSTONE_LAMP),
new ItemStack(Blocks.SEA_LANTERN),
@@ -369,24 +377,15 @@ public class PluginStorage extends BlankForestryPlugin {
BlockRegistryApiculture beeBlocks = PluginApiculture.blocks;
if (beeBlocks != null) {
backpackItemDefaults.get(BackpackManager.BUILDER_UID).addAll(getItemStrings(Arrays.asList(
backpackAcceptedItemDefaults.get(BackpackManager.BUILDER_UID).addAll(getItemStrings(Arrays.asList(
new ItemStack(beeBlocks.candle, 1, OreDictionary.WILDCARD_VALUE),
new ItemStack(beeBlocks.stump, 1, OreDictionary.WILDCARD_VALUE)
)));
}
// include everything added via the API
for (String backpackUid : forestryBackpackUids) {
BackpackDefinition backpackDefinition = (BackpackDefinition) BackpackManager.backpackInterface.getBackpack(backpackUid);
Collection<String> oreDictDefaults = backpackOreDictRegexpDefaults.get(backpackUid);
for (int oreId : backpackDefinition.getValidOreIds()) {
String oreName = OreDictionary.getOreName(oreId);
oreDictDefaults.add(oreName);
}
backpackItemDefaults.get(backpackUid).addAll(backpackDefinition.getValidItemStacks());
}
BackpackInterface backpackInterface = (BackpackInterface) BackpackManager.backpackInterface;
backpackAcceptedItemDefaults.putAll(backpackInterface.getBackpackAcceptedItems());
}
// Should be ore dicted in Forge at some point.
@@ -416,45 +415,91 @@ public class PluginStorage extends BlankForestryPlugin {
}
private void handleBackpackConfig(LocalizedConfiguration config, String backpackUid) {
BackpackDefinition backpackDefinition = (BackpackDefinition) BackpackManager.backpackInterface.getBackpack(backpackUid);
backpackDefinition.clearAllValid();
{
List<String> defaultItemNames = new ArrayList<>(backpackItemDefaults.get(backpackUid));
Collections.sort(defaultItemNames);
String[] defaultValidItems = defaultItemNames.toArray(new String[defaultItemNames.size()]);
Property backpackConf = config.get("backpacks." + backpackUid, "item.stacks", defaultValidItems);
backpackConf.setComment(Translator.translateToLocalFormatted("for.config.backpacks.item.stacks.format", backpackUid));
String[] backpackItemList = backpackConf.getStringList();
List<ItemStack> backpackItems = ItemStackUtil.parseItemStackStrings(backpackItemList, OreDictionary.WILDCARD_VALUE);
backpackDefinition.addValidItems(backpackItems);
BackpackDefinition backpackDefinition = (BackpackDefinition) BackpackManager.backpackInterface.getBackpackDefinition(backpackUid);
if (backpackDefinition == null) {
return;
}
{
Predicate<ItemStack> filter = backpackDefinition.getFilter();
if (filter instanceof IBackpackFilterConfigurable) {
IBackpackFilterConfigurable backpackFilter = (IBackpackFilterConfigurable) filter;
backpackFilter.clear();
List<String> defaultOreRegexpList = new ArrayList<>(backpackOreDictRegexpDefaults.get(backpackUid));
Collections.sort(defaultOreRegexpList);
String[] defaultOreRegexpNames = defaultOreRegexpList.toArray(new String[defaultOreRegexpList.size()]);
// accepted items
{
List<String> defaultAcceptedItemNames = new ArrayList<>(backpackAcceptedItemDefaults.get(backpackUid));
Collections.sort(defaultAcceptedItemNames);
String[] defaultValidItems = defaultAcceptedItemNames.toArray(new String[defaultAcceptedItemNames.size()]);
Property backpackConf = config.get("backpacks." + backpackUid, "ore.dict", defaultOreRegexpNames);
backpackConf.setComment(Translator.translateToLocalFormatted("for.config.backpacks.ore.dict.format", backpackUid));
Property backpackConf = config.get("backpacks." + backpackUid, "item.stacks.accepted", defaultValidItems);
backpackConf.setComment(Translator.translateToLocalFormatted("for.config.backpacks.item.stacks.format", backpackUid));
List<String> oreDictNameList = new ArrayList<>();
for (String name : OreDictionary.getOreNames()) {
if (name == null) {
Log.error("Found a null oreName in the ore dictionary");
} else {
for (String regex : backpackConf.getStringList()) {
if (name.matches(regex)) {
oreDictNameList.add(name);
String[] backpackItemList = backpackConf.getStringList();
List<ItemStack> backpackItems = ItemStackUtil.parseItemStackStrings(backpackItemList, OreDictionary.WILDCARD_VALUE);
for (ItemStack backpackItem : backpackItems) {
backpackFilter.acceptItem(backpackItem);
}
}
// rejected items
{
List<String> defaultRejectedItemNames = new ArrayList<>(backpackRejectedItemDefaults.get(backpackUid));
Collections.sort(defaultRejectedItemNames);
String[] defaultRejectedItems = defaultRejectedItemNames.toArray(new String[defaultRejectedItemNames.size()]);
Property backpackConf = config.get("backpacks." + backpackUid, "item.stacks.rejected", defaultRejectedItems);
backpackConf.setComment(Translator.translateToLocalFormatted("for.config.backpacks.item.stacks.format", backpackUid));
String[] backpackItemList = backpackConf.getStringList();
List<ItemStack> backpackItems = ItemStackUtil.parseItemStackStrings(backpackItemList, OreDictionary.WILDCARD_VALUE);
for (ItemStack backpackItem : backpackItems) {
backpackFilter.rejectItem(backpackItem);
}
}
// accepted oreDict
{
List<String> defaultOreRegexpList = new ArrayList<>(backpackAcceptedOreDictRegexpDefaults.get(backpackUid));
Collections.sort(defaultOreRegexpList);
String[] defaultOreRegexpNames = defaultOreRegexpList.toArray(new String[defaultOreRegexpList.size()]);
Property backpackConf = config.get("backpacks." + backpackUid, "ore.dict.accepted", defaultOreRegexpNames);
backpackConf.setComment(Translator.translateToLocalFormatted("for.config.backpacks.ore.dict.format", backpackUid));
for (String name : OreDictionary.getOreNames()) {
if (name == null) {
Log.error("Found a null oreName in the ore dictionary");
} else {
for (String regex : backpackConf.getStringList()) {
if (name.matches(regex)) {
backpackFilter.acceptOreDictName(name);
}
}
}
}
}
backpackDefinition.addValidOreDictNames(oreDictNameList);
// rejected oreDict
{
List<String> defaultOreRegexpList = new ArrayList<>(backpackRejectedOreDictRegexpDefaults.get(backpackUid));
Collections.sort(defaultOreRegexpList);
String[] defaultOreRegexpNames = defaultOreRegexpList.toArray(new String[defaultOreRegexpList.size()]);
Property backpackConf = config.get("backpacks." + backpackUid, "ore.dict.rejected", defaultOreRegexpNames);
backpackConf.setComment(Translator.translateToLocalFormatted("for.config.backpacks.ore.dict.format", backpackUid));
for (String name : OreDictionary.getOreNames()) {
if (name == null) {
Log.error("Found a null oreName in the ore dictionary");
} else {
for (String regex : backpackConf.getStringList()) {
if (name.matches(regex)) {
backpackFilter.rejectOreDictName(name);
}
}
}
}
}
}
}
@@ -497,14 +542,20 @@ public class PluginStorage extends BlankForestryPlugin {
return true;
}
IBackpackDefinition backpackDefinition = BackpackManager.backpackInterface.getBackpack(tokens[0]);
IBackpackDefinition backpackDefinition = BackpackManager.backpackInterface.getBackpackDefinition(tokens[0]);
if (backpackDefinition == null) {
String errorMessage = IMCUtil.getInvalidIMCMessageText(message);
Log.warning("%s For non-existent backpack %s.", errorMessage, tokens[0]);
Log.warning("{} For non-existent backpack {}.", errorMessage, tokens[0]);
return true;
}
List<ItemStack> itemStacks = ItemStackUtil.parseItemStackStrings(tokens[1], 0);
backpackDefinition.addValidItems(itemStacks);
Predicate<ItemStack> filter = backpackDefinition.getFilter();
if (filter instanceof IBackpackFilterConfigurable) {
IBackpackFilterConfigurable backpackFilter = (IBackpackFilterConfigurable) filter;
for (ItemStack itemStack : itemStacks) {
backpackFilter.acceptItem(itemStack);
}
}
return true;
}
@@ -1,12 +1,11 @@
package forestry.storage.inventory;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import forestry.api.storage.IBackpackDefinition;
import forestry.core.inventory.ItemInventory;
import forestry.storage.items.ItemBackpack;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
public class ItemInventoryBackpack extends ItemInventory {
@@ -33,6 +32,6 @@ public class ItemInventoryBackpack extends ItemInventory {
@Override
public boolean canSlotAccept(int slotIndex, ItemStack itemStack) {
return backpackDefinition.test(itemStack);
return backpackDefinition.getFilter().test(itemStack);
}
}
@@ -14,26 +14,6 @@ import javax.annotation.Nullable;
import java.util.List;
import java.util.Locale;
import net.minecraft.client.renderer.ItemMeshDefinition;
import net.minecraft.client.renderer.block.model.ModelBakery;
import net.minecraft.client.renderer.block.model.ModelResourceLocation;
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.ActionResult;
import net.minecraft.util.EnumActionResult;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.EnumHand;
import net.minecraft.util.ResourceLocation;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import net.minecraftforge.items.IItemHandler;
import forestry.api.core.IModelManager;
import forestry.api.storage.BackpackStowEvent;
import forestry.api.storage.EnumBackpackType;
@@ -53,6 +33,24 @@ import forestry.storage.gui.ContainerBackpack;
import forestry.storage.gui.GuiBackpack;
import forestry.storage.gui.GuiBackpackT2;
import forestry.storage.inventory.ItemInventoryBackpack;
import net.minecraft.client.renderer.ItemMeshDefinition;
import net.minecraft.client.renderer.block.model.ModelBakery;
import net.minecraft.client.renderer.block.model.ModelResourceLocation;
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.ActionResult;
import net.minecraft.util.EnumActionResult;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.EnumHand;
import net.minecraft.util.ResourceLocation;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import net.minecraftforge.items.IItemHandler;
public class ItemBackpack extends ItemWithGui implements IColoredItem {
private final IBackpackDefinition definition;
@@ -179,7 +177,7 @@ public class ItemBackpack extends ItemWithGui implements IColoredItem {
private void receiveFromChest(ItemInventoryBackpack backpackInventory, IItemHandler target) {
ItemHandlerInventoryManipulator manipulator = new ItemHandlerInventoryManipulator(target);
manipulator.transferStacks(backpackInventory.getItemHandler(), definition);
manipulator.transferStacks(backpackInventory.getItemHandler(), definition.getFilter());
}
public int getBackpackSize() {
@@ -12,9 +12,6 @@ package forestry.storage.items;
import javax.annotation.Nonnull;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import forestry.api.genetics.ISpeciesRoot;
import forestry.api.storage.EnumBackpackType;
import forestry.api.storage.IBackpackDefinition;
@@ -23,13 +20,15 @@ import forestry.core.gui.GuiHandler;
import forestry.core.gui.GuiNaturalistInventory;
import forestry.storage.gui.ContainerNaturalistBackpack;
import forestry.storage.inventory.ItemInventoryBackpackPaged;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
public class ItemBackpackNaturalist extends ItemBackpack {
@Nonnull
private final ISpeciesRoot speciesRoot;
public ItemBackpackNaturalist(@Nonnull ISpeciesRoot speciesRoot, IBackpackDefinition definition, EnumBackpackType type) {
super(definition, type);
public ItemBackpackNaturalist(@Nonnull ISpeciesRoot speciesRoot, IBackpackDefinition definition) {
super(definition, EnumBackpackType.NATURALIST);
this.speciesRoot = speciesRoot;
}
@@ -10,23 +10,22 @@
******************************************************************************/
package forestry.storage.items;
import net.minecraft.item.Item;
import forestry.api.apiculture.BeeManager;
import forestry.api.core.ForestryAPI;
import forestry.api.core.Tabs;
import forestry.api.lepidopterology.ButterflyManager;
import forestry.api.storage.BackpackManager;
import forestry.api.storage.EnumBackpackType;
import forestry.api.storage.IBackpackDefinition;
import forestry.api.storage.IBackpackInterface;
import forestry.core.items.ItemCrated;
import forestry.core.items.ItemRegistry;
import forestry.plugins.ForestryPluginUids;
import net.minecraft.item.Item;
public class ItemRegistryStorage extends ItemRegistry {
public final ItemCrated crate;
public final ItemBackpackNaturalist apiaristBackpack;
public final ItemBackpackNaturalist lepidopteristBackpack;
public final Item apiaristBackpack;
public final Item lepidopteristBackpack;
public final Item minerBackpack;
public final Item minerBackpackT2;
public final Item diggerBackpack;
@@ -45,48 +44,38 @@ public class ItemRegistryStorage extends ItemRegistry {
crate = registerItem(new ItemCrated(null, null), "crate");
// BACKPACKS
IBackpackDefinition definition;
IBackpackInterface backpackInterface = BackpackManager.backpackInterface;
if (ForestryAPI.enabledPlugins.contains(ForestryPluginUids.APICULTURE)) {
definition = BackpackManager.backpackInterface.getBackpack("apiarist");
apiaristBackpack = new ItemBackpackNaturalist(BeeManager.beeRoot, definition, EnumBackpackType.NATURALIST);
apiaristBackpack = registerItem(backpackInterface.createNaturalistBackpack("apiarist", BeeManager.beeRoot), "apiaristBag");
apiaristBackpack.setCreativeTab(Tabs.tabApiculture);
registerItem(apiaristBackpack, "apiaristBag");
} else {
apiaristBackpack = null;
}
if (ForestryAPI.enabledPlugins.contains(ForestryPluginUids.LEPIDOPTEROLOGY)) {
definition = BackpackManager.backpackInterface.getBackpack("lepidopterist");
lepidopteristBackpack = new ItemBackpackNaturalist(ButterflyManager.butterflyRoot, definition, EnumBackpackType.NATURALIST);
lepidopteristBackpack = registerItem(backpackInterface.createNaturalistBackpack("lepidopterist", ButterflyManager.butterflyRoot), "lepidopteristBag");
lepidopteristBackpack.setCreativeTab(Tabs.tabLepidopterology);
registerItem(lepidopteristBackpack, "lepidopteristBag");
} else {
lepidopteristBackpack = null;
}
definition = BackpackManager.backpackInterface.getBackpack(BackpackManager.MINER_UID);
minerBackpack = registerItem(BackpackManager.backpackInterface.createBackpack(definition, EnumBackpackType.NORMAL), "minerBag");
minerBackpackT2 = registerItem(BackpackManager.backpackInterface.createBackpack(definition, EnumBackpackType.WOVEN), "minerBagT2");
definition = BackpackManager.backpackInterface.getBackpack(BackpackManager.DIGGER_UID);
diggerBackpack = registerItem(BackpackManager.backpackInterface.createBackpack(definition, EnumBackpackType.NORMAL), "diggerBag");
diggerBackpackT2 = registerItem(BackpackManager.backpackInterface.createBackpack(definition, EnumBackpackType.WOVEN), "diggerBagT2");
definition = BackpackManager.backpackInterface.getBackpack(BackpackManager.FORESTER_UID);
foresterBackpack = registerItem(BackpackManager.backpackInterface.createBackpack(definition, EnumBackpackType.NORMAL), "foresterBag");
foresterBackpackT2 = registerItem(BackpackManager.backpackInterface.createBackpack(definition, EnumBackpackType.WOVEN), "foresterBagT2");
definition = BackpackManager.backpackInterface.getBackpack(BackpackManager.HUNTER_UID);
hunterBackpack = registerItem(BackpackManager.backpackInterface.createBackpack(definition, EnumBackpackType.NORMAL), "hunterBag");
hunterBackpackT2 = registerItem(BackpackManager.backpackInterface.createBackpack(definition, EnumBackpackType.WOVEN), "hunterBagT2");
definition = BackpackManager.backpackInterface.getBackpack(BackpackManager.ADVENTURER_UID);
adventurerBackpack = registerItem(BackpackManager.backpackInterface.createBackpack(definition, EnumBackpackType.NORMAL), "adventurerBag");
adventurerBackpackT2 = registerItem(BackpackManager.backpackInterface.createBackpack(definition, EnumBackpackType.WOVEN), "adventurerBagT2");
definition = BackpackManager.backpackInterface.getBackpack(BackpackManager.BUILDER_UID);
builderBackpack = registerItem(BackpackManager.backpackInterface.createBackpack(definition, EnumBackpackType.NORMAL), "builderBag");
builderBackpackT2 = registerItem(BackpackManager.backpackInterface.createBackpack(definition, EnumBackpackType.WOVEN), "builderBagT2");
minerBackpack = registerItem(backpackInterface.createBackpack(BackpackManager.MINER_UID, EnumBackpackType.NORMAL), "minerBag");
minerBackpackT2 = registerItem(backpackInterface.createBackpack(BackpackManager.MINER_UID, EnumBackpackType.WOVEN), "minerBagT2");
diggerBackpack = registerItem(backpackInterface.createBackpack(BackpackManager.DIGGER_UID, EnumBackpackType.NORMAL), "diggerBag");
diggerBackpackT2 = registerItem(backpackInterface.createBackpack(BackpackManager.DIGGER_UID, EnumBackpackType.WOVEN), "diggerBagT2");
foresterBackpack = registerItem(backpackInterface.createBackpack(BackpackManager.FORESTER_UID, EnumBackpackType.NORMAL), "foresterBag");
foresterBackpackT2 = registerItem(backpackInterface.createBackpack(BackpackManager.FORESTER_UID, EnumBackpackType.WOVEN), "foresterBagT2");
hunterBackpack = registerItem(backpackInterface.createBackpack(BackpackManager.HUNTER_UID, EnumBackpackType.NORMAL), "hunterBag");
hunterBackpackT2 = registerItem(backpackInterface.createBackpack(BackpackManager.HUNTER_UID, EnumBackpackType.WOVEN), "hunterBagT2");
adventurerBackpack = registerItem(backpackInterface.createBackpack(BackpackManager.ADVENTURER_UID, EnumBackpackType.NORMAL), "adventurerBag");
adventurerBackpackT2 = registerItem(backpackInterface.createBackpack(BackpackManager.ADVENTURER_UID, EnumBackpackType.WOVEN), "adventurerBagT2");
builderBackpack = registerItem(backpackInterface.createBackpack(BackpackManager.BUILDER_UID, EnumBackpackType.NORMAL), "builderBag");
builderBackpackT2 = registerItem(backpackInterface.createBackpack(BackpackManager.BUILDER_UID, EnumBackpackType.WOVEN), "builderBagT2");
}
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 180 B

After

Width:  |  Height:  |  Size: 189 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 221 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 221 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 180 B

After

Width:  |  Height:  |  Size: 194 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 176 B

After

Width:  |  Height:  |  Size: 193 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 252 B

After

Width:  |  Height:  |  Size: 243 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 198 B

After

Width:  |  Height:  |  Size: 195 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.1 KiB

After

Width:  |  Height:  |  Size: 236 B