Compare commits

..

10 Commits

Author SHA1 Message Date
131d131dfe Trying to fix villager spawn 2024-02-05 22:47:19 +01:00
c9dd268c14 Feat: Change way of handling voids
Only store to database when fetching scoreboard or on disconnect.
else just use the persistentStorage from players
2024-02-04 21:38:28 +01:00
a7a88bb619 Log Voids interaction
This is just in case the server would crash and not save current score.
log can be used to see what was the last score at some point
2024-02-04 21:29:03 +01:00
d92a8c6125 Seend a death message to the webhook 2024-02-04 21:28:26 +01:00
30be45065f Need thevoidmanager.score to execute /void score 2024-02-04 21:27:53 +01:00
f36e6b1aa0 Refactoring 2024-01-31 12:34:04 +01:00
629695ac21 Item drop bug 2024-01-31 12:27:38 +01:00
8bf35896f4 /void manage bring command 2024-01-29 18:25:13 +01:00
1d34a3040d Show Custom Name 2024-01-29 18:23:02 +01:00
af96c5a412 todos 2024-01-27 13:09:58 +01:00
10 changed files with 91 additions and 41 deletions

18
TODO.md
View File

@ -1,13 +1,19 @@
# TODO list # TODO list
- [ ] i18n
- [+] Make Discord Webhoook for item changes
- [x] deathBan reset - [x] deathBan reset
- [x] voids exchanges - [x] voids exchanges
- [x] /void give négatives values - [x] /void give négatives values
- [+] chest name - [x] Make Discord Webhoook for item changes
- [+] Show next Item - [x] chest name
- [ ] /void manage bring - [x] Show next Item
- [ ] Dupe bug (respawn) -> Gamerule - [x] /void manage bring
- [+] /void give afficher title - [+] /void give afficher title
- subtitle + chat - subtitle + chat
- [+] Double Check Inventory reset on die
- [+] Annonce
- [+] Find Map : 51 (250, 300)
- [+] Dupe bug (respawn)
- [-] i18n
- [ ] Events
- [ ] Command completions
- [ ] More descriptive /void commands

View File

@ -20,6 +20,23 @@ public class BanHourly implements Listener{
@EventHandler @EventHandler
public void died(PlayerDeathEvent e){ public void died(PlayerDeathEvent e){
DatabaseManager.getInstance().setDeath(e.getPlayer().getUniqueId()); DatabaseManager.getInstance().setDeath(e.getPlayer().getUniqueId());
e.setKeepInventory(true);
e.setKeepLevel(false);
e.getDrops().clear();
e.getPlayer().kick(Component.text("Vous etes mort dans la dernière heure... Patientez la prochaine!"), Cause.BANNED); e.getPlayer().kick(Component.text("Vous etes mort dans la dernière heure... Patientez la prochaine!"), Cause.BANNED);
// Send death
String link = DatabaseManager.getInstance().getConfig("discord-wh");
if(!link.equals("")){
DiscordWebhook discord = new DiscordWebhook(link);
discord.setUsername("Ange de la mort");
discord.setAvatarUrl("http://static.planetminecraft.com/files/banners/minecraft_banner_18d1g881yg5831c.png");
discord.setContent(e.getDeathMessage());
try {
discord.execute();
} catch(Exception ex){
ex.printStackTrace();
}
}
} }
} }

View File

@ -11,7 +11,6 @@ import java.util.HashMap;
import java.util.UUID; import java.util.UUID;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
public class DatabaseManager { public class DatabaseManager {
@ -68,6 +67,7 @@ public class DatabaseManager {
} }
public void setVoids(UUID uuid, int amount) { public void setVoids(UUID uuid, int amount) {
Bukkit.getLogger().info("[VOIDS] -> " + uuid.toString() + " to " + amount);
try { try {
Statement st = con.createStatement(); Statement st = con.createStatement();
String query = "INSERT OR REPLACE INTO voids (uuid, amount) VALUES (?, ?)"; String query = "INSERT OR REPLACE INTO voids (uuid, amount) VALUES (?, ?)";

View File

@ -1,4 +1,4 @@
package ovh.herisson.thevoidroad.Event; package ovh.herisson.thevoidroad;
import java.time.LocalTime; import java.time.LocalTime;

View File

@ -1,4 +1,4 @@
package ovh.herisson.thevoidroad.Entity; package ovh.herisson.thevoidroad;
import java.io.File; import java.io.File;
import java.nio.file.Files; import java.nio.file.Files;
@ -24,12 +24,6 @@ import org.bukkit.inventory.ItemStack;
import org.bukkit.persistence.PersistentDataType; import org.bukkit.persistence.PersistentDataType;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import ovh.herisson.thevoidroad.DatabaseManager;
import ovh.herisson.thevoidroad.DiscordWebhook;
import ovh.herisson.thevoidroad.TheVoidRoad;
import ovh.herisson.thevoidroad.Voids;
import ovh.herisson.thevoidroad.Event.HourEvent;
import ovh.herisson.thevoidroad.util.Tuple;
//Unique, so singleton patern //Unique, so singleton patern
public class Merchand implements Listener{ public class Merchand implements Listener{
@ -82,13 +76,14 @@ public class Merchand implements Listener{
current = genTrade(System.currentTimeMillis() / (1000 * 60 * 60)); current = genTrade(System.currentTimeMillis() / (1000 * 60 * 60));
next = genTrade(1 + System.currentTimeMillis() / (1000 * 60 * 60)); next = genTrade(1 + System.currentTimeMillis() / (1000 * 60 * 60));
Location center = Bukkit.getWorld("world").getWorldBorder().getCenter(); Location center = Bukkit.getWorld("world").getWorldBorder().getCenter();
double brdSize = Bukkit.getWorld("world").getWorldBorder().getSize(); double brdSize = Bukkit.getWorld("world").getWorldBorder().getSize() - 1;
double x = new Random().nextDouble(brdSize) - brdSize/2, z = new Random().nextDouble(brdSize) - brdSize/2; double x = new Random().nextDouble(brdSize) - brdSize/2, z = new Random().nextDouble(brdSize) - brdSize/2;
m = (Villager) Bukkit.getWorld("world").spawnEntity(center.add(x, 100, z), EntityType.VILLAGER); m = (Villager) Bukkit.getWorld("world").spawnEntity(center.add(x, 200, z), EntityType.VILLAGER);
m.getPersistentDataContainer().set(tagger, PersistentDataType.BOOLEAN, true); m.getPersistentDataContainer().set(tagger, PersistentDataType.BOOLEAN, true);
m.setGlowing(true); m.setGlowing(true);
m.setInvulnerable(true); m.setInvulnerable(true);
m.customName(Component.text(names.get(new Random().nextInt(names.size())))); m.customName(Component.text(names.get(new Random().nextInt(names.size()))));
m.setCustomNameVisible(true);
inv = Bukkit.createInventory(null, 9, Component.text(m.getName())); inv = Bukkit.createInventory(null, 9, Component.text(m.getName()));
Bukkit.getServer().forEachAudience((a) -> { Bukkit.getServer().forEachAudience((a) -> {
if(a instanceof Player ply){ if(a instanceof Player ply){
@ -177,4 +172,8 @@ public class Merchand implements Listener{
} }
} }
} }
public void teleport(Location location) {
m.teleport(location);
}
} }

View File

@ -2,9 +2,9 @@ package ovh.herisson.thevoidroad;
import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.plugin.java.JavaPlugin;
import ovh.herisson.thevoidroad.Commands.VoidCommands; import ovh.herisson.thevoidroad.VoidCommands;
import ovh.herisson.thevoidroad.Entity.Merchand; import ovh.herisson.thevoidroad.Merchand;
import ovh.herisson.thevoidroad.Event.HourEvent; import ovh.herisson.thevoidroad.HourEvent;
public class TheVoidRoad extends JavaPlugin{ public class TheVoidRoad extends JavaPlugin{

View File

@ -1,4 +1,4 @@
package ovh.herisson.thevoidroad.util; package ovh.herisson.thevoidroad;
public class Tuple<X, Y> { public class Tuple<X, Y> {
public final X x; public final X x;

View File

@ -1,4 +1,4 @@
package ovh.herisson.thevoidroad.Commands; package ovh.herisson.thevoidroad;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@ -14,10 +14,6 @@ import org.bukkit.command.TabCompleter;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import ovh.herisson.thevoidroad.DatabaseManager;
import ovh.herisson.thevoidroad.TheVoidRoad;
import ovh.herisson.thevoidroad.Voids;
import ovh.herisson.thevoidroad.Entity.Merchand;
public class VoidCommands implements CommandExecutor, TabCompleter{ public class VoidCommands implements CommandExecutor, TabCompleter{
private final Merchand m = Merchand.getInstance(); private final Merchand m = Merchand.getInstance();
@ -36,10 +32,13 @@ public class VoidCommands implements CommandExecutor, TabCompleter{
} }
switch (args[0]) { switch (args[0]) {
case "score": case "score":
Voids.scoreboard().forEach((p, a) -> { if(!sender.hasPermission("void.score")){
sender.sendMessage(p + " : " + a); Voids.scoreboard().forEach((p, a) -> {
}); sender.sendMessage(p + " : " + a);
return true; });
return true;
}
return false;
case "give": case "give":
if(args.length < 2) return false; if(args.length < 2) return false;
Player target = Bukkit.getPlayer(args[1]); Player target = Bukkit.getPlayer(args[1]);
@ -76,6 +75,14 @@ public class VoidCommands implements CommandExecutor, TabCompleter{
sender.sendMessage("You can't teleport!"); sender.sendMessage("You can't teleport!");
} }
break; break;
case "bring":
if(sender instanceof Player ply && m.getLocation() != null){
m.teleport(ply.getLocation());
}else{
return false;
}
break;
case "balance": case "balance":
if(args.length < 5) return false; if(args.length < 5) return false;
switch (args[2]) { switch (args[2]) {
@ -83,9 +90,6 @@ public class VoidCommands implements CommandExecutor, TabCompleter{
Player target_ = Bukkit.getPlayer(args[3]); Player target_ = Bukkit.getPlayer(args[3]);
Voids.set(target_, Integer.parseInt(args[4])); Voids.set(target_, Integer.parseInt(args[4]));
return true; return true;
case "add":
case "sub":
sender.sendMessage("TODO"); //TODO
} }
return false; return false;
} }
@ -112,10 +116,13 @@ public class VoidCommands implements CommandExecutor, TabCompleter{
ArrayList<String> list = new ArrayList<>(); ArrayList<String> list = new ArrayList<>();
if(args.length == 1){ if(args.length == 1){
list.addAll(List.of("give","event", "score")); list.addAll(List.of("give","event"));
if(sender.hasPermission("void.manage")){ if(sender.hasPermission("void.manage")){
list.add("manage"); list.add("manage");
} }
if(sender.hasPermission("void.score")){
list.add("score");
}
} }
if(args.length >= 2){ if(args.length >= 2){
switch (args[0]) { switch (args[0]) {

View File

@ -5,17 +5,18 @@ import java.util.HashMap;
import java.util.UUID; import java.util.UUID;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.NamespacedKey;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener; import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.persistence.PersistentDataType;
import org.bukkit.scoreboard.Criteria; import org.bukkit.scoreboard.Criteria;
import org.bukkit.scoreboard.DisplaySlot; import org.bukkit.scoreboard.DisplaySlot;
import org.bukkit.scoreboard.Objective; import org.bukkit.scoreboard.Objective;
import org.bukkit.scoreboard.RenderType;
import org.bukkit.scoreboard.Score; import org.bukkit.scoreboard.Score;
import org.bukkit.scoreboard.Scoreboard; import org.bukkit.scoreboard.Scoreboard;
import org.bukkit.scoreboard.ScoreboardManager;
import net.kyori.adventure.bossbar.BossBar; import net.kyori.adventure.bossbar.BossBar;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
@ -25,26 +26,30 @@ import net.kyori.adventure.title.Title;
public final class Voids implements Listener{ public final class Voids implements Listener{
private static HashMap<Player, BossBar> bossbars = new HashMap<>(); private static HashMap<Player, BossBar> bossbars = new HashMap<>();
private static final NamespacedKey voids = new NamespacedKey(TheVoidRoad.instance, "voids");
public static int get(Player ply){ public static int get(Player ply){
if(ply.getPersistentDataContainer().has(voids)){
return ply.getPersistentDataContainer().get(voids, PersistentDataType.INTEGER);
}
return TheVoidRoad.db.getVoids(ply.getUniqueId()); return TheVoidRoad.db.getVoids(ply.getUniqueId());
} }
public static void set(Player ply, int amount){ public static void set(Player ply, int amount){
TheVoidRoad.db.setVoids(ply.getUniqueId(), amount); ply.getPersistentDataContainer().set(voids, PersistentDataType.INTEGER, amount);
UpdateVoids(ply); UpdateVoids(ply);
} }
public static void add(Player ply, int amount){ public static void add(Player ply, int amount){
int curr = DatabaseManager.getInstance().getVoids(ply.getUniqueId()); int curr = get(ply);
DatabaseManager.getInstance().setVoids(ply.getUniqueId(), curr + amount); set(ply, curr + amount);
UpdateVoids(ply); UpdateVoids(ply);
} }
public static boolean subtract(Player ply, int amount, boolean force){ public static boolean subtract(Player ply, int amount, boolean force){
int curr = TheVoidRoad.db.getVoids(ply.getUniqueId()); int curr = get(ply);
if(curr - amount < 0 && !force) return false; if(curr - amount < 0 && !force) return false;
TheVoidRoad.db.setVoids(ply.getUniqueId(), curr - amount); set(ply, curr - amount);
UpdateVoids(ply); UpdateVoids(ply);
return true; return true;
} }
@ -59,7 +64,15 @@ public final class Voids implements Listener{
return true; return true;
} }
public static void save(Player ply){
int curr = get(ply);
TheVoidRoad.db.setVoids(ply.getUniqueId(), curr);
}
public static HashMap<Player, Integer> scoreboard(){ public static HashMap<Player, Integer> scoreboard(){
Bukkit.getServer().forEachAudience(a -> {
if(a instanceof Player ply) save(ply);
});
HashMap<Player, Integer> ret = new HashMap<>(); HashMap<Player, Integer> ret = new HashMap<>();
try { try {
HashMap<UUID, Integer> scores_uuid = TheVoidRoad.db.getVoidsScoreboard(); HashMap<UUID, Integer> scores_uuid = TheVoidRoad.db.getVoidsScoreboard();
@ -95,4 +108,9 @@ public final class Voids implements Listener{
public void UpdateVoids(PlayerJoinEvent e){ public void UpdateVoids(PlayerJoinEvent e){
UpdateVoids(e.getPlayer()); UpdateVoids(e.getPlayer());
} }
@EventHandler
public void SaveToDbBeforeQuit(PlayerQuitEvent e){
save(e.getPlayer());
}
} }

View File

@ -16,6 +16,9 @@ permissions:
void.manage: void.manage:
description: "GameMaster's command" description: "GameMaster's command"
default: op default: op
void.score:
description: "score the voids"
default: op
void.balance: void.balance:
description: "User of thevoidroad" description: "User of thevoidroad"
default: not op default: not op