implements new death logic to disable the vanilla death screen

This commit is contained in:
Mika 2025-05-18 21:52:29 +02:00
parent be5f91df88
commit 5c1868ab82
4 changed files with 106 additions and 6 deletions

View File

@ -13,7 +13,6 @@ import org.bukkit.command.CommandExecutor;
import org.bukkit.event.Listener;
import org.bukkit.plugin.java.JavaPlugin;
import java.io.File;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.HashSet;
@ -32,13 +31,13 @@ public final class SurvivalGames extends JavaPlugin {
plugin = this;
new ConfigManager(this);
PlayerRepository playerRepository = new PlayerRepository();
/*PlayerRepository playerRepository = new PlayerRepository();
PlayerEntity player = new PlayerEntity(0L, "Mika", 1, 2, 3, 4, 5);
playerRepository.save(player).thenRun(() -> {
Bukkit.getScheduler().runTask(plugin, () -> {
Bukkit.broadcastMessage("Spieler Gepseichert!");
});
});
});*/
register();
}

View File

@ -24,7 +24,7 @@ public class MainMenu extends Menu {
menu.addButton(
new SGButton(
new ItemBuilder(Material.ANVIL).name("Settings").build()
).withListener(e -> GuiManager.getInstance().openInventory(Bukkit.getPlayer(e.getWhoClicked().getUniqueId()), WorldMenu.class))
).withListener(e -> GuiManager.getInstance().openInventory(Bukkit.getPlayer(e.getWhoClicked().getUniqueId()), SettingsMenu.class))
);
}
}

View File

@ -3,8 +3,10 @@ package de.polyfish0.survivalGames.gui.menus;
import com.samjakob.spigui.buttons.SGButton;
import com.samjakob.spigui.item.ItemBuilder;
import com.samjakob.spigui.menu.SGMenu;
import de.polyfish0.survivalGames.config.ConfigValues;
import de.polyfish0.survivalGames.gui.GuiManager;
import lombok.Getter;
import org.bukkit.Bukkit;
import org.bukkit.Material;
@Getter
@ -13,5 +15,13 @@ public class SettingsMenu extends Menu {
public SettingsMenu() {
menu = GuiManager.getSpiGui().create("Settings", 3);
menu.addButton(
new SGButton(new ItemBuilder(Material.PAPER).name("Max Worldboarder size").build())
.withListener(e -> GuiManager.getInstance().openSettingInAnvilGui(ConfigValues.Game.MAXWORLDRADIUS, Bukkit.getPlayer(e.getWhoClicked().getUniqueId()), "Max Worldborder size"))
);
menu.addButton(
new SGButton(new ItemBuilder(Material.PAPER).name("Min Worldboarder size").build())
.withListener(e -> GuiManager.getInstance().openSettingInAnvilGui(ConfigValues.Game.MAXWORLDRADIUS, Bukkit.getPlayer(e.getWhoClicked().getUniqueId()), "Max Worldborder size"))
);
}
}

View File

@ -2,17 +2,27 @@ package de.polyfish0.survivalGames.managers;
import de.polyfish0.survivalGames.SurvivalGames;
import de.polyfish0.survivalGames.annotations.EventClass;
import de.polyfish0.survivalGames.config.ConfigManager;
import de.polyfish0.survivalGames.config.ConfigValues;
import de.polyfish0.survivalGames.events.StartGameEvent;
import lombok.Getter;
import org.apache.commons.io.FileUtils;
import org.bukkit.Bukkit;
import org.bukkit.GameMode;
import org.bukkit.World;
import org.bukkit.WorldCreator;
import org.bukkit.damage.DamageType;
import org.bukkit.entity.Entity;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.ExperienceOrb;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.entity.EntityDamageEvent;
import org.bukkit.event.entity.PlayerDeathEvent;
import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause;
import org.bukkit.inventory.ItemStack;
import java.io.File;
import java.io.IOException;
@Getter
@ -25,15 +35,96 @@ public class GameManager implements Listener {
if (world != null) {
world.getPlayers().forEach(p -> p.teleport(Bukkit.getWorlds().getFirst().getSpawnLocation(), TeleportCause.PLUGIN));
Bukkit.unloadWorld(world, false);
try {
FileUtils.deleteDirectory(world.getWorldFolder());
} catch (IOException ex) {
throw new RuntimeException(ex);
}
world = null;
}
world = SurvivalGames.plugin.getServer().createWorld(new WorldCreator("sg_map"));
world = Bukkit.createWorld(new WorldCreator("sg_map"));
if(world == null) {
e.getExecutor().sendMessage(SurvivalGames.prefix + "Could not generate the world!");
return;
}
world.getWorldBorder().setCenter(world.getSpawnLocation());
world.getWorldBorder().setSize(((Integer) ConfigManager.getInstance().getValue(ConfigValues.Game.MAXWORLDRADIUS)) * 2);
Bukkit.getOnlinePlayers().forEach(p -> p.teleport(world.getSpawnLocation(), TeleportCause.PLUGIN));
}
@EventHandler
public void onPlayerDeath(EntityDamageEvent e) {
if(!(e.getEntity() instanceof Player))
return;
Player p = (Player) e.getEntity();
if((p.getHealth() - e.getFinalDamage()) > 0)
return;
e.setCancelled(true);
for(ItemStack is : p.getInventory().getContents()) {
if(is == null)
continue;
p.getWorld().dropItem(p.getLocation().add(0, 1, 0), is);
}
p.getInventory().clear();
int playerExp = getPlayerExp(p);
if(playerExp > 0) {
ExperienceOrb orb = (ExperienceOrb) p.getWorld().spawnEntity(p.getLocation().add(0, 1, 0), EntityType.EXPERIENCE_ORB);
orb.setExperience(playerExp);
p.setLevel(0);
}
p.setGameMode(GameMode.SPECTATOR);
String damageReason;
if(e.getDamageSource().getCausingEntity() != null)
damageReason = e.getDamageSource().getCausingEntity().getName();
else
damageReason = "stupidity";
Bukkit.broadcastMessage(SurvivalGames.prefix + p.getDisplayName() + " got killed by " + damageReason);
}
public int getPlayerExp(Player player){
int exp = 0;
int level = player.getLevel();
// Get the amount of XP in past levels
exp += getExpAtLevel(level);
// Get amount of XP towards next level
exp += Math.round(getExpToLevelUp(level) * player.getExp());
return exp;
}
public int getExpAtLevel(int level){
if(level <= 16){
return (int) (Math.pow(level, 2) + 6 * level);
} else if(level <= 31){
return (int) (2.5 * Math.pow(level, 2) - 40.5 * level + 360.0);
} else {
return (int) (4.5 * Math.pow(level, 2) - 162.5 * level + 2220.0);
}
}
public int getExpToLevelUp(int level){
if(level <= 15){
return 2 * level + 7;
} else if(level <= 30){
return 5 * level - 38;
} else {
return 9 * level - 158;
}
}
}