From 614d502bb654e8089fa8f53b2fce2283bee8ec42 Mon Sep 17 00:00:00 2001 From: Steven Lawson Date: Thu, 13 Sep 2012 19:30:55 -0400 Subject: [PATCH] Starting v2.6 Updated cleanroom generator. Dont need to define server in some listeners, never use it. --- appinfo.properties | 8 +- build.xml | 2 +- buildnumber.properties | 4 +- nbproject/project.properties | 146 +++++++++--------- .../CleanroomBlockPopulator.java | 55 +++++++ .../CleanroomChunkGenerator.java | 139 ++++++++++++----- .../Listener/TFM_BlockListener.java | 3 - .../Listener/TFM_EntityListener.java | 3 - .../Listener/TFM_WeatherListener.java | 3 - src/plugin.yml | 2 +- 10 files changed, 240 insertions(+), 125 deletions(-) create mode 100644 src/me/StevenLawson/TotalFreedomMod/CleanroomBlockPopulator.java diff --git a/appinfo.properties b/appinfo.properties index 7cccc65..2f4aad7 100644 --- a/appinfo.properties +++ b/appinfo.properties @@ -1,5 +1,5 @@ -#Sat, 28 Jul 2012 15:17:23 -0400 +#Thu, 13 Sep 2012 19:16:42 -0400 -program.VERSION=2.5 -program.BUILDNUM=77 -program.BUILDDATE=07/28/2012 03\:17 PM +program.VERSION=2.6 +program.BUILDNUM=20 +program.BUILDDATE=09/13/2012 07\:16 PM diff --git a/build.xml b/build.xml index eeb8ca0..4187606 100644 --- a/build.xml +++ b/build.xml @@ -74,7 +74,7 @@ - + diff --git a/buildnumber.properties b/buildnumber.properties index bbc1bb6..802663f 100644 --- a/buildnumber.properties +++ b/buildnumber.properties @@ -1,3 +1,3 @@ #Build Number for ANT. Do not edit! -#Sat Jul 28 15:17:23 EDT 2012 -build.number=78 +#Thu Sep 13 19:16:42 EDT 2012 +build.number=21 diff --git a/nbproject/project.properties b/nbproject/project.properties index 97a92c2..7f103b9 100644 --- a/nbproject/project.properties +++ b/nbproject/project.properties @@ -1,73 +1,73 @@ -annotation.processing.enabled=true -annotation.processing.enabled.in.editor=false -annotation.processing.run.all.processors=true -annotation.processing.source.output=${build.generated.sources.dir}/ap-source-output -application.title=TotalFreedomMod -application.vendor=Michael -build.classes.dir=${build.dir}/classes -build.classes.excludes=**/*.java,**/*.form -# This directory is removed when the project is cleaned: -build.dir=build -build.generated.dir=${build.dir}/generated -build.generated.sources.dir=${build.dir}/generated-sources -# Only compile against the classpath explicitly listed here: -build.sysclasspath=ignore -build.test.classes.dir=${build.dir}/test/classes -build.test.results.dir=${build.dir}/test/results -# Uncomment to specify the preferred debugger connection transport: -#debug.transport=dt_socket -debug.classpath=\ - ${run.classpath} -debug.test.classpath=\ - ${run.test.classpath} -# This directory is removed when the project is cleaned: -dist.dir=dist -dist.jar=${dist.dir}/TotalFreedomMod.jar -dist.javadoc.dir=${dist.dir}/javadoc -endorsed.classpath= -excludes= -includes=** -jar.compress=false -javac.classpath=\ - ${libs.Bukkit.classpath} -# Space-separated list of extra javac options -javac.compilerargs=-Xlint:unchecked -Xlint:deprecation -javac.deprecation=false -javac.processorpath=\ - ${javac.classpath} -javac.source=1.6 -javac.target=1.6 -javac.test.classpath=\ - ${javac.classpath}:\ - ${build.classes.dir} -javac.test.processorpath=\ - ${javac.test.classpath} -javadoc.additionalparam= -javadoc.author=false -javadoc.encoding=${source.encoding} -javadoc.noindex=false -javadoc.nonavbar=false -javadoc.notree=false -javadoc.private=false -javadoc.splitindex=true -javadoc.use=true -javadoc.version=false -javadoc.windowtitle= -main.class=totalfreedommod.TotalFreedomMod -manifest.file=manifest.mf -meta.inf.dir=${src.dir}/META-INF -mkdist.disabled=false -platform.active=default_platform -run.classpath=\ - ${javac.classpath}:\ - ${build.classes.dir} -# Space-separated list of JVM arguments used when running the project -# (you may also define separate properties like run-sys-prop.name=value instead of -Dname=value -# or test-sys-prop.name=value to set system properties for unit tests): -run.jvmargs= -run.test.classpath=\ - ${javac.test.classpath}:\ - ${build.test.classes.dir} -source.encoding=UTF-8 -src.dir=src -test.src.dir=test +annotation.processing.enabled=true +annotation.processing.enabled.in.editor=false +annotation.processing.run.all.processors=true +annotation.processing.source.output=${build.generated.sources.dir}/ap-source-output +application.title=TotalFreedomMod +application.vendor=Michael +build.classes.dir=${build.dir}/classes +build.classes.excludes=**/*.java,**/*.form +# This directory is removed when the project is cleaned: +build.dir=build +build.generated.dir=${build.dir}/generated +build.generated.sources.dir=${build.dir}/generated-sources +# Only compile against the classpath explicitly listed here: +build.sysclasspath=ignore +build.test.classes.dir=${build.dir}/test/classes +build.test.results.dir=${build.dir}/test/results +# Uncomment to specify the preferred debugger connection transport: +#debug.transport=dt_socket +debug.classpath=\ + ${run.classpath} +debug.test.classpath=\ + ${run.test.classpath} +# This directory is removed when the project is cleaned: +dist.dir=dist +dist.jar=${dist.dir}/TotalFreedomMod.jar +dist.javadoc.dir=${dist.dir}/javadoc +endorsed.classpath= +excludes= +includes=** +jar.compress=false +javac.classpath=\ + ${libs.CraftBukkit.classpath} +# Space-separated list of extra javac options +javac.compilerargs=-Xlint:unchecked -Xlint:deprecation +javac.deprecation=false +javac.processorpath=\ + ${javac.classpath} +javac.source=1.6 +javac.target=1.6 +javac.test.classpath=\ + ${javac.classpath}:\ + ${build.classes.dir} +javac.test.processorpath=\ + ${javac.test.classpath} +javadoc.additionalparam= +javadoc.author=false +javadoc.encoding=${source.encoding} +javadoc.noindex=false +javadoc.nonavbar=false +javadoc.notree=false +javadoc.private=false +javadoc.splitindex=true +javadoc.use=true +javadoc.version=false +javadoc.windowtitle= +main.class=totalfreedommod.TotalFreedomMod +manifest.file=manifest.mf +meta.inf.dir=${src.dir}/META-INF +mkdist.disabled=false +platform.active=default_platform +run.classpath=\ + ${javac.classpath}:\ + ${build.classes.dir} +# Space-separated list of JVM arguments used when running the project +# (you may also define separate properties like run-sys-prop.name=value instead of -Dname=value +# or test-sys-prop.name=value to set system properties for unit tests): +run.jvmargs= +run.test.classpath=\ + ${javac.test.classpath}:\ + ${build.test.classes.dir} +source.encoding=UTF-8 +src.dir=src +test.src.dir=test diff --git a/src/me/StevenLawson/TotalFreedomMod/CleanroomBlockPopulator.java b/src/me/StevenLawson/TotalFreedomMod/CleanroomBlockPopulator.java new file mode 100644 index 0000000..2214b51 --- /dev/null +++ b/src/me/StevenLawson/TotalFreedomMod/CleanroomBlockPopulator.java @@ -0,0 +1,55 @@ +/* + * Cleanroom Generator + * Copyright (C) 2011-2012 nvx + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package me.StevenLawson.TotalFreedomMod; + +import java.util.Random; +import org.bukkit.Chunk; +import org.bukkit.World; +import org.bukkit.generator.BlockPopulator; + +public class CleanroomBlockPopulator extends BlockPopulator +{ + byte[] layerDataValues; + protected CleanroomBlockPopulator(byte[] layerDataValues) + { + this.layerDataValues = layerDataValues; + } + + public void populate(World world, Random random, Chunk chunk) + { + if (layerDataValues != null) + { + int x = chunk.getX() << 4; + int z = chunk.getZ() << 4; + + for (int y = 0; y < layerDataValues.length ; y++) + { + byte dataValue = layerDataValues[y]; + if (dataValue == 0) continue; + for (int xx = 0; xx < 16; xx++) + { + for (int zz = 0; zz < 16; zz++) + { + world.getBlockAt(x + xx, y, z + zz).setData(dataValue); + } + } + } + } + } +} \ No newline at end of file diff --git a/src/me/StevenLawson/TotalFreedomMod/CleanroomChunkGenerator.java b/src/me/StevenLawson/TotalFreedomMod/CleanroomChunkGenerator.java index 286d35c..faf2d8b 100644 --- a/src/me/StevenLawson/TotalFreedomMod/CleanroomChunkGenerator.java +++ b/src/me/StevenLawson/TotalFreedomMod/CleanroomChunkGenerator.java @@ -1,6 +1,6 @@ /* * Cleanroom Generator - * Copyright (C) 2011 nvx + * Copyright (C) 2011-2012 nvx * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by @@ -18,22 +18,23 @@ package me.StevenLawson.TotalFreedomMod; +import static java.lang.System.arraycopy; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Random; - +import java.util.logging.Logger; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.World; import org.bukkit.generator.BlockPopulator; import org.bukkit.generator.ChunkGenerator; -import static java.lang.System.arraycopy; - public class CleanroomChunkGenerator extends ChunkGenerator { - private byte[] chunk = new byte[32768]; + private Logger log = Logger.getLogger("Minecraft"); + private short[] layer; + private byte[] layerDataValues; public CleanroomChunkGenerator() { @@ -42,19 +43,21 @@ public class CleanroomChunkGenerator extends ChunkGenerator public CleanroomChunkGenerator(String id) { - byte[] layer = new byte[128]; if (id != null) { try { int y = 0; + layer = new short[128]; // Default to 128, will be resized later if required + layerDataValues = null; + if ((id.length() > 0) && (id.charAt(0) == '.')) // Is the first character a '.'? If so, skip bedrock generation. { id = id.substring(1); // Skip bedrock then and remove the . } else // Guess not, bedrock at layer0 it is then. { - layer[y++] = (byte)Material.BEDROCK.getId(); + layer[y++] = (short)Material.BEDROCK.getId(); } if (id.length() > 0) @@ -66,25 +69,33 @@ public class CleanroomChunkGenerator extends ChunkGenerator for (int i = 0; i < tokens.length; i += 2) { int height = Integer.parseInt(tokens[i]); - if ((height <= 0) || (height > 127)) + if (height <= 0) { - System.out.println("Invalid height '" + tokens[i] + "'. Using 64 instead."); + log.warning("[CleanroomGenerator] Invalid height '" + tokens[i] + "'. Using 64 instead."); height = 64; } - if ((height + y) > 127) + String materialTokens[] = tokens[i + 1].split("[:]", 2); + byte dataValue = 0; + if (materialTokens.length == 2) { - System.out.println("Maximum height reached, ignoring additional layers."); - break; + try + { + // Lets try to read the data value + dataValue = Byte.parseByte(materialTokens[1]); + } catch (Exception e) + { + log.warning("[CleanroomGenerator] Invalid Data Value '" + materialTokens[1] + "'. Defaulting to 0."); + dataValue = 0; + } } - - Material mat = Material.matchMaterial(tokens[i + 1]); + Material mat = Material.matchMaterial(materialTokens[0]); if (mat == null) { try { // Mabe it's an integer? - mat = Material.getMaterial(Integer.parseInt(tokens[i + 1])); + mat = Material.getMaterial(Integer.parseInt(materialTokens[0])); } catch (Exception e) { // Well, I guess it wasn't an integer after all... Awkward... @@ -92,51 +103,109 @@ public class CleanroomChunkGenerator extends ChunkGenerator if (mat == null) { - System.out.println("Invalid Block ID '" + tokens[i + 1] + "'. Defaulting to stone."); + log.warning("[CleanroomGenerator] Invalid Block ID '" + materialTokens[0] + "'. Defaulting to stone."); mat = Material.STONE; } } if (!mat.isBlock()) { - System.out.println("Error, '" + tokens[i + 1] + "' is not a block. Defaulting to stone."); + log.warning("[CleanroomGenerator] Error, '" + materialTokens[0] + "' is not a block. Defaulting to stone."); mat = Material.STONE; } - Arrays.fill(layer, y, y + height, (byte)mat.getId()); + if (y + height > layer.length) + { + short[] newLayer = new short[Math.max(y + height, layer.length * 2)]; + arraycopy(layer, 0, newLayer, 0, y); + layer = newLayer; + if (layerDataValues != null) + { + byte[] newLayerDataValues = new byte[Math.max(y + height, layerDataValues.length * 2)]; + arraycopy(layerDataValues, 0, newLayerDataValues, 0, y); + layerDataValues = newLayerDataValues; + } + } + + Arrays.fill(layer, y, y + height, (short)mat.getId()); + if (dataValue != 0) + { + if (layerDataValues == null) + { + layerDataValues = new byte[layer.length]; + } + Arrays.fill(layerDataValues, y, y + height, dataValue); + } y += height; } } - } catch(Exception e) + + // Trim to size + if (layer.length > y) + { + short[] newLayer = new short[y]; + arraycopy(layer, 0, newLayer, 0, y); + layer = newLayer; + } + if (layerDataValues != null && layerDataValues.length > y) + { + byte[] newLayerDataValues = new byte[y]; + arraycopy(layerDataValues, 0, newLayerDataValues, 0, y); + layerDataValues = newLayerDataValues; + } + } catch (Exception e) { - System.out.println("Error parsing CleanroomGenerator ID '" + id + "'. using defaults '64,1': " + e.toString()); + log.severe("[CleanroomGenerator] Error parsing CleanroomGenerator ID '" + id + "'. using defaults '64,1': " + e.toString()); e.printStackTrace(); - layer[0] = (byte)Material.BEDROCK.getId(); - Arrays.fill(layer, 1, 65, (byte)Material.STONE.getId()); - Arrays.fill(layer, 65, 128, (byte)Material.AIR.getId()); // Just in case... + layerDataValues = null; + layer = new short[65]; + layer[0] = (short)Material.BEDROCK.getId(); + Arrays.fill(layer, 1, 65, (short)Material.STONE.getId()); } } else { - layer[0] = (byte)Material.BEDROCK.getId(); - Arrays.fill(layer, 1, 65, (byte)Material.STONE.getId()); - } - - for (int xz = 0; xz < 256; xz++) - { - arraycopy(layer, 0, chunk, xz * 128, layer.length); + layerDataValues = null; + layer = new short[65]; + layer[0] = (short)Material.BEDROCK.getId(); + Arrays.fill(layer, 1, 65, (short)Material.STONE.getId()); } } - public byte[] generate(World world, Random random, int cx, int cz) + @Override + public short[][] generateExtBlockSections(World world, Random random, int x, int z, BiomeGrid biomes) { - return chunk.clone(); // Can't get more efficient than that... + int maxHeight = world.getMaxHeight(); + if (layer.length > maxHeight) + { + log.warning("[CleanroomGenerator] Error, chunk height " + layer.length + " is greater than the world max height (" + maxHeight + "). Trimming to world max height."); + short[] newLayer = new short[maxHeight]; + arraycopy(layer, 0, newLayer, 0, maxHeight); + layer = newLayer; + } + short[][] result = new short[maxHeight / 16][]; // 16x16x16 chunks + for (int i = 0; i < layer.length; i += 16) + { + result[i >> 4] = new short[4096]; + for (int y = 0; y < Math.min(16, layer.length - i); y++) + { + Arrays.fill(result[i >> 4], y * 16 * 16, (y + 1) * 16 * 16, layer[i + y]); + } + } + + return result; } @Override public List getDefaultPopulators(World world) { - // This is the default, but just in case default populators change to stock minecraft populators by default... - return new ArrayList(); + if (layerDataValues != null) + { + return Arrays.asList((BlockPopulator)new CleanroomBlockPopulator(layerDataValues)); + } else + { + // This is the default, but just in case default populators change to stock minecraft populators by default... + return new ArrayList(); + } } @Override @@ -154,4 +223,4 @@ public class CleanroomChunkGenerator extends ChunkGenerator return new Location(world, 0, world.getHighestBlockYAt(0, 0), 0); } -} +} \ No newline at end of file diff --git a/src/me/StevenLawson/TotalFreedomMod/Listener/TFM_BlockListener.java b/src/me/StevenLawson/TotalFreedomMod/Listener/TFM_BlockListener.java index 8594c2f..3290b41 100644 --- a/src/me/StevenLawson/TotalFreedomMod/Listener/TFM_BlockListener.java +++ b/src/me/StevenLawson/TotalFreedomMod/Listener/TFM_BlockListener.java @@ -7,7 +7,6 @@ import me.StevenLawson.TotalFreedomMod.TotalFreedomMod; import org.bukkit.ChatColor; import org.bukkit.Location; import org.bukkit.Material; -import org.bukkit.Server; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; @@ -18,13 +17,11 @@ import org.bukkit.inventory.ItemStack; public class TFM_BlockListener implements Listener { private final TotalFreedomMod plugin; - private final Server server; private static final Logger log = Logger.getLogger("Minecraft"); public TFM_BlockListener(TotalFreedomMod instance) { this.plugin = instance; - this.server = plugin.getServer(); } @EventHandler(priority = EventPriority.HIGH) diff --git a/src/me/StevenLawson/TotalFreedomMod/Listener/TFM_EntityListener.java b/src/me/StevenLawson/TotalFreedomMod/Listener/TFM_EntityListener.java index a957fa5..82b3d19 100644 --- a/src/me/StevenLawson/TotalFreedomMod/Listener/TFM_EntityListener.java +++ b/src/me/StevenLawson/TotalFreedomMod/Listener/TFM_EntityListener.java @@ -1,7 +1,6 @@ package me.StevenLawson.TotalFreedomMod.Listener; import me.StevenLawson.TotalFreedomMod.TotalFreedomMod; -import org.bukkit.Server; import org.bukkit.entity.*; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; @@ -11,12 +10,10 @@ import org.bukkit.event.entity.*; public class TFM_EntityListener implements Listener { private final TotalFreedomMod plugin; - private final Server server; public TFM_EntityListener(TotalFreedomMod instance) { this.plugin = instance; - this.server = plugin.getServer(); } @EventHandler(priority = EventPriority.HIGH) diff --git a/src/me/StevenLawson/TotalFreedomMod/Listener/TFM_WeatherListener.java b/src/me/StevenLawson/TotalFreedomMod/Listener/TFM_WeatherListener.java index d4b6c22..d80fd25 100644 --- a/src/me/StevenLawson/TotalFreedomMod/Listener/TFM_WeatherListener.java +++ b/src/me/StevenLawson/TotalFreedomMod/Listener/TFM_WeatherListener.java @@ -1,7 +1,6 @@ package me.StevenLawson.TotalFreedomMod.Listener; import me.StevenLawson.TotalFreedomMod.TotalFreedomMod; -import org.bukkit.Server; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; @@ -11,12 +10,10 @@ import org.bukkit.event.weather.WeatherChangeEvent; public class TFM_WeatherListener implements Listener { private final TotalFreedomMod plugin; - private final Server server; public TFM_WeatherListener(TotalFreedomMod instance) { this.plugin = instance; - this.server = plugin.getServer(); } @EventHandler(priority = EventPriority.HIGH) diff --git a/src/plugin.yml b/src/plugin.yml index a4e9d25..1c58565 100644 --- a/src/plugin.yml +++ b/src/plugin.yml @@ -1,6 +1,6 @@ name: TotalFreedomMod main: me.StevenLawson.TotalFreedomMod.TotalFreedomMod -version: 2.5 +version: 2.6 description: Plugin for the Total Freedom server. author: StevenLawson / Madgeek1450 commands: