Skip to content

Commit

Permalink
Added the ability to change respawn behavior with the plugin
Browse files Browse the repository at this point in the history
  • Loading branch information
OmerBenGera committed Nov 12, 2022
1 parent de8098a commit b5f50b4
Show file tree
Hide file tree
Showing 8 changed files with 226 additions and 2 deletions.
Expand Up @@ -4,6 +4,7 @@
import com.bgsoftware.superiorskyblock.api.handlers.BlockValuesManager;
import com.bgsoftware.superiorskyblock.api.key.Key;
import com.bgsoftware.superiorskyblock.api.objects.Pair;
import com.bgsoftware.superiorskyblock.api.player.respawn.RespawnAction;
import com.bgsoftware.superiorskyblock.api.wrappers.BlockOffset;
import org.bukkit.Location;
import org.bukkit.World;
Expand Down Expand Up @@ -599,6 +600,12 @@ public interface SettingsManager {
*/
boolean getDeleteUnsafeWarps();

/**
* Get the list of actions to perform when a player respawns.
* Config-path: player-respawn
*/
List<RespawnAction> getPlayerRespawn();

interface Database {

/**
Expand Down
@@ -0,0 +1,84 @@
package com.bgsoftware.superiorskyblock.api.player.respawn;

import com.bgsoftware.superiorskyblock.api.objects.Enumerable;
import com.google.common.base.Preconditions;
import org.bukkit.event.player.PlayerRespawnEvent;

import java.util.Collection;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;

public abstract class RespawnAction implements Enumerable {

private static final Map<String, RespawnAction> respawnActions = new HashMap<>();
private static int ordinalCounter = 0;

private final String name;
private final int ordinal;

protected RespawnAction(String name) {
Preconditions.checkArgument(!respawnActions.containsKey(name), "name already exists.");
this.name = name.toUpperCase(Locale.ENGLISH);
this.ordinal = ordinalCounter++;
}

@Override
public final int ordinal() {
return this.ordinal;
}

/**
* Get the name of the respawn action.
*/
public final String getName() {
return name;
}

@Override
public String toString() {
return "RespawnAction{name=" + name + "}";
}

public abstract boolean canPerform(PlayerRespawnEvent event);

public abstract void perform(PlayerRespawnEvent event);

/**
* Get all the respawn actions.
*/
public static Collection<RespawnAction> values() {
return respawnActions.values();
}

/**
* Get a respawn action by its name.
*
* @param name The name to check.
*/
public static RespawnAction getByName(String name) {
Preconditions.checkNotNull(name, "name parameter cannot be null.");

RespawnAction respawnAction = respawnActions.get(name.toUpperCase(Locale.ENGLISH));

Preconditions.checkNotNull(respawnAction, "Couldn't find an RespawnAction with the name " + name + ".");

return respawnAction;
}

/**
* Register a new respawn action.
*
* @param respawnAction The respawn action to register.
*/
public static void register(RespawnAction respawnAction) {
Preconditions.checkNotNull(respawnAction, "respawnAction parameter cannot be null.");

String name = respawnAction.getName().toUpperCase(Locale.ENGLISH);

Preconditions.checkState(!respawnActions.containsKey(name), "RespawnAction with the name " + name + " already exists.");

respawnActions.put(name, respawnAction);
}

}
Expand Up @@ -72,6 +72,7 @@
import com.bgsoftware.superiorskyblock.nms.NMSWorld;
import com.bgsoftware.superiorskyblock.player.PlayersManagerImpl;
import com.bgsoftware.superiorskyblock.player.container.DefaultPlayersContainer;
import com.bgsoftware.superiorskyblock.player.respawn.RespawnActions;
import com.bgsoftware.superiorskyblock.service.ServicesHandler;
import com.bgsoftware.superiorskyblock.service.bossbar.BossBarsServiceImpl;
import com.bgsoftware.superiorskyblock.service.dragon.DragonBattleServiceImpl;
Expand Down Expand Up @@ -186,6 +187,7 @@ public void onLoad() {
IslandPrivileges.registerPrivileges();
SortingTypes.registerSortingTypes();
IslandFlags.registerFlags();
RespawnActions.registerActions();

try {
SortingComparators.initializeTopIslandMembersSorting();
Expand Down
Expand Up @@ -7,6 +7,7 @@
import com.bgsoftware.superiorskyblock.api.key.KeyMap;
import com.bgsoftware.superiorskyblock.api.key.KeySet;
import com.bgsoftware.superiorskyblock.api.objects.Pair;
import com.bgsoftware.superiorskyblock.api.player.respawn.RespawnAction;
import com.bgsoftware.superiorskyblock.api.wrappers.BlockOffset;
import com.bgsoftware.superiorskyblock.core.SBlockOffset;
import com.bgsoftware.superiorskyblock.core.ServerVersion;
Expand Down Expand Up @@ -39,6 +40,7 @@
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Locale;
import java.util.Map;
Expand Down Expand Up @@ -208,6 +210,7 @@ public class SettingsContainer {
public final TopIslandMembersSorting islandTopMembersSorting;
public final int bossBarLimit;
public final boolean deleteUnsafeWarps;
public final List<RespawnAction> playerRespawnActions;

public SettingsContainer(SuperiorSkyblockPlugin plugin, YamlConfiguration config) throws ManagerLoadException {
databaseType = config.getString("database.type").toUpperCase(Locale.ENGLISH);
Expand Down Expand Up @@ -453,7 +456,7 @@ else if (sections.length == 3)
}
}
} catch (IllegalArgumentException ex) {
Log.warnFromFile("Invalid container type ", container + ", skipping...");
Log.warn("Invalid container type ", container + ", skipping...");
}
}
}
Expand Down Expand Up @@ -528,6 +531,14 @@ else if (sections.length == 3)
this.islandTopMembersSorting = islandTopMembersSorting;
bossBarLimit = config.getInt("bossbar-limit", 1);
deleteUnsafeWarps = config.getBoolean("delete-unsafe-warps", true);
playerRespawnActions = new LinkedList<>();
config.getStringList("player-respawn").forEach(respawnAction -> {
try {
playerRespawnActions.add(RespawnAction.getByName(respawnAction));
} catch (NullPointerException error) {
Log.warn("Invalid respawn action ", respawnAction + ", skipping...");
}
});
}

private List<String> loadInteractables(SuperiorSkyblockPlugin plugin) {
Expand Down
Expand Up @@ -7,6 +7,7 @@
import com.bgsoftware.superiorskyblock.api.handlers.BlockValuesManager;
import com.bgsoftware.superiorskyblock.api.key.Key;
import com.bgsoftware.superiorskyblock.api.objects.Pair;
import com.bgsoftware.superiorskyblock.api.player.respawn.RespawnAction;
import com.bgsoftware.superiorskyblock.config.section.AFKIntegrationsSection;
import com.bgsoftware.superiorskyblock.config.section.DatabaseSection;
import com.bgsoftware.superiorskyblock.config.section.DefaultContainersSection;
Expand Down Expand Up @@ -559,6 +560,11 @@ public boolean getDeleteUnsafeWarps() {
return this.container.deleteUnsafeWarps;
}

@Override
public List<RespawnAction> getPlayerRespawn() {
return this.container.playerRespawnActions;
}

public void updateValue(String path, Object value) throws IOException {
File file = new File(plugin.getDataFolder(), "config.yml");

Expand Down
Expand Up @@ -8,6 +8,7 @@
import com.bgsoftware.superiorskyblock.api.events.IslandUncoopPlayerEvent;
import com.bgsoftware.superiorskyblock.api.island.Island;
import com.bgsoftware.superiorskyblock.api.island.IslandChest;
import com.bgsoftware.superiorskyblock.api.player.respawn.RespawnAction;
import com.bgsoftware.superiorskyblock.api.wrappers.SuperiorPlayer;
import com.bgsoftware.superiorskyblock.core.Materials;
import com.bgsoftware.superiorskyblock.core.Mutable;
Expand All @@ -27,6 +28,7 @@
import com.bgsoftware.superiorskyblock.player.PlayerLocales;
import com.bgsoftware.superiorskyblock.player.SuperiorNPCPlayer;
import com.bgsoftware.superiorskyblock.player.chat.PlayerChat;
import com.bgsoftware.superiorskyblock.player.respawn.RespawnActions;
import com.bgsoftware.superiorskyblock.world.BukkitEntities;
import org.bukkit.Bukkit;
import org.bukkit.GameMode;
Expand All @@ -49,6 +51,7 @@
import org.bukkit.event.player.PlayerLoginEvent;
import org.bukkit.event.player.PlayerMoveEvent;
import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.event.player.PlayerRespawnEvent;
import org.bukkit.event.player.PlayerTeleportEvent;
import org.bukkit.inventory.InventoryHolder;
import org.bukkit.scheduler.BukkitTask;
Expand Down Expand Up @@ -678,5 +681,17 @@ private void onPlayerFall(EntityDamageEvent e) {
e.setCancelled(true);
}

/* PLAYER DEATH */

@EventHandler
private void onPlayerRespawn(PlayerRespawnEvent event) {
for (RespawnAction respawnAction : plugin.getSettings().getPlayerRespawn()) {
if (respawnAction == RespawnActions.VANILLA || respawnAction.canPerform(event)) {
respawnAction.perform(event);
return;
}
}

}

}
@@ -0,0 +1,87 @@
package com.bgsoftware.superiorskyblock.player.respawn;

import com.bgsoftware.superiorskyblock.SuperiorSkyblockPlugin;
import com.bgsoftware.superiorskyblock.api.player.respawn.RespawnAction;
import com.bgsoftware.superiorskyblock.api.wrappers.SuperiorPlayer;
import org.bukkit.entity.Player;
import org.bukkit.event.player.PlayerRespawnEvent;

public class RespawnActions {

private static final SuperiorSkyblockPlugin plugin = SuperiorSkyblockPlugin.getPlugin();

public static final RespawnAction BED_TELEPORT = register(new RespawnAction("BED_TELEPORT") {

@Override
public boolean canPerform(PlayerRespawnEvent event) {
Player player = event.getPlayer();
return player.getBedSpawnLocation() != null;
}

@Override
public void perform(PlayerRespawnEvent event) {
event.setRespawnLocation(event.getPlayer().getBedSpawnLocation());
}

});

public static final RespawnAction ISLAND_TELEPORT = register(new RespawnAction("ISLAND_TELEPORT") {

@Override
public boolean canPerform(PlayerRespawnEvent event) {
SuperiorPlayer superiorPlayer = plugin.getPlayers().getSuperiorPlayer(event.getPlayer());
return superiorPlayer.getIsland() != null;
}

@Override
public void perform(PlayerRespawnEvent event) {
SuperiorPlayer superiorPlayer = plugin.getPlayers().getSuperiorPlayer(event.getPlayer());
assert superiorPlayer.getIsland() != null;
superiorPlayer.teleport(superiorPlayer.getIsland());
}

});

public static final RespawnAction SPAWN_TELEPORT = register(new RespawnAction("SPAWN_TELEPORT") {

@Override
public boolean canPerform(PlayerRespawnEvent event) {
return true;
}

@Override
public void perform(PlayerRespawnEvent event) {
SuperiorPlayer superiorPlayer = plugin.getPlayers().getSuperiorPlayer(event.getPlayer());
superiorPlayer.teleport(plugin.getGrid().getSpawnIsland());
}

});

public static final RespawnAction VANILLA = register(new RespawnAction("VANILLA") {

@Override
public boolean canPerform(PlayerRespawnEvent event) {
return true;
}

@Override
public void perform(PlayerRespawnEvent event) {
// Do nothing, let vanilla do its thing.
}

});

private RespawnActions() {

}

public static void registerActions() {
// Do nothing, only trigger all the register calls
}

private static RespawnAction register(RespawnAction respawnAction) {
RespawnAction.register(respawnAction);
return respawnAction;
}

}
14 changes: 13 additions & 1 deletion src/main/resources/config.yml
Expand Up @@ -782,4 +782,16 @@ bossbar-limit: 1

# Delete unsafe warps when players try to teleport to them automatically.
# If disabled, warps that are unsafe will stay until players manually delete them.
delete-unsafe-warps: true
delete-unsafe-warps: true

# List of actions to perform when a player respawns.
# The plugin will try to perform the actions in the order they are entered here, from top to bottom,
# until one action succeeds. Custom respawn actions can be registered using the API.
# The default available actions:
# BED_TELEPORT - Teleport the player to his bed spawn, if exists.
# ISLAND_TELEPORT - Teleport the player to his own island, if exists.
# SPAWN_TELEPORT - Teleport the player to spawn when he spawns.
# VANILLA - Respawn the player in his vanilla spawn point (bed location or world spawn point).
player-respawn:
- ISLAND_TELEPORT
- SPAWN_TELEPORT

0 comments on commit b5f50b4

Please sign in to comment.