Created
April 24, 2022 21:53
-
-
Save Andrewcpu/412d2a6966fc467aaf8d5f9fefe656ab to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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