Started using data lock

This commit is contained in:
Teriuihi 2022-05-15 22:39:08 +02:00
parent bd8c6f414c
commit e28d6c4e34
13 changed files with 109 additions and 59 deletions

View File

@ -64,6 +64,10 @@ public class BuyGUI extends GUIMerchant {
int itemPts = price.getPoints();
int transPts = itemPts * amount;
EconUser econUser = EconUser.getUser(player.getUniqueId());
if (econUser == null) {
player.sendMiniMessage(Config.LOADING_ECON_DATA, null);
return;
}
int oldPoints = econUser.getPointsMap().getOrDefault(villagerType.getName(), 0);
double cost = price.calculatePriceThing(oldPoints, transPts, true, itemPts);

View File

@ -65,7 +65,7 @@ public class SellGUI extends GUIMerchant {
private void sell(VillagerType villagerType, Player player, Material material, int amount, Price price, boolean bulk) {
EconUser econUser = EconUser.getUser(player.getUniqueId());
if (econUser == null) {
Utilities.econSyncingMessage(player);
player.sendMiniMessage(Config.LOADING_ECON_DATA, null);
return;
}

View File

@ -44,8 +44,13 @@ public class VillagerUI extends JavaPlugin {
return;
Database.getDatabase().init();
scheduleTasks();
getServer().getMessenger().registerOutgoingPluginChannel(this, "VillagerUI:player-data");
getServer().getMessenger().registerIncomingPluginChannel(this, "VillagerUI:player-data", new PluginMessageListener());
getServer().getMessenger().registerOutgoingPluginChannel(this, "villagerui:player-data");
getServer().getMessenger().registerIncomingPluginChannel(this, "villagerui:player-data", new PluginMessageListener());
if (Config.DEBUG) {
Logger.info("Incoming: %\nOutgoing: %",
getServer().getMessenger().getIncomingChannels().toString(),
getServer().getMessenger().getOutgoingChannels().toString());
}
Logger.info("--------------------------------------------------");
Logger.info("Villager UI started");
Logger.info("--------------------------------------------------");

View File

@ -37,6 +37,11 @@ public class CommandBuy extends SubCommand {
player.sendMiniMessage(getHelpMessage(), null);
return true;
}
EconUser user = EconUser.getUser(player.getUniqueId());
if (user == null) {
player.sendMiniMessage(Config.LOADING_ECON_DATA, null);
return true;
}
Material item = Material.valueOf(args[1].toUpperCase());
Optional<VillagerType> optionalVillagerType = VillagerType.getVillagerTypes().stream()
.filter(villagerType -> villagerType.getBuying().stream()
@ -53,7 +58,6 @@ public class CommandBuy extends SubCommand {
Logger.warning("Price was null despite being impossible to be null");
return true;
}
EconUser user = EconUser.getUser(player.getUniqueId());
Integer curPoints = user.getPointsMap().getOrDefault(villagerType.getName(), 0);
double cost = price.calculatePriceThing(curPoints, price.getPoints(), true, price.getPoints());
player.sendMiniMessage(Config.BUY_ITEM_MESSAGE, TagResolver.resolver(

View File

@ -29,9 +29,13 @@ public class CommandPoints extends SubCommand {
return true;
}
EconUser user = EconUser.getUser(player.getUniqueId());
if (user == null) {
player.sendMiniMessage(Config.LOADING_ECON_DATA, null);
return true;
}
var ref = new Object() {
Component message = miniMessage.deserialize(Config.POINTS_HEADER, TemplateResolver.resolving(
Template.template("player", player.getName())));
Component message = miniMessage.deserialize(Config.POINTS_HEADER, TagResolver.resolver(
Placeholder.unparsed("player", player.getName())));
};
if (args.length == 1) {
Object2ObjectArrayMap<String, Integer> pointsMap = user.getPointsMap();

View File

@ -37,6 +37,11 @@ public class CommandSell extends SubCommand {
player.sendMiniMessage(getHelpMessage(), null);
return true;
}
EconUser user = EconUser.getUser(player.getUniqueId());
if (user == null) {
player.sendMiniMessage(Config.LOADING_ECON_DATA, null);
return true;
}
Material item = Material.valueOf(args[1].toUpperCase());
Optional<VillagerType> optionalVillagerType = VillagerType.getVillagerTypes().stream()
.filter(villagerType -> villagerType.getSelling().stream()
@ -53,7 +58,6 @@ public class CommandSell extends SubCommand {
Logger.warning("Price was null despite being impossible to be null");
return true;
}
EconUser user = EconUser.getUser(player.getUniqueId());
Integer curPoints = user.getPointsMap().getOrDefault(villagerType.getName(), 0);
double cost = price.calculatePriceThing(curPoints, price.getPoints(), false, price.getPoints());
player.sendMiniMessage(Config.SELL_ITEM_MESSAGE, TagResolver.resolver(

View File

@ -117,6 +117,7 @@ public final class Config extends AbstractConfig {
"at your current amount of points (<current_points>).</green>";
public static String NO_SELL_AT_SPAWN = "<red><material> can not be sold to spawn, try a player shop!</red>";
public static String NOT_A_VILLAGER = "<red><villager_type> is not a valid villager type.</red>";
public static String LOADING_ECON_DATA = "<red>Loading your economy data, please wait...</red>";
private static void loadMessages() {
NOT_ENOUGH_MONEY = config.getString("messages.not-enough-money", NOT_ENOUGH_MONEY);
@ -132,6 +133,7 @@ public final class Config extends AbstractConfig {
SELL_ITEM_MESSAGE = config.getString("messages.sell-item-message", SELL_ITEM_MESSAGE);
NO_SELL_AT_SPAWN = config.getString("messages.no-sell-at-spawn", NO_SELL_AT_SPAWN);
NOT_A_VILLAGER = config.getString("messages.not-a-villager", NOT_A_VILLAGER);
LOADING_ECON_DATA = config.getString("messages.loading-econ-data", LOADING_ECON_DATA);
}
public static boolean DEBUG = false;

View File

@ -1,35 +1,13 @@
package com.alttd.events;
import com.alttd.VillagerUI;
import com.alttd.config.Config;
import com.alttd.database.Queries;
import com.alttd.objects.EconUser;
import com.alttd.util.Logger;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.scheduler.BukkitRunnable;
import java.util.UUID;
public class LoginEvent implements Listener {
@EventHandler
public void onPlayerJoin(PlayerJoinEvent event) {
final Player player = event.getPlayer();
//TODO lock user
new BukkitRunnable() {
@Override
public void run() {
UUID uuid = player.getUniqueId();
EconUser user = EconUser.getUser(uuid);
int minutes = Queries.getMinutesSinceUpdated(uuid);
user.removePoints(minutes * 2);
if (Config.DEBUG)
Logger.info("Loaded EconUser for % and removed % points",
player.getName(), String.valueOf(minutes * 2));
}
}.runTask(VillagerUI.getInstance());
EconUser.tryLoadUser(event.getPlayer().getUniqueId());
}
}

View File

@ -1,12 +1,17 @@
package com.alttd.events;
import com.alttd.GUI.GUI;
import com.alttd.VillagerUI;
import com.alttd.config.Config;
import com.alttd.objects.EconUser;
import com.alttd.util.Logger;
import com.google.common.io.ByteArrayDataOutput;
import com.google.common.io.ByteStreams;
import org.bukkit.Bukkit;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.scheduler.BukkitRunnable;
import java.util.UUID;
@ -17,8 +22,17 @@ public class LogoutEvent implements Listener {
if (Config.DEBUG)
Logger.info("Syncing %", event.getPlayer().getName());
EconUser.getUser(uuid).syncPoints();
EconUser.removeUser(uuid);
GUI.GUIByUUID.remove(uuid);
ByteArrayDataOutput out = ByteStreams.newDataOutput();
out.writeUTF("try-unlock");
out.writeUTF(uuid.toString());
Bukkit.getServer().sendPluginMessage(VillagerUI.getInstance(),
"villagerui:player-data",
out.toByteArray());
EconUser user = EconUser.getUser(uuid);
if (user == null)
return;
user.syncPoints();
EconUser.removeUser(uuid);
}
}

View File

@ -1,22 +1,73 @@
package com.alttd.events;
import com.alttd.VillagerUI;
import com.alttd.config.Config;
import com.alttd.database.Queries;
import com.alttd.objects.EconUser;
import com.alttd.util.Logger;
import com.google.common.io.ByteArrayDataInput;
import com.google.common.io.ByteStreams;
import org.bukkit.entity.Player;
import org.bukkit.scheduler.BukkitRunnable;
import org.jetbrains.annotations.NotNull;
import java.util.UUID;
public class PluginMessageListener implements org.bukkit.plugin.messaging.PluginMessageListener {
@Override
public void onPluginMessageReceived(@NotNull String channel, @NotNull Player player, @NotNull byte[] bytes) {
if (!channel.equals("VillagerUI:player-data")) {
if (!channel.equals("villagerui:player-data")) {
Logger.warning("Received plugin message on invalid channel");
return;
}
ByteArrayDataInput in = ByteStreams.newDataInput(bytes);
switch (in.readUTF()) {
case "try-lock-result" -> {
if (!in.readBoolean()) {
Logger.warning("Unable to lock row");
return; //TODO handle
}
UUID uuid = UUID.fromString(in.readUTF());
loadUser(uuid);
}
case "queue-lock-failed" -> Logger.warning("Encountered uuid that was locked and had a lock queued: %, lock is from %", in.readUTF(), in.readUTF());
case "try-unlock-result" -> {
if (in.readBoolean()) {
// ignore?
return;
}
Logger.severe("Unable to unlock %.", in.readUTF());
}
case "locked-queue-lock" -> {
if (!in.readBoolean()) {
Logger.warning("Got false back from locked queue lock");
return; //TODO handle
}
UUID uuid = UUID.fromString(in.readUTF());
loadUser(uuid);
}
case "check-lock-result" -> {
}
}
}
private void loadUser(UUID uuid) {
new BukkitRunnable() {
@Override
public void run() {
EconUser user = Queries.getEconUser(uuid);
int minutes = Queries.getMinutesSinceUpdated(uuid);
user.removePoints(minutes * 2);
if (Config.DEBUG)
Logger.info("Loaded EconUser for % and removed % points",
uuid.toString(), String.valueOf(minutes * 2));
EconUser.addUser(uuid, user);
EconUser.removeQueriedUser(uuid);
}
}.runTaskAsynchronously(VillagerUI.getInstance());
}
}

View File

@ -42,7 +42,7 @@ public class VillagerEvents implements Listener {
}
EconUser user = EconUser.getUser(player.getUniqueId());
if (user == null) {
Utilities.econSyncingMessage(player);
player.sendMiniMessage(Config.LOADING_ECON_DATA, null);
return;
}
new BukkitRunnable() {

View File

@ -30,6 +30,14 @@ public class EconUser {
Logger.info("Created EconUser for: %", uuid.toString());
}
public static void addUser(UUID uuid, EconUser user) {
users.put(uuid, user);
}
public static void removeQueriedUser(UUID uuid) {
queriedUsers.remove(uuid);
}
public UUID getUuid() {
return uuid;
}
@ -116,31 +124,12 @@ public class EconUser {
out.writeUTF("try-lock");
out.writeUTF(uuid.toString());
Bukkit.getServer().sendPluginMessage(VillagerUI.getInstance(),
"VillagerUI:player-data",
"villagerui:player-data",
out.toByteArray());
}
}.runTaskAsynchronously(VillagerUI.getInstance());
}
//Might need to be locked down better?
public static void loadUser(UUID uuid) {
new BukkitRunnable() {
@Override
public void run() {
EconUser user = Queries.getEconUser(uuid);
int minutes = Queries.getMinutesSinceUpdated(uuid);
user.removePoints(minutes * 2);
if (Config.DEBUG)
Logger.info("Loaded EconUser for % and removed % points",
uuid.toString(), String.valueOf(minutes * 2));
EconUser.users.put(uuid, user);
queriedUsers.remove(uuid);
}
}.runTaskAsynchronously(VillagerUI.getInstance());
}
public static void removeUser(UUID uuid) {
users.remove(uuid);
}

View File

@ -138,9 +138,4 @@ public class Utilities {
}
return (price);
}
public static void econSyncingMessage(Player player)
{
player.sendMiniMessage("<red>Syncing econ data...</red>", null);
}
}