Skip to content
This repository was archived by the owner on Apr 9, 2024. It is now read-only.
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
751 changes: 541 additions & 210 deletions project/BlockModifierAPI/src/codemetropolis/blockmodifier/Chunk.java

Large diffs are not rendered by default.

168 changes: 120 additions & 48 deletions project/BlockModifierAPI/src/codemetropolis/blockmodifier/Level.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,70 +5,142 @@

import codemetropolis.blockmodifier.ext.LevelFile;
import codemetropolis.blockmodifier.ext.NBTTag;
import codemetropolis.blockmodifier.helpers.LevelHelper;

public class Level {

private static final LevelHelper HELPER = new LevelHelper();
private LevelFile levelFile;
private NBTTag tag;

public Level(World world) {
File file = new File(String.format("%s/level.dat", world.PATH));
boolean alreadyExists = file.exists();
this.levelFile = new LevelFile(file);

if(alreadyExists) {

if (alreadyExists) {

try {
tag = NBTTag.readFrom(levelFile.getLevelDataInputStream());
} catch (IOException e) {
e.printStackTrace();
}
}
} else {
NBTTag allowCommandsTag = new NBTTag(NBTTag.Type.TAG_Byte, "allowCommands", (byte)0);
NBTTag hardcoreTag = new NBTTag(NBTTag.Type.TAG_Byte, "hardcore", (byte)0);
NBTTag initializedTag = new NBTTag(NBTTag.Type.TAG_Byte, "initialized", (byte)1);
NBTTag mapFeaturesTag = new NBTTag(NBTTag.Type.TAG_Byte, "MapFeatures", (byte)0);
NBTTag rainingTag = new NBTTag(NBTTag.Type.TAG_Byte, "raining", (byte)0);
NBTTag thunderingTag = new NBTTag(NBTTag.Type.TAG_Byte, "thundering", (byte)0);
NBTTag gameTypeTag = new NBTTag(NBTTag.Type.TAG_Int, "GameType", 1);
NBTTag generatorVersionTag = new NBTTag(NBTTag.Type.TAG_Int, "generatorVersion", 1);
NBTTag rainTimeTag = new NBTTag(NBTTag.Type.TAG_Int, "rainTime", Integer.MAX_VALUE);
NBTTag spawnXTag = new NBTTag(NBTTag.Type.TAG_Int, "SpawnX", 0);
NBTTag spawnYTag = new NBTTag(NBTTag.Type.TAG_Int, "SpawnY", world.GROUNDLEVEL + 1);
NBTTag spawnZTag = new NBTTag(NBTTag.Type.TAG_Int, "SpawnZ", 0);
NBTTag thunderTimeTag = new NBTTag(NBTTag.Type.TAG_Int, "thunderTime", Integer.MAX_VALUE);
NBTTag versionTag = new NBTTag(NBTTag.Type.TAG_Int, "version", 19133);
NBTTag dayTimeTag = new NBTTag(NBTTag.Type.TAG_Long, "DayTime", 3000L);
NBTTag lastPlayedTag = new NBTTag(NBTTag.Type.TAG_Long, "LastPlayed", 0L);
NBTTag randomSeedTag = new NBTTag(NBTTag.Type.TAG_Long, "RandomSeed", 0L);
NBTTag sizeOnDiskTag = new NBTTag(NBTTag.Type.TAG_Long, "SizeOnDisk", 0L);
NBTTag timeTag = new NBTTag(NBTTag.Type.TAG_Long, "Time", 3000L);
NBTTag generatorNameTag = new NBTTag(NBTTag.Type.TAG_String, "generatorName", "flat");
NBTTag generatorOptionsTag = new NBTTag(NBTTag.Type.TAG_String, "generatorOptions", "3;minecraft:bedrock," + (world.GROUNDLEVEL - 1) + "*minecraft:dirt,minecraft:grass");
NBTTag levelNameTag = new NBTTag(NBTTag.Type.TAG_String, "LevelName", world.NAME);

NBTTag commandBlockOutputTag = new NBTTag(NBTTag.Type.TAG_String, "commandBlockOutput", "true");
NBTTag doDaylightCycleTag = new NBTTag(NBTTag.Type.TAG_String, "doDaylightCycle", "false");
NBTTag doFireTickTag = new NBTTag(NBTTag.Type.TAG_String, "doFireTick", "true");
NBTTag doMobLootTag = new NBTTag(NBTTag.Type.TAG_String, "doMobLoot", "true");
NBTTag doMobSpawningTag = new NBTTag(NBTTag.Type.TAG_String, "doMobSpawning", "false");
NBTTag doTileDropsTag = new NBTTag(NBTTag.Type.TAG_String, "doTileDrops", "true");
NBTTag keepInventoryTag = new NBTTag(NBTTag.Type.TAG_String, "keepInventory", "true");
NBTTag mobGriefingTag = new NBTTag(NBTTag.Type.TAG_String, "mobGriefing", "false");
NBTTag naturalRegenerationTag = new NBTTag(NBTTag.Type.TAG_String, "naturalRegeneration", "true");

NBTTag[] ruleList = new NBTTag[] {commandBlockOutputTag, doDaylightCycleTag, doFireTickTag, doMobLootTag, doMobSpawningTag, doTileDropsTag,
keepInventoryTag, mobGriefingTag, naturalRegenerationTag, new NBTTag(NBTTag.Type.TAG_End, null, null)};
NBTTag gameRulesTag = new NBTTag(NBTTag.Type.TAG_Compound, "GameRules", ruleList);

NBTTag[] tagList = new NBTTag[] {versionTag, initializedTag, levelNameTag, generatorNameTag, generatorVersionTag, generatorOptionsTag, randomSeedTag,
mapFeaturesTag, lastPlayedTag, sizeOnDiskTag, allowCommandsTag, hardcoreTag, gameTypeTag, timeTag, dayTimeTag, spawnXTag, spawnYTag,
spawnZTag, rainingTag, rainTimeTag, thunderingTag, thunderTimeTag, gameRulesTag, new NBTTag(NBTTag.Type.TAG_End, null, null)};
NBTTag dataTag = new NBTTag(NBTTag.Type.TAG_Compound, "Data", tagList);
tag = new NBTTag(NBTTag.Type.TAG_Compound, "", new NBTTag[] {dataTag, new NBTTag(NBTTag.Type.TAG_End, null, null)});

tag = createNewLevelFile(world);
}

}


private NBTTag createNewLevelFile(World world) {
NBTTag versionTag = new NBTTag(NBTTag.Type.TAG_Int, "version", 19133);
NBTTag initializedTag = new NBTTag(NBTTag.Type.TAG_Byte, "initialized", (byte) 1);
NBTTag levelNameTag = new NBTTag(NBTTag.Type.TAG_String, "LevelName", world.NAME);
NBTTag generatorNameTag = new NBTTag(NBTTag.Type.TAG_String, "generatorName", "flat");
NBTTag generatorVersionTag = new NBTTag(NBTTag.Type.TAG_Int, "generatorVersion", 0);
NBTTag randomSeedTag = new NBTTag(NBTTag.Type.TAG_Long, "RandomSeed", 0L);
NBTTag mapFeaturesTag = new NBTTag(NBTTag.Type.TAG_Byte, "MapFeatures", (byte) 0);
NBTTag lastPlayedTag = new NBTTag(NBTTag.Type.TAG_Long, "LastPlayed", System.currentTimeMillis());
NBTTag sizeOnDiskTag = new NBTTag(NBTTag.Type.TAG_Long, "SizeOnDisk", 0L);
NBTTag allowCommandsTag = new NBTTag(NBTTag.Type.TAG_Byte, "allowCommands", (byte) 1);
NBTTag hardcoreTag = new NBTTag(NBTTag.Type.TAG_Byte, "hardcore", (byte) 0);
NBTTag gameTypeTag = new NBTTag(NBTTag.Type.TAG_Int, "GameType", 1);
NBTTag difficultyTag = new NBTTag(NBTTag.Type.TAG_Byte, "Difficulty", (byte) 2);
NBTTag difficultyLockedTag = new NBTTag(NBTTag.Type.TAG_Byte, "DifficultyLocked", (byte) 0);
NBTTag timeTag = new NBTTag(NBTTag.Type.TAG_Long, "Time", 3000L);
NBTTag dayTimeTag = new NBTTag(NBTTag.Type.TAG_Long, "DayTime", 3000L);
NBTTag spawnXTag = new NBTTag(NBTTag.Type.TAG_Int, "SpawnX", 0);
NBTTag spawnYTag = new NBTTag(NBTTag.Type.TAG_Int, "SpawnY", world.GROUNDLEVEL + 1);
NBTTag spawnZTag = new NBTTag(NBTTag.Type.TAG_Int, "SpawnZ", 0);
NBTTag borderCenterXTag = new NBTTag(NBTTag.Type.TAG_Double, "BorderCenterX", (double) 0);
NBTTag borderCenterZTag = new NBTTag(NBTTag.Type.TAG_Double, "BorderCenterZ", (double) 0);

NBTTag borderSizeTag = new NBTTag(NBTTag.Type.TAG_Double, "BorderSize", (double) 60000000);
NBTTag borderSafeZoneTag = new NBTTag(NBTTag.Type.TAG_Double, "BorderSafeZone", (double) 5);
NBTTag borderWarningBlocksTag = new NBTTag(NBTTag.Type.TAG_Double, "BorderWarningBlocks", (double) 5);
NBTTag borderWarningTimeTag = new NBTTag(NBTTag.Type.TAG_Double, "BorderWarningTime", (double) 15);
NBTTag borderSizeLerpTargetTag = new NBTTag(NBTTag.Type.TAG_Double, "BorderSizeLerpTarget", (double) 60000000);
NBTTag borderSizeLerpTimeTag = new NBTTag(NBTTag.Type.TAG_Long, "BorderSizeLerpTime", 0L);
NBTTag borderDamagePerBlockTag = new NBTTag(NBTTag.Type.TAG_Double, "BorderSizeLerpTarget", 0.2);

NBTTag dataVersionTag = new NBTTag(NBTTag.Type.TAG_Int, "DataVersion", 1631);

NBTTag rainingTag = new NBTTag(NBTTag.Type.TAG_Byte, "raining", (byte) 0);
NBTTag rainTimeTag = new NBTTag(NBTTag.Type.TAG_Int, "rainTime", Integer.MAX_VALUE);
NBTTag thunderingTag = new NBTTag(NBTTag.Type.TAG_Byte, "thundering", (byte) 0);
NBTTag thunderTimeTag = new NBTTag(NBTTag.Type.TAG_Int, "thunderTime", Integer.MAX_VALUE);
NBTTag clearWeatherTimeTag = new NBTTag(NBTTag.Type.TAG_Int, "clearWeatherTime", Integer.MAX_VALUE);

/**
* Gamerules:
*
*/

NBTTag announceAdvancementsTag = new NBTTag(NBTTag.Type.TAG_String, "announceAdvancements", "true");
NBTTag commandBlockOutputTag = new NBTTag(NBTTag.Type.TAG_String, "commandBlockOutput", "true");
NBTTag disableElytraMovementCheckTag = new NBTTag(NBTTag.Type.TAG_String, "disableElytraMovementCheck", "false");
NBTTag doDaylightCycleTag = new NBTTag(NBTTag.Type.TAG_String, "doDaylightCycle", "false");
NBTTag doEntityDropsTag = new NBTTag(NBTTag.Type.TAG_String, "doEntityDrops", "true");
NBTTag doFireTickTag = new NBTTag(NBTTag.Type.TAG_String, "doFireTick", "true");
NBTTag doLimitedCraftingTag = new NBTTag(NBTTag.Type.TAG_String, "doLimitedCrafting", "false");
NBTTag doMobLootTag = new NBTTag(NBTTag.Type.TAG_String, "doMobLoot", "true");
NBTTag doMobSpawningTag = new NBTTag(NBTTag.Type.TAG_String, "doMobSpawning", "false");
NBTTag doTileDropsTag = new NBTTag(NBTTag.Type.TAG_String, "doTileDrops", "true");
NBTTag doWeatherCycleTag = new NBTTag(NBTTag.Type.TAG_String, "doWeatherCycle", "true");
NBTTag keepInventoryTag = new NBTTag(NBTTag.Type.TAG_String, "keepInventory", "true");
NBTTag logAdminCommandsTag = new NBTTag(NBTTag.Type.TAG_String, "logAdminCommands", "true");
NBTTag maxCommandChainLengthTag = new NBTTag(NBTTag.Type.TAG_String, "maxCommandChainLength", "65536");
NBTTag maxEntityCrammingTag = new NBTTag(NBTTag.Type.TAG_String, "maxEntityCramming", "24");
NBTTag mobGriefingTag = new NBTTag(NBTTag.Type.TAG_String, "mobGriefing", "false");
NBTTag naturalRegenerationTag = new NBTTag(NBTTag.Type.TAG_String, "naturalRegeneration", "true");
NBTTag randomTickSpeedTag = new NBTTag(NBTTag.Type.TAG_String, "randomTickSpeed", "3");
NBTTag reducedDebugInfoTag = new NBTTag(NBTTag.Type.TAG_String, "reducedDebugInfo", "false");
NBTTag sendCommandFeedbackTag = new NBTTag(NBTTag.Type.TAG_String, "sendCommandFeedback", "true");
NBTTag showDeathMessagesTag = new NBTTag(NBTTag.Type.TAG_String, "showDeathMessages", "true");
NBTTag spawnRadiusTag = new NBTTag(NBTTag.Type.TAG_String, "spawnRadius", "10");
NBTTag spectatorsGenerateChunksTag = new NBTTag(NBTTag.Type.TAG_String, "spectatorsGenerateChunks", "true");

NBTTag[] ruleList = new NBTTag[] { announceAdvancementsTag, commandBlockOutputTag, disableElytraMovementCheckTag, doDaylightCycleTag, doEntityDropsTag, doFireTickTag, doLimitedCraftingTag,
doMobLootTag, doMobSpawningTag, doTileDropsTag, doWeatherCycleTag, keepInventoryTag, logAdminCommandsTag, maxCommandChainLengthTag, maxEntityCrammingTag, mobGriefingTag,
naturalRegenerationTag, randomTickSpeedTag, reducedDebugInfoTag, sendCommandFeedbackTag, showDeathMessagesTag, spawnRadiusTag, spectatorsGenerateChunksTag,
new NBTTag(NBTTag.Type.TAG_End, null, null) };

NBTTag gameRulesTag = new NBTTag(NBTTag.Type.TAG_Compound, "GameRules", ruleList);

/**
* Version:
*/

NBTTag versionIdTag = new NBTTag(NBTTag.Type.TAG_Int, "Id", 1631);
NBTTag versionNameTag = new NBTTag(NBTTag.Type.TAG_String, "Name", "1.13.2");
NBTTag isSnapshotTag = new NBTTag(NBTTag.Type.TAG_Byte, "Snapshot", (byte) 0);

NBTTag[] versionParameters = new NBTTag[] { versionIdTag, versionNameTag, isSnapshotTag, NBTTag.END_TAG };
NBTTag version = new NBTTag(NBTTag.Type.TAG_Compound, "Version", versionParameters);

/**
* Generator options:
*/

NBTTag structureTag = new NBTTag(NBTTag.Type.TAG_Compound, "structures", new NBTTag[] { NBTTag.END_TAG });
NBTTag biomeTag = new NBTTag(NBTTag.Type.TAG_String, "biome", "minecraft:plains");

NBTTag layers = new NBTTag("layers", NBTTag.Type.TAG_List);
layers.addTag(HELPER.getLayerTagByBlockAndHeight("minecraft:bedrock", (byte) 1));
layers.addTag(HELPER.getLayerTagByBlockAndHeight("minecraft:dirt", (byte) (world.GROUNDLEVEL - 1)));
layers.addTag(HELPER.getLayerTagByBlockAndHeight("minecraft:grass_block", (byte) 1));

NBTTag generatorOptionsTag = new NBTTag(NBTTag.Type.TAG_Compound, "generatorOptions", new NBTTag[] { structureTag, biomeTag, layers, NBTTag.END_TAG });

NBTTag[] tagList = new NBTTag[] { versionTag, dataVersionTag,difficultyTag, difficultyLockedTag, borderCenterXTag, initializedTag, clearWeatherTimeTag, borderDamagePerBlockTag, borderSizeLerpTimeTag,
borderCenterZTag, borderWarningBlocksTag, borderSizeLerpTargetTag, borderWarningTimeTag, borderSafeZoneTag, borderSizeTag, levelNameTag, generatorNameTag, generatorVersionTag,
generatorOptionsTag, randomSeedTag, mapFeaturesTag, lastPlayedTag, sizeOnDiskTag, allowCommandsTag, hardcoreTag, gameTypeTag, timeTag, dayTimeTag, spawnXTag, spawnYTag, spawnZTag, rainingTag,
rainTimeTag, thunderingTag, thunderTimeTag, gameRulesTag, version, NBTTag.END_TAG };

NBTTag dataTag = new NBTTag(NBTTag.Type.TAG_Compound, "Data", tagList);
return new NBTTag(NBTTag.Type.TAG_Compound, "", new NBTTag[] { dataTag, NBTTag.END_TAG });
}

public void writeToFile() {
try {
tag.writeTo(levelFile.getLevelDataOutputStream());
Expand All @@ -77,5 +149,5 @@ public void writeToFile() {
e.printStackTrace();
}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@
import java.io.DataOutputStream;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

import codemetropolis.blockmodifier.ext.RegionFile;
import codemetropolis.blockmodifier.ext.NBTTag;
Expand Down Expand Up @@ -56,11 +58,13 @@ public static Region loadFromFile(int x, int z, World world) {

public void writeToFile() {
try {
connectNeighbouringFecnes();
for(int i = 0; i < 1024; i++) {
Chunk c = chunks[i];
if(c != null) {
DataOutputStream outputStream = regionFile.getChunkDataOutputStream(i % 32, i / 32);
c.calculateLighting();
//c.filterMagicalBlocks();
c.toNBT().writeTo(outputStream);
}
}
Expand All @@ -70,6 +74,62 @@ public void writeToFile() {
}
}

public void connectNeighbouringFecnes() {
for(int x=0; x<512; x++) {
for(int y=0; y<256; y++) {
for(int z=0; z<512; z++) {
String blockId = getBlockIdAt(x, y, z);

if( blockId.equals("minecraft:oak_fence") ) {
Map<String, String> fenceProperties = new HashMap<>();

if( z > 0 && getBlockIdAt(x, y, z-1).equals("minecraft:oak_fence") ) {
fenceProperties.put("north", "true");
}
if( x > 0 && getBlockIdAt(x-1, y, z).equals("minecraft:oak_fence") ) {
fenceProperties.put("west", "true");
}
if( z < 512-1 && getBlockIdAt(x, y, z+1).equals("minecraft:oak_fence") ) {
fenceProperties.put("south", "true");
}
if( x < 512-1 && getBlockIdAt(x+1, y, z).equals("minecraft:oak_fence") ) {
fenceProperties.put("east", "true");
}

if( !fenceProperties.isEmpty() ) {
setBlockAt(x, y, z, "minecraft:oak_fence", fenceProperties);
}
}
}
}
}
}

public String getBlockIdAt(int x, int y, int z) {
int chunkX = x >> 4;
int chunkZ = z >> 4;
int chunkIndex = chunkZ * 32 + chunkX;
Chunk chunk = chunks[chunkIndex];

if( chunk == null ) {
return "";
}

int blockX = x & 0xF;
int blockZ = z & 0xF;
return chunk.getBlockId(blockX, y, blockZ);
}

public void setBlockAt(int x, int y, int z, String blockId, Map<String, String> blockProperties) {
int chunkX = x >> 4;
int chunkZ = z >> 4;
int chunkIndex = chunkZ * 32 + chunkX;
Chunk chunk = chunks[chunkIndex];
int blockX = x & 0xF;
int blockZ = z & 0xF;
chunk.setBlock(blockX, y, blockZ, blockId, blockProperties);
}

@Override
public String toString() {
StringBuilder sb = new StringBuilder();
Expand Down
Loading