From 6866e30eb01cda6a91331a25c521fe01be89c58b Mon Sep 17 00:00:00 2001 From: chylex <chylex@fo2.cz> Date: Sat, 8 Nov 2014 13:10:30 +0100 Subject: [PATCH] TODOs, Energy regen, Blob debug test --- .../chylex/hee/block/BlockEnergyCluster.java | 4 +- .../java/chylex/hee/entity/fx/FXHandler.java | 5 ++ .../java/chylex/hee/entity/fx/FXType.java | 3 +- .../hee/mechanics/energy/EnergyChunkData.java | 46 ++++++++++--------- .../hee/mechanics/energy/EnergyEvents.java | 9 +--- .../hee/world/feature/WorldGenBlob.java | 41 +++++++---------- .../biome/IslandBiomeEnchantedIsland.java | 5 +- 7 files changed, 57 insertions(+), 56 deletions(-) diff --git a/src/main/java/chylex/hee/block/BlockEnergyCluster.java b/src/main/java/chylex/hee/block/BlockEnergyCluster.java index 6f365f51..59ee5f21 100644 --- a/src/main/java/chylex/hee/block/BlockEnergyCluster.java +++ b/src/main/java/chylex/hee/block/BlockEnergyCluster.java @@ -13,6 +13,8 @@ import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.MovingObjectPosition; import net.minecraft.world.World; import chylex.hee.entity.fx.EntityEnergyClusterFX; +import chylex.hee.system.savedata.WorldDataHandler; +import chylex.hee.system.savedata.types.EnergySavefile; import chylex.hee.system.util.DragonUtil; import chylex.hee.system.util.MathUtil; import chylex.hee.tileentity.TileEntityEnergyCluster; @@ -140,7 +142,7 @@ public class BlockEnergyCluster extends BlockContainer{ DragonUtil.createExplosion(world,x+0.5D,y+0.5D,z+0.5D,2.8F+(energyMeta-3)*0.225F,true); - // TODO return some to environment + WorldDataHandler.<EnergySavefile>get(EnergySavefile.class).getFromBlockCoords(x,z,true).addEnergy(tile.data.getEnergyLevel()*0.2F); for(int xx = x-4; xx <= x+4; xx++){ for(int zz = z-4; zz <= z+4; zz++){ diff --git a/src/main/java/chylex/hee/entity/fx/FXHandler.java b/src/main/java/chylex/hee/entity/fx/FXHandler.java index 3d7ba37d..6b1b3f1b 100644 --- a/src/main/java/chylex/hee/entity/fx/FXHandler.java +++ b/src/main/java/chylex/hee/entity/fx/FXHandler.java @@ -137,6 +137,11 @@ public final class FXHandler{ for(int a = 0; a < 25; a++)HardcoreEnderExpansion.fx.omnipresent("smoke",world,x+randCenter(width),y+rand.nextDouble()*height,z+randCenter(width),randCenter(0.05D),randCenter(0.05D),randCenter(0.05D)); for(int a = 0; a < 8; a++)HardcoreEnderExpansion.fx.omnipresent("largesmoke",world,x+randCenter(width),y+rand.nextDouble()*height,z+randCenter(width),randCenter(0.05D),randCenter(0.05D),randCenter(0.05D)); break; + + case BABY_ENDERMAN_GROW: + for(int a = 0; a < 20; a++)HardcoreEnderExpansion.fx.omnipresent("smoke",world,x+randCenter(width),y+rand.nextDouble()*height,z+randCenter(width),randCenter(0.05D),randCenter(0.05D),randCenter(0.05D)); + for(int a = 0; a < 20; a++)HardcoreEnderExpansion.fx.omnipresent("portal",world,x+randCenter(width),y+rand.nextDouble()*height,z+randCenter(width),randCenter(0.1D),randCenter(0.1D),randCenter(0.1D)); + break; } } diff --git a/src/main/java/chylex/hee/entity/fx/FXType.java b/src/main/java/chylex/hee/entity/fx/FXType.java index de604e70..15584b60 100644 --- a/src/main/java/chylex/hee/entity/fx/FXType.java +++ b/src/main/java/chylex/hee/entity/fx/FXType.java @@ -27,7 +27,8 @@ public final class FXType{ GEM_TELEPORT_FROM, ORB_TRANSFORMATION, LOUSE_REGEN, - HOMELAND_ENDERMAN_RECRUIT; + HOMELAND_ENDERMAN_RECRUIT, + BABY_ENDERMAN_GROW; public static FXType.Entity[] values = values(); } diff --git a/src/main/java/chylex/hee/mechanics/energy/EnergyChunkData.java b/src/main/java/chylex/hee/mechanics/energy/EnergyChunkData.java index f2777bb4..9a0b8bd8 100644 --- a/src/main/java/chylex/hee/mechanics/energy/EnergyChunkData.java +++ b/src/main/java/chylex/hee/mechanics/energy/EnergyChunkData.java @@ -1,15 +1,17 @@ package chylex.hee.mechanics.energy; import java.util.Random; -import chylex.hee.system.util.MathUtil; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.world.World; +import chylex.hee.block.BlockList; +import chylex.hee.system.util.MathUtil; public class EnergyChunkData{ public static final float minSignificantEnergy = 0.0001F; public static final float energyDrainUnit = 0.05F; private int x, z; - private float energyLevel, maxEnergyLevel, regenLimiter; - private byte regenTimer; + private float energyLevel, maxEnergyLevel; + private byte regenTimer, releaseTimer; private EnergyChunkData(){} @@ -24,10 +26,19 @@ public class EnergyChunkData{ energyLevel = maxEnergyLevel-maxEnergyLevel*rand.nextFloat()*rand.nextFloat(); } - public void onUpdate(Random rand){ - if (regenLimiter > 0F && (regenTimer == 0 || --regenTimer == 0)){ - regenLimiter = regenLimiter < 0.05F ? 0F : regenLimiter*0.85F; - regenTimer = 3; // 0.6 seconds + public void onUpdate(World world, Random rand){ + if ((regenTimer == 0 || --regenTimer == 0) && energyLevel < maxEnergyLevel){ + regenTimer = (byte)(8+rand.nextInt(12+rand.nextInt(6))+(int)Math.floor((16F*energyLevel/maxEnergyLevel)+maxEnergyLevel*0.2F)); + } + + if ((energyLevel > maxEnergyLevel || (energyLevel > maxEnergyLevel*0.8F && rand.nextInt(10) == 0)) && (releaseTimer == 0 || --releaseTimer == 0)){ + float release = (0.2F+rand.nextFloat()*0.5F)*maxEnergyLevel*0.0625F; + if (energyLevel < release)release = energyLevel; // precaution + + energyLevel -= release; + releaseTimer = (byte)(4+rand.nextInt(7)); + + world.setBlock(x+rand.nextInt(16),8+rand.nextInt(116),z+rand.nextInt(16),BlockList.corrupted_energy_low,Math.min(Math.max(2,(int)Math.floor(1F+release*12F)),8),3); } } @@ -42,18 +53,9 @@ public class EnergyChunkData{ } } - public float tryRegenerate(float amount){ - float maxRegen = maxEnergyLevel*0.0625F; - float regen = Math.min(amount,maxEnergyLevel-energyLevel); - - if (regenLimiter+regen > maxRegen)regen = maxRegen-regenLimiter; - if (regen <= minSignificantEnergy)return amount; - - energyLevel += regen; - regenLimiter += regen; - regenTimer = 10; // 2 seconds - - return MathUtil.floatEquals(regen,amount) ? 0F : amount-regen; + public void addEnergy(float amount){ + if (energyLevel+amount <= maxEnergyLevel*2)energyLevel += amount; + else energyLevel = maxEnergyLevel*2; } public boolean drainEnergyUnit(){ @@ -96,9 +98,10 @@ public class EnergyChunkData{ public NBTTagCompound saveToNBT(){ NBTTagCompound tag = new NBTTagCompound(); + tag.setInteger("x",x); + tag.setInteger("z",z); tag.setFloat("lvl",energyLevel); tag.setFloat("max",maxEnergyLevel); - tag.setFloat("lim",regenLimiter); return tag; } @@ -107,8 +110,7 @@ public class EnergyChunkData{ data.x = nbt.getInteger("x"); data.z = nbt.getInteger("z"); data.energyLevel = nbt.getFloat("lvl"); - data.maxEnergyLevel = nbt.getFloat("max"); - data.regenLimiter = nbt.getFloat("lim"); + if (MathUtil.floatEquals(data.maxEnergyLevel = nbt.getFloat("max"),0F))data.maxEnergyLevel = minSignificantEnergy; return data; } } diff --git a/src/main/java/chylex/hee/mechanics/energy/EnergyEvents.java b/src/main/java/chylex/hee/mechanics/energy/EnergyEvents.java index 6d7de27e..8639a23e 100644 --- a/src/main/java/chylex/hee/mechanics/energy/EnergyEvents.java +++ b/src/main/java/chylex/hee/mechanics/energy/EnergyEvents.java @@ -39,7 +39,7 @@ public final class EnergyEvents{ EnergyChunkData data = file.getFromChunkCoords(chunk.xPosition,chunk.zPosition,true); if (usedData.contains(data))continue; - data.onUpdate(e.world.rand); + data.onUpdate(e.world,e.world.rand); for(int a = 0; a < 4; a++){ data.onAdjacentInteract(e.world.rand,file.getFromChunkCoords(chunk.xPosition+Direction.offsetX[a]*EnergySavefile.sectionSize,chunk.zPosition+Direction.offsetZ[a]*EnergySavefile.sectionSize,true)); @@ -59,12 +59,7 @@ public final class EnergyEvents{ float energy = MobEnergy.getEnergy(e.entityLiving); if (MathUtil.floatEquals(energy,-1F))return; - EnergyChunkData data = WorldDataHandler.<EnergySavefile>get(EnergySavefile.class).getFromBlockCoords((int)Math.floor(e.entity.posX),(int)Math.floor(e.entity.posZ),true); - energy = data.tryRegenerate(energy); - - if (energy > EnergyChunkData.minSignificantEnergy){ - // TODO leak corrupted energy - } + WorldDataHandler.<EnergySavefile>get(EnergySavefile.class).getFromBlockCoords((int)Math.floor(e.entity.posX),(int)Math.floor(e.entity.posZ),true).addEnergy(energy); } private byte updateTimer; diff --git a/src/main/java/chylex/hee/world/feature/WorldGenBlob.java b/src/main/java/chylex/hee/world/feature/WorldGenBlob.java index f177af21..7ba9eebb 100644 --- a/src/main/java/chylex/hee/world/feature/WorldGenBlob.java +++ b/src/main/java/chylex/hee/world/feature/WorldGenBlob.java @@ -6,7 +6,6 @@ import net.minecraft.world.World; import net.minecraft.world.gen.feature.WorldGenerator; import org.apache.commons.lang3.tuple.Pair; import chylex.hee.system.commands.HeeDebugCommand.HeeTest; -import chylex.hee.system.logging.Log; import chylex.hee.system.weight.ObjectWeightPair; import chylex.hee.system.weight.WeightedList; import chylex.hee.world.feature.blobs.BlobGenerator; @@ -34,36 +33,16 @@ public class WorldGenBlob extends WorldGenerator{ }); } - private DecoratorFeatureGenerator gen = new DecoratorFeatureGenerator(); - @Override public boolean generate(World world, Random rand, int x, int y, int z){ - if (Log.isDeobfEnvironment){ // TODO remove debug - BlobType.COMMON.patterns.clear(); - - BlobType.COMMON.patterns.addAll(new BlobPattern[]{ - new BlobPattern(10).addGenerators(new BlobGenerator[]{ - - }).addPopulators(new BlobPopulator[]{ - - }).setPopulatorAmountProvider(IRandomAmount.linear,1,5) - }); - - Pair<BlobGenerator,List<BlobPopulator>> pattern = BlobType.COMMON.patterns.getRandomItem(rand).generatePattern(rand); - - pattern.getLeft().generate(gen,rand); - for(BlobPopulator populator:pattern.getRight())populator.generate(gen,rand); - - gen.generate(world,rand,x,y,z); - return true; - } - if (world.getBlock(x-8,y,z) != Blocks.air || world.getBlock(x+8,y,z) != Blocks.air || world.getBlock(x,y,z-8) != Blocks.air || world.getBlock(x,y,z+8) != Blocks.air || world.getBlock(x,y-8,z) != Blocks.air || world.getBlock(x,y+8,z) != Blocks.air)return false; + + DecoratorFeatureGenerator gen = new DecoratorFeatureGenerator(); Pair<BlobGenerator,List<BlobPopulator>> pattern = types.getRandomItem(rand).getObject().patterns.getRandomItem(rand).generatePattern(rand); @@ -77,7 +56,21 @@ public class WorldGenBlob extends WorldGenerator{ public static final HeeTest $debugTest = new HeeTest(){ @Override public void run(){ - new WorldGenBlob().generate(world,world.rand,(int)player.posX+10,(int)player.posY,(int)player.posZ); + WeightedList<BlobPattern> patterns = new WeightedList<>(new BlobPattern[]{ + new BlobPattern(10).addGenerators(new BlobGenerator[]{ + + }).addPopulators(new BlobPopulator[]{ + + }).setPopulatorAmountProvider(IRandomAmount.linear,1,5) + }); + + DecoratorFeatureGenerator gen = new DecoratorFeatureGenerator(); + Pair<BlobGenerator,List<BlobPopulator>> pattern = patterns.getRandomItem(world.rand).generatePattern(world.rand); + + pattern.getLeft().generate(gen,world.rand); + for(BlobPopulator populator:pattern.getRight())populator.generate(gen,world.rand); + + gen.generate(world,world.rand,(int)player.posX+10,(int)player.posY,(int)player.posZ); } }; } diff --git a/src/main/java/chylex/hee/world/structure/island/biome/IslandBiomeEnchantedIsland.java b/src/main/java/chylex/hee/world/structure/island/biome/IslandBiomeEnchantedIsland.java index 7b79198f..06cde24e 100644 --- a/src/main/java/chylex/hee/world/structure/island/biome/IslandBiomeEnchantedIsland.java +++ b/src/main/java/chylex/hee/world/structure/island/biome/IslandBiomeEnchantedIsland.java @@ -7,11 +7,14 @@ import net.minecraft.util.AxisAlignedBB; import net.minecraft.world.EnumDifficulty; import net.minecraft.world.World; import chylex.hee.block.BlockEndstoneTerrain; +import chylex.hee.entity.fx.FXType; import chylex.hee.entity.mob.EntityMobBabyEnderman; import chylex.hee.entity.mob.EntityMobEnderGuardian; import chylex.hee.entity.mob.EntityMobEndermage; import chylex.hee.entity.mob.EntityMobHomelandEnderman; import chylex.hee.mechanics.misc.HomelandEndermen.HomelandRole; +import chylex.hee.packets.PacketPipeline; +import chylex.hee.packets.client.C21EffectEntity; import chylex.hee.world.structure.island.ComponentIsland; import chylex.hee.world.structure.island.biome.data.AbstractBiomeInteraction.BiomeInteraction; import chylex.hee.world.structure.island.biome.data.BiomeContentVariation; @@ -91,7 +94,7 @@ public class IslandBiomeEnchantedIsland extends IslandBiomeBase{ grown.setHomelandRole(HomelandRole.getRandomRole(world.rand)); world.spawnEntityInWorld(grown); - // TODO particles + PacketPipeline.sendToAllAround(grown,64D,new C21EffectEntity(FXType.Entity.BABY_ENDERMAN_GROW,grown)); } break;