Implement home, homes, sethome
This commit is contained in:
parent
8d83e07dd4
commit
aebb408e6f
12 changed files with 333 additions and 6 deletions
3
Jenkinsfile
vendored
3
Jenkinsfile
vendored
|
@ -23,7 +23,8 @@ pipeline {
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
chmod +x gradlew
|
chmod +x gradlew
|
||||||
./gradlew build release
|
./gradlew build
|
||||||
|
./gradlew release
|
||||||
'''
|
'''
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,12 +11,12 @@ println "Java version: ${JavaVersion.current()}"
|
||||||
|
|
||||||
static def getTime() {
|
static def getTime() {
|
||||||
SimpleDateFormat sdf = new SimpleDateFormat("yyMMdd-HHmm")
|
SimpleDateFormat sdf = new SimpleDateFormat("yyMMdd-HHmm")
|
||||||
sdf.setTimeZone(TimeZone.getTimeZone("UTC"))
|
sdf.setTimeZone(TimeZone.getTimeZone("MST"))
|
||||||
return sdf.format(new Date()).toString()
|
return sdf.format(new Date()).toString()
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set version to version property if supplied
|
// Set version to version property if supplied
|
||||||
String shortVersion = null
|
String shortVersion = "v1.0"
|
||||||
if (hasProperty('ver')) {
|
if (hasProperty('ver')) {
|
||||||
if (ver.charAt(0) == "v") {
|
if (ver.charAt(0) == "v") {
|
||||||
shortVersion = ver.substring(1).toUpperCase()
|
shortVersion = ver.substring(1).toUpperCase()
|
||||||
|
@ -32,7 +32,7 @@ if (shortVersion == null || shortVersion == "") {
|
||||||
} else if ((rcIdx = shortVersion.indexOf("-RC-")) != -1) {
|
} else if ((rcIdx = shortVersion.indexOf("-RC-")) != -1) {
|
||||||
version = shortVersion.substring(0, rcIdx) + "-SNAPSHOT"
|
version = shortVersion.substring(0, rcIdx) + "-SNAPSHOT"
|
||||||
} else {
|
} else {
|
||||||
version = shortVersion
|
version = shortVersion + "-" + getTime() + "-SNAPSHOT"
|
||||||
}
|
}
|
||||||
|
|
||||||
java {
|
java {
|
||||||
|
@ -78,6 +78,9 @@ processResources {
|
||||||
filesMatching("**/plugin.yml") {
|
filesMatching("**/plugin.yml") {
|
||||||
expand ( NAME: rootProject.name, VERSION: version, PACKAGE: project.group.toString() )
|
expand ( NAME: rootProject.name, VERSION: version, PACKAGE: project.group.toString() )
|
||||||
}
|
}
|
||||||
|
filesMatching("**/paper-plugin.yml") {
|
||||||
|
expand( NAME: rootProject.name, VERSION: version, PACKAGE: project.group.toString())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
shadowJar {
|
shadowJar {
|
||||||
|
|
|
@ -1,15 +1,64 @@
|
||||||
package dev.zontreck.ase;
|
package dev.zontreck.ase;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import org.bukkit.configuration.ConfigurationSection;
|
||||||
|
import org.bukkit.event.Listener;
|
||||||
|
import org.bukkit.event.player.PlayerJoinEvent;
|
||||||
|
import org.bukkit.event.player.PlayerQuitEvent;
|
||||||
import org.bukkit.plugin.java.JavaPlugin;
|
import org.bukkit.plugin.java.JavaPlugin;
|
||||||
|
|
||||||
|
import com.google.common.eventbus.Subscribe;
|
||||||
|
|
||||||
import io.papermc.lib.PaperLib;
|
import io.papermc.lib.PaperLib;
|
||||||
|
|
||||||
public class AriasServerEssentials extends JavaPlugin {
|
public class AriasServerEssentials extends JavaPlugin implements Listener {
|
||||||
|
private static JavaPlugin plugin;
|
||||||
|
private static Map<String, SavedData> cachedPlayerData = new HashMap<>();
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onEnable() {
|
public void onEnable() {
|
||||||
|
plugin = this;
|
||||||
PaperLib.suggestPaper(this);
|
PaperLib.suggestPaper(this);
|
||||||
|
|
||||||
saveDefaultConfig();
|
saveDefaultConfig();
|
||||||
reloadConfig();
|
reloadConfig();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onDisable() {
|
||||||
|
plugin = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static JavaPlugin getSelf() {
|
||||||
|
return plugin;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static SavedData getPlayerData(String playerID) {
|
||||||
|
if (!cachedPlayerData.containsKey(playerID)) {
|
||||||
|
ConfigurationSection cfg = getSelf().getConfig().getConfigurationSection("playerData");
|
||||||
|
SavedData data = SavedData.deserialize(cfg.getConfigurationSection(playerID));
|
||||||
|
cachedPlayerData.put(playerID, data);
|
||||||
|
return data;
|
||||||
|
} else {
|
||||||
|
// Return cached data
|
||||||
|
return cachedPlayerData.get(playerID);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Subscribe
|
||||||
|
public static void onPlayerJoin(PlayerJoinEvent ev) {
|
||||||
|
getPlayerData(ev.getPlayer().getUniqueId().toString()); // Pre-cache it
|
||||||
|
}
|
||||||
|
|
||||||
|
@Subscribe
|
||||||
|
public static void onPlayerLeave(PlayerQuitEvent ev) {
|
||||||
|
// Save the player's data and remove from object cache
|
||||||
|
String id = ev.getPlayer().getUniqueId().toString();
|
||||||
|
SavedData data = getPlayerData(id);
|
||||||
|
data.save(id);
|
||||||
|
|
||||||
|
cachedPlayerData.remove(id);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
58
src/main/java/dev/zontreck/ase/SavedData.java
Normal file
58
src/main/java/dev/zontreck/ase/SavedData.java
Normal file
|
@ -0,0 +1,58 @@
|
||||||
|
package dev.zontreck.ase;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import org.bukkit.configuration.ConfigurationSection;
|
||||||
|
|
||||||
|
import dev.zontreck.ase.homes.Home;
|
||||||
|
|
||||||
|
public class SavedData {
|
||||||
|
public Map<String, Home> homes;
|
||||||
|
|
||||||
|
public SavedData() {
|
||||||
|
homes = new HashMap<>();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void save(String playerID) {
|
||||||
|
// Begin processing save action
|
||||||
|
ConfigurationSection player = AriasServerEssentials.getSelf().getConfig().getConfigurationSection("playerData")
|
||||||
|
.getConfigurationSection(playerID);
|
||||||
|
if (player == null)
|
||||||
|
player = AriasServerEssentials.getSelf().getConfig().getConfigurationSection("playerData")
|
||||||
|
.createSection(playerID);
|
||||||
|
|
||||||
|
ConfigurationSection homes = player.createSection("homes");
|
||||||
|
// Begin serialization
|
||||||
|
for (Map.Entry<String, Home> entry : this.homes.entrySet()) {
|
||||||
|
Home home = entry.getValue();
|
||||||
|
ConfigurationSection h = homes.createSection(home.getName());
|
||||||
|
h.set("name", home.getName());
|
||||||
|
h.set("location", home.getLocation());
|
||||||
|
|
||||||
|
homes.set(home.getName(), h);
|
||||||
|
}
|
||||||
|
player.set("homes", homes);
|
||||||
|
|
||||||
|
// Apply to main configuration
|
||||||
|
AriasServerEssentials.getSelf().getConfig().getConfigurationSection("playerData").set(playerID, player);
|
||||||
|
AriasServerEssentials.getSelf().saveConfig();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static SavedData deserialize(ConfigurationSection section) {
|
||||||
|
SavedData sd = new SavedData();
|
||||||
|
if (section == null)
|
||||||
|
return sd;
|
||||||
|
for (String home : section.getConfigurationSection("homes").getKeys(false)) {
|
||||||
|
ConfigurationSection sect = section.getConfigurationSection("homes").getConfigurationSection(home);
|
||||||
|
Home h = new Home();
|
||||||
|
h.restore(sect);
|
||||||
|
|
||||||
|
sd.homes.put(h.getName(), h);
|
||||||
|
}
|
||||||
|
|
||||||
|
return sd;
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,10 +1,24 @@
|
||||||
package dev.zontreck.ase.commands;
|
package dev.zontreck.ase.commands;
|
||||||
|
|
||||||
|
import com.mojang.brigadier.arguments.StringArgumentType;
|
||||||
|
|
||||||
import io.papermc.paper.command.brigadier.Commands;
|
import io.papermc.paper.command.brigadier.Commands;
|
||||||
|
|
||||||
public class CommandRegistry {
|
public class CommandRegistry {
|
||||||
public static void register(Commands cmds) {
|
public static void register(Commands cmds) {
|
||||||
cmds.register(Commands.literal("homes").requires(x -> x.getSender().hasPermission(HomesCommand.PERMISSION))
|
cmds.register(Commands.literal("homes").requires(x -> x.getSender().hasPermission(HomesCommand.PERMISSION))
|
||||||
.executes(ctx -> HomesCommand.execute(ctx)).build());
|
.executes(ctx -> HomesCommand.execute(ctx)).build());
|
||||||
|
cmds.register(Commands.literal("sethome")
|
||||||
|
.requires(x -> x.getSender().hasPermission(SetHomeCommand.PERMISSION))
|
||||||
|
.executes(ctx -> SetHomeCommand.execute(ctx, "Default"))
|
||||||
|
.then(Commands.argument("name", StringArgumentType.string())
|
||||||
|
.executes(ctx -> SetHomeCommand.execute(ctx, StringArgumentType.getString(ctx, "name"))))
|
||||||
|
.build());
|
||||||
|
cmds.register(Commands.literal("home")
|
||||||
|
.requires(x -> x.getSender().hasPermission(HomeCommand.PERMISSION))
|
||||||
|
.executes(ctx -> HomeCommand.execute(ctx, "Default"))
|
||||||
|
.then(Commands.argument("name", StringArgumentType.string())
|
||||||
|
.executes(ctx -> HomeCommand.execute(ctx, StringArgumentType.getString(ctx, "name"))))
|
||||||
|
.build());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
30
src/main/java/dev/zontreck/ase/commands/HomeCommand.java
Normal file
30
src/main/java/dev/zontreck/ase/commands/HomeCommand.java
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
package dev.zontreck.ase.commands;
|
||||||
|
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
|
import com.mojang.brigadier.Command;
|
||||||
|
import com.mojang.brigadier.context.CommandContext;
|
||||||
|
|
||||||
|
import dev.zontreck.ase.AriasServerEssentials;
|
||||||
|
import dev.zontreck.ase.SavedData;
|
||||||
|
import io.papermc.paper.command.brigadier.CommandSourceStack;
|
||||||
|
import net.md_5.bungee.api.ChatColor;
|
||||||
|
|
||||||
|
public class HomeCommand {
|
||||||
|
public static final String PERMISSION = "ase.commands.home";
|
||||||
|
|
||||||
|
public static int execute(CommandContext<CommandSourceStack> ctx, String homeName) {
|
||||||
|
// We can now teleport to the home
|
||||||
|
Player player = (Player) ctx.getSource().getSender();
|
||||||
|
SavedData data = AriasServerEssentials.getPlayerData(player.getUniqueId().toString());
|
||||||
|
|
||||||
|
if (data.homes.containsKey(homeName)) {
|
||||||
|
data.homes.get(homeName).apply(player);
|
||||||
|
player.sendMessage(ChatColor.DARK_GREEN + "Teleporting home...");
|
||||||
|
} else {
|
||||||
|
player.sendMessage(ChatColor.DARK_RED + "No such home could be found");
|
||||||
|
}
|
||||||
|
|
||||||
|
return Command.SINGLE_SUCCESS;
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,15 +1,41 @@
|
||||||
package dev.zontreck.ase.commands;
|
package dev.zontreck.ase.commands;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
import com.mojang.brigadier.Command;
|
import com.mojang.brigadier.Command;
|
||||||
import com.mojang.brigadier.context.CommandContext;
|
import com.mojang.brigadier.context.CommandContext;
|
||||||
|
|
||||||
|
import dev.zontreck.ase.AriasServerEssentials;
|
||||||
|
import dev.zontreck.ase.homes.Home;
|
||||||
|
import dev.zontreck.ase.utils.PermissionUtils;
|
||||||
import io.papermc.paper.command.brigadier.CommandSourceStack;
|
import io.papermc.paper.command.brigadier.CommandSourceStack;
|
||||||
|
import net.md_5.bungee.api.ChatColor;
|
||||||
|
|
||||||
public class HomesCommand {
|
public class HomesCommand {
|
||||||
public static final String PERMISSION = "ase.commands.homes";
|
public static final String PERMISSION = "ase.commands.homes";
|
||||||
|
|
||||||
public static int execute(CommandContext<CommandSourceStack> ctx) {
|
public static int execute(CommandContext<CommandSourceStack> ctx) {
|
||||||
ctx.getSource().getSender().sendMessage("TEST MESSAGE");
|
// List all Homes in a readable format
|
||||||
|
Player player = (Player) ctx.getSource().getSender();
|
||||||
|
|
||||||
|
// Check player's max homes permission
|
||||||
|
int max = PermissionUtils.getMaxPermission("ase.homes", player);
|
||||||
|
if (max == -1) {
|
||||||
|
max = AriasServerEssentials.getSelf().getConfig().getInt("maxHomes");
|
||||||
|
}
|
||||||
|
|
||||||
|
player.sendMessage(ChatColor.DARK_GREEN + "You have [" + ChatColor.DARK_PURPLE
|
||||||
|
+ AriasServerEssentials.getPlayerData(player.getUniqueId().toString()).homes.size()
|
||||||
|
+ ChatColor.DARK_GREEN
|
||||||
|
+ "/" + max + "] home(s)");
|
||||||
|
|
||||||
|
for (Home home : AriasServerEssentials.getPlayerData(player.getUniqueId().toString()).homes.values()) {
|
||||||
|
player.sendMessage(ChatColor.YELLOW + "Home: " + ChatColor.DARK_GREEN + home.getName());
|
||||||
|
}
|
||||||
|
|
||||||
return Command.SINGLE_SUCCESS;
|
return Command.SINGLE_SUCCESS;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
54
src/main/java/dev/zontreck/ase/commands/SetHomeCommand.java
Normal file
54
src/main/java/dev/zontreck/ase/commands/SetHomeCommand.java
Normal file
|
@ -0,0 +1,54 @@
|
||||||
|
package dev.zontreck.ase.commands;
|
||||||
|
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
|
import com.mojang.brigadier.Command;
|
||||||
|
import com.mojang.brigadier.context.CommandContext;
|
||||||
|
|
||||||
|
import dev.zontreck.ase.AriasServerEssentials;
|
||||||
|
import dev.zontreck.ase.SavedData;
|
||||||
|
import dev.zontreck.ase.homes.Home;
|
||||||
|
import dev.zontreck.ase.utils.PermissionUtils;
|
||||||
|
import io.papermc.paper.command.brigadier.CommandSourceStack;
|
||||||
|
import net.md_5.bungee.api.ChatColor;
|
||||||
|
|
||||||
|
public class SetHomeCommand {
|
||||||
|
public static final String PERMISSION = "ase.commands.sethome";
|
||||||
|
|
||||||
|
public static int execute(CommandContext<CommandSourceStack> ctx, String homeName) {
|
||||||
|
// Check player's home count
|
||||||
|
Player player = (Player) ctx.getSource().getSender();
|
||||||
|
SavedData playerData = AriasServerEssentials.getPlayerData(player.getUniqueId().toString());
|
||||||
|
int count = playerData.homes.size();
|
||||||
|
|
||||||
|
// Check player's max homes permission
|
||||||
|
int max = PermissionUtils.getMaxPermission("ase.homes", player);
|
||||||
|
if (max == -1) {
|
||||||
|
max = AriasServerEssentials.getSelf().getConfig().getInt("maxHomes");
|
||||||
|
}
|
||||||
|
boolean canAddNew = !(count >= max);
|
||||||
|
|
||||||
|
boolean isUpdate = playerData.homes.containsKey(homeName);
|
||||||
|
if (isUpdate) {
|
||||||
|
// Ignore canAddNew, we're only replacing a home
|
||||||
|
Home newHome = Home.fromPlayer(player, homeName);
|
||||||
|
playerData.homes.put(homeName, newHome);
|
||||||
|
} else {
|
||||||
|
if (canAddNew) {
|
||||||
|
Home newHome = Home.fromPlayer(player, homeName);
|
||||||
|
playerData.homes.put(homeName, newHome);
|
||||||
|
} else {
|
||||||
|
player.sendMessage(ChatColor.DARK_RED + "You cannot create any more homes. You are at your maximum of "
|
||||||
|
+ max + " homes.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Save the homes data
|
||||||
|
if (isUpdate || canAddNew) {
|
||||||
|
playerData.save(player.getUniqueId().toString());
|
||||||
|
player.sendMessage(ChatColor.DARK_GREEN + "Home has been created or updated.");
|
||||||
|
}
|
||||||
|
|
||||||
|
return Command.SINGLE_SUCCESS;
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,6 +1,38 @@
|
||||||
package dev.zontreck.ase.homes;
|
package dev.zontreck.ase.homes;
|
||||||
|
|
||||||
|
import org.bukkit.EntityEffect;
|
||||||
|
import org.bukkit.Location;
|
||||||
|
import org.bukkit.configuration.ConfigurationSection;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.potion.PotionEffect;
|
||||||
|
|
||||||
public class Home {
|
public class Home {
|
||||||
String homeName;
|
String homeName;
|
||||||
|
Location location;
|
||||||
|
|
||||||
|
public static Home fromPlayer(Player player, String homeName) {
|
||||||
|
Home h = new Home();
|
||||||
|
|
||||||
|
h.homeName = homeName;
|
||||||
|
h.location = player.getLocation();
|
||||||
|
|
||||||
|
return h;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void restore(ConfigurationSection section) {
|
||||||
|
homeName = section.getString("name");
|
||||||
|
location = section.getLocation("location");
|
||||||
|
}
|
||||||
|
|
||||||
|
public void apply(Player player) {
|
||||||
|
player.teleport(location);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return homeName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Location getLocation() {
|
||||||
|
return location;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
16
src/main/java/dev/zontreck/ase/utils/PermissionUtils.java
Normal file
16
src/main/java/dev/zontreck/ase/utils/PermissionUtils.java
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
package dev.zontreck.ase.utils;
|
||||||
|
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
|
public class PermissionUtils {
|
||||||
|
public static int getMaxPermission(String sNode, Player pPlayer) {
|
||||||
|
int i = 0;
|
||||||
|
int end = 255;
|
||||||
|
for (i = 0; i <= end; i++) {
|
||||||
|
if (pPlayer.isPermissionSet(sNode + "." + i)) {
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,5 @@
|
||||||
|
# Max homes are controlled by permissions, but can be set here too. Set max homes with: ase.homes.[number]
|
||||||
|
maxHomes: 2
|
||||||
|
# DO NOT REMOVE THIS
|
||||||
|
playerData:
|
||||||
|
KEEPME: 0
|
39
src/main/resources/paper-plugin.yml
Normal file
39
src/main/resources/paper-plugin.yml
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
main: ${PACKAGE}.${NAME}
|
||||||
|
name: ${NAME}
|
||||||
|
version: "${VERSION}"
|
||||||
|
api-version: "1.21.1"
|
||||||
|
bootstrapper: dev.zontreck.ase.Bootstrapper
|
||||||
|
author: AUTHOR
|
||||||
|
description: DESCRIPTION
|
||||||
|
commands:
|
||||||
|
home:
|
||||||
|
description: Just click your heels three times.
|
||||||
|
usage: "- /home [optional:name] -"
|
||||||
|
homes:
|
||||||
|
description: Lists all homes
|
||||||
|
usage: "- /homes -"
|
||||||
|
sethome:
|
||||||
|
description: Sets a home position
|
||||||
|
usage: "- /sethome [optional:name] -"
|
||||||
|
delhome:
|
||||||
|
description: Deletes a saved home
|
||||||
|
usage: "- /delhome [optional:name] -"
|
||||||
|
permissions:
|
||||||
|
ase.commands.*:
|
||||||
|
description: Allow all commands
|
||||||
|
default: false
|
||||||
|
children:
|
||||||
|
ase.commands.home: true
|
||||||
|
ase.commands.homes: true
|
||||||
|
ase.commands.home:
|
||||||
|
description: Allows usage of the /home command
|
||||||
|
default: true
|
||||||
|
ase.commands.homes:
|
||||||
|
description: Allows usage of the /homes command
|
||||||
|
default: true
|
||||||
|
ase.commands.sethome:
|
||||||
|
description: Allows usage of /sethome
|
||||||
|
default: true
|
||||||
|
ase.commands.delhome:
|
||||||
|
description: Allows usage of /delhome
|
||||||
|
default: true
|
Loading…
Add table
Add a link
Reference in a new issue