mirror of
https://github.com/HbmMods/Hbm-s-Nuclear-Tech-GIT.git
synced 2026-01-25 10:32:49 +00:00
265 lines
8.8 KiB
Java
265 lines
8.8 KiB
Java
package com.hbm.main;
|
|
|
|
import java.util.ArrayList;
|
|
import java.util.List;
|
|
import java.util.Random;
|
|
|
|
import com.hbm.blocks.ModBlocks;
|
|
import com.hbm.config.GeneralConfig;
|
|
import com.hbm.handler.ImpactWorldHandler;
|
|
import com.hbm.saveddata.TomSaveData;
|
|
import com.hbm.world.WorldProviderNTM;
|
|
|
|
import cpw.mods.fml.common.eventhandler.EventPriority;
|
|
import cpw.mods.fml.common.eventhandler.SubscribeEvent;
|
|
import cpw.mods.fml.common.eventhandler.Event.Result;
|
|
import cpw.mods.fml.common.gameevent.TickEvent.Phase;
|
|
import cpw.mods.fml.common.gameevent.TickEvent.WorldTickEvent;
|
|
import net.minecraft.block.Block;
|
|
import net.minecraft.block.BlockBush;
|
|
import net.minecraft.block.BlockCrops;
|
|
import net.minecraft.block.BlockDoor;
|
|
import net.minecraft.block.BlockLeaves;
|
|
import net.minecraft.block.BlockLog;
|
|
import net.minecraft.block.material.Material;
|
|
import net.minecraft.entity.EntityLivingBase;
|
|
import net.minecraft.entity.passive.EntityWaterMob;
|
|
import net.minecraft.entity.player.EntityPlayer;
|
|
import net.minecraft.init.Blocks;
|
|
import net.minecraft.util.DamageSource;
|
|
import net.minecraft.world.EnumSkyBlock;
|
|
import net.minecraft.world.chunk.Chunk;
|
|
import net.minecraft.world.chunk.storage.ExtendedBlockStorage;
|
|
import net.minecraftforge.common.DimensionManager;
|
|
import net.minecraftforge.event.entity.EntityJoinWorldEvent;
|
|
import net.minecraftforge.event.terraingen.BiomeEvent;
|
|
import net.minecraftforge.event.terraingen.DecorateBiomeEvent;
|
|
import net.minecraftforge.event.terraingen.PopulateChunkEvent;
|
|
import net.minecraftforge.event.terraingen.DecorateBiomeEvent.Decorate.EventType;
|
|
import net.minecraftforge.event.world.WorldEvent;
|
|
|
|
public class ModEventHandlerImpact {
|
|
|
|
//////////////////////////////////////////
|
|
private static Random rand = new Random();
|
|
//////////////////////////////////////////
|
|
|
|
@SubscribeEvent
|
|
public void worldTick(WorldTickEvent event) {
|
|
|
|
if(event.world != null && !event.world.isRemote && event.phase == Phase.START) {
|
|
float settle = 1F / 14400000F; // 600 days to completely clear all dust.
|
|
float cool = 1F / 24000F; // One MC day between initial impact and total darkness.
|
|
|
|
ImpactWorldHandler.impactEffects(event.world);
|
|
TomSaveData data = TomSaveData.forWorld(event.world);
|
|
|
|
if(data.dust > 0 && data.fire == 0) {
|
|
data.dust = Math.max(0, data.dust - settle);
|
|
data.markDirty();
|
|
}
|
|
|
|
if(data.fire > 0) {
|
|
data.fire = Math.max(0, (data.fire - cool));
|
|
data.dust = Math.min(1, (data.dust + cool));
|
|
data.markDirty();
|
|
}
|
|
|
|
if(!event.world.loadedEntityList.isEmpty()) {
|
|
|
|
List<Object> oList = new ArrayList<Object>();
|
|
oList.addAll(event.world.loadedEntityList);
|
|
|
|
for(Object e : oList) {
|
|
if(e instanceof EntityLivingBase) {
|
|
EntityLivingBase entity = (EntityLivingBase) e;
|
|
|
|
if(entity.worldObj.provider.dimensionId == 0 && data.fire > 0 && data.dust < 0.75f &&
|
|
event.world.getSavedLightValue(EnumSkyBlock.Sky, (int) entity.posX, (int) entity.posY, (int) entity.posZ) > 7) {
|
|
|
|
entity.setFire(5);
|
|
entity.attackEntityFrom(DamageSource.onFire, 2);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
//data is always pooled out of the perWorld save data so resetting values isn't needed
|
|
/*@SubscribeEvent(priority = EventPriority.LOWEST)
|
|
public void onUnload(WorldEvent.Unload event) {
|
|
// We don't want Tom's impact data transferring between worlds.
|
|
TomSaveData data = TomSaveData.forWorld(event.world);
|
|
this.fire = 0;
|
|
this.dust = 0;
|
|
this.impact = false;
|
|
data.fire = 0;
|
|
data.dust = 0;
|
|
data.impact = false;
|
|
}*/
|
|
|
|
@SubscribeEvent
|
|
public void extinction(EntityJoinWorldEvent event) {
|
|
|
|
TomSaveData data = TomSaveData.forWorld(event.world);
|
|
|
|
if(data.impact) {
|
|
if(!(event.entity instanceof EntityPlayer) && event.entity instanceof EntityLivingBase) {
|
|
EntityLivingBase living = (EntityLivingBase) event.entity;
|
|
if(event.world.provider.dimensionId == 0) {
|
|
if(event.entity.height >= 0.85f || event.entity.width >= 0.85f && event.entity.ticksExisted < 20 && !(event.entity instanceof EntityWaterMob) && !living.isChild()) {
|
|
event.setCanceled(true);
|
|
}
|
|
}
|
|
if(event.entity instanceof EntityWaterMob && event.entity.ticksExisted < 20) {
|
|
Random rand = new Random();
|
|
if(rand.nextInt(9) != 0) {
|
|
event.setCanceled(true);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
@SubscribeEvent(priority = EventPriority.LOWEST)
|
|
public void onLoad(WorldEvent.Load event) {
|
|
|
|
if(GeneralConfig.enableImpactWorldProvider) {
|
|
DimensionManager.unregisterProviderType(0);
|
|
DimensionManager.registerProviderType(0, WorldProviderNTM.class, true);
|
|
}
|
|
}
|
|
|
|
@SubscribeEvent
|
|
public void modifyVillageGen(BiomeEvent.GetVillageBlockID event) {
|
|
Block b = event.original;
|
|
Material mat = event.original.getMaterial();
|
|
|
|
TomSaveData data = TomSaveData.getLastCachedOrNull();
|
|
|
|
if(event.biome == null) {
|
|
return;
|
|
}
|
|
|
|
if(data.impact) {
|
|
if(mat == Material.wood || mat == Material.glass || b == Blocks.ladder || b instanceof BlockCrops ||
|
|
b == Blocks.chest || b instanceof BlockDoor || mat == Material.cloth || mat == Material.water || b == Blocks.stone_slab) {
|
|
event.replacement = Blocks.air;
|
|
|
|
} else if(b == Blocks.cobblestone || b == Blocks.stonebrick) {
|
|
if(rand.nextInt(3) == 1) {
|
|
event.replacement = Blocks.gravel;
|
|
}
|
|
} else if(b == Blocks.sandstone) {
|
|
if(rand.nextInt(3) == 1) {
|
|
event.replacement = Blocks.sand;
|
|
}
|
|
} else if(b == Blocks.farmland) {
|
|
event.replacement = Blocks.dirt;
|
|
}
|
|
}
|
|
|
|
if(event.replacement != null) {
|
|
event.setResult(Result.DENY);
|
|
}
|
|
}
|
|
|
|
|
|
@SubscribeEvent
|
|
public void postImpactGeneration(BiomeEvent event) {
|
|
/// Disables post-impact surface replacement for superflat worlds
|
|
/// because they are retarded and crash with a NullPointerException if
|
|
/// you try to look for biome-specific blocks.
|
|
TomSaveData data = TomSaveData.getLastCachedOrNull(); //despite forcing the data, we cannot rule out canceling events or custom firing shenanigans
|
|
if(data != null && event.biome != null) {
|
|
if(event.biome.topBlock != null) {
|
|
if(event.biome.topBlock == Blocks.grass) {
|
|
if(data.impact && (data.dust > 0 || data.fire > 0)) {
|
|
event.biome.topBlock = ModBlocks.impact_dirt;
|
|
} else {
|
|
event.biome.topBlock = Blocks.grass;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
@SubscribeEvent
|
|
public void postImpactDecoration(DecorateBiomeEvent.Decorate event) {
|
|
|
|
TomSaveData data = TomSaveData.forWorld(event.world);
|
|
|
|
if(data.impact) {
|
|
EventType type = event.type;
|
|
|
|
if(data.dust > 0 || data.fire > 0) {
|
|
if(type == event.type.TREE || type == event.type.BIG_SHROOM || type == event.type.GRASS || type == event.type.REED || type == event.type.FLOWERS || type == event.type.DEAD_BUSH
|
|
|| type == event.type.CACTUS || type == event.type.PUMPKIN || type == event.type.LILYPAD) {
|
|
event.setResult(Result.DENY);
|
|
}
|
|
|
|
} else if(data.dust == 0 && data.fire == 0) {
|
|
if(type == event.type.TREE || type == event.type.BIG_SHROOM || type == event.type.CACTUS) {
|
|
if(event.world.rand.nextInt(9) == 0) {
|
|
event.setResult(Result.DEFAULT);
|
|
} else {
|
|
event.setResult(Result.DENY);
|
|
}
|
|
}
|
|
|
|
if(type == event.type.GRASS || type == event.type.REED) {
|
|
event.setResult(Result.DEFAULT);
|
|
}
|
|
}
|
|
|
|
} else {
|
|
event.setResult(Result.DEFAULT);
|
|
}
|
|
}
|
|
|
|
@SubscribeEvent
|
|
public void populateChunkPre(PopulateChunkEvent.Pre event) {
|
|
TomSaveData.forWorld(event.world); /* forces the data to be cached so it is accurate by the time ModEventHandlerImpact#modifyVillageGen is called. */
|
|
}
|
|
|
|
@SubscribeEvent
|
|
public void populateChunkPost(PopulateChunkEvent.Post event) {
|
|
|
|
TomSaveData data = TomSaveData.forWorld(event.world);
|
|
|
|
if(data.impact) {
|
|
Chunk chunk = event.world.getChunkFromChunkCoords(event.chunkX, event.chunkZ);
|
|
|
|
for(ExtendedBlockStorage storage : chunk.getBlockStorageArray()) {
|
|
|
|
if(storage != null) {
|
|
|
|
for(int x = 0; x < 16; ++x) {
|
|
for(int y = 0; y < 16; ++y) {
|
|
for(int z = 0; z < 16; ++z) {
|
|
|
|
if(data.dust > 0.25 || data.fire > 0) {
|
|
if(storage.getBlockByExtId(x, y, z) == Blocks.grass) {
|
|
storage.func_150818_a(x, y, z, ModBlocks.impact_dirt);
|
|
} else if(storage.getBlockByExtId(x, y, z) instanceof BlockLog) {
|
|
storage.func_150818_a(x, y, z, Blocks.air);
|
|
} else if(storage.getBlockByExtId(x, y, z) instanceof BlockLeaves) {
|
|
storage.func_150818_a(x, y, z, Blocks.air);
|
|
} else if(storage.getBlockByExtId(x, y, z).getMaterial() == Material.leaves) {
|
|
storage.func_150818_a(x, y, z, Blocks.air);
|
|
} else if(storage.getBlockByExtId(x, y, z).getMaterial() == Material.plants) {
|
|
storage.func_150818_a(x, y, z, Blocks.air);
|
|
} else if(storage.getBlockByExtId(x, y, z) instanceof BlockBush) {
|
|
storage.func_150818_a(x, y, z, Blocks.air);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|