Merge remote-tracking branch 'upstream/main' into upstream

This commit is contained in:
2023-02-02 11:20:09 +01:00
77 changed files with 9180 additions and 359 deletions

View File

@@ -36,10 +36,6 @@ public class BukkitPermissionAttachmentManager {
if (p == null) {
return;
}
if (p.hasMetadata("NPC") && noopAttachment != null) {
p.removeAttachment(noopAttachment);
return;
}
PermissionAttachment attach = attachments.remove(p);
if (attach != null) {
p.removeAttachment(attach);

View File

@@ -1,9 +1,11 @@
package com.fastasyncworldedit.bukkit.util;
import com.google.common.collect.ComparisonChain;
import io.papermc.lib.PaperLib;
import org.bukkit.Bukkit;
import javax.annotation.Nonnull;
import java.util.regex.Pattern;
/**
* Utility class for retrieving and comparing minecraft server versions.
@@ -44,18 +46,15 @@ public class MinecraftVersion implements Comparable<MinecraftVersion> {
/**
* Construct a new version with major, minor and release based on the server version.
* @deprecated use {@link MinecraftVersion#getCurrent()} instead.
*/
@Deprecated(since = "2.4.10", forRemoval = true)
public MinecraftVersion() {
// Array consists of three version parts, eg. ['v1', '16', 'R3']
String[] versionParts = getPackageVersion().split("_");
MinecraftVersion current = getCurrent();
if (versionParts.length != 3) {
throw new IllegalStateException("Failed to determine minecraft version!");
}
this.major = Integer.parseInt(versionParts[0].substring(1));
this.minor = Integer.parseInt(versionParts[1]);
this.release = Integer.parseInt(versionParts[2].substring(1));
this.major = current.getMajor();
this.minor = current.getMinor();
this.release = current.getRelease();
}
/**
@@ -65,11 +64,35 @@ public class MinecraftVersion implements Comparable<MinecraftVersion> {
*/
public static MinecraftVersion getCurrent() {
if (current == null) {
return current = new MinecraftVersion();
return current = detectMinecraftVersion();
}
return current;
}
private static MinecraftVersion detectMinecraftVersion() {
int major;
int minor;
int release;
if (PaperLib.isPaper()) {
String[] parts = Bukkit.getMinecraftVersion().split(Pattern.quote("."));
if (parts.length != 2 && parts.length != 3) {
throw new IllegalStateException("Failed to determine minecraft version!");
}
major = Integer.parseInt(parts[0]);
minor = Integer.parseInt(parts[1]);
release = parts.length == 3 ? Integer.parseInt(parts[2]) : 0; // e.g. 1.18
} else {
String[] parts = getPackageVersion().split("_");
if (parts.length != 3) {
throw new IllegalStateException("Failed to determine minecraft version!");
}
major = Integer.parseInt(parts[0].substring(1));
minor = Integer.parseInt(parts[1]);
release = Integer.parseInt(parts[2].substring(1));
}
return new MinecraftVersion(major, minor, release);
}
/**
* Determines the server version based on the CraftBukkit package path, e.g. {@code org.bukkit.craftbukkit.v1_16_R3},
* where v1_16_R3 is the resolved version.

View File

@@ -1,5 +1,6 @@
package com.fastasyncworldedit.bukkit.util.image;
import com.fastasyncworldedit.core.util.TaskManager;
import com.fastasyncworldedit.core.util.image.Drawable;
import com.fastasyncworldedit.core.util.image.ImageUtil;
import com.fastasyncworldedit.core.util.image.ImageViewer;
@@ -163,15 +164,18 @@ public class BukkitImageViewer implements ImageViewer {
controller.showInFrames(player, frames, true);
} else {
int slot = getMapSlot(player);
if (slot == -1) {
if (initializing) {
player.getInventory().setItemInMainHand(new ItemStack(Material.MAP));
} else {
return;
TaskManager.taskManager().sync(() -> {
if (slot == -1) {
if (initializing) {
player.getInventory().setItemInMainHand(new ItemStack(Material.MAP));
} else {
return null;
}
} else if (player.getInventory().getHeldItemSlot() != slot) {
player.getInventory().setHeldItemSlot(slot);
}
} else if (player.getInventory().getHeldItemSlot() != slot) {
player.getInventory().setHeldItemSlot(slot);
}
return null;
});
if (image == null && drawable != null) {
image = drawable.draw();
}

View File

@@ -22,7 +22,6 @@ package com.sk89q.worldedit.bukkit;
import com.fastasyncworldedit.core.configuration.Caption;
import com.fastasyncworldedit.core.configuration.Settings;
import com.fastasyncworldedit.core.util.TaskManager;
import com.fastasyncworldedit.core.util.task.RunnableVal;
import com.sk89q.util.StringUtil;
import com.sk89q.wepif.VaultResolver;
import com.sk89q.worldedit.WorldEdit;
@@ -162,31 +161,29 @@ public class BukkitPlayer extends AbstractPlayerActor {
public void giveItem(BaseItemStack itemStack) {
final PlayerInventory inv = player.getInventory();
ItemStack newItem = BukkitAdapter.adapt(itemStack);
if (itemStack.getType().getId().equalsIgnoreCase(WorldEdit.getInstance().getConfiguration().wandItem)) {
inv.remove(newItem);
}
final ItemStack item = player.getInventory().getItemInMainHand();
player.getInventory().setItemInMainHand(newItem);
HashMap<Integer, ItemStack> overflow = inv.addItem(item);
if (!overflow.isEmpty()) {
TaskManager.taskManager().sync(new RunnableVal<>() {
@Override
public void run(Object value) {
for (Map.Entry<Integer, ItemStack> entry : overflow.entrySet()) {
ItemStack stack = entry.getValue();
if (stack.getType() != Material.AIR && stack.getAmount() > 0) {
Item dropped = player.getWorld().dropItem(player.getLocation(), stack);
PlayerDropItemEvent event = new PlayerDropItemEvent(player, dropped);
Bukkit.getPluginManager().callEvent(event);
if (event.isCancelled()) {
dropped.remove();
}
TaskManager.taskManager().sync(() -> {
if (itemStack.getType().getId().equalsIgnoreCase(WorldEdit.getInstance().getConfiguration().wandItem)) {
inv.remove(newItem);
}
final ItemStack item = player.getInventory().getItemInMainHand();
player.getInventory().setItemInMainHand(newItem);
HashMap<Integer, ItemStack> overflow = inv.addItem(item);
if (!overflow.isEmpty()) {
for (Map.Entry<Integer, ItemStack> entry : overflow.entrySet()) {
ItemStack stack = entry.getValue();
if (stack.getType() != Material.AIR && stack.getAmount() > 0) {
Item dropped = player.getWorld().dropItem(player.getLocation(), stack);
PlayerDropItemEvent event = new PlayerDropItemEvent(player, dropped);
Bukkit.getPluginManager().callEvent(event);
if (event.isCancelled()) {
dropped.remove();
}
}
}
});
}
player.updateInventory();
}
player.updateInventory();
return null;
});
}
//FAWE end

View File

@@ -20,6 +20,7 @@
package com.sk89q.worldedit.bukkit;
import com.fastasyncworldedit.core.extent.inventory.SlottableBlockBag;
import com.fastasyncworldedit.core.util.TaskManager;
import com.sk89q.worldedit.blocks.BaseItem;
import com.sk89q.worldedit.blocks.BaseItemStack;
import com.sk89q.worldedit.extent.inventory.BlockBag;
@@ -171,7 +172,10 @@ public class BukkitPlayerBlockBag extends BlockBag implements SlottableBlockBag
@Override
public void flushChanges() {
if (items != null) {
player.getInventory().setContents(items);
TaskManager.taskManager().sync(() -> {
player.getInventory().setContents(items);
return null;
});
items = null;
}
}

View File

@@ -24,6 +24,7 @@ import com.fastasyncworldedit.core.Fawe;
import com.fastasyncworldedit.core.internal.exception.FaweException;
import com.fastasyncworldedit.core.queue.IChunkGet;
import com.fastasyncworldedit.core.queue.implementation.packet.ChunkPacket;
import com.fastasyncworldedit.core.util.TaskManager;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Sets;
import com.sk89q.jnbt.CompoundTag;
@@ -143,7 +144,7 @@ public class BukkitWorld extends AbstractWorld {
public List<com.sk89q.worldedit.entity.Entity> getEntities(Region region) {
World world = getWorld();
List<Entity> ents = world.getEntities();
List<Entity> ents = TaskManager.taskManager().sync(world::getEntities);
List<com.sk89q.worldedit.entity.Entity> entities = new ArrayList<>();
for (Entity ent : ents) {
if (region.contains(BukkitAdapter.asBlockVector(ent.getLocation()))) {
@@ -156,7 +157,9 @@ public class BukkitWorld extends AbstractWorld {
@Override
public List<com.sk89q.worldedit.entity.Entity> getEntities() {
List<com.sk89q.worldedit.entity.Entity> list = new ArrayList<>();
for (Entity entity : getWorld().getEntities()) {
List<Entity> ents = TaskManager.taskManager().sync(getWorld()::getEntities);
for (Entity entity : ents) {
list.add(BukkitAdapter.adapt(entity));
}
return list;
@@ -279,12 +282,15 @@ public class BukkitWorld extends AbstractWorld {
return false;
}
InventoryHolder chest = (InventoryHolder) state;
Inventory inven = chest.getInventory();
if (chest instanceof Chest) {
inven = ((Chest) chest).getBlockInventory();
}
inven.clear();
TaskManager.taskManager().sync(() -> {
InventoryHolder chest = (InventoryHolder) state;
Inventory inven = chest.getInventory();
if (chest instanceof Chest) {
inven = ((Chest) chest).getBlockInventory();
}
inven.clear();
return null;
});
return true;
}