Started work on using data-lock for database queries
This commit is contained in:
parent
82fbe5370c
commit
bd8c6f414c
|
|
@ -63,15 +63,19 @@ public class SellGUI extends GUIMerchant {
|
||||||
}
|
}
|
||||||
|
|
||||||
private void sell(VillagerType villagerType, Player player, Material material, int amount, Price price, boolean bulk) {
|
private void sell(VillagerType villagerType, Player player, Material material, int amount, Price price, boolean bulk) {
|
||||||
PlayerInventory inventory = player.getInventory();
|
EconUser econUser = EconUser.getUser(player.getUniqueId());
|
||||||
|
if (econUser == null) {
|
||||||
|
Utilities.econSyncingMessage(player);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
PlayerInventory inventory = player.getInventory();
|
||||||
if (bulk)
|
if (bulk)
|
||||||
amount = Arrays.stream(inventory.getContents())
|
amount = Arrays.stream(inventory.getContents())
|
||||||
.filter(Objects::nonNull)
|
.filter(Objects::nonNull)
|
||||||
.filter(itemStack -> itemStack.getType().equals(material))
|
.filter(itemStack -> itemStack.getType().equals(material))
|
||||||
.mapToInt(ItemStack::getAmount).sum();
|
.mapToInt(ItemStack::getAmount).sum();
|
||||||
|
|
||||||
EconUser econUser = EconUser.getUser(player.getUniqueId());
|
|
||||||
int oldPoints = econUser.getPointsMap().getOrDefault(villagerType.getName(), 0);
|
int oldPoints = econUser.getPointsMap().getOrDefault(villagerType.getName(), 0);
|
||||||
int itemPts = price.getPoints();
|
int itemPts = price.getPoints();
|
||||||
int transPts = (itemPts * amount) * -1;
|
int transPts = (itemPts * amount) * -1;
|
||||||
|
|
|
||||||
|
|
@ -44,6 +44,8 @@ public class VillagerUI extends JavaPlugin {
|
||||||
return;
|
return;
|
||||||
Database.getDatabase().init();
|
Database.getDatabase().init();
|
||||||
scheduleTasks();
|
scheduleTasks();
|
||||||
|
getServer().getMessenger().registerOutgoingPluginChannel(this, "VillagerUI:player-data");
|
||||||
|
getServer().getMessenger().registerIncomingPluginChannel(this, "VillagerUI:player-data", new PluginMessageListener());
|
||||||
Logger.info("--------------------------------------------------");
|
Logger.info("--------------------------------------------------");
|
||||||
Logger.info("Villager UI started");
|
Logger.info("Villager UI started");
|
||||||
Logger.info("--------------------------------------------------");
|
Logger.info("--------------------------------------------------");
|
||||||
|
|
|
||||||
|
|
@ -74,7 +74,7 @@ public class Queries {
|
||||||
} catch (SQLException e) {
|
} catch (SQLException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
return (null);
|
return (new EconUser(uuid, new Object2ObjectArrayMap<>()));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
|
|
@ -17,6 +17,7 @@ public class LoginEvent implements Listener {
|
||||||
@EventHandler
|
@EventHandler
|
||||||
public void onPlayerJoin(PlayerJoinEvent event) {
|
public void onPlayerJoin(PlayerJoinEvent event) {
|
||||||
final Player player = event.getPlayer();
|
final Player player = event.getPlayer();
|
||||||
|
//TODO lock user
|
||||||
new BukkitRunnable() {
|
new BukkitRunnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
|
|
|
||||||
22
src/main/java/com/alttd/events/PluginMessageListener.java
Normal file
22
src/main/java/com/alttd/events/PluginMessageListener.java
Normal file
|
|
@ -0,0 +1,22 @@
|
||||||
|
package com.alttd.events;
|
||||||
|
|
||||||
|
import com.alttd.util.Logger;
|
||||||
|
import com.google.common.io.ByteArrayDataInput;
|
||||||
|
import com.google.common.io.ByteStreams;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
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")) {
|
||||||
|
Logger.warning("Received plugin message on invalid channel");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
ByteArrayDataInput in = ByteStreams.newDataInput(bytes);
|
||||||
|
switch (in.readUTF()) {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -7,7 +7,10 @@ import com.alttd.config.VillagerConfig;
|
||||||
import com.alttd.objects.EconUser;
|
import com.alttd.objects.EconUser;
|
||||||
import com.alttd.objects.LoadedVillagers;
|
import com.alttd.objects.LoadedVillagers;
|
||||||
import com.alttd.objects.VillagerType;
|
import com.alttd.objects.VillagerType;
|
||||||
|
import com.alttd.util.Utilities;
|
||||||
|
import jdk.jshell.execution.Util;
|
||||||
import org.bukkit.entity.EntityType;
|
import org.bukkit.entity.EntityType;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
import org.bukkit.entity.Villager;
|
import org.bukkit.entity.Villager;
|
||||||
import org.bukkit.event.EventHandler;
|
import org.bukkit.event.EventHandler;
|
||||||
import org.bukkit.event.Listener;
|
import org.bukkit.event.Listener;
|
||||||
|
|
@ -31,19 +34,25 @@ public class VillagerEvents implements Listener {
|
||||||
if (loadedVillager == null)
|
if (loadedVillager == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
Player player = event.getPlayer();
|
||||||
event.setCancelled(true);
|
event.setCancelled(true);
|
||||||
if (!event.getPlayer().hasPermission(loadedVillager.getPermission())) {
|
if (!player.hasPermission(loadedVillager.getPermission())) {
|
||||||
event.getPlayer().sendMiniMessage(Config.NO_PERMISSION, null); //TODO more specific message?
|
player.sendMiniMessage(Config.NO_PERMISSION, null); //TODO more specific message?
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
EconUser user = EconUser.getUser(player.getUniqueId());
|
||||||
|
if (user == null) {
|
||||||
|
Utilities.econSyncingMessage(player);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
new BukkitRunnable() {
|
new BukkitRunnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
OpenGUI openGUI = new OpenGUI(loadedVillager, EconUser.getUser(event.getPlayer().getUniqueId()));
|
OpenGUI openGUI = new OpenGUI(loadedVillager, user);
|
||||||
new BukkitRunnable() {
|
new BukkitRunnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
openGUI.open(event.getPlayer());
|
openGUI.open(player);
|
||||||
}
|
}
|
||||||
}.runTask(VillagerUI.getInstance());
|
}.runTask(VillagerUI.getInstance());
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -4,13 +4,16 @@ import com.alttd.VillagerUI;
|
||||||
import com.alttd.config.Config;
|
import com.alttd.config.Config;
|
||||||
import com.alttd.database.Queries;
|
import com.alttd.database.Queries;
|
||||||
import com.alttd.util.Logger;
|
import com.alttd.util.Logger;
|
||||||
|
import com.google.common.io.ByteArrayDataOutput;
|
||||||
|
import com.google.common.io.ByteStreams;
|
||||||
import it.unimi.dsi.fastutil.objects.Object2ObjectArrayMap;
|
import it.unimi.dsi.fastutil.objects.Object2ObjectArrayMap;
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
import org.bukkit.scheduler.BukkitRunnable;
|
import org.bukkit.scheduler.BukkitRunnable;
|
||||||
import org.jetbrains.annotations.Unmodifiable;
|
import org.jetbrains.annotations.Unmodifiable;
|
||||||
|
|
||||||
import java.util.Collections;
|
import java.io.ByteArrayOutputStream;
|
||||||
import java.util.List;
|
import java.util.*;
|
||||||
import java.util.UUID;
|
|
||||||
|
|
||||||
public class EconUser {
|
public class EconUser {
|
||||||
|
|
||||||
|
|
@ -96,13 +99,46 @@ public class EconUser {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//Can return null
|
||||||
public static EconUser getUser(UUID uuid) {
|
public static EconUser getUser(UUID uuid) {
|
||||||
EconUser user = users.get(uuid);
|
return (users.get(uuid));
|
||||||
if (user == null) {
|
}
|
||||||
user = Queries.getEconUser(uuid);
|
|
||||||
EconUser.users.put(uuid, user);
|
private static HashSet<UUID> queriedUsers = new HashSet<>();
|
||||||
}
|
public static void tryLoadUser(UUID uuid) {
|
||||||
return (user);
|
if (queriedUsers.contains(uuid) && !users.containsKey(uuid))
|
||||||
|
return;
|
||||||
|
queriedUsers.add(uuid);
|
||||||
|
new BukkitRunnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
ByteArrayDataOutput out = ByteStreams.newDataOutput();
|
||||||
|
out.writeUTF("try-lock");
|
||||||
|
out.writeUTF(uuid.toString());
|
||||||
|
Bukkit.getServer().sendPluginMessage(VillagerUI.getInstance(),
|
||||||
|
"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) {
|
public static void removeUser(UUID uuid) {
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,7 @@ import com.alttd.objects.Price;
|
||||||
import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
|
import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.Material;
|
import org.bukkit.Material;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
import org.bukkit.inventory.*;
|
import org.bukkit.inventory.*;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
@ -137,4 +138,9 @@ public class Utilities {
|
||||||
}
|
}
|
||||||
return (price);
|
return (price);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void econSyncingMessage(Player player)
|
||||||
|
{
|
||||||
|
player.sendMiniMessage("<red>Syncing econ data...</red>", null);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user