Skip to content

Instantly share code, notes, and snippets.

@Andrewcpu
Created April 24, 2022 21:53
Show Gist options
  • Save Andrewcpu/412d2a6966fc467aaf8d5f9fefe656ab to your computer and use it in GitHub Desktop.
Save Andrewcpu/412d2a6966fc467aaf8d5f9fefe656ab to your computer and use it in GitHub Desktop.
package net.andrewcpu.worldstar;
import org.apache.commons.io.FileUtils;
import org.bukkit.*;
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.plugin.java.JavaPlugin;
import org.bukkit.potion.PotionEffect;
import java.io.File;
import java.io.IOException;
public class WorldStarDriver extends JavaPlugin implements Listener {
/*
* THIS IS INCOMPLETE!
* YOU WILL NEED TO ADD A MECHANISM FOR REMEMBERING IF A PLAYER WHO IS JOINING HAS PLAYED ON THE CURRENT HARDCORE WORLD
* (YOU NEED TO MAKE SURE YOU CLEAR THEIR INVENTORY IF THEY WEREN'T ONLINE WHEN THE SERVER RESET.)
* YOU ALSO NEED TO MAKE SURE TO TELEPORT THEM INTO THE HARDCORE WORLD IF THEY WERE IN "WORLD" WHEN THEY DISCONNECTED.
*
* THE CODE BELOW IS PROVIDED AS IS, AND IS ONLY MEANT TO BE AN EXAMPLE OF UNLOADING A WORLD, DELETING IT,
* AND REGENERATING IT WHILE THE SERVER IS RUNNING
*
* -Andrewcpu
*/
public void onEnable() {
getServer().getPluginManager().registerEvents(this, this);
if(getWorld("hardcore") == null){
createWorld("hardcore");
}
}
@EventHandler
public void onDeath(PlayerDeathEvent event){
death();
}
@EventHandler
public void onDamage(EntityDamageEvent event){
if(event.getEntity() instanceof Player){
if(((Player) event.getEntity()).getHealth() - event.getFinalDamage() <= 0){
event.setCancelled(true);
death();
}
}
}
private void reset(){
World world = getWorld("hardcore");
getServer().unloadWorld(world, false);
deleteDirectory(world.getWorldFolder());
createWorld("hardcore");
}
public void death(){
moveToVoid();
Bukkit.getScheduler().scheduleSyncDelayedTask(this, () -> {
reset();
exitTheVoid();
}, 100);
}
public void moveToVoid(){
for(Player p : Bukkit.getOnlinePlayers()){
p.setGameMode(GameMode.SPECTATOR);
p.teleport(getWorld("world").getSpawnLocation());
p.sendTitle("Creating a new world...", "This will only be a moment", 20 * 2, 20 * 5, 20 * 2);
}
}
public void exitTheVoid(){
for(Player player : Bukkit.getOnlinePlayers()){
player.getInventory().clear();
player.getEquipment().clear();
player.setHealth(20);
player.setSaturation(5);
player.setFoodLevel(20);
for (PotionEffect effect : player.getActivePotionEffects()) {
player.removePotionEffect(effect.getType());
}
player.setGameMode(GameMode.SURVIVAL);
player.teleport(getWorld("hardcore").getSpawnLocation());
}
}
boolean deleteDirectory(File directoryToBeDeleted) {
try {
FileUtils.deleteDirectory(directoryToBeDeleted);
} catch (IOException e) {
e.printStackTrace();
}
return directoryToBeDeleted.delete();
}
private World getWorld(String worldName) {
return Bukkit.getWorlds().stream().filter(w -> w.getName().equals(worldName)).findFirst().orElse(null);
}
private World createWorld(String worldName) {
WorldCreator wc = new WorldCreator(worldName);
wc.environment(World.Environment.NORMAL);
wc.type(WorldType.NORMAL);
wc.hardcore(true);
return wc.createWorld();
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment