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]