Update from Git Manager GUI

This commit is contained in:
2026-02-03 23:01:11 +01:00
parent df472b51aa
commit e76f3bc0e2
49 changed files with 2995 additions and 0 deletions

View File

@@ -0,0 +1,77 @@
/*
* Hotels Bukkit Plugin
* Copyright (C) 2019 mviper
* Full licence text can be found in LICENCE file
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published
* by the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
*/
package mviper.plugin.hotels.bukkit;
import mviper.plugin.hotels.core.commands.CommandDelegator;
import mviper.plugin.hotels.core.exceptions.HotelsException;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.command.TabCompleter;
import org.bukkit.entity.Player;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class CommandListener implements CommandExecutor, TabCompleter {
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
try {
Player player = sender instanceof Player ? (Player) sender : null;
if (args.length == 0) {
CommandDelegator.delegate("", new String[0], player);
} else {
String[] subArgs = Arrays.copyOfRange(args, 1, args.length);
CommandDelegator.delegate(args[0], subArgs, player);
}
} catch (HotelsException he) {
Messaging.send(he.getMessage(), sender);
if (he.isPrintCommandUsage() && he.getCommandUsage() != null) {
Messaging.send(he.getCommandUsage(), sender);
}
if (he.isPrintStackTrace()) {
he.printStackTrace();
}
return false;
}
return true;
}
@Override
public List<String> onTabComplete(CommandSender sender, Command command, String alias, String[] args) {
Player player = sender instanceof Player ? (Player) sender : null;
if (args.length == 0) {
return new ArrayList<>();
} else if (args.length == 1) {
return CommandDelegator.getPrimaryCommandLabels();
} else {
String[] subArgs = Arrays.copyOfRange(args, 1, args.length);
return CommandDelegator.tabComplete(args[0], subArgs, player);
}
}
}

View File

@@ -0,0 +1,46 @@
/*
* Hotels Bukkit Plugin
* Copyright (C) 2019 mviper
* Full licence text can be found in LICENCE file
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published
* by the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package mviper.plugin.hotels.bukkit;
import java.nio.file.Path;
/**
* Handles loading and saving of YAML files
*/
public class ConfigAdapter {
//TODO implement methods
/**
* Extracts a yml file from resources to the plugin folder
* @param name The name of the file in the resources folder
*/
void setupConfig(String name) {
}
HotelsConfiguration getConfig(Path path) {
return null;
}
void saveConfig(HotelsConfiguration config) {
}
}

View File

@@ -0,0 +1,51 @@
package mviper.plugin.hotels.bukkit;
import mviper.plugin.hotels.core.exceptions.BruhMoment;
import net.milkbowl.vault.economy.Economy;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.plugin.RegisteredServiceProvider;
import java.math.BigDecimal;
public class EconomyAdapter {
private Economy economy;
public void initialise() {
RegisteredServiceProvider<Economy> registration =
Bukkit.getServer().getServicesManager().getRegistration(Economy.class);
if (registration == null) {
throw new BruhMoment(); // TODO make and handle this exception properly
}
economy = registration.getProvider();
}
public String getCurrencyNameSingular() {
return economy.currencyNameSingular();
}
public String getCurrencyNamePlural() {
return economy.currencyNamePlural();
}
public BigDecimal getBalance(Player player) {
return BigDecimal.valueOf(economy.getBalance(player));
}
/**
* Attempts to withdraw amount from player account
* @param player Player whose account we will be acting on
* @param amount Amount to withdraw
* @return Whether we were able to withdraw amount
*/
public boolean withdrawAmount(Player player, BigDecimal amount) {
return economy.withdrawPlayer(player, amount.doubleValue()).transactionSuccess();
}
public String formatCurrency(BigDecimal amount) {
return economy.format(amount.doubleValue());
}
}

View File

@@ -0,0 +1,164 @@
/*
* Hotels Bukkit Plugin
* Copyright (C) 2019 mviper
* Full licence text can be found in LICENCE file
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published
* by the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package mviper.plugin.hotels.bukkit;
import org.bukkit.configuration.file.YamlConfiguration;
import java.util.*;
/**
* YAML Configuration handler
*/
public class HotelsConfiguration {
private final YamlConfiguration config;
public HotelsConfiguration(YamlConfiguration config) {
this.config = config;
}
public String getCurrentPath() {
return config.getCurrentPath();
}
public String getName() {
return config.getName();
}
public Set<String> getKeys(boolean deep) {
return config.getKeys(deep);
}
public Map<String, Object> getValues(boolean deep) {
return config.getValues(deep);
}
public boolean contains(String path) {
return config.contains(path);
}
public boolean contains(String path, boolean ignoreDefault) {
return config.contains(path, ignoreDefault);
}
public boolean isSet(String path) {
return config.isSet(path);
}
public Object get(String path) {
return config.get(path);
}
public Object get(String path, Object def) {
return config.get(path, def);
}
public String getString(String path) {
return config.getString(path);
}
public String getString(String path, String def) {
return config.getString(path, def);
}
public int getInt(String path) {
return config.getInt(path);
}
public int getInt(String path, int def) {
return config.getInt(path, def);
}
public boolean getBoolean(String path) {
return config.getBoolean(path);
}
public boolean getBoolean(String path, boolean def) {
return config.getBoolean(path, def);
}
public double getDouble(String path) {
return config.getDouble(path);
}
public double getDouble(String path, double def) {
return config.getDouble(path, def);
}
public long getLong(String path) {
return config.getLong(path);
}
public long getLong(String path, long def) {
return config.getLong(path, def);
}
@SuppressWarnings("unchecked")
public <T> List<T> getList(String path) {
return (List<T>) config.getList(path);
}
@SuppressWarnings("unchecked")
public <T> List<T> getList(String path, List<T> def) {
return (List<T>) config.getList(path, def);
}
public List<String> getStringList(String path) {
return config.getStringList(path);
}
public List<Integer> getIntegerList(String path) {
return config.getIntegerList(path);
}
public List<Boolean> getBooleanList(String path) {
return config.getBooleanList(path);
}
public List<Double> getDoubleList(String path) {
return config.getDoubleList(path);
}
public List<Float> getFloatList(String path) {
return config.getFloatList(path);
}
public List<Long> getLongList(String path) {
return config.getLongList(path);
}
public List<Byte> getByteList(String path) {
return config.getByteList(path);
}
public List<Character> getCharacterList(String path) {
return config.getCharacterList(path);
}
public List<Short> getShortList(String path) {
return config.getShortList(path);
}
public <T> T getObject(String path, Class<T> clazz) {
return config.getObject(path, clazz);
}
public <T> T getObject(String path, Class<T> clazz, T def) {
return config.getObject(path, clazz, def);
}
}

View File

@@ -0,0 +1,70 @@
/*
* Hotels Bukkit Plugin
* Copyright (C) 2019 mviper
* Full licence text can be found in LICENCE file
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published
* by the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
*/
package mviper.plugin.hotels.bukkit;
import mviper.plugin.hotels.core.database.HotelsQuery;
import org.bukkit.command.PluginCommand;
import org.bukkit.plugin.java.JavaPlugin;
import org.bstats.bukkit.Metrics;
import java.util.concurrent.CompletableFuture;
public class HotelsMain extends JavaPlugin {
@Override
public void onEnable() {
getLogger().info("Hotels v" + getDescription().getVersion() + " has been enabled");
// Initialize bstats
setupMetrics();
PluginCommand hotelsCommand = getCommand("hotels");
CommandListener commandListener = new CommandListener();
if (hotelsCommand != null) {
hotelsCommand.setExecutor(commandListener);
hotelsCommand.setTabCompleter(commandListener);
}
CompletableFuture.runAsync(this::loadJPA);
}
@Override
public void onDisable() {
unloadJPA();
getLogger().info("Hotels v" + getDescription().getVersion() + " has been disabled");
}
private void setupMetrics() {
Metrics metrics = new Metrics(this, 29264);
getLogger().info("bstats metrics initialized");
}
private void loadJPA() {
// For JPA classloader to work correctly
Thread.currentThread().setContextClassLoader(getClassLoader());
HotelsQuery.initialise();
getLogger().info("Loaded JPA Connection");
}
private void unloadJPA() {
HotelsQuery.closeEntityManagerFactory();
}
}

View File

@@ -0,0 +1,66 @@
/*
* Hotels Bukkit Plugin
* Copyright (C) 2019 mviper
* Full licence text can be found in LICENCE file
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published
* by the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package mviper.plugin.hotels.bukkit;
import org.bukkit.Bukkit;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
public final class Messaging {
private Messaging() {
// Utility class
}
/**
* Send a message to a player, or console if null
* @param message Message to send
* @param player Player the message should be sent to
*/
public static void send(String message, Player player) {
if (player != null) {
player.sendMessage(message);
} else {
Bukkit.getLogger().info(message);
}
}
public static void send(String message, CommandSender sender) {
if (sender instanceof Player player) {
send(message, player);
} else {
send(message, (Player) null);
}
}
/**
* Sends a debug message to a player, if debug is enabled
* @param message Message to send
* @param player Player the message should be sent to
*/
public static void debug(String message, Player player) {
//TODO if debug enabled
send(prependDebug(message), player);
}
private static String prependDebug(String message) {
return "[DEBUG] " + message;
}
}

View File

@@ -0,0 +1,16 @@
package mviper.plugin.hotels.bukkit;
import org.bukkit.Bukkit;
import java.util.UUID;
public final class Utilities {
private Utilities() {
// Utility class
}
public static UUID worldNameToId(String name) {
org.bukkit.World world = Bukkit.getWorld(name);
return world != null ? world.getUID() : null;
}
}

View File

@@ -0,0 +1,145 @@
/*
* Hotels Bukkit Plugin
* Copyright (C) 2020 mviper
* Full licence text can be found in LICENCE file
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published
* by the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package mviper.plugin.hotels.core.commands;
import com.google.common.collect.ImmutableSet;
import mviper.plugin.hotels.bukkit.Messaging;
import mviper.plugin.hotels.core.commands.arguments.HotelsCommandArgumentOptionality;
import mviper.plugin.hotels.core.commands.subcommands.CreateHotelCommand;
import mviper.plugin.hotels.core.commands.subcommands.HotelsHelpCommand;
import mviper.plugin.hotels.core.commands.subcommands.ListAllHotelsCommand;
import mviper.plugin.hotels.core.commands.subcommands.ListHotelsInWorldCommand;
import mviper.plugin.hotels.core.exceptions.BruhMoment;
import mviper.plugin.hotels.core.exceptions.HotelsException;
import mviper.plugin.hotels.core.exceptions.NoPermissionException;
import mviper.plugin.hotels.core.exceptions.NotEnoughArgumentsException;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import java.util.*;
import java.util.stream.Collectors;
/**
* Delegates hotels subcommands to correct handler class
*/
public final class CommandDelegator {
private static final Map<String, Set<HotelsCommand>> hotelsCommands = new HashMap<>();
private static final List<String> primaryCommands = new ArrayList<>();
// primary alias of each subcommand
public static List<String> getPrimaryCommandLabels() {
return new ArrayList<>(primaryCommands);
}
static {
// Various versions of the same command with different arguments are grouped together
Set<Set<HotelsCommand>> sets = ImmutableSet.of(
ImmutableSet.of(new ListHotelsInWorldCommand(), new ListAllHotelsCommand()), // sort by highest amount of args first
ImmutableSet.of(new CreateHotelCommand()),
ImmutableSet.of(new HotelsHelpCommand())
);
for (Set<HotelsCommand> set : sets) {
HotelsCommand firstCommand = set.iterator().next();
String[] labels = firstCommand.getLabels();
primaryCommands.add(labels[0]);
for (String label : labels) {
hotelsCommands.put(label, set);
}
}
}
private CommandDelegator() {
// Utility class
}
public static void delegate(String subcommand, String[] args, Player player) {
Messaging.send("Subcommand: " + subcommand, player);
if (hotelsCommands.containsKey(subcommand)) {
Set<HotelsCommand> hotelsCommandSet = hotelsCommands.get(subcommand);
//Go through this set in order, and only throw no permission error if none can be run
boolean ranSuccessfully = false;
HotelsException lastException = new BruhMoment();
if (hotelsCommandSet == null) {
throw lastException;
}
for (HotelsCommand hotelsCommand : hotelsCommandSet) {
try {
hotelsCommand.acceptAndExecute(args, player); //Try to run command
ranSuccessfully = true; //If it didn't go to catch clause, the command ran, so we can break here
break;
} catch (NotEnoughArgumentsException e) {
lastException = e; //Save last thrown exception, to show user most relevant error
} catch (NoPermissionException e) {
lastException = e;
}
}
if (!ranSuccessfully) {
throw lastException;
}
} else {
Messaging.send("Hotels subcommand not recognised!", player);
}
}
/**
* Provide suggestions for tab complete feature
*/
public static List<String> tabComplete(String subcommand, String[] args, Player player) {
List<String> suggestions = new ArrayList<>();
if (!hotelsCommands.containsKey(subcommand)) {
return suggestions;
}
Set<HotelsCommand> hotelsCommandSet = hotelsCommands.get(subcommand);
if (hotelsCommandSet == null) {
return suggestions;
}
for (HotelsCommand hotelsCommand : hotelsCommandSet) {
// match each provided argument as far as possible
var argument = hotelsCommand.nextMissingArgument(args);
if (argument == null) {
return suggestions;
}
return switch (argument.getOptionality()) {
case PLAYER_NAME -> Bukkit.getOnlinePlayers().stream()
.map(Player::getName)
.collect(Collectors.toList());
case WORLD_NAME -> Bukkit.getWorlds().stream()
.map(org.bukkit.World::getName)
.collect(Collectors.toList());
default -> suggestions;
};
}
return suggestions;
}
}

View File

@@ -0,0 +1,160 @@
/*
* Hotels Bukkit Plugin
* Copyright (C) 2020 mviper
* Full licence text can be found in LICENCE file
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published
* by the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package mviper.plugin.hotels.core.commands;
import mviper.plugin.hotels.core.commands.arguments.HotelsCommandArgument;
import mviper.plugin.hotels.core.commands.arguments.HotelsCommandArgumentOptionality;
import mviper.plugin.hotels.core.exceptions.NoPermissionException;
import mviper.plugin.hotels.core.exceptions.NotEnoughArgumentsException;
import mviper.plugin.hotels.core.permissions.HotelsPermission;
import org.bukkit.entity.Player;
import java.util.Iterator;
import java.util.Set;
import java.util.concurrent.CompletableFuture;
/**
* A subcommand of the /hotels command
*/
public abstract class HotelsCommand {
private final String[] labels;
private final Set<HotelsCommandArgument> arguments;
private final HotelsPermission permission;
public HotelsCommand(String[] labels, Set<HotelsCommandArgument> arguments, HotelsPermission permission) {
this.labels = labels;
this.arguments = arguments;
this.permission = permission;
}
/**
* Check if the player has permission to execute the command
* @param player Player executing the command
* @return Whether the player can execute this command
*/
private boolean hasPermission(Player player) {
return permission.checkPermission(player);
}
/**
* Gets next argument the subcommand is expecting
*/
public HotelsCommandArgument nextMissingArgument(String[] args) {
Iterator<HotelsCommandArgument> argumentsIterator = arguments.iterator();
HotelsCommandArgument argument = null;
for (int i = 0; i < args.length; i++) {
if (argumentsIterator.hasNext()) {
argument = argumentsIterator.next();
} else {
return null;
}
}
return argument;
}
/**
* Accepts subcommand arguments and sets them accordingly
* @param args The arguments for the subcommand, excluding the subcommand label itself
* @param player The player who sent the command, for inferring of optional arguments
*/
private void acceptArguments(String[] args, Player player) {
Iterator<HotelsCommandArgument> argumentsIterator = arguments.iterator();
int argIndex = 0;
while (argumentsIterator.hasNext()) {
HotelsCommandArgument argument = argumentsIterator.next();
if (argIndex < args.length) {
argument.setValue(args[argIndex]);
argIndex++;
} else {
// Argument must be inferred from player
if (player == null) {
throw new NotEnoughArgumentsException(getUsage());
}
switch (argument.getOptionality()) {
case PLAYER_NAME -> argument.setValue(player.getName());
case WORLD_NAME -> argument.setValue(player.getWorld().getName());
default -> throw new NotEnoughArgumentsException(getUsage());
}
}
System.out.println("Args value " + argument.getValue());
}
}
/**
* Accepts subcommand arguments and executes the command
* @param args The arguments for the subcommand, excluding the subcommand label itself
* @param player The player who sent the command, for optional arguments inferring
*/
public void acceptAndExecute(String[] args, Player player) {
acceptArguments(args, player);
if (hasPermission(player)) {
CompletableFuture.runAsync(() -> execute(player));
} else {
throw new NoPermissionException();
}
}
/**
* Execute the subcommand
*/
public abstract void execute(Player player);
protected HotelsCommandArgument getArgument(int index) {
return arguments.toArray(new HotelsCommandArgument[0])[index];
}
public String getUsage() {
StringBuilder usageString = new StringBuilder("/ht ");
for (int i = 0; i < labels.length; i++) {
usageString.append(labels[i]);
if (labels.length > 1 && i < labels.length - 1) {
usageString.append("|");
}
}
for (HotelsCommandArgument arg : arguments) {
if (arg.getOptionality() == HotelsCommandArgumentOptionality.FALSE) {
usageString.append(" <").append(arg.getSuggestion()).append(">");
} else {
usageString.append(" [").append(arg.getSuggestion()).append("]");
}
}
return usageString.toString();
}
public String[] getLabels() {
return labels;
}
public Set<HotelsCommandArgument> getArguments() {
return arguments;
}
public HotelsPermission getPermission() {
return permission;
}
}

View File

@@ -0,0 +1,75 @@
/*
* Hotels Bukkit Plugin
* Copyright (C) 2019 mviper
* Full licence text can be found in LICENCE file
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published
* by the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package mviper.plugin.hotels.core.commands.arguments;
/**
* Represents an argument to a subcommand of the /hotels command
*/
public class HotelsCommandArgument {
private final HotelsCommandArgumentOptionality optionality;
/**
* Label suggested if the command syntax is entered wrongly
*/
private final String suggestion;
/**
* The input the user entered for this argument
*/
private String value;
public HotelsCommandArgument(HotelsCommandArgumentOptionality optionality, String suggestion) {
this.optionality = optionality;
this.suggestion = suggestion;
}
/**
* Get the status, whether an input was given and the argument is optional
* @return The status, depending on the input and optionality
*/
public HotelsCommandArgumentStatus getStatus() {
if (hasInput()) {
return HotelsCommandArgumentStatus.FULL;
} else if (optionality == HotelsCommandArgumentOptionality.TRUE) {
return HotelsCommandArgumentStatus.IGNORE;
} else {
return HotelsCommandArgumentStatus.EMPTY;
}
}
private boolean hasInput() {
return value != null && !value.isEmpty();
}
public HotelsCommandArgumentOptionality getOptionality() {
return optionality;
}
public String getSuggestion() {
return suggestion;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}

View File

@@ -0,0 +1,42 @@
/*
* Hotels Bukkit Plugin
* Copyright (C) 2019 mviper
* Full licence text can be found in LICENCE file
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published
* by the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package mviper.plugin.hotels.core.commands.arguments;
/**
* Whether a HotelsCommandArgument is optional, and what kind of optionality
*/
public enum HotelsCommandArgumentOptionality {
/**
* The argument is optional
*/
TRUE,
/**
* The argument is not optional
*/
FALSE,
/**
* The argument is optional for player as it can be inferred
*/
PLAYER_NAME,
/**
* The argument is optional for players as it can be inferred
*/
WORLD_NAME
}

View File

@@ -0,0 +1,17 @@
package mviper.plugin.hotels.core.commands.arguments;
/**
* Defines certain requirements a hotels subcommand argument must meet before being run
* These include being owner or renter of the specified room or hotel etc.
*/
public class HotelsCommandArgumentRequirements {
private final HotelsCommandArgumentRequirementsEnum requirement;
public HotelsCommandArgumentRequirements(HotelsCommandArgumentRequirementsEnum requirement) {
this.requirement = requirement;
}
public HotelsCommandArgumentRequirementsEnum getRequirement() {
return requirement;
}
}

View File

@@ -0,0 +1,5 @@
package mviper.plugin.hotels.core.commands.arguments;
public enum HotelsCommandArgumentRequirementsEnum {
OWNER, RENTER, HELPER, FRIEND
}

View File

@@ -0,0 +1,38 @@
/*
* Hotels Bukkit Plugin
* Copyright (C) 2019 mviper
* Full licence text can be found in LICENCE file
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published
* by the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package mviper.plugin.hotels.core.commands.arguments;
/**
* The current status of a HotelsCommandArgument
*/
public enum HotelsCommandArgumentStatus {
/**
* An input was given
*/
FULL,
/**
* No input given, and it is required
*/
EMPTY,
/**
* Input not given but not required
*/
IGNORE
}

View File

@@ -0,0 +1,78 @@
/*
* Hotels Bukkit Plugin
* Copyright (C) 2020 mviper
* Full licence text can be found in LICENCE file
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published
* by the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package mviper.plugin.hotels.core.commands.subcommands;
import com.google.common.collect.ImmutableSet;
import com.sk89q.worldedit.bukkit.BukkitAdapter;
import mviper.plugin.hotels.core.commands.HotelsCommand;
import mviper.plugin.hotels.core.commands.arguments.HotelsCommandArgument;
import mviper.plugin.hotels.core.commands.arguments.HotelsCommandArgumentOptionality;
import mviper.plugin.hotels.core.events.HotelCreateEvent;
import mviper.plugin.hotels.core.exceptions.InvalidHotelException;
import mviper.plugin.hotels.core.exceptions.PlayerOnlyException;
import mviper.plugin.hotels.core.hotel.Hotel;
import mviper.plugin.hotels.core.hotel.HotelOwner;
import mviper.plugin.hotels.core.permissions.HotelsPermission;
import mviper.plugin.hotels.core.regions.HotelRegion;
import mviper.plugin.hotels.core.regions.RegionManager;
import com.sk89q.worldguard.protection.regions.ProtectedRegion;
import org.bukkit.entity.Player;
public class CreateHotelCommand extends HotelsCommand {
public CreateHotelCommand() {
super(
new String[]{"create", "c"},
ImmutableSet.of(new HotelsCommandArgument(HotelsCommandArgumentOptionality.FALSE, "name")),
new HotelsPermission("hotels.create")
);
}
@Override
public void execute(Player player) {
if (player == null) {
throw new PlayerOnlyException();
}
String hotelName = getArgument(0).getValue();
if (hotelName == null) {
throw new InvalidHotelException();
}
var world = player.getWorld();
player.sendMessage("Creating hotel " + hotelName);
// TODO PRECONDITIONS:
// player must have a region selected
// region must not intersect already existing hotel regions
// must not intersect regions with custom flag (no hotels)
// they must have enough money to create hotel, (money scaling with size of region?)
// must not own more than max hotels owned
HotelOwner hotelOwner = new HotelOwner(player.getUniqueId());
Hotel hotel = new Hotel(hotelOwner, world.getUID().toString(), hotelName);
String hotelId = hotel.getId().toString();
ProtectedRegion protectedRegion = RegionManager.getProtectedRegion(player, hotelId);
hotel.setHotelRegion(new HotelRegion(BukkitAdapter.adapt(world), hotelId, protectedRegion));
new HotelCreateEvent(hotel).call();
}
}

View File

@@ -0,0 +1,46 @@
/*
* Hotels Bukkit Plugin
* Copyright (C) 2020 mviper
* Full licence text can be found in LICENCE file
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published
* by the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package mviper.plugin.hotels.core.commands.subcommands;
import mviper.plugin.hotels.bukkit.Messaging;
import mviper.plugin.hotels.core.commands.CommandDelegator;
import mviper.plugin.hotels.core.commands.HotelsCommand;
import mviper.plugin.hotels.core.permissions.HotelsPermission;
import org.bukkit.entity.Player;
import java.util.Collections;
public class HotelsHelpCommand extends HotelsCommand {
public HotelsHelpCommand() {
super(
new String[]{"help", ""},
Collections.emptySet(),
new HotelsPermission("hotels.help")
);
}
@Override
public void execute(Player player) {
for (String label : CommandDelegator.getPrimaryCommandLabels()) {
Messaging.send(label, player);
}
}
}

View File

@@ -0,0 +1,35 @@
package mviper.plugin.hotels.core.commands.subcommands;
import mviper.plugin.hotels.bukkit.Messaging;
import mviper.plugin.hotels.core.commands.HotelsCommand;
import mviper.plugin.hotels.core.database.HotelsQuery;
import mviper.plugin.hotels.core.hotel.Hotel;
import mviper.plugin.hotels.core.permissions.HotelsPermission;
import org.bukkit.entity.Player;
import java.util.LinkedHashSet;
import java.util.List;
public class ListAllHotelsCommand extends HotelsCommand {
public ListAllHotelsCommand() {
super(
new String[]{"hotellist", "hlist", "list"},
new LinkedHashSet<>(),
new HotelsPermission("hotels.hotellist.all")
);
}
@Override
public void execute(Player player) {
List<Hotel> resultList = HotelsQuery.getAll(Hotel.class);
if (resultList.isEmpty()) {
Messaging.send("No hotels found at all!", player);
} else {
for (Hotel hotel : resultList) {
Messaging.send("Hotel: " + hotel.getHotelName(), player);
}
}
}
}

View File

@@ -0,0 +1,73 @@
/*
* Hotels Bukkit Plugin
* Copyright (C) 2020 mviper
* Full licence text can be found in LICENCE file
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published
* by the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package mviper.plugin.hotels.core.commands.subcommands;
import com.google.common.collect.ImmutableSet;
import mviper.plugin.hotels.bukkit.Messaging;
import mviper.plugin.hotels.bukkit.Utilities;
import mviper.plugin.hotels.core.commands.HotelsCommand;
import mviper.plugin.hotels.core.commands.arguments.HotelsCommandArgument;
import mviper.plugin.hotels.core.commands.arguments.HotelsCommandArgumentOptionality;
import mviper.plugin.hotels.core.database.HotelsQuery;
import mviper.plugin.hotels.core.exceptions.WorldNonExistentException;
import mviper.plugin.hotels.core.hotel.Hotel;
import mviper.plugin.hotels.core.permissions.HotelsPermission;
import org.bukkit.entity.Player;
import java.util.List;
import java.util.UUID;
/**
* Lists the hotels in all/given world(s)
*/
public class ListHotelsInWorldCommand extends HotelsCommand {
public ListHotelsInWorldCommand() {
super(
new String[]{"hotellist", "hlist", "list"},
ImmutableSet.of(new HotelsCommandArgument(HotelsCommandArgumentOptionality.WORLD_NAME, "world")),
new HotelsPermission("hotels.hotellist.world")
);
}
@Override
public void execute(Player player) {
String worldName = getArgument(0).getValue();
if (worldName == null) {
throw new WorldNonExistentException(getUsage());
}
UUID worldId = Utilities.worldNameToId(worldName);
if (worldId == null) {
throw new WorldNonExistentException(getUsage());
}
String queryString = "SELECT h FROM Hotel h WHERE hotelWorldId='" + worldId.toString() + "'";
List<Hotel> resultList = HotelsQuery.runSelectQuery(queryString, Hotel.class);
if (resultList.isEmpty()) {
Messaging.send("No hotels found in this world!", player);
} else {
for (Hotel hotel : resultList) {
Messaging.send("Hotel: " + hotel.getHotelName(), player); //TODO make pages when too many results
}
}
}
}

View File

@@ -0,0 +1,59 @@
/*
* Hotels Bukkit Plugin
* Copyright (C) 2020 mviper
* Full licence text can be found in LICENCE file
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published
* by the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package mviper.plugin.hotels.core.database;
import jakarta.persistence.EntityManager;
import jakarta.persistence.EntityManagerFactory;
import jakarta.persistence.Persistence;
import java.util.List;
public final class HotelsQuery {
private static EntityManagerFactory entityManagerFactory;
private HotelsQuery() {
// Utility class
}
public static void initialise() {
entityManagerFactory = Persistence.createEntityManagerFactory("HotelsPU");
}
public static EntityManager getEntityManager() {
return entityManagerFactory.createEntityManager();
}
public static void closeEntityManagerFactory() {
entityManagerFactory.close();
}
public static <T> List<T> getAll(Class<T> clazz) {
String className = clazz.getSimpleName();
String queryString = "SELECT a FROM " + className + " a";
return runSelectQuery(queryString, clazz);
}
public static <T> List<T> runSelectQuery(String typedQuery, Class<T> clazz) {
EntityManager entityManager = getEntityManager();
List<T> resultList = entityManager.createQuery(typedQuery, clazz).getResultList();
entityManager.close();
return resultList;
}
}

View File

@@ -0,0 +1,90 @@
/*
* Hotels Bukkit Plugin
* Copyright (C) 2020 mviper
* Full licence text can be found in LICENCE file
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published
* by the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package mviper.plugin.hotels.core.database;
import mviper.plugin.hotels.core.exceptions.WorldNonExistentException;
import mviper.plugin.hotels.core.hotel.Hotel;
import mviper.plugin.hotels.core.hotel.HotelOwner;
import org.bukkit.Bukkit;
import org.bukkit.World;
import jakarta.persistence.EntityManager;
import jakarta.persistence.EntityTransaction;
import java.util.*;
public final class QueryTest {
private QueryTest() {
// Utility class
}
public static List<Hotel> getAllHotels() {
return HotelsQuery.runSelectQuery("SELECT h FROM Hotel h", Hotel.class);
}
public static List<HotelOwner> getAllOwners() {
return HotelsQuery.runSelectQuery("SELECT o FROM HotelOwner o", HotelOwner.class);
}
public static void addOwner() {
HotelOwner owner = new HotelOwner(UUID.randomUUID());
EntityManager entityManager = HotelsQuery.getEntityManager();
EntityTransaction transaction = entityManager.getTransaction();
try {
transaction.begin();
entityManager.persist(owner);
transaction.commit();
} catch (Exception e) {
transaction.rollback();
e.printStackTrace();
}
entityManager.close();
}
public static void addHotel() {
HotelOwner owner = new HotelOwner(UUID.randomUUID());
World world = Bukkit.getWorld("world");
if (world == null) {
throw new WorldNonExistentException("test");
}
Hotel hotel = new Hotel(
owner,
world.getUID().toString(),
"Test"
);
EntityManager entityManager = HotelsQuery.getEntityManager();
EntityTransaction transaction = entityManager.getTransaction();
try {
transaction.begin();
entityManager.persist(owner);
entityManager.persist(hotel);
transaction.commit();
} catch (Exception e) {
transaction.rollback();
e.printStackTrace();
}
entityManager.close();
}
}

View File

@@ -0,0 +1,38 @@
/*
* Hotels Bukkit Plugin
* Copyright (C) 2020 mviper
* Full licence text can be found in LICENCE file
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published
* by the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package mviper.plugin.hotels.core.events;
import mviper.plugin.hotels.core.hotel.Hotel;
public class HotelCreateEvent extends HotelsEvent {
private Hotel hotel;
public HotelCreateEvent(Hotel hotel) {
this.hotel = hotel;
}
public Hotel getHotel() {
return hotel;
}
public void setHotel(Hotel hotel) {
this.hotel = hotel;
}
}

View File

@@ -0,0 +1,54 @@
/*
* Hotels Bukkit Plugin
* Copyright (C) 2020 mviper
* Full licence text can be found in LICENCE file
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published
* by the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package mviper.plugin.hotels.core.events;
import org.bukkit.Bukkit;
import org.bukkit.event.Cancellable;
import org.bukkit.event.Event;
import org.bukkit.event.HandlerList;
public class HotelsEvent extends Event implements Cancellable {
private static final HandlerList HANDLER_LIST = new HandlerList();
private boolean cancelled = false;
@Override
public HandlerList getHandlers() {
return HANDLER_LIST;
}
public static HandlerList getHandlerList() {
return HANDLER_LIST;
}
@Override
public boolean isCancelled() {
return cancelled;
}
@Override
public void setCancelled(boolean cancel) {
this.cancelled = cancel;
}
public void call() {
Bukkit.getServer().getPluginManager().callEvent(this);
}
}

View File

@@ -0,0 +1,29 @@
/*
* Hotels Bukkit Plugin
* Copyright (C) 2019 mviper
* Full licence text can be found in LICENCE file
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published
* by the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package mviper.plugin.hotels.core.exceptions;
/**
* For when there shouldn't be an exception thrown
*/
public class BruhMoment extends HotelsException {
public BruhMoment() {
super("Unknown error has occurred", null, false, true);
}
}

View File

@@ -0,0 +1,54 @@
/*
* Hotels Bukkit Plugin
* Copyright (C) 2019 mviper
* Full licence text can be found in LICENCE file
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published
* by the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package mviper.plugin.hotels.core.exceptions;
public class HotelsException extends RuntimeException {
private final String commandUsage;
private final boolean printCommandUsage;
private final boolean printStackTrace;
public HotelsException(String message, String commandUsage, boolean printCommandUsage, boolean printStackTrace) {
super(message);
this.commandUsage = commandUsage;
this.printCommandUsage = printCommandUsage;
this.printStackTrace = printStackTrace;
}
public HotelsException(String message) {
this(message, null, true, false);
}
public HotelsException(String message, String commandUsage) {
this(message, commandUsage, true, false);
}
public String getCommandUsage() {
return commandUsage;
}
public boolean isPrintCommandUsage() {
return printCommandUsage;
}
public boolean isPrintStackTrace() {
return printStackTrace;
}
}

View File

@@ -0,0 +1,26 @@
/*
* Hotels Bukkit Plugin
* Copyright (C) 2019 mviper
* Full licence text can be found in LICENCE file
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published
* by the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package mviper.plugin.hotels.core.exceptions;
public class InvalidHotelException extends HotelsException {
public InvalidHotelException() {
super("Specified hotel is not valid!");
}
}

View File

@@ -0,0 +1,26 @@
/*
* Hotels Bukkit Plugin
* Copyright (C) 2019 mviper
* Full licence text can be found in LICENCE file
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published
* by the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package mviper.plugin.hotels.core.exceptions;
public class InvalidRegionException extends HotelsException {
public InvalidRegionException() {
super("Region is not valid!", null, false, false);
}
}

View File

@@ -0,0 +1,26 @@
/*
* Hotels Bukkit Plugin
* Copyright (C) 2019 mviper
* Full licence text can be found in LICENCE file
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published
* by the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package mviper.plugin.hotels.core.exceptions;
public class NoArgumentsException extends HotelsException {
public NoArgumentsException(String commandUsage) {
super("No arguments!", commandUsage);
}
}

View File

@@ -0,0 +1,26 @@
/*
* Hotels Bukkit Plugin
* Copyright (C) 2019 mviper
* Full licence text can be found in LICENCE file
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published
* by the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package mviper.plugin.hotels.core.exceptions;
public class NoPermissionException extends HotelsException {
public NoPermissionException() {
super("No permission!", null, false, false);
}
}

View File

@@ -0,0 +1,26 @@
/*
* Hotels Bukkit Plugin
* Copyright (C) 2019 mviper
* Full licence text can be found in LICENCE file
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published
* by the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package mviper.plugin.hotels.core.exceptions;
public class NotEnoughArgumentsException extends HotelsException {
public NotEnoughArgumentsException(String commandUsage) {
super("Not enough arguments!", commandUsage);
}
}

View File

@@ -0,0 +1,26 @@
/*
* Hotels Bukkit Plugin
* Copyright (C) 2019 mviper
* Full licence text can be found in LICENCE file
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published
* by the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package mviper.plugin.hotels.core.exceptions;
public class PlayerOnlyException extends HotelsException {
public PlayerOnlyException() {
super("This command can only be run by a player", null, false, false);
}
}

View File

@@ -0,0 +1,26 @@
/*
* Hotels Bukkit Plugin
* Copyright (C) 2019 mviper
* Full licence text can be found in LICENCE file
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published
* by the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package mviper.plugin.hotels.core.exceptions;
public class WorldGuardException extends HotelsException {
public WorldGuardException() {
super("WorldGuard error!", null, true, true);
}
}

View File

@@ -0,0 +1,26 @@
/*
* Hotels Bukkit Plugin
* Copyright (C) 2019 mviper
* Full licence text can be found in LICENCE file
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published
* by the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package mviper.plugin.hotels.core.exceptions;
public class WorldNonExistentException extends HotelsException {
public WorldNonExistentException(String commandUsage) {
super("Specified world does not exist!", commandUsage);
}
}

View File

@@ -0,0 +1,91 @@
/*
* Hotels Bukkit Plugin
* Copyright (C) 2019 mviper
* Full licence text can be found in LICENCE file
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published
* by the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
*/
package mviper.plugin.hotels.core.homes;
import jakarta.persistence.Basic;
import jakarta.persistence.MappedSuperclass;
@MappedSuperclass
public abstract class AbstractHome {
@Basic(optional = false)
private int x;
@Basic(optional = false)
private int y;
@Basic(optional = false)
private int z;
@Basic(optional = false)
private float pitch;
@Basic(optional = false)
private float yaw;
public AbstractHome(int x, int y, int z, float pitch, float yaw) {
this.x = x;
this.y = y;
this.z = z;
this.pitch = pitch;
this.yaw = yaw;
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
public int getZ() {
return z;
}
public void setZ(int z) {
this.z = z;
}
public float getPitch() {
return pitch;
}
public void setPitch(float pitch) {
this.pitch = pitch;
}
public float getYaw() {
return yaw;
}
public void setYaw(float yaw) {
this.yaw = yaw;
}
}

View File

@@ -0,0 +1,50 @@
/*
* Hotels Bukkit Plugin
* Copyright (C) 2019 mviper
* Full licence text can be found in LICENCE file
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published
* by the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
*/
package mviper.plugin.hotels.core.homes;
import mviper.plugin.hotels.core.hotel.Hotel;
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import jakarta.persistence.OneToOne;
@Entity
public class HotelHome extends AbstractHome {
@OneToOne(optional = false)
private final Hotel hotel;
@Id
private final String hotelId;
public HotelHome(Hotel hotel, int x, int y, int z, float pitch, float yaw) {
super(x, y, z, pitch, yaw);
this.hotel = hotel;
this.hotelId = hotel.getId().toString();
}
public Hotel getHotel() {
return hotel;
}
public String getHotelId() {
return hotelId;
}
}

View File

@@ -0,0 +1,51 @@
/*
* Hotels Bukkit Plugin
* Copyright (C) 2019 mviper
* Full licence text can be found in LICENCE file
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published
* by the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
*/
package mviper.plugin.hotels.core.homes;
import mviper.plugin.hotels.core.room.Room;
import java.util.UUID;
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import jakarta.persistence.OneToOne;
@Entity
public class RoomHome extends AbstractHome {
@OneToOne(optional = false)
private final Room room;
@Id
private final UUID roomId;
public RoomHome(Room room, int x, int y, int z, float pitch, float yaw) {
super(x, y, z, pitch, yaw);
this.room = room;
this.roomId = room.getId();
}
public Room getRoom() {
return room;
}
public UUID getRoomId() {
return roomId;
}
}

View File

@@ -0,0 +1,131 @@
/*
* Hotels Bukkit Plugin
* Copyright (C) 2020 mviper
* Full licence text can be found in LICENCE file
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published
* by the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package mviper.plugin.hotels.core.hotel;
import mviper.plugin.hotels.core.homes.HotelHome;
import mviper.plugin.hotels.core.regions.HotelRegion;
import mviper.plugin.hotels.core.room.Room;
import java.util.*;
import jakarta.persistence.*;
/**
* Represents a Hotel object
*/
@Entity
public class Hotel {
@Id
@GeneratedValue
private UUID id;
@ManyToOne(optional = false)
private HotelOwner hotelOwner;
@Basic(optional = false)
private String hotelWorldId;
@Basic(optional = false)
private String hotelName;
@Transient
private HotelRegion hotelRegion;
@ManyToMany
private Set<HotelHelper> hotelHelpers = new HashSet<>();
@OneToMany
private Set<Room> hotelRooms = new HashSet<>();
@OneToOne
private HotelHome hotelHome;
public Hotel() {
}
public Hotel(HotelOwner hotelOwner, String hotelWorldId, String hotelName) {
this.hotelOwner = hotelOwner;
this.hotelWorldId = hotelWorldId;
this.hotelName = hotelName;
}
// Getters and Setters
public UUID getId() {
return id;
}
public void setId(UUID id) {
this.id = id;
}
public HotelOwner getHotelOwner() {
return hotelOwner;
}
public void setHotelOwner(HotelOwner hotelOwner) {
this.hotelOwner = hotelOwner;
}
public String getHotelWorldId() {
return hotelWorldId;
}
public void setHotelWorldId(String hotelWorldId) {
this.hotelWorldId = hotelWorldId;
}
public String getHotelName() {
return hotelName;
}
public void setHotelName(String hotelName) {
this.hotelName = hotelName;
}
public HotelRegion getHotelRegion() {
return hotelRegion;
}
public void setHotelRegion(HotelRegion hotelRegion) {
this.hotelRegion = hotelRegion;
}
public Set<HotelHelper> getHotelHelpers() {
return hotelHelpers;
}
public void setHotelHelpers(Set<HotelHelper> hotelHelpers) {
this.hotelHelpers = hotelHelpers;
}
public Set<Room> getHotelRooms() {
return hotelRooms;
}
public void setHotelRooms(Set<Room> hotelRooms) {
this.hotelRooms = hotelRooms;
}
public HotelHome getHotelHome() {
return hotelHome;
}
public void setHotelHome(HotelHome hotelHome) {
this.hotelHome = hotelHome;
}
}

View File

@@ -0,0 +1,59 @@
/*
* Hotels Bukkit Plugin
* Copyright (C) 2019 mviper
* Full licence text can be found in LICENCE file
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published
* by the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
*/
package mviper.plugin.hotels.core.hotel;
import java.util.*;
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import jakarta.persistence.ManyToMany;
/**
* Represents a hotel helper, who can build in a hotel region but cannot administer it
*/
@Entity
public class HotelHelper {
@Id
private final UUID playerId;
@ManyToMany
private final Set<Hotel> hotels;
public HotelHelper(UUID playerId, Set<Hotel> hotels) {
this.playerId = playerId;
this.hotels = hotels;
}
public UUID getPlayerId() {
return playerId;
}
public Set<Hotel> getHotels() {
return hotels;
}
public boolean add(Hotel hotel) {
return hotels.add(hotel);
}
public boolean remove(Hotel hotel) {
return hotels.remove(hotel);
}
}

View File

@@ -0,0 +1,66 @@
/*
* Hotels Bukkit Plugin
* Copyright (C) 2019 mviper
* Full licence text can be found in LICENCE file
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published
* by the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
*/
package mviper.plugin.hotels.core.hotel;
import java.util.*;
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import jakarta.persistence.OneToMany;
/**
* Represents the owner of a hotel
*/
@Entity
public class HotelOwner {
@Id
private UUID playerId;
@OneToMany
private Set<Hotel> hotels = new HashSet<>();
public HotelOwner() {
}
public HotelOwner(UUID playerId) {
this.playerId = playerId;
}
public HotelOwner(UUID playerId, Set<Hotel> hotels) {
this.playerId = playerId;
this.hotels = hotels;
}
public UUID getPlayerId() {
return playerId;
}
public void setPlayerId(UUID playerId) {
this.playerId = playerId;
}
public Set<Hotel> getHotels() {
return hotels;
}
public void setHotels(Set<Hotel> hotels) {
this.hotels = hotels;
}
}

View File

@@ -0,0 +1,43 @@
/*
* Hotels Bukkit Plugin
* Copyright (C) 2020 mviper
* Full licence text can be found in LICENCE file
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published
* by the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package mviper.plugin.hotels.core.permissions;
import org.bukkit.entity.Player;
/**
* Represents a checkable Hotels permission
*/
public class HotelsPermission {
private final String permission;
public HotelsPermission(String permission) {
this.permission = permission;
}
public boolean checkPermission(Player player) {
return player == null || player.hasPermission(permission);
}
public String getPermission() {
return permission;
}
//TODO must include ways to check that player is owner of hotel and thus can run certain commands etc.
}

View File

@@ -0,0 +1,88 @@
/*
* Hotels Bukkit Plugin
* Copyright (C) 2019 mviper
* Full licence text can be found in LICENCE file
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published
* by the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
*/
package mviper.plugin.hotels.core.regions;
import com.sk89q.worldedit.world.World;
import com.sk89q.worldguard.domains.DefaultDomain;
import com.sk89q.worldguard.protection.regions.ProtectedRegion;
import mviper.plugin.hotels.core.regions.RegionManager;
import java.util.UUID;
/**
* Provides an abstraction for interfacing Hotel's classes with WorldGuard regions
*/
public abstract class AbstractRegion {
private final World world;
private final String id;
private final ProtectedRegion region;
/**
* For already existing regions
* @param id The UUID of the object representing the region, i.e. a Hotel UUID
*/
public AbstractRegion(World world, String id) {
this.world = world;
this.id = id;
this.region = RegionManager.getRegion(world, RegionManager.REGION_PREFIX + id);
}
public AbstractRegion(World world, String id, ProtectedRegion region) {
this.world = world;
this.id = id;
this.region = region;
}
private DefaultDomain getMembers() {
return region.getMembers();
}
private DefaultDomain getOwners() {
return region.getOwners();
}
public void addMember(UUID playerId) {
getMembers().addPlayer(playerId);
}
public void removeMember(UUID playerId) {
getMembers().removePlayer(playerId);
}
public void addOwner(UUID playerId) {
getOwners().addPlayer(playerId);
}
public void removeOwner(UUID playerId) {
getOwners().removePlayer(playerId);
}
public World getWorld() {
return world;
}
public String getId() {
return id;
}
public ProtectedRegion getRegion() {
return region;
}
}

View File

@@ -0,0 +1,40 @@
/*
* Hotels Bukkit Plugin
* Copyright (C) 2019 mviper
* Full licence text can be found in LICENCE file
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published
* by the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
*/
package mviper.plugin.hotels.core.regions;
import com.sk89q.worldedit.world.World;
import com.sk89q.worldguard.protection.regions.ProtectedRegion;
/**
* Provides an abstraction for manipulating a hotel's region
*/
public class HotelRegion extends AbstractRegion {
public HotelRegion(World world, String id, ProtectedRegion region) {
super(world, id, region);
}
public HotelRegion(World world, String id) {
super(world, id);
}
}
//TODO this must not actually try to get the region but rather represent it

View File

@@ -0,0 +1,105 @@
/*
* Hotels Bukkit Plugin
* Copyright (C) 2019 mviper
* Full licence text can be found in LICENCE file
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published
* by the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
*/
package mviper.plugin.hotels.core.regions;
import com.sk89q.worldedit.bukkit.WorldEditPlugin;
import com.sk89q.worldedit.regions.CuboidRegion;
import com.sk89q.worldedit.regions.Polygonal2DRegion;
import com.sk89q.worldedit.regions.Region;
import com.sk89q.worldedit.world.World;
import com.sk89q.worldguard.WorldGuard;
import com.sk89q.worldguard.protection.managers.RemovalStrategy;
import com.sk89q.worldguard.protection.regions.ProtectedCuboidRegion;
import com.sk89q.worldguard.protection.regions.ProtectedPolygonalRegion;
import com.sk89q.worldguard.protection.regions.ProtectedRegion;
import mviper.plugin.hotels.core.exceptions.InvalidRegionException;
import mviper.plugin.hotels.core.exceptions.WorldGuardException;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
public final class RegionManager {
public static final String REGION_PREFIX = "HOTELS_";
private static final WorldGuard WG_INSTANCE = WorldGuard.getInstance();
private static final com.sk89q.worldguard.protection.regions.RegionContainer REGION_CONTAINER =
WG_INSTANCE.getPlatform().getRegionContainer();
private static final WorldEditPlugin worldEditPlugin =
(WorldEditPlugin) Bukkit.getServer().getPluginManager().getPlugin("WorldEdit");
private RegionManager() {
// Utility class
}
private static com.sk89q.worldguard.protection.managers.RegionManager getRegionManager(World world) {
com.sk89q.worldguard.protection.managers.RegionManager rm = REGION_CONTAINER.get(world);
if (rm == null) {
throw new WorldGuardException();
}
return rm;
}
public static ProtectedRegion getRegion(World world, String id) {
ProtectedRegion region = getRegionManager(world).getRegion(id);
if (region == null) {
throw new InvalidRegionException();
}
return region;
}
public static void addRegion(World world, ProtectedRegion region) {
getRegionManager(world).addRegion(region);
}
public static void removeRegion(World world, String id) {
getRegionManager(world).removeRegion(id, RemovalStrategy.UNSET_PARENT_IN_CHILDREN);
}
/**
* Get a Protected Region from a player's selection
* @param id The UUID of the region's object, i.e. a Hotel UUID
*/
public static ProtectedRegion getProtectedRegion(Player player, String id) {
Region selection = getSelection(player);
return toProtectedRegion(selection, id);
}
public static ProtectedRegion toProtectedRegion(Region region, String id) {
if (region instanceof CuboidRegion cuboidRegion) {
return new ProtectedCuboidRegion(REGION_PREFIX + id,
cuboidRegion.getMinimumPoint(), cuboidRegion.getMaximumPoint());
} else if (region instanceof Polygonal2DRegion polygonRegion) {
return new ProtectedPolygonalRegion(id, polygonRegion.getPoints(),
polygonRegion.getMinimumY(), polygonRegion.getMaximumY());
} else {
throw new InvalidRegionException();
}
}
// WorldEdit
private static Region getSelection(Player player) {
try {
return worldEditPlugin.getSession(player).getClipboard().getClipboard().getRegion();
} catch (com.sk89q.worldedit.EmptyClipboardException e) {
throw new InvalidRegionException();
}
}
}

View File

@@ -0,0 +1,33 @@
/*
* Hotels Bukkit Plugin
* Copyright (C) 2019 mviper
* Full licence text can be found in LICENCE file
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published
* by the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
*/
package mviper.plugin.hotels.core.regions;
import com.sk89q.worldedit.world.World;
/**
* Provides an abstraction for manipulating a room's region
*/
public class RoomRegion extends AbstractRegion {
public RoomRegion(World world, String id) {
super(world, id);
}
}

View File

@@ -0,0 +1,187 @@
/*
* Hotels Bukkit Plugin
* Copyright (C) 2019 mviper
* Full licence text can be found in LICENCE file
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published
* by the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
*/
package mviper.plugin.hotels.core.room;
import mviper.plugin.hotels.core.homes.RoomHome;
import mviper.plugin.hotels.core.hotel.Hotel;
import mviper.plugin.hotels.core.regions.RoomRegion;
import java.time.LocalDateTime;
import java.util.*;
import jakarta.persistence.*;
/**
* Represents a room in a hotel
*/
@Entity
public class Room {
@Id
private UUID id;
@ManyToOne(optional = false)
private Hotel hotel;
@Basic(optional = false)
private int roomNumber;
@Basic(optional = false)
private long rentTime; // in minutes
@Basic(optional = false)
private double cost;
@Basic(optional = false)
private boolean isRoomReset;
@ManyToOne
private RoomRenter renter;
@OneToMany
private Set<RoomFriend> roomFriends = new HashSet<>();
@OneToOne
private RoomHome roomHome;
@Temporal(TemporalType.TIMESTAMP)
private LocalDateTime expiryInstant;
@Transient
private RoomRegion region;
public Room() {
}
public Room(UUID id, Hotel hotel, int roomNumber, long rentTime, double cost,
boolean isRoomReset, RoomRenter renter, Set<RoomFriend> roomFriends,
RoomHome roomHome, LocalDateTime expiryInstant, RoomRegion region) {
this.id = id;
this.hotel = hotel;
this.roomNumber = roomNumber;
this.rentTime = rentTime;
this.cost = cost;
this.isRoomReset = isRoomReset;
this.renter = renter;
this.roomFriends = roomFriends != null ? roomFriends : new HashSet<>();
this.roomHome = roomHome;
this.expiryInstant = expiryInstant;
this.region = region;
}
public Set<RoomFriend> getRoomFriends() {
return roomFriends;
}
public boolean addFriend(RoomFriend roomFriend) {
return roomFriends.add(roomFriend);
}
public boolean removeFriend(RoomFriend roomFriend) {
return roomFriends.remove(roomFriend);
}
public void clearFriends() {
roomFriends.clear();
}
// Getters and Setters
public UUID getId() {
return id;
}
public void setId(UUID id) {
this.id = id;
}
public Hotel getHotel() {
return hotel;
}
public void setHotel(Hotel hotel) {
this.hotel = hotel;
}
public int getRoomNumber() {
return roomNumber;
}
public void setRoomNumber(int roomNumber) {
this.roomNumber = roomNumber;
}
public long getRentTime() {
return rentTime;
}
public void setRentTime(long rentTime) {
this.rentTime = rentTime;
}
public double getCost() {
return cost;
}
public void setCost(double cost) {
this.cost = cost;
}
public boolean isRoomReset() {
return isRoomReset;
}
public void setRoomReset(boolean roomReset) {
isRoomReset = roomReset;
}
public RoomRenter getRenter() {
return renter;
}
public void setRenter(RoomRenter renter) {
this.renter = renter;
}
public void setRoomFriends(Set<RoomFriend> roomFriends) {
this.roomFriends = roomFriends;
}
public RoomHome getRoomHome() {
return roomHome;
}
public void setRoomHome(RoomHome roomHome) {
this.roomHome = roomHome;
}
public LocalDateTime getExpiryInstant() {
return expiryInstant;
}
public void setExpiryInstant(LocalDateTime expiryInstant) {
this.expiryInstant = expiryInstant;
}
public RoomRegion getRegion() {
return region;
}
public void setRegion(RoomRegion region) {
this.region = region;
}
}

View File

@@ -0,0 +1,59 @@
/*
* Hotels Bukkit Plugin
* Copyright (C) 2019 mviper
* Full licence text can be found in LICENCE file
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published
* by the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
*/
package mviper.plugin.hotels.core.room;
import java.util.*;
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import jakarta.persistence.ManyToMany;
/**
* Represents a friend, who can use a room but not administer it
*/
@Entity
public class RoomFriend {
@Id
private final UUID playerId;
@ManyToMany
private final Set<Room> rooms;
public RoomFriend(UUID playerId, Set<Room> rooms) {
this.playerId = playerId;
this.rooms = rooms;
}
public UUID getPlayerId() {
return playerId;
}
public Set<Room> getRooms() {
return rooms;
}
public boolean add(Room room) {
return rooms.add(room);
}
public boolean remove(Room room) {
return rooms.remove(room);
}
}

View File

@@ -0,0 +1,59 @@
/*
* Hotels Bukkit Plugin
* Copyright (C) 2019 mviper
* Full licence text can be found in LICENCE file
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published
* by the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
*/
package mviper.plugin.hotels.core.room;
import java.util.*;
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import jakarta.persistence.OneToMany;
/**
* Represents the renter of a room in a hotel
*/
@Entity
public class RoomRenter {
@Id
private final UUID playerId;
@OneToMany
private final Set<Room> rooms;
public RoomRenter(UUID playerId, Set<Room> rooms) {
this.playerId = playerId;
this.rooms = rooms;
}
public UUID getPlayerId() {
return playerId;
}
public Set<Room> getRooms() {
return rooms;
}
public boolean add(Room room) {
return rooms.add(room);
}
public boolean remove(Room room) {
return rooms.remove(room);
}
}

View File

@@ -0,0 +1,42 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
~ Hotels Bukkit Plugin
~ Copyright (C) 2019 mviper
~ Full licence text can be found in LICENCE file
~
~ This program is free software: you can redistribute it and/or modify
~ it under the terms of the GNU Affero General Public License as published
~ by the Free Software Foundation, either version 3 of the License, or
~ (at your option) any later version.
~
~ This program is distributed in the hope that it will be useful,
~ but WITHOUT ANY WARRANTY; without even the implied warranty of
~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
~ GNU Affero General Public License for more details.
~
~ You should have received a copy of the GNU Affero General Public License
~ along with this program. If not, see <https://www.gnu.org/licenses/>.
~
-->
<persistence version="3.0" xmlns="https://jakarta.ee/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://jakarta.ee/xml/ns/persistence https://jakarta.ee/xml/ns/persistence/persistence_3_0.xsd">
<persistence-unit name="HotelsPU" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<properties>
<property name="jakarta.persistence.jdbc.driver" value="org.h2.Driver"/>
<property name="jakarta.persistence.jdbc.url" value="jdbc:h2:./plugins/Hotels/database"/>
<property name="jakarta.persistence.jdbc.user" value="sa" />
<property name="jakarta.persistence.jdbc.password" value="" />
<property name="hibernate.connection.provider_class" value="org.hibernate.hikaricp.internal.HikariCPConnectionProvider" />
<property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/>
<property name="hibernate.hbm2ddl.auto" value="update" />
<!-- <property name="show_sql" value="true"/>-->
<!-- <property name="hibernate.temp.use_jdbc_metadata_defaults" value="false"/>-->
</properties>
</persistence-unit>
</persistence>

View File

@@ -0,0 +1,89 @@
# Hotels Plugin Configuration
# Version: 2.0.0
# For Minecraft 1.21.x
# Database settings
database:
# Database type: h2, mysql, postgresql
type: h2
# H2 database file location (relative to plugin folder)
h2-file: database
# MySQL/PostgreSQL settings (if using external database)
host: localhost
port: 3306
database: hotels
username: root
password: ""
# Connection pool settings
pool:
maximum-pool-size: 10
minimum-idle: 2
connection-timeout: 30000
# Economy settings
economy:
# Enable economy integration (requires Vault)
enabled: true
# Default currency symbol
currency-symbol: "$"
# Hotel settings
hotels:
# Maximum number of hotels per player
max-hotels-per-player: 5
# Maximum number of rooms per hotel
max-rooms-per-hotel: 50
# Minimum distance between hotels (in blocks)
min-hotel-distance: 100
# Allow hotel creation in all worlds
allow-all-worlds: true
# Worlds where hotels are allowed (if allow-all-worlds is false)
allowed-worlds:
- world
- world_nether
- world_the_end
# Room settings
rooms:
# Default rent duration in days
default-rent-duration: 7
# Maximum rent duration in days
max-rent-duration: 30
# Minimum rent price
min-rent-price: 10.0
# Maximum rent price
max-rent-price: 10000.0
# Allow room friends
allow-friends: true
# Maximum number of friends per room
max-friends-per-room: 5
# Region settings
regions:
# Minimum region size (blocks)
min-region-size: 16
# Maximum region size (blocks)
max-region-size: 10000
# Require WorldGuard region for hotel creation
require-worldguard: true
# Permission settings
permissions:
# Use permission-based limits (overrides default limits)
use-permission-limits: true
# Messages
messages:
# Message prefix
prefix: "&8[&6Hotels&8]&r "
# Enable colored messages
colored-messages: true
# Debug mode
debug: false
# Auto-save interval (in minutes, 0 to disable)
auto-save-interval: 5
# Language (en, de, es, fr)
language: en

View File

@@ -0,0 +1,66 @@
main: mviper.plugin.hotels.bukkit.HotelsMain
name: Hotels
version: ${project.version}
author: M_Viper
description: Allows the making of hotels and renting of rooms
website: https://github.com/mviper/hotels
load: POSTWORLD
api-version: 1.21
depend: [Vault, WorldEdit, WorldGuard]
commands:
Hotels:
description: Hotels's main command
aliases: [ht]
usage: /hotels <subcommand> [args]
permission: hotels.use
permissions:
hotels.*:
description: Gives access to all Hotels commands
children:
hotels.use: true
hotels.admin: true
hotels.create: true
hotels.delete: true
hotels.list: true
hotels.rent: true
hotels.manage: true
hotels.use:
description: Allows using basic Hotels commands
default: true
hotels.admin:
description: Gives access to all admin commands
default: op
children:
hotels.create: true
hotels.delete: true
hotels.manage: true
hotels.bypass: true
hotels.create:
description: Allows creating hotels
default: op
hotels.delete:
description: Allows deleting hotels
default: op
hotels.list:
description: Allows listing hotels
default: true
hotels.rent:
description: Allows renting rooms
default: true
hotels.manage:
description: Allows managing own hotels
default: op
hotels.bypass:
description: Bypasses all restrictions
default: op