Bug fixes

This commit is contained in:
Runemoro 2018-01-11 00:37:14 -05:00
parent 70922ceae1
commit 08a8123b2e
13 changed files with 124 additions and 34 deletions

View file

@ -15,11 +15,10 @@ import net.minecraft.world.World;
import net.minecraft.world.chunk.Chunk; import net.minecraft.world.chunk.Chunk;
import net.minecraft.world.chunk.storage.ExtendedBlockStorage; import net.minecraft.world.chunk.storage.ExtendedBlockStorage;
import net.minecraftforge.fml.common.registry.ForgeRegistries; import net.minecraftforge.fml.common.registry.ForgeRegistries;
import org.dimdev.dimdoors.DimDoors;
import org.lwjgl.Sys;
import java.util.ArrayList; import java.util.*;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry; import java.util.Map.Entry;
/** /**
@ -234,6 +233,8 @@ public class Schematic {
// Place the schematic's blocks // Place the schematic's blocks
List<IBlockState> palette = schematic.pallette; List<IBlockState> palette = schematic.pallette;
int[][][] blockData = schematic.blockData; int[][][] blockData = schematic.blockData;
Set<Chunk> changedChunks = new HashSet<>();
long start = System.currentTimeMillis();
for (int x = 0; x < blockData.length; x++) { for (int x = 0; x < blockData.length; x++) {
for (int y = 0; y < blockData[x].length; y++) { for (int y = 0; y < blockData[x].length; y++) {
for (int z = 0; z < blockData[x][y].length; z++) { for (int z = 0; z < blockData[x][y].length; z++) {
@ -250,10 +251,21 @@ public class Schematic {
} }
if (storage != null) storage.set(pos.getX() & 15, pos.getY() & 15, pos.getZ() & 15, state); if (storage != null) storage.set(pos.getX() & 15, pos.getY() & 15, pos.getZ() & 15, state);
chunk.markDirty(); chunk.markDirty();
changedChunks.add(chunk);
} }
} }
} }
// TODO: we might need relight the chunks if they had already been generated before DimDoors.log.info("Setting block states took " + (System.currentTimeMillis() - start) + " ms");
start = System.currentTimeMillis();
// Relight changed chunks
for (Chunk chunk : changedChunks) {
chunk.setLightPopulated(false);
chunk.resetRelightChecks();
chunk.checkLight();
}
world.markBlockRangeForRenderUpdate(xBase, yBase, zBase, xBase + schematic.width, yBase + schematic.height, zBase + schematic.length);
DimDoors.log.info("Relighting took " + (System.currentTimeMillis() - start) + " ms");
// Set TileEntity data // Set TileEntity data
for (NBTTagCompound tileEntityNBT : schematic.tileEntities) { for (NBTTagCompound tileEntityNBT : schematic.tileEntities) {
@ -267,7 +279,7 @@ public class Schematic {
// Correct the position // Correct the position
tileEntity.setWorld(world); tileEntity.setWorld(world);
tileEntity.setPos(pos); //correct the position tileEntity.setPos(pos);
tileEntity.markDirty(); tileEntity.markDirty();
} }
} }

View file

@ -57,8 +57,8 @@ public abstract class CommonProxy {
} }
public void registerTileEntities() { // TODO: new registry system public void registerTileEntities() { // TODO: new registry system
GameRegistry.registerTileEntity(TileEntityEntranceRift.class, "TileEntityEntranceRift"); GameRegistry.registerTileEntity(TileEntityEntranceRift.class, "EntranceRift");
GameRegistry.registerTileEntity(TileEntityFloatingRift.class, "TileEntityFloatingRift"); GameRegistry.registerTileEntity(TileEntityFloatingRift.class, "FloatingRift");
} }
public abstract boolean isClient(); public abstract boolean isClient();

View file

@ -2,6 +2,7 @@ package org.dimdev.dimdoors.shared.blocks;
import net.minecraft.block.Block; import net.minecraft.block.Block;
import net.minecraft.block.BlockDoor; import net.minecraft.block.BlockDoor;
import net.minecraft.block.material.EnumPushReaction;
import net.minecraft.block.material.Material; import net.minecraft.block.material.Material;
import net.minecraft.block.state.BlockFaceShape; import net.minecraft.block.state.BlockFaceShape;
import net.minecraft.block.state.IBlockState; import net.minecraft.block.state.IBlockState;
@ -134,7 +135,7 @@ public abstract class BlockDimensionalDoor extends BlockDoor implements IRiftPro
TileEntityFloatingRift newRift = (TileEntityFloatingRift) world.getTileEntity(pos); TileEntityFloatingRift newRift = (TileEntityFloatingRift) world.getTileEntity(pos);
newRift.copyFrom(rift); newRift.copyFrom(rift);
newRift.updateType(); newRift.updateType();
world.notifyBlockUpdate(rift.getPos(), state, world.getBlockState(pos), 0); // TODO: does this work? //world.notifyBlockUpdate(rift.getPos(), state, world.getBlockState(pos), 0); // TODO: does this work?
} else { } else {
rift.unregister(); rift.unregister();
} }
@ -143,6 +144,11 @@ public abstract class BlockDimensionalDoor extends BlockDoor implements IRiftPro
// Let vanilla handle breaking the block. If we break it here, the rift we place will later be broken. // Let vanilla handle breaking the block. If we break it here, the rift we place will later be broken.
@Override public void onBlockHarvested(World worldIn, BlockPos pos, IBlockState state, EntityPlayer player) {} @Override public void onBlockHarvested(World worldIn, BlockPos pos, IBlockState state, EntityPlayer player) {}
@Override
public EnumPushReaction getMobilityFlag(IBlockState state) {
return EnumPushReaction.BLOCK;
}
@Override @Override
public TileEntityEntranceRift getRift(World world, BlockPos pos, IBlockState state) { public TileEntityEntranceRift getRift(World world, BlockPos pos, IBlockState state) {
if (state.getValue(BlockDoor.HALF) == EnumDoorHalf.LOWER) { if (state.getValue(BlockDoor.HALF) == EnumDoorHalf.LOWER) {

View file

@ -1,5 +1,6 @@
package org.dimdev.dimdoors.shared.blocks; package org.dimdev.dimdoors.shared.blocks;
import net.minecraft.block.material.EnumPushReaction;
import org.dimdev.dimdoors.shared.tileentities.TileEntityEntranceRift; import org.dimdev.dimdoors.shared.tileentities.TileEntityEntranceRift;
import net.minecraft.block.*; import net.minecraft.block.*;
import net.minecraft.block.material.Material; import net.minecraft.block.material.Material;
@ -68,6 +69,12 @@ public abstract class BlockDimensionalTrapdoor extends BlockTrapDoor implements
super.breakBlock(world, pos, state); super.breakBlock(world, pos, state);
} }
@Override
@SuppressWarnings("deprecation")
public EnumPushReaction getMobilityFlag(IBlockState state) {
return EnumPushReaction.BLOCK;
}
@Override @Override
public TileEntityEntranceRift getRift(World world, BlockPos pos, IBlockState state) { public TileEntityEntranceRift getRift(World world, BlockPos pos, IBlockState state) {
return (TileEntityEntranceRift) world.getTileEntity(pos); return (TileEntityEntranceRift) world.getTileEntity(pos);

View file

@ -3,9 +3,6 @@ package org.dimdev.dimdoors.shared.blocks;
import java.util.Random; import java.util.Random;
import org.dimdev.dimdoors.DimDoors; import org.dimdev.dimdoors.DimDoors;
import org.dimdev.dimdoors.shared.VirtualLocation;
import org.dimdev.ddutils.Location;
import org.dimdev.ddutils.TeleportUtils;
import org.dimdev.dimdoors.shared.world.limbodimension.LimboDecay; import org.dimdev.dimdoors.shared.world.limbodimension.LimboDecay;
import org.dimdev.dimdoors.shared.world.limbodimension.WorldProviderLimbo; import org.dimdev.dimdoors.shared.world.limbodimension.WorldProviderLimbo;
import lombok.Getter; import lombok.Getter;
@ -61,7 +58,6 @@ public class BlockFabric extends Block {
setUnlocalizedName(ID); setUnlocalizedName(ID);
setCreativeTab(DimDoors.DIM_DOORS_CREATIVE_TAB); setCreativeTab(DimDoors.DIM_DOORS_CREATIVE_TAB);
setHardness(0.1F); setHardness(0.1F);
setLightLevel(1.0F);
setSoundType(SoundType.STONE); setSoundType(SoundType.STONE);
setDefaultState(getDefaultState().withProperty(TYPE, EnumType.REALITY)); setDefaultState(getDefaultState().withProperty(TYPE, EnumType.REALITY));
@ -103,6 +99,11 @@ public class BlockFabric extends Block {
} }
// Block properties // Block properties
// TODO: Maybe we should split this into several classes, since different fabrics have very little in common other than the name:
// 1. Reality/Altered
// 2. Ancient/Altered Ancient
// 3. Unravelled
// 4. Eternal (which we should make a liquid)
@Override @Override
@SuppressWarnings("deprecation") @SuppressWarnings("deprecation")
@ -124,6 +125,20 @@ public class BlockFabric extends Block {
} }
} }
@Override
@SuppressWarnings("deprecation")
public int getLightValue(IBlockState state) {
switch (state.getValue(TYPE)) {
case REALITY:
case ALTERED:
case ANCIENT:
case ANCIENT_ALTERED:
return 1;
default:
return 0;
}
}
@Override @Override
public int quantityDropped(Random random) { public int quantityDropped(Random random) {
return 0; return 0;

View file

@ -99,7 +99,7 @@ public class CommandPocket extends CommandBase {
TileEntityRift entrance = (TileEntityRift) player.world.getTileEntity(pocket.getEntrance().getPos()); TileEntityRift entrance = (TileEntityRift) player.world.getTileEntity(pocket.getEntrance().getPos());
entrance.teleportTo(player); entrance.teleportTo(player);
} else { } else {
TeleportUtils.teleport(player, new Location(player.world, pocket.getOrigin().offset(EnumFacing.UP, 20))); TeleportUtils.teleport(player, new Location(player.world, pocket.getOrigin().add(30, 30, 30)));
} }
} else { } else {
DimDoors.log.info("Not executing command /" + getName() + " because it wasn't sent by a player."); DimDoors.log.info("Not executing command /" + getName() + " because it wasn't sent by a player.");

View file

@ -135,7 +135,7 @@ import net.minecraft.util.math.BlockPos;
if (dest instanceof PocketExitDestination) { if (dest instanceof PocketExitDestination) {
destIterator.remove(); destIterator.remove();
if (rift.isRegistered()) dest.unregister(rift); if (rift.isRegistered()) dest.unregister(rift);
if (linkTo != null) rift.addAvailableLink(availableLink.toBuilder().build()); if (availableLink != null) rift.addAvailableLink(availableLink.toBuilder().build());
if (linkTo != null) destIterator.add(new WeightedRiftDestination(linkTo, wdest.getWeight(), wdest.getGroup(), oldDest)); if (linkTo != null) destIterator.add(new WeightedRiftDestination(linkTo, wdest.getWeight(), wdest.getGroup(), oldDest));
if (rift.isRegistered()) linkTo.register(rift); if (rift.isRegistered()) linkTo.register(rift);
if (rift instanceof TileEntityEntranceRift && !rift.isAlwaysDelete()) { if (rift instanceof TileEntityEntranceRift && !rift.isAlwaysDelete()) {

View file

@ -1,15 +1,15 @@
package org.dimdev.dimdoors.shared.tools; package org.dimdev.dimdoors.shared.tools;
import org.dimdev.dimdoors.DimDoors;
import org.dimdev.dimdoors.shared.blocks.BlockFabric;
import org.dimdev.dimdoors.shared.blocks.ModBlocks;
import org.dimdev.ddutils.schem.Schematic;
import net.minecraft.block.Block; import net.minecraft.block.Block;
import net.minecraft.block.state.IBlockState; import net.minecraft.block.state.IBlockState;
import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList; import net.minecraft.nbt.NBTTagList;
import net.minecraft.util.ResourceLocation; import net.minecraft.util.ResourceLocation;
import net.minecraftforge.fml.common.registry.ForgeRegistries; import net.minecraftforge.fml.common.registry.ForgeRegistries;
import org.dimdev.ddutils.schem.Schematic;
import org.dimdev.dimdoors.DimDoors;
import org.dimdev.dimdoors.shared.blocks.BlockFabric;
import org.dimdev.dimdoors.shared.blocks.ModBlocks;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
@ -20,6 +20,7 @@ import java.util.Map;
public final class SchematicConverter { public final class SchematicConverter {
private static final Map<String, IBlockState> stateMap = new HashMap<>(); private static final Map<String, IBlockState> stateMap = new HashMap<>();
static { static {
stateMap.put("dimdoors:Dimensional Door", ModBlocks.DIMENSIONAL_DOOR.getDefaultState()); stateMap.put("dimdoors:Dimensional Door", ModBlocks.DIMENSIONAL_DOOR.getDefaultState());
stateMap.put("dimdoors:Fabric of Reality", ModBlocks.FABRIC.getDefaultState().withProperty(BlockFabric.TYPE, BlockFabric.EnumType.REALITY)); stateMap.put("dimdoors:Fabric of Reality", ModBlocks.FABRIC.getDefaultState().withProperty(BlockFabric.TYPE, BlockFabric.EnumType.REALITY));
@ -40,7 +41,7 @@ public final class SchematicConverter {
schematic.width = nbt.getShort("Width"); schematic.width = nbt.getShort("Width");
schematic.height = nbt.getShort("Height"); schematic.height = nbt.getShort("Height");
schematic.length = nbt.getShort("Length"); schematic.length = nbt.getShort("Length");
schematic.offset = new int[]{0, 0, 0}; // TODO: center them schematic.offset = new int[]{0, 0, 0};
byte[] blockIntArray = nbt.getByteArray("Blocks"); byte[] blockIntArray = nbt.getByteArray("Blocks");
if (nbt.hasKey("Palette")) { if (nbt.hasKey("Palette")) {
@ -86,7 +87,8 @@ public final class SchematicConverter {
block = ModBlocks.TRANSIENT_DIMENSIONAL_DOOR; block = ModBlocks.TRANSIENT_DIMENSIONAL_DOOR;
break; break;
} }
if (id != 0 && block.getRegistryName().toString().equals("minecraft:air")) throw new RuntimeException("Change conversion code!"); if (id != 0 && block.getRegistryName().toString().equals("minecraft:air"))
throw new RuntimeException("Change conversion code!");
schematic.pallette.add(block.getDefaultState()); schematic.pallette.add(block.getDefaultState());
palletteMap.put(id, currentPalletteIndex); palletteMap.put(id, currentPalletteIndex);
blockIntArray[i] = currentPalletteIndex; blockIntArray[i] = currentPalletteIndex;
@ -110,23 +112,60 @@ public final class SchematicConverter {
blockInt = schematic.pallette.indexOf(additionalState); blockInt = schematic.pallette.indexOf(additionalState);
} else { } else {
schematic.pallette.add(additionalState); schematic.pallette.add(additionalState);
// DimDoors.log.info("New blockstate detected. Original blockInt = " + blockInt + " and baseState is " + baseState); //DimDoors.log.info("New blockstate detected. Original blockInt = " + blockInt + " and baseState is " + baseState);
blockInt = schematic.pallette.size() - 1; blockInt = schematic.pallette.size() - 1;
} }
} else { // if this is ancient fabric } else { // if this is ancient fabric
// DimDoors.log.info("Non-default blockstate in palette detected. Original blockInt = " + blockInt + " and baseState is " + baseState.toString()); //@todo should only print a line on load of ancient fabric
blockInt = schematic.pallette.indexOf(baseState); blockInt = schematic.pallette.indexOf(baseState);
} }
assert blockInt >= 0;
schematic.blockData[x][y][z] = blockInt; schematic.blockData[x][y][z] = blockInt;
} }
} }
} }
schematic.paletteMax = schematic.pallette.size() - 1; schematic.paletteMax = schematic.pallette.size() - 1;
NBTTagList tileEntitiesTagList = (NBTTagList) nbt.getTag("TileEntities"); NBTTagList tileEntitiesNBT = (NBTTagList) nbt.getTag("TileEntities");
for (int i = 0; i < tileEntitiesTagList.tagCount(); i++) { for (int i = 0; i < tileEntitiesNBT.tagCount(); i++) {
NBTTagCompound tileEntityTagCompound = tileEntitiesTagList.getCompoundTagAt(i); NBTTagCompound tileEntityNBT = tileEntitiesNBT.getCompoundTagAt(i);
schematic.tileEntities.add(tileEntityTagCompound); int x = tileEntityNBT.getInteger("x");
int y = tileEntityNBT.getInteger("y");
int z = tileEntityNBT.getInteger("z");
switch (tileEntityNBT.getString("id")) {
case "TileEntityDimDoor":
tileEntityNBT = new NBTTagCompound();
tileEntityNBT.setString("id", "EntranceRift");
tileEntityNBT.setInteger("x", x);
tileEntityNBT.setInteger("y", y);
tileEntityNBT.setInteger("z", z);
// TODO
break;
case "TileEntityRift":
tileEntityNBT = new NBTTagCompound();
tileEntityNBT.setString("id", "FloatingRift");
tileEntityNBT.setInteger("x", x);
tileEntityNBT.setInteger("y", y);
tileEntityNBT.setInteger("z", z);
// TODO
break;
case "Sign":
DimDoors.log.info("Sign: "
+ tileEntityNBT.getString("Text1") + "|"
+ tileEntityNBT.getString("Text2") + "|"
+ tileEntityNBT.getString("Text3") + "|"
+ tileEntityNBT.getString("Text4"));
tileEntityNBT.setString("Text1", "{\"text\":\"" + tileEntityNBT.getString("Text1") + "\"}");
tileEntityNBT.setString("Text2", "{\"text\":\"" + tileEntityNBT.getString("Text2") + "\"}");
tileEntityNBT.setString("Text3", "{\"text\":\"" + tileEntityNBT.getString("Text3") + "\"}");
tileEntityNBT.setString("Text4", "{\"text\":\"" + tileEntityNBT.getString("Text4") + "\"}");
break;
case "Chest":
break;
default:
DimDoors.log.info("TileEntity found: " + tileEntityNBT.getString("id"));
break;
}
schematic.tileEntities.add(tileEntityNBT);
} }
return schematic; return schematic;

View file

@ -26,7 +26,7 @@ public class BiomeLimbo extends Biome {
spawnableCreatureList.clear(); spawnableCreatureList.clear();
spawnableWaterCreatureList.clear(); spawnableWaterCreatureList.clear();
spawnableCaveCreatureList.clear(); spawnableCaveCreatureList.clear();
spawnableMonsterList.add(new SpawnListEntry(EntityMonolith.class, 100, 4, 4)); spawnableMonsterList.add(new SpawnListEntry(EntityMonolith.class, 100, 1, 1));
flowers.clear(); flowers.clear();
@ -66,4 +66,9 @@ public class BiomeLimbo extends Biome {
public int getFoliageColorAtPos(BlockPos pos) { public int getFoliageColorAtPos(BlockPos pos) {
return getModdedBiomeFoliageColor(0x000000); return getModdedBiomeFoliageColor(0x000000);
} }
@Override
public float getSpawningChance() {
return 0.5F;
}
} }

View file

@ -1,5 +1,6 @@
package org.dimdev.dimdoors.shared.world.limbodimension; package org.dimdev.dimdoors.shared.world.limbodimension;
import net.minecraft.world.WorldEntitySpawner;
import org.dimdev.dimdoors.shared.blocks.BlockFabric; import org.dimdev.dimdoors.shared.blocks.BlockFabric;
import org.dimdev.dimdoors.shared.blocks.ModBlocks; import org.dimdev.dimdoors.shared.blocks.ModBlocks;
import org.dimdev.dimdoors.shared.world.ModBiomes; import org.dimdev.dimdoors.shared.world.ModBiomes;
@ -82,7 +83,9 @@ public class LimboGenerator implements IChunkGenerator {
@Override @Override
public void populate(int x, int z) { public void populate(int x, int z) {
// TODO: custom spawning?
Biome biome = world.getBiome(new BlockPos(x * 16 + 16, 0, z * 16 + 16));
WorldEntitySpawner.performWorldGenSpawning(world, biome, x * 16 + 8, z * 16 + 8, 16, 16, rand);
} }
@Override @Override
@ -284,7 +287,9 @@ public class LimboGenerator implements IChunkGenerator {
@Override @Override
public List<Biome.SpawnListEntry> getPossibleCreatures(EnumCreatureType creatureType, BlockPos pos) { public List<Biome.SpawnListEntry> getPossibleCreatures(EnumCreatureType creatureType, BlockPos pos) {
return new ArrayList<>(); // TODO: custom spawning?
Biome biome = world.getBiome(pos);
return biome.getSpawnableList(creatureType);
} }
@Nullable @Nullable

View file

@ -37,8 +37,9 @@ public class WorldProviderLimbo extends WorldProvider {
@Override @Override
protected void generateLightBrightnessTable() { protected void generateLightBrightnessTable() {
for (int i = 0; i <= 15; ++i) { for (int i = 0; i <= 15; ++i) {
float var3 = 1.0F - i / 15.0F; //float var3 = 1.0F - i / 15.0F;
lightBrightnessTable[i] = (0.0F + var3) / (var3 * 3.0F + 1.0F) * 1.0F * 3; //lightBrightnessTable[i] = (0.0F + var3) / (var3 * 3.0F + 1.0F) * 1.0F * 3;
lightBrightnessTable[i] = 1;
} }
} }

View file

@ -31,7 +31,7 @@ public class BiomeBlank extends Biome {
spawnableCreatureList.clear(); spawnableCreatureList.clear();
spawnableWaterCreatureList.clear(); spawnableWaterCreatureList.clear();
spawnableCaveCreatureList.clear(); spawnableCaveCreatureList.clear();
if (monoliths) spawnableMonsterList.add(new SpawnListEntry(EntityMonolith.class, 100, 4, 4)); //if (monoliths) spawnableMonsterList.add(new SpawnListEntry(EntityMonolith.class, 100, 4, 4));
flowers.clear(); flowers.clear();

View file

@ -16,7 +16,7 @@ public abstract class WorldProviderPocket extends WorldProvider {
@Override @Override
public void init() { public void init() {
// TODO: save pocket registry nbt here? (see WorldProviderEnd) // TODO: save pocket registry nbt here? (see WorldProviderEnd)
hasSkyLight = false; // TODO: this is only a temporary fix //hasSkyLight = false; // TODO: this is only a temporary fix
generateLightBrightnessTable(); generateLightBrightnessTable();
DimDoors.proxy.setCloudRenderer(this, new CloudRenderBlank()); DimDoors.proxy.setCloudRenderer(this, new CloudRenderBlank());
} }