geforkt von Mirrors/FastAsyncWorldEdit
Changed /forestgen to use Notch's tree generation code and made /pinegen to use the old generator. Both commands now support a density argument.
Dieser Commit ist enthalten in:
Ursprung
57906fba32
Commit
b609114a8a
@ -1275,67 +1275,6 @@ public class EditSession {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Makes a terrible looking pine tree.
|
|
||||||
*
|
|
||||||
* @param basePos
|
|
||||||
*/
|
|
||||||
private void makePineTree(Vector basePos)
|
|
||||||
throws MaxChangedBlocksException {
|
|
||||||
int trunkHeight = (int)Math.floor(Math.random() * 2) + 3;
|
|
||||||
int height = (int)Math.floor(Math.random() * 5) + 8;
|
|
||||||
|
|
||||||
BaseBlock logBlock = new BaseBlock(17);
|
|
||||||
BaseBlock leavesBlock = new BaseBlock(18);
|
|
||||||
|
|
||||||
// Create trunk
|
|
||||||
for (int i = 0; i < trunkHeight; i++) {
|
|
||||||
if (!setBlockIfAir(basePos.add(0, i, 0), logBlock)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Move up
|
|
||||||
basePos = basePos.add(0, trunkHeight, 0);
|
|
||||||
|
|
||||||
int pos2[] = {-2, 2};
|
|
||||||
|
|
||||||
// Create tree + leaves
|
|
||||||
for (int i = 0; i < height; i++) {
|
|
||||||
setBlockIfAir(basePos.add(0, i, 0), logBlock);
|
|
||||||
|
|
||||||
// Less leaves at these levels
|
|
||||||
double chance = ((i == 0 || i == height - 1) ? 0.6 : 1);
|
|
||||||
|
|
||||||
// Inner leaves
|
|
||||||
setChanceBlockIfAir(basePos.add(-1, i, 0), leavesBlock, chance);
|
|
||||||
setChanceBlockIfAir(basePos.add(1, i, 0), leavesBlock, chance);
|
|
||||||
setChanceBlockIfAir(basePos.add(0, i, -1), leavesBlock, chance);
|
|
||||||
setChanceBlockIfAir(basePos.add(0, i, 1), leavesBlock, chance);
|
|
||||||
setChanceBlockIfAir(basePos.add(1, i, 1), leavesBlock, chance);
|
|
||||||
setChanceBlockIfAir(basePos.add(-1, i, 1), leavesBlock, chance);
|
|
||||||
setChanceBlockIfAir(basePos.add(1, i, -1), leavesBlock, chance);
|
|
||||||
setChanceBlockIfAir(basePos.add(-1, i, -1), leavesBlock, chance);
|
|
||||||
|
|
||||||
if (!(i == 0 || i == height - 1)) {
|
|
||||||
for (int j = -2; j <= 2; j++) {
|
|
||||||
setChanceBlockIfAir(basePos.add(-2, i, j), leavesBlock, 0.6);
|
|
||||||
}
|
|
||||||
for (int j = -2; j <= 2; j++) {
|
|
||||||
setChanceBlockIfAir(basePos.add(2, i, j), leavesBlock, 0.6);
|
|
||||||
}
|
|
||||||
for (int j = -2; j <= 2; j++) {
|
|
||||||
setChanceBlockIfAir(basePos.add(j, i, -2), leavesBlock, 0.6);
|
|
||||||
}
|
|
||||||
for (int j = -2; j <= 2; j++) {
|
|
||||||
setChanceBlockIfAir(basePos.add(j, i, 2), leavesBlock, 0.6);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
setBlockIfAir(basePos.add(0, height, 0), leavesBlock);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Makes a pumpkin patch.
|
* Makes a pumpkin patch.
|
||||||
*
|
*
|
||||||
@ -1436,14 +1375,16 @@ public class EditSession {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Makes a terrible looking pine forest.
|
* Makes a forest.
|
||||||
*
|
*
|
||||||
* @param basePos
|
* @param basePos
|
||||||
* @param size
|
* @param size
|
||||||
|
* @param density
|
||||||
|
* @param pineTree
|
||||||
* @return number of trees created
|
* @return number of trees created
|
||||||
*/
|
*/
|
||||||
public int makePineTreeForest(Vector basePos, int size)
|
public int makeForest(Vector basePos, int size, double density,
|
||||||
throws MaxChangedBlocksException {
|
boolean pineTree) throws MaxChangedBlocksException {
|
||||||
int affected = 0;
|
int affected = 0;
|
||||||
|
|
||||||
for (int x = basePos.getBlockX() - size; x <= basePos.getBlockX() + size; x++) {
|
for (int x = basePos.getBlockX() - size; x <= basePos.getBlockX() + size; x++) {
|
||||||
@ -1452,13 +1393,17 @@ public class EditSession {
|
|||||||
if (!getBlock(new Vector(x, basePos.getBlockY(), z)).isAir())
|
if (!getBlock(new Vector(x, basePos.getBlockY(), z)).isAir())
|
||||||
continue;
|
continue;
|
||||||
// The gods don't want a tree here
|
// The gods don't want a tree here
|
||||||
if (Math.random() < 0.95) { continue; }
|
if (Math.random() >= density) { continue; } // def 0.05
|
||||||
|
|
||||||
for (int y = basePos.getBlockY(); y >= basePos.getBlockY() - 10; y--) {
|
for (int y = basePos.getBlockY(); y >= basePos.getBlockY() - 10; y--) {
|
||||||
// Check if we hit the ground
|
// Check if we hit the ground
|
||||||
int t = getBlock(new Vector(x, y, z)).getID();
|
int t = getBlock(new Vector(x, y, z)).getID();
|
||||||
if (t == 2 || t == 3) {
|
if (t == 2 || t == 3) {
|
||||||
|
if (pineTree) {
|
||||||
makePineTree(new Vector(x, y + 1, z));
|
makePineTree(new Vector(x, y + 1, z));
|
||||||
|
} else {
|
||||||
|
ServerInterface.generateTree(this, new Vector(x, y + 1, z));
|
||||||
|
}
|
||||||
affected++;
|
affected++;
|
||||||
break;
|
break;
|
||||||
} else if (t != 0) { // Trees won't grow on this!
|
} else if (t != 0) { // Trees won't grow on this!
|
||||||
@ -1470,4 +1415,65 @@ public class EditSession {
|
|||||||
|
|
||||||
return affected;
|
return affected;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Makes a terrible looking pine tree.
|
||||||
|
*
|
||||||
|
* @param basePos
|
||||||
|
*/
|
||||||
|
private void makePineTree(Vector basePos)
|
||||||
|
throws MaxChangedBlocksException {
|
||||||
|
int trunkHeight = (int)Math.floor(Math.random() * 2) + 3;
|
||||||
|
int height = (int)Math.floor(Math.random() * 5) + 8;
|
||||||
|
|
||||||
|
BaseBlock logBlock = new BaseBlock(17);
|
||||||
|
BaseBlock leavesBlock = new BaseBlock(18);
|
||||||
|
|
||||||
|
// Create trunk
|
||||||
|
for (int i = 0; i < trunkHeight; i++) {
|
||||||
|
if (!setBlockIfAir(basePos.add(0, i, 0), logBlock)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Move up
|
||||||
|
basePos = basePos.add(0, trunkHeight, 0);
|
||||||
|
|
||||||
|
int pos2[] = {-2, 2};
|
||||||
|
|
||||||
|
// Create tree + leaves
|
||||||
|
for (int i = 0; i < height; i++) {
|
||||||
|
setBlockIfAir(basePos.add(0, i, 0), logBlock);
|
||||||
|
|
||||||
|
// Less leaves at these levels
|
||||||
|
double chance = ((i == 0 || i == height - 1) ? 0.6 : 1);
|
||||||
|
|
||||||
|
// Inner leaves
|
||||||
|
setChanceBlockIfAir(basePos.add(-1, i, 0), leavesBlock, chance);
|
||||||
|
setChanceBlockIfAir(basePos.add(1, i, 0), leavesBlock, chance);
|
||||||
|
setChanceBlockIfAir(basePos.add(0, i, -1), leavesBlock, chance);
|
||||||
|
setChanceBlockIfAir(basePos.add(0, i, 1), leavesBlock, chance);
|
||||||
|
setChanceBlockIfAir(basePos.add(1, i, 1), leavesBlock, chance);
|
||||||
|
setChanceBlockIfAir(basePos.add(-1, i, 1), leavesBlock, chance);
|
||||||
|
setChanceBlockIfAir(basePos.add(1, i, -1), leavesBlock, chance);
|
||||||
|
setChanceBlockIfAir(basePos.add(-1, i, -1), leavesBlock, chance);
|
||||||
|
|
||||||
|
if (!(i == 0 || i == height - 1)) {
|
||||||
|
for (int j = -2; j <= 2; j++) {
|
||||||
|
setChanceBlockIfAir(basePos.add(-2, i, j), leavesBlock, 0.6);
|
||||||
|
}
|
||||||
|
for (int j = -2; j <= 2; j++) {
|
||||||
|
setChanceBlockIfAir(basePos.add(2, i, j), leavesBlock, 0.6);
|
||||||
|
}
|
||||||
|
for (int j = -2; j <= 2; j++) {
|
||||||
|
setChanceBlockIfAir(basePos.add(j, i, -2), leavesBlock, 0.6);
|
||||||
|
}
|
||||||
|
for (int j = -2; j <= 2; j++) {
|
||||||
|
setChanceBlockIfAir(basePos.add(j, i, 2), leavesBlock, 0.6);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
setBlockIfAir(basePos.add(0, height, 0), leavesBlock);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
89
src/MinecraftSetBlockProxy.java
Normale Datei
89
src/MinecraftSetBlockProxy.java
Normale Datei
@ -0,0 +1,89 @@
|
|||||||
|
// $Id$
|
||||||
|
/*
|
||||||
|
* WorldEdit
|
||||||
|
* Copyright (C) 2010 sk89q <http://www.sk89q.com>
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU 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 General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import com.sk89q.worldedit.Vector;
|
||||||
|
import com.sk89q.worldedit.MaxChangedBlocksException;
|
||||||
|
import com.sk89q.worldedit.blocks.BaseBlock;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Proxy class to catch calls to set blocks.
|
||||||
|
*
|
||||||
|
* @author sk89q
|
||||||
|
*/
|
||||||
|
public class MinecraftSetBlockProxy extends el {
|
||||||
|
/**
|
||||||
|
* Edit session.
|
||||||
|
*/
|
||||||
|
private EditSession editSession;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor that should NOT be called.
|
||||||
|
*
|
||||||
|
* @param editSession
|
||||||
|
*/
|
||||||
|
public MinecraftSetBlockProxy(EditSession editSession) {
|
||||||
|
super(null, "", (long)0, null);
|
||||||
|
throw new IllegalStateException("MinecraftSetBlockProxy constructor called (BAD)");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Called to set a block.
|
||||||
|
*
|
||||||
|
* @param x
|
||||||
|
* @param y
|
||||||
|
* @param z
|
||||||
|
* @param blockType
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public boolean a(int x, int y, int z, int blockType) {
|
||||||
|
try {
|
||||||
|
return editSession.setBlock(new Vector(x, y, z), new BaseBlock(blockType));
|
||||||
|
} catch (MaxChangedBlocksException ex) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Called to get a block.
|
||||||
|
*
|
||||||
|
* @param x
|
||||||
|
* @param y
|
||||||
|
* @param z
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public int a(int x, int y, int z) {
|
||||||
|
return editSession.getBlock(new Vector(x, y, z)).getID();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public EditSession getEditSession() {
|
||||||
|
return editSession;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param editSession
|
||||||
|
*/
|
||||||
|
public void setEditSession(EditSession editSession) {
|
||||||
|
this.editSession = editSession;
|
||||||
|
}
|
||||||
|
}
|
@ -19,14 +19,32 @@
|
|||||||
|
|
||||||
import com.sk89q.worldedit.*;
|
import com.sk89q.worldedit.*;
|
||||||
import com.sk89q.worldedit.blocks.BaseItem;
|
import com.sk89q.worldedit.blocks.BaseItem;
|
||||||
|
import java.util.logging.Logger;
|
||||||
|
import java.util.logging.Level;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
import java.util.Random;
|
||||||
|
import java.lang.reflect.Constructor;
|
||||||
|
import sun.reflect.ReflectionFactory;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @author sk89q
|
* @author sk89q
|
||||||
*/
|
*/
|
||||||
public class ServerInterface {
|
public class ServerInterface {
|
||||||
|
/**
|
||||||
|
* Logger.
|
||||||
|
*/
|
||||||
|
private static final Logger logger = Logger.getLogger("Minecraft.WorldEdit");
|
||||||
|
/**
|
||||||
|
* Random generator.
|
||||||
|
*/
|
||||||
|
private static Random random = new Random();
|
||||||
|
/**
|
||||||
|
* Proxy for the tree generator.
|
||||||
|
*/
|
||||||
|
private static MinecraftSetBlockProxy proxy;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set block type.
|
* Set block type.
|
||||||
*
|
*
|
||||||
@ -165,4 +183,48 @@ public class ServerInterface {
|
|||||||
chest.update();
|
chest.update();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generate a tree at a location.
|
||||||
|
*
|
||||||
|
* @param pt
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static boolean generateTree(EditSession editSession, Vector pt) {
|
||||||
|
if (proxy == null) {
|
||||||
|
try {
|
||||||
|
proxy = createNoConstructor(MinecraftSetBlockProxy.class);
|
||||||
|
} catch (Throwable t) {
|
||||||
|
logger.log(Level.WARNING, "setBlock() proxy class failed to construct",
|
||||||
|
t);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
proxy.setEditSession(editSession);
|
||||||
|
|
||||||
|
bg treeGen = new gy();
|
||||||
|
return treeGen.a(proxy, random,
|
||||||
|
pt.getBlockX(), pt.getBlockY(), pt.getBlockZ());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Instantiate a class without calling its constructor.
|
||||||
|
*
|
||||||
|
* @param <T>
|
||||||
|
* @param clazz
|
||||||
|
* @return
|
||||||
|
* @throws Throwable
|
||||||
|
*/
|
||||||
|
private static <T> T createNoConstructor(Class<T> clazz) throws Throwable {
|
||||||
|
try {
|
||||||
|
ReflectionFactory factory = ReflectionFactory.getReflectionFactory();
|
||||||
|
Constructor objectConstructor = Object.class.getDeclaredConstructor();
|
||||||
|
Constructor c = factory.newConstructorForSerialization(
|
||||||
|
clazz, objectConstructor
|
||||||
|
);
|
||||||
|
return clazz.cast(c.newInstance());
|
||||||
|
} catch (Throwable e) {
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -159,7 +159,8 @@ public class WorldEditListener extends PluginListener {
|
|||||||
commands.put("/fixwater", "[Radius] - Level nearby pools of water");
|
commands.put("/fixwater", "[Radius] - Level nearby pools of water");
|
||||||
commands.put("/fixlava", "[Radius] - Level nearby pools of lava");
|
commands.put("/fixlava", "[Radius] - Level nearby pools of lava");
|
||||||
commands.put("/ex", "[Size] - Extinguish fires");
|
commands.put("/ex", "[Size] - Extinguish fires");
|
||||||
commands.put("/forestgen", "<Size> - Make an ugly pine tree forest");
|
commands.put("/forestgen", "<Size> <Density> - Make Notch tree forest");
|
||||||
|
commands.put("/pinegen", "<Size> <Density> - Make an ugly pine tree forest");
|
||||||
commands.put("/pumpkins", "<Size> - Make a pumpkin forest");
|
commands.put("/pumpkins", "<Size> - Make a pumpkin forest");
|
||||||
commands.put("/unstuck", "Go up to the first free spot");
|
commands.put("/unstuck", "Go up to the first free spot");
|
||||||
commands.put("/ascend", "Go up one level");
|
commands.put("/ascend", "Go up one level");
|
||||||
@ -892,12 +893,26 @@ public class WorldEditListener extends PluginListener {
|
|||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
// Make pine tree forest
|
// Make tree forest
|
||||||
} else if (split[0].equalsIgnoreCase("/forestgen")) {
|
} else if (split[0].equalsIgnoreCase("/forestgen")) {
|
||||||
|
checkArgs(split, 0, 2, split[0]);
|
||||||
|
int size = split.length > 1 ? Math.max(1, Integer.parseInt(split[1])) : 10;
|
||||||
|
double density = split.length > 2 ? Double.parseDouble(split[2]) / 100 : 0.05;
|
||||||
|
|
||||||
|
int affected = editSession.makeForest(player.getPosition(),
|
||||||
|
size, density, false);
|
||||||
|
player.print(affected + " trees created.");
|
||||||
|
|
||||||
|
return true;
|
||||||
|
|
||||||
|
// Make pine tree forest
|
||||||
|
} else if (split[0].equalsIgnoreCase("/pinegen")) {
|
||||||
checkArgs(split, 0, 1, split[0]);
|
checkArgs(split, 0, 1, split[0]);
|
||||||
int size = split.length > 1 ? Math.max(1, Integer.parseInt(split[1])) : 10;
|
int size = split.length > 1 ? Math.max(1, Integer.parseInt(split[1])) : 10;
|
||||||
|
double density = split.length > 2 ? Double.parseDouble(split[2]) / 100 : 0.05;
|
||||||
|
|
||||||
int affected = editSession.makePineTreeForest(player.getPosition(), size);
|
int affected = editSession.makeForest(player.getPosition(),
|
||||||
|
size, density, true);
|
||||||
player.print(affected + " pine trees created.");
|
player.print(affected + " pine trees created.");
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
Laden…
In neuem Issue referenzieren
Einen Benutzer sperren