feat: prevent killing in loop the same player getting rewarded

This commit is contained in:
HerozDotExe 2026-02-17 08:42:59 +01:00
parent 034cb40967
commit ca1c6f05c7
3 changed files with 84 additions and 17 deletions

View file

@ -13,15 +13,18 @@ import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.entity.PlayerDeathEvent;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.logging.Logger;
public class DeathListener implements Listener {
private final States states;
private final FileConfiguration config;
private final Logger logger;
public DeathListener(States states, Logger logger, FileConfiguration config) {
this.states = states;
this.config = config;
this.logger = logger;
}
/**
@ -32,29 +35,48 @@ public class DeathListener implements Listener {
Player killed = event.getEntity().getPlayer();
Player killer = event.getEntity().getKiller();
AtomicBoolean isRevenge = new AtomicBoolean(false);
if (killed != null && killer != null && killer.getType().equals(EntityType.PLAYER)) {
if (Bukkit.getPluginManager().isPluginEnabled("PlayerPoints")) {
PlayerPointsAPI pointsAPI = PlayerPoints.getInstance().getAPI();
states.killsHistory.forEach((kr, kd) -> {
if(killed.getUniqueId().toString().equals(kr) && killer.getUniqueId().toString().equals(kd)) {
isRevenge.set(true);
states.killsHistory.updateLastKill(kr, "");
//killer.sendMessage(kr, kd, states.killsHistory.getLastKill(killer), killed.getUniqueId().toString());
}
});
int killedWorth = states.worths.getPlayerWorth(killed);
pointsAPI.give(killer.getUniqueId(), killedWorth);
killer.sendRichMessage(String.format("[SMP4] <gold>You got %s points from killing %s.</gold>", killedWorth, killed.getName()));
states.worths.setPlayerWorth(killed, 0);
killed.sendRichMessage("[SMP4] <gold>Your worth got reset to 0.</gold>");
logger.info(String.format("Revenge : %s, Same kill: %s", isRevenge.get(), !states.killsHistory.getLastKill(killer.getUniqueId().toString()).equals(killed.getUniqueId().toString())));
if (isRevenge.get() || !states.killsHistory.getLastKill(killer.getUniqueId().toString()).equals(killed.getUniqueId().toString())) {
if (Bukkit.getPluginManager().isPluginEnabled("PlayerPoints")) {
PlayerPointsAPI pointsAPI = PlayerPoints.getInstance().getAPI();
// Take money
double money = pointsAPI.look(killed.getUniqueId());
double newMoney = money * ((double) (100 - config.getInt("percentOfMoneyToTakeOnKills")) / 100);
pointsAPI.set(killed.getUniqueId(), (int) newMoney);
killed.sendRichMessage(String.format("[SMP4] <gold>You lost %s%% points from dying to %s.</gold>", money-newMoney, killer));
int killedWorth = states.worths.getPlayerWorth(killed);
pointsAPI.give(killer.getUniqueId(), killedWorth);
killer.sendRichMessage(String.format("[SMP4] <gold>You got %s points from killing %s.</gold>", killedWorth, killed.getName()));
states.worths.setPlayerWorth(killed, 0);
killed.sendRichMessage("[SMP4] <gold>Your worth got reset to 0.</gold>");
states.kdr.increasePlayerDeaths(killed);
killed.sendRichMessage("[SMP4] <gold>Your kdr has been updated.</gold>");
states.kdr.increasePlayerKills(killer);
killer.sendRichMessage("[SMP4] <gold>Your kdr has been updated.</gold>");
// Take money
double money = pointsAPI.look(killed.getUniqueId());
double newMoney = money * ((double) (100 - config.getInt("percentOfMoneyToTakeOnKills")) / 100);
pointsAPI.set(killed.getUniqueId(), (int) newMoney);
killed.sendRichMessage(String.format("[SMP4] <gold>You lost %s%% points from dying to %s.</gold>", money - newMoney, killer));
Utilities.setScore(killed, 0);
states.kdr.increasePlayerDeaths(killed);
killed.sendRichMessage("[SMP4] <gold>Your kdr has been updated.</gold>");
states.kdr.increasePlayerKills(killer);
killer.sendRichMessage("[SMP4] <gold>Your kdr has been updated.</gold>");
Utilities.setScore(killed, 0);
}
} else {
killer.sendRichMessage("[SMP4] <gold>You've killed this player too recently.</gold>");
}
states.killsHistory.updateLastKill(killer.getUniqueId().toString(), killed.getUniqueId().toString());
this.logger.info(states.killsHistory.toString());
}
}

View file

@ -0,0 +1,43 @@
package dev.hrz0.smp4.States;
import org.bukkit.entity.Player;
import java.util.ArrayDeque;
import java.util.HashMap;
//public class KillsHistory extends HashMap<String, ArrayDeque<String>> {
// public ArrayDeque<String> getLastKills(Player killer) {
// if (containsKey(killer.getUniqueId().toString())) {
// return get(killer.getUniqueId().toString());
// } else {
// ArrayDeque<String> empty = new ArrayDeque<>();
// put(killer.getUniqueId().toString(), empty);
// return empty;
// }
// }
//
// public void pushKill(Player killer, Player killed) {
// ArrayDeque<String> killsHistory = getLastKills(killer);
// if (killsHistory.size() == 2) {
// killsHistory.removeLast();
// }
// killsHistory.addFirst(killed.getUniqueId().toString());
// put(killer.getUniqueId().toString(), killsHistory);
// System.out.printf(killsHistory.toString());
// }
//}
public class KillsHistory extends HashMap<String, String> {
public String getLastKill(String killer) {
if (containsKey(killer)) {
return get(killer);
} else {
return "";
}
}
public void updateLastKill(String killer, String killed) {
put(killer, killed);
System.out.printf(getLastKill(killer));
}
}

View file

@ -13,6 +13,7 @@ public class States {
public UsernameCache usernameCache;
public KDR kdr;
public Worths worths;
public KillsHistory killsHistory;
public States(JavaPlugin plugin, Logger logger) throws IOException {
Path statesPath = StatesParser.getStatesPath(plugin);
@ -20,6 +21,7 @@ public class States {
this.usernameCache = new UsernameCache();
this.kdr = new KDR();
this.worths = new Worths();
this.killsHistory = new KillsHistory();
logger.log(Level.INFO, "Saving empty states");
StatesParser.save(statesPath, this);