CFI tweaks

This commit is contained in:
Jesse Boyd 2017-05-05 04:08:24 +10:00
parent 7586e87644
commit e2b9d1982c
No known key found for this signature in database
GPG Key ID: 59F1DE6293AF6E1F
3 changed files with 83 additions and 12 deletions

View File

@ -161,9 +161,61 @@ public class HeightMapMCAGenerator extends MCAWriter implements Extent {
} else {
schematic.paste(this, worldData, mutable, false, transform);
}
x += distance;
index += distance;
continue;
if (x + distance < getWidth()) {
x += distance;
index += distance;
} else {
break;
}
}
}
}
public void addSchems(Mask mask, WorldData worldData, ClipboardHolder[] clipboards, int rarity, int distance, boolean randomRotate) throws WorldEditException{
int scaledRarity = (256 * rarity) / 100;
int index = 0;
AffineTransform identity = new AffineTransform();
LocalBlockVector2DSet placed = new LocalBlockVector2DSet();
for (int z = 0; z < getLength(); z++) {
mutable.mutZ(z);
for (int x = 0; x < getWidth(); x++, index++){
int y = heights[index];
if (PseudoRandom.random.nextInt(256) > scaledRarity) {
continue;
}
mutable.mutX(x);
mutable.mutY(y);
if (!mask.test(mutable)) {
continue;
}
if (placed.containsRadius(x, z, distance)) {
continue;
}
mutable.mutY(y + 1);
placed.add(x, z);
ClipboardHolder holder = clipboards[PseudoRandom.random.random(clipboards.length)];
if (randomRotate) {
int rotate = PseudoRandom.random.random(4) * 90;
if (rotate != 0) {
holder.setTransform(new AffineTransform().rotateY(PseudoRandom.random.random(4) * 90));
} else {
holder.setTransform(identity);
}
}
Clipboard clipboard = holder.getClipboard();
Schematic schematic = new Schematic(clipboard);
Transform transform = holder.getTransform();
if (transform.isIdentity()) {
schematic.paste(this, mutable, false);
} else {
schematic.paste(this, worldData, mutable, false, transform);
}
if (x + distance < getWidth()) {
x += distance;
index += distance;
} else {
break;
}
}
}
}
@ -695,13 +747,14 @@ public class HeightMapMCAGenerator extends MCAWriter implements Extent {
Arrays.fill(chunk.data[i], (byte) 0);
}
}
int index = 0;
int index;
int maxY = 0;
int minY = Integer.MAX_VALUE;
int[] heightMap = chunk.getHeightMapArray();
int globalIndex;
for (int z = csz; z <= cez; z++) {
globalIndex = z * getWidth() + csx;
index = (z & 15) << 4;
for (int x = csx; x <= cex; x++, index++, globalIndex++) {
indexes[index] = globalIndex;
chunk.biomes[index] = biomes[globalIndex];
@ -727,10 +780,10 @@ public class HeightMapMCAGenerator extends MCAWriter implements Extent {
}
if (modifiedMain) { // If the main block is modified, we can't short circuit this
for (int layer = 0; layer < fillLayers; layer++) {
index = 0;
byte[] layerIds = chunk.ids[layer];
byte[] layerDatas = chunk.data[layer];
for (int z = csz; z <= cez; z++) {
index = (z & 15) << 4;
for (int x = csx; x <= cex; x++, index++) {
globalIndex = indexes[index];
char mainCombined = main[globalIndex];
@ -778,10 +831,10 @@ public class HeightMapMCAGenerator extends MCAWriter implements Extent {
Arrays.fill(chunk.skyLight[layer], (byte) 255);
byte[] layerIds = chunk.ids[layer];
byte[] layerDatas = chunk.data[layer];
index = 0;
int startY = layer << 4;
int endY = startY + 15;
for (int z = csz; z <= cez; z++) {
index = (z & 15) << 4;
for (int x = csx; x <= cex; x++, index++) {
globalIndex = indexes[index];
int height = heightMap[index];
@ -841,10 +894,10 @@ public class HeightMapMCAGenerator extends MCAWriter implements Extent {
chunk.ids[layer] = null;
chunk.data[layer] = null;
}
index = 0;
{ // Bedrock
byte[] layerIds = chunk.ids[0];
for (int z = csz; z <= cez; z++) {
index = (z & 15) << 4;
for (int x = csx; x <= cex; x++) {
layerIds[index++] = (byte) 7;
}

View File

@ -78,7 +78,7 @@ public class LocalBlockVector2DSet implements Set<Vector2D> {
for (int cx = bcx; cx <= tcx; cx++) {
int index = MathMan.pairSearchCoords(cx << 4, cy << 4) - 1;
int endIndex = index + 256;
while ((index = set.nextSetBit(index + 1)) <= endIndex && index != -1) {
while ((index = set.nextSetBit(index + 1)) != -1 && index <= endIndex) {
// if (index == centerIndex) continue;
int curx = MathMan.unpairSearchCoordsX(index);
int cury = MathMan.unpairSearchCoordsY(index);

View File

@ -1,6 +1,7 @@
package com.boydti.fawe.regions.general.plot;
import com.boydti.fawe.Fawe;
import com.boydti.fawe.FaweCache;
import com.boydti.fawe.config.BBC;
import com.boydti.fawe.jnbt.anvil.HeightMapMCAGenerator;
import com.boydti.fawe.object.FawePlayer;
@ -27,11 +28,13 @@ import com.intellectualcrafters.plot.object.worlds.SinglePlotAreaManager;
import com.intellectualcrafters.plot.util.MainUtil;
import com.plotsquared.general.commands.Command;
import com.plotsquared.general.commands.CommandDeclaration;
import com.sk89q.worldedit.Vector;
import com.sk89q.worldedit.Vector2D;
import com.sk89q.worldedit.WorldEdit;
import com.sk89q.worldedit.blocks.BaseBlock;
import com.sk89q.worldedit.extension.input.InputParseException;
import com.sk89q.worldedit.extension.input.ParserContext;
import com.sk89q.worldedit.extent.clipboard.Clipboard;
import com.sk89q.worldedit.extent.clipboard.io.ClipboardFormat;
import com.sk89q.worldedit.function.mask.Mask;
import com.sk89q.worldedit.function.pattern.Pattern;
@ -46,6 +49,7 @@ import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import javax.imageio.ImageIO;
@ -153,7 +157,7 @@ public class CreateFromImage extends Command {
fp.sendMessage(BBC.getPrefix() + "/2 cfi blockBiomeColor <image-url>");
fp.sendMessage(BBC.getPrefix() + "/2 cfi paletteComplexity <min=0> <max=100>");
fp.sendMessage(BBC.getPrefix() + "/2 cfi paletteRandomization <true|false>");
fp.sendMessage(BBC.getPrefix() + "/2 cfi paletteBlocks <block-list>");
fp.sendMessage(BBC.getPrefix() + "/2 cfi paletteBlocks <block-list|#clipboard>");
fp.sendMessage(BBC.getPrefix() + "/2 cfi paletteBiomePriority <percent=50>");
fp.sendMessage(BBC.getPrefix() + "/2 cfi done");
fp.sendMessage(BBC.getPrefix() + "/2 cfi cancel");
@ -210,7 +214,7 @@ public class CreateFromImage extends Command {
int distance = Integer.parseInt(argList.get(4 + argOffset));
boolean rotate = Boolean.parseBoolean(argList.get(5 + argOffset));
if (img == null) {
generator.addSchems(mask, wd, clipboards, rarity, rotate);
generator.addSchems(mask, wd, clipboards, rarity, distance, rotate);
} else {
generator.addSchems(img, mask, wd, clipboards, rarity, distance, rotate);
}
@ -251,11 +255,25 @@ public class CreateFromImage extends Command {
// roughness
// blocks
if (argList.size() != 2) {
C.COMMAND_SYNTAX.send(player, "/2 cfi " + argList.get(0) + " <pattern>");
C.COMMAND_SYNTAX.send(player, "/2 cfi " + argList.get(0) + " <pattern|#clipboard>");
return;
}
context.setPreferringWildcard(true);
Set<BaseBlock> blocks = we.getBlockFactory().parseFromListInput(argList.get(1), context);
Set<BaseBlock> blocks;
if (argList.get(1).equalsIgnoreCase("#clipboard")) {
ClipboardHolder holder = fp.getSession().getClipboard();
Clipboard clipboard = holder.getClipboard();
boolean[] ids = new boolean[Character.MAX_VALUE + 1];
for (Vector pt : clipboard.getRegion()) {
ids[clipboard.getBlock(pt).getCombined()] = true;
}
blocks = new HashSet<>();
for (int combined = 0; combined < ids.length; combined++) {
if (ids[combined]) blocks.add(FaweCache.CACHE_BLOCK[combined]);
}
} else {
blocks = we.getBlockFactory().parseFromListInput(argList.get(1), context);
}
generator.setTextureUtil(new FilteredTextureUtil(Fawe.get().getTextureUtil(), blocks));
player.sendMessage("Set color palette blocks, what's next?");
return;