|
|
|
@ -14,14 +14,13 @@
|
|
|
|
|
package net.william278.husksync.player;
|
|
|
|
|
|
|
|
|
|
import de.themoep.minedown.adventure.MineDown;
|
|
|
|
|
import de.themoep.minedown.adventure.MineDownParser;
|
|
|
|
|
import dev.triumphteam.gui.builder.gui.StorageBuilder;
|
|
|
|
|
import dev.triumphteam.gui.guis.Gui;
|
|
|
|
|
import dev.triumphteam.gui.guis.StorageGui;
|
|
|
|
|
import net.kyori.adventure.audience.Audience;
|
|
|
|
|
import net.roxeez.advancement.display.FrameType;
|
|
|
|
|
import net.william278.andjam.Toast;
|
|
|
|
|
import net.william278.desertwell.Version;
|
|
|
|
|
import net.william278.desertwell.util.Version;
|
|
|
|
|
import net.william278.husksync.BukkitHuskSync;
|
|
|
|
|
import net.william278.husksync.config.Settings;
|
|
|
|
|
import net.william278.husksync.data.*;
|
|
|
|
@ -50,15 +49,14 @@ import java.util.logging.Level;
|
|
|
|
|
* Bukkit implementation of an {@link OnlineUser}
|
|
|
|
|
*/
|
|
|
|
|
public class BukkitPlayer extends OnlineUser {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private final BukkitHuskSync plugin;
|
|
|
|
|
private final Player player;
|
|
|
|
|
private final Audience audience;
|
|
|
|
|
|
|
|
|
|
private BukkitPlayer(@NotNull Player player) {
|
|
|
|
|
super(player.getUniqueId(), player.getName());
|
|
|
|
|
this.plugin = BukkitHuskSync.getInstance();
|
|
|
|
|
this.player = player;
|
|
|
|
|
this.audience = BukkitHuskSync.getInstance().getAudiences().player(player);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@NotNull
|
|
|
|
@ -107,11 +105,11 @@ public class BukkitPlayer extends OnlineUser {
|
|
|
|
|
if (statusData.health != currentHealth) {
|
|
|
|
|
final double healthToSet = currentHealth > currentMaxHealth ? currentMaxHealth : statusData.health;
|
|
|
|
|
final double maxHealth = currentMaxHealth;
|
|
|
|
|
Bukkit.getScheduler().runTask(BukkitHuskSync.getInstance(), () -> {
|
|
|
|
|
Bukkit.getScheduler().runTask(plugin, () -> {
|
|
|
|
|
try {
|
|
|
|
|
player.setHealth(Math.min(healthToSet, maxHealth));
|
|
|
|
|
} catch (IllegalArgumentException e) {
|
|
|
|
|
BukkitHuskSync.getInstance().getLogger().log(Level.WARNING,
|
|
|
|
|
plugin.getLogger().log(Level.WARNING,
|
|
|
|
|
"Failed to set health of player " + player.getName() + " to " + healthToSet);
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
@ -126,7 +124,7 @@ public class BukkitPlayer extends OnlineUser {
|
|
|
|
|
}
|
|
|
|
|
player.setHealthScaled(statusData.healthScale != 0D);
|
|
|
|
|
} catch (IllegalArgumentException e) {
|
|
|
|
|
BukkitHuskSync.getInstance().getLogger().log(Level.WARNING,
|
|
|
|
|
plugin.getLogger().log(Level.WARNING,
|
|
|
|
|
"Failed to set health scale of player " + player.getName() + " to " + statusData.healthScale);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
@ -144,11 +142,11 @@ public class BukkitPlayer extends OnlineUser {
|
|
|
|
|
player.setExp(statusData.expProgress);
|
|
|
|
|
}
|
|
|
|
|
if (settings.getSynchronizationFeature(Settings.SynchronizationFeature.GAME_MODE)) {
|
|
|
|
|
Bukkit.getScheduler().runTask(BukkitHuskSync.getInstance(), () ->
|
|
|
|
|
Bukkit.getScheduler().runTask(plugin, () ->
|
|
|
|
|
player.setGameMode(GameMode.valueOf(statusData.gameMode)));
|
|
|
|
|
}
|
|
|
|
|
if (settings.getSynchronizationFeature(Settings.SynchronizationFeature.LOCATION)) {
|
|
|
|
|
Bukkit.getScheduler().runTask(BukkitHuskSync.getInstance(), () -> {
|
|
|
|
|
Bukkit.getScheduler().runTask(plugin, () -> {
|
|
|
|
|
if (statusData.isFlying) {
|
|
|
|
|
player.setAllowFlight(true);
|
|
|
|
|
player.setFlying(true);
|
|
|
|
@ -173,7 +171,7 @@ public class BukkitPlayer extends OnlineUser {
|
|
|
|
|
public CompletableFuture<Void> setInventory(@NotNull ItemData itemData) {
|
|
|
|
|
return BukkitSerializer.deserializeInventory(itemData.serializedItems).thenApplyAsync(contents -> {
|
|
|
|
|
final CompletableFuture<Void> inventorySetFuture = new CompletableFuture<>();
|
|
|
|
|
Bukkit.getScheduler().runTask(BukkitHuskSync.getInstance(), () -> {
|
|
|
|
|
Bukkit.getScheduler().runTask(plugin, () -> {
|
|
|
|
|
player.setItemOnCursor(null);
|
|
|
|
|
player.getInventory().setContents(contents.getContents());
|
|
|
|
|
player.updateInventory();
|
|
|
|
@ -197,7 +195,7 @@ public class BukkitPlayer extends OnlineUser {
|
|
|
|
|
public CompletableFuture<Void> setEnderChest(@NotNull ItemData enderChestData) {
|
|
|
|
|
return BukkitSerializer.deserializeItemStackArray(enderChestData.serializedItems).thenApplyAsync(contents -> {
|
|
|
|
|
final CompletableFuture<Void> enderChestSetFuture = new CompletableFuture<>();
|
|
|
|
|
Bukkit.getScheduler().runTask(BukkitHuskSync.getInstance(), () -> {
|
|
|
|
|
Bukkit.getScheduler().runTask(plugin, () -> {
|
|
|
|
|
player.getEnderChest().setContents(contents);
|
|
|
|
|
enderChestSetFuture.complete(null);
|
|
|
|
|
});
|
|
|
|
@ -216,7 +214,7 @@ public class BukkitPlayer extends OnlineUser {
|
|
|
|
|
return BukkitSerializer.deserializePotionEffectArray(potionEffectData.serializedPotionEffects)
|
|
|
|
|
.thenApplyAsync(effects -> {
|
|
|
|
|
final CompletableFuture<Void> potionEffectsSetFuture = new CompletableFuture<>();
|
|
|
|
|
Bukkit.getScheduler().runTask(BukkitHuskSync.getInstance(), () -> {
|
|
|
|
|
Bukkit.getScheduler().runTask(plugin, () -> {
|
|
|
|
|
for (PotionEffect effect : player.getActivePotionEffects()) {
|
|
|
|
|
player.removePotionEffect(effect.getType());
|
|
|
|
|
}
|
|
|
|
@ -254,7 +252,7 @@ public class BukkitPlayer extends OnlineUser {
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public CompletableFuture<Void> setAdvancements(@NotNull List<AdvancementData> advancementData) {
|
|
|
|
|
return CompletableFuture.runAsync(() -> Bukkit.getScheduler().runTask(BukkitHuskSync.getInstance(), () -> {
|
|
|
|
|
return CompletableFuture.runAsync(() -> Bukkit.getScheduler().runTask(plugin, () -> {
|
|
|
|
|
|
|
|
|
|
// Temporarily disable advancement announcing if needed
|
|
|
|
|
boolean announceAdvancementUpdate = false;
|
|
|
|
@ -286,20 +284,20 @@ public class BukkitPlayer extends OnlineUser {
|
|
|
|
|
record.completedCriteria.keySet().stream()
|
|
|
|
|
.filter(criterion -> !playerProgress.getAwardedCriteria().contains(criterion))
|
|
|
|
|
.forEach(criterion -> {
|
|
|
|
|
Bukkit.getScheduler().runTask(BukkitHuskSync.getInstance(),
|
|
|
|
|
Bukkit.getScheduler().runTask(plugin,
|
|
|
|
|
() -> player.getAdvancementProgress(advancement).awardCriteria(criterion));
|
|
|
|
|
correctExperience.set(true);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// Revoke all criteria that the player does have but should not
|
|
|
|
|
new ArrayList<>(playerProgress.getAwardedCriteria()).stream().filter(criterion -> !record.completedCriteria.containsKey(criterion))
|
|
|
|
|
.forEach(criterion -> Bukkit.getScheduler().runTask(BukkitHuskSync.getInstance(),
|
|
|
|
|
.forEach(criterion -> Bukkit.getScheduler().runTask(plugin,
|
|
|
|
|
() -> player.getAdvancementProgress(advancement).revokeCriteria(criterion)));
|
|
|
|
|
|
|
|
|
|
},
|
|
|
|
|
// Revoke the criteria as the player shouldn't have any
|
|
|
|
|
() -> new ArrayList<>(playerProgress.getAwardedCriteria()).forEach(criterion ->
|
|
|
|
|
Bukkit.getScheduler().runTask(BukkitHuskSync.getInstance(),
|
|
|
|
|
Bukkit.getScheduler().runTask(plugin,
|
|
|
|
|
() -> player.getAdvancementProgress(advancement).revokeCriteria(criterion))));
|
|
|
|
|
|
|
|
|
|
// Update the player's experience in case the advancement changed that
|
|
|
|
@ -311,7 +309,7 @@ public class BukkitPlayer extends OnlineUser {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Re-enable announcing advancements (back on main thread again)
|
|
|
|
|
Bukkit.getScheduler().runTask(BukkitHuskSync.getInstance(), () -> {
|
|
|
|
|
Bukkit.getScheduler().runTask(plugin, () -> {
|
|
|
|
|
if (finalAnnounceAdvancementUpdate) {
|
|
|
|
|
player.getWorld().setGameRule(GameRule.ANNOUNCE_ADVANCEMENTS, true);
|
|
|
|
|
}
|
|
|
|
@ -381,7 +379,7 @@ public class BukkitPlayer extends OnlineUser {
|
|
|
|
|
try {
|
|
|
|
|
player.setStatistic(Statistic.valueOf(statistic), statisticsData.untypedStatistics.get(statistic));
|
|
|
|
|
} catch (IllegalArgumentException e) {
|
|
|
|
|
BukkitHuskSync.getInstance().getLogger().log(Level.WARNING,
|
|
|
|
|
plugin.getLogger().log(Level.WARNING,
|
|
|
|
|
"Failed to set generic statistic " + statistic + " for " + username);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
@ -393,7 +391,7 @@ public class BukkitPlayer extends OnlineUser {
|
|
|
|
|
player.setStatistic(Statistic.valueOf(statistic), Material.valueOf(blockMaterial),
|
|
|
|
|
statisticsData.blockStatistics.get(statistic).get(blockMaterial));
|
|
|
|
|
} catch (IllegalArgumentException e) {
|
|
|
|
|
BukkitHuskSync.getInstance().getLogger().log(Level.WARNING,
|
|
|
|
|
plugin.getLogger().log(Level.WARNING,
|
|
|
|
|
"Failed to set " + blockMaterial + " statistic " + statistic + " for " + username);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
@ -406,7 +404,7 @@ public class BukkitPlayer extends OnlineUser {
|
|
|
|
|
player.setStatistic(Statistic.valueOf(statistic), Material.valueOf(itemMaterial),
|
|
|
|
|
statisticsData.itemStatistics.get(statistic).get(itemMaterial));
|
|
|
|
|
} catch (IllegalArgumentException e) {
|
|
|
|
|
BukkitHuskSync.getInstance().getLogger().log(Level.WARNING,
|
|
|
|
|
plugin.getLogger().log(Level.WARNING,
|
|
|
|
|
"Failed to set " + itemMaterial + " statistic " + statistic + " for " + username);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
@ -419,7 +417,7 @@ public class BukkitPlayer extends OnlineUser {
|
|
|
|
|
player.setStatistic(Statistic.valueOf(statistic), EntityType.valueOf(entityType),
|
|
|
|
|
statisticsData.entityStatistics.get(statistic).get(entityType));
|
|
|
|
|
} catch (IllegalArgumentException e) {
|
|
|
|
|
BukkitHuskSync.getInstance().getLogger().log(Level.WARNING,
|
|
|
|
|
plugin.getLogger().log(Level.WARNING,
|
|
|
|
|
"Failed to set " + entityType + " statistic " + statistic + " for " + username);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
@ -447,7 +445,7 @@ public class BukkitPlayer extends OnlineUser {
|
|
|
|
|
.valueOf(locationData.worldEnvironment)).findFirst().ifPresent(bukkitWorld::set);
|
|
|
|
|
}
|
|
|
|
|
if (bukkitWorld.get() != null) {
|
|
|
|
|
Bukkit.getScheduler().runTask(BukkitHuskSync.getInstance(), () -> {
|
|
|
|
|
Bukkit.getScheduler().runTask(plugin, () -> {
|
|
|
|
|
player.teleport(new Location(bukkitWorld.get(),
|
|
|
|
|
locationData.x, locationData.y, locationData.z,
|
|
|
|
|
locationData.yaw, locationData.pitch), PlayerTeleportEvent.TeleportCause.PLUGIN);
|
|
|
|
@ -476,7 +474,7 @@ public class BukkitPlayer extends OnlineUser {
|
|
|
|
|
});
|
|
|
|
|
return new PersistentDataContainerData(persistentDataMap);
|
|
|
|
|
}).exceptionally(throwable -> {
|
|
|
|
|
BukkitHuskSync.getInstance().log(Level.WARNING,
|
|
|
|
|
plugin.log(Level.WARNING,
|
|
|
|
|
"Could not read " + player.getName() + "'s persistent data map, skipping!");
|
|
|
|
|
throwable.printStackTrace();
|
|
|
|
|
return new PersistentDataContainerData(new HashMap<>());
|
|
|
|
@ -494,19 +492,26 @@ public class BukkitPlayer extends OnlineUser {
|
|
|
|
|
container.getTagType(keyString)
|
|
|
|
|
.flatMap(BukkitPersistentTypeMapping::getMapping)
|
|
|
|
|
.ifPresentOrElse(mapping -> mapping.setContainerValue(container, player, key),
|
|
|
|
|
() -> BukkitHuskSync.getInstance().log(Level.WARNING,
|
|
|
|
|
() -> plugin.log(Level.WARNING,
|
|
|
|
|
"Could not set " + player.getName() + "'s persistent data key " + keyString +
|
|
|
|
|
" as it has an invalid type. Skipping!"));
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
}).exceptionally(throwable -> {
|
|
|
|
|
BukkitHuskSync.getInstance().log(Level.WARNING,
|
|
|
|
|
plugin.log(Level.WARNING,
|
|
|
|
|
"Could not write " + player.getName() + "'s persistent data map, skipping!");
|
|
|
|
|
throwable.printStackTrace();
|
|
|
|
|
return null;
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
@NotNull
|
|
|
|
|
public Audience getAudience() {
|
|
|
|
|
return plugin.getAudiences().player(player);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public boolean isOffline() {
|
|
|
|
|
try {
|
|
|
|
@ -520,7 +525,7 @@ public class BukkitPlayer extends OnlineUser {
|
|
|
|
|
@NotNull
|
|
|
|
|
@Override
|
|
|
|
|
public Version getMinecraftVersion() {
|
|
|
|
|
return Version.fromMinecraftVersionString(Bukkit.getBukkitVersion());
|
|
|
|
|
return Version.fromString(Bukkit.getBukkitVersion());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
@ -569,7 +574,7 @@ public class BukkitPlayer extends OnlineUser {
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// Display the GUI (synchronously; on the main server thread)
|
|
|
|
|
Bukkit.getScheduler().runTask(BukkitHuskSync.getInstance(), () -> gui.open(player));
|
|
|
|
|
Bukkit.getScheduler().runTask(plugin, () -> gui.open(player));
|
|
|
|
|
}).exceptionally(throwable -> {
|
|
|
|
|
// Handle exceptions
|
|
|
|
|
updatedData.completeExceptionally(throwable);
|
|
|
|
@ -583,19 +588,12 @@ public class BukkitPlayer extends OnlineUser {
|
|
|
|
|
return player.getHealth() <= 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public void sendActionBar(@NotNull MineDown mineDown) {
|
|
|
|
|
audience.sendActionBar(mineDown
|
|
|
|
|
.disable(MineDownParser.Option.SIMPLE_FORMATTING)
|
|
|
|
|
.replace().toComponent());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public void sendToast(@NotNull MineDown title, @NotNull MineDown description,
|
|
|
|
|
@NotNull String iconMaterial, @NotNull String backgroundType) {
|
|
|
|
|
try {
|
|
|
|
|
final Material material = Material.matchMaterial(iconMaterial);
|
|
|
|
|
Toast.builder(BukkitHuskSync.getInstance())
|
|
|
|
|
Toast.builder(plugin)
|
|
|
|
|
.setTitle(title.toComponent())
|
|
|
|
|
.setDescription(description.toComponent())
|
|
|
|
|
.setIcon(material != null ? material : Material.BARRIER)
|
|
|
|
@ -607,13 +605,6 @@ public class BukkitPlayer extends OnlineUser {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public void sendMessage(@NotNull MineDown mineDown) {
|
|
|
|
|
audience.sendMessage(mineDown
|
|
|
|
|
.disable(MineDownParser.Option.SIMPLE_FORMATTING)
|
|
|
|
|
.replace().toComponent());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Returns a {@link Player}'s maximum health, minus any health boost effects
|
|
|
|
|
*
|
|
|
|
@ -635,7 +626,7 @@ public class BukkitPlayer extends OnlineUser {
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public boolean isLocked() {
|
|
|
|
|
return BukkitHuskSync.getInstance().getLockedPlayers().contains(player.getUniqueId());
|
|
|
|
|
return plugin.getLockedPlayers().contains(player.getUniqueId());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|