mirror of
https://github.com/GTNewHorizons/ForestryMC.git
synced 2026-11-15 09:34:57 +00:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d55d86a3c5 | ||
|
|
b2d5706bbd | ||
|
|
ba6bd8fd10 | ||
|
|
b998e2ac49 | ||
|
|
817540d996 | ||
|
|
9d8866e4fd | ||
|
|
7575b9c6ce | ||
|
|
6700c511a5 | ||
|
|
acc55d4f41 | ||
|
|
7bd5bb120d | ||
|
|
dbbb727576 | ||
|
|
dcf0fc83ad | ||
|
|
6ef91590cf | ||
|
|
856322b208 | ||
|
|
42425e3500 | ||
|
|
cde076e702 | ||
|
|
b5f60d73e3 | ||
|
|
f82d123b7f | ||
|
|
ca17801c86 | ||
|
|
33d1685713 | ||
|
|
69c024811f | ||
|
|
4dd95625e1 | ||
|
|
6adcde4a75 | ||
|
|
2f06c777b2 | ||
|
|
32f295b16c | ||
|
|
ef4c65c6e6 | ||
|
|
ba313a9dfe | ||
|
|
8f36c2a6fc | ||
|
|
149a5b6128 | ||
|
|
56b871eca1 | ||
|
|
c09cdcdb64 | ||
|
|
2f66d0ea82 | ||
|
|
ac224823be | ||
|
|
1eca6e41af | ||
|
|
94bd65ee8e | ||
|
|
795b154eb5 | ||
|
|
358e7853c2 | ||
|
|
4f7b77abb4 | ||
|
|
aff15b34d6 | ||
|
|
55cf7b5c16 | ||
|
|
d4cfbe9f29 | ||
|
|
4fc731c7c8 | ||
|
|
bd2af7fa13 | ||
|
|
f3d88fea3c | ||
|
|
1d642cf9c5 | ||
|
|
b187815415 | ||
|
|
5c7150ad62 | ||
|
|
d84f708a98 | ||
|
|
2117be96cd | ||
|
|
96f941f6e6 | ||
|
|
d3c7d7141d |
No files matched your search
@@ -17,6 +17,8 @@ buildscript {
|
||||
|
||||
plugins {
|
||||
id "net.minecraftforge.gradle.forge" version "2.0.2"
|
||||
id "com.matthewprenger.cursegradle" version "1.0.7"
|
||||
id "se.bjurr.gitchangelog.git-changelog-gradle-plugin" version "1.32"
|
||||
}
|
||||
|
||||
apply plugin: 'maven'
|
||||
@@ -148,3 +150,35 @@ def getBuildNumber() {
|
||||
return "$System.env.BUILD_NUMBER" != "null" ? "$System.env.BUILD_NUMBER" : "0"
|
||||
}
|
||||
|
||||
task makeChangelog(type: se.bjurr.gitchangelog.plugin.gradle.GitChangelogTask) {
|
||||
filePath = "changelog.html"
|
||||
untaggedName = "Current release ${project.version}"
|
||||
fromCommit = "5a3850c2642e535656d090d1473054d5fa8d3331"
|
||||
toRef = "HEAD"
|
||||
templateContent = """
|
||||
Alpha version, still buggy. Do not create a world you care about with this version, it can and will break things severely.<br/>
|
||||
Please help the project by trying it out and <a href="https://github.com/ForestryMC/ForestryMC/issues">reporting issues here.</a><br/>
|
||||
{{#tags}}
|
||||
<h3>{{name}}</h3>
|
||||
<ul>
|
||||
{{#commits}}
|
||||
<li>{{{message}}} - {{authorName}}</li>
|
||||
{{/commits}}
|
||||
</ul>
|
||||
{{/tags}}
|
||||
"""
|
||||
}
|
||||
|
||||
curseforge {
|
||||
apiKey = project.hasProperty('curseforge_apikey') ? project.curseforge_apikey : '0'
|
||||
project {
|
||||
id = '59751'
|
||||
changelog = file('changelog.html')
|
||||
changelogType = 'html'
|
||||
releaseType = 'alpha'
|
||||
}
|
||||
}
|
||||
|
||||
afterEvaluate {
|
||||
tasks.curseforge59751.dependsOn.add(makeChangelog)
|
||||
}
|
||||
@@ -4,3 +4,4 @@ GenuineSounds;[email protected];2015-02-26
|
||||
airbreather;[email protected];2015-04-10
|
||||
ganymedes01;[email protected];2015-05-27
|
||||
infinityraider;theoneandonlyraider@gmail;com;2015-10-03
|
||||
girafistudios;[email protected];2016-06-02
|
||||
+2
-2
@@ -1,9 +1,9 @@
|
||||
mcversion=1.9.4
|
||||
forgeversion=12.17.0.1932-1.9.4
|
||||
forgeversion=12.17.0.1950
|
||||
mcp_mappings=snapshot_20160525
|
||||
|
||||
jei_version=3.4.0.+
|
||||
|
||||
version_major=5
|
||||
version_minor=0
|
||||
version_patch=0
|
||||
version_patch=8
|
||||
+1
-1
Submodule lang updated: 53d7c93f90...50cc3f6cfc.
@@ -46,10 +46,10 @@ import forestry.plugins.PluginManager;
|
||||
*/
|
||||
@Mod(
|
||||
modid = Constants.MOD_ID,
|
||||
name = Constants.MOD_ID,
|
||||
name = "Forestry",
|
||||
version = Constants.VERSION,
|
||||
guiFactory = "forestry.core.config.ForestryGuiConfigFactory",
|
||||
dependencies = "required-after:Forge@[12.17.0.1932,);"
|
||||
dependencies = "required-after:Forge@[12.17.0.1949,);"
|
||||
+ "after:Buildcraft|Core@[7.2,);"
|
||||
+ "after:BuildCraft|Energy@[7.2,);"
|
||||
+ "after:ExtrabiomesXL;"
|
||||
@@ -83,7 +83,7 @@ public class Forestry {
|
||||
MinecraftForge.EVENT_BUS.register(eventHandlerCore);
|
||||
MinecraftForge.EVENT_BUS.register(new MultiblockEventHandler());
|
||||
|
||||
configFolder = new File(event.getModConfigurationDirectory(), Constants.RESOURCE_ID);
|
||||
configFolder = new File(event.getModConfigurationDirectory(), Constants.MOD_ID);
|
||||
Config.load();
|
||||
|
||||
PluginManager.runSetup(event);
|
||||
|
||||
@@ -9,6 +9,7 @@ import javax.annotation.Nonnull;
|
||||
import java.util.List;
|
||||
|
||||
import net.minecraft.entity.player.EntityPlayerMP;
|
||||
import net.minecraft.nbt.NBTTagCompound;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
|
||||
@@ -39,8 +40,7 @@ public interface IBeekeepingLogic extends INbtWritable, INbtReadable {
|
||||
/* CLIENT */
|
||||
|
||||
/**
|
||||
* Call this when the housing comes into view of the client.
|
||||
* (i.e. when {@link TileEntity#getUpdateTag()} is called)
|
||||
* Sync to client by using {@link #writeToNBT(NBTTagCompound)} in your {@link TileEntity#getUpdateTag()}
|
||||
*/
|
||||
void syncToClient();
|
||||
|
||||
|
||||
@@ -11,6 +11,8 @@ public interface IHiveTile {
|
||||
*/
|
||||
void calmBees();
|
||||
|
||||
boolean isAngry();
|
||||
|
||||
/**
|
||||
* Called when the hive is attacked.
|
||||
*/
|
||||
|
||||
@@ -17,14 +17,14 @@ public interface IHiveRegistry {
|
||||
|
||||
/* Forestry Hive Names */
|
||||
enum HiveType implements IStringSerializable {
|
||||
FOREST("Forestry:forest", "Forestry.speciesForest"),
|
||||
MEADOWS("Forestry:meadows", "Forestry.speciesMeadows"),
|
||||
DESERT("Forestry:desert", "Forestry.speciesModest"),
|
||||
JUNGLE("Forestry:jungle", "Forestry.speciesTropical"),
|
||||
END("Forestry:end", "Forestry.speciesEnded"),
|
||||
SNOW("Forestry:snow", "Forestry.speciesWintry"),
|
||||
SWAMP("Forestry:swamp", "Forestry.speciesMarshy"),
|
||||
SWARM("Forestry:swarm", "Forestry.speciesForest");
|
||||
FOREST("forestry:forest", "forestry.speciesForest"),
|
||||
MEADOWS("forestry:meadows", "forestry.speciesMeadows"),
|
||||
DESERT("forestry:desert", "forestry.speciesModest"),
|
||||
JUNGLE("forestry:jungle", "forestry.speciesTropical"),
|
||||
END("forestry:end", "forestry.speciesEnded"),
|
||||
SNOW("forestry:snow", "forestry.speciesWintry"),
|
||||
SWAMP("forestry:swamp", "forestry.speciesMarshy"),
|
||||
SWARM("forestry:swarm", "forestry.speciesForest");
|
||||
|
||||
public static final HiveType[] VALUES = values();
|
||||
|
||||
|
||||
@@ -8,8 +8,8 @@ import net.minecraft.block.BlockPlanks;
|
||||
|
||||
public enum EnumVanillaWoodType implements IWoodType {
|
||||
OAK(BlockPlanks.EnumType.OAK),
|
||||
BIRCH(BlockPlanks.EnumType.BIRCH),
|
||||
SPRUCE(BlockPlanks.EnumType.SPRUCE),
|
||||
BIRCH(BlockPlanks.EnumType.BIRCH),
|
||||
JUNGLE(BlockPlanks.EnumType.JUNGLE),
|
||||
ACACIA(BlockPlanks.EnumType.ACACIA),
|
||||
DARK_OAK(BlockPlanks.EnumType.DARK_OAK);
|
||||
|
||||
@@ -21,10 +21,10 @@ import net.minecraft.util.math.Vec3i;
|
||||
*
|
||||
* For example:
|
||||
* en_US
|
||||
* Forestry.allele.smallest=Smallest
|
||||
* forestry.allele.smallest=Smallest
|
||||
* ru_RU
|
||||
* Forestry.allele.smallest=????? ?????????
|
||||
* Forestry.allele.height.smallest=????? ??????
|
||||
* forestry.allele.smallest=????? ?????????
|
||||
* forestry.allele.height.smallest=????? ??????
|
||||
*/
|
||||
public interface IAlleleFactory {
|
||||
/**
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package forestry.api.genetics;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import net.minecraft.item.ItemStack;
|
||||
|
||||
@@ -20,5 +21,7 @@ public interface IAlyzerPlugin {
|
||||
@SideOnly(Side.CLIENT)
|
||||
void drawAnalyticsPage3(GuiAlyzer gui, ItemStack itemStack);
|
||||
|
||||
Map<String, ItemStack> getIconStacks();
|
||||
|
||||
List<String> getHints();
|
||||
}
|
||||
@@ -5,6 +5,7 @@
|
||||
******************************************************************************/
|
||||
package forestry.api.genetics;
|
||||
|
||||
import net.minecraft.block.state.IBlockState;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
@@ -13,5 +14,5 @@ public interface IFlowerAcceptableRule {
|
||||
* Checks if the flower at this position is accepted by this rule.
|
||||
* flowerType is passed in case this rule is registered for multiple flower types.
|
||||
*/
|
||||
boolean isAcceptableFlower(String flowerType, World world, BlockPos pos);
|
||||
boolean isAcceptableFlower(IBlockState blockState, World world, BlockPos pos, String flowerType);
|
||||
}
|
||||
@@ -9,6 +9,7 @@ import javax.annotation.Nonnull;
|
||||
import java.util.List;
|
||||
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.block.state.IBlockState;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
@@ -29,14 +30,14 @@ public interface IFlowerRegistry {
|
||||
void registerGrowthRule(IFlowerGrowthRule rule, String... flowerTypes);
|
||||
|
||||
/**
|
||||
* Registers an accepted flower with any meta value.
|
||||
* Registers an accepted flower with any state.
|
||||
*/
|
||||
void registerAcceptableFlower(Block flowerBlock, String... flowerTypes);
|
||||
void registerAcceptableFlower(Block block, String... flowerTypes);
|
||||
|
||||
/**
|
||||
* Registers an accepted flower with a specific meta value.
|
||||
* Registers an accepted flower with a particular state.
|
||||
*/
|
||||
void registerAcceptableFlower(Block flowerBlock, int flowerMeta, String... flowerTypes);
|
||||
void registerAcceptableFlower(IBlockState blockState, String... flowerTypes);
|
||||
|
||||
/**
|
||||
* Registers custom logic for accepted flowers.
|
||||
@@ -53,7 +54,7 @@ public interface IFlowerRegistry {
|
||||
* @param weight Weight for the Flower (Vanilla = 1.0, Modded flowers < 1.0)
|
||||
* @param flowerTypes See {@link forestry.api.apiculture.FlowerManager}.FlowerTypeXXX
|
||||
*/
|
||||
void registerPlantableFlower(Block flowerBlock, int flowerMeta, double weight, String... flowerTypes);
|
||||
void registerPlantableFlower(IBlockState blockState, double weight, String... flowerTypes);
|
||||
|
||||
/**
|
||||
* Calls the appropriate IFlowerGrowthRule to grow a flower at a specified position.
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
package forestry.api.greenhouse;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
import forestry.api.core.EnumHumidity;
|
||||
import forestry.api.core.EnumTemperature;
|
||||
@@ -22,7 +22,7 @@ public interface IGreenhouseState {
|
||||
|
||||
float getExactHumidity();
|
||||
|
||||
List<IInternalBlock> getInternalBlocks();
|
||||
Set<IInternalBlock> getInternalBlocks();
|
||||
|
||||
Collection<IMultiblockComponent> getGreenhouseComponents();
|
||||
|
||||
|
||||
@@ -129,6 +129,7 @@ public class HasFlowersCache implements INbtWritable, INbtReadable, IStreamable
|
||||
BlockPos flowerPos = new BlockPos(flowersList[i], flowersList[i + 1], flowersList[i + 2]);
|
||||
flowerCoords.add(flowerPos);
|
||||
}
|
||||
needsSync = true;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -21,7 +21,8 @@ import java.util.Objects;
|
||||
import java.util.Random;
|
||||
import java.util.Set;
|
||||
|
||||
import net.minecraft.block.Block;
|
||||
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;
|
||||
@@ -37,7 +38,6 @@ 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.common.config.Property;
|
||||
import net.minecraftforge.fluids.FluidStack;
|
||||
import net.minecraftforge.fml.common.FMLCommonHandler;
|
||||
import net.minecraftforge.fml.common.SidedProxy;
|
||||
@@ -47,7 +47,6 @@ 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 net.minecraftforge.oredict.OreDictionary;
|
||||
|
||||
import forestry.Forestry;
|
||||
import forestry.api.apiculture.BeeManager;
|
||||
@@ -70,8 +69,6 @@ import forestry.apiculture.blocks.BlockRegistryApiculture;
|
||||
import forestry.apiculture.commands.CommandBee;
|
||||
import forestry.apiculture.entities.EntityMinecartApiary;
|
||||
import forestry.apiculture.entities.EntityMinecartBeehouse;
|
||||
import forestry.apiculture.entities.ParticleBee;
|
||||
import forestry.apiculture.flowers.Flower;
|
||||
import forestry.apiculture.flowers.FlowerRegistry;
|
||||
import forestry.apiculture.genetics.BeeBranchDefinition;
|
||||
import forestry.apiculture.genetics.BeeDefinition;
|
||||
@@ -95,6 +92,7 @@ import forestry.apiculture.multiblock.TileAlvearyStabiliser;
|
||||
import forestry.apiculture.multiblock.TileAlvearySwarmer;
|
||||
import forestry.apiculture.network.PacketRegistryApiculture;
|
||||
import forestry.apiculture.proxy.ProxyApiculture;
|
||||
import forestry.apiculture.proxy.ProxyApicultureClient;
|
||||
import forestry.apiculture.tiles.TileCandle;
|
||||
import forestry.apiculture.tiles.TileHive;
|
||||
import forestry.apiculture.worldgen.HiveDecorator;
|
||||
@@ -114,11 +112,8 @@ import forestry.core.network.IPacketRegistry;
|
||||
import forestry.core.recipes.RecipeUtil;
|
||||
import forestry.core.utils.EntityUtil;
|
||||
import forestry.core.utils.IMCUtil;
|
||||
import forestry.core.utils.ItemStackUtil;
|
||||
import forestry.core.utils.Log;
|
||||
import forestry.core.utils.OreDictUtil;
|
||||
import forestry.core.utils.Stack;
|
||||
import forestry.core.utils.Translator;
|
||||
import forestry.core.utils.VillagerTradeLists;
|
||||
import forestry.food.PluginFood;
|
||||
import forestry.food.items.ItemRegistryFood;
|
||||
@@ -208,19 +203,17 @@ public class PluginApiculture extends BlankForestryPlugin {
|
||||
@Override
|
||||
public void doInit() {
|
||||
File configFile = new File(Forestry.instance.getConfigFolder(), CONFIG_CATEGORY + ".cfg");
|
||||
if (!configFile.exists()) {
|
||||
setDefaultsForConfig();
|
||||
}
|
||||
|
||||
LocalizedConfiguration config = new LocalizedConfiguration(configFile, "2.0.0");
|
||||
LocalizedConfiguration config = new LocalizedConfiguration(configFile, "3.0.0");
|
||||
if (!Objects.equals(config.getLoadedConfigVersion(), config.getDefinedConfigVersion())) {
|
||||
boolean deleted = configFile.delete();
|
||||
if (deleted) {
|
||||
config = new LocalizedConfiguration(configFile, "2.0.0");
|
||||
setDefaultsForConfig();
|
||||
config = new LocalizedConfiguration(configFile, "3.0.0");
|
||||
}
|
||||
}
|
||||
|
||||
initFlowerRegistry();
|
||||
|
||||
List<IBeekeepingMode> beekeepingModes = BeeManager.beeRoot.getBeekeepingModes();
|
||||
String[] validBeekeepingModeNames = new String[beekeepingModes.size()];
|
||||
for (int i = 0; i < beekeepingModes.size(); i++) {
|
||||
@@ -232,34 +225,6 @@ public class PluginApiculture extends BlankForestryPlugin {
|
||||
|
||||
secondPrincessChance = config.getFloatLocalized("beekeeping", "second.princess", secondPrincessChance, 0.0f, 100.0f);
|
||||
|
||||
String acceptedFlowerMessage = Translator.translateToLocal("for.config.beekeeping.flowers.accepted.comment");
|
||||
String plantableFlowerMessage = Translator.translateToLocal("for.config.beekeeping.flowers.plantable.comment");
|
||||
|
||||
FlowerRegistry flowerRegistry = (FlowerRegistry) FlowerManager.flowerRegistry;
|
||||
|
||||
for (String flowerType : flowerRegistry.getFlowerTypes()) {
|
||||
String[] defaultAccepted = defaultAcceptedFlowers.get(flowerType);
|
||||
if (defaultAccepted == null) {
|
||||
defaultAccepted = Constants.EMPTY_STRINGS;
|
||||
}
|
||||
Property property = config.get("beekeeping.flowers." + flowerType, "accepted", defaultAccepted);
|
||||
property.setComment(acceptedFlowerMessage);
|
||||
parseAcceptedFlowers(property.getStringList(), flowerType);
|
||||
|
||||
String[] defaultPlantable = defaultPlantableFlowers.get(flowerType);
|
||||
if (defaultPlantable == null) {
|
||||
defaultPlantable = Constants.EMPTY_STRINGS;
|
||||
}
|
||||
property = config.get("beekeeping.flowers." + flowerType, "plantable", defaultPlantable);
|
||||
property.setComment(plantableFlowerMessage);
|
||||
parsePlantableFlowers(property, flowerType);
|
||||
|
||||
Set<Flower> acceptableFlowers = flowerRegistry.getAcceptableFlowers(flowerType);
|
||||
if (acceptableFlowers == null || acceptableFlowers.isEmpty()) {
|
||||
Log.error("Flower type '" + flowerType + "' has no valid flowers set in apiculture.cfg. Add valid flowers or delete the config to set it to default.");
|
||||
}
|
||||
}
|
||||
|
||||
String[] blacklist = config.getStringListLocalized("species", "blacklist", Constants.EMPTY_STRINGS);
|
||||
parseBeeBlacklist(blacklist);
|
||||
|
||||
@@ -346,8 +311,7 @@ public class PluginApiculture extends BlankForestryPlugin {
|
||||
registerDungeonLoot();
|
||||
}
|
||||
|
||||
private void setDefaultsForConfig() {
|
||||
|
||||
private void initFlowerRegistry() {
|
||||
FlowerRegistry flowerRegistry = (FlowerRegistry) FlowerManager.flowerRegistry;
|
||||
|
||||
flowerRegistry.registerAcceptableFlowerRule(new EndFlowerAcceptableRule(), FlowerManager.FlowerTypeEnd);
|
||||
@@ -361,53 +325,26 @@ public class PluginApiculture extends BlankForestryPlugin {
|
||||
flowerRegistry.registerAcceptableFlower(Blocks.MELON_STEM, FlowerManager.FlowerTypeGourd);
|
||||
flowerRegistry.registerAcceptableFlower(Blocks.NETHER_WART, FlowerManager.FlowerTypeNether);
|
||||
flowerRegistry.registerAcceptableFlower(Blocks.CACTUS, FlowerManager.FlowerTypeCacti);
|
||||
|
||||
flowerRegistry.registerAcceptableFlower(Blocks.DOUBLE_PLANT, 0, FlowerManager.FlowerTypeVanilla, FlowerManager.FlowerTypeSnow);
|
||||
flowerRegistry.registerAcceptableFlower(Blocks.DOUBLE_PLANT, 1, FlowerManager.FlowerTypeVanilla, FlowerManager.FlowerTypeSnow);
|
||||
flowerRegistry.registerAcceptableFlower(Blocks.DOUBLE_PLANT, 4, FlowerManager.FlowerTypeVanilla, FlowerManager.FlowerTypeSnow);
|
||||
flowerRegistry.registerAcceptableFlower(Blocks.DOUBLE_PLANT, 5, FlowerManager.FlowerTypeVanilla, FlowerManager.FlowerTypeSnow);
|
||||
|
||||
|
||||
// Register plantable plants
|
||||
for (int meta = 0; meta <= 8; meta++) {
|
||||
flowerRegistry.registerPlantableFlower(Blocks.RED_FLOWER, meta, 1.0, FlowerManager.FlowerTypeVanilla, FlowerManager.FlowerTypeSnow);
|
||||
}
|
||||
|
||||
flowerRegistry.registerPlantableFlower(Blocks.YELLOW_FLOWER, 0, 1.0, FlowerManager.FlowerTypeVanilla, FlowerManager.FlowerTypeSnow);
|
||||
flowerRegistry.registerPlantableFlower(Blocks.BROWN_MUSHROOM, 0, 1.0, FlowerManager.FlowerTypeMushrooms);
|
||||
flowerRegistry.registerPlantableFlower(Blocks.RED_MUSHROOM, 0, 1.0, FlowerManager.FlowerTypeMushrooms);
|
||||
flowerRegistry.registerPlantableFlower(Blocks.CACTUS, 0, 1.0, FlowerManager.FlowerTypeCacti);
|
||||
|
||||
for (String flowerType : flowerRegistry.getFlowerTypes()) {
|
||||
Set<Flower> flowers = flowerRegistry.getAcceptableFlowers(flowerType);
|
||||
List<String> acceptedFlowerNames = new ArrayList<>();
|
||||
List<String> plantableFlowerNames = new ArrayList<>();
|
||||
if (flowers != null) {
|
||||
for (Flower flower : flowers) {
|
||||
String name = ItemStackUtil.getBlockNameFromRegistryAsSting(flower.getBlock());
|
||||
if (name == null) {
|
||||
Log.warning("Could not find name for flower: " + flower + " with type: " + flowerType);
|
||||
continue;
|
||||
}
|
||||
|
||||
int meta = flower.getMeta();
|
||||
if (flower.getMeta() != OreDictionary.WILDCARD_VALUE) {
|
||||
name = name + ':' + meta;
|
||||
}
|
||||
|
||||
if (flower.isPlantable()) {
|
||||
plantableFlowerNames.add(name);
|
||||
} else {
|
||||
acceptedFlowerNames.add(name);
|
||||
}
|
||||
}
|
||||
for (BlockFlower.EnumFlowerType flowerType : BlockFlower.EnumFlowerType.values()) {
|
||||
IBlockState blockState;
|
||||
switch (flowerType.getBlockType()) {
|
||||
case RED:
|
||||
blockState = Blocks.RED_FLOWER.getDefaultState().withProperty(Blocks.RED_FLOWER.getTypeProperty(), flowerType);
|
||||
break;
|
||||
case YELLOW:
|
||||
blockState = Blocks.YELLOW_FLOWER.getDefaultState().withProperty(Blocks.YELLOW_FLOWER.getTypeProperty(), flowerType);
|
||||
break;
|
||||
default:
|
||||
continue;
|
||||
}
|
||||
|
||||
String[] acceptedFlowerNamesArray = acceptedFlowerNames.toArray(new String[acceptedFlowerNames.size()]);
|
||||
defaultAcceptedFlowers.put(flowerType, acceptedFlowerNamesArray);
|
||||
|
||||
String[] plantableFlowerNamesArray = plantableFlowerNames.toArray(new String[plantableFlowerNames.size()]);
|
||||
defaultPlantableFlowers.put(flowerType, plantableFlowerNamesArray);
|
||||
flowerRegistry.registerPlantableFlower(blockState, 1.0, FlowerManager.FlowerTypeVanilla, FlowerManager.FlowerTypeSnow);
|
||||
}
|
||||
|
||||
flowerRegistry.registerPlantableFlower(Blocks.BROWN_MUSHROOM.getDefaultState(), 1.0, FlowerManager.FlowerTypeMushrooms);
|
||||
flowerRegistry.registerPlantableFlower(Blocks.RED_MUSHROOM.getDefaultState(), 1.0, FlowerManager.FlowerTypeMushrooms);
|
||||
flowerRegistry.registerPlantableFlower(Blocks.CACTUS.getDefaultState(), 1.0, FlowerManager.FlowerTypeCacti);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -866,36 +803,6 @@ public class PluginApiculture extends BlankForestryPlugin {
|
||||
}
|
||||
}
|
||||
|
||||
private static void parseAcceptedFlowers(String[] acceptedFlowers, String flowerType) {
|
||||
List<Stack> acceptedFlowerItemStacks = Stack.parseStackStrings(acceptedFlowers, OreDictionary.WILDCARD_VALUE);
|
||||
for (Stack acceptedFlower : acceptedFlowerItemStacks) {
|
||||
Block acceptedFlowerBlock = acceptedFlower.getBlock();
|
||||
int meta = acceptedFlower.getMeta();
|
||||
if (acceptedFlowerBlock != null) {
|
||||
FlowerManager.flowerRegistry.registerAcceptableFlower(acceptedFlowerBlock, meta, flowerType);
|
||||
} else {
|
||||
Log.warning("No block found for '" + acceptedFlower + "' in apiculture config for '" + flowerType + "'.");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static void parsePlantableFlowers(Property property, String flowerType) {
|
||||
for (String string : property.getStringList()) {
|
||||
Stack plantableFlower = Stack.parseStackString(string, OreDictionary.WILDCARD_VALUE);
|
||||
if (plantableFlower == null) {
|
||||
continue;
|
||||
}
|
||||
|
||||
Block plantableFlowerBlock = plantableFlower.getBlock();
|
||||
int meta = plantableFlower.getMeta();
|
||||
if (plantableFlowerBlock != null) {
|
||||
FlowerManager.flowerRegistry.registerPlantableFlower(plantableFlowerBlock, meta, 1.0, flowerType);
|
||||
} else {
|
||||
Log.warning("No block found for '" + string + "' in config '" + property.getName() + "'.");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public ISaveEventHandler getSaveEventHandler() {
|
||||
return new SaveEventHandlerApiculture();
|
||||
@@ -941,12 +848,12 @@ public class PluginApiculture extends BlankForestryPlugin {
|
||||
for (int i = 0; i < ParticleSnow.sprites.length; i++) {
|
||||
ParticleSnow.sprites[i] = event.getMap().registerSprite(new ResourceLocation("forestry:entity/particles/snow." + (i + 1)));
|
||||
}
|
||||
ParticleBee.beeSprite = event.getMap().registerSprite(new ResourceLocation("forestry:entity/particles/swarm_bee"));
|
||||
ProxyApicultureClient.beeSprite = event.getMap().registerSprite(new ResourceLocation("forestry:entity/particles/swarm_bee"));
|
||||
}
|
||||
|
||||
private static class EndFlowerAcceptableRule implements IFlowerAcceptableRule {
|
||||
@Override
|
||||
public boolean isAcceptableFlower(String flowerType, World world, BlockPos pos) {
|
||||
public boolean isAcceptableFlower(IBlockState blockState, World world, BlockPos pos, String flowerType) {
|
||||
Biome biomeGenForCoords = world.getBiome(pos);
|
||||
return BiomeDictionary.isBiomeOfType(biomeGenForCoords, BiomeDictionary.Type.END);
|
||||
}
|
||||
|
||||
@@ -33,12 +33,8 @@ public enum BlockTypeApicultureTesr implements IBlockTypeTesr {
|
||||
@Nonnull
|
||||
private final IMachinePropertiesTesr<?> machineProperties;
|
||||
|
||||
<T extends TileForestry> BlockTypeApicultureTesr(@Nonnull Class<T> teClass, @Nonnull String name, @Nullable TileEntitySpecialRenderer<? super T> renderer, @Nullable AxisAlignedBB boundingBox) {
|
||||
if (boundingBox != null) {
|
||||
this.machineProperties = new MachinePropertiesTesr<>(teClass, name, renderer, boundingBox, Constants.RESOURCE_ID + ":blocks/" + name + ".0");
|
||||
} else {
|
||||
this.machineProperties = new MachinePropertiesTesr<>(teClass, name, renderer, Constants.RESOURCE_ID + ":blocks/" + name + ".0");
|
||||
}
|
||||
<T extends TileForestry> BlockTypeApicultureTesr(@Nonnull Class<T> teClass, @Nonnull String name, @Nullable TileEntitySpecialRenderer<? super T> renderer, AxisAlignedBB boundingBox) {
|
||||
this.machineProperties = new MachinePropertiesTesr<>(teClass, name, renderer, boundingBox, Constants.MOD_ID + ":blocks/" + name + ".0");
|
||||
}
|
||||
|
||||
@Nonnull
|
||||
|
||||
@@ -0,0 +1,137 @@
|
||||
/*******************************************************************************
|
||||
* Copyright (c) 2011-2014 SirSengir.
|
||||
* All rights reserved. This program and the accompanying materials
|
||||
* are made available under the terms of the GNU Lesser Public License v3
|
||||
* which accompanies this distribution, and is available at
|
||||
* http://www.gnu.org/licenses/lgpl-3.0.txt
|
||||
*
|
||||
* Various Contributors including, but not limited to:
|
||||
* SirSengir (original work), CovertJaguar, Player, Binnie, MysteriousAges
|
||||
******************************************************************************/
|
||||
package forestry.apiculture.entities;
|
||||
|
||||
import net.minecraft.client.particle.Particle;
|
||||
import net.minecraft.client.renderer.VertexBuffer;
|
||||
import net.minecraft.entity.Entity;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.util.math.Vec3d;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
import forestry.apiculture.proxy.ProxyApicultureClient;
|
||||
|
||||
public class ParticleBeeExplore extends Particle {
|
||||
private final Vec3d origin;
|
||||
|
||||
public ParticleBeeExplore(World world, Vec3d origin, BlockPos destination, int color) {
|
||||
super(world, origin.xCoord, origin.yCoord, origin.zCoord, 0.0D, 0.0D, 0.0D);
|
||||
setParticleTexture(ProxyApicultureClient.beeSprite);
|
||||
this.origin = origin;
|
||||
|
||||
this.motionX = (destination.getX() + 0.5 - this.posX) * 0.015;
|
||||
this.motionY = (destination.getY() + 0.5 - this.posY) * 0.015;
|
||||
this.motionZ = (destination.getZ() + 0.5 - this.posZ) * 0.015;
|
||||
|
||||
particleRed = (color >> 16 & 255) / 255.0F;
|
||||
particleGreen = (color >> 8 & 255) / 255.0F;
|
||||
particleBlue = (color & 255) / 255.0F;
|
||||
|
||||
this.setSize(0.1F, 0.1F);
|
||||
this.particleScale *= 0.2F;
|
||||
this.particleMaxAge = (int) (80.0D / (Math.random() * 0.8D + 0.2D));
|
||||
|
||||
this.motionX *= 0.9D;
|
||||
this.motionY *= 0.015D;
|
||||
this.motionZ *= 0.9D;
|
||||
}
|
||||
|
||||
/**
|
||||
* Called to update the entity's position/logic.
|
||||
*/
|
||||
@Override
|
||||
public void onUpdate() {
|
||||
this.prevPosX = this.posX;
|
||||
this.prevPosY = this.posY;
|
||||
this.prevPosZ = this.posZ;
|
||||
this.moveEntity(this.motionX, this.motionY, this.motionZ);
|
||||
|
||||
if (this.particleAge == this.particleMaxAge / 2) {
|
||||
this.motionX = (origin.xCoord - this.posX) * 0.03;
|
||||
this.motionY = (origin.yCoord - this.posY) * 0.03;
|
||||
this.motionZ = (origin.zCoord - this.posZ) * 0.03;
|
||||
}
|
||||
|
||||
if (this.particleAge < this.particleMaxAge * 0.25) {
|
||||
// venture out
|
||||
this.motionX *= 0.92 + 0.3D * rand.nextFloat();
|
||||
this.motionY = (this.motionY + 0.3 * (-0.5 + rand.nextFloat())) / 2;
|
||||
this.motionZ *= 0.92 + 0.3D * rand.nextFloat();
|
||||
} else if (this.particleAge < this.particleMaxAge * 0.5) {
|
||||
// slow down
|
||||
this.motionX *= 0.75 + 0.3D * rand.nextFloat();
|
||||
this.motionY = (this.motionY + 0.3 * (-0.5 + rand.nextFloat())) / 2;
|
||||
this.motionZ *= 0.75 + 0.3D * rand.nextFloat();
|
||||
} else if (this.particleAge < this.particleMaxAge * 0.75) {
|
||||
// venture back
|
||||
this.motionX *= 0.95;
|
||||
this.motionY = (origin.yCoord - this.posY) * 0.03;
|
||||
this.motionY = (this.motionY + 0.2 * (-0.5 + rand.nextFloat())) / 2;
|
||||
this.motionZ *= 0.95;
|
||||
} else {
|
||||
// get to origin
|
||||
this.motionX = (origin.xCoord - this.posX) * 0.03;
|
||||
this.motionY = (origin.yCoord - this.posY) * 0.03;
|
||||
this.motionY = (this.motionY + 0.2 * (-0.5 + rand.nextFloat())) / 2;
|
||||
this.motionZ = (origin.zCoord - this.posZ) * 0.03;
|
||||
}
|
||||
|
||||
if (this.particleAge++ >= this.particleMaxAge) {
|
||||
this.setExpired();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void renderParticle(VertexBuffer worldRendererIn, Entity entityIn, float partialTicks, float rotationX, float rotationZ, float rotationYZ, float rotationXY, float rotationXZ) {
|
||||
float minU = 0;
|
||||
float maxU = 1;
|
||||
float minV = 0;
|
||||
float maxV = 1;
|
||||
|
||||
if (this.particleTexture != null) {
|
||||
minU = particleTexture.getMinU();
|
||||
maxU = particleTexture.getMaxU();
|
||||
minV = particleTexture.getMinV();
|
||||
maxV = particleTexture.getMaxV();
|
||||
}
|
||||
|
||||
float f10 = 0.1F * particleScale;
|
||||
float f11 = (float) (prevPosX + (posX - prevPosX) * partialTicks - interpPosX);
|
||||
float f12 = (float) (prevPosY + (posY - prevPosY) * partialTicks - interpPosY);
|
||||
float f13 = (float) (prevPosZ + (posZ - prevPosZ) * partialTicks - interpPosZ);
|
||||
|
||||
int i = this.getBrightnessForRender(partialTicks);
|
||||
int j = i >> 16 & 65535;
|
||||
int k = i & 65535;
|
||||
worldRendererIn.pos(f11 - rotationX * f10 - rotationXY * f10, f12 - rotationZ * f10, f13 - rotationYZ * f10 - rotationXZ * f10).tex(maxU, maxV).color(particleRed, particleGreen, particleBlue, 1.0F).lightmap(j, k).endVertex();
|
||||
worldRendererIn.pos(f11 - rotationX * f10 + rotationXY * f10, f12 + rotationZ * f10, f13 - rotationYZ * f10 + rotationXZ * f10).tex(maxU, minV).color(particleRed, particleGreen, particleBlue, 1.0F).lightmap(j, k).endVertex();
|
||||
worldRendererIn.pos(f11 + rotationX * f10 + rotationXY * f10, f12 + rotationZ * f10, f13 + rotationYZ * f10 + rotationXZ * f10).tex(minU, minV).color(particleRed, particleGreen, particleBlue, 1.0F).lightmap(j, k).endVertex();
|
||||
worldRendererIn.pos(f11 + rotationX * f10 - rotationXY * f10, f12 - rotationZ * f10, f13 + rotationYZ * f10 - rotationXZ * f10).tex(minU, maxV).color(particleRed, particleGreen, particleBlue, 1.0F).lightmap(j, k).endVertex();
|
||||
}
|
||||
|
||||
// avoid calculating lighting for bees, it is too much processing
|
||||
@Override
|
||||
public int getBrightnessForRender(float p_189214_1_) {
|
||||
return 15728880;
|
||||
}
|
||||
|
||||
// avoid calculating collisions
|
||||
@Override
|
||||
public void moveEntity(double x, double y, double z) {
|
||||
this.setEntityBoundingBox(this.getEntityBoundingBox().offset(x, y, z));
|
||||
this.resetPositionToBB();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getFXLayer() {
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
+29
-27
@@ -12,30 +12,26 @@ package forestry.apiculture.entities;
|
||||
|
||||
import net.minecraft.client.particle.Particle;
|
||||
import net.minecraft.client.renderer.VertexBuffer;
|
||||
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
|
||||
import net.minecraft.entity.Entity;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.util.math.Vec3d;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
public class ParticleBee extends Particle {
|
||||
private final double originX;
|
||||
private final double originY;
|
||||
private final double originZ;
|
||||
private final BlockPos destination;
|
||||
|
||||
public static TextureAtlasSprite beeSprite;
|
||||
import forestry.apiculture.proxy.ProxyApicultureClient;
|
||||
|
||||
public ParticleBee(World world, double x, double y, double z, int color, BlockPos destination) {
|
||||
super(world, x, y, z, 0.0D, 0.0D, 0.0D);
|
||||
setParticleTexture(beeSprite);
|
||||
this.originX = x;
|
||||
this.originY = y;
|
||||
this.originZ = z;
|
||||
public class ParticleBeeRoundTrip extends Particle {
|
||||
private final Vec3d origin;
|
||||
private final BlockPos destination;
|
||||
|
||||
public ParticleBeeRoundTrip(World world, Vec3d origin, BlockPos destination, int color) {
|
||||
super(world, origin.xCoord, origin.yCoord, origin.zCoord, 0.0D, 0.0D, 0.0D);
|
||||
setParticleTexture(ProxyApicultureClient.beeSprite);
|
||||
this.origin = origin;
|
||||
|
||||
this.destination = destination;
|
||||
this.motionX = (destination.getX() + 0.5 - this.posX) * 0.015;
|
||||
this.motionY = (destination.getY() + 0.5 - this.posY) * 0.015;
|
||||
this.motionZ = (destination.getZ() + 0.5 - this.posZ) * 0.015;
|
||||
this.motionX = (destination.getX() + 0.5 - this.posX) * 0.02 + 0.1 * rand.nextFloat();
|
||||
this.motionY = (destination.getY() + 0.5 - this.posY) * 0.015 + 0.1 * rand.nextFloat();
|
||||
this.motionZ = (destination.getZ() + 0.5 - this.posZ) * 0.02 + 0.1 * rand.nextFloat();
|
||||
|
||||
particleRed = (color >> 16 & 255) / 255.0F;
|
||||
particleGreen = (color >> 8 & 255) / 255.0F;
|
||||
@@ -61,34 +57,34 @@ public class ParticleBee extends Particle {
|
||||
this.moveEntity(this.motionX, this.motionY, this.motionZ);
|
||||
|
||||
if (this.particleAge == this.particleMaxAge / 2) {
|
||||
this.motionX = (this.originX - this.posX) * 0.03;
|
||||
this.motionY = (this.originY - this.posY) * 0.03;
|
||||
this.motionZ = (this.originZ - this.posZ) * 0.03;
|
||||
this.motionX = (origin.xCoord - this.posX) * 0.03 + 0.1 * rand.nextFloat();
|
||||
this.motionY = (origin.yCoord - this.posY) * 0.03 + 0.1 * rand.nextFloat();
|
||||
this.motionZ = (origin.zCoord - this.posZ) * 0.03 + 0.1 * rand.nextFloat();
|
||||
}
|
||||
|
||||
if (this.particleAge < this.particleMaxAge * 0.25) {
|
||||
// venture out
|
||||
this.motionX *= 0.92 + 0.2D * rand.nextFloat();
|
||||
this.motionY = (this.motionY + 0.2 * (-0.5 + rand.nextFloat())) / 2;
|
||||
this.motionY = (this.motionY + 0.3 * (-0.5 + rand.nextFloat())) / 2;
|
||||
this.motionZ *= 0.92 + 0.2D * rand.nextFloat();
|
||||
} else if (this.particleAge < this.particleMaxAge * 0.5) {
|
||||
// get to flower destination
|
||||
this.motionX = (destination.getX() + 0.5 - this.posX) * 0.03;
|
||||
this.motionY = (destination.getY() + 0.5 - this.posY) * 0.03;
|
||||
this.motionY = (destination.getY() + 0.5 - this.posY) * 0.1;
|
||||
this.motionY = (this.motionY + 0.2 * (-0.5 + rand.nextFloat())) / 2;
|
||||
this.motionZ = (destination.getZ() + 0.5 - this.posZ) * 0.03;
|
||||
} else if (this.particleAge < this.particleMaxAge * 0.75) {
|
||||
// venture back
|
||||
this.motionX *= 0.95;
|
||||
this.motionY = (this.originY - this.posY) * 0.03;
|
||||
this.motionY = (origin.yCoord - this.posY) * 0.03;
|
||||
this.motionY = (this.motionY + 0.2 * (-0.5 + rand.nextFloat())) / 2;
|
||||
this.motionZ *= 0.95;
|
||||
} else {
|
||||
// get to origin
|
||||
this.motionX = (this.originX - this.posX) * 0.03;
|
||||
this.motionY = (this.originY - this.posY) * 0.03;
|
||||
this.motionX = (origin.xCoord - this.posX) * 0.03;
|
||||
this.motionY = (origin.yCoord - this.posY) * 0.03;
|
||||
this.motionY = (this.motionY + 0.2 * (-0.5 + rand.nextFloat())) / 2;
|
||||
this.motionZ = (this.originZ - this.posZ) * 0.03;
|
||||
this.motionZ = (origin.zCoord - this.posZ) * 0.03;
|
||||
}
|
||||
|
||||
if (this.particleAge++ >= this.particleMaxAge) {
|
||||
@@ -124,7 +120,13 @@ public class ParticleBee extends Particle {
|
||||
worldRendererIn.pos(f11 + rotationX * f10 - rotationXY * f10, f12 - rotationZ * f10, f13 + rotationYZ * f10 - rotationXZ * f10).tex(minU, maxV).color(particleRed, particleGreen, particleBlue, 1.0F).lightmap(j, k).endVertex();
|
||||
}
|
||||
|
||||
// avoid calculating collisions for bees, it is too much processing
|
||||
// avoid calculating lighting for bees, it is too much processing
|
||||
@Override
|
||||
public int getBrightnessForRender(float p_189214_1_) {
|
||||
return 15728880;
|
||||
}
|
||||
|
||||
// avoid calculating collisions
|
||||
@Override
|
||||
public void moveEntity(double x, double y, double z) {
|
||||
this.setEntityBoundingBox(this.getEntityBoundingBox().offset(x, y, z));
|
||||
@@ -0,0 +1,137 @@
|
||||
/*******************************************************************************
|
||||
* Copyright (c) 2011-2014 SirSengir.
|
||||
* All rights reserved. This program and the accompanying materials
|
||||
* are made available under the terms of the GNU Lesser Public License v3
|
||||
* which accompanies this distribution, and is available at
|
||||
* http://www.gnu.org/licenses/lgpl-3.0.txt
|
||||
*
|
||||
* Various Contributors including, but not limited to:
|
||||
* SirSengir (original work), CovertJaguar, Player, Binnie, MysteriousAges
|
||||
******************************************************************************/
|
||||
package forestry.apiculture.entities;
|
||||
|
||||
import net.minecraft.client.particle.Particle;
|
||||
import net.minecraft.client.renderer.VertexBuffer;
|
||||
import net.minecraft.entity.Entity;
|
||||
import net.minecraft.util.math.Vec3d;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
import forestry.apiculture.proxy.ProxyApicultureClient;
|
||||
|
||||
public class ParticleBeeTargetEntity extends Particle {
|
||||
private final Vec3d origin;
|
||||
private final Entity entity;
|
||||
|
||||
public ParticleBeeTargetEntity(World world, Vec3d origin, Entity entity, int color) {
|
||||
super(world, origin.xCoord, origin.yCoord, origin.zCoord, 0.0D, 0.0D, 0.0D);
|
||||
setParticleTexture(ProxyApicultureClient.beeSprite);
|
||||
|
||||
this.origin = origin;
|
||||
this.entity = entity;
|
||||
|
||||
this.motionX = (entity.posX - this.posX) * 0.015;
|
||||
this.motionY = (entity.posY + 1.62F - this.posY) * 0.015;
|
||||
this.motionZ = (entity.posZ - this.posZ) * 0.015;
|
||||
|
||||
particleRed = (color >> 16 & 255) / 255.0F;
|
||||
particleGreen = (color >> 8 & 255) / 255.0F;
|
||||
particleBlue = (color & 255) / 255.0F;
|
||||
|
||||
this.setSize(0.1F, 0.1F);
|
||||
this.particleScale *= 0.2F;
|
||||
this.particleMaxAge = (int) (80.0D / (Math.random() * 0.8D + 0.2D));
|
||||
|
||||
this.motionX *= 0.9D;
|
||||
this.motionY *= 0.9D;
|
||||
this.motionZ *= 0.9D;
|
||||
}
|
||||
|
||||
/**
|
||||
* Called to update the entity's position/logic.
|
||||
*/
|
||||
@Override
|
||||
public void onUpdate() {
|
||||
this.prevPosX = this.posX;
|
||||
this.prevPosY = this.posY;
|
||||
this.prevPosZ = this.posZ;
|
||||
this.moveEntity(this.motionX, this.motionY, this.motionZ);
|
||||
|
||||
if (this.particleAge == this.particleMaxAge / 2) {
|
||||
this.motionX = (origin.xCoord - this.posX) * 0.03;
|
||||
this.motionY = (origin.yCoord - this.posY) * 0.03;
|
||||
this.motionZ = (origin.zCoord - this.posZ) * 0.03;
|
||||
}
|
||||
|
||||
if (this.particleAge < this.particleMaxAge * 0.5) {
|
||||
// fly near the entity
|
||||
this.motionX = (entity.posX - this.posX) * 0.09;
|
||||
this.motionX = (this.motionX + 0.2 * (-0.5 + rand.nextFloat())) / 2;
|
||||
this.motionY = (entity.posY + 1.62F - this.posY) * 0.03;
|
||||
this.motionY = (this.motionY + 0.4 * (-0.5 + rand.nextFloat())) / 4;
|
||||
this.motionZ = (entity.posZ - this.posZ) * 0.09;
|
||||
this.motionZ = (this.motionZ + 0.2 * (-0.5 + rand.nextFloat())) / 2;
|
||||
} else if (this.particleAge < this.particleMaxAge * 0.75) {
|
||||
// venture back
|
||||
this.motionX *= 0.95;
|
||||
this.motionY = (origin.yCoord - this.posY) * 0.03;
|
||||
this.motionY = (this.motionY + 0.2 * (-0.5 + rand.nextFloat())) / 2;
|
||||
this.motionZ *= 0.95;
|
||||
} else {
|
||||
// get to origin
|
||||
this.motionX = (origin.xCoord - this.posX) * 0.03;
|
||||
this.motionY = (origin.yCoord - this.posY) * 0.03;
|
||||
this.motionY = (this.motionY + 0.2 * (-0.5 + rand.nextFloat())) / 2;
|
||||
this.motionZ = (origin.zCoord - this.posZ) * 0.03;
|
||||
}
|
||||
|
||||
if (this.particleAge++ >= this.particleMaxAge) {
|
||||
this.setExpired();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void renderParticle(VertexBuffer worldRendererIn, Entity entityIn, float partialTicks, float rotationX, float rotationZ, float rotationYZ, float rotationXY, float rotationXZ) {
|
||||
float minU = 0;
|
||||
float maxU = 1;
|
||||
float minV = 0;
|
||||
float maxV = 1;
|
||||
|
||||
if (this.particleTexture != null) {
|
||||
minU = particleTexture.getMinU();
|
||||
maxU = particleTexture.getMaxU();
|
||||
minV = particleTexture.getMinV();
|
||||
maxV = particleTexture.getMaxV();
|
||||
}
|
||||
|
||||
float f10 = 0.1F * particleScale;
|
||||
float f11 = (float) (prevPosX + (posX - prevPosX) * partialTicks - interpPosX);
|
||||
float f12 = (float) (prevPosY + (posY - prevPosY) * partialTicks - interpPosY);
|
||||
float f13 = (float) (prevPosZ + (posZ - prevPosZ) * partialTicks - interpPosZ);
|
||||
|
||||
int i = this.getBrightnessForRender(partialTicks);
|
||||
int j = i >> 16 & 65535;
|
||||
int k = i & 65535;
|
||||
worldRendererIn.pos(f11 - rotationX * f10 - rotationXY * f10, f12 - rotationZ * f10, f13 - rotationYZ * f10 - rotationXZ * f10).tex(maxU, maxV).color(particleRed, particleGreen, particleBlue, 1.0F).lightmap(j, k).endVertex();
|
||||
worldRendererIn.pos(f11 - rotationX * f10 + rotationXY * f10, f12 + rotationZ * f10, f13 - rotationYZ * f10 + rotationXZ * f10).tex(maxU, minV).color(particleRed, particleGreen, particleBlue, 1.0F).lightmap(j, k).endVertex();
|
||||
worldRendererIn.pos(f11 + rotationX * f10 + rotationXY * f10, f12 + rotationZ * f10, f13 + rotationYZ * f10 + rotationXZ * f10).tex(minU, minV).color(particleRed, particleGreen, particleBlue, 1.0F).lightmap(j, k).endVertex();
|
||||
worldRendererIn.pos(f11 + rotationX * f10 - rotationXY * f10, f12 - rotationZ * f10, f13 + rotationYZ * f10 - rotationXZ * f10).tex(minU, maxV).color(particleRed, particleGreen, particleBlue, 1.0F).lightmap(j, k).endVertex();
|
||||
}
|
||||
|
||||
// avoid calculating lighting for bees, it is too much processing
|
||||
@Override
|
||||
public int getBrightnessForRender(float p_189214_1_) {
|
||||
return 15728880;
|
||||
}
|
||||
|
||||
// avoid calculating collisions
|
||||
@Override
|
||||
public void moveEntity(double x, double y, double z) {
|
||||
this.setEntityBoundingBox(this.getEntityBoundingBox().offset(x, y, z));
|
||||
this.resetPositionToBB();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getFXLayer() {
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
@@ -12,19 +12,15 @@ package forestry.apiculture.flowers;
|
||||
|
||||
import com.google.common.base.Objects;
|
||||
|
||||
import net.minecraft.block.Block;
|
||||
|
||||
import net.minecraftforge.oredict.OreDictionary;
|
||||
import net.minecraft.block.state.IBlockState;
|
||||
|
||||
public final class Flower {
|
||||
|
||||
private final Block block;
|
||||
private final int meta;
|
||||
private final IBlockState blockState;
|
||||
private Double weight;
|
||||
|
||||
public Flower(Block block, int meta, double weight) {
|
||||
this.block = block;
|
||||
this.meta = meta;
|
||||
public Flower(IBlockState blockState, double weight) {
|
||||
this.blockState = blockState;
|
||||
this.weight = weight;
|
||||
}
|
||||
|
||||
@@ -40,20 +36,16 @@ public final class Flower {
|
||||
|
||||
Flower flower = (Flower) obj;
|
||||
|
||||
return Block.isEqualTo(this.block, flower.getBlock()) && (this.meta == OreDictionary.WILDCARD_VALUE || flower.getMeta() == OreDictionary.WILDCARD_VALUE || this.meta == flower.getMeta());
|
||||
return this.blockState == flower.getBlockState();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hashCode(block);
|
||||
return Objects.hashCode(blockState);
|
||||
}
|
||||
|
||||
public Block getBlock() {
|
||||
return block;
|
||||
}
|
||||
|
||||
public int getMeta() {
|
||||
return meta;
|
||||
public IBlockState getBlockState() {
|
||||
return blockState;
|
||||
}
|
||||
|
||||
public double getWeight() {
|
||||
@@ -66,7 +58,7 @@ public final class Flower {
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return Objects.toStringHelper(this).add("block", block).add("meta", meta).add("weight", weight).toString();
|
||||
return Objects.toStringHelper(this).add("blockState", blockState).add("weight", weight).toString();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -13,12 +13,9 @@ package forestry.apiculture.flowers;
|
||||
import com.google.common.collect.ArrayListMultimap;
|
||||
import com.google.common.collect.HashMultimap;
|
||||
import com.google.common.collect.ImmutableSet;
|
||||
import com.google.common.collect.Sets;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
@@ -27,18 +24,12 @@ import java.util.Set;
|
||||
import java.util.TreeMap;
|
||||
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.block.BlockFlowerPot;
|
||||
import net.minecraft.block.state.IBlockState;
|
||||
import net.minecraft.init.Blocks;
|
||||
import net.minecraft.item.Item;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
import net.minecraft.tileentity.TileEntityFlowerPot;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.util.math.Vec3i;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
import net.minecraftforge.oredict.OreDictionary;
|
||||
|
||||
import forestry.api.apiculture.BeeManager;
|
||||
import forestry.api.apiculture.FlowerManager;
|
||||
import forestry.api.apiculture.IBee;
|
||||
@@ -50,7 +41,7 @@ import forestry.api.genetics.IFlowerGrowthHelper;
|
||||
import forestry.api.genetics.IFlowerGrowthRule;
|
||||
import forestry.api.genetics.IFlowerRegistry;
|
||||
import forestry.api.genetics.IIndividual;
|
||||
import forestry.core.config.Constants;
|
||||
import forestry.core.utils.Log;
|
||||
import forestry.core.utils.VectUtil;
|
||||
|
||||
public final class FlowerRegistry implements IFlowerRegistry, IFlowerGrowthHelper {
|
||||
@@ -67,17 +58,19 @@ public final class FlowerRegistry implements IFlowerRegistry, IFlowerGrowthHelpe
|
||||
FlowerManager.FlowerTypeGourd
|
||||
);
|
||||
|
||||
private final HashMultimap<String, IFlowerAcceptableRule> registeredRules; // custom check
|
||||
private final HashMultimap<String, Block> registeredBlocks; // quick first check
|
||||
private final HashMultimap<String, Flower> registeredFlowers; // full check
|
||||
private final HashMultimap<String, IFlowerAcceptableRule> registeredRules;
|
||||
private final HashMultimap<String, Block> acceptableBlocks;
|
||||
private final HashMultimap<String, IBlockState> acceptableBlockStates;
|
||||
private final HashMultimap<String, Flower> plantableFlowers;
|
||||
|
||||
private final ArrayListMultimap<String, IFlowerGrowthRule> growthRules;
|
||||
private final Map<String, TreeMap<Double, Flower>> chances;
|
||||
|
||||
public FlowerRegistry() {
|
||||
this.registeredRules = HashMultimap.create();
|
||||
this.registeredBlocks = HashMultimap.create();
|
||||
this.registeredFlowers = HashMultimap.create();
|
||||
this.acceptableBlocks = HashMultimap.create();
|
||||
this.acceptableBlockStates = HashMultimap.create();
|
||||
this.plantableFlowers = HashMultimap.create();
|
||||
this.growthRules = ArrayListMultimap.create();
|
||||
this.chances = new HashMap<>();
|
||||
|
||||
@@ -86,28 +79,40 @@ public final class FlowerRegistry implements IFlowerRegistry, IFlowerGrowthHelpe
|
||||
|
||||
@Override
|
||||
public void registerAcceptableFlower(Block block, String... flowerTypes) {
|
||||
registerFlower(block, OreDictionary.WILDCARD_VALUE, 0.0, flowerTypes);
|
||||
for (String flowerType : flowerTypes) {
|
||||
if (flowerType == null) {
|
||||
throw new NullPointerException("Tried to register flower with null type. " + block);
|
||||
}
|
||||
|
||||
this.acceptableBlocks.get(flowerType).add(block);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void registerAcceptableFlower(Block block, int meta, String... flowerTypes) {
|
||||
registerFlower(block, meta, 0.0, flowerTypes);
|
||||
public void registerAcceptableFlower(IBlockState blockState, String... flowerTypes) {
|
||||
for (String flowerType : flowerTypes) {
|
||||
if (flowerType == null) {
|
||||
throw new NullPointerException("Tried to register flower with null type. " + blockState);
|
||||
}
|
||||
|
||||
this.acceptableBlockStates.get(flowerType).add(blockState);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void registerAcceptableFlowerRule(IFlowerAcceptableRule acceptableFlower, String... flowerTypes) {
|
||||
for (String flowerType : flowerTypes) {
|
||||
if (flowerType == null) {
|
||||
throw new NullPointerException("Tried to register flower with null type. " + acceptableFlower);
|
||||
}
|
||||
|
||||
registeredRules.put(flowerType, acceptableFlower);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void registerPlantableFlower(Block block, int meta, double weight, String... flowerTypes) {
|
||||
registerFlower(block, meta, weight, flowerTypes);
|
||||
}
|
||||
|
||||
private void registerFlower(Block block, int meta, double weight, String... flowerTypes) {
|
||||
if (block == null) {
|
||||
public void registerPlantableFlower(IBlockState blockState, double weight, String... flowerTypes) {
|
||||
if (blockState == null) {
|
||||
return;
|
||||
}
|
||||
if (weight <= 0.0) {
|
||||
@@ -117,18 +122,22 @@ public final class FlowerRegistry implements IFlowerRegistry, IFlowerGrowthHelpe
|
||||
weight = 1.0;
|
||||
}
|
||||
|
||||
Flower newFlower = new Flower(block, meta, weight);
|
||||
if (blockState.getBlock() == Blocks.AIR) {
|
||||
Log.error("Tried to register AIR as a flower. Bad idea.");
|
||||
}
|
||||
|
||||
Flower newFlower = new Flower(blockState, weight);
|
||||
|
||||
for (String flowerType : flowerTypes) {
|
||||
if (flowerType == null) {
|
||||
throw new NullPointerException("Tried to register flower with null type. " + block);
|
||||
throw new NullPointerException("Tried to register flower with null type. " + blockState);
|
||||
}
|
||||
|
||||
Set<Flower> flowers = this.registeredFlowers.get(flowerType);
|
||||
Set<Flower> flowers = this.plantableFlowers.get(flowerType);
|
||||
flowers.add(newFlower);
|
||||
|
||||
Set<Block> blocks = this.registeredBlocks.get(flowerType);
|
||||
blocks.add(block);
|
||||
Set<IBlockState> blocks = this.acceptableBlockStates.get(flowerType);
|
||||
blocks.add(blockState);
|
||||
|
||||
if (this.chances.containsKey(flowerType)) {
|
||||
this.chances.remove(flowerType);
|
||||
@@ -145,13 +154,9 @@ public final class FlowerRegistry implements IFlowerRegistry, IFlowerGrowthHelpe
|
||||
@Override
|
||||
@Nonnull
|
||||
public List<BlockPos> getAcceptedFlowerCoordinates(IBeeHousing beeHousing, IBee bee, String flowerType, int maxFlowers) {
|
||||
if (!this.registeredFlowers.containsKey(flowerType)) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
Set<IFlowerAcceptableRule> acceptableRules = this.registeredRules.get(flowerType);
|
||||
Set<Block> acceptedBlocks = this.registeredBlocks.get(flowerType);
|
||||
Set<Flower> acceptedFlowers = this.registeredFlowers.get(flowerType);
|
||||
Set<IBlockState> acceptedBlockStates = this.acceptableBlockStates.get(flowerType);
|
||||
Set<Block> acceptedBlocks = this.acceptableBlocks.get(flowerType);
|
||||
World world = beeHousing.getWorldObj();
|
||||
|
||||
IBeeModifier beeModifier = BeeManager.beeRoot.createBeeHousingModifier(beeHousing);
|
||||
@@ -161,9 +166,14 @@ public final class FlowerRegistry implements IFlowerRegistry, IFlowerGrowthHelpe
|
||||
BlockPos maxPos = minPos.add(area);
|
||||
|
||||
List<BlockPos> flowerCoords = new ArrayList<>();
|
||||
for (BlockPos.MutableBlockPos posBlock : BlockPos.getAllInBoxMutable(minPos, maxPos)) {
|
||||
for (BlockPos.MutableBlockPos posBlock : VectUtil.getAllInBoxFromCenterMutable(world, minPos, beeHousing.getCoordinates(), maxPos)) {
|
||||
IBlockState blockState = world.getBlockState(posBlock);
|
||||
if (blockState.getBlock().isAir(blockState, world, posBlock)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
for (IFlowerAcceptableRule acceptableRule : acceptableRules) {
|
||||
if (acceptableRule.isAcceptableFlower(flowerType, world, posBlock)) {
|
||||
if (acceptableRule.isAcceptableFlower(blockState, world, posBlock, flowerType)) {
|
||||
flowerCoords.add(posBlock.toImmutable());
|
||||
if (flowerCoords.size() >= maxFlowers) {
|
||||
return flowerCoords;
|
||||
@@ -171,7 +181,7 @@ public final class FlowerRegistry implements IFlowerRegistry, IFlowerGrowthHelpe
|
||||
}
|
||||
}
|
||||
|
||||
if (isAcceptedFlower(acceptedBlocks, acceptedFlowers, world, posBlock)) {
|
||||
if (isAcceptedFlower(blockState, acceptedBlocks, acceptedBlockStates)) {
|
||||
flowerCoords.add(posBlock.toImmutable());
|
||||
if (flowerCoords.size() >= maxFlowers) {
|
||||
return flowerCoords;
|
||||
@@ -184,44 +194,23 @@ public final class FlowerRegistry implements IFlowerRegistry, IFlowerGrowthHelpe
|
||||
|
||||
@Override
|
||||
public boolean isAcceptedFlower(String flowerType, World world, BlockPos pos) {
|
||||
if (!this.registeredFlowers.containsKey(flowerType)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
IBlockState blockState = world.getBlockState(pos);
|
||||
Set<IFlowerAcceptableRule> acceptedCustom = this.registeredRules.get(flowerType);
|
||||
for (IFlowerAcceptableRule acceptableFlower : acceptedCustom) {
|
||||
if (acceptableFlower.isAcceptableFlower(flowerType, world, pos)) {
|
||||
if (acceptableFlower.isAcceptableFlower(blockState, world, pos, flowerType)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
Set<Block> acceptedBlocks = this.registeredBlocks.get(flowerType);
|
||||
Set<Flower> acceptedFlowers = this.registeredFlowers.get(flowerType);
|
||||
Set<IBlockState> acceptedBlockStates = this.acceptableBlockStates.get(flowerType);
|
||||
Set<Block> acceptedBlocks = this.acceptableBlocks.get(flowerType);
|
||||
|
||||
return isAcceptedFlower(acceptedBlocks, acceptedFlowers, world, pos);
|
||||
return isAcceptedFlower(blockState, acceptedBlocks, acceptedBlockStates);
|
||||
}
|
||||
|
||||
private static boolean isAcceptedFlower(Set<Block> acceptedBlocks, Set<Flower> acceptedFlowers, World world, BlockPos pos) {
|
||||
IBlockState blockState = world.getBlockState(pos);
|
||||
private static boolean isAcceptedFlower(IBlockState blockState, Set<Block> acceptedBlocks, Set<IBlockState> acceptedBlockStates) {
|
||||
Block block = blockState.getBlock();
|
||||
|
||||
final int meta;
|
||||
|
||||
if (block instanceof BlockFlowerPot) {
|
||||
TileEntity tile = world.getTileEntity(pos);
|
||||
TileEntityFlowerPot tileFlowerPot = (TileEntityFlowerPot) tile;
|
||||
Item item = tileFlowerPot.getFlowerPotItem();
|
||||
block = Block.getBlockFromItem(item);
|
||||
meta = tileFlowerPot.getFlowerPotData();
|
||||
} else {
|
||||
if (!acceptedBlocks.contains(block)) {
|
||||
return false;
|
||||
}
|
||||
meta = block.getMetaFromState(blockState);
|
||||
}
|
||||
|
||||
Flower flower = new Flower(block, meta, 0);
|
||||
return acceptedFlowers.contains(flower);
|
||||
return acceptedBlocks.contains(block) || acceptedBlockStates.contains(blockState);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -239,10 +228,6 @@ public final class FlowerRegistry implements IFlowerRegistry, IFlowerGrowthHelpe
|
||||
return false;
|
||||
}
|
||||
|
||||
public Set<Flower> getAcceptableFlowers(String flowerType) {
|
||||
return ImmutableSet.copyOf(this.registeredFlowers.get(flowerType));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void registerGrowthRule(IFlowerGrowthRule rule, String... flowerTypes) {
|
||||
if (rule == null) {
|
||||
@@ -260,15 +245,11 @@ public final class FlowerRegistry implements IFlowerRegistry, IFlowerGrowthHelpe
|
||||
return chancesMap.get(chancesMap.lowerKey(rand.nextDouble() * maxKey));
|
||||
}
|
||||
|
||||
public Collection<String> getFlowerTypes() {
|
||||
return new ArrayList<>(Sets.union(defaultFlowerTypes, registeredFlowers.keySet()));
|
||||
}
|
||||
|
||||
private TreeMap<Double, Flower> getChancesMap(String flowerType) {
|
||||
if (!this.chances.containsKey(flowerType)) {
|
||||
TreeMap<Double, Flower> flowerChances = new TreeMap<>();
|
||||
double count = 0.0;
|
||||
for (Flower flower : this.registeredFlowers.get(flowerType)) {
|
||||
for (Flower flower : this.plantableFlowers.get(flowerType)) {
|
||||
if (flower.isPlantable()) {
|
||||
flowerChances.put(count, flower);
|
||||
count += flower.getWeight();
|
||||
@@ -282,8 +263,6 @@ public final class FlowerRegistry implements IFlowerRegistry, IFlowerGrowthHelpe
|
||||
private void registerVanillaGrowthRules() {
|
||||
registerGrowthRule(new GrowthRuleDirtGrass(), FlowerManager.FlowerTypeVanilla, FlowerManager.FlowerTypeSnow);
|
||||
registerGrowthRule(new GrowthRuleSnow(), FlowerManager.FlowerTypeSnow);
|
||||
registerGrowthRule(new GrowthRuleFlowerPot(), FlowerManager.FlowerTypeVanilla, FlowerManager.FlowerTypeSnow, FlowerManager.FlowerTypeMushrooms, FlowerManager.FlowerTypeCacti,
|
||||
FlowerManager.FlowerTypeJungle);
|
||||
registerGrowthRule(new GrowthRuleMycelium(), FlowerManager.FlowerTypeMushrooms);
|
||||
registerGrowthRule(new GrowthRuleNone(), FlowerManager.FlowerTypeEnd);
|
||||
registerGrowthRule(new GrowthRuleFertilize(Blocks.MELON_STEM, Blocks.PUMPKIN_STEM), FlowerManager.FlowerTypeGourd);
|
||||
@@ -293,6 +272,6 @@ public final class FlowerRegistry implements IFlowerRegistry, IFlowerGrowthHelpe
|
||||
@Override
|
||||
public boolean plantRandomFlower(String flowerType, World world, BlockPos pos) {
|
||||
Flower flower = getRandomPlantableFlower(flowerType, world.rand);
|
||||
return world.setBlockState(pos, flower.getBlock().getStateFromMeta(flower.getMeta()), Constants.FLAG_BLOCK_SYNC);
|
||||
return world.setBlockState(pos, flower.getBlockState());
|
||||
}
|
||||
}
|
||||
@@ -1,79 +0,0 @@
|
||||
/*******************************************************************************
|
||||
* Copyright (c) 2011-2014 SirSengir.
|
||||
* All rights reserved. This program and the accompanying materials
|
||||
* are made available under the terms of the GNU Lesser Public License v3
|
||||
* which accompanies this distribution, and is available at
|
||||
* http://www.gnu.org/licenses/lgpl-3.0.txt
|
||||
*
|
||||
* Various Contributors including, but not limited to:
|
||||
* SirSengir (original work), CovertJaguar, Player, Binnie, MysteriousAges
|
||||
******************************************************************************/
|
||||
package forestry.apiculture.flowers;
|
||||
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.block.BlockFlowerPot;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
import net.minecraft.tileentity.TileEntityFlowerPot;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
import forestry.api.apiculture.FlowerManager;
|
||||
import forestry.api.genetics.IFlowerGrowthHelper;
|
||||
import forestry.api.genetics.IFlowerGrowthRule;
|
||||
|
||||
public class GrowthRuleFlowerPot implements IFlowerGrowthRule {
|
||||
|
||||
@Override
|
||||
public boolean growFlower(IFlowerGrowthHelper helper, String flowerType, World world, BlockPos pos) {
|
||||
return growFlower(flowerType, world, pos);
|
||||
}
|
||||
|
||||
private static boolean growFlower(String flowerType, World world, BlockPos pos) {
|
||||
TileEntity tile = world.getTileEntity(pos);
|
||||
if (!(tile instanceof TileEntityFlowerPot)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
TileEntityFlowerPot flowerPotTile = (TileEntityFlowerPot) tile;
|
||||
if (flowerPotTile.getFlowerPotItem() != null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
Block block = world.getBlockState(pos).getBlock();
|
||||
if (!(block instanceof BlockFlowerPot)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
BlockFlowerPot flowerPot = (BlockFlowerPot) block;
|
||||
|
||||
int flower;
|
||||
switch (flowerType) {
|
||||
case FlowerManager.FlowerTypeVanilla:
|
||||
case FlowerManager.FlowerTypeSnow:
|
||||
flower = world.rand.nextInt(2) + 1;
|
||||
break;
|
||||
case FlowerManager.FlowerTypeJungle:
|
||||
flower = 6;
|
||||
break;
|
||||
case FlowerManager.FlowerTypeCacti:
|
||||
flower = world.rand.nextInt(2) + 9;
|
||||
break;
|
||||
case FlowerManager.FlowerTypeMushrooms:
|
||||
flower = world.rand.nextInt(2) + 7;
|
||||
break;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
|
||||
TileEntityFlowerPot newTile = (TileEntityFlowerPot) flowerPot.createNewTileEntity(world, flower);
|
||||
|
||||
flowerPotTile.setFlowerPotData(newTile.getFlowerPotItem(), newTile.getFlowerPotData());
|
||||
flowerPotTile.markDirty();
|
||||
|
||||
if (!world.setBlockState(pos, world.getBlockState(pos).getBlock().getStateFromMeta(1), 2)) {
|
||||
world.markBlockRangeForRenderUpdate(pos, pos);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -251,6 +251,11 @@ public class BeeAlyzerPlugin implements IAlyzerPlugin {
|
||||
textLayout.endPage();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Map<String, ItemStack> getIconStacks() {
|
||||
return iconStacks;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> getHints() {
|
||||
return Config.hints.get("beealyzer");
|
||||
|
||||
@@ -17,7 +17,6 @@ import net.minecraft.entity.Entity;
|
||||
import net.minecraft.init.MobEffects;
|
||||
import net.minecraft.util.math.AxisAlignedBB;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.util.math.Vec3d;
|
||||
import net.minecraft.util.math.Vec3i;
|
||||
|
||||
import forestry.api.apiculture.BeeManager;
|
||||
@@ -105,16 +104,14 @@ public abstract class AlleleEffect extends AlleleCategorized implements IAlleleB
|
||||
|
||||
@Override
|
||||
public IEffectData doFX(IBeeGenome genome, IEffectData storedData, IBeeHousing housing) {
|
||||
Vec3d origin = housing.getBeeFXCoordinates();
|
||||
IBeekeepingLogic beekeepingLogic = housing.getBeekeepingLogic();
|
||||
List<BlockPos> flowerPositions = beekeepingLogic.getFlowerPositions();
|
||||
|
||||
int beeColor = genome.getPrimary().getSpriteColour(0);
|
||||
Proxies.render.addBeeHiveFX(housing.getWorldObj(), origin.xCoord, origin.yCoord, origin.zCoord, beeColor, flowerPositions);
|
||||
Proxies.render.addBeeHiveFX(housing, genome, flowerPositions);
|
||||
return storedData;
|
||||
}
|
||||
|
||||
protected Vec3i getModifiedArea(IBeeGenome genome, IBeeHousing housing) {
|
||||
public static Vec3i getModifiedArea(IBeeGenome genome, IBeeHousing housing) {
|
||||
IBeeModifier beeModifier = BeeManager.beeRoot.createBeeHousingModifier(housing);
|
||||
float territoryModifier = beeModifier.getTerritoryModifier(genome, 1f);
|
||||
|
||||
|
||||
@@ -12,10 +12,10 @@ package forestry.apiculture.inventory;
|
||||
|
||||
import net.minecraft.item.ItemStack;
|
||||
|
||||
import net.minecraftforge.fluids.Fluid;
|
||||
import net.minecraftforge.fluids.FluidStack;
|
||||
import net.minecraftforge.fluids.FluidUtil;
|
||||
|
||||
import forestry.apiculture.multiblock.TileAlvearyHygroregulator;
|
||||
import forestry.core.fluids.FluidHelper;
|
||||
import forestry.core.inventory.InventoryAdapterTile;
|
||||
|
||||
public class InventoryHygroregulator extends InventoryAdapterTile<TileAlvearyHygroregulator> {
|
||||
@@ -28,8 +28,8 @@ public class InventoryHygroregulator extends InventoryAdapterTile<TileAlvearyHyg
|
||||
@Override
|
||||
public boolean canSlotAccept(int slotIndex, ItemStack itemStack) {
|
||||
if (slotIndex == SLOT_INPUT) {
|
||||
Fluid fluid = FluidHelper.getFluidInContainer(itemStack);
|
||||
return tile.getTankManager().accepts(fluid);
|
||||
FluidStack fluid = FluidUtil.getFluidContained(itemStack);
|
||||
return tile.getTankManager().canFillFluidType(fluid);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -40,9 +40,9 @@ public class ItemArmorApiarist extends ItemArmor implements IArmorApiarist, IArm
|
||||
@Override
|
||||
public String getArmorTexture(ItemStack stack, Entity entity, EntityEquipmentSlot slot, String type) {
|
||||
if (stack != null && stack.getItem() == PluginApiculture.items.apiaristLegs) {
|
||||
return Constants.RESOURCE_ID + ":" + Constants.TEXTURE_APIARIST_ARMOR_SECONDARY;
|
||||
return Constants.MOD_ID + ":" + Constants.TEXTURE_APIARIST_ARMOR_SECONDARY;
|
||||
} else {
|
||||
return Constants.RESOURCE_ID + ":" + Constants.TEXTURE_APIARIST_ARMOR_PRIMARY;
|
||||
return Constants.MOD_ID + ":" + Constants.TEXTURE_APIARIST_ARMOR_PRIMARY;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -317,12 +317,13 @@ public class AlvearyController extends RectangularMultiblockControllerBase imple
|
||||
@Override
|
||||
public void formatDescriptionPacket(NBTTagCompound data) {
|
||||
writeToNBT(data);
|
||||
beekeepingLogic.syncToClient();
|
||||
beekeepingLogic.writeToNBT(data);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void decodeDescriptionPacket(NBTTagCompound data) {
|
||||
readFromNBT(data);
|
||||
beekeepingLogic.readFromNBT(data);
|
||||
}
|
||||
|
||||
/* IActivatable */
|
||||
|
||||
@@ -17,10 +17,10 @@ import net.minecraft.inventory.IInventory;
|
||||
import net.minecraft.nbt.NBTTagCompound;
|
||||
import net.minecraft.util.EnumFacing;
|
||||
|
||||
import net.minecraftforge.common.capabilities.Capability;
|
||||
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.CapabilityFluidHandler;
|
||||
|
||||
import forestry.api.core.IClimateControlled;
|
||||
import forestry.api.multiblock.IAlvearyComponent;
|
||||
@@ -36,7 +36,7 @@ import forestry.core.fluids.tanks.FilteredTank;
|
||||
import forestry.core.inventory.IInventoryAdapter;
|
||||
import forestry.core.tiles.ILiquidTankTile;
|
||||
|
||||
public class TileAlvearyHygroregulator extends TileAlveary implements IInventory, ILiquidTankTile, IFluidHandler, IAlvearyComponent.Climatiser {
|
||||
public class TileAlvearyHygroregulator extends TileAlveary implements IInventory, ILiquidTankTile, IAlvearyComponent.Climatiser {
|
||||
private final HygroregulatorRecipe[] recipes;
|
||||
|
||||
private final TankManager tankManager;
|
||||
@@ -55,7 +55,8 @@ public class TileAlvearyHygroregulator extends TileAlveary implements IInventory
|
||||
Fluid lava = Fluids.LAVA.getFluid();
|
||||
Fluid liquidIce = Fluids.ICE.getFluid();
|
||||
|
||||
this.liquidTank = new FilteredTank(Constants.PROCESSOR_TANK_CAPACITY, water, lava, liquidIce);
|
||||
this.liquidTank = new FilteredTank(Constants.PROCESSOR_TANK_CAPACITY).setFilters(water, lava, liquidIce);
|
||||
|
||||
this.tankManager = new TankManager(this, liquidTank);
|
||||
|
||||
this.recipes = new HygroregulatorRecipe[]{new HygroregulatorRecipe(new FluidStack(water, 1), 1, 0.01f, -0.005f),
|
||||
@@ -91,7 +92,7 @@ public class TileAlvearyHygroregulator extends TileAlveary implements IInventory
|
||||
currentRecipe = getRecipe(liquidTank.getFluid());
|
||||
|
||||
if (currentRecipe != null) {
|
||||
liquidTank.drain(currentRecipe.liquid.amount, true);
|
||||
liquidTank.drainInternal(currentRecipe.liquid.amount, true);
|
||||
transferTime = currentRecipe.transferTime;
|
||||
}
|
||||
}
|
||||
@@ -150,33 +151,22 @@ public class TileAlvearyHygroregulator extends TileAlveary implements IInventory
|
||||
}
|
||||
|
||||
@Override
|
||||
public int fill(EnumFacing from, FluidStack resource, boolean doFill) {
|
||||
return tankManager.fill(from, resource, doFill);
|
||||
public boolean hasCapability(Capability<?> capability, EnumFacing facing) {
|
||||
if (super.hasCapability(capability, facing)) {
|
||||
return true;
|
||||
}
|
||||
return capability == CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY;
|
||||
}
|
||||
|
||||
@Override
|
||||
public FluidStack drain(EnumFacing from, FluidStack resource, boolean doDrain) {
|
||||
return tankManager.drain(from, resource, doDrain);
|
||||
}
|
||||
|
||||
@Override
|
||||
public FluidStack drain(EnumFacing from, int maxDrain, boolean doDrain) {
|
||||
return tankManager.drain(from, maxDrain, doDrain);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canFill(EnumFacing from, Fluid fluid) {
|
||||
return tankManager.canFill(from, fluid);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canDrain(EnumFacing from, Fluid fluid) {
|
||||
return tankManager.canDrain(from, fluid);
|
||||
}
|
||||
|
||||
@Override
|
||||
public FluidTankInfo[] getTankInfo(EnumFacing from) {
|
||||
return tankManager.getTankInfo(from);
|
||||
public <T> T getCapability(Capability<T> capability, EnumFacing facing) {
|
||||
if (super.hasCapability(capability, facing)) {
|
||||
return super.getCapability(capability, facing);
|
||||
}
|
||||
if (capability == CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY) {
|
||||
return CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY.cast(tankManager);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -10,8 +10,12 @@
|
||||
******************************************************************************/
|
||||
package forestry.apiculture.proxy;
|
||||
|
||||
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
|
||||
|
||||
public class ProxyApicultureClient extends ProxyApiculture {
|
||||
|
||||
public static TextureAtlasSprite beeSprite;
|
||||
|
||||
@Override
|
||||
public void initializeRendering() {
|
||||
// TODO: remove unused bee entity model completely
|
||||
|
||||
@@ -69,8 +69,15 @@ public abstract class TileBeeHousingBase extends TileBase implements IBeeHousing
|
||||
@Nonnull
|
||||
@Override
|
||||
public NBTTagCompound getUpdateTag() {
|
||||
beeLogic.syncToClient();
|
||||
return super.getUpdateTag();
|
||||
NBTTagCompound updateTag = super.getUpdateTag();
|
||||
beeLogic.writeToNBT(updateTag);
|
||||
return updateTag;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void handleUpdateTag(@Nonnull NBTTagCompound tag) {
|
||||
super.handleUpdateTag(tag);
|
||||
beeLogic.readFromNBT(tag);
|
||||
}
|
||||
|
||||
/* ICLIMATISED */
|
||||
|
||||
@@ -21,6 +21,7 @@ import net.minecraft.entity.EntityLivingBase;
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.nbt.NBTTagCompound;
|
||||
import net.minecraft.network.NetworkManager;
|
||||
import net.minecraft.network.play.server.SPacketUpdateTileEntity;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
import net.minecraft.util.DamageSource;
|
||||
@@ -74,7 +75,7 @@ public class TileHive extends TileEntity implements ITickable, IHiveTile, IActiv
|
||||
@Nonnull
|
||||
private final IErrorLogic errorLogic;
|
||||
private IBee containedBee = null;
|
||||
private boolean active = true;
|
||||
private boolean active = false;
|
||||
private boolean angry = false;
|
||||
private int calmTime;
|
||||
|
||||
@@ -97,7 +98,7 @@ public class TileHive extends TileEntity implements ITickable, IHiveTile, IActiv
|
||||
}
|
||||
|
||||
if (worldObj.isRemote) {
|
||||
if (!updatedLight && worldObj.getWorldTime() % 20 == 0) {
|
||||
if (!updatedLight && worldObj.getWorldTime() % 100 == 0) {
|
||||
updatedLight = worldObj.checkLightFor(EnumSkyBlock.BLOCK, getPos());
|
||||
}
|
||||
if (active && worldObj.rand.nextInt(4) == 0) {
|
||||
@@ -108,7 +109,7 @@ public class TileHive extends TileEntity implements ITickable, IHiveTile, IActiv
|
||||
} else {
|
||||
boolean canWork = beeLogic.canWork(); // must be called every tick to stay updated
|
||||
|
||||
if (worldObj.rand.nextInt(angry ? 10 : 80) == 0) {
|
||||
if (worldObj.rand.nextInt(angry ? 10 : 200) == 0) {
|
||||
if (calmTime == 0) {
|
||||
if (canWork) {
|
||||
AxisAlignedBB boundingBox = AlleleEffect.getBounding(getContainedBee().getGenome(), this);
|
||||
@@ -119,19 +120,13 @@ public class TileHive extends TileEntity implements ITickable, IHiveTile, IActiv
|
||||
attack(entity, 2);
|
||||
}
|
||||
beeLogic.doWork();
|
||||
setActive(true);
|
||||
} else {
|
||||
setActive(false);
|
||||
}
|
||||
} else {
|
||||
calmTime--;
|
||||
if (calmTime == 0) {
|
||||
setActive(true);
|
||||
} else {
|
||||
setActive(false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
setActive(calmTime == 0);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -203,6 +198,11 @@ public class TileHive extends TileEntity implements ITickable, IHiveTile, IActiv
|
||||
setActive(false);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isAngry() {
|
||||
return angry;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onAttack(World world, BlockPos pos, EntityPlayer player) {
|
||||
if (calmTime == 0) {
|
||||
@@ -231,8 +231,7 @@ public class TileHive extends TileEntity implements ITickable, IHiveTile, IActiv
|
||||
if (damage > 0) {
|
||||
// Entities are not attacked if they wear a full set of apiarist's armor.
|
||||
int count = BeeManager.armorApiaristHelper.wearsItems(entity, damageSourceBeeHive.damageType, true);
|
||||
damage -= damage / 4.0f * count;
|
||||
if (damage > 0) {
|
||||
if (entity.worldObj.rand.nextInt(4) >= count) {
|
||||
entity.attackEntityFrom(damageSourceBeeHive, damage);
|
||||
}
|
||||
}
|
||||
@@ -258,8 +257,30 @@ public class TileHive extends TileEntity implements ITickable, IHiveTile, IActiv
|
||||
@Nullable
|
||||
@Override
|
||||
public SPacketUpdateTileEntity getUpdatePacket() {
|
||||
beeLogic.syncToClient();
|
||||
return super.getUpdatePacket();
|
||||
return new SPacketUpdateTileEntity(pos, 0, getUpdateTag());
|
||||
}
|
||||
|
||||
@Nonnull
|
||||
@Override
|
||||
public NBTTagCompound getUpdateTag() {
|
||||
NBTTagCompound nbt = super.getUpdateTag();
|
||||
nbt.setBoolean("active", calmTime == 0);
|
||||
beeLogic.writeToNBT(nbt);
|
||||
return nbt;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void handleUpdateTag(@Nonnull NBTTagCompound tag) {
|
||||
super.handleUpdateTag(tag);
|
||||
setActive(tag.getBoolean("active"));
|
||||
beeLogic.readFromNBT(tag);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDataPacket(NetworkManager net, SPacketUpdateTileEntity pkt) {
|
||||
super.onDataPacket(net, pkt);
|
||||
NBTTagCompound nbt = pkt.getNbtCompound();
|
||||
handleUpdateTag(nbt);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -112,7 +112,7 @@ public class VillageApiaristHouse extends StructureVillagePieces.House1 {
|
||||
}
|
||||
|
||||
public static VillageApiaristHouse buildComponent(StructureVillagePieces.Start startPiece, List<StructureComponent> par1List, Random random, int structureMinX, int structureMinY, int structureMinZ, EnumFacing facing, int componentType) {
|
||||
StructureBoundingBox bbox = StructureBoundingBox.getComponentToAddBoundingBox(structureMinX, structureMinY, structureMinZ, 0, 0, 0, 10, 9, 11, facing);
|
||||
StructureBoundingBox bbox = StructureBoundingBox.getComponentToAddBoundingBox(structureMinX, structureMinY, structureMinZ, -4, 0, 0, 12, 9, 12, facing);
|
||||
if (!canVillageGoDeeper(bbox) || StructureComponent.findIntersecting(par1List, bbox) != null) {
|
||||
return null;
|
||||
}
|
||||
@@ -129,7 +129,7 @@ public class VillageApiaristHouse extends StructureVillagePieces.House1 {
|
||||
return true;
|
||||
}
|
||||
|
||||
boundingBox.offset(0, averageGroundLevel - boundingBox.maxY + 8 - 1, 0);
|
||||
boundingBox.offset(0, averageGroundLevel - boundingBox.maxY + 9 - 1, 0);
|
||||
}
|
||||
|
||||
fillWithBlocks(world, structBoundingBox, 1, 1, 1, 7, 4, 4, Blocks.AIR.getDefaultState(), Blocks.AIR.getDefaultState(), false);
|
||||
@@ -314,7 +314,7 @@ public class VillageApiaristHouse extends StructureVillagePieces.House1 {
|
||||
|
||||
FlowerRegistry flowerRegistry = (FlowerRegistry) FlowerManager.flowerRegistry;
|
||||
Flower flower = flowerRegistry.getRandomPlantableFlower(FlowerManager.FlowerTypeVanilla, world.rand);
|
||||
setBlockState(world, flower.getBlock().getStateFromMeta(flower.getMeta()), j, i, k, box);
|
||||
setBlockState(world, flower.getBlockState(), j, i, k, box);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -40,7 +40,7 @@ public class FruitProviderNone implements IFruitProvider {
|
||||
|
||||
public OverlayType(String ident) {
|
||||
this.ident = ident;
|
||||
this.sprite = new ResourceLocation(Constants.RESOURCE_ID, "blocks/leaves/fruits." + ident);
|
||||
this.sprite = new ResourceLocation(Constants.MOD_ID, "blocks/leaves/fruits." + ident);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
package forestry.arboriculture;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
import java.util.Arrays;
|
||||
import java.util.EnumMap;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
@@ -126,13 +127,22 @@ public class WoodAccess implements IWoodAccess {
|
||||
|
||||
private static void registerVanilla() {
|
||||
IBlockState defaultLogState = Blocks.LOG.getDefaultState();
|
||||
register(EnumVanillaWoodType.OAK, WoodBlockKind.LOG, false, defaultLogState.withProperty(BlockOldLog.VARIANT, BlockPlanks.EnumType.OAK), new ItemStack(Blocks.LOG, 1, 0));
|
||||
register(EnumVanillaWoodType.BIRCH, WoodBlockKind.LOG, false, defaultLogState.withProperty(BlockOldLog.VARIANT, BlockPlanks.EnumType.BIRCH), new ItemStack(Blocks.LOG, 1, 1));
|
||||
register(EnumVanillaWoodType.SPRUCE, WoodBlockKind.LOG, false, defaultLogState.withProperty(BlockOldLog.VARIANT, BlockPlanks.EnumType.SPRUCE), new ItemStack(Blocks.LOG, 1, 2));
|
||||
register(EnumVanillaWoodType.JUNGLE, WoodBlockKind.LOG, false, defaultLogState.withProperty(BlockOldLog.VARIANT, BlockPlanks.EnumType.JUNGLE), new ItemStack(Blocks.LOG, 1, 3));
|
||||
List<EnumVanillaWoodType> oldLogTypes = Arrays.asList(EnumVanillaWoodType.OAK, EnumVanillaWoodType.SPRUCE, EnumVanillaWoodType.BIRCH, EnumVanillaWoodType.JUNGLE);
|
||||
for (EnumVanillaWoodType woodType : oldLogTypes) {
|
||||
BlockPlanks.EnumType vanillaType = woodType.getVanillaType();
|
||||
ItemStack itemStack = new ItemStack(Blocks.LOG, 1, vanillaType.getMetadata());
|
||||
IBlockState blockState = defaultLogState.withProperty(BlockOldLog.VARIANT, vanillaType);
|
||||
register(woodType, WoodBlockKind.LOG, false, blockState, itemStack);
|
||||
}
|
||||
|
||||
IBlockState defaultLog2State = Blocks.LOG2.getDefaultState();
|
||||
register(EnumVanillaWoodType.ACACIA, WoodBlockKind.LOG, false, defaultLog2State.withProperty(BlockNewLog.VARIANT, BlockPlanks.EnumType.ACACIA), new ItemStack(Blocks.LOG2, 1, 0));
|
||||
register(EnumVanillaWoodType.DARK_OAK, WoodBlockKind.LOG, false, defaultLog2State.withProperty(BlockNewLog.VARIANT, BlockPlanks.EnumType.DARK_OAK), new ItemStack(Blocks.LOG2, 1, 1));
|
||||
List<EnumVanillaWoodType> newLogTypes = Arrays.asList(EnumVanillaWoodType.ACACIA, EnumVanillaWoodType.DARK_OAK);
|
||||
for (EnumVanillaWoodType woodType : newLogTypes) {
|
||||
BlockPlanks.EnumType vanillaType = woodType.getVanillaType();
|
||||
ItemStack itemStack = new ItemStack(Blocks.LOG2, 1, vanillaType.getMetadata() - 4);
|
||||
IBlockState blockState = defaultLog2State.withProperty(BlockNewLog.VARIANT, vanillaType);
|
||||
register(woodType, WoodBlockKind.LOG, false, blockState, itemStack);
|
||||
}
|
||||
|
||||
IBlockState defaultPlanksState = Blocks.PLANKS.getDefaultState();
|
||||
IBlockState defaultSlabState = Blocks.WOODEN_SLAB.getDefaultState();
|
||||
@@ -149,29 +159,29 @@ public class WoodAccess implements IWoodAccess {
|
||||
}
|
||||
|
||||
register(EnumVanillaWoodType.OAK, WoodBlockKind.FENCE, false, Blocks.OAK_FENCE.getDefaultState(), new ItemStack(Blocks.OAK_FENCE));
|
||||
register(EnumVanillaWoodType.BIRCH, WoodBlockKind.FENCE, false, Blocks.BIRCH_FENCE.getDefaultState(), new ItemStack(Blocks.BIRCH_FENCE));
|
||||
register(EnumVanillaWoodType.SPRUCE, WoodBlockKind.FENCE, false, Blocks.SPRUCE_FENCE.getDefaultState(), new ItemStack(Blocks.SPRUCE_FENCE));
|
||||
register(EnumVanillaWoodType.BIRCH, WoodBlockKind.FENCE, false, Blocks.BIRCH_FENCE.getDefaultState(), new ItemStack(Blocks.BIRCH_FENCE));
|
||||
register(EnumVanillaWoodType.JUNGLE, WoodBlockKind.FENCE, false, Blocks.JUNGLE_FENCE.getDefaultState(), new ItemStack(Blocks.JUNGLE_FENCE));
|
||||
register(EnumVanillaWoodType.ACACIA, WoodBlockKind.FENCE, false, Blocks.ACACIA_FENCE.getDefaultState(), new ItemStack(Blocks.ACACIA_FENCE));
|
||||
register(EnumVanillaWoodType.DARK_OAK, WoodBlockKind.FENCE, false, Blocks.DARK_OAK_FENCE.getDefaultState(), new ItemStack(Blocks.DARK_OAK_FENCE));
|
||||
|
||||
register(EnumVanillaWoodType.OAK, WoodBlockKind.FENCE_GATE, false, Blocks.OAK_FENCE_GATE.getDefaultState(), new ItemStack(Blocks.OAK_FENCE_GATE));
|
||||
register(EnumVanillaWoodType.BIRCH, WoodBlockKind.FENCE_GATE, false, Blocks.BIRCH_FENCE_GATE.getDefaultState(), new ItemStack(Blocks.BIRCH_FENCE_GATE));
|
||||
register(EnumVanillaWoodType.SPRUCE, WoodBlockKind.FENCE_GATE, false, Blocks.SPRUCE_FENCE_GATE.getDefaultState(), new ItemStack(Blocks.SPRUCE_FENCE_GATE));
|
||||
register(EnumVanillaWoodType.BIRCH, WoodBlockKind.FENCE_GATE, false, Blocks.BIRCH_FENCE_GATE.getDefaultState(), new ItemStack(Blocks.BIRCH_FENCE_GATE));
|
||||
register(EnumVanillaWoodType.JUNGLE, WoodBlockKind.FENCE_GATE, false, Blocks.JUNGLE_FENCE_GATE.getDefaultState(), new ItemStack(Blocks.JUNGLE_FENCE_GATE));
|
||||
register(EnumVanillaWoodType.ACACIA, WoodBlockKind.FENCE_GATE, false, Blocks.ACACIA_FENCE_GATE.getDefaultState(), new ItemStack(Blocks.ACACIA_FENCE_GATE));
|
||||
register(EnumVanillaWoodType.DARK_OAK, WoodBlockKind.FENCE_GATE, false, Blocks.DARK_OAK_FENCE_GATE.getDefaultState(), new ItemStack(Blocks.DARK_OAK_FENCE_GATE));
|
||||
|
||||
register(EnumVanillaWoodType.OAK, WoodBlockKind.STAIRS, false, Blocks.OAK_STAIRS.getDefaultState(), new ItemStack(Blocks.OAK_STAIRS));
|
||||
register(EnumVanillaWoodType.BIRCH, WoodBlockKind.STAIRS, false, Blocks.BIRCH_STAIRS.getDefaultState(), new ItemStack(Blocks.BIRCH_STAIRS));
|
||||
register(EnumVanillaWoodType.SPRUCE, WoodBlockKind.STAIRS, false, Blocks.SPRUCE_STAIRS.getDefaultState(), new ItemStack(Blocks.SPRUCE_STAIRS));
|
||||
register(EnumVanillaWoodType.BIRCH, WoodBlockKind.STAIRS, false, Blocks.BIRCH_STAIRS.getDefaultState(), new ItemStack(Blocks.BIRCH_STAIRS));
|
||||
register(EnumVanillaWoodType.JUNGLE, WoodBlockKind.STAIRS, false, Blocks.JUNGLE_STAIRS.getDefaultState(), new ItemStack(Blocks.JUNGLE_STAIRS));
|
||||
register(EnumVanillaWoodType.ACACIA, WoodBlockKind.STAIRS, false, Blocks.ACACIA_STAIRS.getDefaultState(), new ItemStack(Blocks.ACACIA_STAIRS));
|
||||
register(EnumVanillaWoodType.DARK_OAK, WoodBlockKind.STAIRS, false, Blocks.DARK_OAK_STAIRS.getDefaultState(), new ItemStack(Blocks.DARK_OAK_STAIRS));
|
||||
|
||||
register(EnumVanillaWoodType.OAK, WoodBlockKind.DOOR, false, Blocks.OAK_DOOR.getDefaultState(), new ItemStack(Items.OAK_DOOR));
|
||||
register(EnumVanillaWoodType.BIRCH, WoodBlockKind.DOOR, false, Blocks.BIRCH_DOOR.getDefaultState(), new ItemStack(Items.BIRCH_DOOR));
|
||||
register(EnumVanillaWoodType.SPRUCE, WoodBlockKind.DOOR, false, Blocks.SPRUCE_DOOR.getDefaultState(), new ItemStack(Items.SPRUCE_DOOR));
|
||||
register(EnumVanillaWoodType.BIRCH, WoodBlockKind.DOOR, false, Blocks.BIRCH_DOOR.getDefaultState(), new ItemStack(Items.BIRCH_DOOR));
|
||||
register(EnumVanillaWoodType.JUNGLE, WoodBlockKind.DOOR, false, Blocks.JUNGLE_DOOR.getDefaultState(), new ItemStack(Items.JUNGLE_DOOR));
|
||||
register(EnumVanillaWoodType.ACACIA, WoodBlockKind.DOOR, false, Blocks.ACACIA_DOOR.getDefaultState(), new ItemStack(Items.ACACIA_DOOR));
|
||||
register(EnumVanillaWoodType.DARK_OAK, WoodBlockKind.DOOR, false, Blocks.DARK_OAK_DOOR.getDefaultState(), new ItemStack(Items.DARK_OAK_DOOR));
|
||||
|
||||
@@ -56,7 +56,7 @@ public class WoodHelper {
|
||||
WoodBlockKind blockKind = typed.getBlockKind();
|
||||
for (IWoodType woodType : typed.getWoodTypes()) {
|
||||
if (woodType instanceof EnumForestryWoodType) {
|
||||
resourceLocations.add(new ResourceLocation(Constants.RESOURCE_ID, blockKind + "/" + woodType));
|
||||
resourceLocations.add(new ResourceLocation(Constants.MOD_ID, blockKind + "/" + woodType));
|
||||
} else if (woodType instanceof EnumVanillaWoodType) {
|
||||
resourceLocations.add(new ResourceLocation("minecraft", woodType + "_" + blockKind));
|
||||
}
|
||||
|
||||
@@ -16,6 +16,7 @@ import java.util.Collections;
|
||||
import java.util.Random;
|
||||
|
||||
import net.minecraft.block.BlockDoor;
|
||||
import net.minecraft.block.material.Material;
|
||||
import net.minecraft.block.state.IBlockState;
|
||||
import net.minecraft.item.Item;
|
||||
import net.minecraft.item.ItemStack;
|
||||
@@ -40,7 +41,7 @@ public class BlockArbDoor extends BlockDoor implements IWoodTyped, IItemModelReg
|
||||
private final EnumForestryWoodType woodType;
|
||||
|
||||
public BlockArbDoor(EnumForestryWoodType woodType) {
|
||||
super(MaterialArbWood.ARB_WOOD);
|
||||
super(Material.WOOD);
|
||||
this.woodType = woodType;
|
||||
|
||||
setHarvestLevel("axe", 0);
|
||||
|
||||
@@ -2,6 +2,7 @@ package forestry.arboriculture.blocks;
|
||||
|
||||
import com.google.common.collect.Lists;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
import java.util.ArrayList;
|
||||
import java.util.EnumMap;
|
||||
import java.util.List;
|
||||
@@ -18,9 +19,11 @@ import net.minecraft.block.state.BlockStateContainer;
|
||||
import net.minecraft.block.state.IBlockState;
|
||||
import net.minecraft.client.particle.ParticleManager;
|
||||
import net.minecraft.creativetab.CreativeTabs;
|
||||
import net.minecraft.enchantment.EnchantmentHelper;
|
||||
import net.minecraft.entity.Entity;
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.init.Blocks;
|
||||
import net.minecraft.init.Enchantments;
|
||||
import net.minecraft.item.Item;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.nbt.NBTTagCompound;
|
||||
@@ -383,35 +386,49 @@ public abstract class BlockPile extends BlockStructure implements ITileEntityPro
|
||||
@Override
|
||||
public void onBlockHarvested(World world, BlockPos pos, IBlockState state, EntityPlayer player) {
|
||||
if (!world.isRemote) {
|
||||
TileEntity tile = world.getTileEntity(pos);
|
||||
if (tile instanceof ICharcoalPileComponent) {
|
||||
ICharcoalPileComponent pile = (ICharcoalPileComponent) tile;
|
||||
ArrayList<ItemStack> list = new ArrayList<ItemStack>();
|
||||
if (getPileType() == EnumPileType.ASH) {
|
||||
if(pile.getTree() != null){
|
||||
ItemStack charcoal = new ItemStack(PluginArboriculture.items.charcoal, pile.getTree().getGenome().getCarbonization(), pile.getTree().getGenome().getCombustibility());
|
||||
list.add(charcoal);
|
||||
list.add(new ItemStack(PluginCore.items.ash, 3));
|
||||
}else{
|
||||
list.add(new ItemStack(Blocks.DIRT, 2));
|
||||
list.add(new ItemStack(PluginCore.items.ash, 2));
|
||||
}
|
||||
} else if (getPileType() == EnumPileType.DIRT) {
|
||||
list.add(new ItemStack(this));
|
||||
} else {
|
||||
list.add(createWoodPile(pile.getTree()));
|
||||
}
|
||||
drop.set(list);
|
||||
}
|
||||
int fortune = EnchantmentHelper.getEnchantmentLevel(Enchantments.FORTUNE, player.getActiveItemStack());
|
||||
drop.set(getPileDrop(world, pos, state, fortune));
|
||||
}
|
||||
}
|
||||
|
||||
@Nonnull
|
||||
@Override
|
||||
public List<ItemStack> getDrops(IBlockAccess world, BlockPos pos, IBlockState state, int fortune) {
|
||||
List<ItemStack> drops = drop.get();
|
||||
drop.remove();
|
||||
|
||||
// not harvested, get drops normally
|
||||
if (drops == null) {
|
||||
drops = getPileDrop(world, pos, state, fortune);
|
||||
}
|
||||
|
||||
return drops;
|
||||
}
|
||||
|
||||
@Nonnull
|
||||
private List<ItemStack> getPileDrop(IBlockAccess world, BlockPos pos, IBlockState state, int fortune) {
|
||||
ArrayList<ItemStack> list = new ArrayList<ItemStack>();
|
||||
TileEntity tile = world.getTileEntity(pos);
|
||||
if (tile instanceof ICharcoalPileComponent) {
|
||||
ICharcoalPileComponent pile = (ICharcoalPileComponent) tile;
|
||||
|
||||
if (getPileType() == EnumPileType.ASH) {
|
||||
if (pile.getTree() != null) {
|
||||
ItemStack charcoal = new ItemStack(PluginArboriculture.items.charcoal, pile.getTree().getGenome().getCarbonization(), pile.getTree().getGenome().getCombustibility());
|
||||
list.add(charcoal);
|
||||
list.add(new ItemStack(PluginCore.items.ash, 3));
|
||||
} else {
|
||||
list.add(new ItemStack(Blocks.DIRT, 2));
|
||||
list.add(new ItemStack(PluginCore.items.ash, 2));
|
||||
}
|
||||
} else if (getPileType() == EnumPileType.DIRT) {
|
||||
list.add(new ItemStack(this));
|
||||
} else {
|
||||
list.add(createWoodPile(pile.getTree()));
|
||||
}
|
||||
}
|
||||
return list;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void breakBlock(World world, BlockPos pos, IBlockState state) {
|
||||
|
||||
@@ -35,9 +35,9 @@ public enum BlockTypeArboricultureTesr implements IBlockTypeTesr {
|
||||
|
||||
<T extends TileForestry> BlockTypeArboricultureTesr(@Nonnull Class<T> teClass, @Nonnull String name, @Nullable TileEntitySpecialRenderer<? super T> renderer, @Nullable AxisAlignedBB boundingBox) {
|
||||
if (boundingBox != null) {
|
||||
this.machineProperties = new MachinePropertiesTesr<>(teClass, name, renderer, boundingBox, Constants.RESOURCE_ID + ":blocks/" + name + ".0");
|
||||
this.machineProperties = new MachinePropertiesTesr<>(teClass, name, renderer, boundingBox, Constants.MOD_ID + ":blocks/" + name + ".0");
|
||||
} else {
|
||||
this.machineProperties = new MachinePropertiesTesr<>(teClass, name, renderer, Constants.RESOURCE_ID + ":blocks/" + name + ".0");
|
||||
this.machineProperties = new MachinePropertiesTesr<>(teClass, name, renderer, Constants.MOD_ID + ":blocks/" + name + ".0");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -82,7 +82,7 @@ public class WoodTypeStateMapper extends StateMapperBase {
|
||||
private ModelResourceLocation getForestryModelResourceLocation(IWoodType woodType, Map<IProperty<?>, Comparable<?>> properties) {
|
||||
String resourceLocation = "arboriculture/" + blockPath + '/' + woodType;
|
||||
String propertyString = this.getPropertyString(properties);
|
||||
return new ModelResourceLocation(Constants.RESOURCE_ID + ':' + resourceLocation, propertyString);
|
||||
return new ModelResourceLocation(Constants.MOD_ID + ':' + resourceLocation, propertyString);
|
||||
}
|
||||
|
||||
private ModelResourceLocation getVanillaModelResourceLocation(Block block, IWoodType woodType, Map<IProperty<?>, Comparable<?>> properties) {
|
||||
|
||||
@@ -291,6 +291,11 @@ public class TreeAlyzerPlugin implements IAlyzerPlugin {
|
||||
textLayout.endPage();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Map<String, ItemStack> getIconStacks() {
|
||||
return iconStacks;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> getHints() {
|
||||
return Config.hints.get("treealyzer");
|
||||
|
||||
@@ -42,8 +42,8 @@ public class WoodProvider implements IWoodProvider {
|
||||
@Override
|
||||
public void registerSprites(Item item, ITextureManager manager) {
|
||||
TextureMap textureMap = Proxies.common.getClientInstance().getTextureMapBlocks();
|
||||
woodTop = textureMap.registerSprite(new ResourceLocation(Constants.RESOURCE_ID, "blocks/wood/heart." + name));
|
||||
woodBark = textureMap.registerSprite(new ResourceLocation(Constants.RESOURCE_ID, "blocks/wood/bark." + name));
|
||||
woodTop = textureMap.registerSprite(new ResourceLocation(Constants.MOD_ID, "blocks/wood/heart." + name));
|
||||
woodBark = textureMap.registerSprite(new ResourceLocation(Constants.MOD_ID, "blocks/wood/bark." + name));
|
||||
}
|
||||
|
||||
@Nonnull
|
||||
|
||||
@@ -73,14 +73,16 @@ public class ItemBlockPile<B extends Block> extends ItemBlockForestry<Block> {
|
||||
public boolean placeBlockAt(ItemStack stack, EntityPlayer player, World world, BlockPos pos, EnumFacing side, float hitX, float hitY, float hitZ, IBlockState newState) {
|
||||
boolean placed = super.placeBlockAt(stack, player, world, pos, side, hitX, hitY, hitZ, newState);
|
||||
|
||||
if(block == PluginArboriculture.blocks.piles.get(EnumPileType.WOOD)){
|
||||
if (block.hasTileEntity(newState)) {
|
||||
if (stack.hasTagCompound()) {
|
||||
TilePile tile = TileUtil.getTile(world, pos, TilePile.class);
|
||||
if (tile != null) {
|
||||
tile.readFromNBT(stack.getTagCompound());
|
||||
tile.setPos(pos);
|
||||
tile.markDirty();
|
||||
if (placed) {
|
||||
if (block == PluginArboriculture.blocks.piles.get(EnumPileType.WOOD)) {
|
||||
if (block.hasTileEntity(newState)) {
|
||||
if (stack.hasTagCompound()) {
|
||||
TilePile tile = TileUtil.getTile(world, pos, TilePile.class);
|
||||
if (tile != null) {
|
||||
tile.readFromNBT(stack.getTagCompound());
|
||||
tile.setPos(pos);
|
||||
tile.markDirty();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -92,14 +92,14 @@ public class ModelLeaves extends ModelBlockDefault<BlockForestryLeaves> {
|
||||
TextureAtlasSprite leafSprite = map.getAtlasSprite(leafSpriteLocation.toString());
|
||||
|
||||
// Render the plain leaf block.
|
||||
baker.addBlockModel(block, Block.FULL_BLOCK_AABB, pos, leafSprite, 0);
|
||||
baker.addBlockModel(block, Block.FULL_BLOCK_AABB, null, leafSprite, 0);
|
||||
|
||||
// Render overlay for fruit leaves.
|
||||
ResourceLocation fruitSpriteLocation = tile.getFruitSprite();
|
||||
|
||||
if (fruitSpriteLocation != null) {
|
||||
TextureAtlasSprite fruitSprite = map.getAtlasSprite(fruitSpriteLocation.toString());
|
||||
baker.addBlockModel(block, Block.FULL_BLOCK_AABB, pos, fruitSprite, 1);
|
||||
baker.addBlockModel(block, Block.FULL_BLOCK_AABB, null, fruitSprite, 1);
|
||||
}
|
||||
|
||||
// Set the particle sprite
|
||||
|
||||
@@ -48,10 +48,10 @@ public class TextureLeaves {
|
||||
|
||||
private TextureLeaves(EnumLeafType enumLeafType) {
|
||||
String ident = enumLeafType.toString().toLowerCase(Locale.ENGLISH);
|
||||
this.plain = new ResourceLocation(Constants.RESOURCE_ID, "blocks/leaves/" + ident + ".plain");
|
||||
this.fancy = new ResourceLocation(Constants.RESOURCE_ID, "blocks/leaves/" + ident + ".fancy");
|
||||
this.pollinatedPlain = new ResourceLocation(Constants.RESOURCE_ID, "blocks/leaves/" + ident + ".changed.plain");
|
||||
this.pollinatedFancy = new ResourceLocation(Constants.RESOURCE_ID, "blocks/leaves/" + ident + ".changed");
|
||||
this.plain = new ResourceLocation(Constants.MOD_ID, "blocks/leaves/" + ident + ".plain");
|
||||
this.fancy = new ResourceLocation(Constants.MOD_ID, "blocks/leaves/" + ident + ".fancy");
|
||||
this.pollinatedPlain = new ResourceLocation(Constants.MOD_ID, "blocks/leaves/" + ident + ".changed.plain");
|
||||
this.pollinatedFancy = new ResourceLocation(Constants.MOD_ID, "blocks/leaves/" + ident + ".changed");
|
||||
}
|
||||
|
||||
private void registerSprites() {
|
||||
|
||||
@@ -25,7 +25,7 @@ public class FruitPodStateMapper extends ForestryStateMapper {
|
||||
String modID = fruit.getModID();
|
||||
if (Constants.MOD_ID.equals(modID)) {
|
||||
String modelName = fruit.getModelName();
|
||||
String resourcePath = Constants.RESOURCE_ID + ":pods/" + modelName;
|
||||
String resourcePath = Constants.MOD_ID + ":pods/" + modelName;
|
||||
for (IBlockState state : block.getBlockState().getValidStates()) {
|
||||
String propertyString = getPropertyString(state.getProperties());
|
||||
mapStateModelLocations.put(state, new ModelResourceLocation(resourcePath, propertyString));
|
||||
|
||||
@@ -27,7 +27,7 @@ public class PileStateMapper extends ForestryStateMapper {
|
||||
|
||||
@Override
|
||||
public Map<IBlockState, ModelResourceLocation> putStateModelLocations(Block block) {
|
||||
String location = Constants.RESOURCE_ID + ":pile";
|
||||
String location = Constants.MOD_ID + ":pile";
|
||||
|
||||
IBlockState woodPileState = PluginArboriculture.blocks.piles.get(EnumPileType.WOOD).getDefaultState();
|
||||
mapStateModelLocations.put(woodPileState, new ModelResourceLocation(location, "type=wood"));
|
||||
|
||||
@@ -41,7 +41,7 @@ public class CreativeTabForestry extends CreativeTabs {
|
||||
}
|
||||
}
|
||||
|
||||
public static final CreativeTabs tabForestry = new CreativeTabForestry(0, Constants.RESOURCE_ID);
|
||||
public static final CreativeTabs tabForestry = new CreativeTabForestry(0, Constants.MOD_ID);
|
||||
|
||||
private final int icon;
|
||||
|
||||
|
||||
@@ -102,7 +102,7 @@ public class EventHandlerCore {
|
||||
return;
|
||||
}
|
||||
|
||||
ResourceLocation resourceLocation = new ResourceLocation(Constants.RESOURCE_ID, event.getName().getResourcePath());
|
||||
ResourceLocation resourceLocation = new ResourceLocation(Constants.MOD_ID, event.getName().getResourcePath());
|
||||
LootTable forestryChestAdditions = LootTableLoader.loadBuiltinLootTable(resourceLocation);
|
||||
if (forestryChestAdditions != null) {
|
||||
for (String poolName : PluginManager.getLootPoolNames()) {
|
||||
|
||||
@@ -17,6 +17,7 @@ import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
import forestry.core.fluids.Fluids;
|
||||
import net.minecraft.command.ICommand;
|
||||
import net.minecraft.init.Blocks;
|
||||
import net.minecraft.init.Items;
|
||||
@@ -48,7 +49,6 @@ import forestry.core.commands.CommandPlugins;
|
||||
import forestry.core.commands.RootCommand;
|
||||
import forestry.core.config.Config;
|
||||
import forestry.core.config.Constants;
|
||||
import forestry.core.fluids.Fluids;
|
||||
import forestry.core.genetics.alleles.AlleleFactory;
|
||||
import forestry.core.genetics.alleles.AlleleHelper;
|
||||
import forestry.core.genetics.alleles.AlleleRegistry;
|
||||
@@ -336,9 +336,9 @@ public class PluginCore extends BlankForestryPlugin {
|
||||
int bogEarthOutputCan = ForestryAPI.activeMode.getIntegerSetting("recipe.output.bogearth.can");
|
||||
if (bogEarthOutputCan > 0) {
|
||||
ItemStack bogEarth = blocks.bogEarth.get(BlockBogEarth.SoilType.BOG_EARTH, bogEarthOutputCan);
|
||||
ItemStack canWater = PluginFluids.items.getContainer(EnumContainerType.CAN, Fluids.WATER).getItemStack();
|
||||
ItemStack waxCapsuleWater = PluginFluids.items.getContainer(EnumContainerType.CAPSULE, Fluids.WATER).getItemStack();
|
||||
ItemStack refractoryWater = PluginFluids.items.getContainer(EnumContainerType.REFRACTORY, Fluids.WATER).getItemStack();
|
||||
ItemStack canWater = PluginFluids.items.getContainer(EnumContainerType.CAN, Fluids.WATER);
|
||||
ItemStack waxCapsuleWater = PluginFluids.items.getContainer(EnumContainerType.CAPSULE, Fluids.WATER);
|
||||
ItemStack refractoryWater = PluginFluids.items.getContainer(EnumContainerType.REFRACTORY, Fluids.WATER);
|
||||
RecipeUtil.addRecipe(bogEarth, "#Y#", "YXY", "#Y#", '#', Blocks.DIRT, 'X', canWater, 'Y', OreDictUtil.SAND);
|
||||
RecipeUtil.addRecipe(bogEarth, "#Y#", "YXY", "#Y#", '#', Blocks.DIRT, 'X', waxCapsuleWater, 'Y', OreDictUtil.SAND);
|
||||
RecipeUtil.addRecipe(bogEarth, "#Y#", "YXY", "#Y#", '#', Blocks.DIRT, 'X', refractoryWater, 'Y', OreDictUtil.SAND);
|
||||
|
||||
@@ -10,17 +10,6 @@
|
||||
******************************************************************************/
|
||||
package forestry.core;
|
||||
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.item.ItemBlock;
|
||||
import net.minecraft.item.ItemStack;
|
||||
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;
|
||||
|
||||
import forestry.api.core.ForestryAPI;
|
||||
import forestry.api.fuels.FuelManager;
|
||||
import forestry.api.fuels.GeneratorFuel;
|
||||
@@ -28,15 +17,20 @@ import forestry.api.recipes.RecipeManagers;
|
||||
import forestry.core.config.Config;
|
||||
import forestry.core.config.Constants;
|
||||
import forestry.core.fluids.Fluids;
|
||||
import forestry.core.fluids.LiquidRegistryHelper;
|
||||
import forestry.core.items.EnumContainerType;
|
||||
import forestry.core.items.ItemLiquidContainer;
|
||||
import forestry.core.items.ItemRegistryFluids;
|
||||
import forestry.core.proxy.Proxies;
|
||||
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 {
|
||||
@@ -99,25 +93,6 @@ public class PluginFluids extends BlankForestryPlugin {
|
||||
|
||||
@Override
|
||||
public void doInit() {
|
||||
for (Fluids fluidType : Fluids.values()) {
|
||||
if (fluidType.getFluid() == null) {
|
||||
continue;
|
||||
}
|
||||
|
||||
for (EnumContainerType type : EnumContainerType.values()) {
|
||||
ItemLiquidContainer container = items.getContainer(type, fluidType);
|
||||
if (container == null) {
|
||||
continue;
|
||||
}
|
||||
|
||||
LiquidRegistryHelper.registerLiquidContainer(fluidType, container.getItemStack());
|
||||
}
|
||||
|
||||
for (ItemStack filledContainer : fluidType.getOtherContainers()) {
|
||||
LiquidRegistryHelper.registerLiquidContainer(fluidType, filledContainer);
|
||||
}
|
||||
}
|
||||
|
||||
if (RecipeManagers.squeezerManager != null) {
|
||||
RecipeManagers.squeezerManager.addContainerRecipe(10, items.canEmpty.getItemStack(), PluginCore.items.ingotTin.copy(), 0.05f);
|
||||
RecipeManagers.squeezerManager.addContainerRecipe(10, items.waxCapsuleEmpty.getItemStack(), PluginCore.items.beeswax.getItemStack(), 0.10f);
|
||||
|
||||
@@ -20,7 +20,6 @@ import net.minecraft.block.state.IBlockState;
|
||||
import net.minecraft.client.particle.ParticleManager;
|
||||
import net.minecraft.client.renderer.texture.TextureMap;
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.init.Items;
|
||||
import net.minecraft.inventory.IInventory;
|
||||
import net.minecraft.item.Item;
|
||||
import net.minecraft.item.ItemStack;
|
||||
@@ -40,7 +39,9 @@ import net.minecraft.util.math.Vec3d;
|
||||
import net.minecraft.util.text.TextComponentTranslation;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
import net.minecraftforge.fluids.IFluidHandler;
|
||||
import net.minecraftforge.fluids.FluidUtil;
|
||||
import net.minecraftforge.fluids.capability.CapabilityFluidHandler;
|
||||
import net.minecraftforge.fluids.capability.IFluidHandler;
|
||||
import net.minecraftforge.fml.relauncher.Side;
|
||||
import net.minecraftforge.fml.relauncher.SideOnly;
|
||||
|
||||
@@ -51,7 +52,6 @@ import forestry.api.core.IStateMapperRegister;
|
||||
import forestry.api.core.ITextureManager;
|
||||
import forestry.core.access.IAccessHandler;
|
||||
import forestry.core.circuits.ISocketable;
|
||||
import forestry.core.fluids.FluidHelper;
|
||||
import forestry.core.proxy.Proxies;
|
||||
import forestry.core.render.MachineParticleCallback;
|
||||
import forestry.core.render.MachineStateMapper;
|
||||
@@ -124,6 +124,14 @@ public class BlockBase<P extends Enum<P> & IBlockType & IStringSerializable> ext
|
||||
return definition.getBoundingBox(pos, blockState);
|
||||
}
|
||||
|
||||
@Nonnull
|
||||
@Override
|
||||
@SideOnly(Side.CLIENT)
|
||||
public AxisAlignedBB getSelectedBoundingBox(IBlockState state, World worldIn, BlockPos pos) {
|
||||
IMachineProperties definition = getDefinition();
|
||||
return definition.getBoundingBox(pos, state).offset(pos);
|
||||
}
|
||||
|
||||
@Override
|
||||
public RayTraceResult collisionRayTrace(IBlockState blockState, World worldIn, BlockPos pos, Vec3d start, Vec3d end) {
|
||||
IMachineProperties definition = getDefinition();
|
||||
@@ -139,10 +147,6 @@ public class BlockBase<P extends Enum<P> & IBlockType & IStringSerializable> ext
|
||||
/* INTERACTION */
|
||||
@Override
|
||||
public boolean onBlockActivated(World worldIn, BlockPos pos, IBlockState state, EntityPlayer playerIn, EnumHand hand, ItemStack heldItem, EnumFacing side, float hitX, float hitY, float hitZ) {
|
||||
if (playerIn.isSneaking()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
TileBase tile = TileUtil.getTile(worldIn, pos, TileBase.class);
|
||||
if (tile == null) {
|
||||
return false;
|
||||
@@ -154,9 +158,12 @@ public class BlockBase<P extends Enum<P> & IBlockType & IStringSerializable> ext
|
||||
|
||||
IAccessHandler access = tile.getAccessHandler();
|
||||
|
||||
if (heldItem != null && heldItem.getItem() != Items.BUCKET && tile instanceof IFluidHandler && access.allowsAlteration(playerIn)) {
|
||||
if (FluidHelper.handleRightClick((IFluidHandler) tile, side, playerIn, true, tile.canDrainWithBucket())) {
|
||||
return true;
|
||||
if (!playerIn.isSneaking()) {
|
||||
if (tile.hasCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, side)) {
|
||||
IFluidHandler tileFluidHandler = tile.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, side);
|
||||
if (FluidUtil.interactWithFluidHandler(heldItem, tileFluidHandler, playerIn)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -31,7 +31,7 @@ public enum BlockTypeCoreTesr implements IBlockTypeTesr {
|
||||
private final IMachinePropertiesTesr machineProperties;
|
||||
|
||||
<T extends TileForestry> BlockTypeCoreTesr(@Nonnull Class<T> teClass, @Nonnull String name, @Nullable TileEntitySpecialRenderer<T> renderer) {
|
||||
this.machineProperties = new MachinePropertiesTesr<>(teClass, name, renderer, Constants.RESOURCE_ID + ":blocks/" + name + ".0");
|
||||
this.machineProperties = new MachinePropertiesTesr<>(teClass, name, renderer, Constants.MOD_ID + ":blocks/" + name + ".0");
|
||||
}
|
||||
|
||||
@Nonnull
|
||||
|
||||
@@ -119,7 +119,7 @@ public final class CommandSaveStats extends SubCommand {
|
||||
}
|
||||
}
|
||||
|
||||
File file = new File(Proxies.common.getForestryRoot(), "config/" + Constants.RESOURCE_ID + "/stats/" + player.getDisplayName() + '-' + saveHelper.getFileSuffix() + ".log");
|
||||
File file = new File(Proxies.common.getForestryRoot(), "config/" + Constants.MOD_ID + "/stats/" + player.getDisplayName() + '-' + saveHelper.getFileSuffix() + ".log");
|
||||
try {
|
||||
File folder = file.getParentFile();
|
||||
if (folder != null && !folder.exists()) {
|
||||
|
||||
@@ -297,7 +297,7 @@ public class Config {
|
||||
try {
|
||||
InputStream hintStream = Config.class.getResourceAsStream("/config/forestry/hints.properties");
|
||||
prop.load(hintStream);
|
||||
} catch (IOException e) {
|
||||
} catch (IOException | NullPointerException e) {
|
||||
Log.error("Failed to load hints file.", e);
|
||||
}
|
||||
|
||||
|
||||
@@ -13,11 +13,11 @@ package forestry.core.config;
|
||||
import net.minecraft.util.ResourceLocation;
|
||||
|
||||
import forestry.api.core.IForestryConstants;
|
||||
import net.minecraftforge.fluids.Fluid;
|
||||
|
||||
public class Constants implements IForestryConstants {
|
||||
// System
|
||||
public static final String MOD_ID = "Forestry";
|
||||
public static final String RESOURCE_ID = "forestry";
|
||||
public static final String MOD_ID = "forestry";
|
||||
public static final String URL = "http://forestry.sengir.net/";
|
||||
|
||||
public static final String VERSION = "@VERSION@";
|
||||
@@ -26,7 +26,6 @@ public class Constants implements IForestryConstants {
|
||||
public static final int FLAG_BLOCK_UPDATE = 1;
|
||||
public static final int FLAG_BLOCK_SYNC = 2;
|
||||
|
||||
public static final int BUCKET_VOLUME = 1000;
|
||||
public static final int FLUID_PER_HONEY_DROP = 100;
|
||||
|
||||
public static final int[] SLOTS_NONE = new int[0];
|
||||
@@ -41,15 +40,15 @@ public class Constants implements IForestryConstants {
|
||||
public static final String TEXTURE_APIARIST_ARMOR_PRIMARY = TEXTURE_PATH_ITEMS + "/apiarist_armor_1.png";
|
||||
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 = RESOURCE_ID + ":" + TEXTURE_PATH_ENTITIES + "/beekeeper.png";
|
||||
public static final String TEXTURE_SKIN_LUMBERJACK = RESOURCE_ID + ":" + TEXTURE_PATH_ENTITIES + "/lumberjack.png";
|
||||
public static final String TEXTURE_SKIN_BEEKPEEPER = Constants.MOD_ID + ":" + TEXTURE_PATH_ENTITIES + "/beekeeper.png";
|
||||
public static final String TEXTURE_SKIN_LUMBERJACK = Constants.MOD_ID + ":" + TEXTURE_PATH_ENTITIES + "/lumberjack.png";
|
||||
|
||||
// Villagers
|
||||
public static final String ID_VILLAGER_APIARIST = RESOURCE_ID + ":apiarist";
|
||||
public static final String ID_VILLAGER_ARBORIST = RESOURCE_ID + ":arborist";
|
||||
public static final String ID_VILLAGER_APIARIST = Constants.MOD_ID + ":apiarist";
|
||||
public static final String ID_VILLAGER_ARBORIST = Constants.MOD_ID + ":arborist";
|
||||
|
||||
// Village Loot Key
|
||||
public static final ResourceLocation VILLAGE_NATURALIST_LOOT_KEY = new ResourceLocation(RESOURCE_ID, "chests/village_naturalist");
|
||||
public static final ResourceLocation VILLAGE_NATURALIST_LOOT_KEY = new ResourceLocation(Constants.MOD_ID, "chests/village_naturalist");
|
||||
|
||||
// Item Ids
|
||||
|
||||
@@ -64,7 +63,7 @@ public class Constants implements IForestryConstants {
|
||||
public static final int APIARY_BREEDING_TIME = 100;
|
||||
|
||||
// Energy
|
||||
public static final int ENGINE_TANK_CAPACITY = 10 * BUCKET_VOLUME;
|
||||
public static final int ENGINE_TANK_CAPACITY = 10 * Fluid.BUCKET_VOLUME;
|
||||
public static final int ENGINE_CYCLE_DURATION_WATER = 1000;
|
||||
public static final int ENGINE_CYCLE_DURATION_JUICE = 2500;
|
||||
public static final int ENGINE_CYCLE_DURATION_HONEY = 2500;
|
||||
@@ -102,7 +101,7 @@ public class Constants implements IForestryConstants {
|
||||
public static final int ENGINE_TIN_MAX_EU_BATTERY = 100;
|
||||
|
||||
// Factory
|
||||
public static final int PROCESSOR_TANK_CAPACITY = 10 * BUCKET_VOLUME;
|
||||
public static final int PROCESSOR_TANK_CAPACITY = 10 * Fluid.BUCKET_VOLUME;
|
||||
|
||||
public static final int MACHINE_MAX_ENERGY = 5000;
|
||||
|
||||
@@ -118,7 +117,7 @@ public class Constants implements IForestryConstants {
|
||||
public static final float ICE_COOLING_MULTIPLIER = 6f; // multiple of water's cooling value
|
||||
|
||||
// Storage
|
||||
public static final int RAINTANK_TANK_CAPACITY = 30 * BUCKET_VOLUME;
|
||||
public static final int RAINTANK_TANK_CAPACITY = 30 * Fluid.BUCKET_VOLUME;
|
||||
public static final int RAINTANK_AMOUNT_PER_UPDATE = 10;
|
||||
public static final int RAINTANK_FILLING_TIME = 12;
|
||||
public static final int CARPENTER_CRATING_CYCLES = 5;
|
||||
|
||||
@@ -112,7 +112,7 @@ public enum EnumErrorCode implements IErrorState {
|
||||
@SideOnly(Side.CLIENT)
|
||||
@Override
|
||||
public void registerSprite() {
|
||||
texture = TextureManager.registerSprite(new ResourceLocation(Constants.RESOURCE_ID, "gui/errors/" + iconName));
|
||||
texture = TextureManager.registerSprite(new ResourceLocation(Constants.MOD_ID, "gui/errors/" + iconName));
|
||||
}
|
||||
|
||||
@SideOnly(Side.CLIENT)
|
||||
|
||||
@@ -14,16 +14,12 @@ import java.util.List;
|
||||
|
||||
import net.minecraft.inventory.Container;
|
||||
import net.minecraft.inventory.IContainerListener;
|
||||
import net.minecraft.util.EnumFacing;
|
||||
|
||||
import net.minecraftforge.fluids.Fluid;
|
||||
import net.minecraftforge.fluids.FluidStack;
|
||||
import net.minecraftforge.fluids.FluidTankInfo;
|
||||
import net.minecraftforge.fluids.IFluidTank;
|
||||
import net.minecraftforge.fluids.capability.templates.EmptyFluidHandler;
|
||||
|
||||
import forestry.core.fluids.tanks.FakeTank;
|
||||
|
||||
public class FakeTankManager implements ITankManager {
|
||||
public class FakeTankManager extends EmptyFluidHandler implements ITankManager {
|
||||
public static final FakeTankManager instance = new FakeTankManager();
|
||||
|
||||
private FakeTankManager() {
|
||||
@@ -47,41 +43,21 @@ public class FakeTankManager implements ITankManager {
|
||||
|
||||
@Override
|
||||
public IFluidTank getTank(int tankIndex) {
|
||||
return FakeTank.INSTANCE;
|
||||
return EmptyFluidHandler.INSTANCE;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canFillFluidType(FluidStack fluidStack) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canDrainFluidType(FluidStack fluidStack) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void processTankUpdate(int tankIndex, FluidStack contents) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public int fill(EnumFacing from, FluidStack resource, boolean doFill) {
|
||||
return FakeTank.INSTANCE.fill(resource, doFill);
|
||||
}
|
||||
|
||||
@Override
|
||||
public FluidStack drain(EnumFacing from, FluidStack resource, boolean doDrain) {
|
||||
return FakeTank.INSTANCE.drain(resource.amount, doDrain);
|
||||
}
|
||||
|
||||
@Override
|
||||
public FluidStack drain(EnumFacing from, int maxDrain, boolean doDrain) {
|
||||
return FakeTank.INSTANCE.drain(maxDrain, doDrain);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canFill(EnumFacing from, Fluid fluid) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canDrain(EnumFacing from, Fluid fluid) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public FluidTankInfo[] getTankInfo(EnumFacing from) {
|
||||
return FakeTank.INFO;
|
||||
}
|
||||
}
|
||||
@@ -10,101 +10,22 @@
|
||||
******************************************************************************/
|
||||
package forestry.core.fluids;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.inventory.IInventory;
|
||||
import net.minecraft.item.Item;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.util.EnumFacing;
|
||||
|
||||
import net.minecraftforge.fluids.Fluid;
|
||||
import net.minecraftforge.fluids.FluidContainerRegistry;
|
||||
import net.minecraftforge.fluids.FluidRegistry;
|
||||
import net.minecraftforge.fluids.FluidStack;
|
||||
import net.minecraftforge.fluids.IFluidContainerItem;
|
||||
import net.minecraftforge.fluids.IFluidHandler;
|
||||
import net.minecraftforge.fluids.FluidUtil;
|
||||
import net.minecraftforge.fluids.capability.IFluidHandler;
|
||||
import net.minecraftforge.fluids.capability.IFluidTankProperties;
|
||||
|
||||
import forestry.core.PluginFluids;
|
||||
import forestry.core.config.Constants;
|
||||
import forestry.core.utils.InventoryUtil;
|
||||
import forestry.core.utils.ItemStackUtil;
|
||||
|
||||
/**
|
||||
* @author CovertJaguar <http://www.railcraft.info>
|
||||
*/
|
||||
public final class FluidHelper {
|
||||
|
||||
private FluidHelper() {
|
||||
}
|
||||
|
||||
public static boolean handleRightClick(IFluidHandler tank, EnumFacing side, EntityPlayer player, boolean fill, boolean drain) {
|
||||
if (player == null) {
|
||||
return false;
|
||||
}
|
||||
ItemStack current = player.inventory.getCurrentItem();
|
||||
if (current != null) {
|
||||
|
||||
FluidStack liquid = getFluidStackInContainer(current);
|
||||
|
||||
if (fill && liquid != null) {
|
||||
int canUseAmount = tank.fill(side, liquid, false);
|
||||
if (canUseAmount == 0) {
|
||||
return false;
|
||||
}
|
||||
|
||||
ItemStack drainedContainer = getDrainedContainer(current, canUseAmount);
|
||||
if (ItemStackUtil.isIdenticalItem(current, drainedContainer)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
int usedAmount = tank.fill(side, liquid, true);
|
||||
if (usedAmount > 0) {
|
||||
if (!player.capabilities.isCreativeMode) {
|
||||
if (current.stackSize > 1) {
|
||||
player.inventory.decrStackSize(player.inventory.currentItem, 1);
|
||||
if (drainedContainer != null && !player.inventory.addItemStackToInventory(drainedContainer)) {
|
||||
player.dropItem(drainedContainer, false);
|
||||
}
|
||||
} else {
|
||||
player.inventory.setInventorySlotContents(player.inventory.currentItem, drainedContainer);
|
||||
}
|
||||
player.inventory.markDirty();
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
} else if (drain) {
|
||||
|
||||
FluidStack available = tank.drain(side, Integer.MAX_VALUE, false);
|
||||
if (available != null) {
|
||||
ItemStack filled = getFilledContainer(available, current);
|
||||
|
||||
liquid = getFluidStackInContainer(filled);
|
||||
if (liquid != null) {
|
||||
|
||||
if (current.stackSize > 1) {
|
||||
if (!player.inventory.addItemStackToInventory(filled)) {
|
||||
return false;
|
||||
}
|
||||
player.inventory.setInventorySlotContents(player.inventory.currentItem, InventoryUtil.depleteItem(current));
|
||||
player.inventory.markDirty();
|
||||
} else {
|
||||
player.inventory.setInventorySlotContents(player.inventory.currentItem, InventoryUtil.depleteItem(current));
|
||||
player.inventory.setInventorySlotContents(player.inventory.currentItem, filled);
|
||||
player.inventory.markDirty();
|
||||
}
|
||||
|
||||
tank.drain(side, liquid.amount, true);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public static boolean areFluidStacksEqual(FluidStack fluidStack1, FluidStack fluidStack2) {
|
||||
if (fluidStack1 == null) {
|
||||
return fluidStack2 == null;
|
||||
@@ -117,10 +38,6 @@ public final class FluidHelper {
|
||||
SUCCESS, INVALID_INPUT, NO_FLUID, NO_SPACE
|
||||
}
|
||||
|
||||
public static FillStatus fillContainers(IFluidHandler fluidHandler, IInventory inv, int inputSlot, int outputSlot, Fluid fluidToFill) {
|
||||
return fillContainers(fluidHandler, inv, inputSlot, outputSlot, fluidToFill, true);
|
||||
}
|
||||
|
||||
public static FillStatus fillContainers(IFluidHandler fluidHandler, IInventory inv, int inputSlot, int outputSlot, Fluid fluidToFill, boolean doFill) {
|
||||
if (fluidToFill == null) {
|
||||
return FillStatus.INVALID_INPUT;
|
||||
@@ -132,30 +49,33 @@ public final class FluidHelper {
|
||||
}
|
||||
ItemStack output = inv.getStackInSlot(outputSlot);
|
||||
|
||||
int containerCapacity = getFluidCapacity(fluidToFill, input);
|
||||
ItemStack filled = input.copy();
|
||||
filled.stackSize = 1;
|
||||
|
||||
IFluidHandler fluidFilledHandler = FluidUtil.getFluidHandler(filled);
|
||||
if (fluidFilledHandler == null) {
|
||||
return FillStatus.INVALID_INPUT;
|
||||
}
|
||||
|
||||
int containerCapacity = fluidFilledHandler.fill(new FluidStack(fluidToFill, Integer.MAX_VALUE), false);
|
||||
if (containerCapacity <= 0) {
|
||||
return FillStatus.INVALID_INPUT;
|
||||
}
|
||||
|
||||
int fillAmount = containerCapacity;
|
||||
if (input.getItem() instanceof IFluidContainerItem) {
|
||||
fillAmount = Math.min(Constants.BUCKET_VOLUME, containerCapacity);
|
||||
}
|
||||
|
||||
FluidStack canDrain = fluidHandler.drain(null, new FluidStack(fluidToFill, fillAmount), false);
|
||||
FluidStack canDrain = fluidHandler.drain(new FluidStack(fluidToFill, containerCapacity), false);
|
||||
if (canDrain == null || canDrain.amount == 0) {
|
||||
return FillStatus.NO_FLUID;
|
||||
}
|
||||
|
||||
ItemStack filled = getFilledContainer(canDrain, input);
|
||||
if (filled == null) {
|
||||
if (fluidFilledHandler.fill(canDrain, true) <= 0) {
|
||||
return FillStatus.NO_FLUID; // standard containers will not fill if there isn't enough fluid
|
||||
}
|
||||
|
||||
FluidStack fluidInContainer = getFluidStackInContainer(filled);
|
||||
FluidStack fluidInContainer = fluidFilledHandler.drain(Integer.MAX_VALUE, false);
|
||||
if (fluidInContainer == null) {
|
||||
return FillStatus.INVALID_INPUT;
|
||||
}
|
||||
|
||||
boolean moveToOutput = fluidInContainer.amount >= containerCapacity;
|
||||
if (moveToOutput) {
|
||||
if (output != null && (output.stackSize >= output.getMaxStackSize() || !InventoryUtil.isItemEqual(filled, output))) {
|
||||
@@ -168,7 +88,7 @@ public final class FluidHelper {
|
||||
}
|
||||
|
||||
if (doFill) {
|
||||
fluidHandler.drain(null, canDrain, true);
|
||||
fluidHandler.drain(canDrain, true);
|
||||
if (moveToOutput) {
|
||||
if (output == null) {
|
||||
inv.setInventorySlotContents(outputSlot, filled);
|
||||
@@ -184,101 +104,93 @@ public final class FluidHelper {
|
||||
return FillStatus.SUCCESS;
|
||||
}
|
||||
|
||||
public static boolean drainContainers(IFluidHandler fluidHandler, IInventory inv, int slot) {
|
||||
return drainContainers(fluidHandler, inv, slot, slot);
|
||||
}
|
||||
|
||||
public static boolean drainContainers(IFluidHandler fluidHandler, IInventory inv, int inputSlot, int outputSlot) {
|
||||
public static boolean drainContainers(IFluidHandler fluidHandler, IInventory inv, int inputSlot) {
|
||||
ItemStack input = inv.getStackInSlot(inputSlot);
|
||||
ItemStack output = inv.getStackInSlot(outputSlot);
|
||||
|
||||
if (input == null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
FluidStack fluidInContainer = getFluidStackInContainer(input);
|
||||
if (fluidInContainer == null) {
|
||||
ItemStack drainedItemSimulated = FluidUtil.tryEmptyContainer(input, fluidHandler, Fluid.BUCKET_VOLUME, null, false);
|
||||
if (drainedItemSimulated == null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (input.getItem() instanceof IFluidContainerItem) {
|
||||
if (fluidInContainer.amount > Constants.BUCKET_VOLUME) {
|
||||
fluidInContainer.amount = Constants.BUCKET_VOLUME;
|
||||
}
|
||||
}
|
||||
|
||||
int used = fluidHandler.fill(null, fluidInContainer, false);
|
||||
|
||||
ItemStack drainedItem = getDrainedContainer(input, used);
|
||||
if (ItemStack.areItemStacksEqual(input, drainedItem)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// consume forestry containers if there is only one slot
|
||||
if (outputSlot == inputSlot && drainedItem != null) {
|
||||
Item item = drainedItem.getItem();
|
||||
if (PluginFluids.items.canEmpty == item || PluginFluids.items.waxCapsuleEmpty == item || PluginFluids.items.refractoryEmpty == item) {
|
||||
drainedItem = null;
|
||||
}
|
||||
}
|
||||
|
||||
if (!hasRoomForDrainedContainer(input, output, drainedItem, inputSlot, outputSlot)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
fluidHandler.fill(null, fluidInContainer, true);
|
||||
|
||||
if (drainedItem != null) {
|
||||
if (outputSlot == inputSlot) {
|
||||
inv.setInventorySlotContents(outputSlot, drainedItem);
|
||||
if (input.stackSize == 1 || drainedItemSimulated.stackSize == 0) {
|
||||
ItemStack drainedItem = FluidUtil.tryEmptyContainer(input, fluidHandler, Fluid.BUCKET_VOLUME, null, true);
|
||||
if (drainedItem != null) {
|
||||
if (drainedItem.stackSize > 0) {
|
||||
inv.setInventorySlotContents(inputSlot, drainedItem);
|
||||
} else {
|
||||
inv.decrStackSize(inputSlot, 1);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
if (output == null) {
|
||||
inv.setInventorySlotContents(outputSlot, drainedItem);
|
||||
} else {
|
||||
output.stackSize++;
|
||||
return false;
|
||||
}
|
||||
|
||||
public static boolean isFillableContainerWithRoom(ItemStack container) {
|
||||
IFluidHandler fluidHandler = FluidUtil.getFluidHandler(container);
|
||||
if (fluidHandler == null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
IFluidTankProperties[] tankProperties = fluidHandler.getTankProperties();
|
||||
for (IFluidTankProperties properties : tankProperties) {
|
||||
if (properties.canFill() && properties.getCapacity() > 0) {
|
||||
FluidStack contents = properties.getContents();
|
||||
if (contents == null) {
|
||||
return true;
|
||||
} else if (contents.amount < properties.getCapacity()) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
inv.decrStackSize(inputSlot, 1);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public static boolean isFillableEmptyContainer(ItemStack empty) {
|
||||
IFluidHandler fluidHandler = FluidUtil.getFluidHandler(empty);
|
||||
if (fluidHandler == null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
IFluidTankProperties[] tankProperties = fluidHandler.getTankProperties();
|
||||
for (IFluidTankProperties properties : tankProperties) {
|
||||
if (!properties.canFill()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
FluidStack contents = properties.getContents();
|
||||
if (contents != null && contents.amount > 0) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
private static boolean hasRoomForDrainedContainer(ItemStack input, ItemStack output, ItemStack drainedItem, int inputSlot, int outputSlot) {
|
||||
if (output == null || drainedItem == null) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (outputSlot == inputSlot) {
|
||||
return input.stackSize == 1;
|
||||
}
|
||||
|
||||
if (!ItemStackUtil.isIdenticalItem(output, drainedItem)) {
|
||||
public static boolean isDrainableFilledContainer(ItemStack container) {
|
||||
IFluidHandler fluidHandler = FluidUtil.getFluidHandler(container);
|
||||
if (fluidHandler == null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return output.stackSize + drainedItem.stackSize <= output.getMaxStackSize();
|
||||
}
|
||||
IFluidTankProperties[] tankProperties = fluidHandler.getTankProperties();
|
||||
for (IFluidTankProperties properties : tankProperties) {
|
||||
if (!properties.canDrain()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
public static boolean isEmptyContainer(ItemStack empty) {
|
||||
Item item = empty.getItem();
|
||||
if (item instanceof IFluidContainerItem) {
|
||||
IFluidContainerItem containerItem = (IFluidContainerItem) item;
|
||||
FluidStack fluid = containerItem.getFluid(empty);
|
||||
return fluid == null || fluid.amount == 0;
|
||||
FluidStack contents = properties.getContents();
|
||||
if (contents == null || contents.amount < properties.getCapacity()) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return FluidContainerRegistry.isEmptyContainer(empty);
|
||||
}
|
||||
|
||||
public static boolean isFillableContainer(ItemStack container) {
|
||||
FluidStack fluid = getFluidStackInContainer(container);
|
||||
if (fluid == null || fluid.amount == 0) {
|
||||
return isEmptyContainer(container);
|
||||
}
|
||||
|
||||
int capacity = getFluidCapacity(fluid.getFluid(), container);
|
||||
return fluid.amount < capacity;
|
||||
return true;
|
||||
}
|
||||
|
||||
public static ItemStack getDrainedContainer(ItemStack container, int drainAmount) {
|
||||
@@ -290,127 +202,38 @@ public final class FluidHelper {
|
||||
return container;
|
||||
}
|
||||
|
||||
Item item = container.getItem();
|
||||
if (item == null) {
|
||||
container = container.copy();
|
||||
container.stackSize = 1;
|
||||
|
||||
IFluidHandler fluidHandler = FluidUtil.getFluidHandler(container);
|
||||
if (fluidHandler == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
if (item instanceof IFluidContainerItem) {
|
||||
ItemStack drained = container.copy();
|
||||
drained.stackSize = 1;
|
||||
IFluidContainerItem containerItem = (IFluidContainerItem) item;
|
||||
containerItem.drain(drained, drainAmount, true);
|
||||
return drained;
|
||||
} else {
|
||||
int capacity = FluidContainerRegistry.getContainerCapacity(container);
|
||||
if (capacity > 0) {
|
||||
if (drainAmount < capacity) {
|
||||
return container;
|
||||
}
|
||||
return FluidContainerRegistry.drainFluidContainer(container);
|
||||
}
|
||||
fluidHandler.drain(drainAmount, true);
|
||||
if (container.stackSize <= 0) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return container;
|
||||
}
|
||||
|
||||
public static ItemStack getFilledContainer(FluidStack liquid, ItemStack stack) {
|
||||
if (liquid == null || stack == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
stack = stack.copy();
|
||||
stack.stackSize = 1;
|
||||
|
||||
IFluidHandler fluidHandler = FluidUtil.getFluidHandler(stack);
|
||||
if (fluidHandler == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
if (fluidHandler.fill(liquid, true) > 0) {
|
||||
return stack;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public static ItemStack getEmptyContainer(ItemStack container) {
|
||||
if (container == null) {
|
||||
return null;
|
||||
}
|
||||
FluidStack fluidStack = FluidHelper.getFluidStackInContainer(container);
|
||||
if (fluidStack == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return FluidHelper.getDrainedContainer(container, fluidStack.amount);
|
||||
}
|
||||
|
||||
public static List<ItemStack> getAllFilledContainers(ItemStack empty) {
|
||||
List<ItemStack> filledContainers = new ArrayList<>();
|
||||
for (Fluid fluid : FluidRegistry.getRegisteredFluids().values()) {
|
||||
ItemStack filledContainer = getFilledContainer(fluid, empty);
|
||||
if (filledContainer != null) {
|
||||
filledContainers.add(filledContainer);
|
||||
}
|
||||
}
|
||||
return filledContainers;
|
||||
}
|
||||
|
||||
public static ItemStack getFilledContainer(Fluid fluid, ItemStack empty) {
|
||||
if (fluid == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
FluidStack fluidToFill = new FluidStack(fluid, Integer.MAX_VALUE);
|
||||
|
||||
return getFilledContainer(fluidToFill, empty);
|
||||
}
|
||||
|
||||
public static ItemStack getFilledContainer(FluidStack liquid, ItemStack empty) {
|
||||
if (liquid == null || empty == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
Item item = empty.getItem();
|
||||
if (item instanceof IFluidContainerItem) {
|
||||
ItemStack full = ItemStackUtil.createSplitStack(empty, 1);
|
||||
IFluidContainerItem containerItem = (IFluidContainerItem) item;
|
||||
containerItem.fill(full, liquid, true);
|
||||
return full;
|
||||
}
|
||||
|
||||
return FluidContainerRegistry.fillFluidContainer(liquid, empty);
|
||||
}
|
||||
|
||||
public static FluidStack getFluidStackInContainer(ItemStack stack) {
|
||||
if (stack == null) {
|
||||
return null;
|
||||
}
|
||||
Item item = stack.getItem();
|
||||
if (item instanceof IFluidContainerItem) {
|
||||
IFluidContainerItem containerItem = (IFluidContainerItem) item;
|
||||
return containerItem.getFluid(stack);
|
||||
}
|
||||
|
||||
return FluidContainerRegistry.getFluidForFilledItem(stack);
|
||||
}
|
||||
|
||||
public static Fluid getFluidInContainer(ItemStack stack) {
|
||||
FluidStack fluidStack = getFluidStackInContainer(stack);
|
||||
return fluidStack != null ? fluidStack.getFluid() : null;
|
||||
}
|
||||
|
||||
public static boolean containsFluidStack(ItemStack stack, FluidStack fluidStack) {
|
||||
Item item = stack.getItem();
|
||||
if (item instanceof IFluidContainerItem) {
|
||||
IFluidContainerItem containerItem = (IFluidContainerItem) item;
|
||||
FluidStack contained = containerItem.getFluid(stack);
|
||||
return contained != null && contained.containsFluid(fluidStack);
|
||||
}
|
||||
|
||||
return FluidContainerRegistry.containsFluid(stack, fluidStack);
|
||||
}
|
||||
|
||||
public static boolean containsFluid(ItemStack stack, Fluid fluid) {
|
||||
return containsFluidStack(stack, new FluidStack(fluid, 1));
|
||||
}
|
||||
|
||||
public static int getFluidCapacity(Fluid fluid, ItemStack container) {
|
||||
if (container == null) {
|
||||
return 0;
|
||||
}
|
||||
Item item = container.getItem();
|
||||
if (item instanceof IFluidContainerItem) {
|
||||
IFluidContainerItem containerItem = (IFluidContainerItem) item;
|
||||
return containerItem.getCapacity(container);
|
||||
}
|
||||
|
||||
if (fluid == null) {
|
||||
return FluidContainerRegistry.getContainerCapacity(container);
|
||||
} else {
|
||||
return FluidContainerRegistry.getContainerCapacity(new FluidStack(fluid, Constants.BUCKET_VOLUME), container);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -15,7 +15,6 @@ import javax.annotation.Nullable;
|
||||
import java.awt.Color;
|
||||
import java.io.IOException;
|
||||
import java.util.Collections;
|
||||
import java.util.EnumSet;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
@@ -30,10 +29,11 @@ import net.minecraft.util.ResourceLocation;
|
||||
import net.minecraftforge.fluids.Fluid;
|
||||
import net.minecraftforge.fluids.FluidRegistry;
|
||||
import net.minecraftforge.fluids.FluidStack;
|
||||
import net.minecraftforge.fluids.FluidUtil;
|
||||
import net.minecraftforge.fml.common.FMLCommonHandler;
|
||||
import net.minecraftforge.fml.relauncher.Side;
|
||||
|
||||
import forestry.core.items.DrinkProperties;
|
||||
import forestry.core.items.EnumContainerType;
|
||||
import forestry.core.proxy.Proxies;
|
||||
import forestry.core.render.ForestryResource;
|
||||
|
||||
@@ -44,32 +44,12 @@ public enum Fluids {
|
||||
public Block makeBlock() {
|
||||
return new BlockForestryFluid(this, 300, true);
|
||||
}
|
||||
|
||||
@Nonnull
|
||||
@Override
|
||||
public EnumSet<EnumContainerType> getContainerTypes() {
|
||||
return EnumSet.of(
|
||||
EnumContainerType.CAN,
|
||||
EnumContainerType.CAPSULE,
|
||||
EnumContainerType.REFRACTORY
|
||||
);
|
||||
}
|
||||
},
|
||||
BIOMASS(new Color(100, 132, 41), 400, 6560) {
|
||||
@Override
|
||||
public Block makeBlock() {
|
||||
return new BlockForestryFluid(this, 100, true);
|
||||
}
|
||||
|
||||
@Nonnull
|
||||
@Override
|
||||
public EnumSet<EnumContainerType> getContainerTypes() {
|
||||
return EnumSet.of(
|
||||
EnumContainerType.CAN,
|
||||
EnumContainerType.CAPSULE,
|
||||
EnumContainerType.REFRACTORY
|
||||
);
|
||||
}
|
||||
},
|
||||
GLASS(new Color(164, 164, 164), 2400, 10000) {
|
||||
@Override
|
||||
@@ -88,16 +68,6 @@ public enum Fluids {
|
||||
return new BlockForestryFluid(this);
|
||||
}
|
||||
|
||||
@Nonnull
|
||||
@Override
|
||||
public EnumSet<EnumContainerType> getContainerTypes() {
|
||||
return EnumSet.of(
|
||||
EnumContainerType.CAN,
|
||||
EnumContainerType.CAPSULE,
|
||||
EnumContainerType.REFRACTORY
|
||||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
public DrinkProperties getDrinkProperties() {
|
||||
return new DrinkProperties(2, 0.2f, 64);
|
||||
@@ -113,16 +83,6 @@ public enum Fluids {
|
||||
public Block makeBlock() {
|
||||
return new BlockForestryFluid(this);
|
||||
}
|
||||
|
||||
@Nonnull
|
||||
@Override
|
||||
public EnumSet<EnumContainerType> getContainerTypes() {
|
||||
return EnumSet.of(
|
||||
EnumContainerType.CAN,
|
||||
EnumContainerType.CAPSULE,
|
||||
EnumContainerType.REFRACTORY
|
||||
);
|
||||
}
|
||||
},
|
||||
JUICE(new Color(168, 201, 114)) {
|
||||
@Override
|
||||
@@ -130,16 +90,6 @@ public enum Fluids {
|
||||
return new BlockForestryFluid(this);
|
||||
}
|
||||
|
||||
@Nonnull
|
||||
@Override
|
||||
public EnumSet<EnumContainerType> getContainerTypes() {
|
||||
return EnumSet.of(
|
||||
EnumContainerType.CAN,
|
||||
EnumContainerType.CAPSULE,
|
||||
EnumContainerType.REFRACTORY
|
||||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
public DrinkProperties getDrinkProperties() {
|
||||
return new DrinkProperties(2, 0.2f, 32);
|
||||
@@ -164,16 +114,6 @@ public enum Fluids {
|
||||
public Block makeBlock() {
|
||||
return new BlockForestryFluid(this, 2, true);
|
||||
}
|
||||
|
||||
@Nonnull
|
||||
@Override
|
||||
public EnumSet<EnumContainerType> getContainerTypes() {
|
||||
return EnumSet.of(
|
||||
EnumContainerType.CAN,
|
||||
EnumContainerType.CAPSULE,
|
||||
EnumContainerType.REFRACTORY
|
||||
);
|
||||
}
|
||||
},
|
||||
SHORT_MEAD(new Color(239, 154, 56), 1000, 1200) {
|
||||
@Override
|
||||
@@ -182,50 +122,11 @@ public enum Fluids {
|
||||
}
|
||||
},
|
||||
// Vanilla
|
||||
WATER(new Color(0x2432ec)) {
|
||||
@Nonnull
|
||||
@Override
|
||||
public EnumSet<EnumContainerType> getContainerTypes() {
|
||||
return EnumSet.of(
|
||||
EnumContainerType.CAN,
|
||||
EnumContainerType.CAPSULE,
|
||||
EnumContainerType.REFRACTORY
|
||||
);
|
||||
}
|
||||
},
|
||||
LAVA(new Color(0xfd461f)) {
|
||||
@Nonnull
|
||||
@Override
|
||||
public EnumSet<EnumContainerType> getContainerTypes() {
|
||||
return EnumSet.of(
|
||||
EnumContainerType.CAN,
|
||||
EnumContainerType.REFRACTORY
|
||||
);
|
||||
}
|
||||
},
|
||||
WATER(new Color(0x2432ec)),
|
||||
LAVA(new Color(0xfd461f)),
|
||||
// BuildCraft
|
||||
FUEL(new Color(0xffff00)) {
|
||||
@Nonnull
|
||||
@Override
|
||||
public EnumSet<EnumContainerType> getContainerTypes() {
|
||||
return EnumSet.of(
|
||||
EnumContainerType.CAN,
|
||||
EnumContainerType.CAPSULE,
|
||||
EnumContainerType.REFRACTORY
|
||||
);
|
||||
}
|
||||
},
|
||||
OIL(new Color(0x404040)) {
|
||||
@Nonnull
|
||||
@Override
|
||||
public EnumSet<EnumContainerType> getContainerTypes() {
|
||||
return EnumSet.of(
|
||||
EnumContainerType.CAN,
|
||||
EnumContainerType.CAPSULE,
|
||||
EnumContainerType.REFRACTORY
|
||||
);
|
||||
}
|
||||
},
|
||||
FUEL(new Color(0xffff00)),
|
||||
OIL(new Color(0x404040)),
|
||||
// Railcraft
|
||||
CREOSOTE(new Color(0x635c03)),
|
||||
STEAM(new Color(0x91938F));
|
||||
@@ -309,7 +210,8 @@ public enum Fluids {
|
||||
}
|
||||
|
||||
public final boolean isContained(ItemStack containerStack) {
|
||||
return containerStack != null && FluidHelper.containsFluid(containerStack, getFluid());
|
||||
FluidStack fluidStackInContainer = FluidUtil.getFluidContained(containerStack);
|
||||
return fluidStackInContainer != null && fluidStackInContainer.getFluid() == getFluid();
|
||||
}
|
||||
|
||||
public static boolean areEqual(Fluid fluid, FluidStack fluidStack) {
|
||||
@@ -344,10 +246,19 @@ public enum Fluids {
|
||||
return Fluids.WATER.getColor();
|
||||
}
|
||||
|
||||
/** FluidBlock and Container registration */
|
||||
@Nonnull
|
||||
public EnumSet<EnumContainerType> getContainerTypes() {
|
||||
return EnumSet.noneOf(EnumContainerType.class);
|
||||
@Nullable
|
||||
public static Fluids getFluidDefinition(FluidStack fluidStack) {
|
||||
if (fluidStack != null) {
|
||||
Fluid fluid = fluidStack.getFluid();
|
||||
if (fluid != null) {
|
||||
Fluids fluidDefinition = tagToFluid.get(fluid.getName());
|
||||
if (fluidDefinition != null) {
|
||||
return fluidDefinition;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -367,7 +278,7 @@ public enum Fluids {
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the properties for an ItemLiquidContainer before it gets registered.
|
||||
* Get the properties for an ItemFluidContainerForestry before it gets registered.
|
||||
*/
|
||||
@Nullable
|
||||
public DrinkProperties getDrinkProperties() {
|
||||
|
||||
@@ -16,8 +16,8 @@ import net.minecraft.inventory.Container;
|
||||
import net.minecraft.inventory.IContainerListener;
|
||||
|
||||
import net.minecraftforge.fluids.FluidStack;
|
||||
import net.minecraftforge.fluids.IFluidHandler;
|
||||
import net.minecraftforge.fluids.IFluidTank;
|
||||
import net.minecraftforge.fluids.capability.IFluidHandler;
|
||||
|
||||
public interface ITankManager extends IFluidHandler {
|
||||
void containerAdded(Container container, IContainerListener crafter);
|
||||
@@ -28,6 +28,10 @@ public interface ITankManager extends IFluidHandler {
|
||||
|
||||
IFluidTank getTank(int tankIndex);
|
||||
|
||||
boolean canFillFluidType(FluidStack fluidStack);
|
||||
|
||||
boolean canDrainFluidType(FluidStack fluidStack);
|
||||
|
||||
/**
|
||||
* For updating tanks on the client
|
||||
*/
|
||||
|
||||
@@ -1,69 +0,0 @@
|
||||
/*******************************************************************************
|
||||
* Copyright (c) 2011-2014 SirSengir.
|
||||
* All rights reserved. This program and the accompanying materials
|
||||
* are made available under the terms of the GNU Lesser Public License v3
|
||||
* which accompanies this distribution, and is available at
|
||||
* http://www.gnu.org/licenses/lgpl-3.0.txt
|
||||
*
|
||||
* Various Contributors including, but not limited to:
|
||||
* SirSengir (original work), CovertJaguar, Player, Binnie, MysteriousAges
|
||||
******************************************************************************/
|
||||
package forestry.core.fluids;
|
||||
|
||||
import java.util.EnumMap;
|
||||
|
||||
import net.minecraft.init.Items;
|
||||
import net.minecraft.item.Item;
|
||||
import net.minecraft.item.ItemBucket;
|
||||
import net.minecraft.item.ItemStack;
|
||||
|
||||
import net.minecraftforge.fluids.FluidContainerRegistry;
|
||||
import net.minecraftforge.fluids.FluidContainerRegistry.FluidContainerData;
|
||||
import net.minecraftforge.fluids.FluidStack;
|
||||
import forestry.core.PluginFluids;
|
||||
import forestry.core.config.Constants;
|
||||
import forestry.core.items.EnumContainerType;
|
||||
import forestry.core.items.ItemLiquidContainer;
|
||||
import forestry.core.utils.Log;
|
||||
|
||||
public class LiquidRegistryHelper {
|
||||
|
||||
private static final EnumMap<EnumContainerType, ItemLiquidContainer> emptyContainers = new EnumMap<>(EnumContainerType.class);
|
||||
|
||||
static {
|
||||
emptyContainers.put(EnumContainerType.CAN, PluginFluids.items.canEmpty);
|
||||
emptyContainers.put(EnumContainerType.CAPSULE, PluginFluids.items.waxCapsuleEmpty);
|
||||
emptyContainers.put(EnumContainerType.REFRACTORY, PluginFluids.items.refractoryEmpty);
|
||||
}
|
||||
|
||||
public static void registerLiquidContainer(Fluids fluid, ItemStack filled) {
|
||||
Item item = filled.getItem();
|
||||
ItemStack empty = null;
|
||||
|
||||
if (item.getContainerItem() instanceof ItemBucket) {
|
||||
empty = new ItemStack(Items.BUCKET);
|
||||
} else if (item instanceof ItemLiquidContainer) {
|
||||
ItemLiquidContainer liquidContainer = (ItemLiquidContainer) item;
|
||||
EnumContainerType containerType = liquidContainer.getType();
|
||||
ItemLiquidContainer emptyContainer = emptyContainers.get(containerType);
|
||||
empty = emptyContainer.getItemStack();
|
||||
}
|
||||
|
||||
if (empty == null) {
|
||||
Log.warning("Unable to inject liquid container: " + filled);
|
||||
} else {
|
||||
registerLiquidContainer(fluid, Constants.BUCKET_VOLUME, filled, empty);
|
||||
}
|
||||
}
|
||||
|
||||
public static void registerLiquidContainer(Fluids fluid, int volume, ItemStack filled, ItemStack empty) {
|
||||
FluidStack contained = fluid.getFluid(volume);
|
||||
if (contained == null) {
|
||||
throw new IllegalArgumentException(String.format("Attempted to inject a liquid container for the non-existent liquid '%s'.", fluid));
|
||||
}
|
||||
|
||||
FluidContainerData container = new FluidContainerData(contained, filled, empty);
|
||||
FluidContainerRegistry.registerFluidContainer(container);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -14,6 +14,7 @@ import com.google.common.collect.HashBasedTable;
|
||||
import com.google.common.collect.Table;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
import javax.annotation.Nullable;
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
@@ -26,16 +27,16 @@ import net.minecraft.inventory.Container;
|
||||
import net.minecraft.inventory.IContainerListener;
|
||||
import net.minecraft.nbt.NBTTagCompound;
|
||||
import net.minecraft.nbt.NBTTagList;
|
||||
import net.minecraft.util.EnumFacing;
|
||||
|
||||
import net.minecraftforge.fluids.Fluid;
|
||||
import net.minecraftforge.fluids.FluidStack;
|
||||
import net.minecraftforge.fluids.FluidTankInfo;
|
||||
import net.minecraftforge.fluids.IFluidTank;
|
||||
import net.minecraftforge.fluids.capability.FluidTankPropertiesWrapper;
|
||||
import net.minecraftforge.fluids.capability.IFluidTankProperties;
|
||||
import net.minecraftforge.fluids.capability.templates.EmptyFluidHandler;
|
||||
|
||||
import forestry.api.core.INbtReadable;
|
||||
import forestry.api.core.INbtWritable;
|
||||
import forestry.core.fluids.tanks.FakeTank;
|
||||
import forestry.core.fluids.tanks.StandardTank;
|
||||
import forestry.core.network.DataInputStreamForestry;
|
||||
import forestry.core.network.DataOutputStreamForestry;
|
||||
@@ -206,14 +207,14 @@ public class TankManager implements ITankManager, ITankUpdateHandler, IStreamabl
|
||||
}
|
||||
|
||||
@Override
|
||||
public int fill(EnumFacing from, FluidStack resource, boolean doFill) {
|
||||
public int fill(FluidStack resource, boolean doFill) {
|
||||
for (StandardTank tank : tanks) {
|
||||
if (tankAcceptsFluid(tank, resource)) {
|
||||
return fill(tank.getTankIndex(), resource, doFill);
|
||||
}
|
||||
}
|
||||
|
||||
return FakeTank.INSTANCE.fill(resource, doFill);
|
||||
return EmptyFluidHandler.INSTANCE.fill(resource, doFill);
|
||||
}
|
||||
|
||||
public int fill(int tankIndex, FluidStack resource, boolean doFill) {
|
||||
@@ -222,7 +223,7 @@ public class TankManager implements ITankManager, ITankUpdateHandler, IStreamabl
|
||||
}
|
||||
|
||||
StandardTank tank = tanks.get(tankIndex);
|
||||
if (!tank.canBeFilledExternally()) {
|
||||
if (!tank.canFill()) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -250,14 +251,15 @@ public class TankManager implements ITankManager, ITankUpdateHandler, IStreamabl
|
||||
}
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
public FluidStack drain(EnumFacing from, int maxDrain, boolean doDrain) {
|
||||
public FluidStack drain(int maxDrain, boolean doDrain) {
|
||||
for (StandardTank tank : tanks) {
|
||||
if (tankCanDrain(tank)) {
|
||||
return drain(tank.getTankIndex(), maxDrain, doDrain);
|
||||
}
|
||||
}
|
||||
return FakeTank.INSTANCE.drain(maxDrain, doDrain);
|
||||
return EmptyFluidHandler.INSTANCE.drain(maxDrain, doDrain);
|
||||
}
|
||||
|
||||
public FluidStack drain(int tankIndex, int maxDrain, boolean doDrain) {
|
||||
@@ -266,7 +268,7 @@ public class TankManager implements ITankManager, ITankUpdateHandler, IStreamabl
|
||||
}
|
||||
|
||||
StandardTank tank = tanks.get(tankIndex);
|
||||
if (!tank.canBeDrainedExternally()) {
|
||||
if (!tank.canDrain()) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@@ -283,31 +285,12 @@ public class TankManager implements ITankManager, ITankUpdateHandler, IStreamabl
|
||||
}
|
||||
|
||||
@Override
|
||||
public FluidStack drain(EnumFacing from, FluidStack resource, boolean doDrain) {
|
||||
return drain(resource, doDrain);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canFill(EnumFacing from, Fluid fluid) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canDrain(EnumFacing from, Fluid fluid) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public FluidTankInfo[] getTankInfo(EnumFacing direction) {
|
||||
FluidTankInfo[] info = new FluidTankInfo[tanks.size()];
|
||||
public IFluidTankProperties[] getTankProperties() {
|
||||
IFluidTankProperties[] properties = new IFluidTankProperties[tanks.size()];
|
||||
for (int i = 0; i < tanks.size(); i++) {
|
||||
info[i] = tanks.get(i).getInfo();
|
||||
properties[i] = new FluidTankPropertiesWrapper(tanks.get(i));
|
||||
}
|
||||
return info;
|
||||
}
|
||||
|
||||
public FluidTankInfo[] getTankInfo() {
|
||||
return getTankInfo(null);
|
||||
return properties;
|
||||
}
|
||||
|
||||
public FluidTankInfo getTankInfo(int tankIndex) {
|
||||
@@ -322,13 +305,29 @@ public class TankManager implements ITankManager, ITankUpdateHandler, IStreamabl
|
||||
return tanks.get(tankIndex).getFluidAmount();
|
||||
}
|
||||
|
||||
public boolean accepts(Fluid fluid) {
|
||||
if (fluid == null) {
|
||||
@Override
|
||||
public boolean canFillFluidType(FluidStack fluidStack) {
|
||||
if (fluidStack == null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
for (StandardTank tank : tanks) {
|
||||
if (tank.accepts(fluid)) {
|
||||
if (tank.canFillFluidType(fluidStack)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canDrainFluidType(FluidStack fluidStack) {
|
||||
if (fluidStack == null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
for (StandardTank tank : tanks) {
|
||||
if (tank.canDrainFluidType(fluidStack)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -340,14 +339,14 @@ public class TankManager implements ITankManager, ITankUpdateHandler, IStreamabl
|
||||
if (fluidStack == null) {
|
||||
return false;
|
||||
}
|
||||
if (!tank.canBeFilledExternally()) {
|
||||
if (!tank.canFill()) {
|
||||
return false;
|
||||
}
|
||||
return tank.fill(fluidStack, false) > 0;
|
||||
}
|
||||
|
||||
private static boolean tankCanDrain(StandardTank tank) {
|
||||
if (!tank.canBeDrainedExternally()) {
|
||||
if (!tank.canDrain()) {
|
||||
return false;
|
||||
}
|
||||
FluidStack drained = tank.drain(1, false);
|
||||
|
||||
@@ -1,39 +0,0 @@
|
||||
/*******************************************************************************
|
||||
* Copyright (c) 2011-2014 SirSengir.
|
||||
* All rights reserved. This program and the accompanying materials
|
||||
* are made available under the terms of the GNU Lesser Public License v3
|
||||
* which accompanies this distribution, and is available at
|
||||
* http://www.gnu.org/licenses/lgpl-3.0.txt
|
||||
*
|
||||
* Various Contributors including, but not limited to:
|
||||
* SirSengir (original work), CovertJaguar, Player, Binnie, MysteriousAges
|
||||
******************************************************************************/
|
||||
package forestry.core.fluids.tanks;
|
||||
|
||||
import net.minecraftforge.fluids.FluidStack;
|
||||
import net.minecraftforge.fluids.FluidTankInfo;
|
||||
|
||||
/**
|
||||
* @author CovertJaguar <http://www.railcraft.info>
|
||||
*/
|
||||
public final class FakeTank extends StandardTank {
|
||||
|
||||
public static final FakeTank INSTANCE = new FakeTank();
|
||||
public static final FakeTank[] ARRAY = new FakeTank[]{INSTANCE};
|
||||
public static final FluidTankInfo[] INFO = new FluidTankInfo[]{INSTANCE.getInfo()};
|
||||
|
||||
private FakeTank() {
|
||||
super(1);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int fill(FluidStack resource, boolean doFill) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public FluidStack drain(int maxDrain, boolean doDrain) {
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -16,7 +16,6 @@ import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
|
||||
import net.minecraft.item.EnumRarity;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
import net.minecraft.util.text.TextFormatting;
|
||||
|
||||
import net.minecraftforge.fluids.Fluid;
|
||||
@@ -33,41 +32,38 @@ public class FilteredTank extends StandardTank {
|
||||
|
||||
private final Set<String> filters = new HashSet<>(); // FluidNames
|
||||
|
||||
public FilteredTank(int capacity, Fluid... filters) {
|
||||
this(capacity, Arrays.asList(filters), null);
|
||||
public FilteredTank(int capacity) {
|
||||
super(capacity);
|
||||
}
|
||||
|
||||
public FilteredTank(int capacity, Collection<Fluid> filters) {
|
||||
this(capacity, filters, null);
|
||||
public FilteredTank(int capacity, boolean canFill, boolean canDrain) {
|
||||
super(capacity, canFill, canDrain);
|
||||
}
|
||||
|
||||
public FilteredTank(int capacity, Collection<Fluid> filters, TileEntity tile) {
|
||||
super(capacity, tile);
|
||||
setFilters(filters);
|
||||
public FilteredTank setFilters(Fluid... filters) {
|
||||
return setFilters(Arrays.asList(filters));
|
||||
}
|
||||
|
||||
public void setFilters(Collection<Fluid> filters) {
|
||||
public FilteredTank setFilters(Collection<Fluid> filters) {
|
||||
this.filters.clear();
|
||||
for (Fluid fluid : filters) {
|
||||
this.filters.add(fluid.getName());
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int fill(FluidStack resource, boolean doFill) {
|
||||
if (liquidMatchesFilter(resource)) {
|
||||
return super.fill(resource, doFill);
|
||||
}
|
||||
return 0;
|
||||
public boolean canFillFluidType(FluidStack fluid) {
|
||||
return fluidMatchesFilter(fluid);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean accepts(Fluid fluid) {
|
||||
return filters.contains(fluid.getName());
|
||||
public boolean canDrainFluidType(FluidStack fluid) {
|
||||
return fluidMatchesFilter(fluid);
|
||||
}
|
||||
|
||||
private boolean liquidMatchesFilter(FluidStack resource) {
|
||||
if (resource == null || filters == null) {
|
||||
private boolean fluidMatchesFilter(FluidStack resource) {
|
||||
if (resource == null || resource.getFluid() == null) {
|
||||
return false;
|
||||
}
|
||||
return filters.contains(resource.getFluid().getName());
|
||||
|
||||
@@ -14,14 +14,12 @@ import javax.annotation.Nonnull;
|
||||
import java.io.IOException;
|
||||
|
||||
import net.minecraft.item.EnumRarity;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
|
||||
import net.minecraftforge.fluids.Fluid;
|
||||
import net.minecraftforge.fluids.FluidStack;
|
||||
import net.minecraftforge.fluids.FluidTank;
|
||||
|
||||
import forestry.core.fluids.FakeTankUpdateHandler;
|
||||
import forestry.core.fluids.FluidHelper;
|
||||
import forestry.core.fluids.ITankUpdateHandler;
|
||||
import forestry.core.fluids.TankManager;
|
||||
import forestry.core.gui.tooltips.ToolTip;
|
||||
@@ -34,37 +32,21 @@ import forestry.core.utils.Translator;
|
||||
* @author CovertJaguar <http://www.railcraft.info>
|
||||
*/
|
||||
public class StandardTank extends FluidTank implements IStreamable {
|
||||
// defines how the tank responds to IFluidHandler requests
|
||||
public enum TankMode {
|
||||
DEFAULT, OUTPUT, INPUT, INTERNAL
|
||||
}
|
||||
|
||||
public TankMode tankMode = TankMode.DEFAULT;
|
||||
private static final int DEFAULT_COLOR = 0xFFFFFF;
|
||||
@Nonnull
|
||||
private ITankUpdateHandler tankUpdateHandler = FakeTankUpdateHandler.instance;
|
||||
private int tankIndex;
|
||||
|
||||
public StandardTank(int capacity, boolean canFill, boolean canDrain) {
|
||||
super(capacity);
|
||||
setCanFill(canFill);
|
||||
setCanDrain(canDrain);
|
||||
}
|
||||
|
||||
public StandardTank(int capacity) {
|
||||
super(capacity);
|
||||
}
|
||||
|
||||
public StandardTank(FluidStack fluid, int capacity) {
|
||||
this(capacity);
|
||||
setFluid(fluid);
|
||||
}
|
||||
|
||||
public StandardTank(int capacity, TileEntity tile) {
|
||||
this(capacity);
|
||||
this.tile = tile;
|
||||
}
|
||||
|
||||
public StandardTank(FluidStack fluid, int capacity, TileEntity tile) {
|
||||
this(capacity);
|
||||
this.tile = tile;
|
||||
setFluid(fluid);
|
||||
}
|
||||
|
||||
public void setTankIndex(int index) {
|
||||
this.tankIndex = index;
|
||||
}
|
||||
@@ -102,75 +84,17 @@ public class StandardTank extends FluidTank implements IStreamable {
|
||||
}
|
||||
|
||||
@Override
|
||||
public int fill(final FluidStack resource, final boolean doFill) {
|
||||
if (resource == null) {
|
||||
return 0;
|
||||
}
|
||||
if (resource.amount <= 0) {
|
||||
return 0;
|
||||
}
|
||||
if (!accepts(resource.getFluid())) {
|
||||
return 0;
|
||||
}
|
||||
int filled = super.fill(resource, doFill);
|
||||
public int fillInternal(FluidStack resource, boolean doFill) {
|
||||
int filled = super.fillInternal(resource, doFill);
|
||||
if (doFill && filled > 0) {
|
||||
tankUpdateHandler.updateTankLevels(this);
|
||||
}
|
||||
return filled;
|
||||
}
|
||||
|
||||
public boolean accepts(Fluid fluid) {
|
||||
return fluid != null;
|
||||
}
|
||||
|
||||
@SuppressWarnings("incomplete-switch")
|
||||
public boolean canBeFilledExternally() {
|
||||
switch (tankMode) {
|
||||
case DEFAULT:
|
||||
case INPUT:
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@SuppressWarnings("incomplete-switch")
|
||||
public boolean canBeDrainedExternally() {
|
||||
switch (tankMode) {
|
||||
case DEFAULT:
|
||||
case OUTPUT:
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public boolean canFill(Fluid fluid, int amount) {
|
||||
if (fluid == null) {
|
||||
return false;
|
||||
}
|
||||
FluidStack fluidStack = new FluidStack(fluid, amount);
|
||||
return canFill(fluidStack);
|
||||
}
|
||||
|
||||
public boolean canFill(FluidStack fluidStack) {
|
||||
return fill(fluidStack, false) == fluidStack.amount;
|
||||
}
|
||||
|
||||
public boolean canDrain(int amount) {
|
||||
FluidStack drained = drain(amount, false);
|
||||
return drained != null && drained.amount == amount;
|
||||
}
|
||||
|
||||
public boolean canDrain(FluidStack toDrain) {
|
||||
FluidStack drained = drain(toDrain.amount, false);
|
||||
return FluidHelper.areFluidStacksEqual(drained, toDrain);
|
||||
}
|
||||
|
||||
@Override
|
||||
public FluidStack drain(int maxDrain, boolean doDrain) {
|
||||
if (maxDrain <= 0) {
|
||||
return null;
|
||||
}
|
||||
FluidStack drained = super.drain(maxDrain, doDrain);
|
||||
public FluidStack drainInternal(int maxDrain, boolean doDrain) {
|
||||
FluidStack drained = super.drainInternal(maxDrain, doDrain);
|
||||
if (doDrain && drained != null && drained.amount > 0) {
|
||||
tankUpdateHandler.updateTankLevels(this);
|
||||
}
|
||||
|
||||
@@ -17,19 +17,19 @@ public class GenericRatings {
|
||||
|
||||
public static String rateMetabolism(int metabolism) {
|
||||
if (metabolism >= 19) {
|
||||
return Translator.translateToLocal("Forestry.allele.highest");
|
||||
return Translator.translateToLocal("forestry.allele.highest");
|
||||
} else if (metabolism >= 16) {
|
||||
return Translator.translateToLocal("Forestry.allele.higher");
|
||||
return Translator.translateToLocal("forestry.allele.higher");
|
||||
} else if (metabolism >= 13) {
|
||||
return Translator.translateToLocal("Forestry.allele.high");
|
||||
return Translator.translateToLocal("forestry.allele.high");
|
||||
} else if (metabolism >= 10) {
|
||||
return Translator.translateToLocal("Forestry.allele.average");
|
||||
return Translator.translateToLocal("forestry.allele.average");
|
||||
} else if (metabolism >= 7) {
|
||||
return Translator.translateToLocal("Forestry.allele.slow");
|
||||
return Translator.translateToLocal("forestry.allele.slow");
|
||||
} else if (metabolism >= 4) {
|
||||
return Translator.translateToLocal("Forestry.allele.slower");
|
||||
return Translator.translateToLocal("forestry.allele.slower");
|
||||
} else {
|
||||
return Translator.translateToLocal("Forestry.allele.slowest");
|
||||
return Translator.translateToLocal("forestry.allele.slowest");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -9,9 +9,9 @@ import forestry.core.utils.Translator;
|
||||
* For example, temperature tolerances or speeds are categories with several values.
|
||||
*
|
||||
* This class helps localization by allowing specific names like
|
||||
* Forestry.allele.speed.fast
|
||||
* forestry.allele.speed.fast
|
||||
* and can fall back on generic names like
|
||||
* Forestry.allele.fast
|
||||
* forestry.allele.fast
|
||||
*/
|
||||
public abstract class AlleleCategorized extends Allele {
|
||||
protected AlleleCategorized(String modId, String category, String valueName, boolean isDominant) {
|
||||
|
||||
@@ -17,6 +17,7 @@ import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
|
||||
import net.minecraftforge.fluids.FluidStack;
|
||||
import net.minecraftforge.fluids.FluidTank;
|
||||
import net.minecraftforge.fluids.IFluidTank;
|
||||
|
||||
import forestry.api.core.IToolPipette;
|
||||
@@ -60,17 +61,21 @@ public class ContainerLiquidTanksHelper<T extends TileEntity & ILiquidTankTile>
|
||||
|
||||
if (pipette.canPipette(itemstack) && liquidAmount > 0) {
|
||||
if (liquidAmount > 0) {
|
||||
FluidStack fillAmount = tank.drain(1000, false);
|
||||
int filled = pipette.fill(itemstack, fillAmount, true);
|
||||
tank.drain(filled, true);
|
||||
player.updateHeldItem();
|
||||
if (tank instanceof FluidTank) {
|
||||
FluidStack fillAmount = ((FluidTank) tank).drainInternal(1000, false);
|
||||
int filled = pipette.fill(itemstack, fillAmount, true);
|
||||
tank.drain(filled, true);
|
||||
player.updateHeldItem();
|
||||
}
|
||||
}
|
||||
} else {
|
||||
FluidStack potential = pipette.drain(itemstack, pipette.getCapacity(itemstack), false);
|
||||
if (potential != null) {
|
||||
int fill = tank.fill(potential, true);
|
||||
pipette.drain(itemstack, fill, true);
|
||||
player.updateHeldItem();
|
||||
if (tank instanceof FluidTank) {
|
||||
int fill = ((FluidTank) tank).fillInternal(potential, true);
|
||||
pipette.drain(itemstack, fill, true);
|
||||
player.updateHeldItem();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -51,8 +51,6 @@ public class GuiAlyzer extends GuiForestry<ContainerAlyzer, IInventory> {
|
||||
public static final int COLUMN_1 = 90;
|
||||
public static final int COLUMN_2 = 155;
|
||||
|
||||
protected final Map<String, ItemStack> iconStacks = new HashMap<>();
|
||||
|
||||
public GuiAlyzer(EntityPlayer player, ItemInventoryAlyzer inventory) {
|
||||
super(Constants.TEXTURE_PATH_GUI + "/portablealyzer.png", new ContainerAlyzer(inventory, player), inventory);
|
||||
|
||||
@@ -104,6 +102,8 @@ public class GuiAlyzer extends GuiForestry<ContainerAlyzer, IInventory> {
|
||||
textLayout.drawLine(text0, textLayout.column0);
|
||||
int columnwidth = textLayout.column2 - textLayout.column1 - 2;
|
||||
|
||||
Map<String, ItemStack> iconStacks = chromosome.getSpeciesRoot().getAlyzerPlugin().getIconStacks();
|
||||
|
||||
GuiUtil.drawItemStack(this, iconStacks.get(primary.getUID()), guiLeft + textLayout.column1 + columnwidth - 20, guiTop + 10);
|
||||
GuiUtil.drawItemStack(this, iconStacks.get(secondary.getUID()), guiLeft + textLayout.column2 + columnwidth - 20, guiTop + 10);
|
||||
|
||||
@@ -335,6 +335,8 @@ public class GuiAlyzer extends GuiForestry<ContainerAlyzer, IInventory> {
|
||||
|
||||
public void drawMutationInfo(IMutation combination, IAllele species, int x, IBreedingTracker breedingTracker) {
|
||||
|
||||
Map<String, ItemStack> iconStacks = combination.getRoot().getAlyzerPlugin().getIconStacks();
|
||||
|
||||
ItemStack partnerBee = iconStacks.get(combination.getPartner(species).getUID());
|
||||
widgetManager.add(new ItemStackWidget(widgetManager, x, textLayout.getLineY(), partnerBee));
|
||||
|
||||
|
||||
@@ -13,12 +13,12 @@ package forestry.core.inventory;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.util.EnumFacing;
|
||||
|
||||
import net.minecraftforge.fluids.Fluid;
|
||||
import net.minecraftforge.fluids.FluidStack;
|
||||
import net.minecraftforge.fluids.FluidUtil;
|
||||
|
||||
import forestry.api.arboriculture.TreeManager;
|
||||
import forestry.api.core.ForestryAPI;
|
||||
import forestry.api.genetics.AlleleManager;
|
||||
import forestry.core.fluids.FluidHelper;
|
||||
import forestry.core.tiles.TileAnalyzer;
|
||||
import forestry.core.utils.GeneticsUtil;
|
||||
import forestry.core.utils.SlotUtil;
|
||||
@@ -41,8 +41,8 @@ public class InventoryAnalyzer extends InventoryAdapterTile<TileAnalyzer> {
|
||||
if (SlotUtil.isSlotInRange(slotIndex, SLOT_INPUT_1, SLOT_INPUT_COUNT)) {
|
||||
return AlleleManager.alleleRegistry.isIndividual(itemStack) || GeneticsUtil.getGeneticEquivalent(itemStack) != null;
|
||||
} else if (slotIndex == SLOT_CAN) {
|
||||
Fluid fluid = FluidHelper.getFluidInContainer(itemStack);
|
||||
return tile.getTankManager().accepts(fluid);
|
||||
FluidStack fluid = FluidUtil.getFluidContained(itemStack);
|
||||
return tile.getTankManager().canFillFluidType(fluid);
|
||||
}
|
||||
|
||||
return false;
|
||||
|
||||
@@ -0,0 +1,51 @@
|
||||
package forestry.core.items;
|
||||
|
||||
import net.minecraft.item.ItemStack;
|
||||
|
||||
import net.minecraftforge.fluids.Fluid;
|
||||
import net.minecraftforge.fluids.FluidStack;
|
||||
import net.minecraftforge.fluids.capability.templates.FluidHandlerItemStackSimple;
|
||||
|
||||
public class FluidHandlerItemForestry extends FluidHandlerItemStackSimple.Consumable {
|
||||
private final EnumContainerType containerType;
|
||||
|
||||
public FluidHandlerItemForestry(ItemStack container, EnumContainerType containerType) {
|
||||
super(container, Fluid.BUCKET_VOLUME);
|
||||
this.containerType = containerType;
|
||||
}
|
||||
|
||||
private boolean contentsAllowed(FluidStack fluidStack) {
|
||||
if (fluidStack == null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
Fluid fluid = fluidStack.getFluid();
|
||||
if (fluid == null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
switch (containerType) {
|
||||
case CAPSULE:
|
||||
return fluid.getTemperature(fluidStack) < 310.15; // melting point of wax in kelvin
|
||||
default:
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canFillFluidType(FluidStack fluid) {
|
||||
return contentsAllowed(fluid);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canDrainFluidType(FluidStack fluid) {
|
||||
return contentsAllowed(fluid);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void setFluid(FluidStack fluid) {
|
||||
super.setFluid(fluid);
|
||||
container.setItemDamage(1); // show the filled container model
|
||||
}
|
||||
}
|
||||
|
||||
@@ -36,7 +36,7 @@ public class ItemArmorNaturalist extends ItemArmor implements IArmorNaturalist,
|
||||
|
||||
@Override
|
||||
public String getArmorTexture(ItemStack stack, Entity entity, EntityEquipmentSlot slot, String type) {
|
||||
return Constants.RESOURCE_ID + ":" + Constants.TEXTURE_NATURALIST_ARMOR_PRIMARY;
|
||||
return Constants.MOD_ID + ":" + Constants.TEXTURE_NATURALIST_ARMOR_PRIMARY;
|
||||
}
|
||||
|
||||
@SideOnly(Side.CLIENT)
|
||||
|
||||
@@ -58,18 +58,20 @@ public class ItemBlockForestry<B extends Block> extends ItemBlock {
|
||||
public boolean placeBlockAt(ItemStack stack, EntityPlayer player, World world, BlockPos pos, EnumFacing side, float hitX, float hitY, float hitZ, IBlockState newState) {
|
||||
boolean placed = super.placeBlockAt(stack, player, world, pos, side, hitX, hitY, hitZ, newState);
|
||||
|
||||
if (block.hasTileEntity(newState)) {
|
||||
if (stack.getItem() instanceof ItemBlockNBT && stack.hasTagCompound()) {
|
||||
TileForestry tile = TileUtil.getTile(world, pos, TileForestry.class);
|
||||
if (tile != null) {
|
||||
tile.readFromNBT(stack.getTagCompound());
|
||||
tile.setPos(pos);
|
||||
if (placed) {
|
||||
if (block.hasTileEntity(newState)) {
|
||||
if (stack.getItem() instanceof ItemBlockNBT && stack.hasTagCompound()) {
|
||||
TileForestry tile = TileUtil.getTile(world, pos, TileForestry.class);
|
||||
if (tile != null) {
|
||||
tile.readFromNBT(stack.getTagCompound());
|
||||
tile.setPos(pos);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (block instanceof BlockBase) {
|
||||
((BlockBase) block).rotateAfterPlacement(player, world, pos, side);
|
||||
if (block instanceof BlockBase) {
|
||||
((BlockBase) block).rotateAfterPlacement(player, world, pos, side);
|
||||
}
|
||||
}
|
||||
|
||||
return placed;
|
||||
|
||||
@@ -0,0 +1,195 @@
|
||||
/*******************************************************************************
|
||||
* Copyright (c) 2011-2014 SirSengir.
|
||||
* All rights reserved. This program and the accompanying materials
|
||||
* are made available under the terms of the GNU Lesser Public License v3
|
||||
* which accompanies this distribution, and is available at
|
||||
* http://www.gnu.org/licenses/lgpl-3.0.txt
|
||||
*
|
||||
* Various Contributors including, but not limited to:
|
||||
* SirSengir (original work), CovertJaguar, Player, Binnie, MysteriousAges
|
||||
******************************************************************************/
|
||||
package forestry.core.items;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
|
||||
import forestry.core.fluids.Fluids;
|
||||
import net.minecraft.creativetab.CreativeTabs;
|
||||
import net.minecraft.entity.EntityLivingBase;
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.init.SoundEvents;
|
||||
import net.minecraft.item.EnumAction;
|
||||
import net.minecraft.item.Item;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.nbt.NBTTagCompound;
|
||||
|
||||
import net.minecraft.stats.StatList;
|
||||
import net.minecraft.util.ActionResult;
|
||||
import net.minecraft.util.EnumActionResult;
|
||||
import net.minecraft.util.EnumHand;
|
||||
import net.minecraft.util.FoodStats;
|
||||
import net.minecraft.util.SoundCategory;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraftforge.common.capabilities.ICapabilityProvider;
|
||||
import net.minecraftforge.fluids.Fluid;
|
||||
import net.minecraftforge.fluids.FluidRegistry;
|
||||
import net.minecraftforge.fluids.FluidStack;
|
||||
import net.minecraftforge.fluids.capability.IFluidHandler;
|
||||
import net.minecraftforge.fml.relauncher.Side;
|
||||
import net.minecraftforge.fml.relauncher.SideOnly;
|
||||
|
||||
import forestry.api.core.IModelManager;
|
||||
import forestry.core.CreativeTabForestry;
|
||||
import forestry.core.utils.Translator;
|
||||
|
||||
public class ItemFluidContainerForestry extends ItemForestry implements IColoredItem {
|
||||
private final EnumContainerType type;
|
||||
|
||||
public ItemFluidContainerForestry(EnumContainerType type) {
|
||||
super(CreativeTabForestry.tabForestry);
|
||||
this.type = type;
|
||||
}
|
||||
|
||||
/* Models */
|
||||
@SideOnly(Side.CLIENT)
|
||||
@Override
|
||||
public void registerModel(Item item, IModelManager manager) {
|
||||
manager.registerItemModel(item, 0, "liquids/" + type.toString().toLowerCase(Locale.ENGLISH) + "_empty");
|
||||
manager.registerItemModel(item, 1, "liquids/" + type.toString().toLowerCase(Locale.ENGLISH));
|
||||
}
|
||||
|
||||
@SideOnly(Side.CLIENT)
|
||||
@Override
|
||||
public void getSubItems(Item itemIn, CreativeTabs tab, List<ItemStack> subItems) {
|
||||
// empty
|
||||
subItems.add(new ItemStack(itemIn));
|
||||
|
||||
// filled
|
||||
for (Fluid fluid : FluidRegistry.getRegisteredFluids().values()) {
|
||||
ItemStack itemStack = new ItemStack(itemIn);
|
||||
IFluidHandler fluidHandler = new FluidHandlerItemForestry(itemStack, type);
|
||||
if (fluidHandler.fill(new FluidStack(fluid, Fluid.BUCKET_VOLUME), true) == Fluid.BUCKET_VOLUME) {
|
||||
subItems.add(itemStack);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getColorFromItemstack(ItemStack itemStack, int tintIndex) {
|
||||
if (tintIndex > 0) {
|
||||
FluidStack fluidStack = getContained(itemStack);
|
||||
return Fluids.getFluidColor(fluidStack).getRGB();
|
||||
} else {
|
||||
return 0xffffff;
|
||||
}
|
||||
}
|
||||
|
||||
public EnumContainerType getType() {
|
||||
return type;
|
||||
}
|
||||
|
||||
protected FluidStack getContained(ItemStack itemStack) {
|
||||
if (itemStack.stackSize != 1) {
|
||||
itemStack = itemStack.copy();
|
||||
itemStack.stackSize = 1;
|
||||
}
|
||||
IFluidHandler fluidHandler = new FluidHandlerItemForestry(itemStack, type);
|
||||
return fluidHandler.drain(Integer.MAX_VALUE, false);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getItemStackDisplayName(ItemStack stack) {
|
||||
Item item = stack.getItem();
|
||||
if (item instanceof ItemFluidContainerForestry) {
|
||||
FluidStack fluid = getContained(stack);
|
||||
if (fluid != null) {
|
||||
String exactTranslationKey = "item.for." + type.getName() + '.' + fluid.getFluid().getName() + ".name";
|
||||
if (Translator.canTranslateToLocal(exactTranslationKey)) {
|
||||
return Translator.translateToLocal(exactTranslationKey);
|
||||
} else {
|
||||
String grammarKey = "item.for." + type.getName() + ".grammar";
|
||||
return Translator.translateToLocalFormatted(grammarKey, fluid.getLocalizedName());
|
||||
}
|
||||
} else {
|
||||
String unlocalizedname = "item.for." + type.getName() + ".empty.name";
|
||||
return Translator.translateToLocal(unlocalizedname);
|
||||
}
|
||||
}
|
||||
return super.getItemStackDisplayName(stack);
|
||||
}
|
||||
|
||||
/** DRINKS */
|
||||
@Override
|
||||
public ItemStack onItemUseFinish(ItemStack stack, World worldIn, EntityLivingBase entityLiving) {
|
||||
DrinkProperties drinkProperties = getDrinkProperties(stack);
|
||||
if (drinkProperties != null) {
|
||||
if (entityLiving instanceof EntityPlayer && !((EntityPlayer) entityLiving).capabilities.isCreativeMode) {
|
||||
EntityPlayer player = (EntityPlayer) entityLiving;
|
||||
if (!player.capabilities.isCreativeMode) {
|
||||
--stack.stackSize;
|
||||
}
|
||||
|
||||
if (!worldIn.isRemote) {
|
||||
FoodStats foodStats = player.getFoodStats();
|
||||
foodStats.addStats(drinkProperties.getHealAmount(), drinkProperties.getSaturationModifier());
|
||||
worldIn.playSound((EntityPlayer) null, player.posX, player.posY, player.posZ, SoundEvents.ENTITY_PLAYER_BURP, SoundCategory.PLAYERS, 0.5F, worldIn.rand.nextFloat() * 0.1F + 0.9F);
|
||||
}
|
||||
|
||||
player.addStat(StatList.getObjectUseStats(this));
|
||||
}
|
||||
}
|
||||
return stack;
|
||||
}
|
||||
|
||||
protected DrinkProperties getDrinkProperties(ItemStack itemStack) {
|
||||
FluidStack contained = getContained(itemStack);
|
||||
if (contained != null) {
|
||||
Fluids definition = Fluids.getFluidDefinition(contained);
|
||||
if (definition != null) {
|
||||
return definition.getDrinkProperties();
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getMaxItemUseDuration(ItemStack itemstack) {
|
||||
DrinkProperties drinkProperties = getDrinkProperties(itemstack);
|
||||
if (drinkProperties != null) {
|
||||
return drinkProperties.getMaxItemUseDuration();
|
||||
} else {
|
||||
return super.getMaxItemUseDuration(itemstack);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public EnumAction getItemUseAction(ItemStack itemstack) {
|
||||
DrinkProperties drinkProperties = getDrinkProperties(itemstack);
|
||||
if (drinkProperties != null) {
|
||||
return EnumAction.DRINK;
|
||||
} else {
|
||||
return EnumAction.NONE;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public ActionResult<ItemStack> onItemRightClick(ItemStack itemStackIn, World worldIn, EntityPlayer playerIn, EnumHand hand) {
|
||||
DrinkProperties drinkProperties = getDrinkProperties(itemStackIn);
|
||||
if (drinkProperties != null) {
|
||||
if (playerIn.canEat(false)) {
|
||||
playerIn.setActiveHand(hand);
|
||||
return new ActionResult<>(EnumActionResult.SUCCESS, itemStackIn);
|
||||
} else {
|
||||
return new ActionResult<>(EnumActionResult.FAIL, itemStackIn);
|
||||
}
|
||||
} else {
|
||||
return super.onItemRightClick(itemStackIn, worldIn, playerIn, hand);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public ICapabilityProvider initCapabilities(ItemStack stack, NBTTagCompound nbt)
|
||||
{
|
||||
return new FluidHandlerItemForestry(stack, type);
|
||||
}
|
||||
}
|
||||
@@ -1,176 +0,0 @@
|
||||
/*******************************************************************************
|
||||
* Copyright (c) 2011-2014 SirSengir.
|
||||
* All rights reserved. This program and the accompanying materials
|
||||
* are made available under the terms of the GNU Lesser Public License v3
|
||||
* which accompanies this distribution, and is available at
|
||||
* http://www.gnu.org/licenses/lgpl-3.0.txt
|
||||
*
|
||||
* Various Contributors including, but not limited to:
|
||||
* SirSengir (original work), CovertJaguar, Player, Binnie, MysteriousAges
|
||||
******************************************************************************/
|
||||
package forestry.core.items;
|
||||
|
||||
import java.util.Locale;
|
||||
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.init.Blocks;
|
||||
import net.minecraft.item.Item;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.util.ActionResult;
|
||||
import net.minecraft.util.EnumActionResult;
|
||||
import net.minecraft.util.EnumHand;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.util.math.RayTraceResult;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
import net.minecraftforge.fluids.FluidRegistry;
|
||||
import net.minecraftforge.fluids.FluidStack;
|
||||
import net.minecraftforge.fluids.IFluidBlock;
|
||||
import net.minecraftforge.fml.relauncher.Side;
|
||||
import net.minecraftforge.fml.relauncher.SideOnly;
|
||||
|
||||
import forestry.api.core.IModelManager;
|
||||
import forestry.core.CreativeTabForestry;
|
||||
import forestry.core.fluids.FluidHelper;
|
||||
import forestry.core.proxy.Proxies;
|
||||
import forestry.core.utils.Translator;
|
||||
|
||||
public class ItemLiquidContainer extends ItemForestry implements IColoredItem {
|
||||
private final EnumContainerType type;
|
||||
private final int color;
|
||||
|
||||
public ItemLiquidContainer(EnumContainerType type, int color) {
|
||||
super(CreativeTabForestry.tabForestry);
|
||||
this.type = type;
|
||||
this.color = color;
|
||||
}
|
||||
|
||||
private static int getMatchingSlot(EntityPlayer player, ItemStack stack) {
|
||||
|
||||
for (int slot = 0; slot < player.inventory.mainInventory.length; slot++) {
|
||||
ItemStack slotStack = player.inventory.getStackInSlot(slot);
|
||||
|
||||
if (slotStack == null) {
|
||||
return slot;
|
||||
}
|
||||
|
||||
if (!slotStack.isItemEqual(stack)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
int space = slotStack.getMaxStackSize() - slotStack.stackSize;
|
||||
if (space >= stack.stackSize) {
|
||||
return slot;
|
||||
}
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ActionResult<ItemStack> onItemRightClick(ItemStack itemStackIn, World worldIn, EntityPlayer playerIn, EnumHand hand) {
|
||||
if (worldIn.isRemote) {
|
||||
return ActionResult.newResult(EnumActionResult.PASS, itemStackIn);
|
||||
}
|
||||
|
||||
RayTraceResult rayTraceResult = this.rayTrace(worldIn, playerIn, true);
|
||||
if (rayTraceResult == null || rayTraceResult.typeOfHit != RayTraceResult.Type.BLOCK) {
|
||||
return ActionResult.newResult(EnumActionResult.PASS, itemStackIn);
|
||||
}
|
||||
|
||||
BlockPos pos = rayTraceResult.getBlockPos();
|
||||
Block targetedBlock = worldIn.getBlockState(pos).getBlock();
|
||||
|
||||
FluidStack fluid = null;
|
||||
|
||||
if (targetedBlock instanceof IFluidBlock) {
|
||||
fluid = ((IFluidBlock) targetedBlock).drain(worldIn, pos, false);
|
||||
} else {
|
||||
if (targetedBlock == Blocks.WATER || targetedBlock == Blocks.FLOWING_WATER) {
|
||||
fluid = new FluidStack(FluidRegistry.WATER, 1000);
|
||||
} else if (targetedBlock == Blocks.LAVA || targetedBlock == Blocks.FLOWING_LAVA) {
|
||||
fluid = new FluidStack(FluidRegistry.LAVA, 1000);
|
||||
}
|
||||
}
|
||||
|
||||
if (fluid == null) {
|
||||
return ActionResult.newResult(EnumActionResult.FAIL, itemStackIn);
|
||||
}
|
||||
|
||||
ItemStack filledContainer = FluidHelper.getFilledContainer(fluid.getFluid(), itemStackIn);
|
||||
if (filledContainer == null) {
|
||||
return ActionResult.newResult(EnumActionResult.FAIL, itemStackIn);
|
||||
}
|
||||
|
||||
// Search for a slot to stow a filled container in player's
|
||||
// inventory
|
||||
int slot = getMatchingSlot(playerIn, filledContainer);
|
||||
if (slot < 0) {
|
||||
return ActionResult.newResult(EnumActionResult.FAIL, itemStackIn);
|
||||
}
|
||||
|
||||
if (playerIn.inventory.getStackInSlot(slot) == null) {
|
||||
playerIn.inventory.setInventorySlotContents(slot, filledContainer.copy());
|
||||
} else {
|
||||
playerIn.inventory.getStackInSlot(slot).stackSize++;
|
||||
}
|
||||
|
||||
// Remove consumed liquid block in world
|
||||
if (targetedBlock instanceof IFluidBlock) {
|
||||
((IFluidBlock) targetedBlock).drain(worldIn, pos, true);
|
||||
} else {
|
||||
worldIn.setBlockToAir(pos);
|
||||
}
|
||||
|
||||
// Remove consumed empty container
|
||||
itemStackIn.stackSize--;
|
||||
|
||||
// Notify player that his inventory has changed.
|
||||
Proxies.net.inventoryChangeNotify(playerIn);
|
||||
|
||||
return ActionResult.newResult(EnumActionResult.SUCCESS, itemStackIn);
|
||||
}
|
||||
|
||||
/* Models */
|
||||
@SideOnly(Side.CLIENT)
|
||||
@Override
|
||||
public void registerModel(Item item, IModelManager manager) {
|
||||
if(color == 0){
|
||||
manager.registerItemModel(item, 0, "liquids/" + type.toString().toLowerCase(Locale.ENGLISH)+ "_empty");
|
||||
}else{
|
||||
manager.registerItemModel(item, 0, "liquids/" + type.toString().toLowerCase(Locale.ENGLISH));
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getColorFromItemstack(ItemStack itemstack, int j) {
|
||||
if (j > 0) {
|
||||
return color;
|
||||
} else {
|
||||
return 0xffffff;
|
||||
}
|
||||
}
|
||||
|
||||
public EnumContainerType getType() {
|
||||
return type;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getItemStackDisplayName(ItemStack stack) {
|
||||
Item item = stack.getItem();
|
||||
if (item instanceof ItemLiquidContainer) {
|
||||
FluidStack fluid = FluidHelper.getFluidStackInContainer(stack);
|
||||
if (fluid != null) {
|
||||
String exactTranslationKey = "item.for." + type.getName() + '.' + fluid.getFluid().getName() + ".name";
|
||||
if (Translator.canTranslateToLocal(exactTranslationKey)) {
|
||||
return Translator.translateToLocal(exactTranslationKey);
|
||||
} else {
|
||||
String grammarKey = "item.for." + type.getName() + ".grammar";
|
||||
return Translator.translateToLocalFormatted(grammarKey, fluid.getLocalizedName());
|
||||
}
|
||||
}
|
||||
}
|
||||
return super.getItemStackDisplayName(stack);
|
||||
}
|
||||
}
|
||||
@@ -1,63 +0,0 @@
|
||||
package forestry.core.items;
|
||||
|
||||
import net.minecraft.entity.EntityLivingBase;
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.init.SoundEvents;
|
||||
import net.minecraft.item.EnumAction;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.stats.StatList;
|
||||
import net.minecraft.util.ActionResult;
|
||||
import net.minecraft.util.EnumActionResult;
|
||||
import net.minecraft.util.EnumHand;
|
||||
import net.minecraft.util.FoodStats;
|
||||
import net.minecraft.util.SoundCategory;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
public class ItemLiquidContainerDrinkable extends ItemLiquidContainer {
|
||||
private final DrinkProperties properties;
|
||||
|
||||
public ItemLiquidContainerDrinkable(EnumContainerType type, int color, DrinkProperties properties) {
|
||||
super(type, color);
|
||||
this.properties = properties;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ItemStack onItemUseFinish(ItemStack stack, World worldIn, EntityLivingBase entityLiving) {
|
||||
if (entityLiving instanceof EntityPlayer && !((EntityPlayer)entityLiving).capabilities.isCreativeMode) {
|
||||
EntityPlayer player = (EntityPlayer) entityLiving;
|
||||
if (!player.capabilities.isCreativeMode) {
|
||||
--stack.stackSize;
|
||||
}
|
||||
|
||||
if (!worldIn.isRemote) {
|
||||
FoodStats foodStats = player.getFoodStats();
|
||||
foodStats.addStats(properties.getHealAmount(), properties.getSaturationModifier());
|
||||
worldIn.playSound((EntityPlayer)null, player.posX, player.posY, player.posZ, SoundEvents.ENTITY_PLAYER_BURP, SoundCategory.PLAYERS, 0.5F, worldIn.rand.nextFloat() * 0.1F + 0.9F);
|
||||
}
|
||||
|
||||
player.addStat(StatList.getObjectUseStats(this));
|
||||
}
|
||||
|
||||
return stack;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getMaxItemUseDuration(ItemStack itemstack) {
|
||||
return properties.getMaxItemUseDuration();
|
||||
}
|
||||
|
||||
@Override
|
||||
public EnumAction getItemUseAction(ItemStack itemstack) {
|
||||
return EnumAction.DRINK;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ActionResult<ItemStack> onItemRightClick(ItemStack itemStackIn, World worldIn, EntityPlayer playerIn, EnumHand hand) {
|
||||
if (playerIn.canEat(false)) {
|
||||
playerIn.setActiveHand(hand);
|
||||
return new ActionResult<>(EnumActionResult.SUCCESS, itemStackIn);
|
||||
} else {
|
||||
return new ActionResult<>(EnumActionResult.FAIL, itemStackIn);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -20,6 +20,7 @@ import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.nbt.NBTTagCompound;
|
||||
import net.minecraft.util.ResourceLocation;
|
||||
|
||||
import net.minecraftforge.fluids.Fluid;
|
||||
import net.minecraftforge.fluids.FluidStack;
|
||||
import net.minecraftforge.fluids.IFluidContainerItem;
|
||||
import net.minecraftforge.fml.relauncher.Side;
|
||||
@@ -27,7 +28,6 @@ import net.minecraftforge.fml.relauncher.SideOnly;
|
||||
|
||||
import forestry.api.core.IModelManager;
|
||||
import forestry.api.core.IToolPipette;
|
||||
import forestry.core.config.Constants;
|
||||
import forestry.core.fluids.PipetteContents;
|
||||
|
||||
public class ItemPipette extends ItemForestry implements IToolPipette, IFluidContainerItem {
|
||||
@@ -163,6 +163,6 @@ public class ItemPipette extends ItemForestry implements IToolPipette, IFluidCon
|
||||
|
||||
@Override
|
||||
public int getCapacity(ItemStack pipette) {
|
||||
return Constants.BUCKET_VOLUME;
|
||||
return Fluid.BUCKET_VOLUME;
|
||||
}
|
||||
}
|
||||
@@ -10,51 +10,36 @@
|
||||
******************************************************************************/
|
||||
package forestry.core.items;
|
||||
|
||||
import com.google.common.collect.HashBasedTable;
|
||||
import com.google.common.collect.Table;
|
||||
import java.util.EnumMap;
|
||||
import java.util.Map;
|
||||
|
||||
import forestry.core.fluids.Fluids;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraftforge.fluids.FluidUtil;
|
||||
import net.minecraftforge.fluids.capability.IFluidHandler;
|
||||
|
||||
public class ItemRegistryFluids extends ItemRegistry {
|
||||
public final ItemLiquidContainer canEmpty;
|
||||
public final ItemLiquidContainer waxCapsuleEmpty;
|
||||
public final ItemLiquidContainer refractoryEmpty;
|
||||
public final ItemFluidContainerForestry canEmpty;
|
||||
public final ItemFluidContainerForestry waxCapsuleEmpty;
|
||||
public final ItemFluidContainerForestry refractoryEmpty;
|
||||
|
||||
private final Table<EnumContainerType, String, ItemLiquidContainer> containers = HashBasedTable.create();
|
||||
private final Map<EnumContainerType, ItemFluidContainerForestry> containers = new EnumMap<>(EnumContainerType.class);
|
||||
|
||||
public ItemLiquidContainer getContainer(EnumContainerType type, Fluids fluid) {
|
||||
return containers.get(type, fluid.getFluid().getName());
|
||||
public ItemStack getContainer(EnumContainerType type, Fluids fluid) {
|
||||
ItemStack container = new ItemStack(containers.get(type));
|
||||
IFluidHandler fluidHandler = FluidUtil.getFluidHandler(container);
|
||||
fluidHandler.fill(fluid.getFluid(Integer.MAX_VALUE), true);
|
||||
return container;
|
||||
}
|
||||
|
||||
public ItemRegistryFluids() {
|
||||
canEmpty = registerEmptyContainer(EnumContainerType.CAN, "can.empty");
|
||||
waxCapsuleEmpty = registerEmptyContainer(EnumContainerType.CAPSULE, "capsule.empty");
|
||||
refractoryEmpty = registerEmptyContainer(EnumContainerType.REFRACTORY, "refractory.empty");
|
||||
canEmpty = registerItem(new ItemFluidContainerForestry(EnumContainerType.CAN), "can");
|
||||
waxCapsuleEmpty = registerItem(new ItemFluidContainerForestry(EnumContainerType.CAPSULE), "capsule");
|
||||
refractoryEmpty = registerItem(new ItemFluidContainerForestry(EnumContainerType.REFRACTORY), "refractory");
|
||||
|
||||
for (Fluids fluidType : Fluids.values()) {
|
||||
if (fluidType.getFluid() == null) {
|
||||
continue;
|
||||
}
|
||||
for (EnumContainerType type : fluidType.getContainerTypes()) {
|
||||
int color = fluidType.getColor().getRGB();
|
||||
|
||||
DrinkProperties drinkProperties = fluidType.getDrinkProperties();
|
||||
ItemLiquidContainer liquidContainer;
|
||||
if (drinkProperties == null) {
|
||||
liquidContainer = new ItemLiquidContainer(type, color);
|
||||
} else {
|
||||
liquidContainer = new ItemLiquidContainerDrinkable(type, color, drinkProperties);
|
||||
}
|
||||
|
||||
String name = type.getName() + '.' + fluidType.getTag();
|
||||
registerItem(liquidContainer, name);
|
||||
|
||||
containers.put(type, fluidType.getFluid().getName(), liquidContainer);
|
||||
}
|
||||
}
|
||||
containers.put(EnumContainerType.CAN, canEmpty);
|
||||
containers.put(EnumContainerType.CAPSULE, waxCapsuleEmpty);
|
||||
containers.put(EnumContainerType.REFRACTORY, refractoryEmpty);
|
||||
}
|
||||
|
||||
private static ItemLiquidContainer registerEmptyContainer(EnumContainerType type, String name) {
|
||||
return registerItem(new ItemLiquidContainer(type, 0), name);
|
||||
}
|
||||
}
|
||||
@@ -157,7 +157,7 @@ public class ModelManager implements IModelManager {
|
||||
|
||||
@Override
|
||||
public ModelResourceLocation getModelLocation(String identifier) {
|
||||
return getModelLocation(Constants.RESOURCE_ID, identifier);
|
||||
return getModelLocation(Constants.MOD_ID, identifier);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -23,11 +23,14 @@ import net.minecraft.client.resources.IResourceManager;
|
||||
import net.minecraft.entity.Entity;
|
||||
import net.minecraft.util.ResourceLocation;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.util.math.Vec3i;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
import net.minecraftforge.common.animation.ITimeValue;
|
||||
import net.minecraftforge.common.model.animation.IAnimationStateMachine;
|
||||
|
||||
import forestry.api.apiculture.IBeeGenome;
|
||||
import forestry.api.apiculture.IBeeHousing;
|
||||
import forestry.core.fluids.Fluids;
|
||||
import forestry.core.models.BlockModelIndex;
|
||||
import forestry.core.models.ModelIndex;
|
||||
@@ -115,7 +118,7 @@ public class ProxyRender {
|
||||
|
||||
/* FX */
|
||||
|
||||
public void addBeeHiveFX(@Nonnull World world, double x, double y, double z, int color, @Nonnull List<BlockPos> flowerPositions) {
|
||||
public void addBeeHiveFX(@Nonnull IBeeHousing housing, @Nonnull IBeeGenome genome, @Nonnull List<BlockPos> flowerPositions) {
|
||||
}
|
||||
|
||||
public void addEntityHoneyDustFX(World world, double x, double y, double z) {
|
||||
|
||||
@@ -28,11 +28,14 @@ import net.minecraft.client.renderer.block.statemap.StateMapperBase;
|
||||
import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer;
|
||||
import net.minecraft.client.resources.IResourceManager;
|
||||
import net.minecraft.entity.Entity;
|
||||
import net.minecraft.entity.EntityLivingBase;
|
||||
import net.minecraft.item.Item;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.util.EnumParticleTypes;
|
||||
import net.minecraft.util.ResourceLocation;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.util.math.Vec3d;
|
||||
import net.minecraft.util.math.Vec3i;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
import net.minecraftforge.client.model.ModelLoader;
|
||||
@@ -40,7 +43,13 @@ import net.minecraftforge.client.model.ModelLoaderRegistry;
|
||||
import net.minecraftforge.common.animation.ITimeValue;
|
||||
import net.minecraftforge.common.model.animation.IAnimationStateMachine;
|
||||
|
||||
import forestry.apiculture.entities.ParticleBee;
|
||||
import forestry.api.apiculture.IBeeGenome;
|
||||
import forestry.api.apiculture.IBeeHousing;
|
||||
import forestry.api.apiculture.IHiveTile;
|
||||
import forestry.apiculture.entities.ParticleBeeExplore;
|
||||
import forestry.apiculture.entities.ParticleBeeRoundTrip;
|
||||
import forestry.apiculture.entities.ParticleBeeTargetEntity;
|
||||
import forestry.apiculture.genetics.alleles.AlleleEffect;
|
||||
import forestry.apiculture.render.TextureHabitatLocator;
|
||||
import forestry.core.config.Config;
|
||||
import forestry.core.config.Constants;
|
||||
@@ -62,6 +71,7 @@ import forestry.core.tiles.TileBase;
|
||||
import forestry.core.tiles.TileEscritoire;
|
||||
import forestry.core.tiles.TileMill;
|
||||
import forestry.core.tiles.TileNaturalistChest;
|
||||
import forestry.core.utils.VectUtil;
|
||||
|
||||
public class ProxyRenderClient extends ProxyRender {
|
||||
|
||||
@@ -188,16 +198,52 @@ public class ProxyRenderClient extends ProxyRender {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addBeeHiveFX(@Nonnull World world, double x, double y, double z, int color, @Nonnull List<BlockPos> flowerPositions) {
|
||||
public void addBeeHiveFX(@Nonnull IBeeHousing housing, @Nonnull IBeeGenome genome, @Nonnull List<BlockPos> flowerPositions) {
|
||||
World world = housing.getWorldObj();
|
||||
if (!shouldSpawnParticle(world)) {
|
||||
return;
|
||||
}
|
||||
|
||||
ParticleManager effectRenderer = Minecraft.getMinecraft().effectRenderer;
|
||||
|
||||
Vec3d particleStart = housing.getBeeFXCoordinates();
|
||||
|
||||
// Avoid rendering bee particles that are too far away, they're very small.
|
||||
// At 32+ distance, have no bee particles. Make more particles up close.
|
||||
BlockPos playerPosition = Proxies.common.getPlayer().getPosition();
|
||||
double playerDistanceSq = playerPosition.distanceSqToCenter(particleStart.xCoord, particleStart.yCoord, particleStart.zCoord);
|
||||
if (world.rand.nextInt(1024) < playerDistanceSq) {
|
||||
return;
|
||||
}
|
||||
|
||||
int color = genome.getPrimary().getSpriteColour(0);
|
||||
|
||||
if (!flowerPositions.isEmpty()) {
|
||||
BlockPos destination = flowerPositions.get(world.rand.nextInt(flowerPositions.size()));
|
||||
Particle particle = new ParticleBee(world, x, y, z, color, destination);
|
||||
ParticleManager effectRenderer = Minecraft.getMinecraft().effectRenderer;
|
||||
effectRenderer.addEffect(particle);
|
||||
int randomInt = world.rand.nextInt(100);
|
||||
|
||||
if (housing instanceof IHiveTile) {
|
||||
if (((IHiveTile) housing).isAngry() || randomInt >= 85) {
|
||||
List<EntityLivingBase> entitiesInRange = AlleleEffect.getEntitiesInRange(genome, housing, EntityLivingBase.class);
|
||||
if (!entitiesInRange.isEmpty()) {
|
||||
EntityLivingBase entity = entitiesInRange.get(world.rand.nextInt(entitiesInRange.size()));
|
||||
Particle particle = new ParticleBeeTargetEntity(world, particleStart, entity, color);
|
||||
effectRenderer.addEffect(particle);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (randomInt < 75) {
|
||||
BlockPos destination = flowerPositions.get(world.rand.nextInt(flowerPositions.size()));
|
||||
Particle particle = new ParticleBeeRoundTrip(world, particleStart, destination, color);
|
||||
effectRenderer.addEffect(particle);
|
||||
} else {
|
||||
Vec3i area = AlleleEffect.getModifiedArea(genome, housing);
|
||||
Vec3i offset = housing.getCoordinates().add(-area.getX() / 2, -area.getY() / 4, -area.getZ() / 2);
|
||||
BlockPos destination = VectUtil.getRandomPositionInArea(world.rand, area).add(offset);
|
||||
Particle particle = new ParticleBeeExplore(world, particleStart, destination, color);
|
||||
effectRenderer.addEffect(particle);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -17,7 +17,7 @@ import forestry.core.config.Constants;
|
||||
public class ForestryResource extends ResourceLocation {
|
||||
|
||||
public ForestryResource(String path) {
|
||||
super(Constants.RESOURCE_ID, path);
|
||||
super(Constants.MOD_ID, path);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -59,7 +59,7 @@ public class TextureManager implements ITextureManager {
|
||||
"slots/blocked", "slots/blocked_2", "slots/liquid", "slots/container", "slots/locked",
|
||||
"mail/carrier.player", "mail/carrier.trader"};
|
||||
for (String identifier : defaultIconNames) {
|
||||
ResourceLocation resourceLocation = new ResourceLocation(Constants.RESOURCE_ID, "gui/" + identifier);
|
||||
ResourceLocation resourceLocation = new ResourceLocation(Constants.MOD_ID, "gui/" + identifier);
|
||||
TextureAtlasSprite icon = registerSprite(resourceLocation);
|
||||
defaultIcons.put(identifier, icon);
|
||||
}
|
||||
|
||||
@@ -20,10 +20,9 @@ import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.nbt.NBTTagCompound;
|
||||
import net.minecraft.util.EnumFacing;
|
||||
|
||||
import net.minecraftforge.fluids.Fluid;
|
||||
import net.minecraftforge.common.capabilities.Capability;
|
||||
import net.minecraftforge.fluids.FluidStack;
|
||||
import net.minecraftforge.fluids.FluidTankInfo;
|
||||
import net.minecraftforge.fluids.IFluidHandler;
|
||||
import net.minecraftforge.fluids.capability.CapabilityFluidHandler;
|
||||
|
||||
import forestry.api.arboriculture.TreeManager;
|
||||
import forestry.api.core.ForestryAPI;
|
||||
@@ -47,7 +46,7 @@ import forestry.core.utils.GeneticsUtil;
|
||||
import forestry.core.utils.InventoryUtil;
|
||||
import forestry.plugins.ForestryPluginUids;
|
||||
|
||||
public class TileAnalyzer extends TilePowered implements ISidedInventory, ILiquidTankTile, IFluidHandler, IItemStackDisplay {
|
||||
public class TileAnalyzer extends TilePowered implements ISidedInventory, ILiquidTankTile, IItemStackDisplay {
|
||||
private static final int TIME_TO_ANALYZE = 125;
|
||||
private static final int HONEY_REQUIRED = 100;
|
||||
private static final int ENERGY_PER_WORK_CYCLE = 20320;
|
||||
@@ -64,7 +63,7 @@ public class TileAnalyzer extends TilePowered implements ISidedInventory, ILiqui
|
||||
public TileAnalyzer() {
|
||||
super("analyzer", 800, Constants.MACHINE_MAX_ENERGY);
|
||||
setInternalInventory(new InventoryAnalyzer(this));
|
||||
resourceTank = new FilteredTank(Constants.PROCESSOR_TANK_CAPACITY, Fluids.FOR_HONEY.getFluid());
|
||||
resourceTank = new FilteredTank(Constants.PROCESSOR_TANK_CAPACITY).setFilters(Fluids.FOR_HONEY.getFluid());
|
||||
tankManager = new TankManager(this, resourceTank);
|
||||
invInput = new InventoryMapper(getInternalInventory(), InventoryAnalyzer.SLOT_INPUT_1, InventoryAnalyzer.SLOT_INPUT_COUNT);
|
||||
invOutput = new InventoryMapper(getInternalInventory(), InventoryAnalyzer.SLOT_OUTPUT_1, InventoryAnalyzer.SLOT_OUTPUT_COUNT);
|
||||
@@ -109,7 +108,8 @@ public class TileAnalyzer extends TilePowered implements ISidedInventory, ILiqui
|
||||
}
|
||||
|
||||
if (!specimenToAnalyze.isAnalyzed()) {
|
||||
if (!resourceTank.canDrain(HONEY_REQUIRED)) {
|
||||
FluidStack drained = resourceTank.drain(HONEY_REQUIRED, false);
|
||||
if (drained == null || drained.amount != HONEY_REQUIRED) {
|
||||
return false;
|
||||
}
|
||||
resourceTank.drain(HONEY_REQUIRED, true);
|
||||
@@ -182,7 +182,8 @@ public class TileAnalyzer extends TilePowered implements ISidedInventory, ILiqui
|
||||
hasSpace = InventoryUtil.tryAddStack(invOutput, specimen, true, false);
|
||||
|
||||
if (!specimenToAnalyze.isAnalyzed()) {
|
||||
hasResource = resourceTank.canDrain(HONEY_REQUIRED);
|
||||
FluidStack drained = resourceTank.drain(HONEY_REQUIRED, false);
|
||||
hasResource = drained != null && drained.amount == HONEY_REQUIRED;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -249,35 +250,23 @@ public class TileAnalyzer extends TilePowered implements ISidedInventory, ILiqui
|
||||
return tankManager;
|
||||
}
|
||||
|
||||
/* IFluidHandler */
|
||||
@Override
|
||||
public int fill(EnumFacing from, FluidStack resource, boolean doFill) {
|
||||
return tankManager.fill(from, resource, doFill);
|
||||
public boolean hasCapability(Capability<?> capability, EnumFacing facing) {
|
||||
if (super.hasCapability(capability, facing)) {
|
||||
return true;
|
||||
}
|
||||
return capability == CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY;
|
||||
}
|
||||
|
||||
@Override
|
||||
public FluidStack drain(EnumFacing from, FluidStack resource, boolean doDrain) {
|
||||
return tankManager.drain(from, resource, doDrain);
|
||||
}
|
||||
|
||||
@Override
|
||||
public FluidStack drain(EnumFacing from, int maxDrain, boolean doDrain) {
|
||||
return tankManager.drain(from, maxDrain, doDrain);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canFill(EnumFacing from, Fluid fluid) {
|
||||
return tankManager.canFill(from, fluid);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canDrain(EnumFacing from, Fluid fluid) {
|
||||
return tankManager.canDrain(from, fluid);
|
||||
}
|
||||
|
||||
@Override
|
||||
public FluidTankInfo[] getTankInfo(EnumFacing from) {
|
||||
return tankManager.getTankInfo(from);
|
||||
public <T> T getCapability(Capability<T> capability, EnumFacing facing) {
|
||||
if (super.hasCapability(capability, facing)) {
|
||||
return super.getCapability(capability, facing);
|
||||
}
|
||||
if (capability == CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY) {
|
||||
return CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY.cast(tankManager);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -38,7 +38,7 @@ public class Log {
|
||||
}
|
||||
|
||||
private static void log(Level logLevel, String message, Object... params) {
|
||||
LogManager.getLogger(Constants.RESOURCE_ID).log(logLevel, message, params);
|
||||
LogManager.getLogger(Constants.MOD_ID).log(logLevel, message, params);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -10,11 +10,15 @@
|
||||
******************************************************************************/
|
||||
package forestry.core.utils;
|
||||
|
||||
import com.google.common.collect.AbstractIterator;
|
||||
|
||||
import java.util.Iterator;
|
||||
import java.util.Random;
|
||||
|
||||
import net.minecraft.util.EnumFacing;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.util.math.Vec3i;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
public final class VectUtil {
|
||||
public static BlockPos getRandomPositionInArea(Random random, Vec3i area) {
|
||||
@@ -53,4 +57,104 @@ public final class VectUtil {
|
||||
return EnumFacing.UP;
|
||||
}
|
||||
}
|
||||
|
||||
public static Iterable<BlockPos.MutableBlockPos> getAllInBoxFromCenterMutable(World world, final BlockPos from, final BlockPos center, final BlockPos to) {
|
||||
final BlockPos minPos = new BlockPos(Math.min(from.getX(), to.getX()), Math.min(from.getY(), to.getY()), Math.min(from.getZ(), to.getZ()));
|
||||
final BlockPos maxPos = new BlockPos(Math.max(from.getX(), to.getX()), Math.max(from.getY(), to.getY()), Math.max(from.getZ(), to.getZ()));
|
||||
|
||||
return new Iterable<BlockPos.MutableBlockPos>() {
|
||||
@Override
|
||||
public Iterator<BlockPos.MutableBlockPos> iterator() {
|
||||
return new MutableBlockPosSpiralIterator(world, center, maxPos, minPos);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
private static class MutableBlockPosSpiralIterator extends AbstractIterator<BlockPos.MutableBlockPos> {
|
||||
private final World world;
|
||||
private final BlockPos center;
|
||||
private final BlockPos maxPos;
|
||||
private final BlockPos minPos;
|
||||
private int spiralLayer;
|
||||
private final int maxSpiralLayers;
|
||||
private int direction;
|
||||
|
||||
private BlockPos.MutableBlockPos theBlockPos;
|
||||
|
||||
public MutableBlockPosSpiralIterator(World world, BlockPos center, BlockPos maxPos, BlockPos minPos) {
|
||||
this.world = world;
|
||||
this.center = center;
|
||||
this.maxPos = maxPos;
|
||||
this.minPos = minPos;
|
||||
|
||||
int xDiameter = maxPos.getX() - minPos.getX();
|
||||
int zDiameter = maxPos.getZ() - minPos.getZ();
|
||||
this.maxSpiralLayers = Math.max(xDiameter, zDiameter) / 2;
|
||||
this.spiralLayer = 1;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected BlockPos.MutableBlockPos computeNext() {
|
||||
BlockPos.MutableBlockPos pos;
|
||||
|
||||
do {
|
||||
pos = nextPos();
|
||||
}
|
||||
while (pos != null && (pos.getX() > maxPos.getX() || pos.getY() > maxPos.getY() || pos.getZ() > maxPos.getZ() || pos.getX() < minPos.getX() || pos.getY() < minPos.getY() || pos.getZ() < minPos.getZ()));
|
||||
|
||||
return pos;
|
||||
}
|
||||
|
||||
protected BlockPos.MutableBlockPos nextPos() {
|
||||
if (this.theBlockPos == null) {
|
||||
this.theBlockPos = new BlockPos.MutableBlockPos(center.getX(), maxPos.getY(), center.getZ());
|
||||
int y = Math.min(this.maxPos.getY(), this.world.getHeight(this.theBlockPos).getY());
|
||||
this.theBlockPos.setY(y);
|
||||
return this.theBlockPos;
|
||||
} else if (spiralLayer > maxSpiralLayers) {
|
||||
return this.endOfData();
|
||||
} else {
|
||||
int x = this.theBlockPos.getX();
|
||||
int y = this.theBlockPos.getY();
|
||||
int z = this.theBlockPos.getZ();
|
||||
|
||||
if (y > minPos.getY() && y > 0) {
|
||||
y--;
|
||||
} else {
|
||||
switch (direction) {
|
||||
case 0:
|
||||
++x;
|
||||
if (x == center.getX() + spiralLayer) {
|
||||
++direction;
|
||||
}
|
||||
break;
|
||||
case 1:
|
||||
++z;
|
||||
if (z == center.getZ() + spiralLayer) {
|
||||
++direction;
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
--x;
|
||||
if (x == center.getX() - spiralLayer) {
|
||||
++direction;
|
||||
}
|
||||
break;
|
||||
case 3:
|
||||
--z;
|
||||
if (z == center.getZ() - spiralLayer) {
|
||||
direction = 0;
|
||||
++spiralLayer;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
this.theBlockPos.setPos(x, y, z);
|
||||
y = Math.min(this.maxPos.getY(), this.world.getHeight(this.theBlockPos).getY());
|
||||
}
|
||||
|
||||
return this.theBlockPos.setPos(x, y, z);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -46,12 +46,12 @@ public enum BlockTypeEngine implements IBlockTypeTesr {
|
||||
|
||||
protected static IMachinePropertiesTesr<?> createEngineProperties(@Nonnull Class<? extends TileEngine> teClass, @Nonnull String name, @Nonnull String textureName) {
|
||||
TileEntitySpecialRenderer<TileEngine> renderer = PluginEnergy.proxy.getRenderDefaultEngine(Constants.TEXTURE_PATH_BLOCKS + textureName + "_");
|
||||
return new MachinePropertiesEngine<>(teClass, name, renderer, Constants.RESOURCE_ID + ":blocks" + textureName + ".0");
|
||||
return new MachinePropertiesEngine<>(teClass, name, renderer, Constants.MOD_ID + ":blocks" + textureName + ".0");
|
||||
}
|
||||
|
||||
protected static IMachinePropertiesTesr<?> createMachineProperties(@Nonnull Class<? extends TileBase> teClass, @Nonnull String name, @Nonnull String textureName) {
|
||||
TileEntitySpecialRenderer<TileBase> renderer = Proxies.render.getRenderDefaultMachine(Constants.TEXTURE_PATH_BLOCKS + textureName + "_");
|
||||
return new MachinePropertiesTesr<>(teClass, name, renderer, Constants.RESOURCE_ID + ":blocks" + textureName + ".0");
|
||||
return new MachinePropertiesTesr<>(teClass, name, renderer, Constants.MOD_ID + ":blocks" + textureName + ".0");
|
||||
}
|
||||
|
||||
@Nonnull
|
||||
|
||||
@@ -12,9 +12,9 @@ package forestry.energy.inventory;
|
||||
|
||||
import net.minecraft.item.ItemStack;
|
||||
|
||||
import net.minecraftforge.fluids.Fluid;
|
||||
import net.minecraftforge.fluids.FluidStack;
|
||||
import net.minecraftforge.fluids.FluidUtil;
|
||||
|
||||
import forestry.core.fluids.FluidHelper;
|
||||
import forestry.core.inventory.InventoryAdapterTile;
|
||||
import forestry.energy.tiles.TileEngineBiogas;
|
||||
|
||||
@@ -28,8 +28,8 @@ public class InventoryEngineBiogas extends InventoryAdapterTile<TileEngineBiogas
|
||||
@Override
|
||||
public boolean canSlotAccept(int slotIndex, ItemStack itemStack) {
|
||||
if (slotIndex == SLOT_CAN) {
|
||||
Fluid fluid = FluidHelper.getFluidInContainer(itemStack);
|
||||
return tile.getTankManager().accepts(fluid);
|
||||
FluidStack fluid = FluidUtil.getFluidContained(itemStack);
|
||||
return tile.getTankManager().canFillFluidType(fluid);
|
||||
}
|
||||
|
||||
return false;
|
||||
|
||||
@@ -12,9 +12,9 @@ package forestry.energy.inventory;
|
||||
|
||||
import net.minecraft.item.ItemStack;
|
||||
|
||||
import net.minecraftforge.fluids.Fluid;
|
||||
import net.minecraftforge.fluids.FluidStack;
|
||||
import net.minecraftforge.fluids.FluidUtil;
|
||||
|
||||
import forestry.core.fluids.FluidHelper;
|
||||
import forestry.core.inventory.InventoryAdapterTile;
|
||||
import forestry.energy.tiles.TileEuGenerator;
|
||||
|
||||
@@ -28,8 +28,8 @@ public class InventoryGenerator extends InventoryAdapterTile<TileEuGenerator> {
|
||||
@Override
|
||||
public boolean canSlotAccept(int slotIndex, ItemStack itemStack) {
|
||||
if (slotIndex == SLOT_CAN) {
|
||||
Fluid fluid = FluidHelper.getFluidInContainer(itemStack);
|
||||
return tile.getTankManager().accepts(fluid);
|
||||
FluidStack fluid = FluidUtil.getFluidContained(itemStack);
|
||||
return tile.getTankManager().canFillFluidType(fluid);
|
||||
}
|
||||
|
||||
return false;
|
||||
|
||||
@@ -20,11 +20,11 @@ import net.minecraft.inventory.ISidedInventory;
|
||||
import net.minecraft.nbt.NBTTagCompound;
|
||||
import net.minecraft.util.EnumFacing;
|
||||
|
||||
import net.minecraftforge.common.capabilities.Capability;
|
||||
import net.minecraftforge.fluids.Fluid;
|
||||
import net.minecraftforge.fluids.FluidRegistry;
|
||||
import net.minecraftforge.fluids.FluidStack;
|
||||
import net.minecraftforge.fluids.FluidTankInfo;
|
||||
import net.minecraftforge.fluids.IFluidHandler;
|
||||
import net.minecraftforge.fluids.capability.CapabilityFluidHandler;
|
||||
|
||||
import forestry.api.core.IErrorLogic;
|
||||
import forestry.api.fuels.EngineBronzeFuel;
|
||||
@@ -44,7 +44,7 @@ import forestry.energy.gui.ContainerEngineBiogas;
|
||||
import forestry.energy.gui.GuiEngineBiogas;
|
||||
import forestry.energy.inventory.InventoryEngineBiogas;
|
||||
|
||||
public class TileEngineBiogas extends TileEngine implements ISidedInventory, ILiquidTankTile, IFluidHandler {
|
||||
public class TileEngineBiogas extends TileEngine implements ISidedInventory, ILiquidTankTile {
|
||||
private final FilteredTank fuelTank;
|
||||
private final FilteredTank heatingTank;
|
||||
private final StandardTank burnTank;
|
||||
@@ -57,12 +57,10 @@ public class TileEngineBiogas extends TileEngine implements ISidedInventory, ILi
|
||||
|
||||
setInternalInventory(new InventoryEngineBiogas(this));
|
||||
|
||||
fuelTank = new FilteredTank(Constants.ENGINE_TANK_CAPACITY, FuelManager.bronzeEngineFuel.keySet());
|
||||
fuelTank.tankMode = StandardTank.TankMode.DEFAULT;
|
||||
heatingTank = new FilteredTank(Constants.ENGINE_TANK_CAPACITY, FluidRegistry.LAVA);
|
||||
heatingTank.tankMode = StandardTank.TankMode.INPUT;
|
||||
burnTank = new StandardTank(Constants.BUCKET_VOLUME);
|
||||
burnTank.tankMode = StandardTank.TankMode.INTERNAL;
|
||||
fuelTank = new FilteredTank(Constants.ENGINE_TANK_CAPACITY).setFilters(FuelManager.bronzeEngineFuel.keySet());
|
||||
heatingTank = new FilteredTank(Constants.ENGINE_TANK_CAPACITY, true, false).setFilters(FluidRegistry.LAVA);
|
||||
burnTank = new StandardTank(Fluid.BUCKET_VOLUME, false, false);
|
||||
|
||||
this.tankManager = new TankManager(this, fuelTank, heatingTank, burnTank);
|
||||
}
|
||||
|
||||
@@ -103,7 +101,7 @@ public class TileEngineBiogas extends TileEngine implements ISidedInventory, ILi
|
||||
|
||||
currentOutput = 0;
|
||||
|
||||
if (isRedstoneActivated() && (fuelTank.getFluidAmount() >= Constants.BUCKET_VOLUME || burnTank.getFluidAmount() > 0)) {
|
||||
if (isRedstoneActivated() && (fuelTank.getFluidAmount() >= Fluid.BUCKET_VOLUME || burnTank.getFluidAmount() > 0)) {
|
||||
|
||||
double heatStage = getHeatLevel();
|
||||
|
||||
@@ -115,18 +113,18 @@ public class TileEngineBiogas extends TileEngine implements ISidedInventory, ILi
|
||||
{
|
||||
if (heatingTank.getFluidAmount() > 0 && Fluids.LAVA.is(heatingTank.getFluid())) {
|
||||
addHeat(Constants.ENGINE_HEAT_VALUE_LAVA);
|
||||
heatingTank.drain(1, true);
|
||||
heatingTank.drainInternal(1, true);
|
||||
}
|
||||
}
|
||||
|
||||
// We need a minimum temperature to generate energy
|
||||
if (heatStage > 0.2) {
|
||||
if (burnTank.getFluidAmount() > 0) {
|
||||
FluidStack drained = burnTank.drain(1, true);
|
||||
FluidStack drained = burnTank.drainInternal(1, true);
|
||||
currentOutput = determineFuelValue(drained.getFluid());
|
||||
energyManager.generateEnergy(currentOutput);
|
||||
} else {
|
||||
FluidStack fuel = fuelTank.drain(Constants.BUCKET_VOLUME, true);
|
||||
FluidStack fuel = fuelTank.drainInternal(Fluid.BUCKET_VOLUME, true);
|
||||
int burnTime = determineBurnTime(fuel.getFluid());
|
||||
fuel.amount = burnTime;
|
||||
burnTank.setCapacity(burnTime);
|
||||
@@ -295,35 +293,23 @@ public class TileEngineBiogas extends TileEngine implements ISidedInventory, ILi
|
||||
iCrafting.sendProgressBarUpdate(containerEngine, 3, burnTank.getCapacity());
|
||||
}
|
||||
|
||||
// IFluidHandler
|
||||
@Override
|
||||
public int fill(EnumFacing from, FluidStack resource, boolean doFill) {
|
||||
return tankManager.fill(from, resource, doFill);
|
||||
public boolean hasCapability(Capability<?> capability, EnumFacing facing) {
|
||||
if (super.hasCapability(capability, facing)) {
|
||||
return true;
|
||||
}
|
||||
return capability == CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY;
|
||||
}
|
||||
|
||||
@Override
|
||||
public FluidStack drain(EnumFacing from, FluidStack resource, boolean doDrain) {
|
||||
return tankManager.drain(from, resource, doDrain);
|
||||
}
|
||||
|
||||
@Override
|
||||
public FluidStack drain(EnumFacing from, int maxDrain, boolean doDrain) {
|
||||
return tankManager.drain(from, maxDrain, doDrain);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canFill(EnumFacing from, Fluid fluid) {
|
||||
return tankManager.canFill(from, fluid);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canDrain(EnumFacing from, Fluid fluid) {
|
||||
return tankManager.canDrain(from, fluid);
|
||||
}
|
||||
|
||||
@Override
|
||||
public FluidTankInfo[] getTankInfo(EnumFacing from) {
|
||||
return tankManager.getTankInfo(from);
|
||||
public <T> T getCapability(Capability<T> capability, EnumFacing facing) {
|
||||
if (super.hasCapability(capability, facing)) {
|
||||
return super.getCapability(capability, facing);
|
||||
}
|
||||
if (capability == CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY) {
|
||||
return CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY.cast(tankManager);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -20,16 +20,15 @@ import net.minecraft.inventory.ISidedInventory;
|
||||
import net.minecraft.nbt.NBTTagCompound;
|
||||
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.common.capabilities.Capability;
|
||||
import net.minecraftforge.fluids.capability.CapabilityFluidHandler;
|
||||
|
||||
import forestry.api.core.IErrorLogic;
|
||||
import forestry.api.fuels.FuelManager;
|
||||
import forestry.core.config.Constants;
|
||||
import forestry.core.errors.EnumErrorCode;
|
||||
import forestry.core.fluids.FluidHelper;
|
||||
import forestry.core.fluids.ITankManager;
|
||||
import forestry.core.fluids.TankManager;
|
||||
import forestry.core.fluids.tanks.FilteredTank;
|
||||
import forestry.core.network.DataInputStreamForestry;
|
||||
@@ -43,7 +42,7 @@ import forestry.energy.gui.GuiGenerator;
|
||||
import forestry.energy.inventory.InventoryGenerator;
|
||||
|
||||
// TODO: IC2 for 1.9
|
||||
public class TileEuGenerator extends TileBase implements ISidedInventory, ILiquidTankTile, IFluidHandler, IRenderableTile {
|
||||
public class TileEuGenerator extends TileBase implements ISidedInventory, ILiquidTankTile, IRenderableTile {
|
||||
private static final int maxEnergy = 30000;
|
||||
|
||||
private final TankManager tankManager;
|
||||
@@ -58,7 +57,9 @@ public class TileEuGenerator extends TileBase implements ISidedInventory, ILiqui
|
||||
|
||||
setInternalInventory(new InventoryGenerator(this));
|
||||
|
||||
resourceTank = new FilteredTank(Constants.PROCESSOR_TANK_CAPACITY, FuelManager.generatorFuel.keySet());
|
||||
resourceTank = new FilteredTank(Constants.PROCESSOR_TANK_CAPACITY);
|
||||
resourceTank.setFilters(FuelManager.generatorFuel.keySet());
|
||||
|
||||
tankManager = new TankManager(this, resourceTank);
|
||||
|
||||
// if (PluginIC2.instance.isAvailable()) {
|
||||
@@ -137,7 +138,7 @@ public class TileEuGenerator extends TileBase implements ISidedInventory, ILiqui
|
||||
//
|
||||
// if (resourceTank.getFluidAmount() > 0) {
|
||||
// GeneratorFuel fuel = FuelManager.generatorFuel.get(resourceTank.getFluid().getFluid());
|
||||
// if (resourceTank.canDrain(fuel.fuelConsumed) && ic2EnergySource.getFreeCapacity() >= fuel.eu) {
|
||||
// if (resourceTank.canDrainFluidType(fuel.fuelConsumed) && ic2EnergySource.getFreeCapacity() >= fuel.eu) {
|
||||
// ic2EnergySource.addEnergy(fuel.eu);
|
||||
// this.tickCount++;
|
||||
//
|
||||
@@ -194,43 +195,6 @@ public class TileEuGenerator extends TileBase implements ISidedInventory, ILiqui
|
||||
// }
|
||||
}
|
||||
|
||||
/* ILiquidTankTile */
|
||||
@Override
|
||||
public int fill(EnumFacing from, FluidStack resource, boolean doFill) {
|
||||
return tankManager.fill(from, resource, doFill);
|
||||
}
|
||||
|
||||
@Nonnull
|
||||
@Override
|
||||
public TankManager getTankManager() {
|
||||
return tankManager;
|
||||
}
|
||||
|
||||
@Override
|
||||
public FluidStack drain(EnumFacing from, FluidStack resource, boolean doDrain) {
|
||||
return tankManager.drain(from, resource, doDrain);
|
||||
}
|
||||
|
||||
@Override
|
||||
public FluidStack drain(EnumFacing from, int maxDrain, boolean doDrain) {
|
||||
return tankManager.drain(from, maxDrain, doDrain);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canFill(EnumFacing from, Fluid fluid) {
|
||||
return tankManager.canFill(from, fluid);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canDrain(EnumFacing from, Fluid fluid) {
|
||||
return tankManager.canDrain(from, fluid);
|
||||
}
|
||||
|
||||
@Override
|
||||
public FluidTankInfo[] getTankInfo(EnumFacing from) {
|
||||
return tankManager.getTankInfo(from);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object getGui(EntityPlayer player, int data) {
|
||||
return new GuiGenerator(player.inventory, this);
|
||||
@@ -240,4 +204,29 @@ public class TileEuGenerator extends TileBase implements ISidedInventory, ILiqui
|
||||
public Object getContainer(EntityPlayer player, int data) {
|
||||
return new ContainerGenerator(player.inventory, this);
|
||||
}
|
||||
|
||||
@Nonnull
|
||||
@Override
|
||||
public ITankManager getTankManager() {
|
||||
return tankManager;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasCapability(Capability<?> capability, EnumFacing facing) {
|
||||
if (super.hasCapability(capability, facing)) {
|
||||
return true;
|
||||
}
|
||||
return capability == CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY;
|
||||
}
|
||||
|
||||
@Override
|
||||
public <T> T getCapability(Capability<T> capability, EnumFacing facing) {
|
||||
if (super.hasCapability(capability, facing)) {
|
||||
return super.getCapability(capability, facing);
|
||||
}
|
||||
if (capability == CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY) {
|
||||
return CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY.cast(tankManager);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@@ -16,6 +16,7 @@ import net.minecraft.init.Blocks;
|
||||
import net.minecraft.init.Items;
|
||||
import net.minecraft.item.ItemStack;
|
||||
|
||||
import net.minecraftforge.fluids.Fluid;
|
||||
import net.minecraftforge.fluids.FluidStack;
|
||||
|
||||
import forestry.api.circuits.ChipsetManager;
|
||||
@@ -242,8 +243,8 @@ public class PluginFactory extends BlankForestryPlugin {
|
||||
|
||||
if (ForestryAPI.enabledPlugins.contains(ForestryPluginUids.APICULTURE)) {
|
||||
ItemRegistryApiculture beeItems = PluginApiculture.items;
|
||||
FluidStack liquidGlass = Fluids.GLASS.getFluid(Constants.BUCKET_VOLUME);
|
||||
FluidStack liquidGlassX4 = Fluids.GLASS.getFluid(Constants.BUCKET_VOLUME * 4);
|
||||
FluidStack liquidGlass = Fluids.GLASS.getFluid(Fluid.BUCKET_VOLUME);
|
||||
FluidStack liquidGlassX4 = Fluids.GLASS.getFluid(Fluid.BUCKET_VOLUME * 4);
|
||||
for (int i = 0; i < 16; i++) {
|
||||
RecipeManagers.fabricatorManager.addRecipe(beeItems.waxCast.getWildcard(), liquidGlass, new ItemStack(Blocks.STAINED_GLASS, 4, 15 - i), new Object[]{
|
||||
"#", "X",
|
||||
|
||||
@@ -47,11 +47,11 @@ public enum BlockTypeFactoryTesr implements IBlockTypeTesr {
|
||||
|
||||
<T extends TileBase> BlockTypeFactoryTesr(@Nonnull Class<T> teClass, @Nonnull String name) {
|
||||
TileEntitySpecialRenderer<TileBase> renderer = Proxies.render.getRenderDefaultMachine(Constants.TEXTURE_PATH_BLOCKS + "/" + name + "_");
|
||||
this.machineProperties = new MachinePropertiesTesr<>(teClass, name, renderer, Constants.RESOURCE_ID + ":blocks/" + name + ".0");
|
||||
this.machineProperties = new MachinePropertiesTesr<>(teClass, name, renderer, Constants.MOD_ID + ":blocks/" + name + ".0");
|
||||
}
|
||||
|
||||
<T extends TileBase> BlockTypeFactoryTesr(@Nonnull Class<T> teClass, @Nonnull String name, @Nullable TileEntitySpecialRenderer<? super T> renderer) {
|
||||
this.machineProperties = new MachinePropertiesTesr<>(teClass, name, renderer, Constants.RESOURCE_ID + ":blocks/" + name + ".0");
|
||||
this.machineProperties = new MachinePropertiesTesr<>(teClass, name, renderer, Constants.MOD_ID + ":blocks/" + name + ".0");
|
||||
}
|
||||
|
||||
@Nonnull
|
||||
|
||||
@@ -15,6 +15,7 @@ import net.minecraft.util.EnumFacing;
|
||||
|
||||
import net.minecraftforge.fluids.FluidRegistry;
|
||||
import net.minecraftforge.fluids.FluidStack;
|
||||
import net.minecraftforge.fluids.FluidUtil;
|
||||
|
||||
import forestry.core.fluids.FluidHelper;
|
||||
import forestry.core.inventory.InventoryAdapterTile;
|
||||
@@ -32,9 +33,9 @@ public class InventoryBottler extends InventoryAdapterTile<TileBottler> {
|
||||
@Override
|
||||
public boolean canSlotAccept(int slotIndex, ItemStack itemStack) {
|
||||
if (slotIndex == SLOT_INPUT_EMPTY_CAN) {
|
||||
return FluidHelper.isFillableContainer(itemStack);
|
||||
return FluidHelper.isFillableContainerWithRoom(itemStack);
|
||||
} else if (slotIndex == SLOT_INPUT_FULL_CAN) {
|
||||
FluidStack fluidStack = FluidHelper.getFluidStackInContainer(itemStack);
|
||||
FluidStack fluidStack = FluidUtil.getFluidContained(itemStack);
|
||||
return fluidStack != null && FluidRegistry.isFluidRegistered(fluidStack.getFluid());
|
||||
}
|
||||
return false;
|
||||
|
||||
@@ -13,9 +13,9 @@ package forestry.factory.inventory;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.util.EnumFacing;
|
||||
|
||||
import net.minecraftforge.fluids.Fluid;
|
||||
import net.minecraftforge.fluids.FluidStack;
|
||||
import net.minecraftforge.fluids.FluidUtil;
|
||||
|
||||
import forestry.core.fluids.FluidHelper;
|
||||
import forestry.core.inventory.InventoryAdapterTile;
|
||||
import forestry.core.utils.SlotUtil;
|
||||
import forestry.factory.recipes.CarpenterRecipeManager;
|
||||
@@ -36,8 +36,8 @@ public class InventoryCarpenter extends InventoryAdapterTile<TileCarpenter> {
|
||||
@Override
|
||||
public boolean canSlotAccept(int slotIndex, ItemStack itemStack) {
|
||||
if (slotIndex == SLOT_CAN_INPUT) {
|
||||
Fluid fluid = FluidHelper.getFluidInContainer(itemStack);
|
||||
return tile.getTankManager().accepts(fluid);
|
||||
FluidStack fluid = FluidUtil.getFluidContained(itemStack);
|
||||
return tile.getTankManager().canFillFluidType(fluid);
|
||||
} else if (slotIndex == SLOT_BOX) {
|
||||
return CarpenterRecipeManager.isBox(itemStack);
|
||||
} else if (canSlotAccept(SLOT_CAN_INPUT, itemStack) || canSlotAccept(SLOT_BOX, itemStack)) {
|
||||
|
||||
@@ -13,7 +13,8 @@ package forestry.factory.inventory;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.util.EnumFacing;
|
||||
|
||||
import net.minecraftforge.fluids.Fluid;
|
||||
import net.minecraftforge.fluids.FluidStack;
|
||||
import net.minecraftforge.fluids.FluidUtil;
|
||||
|
||||
import forestry.api.fuels.FuelManager;
|
||||
import forestry.core.fluids.FluidHelper;
|
||||
@@ -37,10 +38,10 @@ public class InventoryFermenter extends InventoryAdapterTile<TileFermenter> {
|
||||
if (slotIndex == SLOT_RESOURCE) {
|
||||
return FermenterRecipeManager.isResource(itemStack);
|
||||
} else if (slotIndex == SLOT_INPUT) {
|
||||
Fluid fluid = FluidHelper.getFluidInContainer(itemStack);
|
||||
return tile.getTankManager().accepts(fluid);
|
||||
FluidStack fluid = FluidUtil.getFluidContained(itemStack);
|
||||
return tile.getTankManager().canFillFluidType(fluid);
|
||||
} else if (slotIndex == SLOT_CAN_INPUT) {
|
||||
return FluidHelper.isFillableContainer(itemStack);
|
||||
return FluidHelper.isFillableContainerWithRoom(itemStack);
|
||||
} else if (slotIndex == SLOT_FUEL) {
|
||||
return FuelManager.fermenterFuel.containsKey(itemStack);
|
||||
}
|
||||
|
||||
@@ -13,10 +13,10 @@ package forestry.factory.inventory;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.util.EnumFacing;
|
||||
|
||||
import net.minecraftforge.fluids.Fluid;
|
||||
import net.minecraftforge.fluids.FluidStack;
|
||||
import net.minecraftforge.fluids.FluidUtil;
|
||||
|
||||
import forestry.api.fuels.FuelManager;
|
||||
import forestry.core.fluids.FluidHelper;
|
||||
import forestry.core.inventory.InventoryAdapterTile;
|
||||
import forestry.core.utils.SlotUtil;
|
||||
import forestry.factory.recipes.MoistenerRecipeManager;
|
||||
@@ -46,8 +46,8 @@ public class InventoryMoistener extends InventoryAdapterTile<TileMoistener> {
|
||||
}
|
||||
|
||||
if (slotIndex == SLOT_PRODUCT) {
|
||||
Fluid fluid = FluidHelper.getFluidInContainer(itemStack);
|
||||
return tile.getTankManager().accepts(fluid);
|
||||
FluidStack fluid = FluidUtil.getFluidContained(itemStack);
|
||||
return tile.getTankManager().canFillFluidType(fluid);
|
||||
}
|
||||
|
||||
return false;
|
||||
|
||||
@@ -13,8 +13,11 @@ package forestry.factory.inventory;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.util.EnumFacing;
|
||||
|
||||
import forestry.core.fluids.FluidHelper;
|
||||
import forestry.core.fluids.Fluids;
|
||||
import net.minecraftforge.fluids.FluidRegistry;
|
||||
import net.minecraftforge.fluids.FluidStack;
|
||||
import net.minecraftforge.fluids.FluidUtil;
|
||||
import net.minecraftforge.fluids.capability.IFluidHandler;
|
||||
|
||||
import forestry.core.inventory.InventoryAdapterTile;
|
||||
import forestry.factory.tiles.TileRaintank;
|
||||
|
||||
@@ -29,7 +32,10 @@ public class InventoryRaintank extends InventoryAdapterTile<TileRaintank> {
|
||||
@Override
|
||||
public boolean canSlotAccept(int slotIndex, ItemStack itemStack) {
|
||||
if (slotIndex == SLOT_RESOURCE) {
|
||||
return FluidHelper.getFilledContainer(Fluids.WATER.getFluid(1000), itemStack) != null;
|
||||
IFluidHandler fluidHandler = FluidUtil.getFluidHandler(itemStack);
|
||||
if (fluidHandler != null) {
|
||||
return fluidHandler.fill(new FluidStack(FluidRegistry.WATER, Integer.MAX_VALUE), false) > 0;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -40,11 +40,11 @@ public class InventorySqueezer extends InventoryAdapterTile<TileSqueezer> {
|
||||
@Override
|
||||
public boolean canSlotAccept(int slotIndex, ItemStack itemStack) {
|
||||
if (slotIndex == SLOT_CAN_INPUT) {
|
||||
return FluidHelper.isEmptyContainer(itemStack);
|
||||
return FluidHelper.isFillableEmptyContainer(itemStack);
|
||||
}
|
||||
|
||||
if (slotIndex >= SLOT_RESOURCE_1 && slotIndex < SLOT_RESOURCE_1 + SLOTS_RESOURCE_COUNT) {
|
||||
if (FluidHelper.isEmptyContainer(itemStack)) {
|
||||
if (FluidHelper.isFillableEmptyContainer(itemStack)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -82,6 +82,6 @@ public class InventorySqueezer extends InventoryAdapterTile<TileSqueezer> {
|
||||
if (getStackInSlot(SLOT_CAN_INPUT) == null || fluidStack == null) {
|
||||
return;
|
||||
}
|
||||
FluidHelper.fillContainers(tankManager, this, SLOT_CAN_INPUT, SLOT_CAN_OUTPUT, fluidStack.getFluid());
|
||||
FluidHelper.fillContainers(tankManager, this, SLOT_CAN_INPUT, SLOT_CAN_OUTPUT, fluidStack.getFluid(), true);
|
||||
}
|
||||
}
|
||||
Loaded 100 of 158 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user