Initial commit
This commit is contained in:
commit
9ba486bab4
113
.gitignore
vendored
Normal file
113
.gitignore
vendored
Normal file
@ -0,0 +1,113 @@
|
||||
# User-specific stuff
|
||||
.idea/
|
||||
|
||||
*.iml
|
||||
*.ipr
|
||||
*.iws
|
||||
|
||||
# IntelliJ
|
||||
out/
|
||||
|
||||
# Compiled class file
|
||||
*.class
|
||||
|
||||
# Log file
|
||||
*.log
|
||||
|
||||
# BlueJ files
|
||||
*.ctxt
|
||||
|
||||
# Package Files #
|
||||
*.jar
|
||||
*.war
|
||||
*.nar
|
||||
*.ear
|
||||
*.zip
|
||||
*.tar.gz
|
||||
*.rar
|
||||
|
||||
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
|
||||
hs_err_pid*
|
||||
|
||||
*~
|
||||
|
||||
# temporary files which can be created if a process still has a handle open of a deleted file
|
||||
.fuse_hidden*
|
||||
|
||||
# KDE directory preferences
|
||||
.directory
|
||||
|
||||
# Linux trash folder which might appear on any partition or disk
|
||||
.Trash-*
|
||||
|
||||
# .nfs files are created when an open file is removed but is still being accessed
|
||||
.nfs*
|
||||
|
||||
# General
|
||||
.DS_Store
|
||||
.AppleDouble
|
||||
.LSOverride
|
||||
|
||||
# Icon must end with two \r
|
||||
Icon
|
||||
|
||||
# Thumbnails
|
||||
._*
|
||||
|
||||
# Files that might appear in the root of a volume
|
||||
.DocumentRevisions-V100
|
||||
.fseventsd
|
||||
.Spotlight-V100
|
||||
.TemporaryItems
|
||||
.Trashes
|
||||
.VolumeIcon.icns
|
||||
.com.apple.timemachine.donotpresent
|
||||
|
||||
# Directories potentially created on remote AFP share
|
||||
.AppleDB
|
||||
.AppleDesktop
|
||||
Network Trash Folder
|
||||
Temporary Items
|
||||
.apdisk
|
||||
|
||||
# Windows thumbnail cache files
|
||||
Thumbs.db
|
||||
Thumbs.db:encryptable
|
||||
ehthumbs.db
|
||||
ehthumbs_vista.db
|
||||
|
||||
# Dump file
|
||||
*.stackdump
|
||||
|
||||
# Folder config file
|
||||
[Dd]esktop.ini
|
||||
|
||||
# Recycle Bin used on file shares
|
||||
$RECYCLE.BIN/
|
||||
|
||||
# Windows Installer files
|
||||
*.cab
|
||||
*.msi
|
||||
*.msix
|
||||
*.msm
|
||||
*.msp
|
||||
|
||||
# Windows shortcuts
|
||||
*.lnk
|
||||
|
||||
target/
|
||||
|
||||
pom.xml.tag
|
||||
pom.xml.releaseBackup
|
||||
pom.xml.versionsBackup
|
||||
pom.xml.next
|
||||
|
||||
release.properties
|
||||
dependency-reduced-pom.xml
|
||||
buildNumber.properties
|
||||
.mvn/timing.properties
|
||||
.mvn/wrapper/maven-wrapper.jar
|
||||
.flattened-pom.xml
|
||||
|
||||
# Common working directory
|
||||
run/
|
171
src/main/java/net/knarcraft/timeismoney/TimeIsMoney.java
Normal file
171
src/main/java/net/knarcraft/timeismoney/TimeIsMoney.java
Normal file
@ -0,0 +1,171 @@
|
||||
package net.knarcraft.timeismoney;
|
||||
|
||||
import com.earth2me.essentials.IEssentials;
|
||||
import net.knarcraft.timeismoney.command.ReloadCommand;
|
||||
import net.knarcraft.timeismoney.config.Configuration;
|
||||
import net.knarcraft.timeismoney.listener.PlayerJoinListener;
|
||||
import net.knarcraft.timeismoney.manager.EconomyManager;
|
||||
import net.knarcraft.timeismoney.manager.PermissionManager;
|
||||
import net.knarcraft.timeismoney.manager.PlayerTracker;
|
||||
import net.milkbowl.vault.economy.Economy;
|
||||
import net.milkbowl.vault.permission.Permission;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.Statistic;
|
||||
import org.bukkit.command.PluginCommand;
|
||||
import org.bukkit.configuration.file.FileConfiguration;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.plugin.RegisteredServiceProvider;
|
||||
import org.bukkit.plugin.ServicesManager;
|
||||
import org.bukkit.plugin.java.JavaPlugin;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.logging.Level;
|
||||
|
||||
/**
|
||||
* Time is money's main class
|
||||
*/
|
||||
public final class TimeIsMoney extends JavaPlugin {
|
||||
|
||||
private Configuration configuration;
|
||||
private IEssentials essentials = null;
|
||||
private static TimeIsMoney timeIsMoney;
|
||||
|
||||
@Override
|
||||
public void onEnable() {
|
||||
timeIsMoney = this;
|
||||
this.saveDefaultConfig();
|
||||
FileConfiguration fileConfiguration = this.getConfig();
|
||||
fileConfiguration.options().copyDefaults(true);
|
||||
this.saveConfig();
|
||||
this.reloadConfig();
|
||||
this.configuration = new Configuration(fileConfiguration);
|
||||
|
||||
// Plugin startup logic
|
||||
if (Bukkit.getPluginManager().getPlugin("Vault") != null) {
|
||||
setupVault();
|
||||
} else {
|
||||
this.getLogger().log(Level.SEVERE, "Could not find Vault. Plugin disabled.");
|
||||
this.setEnabled(false);
|
||||
return;
|
||||
}
|
||||
|
||||
if (Bukkit.getPluginManager().isPluginEnabled("Essentials")) {
|
||||
essentials = (com.earth2me.essentials.IEssentials)
|
||||
Bukkit.getServer().getPluginManager().getPlugin("Essentials");
|
||||
} else {
|
||||
this.getLogger().log(Level.WARNING, "Could not find Essentials. AFK tracking is disabled.");
|
||||
}
|
||||
|
||||
ReloadCommand reloadCommand = new ReloadCommand();
|
||||
PluginCommand command = getCommand("reload");
|
||||
if (command != null) {
|
||||
command.setExecutor(reloadCommand);
|
||||
command.setTabCompleter(reloadCommand);
|
||||
}
|
||||
|
||||
Bukkit.getPluginManager().registerEvents(new PlayerJoinListener(), this);
|
||||
|
||||
Bukkit.getScheduler().scheduleSyncRepeatingTask(this, this::payPlayers, 20, 20);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDisable() {
|
||||
// Plugin shutdown logic
|
||||
}
|
||||
|
||||
/**
|
||||
* Reloads the configuration from disk
|
||||
*/
|
||||
public static void reload() {
|
||||
timeIsMoney.reloadConfig();
|
||||
timeIsMoney.saveConfig();
|
||||
timeIsMoney.configuration = new Configuration(timeIsMoney.getConfig());
|
||||
}
|
||||
|
||||
/**
|
||||
* Pay all players that have been on the server long enough
|
||||
*/
|
||||
private void payPlayers() {
|
||||
if (!EconomyManager.isInitialized()) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Deposit money to all players
|
||||
for (Player player : Bukkit.getOnlinePlayers()) {
|
||||
Long lastPaid = PlayerTracker.getPaymentTime(player);
|
||||
if (lastPaid == null) {
|
||||
continue;
|
||||
}
|
||||
if ((System.currentTimeMillis() - lastPaid) / 60000 < configuration.getPaymentDelay()) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// Don't pay, or just pay a percentage to AFK players
|
||||
double afkPercentage = configuration.getAfkPercentage();
|
||||
boolean isAFK = essentials != null && essentials.getUser(player).isAfk();
|
||||
if (isAFK && afkPercentage <= 0) {
|
||||
continue;
|
||||
}
|
||||
double payment = configuration.getBasePay(player) * getPayoutMultiplier(player);
|
||||
if (isAFK) {
|
||||
payment *= afkPercentage;
|
||||
}
|
||||
EconomyManager.deposit(player, payment);
|
||||
if (configuration.displayPaymentMessage()) {
|
||||
player.sendMessage(this.getDescription().getPrefix() + "You got a paycheck of " +
|
||||
EconomyManager.format(payment));
|
||||
}
|
||||
PlayerTracker.trackPlayer(player);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets a payout multiplier based on how many hours the player has played on the server
|
||||
*
|
||||
* @param player <p>The player to check</p>
|
||||
* @return <p>The player's payout multiplier</p>
|
||||
*/
|
||||
private double getPayoutMultiplier(Player player) {
|
||||
if (configuration.getHoursUntilBonus() < 0) {
|
||||
return 1;
|
||||
}
|
||||
double playtimeHours = getPlayTimeHours(player);
|
||||
if (playtimeHours < configuration.getHoursUntilBonus()) {
|
||||
return 1;
|
||||
} else {
|
||||
return Math.max((playtimeHours / configuration.getHoursUntilBonus()) * configuration.getBonusMultiplier(), 1);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the number of hours a player has played
|
||||
*
|
||||
* @param player <p>The player to check playtime for</p>
|
||||
* @return <p>The player's playtime</p>
|
||||
*/
|
||||
private double getPlayTimeHours(@NotNull Player player) {
|
||||
return player.getStatistic(Statistic.PLAY_ONE_MINUTE) / 20.0 / 3600.0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets up Vault by getting plugins from their providers
|
||||
*/
|
||||
private void setupVault() {
|
||||
ServicesManager servicesManager = this.getServer().getServicesManager();
|
||||
RegisteredServiceProvider<Permission> permissionProvider = servicesManager.getRegistration(Permission.class);
|
||||
RegisteredServiceProvider<Economy> economyProvider = servicesManager.getRegistration(Economy.class);
|
||||
|
||||
if (permissionProvider != null) {
|
||||
PermissionManager.initialize(permissionProvider.getProvider());
|
||||
} else {
|
||||
getLogger().log(Level.WARNING, "No Vault permission provider found. Permission rewards are unavailable.");
|
||||
}
|
||||
|
||||
if (economyProvider != null) {
|
||||
EconomyManager.initialize(economyProvider.getProvider());
|
||||
} else {
|
||||
getLogger().log(Level.WARNING, "No Vault economy provider found. Economy rewards are unavailable.");
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,33 @@
|
||||
package net.knarcraft.timeismoney.command;
|
||||
|
||||
import net.knarcraft.timeismoney.TimeIsMoney;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.command.TabExecutor;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* The command for reloading this plugin's configuration
|
||||
*/
|
||||
public class ReloadCommand implements TabExecutor {
|
||||
|
||||
@Override
|
||||
public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label,
|
||||
@NotNull String[] args) {
|
||||
TimeIsMoney.reload();
|
||||
sender.sendMessage("Plugin reloaded!");
|
||||
return true;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
public List<String> onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label,
|
||||
@NotNull String[] args) {
|
||||
return new ArrayList<>();
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,5 @@
|
||||
package net.knarcraft.timeismoney.command;
|
||||
|
||||
public class SetGroupPaymentCommand {
|
||||
// TODO: Implement this
|
||||
}
|
@ -0,0 +1,5 @@
|
||||
package net.knarcraft.timeismoney.command;
|
||||
|
||||
public class SetPlayerPaymentCommand {
|
||||
//TODO: Implement this
|
||||
}
|
@ -0,0 +1,131 @@
|
||||
package net.knarcraft.timeismoney.config;
|
||||
|
||||
import net.knarcraft.timeismoney.manager.PermissionManager;
|
||||
import org.bukkit.configuration.ConfigurationSection;
|
||||
import org.bukkit.configuration.file.FileConfiguration;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* This plugin's configuration
|
||||
*/
|
||||
public class Configuration {
|
||||
|
||||
private final Map<String, Double> groupPayouts;
|
||||
private final Map<UUID, Double> playerPayouts;
|
||||
private final double defaultPayout;
|
||||
private final int hoursUntilBonus;
|
||||
private final double bonusMultiplier;
|
||||
private final int paymentDelay;
|
||||
private final double afkPercentage;
|
||||
private final boolean displayPaymentMessage;
|
||||
|
||||
/**
|
||||
* Instantiates a new configuration
|
||||
*
|
||||
* @param fileConfiguration <p>The file configuration to read values from</p>
|
||||
*/
|
||||
public Configuration(FileConfiguration fileConfiguration) {
|
||||
groupPayouts = new HashMap<>();
|
||||
playerPayouts = new HashMap<>();
|
||||
ConfigurationSection groupPayoutsSection = fileConfiguration.getConfigurationSection("groupPayouts");
|
||||
if (groupPayoutsSection != null) {
|
||||
for (String key : groupPayoutsSection.getKeys(false)) {
|
||||
groupPayouts.put(key, groupPayoutsSection.getDouble(key));
|
||||
}
|
||||
}
|
||||
ConfigurationSection playerPayoutsSection = fileConfiguration.getConfigurationSection("playerPayouts");
|
||||
if (playerPayoutsSection != null) {
|
||||
for (String key : playerPayoutsSection.getKeys(false)) {
|
||||
playerPayouts.put(UUID.fromString(key), playerPayoutsSection.getDouble(key));
|
||||
}
|
||||
}
|
||||
this.defaultPayout = fileConfiguration.getDouble("defaultPayout", 10);
|
||||
this.hoursUntilBonus = fileConfiguration.getInt("hoursUntilBonus", 100);
|
||||
this.bonusMultiplier = fileConfiguration.getDouble("bonusMultiplier", 1);
|
||||
this.paymentDelay = fileConfiguration.getInt("paymentDelay", 60);
|
||||
this.afkPercentage = fileConfiguration.getDouble("afkPercentage", 0);
|
||||
this.displayPaymentMessage = fileConfiguration.getBoolean("displayPaymentMessage", true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the number of hours a player must have played to receive a payment bonus
|
||||
*
|
||||
* @return <p>The min. amount of hours required to get a bonus</p>
|
||||
*/
|
||||
public int getHoursUntilBonus() {
|
||||
return hoursUntilBonus;
|
||||
}
|
||||
|
||||
/**
|
||||
* A multiplier to apply to the bonus
|
||||
*
|
||||
* <p>By default, the bonus is total playtime / hours until bonus. This multiplier allows adjusting how high or low
|
||||
* the bonus becomes. For example, a bonus multiplier of 0.5 would halve the paid bonus, while a bonus multiplier
|
||||
* of 2 would double the paid bonus.</p>
|
||||
*
|
||||
* @return <p>The bonus multiplier</p>
|
||||
*/
|
||||
public double getBonusMultiplier() {
|
||||
return bonusMultiplier;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the base payout to pay the given player
|
||||
*
|
||||
* @param player <p>The player to get the base payout for</p>
|
||||
* @return <p>The player's base pay</p>
|
||||
*/
|
||||
public double getBasePay(@NotNull Player player) {
|
||||
if (playerPayouts.get(player.getUniqueId()) != null) {
|
||||
return playerPayouts.get(player.getUniqueId());
|
||||
}
|
||||
|
||||
double maxPay = -1;
|
||||
if (PermissionManager.isInitialized()) {
|
||||
for (String group : PermissionManager.getPlayerGroups(player)) {
|
||||
if (groupPayouts.containsKey(group)) {
|
||||
maxPay = Math.max(maxPay, groupPayouts.get(group));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (maxPay == -1) {
|
||||
return defaultPayout;
|
||||
} else {
|
||||
return maxPay;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* The delay between each time a player is paid
|
||||
*
|
||||
* @return <p>The delay between payments</p>
|
||||
*/
|
||||
public int getPaymentDelay() {
|
||||
return paymentDelay;
|
||||
}
|
||||
|
||||
/**
|
||||
* The percentage of the payment to pay AFK players
|
||||
*
|
||||
* @return <p>AFK players' payment percentage</p>
|
||||
*/
|
||||
public double getAfkPercentage() {
|
||||
return afkPercentage;
|
||||
}
|
||||
|
||||
/**
|
||||
* Whether to display a message to players when they're paid
|
||||
*
|
||||
* @return <p>True if a payment message should be displayed</p>
|
||||
*/
|
||||
public boolean displayPaymentMessage() {
|
||||
return displayPaymentMessage;
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,18 @@
|
||||
package net.knarcraft.timeismoney.listener;
|
||||
|
||||
import net.knarcraft.timeismoney.manager.PlayerTracker;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.Listener;
|
||||
import org.bukkit.event.player.PlayerJoinEvent;
|
||||
|
||||
/**
|
||||
* A listener that starts tracking player time once players join
|
||||
*/
|
||||
public class PlayerJoinListener implements Listener {
|
||||
|
||||
@EventHandler
|
||||
public void onPlayerJoin(PlayerJoinEvent event) {
|
||||
PlayerTracker.trackPlayer(event.getPlayer());
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,55 @@
|
||||
package net.knarcraft.timeismoney.manager;
|
||||
|
||||
import net.milkbowl.vault.economy.Economy;
|
||||
import org.bukkit.OfflinePlayer;
|
||||
|
||||
/**
|
||||
* A manager that performs all Economy tasks
|
||||
*/
|
||||
public final class EconomyManager {
|
||||
|
||||
private static Economy economy;
|
||||
|
||||
private EconomyManager() {
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Initializes the economy manager
|
||||
*
|
||||
* @param economy <p>The economy object to use for everything economy-related</p>
|
||||
*/
|
||||
public static void initialize(Economy economy) {
|
||||
EconomyManager.economy = economy;
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks whether the economy manager has been initialized
|
||||
*
|
||||
* @return <p>True if the economy manager has been initialized</p>
|
||||
*/
|
||||
public static boolean isInitialized() {
|
||||
return EconomyManager.economy != null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Formats the given amount of currency according to the economy plugin's format
|
||||
*
|
||||
* @param amount <p>The amount of currency to format</p>
|
||||
* @return <p>The formatted string</p>
|
||||
*/
|
||||
public static String format(double amount) {
|
||||
return economy.format(amount);
|
||||
}
|
||||
|
||||
/**
|
||||
* Deposits a given sum into the given player's account
|
||||
*
|
||||
* @param player <p>The player to deposit money to</p>
|
||||
* @param sum <p>The amount of money to deposit</p>
|
||||
*/
|
||||
public static void deposit(OfflinePlayer player, double sum) {
|
||||
economy.depositPlayer(player, sum);
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,46 @@
|
||||
package net.knarcraft.timeismoney.manager;
|
||||
|
||||
import net.milkbowl.vault.permission.Permission;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
/**
|
||||
* A manager that performs all Permission tasks
|
||||
*/
|
||||
public final class PermissionManager {
|
||||
|
||||
private static Permission permission;
|
||||
|
||||
private PermissionManager() {
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Initializes the permission manager
|
||||
*
|
||||
* @param permission <p>The permission object to use for everything permission-related</p>
|
||||
*/
|
||||
public static void initialize(Permission permission) {
|
||||
PermissionManager.permission = permission;
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks whether the permission manager has been initialized
|
||||
*
|
||||
* @return <p>True if the permission manager has been initialized</p>
|
||||
*/
|
||||
public static boolean isInitialized() {
|
||||
return PermissionManager.permission != null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets all groups of a player
|
||||
*
|
||||
* @param player <p>The player to get the groups for</p>
|
||||
* @return <p>The player's groups</p>
|
||||
*/
|
||||
public static String[] getPlayerGroups(@NotNull Player player) {
|
||||
return permission.getPlayerGroups(player);
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,42 @@
|
||||
package net.knarcraft.timeismoney.manager;
|
||||
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* A tracker keeping track of players' payment times
|
||||
*/
|
||||
public final class PlayerTracker {
|
||||
|
||||
private static final Map<Player, Long> playerLastPaid = new HashMap<>();
|
||||
|
||||
private PlayerTracker() {
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Track's a player's last payment time
|
||||
*
|
||||
* <p>Call this when the player joins to set the 0 time.</p>
|
||||
*
|
||||
* @param player <p>The player to track</p>
|
||||
*/
|
||||
public static void trackPlayer(Player player) {
|
||||
playerLastPaid.put(player, System.currentTimeMillis());
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the last time the given player was paid
|
||||
*
|
||||
* <p>The return time is in the format of 'System.currentTimeMillis()'</p>
|
||||
*
|
||||
* @param player <p>The player to check player time for</p>
|
||||
* @return <p>The last time the player was paid</p>
|
||||
*/
|
||||
public static Long getPaymentTime(Player player) {
|
||||
return playerLastPaid.get(player);
|
||||
}
|
||||
|
||||
}
|
16
src/main/resources/config.yml
Normal file
16
src/main/resources/config.yml
Normal file
@ -0,0 +1,16 @@
|
||||
# The default payout if the player has no overrides
|
||||
defaultPayout: 10
|
||||
# The amount of minutes to wait between each payment
|
||||
paymentDelay: 60
|
||||
# Whether to announce to a player that they've just been paid
|
||||
displayPaymentMessage: true
|
||||
# The amount of hours until a bonus is given. Set to -1 to disable.
|
||||
hoursUntilBonus: 100
|
||||
# A multiplier used to increase or decrease the time bonus
|
||||
bonusMultiplier: 1
|
||||
# The percentage of the payment to pay AFK players
|
||||
afkPercentage: 0
|
||||
# Overrides for specific groups
|
||||
groupPayouts: [ ]
|
||||
# Overrides for specific players
|
||||
playerPayouts: [ ]
|
21
src/main/resources/plugin.yml
Normal file
21
src/main/resources/plugin.yml
Normal file
@ -0,0 +1,21 @@
|
||||
name: "TimeIsMoney"
|
||||
version: '${project.version}'
|
||||
main: net.knarcraft.timeismoney.TimeIsMoney
|
||||
api-version: '1.20'
|
||||
prefix: 'TimeIsMoney'
|
||||
author: EpicKnarvik97
|
||||
depend:
|
||||
- Vault
|
||||
softdepend:
|
||||
- Essentials
|
||||
|
||||
commands:
|
||||
reload:
|
||||
permission: timeismoney.reload
|
||||
description: Reloads the plugin
|
||||
usage: /<command>
|
||||
|
||||
permissions:
|
||||
timeismoney.reload:
|
||||
description: Allows usage of the /reload command
|
||||
default: false
|
Loading…
Reference in New Issue
Block a user