Compare commits

...
7 Commits
Author SHA1 Message Date
Thijs Wiefferink e6c5653073 Changes config version number, adds a file check for schematics 2015-01-06 22:35:08 +01:00
Thijs Wiefferink ea31dfdd65 Update languages (pulled from Transifex) and change version number 2015-01-06 22:03:23 +01:00
Thijs Wiefferink 9da31fed1f Restored compatibility with WorldGuard 5.9
AreaShop will detect if you use a 5.x version or something else, with
5.x it will add players to the regions by name, and otherwise by UUID.
AreaShop will always save UUID's itself, so future upgrading to higher
WorldGuard versions will be no problem.
2015-01-06 16:02:00 +01:00
Thijs Wiefferink 9baf0b7eec Adds an update checker and fixes some possible bugs
The update checker checks for updates at BukkitDev, if an update is
found it will print a message in the console and notifies OPs when
joining the server. It will never download files itself. The update
check can be switched off in the config. Also tried to fix a bug with
the /as me command, which could break when the friends lists is broken.
2015-01-06 11:46:02 +01:00
Thijs Wiefferink a14dc4e541 Fix a bug with the periodic updating of signs
If there is no sign connected to the region it would spam an error to
the console when the periodic update task runs.
2014-12-29 16:39:54 +01:00
Thijs Wiefferink 00d3256716 Fix a bug with inactive player unrent/sell settings
If the 'inactiveTimeUntilUnrent' or 'inactiveTimeUntilSell' settings
would be set to a value above 35000 it would cause an integer overflow,
resulting in a 50% chance that all regions will be unrentend/sold (and
if that does not happen it will still sell/unrent them too early). This
is caused by an integer overflow, switching to long fixed this problem.
2014-12-18 16:21:07 +01:00
Thijs Wiefferink 40338b66df Fix a bug with the '/as settp' command not accepting arguments
The command would always try to detect regions at the location you are
standing and would not consider the region argument.
2014-12-16 20:21:33 +01:00
17 changed files with 1275 additions and 388 deletions

No files matched your search

+7 -3
View File
@@ -30,6 +30,9 @@ signTags:
add: '[as]'
## Enable sending stats to http://mcstats.org/ (Metrics plugin)
sendStats: true
## If enabled it will check for updates when loading the plugin, it will never download files, it will only notify about it
## A message will be printed in the console when an update is available and OPs will be notified when joining the server
checkForUpdates: true
## Use colors when sending messages to console and log files
useColorsInConsole: false
## Post error messages in the console when a command run from the config fails (from the 'runCommands' section for example)
@@ -37,7 +40,7 @@ postCommandErrors: true
## Enables / disables debug messages in the console, could be useful to figure out where errors come from
debug: false
## Version of the config, do not change!
version: 2.1.1
version: 2.1.2
# ┌────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
@@ -225,11 +228,12 @@ schematicProfiles:
restore: ''
## Flag profiles to specify what flags should be set on the WorldGuard regions
## All normal region flags as present in WorldGuard can be used, and also members, owners, priority and parent
## Each line represents a WorldGuard setting that should be set to a certain value when the region is in the specified state
## The members and owners flag normally take a list of UUID's separated by 'comma space', adding by name is possible with 'n:<name>'
## You can add groups by using 'g:<groupname>', so in total you could use: '%uuid%, %friendsuuid%, g:vip, n:cool-guy'
## For flags like 'entry' and 'exit' you can add group setting by using 'g:<scope>' behind it, <scope> is one of the following:
## members, non_members, owners, non_owners, all. Example, only owners can enter the region:
## entry: 'deny g:non_owners'
## entry: 'allow g:owners'
## Use '' for a flag to reset it.
flagProfiles:
default:
@@ -247,7 +251,7 @@ flagProfiles:
greeting: '%lang:prefix%%lang:greeting-bought%'
resale:
members: '%uuid%, %friendsuuid%'
greetin: '%lang:prefix%%lang:greeting-resale%'
greeting: '%lang:prefix%%lang:greeting-resale%'
## Profiles that specify when players should get messages about rent that almost run out
## The numbers that start sections in the profile specify how time before it actually runs out it should be executed
## When warnPlayer is set to true a message will be send that is specified in the language file
+45 -7
View File
@@ -1,6 +1,6 @@
# ╔════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╗
# ║ Language file of the AreaShop plugin created by NLThijs48, Github can be found at https://github.com/NLthijs48/AreaShop ║
# ║ Language: German, Version: V2.1.0, Percentage translated: 88%, author(s): Androkai ║
# ║ Language: German, Version: V2.1.2, Percentage translated: 100%, author(s): Androkai, Baummann ║
# ║ This file will be overwritten at each startup/reload of the plugin, if you want to change anything then do the following: ║
# ║ 1: Make a copy of this file ║
# ║ 2: Rename it to <servername>.yml (don't use a language code as filename, could otherwise be overwritten in future updates) ║
@@ -8,7 +8,7 @@
# ║ 4: Change the strings in the new file to your liking and save the file ║
# ║ 5: Use '/as reload' or reload/restart your server to see the changes ║
# ╚════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╝
total-maximum: "Du kannst nicht mehr als zusammen %0% Region(en) mieten/kaufen (Du hast bereits %1% in Gruppe '%2%')"
total-maximum: "Du kannst nicht mehr als %0% Region(en) mieten/kaufen (Du hast bereits %1% in Gruppe '%2%')"
cmd-notValid: "Der Befehl ist ungültig, nutze '/as help' für weitere Informationen"
cmd-onlyByPlayer: "Dieser Befehl kann nur von einem Spieler ausgeführt werden"
cmd-weOnlyByPlayer: "Eine WorldEdit-Selektion kann nur von einem Spieler gewählt werden, gib die Region als extra Argument an"
@@ -30,15 +30,15 @@ help-unrentOwn: "&6/as unrent &7-&r Kündige den Mietvertrag deiner Region"
help-sell: "&6/as sell &7-&r Verkaufe eine Region"
help-sellOwn: "&6/as sell &7-&r Verkaufe deine Region"
help-updaterents: "&6/as updaterents &7-&r Aktualisiere alle Mietschilder und -regionen"
help-updatebuys: "&6/as updatebuys &7-&r Aktualisiere alle Verkaufsschilder und -regionen"
help-reload: "&6/as reload &7-&r Lade die Konfigurations- und Sprachdateien neu ein"
help-updatebuys: "&6/as updatebuys &7-&r Aktualisiere alle Verkaufsschilder und Regionen"
help-reload: "&6/as reload &7-&r Lädt die Konfigurations- und Sprachdateien neu."
help-setrestore: "&6/as setrestore &7-&r Setze Wiederherstellung an/aus und wähle Profil"
help-setprice: "&6/as setprice &7-&r Ändere den Preis einer Region"
help-setduration: "&6/as setduration &7-&r Ändere die Mietdauer einer Region"
help-teleport: "&6/as tp &7-&r Teleportiere zu deiner gekauften/gemieteten Region"
help-teleportAll: "&6/as tp &7-&r Teleportiere zu einer gekauften/gemieteten Region"
help-setteleport: "&6/as settp &7-&r Erstelle Teleport-Punkt für eine gekaufte/gemietete Region"
help-setteleportAll: "&6/as settp &7-&r Erstelle Teleportpunkt für eine Region"
help-setteleport: "&6/as settp &7-&r Erstelle einen Teleport-Punkt für eine gekaufte/gemietete Region"
help-setteleportAll: "&6/as settp &7-&r Erstellt einen Teleportpunkt für eine Region"
help-find: "&6/as find &7-&r Finde eine Region, welche gekauft oder gemietet werden kann"
help-groupadd: "&6/as groupadd &7-&r Füge eine Region einer Gruppe hinzu"
help-groupdel: "&6/as groupdel &7-&r Entferne eine Region aus einer Gruppe"
@@ -52,7 +52,7 @@ help-delsign: "&6/as delsign &7-&r Lösche das Schild einer Region, welches du g
help-me: "&6/as me &7-&r Überprüfe, welche Regionen du besitzt (+Verfallsdatum)"
help-setowner: "&6/as setowner &7-&r Lege den Besitzer der Region fest oder verlängere die Mietdauer"
help-resell: "&6/as resell &7-&r Aktiviere den Weiterverkaufs-Modus für eine deiner Regionen"
help-resellAll: "&6/as resell &7-&r Aktiviere Weiterverkaufs-Modus für eine Region"
help-resellAll: "&6/as resell &7-&r Aktiviere den Weiterverkaufs-Modus für eine Region"
help-stopResell: "&6/as stopresell &7-&r Stoppe den Weiterverkauf deiner Region"
help-stopResellAll: "&6/as stopresell &7-&r Stoppe den Weiterverkauf einer Region"
help-addFriend: "&6/as addfriend &7-&r Füge einen Freund zu deiner Region hinzu"
@@ -131,7 +131,35 @@ info-playerNoRents: "%0% hat bisher keine Region(en) gemietet"
info-playerBuys: "Von %0% verkaufte Regionen: &7%1%"
info-playerNoBuys: "%0% hat bisher keine Region(en) gekauft"
info-regionHelp: "/as info region [Region], Wenn kein Regionsname angegeben wird, wird die Region genutzt, in der du dich gerade befindest"
info-regionHeaderRent: "&2Informationen über %region%:"
info-regionHeaderBuy: "&2Informationen über %region%:"
info-regionRented: "&2&l►&r Gemietet von %player% bis: &7%until%"
info-regionBought: "&2&l►&r Gekauft von %player%"
info-regionExtending: "&2&l►&r Preis zum Verlängern: &7%price% für %duration%"
info-regionCanBeRented: "&2&l►&r Preis zum Mieten: &7%price% für %duration%"
info-regionCanBeBought: "&2&l►&r Kaufpreis: &7%price%"
info-regionFriends: "&2&l►&r Freunde hinzugefügt: &7%friends%"
info-regionMoneyBackBuy: "&2&l►&r Verkaufpreis: &7%moneyback% (%moneybackpercent%% des Kaufpreises)"
info-regionMoneyBackRent: "&2&l►&r Rückzahlung bei Mietkündigung: &7%moneyback% (%moneybackpercent%% der verbleibenden Zeit)"
info-regionMaxExtends: "&2&l►&r Maximale Anzahl an Mietverlängerungen: &7%maxextends% mal"
info-regionNoExtending: "&2&l►&r Miete kann nicht verlängert werden"
info-regionExtendsLeft: "&2&l►&r Verbleibende Mietverlängerungen: &7%extendsleft% von %maxextends% mal"
info-regionMaxRentTime: "&2&l►&r Miete im Voraus: &7Maximal %maxrenttime%"
info-regionNoTeleport: "&2&l►&r Teleport-Position nicht gesetzt%0%"
info-regionTeleportHint: " &7(Benutze '/as settp' für einen bessere Position)"
info-regionTeleportAt: "&2&l►&r Teleport-Punkt bei: &7(%0%, %1%, %2%, %3%, Neigung:%4%, Drehung:%5%)"
info-regionSigns: "&2&l►&r Verbundene Schilder: &7%0%"
info-regionSignLocation: "&7(%0%, %1%, %2%, %3%)&r"
info-regionGroups: "&2&l►&r Zugewiesene Gruppen: &7%0%"
info-regionInactiveUnrent: "&2&l►&r Automatische Mietkündigung nach: &7%inactivetime% Inaktivität des Spielers"
info-regionInactiveSell: "&2&l►&r Automatischer Verkauf nach: &7%inactivetime% Inaktivität des Spielers"
info-regionRestrictedRegionRent: "&2&l►&r Um diese Region zu mieten, musst du dich in ihr befinden."
info-regionRestrictedWorldRent: "&2&l►&r Um diese Region zu mieten, musst du dich in der Welt '%world%' befinden."
info-regionRestrictedRegionBuy: "&2&l►&r Um diese Region zu kaufen, musst du dich in ihr befinden."
info-regionRestrictedWorldBuy: "&2&l►&r Um diese Region zu kaufen, musst du dich in der Welt '%world%' befinden."
info-regionRestoringRent: "&2&l►&r Die Wiederherstellung ist aktiviert. &7(Region wird bei Mietkündigung zurückgesetzt)%0%"
info-regionRestoringBuy: "&2&l►&r Die Wiederherstellung ist aktiviert. &7(Region wird beim Verkauf zurückgesetzt)%0%"
info-regionRestoringProfile: " (Profil: %0%)"
info-regionNoSign: "Für diese Region gibt es bisher kein Schild"
info-regionPriceDuration: "Preis: &7%0% pro %1%"
info-regionPrice: "Preis: &7%0%"
@@ -144,6 +172,8 @@ setrestore-help: "/as setrestore <Region> <true|false|general> [Profil]"
setrestore-noPermission: "Du bist nicht berechtigt, die Wiederherstellungs-Einstellungen zu verändern"
setrestore-notRegistered: "%0% ist nicht eingetragen"
setrestore-invalidSetting: "'%0%' ist kein gültiger Status, kann true sein, false oder general"
setrestore-success: "Wiederherstellungs-Einstellungen erfolgreich von %0% zu '%1%' geändert."
setrestore-successProfile: "Wiederherstellungs-Einstellung erfolgreich von %0% zu '%1%' und das Profil zu '%2%' geändert."
setprice-noPermission: "Du bist nicht berechtigt, den Preis einer Region zu ändern"
setprice-help: "/as setprice <Preis> [Region], Wenn kein Regionsname angegeben wird, wird die Region genutzt, in der du dich gerade befindest"
setprice-notRegistered: "%0% ist nicht in AreaShop eingetragen"
@@ -179,6 +209,8 @@ teleport-noPermission: "Du hast keine Rechte um dich zu dieser Region zu telepor
teleport-noPermissionOther: "Du bist nicht berechtigt, dich zu einer Region zu teleportieren, welche du nicht besitzt"
teleport-noPermissionSign: "Du hast keine Rechte um dich zu diesem Schild in deiner Region zu teleportieren"
teleport-noPermissionOtherSign: "Du fehlt die Berechtigung, dich zu Schildern von Regionen, die du nicht besitzt, zu teleportieren"
teleport-noPermissionFriend: "Du hast keine Berechtigungen zu Regionen zu teleporten, in denen du als Freund hinzugefügt worden bist."
teleport-noPermissionFriendSign: "Du hast keine Berechtigungen um zu dem Schild einer Region zu teleporten, in denen du als Freund hinzugefügt worden bist."
teleport-success: "Du wurdest zu %0% teleportiert"
teleport-successSign: "Du wurdest zu %0% teleportiert"
teleport-noSafe: "Keine sichere Position in %0% gefunden, kein Boden vorhanden oder maximale Anzahl an Versuchen erreicht (%1%/%2%)"
@@ -191,6 +223,7 @@ setteleport-success: "Teleport-Punkt von %0% erfolgreich gesetzt"
setteleport-notInside: "Der Teleportpunkt muss sich innerhalb einer Region befinden"
setteleport-reset: "Teleport-Punkt von %0% erfolgreich zurückgesetzt"
find-help: "/as find <buy|rent> [maximaler Preis] [Gruppe]"
find-noPermission: "Du hast keine Berechtigungen nach Regionen zu suchen und zu ihnen zu teleporten."
find-success: "%0% Region gefunden: %1%, bei Suche nach max. Preis in Höhe deines Guthabens: %2%%3%"
find-successMax: "%0% Region gefunden: %1%, bei Suche nach max. Preis in Höhe von %2%%3%"
find-wrongMaxPrice: "Der angegebene Maximal-Preis ist kein korrekter Betrag: %0%"
@@ -257,6 +290,11 @@ me-noRentRegions: "Du hast aktuell keine Regionen angemietet"
me-noBuyRegions: "Du hast aktuell keine Regionen im Besitz"
me-rentRegions: "Du hast die folgenden Regionen angemietet:"
me-buyRegions: "Du bist Eigentümer der folgenden Regionen:"
me-rentLine: "&2&l►&r %region% bis %until% &7(noch %timeleft% verbleibend)"
me-buyLine: "&2&l►&r %region%"
me-noFriendRegions: "Du wurdest noch nicht als Freund zu einer Region hinzugefügt."
me-friendRegions: "Du bist in folgenden Regionen als Freund hinzugefügt:"
me-friendLine: "&2&l►&r %region% &7(Besitzer: %player%)"
setowner-help: "/as setowner <Spieler> [Region], wenn kein Regionsname angegeben wird, wird die Region genutzt, in der du dich gerade befindest"
setowner-noPermission: "Dir fehlt die Berechtigung den Besitzer einer Region festzulegen."
setowner-noPermissionRent: "Dir fehlt die Berechtigung den Mieter einer Region festzulegen."
+4 -2
View File
@@ -1,6 +1,6 @@
# ╔════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╗
# ║ Language file of the AreaShop plugin created by NLThijs48, Github can be found at https://github.com/NLthijs48/AreaShop ║
# ║ Language: English, Version: V2.1.0, Percentage translated: 100% (source), author(s): NLThijs48 ║
# ║ Language: English, Version: V2.1.2, Percentage translated: 100% (source), author(s): NLThijs48 ║
# ║ This file will be overwritten at each startup/reload of the plugin, if you want to change anything then do the following: ║
# ║ 1: Make a copy of this file ║
# ║ 2: Rename it to <servername>.yml (don't use a language code as filename, could otherwise be overwritten in future updates) ║
@@ -384,4 +384,6 @@ greeting-forrent: "%region% can be rented for %price% per %duration%"
greeting-rented: "%region% is rented by %player% until %until%"
greeting-forsale: "%region% can be bought for %price%"
greeting-bought: "%region% is bought by %player%"
greeting-resale: "%region% can be bought for %resaleprice% from %player%"
greeting-resale: "%region% can be bought for %resaleprice% from %player%"
update-playerNotify: "&2Update from AreaShop V%0% to %1% available, get the latest version at http://dev.bukkit.org/bukkit-plugins/regionbuyandrent/"
+323 -323
View File
@@ -1,6 +1,6 @@
# ╔════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╗
# ║ Language file of the AreaShop plugin created by NLThijs48, Github can be found at https://github.com/NLthijs48/AreaShop ║
# ║ Language: French (Français), Version: V2.1.0, Percentage translated: 100%, author(s): BlaZingHope, Yaelknown ║
# ║ Language: French (Français), Version: V2.1.2, Percentage translated: 100%, author(s): BlaZingHope, Yaelknown, Dydy69 ║
# ║ This file will be overwritten at each startup/reload of the plugin, if you want to change anything then do the following: ║
# ║ 1: Make a copy of this file ║
# ║ 2: Rename it to <servername>.yml (don't use a language code as filename, could otherwise be overwritten in future updates) ║
@@ -8,342 +8,342 @@
# ║ 4: Change the strings in the new file to your liking and save the file ║
# ║ 5: Use '/as reload' or reload/restart your server to see the changes ║
# ╚════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╝
total-maximum: "Vous ne pouvez pas louer ou acheter plus de %0% région(s) au total (vous possédez déjà %1% dans le groupe '%2%')"
cmd-notValid: "Cette commande est incorrecte, utilisez '/as help' pour plus de détails"
cmd-onlyByPlayer: "Cette commande ne peut être utilisé que par un joueur"
cmd-weOnlyByPlayer: "Utiliser une séléction WorldEdit n'est possible qu'en tant que joueur. Spécifiez le nom de la région en argument supplémentaire."
cmd-noSelection: "Vous n'avez pas de séléction WorldEdit"
cmd-noRegionsFound: "Aucune région enregistré dans AreaShop n'a été trouvé dans votre séléction"
cmd-noWERegionsFound: "Aucun région WorldEdit croisant votre séléction n'a été trouvé"
cmd-notRegistered: "%0% n'est pas enregistré dans AreaShop"
cmd-noRegionsAtLocation: "Aucun région trouvée à votre emplacement, spécifiez la région comme un argument"
cmd-moreRegionsAtLocation: "Plus d'une région ont été trouvées à votre emplacement, spécifiez la région comme un argument"
cmd-automaticRegionOnlyByPlayer: "Déterminer la région automatiquement est disponible uniquement pour les joueurs, spécifiez la région comme un argument"
help-header: "Pade d'aide, Commande que vous pouvez éxécuter"
help-alias: "Alias des commandes: /areashop, /as"
help-help: "&6/as help &7-&r Affiche la page d'aide"
help-info: "&6/as info &7-&r Obtenir les infos sur les régions actuelles"
help-rent: "&6/as rent &7-&r Louer une région, ou prolonger la location actuelle"
help-buy: "&6/as buy &7-&r Acheter une région"
help-unrent: "&6/as unrent &7-&r Dé-louer une région"
help-unrentOwn: "&6/as unrent &7-&r Dé-louer votre propre région"
help-sell: "&6/as sell &7-&r Vendre une région"
help-sellOwn: "&6/as sell &7-&r Vendre votree propre région"
help-updaterents: "&6/as updaterents &7-&r Mettre à jours toutes les pancartes et les régions louées."
help-updatebuys: "&6/as updatebuys &7-&r Mettre à jours toutes les pancartes et les régions achetées"
help-reload: "&6/as reload &7-&r Recharge les configs et langages"
help-setrestore: "&6/as setrestore &7-&r Activer ou désactiver la restauration et choisir le profil"
help-setprice: "&6/as setprice &7-&r Changer le prix d'une région"
help-setduration: "&6/as setduration &7-&r Changer le temps de location d'une région"
help-teleport: "&6/as tp &7-&r Téléportation vers votre région acheté / louée"
help-teleportAll: "&6/as tp &7-&r Téléportation vers une région louée / acheté"
help-setteleport: "&6/as settp &7-&r Définie la position de téléportation pour la région louée / acheté"
help-setteleportAll: "&6/as settp &7-&r Défini la position de téléportation pour une région"
help-find: "&6/as find &7-&r trouve un achat ou une location vide"
help-groupadd: "&6/as groupadd &7-&r Ajoute une région à un groupe"
help-groupdel: "&6/as groupdel &7-&r Supprime une région d'un groupe"
help-grouplist: "&6/as grouplist &7-&r Affiche tout les groupes enregistrés"
help-groupinfo: "&6/as groupinfo &7-&r Affiche les informations d'un groupe"
help-schemevent: "&6/as schemevent &7-&r Déclanche un évenement schématique d'une région"
help-add: "&6/as add &7-&r Enregistre une région comme louée ou acheté"
help-del: "&6/as del &7-&r Supprime une région enregistré dans AreaShop"
help-addsign: "&6/as addsign &7-&r Ajoute une pancarte à une région existante"
help-delsign: "&6/as delsign &7-&r Supprime la pancarte que vous regardez"
help-me: "&6/as me &7-&r Voir les régions que vous possédez (et le temps restant)"
help-setowner: "&6/as setowner &7-&r Change le propriétaire d'une région ou allonge le temps de location"
help-resell: "&6/as resell &7-&r Mettre une de vos région(s) en vente"
help-resellAll: "&6/as resell &7-&r Mettre une région en vente"
help-stopResell: "&6/as stopresell &7-&r Ne plus revendre votre région"
help-stopResellAll: "&6/as stopresell &7-&r Récupérer une de vos région(s)"
help-addFriend: "&6/as addfriend &7-&r Ajouter un ami à votre région"
help-addFriendAll: "&6/as addfriend &7-&r Ajouter un ami à une région"
help-delFriend: "&6/as delfriend &7-&r Supprimer un ami de votre région"
help-delFriendAll: "&6/as delfriend &7-&r Supprimer un ami d'une région"
rent-help: "/as rent [regionname], Si non spécifié, cible la région dans laquelle vous vous trouvez"
rent-noPermission: "Vous n'avez pas la permission de louer une région"
rent-maximum: "Vous ne pouvez pas louer plus de %0% région(s) au total (vous possédez déjà %1% dans le groupe '%2%')"
rent-payError: "Une erreur durant le paiement s'est produite. Essayez de nouveau plus tard"
rent-rented: "Vous avez loué de %0% jusqu'à %1%"
rent-extended: "Vous avez prolongé la location de %0% jusqu'à %1%"
rent-extend: "Vous pouvez prolonger votre location avec un clic droit sur la pancarte, ou en utilisant /as rent"
rent-lowMoneyExtend: "Vous n'avez pas assez d'argent pour prolonger la location. (Vous possédez %0% et devez payer %1%)"
rent-lowMoneyRent: "Vous n'avez pas assez d'argent pour louer cette région. (Vous possédez %0% et devez payer %1%)"
rent-someoneElse: "Quelqu'un d'autre a déjà louer cette région"
rent-notRentable: "cette région n'est pas disponible à la location"
rent-maxExtends: "Vous ne pouvez plus prolonger cette location. (Le maximum est de %0% fois). Mais lorsque la location sera terminé, vous pourrez louer de nouveau cette région"
rent-maxRentTime: "Vous ne pouvez pas louer plus longtemps à l'avance, le maximum est de %0% minutes et vous avez déjà loué pour %1% minutes"
rent-restrictedToWorld: "Vous devez être dans le monde '%0%' pour louer cette région (vous êtes dans '%1%')"
rent-restrictedToRegion: "Vous devez être dans la région '%0%' pour la louer"
rent-expireWarning: "Votre région %region% n'a plus que %timeleft% de temps de location, soyez sûr d'allonger ce temps de location si vous voulez la conserver"
buy-help: "/as buy [regionname], Si non spécifié, cible la région dans laquelle vous vous trouvez"
buy-noPermission: "Vous n'avez pas la permission d'acheter une région"
buy-notBuyable: "cette région n'est pas disponible à l'achat"
buy-maximum: "Vous ne pouvez pas acheter plus de %0% région(s) au total (vous possédez déjà %1% dans le groupe '%2%')"
buy-payError: "Une erreur durant le paiement s'est produite. Essayez de nouveau plus tard"
buy-succes: "Vous avez acheté %0% avec succès"
buy-successResale: "Vous avez acheté %0% à %1%"
buy-successSeller: "Votre région %0% a été vendue pour %1% à %2%"
buy-lowMoney: "Vous n'avez pas assez d'argent pour acheter cette région. (Vous possédez %0% et devez payer %1%)"
buy-yours: "Vous avez déjà acheter cette région"
buy-someoneElse: "Quelqu'un a déjà acheté cette région"
buy-restrictedToWorld: "Vous devez être dans le monde '%0%' pour acheter cette région (vous êtes dans '%1%')"
buy-restrictedToRegion: "Vous devez être dans '%0%' pour l'acheter"
unrent-help: "/as unrent [regionname], Si non spécifié, cible la région dans laquelle vous vous trouvez"
unrent-noPermission: "Vous n'avez pas la permission de dé-louer une région"
unrent-noPermissionOther: "Vous n'avez pas la permission de délouer une autre région"
unrent-notRegistered: "La région ne peut pas être dé-louée car elle n'est pas enregistré à la location"
unrent-notRented: "La région ne peut pas être dé-louée car elle n'est pas loué"
total-maximum: "Vous ne pouvez pas louer ou acheter plus de %0% région(s) au total (vous possédez déjà %1% dans le groupe '%2%')."
cmd-notValid: "Cette commande est incorrecte, utilisez '/as help' pour plus de détails."
cmd-onlyByPlayer: "Cette commande ne peut être utilisée que par un joueur."
cmd-weOnlyByPlayer: "Utiliser une sélection WorldEdit n'est possible qu'en tant que joueur. Spécifiez le nom de la région en argument supplémentaire."
cmd-noSelection: "Vous n'avez pas de séléction WorldEdit."
cmd-noRegionsFound: "Aucune région enregistrée dans AreaShop n'a été trouvée dans votre séléction."
cmd-noWERegionsFound: "Aucune région WorldEdit croisant votre séléction n'a été trouvée."
cmd-notRegistered: "'%0%' n'est pas enregistrée dans AreaShop."
cmd-noRegionsAtLocation: "Aucune région trouvée à votre emplacement, spécifiez la région comme un argument."
cmd-moreRegionsAtLocation: "Plus d'une région ont été trouvées à votre emplacement, spécifiez la région comme un argument."
cmd-automaticRegionOnlyByPlayer: "Déterminer la région automatiquement est disponible uniquement pour les joueurs, spécifiez la région comme un argument."
help-header: "Page d'aide, commandes que vous pouvez exécuter."
help-alias: "Alias des commandes : /areashop, /as"
help-help: "&6/as help &7-&r Affiche la page d'aide."
help-info: "&6/as info &7-&r Obtenir les infos sur les régions actuelles."
help-rent: "&6/as rent &7-&r Louer une région, ou prolonger la location actuelle."
help-buy: "&6/as buy &7-&r Acheter une région."
help-unrent: "&6/as unrent &7-&r Dé-louer une région."
help-unrentOwn: "&6/as unrent &7-&r Dé-louer votre propre région."
help-sell: "&6/as sell &7-&r Vendre une région."
help-sellOwn: "&6/as sell &7-&r Vendre votre propre région."
help-updaterents: "&6/as updaterents &7-&r Mettre à jour toutes les pancartes et les régions louées."
help-updatebuys: "&6/as updatebuys &7-&r Mettre à jour toutes les pancartes et les régions achetées."
help-reload: "&6/as reload &7-&r Recharge les configurations et langages."
help-setrestore: "&6/as setrestore &7-&r Activer ou désactiver la restauration et choisir le profil."
help-setprice: "&6/as setprice &7-&r Changer le prix d'une région."
help-setduration: "&6/as setduration &7-&r Changer le temps de location d'une région."
help-teleport: "&6/as tp &7-&r Téléportation vers votre région achetée / louée."
help-teleportAll: "&6/as tp &7-&r Téléportation vers une région louée / achetée."
help-setteleport: "&6/as settp &7-&r Définit la position de téléportation pour la région louée / achetée."
help-setteleportAll: "&6/as settp &7-&r Définit la position de téléportation pour une région."
help-find: "&6/as find &7-&r Trouve un achat ou une location vide."
help-groupadd: "&6/as groupadd &7-&r Ajoute une région à un groupe."
help-groupdel: "&6/as groupdel &7-&r Supprime une région d'un groupe."
help-grouplist: "&6/as grouplist &7-&r Affiche tous les groupes enregistrés."
help-groupinfo: "&6/as groupinfo &7-&r Affiche les informations d'un groupe."
help-schemevent: "&6/as schemevent &7-&r Déclenche un événement schématique d'une région."
help-add: "&6/as add &7-&r Enregistre une région comme louée ou achetée."
help-del: "&6/as del &7-&r Supprime une région enregistrée dans AreaShop."
help-addsign: "&6/as addsign &7-&r Ajoute une pancarte à une région existante."
help-delsign: "&6/as delsign &7-&r Supprime la pancarte que vous regardez."
help-me: "&6/as me &7-&r Voir les régions que vous possédez (et le temps restant)."
help-setowner: "&6/as setowner &7-&r Change le propriétaire d'une région ou allonge le temps de location."
help-resell: "&6/as resell &7-&r Mettre une de vos régions en vente."
help-resellAll: "&6/as resell &7-&r Mettre une région en vente."
help-stopResell: "&6/as stopresell &7-&r Ne plus revendre votre région."
help-stopResellAll: "&6/as stopresell &7-&r Récupérer une de vos régions."
help-addFriend: "&6/as addfriend &7-&r Ajouter un ami à votre région."
help-addFriendAll: "&6/as addfriend &7-&r Ajouter un ami à une région."
help-delFriend: "&6/as delfriend &7-&r Supprimer un ami de votre région."
help-delFriendAll: "&6/as delfriend &7-&r Supprimer un ami d'une région."
rent-help: "/as rent [regionname], Si non spécifiée, cible la région dans laquelle vous vous trouvez."
rent-noPermission: "Vous n'avez pas la permission de louer une région."
rent-maximum: "Vous ne pouvez pas louer plus de %0% région(s) au total (vous possédez déjà %1% dans le groupe '%2%')."
rent-payError: "Une erreur durant le paiement s'est produite. Essayez de nouveau plus tard."
rent-rented: "Vous avez loué de %0% jusqu'à %1%."
rent-extended: "Vous avez prolongé la location de %0% jusqu'à %1%."
rent-extend: "Vous pouvez prolonger votre location avec un clic droit sur la pancarte, ou en utilisant /as rent."
rent-lowMoneyExtend: "Vous n'avez pas assez d'argent pour prolonger la location (vous possédez %0% et devez payer %1%)."
rent-lowMoneyRent: "Vous n'avez pas assez d'argent pour louer cette région (vous possédez %0% et devez payer %1%)."
rent-someoneElse: "Quelqu'un d'autre loue déjà cette région."
rent-notRentable: "Cette région n'est pas disponible à la location."
rent-maxExtends: "Vous ne pouvez plus prolonger cette location (le maximum est de %0% fois). Mais lorsque la location sera terminée, vous pourrez de nouveau louer cette région."
rent-maxRentTime: "Vous ne pouvez pas louer plus longtemps à l'avance, le maximum est de %0% minutes et vous avez déjà loué pour %1% minutes."
rent-restrictedToWorld: "Vous devez être dans le monde '%0%' pour louer cette région (vous êtes dans '%1%')."
rent-restrictedToRegion: "Vous devez être dans la région '%0%' pour la louer."
rent-expireWarning: "Votre région '%region%' n'a plus que %timeleft% de temps de location, soyez sûr d'allonger ce temps de location si vous voulez la conserver."
buy-help: "/as buy [regionname], Si non spécifiée, cible la région dans laquelle vous vous trouvez."
buy-noPermission: "Vous n'avez pas la permission d'acheter une région."
buy-notBuyable: "Cette région n'est pas disponible à l'achat."
buy-maximum: "Vous ne pouvez pas acheter plus de %0% région(s) au total (vous possédez déjà %1% dans le groupe '%2%')."
buy-payError: "Une erreur durant le paiement s'est produite. Essayez de nouveau plus tard."
buy-succes: "Vous venez d'acheter la région '%0%'."
buy-successResale: "Vous venez d'acheter '%0%' à %1%."
buy-successSeller: "Votre région '%0%' a été vendue pour %1% à %2%."
buy-lowMoney: "Vous n'avez pas assez d'argent pour acheter cette région (vous possédez %0% et devez payer %1%)."
buy-yours: "Vous avez déjà acheté cette région."
buy-someoneElse: "Quelqu'un a déjà acheté cette région."
buy-restrictedToWorld: "Vous devez être dans le monde '%0%' pour acheter cette région (vous êtes dans '%1%')."
buy-restrictedToRegion: "Vous devez être dans '%0%' pour l'acheter."
unrent-help: "/as unrent [regionname], Si non spécifiée, cible la région dans laquelle vous vous trouvez."
unrent-noPermission: "Vous n'avez pas la permission de dé-louer une région."
unrent-noPermissionOther: "Vous n'avez pas la permission de dé-louer une autre région."
unrent-notRegistered: "La région ne peut pas être dé-louée car elle n'est pas enregistrée en tant que location."
unrent-notRented: "La région ne peut pas être dé-louée car elle n'est pas louée."
unrent-unrented: "Votre région a été dé-louée."
unrent-other: "La région du joueur %0% a été dé-louée"
unrent-expired: "Votre location de %0% a expiré"
sell-help: "/as sell [regionname], Si non spécifié, cible la région dans laquelle vous vous trouvez"
sell-notRegistered: "la région ne peut pas être vendue car elle n'est pas enregistré comme acheté"
sell-notBought: "La région ne peut pas être vendue car elle n'est pas la propriété de quelqu'un"
sell-sold: "Cette région a été vendu au joueur %0%"
sell-soldYours: "Votre région a été vendue"
sell-noPermission: "Vous n'avez pas la permission de vendre une région"
sell-noPermissionOther: "Vous n'avez pas la permission de vendre une autre région"
rents-updated: "Tout les panneaux et régions en location ont été mis à jour"
rents-noPermission: "Vous n'avez pas la permission de mettre à jour les panneaux et régions en location"
rents-notUpdated: "Tout les panneaux n'ont pas été mis à jour. Recharger peut corriger le problème"
buys-updated: "Tout les panneaux et régions en vente ont été mis à jour"
buys-noPermission: "Vous n'avez pas la permission de mettre à jour les panneaux et régions en vente"
buys-notUpdated: "Tout les panneaux n'ont pas été mis à jour. Recharger peut corriger le problème"
reload-reloaded: "La configuration a bien été rechargée"
reload-noPermission: "Vous n'avez pas la permission de recharger la configuration"
unrent-other: "La région du joueur %0% a été dé-louée."
unrent-expired: "Votre location de '%0%' a expiré."
sell-help: "/as sell [regionname], Si non spécifiée, cible la région dans laquelle vous vous trouvez."
sell-notRegistered: "La région ne peut pas être vendue car elle n'est pas enregistrée comme achetée."
sell-notBought: "La région ne peut pas être vendue car elle n'est pas la propriété de quelqu'un."
sell-sold: "Cette région a été vendue au joueur %0%."
sell-soldYours: "Votre région a été vendue."
sell-noPermission: "Vous n'avez pas la permission de vendre une région."
sell-noPermissionOther: "Vous n'avez pas la permission de vendre une autre région."
rents-updated: "Tout les panneaux et régions en location ont été mis à jour."
rents-noPermission: "Vous n'avez pas la permission de mettre à jour les panneaux et régions en location."
rents-notUpdated: "Tout les panneaux n'ont pas été mis à jour. Recharger le serveur peut corriger le problème."
buys-updated: "Tous les panneaux et régions en vente ont été mis à jour."
buys-noPermission: "Vous n'avez pas la permission de mettre à jour les panneaux et régions en vente."
buys-notUpdated: "Tous les panneaux n'ont pas été mis à jour. Recharger le serveur peut corriger le problème."
reload-reloaded: "La configuration a bien été rechargée."
reload-noPermission: "Vous n'avez pas la permission de recharger la configuration."
info-help: "/as info <all|rented|forrent|sold|forsale|player|region>"
info-noPermission: "Vous n'avez pas la permission d'avoir des informations à propos des régions"
info-all-rents: "Régions enregistrées en location: &7%0%"
info-all-noRents: "Il n'y a pas de régions enregistrées en location"
info-all-buys: "Régions enregistrées en vente: &7%0%"
info-all-noBuys: "Il n'y a pas de régions enregistrées en achat"
info-rented: "Régions louées: &7%0%"
info-noRented: "Aucune régions louée"
info-unrented: "régions non louées: &7%0%"
info-noUnrented: "Toutes les régions sont louées"
info-sold: "Régions vendues: &7%0%"
info-noSold: "Aucune région n'est vendue"
info-forsale: "Région en vente: &7%0%"
info-noForsale: "Toutes les régions sont vendues"
info-noPermission: "Vous n'avez pas la permission d'avoir des informations à propos des régions."
info-all-rents: "Régions enregistrées en location : &7%0%"
info-all-noRents: "Il n'y a pas de régions enregistrées en location."
info-all-buys: "Régions enregistrées en vente : &7%0%"
info-all-noBuys: "Il n'y a pas de régions enregistrées en achat."
info-rented: "Régions louées : &7%0%"
info-noRented: "Aucune région louée."
info-unrented: "Régions non louées : &7%0%"
info-noUnrented: "Toutes les régions sont louées."
info-sold: "Régions vendues : &7%0%"
info-noSold: "Aucune région n'est vendue."
info-forsale: "Régions en vente : &7%0%"
info-noForsale: "Toutes les régions sont vendues."
info-playerHelp: "/as info player <name>"
info-playerRents: "Regions louées par %0%: &7%1%"
info-playerNoRents: "%0% n'a de région louée"
info-playerBuys: "Régions achetés par %0%: &7%1%"
info-playerNoBuys: "%0% n'a pas acheté de région"
info-regionHelp: "/as info region [name], Si non spécifié, cible la région dans laquelle vous vous trouvez"
info-regionHeaderRent: "&2Informations à propos de %region%:"
info-regionHeaderBuy: "&2Informations à propos de %region%:"
info-regionRented: "&2&l►&r Loué par %player% until: &7%until%"
info-regionBought: "&2&l►&r Acheté par %player%"
info-regionExtending: "&2&l►&r Prix pour allonger: &7%price% pour %duration%"
info-regionCanBeRented: "&2&l►&r Prix pour louer: &7%price% pour %duration%"
info-regionCanBeBought: "&2&l►&r Prix d'achat: &7%price%"
info-regionFriends: "&2&l►&r Ami(s) ajouté(s): &7%friends%"
info-regionMoneyBackBuy: "&2&l►&r Prix de revente: &7%moneyback% (%moneybackpercent%% du prix)"
info-regionMoneyBackRent: "&2&l►&r Remboursement de location: &7%moneyback% (%moneybackpercent%% du temps restant)"
info-regionMaxExtends: "&2&l►&r Allongement maximum: &7%maxextends% fois"
info-regionNoExtending: "&2&l►&r La location ne peut être allongée"
info-regionExtendsLeft: "&2&l►&r Allongements restants: &7%extendsleft% fois sur %maxextends%"
info-regionMaxRentTime: "&2&l►&r Location à l'avance: &7%maxrenttime% au maximum"
info-regionNoTeleport: "&2&l►&r Emplacement de téléportation non défini%0%"
info-playerRents: "Régions louées par %0% : &7%1%"
info-playerNoRents: "%0% n'a de régions louées."
info-playerBuys: "Régions achetées par %0% : &7%1%"
info-playerNoBuys: "%0% n'a pas acheté de régions."
info-regionHelp: "/as info region [name], Si non spécifiée, cible la région dans laquelle vous vous trouvez."
info-regionHeaderRent: "&2Informations à propos de '%region%' :"
info-regionHeaderBuy: "&2Informations à propos de '%region%' :"
info-regionRented: "&2&l►&r Louée par %player% jusqu'à : &7%until%"
info-regionBought: "&2&l►&r Achetée par %player%"
info-regionExtending: "&2&l►&r Prix pour allonger : &7%price% pour %duration%"
info-regionCanBeRented: "&2&l►&r Prix pour louer : &7%price% pour %duration%"
info-regionCanBeBought: "&2&l►&r Prix d'achat : &7%price%"
info-regionFriends: "&2&l►&r Ami(s) ajouté(s) : &7%friends%"
info-regionMoneyBackBuy: "&2&l►&r Prix de revente : &7%moneyback% (%moneybackpercent%% du prix)"
info-regionMoneyBackRent: "&2&l►&r Remboursement de location : &7%moneyback% (%moneybackpercent%% du temps restant)"
info-regionMaxExtends: "&2&l►&r Allongement maximum : &7%maxextends% fois"
info-regionNoExtending: "&2&l►&r La location ne peut être allongée."
info-regionExtendsLeft: "&2&l►&r Allongements restants : &7%extendsleft% fois sur %maxextends%"
info-regionMaxRentTime: "&2&l►&r Location à l'avance : &7%maxrenttime% au maximum"
info-regionNoTeleport: "&2&l►&r Emplacement de téléportation non défini%0%."
info-regionTeleportHint: "&7(utilisez '/as settp' pour un meilleur emplacement)"
info-regionTeleportAt: "&2&l►&r Emplacement de téléportation défini à: &7(%0%, %1%, %2%, %3%, pitch:%4%, yaw:%5%)"
info-regionSigns: "&2&l►&r Pancartes connectées: &7%0%"
info-regionTeleportAt: "&2&l►&r Emplacement de téléportation défini à : &7(%0%, %1%, %2%, %3%, pitch:%4%, yaw:%5%)"
info-regionSigns: "&2&l►&r Pancartes connectées : &7%0%"
info-regionSignLocation: "&7(%0%, %1%, %2%, %3%)&r"
info-regionGroups: "&2&l►&r Assigné aux groupes: &7%0%"
info-regionInactiveUnrent: "&2&l►&r Fin de le location automatique après: &7%inactivetime% de temps d'inactivité du joueur"
info-regionInactiveSell: "&2&l►&r Revente automatique après: &7%inactivetime% de temps d'inactivité du joueur"
info-regionRestrictedRegionRent: "&2&l►&r Pour louer cette région, vous devez être à l'intérieur"
info-regionRestrictedWorldRent: "&2&l►&r Pour louer cette région vous devez être dans le monde '%world%'"
info-regionRestrictedRegionBuy: "&2&l►&r Pour acheter cette région vous devez être à l'intérieur"
info-regionRestrictedWorldBuy: "&2&l►&r Pour acheter cette région vous devez être dans le monde '%world%'"
info-regionGroups: "&2&l►&r Assigné aux groupes : &7%0%"
info-regionInactiveUnrent: "&2&l►&r Fin de le location automatique après : &7%inactivetime% de temps d'inactivité du joueur"
info-regionInactiveSell: "&2&l►&r Revente automatique après : &7%inactivetime% de temps d'inactivité du joueur"
info-regionRestrictedRegionRent: "&2&l►&r Pour louer cette région, vous devez être à l'intérieur."
info-regionRestrictedWorldRent: "&2&l►&r Pour louer cette région, vous devez être dans le monde '%world%'."
info-regionRestrictedRegionBuy: "&2&l►&r Pour acheter cette région, vous devez être à l'intérieur de cellle-ci."
info-regionRestrictedWorldBuy: "&2&l►&r Pour acheter cette région, vous devez être dans le monde '%world%'."
info-regionRestoringRent: "&2&l►&r La restauration est activée &7(la région sera remise à zéro a la fin de la location)%0%"
info-regionRestoringBuy: "&2&l►&r La restauration est activée &7(la région sera remise à zéro a la fin de la location)%0%"
info-regionRestoringProfile: "(profil: %0%)"
info-regionNoSign: "Il n'y a pas de panneaux enregistré pour cette région"
info-regionPriceDuration: "Prix: &7%0% pour chaque %1%"
info-regionPrice: "Prix: &7%0%"
info-regionRestore: "Réstauration activé: &7%0%"
info-regionRestoreProfile: "profil de restauration: &7%0%"
info-regionTPLocation: "lieu de téléportation: &7World=%0%, X=%1%, Y=%2%, Z=%3%, Pitch=%4%, Yaw=%5%"
info-regionNoTP: "Aucun lieu de téléportation défini"
info-regionNotExisting: "La région %0% n'est pas enregistrée"
info-regionRestoringProfile: "(Profil : %0%)"
info-regionNoSign: "Il n'y a pas de panneau enregistré pour cette région."
info-regionPriceDuration: "Prix : &7%0% pour chaque %1%"
info-regionPrice: "Prix : &7%0%"
info-regionRestore: "Restauration activée : &7%0%"
info-regionRestoreProfile: "Profil de restauration : &7%0%"
info-regionTPLocation: "Lieu de téléportation : &7World=%0%, X=%1%, Y=%2%, Z=%3%, Pitch=%4%, Yaw=%5%"
info-regionNoTP: "Aucun lieu de téléportation défini."
info-regionNotExisting: "La région '%0%' n'est pas enregistrée."
setrestore-help: "/as setrestore <region> <true|false|general> [profile]"
setrestore-noPermission: "Vous n'avez pas la permission de restaurer les paramètres"
setrestore-notRegistered: "%0% n'est pas enregistré"
setrestore-invalidSetting: "'%0%' est invalide. Doit être true, false ou general"
setrestore-success: "Paramètre de restauration défini de %0% à %1% avec succès"
setrestore-successProfile: "Paramètre de restauration défini de %0% à %1% et le profil à '%2%' avec succès"
setprice-noPermission: "Vous n'avez pas la permission de changer le prix d'une région"
setprice-help: "/as setprice <price> [region], Si non spécifié, cible la région dans laquelle vous vous trouvez"
setprice-notRegistered: "%0% n'est pas enregistré dans AreaShop"
setprice-wrongPrice: "'%0%' n'est pas un rpix valide"
setprice-successRent: "Prix de la région %0% changé de %1% à %2%"
setprice-successBuy: "Pprix de la région %0% changé à %1%"
setduration-noPermission: "Vous n'avez pas la permission de changer le temps d'une location"
setduration-help: "/as setduration <amount> <identifier> [region], la région dans laquelle vous vous trouvez sera utilisée si vous ne précisez pas"
setduration-notRegistered: "%0% n'est pas enregistré comme à louer"
setduration-wrongAmount: "'%0%' n'est pas un montant valide, utilisez un nombre entier"
setduration-wrongFormat: "'%0%' n'est pas un format de temps valide, regardez la documentation de Bukkit"
setduration-success: "Temps de location %0% changé à '%1%'"
setup-noRegion: "Vous n'avez pas spécifié une région à la seconde ligne"
setup-wrongRegion: "la région que vous avez spécifié n'existe pas"
setup-alreadyRentSign: "La région que vous avez spécifiée possède déjà un panneau de location"
setup-alreadyBuySign: "La région que vous avez spécifiée possède déjà un panneau de vente"
setup-noDuration: "A la troisième ligne, vous n'avez pas spécifié la durée de location de la région"
setup-wrongDuration: "Le temps spécifié n'est pas au bon format. Exemple: 1 day"
setup-noPrice: "A la quatrième ligne, vous n'avez pas spécifié le prix"
setup-wrongPrice: "Vous n'avez pas indiqué un prix correcte, utilisez un nombre entier"
setup-rentSuccess: "La location de la région %0% est correctement configurée"
setup-buySuccess: "L'achat de la région %0% est correctement configuré"
setup-noPermissionRent: "Vous n'avez pas la permission de mettre en place la location de régions"
setup-noPermissionBuy: "Vous n'avez pas la permission de mettre en place l'achat de régions"
setup-couldNotDetect: "Multiples régions trouvées avec la même priorité et/ou parent/enfant relation. Spécifiez en un sur la deuxième ligne. (2 des régions trouvées: %0% et %1%)"
destroy-noPermissionRent: "Vous n'avez pas la permission de détruire le panneau de location d'une région"
destroy-noPermissionBuy: "Vous n'avez pas la permission de détruire le panneau de vente d'une région"
destroy-successRent: "Location de %0% supprimé"
destroy-successBuy: "Achat de %0% supprimé"
setrestore-noPermission: "Vous n'avez pas la permission de restaurer les paramètres."
setrestore-notRegistered: "'%0%' n'est pas enregistré."
setrestore-invalidSetting: "'%0%' est invalide. Doit être true, false ou general."
setrestore-success: "Paramètre de restauration défini de %0% à %1% avec succès."
setrestore-successProfile: "Paramètre de restauration défini de %0% à %1% et le profil à '%2%' avec succès."
setprice-noPermission: "Vous n'avez pas la permission de changer le prix d'une région."
setprice-help: "/as setprice <price> [region], Si non spécifiée, cible la région dans laquelle vous vous trouvez."
setprice-notRegistered: "%0% n'est pas enregistrée dans AreaShop."
setprice-wrongPrice: "'%0%' n'est pas un prix valide."
setprice-successRent: "Prix de la région '%0%' changé de %1% à %2%."
setprice-successBuy: "Prix de la région '%0%' changé à %1%."
setduration-noPermission: "Vous n'avez pas la permission de changer le temps d'une location."
setduration-help: "/as setduration <amount> <identifier> [region], la région dans laquelle vous vous trouvez sera utilisée si vous ne précisez pas quelle région doit être utilisée."
setduration-notRegistered: "%0% n'est pas enregistrée comme à louer."
setduration-wrongAmount: "'%0%' n'est pas un montant valide, utilisez un nombre entier."
setduration-wrongFormat: "'%0%' n'est pas un format de temps valide, regardez la documentation de Bukkit."
setduration-success: "Temps de location de la région '%0%' changé à '%1%'."
setup-noRegion: "Vous n'avez pas spécifié de région à la seconde ligne."
setup-wrongRegion: "La région que vous avez spécifiée n'existe pas."
setup-alreadyRentSign: "La région que vous avez spécifiée possède déjà un panneau de location."
setup-alreadyBuySign: "La région que vous avez spécifiée possède déjà un panneau de vente."
setup-noDuration: "A la troisième ligne, vous n'avez pas spécifié la durée de location de la région."
setup-wrongDuration: "Le temps spécifié n'est pas au bon format. Exemple : 1 day."
setup-noPrice: "A la quatrième ligne, vous n'avez pas spécifié le prix."
setup-wrongPrice: "Vous n'avez pas indiqué un prix correct, utilisez un nombre entier."
setup-rentSuccess: "La location de la région '%0%' est correctement configurée."
setup-buySuccess: "L'achat de la région '%0%' est correctement configuré."
setup-noPermissionRent: "Vous n'avez pas la permission de mettre en place la location de régions."
setup-noPermissionBuy: "Vous n'avez pas la permission de mettre en place l'achat de régions."
setup-couldNotDetect: "Multiples régions trouvées avec la même priorité et/ou étant de même nature : parent ou enfant. Spécifiez-en une sur la deuxième ligne. (2 des régions trouvées: %0% et %1%)."
destroy-noPermissionRent: "Vous n'avez pas la permission de détruire le panneau de location d'une région."
destroy-noPermissionBuy: "Vous n'avez pas la permission de détruire le panneau de vente d'une région."
destroy-successRent: "Location de '%0%' supprimée."
destroy-successBuy: "Achat de '%0%' supprimé."
teleport-help: "/as tp <region> [sign]"
teleport-noRentOrBuy: "La région '%0%' n'est pas enregistré comme location ou achat"
teleport-noPermission: "Vous n'avez pas la permission de vous téléporter à votre région"
teleport-noPermissionOther: "Vous n'avez pas la permission de vous téléporter à une région qui ne vous appartient pas"
teleport-noPermissionSign: "Vous n'avez pas la permission de vous téléporter à la pancarte de votre région"
teleport-noPermissionOtherSign: "Vous n'avez pas la permission de vous téléporter aux pancartes des régions que vous ne possédez pas"
teleport-noPermissionFriend: "Vous n'avez pas la permission de vous téléporter aux régions où vous êtes ajouté en ami"
teleport-noPermissionFriendSign: "Vous n'avez pas la permission de vous téléporter à la pancarte d'une région où vous êtes ajouté en ami"
teleport-success: "Vous avez été téléporté à %0%"
teleport-successSign: "Vous vous téléportez à la pancarte de %0%"
teleport-noSafe: "Aucune position sécurisé trouvé dans la région %0%. Pas de point restant, ou tentatives maximales dépassées. (%1%/%2%)"
teleport-blocked: "Vous ne pouvez pas vous téléporter car la position est en dehors de la région et vous êtes obligé de vous téléporter à l'intérieur"
setteleport-help: "/as settp [region] [reset], Si non spécifié, cible la région dans laquelle vous vous trouvez"
setteleport-noPermission: "Vous n'avez pas la permission de définir un point de téléportation"
setteleport-noPermissionOther: "Vous n'avez pas la permission de définir l'emplacement de téléportation d'une région que vous ne possédez pas"
setteleport-noRentOrBuy: "La région '%0%' n'est pas enregistré comme location ou achat"
setteleport-success: "Lieu de téléportation de %0% défini"
setteleport-notInside: "Le lieu doit se trouver dans votre région"
setteleport-reset: "le lieu de téléportation de %0% a été reset"
teleport-noRentOrBuy: "La région '%0%' n'est pas enregistrée comme location ou achat."
teleport-noPermission: "Vous n'avez pas la permission de vous téléporter à votre région."
teleport-noPermissionOther: "Vous n'avez pas la permission de vous téléporter à une région qui ne vous appartient pas."
teleport-noPermissionSign: "Vous n'avez pas la permission de vous téléporter à la pancarte de votre région."
teleport-noPermissionOtherSign: "Vous n'avez pas la permission de vous téléporter aux pancartes des régions que vous ne possédez pas."
teleport-noPermissionFriend: "Vous n'avez pas la permission de vous téléporter aux régions où vous êtes ajouté en ami."
teleport-noPermissionFriendSign: "Vous n'avez pas la permission de vous téléporter à la pancarte d'une région où vous êtes ajouté en ami."
teleport-success: "Vous avez été téléporté à '%0%'."
teleport-successSign: "Vous vous téléportez à la pancarte de '%0%'."
teleport-noSafe: "Aucune position sécurisée trouvée dans la région '%0%'. Pas de point restant, ou tentatives maximales dépassées (%1%/%2%)."
teleport-blocked: "Vous ne pouvez pas vous téléporter car la position est en dehors de la région et vous êtes obligé de vous téléporter à l'intérieur."
setteleport-help: "/as settp [region] [reset], Si non spécifiée, cible la région dans laquelle vous vous trouvez."
setteleport-noPermission: "Vous n'avez pas la permission de définir un point de téléportation."
setteleport-noPermissionOther: "Vous n'avez pas la permission de définir l'emplacement de téléportation d'une région que vous ne possédez pas."
setteleport-noRentOrBuy: "La région '%0%' n'est pas enregistrée comme location ou achat."
setteleport-success: "Lieu de téléportation de '%0%' défini."
setteleport-notInside: "Le lieu doit se trouver dans votre région."
setteleport-reset: "Le lieu de téléportation de '%0%' a été réinitialisé."
find-help: "/as find <buy|rent> [prix maximum] [group]"
find-noPermission: "Vous n'avez pas la permission de rechercher des régions et de vous y téléporter"
find-success: "Trouvé une région %0%: %1%, en recherchant avec un prix maximum de: %2%%3%"
find-successMax: "Trouvé une région %0%: %1%, en recherchant avec un prix maximum de: %2%%3%"
find-wrongMaxPrice: "le prix maximum n'est pas un nombre valide: %0%"
find-wrongGroup: "Le groupe spécifié n'existe pas: %0%"
find-noneFound: "Aucune région %0% trouvée pour votre recharge avec un prix maximum de: %1%%2%"
find-noneFoundMax: "Aucune région %0% trouvée en cherchant à un prix maximum de %1%%2%"
find-onlyInGroup: ", recherche de régions uniquement dans le groupe: %0%"
groupadd-help: "/as groupadd <group> [region], Si non spécifié, cible la région dans laquelle vous vous trouvez"
groupadd-noPermission: "Vous n'avez pas la permission d'ajouter des régions aux groupes"
groupadd-noRegion: "la région spécifiée n'est pas enregistré: %0%"
groupadd-success: "La région %0% a été ajouté au groupe '%1%'. ce groupe a maintenant %2% membre(s)"
groupadd-failed: "La région %0% est déjà membre du groupe '%1%'"
groupadd-weSuccess: "Ajouté au groupe %0%: &7%1%"
groupadd-weFailed: "Nous étions déjà dans le groupe %0%: &7%1%"
groupdel-help: "/as groupdel <group> [region], Si non spécifié, cible la région dans laquelle vous vous trouvez"
groupdel-noPermission: "Vous n'avez pas la permission de supprimer des régions depuis les groupes"
groupdel-noRegion: "La région spécifiée n'est pas enregistré: %0%"
groupdel-success: "La région %0% a été supprimé du groupe '%1%', ce groupe a maintenant %2% membre(s)"
groupdel-failed: "La région %0% n'est pas membre du groupe '%1%'"
groupdel-weSuccess: "Supprimé du groupe %0%: &7%1%"
groupdel-weFailed: "Nous ne sommes pas dans le groupe %0% de toute façon: &7%1%"
grouplist-noPermission: "Vous n'avez pas l'autorisation d'afficher les groupes enregistrés"
grouplist-noGroups: "Il n'y a actuellement aucun groupe enregistré"
grouplist-success: "les groupes suivants sont enregistrés: &7%0%"
find-noPermission: "Vous n'avez pas la permission de rechercher des régions et de vous y téléporter."
find-success: "Trouvé une région %0% : %1%, en recherchant avec un prix maximum de: %2%%3%."
find-successMax: "Trouvé une région %0% : %1%, en recherchant avec un prix maximum de: %2%%3%."
find-wrongMaxPrice: "Le prix maximum n'est pas un nombre valide : %0%."
find-wrongGroup: "Le groupe spécifié n'existe pas : %0%."
find-noneFound: "Aucune région %0% trouvée ayant pour un prix maximum : %1%%2%."
find-noneFoundMax: "Aucune région %0% trouvée en cherchant à un prix maximum de %1%%2%."
find-onlyInGroup: ", recherche de régions uniquement dans le groupe: %0%."
groupadd-help: "/as groupadd <group> [region], Si non spécifiée, cible la région dans laquelle vous vous trouvez."
groupadd-noPermission: "Vous n'avez pas la permission d'ajouter des régions aux groupes."
groupadd-noRegion: "La région spécifiée n'est pas enregistrée : %0%."
groupadd-success: "La région '%0%' a été ajoutée au groupe '%1%'. Ce groupe a maintenant %2% membre(s)."
groupadd-failed: "La région '%0%' est déjà membre du groupe '%1%'."
groupadd-weSuccess: "Ajouté au groupe %0% : &7%1%."
groupadd-weFailed: "Nous étions déjà dans le groupe %0% : &7%1%."
groupdel-help: "/as groupdel <group> [region], Si non spécifiée, cible la région dans laquelle vous vous trouvez."
groupdel-noPermission: "Vous n'avez pas la permission de supprimer des régions depuis les groupes."
groupdel-noRegion: "La région spécifiée n'est pas enregistrée : %0%."
groupdel-success: "La région '%0%' a été supprimée du groupe '%1%', ce groupe a maintenant %2% membre(s)."
groupdel-failed: "La région '%0%' n'est pas membre du groupe '%1%'."
groupdel-weSuccess: "Supprimée du groupe %0% : &7%1%."
groupdel-weFailed: "Nous ne sommes de toute façon pas dans le groupe %0% : &7%1%."
grouplist-noPermission: "Vous n'avez pas l'autorisation d'afficher les groupes enregistrés."
grouplist-noGroups: "Il n'y a actuellement aucun groupe enregistré."
grouplist-success: "Les groupes suivants sont enregistrés : &7%0%."
groupinfo-help: "/as groupinfo <group>"
groupinfo-noPermission: "Vous n'avez pas la permission d'afficher des informations sur un groupe"
groupinfo-noGroup: "Il n'y a pas de groupe enregistré sous le nom '%0%', utilisez /as grouplist pour vérifier les groupes"
groupinfo-members: "Les régions suivantes sont membres du groupe %0%: &7%1%"
groupinfo-noMembers: "Le groupe %0% ne possède aucun membre"
groupinfo-noPermission: "Vous n'avez pas la permission d'afficher des informations sur un groupe."
groupinfo-noGroup: "Il n'y a pas de groupe enregistré sous le nom '%0%', utilisez /as grouplist pour vérifier les groupes."
groupinfo-members: "Les régions suivantes sont membres du groupe %0% : &7%1%."
groupinfo-noMembers: "Le groupe %0% ne possède aucun membre."
schemevent-help: "/as schemevent <region> <created|deleted|rented|unrented|bought|sold>"
schemevent-noRegion: "La région spécifiée n'est pas enregistré: %0%"
schemevent-wrongEvent: "L'évent spécifié '%0%' n'existe pas, utilisez un des suivants: &7%1%"
schemevent-success: "L'évènement '%0%' a été activé dans la région %1%"
schemevent-noPermission: "Vous n'avez pas la permission de déclencher des événements schématiques"
schemevent-noRegion: "La région spécifiée n'est pas enregistrée : %0%."
schemevent-wrongEvent: "L'évent spécifié '%0%' n'existe pas, utilisez un des suivants: &7%1%."
schemevent-success: "L’événement '%0%' a été activé dans la région '%1%'."
schemevent-noPermission: "Vous n'avez pas la permission de déclencher des événements schématiques."
add-help: "/as add <rent|buy> [region] [world]"
add-noPermission: "Vous n'avez pas la permission d'ajouter une région à AreaShop"
add-success: "Ajouté comme %0%: &7%1%"
add-failed: "Déjà enregistré: &7%0%"
add-specifyWorld: "Spécifiez le monde de la région lors de l'utilisation de la console"
add-incorrectWorld: "Le monde '%0%' est introuvable, essayez de nouveau (Attention à la casse)"
add-noRegion: "La région '%0%' n'existe pas dans ce monde"
del-noRegion: "Le région '%0%' n'est pas enregistré à AreaShop"
del-noPermission: "Vous n'avez pas la permission de supprimer des régions"
del-success: "Régions supprimées: &7%0%"
del-failed: "Pas de permission pour supprimer, ou pas enregistré: &7%0%"
add-noPermission: "Vous n'avez pas la permission d'ajouter une région à AreaShop."
add-success: "Ajoutée comme %0% : &7%1%."
add-failed: "Déjà enregistrée : &7%0%."
add-specifyWorld: "Spécifiez le monde de la région lors de l'utilisation de la console."
add-incorrectWorld: "Le monde '%0%' est introuvable, essayez de nouveau (attention à la casse)."
add-noRegion: "La région '%0%' n'existe pas dans ce monde."
del-noRegion: "Le région '%0%' n'est pas enregistrée à AreaShop."
del-noPermission: "Vous n'avez pas la permission de supprimer des régions."
del-success: "Régions supprimées : &7%0%."
del-failed: "Pas de permission pour supprimer, ou pas enregistrée: &7%0%."
addsign-help: "/as addsign [region] [profile]"
addsign-noSign: "Vous ne regardez pas de panneau"
addsign-noRegion: "La région '%0%' n'a pas été trouvé"
addsign-noRegions: "Aucune région trouvé autour du panneau"
addsign-couldNotDetect: "Plusieurs régions ont été trouvées à promixité du panneau. Spécifiez la région en argument supplémentaire. (2 des régions trouvées: %0% et %1%)"
addsign-couldNotDetectSign: "Plusieurs régions ont été trouvées à proximité du panneau. Spécifiez la région à la deuxième ligne. (2 des régions trouvées: %0% et %1%)"
addsign-wrongProfile: "le profil spécifié n'existe pas. utilisez un des suivants (vérifier la configuration): &7%0%"
addsign-success: "Le panneau a été ajouté à %0%"
addsign-successProfile: "Le panneau a été ajouté à %0% avec le profil %1%"
addsign-alreadyRegistered: "Ce panneau a déjà été enregistré pour la région %0%"
addsign-noPermission: "Vous n'avez pas la permission d'ajouter un panneau"
delsign-noSign: "Vous ne regardez pas un panneau"
delsign-noPermission: "Vous n'avez pas la permission de supprimer un panneau"
delsign-noRegion: "Ce signe n'appartient pas à une région AreaShop"
delsign-success: "Ce panneau a été supprimé de la région %0%"
me-noPermission: "Vous n'avez pas la permission de voir quelle(s) région(s) vous possédez"
me-notAPlayer: "Vous n'êtes pas un joueur vous ne pouvez donc pas avoir de régions"
me-noRentRegions: "Vous ne louez aucune région"
me-noBuyRegions: "Vous n'avez acheté aucune région"
me-rentRegions: "Vous louez les régions suivantes:"
me-buyRegions: "Vous avez acheté les régions suivantes:"
addsign-noSign: "Vous ne regardez pas de panneau."
addsign-noRegion: "La région '%0%' n'a pas été trouvée."
addsign-noRegions: "Aucune région trouvée autour du panneau."
addsign-couldNotDetect: "Plusieurs régions ont été trouvées à proximité du panneau. Spécifiez la région en argument supplémentaire (2 des régions trouvées: %0% et %1%)."
addsign-couldNotDetectSign: "Plusieurs régions ont été trouvées à proximité du panneau. Spécifiez la région à la deuxième ligne (2 des régions trouvées: %0% et %1%)."
addsign-wrongProfile: "Le profil spécifié n'existe pas. Utilisez un des suivants (vérifier la configuration): &7%0%."
addsign-success: "Le panneau a été ajouté à %0%."
addsign-successProfile: "Le panneau a été ajouté à %0% avec le profil %1%."
addsign-alreadyRegistered: "Ce panneau a déjà été enregistré pour la région '%0%'."
addsign-noPermission: "Vous n'avez pas la permission d'ajouter un panneau."
delsign-noSign: "Vous ne regardez pas un panneau."
delsign-noPermission: "Vous n'avez pas la permission de supprimer un panneau."
delsign-noRegion: "Ce signe n'appartient pas à une région AreaShop."
delsign-success: "Ce panneau a été supprimé de la région '%0%'."
me-noPermission: "Vous n'avez pas la permission de voir quelle(s) région(s) vous possédez."
me-notAPlayer: "Vous n'êtes pas un joueur. Vous ne pouvez donc pas avoir de régions."
me-noRentRegions: "Vous ne louez aucune région."
me-noBuyRegions: "Vous n'avez acheté aucune région."
me-rentRegions: "Vous louez les régions suivantes :"
me-buyRegions: "Vous avez acheté les régions suivantes :"
me-rentLine: "&2&l►&r %region% jusqu'au %until% &7(%timeleft% restant)"
me-buyLine: "&2&l►&r %region%"
me-noFriendRegions: "Vous n'avez pas été ajouté en ami sur une région"
me-friendRegions: "Vous avez été ajouté en ami dans les régions suivantes:"
me-friendLine: "&2&l►&r %region% &7(propriétaire: %player%)"
setowner-help: "/as setowner <joueur> [region], la région dans laquelle vous vous trouvez sera utilisée si vous ne spécifiez pas"
setowner-noPermission: "Vous n'avez pas la permisssion de définir le propriétaire d'une région"
setowner-noPermissionRent: "Vous n'avez pas la permisssion de définir le propriétaire de régions à louer"
setowner-noPermissionBuy: "Vous n'avez pas la permisssion de définir le propriétaire de régions à acheter"
setowner-notRegistered: "La région n'est pas enregistrée, le propriétaire ne peut être défini"
setowner-noPlayer: "UUID du joueur introuvable: %0%"
setowner-succesRent: "Propriété de la région %region% modifiée avec succès. Elle appartient maintenant à %player% et est louée jusqu'au %until% (%timeleft% restant)"
setowner-succesRentExtend: "Le propriétaire était déjà %player%, location prolongée de '%duration%', maintenant louée jusqu'au %until% (%timeleft% restant%)"
setowner-succesBuy: "Propriétaire de la région %region% changé avec succès. Elle appartient maintenant à %player%"
resell-help: "/as resell <prix> <région>, la région dans laquelle vous vous trouvez sera utilisée si vous ne spécifiez pas"
resell-wrongPrice: "'%0%' n'est pas un prix valide"
resell-notRegistered: "%0% n'est pas enregistrée dans AreaShop"
resell-noRegionFound: "Aucune région AreaShop n'a pu être trouvée à votre emplacement, essayez de spécifier la région en argument"
resell-notBought: "Vous ne pouvez pas revendre la région %region%, elle n'est pas encore achetée"
resell-success: "%region% a été mis en revente avec succès pour un prix de %resellprice%"
resell-noPermission: "Vous n'avez pas la permisssion de mettre votre région en revente"
resell-noPermissionOther: "Vous n'avez pas la permisssion de mettre des régions en revente"
stopresell-help: "/as stropresell [région], la région où vous vous trouvez sera utilisée si vous ne spécifiez pas"
stopresell-notRegistered: "%0% n'est pas enregistrée dans AreaShop"
stopresell-noRegionFound: "Aucune région AreaShop n'a été trouvée à votre emplacement, essayez de spécifier en argument"
stopresell-notResell: "Vous ne pouvez pas arrêter la revente de la région %region% car elle n'est pas en vente"
stopresell-success: "%region% n'est plus en revente"
stopresell-noPermission: "Vous n'avez pas la permission de retirer votre région de la vente"
stopresell-noPermissionOther: "Vous n'avez pas la permisssion de retirer les régions de la vente"
addfriend-help: "/as addfriend <joueur> [region], la région dans laquelle vous vous trouvez sera utilisée si vous ne spécifiez pas"
addfriend-noPermissionOther: "Vous n'avez pas la permission d'ajouter des gens en ami dans une région qui n'est pas la vôtre"
addfriend-noPermission: "Vous n'avez pas la permission d'ajouter en ami des gens à votre région"
addfriend-successOther: "%0% a été ajouté en ami a la région %1%"
addfriend-success: "%0% a été ajouté ajouté en ami à votre région %1%"
addfriend-alreadyAdded: "%0% est déjà ami avec cette région"
addfriend-self: "Ajouter le propriétaire de la région en ami n'aurait aucune utilité"
addfriend-noOwner: "Vous ne pouvez pas ajouter d'amis à une région sans propriétaire"
delfriend-help: "/as delfriend <joueur> [région], la région dans laquelle vous vous trouvez sera utilisée si vous ne spécifiez pas"
delfriend-noPermissionOther: "Vous n'avez pas la permission de supprimer des amis à une région n'étant pas la votre"
delfriend-noPermission: "Vous n'avez pas la permission de supprimer des amis de votre région"
delfriend-successOther: "%0% a été supprimé des amis de la région %1%"
delfriend-success: "%0% a été supprimé des amis de votre région %1%"
delfriend-notAdded: "%0% n'est pas dans les amis de cette région"
delfriend-noOwner: "Vous ne pouvez pas supprimer les amis d'une région sans propriétaire"
timeleft-years: "%0% années"
timeleft-months: "%0% mois"
timeleft-days: "%0% jours"
timeleft-hours: "%0% heures"
timeleft-minutes: "%0% minutes"
timeleft-second: "%0% seconde"
timeleft-seconds: "%0% secondes"
me-noFriendRegions: "Vous n'avez pas été ajouté en ami sur une région."
me-friendRegions: "Vous avez été ajouté en ami dans les régions suivantes :"
me-friendLine: "&2&l►&r %region% &7(propriétaire : %player%)"
setowner-help: "/as setowner <joueur> [region], la région dans laquelle vous vous trouvez sera utilisée si vous ne spécifiez pas de région."
setowner-noPermission: "Vous n'avez pas la permission de définir le propriétaire d'une région."
setowner-noPermissionRent: "Vous n'avez pas la permission de définir le propriétaire de régions à louer."
setowner-noPermissionBuy: "Vous n'avez pas la permission de définir le propriétaire de régions à acheter."
setowner-notRegistered: "La région n'est pas enregistrée, le propriétaire ne peut être défini."
setowner-noPlayer: "UUID du joueur introuvable : %0%."
setowner-succesRent: "Propriétaire de la région '%region%' modifié avec succès. Elle appartient maintenant à %player% et est louée jusqu'au %until% (%timeleft% restant)."
setowner-succesRentExtend: "Le propriétaire était déjà %player%, location prolongée de '%duration%', maintenant louée jusqu'au %until% (%timeleft% restant%)."
setowner-succesBuy: "Propriétaire de la région '%region%' changé avec succès. Elle appartient maintenant à %player%."
resell-help: "/as resell <prix> <région>, la région dans laquelle vous vous trouvez sera utilisée si vous ne spécifiez pas de région."
resell-wrongPrice: "'%0%' n'est pas un prix valide."
resell-notRegistered: "'%0%' n'est pas enregistrée dans AreaShop."
resell-noRegionFound: "Aucune région AreaShop n'a pu être trouvée à votre emplacement, essayez de spécifier la région en argument."
resell-notBought: "Vous ne pouvez pas revendre la région '%region%', elle n'est pas encore achetée."
resell-success: "'%region%' a été mise en revente avec succès pour un prix de %resellprice%."
resell-noPermission: "Vous n'avez pas la permission de mettre votre région en revente."
resell-noPermissionOther: "Vous n'avez pas la permission de mettre des régions en revente."
stopresell-help: "/as stropresell [région], la région où vous vous trouvez sera utilisée si vous ne spécifiez pas de région."
stopresell-notRegistered: "'%0%' n'est pas enregistrée dans AreaShop."
stopresell-noRegionFound: "Aucune région AreaShop n'a été trouvée à votre emplacement, essayez de la spécifier en argument."
stopresell-notResell: "Vous ne pouvez pas arrêter la revente de la région '%region%' car elle n'est pas en vente."
stopresell-success: "'%region%' n'est plus en revente."
stopresell-noPermission: "Vous n'avez pas la permission de retirer votre région de la vente."
stopresell-noPermissionOther: "Vous n'avez pas la permission de retirer les régions de la vente."
addfriend-help: "/as addfriend <joueur> [region], la région dans laquelle vous vous trouvez sera utilisée si vous ne spécifiez pas de région."
addfriend-noPermissionOther: "Vous n'avez pas la permission d'ajouter des gens en amis dans une région qui n'est pas la vôtre."
addfriend-noPermission: "Vous n'avez pas la permission d'ajouter en amis des gens à votre région."
addfriend-successOther: "%0% a été ajouté en ami a la région '%1%'."
addfriend-success: "%0% a été ajouté ajouté en ami à votre région '%1%'."
addfriend-alreadyAdded: "%0% est déjà ami avec cette région."
addfriend-self: "Ajouter le propriétaire de la région en ami n'aurait aucune utilité."
addfriend-noOwner: "Vous ne pouvez pas ajouter d'amis à une région sans propriétaire."
delfriend-help: "/as delfriend <joueur> [région], la région dans laquelle vous vous trouvez sera utilisée si vous ne spécifiez pas de région."
delfriend-noPermissionOther: "Vous n'avez pas la permission de supprimer des amis à une région n'étant pas la vôtre."
delfriend-noPermission: "Vous n'avez pas la permission de supprimer des amis de votre région."
delfriend-successOther: "%0% a été supprimé de la liste d'amis de la région '%1%'."
delfriend-success: "%0% a été supprimé des amis de votre région '%1%'."
delfriend-notAdded: "%0% n'est pas dans les amis de cette région."
delfriend-noOwner: "Vous ne pouvez pas supprimer les amis d'une région sans propriétaire."
timeleft-years: "%0% années."
timeleft-months: "%0% mois."
timeleft-days: "%0% jours."
timeleft-hours: "%0% heures."
timeleft-minutes: "%0% minutes."
timeleft-second: "%0% seconde."
timeleft-seconds: "%0% secondes."
timeleft-ended: "Expiré"
greeting-forrent: "%region% peut être louée pour %price% par %duration%"
greeting-rented: "%region% est louée par %player% jusqu'au %until%"
greeting-forsale: "%region% peut être achetée pour %price%"
greeting-bought: "%region% a été achetée par %player%"
greeting-resale: "%region% peut être achetée pour %resaleprice% à %player%"
greeting-forrent: "La région '%region%' peut être louée pour %price% pour une durée de %duration%."
greeting-rented: "La région '%region%' est louée par %player% jusqu'au %until%."
greeting-forsale: "La région '%region%' peut être achetée pour %price%."
greeting-bought: "La région '%region%' est la propriété de %player%."
greeting-resale: "La région '%region%' peut être achetée pour %resaleprice% à %player%."
+2 -2
View File
@@ -1,6 +1,6 @@
# ╔════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╗
# ║ Language file of the AreaShop plugin created by NLThijs48, Github can be found at https://github.com/NLthijs48/AreaShop ║
# ║ Language: Dutch (Nederlands), Version: V2.1.0, Percentage translated: 100%, author(s): NLThijs48 ║
# ║ Language: Dutch (Nederlands), Version: V2.1.2, Percentage translated: 100%, author(s): NLThijs48 ║
# ║ This file will be overwritten at each startup/reload of the plugin, if you want to change anything then do the following: ║
# ║ 1: Make a copy of this file ║
# ║ 2: Rename it to <servername>.yml (don't use a language code as filename, could otherwise be overwritten in future updates) ║
@@ -346,4 +346,4 @@ greeting-forrent: "%region% kan worden gehuurd voor %price% per %duration%"
greeting-rented: "%region% is gehuurd door %player% tot %until%"
greeting-forsale: "%region% kan worden gekocht voor %price%"
greeting-bought: "%region% is gekocht door %player%"
greeting-resale: "%region% kan worden gekocht voor %resaleprice% van %player%"
greeting-resale: "%region% kan worden gekocht voor %resaleprice% van %player%"
+8 -1
View File
@@ -1,6 +1,6 @@
# ╔════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╗
# ║ Language file of the AreaShop plugin created by NLThijs48, Github can be found at https://github.com/NLthijs48/AreaShop ║
# ║ Language: Polish (Polski), Version: V2.1.0, Percentage translated: 63%, author(s): Rexlu ║
# ║ Language: Polish (Polski), Version: V2.1.2, Percentage translated: 65%, author(s): Rexlu ║
# ║ This file will be overwritten at each startup/reload of the plugin, if you want to change anything then do the following: ║
# ║ 1: Make a copy of this file ║
# ║ 2: Rename it to <servername>.yml (don't use a language code as filename, could otherwise be overwritten in future updates) ║
@@ -13,6 +13,8 @@ cmd-onlyByPlayer: "Ta komenda moze byc uzywana tylko przez gracza"
cmd-weOnlyByPlayer: "Uzywanie zaznaczenia WorldEdit jest mozliwe tylko podczas bycia graczem, sprecyzuj nazwe miejsca jako dodatkowy argument"
cmd-noSelection: "Nie zaznaczyles terenu pluginem WorldEdit"
cmd-noRegionsFound: "Nie znaleziono miejsc AreShop w zaznaczeniu"
cmd-noRegionsAtLocation: "Brak regionow w twojej lokalizacji, uzyj nazwy regionu jako argumentu."
cmd-moreRegionsAtLocation: "Wiecej niz jeden region znaleziono w twojej lokalizacji, uzyj nazwy regionu jako argumentu."
help-header: "Strona pomocy, komendy ktore moga zostac uzzte"
help-alias: "Aby wyswietlic ta strone: /areashop, /as"
help-help: "&6/as help &7-&r Pokazuje stone pomocy"
@@ -26,6 +28,9 @@ help-sellOwn: "&6/as sell &7-&r Sprzedaje miejsce"
help-updaterents: "&6/as updaterents &7-&r Aktualizuje wszystkie miejsca wynajmu oraz tabliczki"
help-updatebuys: "&6/as updatebuys &7-&r Aktualizuje wszystkie miejsca do kupienia oraz tabliczki"
help-reload: "&6/as reload &7-&r Laduje ponownie ustawienia oraz pliki jezykowe"
help-setrestore: "&6/as setrestore &7-&r Wlacz/wylacz przywracanie oraz wybierz profil"
help-setprice: "&6/as setprice &7-&r Zmiana ceny regionu"
help-setduration: "&6/as setduration &7-&r Zmiana czasu wynajmu"
help-teleport: "&6/as tp &7-&r Teleportuje do kupionych/wynajetych miejsc"
help-teleportAll: "&6/as tp &7-&r Teleportuje do wynajmowanego/kupionego miejsca"
help-setteleport: "&6/as settp &7-&r Ustawia koordynaty teleportacji dla kupionego/wynajetego miejsca"
@@ -35,6 +40,7 @@ help-groupadd: "&6/as groupadd &7-&r Dodaje miejsce do grupy"
help-groupdel: "&6/as groupdel &7-&r Usuwa miejsce z grupy"
help-grouplist: "&6/as grouplist &7-&r Wyswietla wszystkie grupy"
help-groupinfo: "&6/as groupinfo &7-&r Wyswietla informacje o grupie"
help-schemevent: "&6/as schemevent &7-&r Ustawianie schematu dla regionu"
help-add: "&6/as add &7-&r Dodaje region do wynajmu lub zakupu"
help-del: "&6/as del &7-&r Usuwa dane miejsce z AreaShop"
help-addsign: "&6/as addsign &7-&r Dodaje tabliczke do istniejacego miejsca"
@@ -224,3 +230,4 @@ greeting-forrent: "%region% moze zostac wynajety za %price% za %duration%"
greeting-rented: "%region% jest wynajety graczowi %player% do %until%"
greeting-forsale: "%region% moze zostac kupiony za %price%"
greeting-bought: "%region% zostal zakupiony przez gracza %player%"
+6 -3
View File
@@ -1,6 +1,6 @@
name: AreaShop
main: nl.evolutioncoding.areashop.AreaShop
version: 2.1.1
version: 2.1.2
depend: [Vault, WorldGuard, WorldEdit]
softdepend: [Multiverse-Core]
author: NLThijs48
@@ -8,7 +8,7 @@ website: http://dev.bukkit.org/bukkit-plugins/regionbuyandrent/
commands:
AreaShop:
description: For all commands use /as help
usage: /AreaShop or /AS
usage: AreaShop has not started correctly, check the console and correct any errors
permission: areashop.help
permission-message: You don't have <permission>
aliases: [as]
@@ -53,6 +53,7 @@ permissions:
areashop.stopresellall: true
areashop.addfriendall: true
areashop.delfriendall: true
areashop.nofityupdate: true
areashop.help:
description: Allows you to see the help pages
default: true
@@ -206,4 +207,6 @@ permissions:
areashop.delfriendall:
description: Allows you to delete friends from all regions
default: op
areashop.nofityupdate:
description: Will notify this player when an update is available
default: op
@@ -7,6 +7,8 @@ import java.util.UUID;
import java.util.logging.Logger;
import net.milkbowl.vault.economy.Economy;
import nl.evolutioncoding.areashop.Updater.UpdateResult;
import nl.evolutioncoding.areashop.Updater.UpdateType;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
@@ -38,6 +40,8 @@ public final class AreaShop extends JavaPlugin {
private CommandManager commandManager = null;
private boolean debug = false;
private String chatprefix = null;
private Updater updater = null;
private boolean updateAvailable = false;
/* Folders and file names */
public static final String languageFolder = "lang";
@@ -151,6 +155,22 @@ public final class AreaShop extends JavaPlugin {
// Register dynamic permission (things declared in config)
registerDynamicPermissions();
// Dont initialize the updatechecker if disabled in the config
if(this.getConfig().getBoolean("checkForUpdates")) {
try {
updater = new Updater(this, 76518, null, UpdateType.NO_DOWNLOAD, false);
AreaShop.debug("Result=" + updater.getResult().toString() + ", Latest=" + updater.getLatestName() + ", Type=" + updater.getLatestType());
updateAvailable = updater.getResult() == UpdateResult.UPDATE_AVAILABLE;
if(updateAvailable) {
this.getLogger().info("Update from AreaShop V" + this.getDescription().getVersion() + " to " + updater.getLatestName() + " available, get the latest version at http://dev.bukkit.org/bukkit-plugins/regionbuyandrent/");
}
} catch(Exception e) {
AreaShop.debug("Something went wrong with the Updater:");
AreaShop.debug(e.getMessage());
updateAvailable = false;
}
}
}
}
@@ -170,6 +190,7 @@ public final class AreaShop extends JavaPlugin {
commandManager = null;
chatprefix = null;
debug = false;
updater = null;
}
/**
@@ -228,6 +249,22 @@ public final class AreaShop extends JavaPlugin {
return fileManager;
}
/**
* Get the updater (check the update result)
* @return The updater
*/
public Updater getUpdater() {
return updater;
}
/**
* Check if an update for AreaShop is available
* @return true if an update is available, otherwise false
*/
public boolean updateAvailable() {
return updateAvailable;
}
/**
* Register dynamic permissions controlled by config settings
*/
@@ -42,7 +42,6 @@ import com.sk89q.worldedit.bukkit.selections.CuboidSelection;
import com.sk89q.worldedit.bukkit.selections.Selection;
import com.sk89q.worldguard.protection.ApplicableRegionSet;
import com.sk89q.worldguard.protection.managers.RegionManager;
import com.sk89q.worldguard.protection.managers.storage.StorageException;
import com.sk89q.worldguard.protection.regions.ProtectedRegion;
public class FileManager {
@@ -587,8 +586,19 @@ public class FileManager {
RegionManager manager = plugin.getWorldGuard().getRegionManager(bukkitWorld);
if(manager != null) {
try {
manager.saveChanges();
} catch(StorageException e) {
String version = plugin.getWorldGuard().getDescription().getVersion();
AreaShop.debug("WorldGuard version: " + version);
// Detect WorldGuard version 5
if(version.startsWith("5.")) {
//AreaShop.debug(" Saved the old way");
manager.save();
}
// Assume a newer version
else {
//AreaShop.debug(" Saved the new way");
manager.saveChanges();
}
} catch(Exception e) {
plugin.getLogger().warning("WorldGuard regions in world " + world + " could not be saved");
}
}
@@ -34,8 +34,8 @@ public final class PlayerLoginListener implements Listener {
if(event.getResult() != Result.ALLOWED) {
return;
}
Player player = event.getPlayer();
final Player player = event.getPlayer();
// Notify for rents that almost run out
for(RentRegion region : plugin.getFileManager().getRents()) {
if(region.isRenter(player)) {
String warningSetting = region.getStringSetting("rent.warningOnLoginTime");
@@ -45,18 +45,25 @@ public final class PlayerLoginListener implements Listener {
long warningTime = region.durationStringToLong(warningSetting);
if(region.getTimeLeft() < warningTime) {
// Send the warning message later to let it appear after general MOTD messages
final Player finalPlayer = player;
final AreaShop finalPlugin = plugin;
final RentRegion finalRegion = region;
new BukkitRunnable() {
@Override
public void run() {
finalPlugin.message(finalPlayer, "rent-expireWarning", finalRegion);
AreaShop.getInstance().message(player, "rent-expireWarning", finalRegion);
}
}.runTaskLater(plugin, 2);
}
}
}
// Notify admins for plugin updates
if(plugin.updateAvailable() && player.hasPermission("areashop.notifyupdate")) {
new BukkitRunnable() {
@Override
public void run() {
AreaShop.getInstance().message(player, "update-playerNotify", AreaShop.getInstance().getDescription().getVersion(), AreaShop.getInstance().getUpdater().getLatestName());
}
}.runTaskLater(plugin, 20);
}
}
}
@@ -0,0 +1,745 @@
package nl.evolutioncoding.areashop;
import java.io.*;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.util.Enumeration;
import java.util.logging.Level;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.plugin.Plugin;
import org.bukkit.scheduler.BukkitRunnable;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.JSONValue;
/**
* Check for updates on BukkitDev for a given plugin, and download the updates if needed.
* <p/>
* <b>VERY, VERY IMPORTANT</b>: Because there are no standards for adding auto-update toggles in your plugin's config, this system provides NO CHECK WITH YOUR CONFIG to make sure the user has allowed auto-updating.
* <br>
* It is a <b>BUKKIT POLICY</b> that you include a boolean value in your config that prevents the auto-updater from running <b>AT ALL</b>.
* <br>
* If you fail to include this option in your config, your plugin will be <b>REJECTED</b> when you attempt to submit it to dev.bukkit.org.
* <p/>
* An example of a good configuration option would be something similar to 'auto-update: true' - if this value is set to false you may NOT run the auto-updater.
* <br>
* If you are unsure about these rules, please read the plugin submission guidelines: http://goo.gl/8iU5l
*
* @author Gravity
* @version 2.3
*/
public class Updater {
/* Constants */
// Remote file's title
private static final String TITLE_VALUE = "name";
// Remote file's download link
private static final String LINK_VALUE = "downloadUrl";
// Remote file's release type
private static final String TYPE_VALUE = "releaseType";
// Remote file's build version
private static final String VERSION_VALUE = "gameVersion";
// Path to GET
private static final String QUERY = "/servermods/files?projectIds=";
// Slugs will be appended to this to get to the project's RSS feed
private static final String HOST = "https://api.curseforge.com";
// User-agent when querying Curse
private static final String USER_AGENT = "Updater (by Gravity)";
// Used for locating version numbers in file names
private static final String DELIMETER = "^V|[\\s_-]V";
// If the version number contains one of these, don't update.
private static final String[] NO_UPDATE_TAG = { "-DEV", "-PRE", "-SNAPSHOT" };
// Used for downloading files
private static final int BYTE_SIZE = 1024;
// Config key for api key
private static final String API_KEY_CONFIG_KEY = "api-key";
// Config key for disabling Updater
private static final String DISABLE_CONFIG_KEY = "disable";
// Default api key value in config
private static final String API_KEY_DEFAULT = "PUT_API_KEY_HERE";
// Default disable value in config
private static final boolean DISABLE_DEFAULT = false;
/* User-provided variables */
// Plugin running Updater
private final Plugin plugin;
// Type of update check to run
private final UpdateType type;
// Whether to announce file downloads
private final boolean announce;
// The plugin file (jar)
private final File file;
// The folder that downloads will be placed in
private final File updateFolder;
// The provided callback (if any)
private final UpdateCallback callback;
// Project's Curse ID
private int id = -1;
// BukkitDev ServerMods API key
private String apiKey = null;
/* Collected from Curse API */
private String versionName;
private String versionLink;
private String versionType;
private String versionGameVersion;
/* Update process variables */
// Connection to RSS
private URL url;
// Updater thread
private Thread thread;
// Used for determining the outcome of the update process
private Updater.UpdateResult result = Updater.UpdateResult.SUCCESS;
/**
* Gives the developer the result of the update process. Can be obtained by called {@link #getResult()}
*/
public enum UpdateResult {
/**
* The updater found an update, and has readied it to be loaded the next time the server restarts/reloads.
*/
SUCCESS,
/**
* The updater did not find an update, and nothing was downloaded.
*/
NO_UPDATE,
/**
* The server administrator has disabled the updating system.
*/
DISABLED,
/**
* The updater found an update, but was unable to download it.
*/
FAIL_DOWNLOAD,
/**
* For some reason, the updater was unable to contact dev.bukkit.org to download the file.
*/
FAIL_DBO,
/**
* When running the version check, the file on DBO did not contain a recognizable version.
*/
FAIL_NOVERSION,
/**
* The id provided by the plugin running the updater was invalid and doesn't exist on DBO.
*/
FAIL_BADID,
/**
* The server administrator has improperly configured their API key in the configuration.
*/
FAIL_APIKEY,
/**
* The updater found an update, but because of the UpdateType being set to NO_DOWNLOAD, it wasn't downloaded.
*/
UPDATE_AVAILABLE
}
/**
* Allows the developer to specify the type of update that will be run.
*/
public enum UpdateType {
/**
* Run a version check, and then if the file is out of date, download the newest version.
*/
DEFAULT,
/**
* Don't run a version check, just find the latest update and download it.
*/
NO_VERSION_CHECK,
/**
* Get information about the version and the download size, but don't actually download anything.
*/
NO_DOWNLOAD
}
/**
* Represents the various release types of a file on BukkitDev.
*/
public enum ReleaseType {
/**
* An "alpha" file.
*/
ALPHA,
/**
* A "beta" file.
*/
BETA,
/**
* A "release" file.
*/
RELEASE
}
/**
* Initialize the updater.
*
* @param plugin The plugin that is checking for an update.
* @param id The dev.bukkit.org id of the project.
* @param file The file that the plugin is running from, get this by doing this.getFile() from within your main class.
* @param type Specify the type of update this will be. See {@link UpdateType}
* @param announce True if the program should announce the progress of new updates in console.
*/
public Updater(Plugin plugin, int id, File file, UpdateType type, boolean announce) {
this(plugin, id, file, type, null, announce);
}
/**
* Initialize the updater with the provided callback.
*
* @param plugin The plugin that is checking for an update.
* @param id The dev.bukkit.org id of the project.
* @param file The file that the plugin is running from, get this by doing this.getFile() from within your main class.
* @param type Specify the type of update this will be. See {@link UpdateType}
* @param callback The callback instance to notify when the Updater has finished
*/
public Updater(Plugin plugin, int id, File file, UpdateType type, UpdateCallback callback) {
this(plugin, id, file, type, callback, false);
}
/**
* Initialize the updater with the provided callback.
*
* @param plugin The plugin that is checking for an update.
* @param id The dev.bukkit.org id of the project.
* @param file The file that the plugin is running from, get this by doing this.getFile() from within your main class.
* @param type Specify the type of update this will be. See {@link UpdateType}
* @param callback The callback instance to notify when the Updater has finished
* @param announce True if the program should announce the progress of new updates in console.
*/
public Updater(Plugin plugin, int id, File file, UpdateType type, UpdateCallback callback, boolean announce) {
this.plugin = plugin;
this.type = type;
this.announce = announce;
this.file = file;
this.id = id;
this.updateFolder = this.plugin.getServer().getUpdateFolderFile();
this.callback = callback;
final File pluginFile = this.plugin.getDataFolder().getParentFile();
final File updaterFile = new File(pluginFile, "Updater");
final File updaterConfigFile = new File(updaterFile, "config.yml");
YamlConfiguration config = new YamlConfiguration();
config.options().header("This configuration file affects all plugins using the Updater system (version 2+ - http://forums.bukkit.org/threads/96681/ )" + '\n'
+ "If you wish to use your API key, read http://wiki.bukkit.org/ServerMods_API and place it below." + '\n'
+ "Some updating systems will not adhere to the disabled value, but these may be turned off in their plugin's configuration.");
config.addDefault(API_KEY_CONFIG_KEY, API_KEY_DEFAULT);
config.addDefault(DISABLE_CONFIG_KEY, DISABLE_DEFAULT);
if (!updaterFile.exists()) {
this.fileIOOrError(updaterFile, updaterFile.mkdir(), true);
}
boolean createFile = !updaterConfigFile.exists();
try {
if (createFile) {
this.fileIOOrError(updaterConfigFile, updaterConfigFile.createNewFile(), true);
config.options().copyDefaults(true);
config.save(updaterConfigFile);
} else {
config.load(updaterConfigFile);
}
} catch (final Exception e) {
final String message;
if (createFile) {
message = "The updater could not create configuration at " + updaterFile.getAbsolutePath();
} else {
message = "The updater could not load configuration at " + updaterFile.getAbsolutePath();
}
this.plugin.getLogger().log(Level.SEVERE, message, e);
}
if (config.getBoolean(DISABLE_CONFIG_KEY)) {
this.result = UpdateResult.DISABLED;
return;
}
String key = config.getString(API_KEY_CONFIG_KEY);
if (API_KEY_DEFAULT.equalsIgnoreCase(key) || "".equals(key)) {
key = null;
}
this.apiKey = key;
try {
this.url = new URL(Updater.HOST + Updater.QUERY + this.id);
} catch (final MalformedURLException e) {
this.plugin.getLogger().log(Level.SEVERE, "The project ID provided for updating, " + this.id + " is invalid.", e);
this.result = UpdateResult.FAIL_BADID;
}
if (this.result != UpdateResult.FAIL_BADID) {
this.thread = new Thread(new UpdateRunnable());
this.thread.start();
} else {
runUpdater();
}
}
/**
* Get the result of the update process.
*
* @return result of the update process.
* @see UpdateResult
*/
public Updater.UpdateResult getResult() {
this.waitForThread();
return this.result;
}
/**
* Get the latest version's release type.
*
* @return latest version's release type.
* @see ReleaseType
*/
public ReleaseType getLatestType() {
this.waitForThread();
if (this.versionType != null) {
for (ReleaseType type : ReleaseType.values()) {
if (this.versionType.equalsIgnoreCase(type.name())) {
return type;
}
}
}
return null;
}
/**
* Get the latest version's game version (such as "CB 1.2.5-R1.0").
*
* @return latest version's game version.
*/
public String getLatestGameVersion() {
this.waitForThread();
return this.versionGameVersion;
}
/**
* Get the latest version's name (such as "Project v1.0").
*
* @return latest version's name.
*/
public String getLatestName() {
this.waitForThread();
return this.versionName;
}
/**
* Get the latest version's direct file link.
*
* @return latest version's file link.
*/
public String getLatestFileLink() {
this.waitForThread();
return this.versionLink;
}
/**
* As the result of Updater output depends on the thread's completion, it is necessary to wait for the thread to finish
* before allowing anyone to check the result.
*/
private void waitForThread() {
if ((this.thread != null) && this.thread.isAlive()) {
try {
this.thread.join();
} catch (final InterruptedException e) {
this.plugin.getLogger().log(Level.SEVERE, null, e);
}
}
}
/**
* Save an update from dev.bukkit.org into the server's update folder.
*
* @param file the name of the file to save it as.
*/
private void saveFile(String file) {
final File folder = this.updateFolder;
deleteOldFiles();
if (!folder.exists()) {
this.fileIOOrError(folder, folder.mkdir(), true);
}
downloadFile();
// Check to see if it's a zip file, if it is, unzip it.
final File dFile = new File(folder.getAbsolutePath(), file);
if (dFile.getName().endsWith(".zip")) {
// Unzip
this.unzip(dFile.getAbsolutePath());
}
if (this.announce) {
this.plugin.getLogger().info("Finished updating.");
}
}
/**
* Download a file and save it to the specified folder.
*/
private void downloadFile() {
BufferedInputStream in = null;
FileOutputStream fout = null;
try {
URL fileUrl = new URL(this.versionLink);
final int fileLength = fileUrl.openConnection().getContentLength();
in = new BufferedInputStream(fileUrl.openStream());
fout = new FileOutputStream(new File(this.updateFolder, file.getName()));
final byte[] data = new byte[Updater.BYTE_SIZE];
int count;
if (this.announce) {
this.plugin.getLogger().info("About to download a new update: " + this.versionName);
}
long downloaded = 0;
while ((count = in.read(data, 0, Updater.BYTE_SIZE)) != -1) {
downloaded += count;
fout.write(data, 0, count);
final int percent = (int) ((downloaded * 100) / fileLength);
if (this.announce && ((percent % 10) == 0)) {
this.plugin.getLogger().info("Downloading update: " + percent + "% of " + fileLength + " bytes.");
}
}
} catch (Exception ex) {
this.plugin.getLogger().log(Level.WARNING, "The auto-updater tried to download a new update, but was unsuccessful.", ex);
this.result = Updater.UpdateResult.FAIL_DOWNLOAD;
} finally {
try {
if (in != null) {
in.close();
}
} catch (final IOException ex) {
this.plugin.getLogger().log(Level.SEVERE, null, ex);
}
try {
if (fout != null) {
fout.close();
}
} catch (final IOException ex) {
this.plugin.getLogger().log(Level.SEVERE, null, ex);
}
}
}
/**
* Remove possibly leftover files from the update folder.
*/
private void deleteOldFiles() {
//Just a quick check to make sure we didn't leave any files from last time...
File[] list = listFilesOrError(this.updateFolder);
for (final File xFile : list) {
if (xFile.getName().endsWith(".zip")) {
this.fileIOOrError(xFile, xFile.mkdir(), true);
}
}
}
/**
* Part of Zip-File-Extractor, modified by Gravity for use with Updater.
*
* @param file the location of the file to extract.
*/
private void unzip(String file) {
final File fSourceZip = new File(file);
try {
final String zipPath = file.substring(0, file.length() - 4);
ZipFile zipFile = new ZipFile(fSourceZip);
Enumeration<? extends ZipEntry> e = zipFile.entries();
while (e.hasMoreElements()) {
ZipEntry entry = e.nextElement();
File destinationFilePath = new File(zipPath, entry.getName());
this.fileIOOrError(destinationFilePath.getParentFile(), destinationFilePath.getParentFile().mkdirs(), true);
if (!entry.isDirectory()) {
final BufferedInputStream bis = new BufferedInputStream(zipFile.getInputStream(entry));
int b;
final byte[] buffer = new byte[Updater.BYTE_SIZE];
final FileOutputStream fos = new FileOutputStream(destinationFilePath);
final BufferedOutputStream bos = new BufferedOutputStream(fos, Updater.BYTE_SIZE);
while ((b = bis.read(buffer, 0, Updater.BYTE_SIZE)) != -1) {
bos.write(buffer, 0, b);
}
bos.flush();
bos.close();
bis.close();
final String name = destinationFilePath.getName();
if (name.endsWith(".jar") && this.pluginExists(name)) {
File output = new File(this.updateFolder, name);
this.fileIOOrError(output, destinationFilePath.renameTo(output), true);
}
}
}
zipFile.close();
// Move any plugin data folders that were included to the right place, Bukkit won't do this for us.
moveNewZipFiles(zipPath);
} catch (final IOException e) {
this.plugin.getLogger().log(Level.SEVERE, "The auto-updater tried to unzip a new update file, but was unsuccessful.", e);
this.result = Updater.UpdateResult.FAIL_DOWNLOAD;
} finally {
this.fileIOOrError(fSourceZip, fSourceZip.delete(), false);
}
}
/**
* Find any new files extracted from an update into the plugin's data directory.
* @param zipPath path of extracted files.
*/
private void moveNewZipFiles(String zipPath) {
File[] list = listFilesOrError(new File(zipPath));
for (final File dFile : list) {
if (dFile.isDirectory() && this.pluginExists(dFile.getName())) {
// Current dir
final File oFile = new File(this.plugin.getDataFolder().getParent(), dFile.getName());
// List of existing files in the new dir
final File[] dList = listFilesOrError(dFile);
// List of existing files in the current dir
final File[] oList = listFilesOrError(oFile);
for (File cFile : dList) {
// Loop through all the files in the new dir
boolean found = false;
for (final File xFile : oList) {
// Loop through all the contents in the current dir to see if it exists
if (xFile.getName().equals(cFile.getName())) {
found = true;
break;
}
}
if (!found) {
// Move the new file into the current dir
File output = new File(oFile, cFile.getName());
this.fileIOOrError(output, cFile.renameTo(output), true);
} else {
// This file already exists, so we don't need it anymore.
this.fileIOOrError(cFile, cFile.delete(), false);
}
}
}
this.fileIOOrError(dFile, dFile.delete(), false);
}
File zip = new File(zipPath);
this.fileIOOrError(zip, zip.delete(), false);
}
/**
* Check if the name of a jar is one of the plugins currently installed, used for extracting the correct files out of a zip.
*
* @param name a name to check for inside the plugins folder.
* @return true if a file inside the plugins folder is named this.
*/
private boolean pluginExists(String name) {
File[] plugins = listFilesOrError(new File("plugins"));
for (final File file : plugins) {
if (file.getName().equals(name)) {
return true;
}
}
return false;
}
/**
* Check to see if the program should continue by evaluating whether the plugin is already updated, or shouldn't be updated.
*
* @return true if the version was located and is not the same as the remote's newest.
*/
private boolean versionCheck() {
final String title = this.versionName;
if (this.type != UpdateType.NO_VERSION_CHECK) {
final String localVersion = this.plugin.getDescription().getVersion();
if (title.split(DELIMETER).length == 2) {
// Get the newest file's version number
final String remoteVersion = title.split(DELIMETER)[1].split(" ")[0];
if (this.hasTag(localVersion) || !this.shouldUpdate(localVersion, remoteVersion)) {
// We already have the latest version, or this build is tagged for no-update
this.result = Updater.UpdateResult.NO_UPDATE;
return false;
}
} else {
// The file's name did not contain the string 'vVersion'
final String authorInfo = this.plugin.getDescription().getAuthors().isEmpty() ? "" : " (" + this.plugin.getDescription().getAuthors().get(0) + ")";
this.plugin.getLogger().warning("The author of this plugin" + authorInfo + " has misconfigured their Auto Update system");
this.plugin.getLogger().warning("File versions should follow the format 'PluginName vVERSION'");
this.plugin.getLogger().warning("Please notify the author of this error.");
this.result = Updater.UpdateResult.FAIL_NOVERSION;
return false;
}
}
return true;
}
/**
* <b>If you wish to run mathematical versioning checks, edit this method.</b>
* <p>
* With default behavior, Updater will NOT verify that a remote version available on BukkitDev
* which is not this version is indeed an "update".
* If a version is present on BukkitDev that is not the version that is currently running,
* Updater will assume that it is a newer version.
* This is because there is no standard versioning scheme, and creating a calculation that can
* determine whether a new update is actually an update is sometimes extremely complicated.
* </p>
* <p>
* Updater will call this method from {@link #versionCheck()} before deciding whether
* the remote version is actually an update.
* If you have a specific versioning scheme with which a mathematical determination can
* be reliably made to decide whether one version is higher than another, you may
* revise this method, using the local and remote version parameters, to execute the
* appropriate check.
* </p>
* <p>
* Returning a value of <b>false</b> will tell the update process that this is NOT a new version.
* Without revision, this method will always consider a remote version at all different from
* that of the local version a new update.
* </p>
* @param localVersion the current version
* @param remoteVersion the remote version
* @return true if Updater should consider the remote version an update, false if not.
*/
public boolean shouldUpdate(String localVersion, String remoteVersion) {
return !localVersion.equalsIgnoreCase(remoteVersion);
}
/**
* Evaluate whether the version number is marked showing that it should not be updated by this program.
*
* @param version a version number to check for tags in.
* @return true if updating should be disabled.
*/
private boolean hasTag(String version) {
for (final String string : Updater.NO_UPDATE_TAG) {
if (version.contains(string)) {
return true;
}
}
return false;
}
/**
* Make a connection to the BukkitDev API and request the newest file's details.
*
* @return true if successful.
*/
private boolean read() {
try {
final URLConnection conn = this.url.openConnection();
conn.setConnectTimeout(5000);
if (this.apiKey != null) {
conn.addRequestProperty("X-API-Key", this.apiKey);
}
conn.addRequestProperty("User-Agent", Updater.USER_AGENT);
conn.setDoOutput(true);
final BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
final String response = reader.readLine();
final JSONArray array = (JSONArray) JSONValue.parse(response);
if (array.isEmpty()) {
this.plugin.getLogger().warning("The updater could not find any files for the project id " + this.id);
this.result = UpdateResult.FAIL_BADID;
return false;
}
JSONObject latestUpdate = (JSONObject) array.get(array.size() - 1);
this.versionName = (String) latestUpdate.get(Updater.TITLE_VALUE);
this.versionLink = (String) latestUpdate.get(Updater.LINK_VALUE);
this.versionType = (String) latestUpdate.get(Updater.TYPE_VALUE);
this.versionGameVersion = (String) latestUpdate.get(Updater.VERSION_VALUE);
return true;
} catch (final IOException e) {
if (e.getMessage().contains("HTTP response code: 403")) {
this.plugin.getLogger().severe("dev.bukkit.org rejected the API key provided in plugins/Updater/config.yml");
this.plugin.getLogger().severe("Please double-check your configuration to ensure it is correct.");
this.result = UpdateResult.FAIL_APIKEY;
} else {
this.plugin.getLogger().severe("The updater could not contact dev.bukkit.org for updating.");
this.plugin.getLogger().severe("If you have not recently modified your configuration and this is the first time you are seeing this message, the site may be experiencing temporary downtime.");
this.result = UpdateResult.FAIL_DBO;
}
this.plugin.getLogger().log(Level.SEVERE, null, e);
return false;
}
}
/**
* Perform a file operation and log any errors if it fails.
* @param file file operation is performed on.
* @param result result of file operation.
* @param create true if a file is being created, false if deleted.
*/
private void fileIOOrError(File file, boolean result, boolean create) {
if (!result) {
this.plugin.getLogger().severe("The updater could not " + (create ? "create" : "delete") + " file at: " + file.getAbsolutePath());
}
}
private File[] listFilesOrError(File folder) {
File[] contents = folder.listFiles();
if (contents == null) {
this.plugin.getLogger().severe("The updater could not access files at: " + this.updateFolder.getAbsolutePath());
return new File[0];
} else {
return contents;
}
}
/**
* Called on main thread when the Updater has finished working, regardless
* of result.
*/
public interface UpdateCallback {
/**
* Called when the updater has finished working.
* @param updater The updater instance
*/
void onFinish(Updater updater);
}
private class UpdateRunnable implements Runnable {
@Override
public void run() {
runUpdater();
}
}
private void runUpdater() {
if (this.url != null && (this.read() && this.versionCheck())) {
// Obtain the results of the project's file feed
if ((this.versionLink != null) && (this.type != UpdateType.NO_DOWNLOAD)) {
String name = this.file.getName();
// If it's a zip file, it shouldn't be downloaded as the plugin's name
if (this.versionLink.endsWith(".zip")) {
name = this.versionLink.substring(this.versionLink.lastIndexOf("/") + 1);
}
this.saveFile(name);
} else {
this.result = UpdateResult.UPDATE_AVAILABLE;
}
}
if (this.callback != null) {
new BukkitRunnable() {
@Override
public void run() {
runCallback();
}
}.runTask(this.plugin);
}
}
private void runCallback() {
this.callback.onFinish(this);
}
}
+7 -5
View File
@@ -66,11 +66,13 @@ public class Utils {
String result = "";
boolean first = true;
for(Object object : input) {
if(first) {
first = false;
result += object.toString();
} else {
result += ", " + object.toString();
if(object != null) {
if(first) {
first = false;
result += object.toString();
} else {
result += ", " + object.toString();
}
}
}
return result;
@@ -76,7 +76,7 @@ public class MeCommand extends CommandAreaShop {
}
Set<GeneralRegion> friendRegions = new HashSet<GeneralRegion>();
for(GeneralRegion region : plugin.getFileManager().getRegions()) {
if(region.getFriends().contains(player.getUniqueId())) {
if(region.getFriends() != null && region.getFriends().contains(player.getUniqueId())) {
friendRegions.add(region);
}
}
@@ -45,19 +45,28 @@ public class SetteleportCommand extends CommandAreaShop {
plugin.message(sender, "onlyByPlayer");
return;
}
Player player = (Player) sender;
Player player = (Player)sender;
GeneralRegion region = null;
// get the region by location
List<GeneralRegion> regions = plugin.getFileManager().getAllApplicableRegions(((Player) sender).getLocation());
if (regions.isEmpty()) {
plugin.message(sender, "cmd-noRegionsAtLocation");
return;
} else if (regions.size() > 1) {
plugin.message(sender, "cmd-moreRegionsAtLocation");
return;
if(args.length < 2) {
if (sender instanceof Player) {
// get the region by location
List<GeneralRegion> regions = plugin.getFileManager().getAllApplicableRegions(((Player) sender).getLocation());
if (regions.isEmpty()) {
plugin.message(sender, "cmd-noRegionsAtLocation");
return;
} else if (regions.size() > 1) {
plugin.message(sender, "cmd-moreRegionsAtLocation");
return;
} else {
region = regions.get(0);
}
} else {
plugin.message(sender, "cmd-automaticRegionOnlyByPlayer");
return;
}
} else {
region = regions.get(0);
}
region = plugin.getFileManager().getRegion(args[1]);
}
boolean owner = false;
@@ -218,7 +218,7 @@ public class BuyRegion extends GeneralRegion {
* @return The number of minutes until the region is unrented while player is offline
*/
public long getInactiveTimeUntilSell() {
return getIntegerSetting("buy.inactiveTimeUntilSell");
return getLongSetting("buy.inactiveTimeUntilSell");
}
/**
@@ -402,11 +402,11 @@ public class BuyRegion extends GeneralRegion {
return false;
}
OfflinePlayer player = Bukkit.getOfflinePlayer(getBuyer());
//AreaShop.debug("inactive checking for " + getName() + ", player=" + player.getName() + ", currenttime=" + Calendar.getInstance().getTimeInMillis() + ", lastPlayed=" + player.getLastPlayed() + ", diff=" + (Calendar.getInstance().getTimeInMillis() - player.getLastPlayed()));
int inactiveSetting = getIntegerSetting("buy.inactiveTimeUntilSell");
long inactiveSetting = getInactiveTimeUntilSell();
if(inactiveSetting <= 0 || player.isOp()) {
return false;
}
//AreaShop.debug("inactivetimemillis: " + inactiveSetting * 60 * 1000);
if(Calendar.getInstance().getTimeInMillis() > (player.getLastPlayed() + inactiveSetting * 60 * 1000)) {
plugin.getLogger().info("Region " + getName() + " sold because of inactivity for player " + getPlayerName());
this.sell(true);
@@ -21,6 +21,7 @@ import nl.evolutioncoding.areashop.exceptions.RegionCreateException;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.OfflinePlayer;
import org.bukkit.World;
import org.bukkit.block.Block;
import org.bukkit.block.BlockFace;
@@ -47,7 +48,6 @@ import com.sk89q.worldguard.protection.flags.RegionGroupFlag;
import com.sk89q.worldguard.protection.regions.ProtectedRegion;
import com.sk89q.worldguard.protection.regions.ProtectedRegion.CircularInheritanceException;
@SuppressWarnings("deprecation")
public abstract class GeneralRegion {
protected YamlConfiguration config;
private static ArrayList<Material> canSpawnIn = new ArrayList<Material>(Arrays.asList(Material.WOOD_DOOR, Material.WOODEN_DOOR, Material.SIGN_POST, Material.WALL_SIGN, Material.STONE_PLATE, Material.IRON_DOOR_BLOCK, Material.WOOD_PLATE, Material.TRAP_DOOR, Material.REDSTONE_LAMP_OFF, Material.REDSTONE_LAMP_ON, Material.DRAGON_EGG, Material.GOLD_PLATE, Material.IRON_PLATE));
@@ -538,14 +538,10 @@ public abstract class GeneralRegion {
*/
public Set<String> getFriendNames() {
HashSet<String> result = new HashSet<String>();
for(String friend : config.getStringList("general.friends")) {
try {
UUID id = UUID.fromString(friend);
if(id != null) {
result.add(Bukkit.getOfflinePlayer(id).getName());
}
} catch(IllegalArgumentException e) {
// Don't add it
for(UUID friend : getFriends()) {
OfflinePlayer player = Bukkit.getOfflinePlayer(friend);
if(player != null) {
result.add(player.getName());
}
}
return result;
@@ -654,7 +650,7 @@ public abstract class GeneralRegion {
if(isDeleted() || !isRentRegion()) {
return false;
}
Set<String> signs = null;
Set<String> signs = new HashSet<String>();
if(config.getConfigurationSection("general.signs") != null) {
signs = config.getConfigurationSection("general.signs").getKeys(false);
}
@@ -844,7 +840,6 @@ public abstract class GeneralRegion {
*/
public boolean restoreRegionBlocks(String fileName) {
boolean result = true;
// TODO: test world cast
EditSession editSession = plugin.getWorldEdit().getWorldEdit().getEditSessionFactory().getEditSession(new BukkitWorld(getWorld()), plugin.getConfig().getInt("maximumBlocks"));
ProtectedRegion region = plugin.getWorldGuard().getRegionManager(getWorld()).getRegion(getName());
if(region == null) {
@@ -857,7 +852,10 @@ public abstract class GeneralRegion {
// The path to save the schematic
File restoreFile = new File(plugin.getFileManager().getSchematicFolder() + File.separator + fileName + AreaShop.schematicExtension);
if(!restoreFile.exists() || !restoreFile.isFile()) {
plugin.getLogger().info("Did not restore region " + getName() + ", file does not exist: " + restoreFile);
return false;
}
// // NEW
// Closer closer = Closer.create();
// try {
@@ -897,6 +895,7 @@ public abstract class GeneralRegion {
plugin.getLogger().warning("Exeeded the block limit while restoring schematic of " + getName());
result = false;
} catch(IOException | DataException e) {
AreaShop.debug(e.getMessage());
result = false;
}
editSession.flushQueue();
@@ -1008,7 +1007,7 @@ public abstract class GeneralRegion {
// Split the string and parse all values
String[] names = value.split(", ");
DefaultDomain members = region.getMembers();
members.clear();
members.removeAll();
for(String member : names) {
if(member != null && !member.isEmpty()) {
// Check for groups
@@ -1029,7 +1028,19 @@ public abstract class GeneralRegion {
uuid = null;
}
if(uuid != null) {
members.addPlayer(uuid);
// Detect WorldGuard version 5
if(plugin.getWorldGuard().getDescription().getVersion().startsWith("5.")) {
AreaShop.debug(" Added player by name");
OfflinePlayer offlinePlayer = Bukkit.getOfflinePlayer(uuid);
if(offlinePlayer != null) {
members.addPlayer(offlinePlayer.getName());
}
}
// Assume a newer version
else {
AreaShop.debug(" Added player by UUID");
members.addPlayer(uuid);
}
}
}
}
@@ -1040,7 +1051,7 @@ public abstract class GeneralRegion {
// Split the string and parse all values
String[] names = value.split(", ");
DefaultDomain owners = region.getOwners();
owners.clear();
owners.removeAll();
for(String owner : names) {
if(owner != null && !owner.isEmpty()) {
// Check for groups
@@ -1062,7 +1073,19 @@ public abstract class GeneralRegion {
uuid = null;
}
if(uuid != null) {
owners.addPlayer(uuid);
// Detect WorldGuard version 5
if(plugin.getWorldGuard().getDescription().getVersion().startsWith("5.")) {
//AreaShop.debug(" Added player by name");
OfflinePlayer offlinePlayer = Bukkit.getOfflinePlayer(uuid);
if(offlinePlayer != null) {
owners.addPlayer(offlinePlayer.getName());
}
}
// Assume a newer version
else {
//AreaShop.debug(" Added player by UUID");
owners.addPlayer(uuid);
}
}
}
}
@@ -293,7 +293,7 @@ public class RentRegion extends GeneralRegion {
* @return The number of minutes until the region is unrented while player is offline
*/
public long getInactiveTimeUntilUnrent() {
return getIntegerSetting("rent.inactiveTimeUntilUnrent");
return getLongSetting("rent.inactiveTimeUntilUnrent");
}
/**
@@ -603,11 +603,11 @@ public class RentRegion extends GeneralRegion {
return false;
}
OfflinePlayer player = Bukkit.getOfflinePlayer(getRenter());
//AreaShop.debug("inactive checking for " + getName() + ", player=" + player.getName() + ", currenttime=" + Calendar.getInstance().getTimeInMillis() + ", lastPlayed=" + player.getLastPlayed() + ", diff=" + (Calendar.getInstance().getTimeInMillis() - player.getLastPlayed()));
int inactiveSetting = getIntegerSetting("rent.inactiveTimeUntilUnrent");
long inactiveSetting = getInactiveTimeUntilUnrent();
if(inactiveSetting <= 0 || player.isOp()) {
return false;
}
//AreaShop.debug("inactivetimemillis: " + inactiveSetting * 60 * 1000);
if(Calendar.getInstance().getTimeInMillis() > (player.getLastPlayed() + inactiveSetting * 60 * 1000)) {
plugin.getLogger().info("Region " + getName() + " unrented because of inactivity for player " + getPlayerName());
this.unRent(true);