diff --git a/.idea/.gitignore b/.idea/.gitignore
new file mode 100644
index 0000000..13566b8
--- /dev/null
+++ b/.idea/.gitignore
@@ -0,0 +1,8 @@
+# Default ignored files
+/shelf/
+/workspace.xml
+# Editor-based HTTP Client requests
+/httpRequests/
+# Datasource local storage ignored files
+/dataSources/
+/dataSources.local.xml
diff --git a/.idea/encodings.xml b/.idea/encodings.xml
new file mode 100644
index 0000000..aa00ffa
--- /dev/null
+++ b/.idea/encodings.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
new file mode 100644
index 0000000..82dbec8
--- /dev/null
+++ b/.idea/misc.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 75a3469..44e206b 100644
--- a/pom.xml
+++ b/pom.xml
@@ -6,7 +6,7 @@
com.koopa
lifestealcore
- 1.0.0
+ 1.0.1
jar
LifeStealCore
diff --git a/spigot/url b/spigot/url
index 2a02d41..906699e 100644
--- a/spigot/url
+++ b/spigot/url
@@ -1 +1 @@
-TEST
+https://www.spigotmc.org/resources/lifesteal-core-1-13-1-20-4.121599/
\ No newline at end of file
diff --git a/src/main/java/com/koopa/lifestealcore/listeners/PlayerListener.java b/src/main/java/com/koopa/lifestealcore/listeners/PlayerListener.java
index ce75bb2..1b5bf5e 100644
--- a/src/main/java/com/koopa/lifestealcore/listeners/PlayerListener.java
+++ b/src/main/java/com/koopa/lifestealcore/listeners/PlayerListener.java
@@ -24,6 +24,7 @@ public class PlayerListener implements Listener {
@EventHandler
public void onPlayerJoin(PlayerJoinEvent event) {
Player player = event.getPlayer();
+ // Load their hearts from hearts.yml and update their health
plugin.getHeartManager().updatePlayerMaxHealth(player);
}
@@ -31,20 +32,25 @@ public class PlayerListener implements Listener {
public void onPlayerDeath(PlayerDeathEvent event) {
Player victim = event.getEntity();
Player killer = victim.getKiller();
+ int victimHearts = plugin.getHeartManager().getPlayerHearts(victim);
- if (killer != null && killer != victim) {
- int victimHearts = plugin.getHeartManager().getPlayerHearts(victim);
- int killerHearts = plugin.getHeartManager().getPlayerHearts(killer);
-
- if (victimHearts > plugin.getConfig().getInt("settings.min-hearts")) {
- plugin.getHeartManager().setPlayerHearts(victim, victimHearts - 1);
- plugin.getHeartManager().setPlayerHearts(killer, killerHearts + 1);
- killer.addPotionEffect(new PotionEffect(PotionEffectType.REGENERATION, 100, 1));
- }
+ // Check if this is their last heart
+ if (victimHearts <= 1) {
+ // Ban them but keep minimum health for game mechanics
+ plugin.getBanManager().banPlayer(victim, killer); // Ban with dramatic effect
+ plugin.getHeartManager().setPlayerHearts(victim, 0); // This won't set health to 0
+ return;
}
- // Ban the player
- plugin.getBanManager().banPlayer(victim);
+ // Only lose hearts to player kills
+ if (killer != null && killer != victim) {
+ // PvP death - transfer heart
+ int killerHearts = plugin.getHeartManager().getPlayerHearts(killer);
+ plugin.getHeartManager().setPlayerHearts(victim, victimHearts - 1);
+ plugin.getHeartManager().setPlayerHearts(killer, killerHearts + 1);
+ killer.addPotionEffect(new PotionEffect(PotionEffectType.REGENERATION, 100, 1));
+ }
+ // Non-PvP deaths don't lose hearts unless it was their last heart
}
@EventHandler
diff --git a/src/main/java/com/koopa/lifestealcore/managers/BanManager.java b/src/main/java/com/koopa/lifestealcore/managers/BanManager.java
index 76adaba..4d7e133 100644
--- a/src/main/java/com/koopa/lifestealcore/managers/BanManager.java
+++ b/src/main/java/com/koopa/lifestealcore/managers/BanManager.java
@@ -125,15 +125,32 @@ public class BanManager {
Bukkit.broadcastMessage(MessageUtils.color("&c&lBANISHED TO THE SHADOW REALM"));
Bukkit.broadcastMessage("");
- // Ban the player
+ // Add to banned players list
+ bannedPlayers.put(player.getUniqueId(), true);
+ banData.set(player.getUniqueId().toString() + ".name", player.getName());
+ banData.set(player.getUniqueId().toString() + ".banTime", System.currentTimeMillis());
+ saveBanData();
+
+ // Ban and kick the player
Bukkit.getScheduler().runTaskLater(plugin, () -> {
+ // Ban the player
+ Bukkit.getBanList(BanList.Type.NAME).addBan(
+ player.getName(),
+ MessageUtils.color(
+ "&c&lYOU HAVE BEEN BANISHED!\n\n" +
+ "&7You have lost all your hearts...\n" +
+ "&7Other players must use a Revival Beacon to bring you back!"
+ ),
+ null, // No expiry
+ "LifeSteal System"
+ );
+
+ // Kick them with the message
player.kickPlayer(MessageUtils.color(
"&c&lYOU HAVE BEEN BANISHED!\n\n" +
"&7You have lost all your hearts...\n" +
- "&7Find a Revival Beacon to return!"
+ "&7Other players must use a Revival Beacon to bring you back!"
));
- plugin.getConfig().set("banned-players." + player.getUniqueId(), true);
- plugin.saveConfig();
}, 2L); // Small delay for dramatic effect
}
diff --git a/src/main/java/com/koopa/lifestealcore/managers/HeartManager.java b/src/main/java/com/koopa/lifestealcore/managers/HeartManager.java
index 121b152..ef4eb7c 100644
--- a/src/main/java/com/koopa/lifestealcore/managers/HeartManager.java
+++ b/src/main/java/com/koopa/lifestealcore/managers/HeartManager.java
@@ -36,6 +36,17 @@ public class HeartManager {
}
}
data = YamlConfiguration.loadConfiguration(dataFile);
+
+ // Load all saved hearts into memory
+ for (String uuidString : data.getKeys(false)) {
+ try {
+ UUID uuid = UUID.fromString(uuidString);
+ int hearts = data.getInt(uuidString);
+ playerHearts.put(uuid, hearts);
+ } catch (IllegalArgumentException e) {
+ plugin.getLogger().warning("Invalid UUID in hearts.yml: " + uuidString);
+ }
+ }
}
public void saveAllData() {
@@ -54,18 +65,43 @@ public class HeartManager {
}
public int getPlayerHearts(Player player) {
- return playerHearts.getOrDefault(player.getUniqueId(),
- plugin.getConfig().getInt("settings.default-hearts"));
+ UUID uuid = player.getUniqueId();
+ if (!playerHearts.containsKey(uuid)) {
+ // If player doesn't have hearts saved, give them default hearts
+ int defaultHearts = plugin.getConfig().getInt("settings.default-hearts");
+ playerHearts.put(uuid, defaultHearts);
+ savePlayerHearts(uuid);
+ }
+ return playerHearts.get(uuid);
}
public void setPlayerHearts(Player player, int hearts) {
- playerHearts.put(player.getUniqueId(), hearts);
- updatePlayerMaxHealth(player);
+ UUID uuid = player.getUniqueId();
+ // Ensure minimum of 1 health for game mechanics
+ hearts = Math.max(0, hearts);
+ playerHearts.put(uuid, hearts);
+ savePlayerHearts(uuid);
+
+ if (hearts > 0) {
+ updatePlayerMaxHealth(player);
+ }
+ }
+
+ private void savePlayerHearts(UUID uuid) {
+ // Save to hearts.yml immediately when changed
+ data.set(uuid.toString(), playerHearts.get(uuid));
+ try {
+ data.save(dataFile);
+ } catch (Exception e) {
+ plugin.getLogger().severe("Could not save hearts data!");
+ e.printStackTrace();
+ }
}
public void updatePlayerMaxHealth(Player player) {
int hearts = getPlayerHearts(player);
- player.setMaxHealth(hearts * 2);
+ // Minimum of 1 health (0.5 hearts) for the game
+ player.setMaxHealth(Math.max(1, hearts * 2));
}
public void setHearts(UUID uuid, int hearts) {
diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml
index bb263ef..7d773dd 100644
--- a/src/main/resources/plugin.yml
+++ b/src/main/resources/plugin.yml
@@ -1,5 +1,5 @@
name: LifeStealCore
-version: '1.0.0'
+version: '1.0.1'
main: com.koopa.lifestealcore.LifeStealCore
api-version: '1.13'
author: Koopa
diff --git a/version/versioncheck b/version/versioncheck
index 3eefcb9..7f20734 100644
--- a/version/versioncheck
+++ b/version/versioncheck
@@ -1 +1 @@
-1.0.0
+1.0.1
\ No newline at end of file