mirror of
https://github.com/IntellectualSites/PlotSquared.git
synced 2025-07-03 06:04:43 +02:00
Compare commits
8 Commits
chore/v7/m
...
fix/v6/leg
Author | SHA1 | Date | |
---|---|---|---|
a188898b85 | |||
62ee60a76c | |||
d5f8a0842b | |||
f7d55ce105 | |||
85911646f3 | |||
8b75dece69 | |||
7d6e515ba8 | |||
13d7357c85 |
@ -513,8 +513,10 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl
|
||||
this.backgroundPipeline.registerService(essentialsUUIDService);
|
||||
}
|
||||
|
||||
final SquirrelIdUUIDService impromptuMojangService = new SquirrelIdUUIDService(Settings.UUID.IMPROMPTU_LIMIT);
|
||||
this.impromptuPipeline.registerService(impromptuMojangService);
|
||||
if (Settings.UUID.IMPROMPTU_SERVICE_MOJANG_API) {
|
||||
final SquirrelIdUUIDService impromptuMojangService = new SquirrelIdUUIDService(Settings.UUID.IMPROMPTU_LIMIT);
|
||||
this.impromptuPipeline.registerService(impromptuMojangService);
|
||||
}
|
||||
final SquirrelIdUUIDService backgroundMojangService = new SquirrelIdUUIDService(Settings.UUID.BACKGROUND_LIMIT);
|
||||
this.backgroundPipeline.registerService(backgroundMojangService);
|
||||
} else {
|
||||
|
@ -80,7 +80,8 @@ final class DelegatePlotGenerator extends IndependentPlotGenerator {
|
||||
result.setBiome(x, z, BukkitAdapter.adapt(biome));
|
||||
}
|
||||
|
||||
//do not annotate with Override until we discontinue support for 1.4.4
|
||||
//do not annotate with Override until we discontinue support for 1.4.4 (we no longer support 1.4.4)
|
||||
@Override
|
||||
public void setBiome(int x, int y, int z, @NonNull Biome biome) {
|
||||
result.setBiome(x, z, BukkitAdapter.adapt(biome));
|
||||
|
||||
|
@ -51,6 +51,7 @@ import com.sk89q.worldedit.world.biome.BiomeType;
|
||||
import com.sk89q.worldedit.world.block.BaseBlock;
|
||||
import com.sk89q.worldedit.world.block.BlockState;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.Chunk;
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.block.Container;
|
||||
import org.bukkit.block.data.BlockData;
|
||||
@ -266,7 +267,13 @@ public class BukkitQueueCoordinator extends BasicQueueCoordinator {
|
||||
} catch (WorldEditException ignored) {
|
||||
// Fallback to not so nice method
|
||||
BlockData blockData = BukkitAdapter.adapt(block);
|
||||
Block existing = getBukkitWorld().getBlockAt(x, y, z);
|
||||
Block existing;
|
||||
// Assume a chunk object has been given only when it should have been.
|
||||
if (getChunkObject() instanceof Chunk chunkObject) {
|
||||
existing = chunkObject.getBlock(x & 15, y, z & 15);
|
||||
} else {
|
||||
existing = getBukkitWorld().getBlockAt(x, y, z);
|
||||
}
|
||||
final BlockState existingBaseBlock = BukkitAdapter.adapt(existing.getBlockData());
|
||||
if (BukkitBlockUtil.get(existing).equals(existingBaseBlock) && existing.getBlockData().matches(blockData)) {
|
||||
return;
|
||||
@ -282,7 +289,7 @@ public class BukkitQueueCoordinator extends BasicQueueCoordinator {
|
||||
CompoundTag tag = block.getNbtData();
|
||||
StateWrapper sw = new StateWrapper(tag);
|
||||
|
||||
sw.restoreTag(getWorld().getName(), existing.getX(), existing.getY(), existing.getZ());
|
||||
sw.restoreTag(existing);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -44,6 +44,7 @@ import org.bukkit.enchantments.Enchantment;
|
||||
import org.bukkit.inventory.Inventory;
|
||||
import org.bukkit.inventory.InventoryHolder;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.checkerframework.checker.nullness.qual.NonNull;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
@ -166,14 +167,32 @@ public class StateWrapper {
|
||||
return str;
|
||||
}
|
||||
|
||||
@SuppressWarnings("deprecation") // #setLine is needed for Spigot compatibility
|
||||
/**
|
||||
* Restore the TileEntity data to the given world at the given coordinates.
|
||||
*
|
||||
* @param worldName World name
|
||||
* @param x x position
|
||||
* @param y y position
|
||||
* @param z z position
|
||||
* @return true if successful
|
||||
*/
|
||||
public boolean restoreTag(String worldName, int x, int y, int z) {
|
||||
if (this.tag == null) {
|
||||
World world = BukkitUtil.getWorld(worldName);
|
||||
if (world == null) {
|
||||
return false;
|
||||
}
|
||||
World world = BukkitUtil.getWorld(worldName);
|
||||
Block block = world.getBlockAt(x, y, z);
|
||||
if (block == null) {
|
||||
return restoreTag(world.getBlockAt(x, y, z));
|
||||
}
|
||||
|
||||
/**
|
||||
* Restore the TileEntity data to the given block
|
||||
*
|
||||
* @param block Block to restore to
|
||||
* @return true if successful
|
||||
*/
|
||||
@SuppressWarnings("deprecation") // #setLine is needed for Spigot compatibility
|
||||
public boolean restoreTag(@NonNull Block block) {
|
||||
if (this.tag == null) {
|
||||
return false;
|
||||
}
|
||||
org.bukkit.block.BlockState state = block.getState();
|
||||
|
@ -889,8 +889,8 @@ public class PlotSquared {
|
||||
e.printStackTrace();
|
||||
}
|
||||
LOGGER.info("| generator: {}>{}", baseGenerator, areaGen);
|
||||
LOGGER.info("| plot world: {}", pa);
|
||||
LOGGER.info("| manager: {}", pa);
|
||||
LOGGER.info("| plot world: {}", pa.getClass().getCanonicalName());
|
||||
LOGGER.info("| manager: {}", pa.getPlotManager().getClass().getCanonicalName());
|
||||
LOGGER.info("Note: Area created for cluster '{}' (invalid or old configuration?)", name);
|
||||
areaGen.getPlotGenerator().initialize(pa);
|
||||
areaGen.augment(pa);
|
||||
@ -906,6 +906,13 @@ public class PlotSquared {
|
||||
throw new IllegalArgumentException("Invalid Generator: " + gen_string);
|
||||
}
|
||||
PlotArea pa = areaGen.getPlotGenerator().getNewPlotArea(world, null, null, null);
|
||||
LOGGER.info("- generator: {}>{}", baseGenerator, areaGen);
|
||||
LOGGER.info("- plot world: {}", pa.getClass().getCanonicalName());
|
||||
LOGGER.info("- plot area manager: {}", pa.getPlotManager().getClass().getCanonicalName());
|
||||
if (!this.worldConfiguration.contains(path)) {
|
||||
this.worldConfiguration.createSection(path);
|
||||
worldSection = this.worldConfiguration.getConfigurationSection(path);
|
||||
}
|
||||
pa.saveConfiguration(worldSection);
|
||||
pa.loadDefaultConfiguration(worldSection);
|
||||
try {
|
||||
@ -913,9 +920,6 @@ public class PlotSquared {
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
LOGGER.info("- generator: {}>{}", baseGenerator, areaGen);
|
||||
LOGGER.info("- plot world: {}", pa);
|
||||
LOGGER.info("- plot area manager: {}", pa.getPlotManager());
|
||||
areaGen.getPlotGenerator().initialize(pa);
|
||||
areaGen.augment(pa);
|
||||
addPlotArea(pa);
|
||||
|
@ -31,6 +31,7 @@ import com.plotsquared.core.configuration.Settings;
|
||||
import com.plotsquared.core.configuration.caption.Caption;
|
||||
import com.plotsquared.core.configuration.caption.CaptionHolder;
|
||||
import com.plotsquared.core.configuration.caption.TranslatableCaption;
|
||||
import com.plotsquared.core.database.DBFunc;
|
||||
import com.plotsquared.core.permissions.Permission;
|
||||
import com.plotsquared.core.player.PlotPlayer;
|
||||
import com.plotsquared.core.plot.Plot;
|
||||
@ -38,6 +39,7 @@ import com.plotsquared.core.plot.PlotArea;
|
||||
import com.plotsquared.core.plot.expiration.ExpireManager;
|
||||
import com.plotsquared.core.plot.flag.implementations.DoneFlag;
|
||||
import com.plotsquared.core.plot.flag.implementations.PriceFlag;
|
||||
import com.plotsquared.core.plot.flag.implementations.ServerPlotFlag;
|
||||
import com.plotsquared.core.plot.world.PlotAreaManager;
|
||||
import com.plotsquared.core.util.EconHandler;
|
||||
import com.plotsquared.core.util.MathMan;
|
||||
@ -426,7 +428,7 @@ public class ListCmd extends SubCommand {
|
||||
Caption color;
|
||||
if (plot.getOwner() == null) {
|
||||
color = TranslatableCaption.of("info.plot_list_no_owner");
|
||||
} else if (plot.isOwner(player.getUUID())) {
|
||||
} else if (plot.isOwner(player.getUUID()) || plot.getOwner().equals(DBFunc.EVERYONE)) {
|
||||
color = TranslatableCaption.of("info.plot_list_owned_by");
|
||||
} else if (plot.isAdded(player.getUUID())) {
|
||||
color = TranslatableCaption.of("info.plot_list_added_to");
|
||||
@ -466,39 +468,62 @@ public class ListCmd extends SubCommand {
|
||||
String prefix = "";
|
||||
String online = TranslatableCaption.of("info.plot_list_player_online").getComponent(player);
|
||||
String offline = TranslatableCaption.of("info.plot_list_player_offline").getComponent(player);
|
||||
String unknown = TranslatableCaption.of("info.plot_list_player_unknown").getComponent(player);
|
||||
String server = TranslatableCaption.of("info.plot_list_player_server").getComponent(player);
|
||||
String everyone = TranslatableCaption.of("info.plot_list_player_everyone").getComponent(player);
|
||||
TextComponent.Builder builder = Component.text();
|
||||
try {
|
||||
final List<UUIDMapping> names = PlotSquared.get().getImpromptuUUIDPipeline().getNames(plot.getOwners())
|
||||
.get(Settings.UUID.BLOCKING_TIMEOUT, TimeUnit.MILLISECONDS);
|
||||
for (final UUIDMapping uuidMapping : names) {
|
||||
PlotPlayer<?> pp = PlotSquared.platform().playerManager().getPlayerIfExists(uuidMapping.getUuid());
|
||||
TagResolver resolver = TagResolver.builder()
|
||||
if (plot.getFlag(ServerPlotFlag.class)) {
|
||||
TagResolver serverResolver = TagResolver.resolver(
|
||||
"info.server",
|
||||
Tag.inserting(TranslatableCaption.of("info.server").toComponent(player))
|
||||
);
|
||||
builder.append(MINI_MESSAGE.deserialize(server, serverResolver));
|
||||
} else {
|
||||
try {
|
||||
final List<UUIDMapping> names = PlotSquared.get().getImpromptuUUIDPipeline().getNames(plot.getOwners())
|
||||
.get(Settings.UUID.BLOCKING_TIMEOUT, TimeUnit.MILLISECONDS);
|
||||
for (final UUIDMapping uuidMapping : names) {
|
||||
PlotPlayer<?> pp = PlotSquared.platform().playerManager().getPlayerIfExists(uuidMapping.getUuid());
|
||||
TagResolver resolver = TagResolver.builder()
|
||||
.tag("prefix", Tag.inserting(Component.text(prefix)))
|
||||
.tag("player", Tag.inserting(Component.text(uuidMapping.getUsername())))
|
||||
.build();
|
||||
if (pp != null) {
|
||||
builder.append(MINI_MESSAGE.deserialize(online, resolver));
|
||||
} else {
|
||||
builder.append(MINI_MESSAGE.deserialize(offline, resolver));
|
||||
} else if (uuidMapping.getUsername().equalsIgnoreCase("unknown")) {
|
||||
TagResolver unknownResolver = TagResolver.resolver(
|
||||
"info.unknown",
|
||||
Tag.inserting(TranslatableCaption.of("info.unknown").toComponent(player))
|
||||
);
|
||||
builder.append(MINI_MESSAGE.deserialize(unknown, unknownResolver));
|
||||
} else if (uuidMapping.getUuid().equals(DBFunc.EVERYONE)) {
|
||||
TagResolver everyoneResolver = TagResolver.resolver(
|
||||
"info.everyone",
|
||||
Tag.inserting(TranslatableCaption.of("info.everyone").toComponent(player))
|
||||
);
|
||||
builder.append(MINI_MESSAGE.deserialize(everyone, everyoneResolver));
|
||||
} else {
|
||||
builder.append(MINI_MESSAGE.deserialize(offline, resolver));
|
||||
}
|
||||
prefix = ", ";
|
||||
}
|
||||
prefix = ", ";
|
||||
}
|
||||
} catch (InterruptedException | ExecutionException e) {
|
||||
final StringBuilder playerBuilder = new StringBuilder();
|
||||
final Iterator<UUID> uuidIterator = plot.getOwners().iterator();
|
||||
while (uuidIterator.hasNext()) {
|
||||
final UUID uuid = uuidIterator.next();
|
||||
playerBuilder.append(uuid);
|
||||
if (uuidIterator.hasNext()) {
|
||||
playerBuilder.append(", ");
|
||||
} catch (InterruptedException | ExecutionException e) {
|
||||
final StringBuilder playerBuilder = new StringBuilder();
|
||||
final Iterator<UUID> uuidIterator = plot.getOwners().iterator();
|
||||
while (uuidIterator.hasNext()) {
|
||||
final UUID uuid = uuidIterator.next();
|
||||
playerBuilder.append(uuid);
|
||||
if (uuidIterator.hasNext()) {
|
||||
playerBuilder.append(", ");
|
||||
}
|
||||
}
|
||||
player.sendMessage(
|
||||
TranslatableCaption.of("errors.invalid_player"),
|
||||
TagResolver.resolver("value", Tag.inserting(Component.text(playerBuilder.toString())))
|
||||
);
|
||||
} catch (TimeoutException e) {
|
||||
player.sendMessage(TranslatableCaption.of("players.fetching_players_timeout"));
|
||||
}
|
||||
player.sendMessage(
|
||||
TranslatableCaption.of("errors.invalid_player"),
|
||||
TagResolver.resolver("value", Tag.inserting(Component.text(playerBuilder.toString())))
|
||||
);
|
||||
} catch (TimeoutException e) {
|
||||
player.sendMessage(TranslatableCaption.of("players.fetching_players_timeout"));
|
||||
}
|
||||
finalResolver.tag("players", Tag.inserting(builder.asComponent()));
|
||||
caption.set(TranslatableCaption.of("info.plot_list_item"));
|
||||
|
@ -249,6 +249,9 @@ public class Settings extends Config {
|
||||
public static int UUID_CACHE_SIZE = 100000;
|
||||
@Comment("Rate limit (per 10 minutes) for background UUID fetching from the Mojang API")
|
||||
public static int BACKGROUND_LIMIT = 200;
|
||||
@Comment("Whether the Mojang API service is enabled for impromptu api calls. If false only the Background task will use" +
|
||||
" http requests to fill the UUID cache (requires restart)")
|
||||
public static boolean IMPROMPTU_SERVICE_MOJANG_API = true;
|
||||
@Comment("Rate limit (per 10 minutes) for random UUID fetching from the Mojang API")
|
||||
public static int IMPROMPTU_LIMIT = 300;
|
||||
@Comment("Timeout (in milliseconds) for non-blocking UUID requests (mostly commands)")
|
||||
@ -691,6 +694,7 @@ public class Settings extends Config {
|
||||
@Comment({"If blocks at the edges of queued operations should be set causing updates",
|
||||
" - Slightly slower, but prevents issues such as fences left connected to nothing"})
|
||||
public static boolean UPDATE_EDGES = true;
|
||||
|
||||
}
|
||||
|
||||
@Comment("Settings related to tab completion")
|
||||
|
@ -1422,15 +1422,7 @@ public class Plot {
|
||||
0
|
||||
);
|
||||
}
|
||||
Location location = Location
|
||||
.at(
|
||||
bottom.getWorldName(),
|
||||
bottom.getX() + home.getX(),
|
||||
bottom.getY() + home.getY(),
|
||||
bottom.getZ() + home.getZ(),
|
||||
home.getYaw(),
|
||||
home.getPitch()
|
||||
);
|
||||
Location location = toHomeLocation(bottom, home);
|
||||
if (!this.worldUtil.getBlockSynchronous(location).getBlockType().getMaterial().isAir()) {
|
||||
location = location.withY(
|
||||
Math.max(1 + this.worldUtil.getHighestBlockSynchronous(
|
||||
@ -1463,15 +1455,7 @@ public class Plot {
|
||||
return;
|
||||
}
|
||||
Location bottom = this.getBottomAbs();
|
||||
Location location = Location
|
||||
.at(
|
||||
bottom.getWorldName(),
|
||||
bottom.getX() + home.getX(),
|
||||
home.getY(), // y is absolute
|
||||
bottom.getZ() + home.getZ(),
|
||||
home.getYaw(),
|
||||
home.getPitch()
|
||||
);
|
||||
Location location = toHomeLocation(bottom, home);
|
||||
this.worldUtil.getBlock(location, block -> {
|
||||
if (!block.getBlockType().getMaterial().isAir()) {
|
||||
this.worldUtil.getHighestBlock(this.getWorldName(), location.getX(), location.getZ(),
|
||||
@ -1484,6 +1468,17 @@ public class Plot {
|
||||
}
|
||||
}
|
||||
|
||||
private Location toHomeLocation(Location bottom, BlockLoc relativeHome) {
|
||||
return Location.at(
|
||||
bottom.getWorldName(),
|
||||
bottom.getX() + relativeHome.getX(),
|
||||
relativeHome.getY(), // y is absolute
|
||||
bottom.getZ() + relativeHome.getZ(),
|
||||
relativeHome.getYaw(),
|
||||
relativeHome.getPitch()
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the home location
|
||||
*
|
||||
|
@ -58,7 +58,7 @@ public class DescriptionFlag extends StringFlag<DescriptionFlag> {
|
||||
|
||||
@Override
|
||||
public String getExample() {
|
||||
return "&6This is my plot!";
|
||||
return "<gold>This is my plot!";
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -58,7 +58,7 @@ public class GreetingFlag extends StringFlag<GreetingFlag> {
|
||||
|
||||
@Override
|
||||
public String getExample() {
|
||||
return "&6Welcome to my plot!";
|
||||
return "<gold>Welcome to my plot!";
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -143,7 +143,8 @@ public abstract class QueueCoordinator {
|
||||
}
|
||||
|
||||
/**
|
||||
* Set a chunk object (e.g. the Bukkit Chunk object) to the queue
|
||||
* Set a chunk object (e.g. the Bukkit Chunk object) to the queue. This will be used as fallback in case of WNA failure.
|
||||
* Should ONLY be used in specific cases (i.e. generation, where a chunk is being populated)
|
||||
*
|
||||
* @param chunkObject chunk object. Usually the implementation-specific chunk (e.g. bukkit Chunk)
|
||||
*/
|
||||
|
@ -381,6 +381,9 @@
|
||||
"info.plot_list_default": "<gold><plot></gold>",
|
||||
"info.plot_list_player_online": "<dark_aqua><prefix></dark_aqua><hover:show_text:'<dark_aqua>Online</dark_aqua>'><gold><player></gold></hover>",
|
||||
"info.plot_list_player_offline": "<dark_aqua><prefix></dark_aqua><hover:show_text:'<dark_gray>Offline</dark_gray>'><gold><player></gold></hover>",
|
||||
"info.plot_list_player_unknown": "<hover:show_text:'<red>The owner of this plot is unknown</red>'><white><info.unknown></white></hover>",
|
||||
"info.plot_list_player_server": "<hover:show_text:'<red>The plot is owned by the server</red>'><white><info.server></white></hover>",
|
||||
"info.plot_list_player_everyone": "<hover:show_text:'<blue>The plot is owned by everyone</blue>'><white><info.everyone></white></hover>",
|
||||
"info.area_info_format": "<header>\n<reset><gold>Name: </gold><gray><name></gray>\n<gold>Type: </gold><gray><type></gray>\n<gold>Terrain: </gold><gray><terrain></gray>\n<gold>Usage: </gold><gray><usage>%</gray>\n<gold>Claimed: </gold><gray><claimed></gray>\n<gold>Clusters: </gold><gray><clusters></gray>\n<gold>Region: </gold><gray><region></gray>\n<gold>Generator: </gold><gray><generator></gray>\n<footer>",
|
||||
"info.area_list_tooltip": "<gold>Claimed=</gold><gray><claimed></gray>\n<gold>Usage=</gold><gray><usage></gray>\n<gold>Clusters=</gold><gray><clusters></gray>\n<gold>Region=</gold><gray><region></gray>\n<gold>Generator=</gold><gray><generator></gray>",
|
||||
"info.area_list_item": "<click:run_command:'<command_tp>'><hover:show_text:'<command_tp>'><dark_gray>[</dark_gray><gold><number></gold><dark_gray>]</dark_gray></hover></click> <click:run_command:'<command_info>'><hover:show_text:'<hover_info>'><gold><area_name></gold></hover></click><gray> - </gray><gray><area_type>:<area_terrain></gray>",
|
||||
|
Reference in New Issue
Block a user