diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..2f43530 --- /dev/null +++ b/.gitignore @@ -0,0 +1,17 @@ +target/ +pom.xml.tag +pom.xml.releaseBackup +pom.xml.versionsBackup +pom.xml.next +release.properties +dependency-reduced-pom.xml +buildNumber.properties +.mvn/timing.properties +# https://github.com/takari/maven-wrapper#usage-without-binary-jar +.mvn/wrapper/maven-wrapper.jar + +# Eclipse m2e generated files +# Eclipse Core +.project +# JDT-specific (Eclipse Java Development Tools) +.classpath diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..07498ee --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,4 @@ +{ + "java.compile.nullAnalysis.mode": "disabled", + "java.configuration.updateBuildConfiguration": "automatic" +} \ No newline at end of file diff --git a/pom.xml b/pom.xml index 1ef84ce..3faffd5 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ 4.0.0 net.laboulangerie - gringottslands + gringotts-lands 1.0-SNAPSHOT GringottsLands @@ -18,7 +18,7 @@ 17 - GringottsLands + gringotts-lands src/main/resources @@ -42,13 +42,20 @@ io.papermc.paper paper-api - 1.20.2-R0.1-SNAPSHOT + 1.21.1-R0.1-SNAPSHOT provided - com.github.LaBoulangerie - Gringotts - 2.12.2 + minecraftwars + gringotts + 3.0.1-SNAPSHOT + provided + + + com.github.angeschossen + LandsAPI + 7.10.2 + provided \ No newline at end of file diff --git a/src/main/java/net/laboulangerie/gringottslands/GringottsLand.java b/src/main/java/net/laboulangerie/gringottslands/GringottsLand.java deleted file mode 100644 index d7da2bb..0000000 --- a/src/main/java/net/laboulangerie/gringottslands/GringottsLand.java +++ /dev/null @@ -1,17 +0,0 @@ -package net.laboulangerie.gringottslands; - -import org.bukkit.plugin.java.JavaPlugin; - -public class GringottsLand extends JavaPlugin { - @Override - public void onEnable() { - // TODO Auto-generated method stub - super.onEnable(); - } - - @Override - public void onDisable() { - // TODO Auto-generated method stub - super.onDisable(); - } -} \ No newline at end of file diff --git a/src/main/java/net/laboulangerie/gringottslands/GringottsLands.java b/src/main/java/net/laboulangerie/gringottslands/GringottsLands.java new file mode 100644 index 0000000..56c08be --- /dev/null +++ b/src/main/java/net/laboulangerie/gringottslands/GringottsLands.java @@ -0,0 +1,101 @@ +package net.laboulangerie.gringottslands; + +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.configuration.file.YamlConfiguration; +import org.bukkit.plugin.Plugin; +import org.bukkit.plugin.java.JavaPlugin; +import org.gestern.gringotts.Gringotts; +import org.gestern.gringotts.api.dependency.Dependency; + +import java.io.File; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.Reader; +import java.nio.charset.StandardCharsets; +import java.util.logging.Level; +import java.util.logging.Logger; + +public class GringottsLands extends JavaPlugin { + + public static GringottsLands instance; + public static Logger LOGGER; + + private static final String MESSAGES_YML = "messages.yml"; + + private LandsDependency landsDependency; + + public GringottsLands() { + instance = this; + } + + @Override + public void onLoad() { + try { + Plugin lands = Gringotts.instance.getDependencies() + .hookPlugin("Lands", "me.angeschossen.lands.Lands", "7.9.5"); + + this.landsDependency = new LandsDependency(lands); + + if (lands != null && Gringotts.instance.getDependencies() + .registerDependency(this.landsDependency)) { + getLogger().warning("Lands plugin is already assigned into the dependencies."); + } + } catch (IllegalArgumentException e) { + getLogger().warning("Looks like Lands plugin is not compatible with Gringotts"); + this.onDisable(); + return; + } + + // load and init configuration + saveDefaultConfig(); // saves default configuration if no config.yml exists yet + reloadConfig(); + + LOGGER = this.getLogger(); + if (LandsConfiguration.CONF.debug) { + LOGGER.setLevel(Level.ALL); + } + + Gringotts.instance.getDependencies().getDependency("lands").ifPresent(Dependency::onLoad); + } + + @Override + public void onEnable() { + this.landsDependency.checkLandBalanceConsistency(); + } + + /** + * Reload config. + *

+ * override to handle custom config logic and language loading + */ + @Override + public void reloadConfig() { + super.reloadConfig(); + LandsConfiguration.CONF.readConfig(getConfig()); + LandsLanguage.LANG.readLanguage(getMessages()); + } + + /** + * Get the configured player interaction messages. + * + * @return the configured player interaction messages + */ + public FileConfiguration getMessages() { + String langPath = String.format("i18n/messages_%s.yml", LandsConfiguration.CONF.language); + + // try configured language first + InputStream langStream = getResource(langPath); + FileConfiguration conf; + + if (langStream != null) { + Reader langReader = new InputStreamReader(langStream, StandardCharsets.UTF_8); + conf = YamlConfiguration.loadConfiguration(langReader); + } else { + // use custom/default + File langFile = new File(getDataFolder(), MESSAGES_YML); + conf = YamlConfiguration.loadConfiguration(langFile); + } + + return conf; + } +} diff --git a/src/main/java/net/laboulangerie/gringottslands/LandsConfiguration.java b/src/main/java/net/laboulangerie/gringottslands/LandsConfiguration.java new file mode 100644 index 0000000..a939795 --- /dev/null +++ b/src/main/java/net/laboulangerie/gringottslands/LandsConfiguration.java @@ -0,0 +1,30 @@ +package net.laboulangerie.gringottslands; + +import org.bukkit.configuration.file.FileConfiguration; + +public enum LandsConfiguration { + CONF; + + /** + * Language to be used for messages. Should be an ISO 639-1 (alpha-2) code. + * If a language is not supported by Gringotts, use user-configured or default (English) messages. + */ + public String language = "custom"; + public String landSignTypeName = "land"; + + public int maxLandVaults = -1; + + public boolean vaultsOnlyInLands = false; + public long landStartBalance = 0; + + public boolean debug = false; + + public void readConfig(FileConfiguration savedConfig) { + CONF.language = savedConfig.getString("language", "custom"); + CONF.landSignTypeName = savedConfig.getString("land_sign_type_name", "land"); + CONF.maxLandVaults = savedConfig.getInt("max_land_vaults", -1); + CONF.vaultsOnlyInLands = savedConfig.getBoolean("vaults_only_in_lands", false); + CONF.landStartBalance = savedConfig.getLong("land_start_balance", 0); + CONF.debug = savedConfig.getBoolean("debug", false); + } +} diff --git a/src/main/java/net/laboulangerie/gringottslands/LandsDependency.java b/src/main/java/net/laboulangerie/gringottslands/LandsDependency.java new file mode 100644 index 0000000..516dba7 --- /dev/null +++ b/src/main/java/net/laboulangerie/gringottslands/LandsDependency.java @@ -0,0 +1,141 @@ +package net.laboulangerie.gringottslands; + +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.plugin.Plugin; +import org.gestern.gringotts.Configuration; +import org.gestern.gringotts.Gringotts; +import org.gestern.gringotts.GringottsAccount; +import org.gestern.gringotts.accountholder.AccountHolder; +import org.gestern.gringotts.api.dependency.Dependency; +import org.gestern.gringotts.event.PlayerVaultCreationEvent; + +import me.angeschossen.lands.api.LandsIntegration; +import me.angeschossen.lands.api.land.Land; +import net.laboulangerie.gringottslands.land.LandAccountHolder; +import net.laboulangerie.gringottslands.land.LandHolderProvider; + +public class LandsDependency implements Dependency, Listener { + private final LandHolderProvider landHolderProvider; + private final Plugin lands; + private final String id; + private final LandsIntegration api; + + /** + * Instantiates a new Lands dependency. + * + * @param lands the plugin + */ + public LandsDependency(Plugin lands) { + if (lands == null) { + throw new NullPointerException("'lands' is null"); + } + + this.lands = lands; + this.id = "lands"; + + this.api = LandsIntegration.of(lands); + this.landHolderProvider = new LandHolderProvider(this.api); + + } + + /** + * Gets id. + * + * @return the id + */ + @Override + public String getId() { + return id; + } + + /** + * Gets plugin. + * + * @return the plugin + */ + @Override + public Plugin getPlugin() { + return this.lands; + } + + /** + * On enable. + */ + @Override + public void onEnable() { + Bukkit.getPluginManager().registerEvents(this, Gringotts.instance); + Bukkit.getPluginManager().registerEvents(this.landHolderProvider, Gringotts.instance); + + Gringotts.instance.registerAccountHolderProvider(LandAccountHolder.ACCOUNT_TYPE, this.landHolderProvider); + } + + public void checkLandBalanceConsistency() { + // Check gringotts/lands balance consistency + for (Land land : this.api.getLands()) { + GringottsLands.LOGGER.fine("Check Land " + land.getULID() + " balance consistency."); + AccountHolder holder = this.landHolderProvider.getAccountHolder(land); + GringottsAccount account = Gringotts.instance.getAccounting().getAccount(holder); + double landBalance = land.getBalance(); + double balance = Configuration.CONF.getCurrency().getDisplayValue(account.getBalance()); + if (landBalance != balance) { + GringottsLands.LOGGER.severe("Update Land " + land.getULID() + " balance to resolve inconsistency. (current: " + landBalance + " gringotts: " + balance + ")" ); + land.setBalance(balance); + } + } + } + + /** + * Vault created. + * + * @param event the event + */ + @EventHandler + public void vaultCreated(PlayerVaultCreationEvent event) { + // some listener already claimed this event + if (event.isValid() || !this.isEnabled()) { + return; + } + + String line2String = event.getCause().getLine(2); + + if (line2String == null) { + return; + } + + Player player = event.getCause().getPlayer(); + + if (!event.getType().equals(LandsConfiguration.CONF.landSignTypeName)) { + return; + + } + + if (!LandsPermissions.CREATE_VAULT_LAND.isAllowed(player)) { + player.sendMessage(LandsLanguage.LANG.noLandVaultPerm); + return; + } + + Land land = this.api.getLandByName(line2String); + if (land == null) { + player.sendMessage(LandsLanguage.LANG.noLandFound); + return; + } + + AccountHolder owner = this.landHolderProvider.getAccountHolder(land); + + if (LandsConfiguration.CONF.vaultsOnlyInLands && this.api.getArea(event.getCause().getBlock().getLocation()) == null) { + event.getCause().getPlayer().sendMessage(LandsLanguage.LANG.vaultNotInLand); + return; + } + + if (LandsConfiguration.CONF.maxLandVaults != -1 && ((int) Gringotts.instance.getDao().retrieveChests().stream().filter(c -> c.account.owner.getId().equals(land.getULID().toString())).count() + 1) > LandsConfiguration.CONF.maxLandVaults) { + event.getCause().getPlayer().sendMessage(LandsLanguage.LANG.tooManyVaults); + return; + } + + event.setOwner(owner); + event.setValid(true); + } +} diff --git a/src/main/java/net/laboulangerie/gringottslands/LandsLanguage.java b/src/main/java/net/laboulangerie/gringottslands/LandsLanguage.java new file mode 100644 index 0000000..18d5fcd --- /dev/null +++ b/src/main/java/net/laboulangerie/gringottslands/LandsLanguage.java @@ -0,0 +1,26 @@ +package net.laboulangerie.gringottslands; + +import org.bukkit.configuration.file.FileConfiguration; + +import java.util.function.BiFunction; + +import static org.gestern.gringotts.Util.translateColors; + +public enum LandsLanguage { + LANG; + + public String noLandVaultPerm; + public String noLandFound; + public String vaultNotInLand; + public String tooManyVaults; + + public void readLanguage(FileConfiguration savedLanguage) { + BiFunction translator = (path, def) -> translateColors(savedLanguage.getString(path, def)); + + LANG.noLandVaultPerm = translator.apply("noLandPerm", "You do not have permission to create land vaults here."); + LANG.noLandFound = translator.apply("noLandFound", "Cannot create land vault: Land not found."); + LANG.vaultNotInLand = translator.apply("vaultNotInLand", "You cannot create vaults outside of lands."); + LANG.tooManyVaults = translator.apply("tooManyVaults", "You cannot create more vaults! Max: %max"); + + } +} diff --git a/src/main/java/net/laboulangerie/gringottslands/LandsPermissions.java b/src/main/java/net/laboulangerie/gringottslands/LandsPermissions.java new file mode 100644 index 0000000..30fbe9d --- /dev/null +++ b/src/main/java/net/laboulangerie/gringottslands/LandsPermissions.java @@ -0,0 +1,33 @@ +package net.laboulangerie.gringottslands; + +import org.bukkit.entity.Player; + +/** + * The Permissions. + */ +public enum LandsPermissions { + /** + * Create vault land permissions. + */ + CREATE_VAULT_LAND("gringotts.createvault.land"); + + /** + * The Node. + */ + public final String node; + + LandsPermissions(String node) { + this.node = node; + } + + /** + * Check if a player has this permission. + * + * @param player player to check + * @return whether given player has this permission + */ + @SuppressWarnings("BooleanMethodIsAlwaysInverted") + public boolean isAllowed(Player player) { + return player.hasPermission(this.node); + } +} diff --git a/src/main/java/net/laboulangerie/gringottslands/land/LandAccountHolder.java b/src/main/java/net/laboulangerie/gringottslands/land/LandAccountHolder.java new file mode 100644 index 0000000..0cb8e78 --- /dev/null +++ b/src/main/java/net/laboulangerie/gringottslands/land/LandAccountHolder.java @@ -0,0 +1,73 @@ +package net.laboulangerie.gringottslands.land; + +import me.angeschossen.lands.api.land.Land; + +import org.gestern.gringotts.accountholder.AccountHolder; + +public class LandAccountHolder implements AccountHolder { + public static final String ACCOUNT_TYPE = "land"; + private final Land land; + + /** + * Instantiates a new Land account holder. + * + * @param land the land + */ + LandAccountHolder(Land land) { + this.land = land; + } + + /** + * Return name of the account holder. + * + * @return name of the account holder + */ + @Override + public String getName() { + return this.land.getName(); + } + + /** + * Send message to the account holder. + * + * @param message to send + */ + @Override + public void sendMessage(String message) { + this.land.getOnlinePlayers().forEach(player -> player.sendMessage(message)); + } + + /** + * Type of the account holder. For instance "faction" or "player". + * + * @return account holder type + */ + @Override + public String getType() { + return ACCOUNT_TYPE; + } + + /** + * A unique identifier for the account holder. + * For players, this is simply the name. For factions, it is their id. + * + * @return unique account holder id + */ + @Override + public String getId() { + return this.land.getULID().toString(); + } + + /** + * The land onwing this account + * @return land object + */ + public Land getLand() { + return this.land; + } + + @Override + public boolean hasPermission(String arg0) { + return false; + } +} diff --git a/src/main/java/net/laboulangerie/gringottslands/land/LandHolderProvider.java b/src/main/java/net/laboulangerie/gringottslands/land/LandHolderProvider.java new file mode 100644 index 0000000..b02f011 --- /dev/null +++ b/src/main/java/net/laboulangerie/gringottslands/land/LandHolderProvider.java @@ -0,0 +1,278 @@ +package net.laboulangerie.gringottslands.land; + +import me.angeschossen.lands.api.LandsIntegration; +import me.angeschossen.lands.api.applicationframework.util.ULID; +import me.angeschossen.lands.api.events.LandDeleteEvent; +import me.angeschossen.lands.api.events.LandRenameEvent; +import me.angeschossen.lands.api.events.land.bank.LandBankBalanceChangedEvent; +import me.angeschossen.lands.api.events.land.bank.LandBankDepositEvent; +import me.angeschossen.lands.api.events.land.bank.LandBankWithdrawEvent; +import me.angeschossen.lands.api.land.Land; +import me.angeschossen.lands.api.memberholder.MemberHolder; +import net.laboulangerie.gringottslands.GringottsLands; +import net.laboulangerie.gringottslands.LandsConfiguration; + +import org.bukkit.OfflinePlayer; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.scheduler.BukkitRunnable; +import org.gestern.gringotts.AccountChest; +import org.gestern.gringotts.Configuration; +import org.gestern.gringotts.Gringotts; +import org.gestern.gringotts.GringottsAccount; +import org.gestern.gringotts.accountholder.AccountHolder; +import org.gestern.gringotts.accountholder.AccountHolderProvider; +import org.gestern.gringotts.api.TransactionResult; +import org.gestern.gringotts.event.AccountBalanceChangeEvent; +import org.gestern.gringotts.event.CalculateStartBalanceEvent; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.Set; +import java.util.UUID; +import java.util.stream.Collectors; + +public class LandHolderProvider implements AccountHolderProvider, Listener { + + private LandsIntegration api; + + public LandHolderProvider(LandsIntegration api) { + this.api = api; + } + + /** + * Get the AccountHolder object mapped to the given id for this provider. + * + * @param ulid id of account holder + * @return account holder for id + */ + public @Nullable AccountHolder getAccountHolder(@NotNull ULID ulid) { + Land land = this.api.getLandByULID(ulid); + return getAccountHolder(land); + } + + /** + * Get the AccountHolder object mapped to the given id for this provider. + * + * @param id id of account holder + * @return account holder for id + */ + @Override + public @Nullable AccountHolder getAccountHolder(@NotNull String id) { + try { + return getAccountHolder(ULID.fromString(id)); + } catch (IllegalArgumentException e) { + return null; + } + } + + /** + * Get the AccountHolder object mapped to the given id for this provider. + * + * @param uuid id of account holder + * @return account holder for id + */ + @Override + public @Nullable AccountHolder getAccountHolder(@NotNull UUID uuid) { + throw new UnsupportedOperationException("Unimplemented method 'getAccountHolder'"); + } + + /** + * Get a AccountHolder for the land of which player is a resident, if any. + * + * @param player player to get land for + * @return AccountHolder for the land of which player is a resident, if + * any. null otherwise. + */ + @Override + public @Nullable AccountHolder getAccountHolder(@NotNull OfflinePlayer player) { + throw new UnsupportedOperationException("Unimplemented method 'getAccountHolder'"); + } + + /** + * Gets type. + * + * @return the type + */ + @Override + public String getType() { + return LandAccountHolder.ACCOUNT_TYPE; + } + + /** + * Gets account names. + * + * @return the account names + */ + @Override + public @NotNull Set getAccountNames() { + return this.api.getLands().stream().map(MemberHolder::getName).collect(Collectors.toSet()); + } + + /** + * Gets account holder. + * + * @param Land the land + * @return the account holder + */ + public @Nullable AccountHolder getAccountHolder(@Nullable Land land) { + if (land == null) { + return null; + } + + return new LandAccountHolder(land); + } + + /** + * Rename land. + * + * @param event the event + */ + @EventHandler + public void renameLand(LandRenameEvent event) { + ULID id = event.getLand().getULID(); + + new BukkitRunnable() { + @Override + public void run() { + LandAccountHolder holder = (LandAccountHolder) getAccountHolder(id); + if (holder == null) + return; + + GringottsAccount account = Gringotts.instance.getAccounting().getAccount(holder); + if (account == null) + return; + + Gringotts.instance.getDao().retrieveChests(account).forEach(AccountChest::updateSign); + } + }.runTask(GringottsLands.instance); + } + + /** + * Calculate start balance. + * + * @param event the event + */ + @EventHandler + public void calculateStartBalance(CalculateStartBalanceEvent event) { + if (!event.holder.getType().equals(getType())) { + return; + } + + event.startValue = Configuration.CONF.getCurrency().getCentValue(LandsConfiguration.CONF.landStartBalance); + } + + /** + * Delete land. + * + * @param event the event + */ + @EventHandler + public void deleteLand(LandDeleteEvent event) { + Land land = event.getLand(); + AccountHolder holder = getAccountHolder(land); + + GringottsAccount account = Gringotts.instance.getAccounting().getAccount(holder); + + if (account == null) { + return; + } + + Gringotts.instance.getDao().deleteAccount(account); + } + + /** + * Gringotts Account Balance Change. + * + * @param event the event + */ + @EventHandler + public void onBalanceChange(AccountBalanceChangeEvent event) { + GringottsLands.LOGGER.fine(event.toString()); + + if (!event.holder.getType().equals(this.getType())) { + GringottsLands.LOGGER.fine(event + ": ignore holder type " + event.holder.getType()); + return; + } + + double balance = Configuration.CONF.getCurrency().getDisplayValue(event.balance); + LandAccountHolder holder = (LandAccountHolder) this.getAccountHolder(event.holder.getId()); + + if (holder == null) { + GringottsLands.LOGGER.warning(event + ": gringotts account holder not found."); + return; + } + + if (holder.getLand().getBalance() == balance) { + GringottsLands.LOGGER.fine(event + ": ingore, gringotts account/land balance are identical."); + return; + } + + GringottsLands.LOGGER.fine(event + ": replicate Gringotts account balance change on Land."); + holder.getLand().setBalance(balance); + } + + /** + * Land Balance Change. + * + * @param event the event + */ + @EventHandler + public void onLandBankBalanceChanged(LandBankBalanceChangedEvent event) { + GringottsLands.LOGGER.fine(LogLandBankBalanceChangedEvent(event)); + + Land land = event.getLand(); + AccountHolder holder = getAccountHolder(land); + GringottsAccount account = Gringotts.instance.getAccounting().getAccount(holder); + double balance = Configuration.CONF.getCurrency().getDisplayValue(account.getBalance()); + + if (event.getNow() == balance) { + GringottsLands.LOGGER.fine(LogLandBankBalanceChangedEvent(event) + ": ignore, gringotts account/land balance are identical."); + return; + } + + GringottsLands.LOGGER.fine(LogLandBankBalanceChangedEvent(event) + ": replicate Land balance change on Gringotts account."); + long update = Configuration.CONF.getCurrency().getCentValue(event.getNow() - event.getPrevious()); + TransactionResult result; + if (update > 0) { + GringottsLands.LOGGER.fine(LogLandBankBalanceChangedEvent(event) + ": add " + update + " to Gringotts account."); + result = account.add(update); + } else { + GringottsLands.LOGGER.fine(LogLandBankBalanceChangedEvent(event) + ": remove " + update + " from Gringotts account."); + result = account.remove(Math.abs(update)); + } + + if (result != TransactionResult.SUCCESS) { + throw new IllegalStateException(account.owner.getId() + " account transaction error for " + (event.getNow() - event.getPrevious()) + " " + result); + } + } + + /** + * Player Withdraw from Land + * + * @param event the event + */ + @EventHandler + public void onLandBankWithdraw(LandBankWithdrawEvent event) { + GringottsLands.LOGGER.fine(event.getLogInfo()); + event.getLandPlayer().getPlayer().sendMessage("Land withdraw not supported by Gringotts integration."); + event.setCancelled(true); + } + + /** + * Player Deposit to a Land + * + * @param event the event + */ + @EventHandler + public void onLandBankDeposit(LandBankDepositEvent event) { + GringottsLands.LOGGER.fine(event.getLogInfo()); + event.getLandPlayer().getPlayer().sendMessage("Land deposit not supported by Gringotts integration."); + event.setCancelled(true); + } + + private static String LogLandBankBalanceChangedEvent(LandBankBalanceChangedEvent event) { + return event.getClass().getSimpleName() + "{land=" + event.getLand().getULID() + ",previous=" + event.getPrevious() + ",now=" + event.getNow() + "}"; + } + +} diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml new file mode 100644 index 0000000..af78429 --- /dev/null +++ b/src/main/resources/config.yml @@ -0,0 +1,18 @@ +# supported languages: "custom" (default, english), "de" (german), "fr" (french), and "pt-BR" (brazilian portuguese). +language: custom + +# changes the required sign name for the creation of land vaults +# Example: [land vault] +land_sign_vault_name: 'land' + +# Prevents players from creating a vault outside a land if set to true +vaults_only_in_lands: false + +# Maximum number of vaults a town can own, set to -1 for infinite number of vaults +max_land_vaults: -1 + +# balance to start an account with (purely virtual) +land_start_balance: 0 + +# Plugin debug +debug: false \ No newline at end of file diff --git a/src/main/resources/i18n/messages_fr.yml b/src/main/resources/i18n/messages_fr.yml new file mode 100644 index 0000000..f402de5 --- /dev/null +++ b/src/main/resources/i18n/messages_fr.yml @@ -0,0 +1,4 @@ +noLandVaultPerm: "Vous n'avez pas la permission de créer un coffre-fort de ville ici." +noLandFound: "Impossible de créer un coffre-fort de ville : La ville spécifiée n'existe pas." +vaultNotInLand: "Vous ne pouvez pas créer de coffre-fort en dehors des villes." +tooManyVaults: "Vous ne pouvez pas créer plus de coffre-fort ! Max : %max" \ No newline at end of file diff --git a/src/main/resources/messages.yml b/src/main/resources/messages.yml new file mode 100644 index 0000000..d6f2fdb --- /dev/null +++ b/src/main/resources/messages.yml @@ -0,0 +1,4 @@ +noLandVaultPerm: "You do not have permission to create land vaults here." +noLandFound: "Cannot create land vault: Land not found." +vaultNotInLand: "You cannot create vaults outside of lands." +tooManyVaults: "You cannot create more vaults! Max: %max" \ No newline at end of file diff --git a/target/classes/net/laboulangerie/gringottslands/GringottsLand.class b/target/classes/net/laboulangerie/gringottslands/GringottsLand.class deleted file mode 100644 index 1b549b8..0000000 Binary files a/target/classes/net/laboulangerie/gringottslands/GringottsLand.class and /dev/null differ diff --git a/target/classes/plugin.yml b/target/classes/plugin.yml deleted file mode 100644 index c1d5649..0000000 --- a/target/classes/plugin.yml +++ /dev/null @@ -1,6 +0,0 @@ -name: gringotts-lands -version: 1.0-SNAPSHOT -main: net.laboulangerie.gringottslands.GringottsLands -api-version: 1.19 -authors: ["Clem", "Grooble"] -depend: [Lands, Gringotts]