Oil and pollution overhaul

This commit is contained in:
Technus 2017-05-01 08:18:30 +02:00
parent 1bafd2ad55
commit c12e474c23
21 changed files with 339 additions and 284 deletions

View file

@ -108,7 +108,7 @@ public interface IEnergyConnected extends IColoredTileEntity, IHasWorldObjectAnd
tWorld.setBlock(tX, tY, tZ, Blocks.air); tWorld.setBlock(tX, tY, tZ, Blocks.air);
if (GregTech_API.sMachineExplosions) if (GregTech_API.sMachineExplosions)
if(GT_Mod.gregtechproxy.mPollution) if(GT_Mod.gregtechproxy.mPollution)
GT_Pollution.addPollution(tWorld,new ChunkPosition(tX, tY, tZ), 100000); GT_Pollution.addPollution(tWorld.getChunkFromBlockCoords(tX,tZ), 100000);
tWorld.createExplosion(null, tX + 0.5, tY + 0.5, tZ + 0.5, tStrength, true); tWorld.createExplosion(null, tX + 0.5, tY + 0.5, tZ + 0.5, tStrength, true);
} }
} }

View file

@ -1147,7 +1147,8 @@ public class BaseMetaTileEntity extends BaseTileEntity implements IGregTechTileE
} }
} }
} }
GT_Pollution.addPollution(getWorld(), new ChunkPosition(getXCoord(), getYCoord(), getZCoord()), 100000);
GT_Pollution.addPollution(this, 100000);
mMetaTileEntity.doExplosion(aAmount); mMetaTileEntity.doExplosion(aAmount);
} }
} }

View file

@ -668,7 +668,7 @@ public abstract class MetaPipeEntity implements IMetaTileEntity {
tWorld.setBlock(tX, tY, tZ, Blocks.air); tWorld.setBlock(tX, tY, tZ, Blocks.air);
if (GregTech_API.sMachineExplosions) if (GregTech_API.sMachineExplosions)
if(GT_Mod.gregtechproxy.mPollution) if(GT_Mod.gregtechproxy.mPollution)
GT_Pollution.addPollution(getBaseMetaTileEntity().getWorld(),new ChunkPosition(tX, tY, tZ), 100000); GT_Pollution.addPollution(getBaseMetaTileEntity(), 100000);
tWorld.createExplosion(null, tX + 0.5, tY + 0.5, tZ + 0.5, tStrength, true); tWorld.createExplosion(null, tX + 0.5, tY + 0.5, tZ + 0.5, tStrength, true);
} }

View file

@ -857,8 +857,6 @@ public abstract class MetaTileEntity implements IMetaTileEntity {
GT_Utility.sendSoundToPlayers(tWorld, GregTech_API.sSoundList.get(209), 1.0F, -1, tX, tY, tZ); GT_Utility.sendSoundToPlayers(tWorld, GregTech_API.sSoundList.get(209), 1.0F, -1, tX, tY, tZ);
tWorld.setBlock(tX, tY, tZ, Blocks.air); tWorld.setBlock(tX, tY, tZ, Blocks.air);
if (GregTech_API.sMachineExplosions) if (GregTech_API.sMachineExplosions)
if(GT_Mod.gregtechproxy.mPollution)
GT_Pollution.addPollution(tWorld,new ChunkPosition(tX, tY, tZ), 100000);
tWorld.createExplosion(null, tX + 0.5, tY + 0.5, tZ + 0.5, tStrength, true); tWorld.createExplosion(null, tX + 0.5, tY + 0.5, tZ + 0.5, tStrength, true);
} }

View file

@ -212,8 +212,7 @@ public abstract class GT_MetaTileEntity_BasicGenerator extends GT_MetaTileEntity
long tFluidAmountToUse = Math.min(mFluid.amount / tConsumed, (maxEUStore() - aBaseMetaTileEntity.getUniversalEnergyStored()) / tFuelValue); long tFluidAmountToUse = Math.min(mFluid.amount / tConsumed, (maxEUStore() - aBaseMetaTileEntity.getUniversalEnergyStored()) / tFuelValue);
//long tFluidAmountToUse = Math.min(mFluid.amount / tConsumed, (maxEUOutput() * 20 + getMinimumStoredEU() - aBaseMetaTileEntity.getUniversalEnergyStored()) / tFuelValue);//TODO CHECK //long tFluidAmountToUse = Math.min(mFluid.amount / tConsumed, (maxEUOutput() * 20 + getMinimumStoredEU() - aBaseMetaTileEntity.getUniversalEnergyStored()) / tFuelValue);//TODO CHECK
if (tFluidAmountToUse > 0 && aBaseMetaTileEntity.increaseStoredEnergyUnits(tFluidAmountToUse * tFuelValue, true)) { if (tFluidAmountToUse > 0 && aBaseMetaTileEntity.increaseStoredEnergyUnits(tFluidAmountToUse * tFuelValue, true)) {
GT_Pollution.addPollution(this.getBaseMetaTileEntity().getWorld(), new ChunkPosition(this.getBaseMetaTileEntity().getXCoord(), this.getBaseMetaTileEntity().getYCoord(), this.getBaseMetaTileEntity().getZCoord()), GT_Pollution.addPollution(getBaseMetaTileEntity(),10 * getPollution());
10 * getPollution());
mFluid.amount -= tFluidAmountToUse * tConsumed; mFluid.amount -= tFluidAmountToUse * tConsumed;
} }
} }
@ -225,8 +224,7 @@ public abstract class GT_MetaTileEntity_BasicGenerator extends GT_MetaTileEntity
if (aBaseMetaTileEntity.addStackToSlot(getOutputSlot(), tEmptyContainer)) { if (aBaseMetaTileEntity.addStackToSlot(getOutputSlot(), tEmptyContainer)) {
aBaseMetaTileEntity.increaseStoredEnergyUnits(tFuelValue, true); aBaseMetaTileEntity.increaseStoredEnergyUnits(tFuelValue, true);
aBaseMetaTileEntity.decrStackSize(getInputSlot(), 1); aBaseMetaTileEntity.decrStackSize(getInputSlot(), 1);
GT_Pollution.addPollution(this.getBaseMetaTileEntity().getWorld(), new ChunkPosition(this.getBaseMetaTileEntity().getXCoord(), this.getBaseMetaTileEntity().getYCoord(), this.getBaseMetaTileEntity().getZCoord()), GT_Pollution.addPollution(getBaseMetaTileEntity(),10 * getPollution());
10 * getPollution());
} }
} }
} }

View file

@ -73,7 +73,7 @@ public class GT_MetaTileEntity_Hatch_Muffler extends GT_MetaTileEntity_Hatch {
public boolean polluteEnvironment() { public boolean polluteEnvironment() {
if (getBaseMetaTileEntity().getAirAtSide(getBaseMetaTileEntity().getFrontFacing())) { if (getBaseMetaTileEntity().getAirAtSide(getBaseMetaTileEntity().getFrontFacing())) {
GT_Pollution.addPollution(this.getBaseMetaTileEntity().getWorld(), new ChunkPosition(this.getBaseMetaTileEntity().getXCoord(), this.getBaseMetaTileEntity().getYCoord(), this.getBaseMetaTileEntity().getZCoord()), calculatePollutionReduction(10000)); GT_Pollution.addPollution(getBaseMetaTileEntity(), calculatePollutionReduction(10000));
return true; return true;
} }
return false; return false;
@ -106,7 +106,7 @@ public class GT_MetaTileEntity_Hatch_Muffler extends GT_MetaTileEntity_Hatch {
boolean chk1,chk2,chk3; boolean chk1,chk2,chk3;
float ran1=floatGen.nextFloat(),ran2=0,ran3=0; float ran1=floatGen.nextFloat(),ran2=0,ran3=0;
chk1=ran1*100<calculatePollutionReduction(100); chk1=ran1*100<calculatePollutionReduction(100);
if(GT_Pollution.getPollutionAtCoords(aWorld,this.getBaseMetaTileEntity().getXCoord(), this.getBaseMetaTileEntity().getZCoord())>= GT_Mod.gregtechproxy.mPollutionSmogLimit){ if(GT_Pollution.getPollution(getBaseMetaTileEntity())>= GT_Mod.gregtechproxy.mPollutionSmogLimit){
ran2=floatGen.nextFloat(); ran2=floatGen.nextFloat();
ran3=floatGen.nextFloat(); ran3=floatGen.nextFloat();
chk2=ran2*100<calculatePollutionReduction(100); chk2=ran2*100<calculatePollutionReduction(100);

View file

@ -502,7 +502,7 @@ public abstract class GT_MetaTileEntity_MultiBlockBase extends MetaTileEntity {
} }
public void explodeMultiblock() { public void explodeMultiblock() {
GT_Pollution.addPollution(getBaseMetaTileEntity().getWorld(),new ChunkPosition(this.getBaseMetaTileEntity().getXCoord(), this.getBaseMetaTileEntity().getYCoord(), this.getBaseMetaTileEntity().getZCoord()), 300000); GT_Pollution.addPollution(getBaseMetaTileEntity(), 300000);
mInventory[1] = null; mInventory[1] = null;
for (MetaTileEntity tTileEntity : mInputBusses) tTileEntity.getBaseMetaTileEntity().doExplosion(V[8]); for (MetaTileEntity tTileEntity : mInputBusses) tTileEntity.getBaseMetaTileEntity().doExplosion(V[8]);
for (MetaTileEntity tTileEntity : mOutputBusses) tTileEntity.getBaseMetaTileEntity().doExplosion(V[8]); for (MetaTileEntity tTileEntity : mOutputBusses) tTileEntity.getBaseMetaTileEntity().doExplosion(V[8]);

View file

@ -18,7 +18,7 @@ public class GT_UO_Dimension {
private int maxChance; private int maxChance;
public String Dimension = "null"; public String Dimension = "null";
public GT_UO_Dimension(ConfigCategory aConfigCategory) { public GT_UO_Dimension(ConfigCategory aConfigCategory) {//TODO CONFIGURE
fFluids = HashBiMap.create(); fFluids = HashBiMap.create();
if (aConfigCategory.containsKey("Dimension")) if (aConfigCategory.containsKey("Dimension"))
{ {
@ -35,18 +35,14 @@ public class GT_UO_Dimension {
} }
public GT_UO_Fluid getRandomFluid (Random aRandom) { public GT_UO_Fluid getRandomFluid (Random aRandom) {
int random = aRandom.nextInt(3); int random = aRandom.nextInt(1000);
random = aRandom.nextInt(1000);
int step = 0;
for (BiMap.Entry<String, GT_UO_Fluid> fl : fFluids.entrySet()) { for (BiMap.Entry<String, GT_UO_Fluid> fl : fFluids.entrySet()) {
int chance = fl.getValue().Chance*1000/maxChance; int chance = fl.getValue().Chance*1000/maxChance;
if (random<=chance) return fl.getValue(); if (random<=chance) return fl.getValue();
//System.out.println("GT UO "+fl.getValue().Registry+" Chance:"+chance+" Random:"+random); //System.out.println("GT UO "+fl.getValue().Registry+" Chance:"+chance+" Random:"+random);
random-=chance; random-=chance;
} }
return null; return null;
} }
} }

View file

@ -48,15 +48,16 @@ public class GT_UO_DimensionList {
fConfig.get(Category, "MaxAmount", aMaxAmount).getInt(aMaxAmount); fConfig.get(Category, "MaxAmount", aMaxAmount).getInt(aMaxAmount);
fConfig.get(Category, "Chance", aChance).getInt(aChance); fConfig.get(Category, "Chance", aChance).getInt(aChance);
fConfig.get(Category, "DecreasePerOperationAmount", aDecreasePerOperationAmount).getInt(aDecreasePerOperationAmount); fConfig.get(Category, "DecreasePerOperationAmount", aDecreasePerOperationAmount).getInt(aDecreasePerOperationAmount);
//IT IS IN BUCKETS!!!
} }
public void SetDafultValues() { public void SetDafultValues() {
SetConfigValues("Overworld", "0", "gas_natural_gas", "gas_natural_gas", 0, 625, 20, 5); SetConfigValues("Overworld", "0", "gas_natural_gas", "gas_natural_gas", 0, 625, 20, 7);
SetConfigValues("Overworld", "0", "liquid_light_oil", "liquid_light_oil", 0, 625, 20, 5); SetConfigValues("Overworld", "0", "liquid_light_oil", "liquid_light_oil", 0, 625, 20, 5);
SetConfigValues("Overworld", "0", "liquid_medium_oil", "liquid_medium_oil", 0, 625, 20, 5); SetConfigValues("Overworld", "0", "liquid_medium_oil", "liquid_medium_oil", 0, 625, 20, 3);
SetConfigValues("Overworld", "0", "liquid_heavy_oil", "liquid_heavy_oil", 0, 625, 20, 5); SetConfigValues("Overworld", "0", "liquid_heavy_oil", "liquid_heavy_oil", 0, 625, 20, 1);
SetConfigValues("Overworld", "0", "oil", "oil", 0, 625, 20, 5); SetConfigValues("Overworld", "0", "oil", "oil", 0, 625, 20, 3);
SetConfigValues("Moon", "Moon", "helium-3", "helium-3", 0, 375, 100, 5); SetConfigValues("Moon", "Moon", "helium-3", "helium-3", 1, 375, 100, 1);
} }
public void getConfig(Configuration aConfig, String aCategory) { public void getConfig(Configuration aConfig, String aCategory) {

View file

@ -14,7 +14,7 @@ public class GT_UO_Fluid {
public int MaxAmount = 0; public int MaxAmount = 0;
public int MinAmount = 0; public int MinAmount = 0;
public int Chance = 0; public int Chance = 0;
public int DecreasePerOperationAmount = 5; public int DecreasePerOperationAmountInBuckets = 5;
public GT_UO_Fluid(ConfigCategory aConfigCategory) {//TODO CONFIGURE public GT_UO_Fluid(ConfigCategory aConfigCategory) {//TODO CONFIGURE
if (aConfigCategory.containsKey("Registry")) if (aConfigCategory.containsKey("Registry"))
@ -40,7 +40,7 @@ public class GT_UO_Fluid {
if (aConfigCategory.containsKey("DecreasePerOperationAmount")) if (aConfigCategory.containsKey("DecreasePerOperationAmount"))
{ {
aConfigCategory.get("DecreasePerOperationAmount").comment = "Decrease per operation Amount (X/5000L per operation)"; aConfigCategory.get("DecreasePerOperationAmount").comment = "Decrease per operation Amount (X/5000L per operation)";
DecreasePerOperationAmount = aConfigCategory.get("DecreasePerOperationAmount").getInt(5); DecreasePerOperationAmountInBuckets = aConfigCategory.get("DecreasePerOperationAmount").getInt(5);
} }
//System.out.println("GT UO "+aConfigCategory.getName()+" Fluid:"+Registry+" Max:"+MaxAmount+" Min:"+MinAmount+" Chance:"+Chance); //System.out.println("GT UO "+aConfigCategory.getName()+" Fluid:"+Registry+" Max:"+MaxAmount+" Min:"+MinAmount+" Chance:"+Chance);
} }
@ -53,7 +53,7 @@ public class GT_UO_Fluid {
} }
} }
public int getRandomAmount(Random aRandom){ public int getRandomAmount(Random aRandom){//generates milliBuckets
int r1 = (int)Math.round(Math.pow((MaxAmount-MinAmount)*500000.d, 0.2)); int r1 = (int)Math.round(Math.pow((MaxAmount-MinAmount)*500000.d, 0.2));
int r2 = (int)Math.floor(Math.pow(MinAmount*500000.d, 0.2)); int r2 = (int)Math.floor(Math.pow(MinAmount*500000.d, 0.2));
double amount = aRandom.nextInt(r1)+r2+aRandom.nextDouble(); double amount = aRandom.nextInt(r1)+r2+aRandom.nextDouble();

View file

@ -56,9 +56,11 @@ import net.minecraft.util.AxisAlignedBB;
import net.minecraft.util.ChatComponentText; import net.minecraft.util.ChatComponentText;
import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.EnumChatFormatting;
import net.minecraft.util.MathHelper; import net.minecraft.util.MathHelper;
import net.minecraft.world.ChunkCoordIntPair;
import net.minecraft.world.ChunkPosition; import net.minecraft.world.ChunkPosition;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.minecraft.world.WorldServer; import net.minecraft.world.WorldServer;
import net.minecraft.world.chunk.Chunk;
import net.minecraftforge.common.DimensionManager; import net.minecraftforge.common.DimensionManager;
import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.common.util.ForgeDirection; import net.minecraftforge.common.util.ForgeDirection;
@ -75,6 +77,9 @@ import java.util.*;
import java.util.Map.Entry; import java.util.Map.Entry;
import static gregtech.api.enums.GT_Values.*; import static gregtech.api.enums.GT_Values.*;
import static gregtech.common.GT_Proxy.GTPOLLUTION;
import static gregtech.common.GT_Proxy.dimensionWiseChunkData;
import static gregtech.common.GT_UndergroundOil.undergroundOil;
/** /**
* NEVER INCLUDE THIS FILE IN YOUR MOD!!! * NEVER INCLUDE THIS FILE IN YOUR MOD!!!
@ -1575,114 +1580,6 @@ public class GT_Utility {
return (int)Math.floor(aValue / aScale); return (int)Math.floor(aValue / aScale);
} }
public static FluidStack getUndergroundOil(World aWorld, int aX, int aZ) {
return getUndergroundOil(aWorld, aX, aZ, false);
}
public static FluidStack getUndergroundOil(World aWorld, int aX, int aZ, boolean needConsumeOil) {//TODO RETROGEN!, CHECK FLUIDS AVAILABLE, REWORK
if (GT_Mod.gregtechproxy.mUndergroundOil.CheckBlackList(aWorld.provider.dimensionId))
return null;
XSTR tRandom = new XSTR((aWorld.getSeed() + aWorld.provider.dimensionId * 2 + (getScaleCoordinates(aX,96)) + (7 * (getScaleCoordinates(aZ,96)))));
int tAmount = 0;
int tFluidId = 0;
int tDecreasePerOperationAmount = 5;
Fluid tFluid = null;
// System.out.println("Dimension: "+GT_Mod.gregtechproxy.mUndergroundOil.GetDimension(aWorld.provider.dimensionId).Dimension);
try {
GT_UO_Fluid uoFluid = GT_Mod.gregtechproxy.mUndergroundOil.GetDimension(aWorld.provider.dimensionId).getRandomFluid(tRandom);
if (uoFluid != null)
{
tFluid = uoFluid.getFluid();
tAmount = uoFluid.getRandomAmount(tRandom);
tDecreasePerOperationAmount = uoFluid.DecreasePerOperationAmount;
if (tFluid != null)
tFluidId = tFluid.getID();
//System.out.println("Fluid: ("+tFluidId+")"+tFluid.getName()+" Amount:"+tAmount);
}
} catch (Exception e) {
tAmount = 0;
tFluidId = 0;
}
try {
ChunkPosition tPos = new ChunkPosition(getScaleCoordinates(aX,16), aWorld.provider.dimensionId, getScaleCoordinates(aZ,16));
int[] tInts = new int[3];
if(GT_Proxy.chunkData.containsKey(tPos)){
tInts = GT_Proxy.chunkData.get(tPos);
if(tInts.length>0){
if(tInts[0]>0){tAmount = tInts[0];}
}
if(tInts.length>2){
if(tInts[2]>0&&tInts[2]!=tFluidId)
{
tFluidId = tInts[2];
tFluid = FluidRegistry.getFluid(tFluidId);
}
}
GT_Proxy.chunkData.remove(tPos);
}
if (needConsumeOil && tAmount >= 5000)
tAmount = tAmount - tDecreasePerOperationAmount;
tInts[0] = tAmount;
tInts[2] = tFluidId;
GT_Proxy.chunkData.put(tPos, tInts);
} catch (Exception e) {
System.out.println("getUndergroundOil() - Error put data");
}
if (tFluid!=null)
return new FluidStack(tFluid, tAmount);
return null;
}
//private static FluidStack getUndergroundOilFromInfo(int type,int amnt){
// switch (type) {//0 is old system
// case 1:
// return new FluidStack(Materials.OilLight .mFluid,amnt);
// case 2:
// return new FluidStack(Materials.OilMedium.mFluid,amnt);
// case 3:
// return new FluidStack(Materials.OilHeavy .mFluid,amnt);
// case 4:
// return new FluidStack(Materials.Oil .mFluid,amnt);
// }
// return new FluidStack(Materials.NatruralGas.mGas,amnt);//5
//}
//
//private static FluidStack setUndergroundOil(World aWorld, int aX, int aZ,ChunkPosition tPos,int[] tInts) {
// XSTR tRandom = new XSTR(aWorld.getSeed() ^ ((long)(aX / 6) + (long)(7000 * (aZ / 6))));
// int type=tRandom.nextInt(5);//type slowly changes
// int amnt = (int)(Math.ceil(Math.pow(2D+(double)(tRandom.nextInt(48))+(new XSTR()).nextDouble(),8D)/200000D));
// //roughly uses 28 bits
// FluidStack tFluidStack;
// switch (type) {//0 is old system
// case 1:
// tFluidStack=new FluidStack(Materials.OilLight .mFluid,amnt);
// break;
// case 2:
// tFluidStack=new FluidStack(Materials.OilMedium.mFluid,amnt);
// break;
// case 3:
// tFluidStack=new FluidStack(Materials.OilHeavy .mFluid,amnt);
// break;
// case 4:
// tFluidStack=new FluidStack(Materials.Oil .mFluid,amnt);
// break;
// default://case 0; -> 5
// type=5;//important, 0 is invalid !
// tFluidStack=new FluidStack(Materials.NatruralGas.mGas,amnt);//5
// }
//
// tInts[0]=(type<<28)+amnt;//here since the switch changes type
// //tInts[2]|=0x01;
// GT_Proxy.chunkData.put(tPos, tInts);
// return tFluidStack;
//}
public static int getCoordinateScan(ArrayList<String> aList, EntityPlayer aPlayer, World aWorld, int aScanLevel, int aX, int aY, int aZ, int aSide, float aClickX, float aClickY, float aClickZ) { public static int getCoordinateScan(ArrayList<String> aList, EntityPlayer aPlayer, World aWorld, int aScanLevel, int aX, int aY, int aZ, int aSide, float aClickX, float aClickY, float aClickZ) {
if (aList == null) return 0; if (aList == null) return 0;
@ -1872,23 +1769,23 @@ public class GT_Utility {
} }
} }
if (aPlayer.capabilities.isCreativeMode && GT_Values.D1) { if (aPlayer.capabilities.isCreativeMode && GT_Values.D1) {
FluidStack tFluid = getUndergroundOil(aWorld, aX, aZ); FluidStack tFluid = undergroundOil(aWorld.getChunkFromBlockCoords(aX,aZ),-1);//-# to only read
if (tFluid!=null) if (tFluid!=null)
tList.add(EnumChatFormatting.GOLD+tFluid.getLocalizedName()+EnumChatFormatting.RESET+": " +EnumChatFormatting.YELLOW+ tFluid.amount +EnumChatFormatting.RESET+" L"); tList.add(EnumChatFormatting.GOLD+tFluid.getLocalizedName()+EnumChatFormatting.RESET+": " +EnumChatFormatting.YELLOW+ tFluid.amount +EnumChatFormatting.RESET+" L");
else
tList.add(EnumChatFormatting.GOLD+"Nothing"+EnumChatFormatting.RESET+": " +EnumChatFormatting.YELLOW+ '0' +EnumChatFormatting.RESET+" L");
} }
// if(aPlayer.capabilities.isCreativeMode){ // if(aPlayer.capabilities.isCreativeMode){
ChunkPosition tPos = new ChunkPosition(getScaleCoordinates(aX,16), aWorld.provider.dimensionId, getScaleCoordinates(aZ,16)); int[] chunkData = GT_Proxy.dimensionWiseChunkData.get(aWorld.provider.dimensionId).get(aWorld.getChunkFromBlockCoords(aX,aZ).getChunkCoordIntPair());
if(GT_Proxy.chunkData.containsKey(tPos)){ if(chunkData !=null){
int[] tPollution = GT_Proxy.chunkData.get(tPos); if(chunkData[GTPOLLUTION]>0){
if(tPollution.length>1){ tList.add("Pollution in Chunk: "+EnumChatFormatting.RED+chunkData[GTPOLLUTION]+EnumChatFormatting.RESET+" gibbl");
tList.add("Pollution in Chunk: "+EnumChatFormatting.RED+tPollution[1]+EnumChatFormatting.RESET+" gibbl"); }else{
}else{
tList.add(EnumChatFormatting.GREEN+"No Pollution in Chunk! HAYO!"+EnumChatFormatting.RESET);
}
}else{
tList.add(EnumChatFormatting.GREEN+"No Pollution in Chunk! HAYO!"+EnumChatFormatting.RESET); tList.add(EnumChatFormatting.GREEN+"No Pollution in Chunk! HAYO!"+EnumChatFormatting.RESET);
} }
// } }else{
tList.add(EnumChatFormatting.GREEN+"No Pollution in Chunk! HAYO!"+EnumChatFormatting.RESET);
}
try { try {
if (tBlock instanceof IDebugableBlock) { if (tBlock instanceof IDebugableBlock) {

View file

@ -1,6 +1,8 @@
package gregtech.common; package gregtech.common;
import cpw.mods.fml.common.gameevent.TickEvent;
import gregtech.GT_Mod; import gregtech.GT_Mod;
import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
import gregtech.api.objects.XSTR; import gregtech.api.objects.XSTR;
import gregtech.api.util.GT_Utility; import gregtech.api.util.GT_Utility;
import net.minecraft.block.Block; import net.minecraft.block.Block;
@ -10,17 +12,19 @@ import net.minecraft.init.Blocks;
import net.minecraft.potion.Potion; import net.minecraft.potion.Potion;
import net.minecraft.potion.PotionEffect; import net.minecraft.potion.PotionEffect;
import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.AxisAlignedBB;
import net.minecraft.world.ChunkCoordIntPair;
import net.minecraft.world.ChunkPosition; import net.minecraft.world.ChunkPosition;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.minecraftforge.common.DimensionManager; import net.minecraft.world.chunk.Chunk;
import net.minecraftforge.event.world.WorldEvent;
import java.util.ArrayList; import java.util.*;
import java.util.List;
import java.util.TreeMap; import static gregtech.common.GT_Proxy.*;
//import net.minecraft.entity.EntityLiving; //import net.minecraft.entity.EntityLiving;
public class GT_Pollution {//TODO REWORK public class GT_Pollution {
/** /**
* Pollution dispersion until effects start: * Pollution dispersion until effects start:
* Calculation: ((Limit * 0.01) + 2000) * (4 <- spreading rate) * Calculation: ((Limit * 0.01) + 2000) * (4 <- spreading rate)
@ -52,62 +56,77 @@ public class GT_Pollution {//TODO REWORK
* Muffler Hatch Pollution reduction: * Muffler Hatch Pollution reduction:
* LV (0%), MV (30%), HV (52%), EV (66%), IV (76%), LuV (84%), ZPM (89%), UV (92%), MAX (95%) * LV (0%), MV (30%), HV (52%), EV (66%), IV (76%), LuV (84%), ZPM (89%), UV (92%), MAX (95%)
*/ */
private static XSTR tRan = new XSTR();
private List<ChunkCoordIntPair> pollutionList = new ArrayList<>();//chunks left to process
private HashMap<ChunkCoordIntPair,int[]> chunkData;//link to chunk data that is saved/loaded
private int operationsPerTick=0;//how much chunks should be processed in each cycle
private static final short cycleLen=1200;
private final World aWorld;
static List<ChunkPosition> tList = null; public GT_Pollution(World world){
static int loops = 1; aWorld=world;
static XSTR tRan = new XSTR(); chunkData=dimensionWiseChunkData.get(aWorld.provider.dimensionId);
if(chunkData==null){
public static void onWorldTick(World aWorld, int aTick){ chunkData=new HashMap<>(1024);
if(true)return; //TODO FIX dimensionWiseChunkData.put(world.provider.dimensionId,chunkData);
if(!GT_Mod.gregtechproxy.mPollution) return;
int aWorldID=aWorld.provider.dimensionId;
if(aTick == 0 || (tList==null && GT_Proxy.chunkData!=null)){
//---tList = new TreeMap<>();
//---tList.put(aWorld,new ArrayList<ChunkPosition>(GT_Proxy.chunkData.keySet()));
loops = (tList.size()/1200) + 1;
//System.out.println("new Pollution loop"+aTick);
} }
if(tList!=null && tList.size() > 0) for(int i = 0; i < loops ; i++) if(tList.size()>0){ dimensionWisePollution.put(aWorld.provider.dimensionId,this);
ChunkPosition tPos = tList.get(0); }
tList.remove(0);
if(tPos!=null && GT_Proxy.chunkData.containsKey(tPos)){
int tPollution = GT_Proxy.chunkData.get(tPos)[1];
//System.out.println("process: "+tPos.chunkPosX+" "+tPos.chunkPosZ+" "+tPollution);
//Reduce pollution in chunk
tPollution = (int)(0.9945f*tPollution);
//tPollution -= 2000;
if(tPollution<=0) tPollution = 0;
//Spread Pollution
else if(tPollution>400000){
List<ChunkPosition> tNeighbor = new ArrayList();
tNeighbor.add(new ChunkPosition(tPos.chunkPosX+1, tPos.chunkPosY, tPos.chunkPosZ));
tNeighbor.add(new ChunkPosition(tPos.chunkPosX-1, tPos.chunkPosY, tPos.chunkPosZ));
tNeighbor.add(new ChunkPosition(tPos.chunkPosX, tPos.chunkPosY, tPos.chunkPosZ+1));
tNeighbor.add(new ChunkPosition(tPos.chunkPosX, tPos.chunkPosY, tPos.chunkPosZ-1));
for(ChunkPosition tNPos : tNeighbor){
//---if(!GT_Proxy.chunkData.containsKey(tNPos))
//--- GT_Utility.undergroundOil(aWorld,tNPos.chunkPosX,tNPos.chunkPosZ,false,0);
//if(GT_Proxy.chunkData.containsKey(tNPos)){ public static void onWorldTick(TickEvent.WorldTickEvent aEvent){//called from proxy
int tNPol = GT_Proxy.chunkData.get(tNPos)[1]; //return if pollution disabled
if(tNPol*6 < tPollution*5){ if(!GT_Mod.gregtechproxy.mPollution) return;
int tDiff = tPollution - tNPol; final GT_Pollution pollutionInstance = dimensionWisePollution.get(aEvent.world.provider.dimensionId);
tDiff = tDiff/20; if(pollutionInstance==null)return;
tNPol = GT_Utility.safeInt((long)tNPol+tDiff);//tNPol += tDiff; pollutionInstance.tickPollutionInWorld((int)(aEvent.world.getTotalWorldTime()%cycleLen));
tPollution -= tDiff; }
GT_Proxy.chunkData.get(tNPos)[1] = tNPol;
} private void tickPollutionInWorld(int aTickID){//called from method above
//} //gen data set
if(aTickID==0){
pollutionList = new ArrayList<>(chunkData.keySet());
//set operations per tick
if(pollutionList.size()>0) operationsPerTick =(pollutionList.size()/cycleLen);
else operationsPerTick=0;//SANity
}
for(int chunksProcessed=0;chunksProcessed<=operationsPerTick;chunksProcessed++){
if(pollutionList.size()==0)break;//no more stuff to do
ChunkCoordIntPair actualPos=pollutionList.remove(pollutionList.size()-1);//faster
//add default data if missing
if(!chunkData.containsKey(actualPos)) chunkData.put(actualPos,getDefaultChunkDataOnCreation());
//get pollution
int tPollution = chunkData.get(actualPos)[GTPOLLUTION];
//remove some
tPollution = (int)(0.9945f*tPollution);
//tPollution -= 2000;//This does not really matter...
if(tPollution<=0) tPollution = 0;//SANity check
else if(tPollution>400000){//Spread Pollution
ChunkCoordIntPair[] tNeighbors = new ChunkCoordIntPair[4];//array is faster
tNeighbors[0]=(new ChunkCoordIntPair(actualPos.chunkXPos+1,actualPos.chunkZPos));
tNeighbors[1]=(new ChunkCoordIntPair(actualPos.chunkXPos-1,actualPos.chunkZPos));
tNeighbors[2]=(new ChunkCoordIntPair(actualPos.chunkXPos,actualPos.chunkZPos+1));
tNeighbors[3]=(new ChunkCoordIntPair(actualPos.chunkXPos,actualPos.chunkZPos-1));
for(ChunkCoordIntPair neighborPosition : tNeighbors){
if(!chunkData.containsKey(neighborPosition)) chunkData.put(actualPos,getDefaultChunkDataOnCreation());
int neighborPollution = chunkData.get(neighborPosition)[GTPOLLUTION];
if(neighborPollution*6 < tPollution*5){//METHEMATICS...
int tDiff = tPollution - neighborPollution;
tDiff = tDiff/20;
neighborPollution = GT_Utility.safeInt((long)neighborPollution+tDiff);//tNPol += tDiff;
tPollution -= tDiff;
chunkData.get(neighborPosition)[GTPOLLUTION] = neighborPollution;
} }
} }
int[] tArray = GT_Proxy.chunkData.get(tPos);
tArray[1] = tPollution;
GT_Proxy.chunkData.remove(tPos);
GT_Proxy.chunkData.put(tPos, tArray);
//Create Pollution effects //Create Pollution effects
//Smog filter TODO //Smog filter TODO
if(tPollution > GT_Mod.gregtechproxy.mPollutionSmogLimit) { if(tPollution > GT_Mod.gregtechproxy.mPollutionSmogLimit) {
AxisAlignedBB chunk = AxisAlignedBB.getBoundingBox(tPos.chunkPosX << 4, 0, tPos.chunkPosZ << 4, (tPos.chunkPosX << 4) + 16, 256, (tPos.chunkPosZ << 4) + 16); AxisAlignedBB chunk = AxisAlignedBB.getBoundingBox(actualPos.chunkXPos << 4, 0, actualPos.chunkZPos << 4, (actualPos.chunkXPos << 4) + 16, 256, (actualPos.chunkZPos << 4) + 16);
List<EntityLivingBase> tEntitys = aWorld.getEntitiesWithinAABB(EntityLivingBase.class, chunk); List<EntityLivingBase> tEntitys = aWorld.getEntitiesWithinAABB(EntityLivingBase.class, chunk);
for (EntityLivingBase tEnt : tEntitys) { for (EntityLivingBase tEnt : tEntitys) {
if (!GT_Utility.isWearingFullGasHazmat(tEnt)) { if (!GT_Utility.isWearingFullGasHazmat(tEnt)) {
@ -121,6 +140,8 @@ public class GT_Pollution {//TODO REWORK
} }
} }
} }
// Poison effects // Poison effects
if (tPollution > GT_Mod.gregtechproxy.mPollutionPoisonLimit) { if (tPollution > GT_Mod.gregtechproxy.mPollutionPoisonLimit) {
//AxisAlignedBB chunk = AxisAlignedBB.getBoundingBox(tPos.chunkPosX*16, 0, tPos.chunkPosZ*16, tPos.chunkPosX*16+16, 256, tPos.chunkPosZ*16+16); //AxisAlignedBB chunk = AxisAlignedBB.getBoundingBox(tPos.chunkPosX*16, 0, tPos.chunkPosZ*16, tPos.chunkPosX*16+16, 256, tPos.chunkPosZ*16+16);
@ -139,23 +160,27 @@ public class GT_Pollution {//TODO REWORK
} }
} }
} }
// killing plants // killing plants
if (tPollution > GT_Mod.gregtechproxy.mPollutionVegetationLimit) { if (tPollution > GT_Mod.gregtechproxy.mPollutionVegetationLimit) {
int f = 20; int f = 20;
for (; f < (tPollution / 25000); f++) { for (; f < (tPollution / 25000); f++) {
int x = (tPos.chunkPosX << 4) + tRan.nextInt(16); int x = (actualPos.chunkXPos << 4) + tRan.nextInt(16);
int y = 60 + (-f + tRan.nextInt(f * 2 + 1)); int y = 60 + (-f + tRan.nextInt(f * 2 + 1));
int z = (tPos.chunkPosZ << 4) + tRan.nextInt(16); int z = (actualPos.chunkZPos << 4) + tRan.nextInt(16);
damageBlock(aWorld, x, y, z, tPollution > GT_Mod.gregtechproxy.mPollutionSourRainLimit); damageBlock(aWorld, x, y, z, tPollution > GT_Mod.gregtechproxy.mPollutionSourRainLimit);
} }
} }
} }
} }
} }
//Write new pollution to Hashmap !!!
chunkData.get(actualPos)[GTPOLLUTION] = tPollution;
} }
} }
public static void damageBlock(World world, int x, int y, int z, boolean sourRain){ private static void damageBlock(World world, int x, int y, int z, boolean sourRain){
if (world.isRemote) return; if (world.isRemote) return;
Block tBlock = world.getBlock(x, y, z); Block tBlock = world.getBlock(x, y, z);
int tMeta = world.getBlockMetadata(x, y, z); int tMeta = world.getBlockMetadata(x, y, z);
@ -205,37 +230,31 @@ public class GT_Pollution {//TODO REWORK
} }
} }
//Add aWorld to Save Pollution public static void addPollution(IGregTechTileEntity te, int aPollution){
public static void addPollution(World aWorld, ChunkPosition aPos, int aPollution){ System.out.println(te.getWorld().provider.dimensionId+" "+te.getXCoord()+" "+te.getZCoord());
if(!GT_Mod.gregtechproxy.mPollution)return; addPollution(te.getWorld().getChunkFromBlockCoords(te.getXCoord(),te.getZCoord()), aPollution);
try{
ChunkPosition tPos = new ChunkPosition(GT_Utility.getScaleCoordinates(aPos.chunkPosX,16), aWorld.provider.dimensionId, GT_Utility.getScaleCoordinates(aPos.chunkPosZ,16)); // OLD in coordinate -1 -1 chunk 0 0
// System.out.println("add pollution dim: "+aWorld.provider.dimensionId+" x: "+ tPos.chunkPosX +" z: " + tPos.chunkPosZ +" poll: "+aPollution);
int[] tData = new int[3];
if(GT_Proxy.chunkData.containsKey(tPos)){
tData = GT_Proxy.chunkData.get(tPos);
if(tData.length>1){
tData[1] += aPollution;
}
}else{
tData[1] += aPollution;
GT_Proxy.chunkData.put(tPos, tData);
}
}catch(Exception e){
}
} }
public static int getPollutionAtCoords(World aWorld, int aX, int aZ){//TODO FIX public static void addPollution(Chunk ch, int aPollution){
ChunkPosition tPos = new ChunkPosition(aX>>4, aWorld.provider.dimensionId, aZ>>4); if(!GT_Mod.gregtechproxy.mPollution)return;
if(GT_Proxy.chunkData.containsKey(tPos)){ HashMap<ChunkCoordIntPair,int[]> dataMap=dimensionWiseChunkData.get(ch.worldObj.provider.dimensionId);
int[] tPollution = GT_Proxy.chunkData.get(tPos); if(dataMap==null){
if(tPollution.length>1 && tPollution[1]>0){ dataMap=new HashMap<>(1024);
return tPollution[1]; dimensionWiseChunkData.put(ch.worldObj.provider.dimensionId,dataMap);
}else{
return 0;
}
} }
return 0; if(dataMap.get(ch.getChunkCoordIntPair())==null)
dataMap.put(ch.getChunkCoordIntPair(),getDefaultChunkDataOnCreation());
dataMap.get(ch.getChunkCoordIntPair())[GTPOLLUTION]+=aPollution;
}
public static int getPollution(IGregTechTileEntity te){
return getPollution(te.getWorld().getChunkFromBlockCoords(te.getXCoord(),te.getZCoord()));
}
public static int getPollution(Chunk ch){
if(!GT_Mod.gregtechproxy.mPollution)return 0;
HashMap<ChunkCoordIntPair,int[]> dataMap=dimensionWiseChunkData.get(ch.worldObj.provider.dimensionId);
if(dataMap==null || dataMap.get(ch.getChunkCoordIntPair())==null) return 0;
return dataMap.get(ch.getChunkCoordIntPair())[GTPOLLUTION];
} }
} }

View file

@ -6,6 +6,8 @@ import cpw.mods.fml.common.Loader;
import cpw.mods.fml.common.ModContainer; import cpw.mods.fml.common.ModContainer;
import cpw.mods.fml.common.ProgressManager; import cpw.mods.fml.common.ProgressManager;
import cpw.mods.fml.common.eventhandler.Event.Result; import cpw.mods.fml.common.eventhandler.Event.Result;
import cpw.mods.fml.common.eventhandler.EventBus;
import cpw.mods.fml.common.eventhandler.EventPriority;
import cpw.mods.fml.common.eventhandler.SubscribeEvent; import cpw.mods.fml.common.eventhandler.SubscribeEvent;
import cpw.mods.fml.common.gameevent.TickEvent; import cpw.mods.fml.common.gameevent.TickEvent;
import cpw.mods.fml.common.network.FMLNetworkEvent; import cpw.mods.fml.common.network.FMLNetworkEvent;
@ -55,10 +57,11 @@ import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.potion.Potion; import net.minecraft.potion.Potion;
import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.DamageSource; import net.minecraft.util.DamageSource;
import net.minecraft.world.ChunkPosition; import net.minecraft.world.ChunkCoordIntPair;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.minecraft.world.WorldSettings.GameType; import net.minecraft.world.WorldSettings.GameType;
import net.minecraft.world.gen.feature.WorldGenMinable; import net.minecraft.world.gen.feature.WorldGenMinable;
import net.minecraftforge.common.DimensionManager;
import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.event.ForgeEventFactory; import net.minecraftforge.event.ForgeEventFactory;
import net.minecraftforge.event.entity.EntityJoinWorldEvent; import net.minecraftforge.event.entity.EntityJoinWorldEvent;
@ -69,6 +72,7 @@ import net.minecraftforge.event.entity.player.PlayerInteractEvent;
import net.minecraftforge.event.terraingen.OreGenEvent; import net.minecraftforge.event.terraingen.OreGenEvent;
import net.minecraftforge.event.world.BlockEvent; import net.minecraftforge.event.world.BlockEvent;
import net.minecraftforge.event.world.ChunkDataEvent; import net.minecraftforge.event.world.ChunkDataEvent;
import net.minecraftforge.event.world.WorldEvent;
import net.minecraftforge.fluids.Fluid; import net.minecraftforge.fluids.Fluid;
import net.minecraftforge.fluids.FluidContainerRegistry; import net.minecraftforge.fluids.FluidContainerRegistry;
import net.minecraftforge.fluids.FluidRegistry; import net.minecraftforge.fluids.FluidRegistry;
@ -780,6 +784,9 @@ public abstract class GT_Proxy implements IGT_Mod, IGuiHandler, IFuelHandler {
} }
} }
} catch (Throwable e) {e.printStackTrace(GT_Log.err);} } catch (Throwable e) {e.printStackTrace(GT_Log.err);}
dimensionWiseChunkData.clear();//!!! IMPORTANT for map switching...
dimensionWisePollution.clear();//!!! IMPORTANT for map switching...
} }
public void onServerStarted() { public void onServerStarted() {
@ -1445,8 +1452,8 @@ public abstract class GT_Proxy implements IGT_Mod, IGuiHandler, IFuelHandler {
} }
} }
} }
if(aEvent.world.provider.dimensionId==0)
GT_Pollution.onWorldTick(aEvent.world, (int) (aEvent.world.getTotalWorldTime() % 1200)); GT_Pollution.onWorldTick(aEvent);
} }
} }
@ -1905,50 +1912,92 @@ public abstract class GT_Proxy implements IGT_Mod, IGuiHandler, IFuelHandler {
ProgressManager.pop(progressBar); ProgressManager.pop(progressBar);
} }
public static final HashMap<ChunkPosition, int[]> chunkData = new HashMap<ChunkPosition, int[]>(5000); public static final HashMap<Integer,HashMap<ChunkCoordIntPair,int []>> dimensionWiseChunkData = new HashMap<>(16);//stores chunk data that is loaded/saved
public static final HashMap<Integer,GT_Pollution> dimensionWisePollution = new HashMap<>(16);//stores GT_Polluttors objects
public static final byte GTOIL=3,GTOILFLUID=2,GTPOLLUTION=1,GTMETADATA=0,NOT_LOADED=0,LOADED=1;//consts
//@Deprecated
//public static final HashMap<ChunkPosition, int[]> chunkData = new HashMap<>(0);
private static final byte oilVer=(byte)20;//non zero plz
//TO get default's fast
public static int[] getDefaultChunkDataOnCreation(){
return new int[]{NOT_LOADED,0,-1,-1};
}
public static int[] getDefaultChunkDataOnLoad(){
return new int[]{LOADED,0,-1,-1};
}
private static final byte oilVer=(byte)0x20;
@SubscribeEvent @SubscribeEvent
public void handleChunkSaveEvent(ChunkDataEvent.Save event)//TODO FIX +RETROGEN public void handleChunkSaveEvent(ChunkDataEvent.Save event) {//ALWAYS SAVE FROM THE HASH MAP DATA
{ HashMap<ChunkCoordIntPair,int []> chunkData=dimensionWiseChunkData.get(event.world.provider.dimensionId);
ChunkPosition tPos = new ChunkPosition(event.getChunk().xPosition,event.getChunk().worldObj.provider.dimensionId,event.getChunk().zPosition); if(chunkData==null) return;//no dim info stored
if(chunkData.containsKey(tPos)){
int[] tInts = chunkData.get(tPos); int[] tInts = chunkData.get(event.getChunk().getChunkCoordIntPair());
if(tInts.length>0){event.getData().setInteger("GTOIL", tInts[0]);} if(tInts==null) return;//no chunk data stored
if(tInts.length>1){event.getData().setInteger("GTPOLLUTION", tInts[1]);} //assuming len of this array 4
if(tInts.length>2){event.getData().setInteger("GTOILFLUID", tInts[2]);} if(tInts[3]>=0)event.getData().setInteger("GTOIL", tInts[GTOIL]);
} else event.getData().removeTag("GTOIL");
if(tInts[2]>=0)event.getData().setInteger("GTOILFLUID", tInts[GTOILFLUID]);
else event.getData().removeTag("GTOILFLUID");
if(tInts[1]>0)event.getData().setInteger("GTPOLLUTION", tInts[GTPOLLUTION]);
else event.getData().removeTag("GTPOLLUTION");
event.getData().setByte("GTOILVER", oilVer);//version mark
} }
@SubscribeEvent @SubscribeEvent
public void handleChunkLoadEvent(ChunkDataEvent.Load event)//TODO FIX +RETROGEN public void handleChunkLoadEvent(ChunkDataEvent.Load event) {
{ final int worldID=event.world.provider.dimensionId;
int tOil = 0; HashMap<ChunkCoordIntPair, int[]> chunkData = dimensionWiseChunkData.get(worldID);
int tOilFluid = 0; if (chunkData == null){
int tPollution = 0; chunkData=new HashMap<>(1024);
dimensionWiseChunkData.put(worldID, chunkData);
ChunkPosition tPos = new ChunkPosition(event.getChunk().xPosition,event.getChunk().worldObj.provider.dimensionId,event.getChunk().zPosition);
int[] tData = new int[0];
if(chunkData.containsKey(tPos)){
tData = chunkData.get(tPos);
chunkData.remove(tPos);
if(tData.length>0)
tOil = tData[0];
if(tData.length>1)
tPollution = tData[1];
if(tData.length>2)
tOilFluid = tData[2];
} }
if (dimensionWisePollution.get(worldID) == null)
dimensionWisePollution.put(worldID, new GT_Pollution(event.world));
if(tOil==0&&event.getData().hasKey("GTOIL")) int[] tInts = chunkData.get(event.getChunk().getChunkCoordIntPair());
tOil = event.getData().getInteger("GTOIL"); if (tInts == null) {
if(tPollution==0&&event.getData().hasKey("GTPOLLUTION")) //NOT LOADED and NOT PROCESSED by pollution algorithms
tPollution = event.getData().getInteger("GTPOLLUTION"); //regular load
if(tOilFluid==0&&event.getData().hasKey("GTOILFLUID")) tInts = getDefaultChunkDataOnLoad();
tOilFluid = event.getData().getInteger("GTOILFLUID");
chunkData.put(tPos, new int[]{tOil,tPollution,tOilFluid}); if (event.getData().getByte("GTOILVER") == oilVer) {
if (event.getData().hasKey("GTOIL"))
tInts[GTOIL] = event.getData().getInteger("GTOIL");
if (event.getData().hasKey("GTOILFLUID"))
tInts[GTOILFLUID] = event.getData().getInteger("GTOILFLUID");
}
tInts[GTPOLLUTION] = event.getData().getInteger("GTPOLLUTION");//Defaults to 0
//store in HASH MAP if has useful data
if (tInts[GTPOLLUTION] > 0 || tInts[GTOIL] >= 0 || tInts[GTOILFLUID] >= 0)
chunkData.put(event.getChunk().getChunkCoordIntPair(), tInts);
} else if (tInts[GTMETADATA] == NOT_LOADED) {//was NOT loaded from chunk save game data
//NOT LOADED but generated
//append load
if (event.getData().getByte("GTOILVER") == oilVer) {
if (tInts[GTOIL] < 0 && event.getData().hasKey("GTOIL"))//if was not yet initialized
tInts[GTOIL] = event.getData().getInteger("GTOIL");
if (tInts[GTOILFLUID] < 0 && event.getData().hasKey("GTOILFLUID"))//if was not yet initialized
tInts[GTOILFLUID] = event.getData().getInteger("GTOILFLUID");
} else {
tInts[GTOIL] = -1;
tInts[GTOILFLUID] = -1;
}
tInts[GTPOLLUTION] += event.getData().getInteger("GTPOLLUTION");//Defaults to 0, add stored pollution to data
tInts[GTMETADATA] = LOADED;//mark as = loaded
//store in HASHMAP
chunkData.put(event.getChunk().getChunkCoordIntPair(), tInts);
}//else if(tInts[0]==1){
////Already loaded chunk data
////DO NOTHING - this chunk data was already loaded and stored in hash map
//}
} }
public static class OreDictEventContainer { public static class OreDictEventContainer {

View file

@ -0,0 +1,96 @@
package gregtech.common;
import gregtech.GT_Mod;
import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
import gregtech.api.objects.GT_UO_Fluid;
import gregtech.api.objects.XSTR;
import gregtech.common.GT_Proxy;
import net.minecraft.world.ChunkCoordIntPair;
import net.minecraft.world.ChunkPosition;
import net.minecraft.world.World;
import net.minecraft.world.chunk.Chunk;
import net.minecraftforge.fluids.Fluid;
import net.minecraftforge.fluids.FluidRegistry;
import net.minecraftforge.fluids.FluidStack;
import java.util.HashMap;
import static gregtech.api.util.GT_Utility.getScaleCoordinates;
import static gregtech.common.GT_Proxy.*;
/**
* Created by Tec on 29.04.2017.
*/
public class GT_UndergroundOil {
public static FluidStack undergroundOil(IGregTechTileEntity te,float drainSpeedCoefficient){
return undergroundOil(te.getWorld().getChunkFromBlockCoords(te.getXCoord(),te.getZCoord()),drainSpeedCoefficient);
}
//Returns whole content for information purposes -> when drainSpeedCoeff < 0
//Else returns extracted fluidStack if amount > 0, or null otherwise
public static FluidStack undergroundOil(Chunk chunk, float drainSpeedCoefficient) {
if (GT_Mod.gregtechproxy.mUndergroundOil.CheckBlackList(chunk.worldObj.provider.dimensionId)) return null;
World aWorld = chunk.worldObj;
//Read hash map
HashMap<ChunkCoordIntPair, int[]> chunkData = dimensionWiseChunkData.get(aWorld.provider.dimensionId);
if(chunkData==null){
chunkData=new HashMap<>(1024);
dimensionWiseChunkData.put(aWorld.provider.dimensionId,chunkData);
}
int[] tInts = chunkData.get(chunk.getChunkCoordIntPair());
if(tInts==null) tInts=getDefaultChunkDataOnCreation();//init if null
else if(tInts[GTOIL]==0){
//can return 0 amount stack for info :D
return drainSpeedCoefficient>=0 ? null : new FluidStack(FluidRegistry.getFluid(tInts[GTOILFLUID]),0);
}
//GEN IT TO GET OBJECT...
XSTR tRandom = new XSTR(aWorld.getSeed() + aWorld.provider.dimensionId * 2 +
(chunk.getChunkCoordIntPair().chunkXPos>>3) +
8267 * (chunk.getChunkCoordIntPair().chunkZPos>>3));
GT_UO_Fluid uoFluid = GT_Mod.gregtechproxy.mUndergroundOil.GetDimension(aWorld.provider.dimensionId).getRandomFluid(tRandom);
//Fluid stack holder
FluidStack fluidInChunk;
//Set fluidstack from uoFluid
if (uoFluid == null || uoFluid.getFluid()==null){
tInts[GTOILFLUID]=Integer.MAX_VALUE;//null fluid pointer... kindof
tInts[GTOIL]=0;
chunkData.put(chunk.getChunkCoordIntPair(),tInts);//update hash map
return null;
} else {
if(tInts[GTOILFLUID]== uoFluid.getFluid().getID()){//if stored fluid matches uoFluid
fluidInChunk = new FluidStack(uoFluid.getFluid(),tInts[GTOIL]);
}else{
fluidInChunk = new FluidStack(uoFluid.getFluid(), uoFluid.getRandomAmount(tRandom));
tRandom=new XSTR();
fluidInChunk.amount=(int)((float)fluidInChunk.amount*(0.75f+(tRandom.nextFloat()/2f)));//Randomly change amounts by +/- 25%
}
tInts[GTOIL]=fluidInChunk.amount;
tInts[GTOILFLUID]=fluidInChunk.getFluidID();
}
//do stuff on it if needed
if(drainSpeedCoefficient>=0) {
int actualExtractionSpeed=(int)(uoFluid.DecreasePerOperationAmountInBuckets*1000*drainSpeedCoefficient);
if(fluidInChunk.amount>actualExtractionSpeed) {
fluidInChunk.amount=actualExtractionSpeed;//give appropriate amount
tInts[GTOIL]-=actualExtractionSpeed;//diminish amount
}else if(fluidInChunk.amount>0) {
//fluidInChunk.amount= the same amount... going to return this
tInts[GTOIL]=0;
}else{
fluidInChunk=null;
tInts[GTOIL]=0;//just to be on safe side...
}
}
chunkData.put(chunk.getChunkCoordIntPair(),tInts);//update hash map
return fluidInChunk;
}
}

View file

@ -148,7 +148,7 @@ public class GT_MetaTileEntity_Boiler_Bronze
this.mTemperature += 1; this.mTemperature += 1;
} }
if (this.mProcessingEnergy > 0 && (aTick % 20L == 0L)) { if (this.mProcessingEnergy > 0 && (aTick % 20L == 0L)) {
GT_Pollution.addPollution(this.getBaseMetaTileEntity().getWorld(), new ChunkPosition(this.getBaseMetaTileEntity().getXCoord(), this.getBaseMetaTileEntity().getYCoord(), this.getBaseMetaTileEntity().getZCoord()), 20); GT_Pollution.addPollution(getBaseMetaTileEntity(), 20);
} }
aBaseMetaTileEntity.setActive(this.mProcessingEnergy > 0); aBaseMetaTileEntity.setActive(this.mProcessingEnergy > 0);
} }

View file

@ -127,7 +127,7 @@ public class GT_MetaTileEntity_Boiler_Lava
} }
if (this.mProcessingEnergy > 0 && (aTick % 20L == 0L)) { if (this.mProcessingEnergy > 0 && (aTick % 20L == 0L)) {
GT_Pollution.addPollution(this.getBaseMetaTileEntity().getWorld(), new ChunkPosition(this.getBaseMetaTileEntity().getXCoord(), this.getBaseMetaTileEntity().getYCoord(), this.getBaseMetaTileEntity().getZCoord()), 20); GT_Pollution.addPollution(getBaseMetaTileEntity(), 20);
} }
aBaseMetaTileEntity.setActive(this.mProcessingEnergy > 0); aBaseMetaTileEntity.setActive(this.mProcessingEnergy > 0);
} }

View file

@ -152,7 +152,7 @@ public class GT_MetaTileEntity_Boiler_Steel
this.mTemperature += 1; this.mTemperature += 1;
} }
if (this.mProcessingEnergy > 0 && (aTick % 20L == 0L)) { if (this.mProcessingEnergy > 0 && (aTick % 20L == 0L)) {
GT_Pollution.addPollution(this.getBaseMetaTileEntity().getWorld(), new ChunkPosition(this.getBaseMetaTileEntity().getXCoord(), this.getBaseMetaTileEntity().getYCoord(), this.getBaseMetaTileEntity().getZCoord()), 30); GT_Pollution.addPollution(getBaseMetaTileEntity(), 30);
} }
aBaseMetaTileEntity.setActive(this.mProcessingEnergy > 0); aBaseMetaTileEntity.setActive(this.mProcessingEnergy > 0);
} }

View file

@ -22,6 +22,7 @@ import gregtech.api.objects.ItemData;
import gregtech.api.util.GT_ModHandler; import gregtech.api.util.GT_ModHandler;
import gregtech.api.util.GT_OreDictUnificator; import gregtech.api.util.GT_OreDictUnificator;
import gregtech.api.util.GT_Utility; import gregtech.api.util.GT_Utility;
import gregtech.common.GT_UndergroundOil;
import gregtech.common.blocks.GT_Block_Ores_Abstract; import gregtech.common.blocks.GT_Block_Ores_Abstract;
import gregtech.common.blocks.GT_TileEntity_Ores; import gregtech.common.blocks.GT_TileEntity_Ores;
import ic2.core.Ic2Items; import ic2.core.Ic2Items;
@ -153,7 +154,7 @@ public class GT_MetaTileEntity_AdvSeismicProspector extends GT_MetaTileEntity_Ba
for (int z = tLeftZBound; z <= tRightZBound; ++z) for (int z = tLeftZBound; z <= tRightZBound; ++z)
{ {
ChunkPosition tPos = new ChunkPosition(GT_Utility.getScaleCoordinates(x*16,96), 0, GT_Utility.getScaleCoordinates(z*16,96)); ChunkPosition tPos = new ChunkPosition(GT_Utility.getScaleCoordinates(x*16,96), 0, GT_Utility.getScaleCoordinates(z*16,96));
FluidStack tFluid = GT_Utility.getUndergroundOil(getBaseMetaTileEntity().getWorld(), x*16, z*16); FluidStack tFluid = GT_UndergroundOil.undergroundOil(getBaseMetaTileEntity(),-1);
if (tFluid != null) if (tFluid != null)
if (tFluids.containsKey(tPos)) if (tFluids.containsKey(tPos))
{ {

View file

@ -207,7 +207,7 @@ public class GT_MetaTileEntity_BronzeBlastFurnace
} }
} }
if(this.mMaxProgresstime>0 && (aTimer % 20L == 0L)){ if(this.mMaxProgresstime>0 && (aTimer % 20L == 0L)){
GT_Pollution.addPollution(this.getBaseMetaTileEntity().getWorld(), new ChunkPosition(this.getBaseMetaTileEntity().getXCoord(), this.getBaseMetaTileEntity().getYCoord(), this.getBaseMetaTileEntity().getZCoord()), 200); GT_Pollution.addPollution(getBaseMetaTileEntity(), 200);
} }
aBaseMetaTileEntity.setActive((this.mMaxProgresstime > 0) && (this.mMachine)); aBaseMetaTileEntity.setActive((this.mMaxProgresstime > 0) && (this.mMachine));
@ -238,7 +238,7 @@ public class GT_MetaTileEntity_BronzeBlastFurnace
XSTR floatGen=new XSTR(); XSTR floatGen=new XSTR();
aWorld.spawnParticle("largesmoke", xPos + floatGen.nextFloat(), yPos, zPos + floatGen.nextFloat(), 0.0D, 0.3D, 0.0D); aWorld.spawnParticle("largesmoke", xPos + floatGen.nextFloat(), yPos, zPos + floatGen.nextFloat(), 0.0D, 0.3D, 0.0D);
//Pollution particles intensify //Pollution particles intensify
if(GT_Pollution.getPollutionAtCoords(aWorld,this.getBaseMetaTileEntity().getXCoord(), this.getBaseMetaTileEntity().getZCoord())>GT_Mod.gregtechproxy.mPollutionSmogLimit){ if(GT_Pollution.getPollution(getBaseMetaTileEntity())>GT_Mod.gregtechproxy.mPollutionSmogLimit){
aWorld.spawnParticle("largesmoke", xPos + floatGen.nextFloat(), yPos, zPos + floatGen.nextFloat(), 0.0D, 0.45D, 0.0D); aWorld.spawnParticle("largesmoke", xPos + floatGen.nextFloat(), yPos, zPos + floatGen.nextFloat(), 0.0D, 0.45D, 0.0D);
aWorld.spawnParticle("largesmoke", xPos + floatGen.nextFloat(), yPos, zPos + floatGen.nextFloat(), 0.0D, 0.6D, 0.0D); aWorld.spawnParticle("largesmoke", xPos + floatGen.nextFloat(), yPos, zPos + floatGen.nextFloat(), 0.0D, 0.6D, 0.0D);
} }

View file

@ -87,7 +87,7 @@ public class GT_MetaTileEntity_Charcoal_Pit extends GT_MetaTileEntity_MultiBlock
this.mEfficiency = 10000; this.mEfficiency = 10000;
this.mEfficiencyIncrease = 10000; this.mEfficiencyIncrease = 10000;
this.mMaxProgresstime = Math.max(1, this.mMaxProgresstime); this.mMaxProgresstime = Math.max(1, this.mMaxProgresstime);
GT_Pollution.addPollution(this.getBaseMetaTileEntity().getWorld(), new ChunkPosition(this.getBaseMetaTileEntity().getXCoord(), this.getBaseMetaTileEntity().getYCoord(), this.getBaseMetaTileEntity().getZCoord()), mMaxProgresstime*10); GT_Pollution.addPollution(getBaseMetaTileEntity(), mMaxProgresstime*10);
return true; return true;
} else { } else {
this.mEfficiency = 0; this.mEfficiency = 0;

View file

@ -21,7 +21,9 @@ import net.minecraftforge.fluids.FluidStack;
import java.util.ArrayList; import java.util.ArrayList;
public class GT_MetaTileEntity_OilDrill extends GT_MetaTileEntity_MultiBlockBase {//TODO REWORK import static gregtech.common.GT_UndergroundOil.undergroundOil;
public class GT_MetaTileEntity_OilDrill extends GT_MetaTileEntity_MultiBlockBase {
private boolean completedCycle = false; private boolean completedCycle = false;
private int extractionSpeed=0; private int extractionSpeed=0;
@ -79,29 +81,26 @@ public class GT_MetaTileEntity_OilDrill extends GT_MetaTileEntity_MultiBlockBase
} }
} }
//Output fluid //Output fluid
FluidStack tFluid = null;//GT_Utility.undergroundOil(getBaseMetaTileEntity().getWorld(), getBaseMetaTileEntity().getXCoord()>>4, getBaseMetaTileEntity().getZCoord()>>4,false,0);//TODO FIX FluidStack tFluid = undergroundOil(getBaseMetaTileEntity(),.5F+(getInputTier()*.25F));//consumes here...
if (tFluid == null){ if (tFluid == null){
extractionSpeed=0; extractionSpeed=0;
stopMachine(); stopMachine();
return false;//impossible return false;//impossible
} }
if (getBaseMetaTileEntity().getBlockOffset(ForgeDirection.getOrientation(getBaseMetaTileEntity().getBackFacing()).offsetX, getYOfPumpHead() - 1 - getBaseMetaTileEntity().getYCoord(), ForgeDirection.getOrientation(getBaseMetaTileEntity().getBackFacing()).offsetZ) != Blocks.bedrock) { if (getBaseMetaTileEntity().getBlockOffset(ForgeDirection.getOrientation(getBaseMetaTileEntity().getBackFacing()).offsetX, getYOfPumpHead() - 1 - getBaseMetaTileEntity().getYCoord(), ForgeDirection.getOrientation(getBaseMetaTileEntity().getBackFacing()).offsetZ) != Blocks.bedrock) {
//Not at bedrock layer - i prefer to keep it like it is...
if (completedCycle) { if (completedCycle) {
moveOneDown(); moveOneDown();
} }
tFluid = null; tFluid = null;
if (mEnergyHatches.size() > 0 && mEnergyHatches.get(0).getEUVar() > (512 + getMaxInputVoltage() * 4)) if (mEnergyHatches.size() > 0 && mEnergyHatches.get(0).getEUVar() > (512 + getMaxInputVoltage() * 4))
completedCycle = true; completedCycle = true;
} else if (tFluid.amount == 0) {//no fluid remaining } else if (tFluid.amount == 0) {//no fluid remaining, for SANity
extractionSpeed=0; extractionSpeed=0;
stopMachine(); stopMachine();
return false;//stops processing?? return false;//stops processing??
} else { } else {
int minExtraction= (int)Math.pow((float)GT_Utility.getTier(getMaxInputVoltage()),3F);//tier^3
if(tFluid.amount>minExtraction)
tFluid.amount= Math.max(minExtraction,Math.min(tFluid.amount/50000,500));
extractionSpeed=tFluid.amount; extractionSpeed=tFluid.amount;
//GT_Utility.undergroundOil(getBaseMetaTileEntity().getWorld(), getBaseMetaTileEntity().getXCoord()>>4, getBaseMetaTileEntity().getZCoord()>>4,true,extractionSpeed);//TODO FIX
} }
this.mEfficiency = (10000 - (getIdealStatus() - getRepairStatus()) * 1000); this.mEfficiency = (10000 - (getIdealStatus() - getRepairStatus()) * 1000);
this.mEfficiencyIncrease = 10000; this.mEfficiencyIncrease = 10000;