Compare commits

..

1 Commits

Author SHA1 Message Date
ac5cb8d445 fix: allow all characters in plot-title flag 2022-10-08 21:55:35 +02:00
5 changed files with 50 additions and 101 deletions

View File

@ -174,9 +174,8 @@ public class HybridPlotManager extends ClassicPlotManager {
for (int y = 0; y < blocks.length; y++) { for (int y = 0; y < blocks.length; y++) {
if (blocks[y] != null) { if (blocks[y] != null) {
queue.setBlock(x, minY + y, z, blocks[y]); queue.setBlock(x, minY + y, z, blocks[y]);
} else if (!isRoad) { } else {
// This is necessary, otherwise any blocks not specified in the schematic will remain after a clear // This is necessary, otherwise any blocks not specified in the schematic will remain after a clear
// Do not set air for road as this may cause cavernous roads when debugroadregen is used
queue.setBlock(x, minY + y, z, airBlock); queue.setBlock(x, minY + y, z, airBlock);
} }
} }

View File

@ -21,6 +21,7 @@ package com.plotsquared.core.generator;
import com.google.inject.Inject; import com.google.inject.Inject;
import com.google.inject.assistedinject.Assisted; import com.google.inject.assistedinject.Assisted;
import com.intellectualsites.annotations.DoNotUse; import com.intellectualsites.annotations.DoNotUse;
import com.intellectualsites.annotations.NotPublic;
import com.plotsquared.core.PlotSquared; import com.plotsquared.core.PlotSquared;
import com.plotsquared.core.configuration.ConfigurationSection; import com.plotsquared.core.configuration.ConfigurationSection;
import com.plotsquared.core.configuration.Settings; import com.plotsquared.core.configuration.Settings;
@ -74,9 +75,6 @@ public class HybridPlotWorld extends ClassicPlotWorld {
public short PATH_WIDTH_UPPER; public short PATH_WIDTH_UPPER;
public HashMap<Integer, BaseBlock[]> G_SCH; public HashMap<Integer, BaseBlock[]> G_SCH;
public HashMap<Integer, BiomeType> G_SCH_B; public HashMap<Integer, BiomeType> G_SCH_B;
/**
* The Y level at which schematic generation will start, lowest of either road or plot schematic generation.
*/
public int SCHEM_Y; public int SCHEM_Y;
private Location SIGN_LOCATION; private Location SIGN_LOCATION;
private File root = null; private File root = null;
@ -269,64 +267,34 @@ public class HybridPlotWorld extends ClassicPlotWorld {
int oddshift = (this.ROAD_WIDTH & 1); int oddshift = (this.ROAD_WIDTH & 1);
SCHEM_Y = schematicStartHeight(); SCHEM_Y = schematicStartHeight();
// plotY and roadY are important to allow plot and/or road schematic "overflow" into each other without causing AIOOB
// exceptions when attempting either to set blocks to, or get block from G_SCH
// Default plot schematic start height, normalized to the minimum height schematics are pasted from.
int plotY = PLOT_HEIGHT - SCHEM_Y; int plotY = PLOT_HEIGHT - SCHEM_Y;
int minRoadWall = Settings.Schematics.USE_WALL_IN_ROAD_SCHEM_HEIGHT ? Math.min(ROAD_HEIGHT, WALL_HEIGHT) : ROAD_HEIGHT; int minRoadWall = Settings.Schematics.USE_WALL_IN_ROAD_SCHEM_HEIGHT ? Math.min(ROAD_HEIGHT, WALL_HEIGHT) : ROAD_HEIGHT;
// Default road schematic start height, normalized to the minimum height schematics are pasted from.
int roadY = minRoadWall - SCHEM_Y; int roadY = minRoadWall - SCHEM_Y;
int worldGenHeight = getMaxGenHeight() - getMinGenHeight() + 1; int worldHeight = getMaxGenHeight() - getMinGenHeight() + 1;
int maxSchematicHeight = 0;
int plotSchemHeight = 0;
// SCHEM_Y should be normalised to the plot "start" height // SCHEM_Y should be normalised to the plot "start" height
if (schematic3 != null) { if (schematic3 != null) {
plotSchemHeight = maxSchematicHeight = schematic3.getClipboard().getDimensions().getY(); if (schematic3.getClipboard().getDimensions().getY() == worldHeight) {
if (maxSchematicHeight == worldGenHeight) { SCHEM_Y = plotY = 0;
SCHEM_Y = getMinGenHeight();
plotY = 0;
} else if (!Settings.Schematics.PASTE_ON_TOP) { } else if (!Settings.Schematics.PASTE_ON_TOP) {
SCHEM_Y = getMinBuildHeight(); SCHEM_Y = plotY = getMinBuildHeight() - getMinGenHeight();
plotY = 0;
} }
} }
int roadSchemHeight;
if (schematic1 != null) { if (schematic1 != null) {
roadSchemHeight = schematic1.getClipboard().getDimensions().getY(); if (schematic1.getClipboard().getDimensions().getY() == worldHeight) {
maxSchematicHeight = Math.max(roadSchemHeight, maxSchematicHeight); SCHEM_Y = roadY = getMinGenHeight();
if (maxSchematicHeight == worldGenHeight) { if (schematic3 != null && schematic3.getClipboard().getDimensions().getY() != worldHeight
SCHEM_Y = getMinGenHeight(); && !Settings.Schematics.PASTE_ON_TOP) {
roadY = 0; // Road is the lowest schematic plotY = PLOT_HEIGHT;
if (schematic3 != null && schematic3.getClipboard().getDimensions().getY() != worldGenHeight) {
// Road is the lowest schematic. Normalize plotY to it.
if (Settings.Schematics.PASTE_ON_TOP) {
plotY = PLOT_HEIGHT - getMinGenHeight();
} else {
plotY = getMinBuildHeight() - getMinGenHeight();
}
} }
} else if (!Settings.Schematics.PASTE_ROAD_ON_TOP) { } else if (!Settings.Schematics.PASTE_ROAD_ON_TOP) {
if (SCHEM_Y == getMinGenHeight()) { // Only possible if plot schematic is enabled SCHEM_Y = roadY = getMinBuildHeight();
// Plot is still the lowest schematic, normalize roadY to it if (schematic3 != null && schematic3.getClipboard().getDimensions().getY() != worldHeight
roadY = getMinBuildHeight() - getMinGenHeight(); && !Settings.Schematics.PASTE_ON_TOP) {
} else if (schematic3 != null) { plotY = PLOT_HEIGHT;
SCHEM_Y = getMinBuildHeight();
roadY = 0;// Road is the lowest schematic
if (Settings.Schematics.PASTE_ON_TOP) {
// Road is the lowest schematic. Normalize plotY to it.
plotY = PLOT_HEIGHT - getMinBuildHeight();
}
maxSchematicHeight = Math.max(maxSchematicHeight, plotY + plotSchemHeight);
} }
} else {
roadY = minRoadWall - SCHEM_Y;
maxSchematicHeight = Math.max(maxSchematicHeight, roadY + roadSchemHeight);
} }
} }
@ -363,15 +331,17 @@ public class HybridPlotWorld extends ClassicPlotWorld {
y + min.getBlockY(), y + min.getBlockY(),
z + min.getBlockZ() z + min.getBlockZ()
)); ));
schem3PopulationNeeded |= id.hasNbtData(); if (!id.getBlockType().getMaterial().isAir()) {
addOverlayBlock( schem3PopulationNeeded |= id.hasNbtData();
(short) (x + shift + oddshift + centerShiftX), addOverlayBlock(
(short) (y + plotY), (short) (x + shift + oddshift + centerShiftX),
(short) (z + shift + oddshift + centerShiftZ), (short) (y + plotY),
id, (short) (z + shift + oddshift + centerShiftZ),
false, id,
maxSchematicHeight false,
); h3
);
}
} }
if (blockArrayClipboard3.hasBiomes()) { if (blockArrayClipboard3.hasBiomes()) {
BiomeType biome = blockArrayClipboard3.getBiome(BlockVector2.at( BiomeType biome = blockArrayClipboard3.getBiome(BlockVector2.at(
@ -421,23 +391,18 @@ public class HybridPlotWorld extends ClassicPlotWorld {
y + min.getBlockY(), y + min.getBlockY(),
z + min.getBlockZ() z + min.getBlockZ()
)); ));
schem1PopulationNeeded |= id.hasNbtData(); if (!id.getBlockType().getMaterial().isAir()) {
addOverlayBlock( schem1PopulationNeeded |= id.hasNbtData();
(short) (x - shift), addOverlayBlock((short) (x - shift), (short) (y + roadY), (short) (z + shift + oddshift), id, false, h1);
(short) (y + roadY), addOverlayBlock(
(short) (z + shift + oddshift), (short) (z + shift + oddshift),
id, (short) (y + roadY),
false, (short) (shift - x + (oddshift - 1)),
maxSchematicHeight id,
); true,
addOverlayBlock( h1
(short) (z + shift + oddshift), );
(short) (y + roadY), }
(short) (shift - x + (oddshift - 1)),
id,
true,
maxSchematicHeight
);
} }
if (blockArrayClipboard1.hasBiomes()) { if (blockArrayClipboard1.hasBiomes()) {
BiomeType biome = blockArrayClipboard1.getBiome(BlockVector2.at(x + min.getBlockX(), z + min.getBlockZ())); BiomeType biome = blockArrayClipboard1.getBiome(BlockVector2.at(x + min.getBlockX(), z + min.getBlockZ()));
@ -465,15 +430,10 @@ public class HybridPlotWorld extends ClassicPlotWorld {
y + min.getBlockY(), y + min.getBlockY(),
z + min.getBlockZ() z + min.getBlockZ()
)); ));
schem2PopulationNeeded |= id.hasNbtData(); if (!id.getBlockType().getMaterial().isAir()) {
addOverlayBlock( schem2PopulationNeeded |= id.hasNbtData();
(short) (x - shift), addOverlayBlock((short) (x - shift), (short) (y + roadY), (short) (z - shift), id, false, h2);
(short) (y + roadY), }
(short) (z - shift),
id,
false,
maxSchematicHeight
);
} }
if (blockArrayClipboard2.hasBiomes()) { if (blockArrayClipboard2.hasBiomes()) {
BiomeType biome = blockArrayClipboard2.getBiome(BlockVector2.at(x + min.getBlockX(), z + min.getBlockZ())); BiomeType biome = blockArrayClipboard2.getBiome(BlockVector2.at(x + min.getBlockX(), z + min.getBlockZ()));
@ -483,10 +443,6 @@ public class HybridPlotWorld extends ClassicPlotWorld {
} }
} }
/**
* @deprecated This method should not be available for public API usage and will be made private.
*/
@Deprecated(forRemoval = true, since = "TODO")
public void addOverlayBlock(short x, short y, short z, BaseBlock id, boolean rotate, int height) { public void addOverlayBlock(short x, short y, short z, BaseBlock id, boolean rotate, int height) {
if (z < 0) { if (z < 0) {
z += this.SIZE; z += this.SIZE;
@ -506,22 +462,13 @@ public class HybridPlotWorld extends ClassicPlotWorld {
if (y >= height) { if (y >= height) {
if (y > lastOverlayHeightError) { if (y > lastOverlayHeightError) {
lastOverlayHeightError = y; lastOverlayHeightError = y;
LOGGER.error( LOGGER.error(String.format("Error adding overlay block. `y > height`. y=%s, height=%s", y, height));
"Error adding overlay block in world {}. `y > height`. y={}, height={}",
getWorldName(),
y,
height
);
} }
return; return;
} }
existing[y] = id; existing[y] = id;
} }
/**
* @deprecated This method should not be available for public API usage and will be made private.
*/
@Deprecated(forRemoval = true, since = "TODO")
public void addOverlayBiome(short x, short z, BiomeType id) { public void addOverlayBiome(short x, short z, BiomeType id) {
if (z < 0) { if (z < 0) {
z += this.SIZE; z += this.SIZE;

View File

@ -36,7 +36,8 @@ import java.util.regex.Pattern;
public class StringMan { public class StringMan {
private static final Pattern STRING_SPLIT_PATTERN = Pattern.compile("(?<quoted>\"[\\w ]+\")|(?<single>\\w+)"); // Stolen from https://stackoverflow.com/a/366532/12620913 | Debug: https://regex101.com/r/DudJLb/1
private static final Pattern STRING_SPLIT_PATTERN = Pattern.compile("[^\\s\"]+|\"([^\"]*)\"");
public static String replaceFromMap(String string, Map<String, String> replacements) { public static String replaceFromMap(String string, Map<String, String> replacements) {
StringBuilder sb = new StringBuilder(string); StringBuilder sb = new StringBuilder(string);
@ -355,7 +356,7 @@ public class StringMan {
var matcher = StringMan.STRING_SPLIT_PATTERN.matcher(message); var matcher = StringMan.STRING_SPLIT_PATTERN.matcher(message);
List<String> splitMessages = new ArrayList<>(); List<String> splitMessages = new ArrayList<>();
while (matcher.find()) { while (matcher.find()) {
splitMessages.add(matcher.group(0).replaceAll("\"", "")); splitMessages.add(matcher.group(matcher.groupCount() - 1).replaceAll("\"", ""));
} }
return splitMessages; return splitMessages;
} }

View File

@ -101,7 +101,7 @@ public class FlagTest {
public void shouldSuccessfullyParseTitleFlagWithTitleEmptyAndSubTitleSingleWord() { public void shouldSuccessfullyParseTitleFlagWithTitleEmptyAndSubTitleSingleWord() {
Assertions.assertDoesNotThrow(() -> { Assertions.assertDoesNotThrow(() -> {
var title = PlotTitleFlag.TITLE_FLAG_DEFAULT.parse("\"\" \"single\"").getValue(); var title = PlotTitleFlag.TITLE_FLAG_DEFAULT.parse("\"\" \"single\"").getValue();
Assertions.assertEquals(" ", title.title()); Assertions.assertEquals("", title.title());
Assertions.assertEquals("single", title.subtitle()); Assertions.assertEquals("single", title.subtitle());
}, "Should not throw a FlagParseException"); }, "Should not throw a FlagParseException");
} }

View File

@ -32,7 +32,9 @@ public class StringManTest {
new Message("title", List.of("title")), new Message("title", List.of("title")),
new Message("title \"sub title\"", List.of("title", "sub title")), new Message("title \"sub title\"", List.of("title", "sub title")),
new Message("\"a title\" subtitle", List.of("a title", "subtitle")), new Message("\"a title\" subtitle", List.of("a title", "subtitle")),
new Message("\"title\" \"subtitle\"", List.of("title", "subtitle")) new Message("\"title\" \"subtitle\"", List.of("title", "subtitle")),
new Message("\"How <bold>bold</bold> of you\" \"to assume I like <rainbow>rainbows</rainbow>\"",
List.of("How <bold>bold</bold> of you", "to assume I like <rainbow>rainbows</rainbow>"))
); );
for (Message message : messages) { for (Message message : messages) {