mirror of
https://github.com/GTNewHorizons/ForestryMC.git
synced 2026-11-15 01:24:59 +00:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c6f2e3c7b3 | ||
|
|
c6d8518d82 | ||
|
|
98711e5d34 | ||
|
|
5caab59507 | ||
|
|
41d47d99ca | ||
|
|
3c6d5d04d0 | ||
|
|
137927b3e6 | ||
|
|
8aa7e05bbe | ||
|
|
16414da3f2 | ||
|
|
11eb4b62df | ||
|
|
a172cb379f | ||
|
|
c979d1fa79 | ||
|
|
ef5825edcf | ||
|
|
9570cb2982 |
No files matched your search
+3
-3
@@ -2,9 +2,9 @@
|
||||
|
||||
dependencies {
|
||||
api('curse.maven:cofh-lib-220333:2388748')
|
||||
compileOnlyApi('com.github.GTNewHorizons:Angelica:1.0.0-alpha52:api')
|
||||
devOnlyNonPublishable('com.github.GTNewHorizons:NotEnoughItems:2.6.8-GTNH:dev')
|
||||
compileOnly('com.github.GTNewHorizons:inventory-tweaks:1.6.2:api')
|
||||
compileOnlyApi('com.github.GTNewHorizons:Angelica:1.0.0-beta22:api')
|
||||
devOnlyNonPublishable('com.github.GTNewHorizons:NotEnoughItems:2.6.46-GTNH:dev')
|
||||
compileOnly('com.github.GTNewHorizons:inventory-tweaks:1.7.0:api')
|
||||
compileOnly('com.github.GTNewHorizons:BuildCraft:7.1.39:api')
|
||||
compileOnly('net.industrial-craft:industrialcraft-2:2.2.828-experimental:dev')
|
||||
compileOnly('curse.maven:craftguide-75557:2459320')
|
||||
|
||||
+12
-1
@@ -85,6 +85,11 @@ accessTransformersFile =
|
||||
# Provides setup for Mixins if enabled. If you don't know what mixins are: Keep it disabled!
|
||||
usesMixins = false
|
||||
|
||||
# Set to a non-empty string to configure mixins in a separate source set under src/VALUE, instead of src/main.
|
||||
# This can speed up compile times thanks to not running the mixin annotation processor on all input sources.
|
||||
# Mixin classes will have access to "main" classes, but not the other way around.
|
||||
separateMixinSourceSet =
|
||||
|
||||
# Adds some debug arguments like verbose output and class export.
|
||||
usesMixinDebug = false
|
||||
|
||||
@@ -117,9 +122,15 @@ minimizeShadowedDependencies = true
|
||||
# If disabled, won't rename the shadowed classes.
|
||||
relocateShadowedDependencies = true
|
||||
|
||||
# Adds the GTNH maven, CurseMaven, Modrinth, and some more well-known 1.7.10 repositories.
|
||||
# Adds CurseMaven, Modrinth, and some more well-known 1.7.10 repositories.
|
||||
includeWellKnownRepositories = true
|
||||
|
||||
# A list of repositories to exclude from the includeWellKnownRepositories setting. Should be a space separated
|
||||
# list of strings, with the acceptable keys being(case does not matter):
|
||||
# cursemaven
|
||||
# modrinth
|
||||
excludeWellKnownRepositories =
|
||||
|
||||
# Change these to your Maven coordinates if you want to publish to a custom Maven repository instead of the default GTNH Maven.
|
||||
# Authenticate with the MAVEN_USER and MAVEN_PASSWORD environment variables.
|
||||
# If you need a more complex setup disable maven publishing here and add a publishing repository to addon.gradle.
|
||||
|
||||
Vendored
BIN
Binary file not shown.
+1
-1
@@ -1,6 +1,6 @@
|
||||
distributionBase=GRADLE_USER_HOME
|
||||
distributionPath=wrapper/dists
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.8-bin.zip
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip
|
||||
networkTimeout=10000
|
||||
validateDistributionUrl=true
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
|
||||
@@ -15,6 +15,8 @@
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
#
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
|
||||
##############################################################################
|
||||
#
|
||||
@@ -84,7 +86,8 @@ done
|
||||
# shellcheck disable=SC2034
|
||||
APP_BASE_NAME=${0##*/}
|
||||
# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)
|
||||
APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit
|
||||
APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s
|
||||
' "$PWD" ) || exit
|
||||
|
||||
# Use the maximum available, or set MAX_FD != -1 to use that value.
|
||||
MAX_FD=maximum
|
||||
|
||||
Vendored
+2
@@ -13,6 +13,8 @@
|
||||
@rem See the License for the specific language governing permissions and
|
||||
@rem limitations under the License.
|
||||
@rem
|
||||
@rem SPDX-License-Identifier: Apache-2.0
|
||||
@rem
|
||||
|
||||
@if "%DEBUG%"=="" @echo off
|
||||
@rem ##########################################################################
|
||||
|
||||
+1
-1
@@ -17,7 +17,7 @@ pluginManagement {
|
||||
}
|
||||
|
||||
plugins {
|
||||
id 'com.gtnewhorizons.gtnhsettingsconvention' version '1.0.23'
|
||||
id 'com.gtnewhorizons.gtnhsettingsconvention' version '1.0.29'
|
||||
}
|
||||
|
||||
|
||||
@@ -15,6 +15,7 @@ import net.minecraft.item.Item;
|
||||
import net.minecraftforge.common.MinecraftForge;
|
||||
|
||||
import cpw.mods.fml.common.FMLCommonHandler;
|
||||
import cpw.mods.fml.common.Loader;
|
||||
import cpw.mods.fml.common.Mod;
|
||||
import cpw.mods.fml.common.Mod.EventHandler;
|
||||
import cpw.mods.fml.common.ModAPIManager;
|
||||
@@ -79,11 +80,15 @@ public class Forestry {
|
||||
|
||||
public static PacketHandler packetHandler;
|
||||
|
||||
public static boolean isDreamcraftLoaded;
|
||||
|
||||
@EventHandler
|
||||
public void preInit(FMLPreInitializationEvent event) {
|
||||
checkForCoFHLib();
|
||||
packetHandler = new PacketHandler();
|
||||
|
||||
isDreamcraftLoaded = Loader.isModLoaded("dreamcraft");
|
||||
|
||||
// Register event handler
|
||||
EventHandlerCore eventHandlerCore = new EventHandlerCore();
|
||||
MinecraftForge.EVENT_BUS.register(eventHandlerCore);
|
||||
|
||||
@@ -52,4 +52,8 @@ public interface IIndividual extends INBTTagable {
|
||||
IIndividual copy();
|
||||
|
||||
boolean isPureBred(IChromosomeType chromosomeType);
|
||||
|
||||
default void addLore(List<String> text) {}
|
||||
|
||||
default void addDiscoveredBy(List<String> text) {}
|
||||
}
|
||||
@@ -8,6 +8,9 @@
|
||||
******************************************************************************/
|
||||
package forestry.apiculture.genetics;
|
||||
|
||||
import static forestry.core.utils.MathUtil.safeAdd;
|
||||
import static forestry.core.utils.MathUtil.safeMultiply;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
@@ -15,6 +18,8 @@ import java.util.Map;
|
||||
import java.util.Random;
|
||||
import java.util.Set;
|
||||
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.gui.FontRenderer;
|
||||
import net.minecraft.item.EnumRarity;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.nbt.NBTTagCompound;
|
||||
@@ -373,6 +378,36 @@ public class Bee extends IndividualLiving implements IBee {
|
||||
return suitableBiomes;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addLore(List<String> text) {
|
||||
IAlleleBeeSpecies primary = genome.getPrimary();
|
||||
String descTokens[] = primary.getDescription().split("\\|");
|
||||
|
||||
if (descTokens.length > 0) {
|
||||
String speciesLore = descTokens[0];
|
||||
if (!speciesLore.isEmpty() && !speciesLore.contains("for.description")) {
|
||||
FontRenderer fontRenderer = Minecraft.getMinecraft().fontRenderer;
|
||||
String formattedLore = EnumChatFormatting.GOLD + speciesLore;
|
||||
List<String> formattedLoreList = fontRenderer.listFormattedStringToWidth(formattedLore, 200);
|
||||
text.addAll(formattedLoreList);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addDiscoveredBy(List<String> text) {
|
||||
IAlleleBeeSpecies primary = genome.getPrimary();
|
||||
String descTokens[] = primary.getDescription().split("\\|");
|
||||
|
||||
if (descTokens.length > 2) {
|
||||
String discoveredBy = descTokens[2];
|
||||
if (!discoveredBy.isEmpty()) {
|
||||
text.add("");
|
||||
text.add("Discovered by " + EnumChatFormatting.ITALIC + discoveredBy);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addTooltip(List<String> list) {
|
||||
|
||||
@@ -699,9 +734,9 @@ public class Bee extends IndividualLiving implements IBee {
|
||||
|
||||
// boost chance for researched mutations
|
||||
if (breedingTracker.isResearched(beeMutation)) {
|
||||
float mutationBoost = chance * (Config.researchMutationBoostMultiplier - 1.0f);
|
||||
float mutationBoost = safeMultiply(chance, Config.researchMutationBoostMultiplier - 1.0f);
|
||||
mutationBoost = Math.min(Config.maxResearchMutationBoostPercent, mutationBoost);
|
||||
chance += mutationBoost;
|
||||
chance = safeAdd(chance, mutationBoost);
|
||||
}
|
||||
|
||||
if (chance > world.rand.nextFloat() * 100) {
|
||||
|
||||
@@ -8,6 +8,8 @@
|
||||
******************************************************************************/
|
||||
package forestry.apiculture.genetics;
|
||||
|
||||
import static forestry.core.utils.MathUtil.safeMultiply;
|
||||
|
||||
import net.minecraft.util.ChunkCoordinates;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
@@ -49,8 +51,8 @@ public class BeeMutation extends Mutation implements IBeeMutationCustom {
|
||||
IBeeModifier beeHousingModifier = BeeManager.beeRoot.createBeeHousingModifier(housing);
|
||||
IBeeModifier beeModeModifier = BeeManager.beeRoot.getBeekeepingMode(world).getBeeModifier();
|
||||
|
||||
processedChance *= beeHousingModifier.getMutationModifier(genome0, genome1, processedChance);
|
||||
processedChance *= beeModeModifier.getMutationModifier(genome0, genome1, processedChance);
|
||||
processedChance = safeMultiply(processedChance, beeHousingModifier.getMutationModifier(genome0, genome1, 1.0F));
|
||||
processedChance = safeMultiply(processedChance, beeModeModifier.getMutationModifier(genome0, genome1, 1.0F));
|
||||
|
||||
return processedChance;
|
||||
}
|
||||
|
||||
@@ -13,6 +13,7 @@ import java.util.Random;
|
||||
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.entity.EntityLivingBase;
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
import net.minecraft.util.DamageSource;
|
||||
import net.minecraft.world.World;
|
||||
@@ -21,7 +22,7 @@ import forestry.api.apiculture.BeeManager;
|
||||
import forestry.api.apiculture.IBeeGenome;
|
||||
import forestry.api.apiculture.IBeeHousing;
|
||||
import forestry.api.genetics.IEffectData;
|
||||
import forestry.apiculture.blocks.BlockAlveary;
|
||||
import forestry.apiculture.multiblock.AlvearyController;
|
||||
import forestry.core.utils.DamageSourceForestry;
|
||||
import forestry.core.utils.vect.Vect;
|
||||
|
||||
@@ -36,8 +37,13 @@ public class AlleleEffectRadioactive extends AlleleEffectThrottled {
|
||||
@Override
|
||||
public IEffectData doEffectThrottled(IBeeGenome genome, IEffectData storedData, IBeeHousing housing) {
|
||||
harmEntities(genome, housing);
|
||||
if (isMobGriefingEnabled(housing)) destroyEnvironment(genome, housing);
|
||||
|
||||
return destroyEnvironment(genome, storedData, housing);
|
||||
return storedData;
|
||||
}
|
||||
|
||||
private boolean isMobGriefingEnabled(IBeeHousing housing) {
|
||||
return housing.getWorld().getGameRules().getGameRuleBooleanValue("mobGriefing");
|
||||
}
|
||||
|
||||
private void harmEntities(IBeeGenome genome, IBeeHousing housing) {
|
||||
@@ -56,7 +62,7 @@ public class AlleleEffectRadioactive extends AlleleEffectThrottled {
|
||||
}
|
||||
}
|
||||
|
||||
private static IEffectData destroyEnvironment(IBeeGenome genome, IEffectData storedData, IBeeHousing housing) {
|
||||
private static void destroyEnvironment(IBeeGenome genome, IBeeHousing housing) {
|
||||
World world = housing.getWorld();
|
||||
Random rand = world.rand;
|
||||
|
||||
@@ -65,43 +71,66 @@ public class AlleleEffectRadioactive extends AlleleEffectThrottled {
|
||||
Vect offset = area.multiply(-1 / 2.0f);
|
||||
Vect posHousing = new Vect(housing.getCoordinates());
|
||||
|
||||
boolean isAlveary = housing instanceof AlvearyController;
|
||||
|
||||
for (int i = 0; i < 20; i++) {
|
||||
Vect randomPos = Vect.getRandomPositionInArea(rand, area);
|
||||
Vect posBlock = randomPos.add(posHousing);
|
||||
posBlock = posBlock.add(offset);
|
||||
Vect posBlock = randomPos.add(posHousing).add(offset);
|
||||
|
||||
if (posBlock.y <= 1 || posBlock.y >= housing.getWorld().getActualHeight()) {
|
||||
// Don't destroy blocks in the protected 3x3x4 area if housing is an Alveary.
|
||||
// Stops the bee destroying itself. Silly behaviour.
|
||||
if (isInAlvearyProtectedArea(posHousing, posBlock)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// Don't destroy ourselves or blocks below us.
|
||||
if (posBlock.x == posHousing.x && posBlock.z == posHousing.z && posBlock.y <= posHousing.y) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (world.isAirBlock(posBlock.x, posBlock.y, posBlock.z)) {
|
||||
continue;
|
||||
// Don't destroy the block directly below the bee.
|
||||
if (isAlveary) {
|
||||
if (posBlock.y == posHousing.y - 3) {
|
||||
continue;
|
||||
}
|
||||
} else {
|
||||
if (posBlock.y == posHousing.y - 1) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
Block block = world.getBlock(posBlock.x, posBlock.y, posBlock.z);
|
||||
|
||||
if (block instanceof BlockAlveary) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// Never delete a tile entity. Allows far too much griefing and abuse otherwise.
|
||||
TileEntity tile = world.getTileEntity(posBlock.x, posBlock.y, posBlock.z);
|
||||
if (tile instanceof IBeeHousing) {
|
||||
if (tile != null) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// Don't let us delete blocks that are not supposed to be breakable by players.
|
||||
if (block.getBlockHardness(world, posBlock.x, posBlock.y, posBlock.z) < 0) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// Some mods might use this logic? Idk, just a safety check. Might stop griefing.
|
||||
EntityPlayer player = world.func_152378_a(housing.getOwner().getId());
|
||||
if (player == null || !world.canMineBlock(player, posHousing.x, posHousing.y, posHousing.z)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
world.setBlockToAir(posBlock.x, posBlock.y, posBlock.z);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return storedData;
|
||||
private static boolean isInAlvearyProtectedArea(Vect posHousing, Vect posBlock) {
|
||||
// Alveary protection area is a 3x3x4 area centered on the top middle, down one block.
|
||||
int startX = posHousing.x - 1;
|
||||
int endX = posHousing.x + 1;
|
||||
int startZ = posHousing.z - 1;
|
||||
int endZ = posHousing.z + 1;
|
||||
int startY = posHousing.y - 2;
|
||||
int endY = posHousing.y + 1;
|
||||
|
||||
return posBlock.x >= startX && posBlock.x <= endX
|
||||
&& posBlock.z >= startZ
|
||||
&& posBlock.z <= endZ
|
||||
&& posBlock.y >= startY
|
||||
&& posBlock.y <= endY;
|
||||
}
|
||||
}
|
||||
@@ -16,6 +16,8 @@ import java.util.List;
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.gui.FontRenderer;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.nbt.NBTTagCompound;
|
||||
import net.minecraft.util.EnumChatFormatting;
|
||||
@@ -298,6 +300,36 @@ public class Tree extends Individual implements ITree, IPlantable {
|
||||
return plantTypes;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addLore(List<String> text) {
|
||||
IAlleleTreeSpecies primary = genome.getPrimary();
|
||||
String descTokens[] = primary.getDescription().split("\\|");
|
||||
|
||||
if (descTokens.length > 0) {
|
||||
String speciesLore = descTokens[0];
|
||||
if (!speciesLore.isEmpty() && !speciesLore.contains("for.description")) {
|
||||
FontRenderer fontRenderer = Minecraft.getMinecraft().fontRenderer;
|
||||
String formattedLore = EnumChatFormatting.GOLD + speciesLore;
|
||||
List<String> formattedLoreList = fontRenderer.listFormattedStringToWidth(formattedLore, 200);
|
||||
text.addAll(formattedLoreList);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addDiscoveredBy(List<String> text) {
|
||||
IAlleleTreeSpecies primary = genome.getPrimary();
|
||||
String descTokens[] = primary.getDescription().split("\\|");
|
||||
|
||||
if (descTokens.length > 2) {
|
||||
String discoveredBy = descTokens[2];
|
||||
if (!discoveredBy.isEmpty()) {
|
||||
text.add("");
|
||||
text.add("Discovered by " + EnumChatFormatting.ITALIC + discoveredBy);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addTooltip(List<String> list) {
|
||||
|
||||
|
||||
@@ -8,6 +8,8 @@
|
||||
******************************************************************************/
|
||||
package forestry.core.blocks;
|
||||
|
||||
import static forestry.Forestry.isDreamcraftLoaded;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
@@ -52,7 +54,7 @@ public class BlockResourceOre extends Block {
|
||||
public void dropBlockAsItemWithChance(World world, int x, int y, int z, int metadata, float par6, int par7) {
|
||||
super.dropBlockAsItemWithChance(world, x, y, z, metadata, par6, par7);
|
||||
|
||||
if (metadata == 0) {
|
||||
if (metadata == 0 && !isDreamcraftLoaded) {
|
||||
this.dropXpOnBlockBreak(world, x, y, z, MathHelper.getRandomIntegerInRange(world.rand, 1, 4));
|
||||
}
|
||||
}
|
||||
@@ -61,7 +63,7 @@ public class BlockResourceOre extends Block {
|
||||
public ArrayList<ItemStack> getDrops(World world, int x, int y, int z, int metadata, int fortune) {
|
||||
ArrayList<ItemStack> drops = new ArrayList<>();
|
||||
|
||||
if (metadata == ResourceType.APATITE.ordinal()) {
|
||||
if (metadata == ResourceType.APATITE.ordinal() && !isDreamcraftLoaded) {
|
||||
int fortuneModifier = world.rand.nextInt(fortune + 2) - 1;
|
||||
if (fortuneModifier < 0) {
|
||||
fortuneModifier = 0;
|
||||
|
||||
@@ -72,6 +72,12 @@ public abstract class ItemGE extends ItemForestry {
|
||||
if (individual.isAnalyzed()) {
|
||||
if (Proxies.common.isShiftDown()) {
|
||||
individual.addTooltip(list);
|
||||
individual.addDiscoveredBy(list);
|
||||
if (Proxies.common.isCtrlDown()) {
|
||||
individual.addLore(list);
|
||||
} else {
|
||||
list.add(EnumChatFormatting.ITALIC + "<" + StringUtil.localize("gui.tooltip.tml") + ">");
|
||||
}
|
||||
} else {
|
||||
list.add(EnumChatFormatting.ITALIC + "<" + StringUtil.localize("gui.tooltip.tmi") + ">");
|
||||
}
|
||||
|
||||
@@ -8,6 +8,8 @@
|
||||
******************************************************************************/
|
||||
package forestry.core.genetics.mutations;
|
||||
|
||||
import static forestry.core.utils.MathUtil.safeMultiply;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
@@ -126,7 +128,9 @@ public abstract class Mutation implements IMutationCustom {
|
||||
IGenome genome1, IClimateProvider climate) {
|
||||
float mutationChance = chance;
|
||||
for (IMutationCondition mutationCondition : mutationConditions) {
|
||||
mutationChance *= mutationCondition.getChance(world, x, y, z, allele0, allele1, genome0, genome1, climate);
|
||||
mutationChance = safeMultiply(
|
||||
mutationChance,
|
||||
mutationCondition.getChance(world, x, y, z, allele0, allele1, genome0, genome1, climate));
|
||||
if (mutationChance == 0) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -53,4 +53,13 @@ public abstract class ContainerItemInventory<I extends ItemInventory> extends Co
|
||||
inventory.onSlotClick(player);
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void detectAndSendChanges() {
|
||||
if (!inventory.isParentItemEquipped()) {
|
||||
inventory.getPlayer().closeScreen();
|
||||
return;
|
||||
}
|
||||
super.detectAndSendChanges();
|
||||
}
|
||||
}
|
||||
@@ -78,6 +78,14 @@ public abstract class ItemInventory implements IInventory, IFilterSlotDelegate {
|
||||
}
|
||||
}
|
||||
|
||||
public boolean isParentItemEquipped() {
|
||||
return isSameItemInventory(player.getCurrentEquippedItem(), parent);
|
||||
}
|
||||
|
||||
public EntityPlayer getPlayer() {
|
||||
return player;
|
||||
}
|
||||
|
||||
public boolean isParentItemInventory(ItemStack itemStack) {
|
||||
ItemStack parent = getParent();
|
||||
return isSameItemInventory(parent, itemStack);
|
||||
|
||||
@@ -8,6 +8,8 @@
|
||||
******************************************************************************/
|
||||
package forestry.core.items;
|
||||
|
||||
import static forestry.Forestry.isDreamcraftLoaded;
|
||||
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraftforge.oredict.OreDictionary;
|
||||
|
||||
@@ -87,19 +89,26 @@ public class ItemRegistryCore extends ItemRegistry {
|
||||
fertilizerBio = registerItem(new ItemForestry(), "fertilizerBio");
|
||||
fertilizerCompound = registerItem(new ItemForestryBonemeal(), "fertilizerCompound");
|
||||
|
||||
apatite = registerItem(new ItemForestry(), "apatite");
|
||||
OreDictionary.registerOre("gemApatite", apatite);
|
||||
|
||||
researchNote = registerItem(new ItemResearchNote(), "researchNote");
|
||||
|
||||
ingotCopper = registerItem(new ItemForestry(), "ingotCopper");
|
||||
OreDictionary.registerOre("ingotCopper", ingotCopper);
|
||||
if (!isDreamcraftLoaded) {
|
||||
apatite = registerItem(new ItemForestry(), "apatite");
|
||||
OreDictionary.registerOre("gemApatite", apatite);
|
||||
|
||||
ingotTin = registerItem(new ItemForestry(), "ingotTin");
|
||||
OreDictionary.registerOre("ingotTin", ingotTin);
|
||||
ingotCopper = registerItem(new ItemForestry(), "ingotCopper");
|
||||
OreDictionary.registerOre("ingotCopper", ingotCopper);
|
||||
|
||||
ingotBronze = registerItem(new ItemForestry(), "ingotBronze");
|
||||
OreDictionary.registerOre("ingotBronze", ingotBronze);
|
||||
ingotTin = registerItem(new ItemForestry(), "ingotTin");
|
||||
OreDictionary.registerOre("ingotTin", ingotTin);
|
||||
|
||||
ingotBronze = registerItem(new ItemForestry(), "ingotBronze");
|
||||
OreDictionary.registerOre("ingotBronze", ingotBronze);
|
||||
} else {
|
||||
apatite = null;
|
||||
ingotCopper = null;
|
||||
ingotTin = null;
|
||||
ingotBronze = null;
|
||||
}
|
||||
|
||||
wrench = registerItem(new ItemWrench(), "wrench");
|
||||
pipette = registerItem(new ItemPipette(), "pipette");
|
||||
|
||||
@@ -61,6 +61,10 @@ public class ProxyCommon {
|
||||
return false;
|
||||
}
|
||||
|
||||
public boolean isCtrlDown() {
|
||||
return false;
|
||||
}
|
||||
|
||||
public void playSoundFX(World world, int x, int y, int z, Block block) {
|
||||
Proxies.net.sendNetworkPacket(new PacketFXSignal(PacketFXSignal.SoundFXType.LEAF, x, y, z, block, 0), world);
|
||||
}
|
||||
|
||||
@@ -63,6 +63,11 @@ public class ProxyCommonClient extends ProxyCommon {
|
||||
return Keyboard.isKeyDown(Keyboard.KEY_LSHIFT) || Keyboard.isKeyDown(Keyboard.KEY_RSHIFT);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isCtrlDown() {
|
||||
return Keyboard.isKeyDown(Keyboard.KEY_LCONTROL) || Keyboard.isKeyDown(Keyboard.KEY_RCONTROL);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getDisplayName(ItemStack itemstack) {
|
||||
return itemstack.getItem().getItemStackDisplayName(itemstack);
|
||||
|
||||
@@ -241,16 +241,16 @@ public abstract class BlockUtil {
|
||||
if (bw) try {
|
||||
// noinspection unchecked
|
||||
BW_MetaGenerated_WerkstoffBlocksClass = (Class<? extends Block>) Class
|
||||
.forName("com.github.bartimaeusnek.bartworks.system.material.BW_MetaGenerated_WerkstoffBlocks");
|
||||
BWBlocks = (Block) Class.forName("com.github.bartimaeusnek.bartworks.system.material.WerkstoffLoader")
|
||||
.getField("BWBlocks").get(null);
|
||||
.forName("bartworks.system.material.BWMetaGeneratedWerkstoffBlocks");
|
||||
BWBlocks = (Block) Class.forName("bartworks.system.material.WerkstoffLoader").getField("BWBlocks")
|
||||
.get(null);
|
||||
} catch (ClassNotFoundException | NoSuchFieldException | IllegalAccessException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
if (gt) try {
|
||||
// noinspection unchecked
|
||||
GTBlockMachines_Class = (Class<? extends Block>) Class.forName("gregtech.common.blocks.GT_Block_Machines");
|
||||
GTBlockMachines = (Block) Class.forName("gregtech.api.GregTech_API").getField("sBlockMachines").get(null);
|
||||
GTBlockMachines_Class = (Class<? extends Block>) Class.forName("gregtech.common.blocks.BlockMachines");
|
||||
GTBlockMachines = (Block) Class.forName("gregtech.api.GregTechAPI").getField("sBlockMachines").get(null);
|
||||
} catch (ClassNotFoundException | NoSuchFieldException | IllegalAccessException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
@@ -0,0 +1,30 @@
|
||||
package forestry.core.utils;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
|
||||
public class MathUtil {
|
||||
|
||||
private static final BigDecimal MAX_FLOAT = BigDecimal.valueOf(Float.MAX_VALUE);
|
||||
private static final BigDecimal MIN_FLOAT = BigDecimal.valueOf(-Float.MAX_VALUE);
|
||||
|
||||
private static float clampToFloatRange(BigDecimal result) {
|
||||
if (result.compareTo(MAX_FLOAT) > 0) {
|
||||
return Float.MAX_VALUE;
|
||||
} else if (result.compareTo(MIN_FLOAT) < 0) {
|
||||
return -Float.MAX_VALUE;
|
||||
}
|
||||
return result.floatValue();
|
||||
}
|
||||
|
||||
public static float safeMultiply(float a, float b) {
|
||||
BigDecimal bigA = BigDecimal.valueOf(a);
|
||||
BigDecimal bigB = BigDecimal.valueOf(b);
|
||||
return clampToFloatRange(bigA.multiply(bigB));
|
||||
}
|
||||
|
||||
public static float safeAdd(float a, float b) {
|
||||
BigDecimal bigA = BigDecimal.valueOf(a);
|
||||
BigDecimal bigB = BigDecimal.valueOf(b);
|
||||
return clampToFloatRange(bigA.add(bigB));
|
||||
}
|
||||
}
|
||||
@@ -73,9 +73,9 @@ public class Vect implements IVect {
|
||||
}
|
||||
|
||||
public static Vect getRandomPositionInArea(Random random, IVect area) {
|
||||
int x = random.nextInt(area.getX());
|
||||
int y = random.nextInt(area.getY());
|
||||
int z = random.nextInt(area.getZ());
|
||||
int x = random.nextInt(area.getX() + 1);
|
||||
int y = random.nextInt(area.getY() + 1);
|
||||
int z = random.nextInt(area.getZ() + 1);
|
||||
return new Vect(x, y, z);
|
||||
}
|
||||
|
||||
|
||||
@@ -14,6 +14,8 @@ import java.util.Locale;
|
||||
import java.util.Map;
|
||||
import java.util.Random;
|
||||
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.gui.FontRenderer;
|
||||
import net.minecraft.entity.EntityCreature;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.nbt.NBTTagCompound;
|
||||
@@ -60,6 +62,36 @@ public class Butterfly extends IndividualLiving implements IButterfly {
|
||||
this.genome = genome;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addLore(List<String> text) {
|
||||
IAlleleButterflySpecies primary = genome.getPrimary();
|
||||
String descTokens[] = primary.getDescription().split("\\|");
|
||||
|
||||
if (descTokens.length > 0) {
|
||||
String speciesLore = descTokens[0];
|
||||
if (!speciesLore.isEmpty() && !speciesLore.contains("for.description")) {
|
||||
FontRenderer fontRenderer = Minecraft.getMinecraft().fontRenderer;
|
||||
String formattedLore = EnumChatFormatting.GOLD + speciesLore;
|
||||
List<String> formattedLoreList = fontRenderer.listFormattedStringToWidth(formattedLore, 200);
|
||||
text.addAll(formattedLoreList);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addDiscoveredBy(List<String> text) {
|
||||
IAlleleButterflySpecies primary = genome.getPrimary();
|
||||
String descTokens[] = primary.getDescription().split("\\|");
|
||||
|
||||
if (descTokens.length > 2) {
|
||||
String discoveredBy = descTokens[2];
|
||||
if (!discoveredBy.isEmpty()) {
|
||||
text.add("");
|
||||
text.add("Discovered by " + EnumChatFormatting.ITALIC + discoveredBy);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addTooltip(List<String> list) {
|
||||
IAlleleButterflySpecies primary = genome.getPrimary();
|
||||
|
||||
@@ -8,6 +8,8 @@
|
||||
******************************************************************************/
|
||||
package forestry.plugins;
|
||||
|
||||
import static forestry.Forestry.isDreamcraftLoaded;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
import net.minecraft.command.ICommand;
|
||||
@@ -132,14 +134,16 @@ public class PluginCore extends ForestryPlugin {
|
||||
|
||||
// forestry items
|
||||
crateRegistry.registerCrate(items.peat, "cratedPeat");
|
||||
crateRegistry.registerCrate(items.apatite, "cratedApatite");
|
||||
crateRegistry.registerCrate(items.fertilizerCompound, "cratedFertilizer");
|
||||
crateRegistry.registerCrate(items.mulch, "cratedMulch");
|
||||
crateRegistry.registerCrate(items.phosphor, "cratedPhosphor");
|
||||
crateRegistry.registerCrate(items.ash, "cratedAsh");
|
||||
crateRegistry.registerCrateUsingOreDict(items.ingotTin, "cratedTin");
|
||||
crateRegistry.registerCrateUsingOreDict(items.ingotCopper, "cratedCopper");
|
||||
crateRegistry.registerCrateUsingOreDict(items.ingotBronze, "cratedBronze");
|
||||
if (!isDreamcraftLoaded) {
|
||||
crateRegistry.registerCrate(items.apatite, "cratedApatite");
|
||||
crateRegistry.registerCrateUsingOreDict(items.ingotTin, "cratedTin");
|
||||
crateRegistry.registerCrateUsingOreDict(items.ingotCopper, "cratedCopper");
|
||||
crateRegistry.registerCrateUsingOreDict(items.ingotBronze, "cratedBronze");
|
||||
}
|
||||
|
||||
// forestry blocks
|
||||
crateRegistry.registerCrate(blocks.soil.get(BlockSoil.SoilType.HUMUS, 1), "cratedHumus");
|
||||
@@ -195,9 +199,14 @@ public class PluginCore extends ForestryPlugin {
|
||||
protected void registerRecipes() {
|
||||
|
||||
/* SMELTING RECIPES */
|
||||
RecipeUtil.addSmelting(blocks.resources.get(BlockResourceOre.ResourceType.APATITE, 1), items.apatite, 0.5f);
|
||||
RecipeUtil.addSmelting(blocks.resources.get(BlockResourceOre.ResourceType.COPPER, 1), items.ingotCopper, 0.5f);
|
||||
RecipeUtil.addSmelting(blocks.resources.get(BlockResourceOre.ResourceType.TIN, 1), items.ingotTin, 0.5f);
|
||||
if (!isDreamcraftLoaded) {
|
||||
RecipeUtil.addSmelting(blocks.resources.get(BlockResourceOre.ResourceType.APATITE, 1), items.apatite, 0.5f);
|
||||
RecipeUtil.addSmelting(
|
||||
blocks.resources.get(BlockResourceOre.ResourceType.COPPER, 1),
|
||||
items.ingotCopper,
|
||||
0.5f);
|
||||
RecipeUtil.addSmelting(blocks.resources.get(BlockResourceOre.ResourceType.TIN, 1), items.ingotTin, 0.5f);
|
||||
}
|
||||
RecipeUtil.addSmelting(new ItemStack(items.peat), items.ash, 0.0f);
|
||||
|
||||
/* BRONZE INGOTS */
|
||||
@@ -382,41 +391,43 @@ public class PluginCore extends ForestryPlugin {
|
||||
new ItemStack(Blocks.wool, 1, OreDictionary.WILDCARD_VALUE));
|
||||
|
||||
// Storage Blocks
|
||||
RecipeUtil.addRecipe(
|
||||
blocks.resourceStorage.get(BlockResourceStorage.ResourceType.APATITE),
|
||||
"###",
|
||||
"###",
|
||||
"###",
|
||||
'#',
|
||||
"gemApatite");
|
||||
RecipeUtil.addShapelessRecipe(new ItemStack(items.apatite, 9), "blockApatite");
|
||||
if (!isDreamcraftLoaded) {
|
||||
RecipeUtil.addRecipe(
|
||||
blocks.resourceStorage.get(BlockResourceStorage.ResourceType.APATITE),
|
||||
"###",
|
||||
"###",
|
||||
"###",
|
||||
'#',
|
||||
"gemApatite");
|
||||
RecipeUtil.addShapelessRecipe(new ItemStack(items.apatite, 9), "blockApatite");
|
||||
|
||||
RecipeUtil.addRecipe(
|
||||
blocks.resourceStorage.get(BlockResourceStorage.ResourceType.COPPER),
|
||||
"###",
|
||||
"###",
|
||||
"###",
|
||||
'#',
|
||||
"ingotCopper");
|
||||
RecipeUtil.addShapelessRecipe(new ItemStack(items.ingotCopper, 9), "blockCopper");
|
||||
RecipeUtil.addRecipe(
|
||||
blocks.resourceStorage.get(BlockResourceStorage.ResourceType.COPPER),
|
||||
"###",
|
||||
"###",
|
||||
"###",
|
||||
'#',
|
||||
"ingotCopper");
|
||||
RecipeUtil.addShapelessRecipe(new ItemStack(items.ingotCopper, 9), "blockCopper");
|
||||
|
||||
RecipeUtil.addRecipe(
|
||||
blocks.resourceStorage.get(BlockResourceStorage.ResourceType.TIN),
|
||||
"###",
|
||||
"###",
|
||||
"###",
|
||||
'#',
|
||||
"ingotTin");
|
||||
RecipeUtil.addShapelessRecipe(new ItemStack(items.ingotTin, 9), "blockTin");
|
||||
RecipeUtil.addRecipe(
|
||||
blocks.resourceStorage.get(BlockResourceStorage.ResourceType.TIN),
|
||||
"###",
|
||||
"###",
|
||||
"###",
|
||||
'#',
|
||||
"ingotTin");
|
||||
RecipeUtil.addShapelessRecipe(new ItemStack(items.ingotTin, 9), "blockTin");
|
||||
|
||||
RecipeUtil.addRecipe(
|
||||
blocks.resourceStorage.get(BlockResourceStorage.ResourceType.BRONZE),
|
||||
"###",
|
||||
"###",
|
||||
"###",
|
||||
'#',
|
||||
"ingotBronze");
|
||||
RecipeUtil.addShapelessRecipe(new ItemStack(items.ingotBronze, 9), "blockBronze");
|
||||
RecipeUtil.addRecipe(
|
||||
blocks.resourceStorage.get(BlockResourceStorage.ResourceType.BRONZE),
|
||||
"###",
|
||||
"###",
|
||||
"###",
|
||||
'#',
|
||||
"ingotBronze");
|
||||
RecipeUtil.addShapelessRecipe(new ItemStack(items.ingotBronze, 9), "blockBronze");
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -8,6 +8,8 @@
|
||||
******************************************************************************/
|
||||
package forestry.plugins;
|
||||
|
||||
import static forestry.Forestry.isDreamcraftLoaded;
|
||||
|
||||
import net.minecraft.init.Blocks;
|
||||
import net.minecraft.init.Items;
|
||||
import net.minecraft.item.ItemStack;
|
||||
@@ -644,18 +646,20 @@ public class PluginFactory extends ForestryPlugin {
|
||||
new Object[] { " # ", " X ", " X ", '#', "ingotBronze", 'X', "stickWood" });
|
||||
|
||||
// Reclamation
|
||||
RecipeManagers.carpenterManager.addRecipe(
|
||||
null,
|
||||
PluginCore.items.ingotBronze.getItemStack(2),
|
||||
"#",
|
||||
'#',
|
||||
PluginCore.items.brokenBronzePickaxe);
|
||||
RecipeManagers.carpenterManager.addRecipe(
|
||||
null,
|
||||
PluginCore.items.ingotBronze.getItemStack(),
|
||||
"#",
|
||||
'#',
|
||||
PluginCore.items.brokenBronzeShovel);
|
||||
if (!isDreamcraftLoaded) {
|
||||
RecipeManagers.carpenterManager.addRecipe(
|
||||
null,
|
||||
PluginCore.items.ingotBronze.getItemStack(2),
|
||||
"#",
|
||||
'#',
|
||||
PluginCore.items.brokenBronzePickaxe);
|
||||
RecipeManagers.carpenterManager.addRecipe(
|
||||
null,
|
||||
PluginCore.items.ingotBronze.getItemStack(),
|
||||
"#",
|
||||
'#',
|
||||
PluginCore.items.brokenBronzeShovel);
|
||||
}
|
||||
|
||||
// Crating and uncrating
|
||||
if (PluginManager.Module.STORAGE.isEnabled()) {
|
||||
|
||||
@@ -8,6 +8,8 @@
|
||||
******************************************************************************/
|
||||
package forestry.plugins;
|
||||
|
||||
import static forestry.Forestry.isDreamcraftLoaded;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
@@ -130,11 +132,13 @@ public class PluginFluids extends ForestryPlugin {
|
||||
}
|
||||
|
||||
if (RecipeManagers.squeezerManager != null) {
|
||||
RecipeManagers.squeezerManager.addContainerRecipe(
|
||||
10,
|
||||
items.canEmpty.getItemStack(),
|
||||
PluginCore.items.ingotTin.getItemStack(),
|
||||
0.05f);
|
||||
if (!isDreamcraftLoaded) {
|
||||
RecipeManagers.squeezerManager.addContainerRecipe(
|
||||
10,
|
||||
items.canEmpty.getItemStack(),
|
||||
PluginCore.items.ingotTin.getItemStack(),
|
||||
0.05f);
|
||||
}
|
||||
RecipeManagers.squeezerManager.addContainerRecipe(
|
||||
10,
|
||||
items.waxCapsuleEmpty.getItemStack(),
|
||||
|
||||
@@ -335,6 +335,7 @@ for.gui.temperature=Temperatur
|
||||
for.gui.tolerance=Toleranz
|
||||
for.gui.temptol=Temp.Tol
|
||||
for.gui.tooltip.tmi=Drücke die Umschalttaste für mehr Infos.
|
||||
for.gui.tooltip.tml=Drücke die Steuerungstaste für mehr Geschichte.
|
||||
for.gui.triple=Dreifache
|
||||
for.gui.unknown=Unbekannt
|
||||
for.gui.warm=Warm
|
||||
|
||||
@@ -341,6 +341,7 @@ for.gui.temperature=Temperature
|
||||
for.gui.tolerance=Tolerance
|
||||
for.gui.temptol=Temperature Tol.
|
||||
for.gui.tooltip.tmi=Hold shift for details
|
||||
for.gui.tooltip.tml=Hold ctrl for lore
|
||||
for.gui.triple=Triple
|
||||
for.gui.unknown=Unknown genome
|
||||
for.gui.warm=Warm
|
||||
|
||||
@@ -244,6 +244,7 @@ gui.higher=Higher
|
||||
gui.highest=Highest
|
||||
gui.fecundated=Mated
|
||||
gui.tooltip.tmi=Hold shift for details
|
||||
gui.tooltip.tml=Hold ctrl for lore
|
||||
gui.worktable.clear=Click to clear Grid
|
||||
gui.escritoire.probe=Examine Specimens
|
||||
hints.beebiomes.tag=Choose your biome!
|
||||
|
||||
Reference in new issue
Block a user