Compare commits

..
68 Commits
Author SHA1 Message Date
Thijs Wiefferink 8d254e17bb Merge pull request #6 from NLthijs48/AreaShop_V1.4
Adds code of V2.0.2
2014-09-24 21:41:20 +02:00
Thijs Wiefferink 2098b9f4e3 Adds code of V2.0.2 2014-09-24 21:40:23 +02:00
Thijs Wiefferink 95e3a4a120 Update README.md 2014-09-08 12:07:00 +02:00
Thijs Wiefferink 9269279d44 Update README.md 2014-09-08 12:06:49 +02:00
Thijs Wiefferink d8fbeaf53a Merge pull request #5 from NLthijs48/AreaShop_V1.4
Adds the code from version 2.0.1
2014-09-06 22:50:51 +02:00
Thijs Wiefferink 6886db8edc Adds the code from version 2.0.1 2014-09-06 22:49:29 +02:00
Thijs Wiefferink 05df539189 Merge pull request #4 from NLthijs48/AreaShop_V2.0
AreaShop v2.0.0
2014-08-28 12:13:58 +02:00
Thijs Wiefferink f20c573b06 Delete RentRegion.class 2014-08-28 11:50:13 +02:00
Thijs Wiefferink 793e3dfd1b Delete RentRegion$RentEvent.class 2014-08-28 11:50:09 +02:00
Thijs Wiefferink d7eff6c0df Delete GeneralRegion.class 2014-08-28 11:50:05 +02:00
Thijs Wiefferink 911115213f Delete BuyRegion.class 2014-08-28 11:50:02 +02:00
Thijs Wiefferink beeef8c757 Delete BuyRegion$BuyEvent.class 2014-08-28 11:49:59 +02:00
Thijs Wiefferink 60bdd50ab6 Delete UpdaterentsCommand.class 2014-08-28 11:49:55 +02:00
Thijs Wiefferink b5ba813410 Delete UpdatebuysCommand.class 2014-08-28 11:49:52 +02:00
Thijs Wiefferink 7de0b34b3b Delete UnrentCommand.class 2014-08-28 11:49:49 +02:00
Thijs Wiefferink b5077215ec Delete TeleportCommand.class 2014-08-28 11:49:46 +02:00
Thijs Wiefferink 98c45866a3 Delete SetteleportCommand.class 2014-08-28 11:49:43 +02:00
Thijs Wiefferink a96101519a Delete SellCommand.class 2014-08-28 11:49:39 +02:00
Thijs Wiefferink fc18819a95 Delete RentrestoreCommand.class 2014-08-28 11:49:34 +02:00
Thijs Wiefferink 6dd0750bea Delete RentpriceCommand.class 2014-08-28 11:49:30 +02:00
Thijs Wiefferink 36b73f57fd Delete RentdurationCommand.class 2014-08-28 11:49:27 +02:00
Thijs Wiefferink b111110251 Delete RentCommand.class 2014-08-28 11:49:24 +02:00
Thijs Wiefferink 555f648dfe Delete ReloadCommand.class 2014-08-28 11:49:21 +02:00
Thijs Wiefferink 4ac4c9ae35 Delete InfoCommand.class 2014-08-28 11:49:18 +02:00
Thijs Wiefferink 97fe92588c Delete HelpCommand.class 2014-08-28 11:49:15 +02:00
Thijs Wiefferink 8fc03b21f0 Delete CommandAreaShop.class 2014-08-28 11:49:11 +02:00
Thijs Wiefferink a74643d724 Delete BuyrestoreCommand.class 2014-08-28 11:49:08 +02:00
Thijs Wiefferink c309cbbbae Delete BuypriceCommand.class 2014-08-28 11:48:57 +02:00
Thijs Wiefferink 73ceee6f27 Delete BuyCommand.class 2014-08-28 11:48:54 +02:00
Thijs Wiefferink 9c57f434db Delete Metrics$Graph.class 2014-08-28 11:48:50 +02:00
Thijs Wiefferink f41e614d38 Delete SignChangeListener.class 2014-08-28 11:48:46 +02:00
Thijs Wiefferink 4fa1267971 Delete SignBreakListener.class 2014-08-28 11:48:43 +02:00
Thijs Wiefferink e99ca02bcb Delete Metrics$Plotter.class 2014-08-28 11:48:40 +02:00
Thijs Wiefferink 3479bcd0d8 Delete RightClickListener.class 2014-08-28 11:48:37 +02:00
Thijs Wiefferink c0cd528f0e Delete RentCheck.class 2014-08-28 11:48:32 +02:00
Thijs Wiefferink 14f379f7c6 Delete Metrics.class 2014-08-28 11:48:29 +02:00
Thijs Wiefferink 73c1f88d8c Delete CommandManager.class 2014-08-28 11:48:26 +02:00
Thijs Wiefferink 1bbca09fc6 Delete FileManager.class 2014-08-28 11:48:22 +02:00
Thijs Wiefferink 8219269fbb Delete Metrics$1.class 2014-08-28 11:48:19 +02:00
Thijs Wiefferink bf283d52b6 Delete LanguageManager.class 2014-08-28 11:48:16 +02:00
Thijs Wiefferink def6005b92 Delete AreaShop.class 2014-08-28 11:48:13 +02:00
Thijs Wiefferink 62934ceab6 Delete AreaShop$RegionType.class 2014-08-28 11:48:10 +02:00
Thijs Wiefferink 9124de9bb0 Delete AreaShop$RegionEventType.class 2014-08-28 11:48:06 +02:00
Thijs Wiefferink d5da1bb012 Delete .gitignore 2014-08-28 11:47:58 +02:00
Thijs Wiefferink 99d4cdb685 Delete .gitignore 2014-08-28 11:47:43 +02:00
Thijs Wiefferink b3ea7f7e73 Adds all function from version 2.0.0 2014-08-28 11:45:36 +02:00
Thijs Wiefferink 24ee8df215 Update README.md 2014-08-26 16:29:09 +02:00
Thijs Wiefferink 63e8f10e20 Basic functionality is working again after switching to new config
system
2014-07-17 12:30:18 +02:00
Thijs Wiefferink 7c03041ae1 class stuff 2014-06-29 16:38:18 +02:00
Thijs Wiefferink fb03baf3ad Adds command system, tab complete (not permission based) and changes to
Region objects.
2014-06-29 16:35:49 +02:00
NLthijs48 c1ef15193c Delete .gitignore 2014-05-31 00:00:51 +02:00
NLthijs48 c1e89ef75e Delete .gitignore 2014-05-31 00:00:33 +02:00
NLthijs48 56a35d373b Merge pull request #3 from NLthijs48/AreaShop-V1.1
Updates to version 1.3.0
2014-05-31 00:00:11 +02:00
Thijs Wiefferink 5aff3f1ce6 Updates to version 1.3.0 2014-05-30 23:58:24 +02:00
NLthijs48 6a4b8f9d9a Update README.md 2014-05-16 19:52:49 +02:00
NLthijs48 ef4b599897 Delete SignChangeListener.class 2014-04-14 21:36:55 +02:00
NLthijs48 a04b96d452 Delete SignBreakListener.class 2014-04-14 21:36:52 +02:00
NLthijs48 0728ce672d Delete RightClickListener.class 2014-04-14 21:36:48 +02:00
NLthijs48 c42e1ccbe5 Delete RentCheck.class 2014-04-14 21:36:45 +02:00
NLthijs48 dfcd896cab Delete LanguageManager.class 2014-04-14 21:36:42 +02:00
NLthijs48 69ee2d5c7f Delete AreaShop.class 2014-04-14 21:36:30 +02:00
NLthijs48 b42bb38e5f Merge pull request #2 from NLthijs48/AreaShop-V1.1
Updates code to the AreaShop V1.2 release
2014-04-14 21:35:47 +02:00
Thijs Wiefferink 418b736fae Updates code to the AreaShop V1.2 release 2014-04-14 21:35:12 +02:00
NLthijs48 bed4bbac23 Create README.md 2014-04-10 22:44:44 +02:00
NLthijs48 f13534ae33 Merge pull request #1 from NLthijs48/AreaShop-V1.1
AreaShop v1.1
2014-04-10 22:41:39 +02:00
Thijs Wiefferink 3b1522bad8 Throw away trash 2014-04-10 22:37:55 +02:00
Thijs Wiefferink 2995b59070 Adds AreaShop V1.1 code to GitHub 2014-04-10 22:34:51 +02:00
Thijs Wiefferink 0e46f01150 Adds a flexible save/restore system to .schematic files
This release adds a very configurable saving and restoring of regions.
You can let the plugin save and restore the region from/to a .schematic
file on certain events. Commands are added to change the restoring
profile for a rent/buy and the state (true, false, general) which are
respectively enabled, disabled and 'as general config option'.
2014-04-10 22:29:52 +02:00
167 changed files with 9245 additions and 24648 deletions

No files matched your search

-39
View File
@@ -1,39 +0,0 @@
---
name: Bug report
about: Report a problem in the plugin
title: ''
labels: 'NEW, Type: Bug'
assignees: ''
---
**Current behavior**
<!--- Tell what happens currently and/or show the stacktrace if an error occured -->
**Expected behavior**
<!--- Tell what you expected to happen instead -->
**Steps to reproduce**
<!--- Exactly show how this bug can be triggered -->
1.
2.
3.
4.
**Your environment**
<!--- Indicate which versions you use -->
<!--- Attention: "LATEST" or "NEWEST" are invalid answers! -->
<!--- Use '/version' for the Platform version and '/version <plugin>' for plugin versions -->
* Server platform (Bukkit, Spigot, etc.):
* Server version:
* AreaShop version:
* WorldEdit version:
* WorldGuard version:
* Vault version:
**Your config files**
<!--- Attach a '.zip' file of the '/plugins/AreaShop' and '/plugins/WorldGuard' directories to show your configuration setup -->
-15
View File
@@ -1,15 +0,0 @@
---
name: Feature request
about: Suggest an idea
title: ''
labels: 'NEW, Type: Feature'
assignees: ''
---
**Describe the problem you are trying to solve with this feature request**
<!-- When I know the problem you are trying to solve I can help you to think about the best solution -->
**Describe the solution you'd like**
<!-- Describe the config settings, commands and other features that should be added -->
@@ -1,31 +0,0 @@
---
name: Support question
about: Ask help with the setup or usage of the plugin
title: ''
labels: 'NEW, Type: Support'
assignees: ''
---
**Current behavior**
<!--- Tell what happens currently -->
**Desired behavior**
<!--- Tell what you want to happen instead -->
**Your environment**
<!--- Indicate which versions you use -->
<!--- Attention: "LATEST" or "NEWEST" are invalid answers! -->
<!--- Use '/version' for the Platform version and '/version <plugin>' for plugin versions -->
* Server platform (Bukkit, Spigot, etc.):
* Server version:
* AreaShop version:
* WorldEdit version:
* WorldGuard version:
* Vault version:
**Your config files**
<!--- Attach a '.zip' file of the '/plugins/AreaShop' and '/plugins/WorldGuard' directories to show your configuration setup -->
-32
View File
@@ -1,32 +0,0 @@
# This workflow will build a Java project with Maven
# For more information see: https://help.github.com/actions/language-and-framework-guides/building-and-testing-java-with-maven
name: Java CI with Maven
on:
push:
branches: [ master ]
pull_request:
branches: [ master ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Set up JDK 1.8
uses: actions/setup-java@v1
with:
java-version: 1.8
- name: Cache local Maven repository
uses: actions/cache@v2
with:
path: ~/.m2/repository
key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
restore-keys: |
${{ runner.os }}-maven-
- name: Build with Maven
run: mvn -B package --file pom.xml
-25
View File
@@ -1,25 +0,0 @@
# Maven stuff
target
.project
.metadata
bin/
tmp/
*.tmp
*.bak
*.swp
*~.nib
local.properties
.classpath
.settings/
.loadpath
# Locally stored "Eclipse launch configurations"
*.launch
# IntelliJ IDEA
*.iml
.idea
dependency-reduced-pom.xml
desktop.ini
+194
View File
@@ -0,0 +1,194 @@
##############################################
# config.yml of the AreaShop plugin #
# This plugin has been created by NLThijs48 #
# Check the server minecraft.go-craft.com #
# and then the Survival server for a demo #
##############################################
########## GENERAL ##########
## Chatprefix used for all messages in the chat. Also check the 'greeting' lines in the 'flagProfiles' section,
## these also contain the prefix and you may want to change those to
chatPrefix: '&2[AreaShop]&r '
## The characters used for the prices of regions, will appear before the number, for the euro character use '%euro%'
moneyCharacter: '$'
## The characters used after a currency number, '%euro%' will become the euro character
moneyCharacterAfter: ''
## Enables / disables debug messages in the console, no need to change
debug: false
## The .yml language file that should be used, provided by this plugin: EN, NL
language: EN
## Enable Schematic saving and restoring in general
enableSchematics: true
## Maximum number of blocks to save to or restore from a .schemetic
maximumBlocks: 1000000
## Maximum number of locations the teleport function should check to find a safe spot
maximumTries: 50000
## Enable sending stats to http://mcstats.org/ (Metrics plugin)
sendStats: 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)
postCommandErrors: true
## Version of the config, do not change!
version: 2.0.0
## The different tags you can write on the sign to trigger the plugin
signTags:
## Tag for adding a rent region
rent: '[rent]'
## Tag for adding a buy region
buy: '[buy]'
## Tag for adding a sign to an existing region
add: '[as]'
## Configure the max total regions, max rent regions and max buy regions with different groups (-1 is unlimited)
## Assign a group to players by giving them the permission 'areashop.limits.<group>'
## Every player already has the group 'default' and ops have the unlimited group
## If a player has multiple groups the highest numbers are used
limitGroups:
default:
total: 1
rents: 1
buys: 1
unlimited:
total: -1
rents: -1
buys: -1
## Below are profiles for the signs, you can assign profiles to regions
## by setting 'general.signProfile' in default.yml, groups or individual regions
signProfiles:
default:
## Below is the format for each sign state, the following tags can be used for signs and commands:
## %region%, %player%, %uuid%, %price%, %duration%, %world%, %type%, %until%, %untilshort%
## The following sections can be added for performing certain commands when the sign is clicked:
## rightClickPlayer, rightClickConsole, shiftRightClickPlayer, shiftRightClickConsole,
## leftClickPlayer, leftClickConsole, shiftLeftClickPlayer, shiftLeftClickConsole
## Sections with 'Player' at the end will be run by the clicking player and 'Console' ones from the console
forrent:
line1: '&2&l[For Rent]'
line2: '%region%'
line3: '%duration%'
line4: '%price%'
rightClickPlayer:
- 'as rent %region%'
leftClickPlayer:
- 'as info region %region%'
rented:
line1: '&4&l[Rented]'
line2: '%region%'
line3: '%player%'
line4: '%untilshort%'
rightClickPlayer:
- 'as rent %region%'
leftClickPlayer:
- 'as info region %region%'
shiftRightClickPlayer:
- 'as unrent %region%'
forsale:
line1: '&2&l[For Sale]'
line2: '%region%'
line3: '%price%'
line4:
rightClickPlayer:
- 'as buy %region%'
leftClickPlayer:
- 'as info region %region%'
sold:
line1: '&4&l[Sold]'
line2: '%region%'
line3: '%player%'
line4:
rightClickPlayer:
- 'as buy %region%'
leftClickPlayer:
- 'as info region %region%'
shiftRightClickPlayer:
- 'as sell %region%'
## Option to run certain commands when one of these events happen
## Commands at a 'before' section will execute before the region details are changed in the AreaShop system
## and before any other actions occurred (changing signs, saving/loading schematics, etc.),
## the 'after' commands will be run when all changes are done.
## After 'before' or 'after' you can create a list of commands (see example at the created event)
eventCommandProfiles:
default:
created:
before:
after:
## - "say An AreaShop region has been created: %region%"
deleted:
before:
after:
rented:
before:
after:
extended:
before:
after:
unrented:
before:
after:
bought:
before:
after:
sold:
before:
after:
## For the following events you can specify if you want to restore or save the region to a schematic
## After 'save:' or 'restore:' you enter the name of the file, %region% will be replaced by the region name (.schematic will be added automatically)
## %type% represents the type of the region, could be 'rent' or 'buy'
## If your regions are all the same size you could use just 1 file as the restore file, just enter a name without %region%
## Be carefull with these options, it could crash your server or destroy (parts of) your world if used wrong!
schematicProfiles:
default:
created:
save: '%type%-%region%'
restore: ''
deleted:
save: ''
restore: '%type%-%region%'
rented:
save: ''
restore: ''
unrented:
save: ''
restore: '%type%-%region%'
bought:
save: ''
restore: ''
sold:
save: ''
restore: '%type%-%region%'
## Flag profiles to specify what flags should be set on the WorldGuard regions
## All region flags can be used + members, owners, priority and parent.
flagProfiles:
default:
forrent:
members: -%player%
greeting: '&2[AreaShop]&f %region% can be rented for %price% per %duration%'
rented:
members: +%player%
greeting: '&2[AreaShop]&f %region% is rented by %player% until %until%'
forsale:
members: -%player%
greeting: '&2[AreaShop]&f %region% can be bought for %price%'
sold:
members: +%player%
greeting: '&2[AreaShop]&f %region% is bought by %player%'
########## RENTING ##########
## How much seconds between checking if renting has expired (don't put this to low)
checkDelay: 60
## Timeformat to use on the signs, default is like '30-06 14:52', US format: 'MM-dd KK:mm a'
## Search for 'java SimpleDateFormat' for more options and documentation
timeFormatSign: 'dd-MM HH:mm'
## Timeformat used in the chat, default is like '30 june 2014 14:52', US format: 'MMMMMMMMMMMMMMMMM dd yyyy KK:mm a'
## Search for 'java SimpleDateFormat' for more options and documentation
timeFormatChat: 'dd MMMMMMMMMMMMMMMMM yyyy HH:mm'
## Time indicators, used for specifing rent duration on the signs
## Be careful with deleting words, will break signs using those, adding is no problem
minutes: [m, min, mins, minute, minutes, minuten, minuut]
hours: [h, hour, hours, uur, uren]
days: [d, day, days, dag, dagen]
months: [M, month, months, maanden, maand]
years: [y, year, years, jaar, jaren]
+40
View File
@@ -0,0 +1,40 @@
### All settings below are default settings and can be overridden
### by group settings or region settings (copy a section to a region or group and change them there)
########## GENERAL ##########
general:
## Set this to true to enable saving/restoring for regions as specified in the profile below, which is specified in the config
enableRestore: false
## The schematic profile as specified in the config
schematicProfile: 'default'
## The event commands profile as specified in the config
eventCommandProfile: 'default'
## The profile for the format of the sign as specified in the config
signProfile: 'default'
## The profile for the WorldGuard flags as specified in the config
flagProfile: 'default'
## The y location within the region to start searching for safe teleport spots (x and z will be in the middle of the region)
## Possible values: bottom, middle, top
teleportLocationY: bottom
## If true the teleportation algorithm only allows telportation to inside the region, otherwise it will expand algorithm
## a cube from the starting point to check for safe spots (then it could end outside the region)
## If you set a teleport location outside of the region with /as settp then setting this to true breaks that teleport (players cannot use it)
teleportIntoRegion: true
########## RENTING ##########
rent:
## The default price of a renting region
price: 1000
## The default duration of a renting region
duration: '1 day'
## The percentage of the renting price you get back if you unrent the region (price of time left will be multiplied by this/100)
moneyBack: 100
## Maximum number of extends a player can do (-1 for infinite, 0 for no extending)
maxExtends: -1
########## BUYING ##########
buy:
## The default price of a buying region
price: 1000
## The percentage of the buying price you get back if you sell the region
moneyBack: 100
+275
View File
@@ -0,0 +1,275 @@
###################################################
# English language file for the AreaShop plugin #
# Latest update: V2.0.2 #
###################################################
# Copy this file and change the strings to your #
# favor. Then change the 'language' setting in #
# the config to the filename (excluding .yml) #
###################################################
########## General strings
total-maximum: "You can't rent and buy more than %0% region(s) in total"
cmd-notValid: "That command is not valid, use '/as help' for info"
cmd-onlyByPlayer: "This command can only be run by a player"
cmd-weOnlyByPlayer: "Using a WorldEdit selection is only possible as a player, specify the region name as extra argument"
cmd-noSelection: "You don't have a WorldEdit selection"
cmd-noRegionsFound: "No regions registered in AreaShop are found in your selection"
cmd-noWERegionsFound: "No WorldEdit regions intersecting your selection are found"
########## Help command strings
help-header: "Help page, commands that you can execute"
help-alias: "Command aliases: /areashop, /as"
help-help: "&6/as help &7-&r Shows this help page"
help-info: "&6/as info &7-&r Get info about current regions"
help-rent: "&6/as rent &7-&r Rent a region or extend your current rent"
help-buy: "&6/as buy &7-&r Buy a region"
help-unrent: "&6/as unrent &7-&r Unrent a region"
help-unrentOwn: "&6/as unrent &7-&r Unrent your own region"
help-sell: "&6/as sell &7-&r Sell a region"
help-sellOwn: "&6/as sell &7-&r Sell your own region"
help-updaterents: "&6/as updaterents &7-&r Update all rent signs and regions"
help-updatebuys: "&6/as updatebuys &7-&r Update all buy signs and regions"
help-reload: "&6/as reload &7-&r Reload the config and languages"
help-setrestore: "&6/as setrestore &7-&r Set the profile for restoring and on/off "
help-setprice: "&6/as setprice &7-&r Change the price of a rent region"
help-rentduration: "&6/as rentduration &7-&r Change the duration of a rent region"
help-teleport: "&6/as tp &7-&r Teleport to your bought/rented regions"
help-teleportAll: "&6/as tp &7-&r Teleport to a rent/buy region"
help-setteleport: "&6/as settp &7-&r Set teleport position for bought/rented regions"
help-setteleportAll: "&6/as settp &7-&r Set teleport position for a region"
help-find: "&6/as find &7-&r Find an empty buy or rent"
help-groupadd: "&6/as groupadd &7-&r Add a region to a group"
help-groupdel: "&6/as groupdel &7-&r Delete a region from a group"
help-grouplist: "&6/as grouplist &7-&r Display all groups currently registered"
help-groupinfo: "&6/as groupinfo &7-&r Display information about a group"
help-schemevent: "&6/as schemevent &7-&r Trigger a schematic event for a region"
help-add: "&6/as add &7-&r Register a region as rent or buy"
help-del: "&6/as del &7-&r Delete a registered region from AreaShop"
help-addsign: "&6/as addsign &7-&r Add a sign to an existing region"
help-delsign: "&6/as delsign &7-&r Delete the sign you are looking at"
############ Other command strings
rent-help: "/as rent [regionname], the region you stand in will be used if not specified"
rent-noPermission: "You don't have permission to rent a region"
rent-maximum: "You can't rent more than %0% region(s)"
rent-payError: "Something went wrong with paying, try again later"
rent-rented: "You rented %0% until %1%"
rent-extended: "You extended your rent of %0% until %1%"
rent-extend: "You can extend your rent by rightclicking the sign again or using /as rent"
rent-lowMoneyExtend: "You don't have enough money to extend the rent (you have %0% and you need %1%)"
rent-lowMoneyRent: "You don't have enough money to rent this region (you have %0% and you need %1%)"
rent-someoneElse: "Someone else already rented this region"
rent-notRentable: "That region is not available for renting"
rent-maxExtends: "You cannot extend this rent anymore (the maximum is %0% times), however after the rent is over you can rent this region again"
buy-help: "/as buy [regionname], the region you stand in will be used if not specified"
buy-noPermission: "You don't have permission to buy a region"
buy-notBuyable: "That region is not available for buying"
buy-maximum: "You can't buy more than %0% region(s)"
buy-payError: "Something went wrong with paying, try again later"
buy-succes: "You succesfully bought %0%"
buy-lowMoney: "You don't have enough money to buy this region (you have %0% and you need %1%)"
buy-yours: "You already own this region"
buy-someoneElse: "Someone else already bought this region"
unrent-help: "/as unrent [regionname], the region you stand in will be used if not specified"
unrent-noPermission: "You don't have permission to unrent a region"
unrent-noPermissionOther: "You don't have permission to unrent another region"
unrent-notRegistered: "The region can't be unrent because it is not registered for renting"
unrent-notRented: "The region can't be unrent because it is not rented"
unrent-unrented: "Your region has been unrented"
unrent-other: "The region has been unrented for player %0%"
unrent-expired: "Your rent of %0% has expired"
sell-help: "/as sell [regionname], the region you stand in will be used if not specified"
sell-notRegistered: "The region can't be selled because it is not registered for buying"
sell-notBought: "The region can't be selled because it is not someone's property"
sell-sold: "The region has been sold for player %0%"
sell-soldYours: "Your region has been sold"
sell-noPermission: "You don't have permission to sell a region"
sell-noPermissionOther: "You don't have permission to sell another region"
rents-updated: "All signs and regions for renting have been updated"
rents-notUpdated: "Not all signs have been updated, maybe reload fixes it"
rents-noPermission: "You don't have permission to update all rent signs and regions"
buys-updated: "All signs and regions for selling have been updated"
buys-notUpdated: "Not all signs have been updated, maybe reload fixes it"
buys-noPermission: "You don't have permission to update all buy signs and regions"
reload-reloaded: "The config has been reloaded successfully"
reload-noPermission: "You don't have permission to reload the config"
info-help: "/as info <all|rented|forrent|sold|forsale|player|region>"
info-all-rents: "Regions registered for renting: &7%0%"
info-all-noRents: "There are no regions registered for renting"
info-all-buys: "Regions registered for buying: &7%0%"
info-all-noBuys: "There are no regions registered for buying"
info-rented: "Rented regions: &7%0%"
info-noRented: "No regions are rented"
info-unrented: "Unrented regions: &7%0%"
info-noUnrented: "All regions are rented"
info-sold: "Sold regions: &7%0%"
info-noSold: "No regions are sold"
info-forsale: "Regions for sale: &7%0%"
info-noForsale: "All regions are sold"
info-playerHelp: "/as info player <name>"
info-playerRents: "Regions rented by %0%: &7%1%"
info-playerNoRents: "%0% has not rented a region"
info-playerBuys: "Regions bought by %0%: &7%1%"
info-playerNoBuys: "%0% has not bought a region"
info-regionHelp: "/as info region [name], the region you stand in will be used if not specified"
info-regionNoRenting: "%0% is not registered for renting"
info-regionRenting: "&6Renting details for %0%:"
info-regionRentedBy: "Rented by: &7%0% until %1%"
info-regionNotRented: "Currently not rented"
info-regionBuying: "&6Buying details for %0%:"
info-regionNoBuying: "%0% is not registered for buying"
info-regionNotBought: "Currently not sold"
info-regionBoughtBy: "Bought by: &7%0%"
info-regionSign: "Sign location(s): %0%"
info-regionSignLocation: "&7(%0%, %1%, %2%, %3%)&r"
info-regionNoSign: "There is no sign registered for this region"
info-regionPriceDuration: "Price: &7%0% for each %1%"
info-regionPrice: "Price: &7%0%"
info-regionRestore: "Restoring enabled: &7%0%"
info-regionRestoreProfile: "Restoring profile: &7%0%"
info-regionTPLocation: "Teleport location: &7World=%0%, X=%1%, Y=%2%, Z=%3%, Pitch=%4%, Yaw=%5%"
info-regionNoTP: "No teleport location set"
info-regionNotExisting: "Region %0% is not registered"
setrestore-help: "/as setrestore <region> <true|false|general> [profile]"
setrestore-noPermission: "You don't have permission to change the restore settings"
setrestore-notRegistered: "%0% is not registered"
setrestore-invalidSetting: "'%0%' is not a valid state, should be true, false or general"
setrestore-success: "Succesfully set the restore setting of %0% to '%1%'"
setrestore-successProfile: "Succesfully set the restore setting of %0% to '%1%' and the profile to '%2%'"
setprice-noPermission: "You don't have permission to change the price of a region"
setprice-help: "/as setprice <price> [region], the region you stand in will be used if not specified"
setprice-notRegistered: "%0% is not registered in AreaShop"
setprice-wrongPrice: "'%0%' is not a valid price"
setprice-successRent: "Price of region %0% changed to %1% per %2%"
setprice-successBuy: "Price of region %0% changed to %1%"
rentduration-noPermission: "You don't have permission to change the duration of a rent"
rentduration-help: "/as rentduration <amount> <identifier> [region], the region you stand in will be used if not specified"
rentduration-notRegistered: "%0% is not registered as a rent"
rentduration-wrongAmount: "'%0%' is not a valid amount, use a whole number"
rentduration-wrongFormat: "'%0%' is not a proper timeformat, check the documentation on Bukkit"
rentduration-success: "Duration of region %0% changed to '%1%'"
setup-noRegion: "You did not specify a region on the second line"
setup-wrongRegion: "The region you specified does not exist"
setup-alreadyRentSign: "The region you specified already has a sign for renting"
setup-alreadyBuySign: "The region you specified already has a sign for buying"
setup-noDuration: "You did not specify how long the region can be rented, do this on the third line"
setup-wrongDuration: "The time specified is not in the correct format, example: 1 day"
setup-noPrice: "You did not specify the price on the fourth line"
setup-wrongPrice: "You did not specify the price correctly, use a number only"
setup-rentSuccess: "Renting of region %0% is setup correctly"
setup-buySuccess: "Buying of region %0% is setup correctly"
setup-noPermissionRent: "You don't have permission for setting up renting of regions"
setup-noPermissionBuy: "You don't have permission for setting up buying of regions"
setup-couldNotDetect: "Found multiple regions with the same priority and/or parent/child relation, specify one on the second line (2 of the regions that were found: %0% and %1%)"
destroy-noPermissionRent: "You don't have permission for destroying a sign for renting a region"
destroy-noPermissionBuy: "You don't have permission for destroying a sign for buying a region"
destroy-successRent: "Renting of %0% successfully removed"
destroy-successBuy: "Buying of %0% successfully removed"
teleport-help: "/as tp <region> [sign]"
teleport-noRentOrBuy: "Region '%0%' is not registered as rent or buy"
teleport-noPermission: "You don't have permission to teleport to a region"
teleport-noPermissionOther: "You don't have permission to teleport to region you do not own"
teleport-success: "You teleported to %0%"
teleport-noSafe: "No safe position found in region %0%, no spots in region left or maximum tries exceeded (%1%/%2%)"
setteleport-help: "/as settp [region] [reset], the region you stand in will be used if not specified"
setteleport-noPermission: "You don't have permission to set the teleport location"
setteleport-noPermissionAll: "You don't have permission to set the teleport location for a region you do not own"
setteleport-noRentOrBuy: "Region '%0%' is not registered as rent or buy"
setteleport-success: "Teleport location of %0% set"
setteleport-notInside: "The location has to be inside the region"
setteleport-reset: "Teleport location of %0% has been reset"
find-help: "/as find <buy|rent> [maxprice]"
find-noPermission: "You don't have permission to teleport to signs, so you can't use find"
find-success: "Found a %0% region: %1%, while searching with a max price of your balance: %2%"
find-successMax: "Found a %0% region: %1%, while searching with a max price of %2%"
find-wrongMaxPrice: "The specified maximum price is not a correct number: %0%"
find-noneFound: "No %0% region found while searching with a max price of your balance: %1%"
find-noneFoundMax: "No %0% region found while searching with a max price of %1%"
groupadd-help: "/as groupadd <group> [region], if no region specified all regions from your WorldEdit selection are used"
groupadd-noPermission: "You don't have permission to add regions to groups"
groupadd-noRegion: "The specified region is not registered: %0%"
groupadd-success: "Region %0% has been added to group '%1%', this group now has %2% member(s)"
groupadd-failed: "Region %0% is already a member of group '%1%'"
groupadd-weSuccess: "Added to group %0%: &7%1%"
groupadd-weFailed: "Were already in group %0%: &7%1%"
groupdel-help: "/as groupdel <group> [region], if no region specified all regions from your WorldEdit selection are used"
groupdel-noPermission: "You don't have permission to remove regions from groups"
groupdel-noRegion: "The specified region is not registered: %0%"
groupdel-success: "Region %0% has been removed from group '%1%', this group now has %2% member(s)"
groupdel-failed: "Region %0% is not a member of group '%1%'"
groupdel-weSuccess: "Removed from group %0%: &7%1%"
groupdel-weFailed: "Were not in group %0% anyway: &7%1%"
grouplist-noPermission: "You don't have permission to display the registered groups"
grouplist-noGroups: "There are currently no groups registered"
grouplist-success: "The following groups are registered: &7%0%"
groupinfo-help: "/as groupinfo <group>"
groupinfo-noPermission: "You don't have permission to display information about a group"
groupinfo-noGroup: "There is no group registered with the name '%0%', use /as grouplist to check groups"
groupinfo-members: "The following regions are member of group %0%: &7%1%"
groupinfo-noMembers: "Group %0% does not have any members"
schemevent-help: "/as schemevent <region> <created|deleted|rented|unrented|bought|sold>"
schemevent-noRegion: "The specified region is not registered: %0%"
schemevent-wrongEvent: "The specified event '%0%' does not exist, use one of the following: &7%1%"
schemevent-success: "Event '%0%' has succesfully been triggered for region %1%"
schemevent-noPermission: "You don't have permission to trigger schematic events"
add-help: "/as add <rent|buy> [region] [world]"
add-noPermission: "You don't have permission to add a region to AreaShop"
add-success: "Added as %0%: &7%1%"
add-failed: "Already registered: &7%0%"
add-specifyWorld: "Specify the world of the region when using from console"
add-incorrectWorld: "World '%0%' not found, try again (case-sensitive)"
add-noRegion: "Region '%0%' does not exist in this world"
del-noRegion: "Region '%0%' is not registered in AreaShop"
del-noPermission: "You don't have permission to remove regions"
del-success: "Removed regions: &7%0%"
del-failed: "No permission to remove or not registered: &7%0%"
addsign-help: "/as addsign [region] [profile]"
addsign-noSign: "You are not looking at a sign"
addsign-noRegion: "Region '%0%' cannot be found"
addsign-noRegions: "No region found around the sign position"
addsign-couldNotDetect: "Found multiple regions around the sign, specify region as extra argument (2 of the regions that were found: %0% and %1%)"
addsign-couldNotDetectSign: "Found multiple regions around the sign, specify region on the second line (2 of the regions that were found: %0% and %1%)"
addsign-wrongProfile: "The specified profile does not exist, use one of the following (check config): &7%0%"
addsign-success: "The sign has been added to %0%"
addsign-successProfile: "The sign has been added to %0% with profile %1%"
addsign-alreadyRegistered: "That sign is already registered for region %0%"
addsign-noPermission: "You don't have permission to add a sign"
delsign-noSign: "You are not looking at a sign"
delsign-noPermission: "You don't have permission to delete a sign"
delsign-noRegion: "That sign does not belong to an AreaShop region"
delsign-success: "The sign has been removed from region %0%"
+265
View File
@@ -0,0 +1,265 @@
###################################################
# French language file for the AreaShop plugin #
# Latest update: V2.0.2 #
###################################################
# Copy this file and change the strings to your #
# favor. Then change the 'language' setting in #
# the config to the filename (excluding .yml) #
###################################################
########## General strings
total-maximum: "Vous ne pouvez pas acheter ou louer plus de %0% region(s) au total"
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é"
########## Help command strings
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 Mettre le profil pour réstaurer à on/off"
help-setprice: "&6/as setprice &7-&r Fixerle prix d'une région louée."
help-rentduration: "&6/as rentduration &7-&r Changer la durée d'une région louée"
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"
############ Other command strings
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)"
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"
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)"
buy-payError: "Une erreur durant le paiement s'est produite. Essayez de nouveau plus tard"
buy-succes: "Vous avez bien acheté %0%"
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"
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é"
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-notUpdated: "Tout les panneaux n'ont pas été mis à jour. Recharger peut corriger le problème"
rents-noPermission: "Vous n'avez pas la permission de mettre à jour les panneaux et régions en location"
buys-updated: "Tout les panneaux et régions en vente ont été mis à jour"
buys-notUpdated: "Tout les panneaux n'ont pas été mis à jour. Recharger peut corriger le problème"
buys-noPermission: "Vous n'avez pas la permission de mettre à jour les panneaux et régions en vente"
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-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-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-regionNoRenting: "%0% n'est pas enregistré pour la location"
info-regionRenting: "&6Détails de location pour %0%:"
info-regionRentedBy: "Louée par: &7%0% jusqu'au %1%"
info-regionNotRented: "Actuellement non louée"
info-regionBuying: "&6Détails d'achat pour %0%:"
info-regionNoBuying: "%0% n'est pas enregistré à la vente"
info-regionNotBought: "Actuellement non vendue"
info-regionBoughtBy: "Acheté par: &7%0%"
info-regionSign: "Panneau(x) de location(s): %0%"
info-regionSignLocation: "&7(%0%, %1%, %2%, %3%)&r"
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"
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: "Les paramètres ont bien été restauré de %0% à '%1%'"
setrestore-successProfile: "Les paramètres ont bien été restauré de %0% à '%1%' et la profil à '%2%'"
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%"
rentduration-noPermission: "Vous n'avez pas la permission de changer la durée d'une location"
rentduration-help: "/as rentduration <amount> <identifier> [region], Si non spécifié, cible la région dans laquelle vous vous trouvez"
rentduration-notRegistered: "%0% n'est pas enregistré comme location"
rentduration-wrongAmount: "'%0%' n'est pas un montant valide, utilisez un nombre entier"
rentduration-wrongFormat: "'%0%' n'est pas un format date correcte, regardez la documentation bukkit"
rentduration-success: "Durée de la région %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é"
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 dans une région"
teleport-noPermissionOther: "Vous n'avez pas la permission de vous téléporter à une région qui ne vous appartient pas"
teleport-success: "Vous avez été téléporté à %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%)"
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-noPermissionAll: "Vous n'avez pas la permission de définir un point de téléportation sur une région qui ne vous appartient 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"
find-help: "/as find <buy|rent> [maxprice]"
find-noPermission: "Vous n'avez pas la permission de vous téléporter à des panneaux. Vous ne pouvez donc pas utiliser find"
find-success: "Trouvé %0% région: %1%, en recherchant avec le prix maximum de votre solde: %2%"
find-successMax: "trouvé %0% région: %1%, en cherchant un prix maximum de %2%"
find-wrongMaxPrice: "le prix maximum n'est pas un nombre valide: %0%"
find-noneFound: "Aucune %0% région trouvée, en cherchant le prix maximum de votre solde: %1%"
find-noneFoundMax: "Aucune %0% région trouvée en cherchant un prix maximum de %1%"
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%"
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"
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'évent '%0%' a été déclenché pour 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%"
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%"
+173
View File
@@ -0,0 +1,173 @@
###################################################
# Dutch language file for the AreaShop plugin #
# Latest update: V1.2.1 #
###################################################
# Copy this file and change the strings to your #
# favor. Then change the 'language' setting in #
# the config to the filename (excluding .yml) #
###################################################
########## Command strings
total-maximum: "Je kunt niet meer dan %0% gebied(en) in totaal huren en kopen"
cmd-onlyByPlayer: "Dit commando kan alleen door een speler uitgevoert worden"
cmd-notValid: "Dat commando is niet geldig , gebruik '/as help' voor informatie"
rent-regionNotRentable: "Dat gebied is niet beschikbaar om te huren"
rent-help: "/as rent <gebiednaam>"
rent-noPermission: "Je hebt geen toestemming om een gebied te huren"
rent-maximum: "Je kunt niet meer dan %0% gebied(en) huren"
rent-payError: "Er is iets mis gegaan met betalen, probeer het later opnieuw"
rent-rented: "Je hebt %0% tot %1% gehuurd"
rent-extended: "Je hebt je huur van %0% verlengt tot %1%"
rent-extend: "Je kunt je huur verlengen door opnieuw op het bordje te klikken of gebruik te maken van /as rent"
rent-lowMoneyExtend: "Je hebt niet genoeg geld om de huur te verlengen (je hebt %0% van de %1%)"
rent-lowMoneyRent: "Je hebt niet genoeg geld om het gebied te huren (je hebt %0% van de %1%)"
rent-someoneElse: "Iemand anders heeft dit gebied al gehuurd"
rent-notRentable: "Dat gebied is niet beschikbaar om te huren"
buy-help: "/as buy <gebiednaam>"
buy-noPermission: "Je hebt geen toestemming om een gebied te kopen"
buy-notBuyable: "Dat gebied is niet beschikbaar om te kopen"
buy-maximum: "Je kunt niet meer dan %0% gebied(en) kopen"
buy-payError: "Er is iets mis gegaan met betalen, probeer het later opnieuw"
buy-succes: "Je hebt %0% succesvol gekocht"
buy-lowMoney: "Je hebt niet genoeg geld om het gebied te kopen (je hebt %0% van de %1%)"
buy-yours: "Je hebt dit gebied al gekocht"
buy-someoneElse: "Iemand anders heeft dit gebied al gekocht"
unrent-help: "/as unrent <gebiednaam>"
unrent-noPermission: "Je hebt geen toestemming om te stoppen met huren"
unrent-noPermissionOther: "Je hebt geen toestemming om iemand anders huur te stoppen"
unrent-notRegistered: "De huur kan niet gestopt worden want het gebied is niet geregistreerd om te huren"
unrent-notRented: "De huur kan niet gestopt worden want het gebied is niet gehuurd"
unrent-unrented: "De huur van je gebied is gestopt"
unrent-other: "De huur voor het gebied is gestopt voor speler %0%"
unrent-expired: "De huur van je gebied %0% is gestopt"
sell-help: "/as sell <gebiednaam>"
sell-notRegistered: "Het gebied kan niet verkocht worden want het staat niet geregistreerd om te kopen"
sell-notBought: "Het gebied kan niet verkocht worden want het is niet gekocht"
sell-sold: "Het gebied is verkocht voor speler %0%"
sell-soldYours: "Je gebied is verkocht"
sell-noPermission: "Je hebt geen toestemming om een gebied te verkopen"
sell-noPermissionOther: "Je hebt geen toestemming om een gebied van iemand anders te verkopen"
rents-updated: "Alle borden en gebieden voor de verhuur zijn geupdate"
rents-notUpdated: "Niet alle borden zijn geupdate, een reload zou het op kunnen lossen"
rents-noPermission: "Je hebt geen toestemming om alle verhuur borden en gebieden te updaten"
buys-updated: "Alle borden en gebieden voor de verkoop zijn geupdate"
buys-notUpdated: "Niet alle borden zijn geupdate, een reload zou het op kunnen lossen"
buys-noPermission: "Je hebt geen toestemming om alle verkoop borden en gebieden te updaten"
reload-reloaded: "De config is succesvol opnieuw ingeladen"
reload-noPermission: "Je hebt geen toestemming om de config opnieuw in te laden"
info-help: "/as info <all|rented|forrent|sold|forsale|player|region>"
info-all-rents: "Gebieden geregistreerd voor de verhuur: %0%"
info-all-noRents: "Er zijn geen gebieden geregistreerd voor de verhuur"
info-all-buys: "Gebieden geregistreerd voor de verkoop: %0%"
info-all-noBuys: "Er zijn geen gebieden geregistreerd voor de verkoop"
info-rented: "Verhuurde gebieden: %0%"
info-noRented: "Er zijn geen verhuurde gebieden"
info-unrented: "Gebieden te huur: %0%"
info-noUnrented: "Alle gebieden zijn verhuurd"
info-sold: "Verkochte gebieden: %0%"
info-noSold: "Alle gebieden zijn verkocht"
info-forsale: "Gebieden te koop: %0%"
info-noForsale: "Alle gebieden zijn verkocht"
info-playerHelp: "/as info player <naam>"
info-playerRents: "Gebieden gehuurd door %0%: %1%"
info-playerNoRents: "%0% heeft geen gebied gehuurd"
info-playerBuys: "Gebieden gekocht door %0%: %1%"
info-playerNoBuys: "%0% heeft geen gebieden gekocht"
info-regionHelp: "/as info region <naam>"
info-regionNoRenting: "%0% is niet geregistreerd voor verhuur"
info-regionRenting: "&6Huur informatie voor %0%"
info-regionRentedBy: "Gehuurd door: %0% tot %1%"
info-regionNotRented: "Nu niet verhuurd"
info-regionBuying: "&6Verkoop informatie voor %0%"
info-regionNoBuying: "%0% is niet geregistreerd voor verkoop"
info-regionNotBought: "Nu niet verkocht"
info-regionBoughtBy: "Gekocht door: %0%"
info-regionSign: "Plek van het bordje: wereld=%0%, X=%1%, Y=%2%, Z=%3%"
info-regionPriceDuration: "Prijs: %0% voor elke %1%"
info-regionPrice: "Prijs: %0%"
info-regionRestore: "Herstellen ingeschakeld: %0%"
info-regionRestoreProfile: "Herstel profiel: %0%"
help-header: "Help pagina, commando's die jij kunt uitvoeren"
help-alias: "Commando aliassen: /areashop, /as"
help-help: "&6/as help &7-&r Laat deze help pagina zien"
help-info: "&6/as info &7-&r Vraag informatie over gebieden op"
help-rent: "&6/as rent &7-&r Huur een gebied of verleng de huur"
help-buy: "&6/as buy &7-&r Koop een gebied"
help-unrent: "&6/as unrent &7-&r Stop de huur van een gebied"
help-unrentOwn: "&6/as unrent &7-&r Stop de huur van een eigen gebied"
help-sell: "&6/as sell &7-&r Verkoop een gebied"
help-sellOwn: "&6/as sell &7-&r Verkoop een eigen gebied"
help-updaterents: "&6/as updaterents &7-&r Update alle huur borden en gebieden"
help-updatebuys: "&6/as updatebuys &7-&r Update alle koop borden en gebieden"
help-reload: "&6/as reload &7-&r Herlaad de config en de taalbestanden"
help-rentrestore: "&6/as rentrestore &7-&r Laat dit huur gebied herstellen of niet"
help-buyrestore: "&6/as buyrestore &7-&r Laat dit koop gebied herstellen of niet"
help-rentprice: "&6/as rentprice &7-&r Verander de prijs van een huur gebied"
help-buyprice: "&6/as buyprice &7-&r Verander de prijs van een koop gebied"
help-rentduration: "&6/as rentduration &7-&r Verander de looptijd van een huur gebied"
help-teleport: "&6/as tp &7-&r Teleporteer naar je gekochte/gehuurde gebieden"
help-teleportAll: "&6/as tp &7-&r Teleporteer naar koop/huur gebieden"
rentrestore-help: "/as rentrestore <gebied> <true|false|general> [profiel]"
rentrestore-noPermission: "Je hebt geen toestemming om herstel instellingen te veranderen bij een huur gebied"
rentrestore-notRegistered: "%0% is niet geregistreerd als een huur gebied"
rentrestore-invalidSetting: "'%0%' is geen goede optie, gebruik true, false of general"
rentrestore-success: "Succesvol de herstel optie gezet van %0% naar '%1%'"
rentrestore-successProfile: "Succesvol de herstel optie gezet van %0% naar '%1%' en het profiel naar '%2%'"
buyrestore-help: "/as buyrestore <gebied> <true|false|general> [profiel]"
buyrestore-noPermission: "Je hebt geen toestemming om herstel instellingen te veranderen bij geen koop gebied"
buyrestore-notRegistered: "%0% is niet geregistreerd als een koop gebied"
buyrestore-invalidSetting: "'%0%' is geen goede optie, gebruik true, false of general"
buyrestore-success: "Succesvol de herstel optie gezet van %0% naar '%1%'"
buyrestore-successProfile: "Succesvol de herstel optie gezet van %0% naar '%1%' en het profiel naar '%2%'"
rentprice-noPermission: "Je hebt geen toestemming om de prijs van een huur gebied te veranderen"
rentprice-help: "/as rentprice <gebied> <prijs>"
rentprice-notRegistered: "%0% is niet geregistreerd als een huur gebied"
rentprice-wrongPrice: "'%0%' is geen goede prijs"
rentprice-success: "Prijs van gebied %0% is veranderd naar %1% per %2%"
buyprice-noPermission: "Je hebt geen toestemming om de prijs van een koop gebied te veranderen"
buyprice-help: "/as buyprice <gebied> <prijs>"
buyprice-notRegistered: "%0% is niet geregistreerd als koop gebied"
buyprice-wrongPrice: "'%0%' is geen goede prijs"
buyprice-success: "Prijs van gebied %0% is veranderd naar %1%"
rentduration-noPermission: "Je hebt geen toestemming om de looptijd van een huur gebied te veranderen"
rentduration-help: "/as rentduration <gebied> <aantal> <soort>"
rentduration-notRegistered: "%0% is niet geregistreerd als een huur gebied"
rentduration-wrongPrice: "'%0%' is geen goede prijs, gebruik een geheel getal"
rentduration-wrongFormat: "'%0%' is geen goed tijdformaat, bekijk de documentatie op Bukkit"
rentduration-success: "Looptijd van gebeid %0% veranderd naar '%1%'"
setup-noRegion: "Je hebt geen gebied aangegeven op de tweede regel"
setup-wrongRegion: "Het aangegeven gebied bestaat niet"
setup-alreadyRentSign: "Het aangegeven gebied heeft al een bord voor huren"
setup-alreadyBuySign: "Het aangegeven gebied heeft al een bord voor kopen"
setup-noDuration: "Je hebt geen tijdsduur voor het huren aangegeven, zet dit op de derde regel"
setup-wrongDuration: "De aangegeven tijdsduur is niet in het correcte formaat, voorbeeld: 1 dag"
setup-noPrice: "Je hebt geen prijs aangegeven op de vierde regel"
setup-wrongPrice: "Je hebt de prijs niet goed aangegeven, gebruik een nummer"
setup-rentSuccess: "Huren van gebied %0% is goed opgezet"
setup-buySuccess: "Kopen van gebied %0% is goed opgezet"
setup-noPermissionRent: "Je hebt geen toestemming om huur gebieden op te zetten"
setup-noPermissionBuy: "Je hebt geen toestemming om koop gebieden op te zetten"
setup-couldNotDetect: "Meerdere gebieden gevonden met dezelfde prioriteit en/of parent/child relatie, geeft een specifieke aan op de tweede regel (2 van de gebieden die gevonden zijn: %0% en %1%)"
teleport-help: "/as tp <gebied> <aantal> <soort>"
teleport-noRentOrBuy: "Gebied '%0%' is niet geregistreerd als koop of huur gebied"
teleport-noPermission: "Je hebt geen toestemming om te teleporteren naar een gebied"
teleport-noPermissionOther: "Je hebt geen toestemming om te teleporteren naar een gebied dat niet van jou is"
teleport-success: "Je bent naar %0% geteleporteerd"
teleport-noSafe: "Geen veilige plek gevonden in gebied %0%, verander het gebied of stel de teleporteer positie in"
+153
View File
@@ -0,0 +1,153 @@
name: AreaShop
main: nl.evolutioncoding.AreaShop.AreaShop
version: 2.0.2
depend: [Vault, WorldGuard, WorldEdit]
softdepend: [Multiverse-Core]
commands:
AreaShop:
description: For all commands use /as help
usage: /AreaShop or /AS
permission: areashop.help
permission-message: You don't have <permission>
aliases: [as]
permissions:
areashop.*:
description: Give access to all commands of AreaShop
children:
areashop.help: true
areashop.createrent: true
areashop.createbuy: true
areashop.destroyrent: true
areashop.destroybuy: true
areashop.rent: true
areashop.buy: true
areashop.unrent: true
areashop.info: true
areashop.updaterents: true
areashop.updatebuys: true
areashop.reload: true
areashop.setrestore: true
areashop.setprice: true
areashop.rentduration: true
areashop.teleportall: true
areashop.setteleportall: true
areashop.teleportsign: true
areashop.tabcomplete: true
areashop.setteleportoutsideregion: true
areashop.find: true
areashop.groupadd: true
areashop.groupdel: true
areashop.grouplist: true
areashop.groupinfo: true
areashop.limits.unlimited: true
areashop.schematicevents: true
areashop.addsign: true
areashop.delsign: true
areashop.help:
description: Allows you to see the help pages
default: true
areashop.rent:
description: Allows you to rent a region
default: true
areashop.buy:
description: Allows you to buy a region
default: true
areashop.unrent:
description: Allows you to unrent a specific region
default: op
areashop.unrentown:
description: Allows you to unrent your own region
default: true
areashop.sell:
description: Allows you to sell a specific region
default: op
areashop.sellown:
description: Allows you to sell your own region
default: true
areashop.createrent:
description: Allows you to set up signs for renting regions
default: op
areashop.createbuy:
description: Allows you to set up signs for buying regions
default: op
areashop.destroyrent:
description: Allows you to break signs used for renting regions
default: op
areashop.destroybuy:
description: Allows you to break signs used for renting regions
default: op
areashop.info:
description: Allows you check the status of regions and players
default: true
areashop.updaterents:
description: Allows you to update all rent signs and regions
default: op
areashop.updatebuys:
description: Allows you to update all buy signs and regions
default: op
areashop.reload:
description: Allows you to reload the config
default: op
areashop.setrestore:
description: Allows you to change the restore settings
default: op
areashop.setprice:
description: Allows you to change the price
default: op
areashop.rentduration:
description: Allows you to change the duration of a rent
default: op
areashop.teleport:
description: Teleport to your region
default: true
areashop.teleportall:
description: Teleport to all regions
default: true
areashop.teleportsign:
description: Teleport to signs of regions
default: true
areashop.setteleport:
description: Set the teleport spot for your region
default: true
areashop.setteleportall:
description: Set the teleport for other regions
default: op
areashop.setteleportoutsideregion:
description: Set the teleport location outside the WorldGuard region
default: op
areashop.tabcomplete:
description: Allows you to tabcomplete all commands (also where you dont have permission)
default: op
areashop.find:
description: Allows you to teleport to a free region (/as find)
default: true
areashop.groupadd:
description: Allows you to add regions to groups
default: op
areashop.groupdel:
description: Allows you to delete regions from groups
default: op
areashop.grouplist:
description: Allows you to list all the groups currently created
default: op
areashop.groupinfo:
description: Allows you to display information about a group (all members)
default: op
areashop.rentextendbypass:
description: Bypass the extend limit on rents
default: op
areashop.limits.default:
description: Assign limits as set in the 'default' group in the 'limitGroups' section of the config
default: not op
areashop.limits.unlimited:
description: Assign limits as set in the 'unlimited' group in the 'limitGroups' section of the config
default: op
areashop.schematicevents:
description: Allows you to trigger schematic events for regions
default: op
areashop.addsign:
description: Allows you to add signs to existing regions
default: op
areashop.delsign:
description: Allows you to delete signs from existing regions
default: op
-300
View File
@@ -1,300 +0,0 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>me.wiefferink</groupId>
<artifactId>areashop-parent</artifactId>
<version>1.0</version>
</parent>
<artifactId>areashop</artifactId>
<packaging>jar</packaging>
<name>AreaShop</name>
<version>2.7.1-SNAPSHOT</version> <!-- Main plugin version -->
<repositories>
<repository>
<id>papermc</id>
<url>https://papermc.io/repo/repository/maven-public/</url>
</repository>
<repository>
<id>aikar</id>
<url>https://repo.aikar.co/content/groups/aikar/</url>
</repository>
</repositories>
<dependencies>
<!-- Bukkit, AreaShop aims to support 1.13.2+ -->
<dependency>
<groupId>org.spigotmc</groupId>
<artifactId>spigot-api</artifactId>
<version>1.13.2-R0.1-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
<!-- InteractiveMessenger library -->
<dependency>
<groupId>me.wiefferink</groupId>
<artifactId>interactivemessenger</artifactId>
<version>1.1-SNAPSHOT</version>
</dependency>
<!-- TaskChain library -->
<dependency>
<groupId>co.aikar</groupId>
<artifactId>taskchain-bukkit</artifactId>
<version>3.7.2</version>
</dependency>
<!-- JetBrains Annotations -->
<dependency>
<groupId>org.jetbrains</groupId>
<artifactId>annotations</artifactId>
<version>19.0.0</version>
<scope>provided</scope>
</dependency>
<!-- Paper Lib -->
<dependency>
<groupId>io.papermc</groupId>
<artifactId>paperlib</artifactId>
<version>1.0.5</version>
</dependency>
<!-- WorldEdit/WorldGuard -->
<dependency>
<groupId>com.sk89q.worldedit</groupId>
<artifactId>worldedit-bukkit</artifactId>
<version>7.1.0-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.sk89q.worldguard</groupId>
<artifactId>worldguard-bukkit</artifactId>
<version>7.0.3</version>
<scope>provided</scope>
</dependency>
<!-- Interfaces that specific WorldGuard and WorldEdit versions are built against -->
<dependency>
<groupId>me.wiefferink</groupId>
<artifactId>areashop-interface</artifactId>
<version>latest</version>
<scope>compile</scope>
</dependency>
<!-- WorldGuard implementations -->
<dependency>
<groupId>me.wiefferink</groupId>
<artifactId>areashop-worldguard-7</artifactId>
<version>latest</version>
<scope>compile</scope>
</dependency>
<!-- WorldEdit implementations -->
<dependency>
<groupId>me.wiefferink</groupId>
<artifactId>areashop-worldedit-7</artifactId>
<version>latest</version>
<scope>compile</scope>
</dependency>
<!-- FAWE compat -->
<dependency>
<groupId>me.wiefferink</groupId>
<artifactId>areashop-fawe-1-15</artifactId>
<version>latest</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
<!-- Vault -->
<dependency>
<groupId>net.milkbowl.vault</groupId>
<artifactId>VaultAPI</artifactId>
<version>1.7</version>
<scope>provided</scope>
</dependency>
<!-- bStats -->
<dependency>
<groupId>org.bstats</groupId>
<artifactId>bstats-bukkit</artifactId>
<version>1.6</version>
<scope>compile</scope>
</dependency>
</dependencies>
<profiles>
<!-- Copy the jar file to a test server, activate by using -DcopyResult="/path/to/test/server" -->
<profile>
<id>test-locally</id>
<activation>
<property>
<name>copyResult</name>
</property>
</activation>
<build>
<plugins>
<plugin>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.8</version>
<configuration>
<target>
<copy file="./target/${project.build.finalName}.jar"
tofile="${copyResult}\${project.build.finalName}.jar"/>
</target>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
<!-- Package the source files in a jar, activate by using -Dsources -->
<profile>
<id>package-sources</id>
<activation>
<property>
<name>sources</name>
</property>
</activation>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>3.2.1</version>
<executions>
<execution>
<phase>package</phase>
<id>attach-sources</id>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
<!-- Produce javadoc files, activate by using -Djavadoc -->
<profile>
<id>generate-javadoc</id>
<activation>
<property>
<name>javadoc</name>
</property>
</activation>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<version>3.2.0</version>
<executions>
<execution>
<phase>package</phase>
<id>attach-javadocs</id>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
<configuration>
<excludePackageNames>me.wiefferink.areashop.lib</excludePackageNames>
<destDir>${javadoc}</destDir>
<links>
<link>https://hub.spigotmc.org/javadocs/bukkit/</link>
<link>http://docs.sk89q.com/worldedit/apidocs/</link>
<link>http://docs.sk89q.com/worldguard/apidocs/</link>
</links>
</configuration>
</plugin>
</plugins>
</build>
</profile>
</profiles>
<build>
<directory>target</directory>
<finalName>AreaShop</finalName>
<resources>
<resource>
<targetPath>.</targetPath>
<filtering>true</filtering>
<directory>src/main/resources</directory>
<includes>
<include>plugin.yml</include>
<include>config.yml</include>
<include>hiddenConfig.yml</include>
<include>default.yml</include>
<include>README.md</include>
<include>lang/*.yml</include>
</includes>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.2.3</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<relocations>
<!-- Relocate TaskChain -->
<relocation>
<pattern>co.aikar.taskchain</pattern>
<shadedPattern>me.wiefferink.areashop.shaded.taskchain</shadedPattern>
</relocation>
<!-- Relocate messaging framework -->
<relocation>
<pattern>me.wiefferink.interactivemessenger</pattern>
<shadedPattern>me.wiefferink.areashop.shaded.interactivemessenger</shadedPattern>
</relocation>
<!-- Relocate bstats -->
<relocation>
<pattern>org.bstats</pattern>
<shadedPattern>me.wiefferink.areashop.shaded.bstats</shadedPattern>
</relocation>
<!-- Relocate PaperLib -->
<relocation>
<pattern>io.papermc</pattern>
<shadedPattern>me.wiefferink.areashop.shaded.paperlib</shadedPattern>
</relocation>
<!-- Relocate Google Guice & Guice-Assisted-Inject -->
<relocation>
<pattern>com.google.inject</pattern>
<shadedPattern>me.wiefferink.areashop.shaded.inject</shadedPattern>
</relocation>
</relocations>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
@@ -1,803 +0,0 @@
package me.wiefferink.areashop;
import co.aikar.taskchain.BukkitTaskChainFactory;
import com.sk89q.worldedit.bukkit.WorldEditPlugin;
import com.sk89q.worldguard.bukkit.WorldGuardPlugin;
import com.sk89q.worldguard.protection.managers.RegionManager;
import me.wiefferink.areashop.commands.TestCommand;
import me.wiefferink.areashop.interfaces.AreaShopInterface;
import me.wiefferink.areashop.interfaces.WorldEditInterface;
import me.wiefferink.areashop.interfaces.WorldGuardInterface;
import me.wiefferink.areashop.listeners.PlayerLoginLogoutListener;
import me.wiefferink.areashop.managers.*;
import me.wiefferink.areashop.tools.Analytics;
import me.wiefferink.areashop.tools.GithubUpdateCheck;
import me.wiefferink.areashop.tools.Utils;
import me.wiefferink.interactivemessenger.processing.Message;
import me.wiefferink.interactivemessenger.source.LanguageManager;
import net.milkbowl.vault.economy.Economy;
import org.apache.commons.lang.StringUtils;
import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer;
import org.bukkit.World;
import org.bukkit.command.CommandSender;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.entity.Player;
import org.bukkit.event.HandlerList;
import org.bukkit.permissions.Permission;
import org.bukkit.plugin.Plugin;
import org.bukkit.plugin.RegisteredServiceProvider;
import org.bukkit.plugin.java.JavaPlugin;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.logging.Level;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* Main class for the AreaShop plugin.
* Contains methods to get parts of the plugins functionality and definitions for constants.
*/
public final class AreaShop extends JavaPlugin implements AreaShopInterface {
// Folders and file names
public static final String languageFolder = "lang";
public static final String schematicFolder = "schem";
public static final String regionsFolder = "regions";
public static final String groupsFile = "groups.yml";
public static final String defaultFile = "default.yml";
public static final String configFile = "config.yml";
public static final String configFileHidden = "hiddenConfig.yml";
public static final String versionFile = "versions";
// Euro tag for in the config
public static final String currencyEuro = "%euro%";
// Constants for handling file versions
public static final String versionFiles = "files";
public static final int versionFilesCurrent = 3;
// Keys for replacing parts of flags, commands, strings
public static final String tagPlayerName = "player";
public static final String tagPlayerUUID = "uuid";
public static final String tagWorldName = "world";
public static final String tagRegionName = "region";
public static final String tagRegionType = "type";
public static final String tagPrice = "price";
public static final String tagRawPrice = "rawprice";
public static final String tagDuration = "duration";
public static final String tagRentedUntil = "until";
public static final String tagRentedUntilShort = "untilshort";
public static final String tagWidth = "width"; // x-axis
public static final String tagHeight = "height"; // y-axis
public static final String tagDepth = "depth"; // z-axis
public static final String tagVolume = "volume";
// Number of blocks in the region (accounting for polygon regions)
public static final String tagTimeLeft = "timeleft";
public static final String tagClicker = "clicker";
public static final String tagResellPrice = "resellprice";
public static final String tagRawResellPrice = "rawresellprice";
public static final String tagFriends = "friends";
public static final String tagFriendsUUID = "friendsuuid";
public static final String tagMoneyBackPercentage = "moneybackpercent";
public static final String tagMoneyBackAmount = "moneyback";
public static final String tagRawMoneyBackAmount = "rawmoneyback";
public static final String tagTimesExtended = "timesExtended";
public static final String tagMaxExtends = "maxextends";
public static final String tagExtendsLeft = "extendsleft";
public static final String tagMaxRentTime = "maxrenttime";
public static final String tagMaxInactiveTime = "inactivetime";
public static final String tagLandlord = "landlord";
public static final String tagLandlordUUID = "landlorduuid";
public static final String tagDateTime = "datetime";
public static final String tagDateTimeShort = "datetimeshort";
public static final String tagYear = "year";
public static final String tagMonth = "month";
public static final String tagDay = "day";
public static final String tagHour = "hour";
public static final String tagMinute = "minute";
public static final String tagSecond = "second";
public static final String tagMillisecond = "millisecond";
public static final String tagEpoch = "epoch";
public static final String tagTeleportX = "tpx";
public static final String tagTeleportY = "tpy";
public static final String tagTeleportZ = "tpz";
public static final String tagTeleportBlockX = "tpblockx";
public static final String tagTeleportBlockY = "tpblocky";
public static final String tagTeleportBlockZ = "tpblockz";
public static final String tagTeleportPitch = "tppitch";
public static final String tagTeleportYaw = "tpyaw";
public static final String tagTeleportPitchRound = "tppitchround";
public static final String tagTeleportYawRound = "tpyawround";
public static final String tagTeleportWorld = "tpworld";
// REGEX Matcher for Versions which follow a x.x.x format.
private static final Pattern VERSION_MATCHER_3 = Pattern.compile("([0-9]+)\\.([0-9]+)\\.([0-9]+)");
private static final Pattern VERSION_MATCHER_2 = Pattern.compile("([0-9]+)\\.([0-9]+)\\.([0-9]+)");
// Statically available instance
private static AreaShop instance = null;
// General variables
private WorldGuardPlugin worldGuard = null;
private WorldGuardInterface worldGuardInterface = null;
private WorldEditPlugin worldEdit = null;
private WorldEditInterface worldEditInterface = null;
private FileManager fileManager = null;
private LanguageManager languageManager = null;
private CommandManager commandManager = null;
private SignLinkerManager signLinkerManager = null;
private FeatureManager featureManager = null;
private Set<Manager> managers = null;
private boolean debug = false;
private List<String> chatprefix = null;
private boolean ready = false;
private GithubUpdateCheck githubUpdateCheck = null;
public static AreaShop getInstance() {
return AreaShop.instance;
}
/**
* Sends an debug message to the console.
*
* @param message The message that should be printed to the console
*/
public static void debug(Object... message) {
if (AreaShop.getInstance().debug) {
info("Debug: " + StringUtils.join(message, " "));
}
}
/**
* Print an information message to the console.
*
* @param message The message to print
*/
public static void info(Object... message) {
AreaShop.getInstance().getLogger().info(StringUtils.join(message, " "));
}
/**
* Print a warning to the console.
*
* @param message The message to print
*/
public static void warn(Object... message) {
AreaShop.getInstance().getLogger().warning(StringUtils.join(message, " "));
}
/**
* Print an error to the console.
*
* @param message The message to print
*/
public static void error(Object... message) {
AreaShop.getInstance().getLogger().severe(StringUtils.join(message, " "));
}
/**
* Print debug message for periodic task.
*
* @param message The message to print
*/
public static void debugTask(Object... message) {
if (AreaShop.getInstance().getConfig().getBoolean("debugTask")) {
AreaShop.debug(StringUtils.join(message, " "));
}
}
/**
* Notify a player about an update if he wants notifications about it and an update is available.
*
* @param sender CommandSender to notify
*/
public void notifyUpdate(CommandSender sender) {
if (githubUpdateCheck != null && githubUpdateCheck.hasUpdate() && sender
.hasPermission("areashop.notifyupdate")) {
AreaShop.getInstance().message(sender, "update-playerNotify",
cleanVersion(githubUpdateCheck.getCurrentVersion()),
cleanVersion(githubUpdateCheck.getLatestVersion()));
}
}
/**
* Cleanup a version number.
*
* @param version Version to clean
* @return Cleaned up version (removed prefixes and suffixes)
*/
private String cleanVersion(String version) {
version = version.toLowerCase();
// Strip 'v' as used on Github tags
if (version.startsWith("v")) {
version = version.substring(1);
}
// Strip build number as used by Jenkins
if (version.contains("#")) {
version = version.substring(0, version.indexOf("#"));
}
return version;
}
/**
* Indicates if the plugin is ready to be used.
*
* @return true if the plugin is ready, false otherwise
*/
public boolean isReady() {
return ready;
}
/**
* Set if the plugin is ready to be used or not (not to be used from another plugin!).
*
* @param ready Indicate if the plugin is ready to be used
*/
public void setReady(boolean ready) {
this.ready = ready;
}
/**
* Set if the plugin should output debug messages (loaded from config normally).
*
* @param debug Indicates if the plugin should output debug messages or not
*/
public void setDebug(boolean debug) {
this.debug = debug;
}
/**
* Setup a new LanguageManager.
*/
private void setupLanguageManager() {
languageManager =
new LanguageManager(this, languageFolder, getConfig().getString("language"), "EN",
chatprefix);
}
/**
* Set the chatprefix to use in the chat (loaded from config normally).
*
* @param chatprefix The string to use in front of chat messages (supports formatting codes)
*/
public void setChatprefix(List<String> chatprefix) {
this.chatprefix = chatprefix;
}
/**
* Function to get WorldGuardInterface for version dependent things.
*
* @return WorldGuardInterface
*/
public WorldGuardInterface getWorldGuardHandler() {
return this.worldGuardInterface;
}
/**
* Get the RegionManager.
*
* @param world World to get the RegionManager for
* @return RegionManager for the given world, if there is one, otherwise null
*/
public RegionManager getRegionManager(World world) {
return this.worldGuardInterface.getRegionManager(world);
}
/**
* Function to get WorldGuardInterface for version dependent things.
*
* @return WorldGuardInterface
*/
public WorldEditInterface getWorldEditHandler() {
return this.worldEditInterface;
}
/**
* Function to get the LanguageManager.
*
* @return the LanguageManager
*/
public LanguageManager getLanguageManager() {
return languageManager;
}
/**
* Function to get the CommandManager.
*
* @return the CommandManager
*/
public CommandManager getCommandManager() {
return commandManager;
}
/**
* Get the SignLinkerManager.
* Handles sign linking mode.
*
* @return The SignLinkerManager
*/
public SignLinkerManager getSignlinkerManager() {
return signLinkerManager;
}
/**
* Get the FeatureManager.
* Manages region specific features.
*
* @return The FeatureManager
*/
public FeatureManager getFeatureManager() {
return featureManager;
}
/**
* Function to get the Vault plugin.
*
* @return Economy
*/
public Economy getEconomy() {
RegisteredServiceProvider<Economy> economy = getServer().getServicesManager()
.getRegistration(net.milkbowl.vault.economy.Economy.class);
if (economy == null) {
error(
"There is no economy provider to support Vault, make sure you installed an economy plugin");
return null;
}
return economy.getProvider();
}
/**
* Get the Vault permissions provider.
*
* @return Vault permissions provider
*/
public net.milkbowl.vault.permission.Permission getPermissionProvider() {
RegisteredServiceProvider<net.milkbowl.vault.permission.Permission> permissionProvider =
getServer().getServicesManager()
.getRegistration(net.milkbowl.vault.permission.Permission.class);
return permissionProvider == null ? null : permissionProvider.getProvider();
}
/**
* Check for a permission of a (possibly offline) player.
*
* @param offlinePlayer OfflinePlayer to check
* @param permission Permission to check
* @return true if the player has the permission, false if the player does not have permission or, is offline and there is not Vault-compatible permission plugin
*/
public boolean hasPermission(OfflinePlayer offlinePlayer, String permission) {
// Online, return through Bukkit
if (offlinePlayer.getPlayer() != null) {
return offlinePlayer.getPlayer().hasPermission(permission);
}
// Resolve while offline if possible
net.milkbowl.vault.permission.Permission permissionProvider = getPermissionProvider();
if (permissionProvider != null) {
// TODO: Should we provide a world here?
return permissionProvider.playerHas(null, offlinePlayer, permission);
}
// Player offline and no offline permission provider available, safely say that there is no permission
return false;
}
/**
* Method to get the FileManager (loads/save regions and can be used to get regions).
*
* @return The fileManager
*/
public FileManager getFileManager() {
return fileManager;
}
/**
* Register dynamic permissions controlled by config settings.
*/
private void registerDynamicPermissions() {
// Register limit groups of amount of regions a player can have
ConfigurationSection section = getConfig().getConfigurationSection("limitGroups");
if (section == null) {
return;
}
for (String group : section.getKeys(false)) {
if (!"default".equals(group)) {
Permission perm = new Permission("areashop.limits." + group);
try {
Bukkit.getPluginManager().addPermission(perm);
} catch (IllegalArgumentException e) {
warn("Could not add the following permission to be used as limit: " + perm
.getName());
}
}
}
Bukkit.getPluginManager().recalculatePermissionDefaults(
Bukkit.getPluginManager().getPermission("playerwarps.limits"));
}
/**
* Register all required tasks.
*/
private void setupTasks() {
// Rent expiration timer
long expirationCheck =
Utils.millisToTicks(Utils.getDurationFromSecondsOrString("expiration.delay"));
final AreaShop finalPlugin = this;
if (expirationCheck > 0) {
Bukkit.getScheduler().runTaskTimer(this, () -> {
if (isReady()) {
finalPlugin.getFileManager().checkRents();
AreaShop.debugTask("Checking rent expirations...");
} else {
AreaShop.debugTask("Skipped checking rent expirations, plugin not ready");
}
}, 1, expirationCheck);
}
// Inactive unrenting/selling timer
long inactiveCheck =
Utils.millisToTicks(Utils.getDurationFromMinutesOrString("inactive.delay"));
if (inactiveCheck > 0) {
Bukkit.getScheduler().runTaskTimer(this, () -> {
if (isReady()) {
finalPlugin.getFileManager().checkForInactiveRegions();
AreaShop.debugTask(
"Checking for regions with players that are inactive too long...");
} else {
AreaShop.debugTask(
"Skipped checking for regions of inactive players, plugin not ready");
}
}, 1, inactiveCheck);
}
// Periodic updating of signs for timeleft tags
long periodicUpdate =
Utils.millisToTicks(Utils.getDurationFromSecondsOrString("signs.delay"));
if (periodicUpdate > 0) {
Bukkit.getScheduler().runTaskTimer(this, () -> {
if (isReady()) {
finalPlugin.getFileManager().performPeriodicSignUpdate();
AreaShop.debugTask("Performing periodic sign update...");
} else {
AreaShop.debugTask("Skipped performing periodic sign update, plugin not ready");
}
},1, periodicUpdate);
}
// Saving regions and group settings
long saveFiles = Utils.millisToTicks(Utils.getDurationFromMinutesOrString("saving.delay"));
if (saveFiles > 0) {
Bukkit.getScheduler().runTaskTimer(this, () -> {
if (isReady()) {
finalPlugin.getFileManager().saveRequiredFiles();
AreaShop.debugTask("Saving required files...");
} else {
AreaShop.debugTask("Skipped saving required files, plugin not ready");
}
}, saveFiles, saveFiles);
}
// Sending warnings about rent regions to online players
long expireWarning =
Utils.millisToTicks(Utils.getDurationFromMinutesOrString("expireWarning.delay"));
if (expireWarning > 0) {
Bukkit.getScheduler().runTaskLater(finalPlugin, () -> {
if (isReady()) {
finalPlugin.getFileManager().sendRentExpireWarnings();
AreaShop.debugTask("Sending rent expire warnings...");
} else {
AreaShop.debugTask("Skipped sending rent expire warnings, plugin not ready");
}
}, expireWarning);
}
// Update all regions on startup
if (getConfig().getBoolean("updateRegionsOnStartup")) {
Bukkit.getScheduler().runTaskLater(this, () -> {
finalPlugin.getFileManager().updateAllRegions();
AreaShop.debugTask("Updating all regions at startup...");
}, 20);
}
}
/**
* Send a message to a target without a prefix.
*
* @param target The target to send the message to
* @param key The key of the language string
* @param replacements The replacements to insert in the message
*/
public void messageNoPrefix(Object target, String key, Object... replacements) {
Message.fromKey(key).replacements(replacements).send(target);
}
/**
* Send a message to a target, prefixed by the default chat prefix.
*
* @param target The target to send the message to
* @param key The key of the language string
* @param replacements The replacements to insert in the message
*/
public void message(Object target, String key, Object... replacements) {
Message.fromKey(key).prefix().replacements(replacements).send(target);
}
/**
* Return the config.
*/
@Override
public YamlConfiguration getConfig() {
return fileManager.getConfig();
}
/**
* Called on shutdown or reload of the server.
*/
@Override
public void onDisable() {
Bukkit.getServer().getScheduler().cancelTasks(this);
// Cleanup managers
for (Manager manager : managers) {
manager.shutdown();
}
managers = null;
fileManager = null;
languageManager = null;
commandManager = null;
signLinkerManager = null;
featureManager = null;
// Cleanup plugins
worldGuard = null;
worldGuardInterface = null;
worldEdit = null;
worldEditInterface = null;
// Cleanup other stuff
chatprefix = null;
debug = false;
ready = false;
HandlerList.unregisterAll(this);
}
/**
* Called on start or reload of the server.
*/
@Override
public void onEnable() {
AreaShop.instance = this;
Utils.factory = BukkitTaskChainFactory.create(this);
getCommand("test").setExecutor(new TestCommand());
managers = new HashSet<>();
boolean error = !loadHooks();
// Check if Vault is present
if (getServer().getPluginManager().getPlugin("Vault") == null) {
error("Vault plugin is not present or has not loaded correctly");
error = true;
}
// Load all data from files and check versions
fileManager = new FileManager();
managers.add(fileManager);
boolean loadFilesResult = fileManager.loadFiles(false);
error = error || !loadFilesResult;
setupLanguageManager();
if (error) {
error("The plugin has not started, fix the errors listed above");
} else {
featureManager = new FeatureManager();
managers.add(featureManager);
// Register the event listeners
getServer().getPluginManager()
.registerEvents(new PlayerLoginLogoutListener(this), this);
setupTasks();
// Startup the CommandManager (registers itself for the command)
commandManager = new CommandManager();
managers.add(commandManager);
// Create a signLinkerManager
signLinkerManager = new SignLinkerManager();
managers.add(signLinkerManager);
// Enable Metrics if config allows it
if (getConfig().getBoolean("sendStats")) {
Analytics.start();
}
// Register dynamic permission (things declared in config)
registerDynamicPermissions();
// Don't initialize the updatechecker if disabled in the config
if (getConfig().getBoolean("checkForUpdates")) {
final GithubUpdateCheck.VersionComparator comparator = (latestVersion, currentVersion) -> {
Matcher matcher0 = VERSION_MATCHER_3.matcher(latestVersion);
boolean dual0 = false;
if (!matcher0.find()) {
matcher0 = VERSION_MATCHER_3.matcher(latestVersion);
if (!matcher0.find()) {
throw new IllegalArgumentException("Invalid Versions Detected!");
}
dual0 = true;
}
Matcher matcher1 = VERSION_MATCHER_3.matcher(currentVersion);
boolean dual1 = false;
if (!matcher1.find()) {
matcher1 = VERSION_MATCHER_2.matcher(currentVersion);
if (!matcher1.find()) {
throw new IllegalArgumentException("Invalid Versions Detected!");
}
dual1 = true;
}
int major0 = Integer.parseInt(matcher0.group(1));
int centre0 = Integer.parseInt(matcher0.group(2));
int minor0 = dual0 ? 0 : Integer.parseInt(matcher0.group(3));
int major1 = Integer.parseInt(matcher1.group(1));
int centre1 = Integer.parseInt(matcher1.group(2));
int minor1 = dual1 ? 0 : Integer.parseInt(matcher1.group(3));
return major0 > major1 && centre0 > centre1 && minor0 > minor1;
};
githubUpdateCheck =
new GithubUpdateCheck(AreaShop.getInstance(), "NLThijs48", "AreaShop")
.withVersionComparator(comparator).checkUpdate(result -> {
AreaShop.debug("Update check result:", result);
if (!result.hasUpdate()) {
return;
}
AreaShop.info(
"Update from AreaShop V" + cleanVersion(result.getCurrentVersion())
+ " to AreaShop V" + cleanVersion(result.getLatestVersion())
+ " available, get the latest version at https://www.spigotmc.org/resources/areashop.2991/");
for (Player player : Utils.getOnlinePlayers()) {
notifyUpdate(player);
}
});
}
}
}
public boolean loadHooks() {
final Plugin worldEdit = getServer().getPluginManager().getPlugin("WorldEdit");
if (!(worldEdit instanceof WorldEditPlugin) || !worldEdit.isEnabled()) {
error("WorldEdit plugin is not present or has not loaded correctly");
return true;
}
final Plugin worldGuard = getServer().getPluginManager().getPlugin("WorldGuard");
if (!(worldGuard instanceof WorldGuardPlugin) || !worldEdit.isEnabled()) {
error("WorldGuard plugin is not present or has not loaded correctly");
return true;
}
final String packageName = "me.wiefferink.areashop.handlers.";
final Plugin fawe = getServer().getPluginManager().getPlugin("FastAsyncWorldEdit");
if (fawe != null && fawe.isEnabled()) {
final String version = fawe.getDescription().getVersion();
if (version.startsWith("1.15") || version.startsWith("1.16")) {
try {
this.worldEditInterface = (WorldEditInterface) Class.forName(packageName + "fawe.v1_15.FastAsyncWorldEditHandler")
.getDeclaredConstructor(AreaShopInterface.class).newInstance(this);
} catch (ReflectiveOperationException ex) {
getLogger().log(Level.SEVERE, "Failed to hook into FAWE!");
ex.printStackTrace();
}
}
if (this.worldEditInterface == null) {
info("FAWE Version: " + version + " detected, no compatible handler found. Using the WorldEdit handler instead.");
}
}
if (this.worldEditInterface == null) {
final String version = worldEdit.getDescription().getVersion();
Matcher matcher = VERSION_MATCHER_3.matcher(version);
if (!matcher.find()) {
error("Failed to parse the WE version!");
return false;
}
String major = matcher.group(1);
if (Integer.parseInt(major) < 7) {
error("Unsupported WorldEdit Version: " + version + "! Only WorldEdit version(s) 7.x.x or newer are supported!");
return false;
}
try {
this.worldEditInterface = (WorldEditInterface) Class.forName(packageName + "worldedit.v" + major + ".WorldEditHandler")
.getDeclaredConstructor(AreaShopInterface.class).newInstance(this);
} catch (final ReflectiveOperationException ex) {
ex.printStackTrace();
error("Failed to hook into WorldEdit!");
return false;
}
}
final String wgVersion = worldGuard.getDescription().getVersion();
Matcher matcher = VERSION_MATCHER_3.matcher(wgVersion);
if (!matcher.find()) {
error("Failed to parse the WG version!");
return false;
}
String major = matcher.group(1);
if (Integer.parseInt(major) < 7) {
error("Unsupported WorldGuard Version: " + wgVersion + "! Only WorldGuard version(s) 7.x.x or newer are supported!");
return false;
}
try {
this.worldGuard = (WorldGuardPlugin) worldGuard;
this.worldGuardInterface = (WorldGuardInterface) Class.forName(packageName + "worldguard.v" + major + ".WorldGuardHandler")
.getDeclaredConstructor(AreaShopInterface.class).newInstance(this);
} catch (ReflectiveOperationException ex) {
ex.printStackTrace();
error("Failed to hook into WorldGuard!");
return false;
}
return true;
}
/**
* Non-static debug to use as implementation of the interface.
*
* @param message Object parts of the message that should be logged, toString() will be used
*/
@Override
public void debugI(Object... message) {
AreaShop.debug(StringUtils.join(message, " "));
}
/**
* Function to get the WorldGuard plugin.
*
* @return WorldGuardPlugin
*/
@Override
public WorldGuardPlugin getWorldGuard() {
return worldGuard;
}
/**
* Function to get the WorldEdit plugin.
*
* @return WorldEditPlugin
*/
@Override
public WorldEditPlugin getWorldEdit() {
return worldEdit;
}
/**
* Reload all files of the plugin and update all regions.
*
* @param confirmationReceiver The CommandSender which should be notified when complete, null for nobody
*/
public void reload(final CommandSender confirmationReceiver) {
setReady(false);
fileManager.saveRequiredFilesAtOnce();
fileManager.loadFiles(true);
setupLanguageManager();
message(confirmationReceiver, "reload-reloading");
fileManager.checkRents();
fileManager.updateAllRegions(confirmationReceiver);
}
/**
* Reload all files of the plugin and update all regions.
*/
public void reload() {
reload(null);
}
}
@@ -1,319 +0,0 @@
package me.wiefferink.areashop.commands;
import com.sk89q.worldguard.protection.regions.ProtectedRegion;
import me.wiefferink.areashop.AreaShop;
import me.wiefferink.areashop.events.ask.AddingRegionEvent;
import me.wiefferink.areashop.events.ask.BuyingRegionEvent;
import me.wiefferink.areashop.events.ask.RentingRegionEvent;
import me.wiefferink.areashop.events.notify.BoughtRegionEvent;
import me.wiefferink.areashop.events.notify.RentedRegionEvent;
import me.wiefferink.areashop.interfaces.WorldEditSelection;
import me.wiefferink.areashop.managers.FileManager;
import me.wiefferink.areashop.regions.BuyRegion;
import me.wiefferink.areashop.regions.GeneralRegion;
import me.wiefferink.areashop.regions.RentRegion;
import me.wiefferink.areashop.tools.Utils;
import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer;
import org.bukkit.World;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import java.util.*;
import java.util.stream.Collectors;
public class AddCommand extends CommandAreaShop {
@Override
public String getCommandStart() {
return "areashop add";
}
@Override
public String getHelp(CommandSender target) {
if(target.hasPermission("areashop.createrent")
|| target.hasPermission("areashop.createrent.member")
|| target.hasPermission("areashop.createrent.owner")
|| target.hasPermission("areashop.createbuy")
|| target.hasPermission("areashop.createbuy.member")
|| target.hasPermission("areashop.createbuy.owner")) {
return "help-add";
}
return null;
}
@Override
public void execute(final CommandSender sender, final String[] args) {
if(!sender.hasPermission("areashop.createrent")
&& !sender.hasPermission("areashop.createrent.member")
&& !sender.hasPermission("areashop.createrent.owner")
&& !sender.hasPermission("areashop.createbuy")
&& !sender.hasPermission("areashop.createbuy.member")
&& !sender.hasPermission("areashop.createbuy.owner")) {
plugin.message(sender, "add-noPermission");
return;
}
if(args.length < 2 || args[1] == null || (!"rent".equalsIgnoreCase(args[1]) && !"buy".equalsIgnoreCase(args[1]))) {
plugin.message(sender, "add-help");
return;
}
Map<String, ProtectedRegion> regions = new HashMap<>();
World world;
Player player = null;
if(sender instanceof Player) {
player = (Player)sender;
}
if(args.length == 2) {
if(player == null) {
plugin.message(sender, "cmd-weOnlyByPlayer");
return;
}
WorldEditSelection selection = plugin.getWorldEditHandler().getPlayerSelection(player);
if(selection == null) {
plugin.message(player, "cmd-noSelection");
return;
}
world = selection.getWorld();
regions = Utils.getWorldEditRegionsInSelection(selection).stream().collect(Collectors.toMap(ProtectedRegion::getId, region -> region));
if(regions.isEmpty()) {
plugin.message(player, "cmd-noWERegionsFound");
return;
}
} else {
if(player != null) {
if(args.length == 4) {
world = Bukkit.getWorld(args[3]);
if(world == null) {
plugin.message(sender, "add-incorrectWorld", args[3]);
return;
}
} else {
world = ((Player)sender).getWorld();
}
} else {
if(args.length < 4) {
plugin.message(sender, "add-specifyWorld");
return;
} else {
world = Bukkit.getWorld(args[3]);
if(world == null) {
plugin.message(sender, "add-incorrectWorld", args[3]);
return;
}
}
}
ProtectedRegion region = plugin.getRegionManager(world).getRegion(args[2]);
if(region == null) {
plugin.message(sender, "cmd-noRegion", args[2]);
return;
}
regions.put(args[2], region);
}
final boolean isRent = "rent".equalsIgnoreCase(args[1]);
final Player finalPlayer = player;
AreaShop.debug("Starting add task with " + regions.size() + " regions");
TreeSet<GeneralRegion> regionsSuccess = new TreeSet<>();
TreeSet<GeneralRegion> regionsAlready = new TreeSet<>();
TreeSet<GeneralRegion> regionsAlreadyOtherWorld = new TreeSet<>();
TreeSet<GeneralRegion> regionsRentCancelled = new TreeSet<>(); // Denied by an event listener
TreeSet<GeneralRegion> regionsBuyCancelled = new TreeSet<>(); // Denied by an event listener
TreeSet<String> namesBlacklisted = new TreeSet<>();
TreeSet<String> namesNoPermission = new TreeSet<>();
TreeSet<String> namesAddCancelled = new TreeSet<>(); // Denied by an event listener
Utils.runAsBatches(regions.entrySet(),
plugin.getConfig().getInt("adding.regionsPerTick"),
(regionEntry) -> {
String regionName = regionEntry.getKey();
ProtectedRegion region = regionEntry.getValue();
// Determine if the player is an owner or member of the region
boolean isMember = finalPlayer != null && plugin.getWorldGuardHandler().containsMember(region, finalPlayer.getUniqueId());
boolean isOwner = finalPlayer != null && plugin.getWorldGuardHandler().containsOwner(region, finalPlayer.getUniqueId());
String type;
if(isRent) {
type = "rent";
} else {
type = "buy";
}
FileManager.AddResult result = plugin.getFileManager().checkRegionAdd(sender, region, world, isRent ? GeneralRegion.RegionType.RENT : GeneralRegion.RegionType.BUY);
if(result == FileManager.AddResult.ALREADYADDED) {
regionsAlready.add(plugin.getFileManager().getRegion(regionName));
} else if(result == FileManager.AddResult.ALREADYADDEDOTHERWORLD) {
regionsAlreadyOtherWorld.add(plugin.getFileManager().getRegion(regionName));
} else if(result == FileManager.AddResult.BLACKLISTED) {
namesBlacklisted.add(regionName);
} else if(result == FileManager.AddResult.NOPERMISSION) {
namesNoPermission.add(regionName);
} else {
// Check if the player should be landlord
boolean landlord = (!sender.hasPermission("areashop.create" + type)
&& ((sender.hasPermission("areashop.create" + type + ".owner") && isOwner)
|| (sender.hasPermission("areashop.create" + type + ".member") && isMember)));
List<UUID> existing = new ArrayList<>();
existing.addAll(plugin.getWorldGuardHandler().getOwners(region).asUniqueIdList());
existing.addAll(plugin.getWorldGuardHandler().getMembers(region).asUniqueIdList());
AreaShop.debug("regionAddLandlordStatus:", regionName,
"landlord:", landlord,
"existing:", existing,
"isMember:", isMember,
"isOwner:", isOwner,
"createPermission:", sender.hasPermission("areashop.create" + type),
"ownerPermission:", sender.hasPermission("areashop.create" + type + ".owner"),
"memberPermission:", sender.hasPermission("areashop.create" + type + ".member"));
if(isRent) {
RentRegion rent = new RentRegion(regionName, world);
// Set landlord
if(landlord) {
rent.setLandlord(finalPlayer.getUniqueId(), finalPlayer.getName());
}
AddingRegionEvent event = plugin.getFileManager().addRegion(rent);
if (event.isCancelled()) {
namesAddCancelled.add(rent.getName());
return;
}
rent.handleSchematicEvent(GeneralRegion.RegionEvent.CREATED);
rent.update();
// Add existing owners/members if any
if(!landlord && !existing.isEmpty()) {
UUID rentBy = existing.remove(0);
OfflinePlayer rentByPlayer = Bukkit.getOfflinePlayer(rentBy);
RentingRegionEvent rentingRegionEvent = new RentingRegionEvent(rent, rentByPlayer, false);
Bukkit.getPluginManager().callEvent(rentingRegionEvent);
if(rentingRegionEvent.isCancelled()) {
regionsRentCancelled.add(rent);
} else {
// Add values to the rent and send it to FileManager
rent.setRentedUntil(Calendar.getInstance().getTimeInMillis() + rent.getDuration());
rent.setRenter(rentBy);
rent.updateLastActiveTime();
// Fire schematic event and updated times extended
rent.handleSchematicEvent(GeneralRegion.RegionEvent.RENTED);
// Add others as friends
for(UUID friend : existing) {
rent.getFriendsFeature().addFriend(friend, null);
}
rent.notifyAndUpdate(new RentedRegionEvent(rent, false));
}
}
regionsSuccess.add(rent);
} else {
BuyRegion buy = new BuyRegion(regionName, world);
// Set landlord
if(landlord) {
buy.setLandlord(finalPlayer.getUniqueId(), finalPlayer.getName());
}
AddingRegionEvent event = plugin.getFileManager().addRegion(buy);
if (event.isCancelled()) {
namesAddCancelled.add(buy.getName());
return;
}
buy.handleSchematicEvent(GeneralRegion.RegionEvent.CREATED);
buy.update();
// Add existing owners/members if any
if(!landlord && !existing.isEmpty()) {
UUID buyBy = existing.remove(0);
OfflinePlayer buyByPlayer = Bukkit.getOfflinePlayer(buyBy);
BuyingRegionEvent buyingRegionEvent = new BuyingRegionEvent(buy, buyByPlayer);
Bukkit.getPluginManager().callEvent(buyingRegionEvent);
if(buyingRegionEvent.isCancelled()) {
regionsBuyCancelled.add(buy);
} else {
// Set the owner
buy.setBuyer(buyBy);
buy.updateLastActiveTime();
// Update everything
buy.handleSchematicEvent(GeneralRegion.RegionEvent.BOUGHT);
// Add others as friends
for (UUID friend : existing) {
buy.getFriendsFeature().addFriend(friend, null);
}
buy.notifyAndUpdate(new BoughtRegionEvent(buy));
}
}
regionsSuccess.add(buy);
}
}
}, false).thenAccept(
(success) -> {
if(!regionsSuccess.isEmpty()) {
plugin.message(sender, "add-success", args[1], Utils.combinedMessage(regionsSuccess, "region"));
}
if(!regionsAlready.isEmpty()) {
plugin.message(sender, "add-failed", Utils.combinedMessage(regionsAlready, "region"));
}
if(!regionsAlreadyOtherWorld.isEmpty()) {
plugin.message(sender, "add-failedOtherWorld", Utils.combinedMessage(regionsAlreadyOtherWorld, "region"));
}
if(!regionsRentCancelled.isEmpty()) {
plugin.message(sender, "add-rentCancelled", Utils.combinedMessage(regionsRentCancelled, "region"));
}
if(!regionsBuyCancelled.isEmpty()) {
plugin.message(sender, "add-buyCancelled", Utils.combinedMessage(regionsBuyCancelled, "region"));
}
if(!namesBlacklisted.isEmpty()) {
plugin.message(sender, "add-blacklisted", Utils.createCommaSeparatedList(namesBlacklisted));
}
if(!namesNoPermission.isEmpty()) {
plugin.message(sender, "add-noPermissionRegions", Utils.createCommaSeparatedList(namesNoPermission));
plugin.message(sender, "add-noPermissionOwnerMember");
}
if(!namesAddCancelled.isEmpty()) {
plugin.message(sender, "add-rentCancelled", Utils.createCommaSeparatedList(namesAddCancelled));
}
});
}
@Override
public List<String> getTabCompleteList(int toComplete, String[] start, CommandSender sender) {
List<String> result = new LinkedList<>();
if(toComplete == 2) {
if(sender.hasPermission("areashop.createrent")) {
result.add("rent");
}
if(sender.hasPermission("areashop.createbuy")) {
result.add("buy");
}
} else if(toComplete == 3) {
if(sender instanceof Player) {
Player player = (Player)sender;
if(sender.hasPermission("areashop.createrent") || sender.hasPermission("areashop.createbuy")) {
for(ProtectedRegion region : plugin.getRegionManager(player.getWorld()).getRegions().values()) {
result.add(region.getId());
}
}
}
}
return result;
}
}
@@ -1,141 +0,0 @@
package me.wiefferink.areashop.commands;
import me.wiefferink.areashop.regions.BuyRegion;
import me.wiefferink.areashop.regions.GeneralRegion;
import me.wiefferink.areashop.regions.RentRegion;
import me.wiefferink.areashop.tools.Utils;
import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import java.util.ArrayList;
import java.util.List;
public class AddfriendCommand extends CommandAreaShop {
@Override
public String getCommandStart() {
return "areashop addfriend";
}
@Override
public String getHelp(CommandSender target) {
if(target.hasPermission("areashop.addfriendall") || target.hasPermission("areashop.addfriend")) {
return "help-addFriend";
}
return null;
}
@SuppressWarnings("deprecation")
@Override
public void execute(CommandSender sender, String[] args) {
if(!sender.hasPermission("areashop.addfriend") && !sender.hasPermission("areashop.addfriendall")) {
plugin.message(sender, "addfriend-noPermission");
return;
}
if(args.length < 2) {
plugin.message(sender, "addfriend-help");
return;
}
GeneralRegion region;
if(args.length <= 2) {
if(sender instanceof Player) {
// get the region by location
List<GeneralRegion> regions = Utils.getImportantRegions(((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 = plugin.getFileManager().getRegion(args[2]);
if(region == null) {
plugin.message(sender, "cmd-notRegistered", args[2]);
return;
}
}
if(sender.hasPermission("areashop.addfriendall")) {
if((region instanceof RentRegion && !((RentRegion)region).isRented())
|| (region instanceof BuyRegion && !((BuyRegion)region).isSold())) {
plugin.message(sender, "addfriend-noOwner", region);
return;
}
OfflinePlayer friend = Bukkit.getOfflinePlayer(args[1]);
if(friend.getLastPlayed() == 0 && !friend.isOnline() && !plugin.getConfig().getBoolean("addFriendNotExistingPlayers")) {
plugin.message(sender, "addfriend-notVisited", args[1], region);
return;
}
if(region.getFriendsFeature().getFriends().contains(friend.getUniqueId())) {
plugin.message(sender, "addfriend-alreadyAdded", friend.getName(), region);
return;
}
if(region.isOwner(friend.getUniqueId())) {
plugin.message(sender, "addfriend-self", friend.getName(), region);
return;
}
if(region.getFriendsFeature().addFriend(friend.getUniqueId(), sender)) {
region.update();
plugin.message(sender, "addfriend-successOther", friend.getName(), region);
}
} else {
if(sender.hasPermission("areashop.addfriend") && sender instanceof Player) {
if(region.isOwner((Player)sender)) {
OfflinePlayer friend = Bukkit.getOfflinePlayer(args[1]);
if(friend.getLastPlayed() == 0 && !friend.isOnline() && !plugin.getConfig().getBoolean("addFriendNotExistingPlayers")) {
plugin.message(sender, "addfriend-notVisited", args[1], region);
return;
}
if(region.getFriendsFeature().getFriends().contains(friend.getUniqueId())) {
plugin.message(sender, "addfriend-alreadyAdded", friend.getName(), region);
return;
}
if(region.isOwner(friend.getUniqueId())) {
plugin.message(sender, "addfriend-self", friend.getName(), region);
return;
}
if(region.getFriendsFeature().addFriend(friend.getUniqueId(), sender)) {
region.update();
plugin.message(sender, "addfriend-success", friend.getName(), region);
}
} else {
plugin.message(sender, "addfriend-noPermissionOther", region);
}
} else {
plugin.message(sender, "addfriend-noPermission", region);
}
}
}
@Override
public List<String> getTabCompleteList(int toComplete, String[] start, CommandSender sender) {
ArrayList<String> result = new ArrayList<>();
if(toComplete == 2) {
for(Player player : Utils.getOnlinePlayers()) {
result.add(player.getName());
}
} else if(toComplete == 3) {
result.addAll(plugin.getFileManager().getRegionNames());
}
return result;
}
}
@@ -1,137 +0,0 @@
package me.wiefferink.areashop.commands;
import me.wiefferink.areashop.features.signs.RegionSign;
import me.wiefferink.areashop.features.signs.SignsFeature;
import me.wiefferink.areashop.regions.GeneralRegion;
import me.wiefferink.areashop.tools.Materials;
import me.wiefferink.areashop.tools.Utils;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.block.BlockFace;
import org.bukkit.block.data.BlockData;
import org.bukkit.block.data.type.Sign;
import org.bukkit.block.data.type.WallSign;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.util.BlockIterator;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
public class AddsignCommand extends CommandAreaShop {
@Override
public String getCommandStart() {
return "areashop addsign";
}
@Override
public String getHelp(CommandSender target) {
if (target.hasPermission("areashop.addsign")) {
return "help-addsign";
}
return null;
}
@Override
public void execute(CommandSender sender, String[] args) {
if (!sender.hasPermission("areashop.addsign")) {
plugin.message(sender, "addsign-noPermission");
return;
}
if (!(sender instanceof Player)) {
plugin.message(sender, "cmd-onlyByPlayer");
return;
}
Player player = (Player) sender;
// Get the sign
Block block = null;
BlockIterator blockIterator = new BlockIterator(player, 100);
while (blockIterator.hasNext() && block == null) {
Block next = blockIterator.next();
if (next.getType() != Material.AIR) {
block = next;
}
}
if (block == null || !Materials.isSign(block.getType())) {
plugin.message(sender, "addsign-noSign");
return;
}
GeneralRegion region;
if (args.length > 1) {
// Get region by argument
region = plugin.getFileManager().getRegion(args[1]);
if (region == null) {
plugin.message(sender, "cmd-notRegistered", args[1]);
return;
}
} else {
// Get region by sign position
List<GeneralRegion> regions = Utils.getImportantRegions(block.getLocation());
if (regions.isEmpty()) {
plugin.message(sender, "addsign-noRegions");
return;
} else if (regions.size() > 1) {
plugin.message(sender, "addsign-couldNotDetect", regions.get(0).getName(), regions.get(1).getName());
return;
}
region = regions.get(0);
}
String profile = null;
if (args.length > 2) {
profile = args[2];
Set<String> profiles = plugin.getConfig().getConfigurationSection("signProfiles").getKeys(false);
if (!profiles.contains(profile)) {
plugin.message(sender, "addsign-wrongProfile", Utils.createCommaSeparatedList(profiles), region);
return;
}
}
RegionSign regionSign = SignsFeature.getSignByLocation(block.getLocation());
if (regionSign != null) {
plugin.message(sender, "addsign-alreadyRegistered", regionSign.getRegion());
return;
}
final BlockData data = block.getBlockData();
final BlockFace rotation;
if (data instanceof Sign) {
rotation = ((Sign) data).getRotation();
} else if (data instanceof WallSign) {
rotation = ((WallSign) data).getFacing();
} else {
rotation = null;
}
region.getSignsFeature().addSign(block.getLocation(), block.getType(), rotation, profile);
if (profile == null) {
plugin.message(sender, "addsign-success", region);
} else {
plugin.message(sender, "addsign-successProfile", profile, region);
}
region.update();
}
@Override
public List<String> getTabCompleteList(int toComplete, String[] start, CommandSender sender) {
List<String> result = new ArrayList<>();
if (toComplete == 2) {
result.addAll(plugin.getFileManager().getRegionNames());
} else if (toComplete == 3) {
result.addAll(plugin.getConfig().getStringList("signProfiles"));
}
return result;
}
}
@@ -1,102 +0,0 @@
package me.wiefferink.areashop.commands;
import me.wiefferink.areashop.AreaShop;
import me.wiefferink.interactivemessenger.processing.Message;
import org.apache.commons.lang.StringUtils;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Abstract class for generalising command classes.
*/
public abstract class CommandAreaShop {
final AreaShop plugin = AreaShop.getInstance();
private final Map<String, CommandTime> lastUsed;
public CommandAreaShop() {
lastUsed = new HashMap<>();
}
/**
* Check if this Command instance can execute the given command and arguments.
* @param command The command to check for execution
* @param args The arguments to check
* @return true if it can execute the command, false otherwise
*/
public boolean canExecute(Command command, String[] args) {
String commandString = command.getName() + " " + StringUtils.join(args, " ");
if(commandString.length() > getCommandStart().length()) {
return commandString.toLowerCase().startsWith(getCommandStart().toLowerCase() + " ");
}
return commandString.toLowerCase().startsWith(getCommandStart().toLowerCase());
}
/**
* Get a list of string to complete a command with (raw list, not matching ones not filtered out).
* @param toComplete The number of the argument that has to be completed
* @param start The already given start of the command
* @param sender The CommandSender that wants to tab complete
* @return A collection with all the possibilities for argument to complete
*/
public List<String> getTabCompleteList(int toComplete, String[] start, CommandSender sender) {
return new ArrayList<>();
}
/**
* Get the argument that comes after the base command that this command reacts to.
* @return The string that should be in front of the command for this class to act
*/
public abstract String getCommandStart();
/**
* Returns the correct help string key to be used on the help page.
* @param target The CommandSender that the help message is for
* @return The help message key according to the permissions of the reciever
*/
public abstract String getHelp(CommandSender target);
/**
* Execute a (sub)command if the conditions are met.
* @param sender The commandSender that executed the command
* @param args The arguments that are given
*/
public abstract void execute(CommandSender sender, String[] args);
/**
* Confirm a command.
* @param sender To confirm it for, or send a message to confirm
* @param args Command args
* @param message Message to send when confirmation is required
* @return true if confirmed, false if confirmation is required
*/
public boolean confirm(CommandSender sender, String[] args, Message message) {
String command = "/" + getCommandStart() + " " + StringUtils.join(args, " ", 1, args.length);
long now = System.currentTimeMillis();
CommandTime last = lastUsed.get(sender.getName());
if(last != null && last.command.equalsIgnoreCase(command) && last.time > (now - 1000 * 60)) {
return true;
}
message.prefix().append(Message.fromKey("confirm-yes").replacements(command)).send(sender);
lastUsed.put(sender.getName(), new CommandTime(command, now));
return false;
}
private static class CommandTime {
public final String command;
public final long time;
CommandTime(String command, long time) {
this.command = command;
this.time = time;
}
}
}
@@ -1,148 +0,0 @@
package me.wiefferink.areashop.commands;
import me.wiefferink.areashop.events.ask.DeletingRegionEvent;
import me.wiefferink.areashop.interfaces.WorldEditSelection;
import me.wiefferink.areashop.regions.BuyRegion;
import me.wiefferink.areashop.regions.GeneralRegion;
import me.wiefferink.areashop.regions.RentRegion;
import me.wiefferink.areashop.tools.Utils;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import java.util.ArrayList;
import java.util.List;
import java.util.TreeSet;
public class DelCommand extends CommandAreaShop {
@Override
public String getCommandStart() {
return "areashop del";
}
@Override
public String getHelp(CommandSender target) {
if(target.hasPermission("areashop.destroyrent") || target.hasPermission("areashop.destroybuy") || target.hasPermission("areashop.destroyrent.landlord") || target.hasPermission("areashop.destroybuy.landlord")) {
return "help-del";
}
return null;
}
@Override
public void execute(CommandSender sender, String[] args) {
if(!sender.hasPermission("areashop.destroybuy")
&& !sender.hasPermission("areashop.destroybuy.landlord")
&& !sender.hasPermission("areashop.destroyrent")
&& !sender.hasPermission("areashop.destroyrent.landlord")) {
plugin.message(sender, "del-noPermission");
return;
}
if(args.length < 2) {
// Only players can have a selection
if(!(sender instanceof Player)) {
plugin.message(sender, "cmd-weOnlyByPlayer");
return;
}
Player player = (Player)sender;
WorldEditSelection selection = plugin.getWorldEditHandler().getPlayerSelection(player);
if(selection == null) {
plugin.message(player, "cmd-noSelection");
return;
}
List<GeneralRegion> regions = Utils.getRegionsInSelection(selection);
if(regions == null || regions.isEmpty()) {
plugin.message(player, "cmd-noRegionsFound");
return;
}
// Start removing the regions that he has permission for
ArrayList<String> namesSuccess = new ArrayList<>();
TreeSet<GeneralRegion> regionsFailed = new TreeSet<>();
TreeSet<GeneralRegion> regionsCancelled = new TreeSet<>();
for(GeneralRegion region : regions) {
boolean isLandlord = region.isLandlord(((Player)sender).getUniqueId());
if(region instanceof RentRegion) {
if(!sender.hasPermission("areashop.destroyrent") && !(isLandlord && sender.hasPermission("areashop.destroyrent.landlord"))) {
regionsFailed.add(region);
continue;
}
} else if(region instanceof BuyRegion) {
if(!sender.hasPermission("areashop.destroybuy") && !(isLandlord && sender.hasPermission("areashop.destroybuy.landlord"))) {
regionsFailed.add(region);
continue;
}
}
DeletingRegionEvent event = plugin.getFileManager().deleteRegion(region, true);
if (event.isCancelled()) {
regionsCancelled.add(region);
} else {
namesSuccess.add(region.getName());
}
}
// Send messages
if(!namesSuccess.isEmpty()) {
plugin.message(sender, "del-success", Utils.createCommaSeparatedList(namesSuccess));
}
if(!regionsFailed.isEmpty()) {
plugin.message(sender, "del-failed", Utils.combinedMessage(regionsFailed, "region"));
}
if(!regionsCancelled.isEmpty()) {
plugin.message(sender, "del-cancelled", Utils.combinedMessage(regionsCancelled, "region"));
}
} else {
GeneralRegion region = plugin.getFileManager().getRegion(args[1]);
if(region == null) {
plugin.message(sender, "cmd-notRegistered", args[1]);
return;
}
boolean isLandlord = sender instanceof Player && region.isLandlord(((Player)sender).getUniqueId());
if(region instanceof RentRegion) {
// Remove the rent if the player has permission
if(sender.hasPermission("areashop.destroyrent") || (isLandlord && sender.hasPermission("areashop.destroyrent.landlord"))) {
DeletingRegionEvent event = plugin.getFileManager().deleteRegion(region, true);
if (event.isCancelled()) {
plugin.message(sender, "general-cancelled", event.getReason());
} else {
plugin.message(sender, "destroy-successRent", region);
}
} else {
plugin.message(sender, "destroy-noPermissionRent", region);
}
} else if(region instanceof BuyRegion) {
// Remove the buy if the player has permission
if(sender.hasPermission("areashop.destroybuy") || (isLandlord && sender.hasPermission("areashop.destroybuy.landlord"))) {
DeletingRegionEvent event = plugin.getFileManager().deleteRegion(region, true);
if (event.isCancelled()) {
plugin.message(sender, "general-cancelled", event.getReason());
} else {
plugin.message(sender, "destroy-successBuy", region);
}
} else {
plugin.message(sender, "destroy-noPermissionBuy", region);
}
}
}
}
@Override
public List<String> getTabCompleteList(int toComplete, String[] start, CommandSender sender) {
List<String> result = new ArrayList<>();
if(toComplete == 2) {
result = plugin.getFileManager().getRegionNames();
}
return result;
}
}
@@ -1,139 +0,0 @@
package me.wiefferink.areashop.commands;
import me.wiefferink.areashop.regions.BuyRegion;
import me.wiefferink.areashop.regions.GeneralRegion;
import me.wiefferink.areashop.regions.RentRegion;
import me.wiefferink.areashop.tools.Utils;
import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import java.util.ArrayList;
import java.util.List;
public class DelfriendCommand extends CommandAreaShop {
@Override
public String getCommandStart() {
return "areashop delfriend";
}
@Override
public String getHelp(CommandSender target) {
if(target.hasPermission("areashop.delfriendall") || target.hasPermission("areashop.delfriend")) {
return "help-delFriend";
}
return null;
}
/**
* Check if a person can remove friends.
* @param person The person to check
* @param region The region to check for
* @return true if the person can remove friends, otherwise false
*/
public static boolean canUse(CommandSender person, GeneralRegion region) {
if(person.hasPermission("areashop.delfriendall")) {
return true;
}
if(person instanceof Player) {
Player player = (Player)person;
return region.isOwner(player) && player.hasPermission("areashop.delfriend");
}
return false;
}
@SuppressWarnings("deprecation")
@Override
public void execute(CommandSender sender, String[] args) {
if(!sender.hasPermission("areashop.delfriend") && !sender.hasPermission("areashop.delfriendall")) {
plugin.message(sender, "delfriend-noPermission");
return;
}
if(args.length < 2) {
plugin.message(sender, "delfriend-help");
return;
}
GeneralRegion region;
if(args.length <= 2) {
if(sender instanceof Player) {
// get the region by location
List<GeneralRegion> regions = Utils.getImportantRegions(((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 = plugin.getFileManager().getRegion(args[2]);
if(region == null) {
plugin.message(sender, "cmd-notRegistered", args[2]);
return;
}
}
if(sender.hasPermission("areashop.delfriendall")) {
if((region instanceof RentRegion && !((RentRegion)region).isRented())
|| (region instanceof BuyRegion && !((BuyRegion)region).isSold())) {
plugin.message(sender, "delfriend-noOwner", region);
return;
}
OfflinePlayer friend = Bukkit.getOfflinePlayer(args[1]);
if(!region.getFriendsFeature().getFriends().contains(friend.getUniqueId())) {
plugin.message(sender, "delfriend-notAdded", friend.getName(), region);
return;
}
if(region.getFriendsFeature().deleteFriend(friend.getUniqueId(), sender)) {
region.update();
plugin.message(sender, "delfriend-successOther", friend.getName(), region);
}
} else {
if(sender.hasPermission("areashop.delfriend") && sender instanceof Player) {
if(region.isOwner((Player)sender)) {
OfflinePlayer friend = Bukkit.getOfflinePlayer(args[1]);
if(!region.getFriendsFeature().getFriends().contains(friend.getUniqueId())) {
plugin.message(sender, "delfriend-notAdded", friend.getName(), region);
return;
}
if(region.getFriendsFeature().deleteFriend(friend.getUniqueId(), sender)) {
region.update();
plugin.message(sender, "delfriend-success", friend.getName(), region);
}
} else {
plugin.message(sender, "delfriend-noPermissionOther", region);
}
} else {
plugin.message(sender, "delfriend-noPermission", region);
}
}
}
@Override
public List<String> getTabCompleteList(int toComplete, String[] start, CommandSender sender) {
ArrayList<String> result = new ArrayList<>();
if(toComplete == 2) {
for(Player player : Utils.getOnlinePlayers()) {
result.add(player.getName());
}
} else if(toComplete == 3) {
result.addAll(plugin.getFileManager().getRegionNames());
}
return result;
}
}
@@ -1,191 +0,0 @@
package me.wiefferink.areashop.commands;
import me.wiefferink.areashop.regions.BuyRegion;
import me.wiefferink.areashop.regions.RegionGroup;
import me.wiefferink.areashop.regions.RentRegion;
import me.wiefferink.areashop.tools.Utils;
import me.wiefferink.interactivemessenger.processing.Message;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.concurrent.ThreadLocalRandom;
public class FindCommand extends CommandAreaShop {
@Override
public String getCommandStart() {
return "areashop find";
}
@Override
public String getHelp(CommandSender target) {
if(target.hasPermission("areashop.find")) {
return "help-find";
}
return null;
}
@Override
public void execute(CommandSender sender, String[] args) {
if(!sender.hasPermission("areashop.find")) {
plugin.message(sender, "find-noPermission");
return;
}
if(!(sender instanceof Player)) {
plugin.message(sender, "cmd-onlyByPlayer");
return;
}
if(args.length <= 1 || args[1] == null || (!args[1].equalsIgnoreCase("buy") && !args[1].equalsIgnoreCase("rent"))) {
plugin.message(sender, "find-help");
return;
}
Player player = (Player)sender;
double balance = 0.0;
if(plugin.getEconomy() != null) {
balance = plugin.getEconomy().getBalance(player);
}
double maxPrice = 0;
boolean maxPriceSet = false;
RegionGroup group = null;
// Parse optional price argument
if(args.length >= 3) {
try {
maxPrice = Double.parseDouble(args[2]);
maxPriceSet = true;
} catch(NumberFormatException e) {
plugin.message(sender, "find-wrongMaxPrice", args[2]);
return;
}
}
// Parse optional group argument
if(args.length >= 4) {
group = plugin.getFileManager().getGroup(args[3]);
if(group == null) {
plugin.message(sender, "find-wrongGroup", args[3]);
return;
}
}
// Find buy regions
if(args[1].equalsIgnoreCase("buy")) {
List<BuyRegion> regions = plugin.getFileManager().getBuys();
List<BuyRegion> results = new ArrayList<>();
for(BuyRegion region : regions) {
if(!region.isSold()
&& ((region.getPrice() <= balance && !maxPriceSet) || (region.getPrice() <= maxPrice && maxPriceSet))
&& (group == null || group.isMember(region))
&& (region.getBooleanSetting("general.findCrossWorld") || player.getWorld().equals(region.getWorld()))) {
results.add(region);
}
}
if(!results.isEmpty()) {
// Draw a random one
BuyRegion region = results.get(ThreadLocalRandom.current().nextInt(results.size()));
Message onlyInGroup = Message.empty();
if(group != null) {
onlyInGroup = Message.fromKey("find-onlyInGroup").replacements(args[3]);
}
// Teleport
if(maxPriceSet) {
plugin.message(player, "find-successMax", "buy", Utils.formatCurrency(maxPrice), onlyInGroup, region);
} else {
plugin.message(player, "find-success", "buy", Utils.formatCurrency(balance), onlyInGroup, region);
}
region.getTeleportFeature().teleportPlayer(player, region.getBooleanSetting("general.findTeleportToSign"), false);
} else {
Message onlyInGroup = Message.empty();
if(group != null) {
onlyInGroup = Message.fromKey("find-onlyInGroup").replacements(args[3]);
}
if(maxPriceSet) {
plugin.message(player, "find-noneFoundMax", "buy", Utils.formatCurrency(maxPrice), onlyInGroup);
} else {
plugin.message(player, "find-noneFound", "buy", Utils.formatCurrency(balance), onlyInGroup);
}
}
}
// Find rental regions
else {
List<RentRegion> regions = plugin.getFileManager().getRents();
List<RentRegion> results = new ArrayList<>(regions.size());
for(RentRegion region : regions) {
if(!region.isRented()
&& ((region.getPrice() <= balance && !maxPriceSet) || (region.getPrice() <= maxPrice && maxPriceSet))
&& (group == null || group.isMember(region))
&& (region.getBooleanSetting("general.findCrossWorld") || player.getWorld().equals(region.getWorld()))) {
results.add(region);
}
}
if(!results.isEmpty()) {
// Draw a random one
RentRegion region = results.get(ThreadLocalRandom.current().nextInt(results.size()));
Message onlyInGroup = Message.empty();
if(group != null) {
onlyInGroup = Message.fromKey("find-onlyInGroup").replacements(args[3]);
}
// Teleport
if(maxPriceSet) {
plugin.message(player, "find-successMax", "rent", Utils.formatCurrency(maxPrice), onlyInGroup, region);
} else {
plugin.message(player, "find-success", "rent", Utils.formatCurrency(balance), onlyInGroup, region);
}
region.getTeleportFeature().teleportPlayer(player, region.getBooleanSetting("general.findTeleportToSign"), false);
} else {
Message onlyInGroup = Message.empty();
if(group != null) {
onlyInGroup = Message.fromKey("find-onlyInGroup").replacements(args[3]);
}
if(maxPriceSet) {
plugin.message(player, "find-noneFoundMax", "rent", Utils.formatCurrency(maxPrice), onlyInGroup);
} else {
plugin.message(player, "find-noneFound", "rent", Utils.formatCurrency(balance), onlyInGroup);
}
}
}
}
@Override
public List<String> getTabCompleteList(int toComplete, String[] start, CommandSender sender) {
ArrayList<String> result = new ArrayList<>();
if(toComplete == 2) {
result.add("buy");
result.add("rent");
}
return result;
}
}
@@ -1,115 +0,0 @@
package me.wiefferink.areashop.commands;
import me.wiefferink.areashop.interfaces.WorldEditSelection;
import me.wiefferink.areashop.regions.GeneralRegion;
import me.wiefferink.areashop.regions.RegionGroup;
import me.wiefferink.areashop.tools.Utils;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import java.util.ArrayList;
import java.util.List;
import java.util.TreeSet;
public class GroupdelCommand extends CommandAreaShop {
@Override
public String getCommandStart() {
return "areashop groupdel";
}
@Override
public String getHelp(CommandSender target) {
if(target.hasPermission("areashop.groupdel")) {
return "help-groupdel";
}
return null;
}
@Override
public void execute(CommandSender sender, String[] args) {
if(!sender.hasPermission("areashop.groupdel")) {
plugin.message(sender, "groupdel-noPermission");
return;
}
if(args.length < 2 || args[1] == null) {
plugin.message(sender, "groupdel-help");
return;
}
RegionGroup group = plugin.getFileManager().getGroup(args[1]);
if(group == null) {
plugin.message(sender, "groupdel-wrongGroup", args[1]);
return;
}
if(args.length == 2) {
if(!(sender instanceof Player)) {
plugin.message(sender, "cmd-weOnlyByPlayer");
return;
}
Player player = (Player)sender;
WorldEditSelection selection = plugin.getWorldEditHandler().getPlayerSelection(player);
if(selection == null) {
plugin.message(player, "cmd-noSelection");
return;
}
List<GeneralRegion> regions = Utils.getRegionsInSelection(selection);
if(regions.isEmpty()) {
plugin.message(player, "cmd-noRegionsFound");
return;
}
TreeSet<GeneralRegion> regionsSuccess = new TreeSet<>();
TreeSet<GeneralRegion> regionsFailed = new TreeSet<>();
for(GeneralRegion region : regions) {
if(group.removeMember(region)) {
regionsSuccess.add(region);
} else {
regionsFailed.add(region);
}
}
if(!regionsSuccess.isEmpty()) {
plugin.message(player, "groupdel-weSuccess", group.getName(), Utils.combinedMessage(regionsSuccess, "region"));
}
if(!regionsFailed.isEmpty()) {
plugin.message(player, "groupdel-weFailed", group.getName(), Utils.combinedMessage(regionsFailed, "region"));
}
// Update all regions, this does it in a task, updating them without lag
plugin.getFileManager().updateRegions(new ArrayList<>(regionsSuccess), player);
group.saveRequired();
} else {
GeneralRegion region = plugin.getFileManager().getRegion(args[2]);
if(region == null) {
plugin.message(sender, "cmd-notRegistered", args[2]);
return;
}
if(group.removeMember(region)) {
region.update();
plugin.message(sender, "groupdel-success", group.getName(), group.getMembers().size(), region);
} else {
plugin.message(sender, "groupdel-failed", group.getName(), region);
}
}
}
@Override
public List<String> getTabCompleteList(int toComplete, String[] start, CommandSender sender) {
List<String> result = new ArrayList<>();
if(toComplete == 2) {
result = plugin.getFileManager().getGroupNames();
} else if(toComplete == 3) {
result = plugin.getFileManager().getRegionNames();
}
return result;
}
}
@@ -1,24 +0,0 @@
package me.wiefferink.areashop.commands;
import org.bukkit.command.CommandSender;
public class HelpCommand extends CommandAreaShop {
@Override
public String getCommandStart() {
return "areashop help";
}
@Override
public String getHelp(CommandSender target) {
if(target.hasPermission("areashop.help")) {
return "help-help";
}
return null;
}
@Override
public void execute(CommandSender sender, String[] args) {
plugin.getCommandManager().showHelp(sender);
}
}
@@ -1,79 +0,0 @@
package me.wiefferink.areashop.commands;
import me.wiefferink.interactivemessenger.processing.Message;
import org.bukkit.command.CommandSender;
import java.util.ArrayList;
import java.util.List;
public class ImportCommand extends CommandAreaShop {
/* RegionGroup priority usage:
0: Settings from /config.yml
1: Settings from /worlds/<world>/config.yml
2: Settings from /worlds/<world>/parent-regions.yml (if their priority is set it is added to this value)
*/
@Override
public String getCommandStart() {
return "areashop import";
}
@Override
public String getHelp(CommandSender target) {
if(target.hasPermission("areashop.import")) {
return "help-import";
}
return null;
}
// TODO:
// - Landlord?
// - Friends
// - Region flags?
// - Settings from the 'permissions' section in RegionForSale/config.yml?
@Override
public void execute(CommandSender sender, String[] args) {
if(!sender.hasPermission("areashop.import")) {
plugin.message(sender, "import-noPermission");
return;
}
if(args.length < 2) {
plugin.message(sender, "import-help");
return;
}
if(!"RegionForSale".equalsIgnoreCase(args[1])) {
plugin.message(sender, "import-wrongSource");
return;
}
if(!confirm(sender, args, Message.fromKey("import-confirm"))) {
return;
}
new ImportJob(sender);
}
@Override
public List<String> getTabCompleteList(int toComplete, String[] start, CommandSender sender) {
List<String> result = new ArrayList<>();
if(toComplete == 2) {
result.add("RegionForSale");
}
return result;
}
}
@@ -1,479 +0,0 @@
package me.wiefferink.areashop.commands;
import com.google.common.base.Charsets;
import com.sk89q.worldguard.protection.managers.RegionManager;
import com.sk89q.worldguard.protection.regions.ProtectedRegion;
import me.wiefferink.areashop.AreaShop;
import me.wiefferink.areashop.events.ask.AddingRegionEvent;
import me.wiefferink.areashop.features.signs.RegionSign;
import me.wiefferink.areashop.features.signs.SignsFeature;
import me.wiefferink.areashop.regions.BuyRegion;
import me.wiefferink.areashop.regions.GeneralRegion;
import me.wiefferink.areashop.regions.RegionGroup;
import me.wiefferink.areashop.regions.RentRegion;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.OfflinePlayer;
import org.bukkit.World;
import org.bukkit.command.CommandSender;
import org.bukkit.command.ConsoleCommandSender;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.configuration.file.YamlConfiguration;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
public class ImportJob {
private final AreaShop plugin;
private final CommandSender sender;
/**
* Create and execute the import.
* @param sender CommandSender that should receive progress updates
*/
public ImportJob(CommandSender sender) {
this.sender = sender;
this.plugin = AreaShop.getInstance();
execute();
}
/**
* Execute the job.
*/
private void execute() {
// Check for RegionForSale data
File regionForSaleFolder = new File(plugin.getDataFolder().getParentFile().getAbsolutePath(), "RegionForSale");
if(!regionForSaleFolder.exists()) {
message("import-noPluginFolder", regionForSaleFolder.getName());
return;
}
File worldsFolder = new File(regionForSaleFolder.getAbsolutePath(), "worlds");
if(!worldsFolder.exists()) {
message("import-noWorldsFolder");
return;
}
File[] worldFolders = worldsFolder.listFiles();
if(worldFolders == null) {
message("import-noWorldsFolder");
return;
}
// Import data for each world
message("import-start");
// Group with settings for all imported regions
RegionGroup regionForSaleGroup = new RegionGroup(plugin, "RegionForSale");
plugin.getFileManager().addGroup(regionForSaleGroup);
// Import /RegionForSale/config.yml settings
File regionForSaleConfigFile = new File(regionForSaleFolder.getAbsolutePath(), "config.yml");
YamlConfiguration regionForSaleConfig = loadConfiguration(regionForSaleConfigFile);
if(regionForSaleConfig == null) {
messageNoPrefix("import-loadConfigFailed", regionForSaleConfigFile.getAbsolutePath());
regionForSaleConfig = new YamlConfiguration();
} else {
importRegionSettings(regionForSaleConfig, regionForSaleGroup.getSettings(), null, false);
regionForSaleGroup.setSetting("priority", 0);
}
// Import /RegionForSale/general.yml settings
File regionForSaleGeneralFile = new File(regionForSaleFolder.getAbsolutePath(), "config.yml");
YamlConfiguration regionForSaleGeneral = loadConfiguration(regionForSaleConfigFile);
if(regionForSaleGeneral == null) {
messageNoPrefix("import-loadConfigFailed", regionForSaleGeneralFile.getAbsolutePath());
} else {
// Collection interval of RegionForSale maps to rent duration
String duration = "1 day";
if(regionForSaleGeneral.isLong("interval.collect_money")) {
duration = minutesToString(regionForSaleGeneral.getLong("interval.collect_money"));
}
regionForSaleGroup.setSetting("rent.duration", duration);
// Global economy account has an effect close to landlord in AreaShop
if(regionForSaleGeneral.isString("global_econ_account")) {
regionForSaleGroup.setSetting("general.landlordName", regionForSaleGeneral.getString("global_econ_account"));
}
}
regionForSaleGroup.saveRequired();
////////// Handle defaults of RegionForSale
// Set autoExtend, to keep the same behavior as RegionForSale had
regionForSaleGroup.setSetting("rent.autoExtend", true);
// Import regions from each world
for(File worldFolder : worldFolders) {
// Skip files
if(!worldFolder.isDirectory() || worldFolder.isHidden()) {
continue;
}
messageNoPrefix("import-doWorld", worldFolder.getName());
// Get the Bukkit world
World world = Bukkit.getWorld(worldFolder.getName());
if(world == null) {
messageNoPrefix("import-noBukkitWorld");
continue;
}
// Get the WorldGuard RegionManager
RegionManager regionManager = plugin.getRegionManager(world);
if(regionManager == null) {
messageNoPrefix("import-noRegionManger");
continue;
}
// Load the /worlds/<world>/regions.yml file
File regionsFile = new File(worldFolder.getAbsolutePath(), "regions.yml");
YamlConfiguration regions = loadConfiguration(regionsFile);
if(regions == null) {
messageNoPrefix("import-loadRegionsFailed", regionsFile.getAbsolutePath());
continue;
}
// Load /worlds/<world>/config.yml file
File worldConfigFile = new File(worldFolder.getAbsolutePath(), "config.yml");
YamlConfiguration worldConfig = loadConfiguration(worldConfigFile);
if(worldConfig == null) {
messageNoPrefix("import-loadWorldConfigFailed", worldConfigFile.getAbsolutePath());
// Simply skip importing the settings, since this is not really fatal
worldConfig = new YamlConfiguration();
} else {
// RegionGroup with all world settings
RegionGroup worldGroup = new RegionGroup(plugin, "RegionForSale-" + worldFolder.getName());
importRegionSettings(worldConfig, worldGroup.getSettings(), null, false);
worldGroup.setSetting("priority", 1);
worldGroup.addWorld(worldFolder.getName());
plugin.getFileManager().addGroup(regionForSaleGroup);
worldGroup.saveRequired();
}
// Create groups to hold settings of /worlds/<world>/parent-regions.yml
File parentRegionsFile = new File(worldFolder.getAbsolutePath(), "parent-regions.yml");
YamlConfiguration parentRegions = loadConfiguration(parentRegionsFile);
if(parentRegions == null) {
messageNoPrefix("import-loadParentRegionsFailed", parentRegionsFile.getAbsolutePath());
// Non-fatal, so just continue
} else {
for(String parentRegionName : parentRegions.getKeys(false)) {
// Get WorldGuard region
ProtectedRegion worldGuardRegion = regionManager.getRegion(parentRegionName);
if(worldGuardRegion == null) {
messageNoPrefix("import-noWorldGuardRegionParent", parentRegionName);
continue;
}
// Get settings section
ConfigurationSection parentRegionSection = parentRegions.getConfigurationSection(parentRegionName);
if(parentRegionSection == null) {
messageNoPrefix("import-improperParentRegion", parentRegionName);
continue;
}
// Skip if it does not have any settings
if(parentRegionSection.getKeys(false).isEmpty()) {
continue;
}
// Import parent region settings into a RegionGroup
RegionGroup parentRegionGroup = new RegionGroup(plugin, "RegionForSale-" + worldFolder.getName() + "-" + parentRegionName);
importRegionSettings(parentRegionSection, parentRegionGroup.getSettings(), null, false);
parentRegionGroup.setSetting("priority", 2 + parentRegionSection.getLong("info.priority", 0));
parentRegionGroup.saveRequired();
// TODO add all regions that are contained in this parent region
// Utils.getWorldEditRegionsInSelection()
}
}
// Read and import regions
for(String regionKey : regions.getKeys(false)) {
GeneralRegion existingRegion = plugin.getFileManager().getRegion(regionKey);
if(existingRegion != null) {
if(world.getName().equalsIgnoreCase(existingRegion.getWorldName())) {
messageNoPrefix("import-alreadyAdded", regionKey);
} else {
messageNoPrefix("import-alreadyAddedOtherWorld", regionKey, existingRegion.getWorldName(), world.getName());
}
continue;
}
ConfigurationSection regionSection = regions.getConfigurationSection(regionKey);
if(regionSection == null) {
messageNoPrefix("import-invalidRegionSection", regionKey);
continue;
}
// Get WorldGuard region
ProtectedRegion worldGuardRegion = regionManager.getRegion(regionKey);
if(worldGuardRegion == null) {
messageNoPrefix("import-noWorldGuardRegion", regionKey);
continue;
}
String owner = regionSection.getString("info.owner", null);
boolean isBought = regionSection.getBoolean("info.is-bought");
// TODO: should also take into config settings of parent regions
boolean rentable = regionSection.getBoolean("economic-settings.rentable", worldConfig.getBoolean("economic-settings.rentable", regionForSaleConfig.getBoolean("economic-settings.rentable")));
boolean buyable = regionSection.getBoolean("economic-settings.buyable", worldConfig.getBoolean("economic-settings.buyable", regionForSaleConfig.getBoolean("economic-settings.buyable")));
// Can be bought and rented, import as buy
if(buyable && rentable) {
messageNoPrefix("import-buyAndRent", regionKey);
}
// Cannot be bought or rented, skip
if(!buyable && !rentable && owner == null) {
messageNoPrefix("import-noBuyAndNoRent", regionKey);
continue;
}
// Create region
GeneralRegion region;
if(rentable || (owner != null && !isBought)) {
region = new RentRegion(regionKey, world);
} else {
region = new BuyRegion(regionKey, world);
}
AddingRegionEvent event = plugin.getFileManager().addRegion(region);
if (event.isCancelled()) {
messageNoPrefix("general-cancelled", event.getReason());
continue;
}
// Import settings
importRegionSettings(regionSection, region.getConfig(), region, !buyable && !rentable);
region.getConfig().set("general.importedFrom", "RegionForSale");
// Get existing owners and members
List<UUID> existing = new ArrayList<>();
if(owner != null) {
@SuppressWarnings("deprecation")
OfflinePlayer offlinePlayer = Bukkit.getOfflinePlayer(owner);
if(offlinePlayer.hasPlayedBefore()) {
existing.add(offlinePlayer.getUniqueId());
}
}
for(UUID uuid : plugin.getWorldGuardHandler().getOwners(worldGuardRegion).asUniqueIdList()) {
if(!existing.contains(uuid)) {
existing.add(uuid);
}
}
for(UUID uuid : plugin.getWorldGuardHandler().getMembers(worldGuardRegion).asUniqueIdList()) {
if(!existing.contains(uuid)) {
existing.add(uuid);
}
}
// First owner (or if none, the first member) will be the renter/buyer
if(!existing.isEmpty()) {
region.setOwner(existing.remove(0));
}
// Add others as friends
for(UUID friend : existing) {
region.getFriendsFeature().addFriend(friend, null);
}
region.saveRequired();
messageNoPrefix("import-imported", regionKey);
}
}
// Update all regions
plugin.getFileManager().updateAllRegions(sender);
// Write all imported regions and settings to disk
plugin.getFileManager().saveRequiredFiles();
}
/**
* Load a YamlConfiguration from disk using UTF-8 encoding.
* @param from File to read the configuration from
* @return YamlConfiguration if the file exists and got read wihout problems, otherwise null
*/
private YamlConfiguration loadConfiguration(File from) {
try(
InputStreamReader reader = new InputStreamReader(new FileInputStream(from), Charsets.UTF_8)
) {
return YamlConfiguration.loadConfiguration(reader);
} catch(IOException e) {
return null;
}
}
/**
* Import region specific settings from a RegionForSale source to an AreaShop target ConfigurationSection.
* @param from RegionForSale config section that specifies region settings
* @param to AreaShop config section that specifies region settings
* @param region GeneralRegion to copy settings to, or null if doing generic settings
* @param permanent Region cannot be rented or bought, disables some features
*/
private void importRegionSettings(ConfigurationSection from, ConfigurationSection to, GeneralRegion region, boolean permanent) {
// Maximum rental time, TODO check if this is actually the same
if(from.isLong("permissions.max-rent-time")) {
to.set("rent.maxRentTime", minutesToString(from.getLong("permissions.max-rent-time")));
}
// Region rebuild
if(from.getBoolean("region-rebuilding.auto-rebuild")) {
to.set("general.enableRestore", true);
}
// Get price settings
String unit = from.getString("economic-settings.unit-type");
String rentPrice = from.getString("economic-settings.cost-per-unit.rent");
String buyPrice = from.getString("economic-settings.cost-per-unit.buy");
String sellPrice = from.getString("economic-settings.cost-per-unit.selling-price");
// TODO: There is no easy way to import this, setup eventCommandsProfile?
// String taxes = from.getString("economic-settings.cost-per-unit.taxes");
// Determine unit and add that to the price
String unitSuffix = "";
if("m3".equalsIgnoreCase(unit)) {
unitSuffix = "*%volume%";
} else { // m2 or nothing (in case not set, we should actually look in parent files to correctly set this...)
unitSuffix = "*(%volume%/%height%)"; // This is better than width*depth because of polygon regions
}
// Apply settings
if(rentPrice != null) {
to.set("rent.price", rentPrice + unitSuffix);
}
if(buyPrice != null) {
to.set("buy.price", buyPrice + unitSuffix);
if(sellPrice != null) {
try {
double buyPriceAmount = Double.parseDouble(buyPrice);
double sellPriceAmount = Double.parseDouble(sellPrice);
to.set("buy.moneyBack", sellPriceAmount / buyPriceAmount * 100);
} catch(NumberFormatException e) {
// There is not always a region here for the message, should probably indicate something though
message("import-moneyBackFailed", buyPrice, sellPrice);
}
}
}
// Apply permanent region settings
if(permanent) {
to.set("buy.resellDisabled", true);
to.set("buy.sellDisabled", true);
to.set("general.countForLimits", false);
}
// Set rented until
if(from.isLong("info.last-withdrawal")
&& region instanceof RentRegion) {
RentRegion rentRegion = (RentRegion)region;
long lastWithdrawal = from.getLong("info.last-withdrawal");
// Because the rental duration is already imported into the region and its parents this should be correct
rentRegion.setRentedUntil(lastWithdrawal + rentRegion.getDuration());
}
// Import signs (list of strings like "297, 71, -22")
if(from.isList("info.signs") && region != null) {
for(String signLocation : from.getStringList("info.signs")) {
String[] locationParts = signLocation.split(", ");
if(locationParts.length != 3) {
message("import-invalidSignLocation", region.getName(), signLocation);
continue;
}
// Parse the location
Location location;
try {
location = new Location(region.getWorld(), Double.parseDouble(locationParts[0]), Double.parseDouble(locationParts[1]), Double.parseDouble(locationParts[2]));
} catch(NumberFormatException e) {
message("import-invalidSignLocation", region.getName(), signLocation);
continue;
}
// Check if this location is already added to a region
RegionSign regionSign = SignsFeature.getSignByLocation(location);
if(regionSign != null) {
if(!regionSign.getRegion().equals(region)) {
message("import-signAlreadyAdded", region.getName(), signLocation, regionSign.getRegion().getName());
}
continue;
}
// SignType and Facing will be written when the sign is updated later
region.getSignsFeature().addSign(location, null, null, null);
}
}
}
private static class TimeUnit {
public final long minutes;
public final String identifier;
TimeUnit(long minutes, String identifier) {
this.minutes = minutes;
this.identifier = identifier;
}
}
private static final List<TimeUnit> timeUnitLookup = new ArrayList<TimeUnit>() {
{
add(new TimeUnit(60 * 24 * 30 * 12, "year"));
add(new TimeUnit(60 * 24 * 30, "month"));
add(new TimeUnit(60 * 24, "day"));
add(new TimeUnit(60, "hour"));
}
};
/**
* Convert minutes to a human-readable string.
* @param minutes Value to convert
* @return String that represents the same length of time in a readable format, like "1 day", "5 minutes", "3 months"
*/
private String minutesToString(long minutes) {
// If the specified number of minutes can map nicely to a higher unit, use that one
String resultUnit = "minute";
long resultValue = minutes;
for(TimeUnit unit : timeUnitLookup) {
long result = minutes / unit.minutes;
if(resultValue * unit.minutes == minutes) {
resultUnit = unit.identifier;
resultValue = result;
break;
}
}
return resultValue + " " + resultUnit + (resultValue == 1 ? "" : "s");
}
/**
* Send a message to a target without a prefix.
* @param key The key of the language string
* @param replacements The replacements to insert in the message
*/
public void messageNoPrefix(String key, Object... replacements) {
plugin.messageNoPrefix(sender, key, replacements);
if(!(sender instanceof ConsoleCommandSender)) {
plugin.messageNoPrefix(Bukkit.getConsoleSender(), key, replacements);
}
}
/**
* Send a message to a target, prefixed by the default chat prefix.
* @param key The key of the language string
* @param replacements The replacements to insert in the message
*/
public void message(String key, Object... replacements) {
plugin.message(sender, key, replacements);
if(!(sender instanceof ConsoleCommandSender)) {
plugin.message(Bukkit.getConsoleSender(), key, replacements);
}
}
}
@@ -1,478 +0,0 @@
package me.wiefferink.areashop.commands;
import me.wiefferink.areashop.regions.BuyRegion;
import me.wiefferink.areashop.regions.GeneralRegion;
import me.wiefferink.areashop.regions.RegionGroup;
import me.wiefferink.areashop.regions.RentRegion;
import me.wiefferink.areashop.tools.Utils;
import me.wiefferink.interactivemessenger.processing.Message;
import org.bukkit.Location;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import java.util.*;
// TODO fix '/as info' help message hitting replacement limit (improve depth tracking?)
// TODO add info about autoExtend
public class InfoCommand extends CommandAreaShop {
@Override
public String getCommandStart() {
return "areashop info";
}
@Override
public String getHelp(CommandSender target) {
if(target.hasPermission("areashop.info")) {
return "help-info";
}
return null;
}
/**
* Display a page of a list of regions.
* @param sender The CommandSender to send the messages to
* @param regions The regions to display
* @param filterGroup The group to filter the regions by
* @param keyHeader The header to print above the page
* @param pageInput The page number, if any
* @param baseCommand The command to execute for next/previous page (/areashop will be added)
*/
private void showSortedPagedList(CommandSender sender, List<? extends GeneralRegion> regions, RegionGroup filterGroup, String keyHeader, String pageInput, String baseCommand) {
int maximumItems = 20;
int itemsPerPage = maximumItems - 2;
int page = 1;
if(pageInput != null && Utils.isNumeric(pageInput)) {
try {
page = Integer.parseInt(pageInput);
} catch(NumberFormatException e) {
plugin.message(sender, "info-wrongPage", pageInput);
return;
}
}
if(filterGroup != null) {
regions.removeIf(generalRegion -> !filterGroup.isMember(generalRegion));
}
if(regions.isEmpty()) {
plugin.message(sender, "info-noRegions");
} else {
// First sort by type, then by name
regions.sort((one, two) -> {
int typeCompare = Integer.compare(getTypeOrder(two), getTypeOrder(one));
if(typeCompare != 0) {
return typeCompare;
} else {
return one.getName().compareTo(two.getName());
}
});
// Header
Message limitedToGroup = Message.empty();
if(filterGroup != null) {
limitedToGroup = Message.fromKey("info-limitedToGroup").replacements(filterGroup.getName());
}
plugin.message(sender, keyHeader, limitedToGroup);
// Page entries
int totalPages = (int)Math.ceil(regions.size() / (double)itemsPerPage); // Clip page to correct boundaries, not much need to tell the user
if(regions.size() == itemsPerPage + 1) { // 19 total items is mapped to 1 page of 19
itemsPerPage++;
totalPages = 1;
}
page = Math.max(1, Math.min(totalPages, page));
int linesPrinted = 1; // header
for(int i = (page - 1) * itemsPerPage; i < page * itemsPerPage && i < regions.size(); i++) {
String state;
GeneralRegion region = regions.get(i);
if(region instanceof RentRegion) {
if(region.isAvailable()) {
state = "Forrent";
} else {
state = "Rented";
}
} else if (region instanceof BuyRegion){
if(region.isAvailable()) {
state = "Forsale";
} else if(!((BuyRegion)region).isInResellingMode()) {
state = "Sold";
} else {
state = "Reselling";
}
} else {
state = region.getState().getValue();
}
plugin.messageNoPrefix(sender, "info-entry" + state, region);
linesPrinted++;
}
Message footer = Message.empty();
// Previous button
if(page > 1) {
footer.append(Message.fromKey("info-pagePrevious").replacements(baseCommand + " " + (page - 1)));
} else {
footer.append(Message.fromKey("info-pageNoPrevious"));
}
// Page status
if(totalPages > 1) {
StringBuilder pageString = new StringBuilder("" + page);
for(int i = pageString.length(); i < (totalPages + "").length(); i++) {
pageString.insert(0, "0");
}
footer.append(Message.fromKey("info-pageStatus").replacements(page, totalPages));
if(page < totalPages) {
footer.append(Message.fromKey("info-pageNext").replacements(baseCommand + " " + (page + 1)));
} else {
footer.append(Message.fromKey("info-pageNoNext"));
}
// Fill up space if the page is not full (aligns header nicely)
for(int i = linesPrinted; i < maximumItems - 1; i++) {
sender.sendMessage(" ");
}
footer.send(sender);
}
}
}
/**
* Get an integer to order by type, usable for Comparators.
* @param region The region to get the order for
* @return An integer for sorting by type
*/
private int getTypeOrder(GeneralRegion region) {
if(region.getType() == GeneralRegion.RegionType.RENT) {
if(region.isAvailable()) {
return 1;
} else {
return 2;
}
} else {
if(region.isAvailable()) {
return 3;
} else if(!((BuyRegion)region).isInResellingMode()) {
return 4;
} else {
return 5;
}
}
}
@Override
public void execute(CommandSender sender, String[] args) {
if(!sender.hasPermission("areashop.info")) {
plugin.message(sender, "info-noPermission");
return;
}
if(args.length > 1 && args[1] != null) {
// Get filter group (only used by some commands)
RegionGroup filterGroup = null;
Set<String> groupFilters = new HashSet<>(Arrays.asList("all", "rented", "forrent", "sold", "forsale", "reselling"));
if(groupFilters.contains(args[1].toLowerCase()) && args.length > 2) {
if(!Utils.isNumeric(args[2])) {
filterGroup = plugin.getFileManager().getGroup(args[2]);
if(filterGroup == null) {
plugin.message(sender, "info-noFiltergroup", args[2]);
return;
}
// Pass page number to args[2] if available
if(args.length > 3) {
args[2] = args[3];
}
}
}
// All regions
if(args[1].equalsIgnoreCase("all")) {
showSortedPagedList(sender, plugin.getFileManager().getRegions(), filterGroup, "info-allHeader", (args.length > 2 ? args[2] : null), "info all");
}
// Rented regions
else if(args[1].equalsIgnoreCase("rented")) {
List<RentRegion> regions = plugin.getFileManager().getRents();
regions.removeIf(RentRegion::isAvailable);
showSortedPagedList(sender, regions, filterGroup, "info-rentedHeader", (args.length > 2 ? args[2] : null), "info rented");
}
// Forrent regions
else if(args[1].equalsIgnoreCase("forrent")) {
List<RentRegion> regions = plugin.getFileManager().getRents();
regions.removeIf(RentRegion::isRented);
showSortedPagedList(sender, regions, filterGroup, "info-forrentHeader", (args.length > 2 ? args[2] : null), "info forrent");
}
// Sold regions
else if(args[1].equalsIgnoreCase("sold")) {
List<BuyRegion> regions = plugin.getFileManager().getBuys();
regions.removeIf(BuyRegion::isAvailable);
showSortedPagedList(sender, regions, filterGroup, "info-soldHeader", (args.length > 2 ? args[2] : null), "info sold");
}
// Forsale regions
else if(args[1].equalsIgnoreCase("forsale")) {
List<BuyRegion> regions = plugin.getFileManager().getBuys();
regions.removeIf(BuyRegion::isSold);
showSortedPagedList(sender, regions, filterGroup, "info-forsaleHeader", (args.length > 2 ? args[2] : null), "info forsale");
}
// Reselling regions
else if(args[1].equalsIgnoreCase("reselling")) {
List<BuyRegion> regions = plugin.getFileManager().getBuys();
regions.removeIf(region -> !region.isInResellingMode());
showSortedPagedList(sender, regions, filterGroup, "info-resellingHeader", (args.length > 2 ? args[2] : null), "info reselling");
}
// List of regions without a group
else if(args[1].equalsIgnoreCase("nogroup")) {
List<GeneralRegion> regions = plugin.getFileManager().getRegions();
for(RegionGroup group : plugin.getFileManager().getGroups()) {
regions.removeAll(group.getMemberRegions());
}
if(regions.isEmpty()) {
plugin.message(sender, "info-nogroupNone");
} else {
showSortedPagedList(sender, regions, filterGroup, "info-nogroupHeader", (args.length > 2 ? args[2] : null), "info nogroup");
}
}
// Region info
else if(args[1].equalsIgnoreCase("region")) {
RentRegion rent = null;
BuyRegion buy = null;
if(args.length > 2) {
rent = plugin.getFileManager().getRent(args[2]);
buy = plugin.getFileManager().getBuy(args[2]);
} else {
if(sender instanceof Player) {
// get the region by location
List<GeneralRegion> regions = Utils.getImportantRegions(((Player)sender).getLocation());
if(regions.isEmpty()) {
plugin.message(sender, "cmd-noRegionsAtLocation");
return;
} else if(regions.size() > 1) {
plugin.message(sender, "cmd-moreRegionsAtLocation");
return;
} else {
if(regions.get(0) instanceof RentRegion) {
rent = (RentRegion)regions.get(0);
} else if(regions.get(0) instanceof BuyRegion) {
buy = (BuyRegion)regions.get(0);
}
}
} else {
plugin.message(sender, "cmd-automaticRegionOnlyByPlayer");
return;
}
}
if(rent == null && buy == null) {
plugin.message(sender, "info-regionNotExisting", args[2]);
return;
}
if(rent != null) {
plugin.message(sender, "info-regionHeaderRent", rent);
if(rent.isRented()) {
plugin.messageNoPrefix(sender, "info-regionRented", rent);
plugin.messageNoPrefix(sender, "info-regionExtending", rent);
// Money back
if(UnrentCommand.canUse(sender, rent)) {
plugin.messageNoPrefix(sender, "info-regionMoneyBackRentClick", rent);
} else {
plugin.messageNoPrefix(sender, "info-regionMoneyBackRent", rent);
}
// Friends
if(!rent.getFriendsFeature().getFriendNames().isEmpty()) {
String messagePart = "info-friend";
if(DelfriendCommand.canUse(sender, rent)) {
messagePart = "info-friendRemove";
}
plugin.messageNoPrefix(sender, "info-regionFriends", rent, Utils.combinedMessage(rent.getFriendsFeature().getFriendNames(), messagePart));
}
} else {
plugin.messageNoPrefix(sender, "info-regionCanBeRented", rent);
}
if(rent.getLandlordName() != null) {
plugin.messageNoPrefix(sender, "info-regionLandlord", rent);
}
// Maximum extends
if(rent.getMaxExtends() != -1) {
if(rent.getMaxExtends() == 0) {
plugin.messageNoPrefix(sender, "info-regionNoExtending", rent);
} else if(rent.isRented()) {
plugin.messageNoPrefix(sender, "info-regionExtendsLeft", rent);
} else {
plugin.messageNoPrefix(sender, "info-regionMaxExtends", rent);
}
}
// If maxExtends is zero it does not make sense to show this message
if(rent.getMaxRentTime() != -1 && rent.getMaxExtends() != 0) {
plugin.messageNoPrefix(sender, "info-regionMaxRentTime", rent);
}
if(rent.getInactivityThresholdMillis() != -1) {
plugin.messageNoPrefix(sender, "info-regionInactiveUnrent", rent);
}
// Teleport
Message tp = Message.fromKey("info-prefix");
boolean foundSomething = false;
if(TeleportCommand.canUse(sender, rent)) {
foundSomething = true;
tp.append(Message.fromKey("info-regionTeleport").replacements(rent));
}
if(SetteleportCommand.canUse(sender, rent)) {
if(foundSomething) {
tp.append(", ");
}
foundSomething = true;
tp.append(Message.fromKey("info-setRegionTeleport").replacements(rent));
}
if(foundSomething) {
tp.append(".");
tp.send(sender);
}
// Signs
List<String> signLocations = new ArrayList<>();
for(Location location : rent.getSignsFeature().getSignLocations()) {
signLocations.add(Message.fromKey("info-regionSignLocation").replacements(location.getWorld().getName(), location.getBlockX(), location.getBlockY(), location.getBlockZ()).getPlain());
}
if(!signLocations.isEmpty()) {
plugin.messageNoPrefix(sender, "info-regionSigns", Utils.createCommaSeparatedList(signLocations));
}
// Groups
if(sender.hasPermission("areashop.groupinfo") && !rent.getGroupNames().isEmpty()) {
plugin.messageNoPrefix(sender, "info-regionGroups", Utils.createCommaSeparatedList(rent.getGroupNames()));
}
// Restoring
if(rent.isRestoreEnabled()) {
plugin.messageNoPrefix(sender, "info-regionRestoringRent", rent);
}
// Restrictions
if(!rent.isRented()) {
if(rent.restrictedToRegion()) {
plugin.messageNoPrefix(sender, "info-regionRestrictedRegionRent", rent);
} else if(rent.restrictedToWorld()) {
plugin.messageNoPrefix(sender, "info-regionRestrictedWorldRent", rent);
}
}
plugin.messageNoPrefix(sender, "info-regionFooterRent", rent);
} else if(buy != null) {
plugin.message(sender, "info-regionHeaderBuy", buy);
if(buy.isSold()) {
if(buy.isInResellingMode()) {
plugin.messageNoPrefix(sender, "info-regionReselling", buy);
plugin.messageNoPrefix(sender, "info-regionReselPrice", buy);
} else {
plugin.messageNoPrefix(sender, "info-regionBought", buy);
}
// Money back
if(!buy.getBooleanSetting("buy.sellDisabled")) {
if (SellCommand.canUse(sender, buy)) {
plugin.messageNoPrefix(sender, "info-regionMoneyBackBuyClick", buy);
} else {
plugin.messageNoPrefix(sender, "info-regionMoneyBackBuy", buy);
}
}
// Friends
if(!buy.getFriendsFeature().getFriendNames().isEmpty()) {
String messagePart = "info-friend";
if(DelfriendCommand.canUse(sender, buy)) {
messagePart = "info-friendRemove";
}
plugin.messageNoPrefix(sender, "info-regionFriends", buy, Utils.combinedMessage(buy.getFriendsFeature().getFriendNames(), messagePart));
}
} else {
plugin.messageNoPrefix(sender, "info-regionCanBeBought", buy);
}
if(buy.getLandlord() != null) {
plugin.messageNoPrefix(sender, "info-regionLandlord", buy);
}
if(buy.getInactivityThresholdMillis() != -1) {
plugin.messageNoPrefix(sender, "info-regionInactiveSell", buy);
}
// Teleport
Message tp = Message.fromKey("info-prefix");
boolean foundSomething = false;
if(TeleportCommand.canUse(sender, buy)) {
foundSomething = true;
tp.append(Message.fromKey("info-regionTeleport").replacements(buy));
}
if(SetteleportCommand.canUse(sender, buy)) {
if(foundSomething) {
tp.append(", ");
}
foundSomething = true;
tp.append(Message.fromKey("info-setRegionTeleport").replacements(buy));
}
if(foundSomething) {
tp.append(".");
tp.send(sender);
}
// Signs
List<String> signLocations = new ArrayList<>();
for(Location location : buy.getSignsFeature().getSignLocations()) {
signLocations.add(Message.fromKey("info-regionSignLocation").replacements(location.getWorld().getName(), location.getBlockX(), location.getBlockY(), location.getBlockZ()).getPlain());
}
if(!signLocations.isEmpty()) {
plugin.messageNoPrefix(sender, "info-regionSigns", Utils.createCommaSeparatedList(signLocations));
}
// Groups
if(sender.hasPermission("areashop.groupinfo") && !buy.getGroupNames().isEmpty()) {
plugin.messageNoPrefix(sender, "info-regionGroups", Utils.createCommaSeparatedList(buy.getGroupNames()));
}
// Restoring
if(buy.isRestoreEnabled()) {
plugin.messageNoPrefix(sender, "info-regionRestoringBuy", buy);
}
// Restrictions
if(!buy.isSold()) {
if(buy.restrictedToRegion()) {
plugin.messageNoPrefix(sender, "info-regionRestrictedRegionBuy", buy);
} else if(buy.restrictedToWorld()) {
plugin.messageNoPrefix(sender, "info-regionRestrictedWorldBuy", buy);
}
}
plugin.messageNoPrefix(sender, "info-regionFooterBuy", buy);
}
} else {
plugin.message(sender, "info-help");
}
} else {
plugin.message(sender, "info-help");
}
}
@Override
public List<String> getTabCompleteList(int toComplete, String[] start, CommandSender sender) {
List<String> result = new ArrayList<>();
if(toComplete == 2) {
result.addAll(Arrays.asList("all", "rented", "forrent", "sold", "forsale", "player", "region", "nogroup", "reselling"));
} else if(toComplete == 3) {
if(start[2].equalsIgnoreCase("player")) {
for(Player player : Utils.getOnlinePlayers()) {
result.add(player.getName());
}
} else if(start[2].equalsIgnoreCase("region")) {
result.addAll(plugin.getFileManager().getBuyNames());
result.addAll(plugin.getFileManager().getRentNames());
}
}
return result;
}
}
@@ -1,85 +0,0 @@
package me.wiefferink.areashop.commands;
import me.wiefferink.interactivemessenger.processing.Message;
import org.bukkit.command.CommandSender;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.entity.Player;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.StringJoiner;
public class LinksignsCommand extends CommandAreaShop {
@Override
public String getCommandStart() {
return "areashop linksigns";
}
@Override
public String getHelp(CommandSender target) {
if(target.hasPermission("areashop.linksigns")) {
return "help-linksigns";
}
return null;
}
@Override
public void execute(CommandSender sender, String[] args) {
if(!sender.hasPermission("areashop.linksigns")) {
plugin.message(sender, "linksigns-noPermission");
return;
}
if(!(sender instanceof Player)) {
plugin.message(sender, "cmd-onlyByPlayer");
return;
}
Player player = (Player)sender;
if(plugin.getSignlinkerManager().isInSignLinkMode(player)) {
plugin.getSignlinkerManager().exitSignLinkMode(player);
} else {
// Get the profile
String profile = null;
if(args.length > 1) {
profile = args[1];
ConfigurationSection signProfilesSection = plugin.getConfig().getConfigurationSection("signProfiles");
if(signProfilesSection != null) {
Set<String> profiles = signProfilesSection.getKeys(false);
if(!profiles.contains(profile)) {
StringJoiner joiner = new StringJoiner(", ");
for(String p : profiles) {
Message.fromKey("addsign-profile").replacements(p).get().forEach(joiner::add);
}
plugin.message(sender, "addsign-wrongProfile", joiner.toString());
return;
}
}
}
plugin.getSignlinkerManager().enterSignLinkMode(player, profile);
}
}
@Override
public List<String> getTabCompleteList(int toComplete, String[] start, CommandSender sender) {
List<String> result = new ArrayList<>();
if(toComplete == 2) {
result.addAll(plugin.getFileManager().getRegionNames());
} else if(toComplete == 3) {
result.addAll(plugin.getConfig().getStringList("signProfiles"));
}
return result;
}
}
@@ -1,143 +0,0 @@
package me.wiefferink.areashop.commands;
import me.wiefferink.areashop.regions.BuyRegion;
import me.wiefferink.areashop.regions.GeneralRegion;
import me.wiefferink.areashop.regions.RentRegion;
import me.wiefferink.areashop.tools.Utils;
import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public class MeCommand extends CommandAreaShop {
@Override
public String getCommandStart() {
return "areashop me";
}
@Override
public String getHelp(CommandSender target) {
if(target.hasPermission("areashop.me")) {
return "help-me";
}
return null;
}
@Override
public void execute(CommandSender sender, String[] args) {
if(!sender.hasPermission("areashop.me")) {
plugin.message(sender, "me-noPermission");
return;
}
OfflinePlayer player = null;
if(!(sender instanceof Player)) {
if(args.length <= 1) {
plugin.message(sender, "me-notAPlayer");
return;
}
} else {
player = (OfflinePlayer)sender;
}
if(args.length > 1) {
player = Bukkit.getOfflinePlayer(args[1]);
if(player == null) {
plugin.message(sender, "me-noPlayer", args[1]);
return;
}
}
if(player == null) {
return;
}
// Get the regions owned by the player
Set<RentRegion> rentRegions = new HashSet<>();
for(RentRegion region : plugin.getFileManager().getRents()) {
if(region.isOwner(player)) {
rentRegions.add(region);
}
}
Set<BuyRegion> buyRegions = new HashSet<>();
for(BuyRegion region : plugin.getFileManager().getBuys()) {
if(region.isOwner(player)) {
buyRegions.add(region);
}
}
// Get the regions the player is added as friend
Set<GeneralRegion> friendRegions = new HashSet<>();
for(GeneralRegion region : plugin.getFileManager().getRegions()) {
if(region.getFriendsFeature().getFriends().contains(player.getUniqueId())) {
friendRegions.add(region);
}
}
// Send messages
boolean foundSome = !rentRegions.isEmpty() || !buyRegions.isEmpty() || !friendRegions.isEmpty();
if(foundSome) {
plugin.message(sender, "me-header", player.getName());
}
if(!rentRegions.isEmpty()) {
for(RentRegion region : rentRegions) {
plugin.messageNoPrefix(sender, "me-rentLine", region);
}
}
if(!buyRegions.isEmpty()) {
for(BuyRegion region : buyRegions) {
plugin.messageNoPrefix(sender, "me-buyLine", region);
}
}
if(!friendRegions.isEmpty()) {
for(GeneralRegion region : friendRegions) {
plugin.messageNoPrefix(sender, "me-friendLine", region);
}
}
if(!foundSome) {
plugin.message(sender, "me-nothing", player.getName());
} else {
plugin.messageNoPrefix(sender, "me-clickHint");
}
}
@Override
public List<String> getTabCompleteList(int toComplete, String[] start, CommandSender sender) {
ArrayList<String> result = new ArrayList<>();
if(toComplete == 2) {
for(Player player : Utils.getOnlinePlayers()) {
result.add(player.getName());
}
}
return result;
}
}
@@ -1,72 +0,0 @@
package me.wiefferink.areashop.commands;
import me.wiefferink.areashop.tools.Utils;
import me.wiefferink.interactivemessenger.processing.Message;
import org.apache.commons.lang.StringUtils;
import org.bukkit.Bukkit;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import java.util.ArrayList;
import java.util.List;
public class MessageCommand extends CommandAreaShop {
@Override
public String getCommandStart() {
return "areashop message";
}
@Override
public String getHelp(CommandSender target) {
// Internal command, no need to show in the help list
return null;
}
@Override
public void execute(final CommandSender sender, final String[] args) {
if(!sender.hasPermission("areashop.message")) {
plugin.message(sender, "message-noPermission");
return;
}
if(args.length < 3) {
plugin.message(sender, "message-help");
return;
}
Player player = Bukkit.getPlayer(args[1]);
if(player == null) {
plugin.message(sender, "message-notOnline", args[1]);
return;
}
String[] messageArgs = new String[args.length - 2];
System.arraycopy(args, 2, messageArgs, 0, args.length - 2);
String message = StringUtils.join(messageArgs, " ");
Message.fromString(message).send(player);
}
@Override
public List<String> getTabCompleteList(int toComplete, String[] start, CommandSender sender) {
List<String> result = new ArrayList<>();
if(toComplete == 2) {
for(Player player : Utils.getOnlinePlayers()) {
result.add(player.getName());
}
}
return result;
}
}
@@ -1,7 +0,0 @@
# Commands
This module contains all AreaShop commands.
* `CommandAreaShop` is extended by all other classes, and implements some general functionality and defines which methods should be implemented.
* Other classes implement specific sub-commands, supply their help messages and tab completion.
* `CommandManager` class in the `managers` package handles incoming commands and dispatches them to the classes in this package.
@@ -1,29 +0,0 @@
package me.wiefferink.areashop.commands;
import org.bukkit.command.CommandSender;
public class ReloadCommand extends CommandAreaShop {
@Override
public String getCommandStart() {
return "areashop reload";
}
@Override
public String getHelp(CommandSender target) {
if(target.hasPermission("areashop.reload")) {
return "help-reload";
}
return null;
}
@Override
public void execute(CommandSender sender, String[] args) {
if(sender.hasPermission("areashop.reload")) {
// Reload the configuration files and update all region flags/signs
plugin.reload(sender);
} else {
plugin.message(sender, "reload-noPermission");
}
}
}
@@ -1,69 +0,0 @@
package me.wiefferink.areashop.commands;
import me.wiefferink.areashop.regions.RentRegion;
import me.wiefferink.areashop.tools.Utils;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import java.util.ArrayList;
import java.util.List;
public class RentCommand extends CommandAreaShop {
@Override
public String getCommandStart() {
return "areashop rent";
}
@Override
public String getHelp(CommandSender target) {
if(target.hasPermission("areashop.rent")) {
return "help-rent";
}
return null;
}
@Override
public void execute(CommandSender sender, String[] args) {
if(!sender.hasPermission("areashop.rent")) {
plugin.message(sender, "rent-noPermission");
return;
}
if(!(sender instanceof Player)) {
plugin.message(sender, "cmd-onlyByPlayer");
return;
}
Player player = (Player)sender;
if(args.length > 1 && args[1] != null) {
RentRegion rent = plugin.getFileManager().getRent(args[1]);
if(rent == null) {
plugin.message(sender, "rent-notRentable", args[1]);
} else {
rent.rent(player);
}
} else {
// get the region by location
List<RentRegion> regions = Utils.getImportantRentRegions(((Player)sender).getLocation());
if(regions.isEmpty()) {
plugin.message(sender, "cmd-noRegionsAtLocation");
} else if(regions.size() > 1) {
plugin.message(sender, "cmd-moreRegionsAtLocation");
} else {
regions.get(0).rent(player);
}
}
}
@Override
public List<String> getTabCompleteList(int toComplete, String[] start, CommandSender sender) {
ArrayList<String> result = new ArrayList<>();
if(toComplete == 2) {
for(RentRegion region : plugin.getFileManager().getRents()) {
if(!region.isRented()) {
result.add(region.getName());
}
}
}
return result;
}
}
@@ -1,134 +0,0 @@
package me.wiefferink.areashop.commands;
import me.wiefferink.areashop.regions.BuyRegion;
import me.wiefferink.areashop.tools.Utils;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import java.util.ArrayList;
import java.util.List;
public class ResellCommand extends CommandAreaShop {
@Override
public String getCommandStart() {
return "areashop resell";
}
@Override
public String getHelp(CommandSender target) {
if(target.hasPermission("areashop.resellall") || target.hasPermission("areashop.resell")) {
return "help-resell";
}
return null;
}
@Override
public void execute(CommandSender sender, String[] args) {
if(!sender.hasPermission("areashop.resell") && !sender.hasPermission("areashop.resellall")) {
plugin.message(sender, "resell-noPermissionOther");
return;
}
if(args.length <= 1) {
plugin.message(sender, "resell-help");
return;
}
double price;
try {
price = Double.parseDouble(args[1]);
} catch(NumberFormatException e) {
plugin.message(sender, "resell-wrongPrice", args[1]);
return;
}
if(price < 0) {
plugin.message(sender, "resell-wrongPrice", args[1]);
return;
}
BuyRegion buy;
if(args.length <= 2) {
if(sender instanceof Player) {
// get the region by location
List<BuyRegion> regions = Utils.getImportantBuyRegions(((Player)sender).getLocation());
if(regions.isEmpty()) {
plugin.message(sender, "cmd-noRegionsAtLocation");
return;
} else if(regions.size() > 1) {
plugin.message(sender, "cmd-moreRegionsAtLocation");
return;
} else {
buy = regions.get(0);
}
} else {
plugin.message(sender, "cmd-automaticRegionOnlyByPlayer");
return;
}
} else {
buy = plugin.getFileManager().getBuy(args[2]);
if(buy == null) {
plugin.message(sender, "resell-notRegistered", args[2]);
return;
}
}
if(buy == null) {
plugin.message(sender, "cmd-noRegionsAtLocation");
return;
}
if(!buy.isSold()) {
plugin.message(sender, "resell-notBought", buy);
return;
}
if(sender.hasPermission("areashop.resellall")) {
buy.enableReselling(price);
buy.update();
plugin.message(sender, "resell-success", buy);
} else if(sender.hasPermission("areashop.resell") && sender instanceof Player) {
if(!buy.isTransactionHolder((Player)sender)) {
plugin.message(sender, "resell-noPermissionOther", buy);
return;
}
if(buy.getBooleanSetting("buy.resellDisabled")) {
plugin.message(sender, "resell-disabled", buy);
return;
}
buy.enableReselling(price);
buy.update();
plugin.message(sender, "resell-success", buy);
} else {
plugin.message(sender, "resell-noPermission", buy);
}
}
@Override
public List<String> getTabCompleteList(int toComplete, String[] start, CommandSender sender) {
ArrayList<String> result = new ArrayList<>();
if(toComplete == 3) {
for(BuyRegion region : plugin.getFileManager().getBuys()) {
if(region.isSold() && !region.isInResellingMode()) {
result.add(region.getName());
}
}
}
return result;
}
}
@@ -1,112 +0,0 @@
package me.wiefferink.areashop.commands;
import me.wiefferink.areashop.regions.BuyRegion;
import me.wiefferink.areashop.regions.GeneralRegion;
import me.wiefferink.areashop.regions.TransactionalRegion;
import me.wiefferink.areashop.tools.Utils;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import java.util.ArrayList;
import java.util.List;
public class SellCommand extends CommandAreaShop {
/**
* Check if a person can sell the region.
*
* @param person The person to check
* @param region The region to check for
* @return true if the person can sell it, otherwise false
*/
public static boolean canUse(CommandSender person, GeneralRegion region) {
if (person.hasPermission("areashop.sell")) {
return true;
}
if (person instanceof Player && region instanceof TransactionalRegion) {
Player player = (Player) person;
return ((TransactionalRegion) region).isTransactionHolder(player) && person.hasPermission("areashop.sellown");
}
return false;
}
@Override
public String getCommandStart() {
return "areashop sell";
}
@Override
public String getHelp(CommandSender target) {
if (target.hasPermission("areashop.sell") || target.hasPermission("areashop.sellown")) {
return "help-sell";
}
return null;
}
@Override
public void execute(CommandSender sender, String[] args) {
if (!sender.hasPermission("areashop.sell") && !sender.hasPermission("areashop.sellown")) {
plugin.message(sender, "sell-noPermission");
return;
}
BuyRegion buy;
if (args.length <= 1) {
if (sender instanceof Player) {
// get the region by location
List<BuyRegion> regions = Utils.getImportantBuyRegions(((Player) sender).getLocation());
if (regions.isEmpty()) {
plugin.message(sender, "cmd-noRegionsAtLocation");
return;
} else if (regions.size() > 1) {
plugin.message(sender, "cmd-moreRegionsAtLocation");
return;
} else {
buy = regions.get(0);
}
} else {
plugin.message(sender, "cmd-automaticRegionOnlyByPlayer");
return;
}
} else {
buy = plugin.getFileManager().getBuy(args[1]);
}
if (buy == null) {
plugin.message(sender, "sell-notRegistered");
return;
}
if (!buy.isSold()) {
plugin.message(sender, "sell-notBought", buy);
return;
}
buy.sell(true, sender);
}
@Override
public List<String> getTabCompleteList(int toComplete, String[] start, CommandSender sender) {
ArrayList<String> result = new ArrayList<>();
if (toComplete == 2) {
for (BuyRegion region : plugin.getFileManager().getBuys()) {
if (region.isSold()) {
result.add(region.getName());
}
}
}
return result;
}
}
@@ -1,105 +0,0 @@
package me.wiefferink.areashop.commands;
import me.wiefferink.areashop.regions.RentRegion;
import me.wiefferink.areashop.tools.Utils;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import java.util.ArrayList;
import java.util.List;
public class SetdurationCommand extends CommandAreaShop {
@Override
public String getCommandStart() {
return "areashop setduration";
}
@Override
public String getHelp(CommandSender target) {
if(target.hasPermission("areashop.setduration")) {
return "help-setduration";
}
return null;
}
@Override
public void execute(CommandSender sender, String[] args) {
if(!sender.hasPermission("areashop.setduration") && (!sender.hasPermission("areashop.setduration.landlord") && sender instanceof Player)) {
plugin.message(sender, "setduration-noPermission");
return;
}
if(args.length < 3 || args[1] == null || args[2] == null) {
plugin.message(sender, "setduration-help");
return;
}
int regionArgument = 3;
if(args.length >= 2 && ("default".equalsIgnoreCase(args[1]) || "reset".equalsIgnoreCase(args[1]))) {
regionArgument = 2;
}
RentRegion rent;
if(args.length <= regionArgument) {
if(sender instanceof Player) {
// get the region by location
List<RentRegion> regions = Utils.getImportantRentRegions(((Player)sender).getLocation());
if(regions.isEmpty()) {
plugin.message(sender, "cmd-noRegionsAtLocation");
return;
} else if(regions.size() > 1) {
plugin.message(sender, "cmd-moreRegionsAtLocation");
return;
} else {
rent = regions.get(0);
}
} else {
plugin.message(sender, "cmd-automaticRegionOnlyByPlayer");
return;
}
} else {
rent = plugin.getFileManager().getRent(args[regionArgument]);
}
if(rent == null) {
plugin.message(sender, "setduration-notRegistered", args[regionArgument]);
return;
}
if(!sender.hasPermission("areashop.setduration") && !(sender instanceof Player && rent.isLandlord(((Player)sender).getUniqueId()))) {
plugin.message(sender, "setduration-noLandlord", rent);
return;
}
if("default".equalsIgnoreCase(args[1]) || "reset".equalsIgnoreCase(args[1])) {
rent.setDuration(null);
rent.update();
plugin.message(sender, "setduration-successRemoved", rent);
return;
}
try {
Integer.parseInt(args[1]);
} catch(NumberFormatException e) {
plugin.message(sender, "setduration-wrongAmount", args[1], rent);
return;
}
if(!Utils.checkTimeFormat(args[1] + " " + args[2])) {
plugin.message(sender, "setduration-wrongFormat", args[1] + " " + args[2], rent);
return;
}
rent.setDuration(args[1] + " " + args[2]);
rent.update();
plugin.message(sender, "setduration-success", rent);
}
@Override
public List<String> getTabCompleteList(int toComplete, String[] start, CommandSender sender) {
List<String> result = new ArrayList<>();
if(toComplete == 3) {
result.addAll(plugin.getConfig().getStringList("minutes"));
result.addAll(plugin.getConfig().getStringList("hours"));
result.addAll(plugin.getConfig().getStringList("days"));
result.addAll(plugin.getConfig().getStringList("months"));
result.addAll(plugin.getConfig().getStringList("years"));
} else if(toComplete == 4) {
result = plugin.getFileManager().getRentNames();
}
return result;
}
}
@@ -1,87 +0,0 @@
package me.wiefferink.areashop.commands;
import me.wiefferink.areashop.regions.GeneralRegion;
import me.wiefferink.areashop.tools.Utils;
import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import java.util.ArrayList;
import java.util.List;
public class SetlandlordCommand extends CommandAreaShop {
@Override
public String getCommandStart() {
return "areashop setlandlord";
}
@Override
public String getHelp(CommandSender target) {
if(target.hasPermission("areashop.setlandlord")) {
return "help-setlandlord";
}
return null;
}
@Override
public void execute(CommandSender sender, String[] args) {
if(!sender.hasPermission("areashop.setlandlord")) {
plugin.message(sender, "setlandlord-noPermission");
return;
}
if(args.length < 2) {
plugin.message(sender, "setlandlord-help");
return;
}
@SuppressWarnings("deprecation")
OfflinePlayer player = Bukkit.getOfflinePlayer(args[1]);
GeneralRegion region;
if(args.length < 3) {
if(sender instanceof Player) {
// get the region by location
List<GeneralRegion> regions = Utils.getImportantRegions(((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 = plugin.getFileManager().getRegion(args[2]);
}
if(region == null) {
plugin.message(sender, "cmd-notRegistered", args[2]);
return;
}
String playerName = player.getName();
if(playerName == null || playerName.isEmpty()) {
playerName = args[1];
}
region.setLandlord(player.getUniqueId(), playerName);
region.update();
plugin.message(sender, "setlandlord-success", playerName, region);
}
@Override
public List<String> getTabCompleteList(int toComplete, String[] start, CommandSender sender) {
ArrayList<String> result = new ArrayList<>();
if(toComplete == 2) {
for(Player player : Utils.getOnlinePlayers()) {
result.add(player.getName());
}
} else if(toComplete == 3) {
result.addAll(plugin.getFileManager().getRegionNames());
}
return result;
}
}
@@ -1,136 +0,0 @@
package me.wiefferink.areashop.commands;
import me.wiefferink.areashop.regions.BuyRegion;
import me.wiefferink.areashop.regions.GeneralRegion;
import me.wiefferink.areashop.regions.RentRegion;
import me.wiefferink.areashop.regions.TransactionalRegion;
import me.wiefferink.areashop.tools.Utils;
import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import java.util.UUID;
public class SetownerCommand extends CommandAreaShop {
@Override
public String getCommandStart() {
return "areashop setowner";
}
@Override
public String getHelp(CommandSender target) {
if(target.hasPermission("areashop.setownerrent") || target.hasPermission("areashop.setownerbuy")) {
return "help-setowner";
}
return null;
}
@Override
public void execute(CommandSender sender, String[] args) {
if(!sender.hasPermission("areashop.setownerrent") && !sender.hasPermission("areashop.setownerbuy")) {
plugin.message(sender, "setowner-noPermission");
return;
}
GeneralRegion region;
if(args.length < 2) {
plugin.message(sender, "setowner-help");
return;
}
if(args.length == 2) {
if(sender instanceof Player) {
// get the region by location
List<GeneralRegion> regions = Utils.getImportantRegions(((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 = plugin.getFileManager().getRegion(args[2]);
}
if(region == null) {
plugin.message(sender, "setowner-notRegistered");
return;
}
if(region instanceof RentRegion && !sender.hasPermission("areashop.setownerrent")) {
plugin.message(sender, "setowner-noPermissionRent", region);
return;
}
if(region instanceof BuyRegion && !sender.hasPermission("areashop.setownerbuy")) {
plugin.message(sender, "setowner-noPermissionBuy", region);
return;
}
UUID uuid = null;
@SuppressWarnings("deprecation")
OfflinePlayer player = Bukkit.getOfflinePlayer(args[1]);
if(player.hasPlayedBefore()) {
uuid = player.getUniqueId();
}
if(uuid == null) {
plugin.message(sender, "setowner-noPlayer", args[1], region);
return;
}
if(region instanceof RentRegion) {
RentRegion rent = (RentRegion)region;
if(rent.isTransactionHolder(uuid)) {
// extend
rent.setRentedUntil(rent.getRentedUntil() + rent.getDuration());
plugin.message(sender, "setowner-succesRentExtend", region);
} else {
// change
if(!rent.isRented()) {
rent.setRentedUntil(System.currentTimeMillis() + rent.getDuration());
}
plugin.message(sender, "setowner-succesRent", region);
}
rent.setTransactionHolder(uuid);
}
if(region instanceof BuyRegion) {
BuyRegion buy = (BuyRegion)region;
buy.setTransactionHolder(uuid);
plugin.message(sender, "setowner-succesBuy", region);
}
if (region instanceof TransactionalRegion) {
region.getFriendsFeature().deleteFriend(((TransactionalRegion) region).getTransactionHolder(), null);
}
region.update();
region.saveRequired();
}
@Override
public List<String> getTabCompleteList(int toComplete, String[] start, CommandSender sender) {
ArrayList<String> result = new ArrayList<>();
if(toComplete == 2) {
for(Player player : Utils.getOnlinePlayers()) {
result.add(player.getName());
}
} else if(toComplete == 3) {
result.addAll(plugin.getFileManager().getRegionNames());
}
return result;
}
}
@@ -1,103 +0,0 @@
package me.wiefferink.areashop.commands;
import me.wiefferink.areashop.regions.BuyRegion;
import me.wiefferink.areashop.regions.GeneralRegion;
import me.wiefferink.areashop.regions.RentRegion;
import me.wiefferink.areashop.tools.Utils;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import java.util.ArrayList;
import java.util.List;
public class SetpriceCommand extends CommandAreaShop {
@Override
public String getCommandStart() {
return "areashop setprice";
}
@Override
public String getHelp(CommandSender target) {
if(target.hasPermission("areashop.setprice")) {
return "help-setprice";
}
return null;
}
@Override
public void execute(CommandSender sender, String[] args) {
if(!sender.hasPermission("areashop.setprice") && (!sender.hasPermission("areashop.setprice.landlord") && sender instanceof Player)) {
plugin.message(sender, "setprice-noPermission");
return;
}
if(args.length < 2 || args[1] == null) {
plugin.message(sender, "setprice-help");
return;
}
GeneralRegion region;
if(args.length < 3) {
if(sender instanceof Player) {
// get the region by location
List<GeneralRegion> regions = Utils.getImportantRegions(((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 = plugin.getFileManager().getRegion(args[2]);
}
if(region == null) {
plugin.message(sender, "setprice-notRegistered", args[2]);
return;
}
if(!sender.hasPermission("areashop.setprice") && !(sender instanceof Player && region.isLandlord(((Player)sender).getUniqueId()))) {
plugin.message(sender, "setprice-noLandlord", region);
return;
}
if("default".equalsIgnoreCase(args[1]) || "reset".equalsIgnoreCase(args[1])) {
if(region instanceof RentRegion) {
((RentRegion)region).setPrice(0);
} else if(region instanceof BuyRegion) {
((BuyRegion)region).setPrice(0);
}
region.update();
plugin.message(sender, "setprice-successRemoved", region);
return;
}
double price;
try {
price = Double.parseDouble(args[1]);
} catch(NumberFormatException e) {
plugin.message(sender, "setprice-wrongPrice", args[1], region);
return;
}
if(region instanceof RentRegion) {
((RentRegion)region).setPrice(price);
plugin.message(sender, "setprice-successRent", region);
} else if(region instanceof BuyRegion) {
((BuyRegion)region).setPrice(price);
plugin.message(sender, "setprice-successBuy", region);
}
region.update();
}
@Override
public List<String> getTabCompleteList(int toComplete, String[] start, CommandSender sender) {
List<String> result = new ArrayList<>();
if(toComplete == 3) {
result = plugin.getFileManager().getRegionNames();
}
return result;
}
}
@@ -1,118 +0,0 @@
package me.wiefferink.areashop.commands;
import com.sk89q.worldguard.protection.regions.ProtectedRegion;
import me.wiefferink.areashop.regions.BuyRegion;
import me.wiefferink.areashop.regions.GeneralRegion;
import me.wiefferink.areashop.regions.RentRegion;
import me.wiefferink.areashop.tools.Utils;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import java.util.ArrayList;
import java.util.List;
public class SetteleportCommand extends CommandAreaShop {
@Override
public String getCommandStart() {
return "areashop settp";
}
@Override
public String getHelp(CommandSender target) {
if(target.hasPermission("areashop.setteleportall") || target.hasPermission("areashop.setteleport")) {
return "help-setteleport";
}
return null;
}
/**
* Check if a person can set the teleport location of the region.
* @param person The person to check
* @param region The region to check for
* @return true if the person can set the teleport location, otherwise false
*/
public static boolean canUse(CommandSender person, GeneralRegion region) {
if(!(person instanceof Player)) {
return false;
}
Player player = (Player)person;
return player.hasPermission("areashop.setteleportall")
|| region.isOwner(player) && player.hasPermission("areashop.setteleport");
}
@Override
public void execute(CommandSender sender, String[] args) {
if(!sender.hasPermission("areashop.setteleport") && !sender.hasPermission("areashop.setteleportall")) {
plugin.message(sender, "setteleport-noPermission");
return;
}
if(!(sender instanceof Player)) {
plugin.message(sender, "onlyByPlayer");
return;
}
Player player = (Player)sender;
GeneralRegion region;
if(args.length < 2) {
// get the region by location
List<GeneralRegion> regions = Utils.getImportantRegions(((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 {
region = plugin.getFileManager().getRegion(args[1]);
}
boolean owner;
if(region == null) {
plugin.message(player, "setteleport-noRentOrBuy", args[1]);
return;
}
if(region instanceof RentRegion) {
owner = player.getUniqueId().equals(((RentRegion)region).getRenter());
} else {
owner = player.getUniqueId().equals(((BuyRegion)region).getBuyer());
}
if(!player.hasPermission("areashop.setteleport")) {
plugin.message(player, "setteleport-noPermission", region);
return;
} else if(!owner && !player.hasPermission("areashop.setteleportall")) {
plugin.message(player, "setteleport-noPermissionOther", region);
return;
}
ProtectedRegion wgRegion = region.getRegion();
if(args.length > 2 && args[2] != null && (args[2].equalsIgnoreCase("reset") || args[2].equalsIgnoreCase("yes") || args[2].equalsIgnoreCase("true"))) {
region.getTeleportFeature().setTeleport(null);
region.update();
plugin.message(player, "setteleport-reset", region);
return;
}
if(!player.hasPermission("areashop.setteleportoutsideregion") && (wgRegion == null || !wgRegion.contains(player.getLocation().getBlockX(), player.getLocation().getBlockY(), player.getLocation().getBlockZ()))) {
plugin.message(player, "setteleport-notInside", region);
return;
}
region.getTeleportFeature().setTeleport(player.getLocation());
region.update();
plugin.message(player, "setteleport-success", region);
}
@Override
public List<String> getTabCompleteList(int toComplete, String[] start, CommandSender sender) {
ArrayList<String> result = new ArrayList<>();
if(toComplete == 2) {
result.addAll(plugin.getFileManager().getRegionNames());
} else if(toComplete == 3) {
result.add("reset");
}
return result;
}
}
@@ -1,263 +0,0 @@
package me.wiefferink.areashop.commands;
import com.sk89q.worldguard.protection.managers.RegionManager;
import com.sk89q.worldguard.protection.regions.ProtectedCuboidRegion;
import me.wiefferink.areashop.AreaShop;
import me.wiefferink.areashop.events.ask.AddingRegionEvent;
import me.wiefferink.areashop.interfaces.WorldEditSelection;
import me.wiefferink.areashop.regions.BuyRegion;
import me.wiefferink.areashop.regions.GeneralRegion;
import me.wiefferink.areashop.regions.RegionGroup;
import me.wiefferink.areashop.regions.RentRegion;
import me.wiefferink.areashop.tools.Utils;
import me.wiefferink.interactivemessenger.processing.Message;
import org.bukkit.Location;
import org.bukkit.block.BlockFace;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.scheduler.BukkitRunnable;
import org.bukkit.util.Vector;
import java.util.ArrayList;
import java.util.List;
public class StackCommand extends CommandAreaShop {
@Override
public String getCommandStart() {
return "areashop stack";
}
@Override
public String getHelp(CommandSender target) {
if(target.hasPermission("areashop.stack")) {
return "help-stack";
}
return null;
}
@Override
public void execute(CommandSender sender, String[] args) {
// Check permission
if(!sender.hasPermission("areashop.stack")) {
plugin.message(sender, "stack-noPermission");
return;
}
// Only from ingame
if(!(sender instanceof Player)) {
plugin.message(sender, "cmd-onlyByPlayer");
return;
}
final Player player = (Player)sender;
// Specify enough arguments
if(args.length < 5) {
plugin.message(sender, "stack-help");
return;
}
// Check amount
int tempAmount = -1;
try {
tempAmount = Integer.parseInt(args[1]);
} catch(NumberFormatException e) {
// Incorrect number
}
if(tempAmount <= 0) {
plugin.message(player, "stack-wrongAmount", args[1]);
return;
}
// Check gap
int gap;
try {
gap = Integer.parseInt(args[2]);
} catch(NumberFormatException e) {
plugin.message(player, "stack-wrongGap", args[2]);
return;
}
// Check region type
if(!"rent".equalsIgnoreCase(args[4]) && !"buy".equalsIgnoreCase(args[4])) {
plugin.message(sender, "stack-help");
return;
}
// Get WorldEdit selection
final WorldEditSelection selection = plugin.getWorldEditHandler().getPlayerSelection(player);
if(selection == null) {
plugin.message(player, "stack-noSelection");
return;
}
// Get or create group
RegionGroup group = null;
if(args.length > 5) {
group = plugin.getFileManager().getGroup(args[5]);
if(group == null) {
group = new RegionGroup(plugin, args[5]);
plugin.getFileManager().addGroup(group);
}
}
// Get facing of the player (must be clearly one of the four directions to make sure it is no mistake)
BlockFace facing = Utils.yawToFacing(player.getLocation().getYaw());
if(player.getLocation().getPitch() > 45) {
facing = BlockFace.DOWN;
} else if(player.getLocation().getPitch() < -45) {
facing = BlockFace.UP;
}
if(!(facing == BlockFace.NORTH || facing == BlockFace.EAST || facing == BlockFace.SOUTH || facing == BlockFace.WEST || facing == BlockFace.UP || facing == BlockFace.DOWN)) {
plugin.message(player, "stack-unclearDirection", facing.toString().toLowerCase().replace('_', '-'));
return;
}
Vector shift = new Vector(0, 0, 0);
if(facing == BlockFace.SOUTH) {
shift = shift.setZ(-selection.getLength() - gap);
} else if(facing == BlockFace.WEST) {
shift = shift.setX(selection.getWidth() + gap);
} else if(facing == BlockFace.NORTH) {
shift = shift.setZ(selection.getLength() + gap);
} else if(facing == BlockFace.EAST) {
shift = shift.setX(-selection.getWidth() - gap);
} else if(facing == BlockFace.DOWN) {
shift = shift.setY(-selection.getHeight() - gap);
} else if(facing == BlockFace.UP) {
shift = shift.setY(selection.getHeight() + gap);
}
AreaShop.debug(" calculated shift vector: " + shift + ", with facing=" + facing);
// Create regions and add them to AreaShop
final String nameTemplate = args[3];
final int regionsPerTick = plugin.getConfig().getInt("adding.regionsPerTick");
final boolean rentRegions = "rent".equalsIgnoreCase(args[4]);
final int amount = tempAmount;
final RegionGroup finalGroup = group;
final Vector finalShift = shift;
String type;
if(rentRegions) {
type = "rent";
} else {
type = "buy";
}
Message groupsMessage = Message.empty();
if(group != null) {
groupsMessage = Message.fromKey("stack-addToGroup").replacements(group.getName());
}
plugin.message(player, "stack-accepted", amount, type, gap, nameTemplate, groupsMessage);
plugin.message(player, "stack-addStart", amount, regionsPerTick * 20);
Location minimumLocation = selection.getMinimumLocation();
Vector minimumVector = new Vector(minimumLocation.getX(), minimumLocation.getY(), minimumLocation.getZ());
Location maximumLocation = selection.getMaximumLocation();
Vector maximumVector = new Vector(maximumLocation.getX(), maximumLocation.getY(), maximumLocation.getZ());
new BukkitRunnable() {
private int current = -1;
private final RegionManager manager = AreaShop.getInstance().getRegionManager(selection.getWorld());
private int counter = 1;
private int tooLow = 0;
private int tooHigh = 0;
@Override
public void run() {
for(int i = 0; i < regionsPerTick; i++) {
current++;
if(current < amount) {
// Create the region name
String regionName = countToName(nameTemplate, counter);
while(manager.getRegion(regionName) != null || AreaShop.getInstance().getFileManager().getRegion(regionName) != null) {
counter++;
regionName = countToName(nameTemplate, counter);
}
// Add the region to WorldGuard (at startposition shifted by the number of this region times the blocks it should shift)
Vector minimum = minimumVector.clone().add(finalShift.clone().multiply(current));
Vector maximum = maximumVector.clone().add(finalShift.clone().multiply(current));
// Check for out of bounds
if(minimum.getBlockY() < 0) {
tooLow++;
continue;
} else if(maximum.getBlockY() > 256) {
tooHigh++;
continue;
}
ProtectedCuboidRegion region = plugin.getWorldGuardHandler().createCuboidRegion(regionName, minimum,maximum);
manager.addRegion(region);
// Add the region to AreaShop
GeneralRegion newRegion;
if(rentRegions) {
newRegion = new RentRegion(regionName, selection.getWorld());
} else {
newRegion = new BuyRegion(regionName, selection.getWorld());
}
if(finalGroup != null) {
finalGroup.addMember(newRegion);
}
AddingRegionEvent event = plugin.getFileManager().addRegion(newRegion);
if (event.isCancelled()) {
plugin.message(player, "general-cancelled", event.getReason());
continue;
}
newRegion.handleSchematicEvent(GeneralRegion.RegionEvent.CREATED);
newRegion.update();
}
}
if(current >= amount) {
if(player.isOnline()) {
int added = amount - tooLow - tooHigh;
Message wrong = Message.empty();
if(tooHigh > 0) {
wrong.append(Message.fromKey("stack-tooHigh").replacements(tooHigh));
}
if(tooLow > 0) {
wrong.append(Message.fromKey("stack-tooLow").replacements(tooLow));
}
plugin.message(player, "stack-addComplete", added, wrong);
}
this.cancel();
}
}
}.runTaskTimer(plugin, 1, 1);
}
/**
* Build a name from a count, with the right length.
* @param template Template to put the name in (# to put the count there, otherwise count is appended)
* @param count Number to use
* @return name with prepended 0's
*/
private String countToName(String template, int count) {
StringBuilder counterName = new StringBuilder().append(count);
int minimumLength = plugin.getConfig().getInt("stackRegionNumberLength");
while(counterName.length() < minimumLength) {
counterName.insert(0, "0");
}
if(template.contains("#")) {
return template.replace("#", counterName);
} else {
return template + counterName;
}
}
@Override
public List<String> getTabCompleteList(int toComplete, String[] start, CommandSender sender) {
List<String> result = new ArrayList<>();
if(toComplete == 5) {
result.add("rent");
result.add("buy");
} else if(toComplete == 6) {
result.addAll(plugin.getFileManager().getGroupNames());
}
return result;
}
}
@@ -1,111 +0,0 @@
package me.wiefferink.areashop.commands;
import me.wiefferink.areashop.regions.BuyRegion;
import me.wiefferink.areashop.tools.Utils;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import java.util.ArrayList;
import java.util.List;
public class StopresellCommand extends CommandAreaShop {
@Override
public String getCommandStart() {
return "areashop stopresell";
}
@Override
public String getHelp(CommandSender target) {
if(target.hasPermission("areashop.stopresellall") || target.hasPermission("areashop.stopresell")) {
return "help-stopResell";
}
return null;
}
@Override
public void execute(CommandSender sender, String[] args) {
if(!sender.hasPermission("areashop.stopresell") && !sender.hasPermission("areashop.stopresellall")) {
plugin.message(sender, "stopresell-noPermissionOther");
return;
}
BuyRegion buy;
if(args.length <= 1) {
if(sender instanceof Player) {
// get the region by location
List<BuyRegion> regions = Utils.getImportantBuyRegions(((Player)sender).getLocation());
if(regions.isEmpty()) {
plugin.message(sender, "cmd-noRegionsAtLocation");
return;
} else if(regions.size() > 1) {
plugin.message(sender, "cmd-moreRegionsAtLocation");
return;
} else {
buy = regions.get(0);
}
} else {
plugin.message(sender, "cmd-automaticRegionOnlyByPlayer");
return;
}
} else {
buy = plugin.getFileManager().getBuy(args[1]);
if(buy == null) {
plugin.message(sender, "stopresell-notRegistered", args[1]);
return;
}
}
if(buy == null) {
plugin.message(sender, "cmd-noRegionsAtLocation");
return;
}
if(!buy.isInResellingMode()) {
plugin.message(sender, "stopresell-notResell", buy);
return;
}
if(sender.hasPermission("areashop.stopresellall")) {
buy.disableReselling();
buy.update();
plugin.message(sender, "stopresell-success", buy);
} else if(sender.hasPermission("areashop.stopresell") && sender instanceof Player) {
if(buy.isOwner((Player)sender)) {
buy.disableReselling();
buy.update();
plugin.message(sender, "stopresell-success", buy);
} else {
plugin.message(sender, "stopresell-noPermissionOther", buy);
}
} else {
plugin.message(sender, "stopresell-noPermission", buy);
}
}
@Override
public List<String> getTabCompleteList(int toComplete, String[] start, CommandSender sender) {
ArrayList<String> result = new ArrayList<>();
if(toComplete == 2) {
for(BuyRegion region : plugin.getFileManager().getBuys()) {
if(region.isSold() && region.isInResellingMode()) {
result.add(region.getName());
}
}
}
return result;
}
}
@@ -1,82 +0,0 @@
package me.wiefferink.areashop.commands;
import me.wiefferink.areashop.regions.GeneralRegion;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import java.util.ArrayList;
import java.util.List;
public class TeleportCommand extends CommandAreaShop {
@Override
public String getCommandStart() {
return "areashop tp";
}
@Override
public String getHelp(CommandSender target) {
if(target.hasPermission("areashop.teleportall") || target.hasPermission("areashop.teleport")) {
return "help-teleport";
}
return null;
}
/**
* Check if a person can teleport to the region (assuming he is not teleporting to a sign).
* @param person The person to check
* @param region The region to check for
* @return true if the person can teleport to it, otherwise false
*/
public static boolean canUse(CommandSender person, GeneralRegion region) {
if(!(person instanceof Player)) {
return false;
}
Player player = (Player)person;
return player.hasPermission("areashop.teleportall")
|| region.isOwner(player) && player.hasPermission("areashop.teleport")
|| region.isAvailable() && player.hasPermission("areashop.teleportavailable")
|| region.getFriendsFeature().getFriends().contains(player.getUniqueId()) && player.hasPermission("areashop.teleportfriend");
}
@Override
public void execute(CommandSender sender, String[] args) {
if(!sender.hasPermission("areashop.teleport") && !sender.hasPermission("areashop.teleportall") && !sender.hasPermission("areashop.teleportavailable") && !sender.hasPermission("areashop.teleportavailablesign") && !sender.hasPermission("areashop.teleportsign") && !sender.hasPermission("areashop.teleportsignall") && !sender.hasPermission("areashop.teleportfriend") && !sender.hasPermission("teleportfriendsign")) {
plugin.message(sender, "teleport-noPermission");
return;
}
if(!(sender instanceof Player)) {
plugin.message(sender, "cmd-onlyByPlayer");
return;
}
if(args.length <= 1 || args[1] == null) {
plugin.message(sender, "teleport-help");
return;
}
Player player = (Player)sender;
GeneralRegion region = plugin.getFileManager().getRegion(args[1]);
if(region == null) {
plugin.message(player, "teleport-noRentOrBuy", args[1]);
return;
}
boolean toSign = args.length >= 3 && (
args[2].equalsIgnoreCase("sign")
|| args[2].equalsIgnoreCase("yes")
|| args[2].equalsIgnoreCase("true")
);
region.getTeleportFeature().teleportPlayer(player, toSign, true);
}
@Override
public List<String> getTabCompleteList(int toComplete, String[] start, CommandSender sender) {
ArrayList<String> result = new ArrayList<>();
if(toComplete == 2) {
result.addAll(plugin.getFileManager().getRegionNames());
} else if(toComplete == 3) {
result.add("sign");
}
return result;
}
}
@@ -1,31 +0,0 @@
package me.wiefferink.areashop.commands;
import com.sk89q.worldedit.math.BlockVector3;
import com.sk89q.worldedit.regions.Region;
import com.sk89q.worldguard.protection.ApplicableRegionSet;
import com.sk89q.worldguard.protection.regions.ProtectedRegion;
import me.wiefferink.areashop.AreaShop;
import org.bukkit.Location;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
public class TestCommand implements CommandExecutor {
private AreaShop areaShop = AreaShop.getInstance();
@Override
public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) {
if (sender instanceof Player) {
final Player player = (Player) sender;
final Location location = player.getLocation();
ApplicableRegionSet region = areaShop.getRegionManager(player.getWorld()).getApplicableRegions(BlockVector3.at(location.getX(), location.getY(), location.getZ()));
for (ProtectedRegion r : region.getRegions()) {
player.sendMessage(r.getId());
}
}
return true;
}
}
@@ -1,104 +0,0 @@
package me.wiefferink.areashop.commands;
import me.wiefferink.areashop.regions.GeneralRegion;
import me.wiefferink.areashop.regions.RentRegion;
import me.wiefferink.areashop.regions.TransactionalRegion;
import me.wiefferink.areashop.tools.Utils;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import java.util.ArrayList;
import java.util.List;
public class UnrentCommand extends CommandAreaShop {
/**
* Check if a person can unrent the region.
*
* @param person The person to check
* @param region The region to check for
* @return true if the person can unrent it, otherwise false
*/
public static boolean canUse(CommandSender person, GeneralRegion region) {
if (person.hasPermission("areashop.unrent")) {
return true;
}
if (person instanceof Player && region instanceof TransactionalRegion) {
Player player = (Player) person;
return ((TransactionalRegion) region).isTransactionHolder(player) && person.hasPermission("areashop.unrentown");
}
return false;
}
@Override
public String getCommandStart() {
return "areashop unrent";
}
@Override
public String getHelp(CommandSender target) {
if (target.hasPermission("areashop.unrent") || target.hasPermission("areashop.unrentown")) {
return "help-unrent";
}
return null;
}
@Override
public void execute(CommandSender sender, String[] args) {
if (!sender.hasPermission("areashop.unrent") && !sender.hasPermission("areashop.unrentown")) {
plugin.message(sender, "unrent-noPermission");
return;
}
RentRegion rent;
if (args.length <= 1) {
if (sender instanceof Player) {
// get the region by location
List<RentRegion> regions = Utils.getImportantRentRegions(((Player) sender).getLocation());
if (regions.isEmpty()) {
plugin.message(sender, "cmd-noRegionsAtLocation");
return;
} else if (regions.size() > 1) {
plugin.message(sender, "cmd-moreRegionsAtLocation");
return;
} else {
rent = regions.get(0);
}
} else {
plugin.message(sender, "cmd-automaticRegionOnlyByPlayer");
return;
}
} else {
rent = plugin.getFileManager().getRent(args[1]);
}
if (rent == null) {
plugin.message(sender, "unrent-notRegistered");
return;
}
if (!rent.isRented()) {
plugin.message(sender, "unrent-notRented", rent);
return;
}
rent.unRent(true, sender);
}
@Override
public List<String> getTabCompleteList(int toComplete, String[] start, CommandSender sender) {
ArrayList<String> result = new ArrayList<>();
if (toComplete == 2) {
for (RentRegion region : plugin.getFileManager().getRents()) {
if (region.isRented()) {
result.add(region.getName());
}
}
}
return result;
}
}
@@ -1,45 +0,0 @@
package me.wiefferink.areashop.events;
public class CancellableRegionEvent<T> extends RegionEvent<T> {
private boolean cancelled;
private String reason;
public CancellableRegionEvent(T region) {
super(region);
}
/**
* Cancel the event from happening.
* @param reason The reason of cancelling, used for display to the user, should end with a dot
*/
public void cancel(String reason) {
this.cancelled = true;
this.reason = reason;
}
/**
* Let the event continue, possible overwriting a cancel() call from another plugin.
*/
public void allow() {
this.cancelled = false;
this.reason = null;
}
/**
* Check if the event has been cancelled.
* @return true if the event has been cancelled, otherwise false
*/
public boolean isCancelled() {
return cancelled;
}
/**
* Get the reason why this event is cancelled.
* @return null if there is no reason or the event is not cancelled, otherwise a string
*/
public String getReason() {
return reason;
}
}
@@ -1,7 +0,0 @@
package me.wiefferink.areashop.events;
public class NotifyRegionEvent<T> extends RegionEvent<T> {
public NotifyRegionEvent(T region) {
super(region);
}
}
@@ -1,7 +0,0 @@
# Events
This package contains event classes that allow other plugins to listen to events about AreaShop regions.
* `RegionEvent` class represents a generic event.
* `CancellableRegionEvent` represents an event that has a region and can be cancelled.
* `NotifyRegionEvent` represents events that are to inform only, and cannot be cancelled anymore (an `CancellableRegionEvent` would be sent first).
@@ -1,31 +0,0 @@
package me.wiefferink.areashop.events;
import org.bukkit.event.Event;
import org.bukkit.event.HandlerList;
public class RegionEvent<T> extends Event {
protected T region;
private static final HandlerList handlers = new HandlerList();
public RegionEvent(T region) {
this.region = region;
}
@Override
public HandlerList getHandlers() {
return handlers;
}
// Required by Bukkit/Spigot
public static HandlerList getHandlerList() {
return handlers;
}
/**
* Get the region of this event.
* @return The region the event is about
*/
public T getRegion() {
return region;
}
}
@@ -1,19 +0,0 @@
package me.wiefferink.areashop.events.ask;
import me.wiefferink.areashop.events.CancellableRegionEvent;
import me.wiefferink.areashop.regions.GeneralRegion;
/**
* Broadcasted when a region has been added to AreaShop.
*/
public class AddingRegionEvent extends CancellableRegionEvent<GeneralRegion> {
/**
* Constructor.
* @param region The region that has been added
*/
public AddingRegionEvent(GeneralRegion region) {
super(region);
}
}
@@ -1,31 +0,0 @@
package me.wiefferink.areashop.events.ask;
import me.wiefferink.areashop.events.CancellableRegionEvent;
import me.wiefferink.areashop.regions.BuyRegion;
import org.bukkit.OfflinePlayer;
/**
* Broadcasted when a player tries to buy a region.
*/
public class BuyingRegionEvent extends CancellableRegionEvent<BuyRegion> {
private final OfflinePlayer player;
/**
* Constructor.
* @param region The region that is about to get bought
* @param player The player that tries to buy the region
*/
public BuyingRegionEvent(BuyRegion region, OfflinePlayer player) {
super(region);
this.player = player;
}
/**
* Get the player that is trying to buy the region.
* @return The player that is trying to buy the region
*/
public OfflinePlayer getPlayer() {
return player;
}
}
@@ -1,19 +0,0 @@
package me.wiefferink.areashop.events.ask;
import me.wiefferink.areashop.events.CancellableRegionEvent;
import me.wiefferink.areashop.regions.GeneralRegion;
/**
* Broadcasted when a region has been added to AreaShop.
*/
public class DeletingRegionEvent extends CancellableRegionEvent<GeneralRegion> {
/**
* Constructor.
* @param region The region that has been added
*/
public DeletingRegionEvent(GeneralRegion region) {
super(region);
}
}
@@ -1,42 +0,0 @@
package me.wiefferink.areashop.events.ask;
import me.wiefferink.areashop.events.CancellableRegionEvent;
import me.wiefferink.areashop.regions.RentRegion;
import org.bukkit.OfflinePlayer;
/**
* Broadcasted when a player tries to rent a region.
*/
public class RentingRegionEvent extends CancellableRegionEvent<RentRegion> {
private final OfflinePlayer player;
private final boolean extending;
/**
* Constructor.
* @param region The region that is about to be rented
* @param player The player that tries to rent the region
* @param extending true if the player is extending the rental of the region, otherwise false
*/
public RentingRegionEvent(RentRegion region, OfflinePlayer player, boolean extending) {
super(region);
this.player = player;
this.extending = extending;
}
/**
* Get the player that is trying to rent the region.
* @return The player that is trying to rent the region
*/
public OfflinePlayer getPlayer() {
return player;
}
/**
* Check if the player is extending the region or renting it for the first time.
* @return true if the player tries to extend the region, false if he tries to rent it the first time
*/
public boolean isExtending() {
return extending;
}
}
@@ -1,31 +0,0 @@
package me.wiefferink.areashop.events.ask;
import me.wiefferink.areashop.events.CancellableRegionEvent;
import me.wiefferink.areashop.regions.BuyRegion;
import org.bukkit.OfflinePlayer;
/**
* Broadcasted when a player tries to resell a region.
*/
public class ResellingRegionEvent extends CancellableRegionEvent<BuyRegion> {
private final OfflinePlayer player;
/**
* Contructor.
* @param region The region that the player is trying to resell
* @param player The player that is trying to buy this region from the current owner
*/
public ResellingRegionEvent(BuyRegion region, OfflinePlayer player) {
super(region);
this.player = player;
}
/**
* Get the player that is trying to buy the region.
* @return The player that is trying to buy the region
*/
public OfflinePlayer getBuyer() {
return player;
}
}
@@ -1,18 +0,0 @@
package me.wiefferink.areashop.events.ask;
import me.wiefferink.areashop.events.CancellableRegionEvent;
import me.wiefferink.areashop.regions.BuyRegion;
/**
* Broadcasted when a region is about to get sold.
*/
public class SellingRegionEvent extends CancellableRegionEvent<BuyRegion> {
/**
* Constructor.
* @param region The region that is about to get sold
*/
public SellingRegionEvent(BuyRegion region) {
super(region);
}
}
@@ -1,18 +0,0 @@
package me.wiefferink.areashop.events.ask;
import me.wiefferink.areashop.events.CancellableRegionEvent;
import me.wiefferink.areashop.regions.RentRegion;
/**
* Broadcasted when a region is about to be unrented.
*/
public class UnrentingRegionEvent extends CancellableRegionEvent<RentRegion> {
/**
* Constructor.
* @param region The region that is about to be unrented
*/
public UnrentingRegionEvent(RentRegion region) {
super(region);
}
}
@@ -1,43 +0,0 @@
package me.wiefferink.areashop.events.askandnotify;
import me.wiefferink.areashop.events.CancellableRegionEvent;
import me.wiefferink.areashop.regions.GeneralRegion;
import org.bukkit.OfflinePlayer;
import org.bukkit.command.CommandSender;
/**
* Broadcasted when a friend is being added to a region.
*/
public class AddedFriendEvent extends CancellableRegionEvent<GeneralRegion> {
private final OfflinePlayer friend;
private final CommandSender by;
/**
* Constructor.
* @param region The region the friend is getting added to
* @param friend The friend that is about to be added
* @param by The CommandSender that is adding the friend, or null if none
*/
public AddedFriendEvent(GeneralRegion region, OfflinePlayer friend, CommandSender by) {
super(region);
this.friend = friend;
this.by = by;
}
/**
* Get the OfflinePlayer that is getting added as friend.
* @return The friend that is getting added
*/
public OfflinePlayer getFriend() {
return friend;
}
/**
* Get the CommandSender that is adding the friend.
* @return null if none, a CommandSender if done by someone (likely Player or ConsoleCommandSender)
*/
public CommandSender getBy() {
return by;
}
}
@@ -1,43 +0,0 @@
package me.wiefferink.areashop.events.askandnotify;
import me.wiefferink.areashop.events.CancellableRegionEvent;
import me.wiefferink.areashop.regions.GeneralRegion;
import org.bukkit.OfflinePlayer;
import org.bukkit.command.CommandSender;
/**
* Broadcasted when a friend is being added to a region.
*/
public class DeletedFriendEvent extends CancellableRegionEvent<GeneralRegion> {
private final OfflinePlayer friend;
private final CommandSender by;
/**
* Constructor.
* @param region The region the friend is getting added to
* @param friend The friend that is about to be added
* @param by The CommandSender that is adding the friend, or null if none
*/
public DeletedFriendEvent(GeneralRegion region, OfflinePlayer friend, CommandSender by) {
super(region);
this.friend = friend;
this.by = by;
}
/**
* Get the OfflinePlayer that is getting added as friend.
* @return The friend that is getting added
*/
public OfflinePlayer getFriend() {
return friend;
}
/**
* Get the CommandSender that is adding the friend.
* @return null if none, a CommandSender if done by someone (likely Player or ConsoleCommandSender)
*/
public CommandSender getBy() {
return by;
}
}
@@ -1,19 +0,0 @@
package me.wiefferink.areashop.events.notify;
import me.wiefferink.areashop.events.NotifyRegionEvent;
import me.wiefferink.areashop.regions.GeneralRegion;
/**
* Broadcasted when a region has been added to AreaShop.
*/
public class AddedRegionEvent extends NotifyRegionEvent<GeneralRegion> {
/**
* Constructor.
* @param region The region that has been added
*/
public AddedRegionEvent(GeneralRegion region) {
super(region);
}
}
@@ -1,19 +0,0 @@
package me.wiefferink.areashop.events.notify;
import me.wiefferink.areashop.events.NotifyRegionEvent;
import me.wiefferink.areashop.regions.BuyRegion;
/**
* Broadcasted when a region has been bought.
*/
public class BoughtRegionEvent extends NotifyRegionEvent<BuyRegion> {
/**
* Constructor.
* @param region The region that has been bought
*/
public BoughtRegionEvent(BuyRegion region) {
super(region);
}
}
@@ -1,18 +0,0 @@
package me.wiefferink.areashop.events.notify;
import me.wiefferink.areashop.events.NotifyRegionEvent;
import me.wiefferink.areashop.regions.GeneralRegion;
/**
* Broadcasted when a region has been removed from AreaShop.
*/
public class DeletedRegionEvent extends NotifyRegionEvent<GeneralRegion> {
/**
* Constructor.
* @param region The region that has been removed
*/
public DeletedRegionEvent(GeneralRegion region) {
super(region);
}
}
@@ -1,31 +0,0 @@
package me.wiefferink.areashop.events.notify;
import me.wiefferink.areashop.events.NotifyRegionEvent;
import me.wiefferink.areashop.regions.RentRegion;
/**
* Broadcasted when a region has been rented.
*/
public class RentedRegionEvent extends NotifyRegionEvent<RentRegion> {
private final boolean extended;
/**
* Constructor.
* @param region The region that has been rented
* @param extended true if the region has been extended, false if this is the first time buying the region
*/
public RentedRegionEvent(RentRegion region, boolean extended) {
super(region);
this.region = region;
this.extended = extended;
}
/**
* Check if the region was extended or rented for the first time.
* @return true if the region was extended, false when rented for the first time
*/
public boolean hasExtended() {
return extended;
}
}
@@ -1,32 +0,0 @@
package me.wiefferink.areashop.events.notify;
import me.wiefferink.areashop.events.NotifyRegionEvent;
import me.wiefferink.areashop.regions.BuyRegion;
import java.util.UUID;
/**
* Broadcasted when a region has been resold.
*/
public class ResoldRegionEvent extends NotifyRegionEvent<BuyRegion> {
private final UUID from;
/**
* Constructor.
* @param region The region that has been resold
* @param from The player from who the region has been resold to the current owner
*/
public ResoldRegionEvent(BuyRegion region, UUID from) {
super(region);
this.from = from;
}
/**
* Get the player that the region has been bought from.
* @return The UUID of the player that the region has been bought from
*/
public UUID getFromPlayer() {
return from;
}
}
@@ -1,43 +0,0 @@
package me.wiefferink.areashop.events.notify;
import me.wiefferink.areashop.events.NotifyRegionEvent;
import me.wiefferink.areashop.regions.BuyRegion;
import java.util.UUID;
/**
* Broadcasted when a region is sold.
*/
public class SoldRegionEvent extends NotifyRegionEvent<BuyRegion> {
private final UUID oldBuyer;
private final double refundedMoney;
/**
* Constructor.
* @param region The region that has been sold
* @param oldBuyer The player for which the region has been sold
* @param refundedMoney The amount of money that has been refunded
*/
public SoldRegionEvent(BuyRegion region, UUID oldBuyer, double refundedMoney) {
super(region);
this.oldBuyer = oldBuyer;
this.refundedMoney = refundedMoney;
}
/**
* Get the player that the region is sold for.
* @return The UUID of the player that the region is sold for
*/
public UUID getOldBuyer() {
return oldBuyer;
}
/**
* Get the amount that is paid back to the player.
* @return The amount of money paid back to the player
*/
public double getRefundedMoney() {
return refundedMoney;
}
}
@@ -1,43 +0,0 @@
package me.wiefferink.areashop.events.notify;
import me.wiefferink.areashop.events.NotifyRegionEvent;
import me.wiefferink.areashop.regions.RentRegion;
import java.util.UUID;
/**
* Broadcasted when a region has been unrented.
*/
public class UnrentedRegionEvent extends NotifyRegionEvent<RentRegion> {
private final UUID oldRenter;
private final double refundedMoney;
/**
* Constructor.
* @param region The region that has been unrented
* @param oldRenter The player that rented the region before it was unrented
* @param refundedMoney The amount of money that has been refunded
*/
public UnrentedRegionEvent(RentRegion region, UUID oldRenter, double refundedMoney) {
super(region);
this.oldRenter = oldRenter;
this.refundedMoney = refundedMoney;
}
/**
* Get the player that the region was unrented for.
* @return The UUID of the player that the region was unrented for
*/
public UUID getOldRenter() {
return oldRenter;
}
/**
* Get the amount that is paid back to the player.
* @return The amount of money paid back to the player
*/
public double getRefundedMoney() {
return refundedMoney;
}
}
@@ -1,19 +0,0 @@
package me.wiefferink.areashop.events.notify;
import me.wiefferink.areashop.events.NotifyRegionEvent;
import me.wiefferink.areashop.regions.GeneralRegion;
/**
* Broadcasted when the data of a region changes.
* Should be used for updating displays that use region data.
*/
public class UpdateRegionEvent extends NotifyRegionEvent<GeneralRegion> {
/**
* Contructor.
* @param region The region that has been updated
*/
public UpdateRegionEvent(GeneralRegion region) {
super(region);
}
}
@@ -1,118 +0,0 @@
package me.wiefferink.areashop.features;
import me.wiefferink.areashop.events.ask.AddingRegionEvent;
import me.wiefferink.areashop.events.ask.BuyingRegionEvent;
import me.wiefferink.areashop.events.ask.DeletingRegionEvent;
import me.wiefferink.areashop.events.ask.RentingRegionEvent;
import me.wiefferink.areashop.events.ask.ResellingRegionEvent;
import me.wiefferink.areashop.events.ask.SellingRegionEvent;
import me.wiefferink.areashop.events.ask.UnrentingRegionEvent;
import me.wiefferink.areashop.events.notify.AddedRegionEvent;
import me.wiefferink.areashop.events.notify.BoughtRegionEvent;
import me.wiefferink.areashop.events.notify.DeletedRegionEvent;
import me.wiefferink.areashop.events.notify.RentedRegionEvent;
import me.wiefferink.areashop.events.notify.ResoldRegionEvent;
import me.wiefferink.areashop.events.notify.SoldRegionEvent;
import me.wiefferink.areashop.events.notify.UnrentedRegionEvent;
import me.wiefferink.areashop.regions.GeneralRegion;
import org.bukkit.Bukkit;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import java.util.List;
public class CommandsFeature extends RegionFeature {
/**
* Run command for a certain event.
* @param region Region to execute the events for
* @param event The event
* @param before The 'before' or 'after' commands
*/
public void runEventCommands(GeneralRegion region, GeneralRegion.RegionEvent event, boolean before) {
ConfigurationSection eventCommandProfileSection = region.getConfigurationSectionSetting("general.eventCommandProfile", "eventCommandProfiles");
if(eventCommandProfileSection == null) {
return;
}
List<String> commands = eventCommandProfileSection.getStringList(event.getValue() + "." + (before ? "before" : "after"));
if(commands == null || commands.isEmpty()) {
return;
}
region.runCommands(Bukkit.getConsoleSender(), commands);
}
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void addingRegion(AddingRegionEvent event) {
runEventCommands(event.getRegion(), GeneralRegion.RegionEvent.CREATED, true);
}
@EventHandler
public void addedRegion(AddedRegionEvent event) {
runEventCommands(event.getRegion(), GeneralRegion.RegionEvent.CREATED, false);
}
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void deletingRegion(DeletingRegionEvent event) {
runEventCommands(event.getRegion(), GeneralRegion.RegionEvent.DELETED, true);
}
@EventHandler
public void deletedRegion(DeletedRegionEvent event) {
runEventCommands(event.getRegion(), GeneralRegion.RegionEvent.DELETED, false);
}
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void rentingRegion(RentingRegionEvent event) {
// Technically the rent can still be cancelled if the payment fails...
runEventCommands(event.getRegion(), event.isExtending() ? GeneralRegion.RegionEvent.EXTENDED : GeneralRegion.RegionEvent.RENTED, true);
}
@EventHandler
public void rentedRegion(RentedRegionEvent event) {
runEventCommands(event.getRegion(), event.hasExtended() ? GeneralRegion.RegionEvent.EXTENDED : GeneralRegion.RegionEvent.RENTED, false);
}
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void buyingRegion(BuyingRegionEvent event) {
// Technically the buy can still be cancelled if the payment fails...
runEventCommands(event.getRegion(), GeneralRegion.RegionEvent.BOUGHT, true);
}
@EventHandler
public void boughtRegion(BoughtRegionEvent event) {
runEventCommands(event.getRegion(), GeneralRegion.RegionEvent.BOUGHT, false);
}
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void resellingRegion(ResellingRegionEvent event) {
// Technically the resell can still be cancelled if the payment fails...
runEventCommands(event.getRegion(), GeneralRegion.RegionEvent.RESELL, true);
}
@EventHandler
public void resoldRegion(ResoldRegionEvent event) {
runEventCommands(event.getRegion(), GeneralRegion.RegionEvent.RESELL, false);
}
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void sellingRegion(SellingRegionEvent event) {
runEventCommands(event.getRegion(), GeneralRegion.RegionEvent.SOLD, true);
}
@EventHandler
public void soldRegion(SoldRegionEvent event) {
runEventCommands(event.getRegion(), GeneralRegion.RegionEvent.SOLD, false);
}
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void unrentingRegion(UnrentingRegionEvent event) {
runEventCommands(event.getRegion(), GeneralRegion.RegionEvent.UNRENTED, true);
}
@EventHandler
public void unrentedRegion(UnrentedRegionEvent event) {
runEventCommands(event.getRegion(), GeneralRegion.RegionEvent.UNRENTED, false);
}
}
@@ -1,98 +0,0 @@
package me.wiefferink.areashop.features;
import me.wiefferink.areashop.AreaShop;
import me.wiefferink.areashop.events.ask.BuyingRegionEvent;
import me.wiefferink.areashop.events.ask.RentingRegionEvent;
import me.wiefferink.areashop.events.ask.ResellingRegionEvent;
import me.wiefferink.areashop.events.ask.SellingRegionEvent;
import me.wiefferink.areashop.events.ask.UnrentingRegionEvent;
import me.wiefferink.areashop.events.askandnotify.AddedFriendEvent;
import me.wiefferink.areashop.events.askandnotify.DeletedFriendEvent;
import me.wiefferink.areashop.events.notify.AddedRegionEvent;
import me.wiefferink.areashop.events.notify.BoughtRegionEvent;
import me.wiefferink.areashop.events.notify.DeletedRegionEvent;
import me.wiefferink.areashop.events.notify.RentedRegionEvent;
import me.wiefferink.areashop.events.notify.ResoldRegionEvent;
import me.wiefferink.areashop.events.notify.SoldRegionEvent;
import me.wiefferink.areashop.events.notify.UnrentedRegionEvent;
import me.wiefferink.areashop.events.notify.UpdateRegionEvent;
import me.wiefferink.areashop.tools.Utils;
import org.bukkit.event.EventHandler;
public class DebugFeature extends RegionFeature {
@EventHandler
public void buyingRegion(BuyingRegionEvent event) {
AreaShop.debug("BuyingRegionEvent: " + event.getPlayer().getName() + " is trying to buy " + event.getRegion().getName());
}
@EventHandler
public void boughtRegion(BoughtRegionEvent event) {
AreaShop.debug("BoughtRegionEvent: " + event.getRegion().getPlayerName() + " bought " + event.getRegion().getName());
}
@EventHandler
public void sellingRegion(SellingRegionEvent event) {
AreaShop.debug("SellingRegionEvent: " + event.getRegion().getName() + " is trying to sell " + event.getRegion().getName());
}
@EventHandler
public void soldRegion(SoldRegionEvent event) {
AreaShop.debug("SoldRegionEvent: " + Utils.toName(event.getOldBuyer()) + " sold " + event.getRegion().getName());
}
@EventHandler
public void resellingRegion(ResellingRegionEvent event) {
AreaShop.debug("ResellingRegionEvent: " + event.getRegion().getName() + " is trying to resell " + event.getRegion().getName());
}
@EventHandler
public void resoldRegion(ResoldRegionEvent event) {
AreaShop.debug("ResoldRegionEvent: " + Utils.toName(event.getFromPlayer()) + " resold " + event.getRegion().getName() + " to " + event.getRegion().getPlayerName());
}
@EventHandler
public void rentingRegion(RentingRegionEvent event) {
AreaShop.debug("RentingRegionEvent: " + event.getPlayer().getName() + " is trying to rent " + event.getRegion().getName() + ", extending=" + event.isExtending());
}
@EventHandler
public void rentedRegion(RentedRegionEvent event) {
AreaShop.debug("RentedRegionEvent: " + event.getRegion().getPlayerName() + " rented " + event.getRegion().getName() + ", extending=" + event.hasExtended());
}
@EventHandler
public void unrentingRegion(UnrentingRegionEvent event) {
AreaShop.debug("UnrentingRegionEvent: " + event.getRegion().getPlayerName() + " is trying to unrent " + event.getRegion().getName());
}
@EventHandler
public void unrentedRegion(UnrentedRegionEvent event) {
AreaShop.debug("UnrentedRegionEvent: " + Utils.toName(event.getOldRenter()) + " unrented " + event.getRegion().getName());
}
@EventHandler
public void regionUpdate(UpdateRegionEvent event) {
//AreaShop.debug("UpdateRegionEvent: " + event.getRegion().getName() + " updated");
}
@EventHandler
public void addedRegion(AddedRegionEvent event) {
AreaShop.debug("AddedRegionEvent: " + event.getRegion().getName());
}
@EventHandler
public void removedRegion(DeletedRegionEvent event) {
AreaShop.debug("DeletedRegionEvent: " + event.getRegion().getName());
}
@EventHandler
public void addedFriend(AddedFriendEvent event) {
AreaShop.debug("AddedFriendEvent: region " + event.getRegion().getName() + ", " + event.getFriend().getName() + " by " + (event.getBy() == null ? "<nobody>" : event.getBy().getName()));
}
@EventHandler
public void deleteFriend(DeletedFriendEvent event) {
AreaShop.debug("DeletedFriendEvent: region " + event.getRegion().getName() + ", " + event.getFriend().getName() + " by " + (event.getBy() == null ? "<nobody>" : event.getBy().getName()));
}
}
@@ -1,108 +0,0 @@
package me.wiefferink.areashop.features;
import me.wiefferink.areashop.events.askandnotify.AddedFriendEvent;
import me.wiefferink.areashop.events.askandnotify.DeletedFriendEvent;
import me.wiefferink.areashop.regions.GeneralRegion;
import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer;
import org.bukkit.command.CommandSender;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.UUID;
public class FriendsFeature extends RegionFeature {
public FriendsFeature(GeneralRegion region) {
setRegion(region);
}
/**
* Add a friend to the region.
* @param player The UUID of the player to add
* @param by The CommandSender that is adding the friend, or null
* @return true if the friend has been added, false if adding a friend was cancelled by another plugin
*/
public boolean addFriend(UUID player, CommandSender by) {
// Fire and check event
AddedFriendEvent event = new AddedFriendEvent(getRegion(), Bukkit.getOfflinePlayer(player), by);
Bukkit.getPluginManager().callEvent(event);
if(event.isCancelled()) {
plugin.message(by, "general-cancelled", event.getReason(), this);
return false;
}
Set<String> friends = new HashSet<>(getRegion().getConfig().getStringList("general.friends"));
friends.add(player.toString());
List<String> list = new ArrayList<>(friends);
getRegion().setSetting("general.friends", list);
return true;
}
/**
* Delete a friend from the region.
* @param player The UUID of the player to delete
* @param by The CommandSender that is adding the friend, or null
* @return true if the friend has been added, false if adding a friend was cancelled by another plugin
*/
public boolean deleteFriend(UUID player, CommandSender by) {
// Fire and check event
DeletedFriendEvent event = new DeletedFriendEvent(getRegion(), Bukkit.getOfflinePlayer(player), by);
Bukkit.getPluginManager().callEvent(event);
if(event.isCancelled()) {
plugin.message(by, "general-cancelled", event.getReason(), this);
return false;
}
List<String> friends = getRegion().getConfig().getStringList("general.friends");
friends.remove(player.toString());
if(friends.isEmpty()) {
getRegion().setSetting("general.friends", null);
} else {
getRegion().setSetting("general.friends", friends);
}
return true;
}
/**
* Get the list of friends added to this region.
* @return Friends added to this region
*/
public Set<UUID> getFriends() {
HashSet<UUID> result = new HashSet<>();
for(String friend : getRegion().getConfig().getStringList("general.friends")) {
try {
UUID id = UUID.fromString(friend);
result.add(id);
} catch(IllegalArgumentException e) {
// Don't add it
}
}
return result;
}
/**
* Get the list of friends added to this region.
* @return Friends added to this region
*/
public Set<String> getFriendNames() {
HashSet<String> result = new HashSet<>();
for(UUID friend : getFriends()) {
OfflinePlayer player = Bukkit.getOfflinePlayer(friend);
if(player != null && player.getName() != null) {
result.add(player.getName());
}
}
return result;
}
/**
* Remove all friends that are added to this region.
*/
public void clearFriends() {
getRegion().setSetting("general.friends", null);
}
}
@@ -1,6 +0,0 @@
# Features
This package contains classes that represent a certain feature and implement it for all regions.
* `RegionFeature` represents a single feature, for each implementing class one instance is created without an assigned region, to listen for events etc, and an instance per region is created on-demand to handle region specific things.
* More features will be moved from `GeneralRegion` to these kind of classes, to keep all code for a feature together and cleanup `GeneralRegion`.
@@ -1,73 +0,0 @@
package me.wiefferink.areashop.features;
import me.wiefferink.areashop.AreaShop;
import me.wiefferink.areashop.regions.GeneralRegion;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.event.HandlerList;
import org.bukkit.event.Listener;
/*
Possible future feature classes:
- RestrictedToRegion feature
- rent/buy restricted to the region itself
- RestrictedToWorld feature
- rent/buy restricted to the world of the region
- CountLimitsFeature:
- Check region limits
- TimeLimitsFeatures:
- maxExtends
- maxRentTime
- SchematicFeature
- save/load schematics
- CommandsFeature
- execute commands after extend/rent/etc
- LandlordFeature
- manage landlords
- ExpirationWarningsFeature
- sending rental expiration warnings
*/
public abstract class RegionFeature implements Listener {
public static final AreaShop plugin = AreaShop.getInstance();
protected YamlConfiguration config = plugin.getConfig();
private GeneralRegion region;
/**
* Set the region for this feature.
* @param region Feature region
*/
public void setRegion(GeneralRegion region) {
this.region = region;
}
/**
* Get the region of this feature.
* @return region of this feature, or null if generic
*/
public GeneralRegion getRegion() {
return region;
}
/**
* Start listening to events.
*/
public void listen() {
plugin.getServer().getPluginManager().registerEvents(this, plugin);
}
/**
* Destroy the feature and deregister everything.
*/
public void shutdownFeature() {
HandlerList.unregisterAll(this);
shutdown();
}
/**
* Dummy method a RegionFeature implementation can override.
*/
public void shutdown() {
}
}
@@ -1,602 +0,0 @@
package me.wiefferink.areashop.features;
import com.sk89q.worldedit.math.BlockVector3;
import com.sk89q.worldguard.protection.regions.ProtectedRegion;
import io.papermc.lib.PaperLib;
import me.wiefferink.areashop.AreaShop;
import me.wiefferink.areashop.features.signs.RegionSign;
import me.wiefferink.areashop.features.signs.SignsFeature;
import me.wiefferink.areashop.handlers.worldguard.v7.WorldGuardHandler;
import me.wiefferink.areashop.interfaces.WorldGuardInterface;
import me.wiefferink.areashop.regions.GeneralRegion;
import me.wiefferink.areashop.tools.Utils;
import me.wiefferink.areashop.tools.Value;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.World;
import org.bukkit.block.Block;
import org.bukkit.block.BlockFace;
import org.bukkit.entity.Player;
import org.bukkit.util.Vector;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.concurrent.CompletableFuture;
public class TeleportFeature extends RegionFeature {
public TeleportFeature() {
}
public TeleportFeature(GeneralRegion region) {
setRegion(region);
}
/**
* Checks if a certain location is safe to teleport to.
*
* @param location The location to check
* @return true if it is safe, otherwise false
*/
private static boolean isSafe(Location location) {
Block feet = location.getBlock();
Block head = feet.getRelative(BlockFace.UP);
Block below = feet.getRelative(BlockFace.DOWN);
Block above = head.getRelative(BlockFace.UP);
// Check the block at the feet and head of the player
if ((feet.getType().isSolid() && !canSpawnIn(feet.getType())) || feet.isLiquid()) {
return false;
} else if ((head.getType().isSolid() && !canSpawnIn(head.getType())) || head.isLiquid()) {
return false;
} else if (!below.getType().isSolid() || cannotSpawnOn(below.getType()) || below.isLiquid()) {
return false;
} else if (above.isLiquid() || cannotSpawnBeside(above.getType())) {
return false;
}
// Get all blocks around the player (below foot level, foot level, head level and above head level)
Set<Material> around = new HashSet<>();
for (int y = 0; y <= 3; y++) {
for (int x = -1; x <= 1; x++) {
for (int z = -1; z <= 1; z++) {
// Skip blocks in the column of the player
if (x == 0 && z == 0) {
continue;
}
around.add(below.getRelative(x, y, z).getType());
}
}
}
// Check the blocks around the player
for (Material material : around) {
if (cannotSpawnBeside(material)) {
return false;
}
}
return true;
}
/**
* Check if a player can spawn in here.
*
* @param material Material to check (assumed that this is at the feet or head level)
* @return true when it is safe to spawn inside, otherwise false
*/
private static boolean canSpawnIn(Material material) {
String name = material.name();
return name.contains("DOOR")
|| name.contains("SIGN")
|| name.contains("PLATE") // Redstone plates
|| name.equals("DRAGON_EGG");
}
/**
* Check if a player can spawn on here.
*
* @param material Material to check (assumed that this is below the feet)
* @return true when it is safe to spawn on top of, otherwise false
*/
private static boolean cannotSpawnOn(Material material) {
String name = material.name();
return name.equals("CACTUS")
|| name.contains("PISTON")
|| name.contains("SIGN")
|| name.contains("DOOR")
|| name.contains("PLATE")
|| name.contains("REDSTONE_LAMP")
|| name.contains("FENCE")
|| name.contains("GLASS_PANE") || name.contains("THIN_GLASS")
|| name.equals("DRAGON_EGG")
|| name.contains("MAGMA");
}
/**
* Check if a player can spawn next to it.
*
* @param material Material to check (assumed that this is somewhere around the player)
* @return true when it is safe to spawn next to, otherwise false
*/
private static boolean cannotSpawnBeside(Material material) {
String name = material.name();
return name.contains("LAVA")
|| name.contains("CACTUS")
|| name.equals("FIRE")
|| name.contains("MAGMA");
}
/**
* Get the teleportlocation set for this region.
*
* @return The teleport location, or null if not set
*/
public Location getTeleportLocation() {
return Utils.configToLocation(getRegion().getConfigurationSectionSetting("general.teleportLocation"));
}
/**
* Check if the region has a teleportLocation specified.
*
* @return true if the region has a teleportlocation, false otherwise
*/
public boolean hasTeleportLocation() {
return getRegion().getConfigurationSectionSetting("general.teleportLocation") != null;
}
/**
* Set the teleport location of this region.
*
* @param location The location to set as teleport location
*/
public void setTeleport(Location location) {
if (location == null) {
getRegion().setSetting("general.teleportLocation", null);
} else {
getRegion().setSetting("general.teleportLocation", Utils.locationToConfig(location, true));
}
}
/**
* Teleport a player to the region or sign.
*
* @param player Player that should be teleported
* @param toSign true to teleport to the first sign of the region, false for teleporting to the region itself
* @param checkRestrictions Set to true if teleport permissions should be checked, false otherwise, also toggles cross-world check
* @return true if the teleport succeeded, otherwise false
*/
public CompletableFuture<Boolean> teleportPlayer(Player player, boolean toSign, boolean checkRestrictions) {
// Check basics
if (getRegion().getWorld() == null) {
getRegion().message(player, "general-noWorld");
return CompletableFuture.completedFuture(false);
}
if (getRegion().getRegion() == null) {
getRegion().message(player, "general-noRegion");
return CompletableFuture.completedFuture(false);
}
if (checkRestrictions) {
// Check correct world
if (!getRegion().getBooleanSetting("general.teleportCrossWorld") && !player.getWorld().equals(getRegion().getWorld())) {
getRegion().message(player, "teleport-wrongWorld", player.getWorld().getName());
return CompletableFuture.completedFuture(false);
}
boolean owner = player.getUniqueId().equals(getRegion().getOwner());
boolean friend = getRegion().getFriendsFeature().getFriends().contains(player.getUniqueId());
boolean available = getRegion().isAvailable();
// Teleport to sign instead if they dont have permission for teleporting to region
if ((!toSign && owner && !player.hasPermission("areashop.teleport") && player.hasPermission("areashop.teleportsign")
|| !toSign && !owner && !friend && !player.hasPermission("areashop.teleportall") && player.hasPermission("areashop.teleportsignall")
|| !toSign && !owner && friend && !player.hasPermission("areashop.teleportfriend") && player.hasPermission("areashop.teleportfriendsign")
|| !toSign && !owner && !friend && available && !player.hasPermission("areashop.teleportavailable") && player.hasPermission("areashop.teleportavailablesign"))) {
getRegion().message(player, "teleport-changedToSign");
toSign = true;
}
// Check permissions
if (owner && !available && !player.hasPermission("areashop.teleport") && !toSign) {
getRegion().message(player, "teleport-noPermission");
return CompletableFuture.completedFuture(false);
} else if (!owner && !available && !player.hasPermission("areashop.teleportall") && !toSign && !friend) {
getRegion().message(player, "teleport-noPermissionOther");
return CompletableFuture.completedFuture(false);
} else if (!owner && !available && !player.hasPermission("areashop.teleportfriend") && !toSign && friend) {
getRegion().message(player, "teleport-noPermissionFriend");
return CompletableFuture.completedFuture(false);
} else if (available && !player.hasPermission("areashop.teleportavailable") && !toSign) {
getRegion().message(player, "teleport-noPermissionAvailable");
return CompletableFuture.completedFuture(false);
} else if (owner && !available && !player.hasPermission("areashop.teleportsign") && toSign) {
getRegion().message(player, "teleport-noPermissionSign");
return CompletableFuture.completedFuture(false);
} else if (!owner && !available && !player.hasPermission("areashop.teleportsignall") && toSign && !friend) {
getRegion().message(player, "teleport-noPermissionOtherSign");
return CompletableFuture.completedFuture(false);
} else if (!owner && !available && !player.hasPermission("areashop.teleportfriendsign") && toSign && friend) {
getRegion().message(player, "teleport-noPermissionFriendSign");
return CompletableFuture.completedFuture(false);
} else if (available && !player.hasPermission("areashop.teleportavailablesign") && toSign) {
getRegion().message(player, "teleport-noPermissionAvailableSign");
return CompletableFuture.completedFuture(false);
}
}
// Get the starting location
Value<Boolean> toSignRef = new Value<>(toSign);
Location startLocation = getStartLocation(player, toSignRef);
toSign = toSignRef.get();
boolean insideRegion;
if (toSign) {
insideRegion = getRegion().getBooleanSetting("general.teleportToSignIntoRegion");
} else {
insideRegion = getRegion().getBooleanSetting("general.teleportIntoRegion");
}
// Check locations starting from startLocation and then a cube that increases
// radius around that (until no block in the region is found at all cube sides)
ProtectedRegion worldguardRegion = getRegion().getRegion();
boolean blocksInRegion = worldguardRegion.contains(startLocation.getBlockX(), startLocation.getBlockY(), startLocation.getBlockZ());
if (!blocksInRegion && insideRegion) {
getRegion().message(player, "teleport-blocked");
return CompletableFuture.completedFuture(false);
}
// Tracking of which sides to continue the search
final World world = getRegion().getWorld();
BlockVector3 min = worldguardRegion.getMinimumPoint();
BlockVector3 max = worldguardRegion.getMaximumPoint();
for (int x = min.getX(); x < max.getX(); x += 16) {
for (int z = min.getZ(); z < max.getZ(); z += 16) {
PaperLib.getChunkAtAsync(world, x >> 4, z >> 4);
}
}
CompletableFuture<Boolean> future = new CompletableFuture<>();
final boolean finalToSign = toSign;
Bukkit.getScheduler().runTaskLater(plugin, () -> {
boolean blocksInRegionCopy = blocksInRegion;
Location safeLocation = startLocation;
// Tries limit tracking
int radius = 1;
int checked = 1;
int maxTries = plugin.getConfig().getInt("maximumTries");
// Tracking of which sides to continue the search
boolean done = isSafe(safeLocation);
boolean northDone = false, eastDone = false, southDone = false, westDone = false, topDone = false, bottomDone = false;
boolean continueThisDirection;
while ((blocksInRegionCopy || !insideRegion) && !done) {
blocksInRegionCopy = false;
// North side
continueThisDirection = false;
for (int x = -radius + 1; x <= radius && !done && !northDone; x++) {
for (int y = -radius + 1; y < radius && !done; y++) {
safeLocation = startLocation.clone().add(x, y, -radius);
if (safeLocation.getBlockY() > 256 || safeLocation.getBlockY() < 0) {
continue;
}
if (worldguardRegion.contains(safeLocation.getBlockX(), safeLocation.getBlockY(), safeLocation.getBlockZ()) || !insideRegion) {
checked++;
done = isSafe(safeLocation) || checked > maxTries;
blocksInRegionCopy = true;
continueThisDirection = true;
}
}
}
northDone = northDone || !continueThisDirection;
// East side
continueThisDirection = false;
for (int z = -radius + 1; z <= radius && !done && !eastDone; z++) {
for (int y = -radius + 1; y < radius && !done; y++) {
safeLocation = startLocation.clone().add(radius, y, z);
if (safeLocation.getBlockY() > 256 || safeLocation.getBlockY() < 0) {
continue;
}
if (worldguardRegion.contains(safeLocation.getBlockX(), safeLocation.getBlockY(), safeLocation.getBlockZ()) || !insideRegion) {
checked++;
done = isSafe(safeLocation) || checked > maxTries;
blocksInRegionCopy = true;
continueThisDirection = true;
}
}
}
eastDone = eastDone || !continueThisDirection;
// South side
continueThisDirection = false;
for (int x = radius - 1; x >= -radius && !done && !southDone; x--) {
for (int y = -radius + 1; y < radius && !done; y++) {
safeLocation = startLocation.clone().add(x, y, radius);
if (safeLocation.getBlockY() > 256 || safeLocation.getBlockY() < 0) {
continue;
}
if (worldguardRegion.contains(safeLocation.getBlockX(), safeLocation.getBlockY(), safeLocation.getBlockZ()) || !insideRegion) {
checked++;
done = isSafe(safeLocation) || checked > maxTries;
blocksInRegionCopy = true;
continueThisDirection = true;
}
}
}
southDone = southDone || !continueThisDirection;
// West side
continueThisDirection = false;
for (int z = radius - 1; z >= -radius && !done && !westDone; z--) {
for (int y = -radius + 1; y < radius && !done; y++) {
safeLocation = startLocation.clone().add(-radius, y, z);
if (safeLocation.getBlockY() > 256 || safeLocation.getBlockY() < 0) {
continue;
}
if (worldguardRegion.contains(safeLocation.getBlockX(), safeLocation.getBlockY(), safeLocation.getBlockZ()) || !insideRegion) {
checked++;
done = isSafe(safeLocation) || checked > maxTries;
blocksInRegionCopy = true;
continueThisDirection = true;
}
}
}
westDone = westDone || !continueThisDirection;
// Top side
continueThisDirection = false;
// Middle block of the top
if ((startLocation.getBlockY() + radius) > 256) {
topDone = true;
}
if (!done && !topDone) {
safeLocation = startLocation.clone().add(0, radius, 0);
if (worldguardRegion.contains(safeLocation.getBlockX(), safeLocation.getBlockY(), safeLocation.getBlockZ()) || !insideRegion) {
checked++;
done = isSafe(safeLocation) || checked > maxTries;
blocksInRegionCopy = true;
continueThisDirection = true;
}
}
for (int r = 1; r <= radius && !done && !topDone; r++) {
// North
for (int x = -r + 1; x <= r && !done; x++) {
safeLocation = startLocation.clone().add(x, radius, -r);
if (worldguardRegion.contains(safeLocation.getBlockX(), safeLocation.getBlockY(), safeLocation.getBlockZ()) || !insideRegion) {
checked++;
done = isSafe(safeLocation) || checked > maxTries;
blocksInRegionCopy = true;
continueThisDirection = true;
}
}
// East
for (int z = -r + 1; z <= r && !done; z++) {
safeLocation = startLocation.clone().add(r, radius, z);
if (worldguardRegion.contains(safeLocation.getBlockX(), safeLocation.getBlockY(), safeLocation.getBlockZ()) || !insideRegion) {
checked++;
done = isSafe(safeLocation) || checked > maxTries;
blocksInRegionCopy = true;
continueThisDirection = true;
}
}
// South side
for (int x = r - 1; x >= -r && !done; x--) {
safeLocation = startLocation.clone().add(x, radius, r);
if (worldguardRegion.contains(safeLocation.getBlockX(), safeLocation.getBlockY(), safeLocation.getBlockZ()) || !insideRegion) {
checked++;
done = isSafe(safeLocation) || checked > maxTries;
blocksInRegionCopy = true;
continueThisDirection = true;
}
}
// West side
for (int z = r - 1; z >= -r && !done; z--) {
safeLocation = startLocation.clone().add(-r, radius, z);
if (worldguardRegion.contains(safeLocation.getBlockX(), safeLocation.getBlockY(), safeLocation.getBlockZ()) || !insideRegion) {
checked++;
done = isSafe(safeLocation) || checked > maxTries;
blocksInRegionCopy = true;
continueThisDirection = true;
}
}
}
topDone = topDone || !continueThisDirection;
// Bottom side
continueThisDirection = false;
// Middle block of the bottom
if (startLocation.getBlockY() - radius < 0) {
bottomDone = true;
}
if (!done && !bottomDone) {
safeLocation = startLocation.clone().add(0, -radius, 0);
if (worldguardRegion.contains(safeLocation.getBlockX(), safeLocation.getBlockY(), safeLocation.getBlockZ()) || !insideRegion) {
checked++;
done = isSafe(safeLocation) || checked > maxTries;
blocksInRegionCopy = true;
continueThisDirection = true;
}
}
for (int r = 1; r <= radius && !done && !bottomDone; r++) {
// North
for (int x = -r + 1; x <= r && !done; x++) {
safeLocation = startLocation.clone().add(x, -radius, -r);
if (worldguardRegion.contains(safeLocation.getBlockX(), safeLocation.getBlockY(), safeLocation.getBlockZ()) || !insideRegion) {
checked++;
done = isSafe(safeLocation) || checked > maxTries;
blocksInRegionCopy = true;
continueThisDirection = true;
}
}
// East
for (int z = -r + 1; z <= r && !done; z++) {
safeLocation = startLocation.clone().add(r, -radius, z);
if (worldguardRegion.contains(safeLocation.getBlockX(), safeLocation.getBlockY(), safeLocation.getBlockZ()) || !insideRegion) {
checked++;
done = isSafe(safeLocation) || checked > maxTries;
blocksInRegionCopy = true;
continueThisDirection = true;
}
}
// South side
for (int x = r - 1; x >= -r && !done; x--) {
safeLocation = startLocation.clone().add(x, -radius, r);
if (worldguardRegion.contains(safeLocation.getBlockX(), safeLocation.getBlockY(), safeLocation.getBlockZ()) || !insideRegion) {
checked++;
done = isSafe(safeLocation) || checked > maxTries;
blocksInRegionCopy = true;
continueThisDirection = true;
}
}
// West side
for (int z = r - 1; z >= -r && !done; z--) {
safeLocation = startLocation.clone().add(-r, -radius, z);
if (worldguardRegion.contains(safeLocation.getBlockX(), safeLocation.getBlockY(), safeLocation.getBlockZ()) || !insideRegion) {
checked++;
done = isSafe(safeLocation) || checked > maxTries;
blocksInRegionCopy = true;
continueThisDirection = true;
}
}
}
bottomDone = bottomDone || !continueThisDirection;
// Increase cube radius
radius++;
}
if (done && isSafe(safeLocation)) {
final SignsFeature feature = getRegion().getSignsFeature();
Collection<RegionSign> signs = feature.getSigns();
if (finalToSign) {
getRegion().message(player, "teleport-successSign");
// Let the player look at the sign
Vector playerVector = safeLocation.toVector();
playerVector.setY(playerVector.getY() + player.getEyeHeight(true));
final RegionSign first = signs.iterator().next();
Vector signVector = first.getLocation().add(0.5, 0.5, 0.5).toVector();
Vector direction = playerVector.clone().subtract(signVector).normalize();
safeLocation.setYaw(180 - (float) Math.toDegrees(Math.atan2(direction.getX(), direction.getZ())));
safeLocation.setPitch(90 - (float) Math.toDegrees(Math.acos(direction.getY())));
} else {
getRegion().message(player, "teleport-success");
}
AreaShop.debug("Found location: " + safeLocation.toString() + " Tries: " + checked);
PaperLib.teleportAsync(player, safeLocation).thenAccept(future::complete);
} else {
getRegion().message(player, "teleport-noSafe", checked, maxTries);
AreaShop.debug("No location found, checked " + checked + " spots of max " + maxTries);
future.complete(false);
}
}, 1);
return future;
}
/**
* Teleport a player to the region or sign when he has permissions for it.
*
* @param player Player that should be teleported
* @param toSign true to teleport to the first sign of the region, false for teleporting to the region itself
* @return true if the teleport succeeded, otherwise false
*/
public CompletableFuture<Boolean> teleportPlayer(Player player, boolean toSign) {
return teleportPlayer(player, toSign, true);
}
/**
* Teleport a player to the region when he has permissions for it.
*
* @param player Player that should be teleported
* @return true if the teleport succeeded, otherwise false
*/
public CompletableFuture<Boolean> teleportPlayer(Player player) {
return teleportPlayer(player, false, true);
}
/**
* Get the start location of a safe teleport search.
*
* @param player The player to get it for
* @param toSign true to try teleporting to the first sign, false for teleporting to the region
* @return The start location
*/
private Location getStartLocation(Player player, Value<Boolean> toSign) {
Location startLocation = null;
ProtectedRegion worldguardRegion = getRegion().getRegion();
// Try to get sign location
Collection<RegionSign> signs = getRegion().getSignsFeature().getSigns();
boolean signAvailable = !signs.isEmpty();
if (toSign.get()) {
RegionSign sign = signs.iterator().next();
if (signAvailable) {
// Use the location 1 below the sign to prevent weird spawing above the sign
startLocation = sign.getLocation(); //.subtract(0.0, 1.0, 0.0);
startLocation.setPitch(player.getLocation().getPitch());
startLocation.setYaw(player.getLocation().getYaw());
// Move player x blocks away from the sign
double distance = getRegion().getDoubleSetting("general.teleportSignDistance");
if (distance > 0) {
BlockFace facing = sign.getFacing();
Vector facingVector = new Vector(facing.getModX(), facing.getModY(), facing.getModZ())
.normalize()
.multiply(distance);
startLocation.setX(startLocation.getBlockX() + 0.5);
startLocation.setZ(startLocation.getBlockZ() + 0.5);
startLocation.add(facingVector);
}
} else {
// No sign available
getRegion().message(player, "teleport-changedToNoSign");
toSign.set(false);
}
}
// Use teleportation location that is set for the region
if (startLocation == null && hasTeleportLocation()) {
startLocation = getTeleportLocation();
}
// Calculate a default location
if (startLocation == null) {
final WorldGuardInterface handler = AreaShop.getInstance().getWorldGuardHandler();
// Set to block in the middle, y configured in the config
Vector regionMin = handler.getMinimumPoint(worldguardRegion);
Vector regionMax = handler.getMaximumPoint(worldguardRegion);
Vector middle = regionMin.clone().midpoint(regionMax);
String configSetting = getRegion().getStringSetting("general.teleportLocationY");
if ("bottom".equalsIgnoreCase(configSetting)) {
middle = middle.setY(regionMin.getBlockY());
} else if ("top".equalsIgnoreCase(configSetting)) {
middle = middle.setY(regionMax.getBlockY());
} else if ("middle".equalsIgnoreCase(configSetting)) {
middle = middle.setY(middle.getBlockY());
} else {
try {
int vertical = Integer.parseInt(configSetting);
middle = middle.setY(vertical);
} catch (NumberFormatException e) {
AreaShop.warn("Could not parse general.teleportLocationY: '" + configSetting + "'");
}
}
final Location location = player.getLocation();
startLocation = new Location(getRegion().getWorld(), middle.getX(), middle.getY(), middle.getZ(), location.getYaw(), location.getPitch());
}
// Set location in the center of the block
startLocation.setX(startLocation.getBlockX() + 0.5);
startLocation.setZ(startLocation.getBlockZ() + 0.5);
return startLocation;
}
}
@@ -1,265 +0,0 @@
package me.wiefferink.areashop.features;
import com.sk89q.worldguard.bukkit.WorldGuardPlugin;
import com.sk89q.worldguard.protection.flags.Flag;
import com.sk89q.worldguard.protection.flags.InvalidFlagFormat;
import com.sk89q.worldguard.protection.flags.RegionGroupFlag;
import com.sk89q.worldguard.protection.regions.ProtectedRegion;
import me.wiefferink.areashop.AreaShop;
import me.wiefferink.areashop.events.notify.UpdateRegionEvent;
import me.wiefferink.areashop.interfaces.RegionAccessSet;
import me.wiefferink.areashop.regions.GeneralRegion;
import me.wiefferink.interactivemessenger.processing.Message;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.event.EventHandler;
import java.util.Objects;
import java.util.Set;
import java.util.UUID;
public class WorldGuardRegionFlagsFeature extends RegionFeature {
@EventHandler
public void regionUpdate(UpdateRegionEvent event) {
updateRegionFlags(event.getRegion());
}
/**
* Set the region flags/options to the values of a ConfigurationSection.
* @param region The region to update the flags for
* @return true if the flags have been set correctly, otherwise false
*/
private boolean updateRegionFlags(GeneralRegion region) {
boolean result = true;
// Get section defining the region flag profile
ConfigurationSection flagProfileSection = region.getConfigurationSectionSetting("general.flagProfile", "flagProfiles");
if(flagProfileSection == null) {
return false;
}
// Region flags for all states
ConfigurationSection allFlags = flagProfileSection.getConfigurationSection("ALL");
if(allFlags != null) {
result = updateRegionFlags(region, allFlags);
}
// Region flags for the current state
ConfigurationSection stateFlags = flagProfileSection.getConfigurationSection(region.getState().getValue());
// If in reselling mode, fallback to 'resale' section if 'resell' is not found (legacy configuration problem: https://github.com/NLthijs48/AreaShop/issues/303)
if(stateFlags == null && region.getState() == GeneralRegion.RegionState.RESELL) {
stateFlags = flagProfileSection.getConfigurationSection("resale");
}
if(stateFlags != null) {
result &= updateRegionFlags(region, stateFlags);
}
return result;
}
/**
* Set the region flags/options to the values of a ConfigurationSection.
* @param region The region to update the flags for
* @param flags The flags to apply
* @return true if the flags have been set correctly, otherwise false
*/
private boolean updateRegionFlags(GeneralRegion region, ConfigurationSection flags) {
boolean result = true;
Set<String> flagNames = flags.getKeys(false);
WorldGuardPlugin worldGuard = plugin.getWorldGuard();
// Get the region
ProtectedRegion worldguardRegion = region.getRegion();
if(worldguardRegion == null) {
AreaShop.debug("Region '" + region.getName() + "' does not exist, setting flags failed");
return false;
}
// Loop through all flags that are set in the config
for(String flagName : flagNames) {
String value = Message.fromString(flags.getString(flagName)).replacements(region).getPlain();
// In the config normal Bukkit color codes are used, those only need to be translated on 5.X WorldGuard versions
if(plugin.getWorldGuard().getDescription().getVersion().startsWith("5.")) {
value = translateBukkitToWorldGuardColors(value);
}
if(flagName.equalsIgnoreCase("members")) {
plugin.getWorldGuardHandler().setMembers(worldguardRegion, parseAccessSet(value));
//AreaShop.debug(" Flag " + flagName + " set: " + members.toUserFriendlyString());
} else if(flagName.equalsIgnoreCase("owners")) {
plugin.getWorldGuardHandler().setOwners(worldguardRegion, parseAccessSet(value));
//AreaShop.debug(" Flag " + flagName + " set: " + owners.toUserFriendlyString());
} else if(flagName.equalsIgnoreCase("priority")) {
try {
int priority = Integer.parseInt(value);
if(worldguardRegion.getPriority() != priority) {
worldguardRegion.setPriority(priority);
}
//AreaShop.debug(" Flag " + flagName + " set: " + value);
} catch(NumberFormatException e) {
AreaShop.warn("The value of flag " + flagName + " is not a number");
result = false;
}
} else if(flagName.equalsIgnoreCase("parent")) {
if(region.getWorld() == null || plugin.getRegionManager(region.getWorld()) == null) {
continue;
}
ProtectedRegion parentRegion = plugin.getRegionManager(region.getWorld()).getRegion(value);
if(parentRegion != null) {
if(!parentRegion.equals(worldguardRegion.getParent())) {
try {
worldguardRegion.setParent(parentRegion);
//AreaShop.debug(" Flag " + flagName + " set: " + value);
} catch(ProtectedRegion.CircularInheritanceException e) {
AreaShop.warn("The parent set in the config is not correct (circular inheritance)");
}
}
} else {
AreaShop.warn("The parent set in the config is not correct (region does not exist)");
}
} else {
// Parse all other normal flags (groups are also handled)
String flagSetting = null;
com.sk89q.worldguard.protection.flags.RegionGroup groupValue = null;
Flag<?> foundFlag = plugin.getWorldGuardHandler().fuzzyMatchFlag(flagName);
if(foundFlag == null) {
AreaShop.warn("Found wrong flag in flagProfiles section: " + flagName + ", check if that is the correct WorldGuard flag");
continue;
}
RegionGroupFlag groupFlag = foundFlag.getRegionGroupFlag();
if(value == null || value.isEmpty()) {
if(worldguardRegion.getFlag(foundFlag) != null) {
worldguardRegion.setFlag(foundFlag, null);
}
if(groupFlag != null && worldguardRegion.getFlag(groupFlag) != null) {
worldguardRegion.setFlag(groupFlag, null);
}
//AreaShop.debug(" Flag " + flagName + " reset (+ possible group of flag)");
} else {
if(groupFlag == null) {
flagSetting = value;
} else {
for(String part : value.split(" ")) {
if(part.startsWith("g:")) {
if(part.length() > 2) {
try {
groupValue = plugin.getWorldGuardHandler().parseFlagGroupInput(groupFlag, part.substring(2));
} catch(InvalidFlagFormat e) {
AreaShop.warn("Found wrong group value for flag " + flagName);
}
}
} else {
if(flagSetting == null) {
flagSetting = part;
} else {
flagSetting += " " + part;
}
}
}
}
if(flagSetting != null) {
try {
setFlag(worldguardRegion, foundFlag, flagSetting);
//AreaShop.debug(" Flag " + flagName + " set: " + flagSetting);
} catch(InvalidFlagFormat e) {
AreaShop.warn("Found wrong value for flag " + flagName);
}
}
if(groupValue != null) {
if(groupValue == groupFlag.getDefault()) {
worldguardRegion.setFlag(groupFlag, null);
//AreaShop.debug(" Group of flag " + flagName + " set to default: " + groupValue);
} else {
worldguardRegion.setFlag(groupFlag, groupValue);
//AreaShop.debug(" Group of flag " + flagName + " set: " + groupValue);
}
}
}
}
}
// Indicate that the regions needs to be saved
if(worldGuard.getDescription().getVersion().startsWith("5.")) {
plugin.getFileManager().saveIsRequiredForRegionWorld(region.getWorldName());
}
return result;
}
/**
* Build an RegionAccessSet from an input that specifies player names, player uuids and groups.
* @param input Input string defining the access set
* @return RegionAccessSet containing the entities parsed from the input
*/
public RegionAccessSet parseAccessSet(String input) {
RegionAccessSet result = new RegionAccessSet();
String[] inputParts = input.split(", ");
for(String access : inputParts) {
if(access != null && !access.isEmpty()) {
// Check for groups
if(access.startsWith("g:")) {
if(access.length() > 2) {
result.getGroupNames().add(access.substring(2));
}
} else if(access.startsWith("n:")) {
if(access.length() > 2) {
result.getPlayerNames().add(access.substring(2));
}
} else {
try {
result.getPlayerUniqueIds().add(UUID.fromString(access));
} catch(IllegalArgumentException e) {
AreaShop.warn("Tried using '" + access + "' as uuid for a region member/owner, is your flagProfiles section correct?");
}
}
}
}
return result;
}
/**
* Set a WorldGuard region flag.
* @param region The WorldGuard region to set
* @param flag The flag to set
* @param value The value to set the flag to
* @param <V> They type of flag to set
* @throws InvalidFlagFormat When the value of the flag is wrong
*/
private <V> void setFlag(ProtectedRegion region, Flag<V> flag, String value) throws InvalidFlagFormat {
V current = region.getFlag(flag);
V next = plugin.getWorldGuardHandler().parseFlagInput(flag, value);
if(!Objects.equals(current, next)) {
region.setFlag(flag, next);
}
}
/**
* Translate the color codes you put in greeting/farewell messages to the weird color codes of WorldGuard.
* @param message The message where the color codes should be translated (this message has bukkit color codes)
* @return The string with the WorldGuard color codes
*/
private String translateBukkitToWorldGuardColors(String message) {
String result = message;
result = result.replace("&c", "&r");
result = result.replace("&4", "&R");
result = result.replace("&e", "&y");
result = result.replace("&6", "&Y");
result = result.replace("&a", "&g");
result = result.replace("&2", "&G");
result = result.replace("&b", "&c");
result = result.replace("&3", "&C");
result = result.replace("&9", "&b");
result = result.replace("&1", "&B");
result = result.replace("&d", "&p");
result = result.replace("&5", "&P");
result = result.replace("&0", "&0");
result = result.replace("&8", "&1");
result = result.replace("&7", "&2");
result = result.replace("&f", "&w");
result = result.replace("&r", "&x");
return result;
}
}
@@ -1,284 +0,0 @@
package me.wiefferink.areashop.features.signs;
import com.google.common.base.Objects;
import me.wiefferink.areashop.AreaShop;
import me.wiefferink.areashop.regions.GeneralRegion;
import me.wiefferink.areashop.tools.Materials;
import me.wiefferink.areashop.tools.Utils;
import me.wiefferink.interactivemessenger.processing.Message;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.block.BlockFace;
import org.bukkit.block.Sign;
import org.bukkit.block.data.BlockData;
import org.bukkit.block.data.type.WallSign;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.entity.Player;
import java.util.ArrayList;
import java.util.List;
/**
* Sign that is connected to a region to display information and interact with the region.
*/
public class RegionSign {
private final SignsFeature signsFeature;
private final String key;
public RegionSign(SignsFeature signsFeature, String key) {
this.signsFeature = signsFeature;
this.key = key;
}
/**
* Get the location of this sign.
*
* @return The location of this sign
*/
public Location getLocation() {
return Utils.configToLocation(getRegion().getConfig().getConfigurationSection("general.signs." + key + ".location"));
}
/**
* Location string to be used as key in maps.
*
* @return Location string
*/
public String getStringLocation() {
return SignsFeature.locationToString(getLocation());
}
/**
* Chunk string to be used as key in maps.
*
* @return Chunk string
*/
public String getStringChunk() {
return SignsFeature.chunkToString(getLocation());
}
/**
* Get the region this sign is linked to.
*
* @return The region this sign is linked to
*/
public GeneralRegion getRegion() {
return signsFeature.getRegion();
}
/**
* Remove this sign from the region.
*/
public void remove() {
getLocation().getBlock().setType(Material.AIR);
signsFeature.getSignsRef().remove(getStringLocation());
SignsFeature.getAllSigns().remove(getStringLocation());
SignsFeature.getSignsByChunk().get(getStringChunk()).remove(this);
getRegion().setSetting("general.signs." + key, null);
}
/**
* Get the ConfigurationSection defining the sign layout.
*
* @return The sign layout config
*/
public ConfigurationSection getProfile() {
return getRegion().getConfigurationSectionSetting("general.signProfile", "signProfiles", getRegion().getConfig().get("general.signs." + key + ".profile"));
}
/**
* Get the facing of the sign as saved in the config.
*
* @return BlockFace the sign faces, or null if unknown
*/
public BlockFace getFacing() {
try {
return BlockFace.valueOf(getRegion().getConfig().getString("general.signs." + key + ".facing"));
} catch (NullPointerException | IllegalArgumentException e) {
return null;
}
}
/**
* Get the material of the sign as saved in the config.
*
* @return Material of the sign, usually {@link Material#WALL_SIGN}, {@link Material#SIGN}, or one of the other wood types (different result for 1.13-), Material.AIR if none.
*/
public Material getMaterial() {
String name = getRegion().getConfig().getString("general.signs." + key + ".signType");
Material result = Materials.signNameToMaterial(name);
return result == null ? Material.AIR : result;
}
/**
* Update this sign.
*
* @return true if the update was successful, otherwise false
*/
public boolean update() {
// Ignore updates of signs in chunks that are not loaded
Location signLocation = getLocation();
if (signLocation == null
|| signLocation.getWorld() == null
|| !signLocation.getWorld().isChunkLoaded(signLocation.getBlockX() >> 4, signLocation.getBlockZ() >> 4)) {
return false;
}
if (getRegion().isDeleted()) {
return false;
}
YamlConfiguration regionConfig = getRegion().getConfig();
ConfigurationSection signConfig = getProfile();
Block block = signLocation.getBlock();
if (signConfig == null || !signConfig.isSet(getRegion().getState().getValue())) {
block.setType(Material.AIR);
return true;
}
ConfigurationSection stateConfig = signConfig.getConfigurationSection(getRegion().getState().getValue());
// Get the lines
String[] signLines = new String[4];
boolean signEmpty = true;
for (int i = 0; i < 4; i++) {
signLines[i] = stateConfig.getString("line" + (i + 1));
signEmpty &= (signLines[i] == null || signLines[i].isEmpty());
}
if (signEmpty) {
block.setType(Material.AIR);
return true;
}
// Place the sign back (with proper rotation and type) after it has been hidden or (indirectly) destroyed
if (!Materials.isSign(block.getType())) {
Material signType = getMaterial();
if (signType.name().contains("SIGN")) {
// Don't do physics here, we first need to update the direction
block.setType(signType, false);
BlockData data = block.getBlockData();
if (data instanceof WallSign) {
((WallSign) data).setFacing(getFacing());
} else if (data instanceof Sign) {
((org.bukkit.block.data.type.Sign) data).setRotation(getFacing());
}
block.setBlockData(data, true);
// Check if the sign has popped
if (!Materials.isSign(block.getType())) {
AreaShop.warn("Setting sign", key, "of region", getRegion().getName(), "failed, could not set sign block back");
return false;
}
} else {
AreaShop.warn("Setting sign", key, "of region", getRegion().getName(), "failed, RegionSign material was: " + signType.name());
}
}
// Save current rotation and type
if (!regionConfig.isString("general.signs." + key + ".signType")) {
getRegion().setSetting("general.signs." + key + ".signType", block.getType().name());
}
if (!regionConfig.isString("general.signs." + key + ".facing")) {
final BlockFace rotation;
if (Materials.isSign(block.getType())) {
BlockData data = block.getBlockData();
if (data instanceof org.bukkit.block.data.type.Sign) {
rotation = ((org.bukkit.block.data.type.Sign) block.getBlockData()).getRotation();
} else if (data instanceof WallSign) {
rotation = ((WallSign) data).getFacing();
} else {
rotation = null;
}
} else {
rotation = null;
}
getRegion().setSetting("general.signs." + key + ".facing", rotation == null ? null : rotation.toString());
}
// Apply replacements and color and then set it on the sign
Sign signState = (Sign) block.getState();
for (int i = 0; i < signLines.length; i++) {
if (signLines[i] == null) {
signState.setLine(i, "");
continue;
}
signLines[i] = Message.fromString(signLines[i]).replacements(getRegion()).getSingle();
signLines[i] = Utils.applyColors(signLines[i]);
signState.setLine(i, signLines[i]);
}
signState.update();
return true;
}
/**
* Check if the sign needs to update periodically.
*
* @return true if it needs periodic updates, otherwise false
*/
public boolean needsPeriodicUpdate() {
ConfigurationSection signConfig = getProfile();
if (signConfig == null || !signConfig.isSet(getRegion().getState().getValue().toLowerCase())) {
return false;
}
ConfigurationSection stateConfig = signConfig.getConfigurationSection(getRegion().getState().getValue().toLowerCase());
if (stateConfig == null) {
return false;
}
// Check the lines for the timeleft tag
for (int i = 1; i <= 4; i++) {
String line = stateConfig.getString("line" + i);
if (line != null && !line.isEmpty() && line.contains(Message.VARIABLE_START + AreaShop.tagTimeLeft + Message.VARIABLE_END)) {
return true;
}
}
return false;
}
/**
* Run commands when a player clicks a sign.
*
* @param clicker The player that clicked the sign
* @param clickType The type of clicking
* @return true if the commands ran successfully, false if any of them failed
*/
public boolean runSignCommands(Player clicker, GeneralRegion.ClickType clickType) {
ConfigurationSection signConfig = getProfile();
if (signConfig == null) {
return false;
}
ConfigurationSection stateConfig = signConfig.getConfigurationSection(getRegion().getState().getValue().toLowerCase());
// Run player commands if specified
List<String> playerCommands = new ArrayList<>();
for (String command : stateConfig.getStringList(clickType.getValue() + "Player")) {
// TODO move variable checking code to InteractiveMessenger?
playerCommands.add(command.replace(Message.VARIABLE_START + AreaShop.tagClicker + Message.VARIABLE_END, clicker.getName()));
}
getRegion().runCommands(clicker, playerCommands);
// Run console commands if specified
List<String> consoleCommands = new ArrayList<>();
for (String command : stateConfig.getStringList(clickType.getValue() + "Console")) {
consoleCommands.add(command.replace(Message.VARIABLE_START + AreaShop.tagClicker + Message.VARIABLE_END, clicker.getName()));
}
getRegion().runCommands(Bukkit.getConsoleSender(), consoleCommands);
return !playerCommands.isEmpty() || !consoleCommands.isEmpty();
}
@Override
public boolean equals(Object object) {
return object instanceof RegionSign && ((RegionSign) object).getRegion().equals(this.getRegion()) && ((RegionSign) object).key.equals(this.key);
}
@Override
public int hashCode() {
return Objects.hashCode(key, getRegion().getName());
}
}
@@ -1,636 +0,0 @@
package me.wiefferink.areashop.features.signs;
import com.sk89q.worldguard.protection.managers.RegionManager;
import com.sk89q.worldguard.protection.regions.ProtectedRegion;
import me.wiefferink.areashop.AreaShop;
import me.wiefferink.areashop.events.ask.AddingRegionEvent;
import me.wiefferink.areashop.events.notify.UpdateRegionEvent;
import me.wiefferink.areashop.features.RegionFeature;
import me.wiefferink.areashop.managers.FileManager;
import me.wiefferink.areashop.regions.BuyRegion;
import me.wiefferink.areashop.regions.GeneralRegion;
import me.wiefferink.areashop.regions.RentRegion;
import me.wiefferink.areashop.tools.Materials;
import me.wiefferink.areashop.tools.Utils;
import org.bukkit.Bukkit;
import org.bukkit.Chunk;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.block.BlockFace;
import org.bukkit.block.data.BlockData;
import org.bukkit.block.data.type.Sign;
import org.bukkit.block.data.type.WallSign;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.block.Action;
import org.bukkit.event.block.BlockBreakEvent;
import org.bukkit.event.block.BlockPhysicsEvent;
import org.bukkit.event.block.SignChangeEvent;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.event.world.ChunkLoadEvent;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
public class SignsFeature extends RegionFeature {
private static final Map<String, RegionSign> allSigns = new ConcurrentHashMap<>();
private static final Map<String, List<RegionSign>> signsByChunk = new ConcurrentHashMap<>();
private Map<String, RegionSign> signs;
public SignsFeature() {
}
/**
* Constructor.
*
* @param region The region to bind to
*/
public SignsFeature(GeneralRegion region) {
setRegion(region);
signs = new HashMap<>();
// Setup current signs
ConfigurationSection signSection = region.getConfig().getConfigurationSection("general.signs");
if (signSection != null) {
for (String signKey : signSection.getKeys(false)) {
RegionSign sign = new RegionSign(this, signKey);
Location location = sign.getLocation();
if (location == null) {
AreaShop.warn("Sign with key " + signKey + " of region " + region.getName() + " does not have a proper location");
continue;
}
signs.put(sign.getStringLocation(), sign);
signsByChunk.computeIfAbsent(sign.getStringChunk(), key -> new ArrayList<>())
.add(sign);
}
allSigns.putAll(signs);
}
}
/**
* Convert a location to a string to use as map key.
*
* @param location The location to get the key for
* @return A string to use in a map for a location
*/
public static String locationToString(Location location) {
return location.getWorld().getName() + ";" + location.getBlockX() + ";" + location.getBlockY() + ";" + location.getBlockZ();
}
/**
* Convert a chunk to a string to use as map key.
*
* @param location The location to get the key for
* @return A string to use in a map for a chunk
*/
public static String chunkToString(Location location) {
return location.getWorld().getName() + ";" + (location.getBlockX() >> 4) + ";" + (location.getBlockZ() >> 4);
}
/**
* Convert a chunk to a string to use as map key.
* Use a Location argument to prevent chunk loading!
*
* @param chunk The location to get the key for
* @return A string to use in a map for a chunk
*/
public static String chunkToString(Chunk chunk) {
return chunk.getWorld().getName() + ";" + chunk.getX() + ";" + chunk.getZ();
}
/**
* Get a sign by a location.
*
* @param location The location to get the sign for
* @return The RegionSign that is at the location, or null if none
*/
public static RegionSign getSignByLocation(Location location) {
return allSigns.get(locationToString(location));
}
/**
* Get the map with all signs.
*
* @return Map with all signs: locationString -&gt; RegionSign
*/
public static Map<String, RegionSign> getAllSigns() {
return allSigns;
}
/**
* Get the map with signs by chunk.
*
* @return Map with signs by chunk: chunkString -&gt; List&lt;RegionSign&gt;
*/
public static Map<String, List<RegionSign>> getSignsByChunk() {
return signsByChunk;
}
@Override
public void shutdown() {
// Deregister signs from the registry
if (signs != null) {
for (Map.Entry<String, RegionSign> entry : signs.entrySet()) {
allSigns.remove(entry.getKey());
signsByChunk.get(entry.getValue().getStringChunk()).remove(entry.getValue());
}
}
}
@EventHandler(priority = EventPriority.HIGH)
public void onSignBreak(BlockBreakEvent event) {
if (event.isCancelled()) {
return;
}
Block block = event.getBlock();
// Check if it is a sign
if (Materials.isSign(block.getType())) {
// Check if the rent sign is really the same as a saved rent
RegionSign regionSign = SignsFeature.getSignByLocation(block.getLocation());
if (regionSign == null) {
return;
}
// Remove the sign of the rental region if the player has permission
if (event.getPlayer().hasPermission("areashop.delsign")) {
regionSign.remove();
plugin.message(event.getPlayer(), "delsign-success", regionSign.getRegion());
} else { // Cancel the breaking of the sign
event.setCancelled(true);
plugin.message(event.getPlayer(), "delsign-noPermission", regionSign.getRegion());
}
}
}
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void onIndirectSignBreak(BlockPhysicsEvent event) {
// Check if the block is a sign
if (!Materials.isSign(event.getBlock().getType())) {
return;
}
final Block block = event.getBlock();
final BlockData blockData = block.getBlockData();
final Block attachedBlock;
if (blockData instanceof WallSign) {
attachedBlock = block.getRelative(((WallSign) blockData).getFacing().getOppositeFace());
} else if (blockData instanceof Sign) {
attachedBlock = block.getRelative(BlockFace.DOWN);
} else {
attachedBlock = null;
}
// Check if still attached to a block
// TODO: signs cannot be placed on all blocks, improve this check to isSolid()?
if (attachedBlock == null || attachedBlock.getType() != Material.AIR) {
return;
}
// Check if the sign is really the same as a saved rent
RegionSign regionSign = SignsFeature.getSignByLocation(event.getBlock().getLocation());
if (regionSign == null) {
return;
}
// Remove the sign so that it does not fall on the floor as an item (next region update will place it back when possible)
AreaShop.debug("onIndirectSignBreak: Removed block of sign for", regionSign.getRegion().getName(), "at", regionSign.getStringLocation());
event.getBlock().setType(Material.AIR);
event.setCancelled(true);
}
@EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true)
public void onSignClick(PlayerInteractEvent event) {
Block block = event.getClickedBlock();
if (block == null) {
return;
}
// Only listen to left and right clicks on blocks
if (!(event.getAction() == Action.RIGHT_CLICK_BLOCK || event.getAction() == Action.LEFT_CLICK_BLOCK)) {
return;
}
// Only care about clicking blocks
if (!Materials.isSign(block.getType())) {
return;
}
// Check if this sign belongs to a region
RegionSign regionSign = SignsFeature.getSignByLocation(block.getLocation());
if (regionSign == null) {
return;
}
// Ignore players that are in sign link mode (which will handle the event itself)
Player player = event.getPlayer();
if (plugin.getSignlinkerManager().isInSignLinkMode(player)) {
return;
}
// Get the clicktype
GeneralRegion.ClickType clickType = null;
if (player.isSneaking() && event.getAction() == Action.LEFT_CLICK_BLOCK) {
clickType = GeneralRegion.ClickType.SHIFTLEFTCLICK;
} else if (!player.isSneaking() && event.getAction() == Action.LEFT_CLICK_BLOCK) {
clickType = GeneralRegion.ClickType.LEFTCLICK;
} else if (player.isSneaking() && event.getAction() == Action.RIGHT_CLICK_BLOCK) {
clickType = GeneralRegion.ClickType.SHIFTRIGHTCLICK;
} else if (!player.isSneaking() && event.getAction() == Action.RIGHT_CLICK_BLOCK) {
clickType = GeneralRegion.ClickType.RIGHTCLICK;
}
boolean ran = regionSign.runSignCommands(player, clickType);
// Only cancel event if at least one command has been executed
event.setCancelled(ran);
}
@EventHandler(priority = EventPriority.MONITOR)
public void onSignChange(SignChangeEvent event) {
if (event.isCancelled()) {
return;
}
Player player = event.getPlayer();
if (!plugin.isReady()) {
plugin.message(player, "general-notReady");
return;
}
final BlockFace rotation;
final BlockData data = event.getBlock().getBlockData();
if (data instanceof Sign) {
rotation = ((Sign) data).getRotation();
} else if (data instanceof WallSign) {
rotation = ((WallSign) data).getFacing();
} else {
rotation = null;
}
final String line0 = event.getLine(0) == null ? "" : event.getLine(0);
// Check if the sign is meant for this plugin
if (line0.contains(plugin.getConfig().getString("signTags.rent"))) {
if (!player.hasPermission("areashop.createrent") && !player.hasPermission("areashop.createrent.member") && !player.hasPermission("areashop.createrent.owner")) {
plugin.message(player, "setup-noPermissionRent");
return;
}
// Get the other lines
String secondLine = event.getLine(1);
String thirdLine = event.getLine(2);
String fourthLine = event.getLine(3);
// Get the regionManager for accessing regions
RegionManager regionManager = plugin.getRegionManager(event.getPlayer().getWorld());
// If the secondLine does not contain a name try to find the region by location
if (secondLine == null || secondLine.isEmpty()) {
Set<ProtectedRegion> regions = plugin.getWorldGuardHandler().getApplicableRegionsSet(event.getBlock().getLocation());
if (regions != null) {
boolean first = true;
ProtectedRegion candidate = null;
for (ProtectedRegion pr : regions) {
if (first) {
candidate = pr;
first = false;
} else {
if (pr.getPriority() > candidate.getPriority()) {
candidate = pr;
} else if (pr.getParent() != null && pr.getParent().equals(candidate)) {
candidate = pr;
} else {
plugin.message(player, "setup-couldNotDetect", candidate.getId(), pr.getId());
return;
}
}
}
if (candidate != null) {
secondLine = candidate.getId();
}
}
}
boolean priceSet = fourthLine != null && !fourthLine.isEmpty();
boolean durationSet = thirdLine != null && !thirdLine.isEmpty();
// check if all the lines are correct
if (secondLine == null || secondLine.isEmpty()) {
plugin.message(player, "setup-noRegion");
return;
}
ProtectedRegion region = regionManager.getRegion(secondLine);
if (region == null) {
plugin.message(player, "cmd-noRegion", secondLine);
return;
}
FileManager.AddResult addResult = plugin.getFileManager().checkRegionAdd(player, regionManager.getRegion(secondLine), event.getPlayer().getWorld(), GeneralRegion.RegionType.RENT);
switch (addResult) {
case BLACKLISTED:
plugin.message(player, "setup-blacklisted", secondLine);
break;
case ALREADYADDED:
plugin.message(player, "setup-alreadyRentSign");
break;
case ALREADYADDEDOTHERWORLD:
plugin.message(player, "setup-alreadyOtherWorld");
break;
case NOPERMISSION:
plugin.message(player, "setup-noPermission", secondLine);
break;
default:
if (thirdLine != null && !thirdLine.isEmpty() && !Utils.checkTimeFormat(thirdLine)) {
plugin.message(player, "setup-wrongDuration");
break;
}
double price = 0.0;
if (priceSet) {
// Check the fourth line
try {
price = Double.parseDouble(fourthLine);
} catch (NumberFormatException e) {
plugin.message(player, "setup-wrongPrice");
return;
}
}
// Add rent to the FileManager
final RentRegion rent = new RentRegion(secondLine, event.getPlayer().getWorld());
boolean isMember = plugin.getWorldGuardHandler().containsMember(rent.getRegion(), player.getUniqueId());
boolean isOwner = plugin.getWorldGuardHandler().containsOwner(rent.getRegion(), player.getUniqueId());
boolean landlord = (!player.hasPermission("areashop.createrent")
&& ((player.hasPermission("areashop.createrent.owner") && isOwner)
|| (player.hasPermission("areashop.createrent.member") && isMember)));
if (landlord) {
rent.setLandlord(player.getUniqueId(), player.getName());
}
if (priceSet) {
rent.setPrice(price);
}
if (durationSet) {
rent.setDuration(thirdLine);
}
rent.getSignsFeature().addSign(event.getBlock().getLocation(), event.getBlock().getType(), rotation, null);
AddingRegionEvent addingRegionEvent = plugin.getFileManager().addRegion(rent);
if (addingRegionEvent.isCancelled()) {
plugin.message(player, "general-cancelled", addingRegionEvent.getReason());
return;
}
rent.handleSchematicEvent(GeneralRegion.RegionEvent.CREATED);
plugin.message(player, "setup-rentSuccess", rent);
// Update the region after the event has written its lines
Bukkit.getScheduler().runTask(plugin, rent::update);
}
} else if (line0.contains(plugin.getConfig().getString("signTags.buy"))) {
// Check for permission
if (!player.hasPermission("areashop.createbuy") && !player.hasPermission("areashop.createbuy.member") && !player.hasPermission("areashop.createbuy.owner")) {
plugin.message(player, "setup-noPermissionBuy");
return;
}
// Get the other lines
String secondLine = event.getLine(1);
String thirdLine = event.getLine(2);
// Get the regionManager for accessing regions
RegionManager regionManager = plugin.getRegionManager(event.getPlayer().getWorld());
// If the secondLine does not contain a name try to find the region by location
if (secondLine == null || secondLine.isEmpty()) {
Set<ProtectedRegion> regions = plugin.getWorldGuardHandler().getApplicableRegionsSet(event.getBlock().getLocation());
if (regions != null) {
boolean first = true;
ProtectedRegion candidate = null;
for (ProtectedRegion pr : regions) {
if (first) {
candidate = pr;
first = false;
} else {
if (pr.getPriority() > candidate.getPriority()) {
candidate = pr;
} else if (pr.getParent() != null && pr.getParent().equals(candidate)) {
candidate = pr;
} else {
plugin.message(player, "setup-couldNotDetect", candidate.getId(), pr.getId());
return;
}
}
}
if (candidate != null) {
secondLine = candidate.getId();
}
}
}
boolean priceSet = thirdLine != null && !thirdLine.isEmpty();
// Check if all the lines are correct
if (secondLine == null || secondLine.isEmpty()) {
plugin.message(player, "setup-noRegion");
return;
}
ProtectedRegion region = regionManager.getRegion(secondLine);
if (region == null) {
plugin.message(player, "cmd-noRegion", secondLine);
return;
}
FileManager.AddResult addResult = plugin.getFileManager().checkRegionAdd(player, region, event.getPlayer().getWorld(), GeneralRegion.RegionType.BUY);
if (addResult == FileManager.AddResult.BLACKLISTED) {
plugin.message(player, "setup-blacklisted", secondLine);
} else if (addResult == FileManager.AddResult.ALREADYADDED) {
plugin.message(player, "setup-alreadyRentSign");
} else if (addResult == FileManager.AddResult.ALREADYADDEDOTHERWORLD) {
plugin.message(player, "setup-alreadyOtherWorld");
} else if (addResult == FileManager.AddResult.NOPERMISSION) {
plugin.message(player, "setup-noPermission", secondLine);
} else {
double price = 0.0;
if (priceSet) {
// Check the fourth line
try {
price = Double.parseDouble(thirdLine);
} catch (NumberFormatException e) {
plugin.message(player, "setup-wrongPrice");
return;
}
}
// Add buy to the FileManager
final BuyRegion buy = new BuyRegion(secondLine, event.getPlayer().getWorld());
boolean isMember = plugin.getWorldGuardHandler().containsMember(buy.getRegion(), player.getUniqueId());
boolean isOwner = plugin.getWorldGuardHandler().containsOwner(buy.getRegion(), player.getUniqueId());
boolean landlord = (!player.hasPermission("areashop.createbuy")
&& ((player.hasPermission("areashop.createbuy.owner") && isOwner)
|| (player.hasPermission("areashop.createbuy.member") && isMember)));
if (landlord) {
buy.setLandlord(player.getUniqueId(), player.getName());
}
if (priceSet) {
buy.setPrice(price);
}
buy.getSignsFeature().addSign(event.getBlock().getLocation(), event.getBlock().getType(), rotation, null);
AddingRegionEvent addingRegionEvent = plugin.getFileManager().addRegion(buy);
if (addingRegionEvent.isCancelled()) {
plugin.message(player, "general-cancelled", addingRegionEvent.getReason());
return;
}
buy.handleSchematicEvent(GeneralRegion.RegionEvent.CREATED);
plugin.message(player, "setup-buySuccess", buy);
// Update the region after the event has written its lines
Bukkit.getScheduler().runTask(plugin, buy::update);
}
} else if (event.getLine(0).contains(plugin.getConfig().getString("signTags.add"))) {
// Check for permission
if (!player.hasPermission("areashop.addsign")) {
plugin.message(player, "addsign-noPermission");
return;
}
// Get the other lines
String secondLine = event.getLine(1);
String thirdLine = event.getLine(2);
GeneralRegion region;
if (secondLine != null && !secondLine.isEmpty()) {
// Get region by secondLine of the sign
region = plugin.getFileManager().getRegion(secondLine);
if (region == null) {
plugin.message(player, "addSign-notRegistered", secondLine);
return;
}
} else {
// Get region by sign position
List<GeneralRegion> regions = Utils.getImportantRegions(event.getBlock().getLocation());
if (regions.isEmpty()) {
plugin.message(player, "addsign-noRegions");
return;
} else if (regions.size() > 1) {
plugin.message(player, "addsign-couldNotDetectSign", regions.get(0).getName(), regions.get(1).getName());
return;
}
region = regions.get(0);
}
String profile = thirdLine == null || thirdLine.isEmpty() ? null : thirdLine;
region.getSignsFeature().addSign(event.getBlock().getLocation(), event.getBlock().getType(), rotation, profile);
if (profile == null) {
plugin.message(player, "addsign-success", region);
} else {
plugin.message(player, "addsign-successProfile", thirdLine, region);
}
// Update the region later because this event will do it first
Bukkit.getScheduler().runTask(plugin, region::update);
}
}
@EventHandler
public void regionUpdate(UpdateRegionEvent event) {
event.getRegion().getSignsFeature().update();
}
@EventHandler(priority = EventPriority.MONITOR)
public void onChunkLoad(ChunkLoadEvent event) {
List<RegionSign> chunkSigns = signsByChunk.get(chunkToString(event.getChunk()));
if (chunkSigns == null) {
return;
}
int batchSize = Math.max(chunkSigns.size() / 10, 10);
Utils.runAsBatches(chunkSigns, batchSize, RegionSign::update, false);
}
/**
* Update all signs connected to this region.
*
* @return true if all signs are updated correctly, false if one or more updates failed
*/
public boolean update() {
boolean result = true;
for (RegionSign sign : signs.values()) {
result &= sign.update();
}
return result;
}
/**
* Check if any of the signs need periodic updating.
*
* @return true if one or more of the signs need periodic updating, otherwise false
*/
public boolean needsPeriodicUpdate() {
for (RegionSign sign : signs.values()) {
if (sign.needsPeriodicUpdate()) {
return true;
}
}
return false;
}
/**
* Get the signs of this region.
*
* @return List of signs
*/
public Collection<RegionSign> getSigns() {
return new HashSet<>(signs.values());
}
/**
* Get the signs of this region.
*
* @return Map with signs: locationString -&gt; RegionSign
*/
Map<String, RegionSign> getSignsRef() {
return signs;
}
/**
* Get a list with all sign locations.
*
* @return A List with all sign locations
*/
public List<Location> getSignLocations() {
List<Location> result = new ArrayList<>();
for (RegionSign sign : signs.values()) {
result.add(sign.getLocation());
}
return result;
}
/**
* Add a sign to this region.
*
* @param location The location of the sign
* @param signType The type of the sign (WALL_SIGN or SIGN_POST)
* @param facing The orientation of the sign
* @param profile The profile to use with this sign (null for default)
*/
public void addSign(Location location, Material signType, BlockFace facing, String profile) {
int i = 0;
while (getRegion().getConfig().isSet("general.signs." + i)) {
i++;
}
String signPath = "general.signs." + i + ".";
getRegion().setSetting(signPath + "location", Utils.locationToConfig(location));
getRegion().setSetting(signPath + "facing", facing != null ? facing.name() : null);
getRegion().setSetting(signPath + "signType", signType != null ? signType.name() : null);
if (profile != null && !profile.isEmpty()) {
getRegion().setSetting(signPath + "profile", profile);
}
// Add to the map
RegionSign sign = new RegionSign(this, i + "");
signs.put(sign.getStringLocation(), sign);
allSigns.put(sign.getStringLocation(), sign);
signsByChunk.computeIfAbsent(sign.getStringChunk(), key -> new ArrayList<>())
.add(sign);
}
}
@@ -1,165 +0,0 @@
package me.wiefferink.areashop.listeners;
import me.wiefferink.areashop.AreaShop;
import me.wiefferink.areashop.regions.BuyRegion;
import me.wiefferink.areashop.regions.GeneralRegion;
import me.wiefferink.areashop.regions.RentRegion;
import me.wiefferink.areashop.regions.TransactionalRegion;
import me.wiefferink.areashop.tools.Utils;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerKickEvent;
import org.bukkit.event.player.PlayerLoginEvent;
import org.bukkit.event.player.PlayerLoginEvent.Result;
import org.bukkit.event.player.PlayerQuitEvent;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
/**
* Notify region expiry and track activity time.
*/
public final class PlayerLoginLogoutListener implements Listener {
private final AreaShop plugin;
/**
* Constructor.
*
* @param plugin The AreaShop plugin
*/
public PlayerLoginLogoutListener(AreaShop plugin) {
this.plugin = plugin;
}
/**
* Called when a sign is changed.
*
* @param event The event
*/
@EventHandler(priority = EventPriority.MONITOR)
public void onPlayerLogin(PlayerLoginEvent event) {
if (event.getResult() != Result.ALLOWED) {
return;
}
final Player player = event.getPlayer();
// Schedule task to check for notifications, prevents a lag spike at login
Utils.runCancellingTaskTimer(() -> {
// Delay until all regions are loaded
if (!plugin.isReady()) {
return true;
}
if (!player.isOnline()) {
return false;
}
// Notify for rents that almost run out
for (GeneralRegion generalRegion : plugin.getFileManager().getRegions()) {
if (!(generalRegion instanceof RentRegion)) {
continue;
}
final RentRegion region = (RentRegion) generalRegion;
if (region.isTransactionHolder(player)) {
String warningSetting = region.getStringSetting("rent.warningOnLoginTime");
if (warningSetting == null || warningSetting.isEmpty()) {
continue;
}
long warningTime = Utils.durationStringToLong(warningSetting);
if (region.getTimeLeft() < warningTime) {
// Send the warning message later to let it appear after general MOTD messages
AreaShop.getInstance().message(player, "rent-expireWarning", region);
}
}
}
// Notify admins for plugin updates
AreaShop.getInstance().notifyUpdate(player);
return false;
}, 25, 25, false);
// Check if the player has regions that use an old name of him and update them
Utils.runCancellingTaskTimer(() -> {
if (!plugin.isReady()) {
return true;
}
List<GeneralRegion> regions = new LinkedList<>();
for (GeneralRegion region : plugin.getFileManager().getRegions()) {
if (region instanceof TransactionalRegion && ((TransactionalRegion) region).isTransactionHolder(player)) {
regions.add(region);
}
}
final String name = player.getName();
Utils.runAsBatches(regions,
plugin.getConfig().getInt("nameupdate.regionsPerTick"),
(region) -> {
if (region instanceof BuyRegion || region instanceof RentRegion) {
String key = region instanceof BuyRegion ? "buy.buyerName" : "rent.renterName";
if (!name.equals(region.getStringSetting("buy.buyerName"))) {
region.setSetting(key, player.getName());
region.update();
}
}
}, false);
return false;
}, 22, 10, false);
}
// Active time updates
@EventHandler(priority = EventPriority.MONITOR)
public void onPlayerLogout(PlayerQuitEvent event) {
updateLastActive(event.getPlayer());
}
@EventHandler(priority = EventPriority.MONITOR)
public void onPlayerKick(PlayerKickEvent event) {
updateLastActive(event.getPlayer());
}
/**
* Update the last active time for all regions the player is owner off.
*
* @param player The player to update the active times for
*/
private void updateLastActive(Player player) {
for (GeneralRegion region : plugin.getFileManager().getRegions()) {
if (region instanceof TransactionalRegion && ((TransactionalRegion) region).isTransactionHolder(player)) {
region.updateLastActiveTime();
}
}
}
}
@@ -1,221 +0,0 @@
package me.wiefferink.areashop.managers;
import me.wiefferink.areashop.commands.AddCommand;
import me.wiefferink.areashop.commands.AddfriendCommand;
import me.wiefferink.areashop.commands.AddsignCommand;
import me.wiefferink.areashop.commands.BuyCommand;
import me.wiefferink.areashop.commands.CommandAreaShop;
import me.wiefferink.areashop.commands.DelCommand;
import me.wiefferink.areashop.commands.DelfriendCommand;
import me.wiefferink.areashop.commands.DelsignCommand;
import me.wiefferink.areashop.commands.FindCommand;
import me.wiefferink.areashop.commands.GroupaddCommand;
import me.wiefferink.areashop.commands.GroupdelCommand;
import me.wiefferink.areashop.commands.GroupinfoCommand;
import me.wiefferink.areashop.commands.GrouplistCommand;
import me.wiefferink.areashop.commands.HelpCommand;
import me.wiefferink.areashop.commands.ImportCommand;
import me.wiefferink.areashop.commands.InfoCommand;
import me.wiefferink.areashop.commands.LinksignsCommand;
import me.wiefferink.areashop.commands.MeCommand;
import me.wiefferink.areashop.commands.MessageCommand;
import me.wiefferink.areashop.commands.ReloadCommand;
import me.wiefferink.areashop.commands.RentCommand;
import me.wiefferink.areashop.commands.ResellCommand;
import me.wiefferink.areashop.commands.SchematiceventCommand;
import me.wiefferink.areashop.commands.SellCommand;
import me.wiefferink.areashop.commands.SetdurationCommand;
import me.wiefferink.areashop.commands.SetlandlordCommand;
import me.wiefferink.areashop.commands.SetownerCommand;
import me.wiefferink.areashop.commands.SetpriceCommand;
import me.wiefferink.areashop.commands.SetrestoreCommand;
import me.wiefferink.areashop.commands.SetteleportCommand;
import me.wiefferink.areashop.commands.StackCommand;
import me.wiefferink.areashop.commands.StopresellCommand;
import me.wiefferink.areashop.commands.TeleportCommand;
import me.wiefferink.areashop.commands.UnrentCommand;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.command.TabCompleter;
import java.util.ArrayList;
import java.util.List;
import java.util.SortedSet;
import java.util.TreeSet;
public class CommandManager extends Manager implements CommandExecutor, TabCompleter {
private final ArrayList<CommandAreaShop> commands;
/**
* Constructor.
*/
public CommandManager() {
commands = new ArrayList<>();
commands.add(new HelpCommand());
commands.add(new RentCommand());
commands.add(new UnrentCommand());
commands.add(new BuyCommand());
commands.add(new SellCommand());
commands.add(new MeCommand());
commands.add(new InfoCommand());
commands.add(new TeleportCommand());
commands.add(new SetteleportCommand());
commands.add(new AddfriendCommand());
commands.add(new DelfriendCommand());
commands.add(new FindCommand());
commands.add(new ResellCommand());
commands.add(new StopresellCommand());
commands.add(new SetrestoreCommand());
commands.add(new SetpriceCommand());
commands.add(new SetownerCommand());
commands.add(new SetdurationCommand());
commands.add(new ReloadCommand());
commands.add(new GroupaddCommand());
commands.add(new GroupdelCommand());
commands.add(new GrouplistCommand());
commands.add(new GroupinfoCommand());
commands.add(new SchematiceventCommand());
commands.add(new AddCommand());
commands.add(new DelCommand());
commands.add(new AddsignCommand());
commands.add(new DelsignCommand());
commands.add(new LinksignsCommand());
commands.add(new StackCommand());
commands.add(new SetlandlordCommand());
commands.add(new MessageCommand());
commands.add(new ImportCommand());
// Register commands in bukkit
plugin.getCommand("AreaShop").setExecutor(this);
plugin.getCommand("AreaShop").setTabCompleter(this);
}
/**
* Get the list with AreaShop commands.
* @return The list with AreaShop commands
*/
public List<CommandAreaShop> getCommands() {
return commands;
}
/**
* Shows the help page for the CommandSender.
* @param target The CommandSender to show the help to
*/
public void showHelp(CommandSender target) {
if(!target.hasPermission("areashop.help")) {
plugin.message(target, "help-noPermission");
return;
}
// Add all messages to a list
ArrayList<String> messages = new ArrayList<>();
plugin.message(target, "help-header");
plugin.message(target, "help-alias");
for(CommandAreaShop command : commands) {
String help = command.getHelp(target);
if(help != null && !help.isEmpty()) {
messages.add(help);
}
}
// Send the messages to the target
for(String message : messages) {
plugin.messageNoPrefix(target, message);
}
}
@Override
public boolean onCommand(CommandSender sender, Command command, String alias, String[] args) {
if(!plugin.isReady()) {
plugin.message(sender, "general-notReady");
return true;
}
// Redirect `/as info player <player>` to `/as me <player>`
if(args.length == 3 && "info".equals(args[0]) && "player".equals(args[1])) {
args[0] = "me";
args[1] = args[2];
}
// Execute command
boolean executed = false;
for(int i = 0; i < commands.size() && !executed; i++) {
if(commands.get(i).canExecute(command, args)) {
commands.get(i).execute(sender, args);
executed = true;
}
}
// Show help
if (!executed) {
if (args.length == 0) {
this.showHelp(sender);
} else {
// Indicate that the '/as updaterents' and '/as updatebuys' commands are removed
if("updaterents".equalsIgnoreCase(args[0]) || "updatebuys".equalsIgnoreCase(args[0])) {
plugin.message(sender, "reload-updateCommandChanged");
} else {
plugin.message(sender, "cmd-notValid");
}
}
}
return true;
}
@Override
public List<String> onTabComplete(CommandSender sender, Command command, String alias, String[] args) {
List<String> result = new ArrayList<>();
if(!sender.hasPermission("areashop.tabcomplete")) {
return result;
}
int toCompleteNumber = args.length;
String toCompletePrefix = args[args.length - 1].toLowerCase();
//AreaShop.debug("toCompleteNumber=" + toCompleteNumber + ", toCompletePrefix=" + toCompletePrefix + ", length=" + toCompletePrefix.length());
if(toCompleteNumber == 1) {
for(CommandAreaShop c : commands) {
String begin = c.getCommandStart();
result.add(begin.substring(begin.indexOf(' ') + 1));
}
} else {
String[] start = new String[args.length];
start[0] = command.getName();
System.arraycopy(args, 0, start, 1, args.length - 1);
for(CommandAreaShop c : commands) {
if(c.canExecute(command, args)) {
result = c.getTabCompleteList(toCompleteNumber, start, sender);
}
}
}
// Filter and sort the results
if(!result.isEmpty()) {
SortedSet<String> set = new TreeSet<>();
for(String suggestion : result) {
if(suggestion.toLowerCase().startsWith(toCompletePrefix)) {
set.add(suggestion);
}
}
result.clear();
result.addAll(set);
}
//AreaShop.debug("Tabcomplete #" + toCompleteNumber + ", prefix="+ toCompletePrefix + ", result=" + result.toString());
return result;
}
}
@@ -1,88 +0,0 @@
package me.wiefferink.areashop.managers;
import me.wiefferink.areashop.AreaShop;
import me.wiefferink.areashop.features.CommandsFeature;
import me.wiefferink.areashop.features.DebugFeature;
import me.wiefferink.areashop.features.FriendsFeature;
import me.wiefferink.areashop.features.RegionFeature;
import me.wiefferink.areashop.features.TeleportFeature;
import me.wiefferink.areashop.features.WorldGuardRegionFlagsFeature;
import me.wiefferink.areashop.features.signs.SignsFeature;
import me.wiefferink.areashop.regions.GeneralRegion;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
public class FeatureManager extends Manager {
// List of defined features
private static final Set<Class<? extends RegionFeature>> featureClasses = new HashSet<>(Arrays.asList(
DebugFeature.class,
SignsFeature.class,
FriendsFeature.class,
WorldGuardRegionFlagsFeature.class,
TeleportFeature.class,
CommandsFeature.class
));
// One instance of each feature, registered for event handling
private final Set<RegionFeature> globalFeatures;
private final Map<Class<? extends RegionFeature>, Constructor<? extends RegionFeature>> regionFeatureConstructors;
/**
* Constructor.
*/
public FeatureManager() {
// Instantiate and register global features (one per type, for event handling)
globalFeatures = new HashSet<>();
for(Class<? extends RegionFeature> clazz : featureClasses) {
try {
Constructor<? extends RegionFeature> constructor = clazz.getConstructor();
RegionFeature feature = constructor.newInstance();
feature.listen();
globalFeatures.add(feature);
} catch(InstantiationException | IllegalAccessException | InvocationTargetException | IllegalArgumentException e) {
AreaShop.error("Failed to instantiate global feature:", clazz, e);
} catch(NoSuchMethodException e) {
// Feature does not have a global part
}
}
// Setup constructors for region specific features
regionFeatureConstructors = new HashMap<>();
for(Class<? extends RegionFeature> clazz : featureClasses) {
try {
regionFeatureConstructors.put(clazz, clazz.getConstructor(GeneralRegion.class));
} catch(NoSuchMethodException | IllegalArgumentException e) {
// The feature does not have a region specific part
}
}
}
@Override
public void shutdown() {
for(RegionFeature feature : globalFeatures) {
feature.shutdown();
}
}
/**
* Instanciate a feature for a certain region.
* @param region The region to create a feature for
* @param featureClazz The class of the feature to create
* @return The feature class
*/
public RegionFeature getRegionFeature(GeneralRegion region, Class<? extends RegionFeature> featureClazz) {
try {
return regionFeatureConstructors.get(featureClazz).newInstance(region);
} catch(InstantiationException | InvocationTargetException | IllegalAccessException | IllegalArgumentException e) {
AreaShop.error("Failed to instantiate feature", featureClazz, "for region", region, e, e.getCause());
}
return null;
}
}
File diff suppressed because it is too large. Load diff
@@ -1,16 +0,0 @@
package me.wiefferink.areashop.managers;
import me.wiefferink.areashop.AreaShop;
public abstract class Manager {
final AreaShop plugin = AreaShop.getInstance();
/**
* Called at shutdown of the plugin.
*/
public void shutdown() {
// To override by extending classes
}
}
@@ -1,242 +0,0 @@
package me.wiefferink.areashop.managers;
import me.wiefferink.areashop.features.signs.RegionSign;
import me.wiefferink.areashop.features.signs.SignsFeature;
import me.wiefferink.areashop.regions.GeneralRegion;
import me.wiefferink.areashop.tools.Materials;
import me.wiefferink.areashop.tools.Utils;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.block.BlockFace;
import org.bukkit.block.data.BlockData;
import org.bukkit.block.data.type.Sign;
import org.bukkit.block.data.type.WallSign;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.HandlerList;
import org.bukkit.event.Listener;
import org.bukkit.event.block.Action;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.util.BlockIterator;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
public class SignLinkerManager extends Manager implements Listener {
private final Map<UUID, SignLinker> signLinkers;
private boolean eventsRegistered;
public SignLinkerManager() {
signLinkers = new HashMap<>();
eventsRegistered = false;
}
@Override
public void shutdown() {
for(UUID uuid : signLinkers.keySet()) {
exitSignLinkMode(Bukkit.getPlayer(uuid));
}
}
/**
* Let a player enter sign linking mode.
* @param player The player that has to enter sign linking mode
* @param profile The profile to use for the signs (null for default)
*/
public void enterSignLinkMode(Player player, String profile) {
signLinkers.put(player.getUniqueId(), new SignLinker(player, profile));
plugin.message(player, "linksigns-first");
plugin.message(player, "linksigns-next");
if(!eventsRegistered) {
eventsRegistered = true;
plugin.getServer().getPluginManager().registerEvents(this, plugin);
}
}
/**
* Let a player exit sign linking mode.
* @param player The player that has to exit sign linking mode
*/
public void exitSignLinkMode(Player player) {
signLinkers.remove(player.getUniqueId());
if(eventsRegistered && signLinkers.isEmpty()) {
eventsRegistered = false;
HandlerList.unregisterAll(this);
}
plugin.message(player, "linksigns-stopped");
}
/**
* Check if the player is in sign linking mode.
* @param player The player to check
* @return true if the player is in sign linking mode, otherwise false
*/
public boolean isInSignLinkMode(Player player) {
return signLinkers.containsKey(player.getUniqueId());
}
/**
* On player interactions.
* @param event The PlayerInteractEvent
*/
@EventHandler(priority = EventPriority.HIGH)
public void onPlayerInteract(PlayerInteractEvent event) {
if(isInSignLinkMode(event.getPlayer())) {
event.setCancelled(true);
Player player = event.getPlayer();
SignLinker linker = signLinkers.get(event.getPlayer().getUniqueId());
if(event.getAction() == Action.RIGHT_CLICK_AIR || event.getAction() == Action.RIGHT_CLICK_BLOCK) {
// Get the region
BlockIterator blockIterator = new BlockIterator(player, 100);
while(blockIterator.hasNext()) {
Block next = blockIterator.next();
List<GeneralRegion> regions = Utils.getRegions(next.getLocation());
if(regions.size() == 1) {
linker.setRegion(regions.get(0));
return;
} else if(regions.size() > 1) {
Set<String> names = new HashSet<>();
for(GeneralRegion region : regions) {
names.add(region.getName());
}
plugin.message(player, "linksigns-multipleRegions", Utils.createCommaSeparatedList(names));
plugin.message(player, "linksigns-multipleRegionsAdvice");
return;
}
}
// No regions found within the maximum range
plugin.message(player, "linksigns-noRegions");
} else if(event.getAction() == Action.LEFT_CLICK_AIR || event.getAction() == Action.LEFT_CLICK_BLOCK) {
Block block = null;
BlockIterator blockIterator = new BlockIterator(player, 100);
while(blockIterator.hasNext() && block == null) {
Block next = blockIterator.next();
if(next.getType() != Material.AIR) {
block = next;
}
}
if(block == null || !Materials.isSign(block.getType())) {
plugin.message(player, "linksigns-noSign");
return;
}
RegionSign regionSign = SignsFeature.getSignByLocation(block.getLocation());
if(regionSign != null) {
plugin.message(player, "linksigns-alreadyRegistered", regionSign.getRegion());
return;
}
final BlockData blockData = block.getBlockData();
final BlockFace rotation;
if (blockData instanceof Sign) {
rotation = ((Sign) blockData).getRotation();
} else if (blockData instanceof WallSign) {
rotation = ((WallSign) blockData).getFacing();
} else {
rotation = null;
}
linker.setSign(block.getLocation(), block.getType(), rotation);
}
}
}
/**
* Handle disconnection players.
* @param event The PlayerQuitEvent
*/
@EventHandler(priority = EventPriority.MONITOR)
public void onPlayerLeave(PlayerQuitEvent event) {
exitSignLinkMode(event.getPlayer());
}
/**
* Class to keep track of the signlinking data.
*/
private class SignLinker {
private boolean hasSign = false;
private boolean hasRegion = false;
public final Player linker;
public final String profile;
public GeneralRegion region = null;
public Location location = null;
public Material type = null;
public BlockFace facing = null;
public SignLinker(Player linker, String profile) {
this.linker = linker;
this.profile = profile;
}
public void setRegion(GeneralRegion region) {
this.region = region;
hasRegion = true;
if(!isComplete()) {
plugin.message(linker, "linksigns-regionFound", region);
}
finish();
}
public void setSign(Location location, Material type, BlockFace facing) {
this.location = location;
this.type = type;
this.facing = facing;
hasSign = true;
if(!isComplete()) {
plugin.message(linker, "linksigns-signFound", location.getBlockX(), location.getBlockY(), location.getBlockZ());
}
finish();
}
public void finish() {
if(isComplete()) {
region.getSignsFeature().addSign(location, type, facing, profile);
if(profile == null) {
plugin.message(linker, "addsign-success", region);
} else {
plugin.message(linker, "addsign-successProfile", region, profile);
}
region.update();
reset();
plugin.message(linker, "linksigns-next");
}
}
public void reset() {
hasSign = false;
hasRegion = false;
}
public boolean isComplete() {
return hasSign && hasRegion;
}
}
}
@@ -1,509 +0,0 @@
package me.wiefferink.areashop.regions;
import me.wiefferink.areashop.AreaShop;
import me.wiefferink.areashop.events.ask.BuyingRegionEvent;
import me.wiefferink.areashop.events.ask.ResellingRegionEvent;
import me.wiefferink.areashop.events.ask.SellingRegionEvent;
import me.wiefferink.areashop.events.notify.BoughtRegionEvent;
import me.wiefferink.areashop.events.notify.ResoldRegionEvent;
import me.wiefferink.areashop.events.notify.SoldRegionEvent;
import me.wiefferink.areashop.tools.Utils;
import net.milkbowl.vault.economy.EconomyResponse;
import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer;
import org.bukkit.World;
import org.bukkit.command.CommandSender;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.entity.Player;
import java.util.UUID;
public class BuyRegion extends TransactionalRegion {
private static final String UNKNOWN_BUYER = "<UNKNOWN>";
public BuyRegion(YamlConfiguration config) {
super(config, RegionType.BUY);
}
public BuyRegion(String name, World world) {
super(name, world, RegionType.BUY);
}
@Override
public RegionState getState() {
if (isSold() && isInResellingMode()) {
return RegionState.RESELL;
} else if (isSold() && !isInResellingMode()) {
return RegionState.SOLD;
} else {
return RegionState.FORSALE;
}
}
/**
* Get the UUID of the owner of this region.
*
* @return The UUID of the owner of this region
*/
@Deprecated
public UUID getBuyer() {
String buyer = config.getString("buy.buyer");
if (buyer != null) {
try {
return UUID.fromString(buyer);
} catch (IllegalArgumentException e) {
// Incorrect UUID
}
}
return null;
}
/**
* Set the buyer of this region.
*
* @param buyer The UUID of the player that should be set as buyer
*/
@Deprecated
public void setBuyer(UUID buyer) {
if (buyer == null) {
setSetting("buy.buyer", null);
setSetting("buy.buyerName", null);
} else {
setSetting("buy.buyer", buyer.toString());
setSetting("buy.buyerName", Utils.toName(buyer));
}
this.setTransactionHolder(buyer);
}
/**
* Check if a player is the buyer of this region.
*
* @param player Player to check
* @return true if this player owns this region, otherwise false
*/
@Deprecated
public boolean isBuyer(OfflinePlayer player) {
return player != null && isBuyer(player.getUniqueId());
}
@Deprecated
public boolean isBuyer(UUID player) {
UUID buyer = getBuyer();
return !(buyer == null || player == null) && buyer.equals(player);
}
/**
* Get the name of the player that owns this region.
*
* @return The name of the player that owns this region, if unavailable by UUID it will return the old cached name, if that is unavailable it will return &lt;UNKNOWN&gt;
*/
public String getPlayerName() {
String result = Utils.toName(getBuyer());
if (result.isEmpty()) {
result = getStringSetting("buy.buyerName");
if (result == null || result.isEmpty()) {
result = UNKNOWN_BUYER;
}
}
return result;
}
/**
* Check if the region is being resold.
*
* @return true if the region is available for reselling, otherwise false
*/
public boolean isInResellingMode() {
return config.getBoolean("buy.resellMode");
}
/**
* Get the resell price of this region.
*
* @return The resell price if isInResellingMode(), otherwise 0.0
*/
public double getResellPrice() {
return Math.max(0, config.getDouble("buy.resellPrice"));
}
/**
* Get the formatted string of the resellprice (includes prefix and suffix).
*
* @return The formatted string of the resellprice
*/
public String getFormattedResellPrice() {
return Utils.formatCurrency(getResellPrice());
}
/**
* Set the region into resell mode with the given price.
*
* @param price The price this region should be put up for sale
*/
public void enableReselling(double price) {
setSetting("buy.resellMode", true);
setSetting("buy.resellPrice", price);
}
/**
* Stop this region from being in resell mode.
*/
public void disableReselling() {
setSetting("buy.resellMode", null);
setSetting("buy.resellPrice", null);
}
@Override
public Object provideReplacement(String variable) {
switch (variable) {
case AreaShop.tagResellPrice:
return getFormattedResellPrice();
case AreaShop.tagRawResellPrice:
return getResellPrice();
default:
return super.provideReplacement(variable);
}
}
/**
* Minutes until automatic unrent when player is offline.
*
* @return The number of milliseconds until the region is unrented while player is offline
*/
@Deprecated
public long getInactiveTimeUntilSell() {
return Utils.getDurationFromMinutesOrStringInput(getStringSetting("buy.inactiveTimeUntilSell"));
}
/**
* Get a human readable string indicating how long the player can be offline until automatic unrent.
*
* @return String indicating the inactive time until unrent
*/
@Deprecated
public String getFormattedInactiveTimeUntilSell() {
return Utils.millisToHumanFormat(getInactiveTimeUntilSell());
}
/**
* Buy a region.
*
* @param offlinePlayer The player that wants to buy the region
* @return true if it succeeded and false if not
*/
@SuppressWarnings("deprecation")
public boolean buy(OfflinePlayer offlinePlayer) {
// Check if the player has permission
if (!plugin.hasPermission(offlinePlayer, "areashop.buy")) {
message(offlinePlayer, "buy-noPermission");
return false;
}
if (plugin.getEconomy() == null) {
message(offlinePlayer, "general-noEconomy");
return false;
}
if (isInResellingMode()) {
if (!plugin.hasPermission(offlinePlayer, "areashop.buyresell")) {
message(offlinePlayer, "buy-noPermissionResell");
return false;
}
} else {
if (!plugin.hasPermission(offlinePlayer, "areashop.buynormal")) {
message(offlinePlayer, "buy-noPermissionNoResell");
return false;
}
}
if (getWorld() == null) {
message(offlinePlayer, "general-noWorld");
return false;
}
if (getRegion() == null) {
message(offlinePlayer, "general-noRegion");
return false;
}
if (isSold() && !(isInResellingMode() && !isBuyer(offlinePlayer))) {
if (isBuyer(offlinePlayer)) {
message(offlinePlayer, "buy-yours");
} else {
message(offlinePlayer, "buy-someoneElse");
}
return false;
}
boolean isResell = isInResellingMode();
// Only relevant if the player is online
Player player = offlinePlayer.getPlayer();
if (player != null) {
// Check if the players needs to be in the region for buying
if (restrictedToRegion() && (!player.getWorld().getName().equals(getWorldName())
|| !getRegion().contains(player.getLocation().getBlockX(), player.getLocation().getBlockY(), player.getLocation().getBlockZ()))) {
message(offlinePlayer, "buy-restrictedToRegion");
return false;
}
// Check if the players needs to be in the world for buying
if (restrictedToWorld() && !player.getWorld().getName().equals(getWorldName())) {
message(offlinePlayer, "buy-restrictedToWorld", player.getWorld().getName());
return false;
}
}
// Check region limits
LimitResult limitResult = this.limitsAllow(RegionType.BUY, offlinePlayer);
AreaShop.debug("LimitResult: " + limitResult.toString());
if (!limitResult.actionAllowed()) {
if (limitResult.getLimitingFactor() == LimitType.TOTAL) {
message(offlinePlayer, "total-maximum", limitResult.getMaximum(), limitResult.getCurrent(), limitResult.getLimitingGroup());
return false;
}
if (limitResult.getLimitingFactor() == LimitType.BUYS) {
message(offlinePlayer, "buy-maximum", limitResult.getMaximum(), limitResult.getCurrent(), limitResult.getLimitingGroup());
return false;
}
// Should not be reached, but is safe like this
return false;
}
// Check if the player has enough money
if (isResell && !plugin.getEconomy().has(offlinePlayer, getWorldName(), getResellPrice())) {
message(offlinePlayer, "buy-lowMoneyResell", Utils.formatCurrency(plugin.getEconomy().getBalance(offlinePlayer, getWorldName())));
return false;
}
if (!isResell && !plugin.getEconomy().has(offlinePlayer, getWorldName(), getPrice())) {
message(offlinePlayer, "buy-lowMoney", Utils.formatCurrency(plugin.getEconomy().getBalance(offlinePlayer, getWorldName())));
return false;
}
UUID oldOwner = getBuyer();
if (isResell && oldOwner != null) {
// Broadcast and check event
ResellingRegionEvent event = new ResellingRegionEvent(this, offlinePlayer);
Bukkit.getPluginManager().callEvent(event);
if (event.isCancelled()) {
message(offlinePlayer, "general-cancelled", event.getReason());
return false;
}
getFriendsFeature().clearFriends();
double resellPrice = getResellPrice();
// Transfer the money to the previous owner
EconomyResponse r = plugin.getEconomy().withdrawPlayer(offlinePlayer, getWorldName(), getResellPrice());
if (!r.transactionSuccess()) {
message(offlinePlayer, "buy-payError");
AreaShop.debug("Something went wrong with getting money from " + offlinePlayer.getName() + " while buying " + getName() + ": " + r.errorMessage);
return false;
}
r = null;
OfflinePlayer oldOwnerPlayer = Bukkit.getOfflinePlayer(oldOwner);
String oldOwnerName = getPlayerName();
if (oldOwnerPlayer.hasPlayedBefore() && oldOwnerPlayer.getName() != null) {
r = plugin.getEconomy().depositPlayer(oldOwnerPlayer, getWorldName(), getResellPrice());
oldOwnerName = oldOwnerPlayer.getName();
} else if (oldOwnerName != null) {
r = plugin.getEconomy().depositPlayer(oldOwnerName, getWorldName(), getResellPrice());
}
if (r == null || !r.transactionSuccess()) {
AreaShop.warn("Something went wrong with paying '" + oldOwnerName + "' " + getFormattedPrice() + " for his resell of region " + getName() + " to " + offlinePlayer.getName());
}
// Resell is done, disable that now
disableReselling();
// Set the owner
setBuyer(offlinePlayer.getUniqueId());
updateLastActiveTime();
// Update everything
handleSchematicEvent(RegionEvent.RESELL);
// Notify about updates
this.notifyAndUpdate(new ResoldRegionEvent(this, oldOwner));
// Send message to the player
message(offlinePlayer, "buy-successResale", oldOwnerName);
Player seller = Bukkit.getPlayer(oldOwner);
if (seller != null) {
message(seller, "buy-successSeller", resellPrice);
}
} else {
// Broadcast and check event
BuyingRegionEvent event = new BuyingRegionEvent(this, offlinePlayer);
Bukkit.getPluginManager().callEvent(event);
if (event.isCancelled()) {
message(offlinePlayer, "general-cancelled", event.getReason());
return false;
}
// Substract the money from the players balance
EconomyResponse r = plugin.getEconomy().withdrawPlayer(offlinePlayer, getWorldName(), getPrice());
if (!r.transactionSuccess()) {
message(offlinePlayer, "buy-payError");
return false;
}
// Optionally give money to the landlord
OfflinePlayer landlordPlayer = null;
if (getLandlord() != null) {
landlordPlayer = Bukkit.getOfflinePlayer(getLandlord());
}
String landlordName = getLandlordName();
if (landlordName != null) {
if (landlordPlayer != null && landlordPlayer.getName() != null) {
r = plugin.getEconomy().depositPlayer(landlordPlayer, getWorldName(), getPrice());
} else {
r = plugin.getEconomy().depositPlayer(landlordName, getWorldName(), getPrice());
}
if (r != null && !r.transactionSuccess()) {
AreaShop.warn("Something went wrong with paying '" + landlordName + "' " + getFormattedPrice() + " for his sell of region " + getName() + " to " + offlinePlayer.getName());
}
}
// Set the owner
setBuyer(offlinePlayer.getUniqueId());
updateLastActiveTime();
// Send message to the player
message(offlinePlayer, "buy-succes");
// Update everything
handleSchematicEvent(RegionEvent.BOUGHT);
// Notify about updates
this.notifyAndUpdate(new BoughtRegionEvent(this));
}
return true;
}
/**
* Sell a purchased region, get part of the money back.
*
* @param giveMoneyBack true if the player should be given money back, otherwise false
* @param executor CommandSender to receive a message when the sell fails, or null
* @return true if the region has been sold, otherwise false
*/
@SuppressWarnings("deprecation")
public boolean sell(boolean giveMoneyBack, CommandSender executor) {
boolean own = executor instanceof Player && this.isBuyer((Player) executor);
if (executor != null) {
if (!executor.hasPermission("areashop.sell") && !own) {
message(executor, "sell-noPermissionOther");
return false;
}
if (!executor.hasPermission("areashop.sell") && !executor.hasPermission("areashop.sellown") && own) {
message(executor, "sell-noPermission");
return false;
}
if (!executor.hasPermission("areashop.sell")
&& executor.hasPermission("areashop.sellown")
&& own
&& getBooleanSetting("buy.sellDisabled")) {
message(executor, "sell-disabled");
return false;
}
}
if (plugin.getEconomy() == null) {
return false;
}
// Broadcast and check event
SellingRegionEvent event = new SellingRegionEvent(this);
Bukkit.getPluginManager().callEvent(event);
if (event.isCancelled()) {
message(executor, "general-cancelled", event.getReason());
return false;
}
disableReselling();
// Give part of the buying price back
double moneyBack = getMoneyBackAmount();
if (moneyBack > 0 && giveMoneyBack) {
boolean noPayBack = false;
OfflinePlayer landlordPlayer = null;
if (getLandlord() != null) {
landlordPlayer = Bukkit.getOfflinePlayer(getLandlord());
}
String landlordName = getLandlordName();
EconomyResponse r;
if (landlordName != null) {
if (landlordPlayer != null && landlordPlayer.getName() != null) {
r = plugin.getEconomy().withdrawPlayer(landlordPlayer, getWorldName(), moneyBack);
} else {
r = plugin.getEconomy().withdrawPlayer(landlordName, getWorldName(), moneyBack);
}
if (r == null || !r.transactionSuccess()) {
noPayBack = true;
}
}
// Give back the money
OfflinePlayer player = Bukkit.getOfflinePlayer(getTransactionHolder());
if (player.hasPlayedBefore() && !noPayBack) {
EconomyResponse response = null;
boolean error = false;
try {
if (player.getName() != null) {
response = plugin.getEconomy().depositPlayer(player, getWorldName(), moneyBack);
} else if (getPlayerName() != null) {
response = plugin.getEconomy().depositPlayer(getPlayerName(), getWorldName(), moneyBack);
}
} catch (Exception e) {
error = true;
}
if (error || response == null || !response.transactionSuccess()) {
AreaShop.warn("Something went wrong with paying back money to " + getPlayerName() + " while selling region " + getName());
}
}
}
// Handle schematic save/restore (while %uuid% is still available)
handleSchematicEvent(RegionEvent.SOLD);
// Send message: before actual removal of the buyer so that it is still available for variables
message(executor, "sell-sold");
// Remove friends and the owner
getFriendsFeature().clearFriends();
UUID oldBuyer = getBuyer();
setBuyer(null);
removeLastActiveTime();
// Notify about updates
this.notifyAndUpdate(new SoldRegionEvent(this, oldBuyer, Math.max(moneyBack, 0)));
return true;
}
@Override
public boolean handleInactivity() {
return this.sell(true, null);
}
}
File diff suppressed because it is too large. Load diff
@@ -1,7 +0,0 @@
# Regions
This package contains the `GeneralRegion` class which represents a region in AreaShop. Such a region is linked to a WorldGuard region and has its own configuration file at `/plugins/AreaShop/regions/<name>.yml`.
The `BuyRegion` and `RentRegion` classes represent buy and rental regions (mutually exclusive) and inherit from `GeneralRegion`.
To group regions there is `RegionGroup`, which allows configuring settings for a lot of regions at once.
@@ -1,225 +0,0 @@
package me.wiefferink.areashop.regions;
import me.wiefferink.areashop.AreaShop;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.configuration.file.YamlConfiguration;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Set;
// TODO consider switching to saving lowercase regions
public class RegionGroup {
private final AreaShop plugin;
private final String name;
private final Set<String> regions;
private Set<String> autoRegions;
private boolean autoDirty;
private final Set<String> worlds;
/**
* Constructor, used when creating new groups or restoring them from groups.yml at server boot.
* @param plugin The AreaShop plugin
* @param name Name of the group, has to be unique
*/
public RegionGroup(AreaShop plugin, String name) {
this.plugin = plugin;
this.name = name;
this.autoDirty = true;
setSetting("name", name);
// Load regions and worlds
regions = new HashSet<>(getSettings().getStringList("regions"));
worlds = new HashSet<>(getSettings().getStringList("worlds"));
}
/**
* Get automatically added regions.
* @return Set of regions automatically added by the configuration
*/
public Set<String> getAutoRegions() {
if(autoDirty) {
autoRegions = new HashSet<>();
for(GeneralRegion region : plugin.getFileManager().getRegions()) {
if(worlds.contains(region.getWorldName())) {
autoRegions.add(region.getName());
}
}
autoDirty = false;
}
return autoRegions;
}
/**
* Mark that automatically added regions should be regenerated.
*/
public void autoDirty() {
autoDirty = true;
}
/**
* Adds a world from which all regions should be added to the group.
* @param world World from which all regions should be added
* @return true if the region was not already added, otherwise false
*/
public boolean addWorld(String world) {
if(worlds.add(world)) {
setSetting("regionsFromWorlds", new ArrayList<>(worlds));
saveRequired();
autoDirty();
return true;
}
return false;
}
/**
* Remove a member from the group.
* @param world World to remove
* @return true if the region was in the group before, otherwise false
*/
public boolean removeWorld(String world) {
if(worlds.remove(world)) {
setSetting("regionsFromWorlds", new ArrayList<>(worlds));
saveRequired();
autoDirty();
return true;
}
return false;
}
/**
* Get all worlds from which regions are added automatically.
* @return A list with the names of all worlds (immutable)
*/
public Set<String> getWorlds() {
return new HashSet<>(worlds);
}
/**
* Adds a member to a group.
* @param region The region to add to the group (GeneralRegion or a subclass of it)
* @return true if the region was not already added, otherwise false
*/
public boolean addMember(GeneralRegion region) {
if(regions.add(region.getName())) {
setSetting("regions", new ArrayList<>(regions));
saveRequired();
return true;
}
return false;
}
/**
* Remove a member from the group.
* @param region The region to remove
* @return true if the region was in the group before, otherwise false
*/
public boolean removeMember(GeneralRegion region) {
if(regions.remove(region.getName())) {
setSetting("regions", new ArrayList<>(regions));
saveRequired();
return true;
}
return false;
}
/**
* Get all members of the group.
* @return A list with the names of all members of the group (immutable)
*/
public Set<String> getMembers() {
HashSet<String> result = new HashSet<>(regions);
result.addAll(getAutoRegions());
return result;
}
/**
* Get all manually added members of the group.
* @return A list with the names of all members of the group (immutable)
*/
public Set<String> getManualMembers() {
return new HashSet<>(regions);
}
/**
* Get all members of the group as GeneralRegions.
* @return A Set with all group members
*/
public Set<GeneralRegion> getMemberRegions() {
Set<GeneralRegion> result = new HashSet<>();
for(String playerName : getMembers()) {
result.add(plugin.getFileManager().getRegion(playerName));
}
return result;
}
/**
* Get the name of the group.
* @return The name of the group
*/
public String getName() {
return name;
}
/**
* Get the lowercase name of the group (used for getting the config etc).
* @return The name of the group in lowercase
*/
public String getLowerCaseName() {
return getName().toLowerCase();
}
/**
* Check if a region is member of the group.
* @param region Region to check
* @return true if the region is in the group, otherwise false
*/
public boolean isMember(GeneralRegion region) {
return getMembers().contains(region.getName());
}
/**
* Get the priority of the group (higher overwrites).
* @return The priority of the group
*/
public int getPriority() {
return getSettings().getInt("priority");
}
/**
* Get the configurationsection with the settings of this group.
* @return The ConfigurationSection with the settings of the group
*/
public ConfigurationSection getSettings() {
ConfigurationSection result = plugin.getFileManager().getGroupSettings(name);
if(result != null) {
return result;
} else {
return new YamlConfiguration();
}
}
/**
* Set a setting of this group.
* @param path The path to set
* @param setting The value to set
*/
public void setSetting(String path, Object setting) {
plugin.getFileManager().setGroupSetting(this, path, setting);
}
/**
* Indicates this file needs to be saved, will actually get saved later by a task.
*/
public void saveRequired() {
plugin.getFileManager().saveGroupsIsRequired();
}
/**
* Save the groups to disk now, normally saveRequired() is preferred because of performance.
*/
public void saveNow() {
plugin.getFileManager().saveGroupsNow();
}
}
@@ -1,747 +0,0 @@
package me.wiefferink.areashop.regions;
import me.wiefferink.areashop.AreaShop;
import me.wiefferink.areashop.events.ask.RentingRegionEvent;
import me.wiefferink.areashop.events.ask.UnrentingRegionEvent;
import me.wiefferink.areashop.events.notify.RentedRegionEvent;
import me.wiefferink.areashop.events.notify.UnrentedRegionEvent;
import me.wiefferink.areashop.tools.Utils;
import net.milkbowl.vault.economy.EconomyResponse;
import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer;
import org.bukkit.World;
import org.bukkit.command.CommandSender;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.entity.Player;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.UUID;
import static me.wiefferink.areashop.tools.Utils.millisToHumanFormat;
public class RentRegion extends TransactionalRegion {
private long warningsDoneUntil = System.currentTimeMillis();
/**
* Constructor.
*
* @param config All settings of this region
*/
public RentRegion(YamlConfiguration config) {
super(config, RegionType.RENT);
}
/**
* Create a new RentRegion.
*
* @param name The name of the region (correct casing)
* @param world The world of the WorldGuard region
*/
public RentRegion(String name, World world) {
super(name, world, RegionType.RENT);
}
@Override
public RegionState getState() {
return isRented() ? RegionState.RENTED : RegionState.FORRENT;
}
/**
* Get the UUID of the player renting the region.
*
* @deprecated use {@link #getTransactionHolder()}
* @return The UUID of the renter
*/
@Deprecated
public UUID getRenter() {
String renter = config.getString("rent.renter");
if (renter != null) {
try {
return UUID.fromString(renter);
} catch (IllegalArgumentException e) {
// Incorrect UUID
}
}
return null;
}
/**
* Set the renter of this region.
*
* @deprecated Use {@link #setTransactionHolder(UUID)}
* @param renter The UUID of the player that should be set as the renter
*/
@Deprecated
public void setRenter(UUID renter) {
setTransactionHolder(renter);
}
@Override
public void setTransactionHolder(UUID renter) {
if (renter == null) {
setTransactionHolder((UUID) null);
return;
}
if (Bukkit.getPlayer(renter) != null) {
setTransactionHolder(Bukkit.getPlayer(renter));
return;
}
setTransactionHolder(Bukkit.getOfflinePlayer(renter));
}
@Override
public void setTransactionHolder(OfflinePlayer renter) {
if (renter == null || !renter.hasPlayedBefore()) {
setSetting("rent.renter", null);
setSetting("rent.renterName", null);
} else {
setSetting("rent.renter", renter.getUniqueId().toString());
setSetting("rent.renterName", renter.getName());
}
}
/**
* Check if a player is the renter of this region.
*
* @param player Player to check
* @return true if this player rents this region, otherwise false
*/
@Deprecated
public boolean isRenter(Player player) {
return player != null && isRenter(player.getUniqueId());
}
@Deprecated
public boolean isRenter(UUID player) {
UUID renter = getRenter();
return !(player == null || renter == null) && renter.equals(player);
}
/**
* Get the max number of extends of this region.
*
* @return -1 if infinite otherwise the maximum number
*/
public int getMaxExtends() {
return getIntegerSetting("rent.maxExtends");
}
/**
* Get how many times the rent has already been extended.
*
* @return The number of times extended
*/
public int getTimesExtended() {
return config.getInt("rent.timesExtended");
}
/**
* Set the number of times the region has been extended.
*
* @param times The number of times the region has been extended
*/
public void setTimesExtended(int times) {
if (times < 0) {
setSetting("rent.timesExtended", null);
} else {
setSetting("rent.timesExtended", times);
}
}
@Override
public Object provideReplacement(String variable) {
switch (variable) {
case AreaShop.tagRentedUntil:
return new SimpleDateFormat(plugin.getConfig().getString("timeFormatChat")).format(new Date(getRentedUntil()));
case AreaShop.tagRentedUntilShort:
return new SimpleDateFormat(plugin.getConfig().getString("timeFormatSign")).format(new Date(getRentedUntil()));
case AreaShop.tagTimeLeft:
return getTimeLeftString();
case AreaShop.tagTimesExtended:
return this.getTimesExtended();
case AreaShop.tagMaxExtends:
return this.getMaxExtends();
case AreaShop.tagExtendsLeft:
return getMaxExtends() - getTimesExtended();
case AreaShop.tagMaxRentTime:
return millisToHumanFormat(getMaxRentTime());
default:
return super.provideReplacement(variable);
}
}
/**
* Check if the region is rented.
*
* @return true if the region is rented, otherwise false
*/
public boolean isRented() {
return getRenter() != null;
}
/**
* Get the name of the player renting this region.
*
* @return Name of the player renting this region, if unavailable by UUID it will return the old cached name, if that is unavailable it will return &lt;UNKNOWN&gt;
*/
public String getPlayerName() {
String result = Utils.toName(getRenter());
if (result.isEmpty()) {
result = config.getString("rent.renterName");
if (result == null || result.isEmpty()) {
result = "<UNKNOWN>";
}
}
return result;
}
/**
* Get the time until this region is rented (time from 1970 epoch).
*
* @return The epoch time until which this region is rented
*/
public long getRentedUntil() {
return getLongSetting("rent.rentedUntil");
}
/**
* Set the time until the region is rented (milliseconds from 1970, system time).
*
* @param rentedUntil The time until the region is rented
*/
public void setRentedUntil(Long rentedUntil) {
setSetting("rent.rentedUntil", rentedUntil);
}
/**
* Get the duration of 1 rent period.
*
* @return The duration in milliseconds of 1 rent period
*/
public long getDuration() {
return Utils.durationStringToLong(getDurationString());
}
/**
* Set the duration of the rent.
*
* @param duration The duration of the rent (as specified on the documentation pages)
*/
public void setDuration(String duration) {
setSetting("rent.duration", duration);
}
/**
* Get the duration string, includes 'number indentifier'.
*
* @return The duration string
*/
public String getDurationString() {
return getStringSetting("rent.duration");
}
/**
* Get the time that is left on the region.
*
* @return The time left on the region
*/
public long getTimeLeft() {
if (isRented()) {
return this.getRentedUntil() - System.currentTimeMillis();
} else {
return 0;
}
}
/**
* Get a formatted string indicating the rent time that is left.
*
* @return Time left on the rent, for example '29 days', '3 months', '1 second'
*/
public String getTimeLeftString() {
return Utils.millisToHumanFormat(getTimeLeft());
}
/**
* Minutes until automatic unrent when player is offline.
*
* @return The number of milliseconds until the region is unrented while player is offline
*/
@Deprecated
public long getInactiveTimeUntilUnrent() {
return Utils.getDurationFromMinutesOrStringInput(getStringSetting("rent.inactiveTimeUntilUnrent"));
}
/**
* Get a human readable string indicating how long the player can be offline until automatic unrent.
*
* @return String indicating the inactive time until unrent
*/
@Deprecated
public String getFormattedInactiveTimeUntilUnrent() {
return Utils.millisToHumanFormat(getInactiveTimeUntilUnrent());
}
/**
* Get the amount of money that should be paid to the player when unrenting the region.
*
* @return The amount of money the player should get back
*/
public double getMoneyBackAmount() {
long currentTime = System.currentTimeMillis();
double timeLeft = getRentedUntil() - currentTime;
double percentage = (getMoneyBackPercentage()) / 100D;
double timePeriod = getDuration();
double periods = timeLeft / timePeriod;
return Math.max(0, periods * getPrice() * percentage);
}
/**
* Get the formatted string of the amount of the moneyBack amount.
*
* @return String with currency symbols and proper fractional part
*/
public String getFormattedMoneyBackAmount() {
return Utils.formatCurrency(getMoneyBackAmount());
}
/**
* Get the maximum time the player can rent the region in advance (milliseconds).
*
* @return The maximum rent time in milliseconds
*/
public long getMaxRentTime() {
return Utils.getDurationFromMinutesOrStringInput(getStringSetting("rent.maxRentTime"));
}
/**
* Check if the rent should expire.
*
* @return true if the rent has expired and has been unrented, false otherwise
*/
public boolean checkExpiration() {
long now = System.currentTimeMillis();
if (!isDeleted() && isRented() && now > getRentedUntil()) {
// Extend rent if configured for that
if (getBooleanSetting("rent.autoExtend") && extend()) {
return false;
}
// Send message to the player if online
Player player = Bukkit.getPlayer(getRenter());
if(unRent(false, null)) {
if(player != null) {
message(player, "unrent-expired");
}
return true;
}
}
return false;
}
/**
* Send the expiration warnings from the selected profile which is specified in the config.
* Sends all warnings since previous call until (now + normal delay), delay can be found in the config as well.
*/
public void sendExpirationWarnings() {
// Send from warningsDoneUntil to current+delay
if (isDeleted() || !isRented()) {
return;
}
ConfigurationSection profileSection = getConfigurationSectionSetting("rent.expirationWarningProfile", "expirationWarningProfiles");
if (profileSection == null) {
return;
}
// Check if a warning needs to be send for each defined point in time
Player player = Bukkit.getPlayer(getRenter());
long sendUntil = System.currentTimeMillis() + (plugin.getConfig().getInt("expireWarning.delay") * 60 * 1000);
for (String timeBefore : profileSection.getKeys(false)) {
long timeBeforeParsed = Utils.durationStringToLong(timeBefore);
if (timeBeforeParsed <= 0) {
return;
}
long checkTime = getRentedUntil() - timeBeforeParsed;
if (checkTime > warningsDoneUntil && checkTime <= sendUntil) {
List<String> commands;
if (profileSection.isConfigurationSection(timeBefore)) {
/* Legacy config layout:
* "1 minute":
* warnPlayer: true
* commands: ["say hi"]
*/
commands = profileSection.getStringList(timeBefore + ".commands");
// Warn player
if (profileSection.getBoolean(timeBefore + ".warnPlayer") && player != null) {
message(player, "rent-expireWarning");
}
} else {
commands = profileSection.getStringList(timeBefore);
}
this.runCommands(Bukkit.getConsoleSender(), commands);
}
}
warningsDoneUntil = sendUntil;
}
/**
* Try to extend the rent for the current owner, respecting all restrictions.
*
* @return true if successful, otherwise false
*/
public boolean extend() {
if (!isRented()) {
return false;
}
OfflinePlayer offlinePlayer = Bukkit.getOfflinePlayer(getRenter());
return offlinePlayer.hasPlayedBefore() && rent(offlinePlayer);
}
/**
* Try to extend the rent for the current owner, respecting all restrictions.
*
* @param offlinePlayer Useful if the offline player can be obtained asynchronously.
* @return true if successful, otherwise false
*/
public boolean extend(OfflinePlayer offlinePlayer) {
if (!isRented()) {
return false;
}
return offlinePlayer.hasPlayedBefore() && rent(offlinePlayer);
}
/**
* Rent a region.
*
* @param offlinePlayer The player that wants to rent the region
* @return true if it succeeded and false if not
*/
public boolean rent(OfflinePlayer offlinePlayer) {
if (plugin.getEconomy() == null) {
message(offlinePlayer, "general-noEconomy");
return false;
}
// Check if the player has permission
if (!plugin.hasPermission(offlinePlayer, "areashop.rent")) {
message(offlinePlayer, "rent-noPermission");
return false;
}
// Check location restrictions
if (getWorld() == null) {
message(offlinePlayer, "general-noWorld");
return false;
}
if (getRegion() == null) {
message(offlinePlayer, "general-noRegion");
return false;
}
boolean extend = false;
if (getRenter() != null && offlinePlayer.getUniqueId().equals(getRenter())) {
extend = true;
}
// Check if available or extending
if (isRented() && !extend) {
message(offlinePlayer, "rent-someoneElse");
return false;
}
// These checks are only relevant for online players doing the renting/buying themselves
Player player = offlinePlayer.getPlayer();
if (player != null) {
// Check if the players needs to be in the region for renting
if (restrictedToRegion() && (!player.getWorld().getName().equals(getWorldName())
|| !getRegion().contains(player.getLocation().getBlockX(), player.getLocation().getBlockY(), player.getLocation().getBlockZ()))) {
message(offlinePlayer, "rent-restrictedToRegion");
return false;
}
// Check if the players needs to be in the world for renting
if (restrictedToWorld() && !player.getWorld().getName().equals(getWorldName())) {
message(offlinePlayer, "rent-restrictedToWorld", player.getWorld().getName());
return false;
}
}
// Check region limits if this is not extending
if (!(extend && config.getBoolean("allowRegionExtendsWhenAboveLimits"))) {
LimitResult limitResult;
if (extend) {
limitResult = this.limitsAllow(RegionType.RENT, offlinePlayer, true);
} else {
limitResult = this.limitsAllow(RegionType.RENT, offlinePlayer);
}
AreaShop.debug("LimitResult: " + limitResult.toString());
if (!limitResult.actionAllowed()) {
if (limitResult.getLimitingFactor() == LimitType.TOTAL) {
message(offlinePlayer, "total-maximum", limitResult.getMaximum(), limitResult.getCurrent(), limitResult.getLimitingGroup());
return false;
}
if (limitResult.getLimitingFactor() == LimitType.RENTS) {
message(offlinePlayer, "rent-maximum", limitResult.getMaximum(), limitResult.getCurrent(), limitResult.getLimitingGroup());
return false;
}
if (limitResult.getLimitingFactor() == LimitType.EXTEND) {
message(offlinePlayer, "rent-maximumExtend", limitResult.getMaximum(), limitResult.getCurrent() + 1, limitResult.getLimitingGroup());
return false;
}
return false;
}
}
// Check if the player can still extend this rent
if (extend && !plugin.hasPermission(offlinePlayer, "areashop.rentextendbypass")) {
if (getMaxExtends() >= 0 && getTimesExtended() >= getMaxExtends()) {
message(offlinePlayer, "rent-maxExtends");
return false;
}
}
// Check if there is enough time left before hitting maxRentTime
boolean extendToMax = false;
double price = getPrice();
long timeNow = Calendar.getInstance().getTimeInMillis();
long timeRented = 0;
long maxRentTime = getMaxRentTime();
if (isRented()) {
timeRented = getRentedUntil() - timeNow;
}
if ((timeRented + getDuration()) > (maxRentTime)
&& !plugin.hasPermission(offlinePlayer, "areashop.renttimebypass")
&& maxRentTime != -1) {
// Extend to the maximum instead of adding a full period
if (getBooleanSetting("rent.extendToFullWhenAboveMaxRentTime")) {
if (timeRented >= maxRentTime) {
message(offlinePlayer, "rent-alreadyAtFull");
return false;
} else {
long toRentPart = maxRentTime - timeRented;
extendToMax = true;
price = ((double) toRentPart) / getDuration() * price;
}
} else {
message(offlinePlayer, "rent-maxRentTime");
return false;
}
}
// Check if the player has enough money
if (!plugin.getEconomy().has(offlinePlayer, getWorldName(), price)) {
if (extend) {
message(offlinePlayer, "rent-lowMoneyExtend", Utils.formatCurrency(plugin.getEconomy().getBalance(offlinePlayer, getWorldName())));
} else {
message(offlinePlayer, "rent-lowMoneyRent", Utils.formatCurrency(plugin.getEconomy().getBalance(offlinePlayer, getWorldName())));
}
return false;
}
// Broadcast and check event
RentingRegionEvent event = new RentingRegionEvent(this, offlinePlayer, extend);
Bukkit.getPluginManager().callEvent(event);
if (event.isCancelled()) {
message(offlinePlayer, "general-cancelled", event.getReason());
return false;
}
// Substract the money from the players balance
EconomyResponse r = plugin.getEconomy().withdrawPlayer(offlinePlayer, getWorldName(), price);
if (!r.transactionSuccess()) {
message(offlinePlayer, "rent-payError");
AreaShop.debug("Something went wrong with getting money from " + offlinePlayer.getName() + " while renting " + getName() + ": " + r.errorMessage);
return false;
}
// Optionally give money to the landlord
OfflinePlayer landlordPlayer = null;
if (getLandlord() != null) {
landlordPlayer = Bukkit.getOfflinePlayer(getLandlord());
}
String landlordName = getLandlordName();
if (landlordName != null) {
if (landlordPlayer != null && landlordPlayer.getName() != null) {
r = plugin.getEconomy().depositPlayer(landlordPlayer, getWorldName(), price);
} else {
r = plugin.getEconomy().depositPlayer(landlordName, getWorldName(), price);
}
if (r == null || !r.transactionSuccess()) {
AreaShop.warn("Something went wrong with paying '" + landlordName + "' " + Utils.formatCurrency(price) + " for his rent of region " + getName() + " to " + offlinePlayer.getName());
}
}
// Get the time until the region will be rented
long millis;
if (extendToMax) {
millis = getMaxRentTime();
} else if (extend) {
millis = getRentedUntil() + getDuration();
} else {
millis = getDuration();
}
// Add values to the rent and send it to FileManager
setRentedUntil(System.currentTimeMillis() + millis);
setRenter(offlinePlayer.getUniqueId());
updateLastActiveTime();
// Fire schematic event and updated times extended
if (!extend) {
this.handleSchematicEvent(RegionEvent.RENTED);
setTimesExtended(0);
} else {
setTimesExtended(getTimesExtended() + 1);
}
// Send message to the player
if (extendToMax) {
message(offlinePlayer, "rent-extendedToMax");
} else if (extend) {
message(offlinePlayer, "rent-extended");
} else {
message(offlinePlayer, "rent-rented");
}
// Notify about updates
this.notifyAndUpdate(new RentedRegionEvent(this, extend));
return true;
}
/**
* Unrent a region, reset to unrented.
*
* @param giveMoneyBack true if money should be given back to the player, false otherwise
* @param executor The CommandSender that should get the cancelled message if there is any, or null
* @return true if unrenting succeeded, othwerwise false
*/
@SuppressWarnings("deprecation")
public boolean unRent(boolean giveMoneyBack, CommandSender executor) {
boolean own = executor instanceof Player && this.isRenter((Player) executor);
if (executor != null) {
if (!executor.hasPermission("areashop.unrent") && !own) {
message(executor, "unrent-noPermissionOther");
return false;
}
if (!executor.hasPermission("areashop.unrent") && !executor.hasPermission("areashop.unrentown") && own) {
message(executor, "unrent-noPermission");
return false;
}
}
if (plugin.getEconomy() == null) {
return false;
}
// Broadcast and check event
UnrentingRegionEvent event = new UnrentingRegionEvent(this);
Bukkit.getPluginManager().callEvent(event);
if (event.isCancelled()) {
message(executor, "general-cancelled", event.getReason());
return false;
}
// Do a payback
double moneyBack = getMoneyBackAmount();
if (moneyBack > 0 && giveMoneyBack) {
boolean noPayBack = false;
OfflinePlayer landlordPlayer = null;
if (getLandlord() != null) {
landlordPlayer = Bukkit.getOfflinePlayer(getLandlord());
}
String landlordName = getLandlordName();
EconomyResponse r;
if (landlordName != null) {
if (landlordPlayer != null && landlordPlayer.getName() != null) {
r = plugin.getEconomy().withdrawPlayer(landlordPlayer, getWorldName(), moneyBack);
} else {
r = plugin.getEconomy().withdrawPlayer(landlordName, getWorldName(), moneyBack);
}
if (r == null || !r.transactionSuccess()) {
noPayBack = true;
}
}
// Give back the money
OfflinePlayer player = Bukkit.getOfflinePlayer(getRenter());
if (player.hasPlayedBefore() && !noPayBack) {
r = null;
boolean error = false;
try {
if (player.getName() != null) {
r = plugin.getEconomy().depositPlayer(player, getWorldName(), moneyBack);
} else if (getPlayerName() != null) {
r = plugin.getEconomy().depositPlayer(getPlayerName(), getWorldName(), moneyBack);
}
} catch (Exception e) {
error = true;
}
if (error || r == null || !r.transactionSuccess()) {
AreaShop.warn("Something went wrong with paying back to " + getPlayerName() + " money while unrenting region " + getName());
}
}
}
// Handle schematic save/restore (while %uuid% is still available)
handleSchematicEvent(RegionEvent.UNRENTED);
// Send message: before actual removal of the renter so that it is still available for variables
message(executor, "unrent-unrented");
// Remove friends, the owner and renteduntil values
getFriendsFeature().clearFriends();
UUID oldRenter = getRenter();
setRenter(null);
setRentedUntil(null);
setTimesExtended(-1);
removeLastActiveTime();
// Notify about updates
this.notifyAndUpdate(new UnrentedRegionEvent(this, oldRenter, Math.max(0, moneyBack)));
return true;
}
@Override
public boolean checkInactive() {
if (isDeleted() || !isRented()) {
return false;
}
long inactiveSetting = getInactiveTimeUntilUnrent();
OfflinePlayer player = Bukkit.getOfflinePlayer(getRenter());
if (inactiveSetting <= 0 || player.isOp()) {
return false;
}
long lastPlayed = getLastActiveTime();
//AreaShop.debug("currentTime=" + Calendar.getInstance().getTimeInMillis() + ", getLastPlayed()=" + lastPlayed + ", timeInactive=" + (Calendar.getInstance().getTimeInMillis()-player.getLastPlayed()) + ", inactiveSetting=" + inactiveSetting);
long now = System.currentTimeMillis();
if (now > (lastPlayed + inactiveSetting)) {
AreaShop.info("Region " + getName() + " unrented because of inactivity for player " + getPlayerName());
AreaShop.debug("currentTime=" + Calendar.getInstance().getTimeInMillis() + ", getLastPlayed()=" + lastPlayed + ", timeInactive=" + (now - player.getLastPlayed()) + ", inactiveSetting=" + inactiveSetting);
return true;
}
return false;
}
@Override
public boolean handleInactivity() {
return this.unRent(true, null);
}
}
@@ -1,240 +0,0 @@
package me.wiefferink.areashop.regions;
import me.wiefferink.areashop.AreaShop;
import me.wiefferink.areashop.tools.Utils;
import org.bukkit.OfflinePlayer;
import org.bukkit.World;
import org.bukkit.configuration.file.YamlConfiguration;
import java.util.UUID;
public abstract class TransactionalRegion extends GeneralRegion {
private final String key;
private final RegionType type;
private UUID transactionHolder;
private String transactionHolderName;
private double price;
private double moneyBackPercentage;
private long inactivityThresholdMillis;
public TransactionalRegion(YamlConfiguration config, RegionType regionType) {
super(config);
this.type = regionType;
this.key = regionType.name().toLowerCase() + ".";
this.moneyBackPercentage = config.getDouble(this.key + "moneyBack");
}
public TransactionalRegion(String name, World world, RegionType type) {
super(name, world);
this.type = type;
this.key = type.name().toLowerCase() + ".";
}
protected final void setInactivityThresholdMillis(long inactivityThresholdMillis) {
this.inactivityThresholdMillis = inactivityThresholdMillis;
}
@Override
public RegionType getType() {
return type;
}
@Override
public boolean isAvailable() {
return !isSold();
}
/**
* Get the UUID of the owner of this region.
*
* @return The UUID of the owner of this region
*/
public UUID getTransactionHolder() {
return transactionHolder;
}
/**
* Set the buyer of this region. WARNING - May trigger disk lookup for offline players!
*
* @param transactionHolder The UUID of the player that should be set as buyer
*/
public void setTransactionHolder(UUID transactionHolder) {
if (transactionHolder == null) {
this.transactionHolder = null;
this.transactionHolderName = null;
} else {
this.transactionHolder = transactionHolder;
String name = Utils.toName(transactionHolder);
this.transactionHolderName = name.isEmpty() ? null : name;
}
}
/**
* Set the buyer of this region.
*
* @param player The instance of the player.
*/
public void setTransactionHolder(final OfflinePlayer player) {
if (player == null) {
this.transactionHolder = null;
this.transactionHolderName = null;
} else {
String name = player.getName();
this.transactionHolderName = name == null || name.isEmpty() ? null : name;
}
}
@Override
public void setOwner(UUID player) {
setTransactionHolder(player);
}
/**
* Check if a player is the buyer/holder of this region.
*
* @param player Player to check
* @return true if this player owns this region, otherwise false
*/
public boolean isTransactionHolder(OfflinePlayer player) {
return player != null && player.getUniqueId().equals(transactionHolder);
}
public boolean isTransactionHolder(UUID player) {
UUID buyer = getTransactionHolder();
return !(buyer == null || player == null) && buyer.equals(player);
}
/**
* Get the name of the player that owns this region.
*
* @return The name of the player that owns this region, if unavailable by UUID it will return the old cached name, if that is unavailable it will return &lt;UNKNOWN&gt;
*/
public String getPlayerName() {
return this.transactionHolderName == null ? "<UNKNOWN>" : transactionHolderName;
}
/**
* Check if the region is sold.
*
* @return true if the region is sold, otherwise false
*/
public boolean isSold() {
return this.transactionHolder != null;
}
/**
* Get the price of the region.
*
* @return The price of the region
*/
public double getPrice() {
return price;
}
/**
* Change the price of the region.
*
* @param price The price to set this region to
*/
public void setPrice(double price) {
this.price = price;
super.config.set(key + "price", price);
}
/**
* Get the formatted string of the price (includes prefix and suffix).
*
* @return The formatted string of the price
*/
public String getFormattedPrice() {
return Utils.formatCurrency(getPrice());
}
/**
* Get the moneyBack percentage.
*
* @return The % of money the player will get back when selling
*/
public double getMoneyBackPercentage() {
return moneyBackPercentage;
}
/**
* Get the amount of money that should be paid to the player when selling the region.
*
* @return The amount of money the player should get back
*/
public double getMoneyBackAmount() {
return getPrice() * (moneyBackPercentage / 100D);
}
/**
* Get the formatted string of the amount of the moneyBack amount.
*
* @return String with currency symbols and proper fractional part
*/
public String getFormattedMoneyBackAmount() {
return Utils.formatCurrency(getMoneyBackAmount());
}
@Override
public Object provideReplacement(String variable) {
switch (variable) {
case AreaShop.tagPrice:
return getFormattedPrice();
case AreaShop.tagRawPrice:
return getPrice();
case AreaShop.tagPlayerName:
return getPlayerName();
case AreaShop.tagPlayerUUID:
return getTransactionHolder();
case AreaShop.tagMoneyBackAmount:
return getFormattedMoneyBackAmount();
case AreaShop.tagRawMoneyBackAmount:
return getMoneyBackAmount();
case AreaShop.tagMoneyBackPercentage:
return getMoneyBackPercentage() % 1.0 == 0.0 ? (int) getMoneyBackPercentage() : getMoneyBackPercentage();
case AreaShop.tagMaxInactiveTime:
return this.getFormattedInactivityThreshold();
default:
return super.provideReplacement(variable);
}
}
public long getInactivityThresholdMillis() {
return this.inactivityThresholdMillis;
}
/**
* Get a human readable string indicating how long the player can be offline until automatic unrent.
*
* @return String indicating the inactive time until unrent
*/
public String getFormattedInactivityThreshold() {
return Utils.millisToHumanFormat(this.inactivityThresholdMillis);
}
@Override
public boolean checkInactivity(final OfflinePlayer player) {
if (isDeleted() || !isSold()) {
return false;
}
long inactiveSetting = getInactivityThresholdMillis();
if (inactiveSetting <= 0) {
return false;
}
if (player.isOnline()) {
return false;
}
long lastPlayed = getLastActiveTime();
long now = System.currentTimeMillis();
if (now > (lastPlayed + inactiveSetting)) {
AreaShop.info("Region " + getName() + " unrented because of inactivity for player " + getPlayerName());
AreaShop.debug("currentTime=" + now + ", getLastPlayed()=" + lastPlayed + ", timeInactive=" + (now - player.getLastPlayed()) + ", inactiveSetting=" + inactiveSetting);
return true;
}
return false;
}
}
@@ -1,103 +0,0 @@
package me.wiefferink.areashop.tools;
import me.wiefferink.areashop.AreaShop;
import me.wiefferink.areashop.regions.BuyRegion;
import me.wiefferink.areashop.regions.GeneralRegion;
import me.wiefferink.areashop.regions.RentRegion;
import org.bstats.bukkit.Metrics;
import java.util.HashMap;
import java.util.Map;
public class Analytics {
private Analytics() {
}
/**
* Start analytics tracking.
*/
public static void start() {
// bStats statistics
try {
Metrics metrics = new Metrics(AreaShop.getInstance());
// Number of regions
metrics.addCustomChart(new Metrics.SingleLineChart("region_count", () -> AreaShop.getInstance().getFileManager().getRegions().size()));
// Number of rental regions
metrics.addCustomChart(new Metrics.SingleLineChart("rental_region_count", () -> {
return AreaShop.getInstance().getFileManager().getRents().size();
}));
// Number of buy regions
metrics.addCustomChart(new Metrics.SingleLineChart("buy_region_count", () -> AreaShop.getInstance().getFileManager().getBuys().size()));
// Language
metrics.addCustomChart(new Metrics.SimplePie("language", () -> AreaShop.getInstance().getConfig().getString("language")));
// Pie with region states
metrics.addCustomChart(new Metrics.AdvancedPie("region_state", () -> {
Map<String, Integer> map = new HashMap<>();
RegionStateStats stats = getStateStats();
map.put("For Rent", stats.forrent);
map.put("Rented", stats.rented);
map.put("For Sale", stats.forsale);
map.put("Sold", stats.sold);
map.put("Reselling", stats.reselling);
return map;
}));
// Time series of each region state
metrics.addCustomChart(new Metrics.SingleLineChart("forrent_region_count", () -> getStateStats().forrent));
metrics.addCustomChart(new Metrics.SingleLineChart("rented_region_count", () -> getStateStats().rented));
metrics.addCustomChart(new Metrics.SingleLineChart("forsale_region_count", () -> getStateStats().forsale));
metrics.addCustomChart(new Metrics.SingleLineChart("sold_region_count", () -> getStateStats().sold));
metrics.addCustomChart(new Metrics.SingleLineChart("reselling_region_count", () -> getStateStats().reselling));
// TODO track rent/buy/unrent/sell/resell actions (so that it can be reported per collection interval)
AreaShop.debug("Started bstats.org statistics service");
} catch (Exception e) {
AreaShop.debug("Could not start bstats.org statistics service");
}
}
private static RegionStateStats getStateStats() {
RegionStateStats result = new RegionStateStats();
for (GeneralRegion region : AreaShop.getInstance().getFileManager().getRegions()) {
if (region instanceof RentRegion) {
RentRegion rent = (RentRegion) region;
if (rent.isAvailable()) {
result.forrent++;
} else {
result.rented++;
}
} else if (region instanceof BuyRegion) {
BuyRegion buy = (BuyRegion) region;
if (buy.isAvailable()) {
result.forsale++;
} else if (buy.isInResellingMode()) {
result.reselling++;
} else {
result.sold++;
}
}
}
return result;
}
private static class RegionStateStats {
int forrent = 0;
int forsale = 0;
int rented = 0;
int sold = 0;
int reselling = 0;
}
}
@@ -1,28 +0,0 @@
package me.wiefferink.areashop.tools;
import org.bukkit.Chunk;
public class ChunkUtils {
private final long twoPower32 = Integer.MAX_VALUE + 1L;
public static long getPackedChunkCoords(Chunk chunk) {
return packToLong(chunk.getX(), chunk.getZ());
}
public static long packToLong(int primary, int secondary) {
return (long) primary & 0xffffffffL | ((long) secondary & 0xffffffffL) << 32;
}
public static int getChunkX(long packed) {
return (int) packed;
}
public static int getChunkZ(long packed) {
return (int) (packed >> 32);
}
public static int[] getChunkCoords(long packed) {
return new int[]{(int) packed, (int) (packed >> 32)};
}
}
@@ -1,251 +0,0 @@
package me.wiefferink.areashop.tools;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.exception.ExceptionUtils;
import org.bukkit.plugin.Plugin;
import org.bukkit.scheduler.BukkitRunnable;
import org.json.simple.JSONObject;
import org.json.simple.JSONValue;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.util.Arrays;
import java.util.logging.Logger;
public class GithubUpdateCheck {
public static final String API_HOST = "https://api.github.com/repos";
public static final String API_LATEST_RELEASE = "releases/latest";
public static final String USER_AGENT = "GithubUpdateCheck by NLThijs48";
public static final boolean DEBUG = false;
private final String author;
private final String repository;
private final Plugin plugin;
private final Logger logger;
private URL url;
private VersionComparator versionComparator;
// Status
private boolean checking;
private boolean error;
private boolean hasUpdate;
private String latestVersion;
private final String currentVersion;
/**
* Create a new GithubUpdateCheck with the required information.
* @param plugin The plugin to create it for (used for logging and checking version)
* @param author The author of the plugin as used on Github
* @param repository The repository name of the plugin on Github
*/
public GithubUpdateCheck(Plugin plugin, String author, String repository) {
this.plugin = plugin;
this.logger = plugin.getLogger();
this.author = author;
this.repository = repository;
this.currentVersion = plugin.getDescription().getVersion();
this.versionComparator = (latest, current) ->
!latest.equalsIgnoreCase(current);
this.checking = false;
this.error = false;
this.hasUpdate = false;
}
/**
* Change the version comparator.
* @param versionComparator VersionComparator to use for checking if one version is newer than the other
* @return this
*/
public GithubUpdateCheck withVersionComparator(VersionComparator versionComparator) {
this.versionComparator = versionComparator;
return this;
}
/**
* Check if an update is available.
*/
public void checkUpdate() {
checkUpdate(null);
}
/**
* Check if an update is available.
* @param callback Callback to execute when the update check is done
* @return GithubUpdateCheck containing the status of the check
*/
public GithubUpdateCheck checkUpdate(UpdateCallback callback) {
checking = true;
final GithubUpdateCheck self = this;
// Check for update on asyn thread
new BukkitRunnable() {
@Override
public void run() {
try {
try {
String rawUrl = API_HOST + "/" + author + "/" + repository + "/" + API_LATEST_RELEASE;
url = new URL(rawUrl);
} catch(MalformedURLException e) {
logger.severe("Invalid url: '" + url + "', are the author '" + author + "' and repository '" + repository + "' correct?");
error = true;
return;
}
try {
URLConnection conn = url.openConnection();
// Give up after 15 seconds
conn.setConnectTimeout(15000);
// Identify ourselves
conn.addRequestProperty("User-Agent", USER_AGENT);
// Make sure we access the correct api version
conn.addRequestProperty("Accept", "application/vnd.github.v3+json");
// We want to read the result
conn.setDoOutput(true);
// Open connection
try(BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()))) {
String response = reader.readLine();
debug("Response:", response);
JSONObject latestRelease = (JSONObject)JSONValue.parse(response);
if(latestRelease.isEmpty()) {
logger.warning("Failed to get api response from " + url);
error = true;
return;
}
debug("json: " + latestRelease.toJSONString());
// Latest version
latestVersion = (String)latestRelease.get("tag_name");
debug("Tag name:", latestVersion);
// Current version
debug("Plugin version:", currentVersion);
// Compare version
hasUpdate = versionComparator.isNewer(latestVersion, currentVersion);
}
} catch(IOException e) {
logger.severe("Failed to get latest release:" + ExceptionUtils.getStackTrace(e));
error = true;
} catch(ClassCastException e) {
logger.info("Unexpected structure of the result, failed to parse it");
error = true;
}
} finally {
checking = false;
debug("result:", self);
if(callback != null) {
// Switch back to main thread and call the callback
new BukkitRunnable() {
@Override
public void run() {
callback.run(self);
}
}.runTask(plugin);
}
}
}
}.runTaskAsynchronously(plugin);
return this;
}
/**
* Check if an update check is running.
* @return true if an update check is running
*/
public boolean isChecking() {
return checking;
}
/**
* Check if the update check failed.
* @return true if the update check failed (an error message has been logged)
*/
public boolean hasFailed() {
return error;
}
/**
* Check if an update has been found.
* @return true if an update has been found
*/
public boolean hasUpdate() {
return hasUpdate;
}
/**
* Get the repository that this update checker is checking.
* @return Used repository
*/
public String getRepository() {
return repository;
}
/**
* Get the author that this update checker is checking.
* @return Used author
*/
public String getAuthor() {
return author;
}
/**
* Get the current version.
* @return Current version of the plugin
*/
public String getCurrentVersion() {
return currentVersion;
}
/**
* Get the latest version.
* @return Latest version of the plugin (if checking is complete)
*/
public String getLatestVersion() {
return latestVersion;
}
public interface VersionComparator {
/**
* Check if a version should be considered 'newer' than another.
* @param latestVersion Version that is available on Github
* @param currentVersion Version of the current plugin
* @return true if the latestVersion is newer than the localVersion, otherwise false
*/
boolean isNewer(String latestVersion, String currentVersion);
}
public interface UpdateCallback {
void run(GithubUpdateCheck result);
}
/**
* Print a debug message if DEBUG is enabled.
* @param message Message to print
*/
private void debug(Object... message) {
if(DEBUG) {
logger.info("[" + this.getClass().getSimpleName() + "] [DEBUG] " + StringUtils.join(message, " "));
}
}
@Override
public String toString() {
return "GithubUpdateCheck(" + StringUtils.join(Arrays.asList(
"author=" + author,
"repository=" + repository,
"plugin=" + plugin.getName(),
"checking=" + checking,
"hasUpdate=" + hasUpdate,
"error=" + error,
"currentVersion=" + currentVersion,
"latestVersion=" + latestVersion
), ", ") + ")";
}
}
@@ -1,132 +0,0 @@
package me.wiefferink.areashop.tools;
import me.wiefferink.areashop.AreaShop;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
public class Materials {
private Materials() {
}
private static final HashSet<String> WALL_SIGN_TYPES = new HashSet<>(Arrays.asList(
// 1.14+ types
"ACACIA_WALL_SIGN",
"BIRCH_WALL_SIGN",
"DARK_OAK_WALL_SIGN",
"JUNGLE_WALL_SIGN",
"OAK_WALL_SIGN",
"SPRUCE_WALL_SIGN",
// Legacy types
"LEGACY_WALL_SIGN",
"WALL_SIGN"
));
private static final HashSet<String> FLOOR_SIGN_TYPES = new HashSet<>(Arrays.asList(
// 1.14+ types
"ACACIA_SIGN",
"BIRCH_SIGN",
"DARK_OAK_SIGN",
"JUNGLE_SIGN",
"OAK_SIGN",
"SPRUCE_SIGN",
// Legacy types
"LEGACY_SIGN",
"LEGACY_SIGN_POST",
"SIGN",
"SIGN_POST"
));
private static boolean legacyMaterials = false;
static {
List<String> legacyMaterialVersions = Arrays.asList("1.7", "1.8", "1.9", "1.10", "1.11", "1.12");
for(String legacyMaterialVersion : legacyMaterialVersions) {
String version = Bukkit.getBukkitVersion();
// Detects '1.8', '1.8.3', '1.8-pre1' style versions
if(version.equals(legacyMaterialVersion)
|| version.startsWith(legacyMaterialVersion + ".")
|| version.startsWith(legacyMaterialVersion + "-")) {
legacyMaterials = true;
break;
}
}
}
/**
* Get material based on a sign material name.
* @param name Name of the sign material
* @return null if not a sign, otherwise the material matching the name (when the material is not available on the current minecraft version, it returns the base type)
*/
public static Material signNameToMaterial(String name) {
// Expected null case
if (!isSign(name)) {
return null;
}
Material result = null;
if (legacyMaterials) {
// 1.12 and lower just know SIGN_POST, WALL_SIGN and SIGN
if (FLOOR_SIGN_TYPES.contains(name)) {
result = Material.getMaterial("SIGN_POST");
} else if (WALL_SIGN_TYPES.contains(name)) {
result = Material.getMaterial("WALL_SIGN");
if (result == null) {
result = Material.getMaterial("SIGN");
}
}
} else {
// Try saved name (works for wood types on 1.14, regular types for below)
result = Material.getMaterial(name);
if (result == null) {
// Cases for 1.13, which don't know wood types, but need new materials
if (FLOOR_SIGN_TYPES.contains(name)) {
// SIGN -> OAK_SIGN for 1.14
result = Material.getMaterial("OAK_SIGN");
// Fallback for 1.13
if (result == null) {
result = Material.getMaterial("SIGN");
}
} else if (WALL_SIGN_TYPES.contains(name)) {
// WALL_SIGN -> OAK_WALL_SIGN for 1.14
result = Material.getMaterial("OAK_WALL_SIGN");
// Fallback for 1.13
if (result == null) {
result = Material.getMaterial("WALL_SIGN");
}
}
}
}
if (result == null) {
AreaShop.debug("Materials.get() null result:", name, "legacyMaterials:", legacyMaterials);
}
return result;
}
/**
* Check if a Material is a sign (of either the wall or floor type).
* @param material Material to check
* @return true if the given material is a sign
*/
public static boolean isSign(Material material) {
return isSign(material.name());
}
/**
* Check if a Material is a sign (of either the wall or floor type).
* @param name String to check
* @return true if the given material is a sign
*/
public static boolean isSign(String name) {
return name != null && name.toUpperCase().contains("SIGN");
}
}
@@ -1,939 +0,0 @@
package me.wiefferink.areashop.tools;
import co.aikar.taskchain.TaskChain;
import co.aikar.taskchain.TaskChainFactory;
import com.sk89q.worldguard.protection.managers.RegionManager;
import com.sk89q.worldguard.protection.regions.ProtectedRegion;
import me.wiefferink.areashop.AreaShop;
import me.wiefferink.areashop.interfaces.WorldEditSelection;
import me.wiefferink.areashop.regions.BuyRegion;
import me.wiefferink.areashop.regions.GeneralRegion;
import me.wiefferink.areashop.regions.RentRegion;
import me.wiefferink.interactivemessenger.Log;
import me.wiefferink.interactivemessenger.processing.Message;
import org.apache.commons.lang.exception.ExceptionUtils;
import org.bukkit.*;
import org.bukkit.block.BlockFace;
import org.bukkit.configuration.Configuration;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.entity.Player;
import org.bukkit.scheduler.BukkitRunnable;
import org.bukkit.scheduler.BukkitTask;
import org.bukkit.util.Vector;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
import java.lang.reflect.Method;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.*;
import java.util.concurrent.CompletableFuture;
import java.util.function.Consumer;
import java.util.function.Supplier;
public class Utils {
private static final BlockFace[] facings = {BlockFace.NORTH, BlockFace.NORTH_EAST, BlockFace.EAST, BlockFace.SOUTH_EAST, BlockFace.SOUTH, BlockFace.SOUTH_WEST, BlockFace.WEST, BlockFace.NORTH_WEST};
public static TaskChainFactory factory;
private static YamlConfiguration config;
private static Set<String> identifiers;
private static Set<String> seconds;
private static Set<String> minutes;
private static Set<String> hours;
private static Set<String> days;
private static Set<String> weeks;
private static Set<String> months;
private static Set<String> years;
private static ScriptEngine scriptEngine;
private static Map<Double, String> suffixes;
// Not used
private Utils() {
}
/**
* Initialize the utilities class with constants.
*
* @param pluginConfig The config of the plugin
*/
public static void initialize(YamlConfiguration pluginConfig) {
config = pluginConfig;
// Setup individual identifiers
seconds = getSetAndDefaults("seconds");
minutes = getSetAndDefaults("minutes");
hours = getSetAndDefaults("hours");
days = getSetAndDefaults("days");
weeks = getSetAndDefaults("weeks");
months = getSetAndDefaults("months");
years = getSetAndDefaults("years");
// Setup all time identifiers
identifiers = new HashSet<>();
identifiers.addAll(seconds);
identifiers.addAll(minutes);
identifiers.addAll(hours);
identifiers.addAll(days);
identifiers.addAll(weeks);
identifiers.addAll(months);
identifiers.addAll(years);
suffixes = new HashMap<>();
// This stuff should not be necessary, but it is, getConfigurationSection() does not do proper fallback to defaults!
// TODO: Create a custom configuration that fixes this behavior
ConfigurationSection suffixesSection = null;
if (config.isSet("metricSymbols")) {
suffixesSection = config.getConfigurationSection("metricSymbols");
} else {
Configuration defaults = config.getDefaults();
if (defaults != null) {
suffixesSection = defaults.getConfigurationSection("metricSymbols");
}
}
if (suffixesSection != null) {
for (String key : suffixesSection.getKeys(false)) {
try {
suffixes.put(Double.parseDouble(key), suffixesSection.getString(key));
} catch (NumberFormatException e) {
Log.warn("Key '" + key + "' in the metricSymbols section of config.yml is not a number!");
}
}
}
}
/**
* Get a string list from the config, combined with the entries specified in the default config.
*
* @param path The path to read the lists from
* @return List with all values defined in the config and the default config combined
*/
private static Set<String> getSetAndDefaults(String path) {
Set<String> result = new HashSet<>(config.getStringList(path));
ConfigurationSection defaults = config.getDefaults();
if (defaults != null) {
result.addAll(defaults.getStringList(path));
}
return result;
}
/**
* Create a message with a list of parts.
*
* @param replacements The parts to use
* @param messagePart The message to use for the parts
* @return A Message object containing the parts combined into one message
*/
public static Message combinedMessage(Collection<?> replacements, String messagePart) {
return combinedMessage(replacements, messagePart, ", ");
}
/**
* Create a message with a list of parts.
*
* @param replacements The parts to use
* @param messagePart The message to use for the parts
* @param combiner The string to use as combiner
* @return A Message object containing the parts combined into one message
*/
public static Message combinedMessage(Collection<?> replacements, String messagePart, String combiner) {
Message result = Message.empty();
boolean first = true;
for (Object part : replacements) {
if (first) {
first = false;
} else {
result.append(combiner);
}
result.append(Message.fromKey(messagePart).replacements(part));
}
return result;
}
/**
* Gets the online players.
* Provides backwards compatibility for 1.7- where it returns an array
*
* @return Online players
*/
@SuppressWarnings("unchecked")
public static Collection<? extends Player> getOnlinePlayers() {
try {
Method onlinePlayerMethod = Server.class.getMethod("getOnlinePlayers");
if (onlinePlayerMethod.getReturnType().equals(Collection.class)) {
return ((Collection<? extends Player>) onlinePlayerMethod.invoke(Bukkit.getServer()));
} else {
return Arrays.asList((Player[]) onlinePlayerMethod.invoke(Bukkit.getServer()));
}
} catch (Exception ex) {
AreaShop.debug("getOnlinePlayers error: " + ex.getMessage());
}
return new HashSet<>();
}
/**
* Create a map from a location, to save it in the config.
*
* @param location The location to transform
* @param setPitchYaw true to save the pitch and yaw, otherwise false
* @return The map with the location values
*/
public static ConfigurationSection locationToConfig(Location location, boolean setPitchYaw) {
if (location == null) {
return null;
}
ConfigurationSection result = new YamlConfiguration();
result.set("world", location.getWorld().getName());
result.set("x", location.getX());
result.set("y", location.getY());
result.set("z", location.getZ());
if (setPitchYaw) {
result.set("yaw", Float.toString(location.getYaw()));
result.set("pitch", Float.toString(location.getPitch()));
}
return result;
}
/**
* Create a map from a location, to save it in the config (without pitch and yaw).
*
* @param location The location to transform
* @return The map with the location values
*/
public static ConfigurationSection locationToConfig(Location location) {
return locationToConfig(location, false);
}
/**
* Create a location from a map, reconstruction from the config values.
*
* @param config The config section to reconstruct from
* @return The location
*/
public static Location configToLocation(ConfigurationSection config) {
if (config == null
|| !config.isString("world")
|| !config.isDouble("x")
|| !config.isDouble("y")
|| !config.isDouble("z")
|| Bukkit.getWorld(config.getString("world")) == null) {
return null;
}
Location result = new Location(
Bukkit.getWorld(config.getString("world")),
config.getDouble("x"),
config.getDouble("y"),
config.getDouble("z"));
if (config.isString("yaw") && config.isString("pitch")) {
result.setPitch(Float.parseFloat(config.getString("pitch")));
result.setYaw(Float.parseFloat(config.getString("yaw")));
}
return result;
}
/**
* Create a comma-separated list.
*
* @param input Collection of object which should be concatenated with comma's in between (skipping null values)
* @return Innput object concatenated with comma's in between
*/
public static String createCommaSeparatedList(Collection<?> input) {
StringBuilder result = new StringBuilder();
boolean first = true;
for (Object object : input) {
if (object != null) {
if (first) {
first = false;
result.append(object.toString());
} else {
result.append(", ").append(object.toString());
}
}
}
return result.toString();
}
/**
* Convert milliseconds to ticks.
*
* @param milliseconds Milliseconds to convert
* @return milliseconds divided by 50 (20 ticks per second)
*/
public static long millisToTicks(long milliseconds) {
return milliseconds / 50;
}
/**
* Convert milliseconds to a human readable format.
*
* @param milliseconds The amount of milliseconds to convert
* @return A formatted string based on the language file
*/
public static String millisToHumanFormat(long milliseconds) {
long timeLeft = milliseconds + 500;
// To seconds
timeLeft /= 1000;
if (timeLeft <= 0) {
return Message.fromKey("timeleft-ended").getPlain();
} else if (timeLeft == 1) {
return Message.fromKey("timeleft-second").replacements(timeLeft).getPlain();
} else if (timeLeft <= 120) {
return Message.fromKey("timeleft-seconds").replacements(timeLeft).getPlain();
}
// To minutes
timeLeft /= 60;
if (timeLeft <= 120) {
return Message.fromKey("timeleft-minutes").replacements(timeLeft).getPlain();
}
// To hours
timeLeft /= 60;
if (timeLeft <= 48) {
return Message.fromKey("timeleft-hours").replacements(timeLeft).getPlain();
}
// To days
timeLeft /= 24;
if (timeLeft <= 60) {
return Message.fromKey("timeleft-days").replacements(timeLeft).getPlain();
}
// To months
timeLeft /= 30;
if (timeLeft <= 24) {
return Message.fromKey("timeleft-months").replacements(timeLeft).getPlain();
}
// To years
timeLeft /= 12;
return Message.fromKey("timeleft-years").replacements(timeLeft).getPlain();
}
// ======================================================================
// Methods to get WorldGuard or AreaShop regions by location or selection
// ======================================================================
/**
* Get the facing direction based on the yaw.
*
* @param yaw The horizontal angle that for example the player is looking
* @return The Block Face of the angle
*/
public static BlockFace yawToFacing(float yaw) {
return facings[Math.round(yaw / 45f) & 0x7];
}
/**
* Get all AreaShop regions intersecting with a WorldEdit selection.
*
* @param selection The selection to check
* @return A list with all the AreaShop regions intersecting with the selection
*/
public static List<GeneralRegion> getRegionsInSelection(WorldEditSelection selection) {
ArrayList<GeneralRegion> result = new ArrayList<>();
for (ProtectedRegion region : getWorldEditRegionsInSelection(selection)) {
GeneralRegion asRegion = AreaShop.getInstance().getFileManager().getRegion(region.getId());
if (asRegion != null) {
result.add(asRegion);
}
}
return result;
}
/**
* Get all AreaShop regions containing a location.
*
* @param location The location to check
* @return A list with all the AreaShop regions that contain the location
*/
public static List<GeneralRegion> getRegions(Location location) {
return getRegionsInSelection(new WorldEditSelection(location.getWorld(), location, location));
}
/**
* Get all WorldGuard regions intersecting with a WorldEdit selection.
*
* @param selection The selection to check
* @return A list with all the WorldGuard regions intersecting with the selection
*/
public static List<ProtectedRegion> getWorldEditRegionsInSelection(WorldEditSelection selection) {
// Get all regions inside or intersecting with the WorldEdit selection of the player
World world = selection.getWorld();
RegionManager regionManager = AreaShop.getInstance().getRegionManager(world);
ArrayList<ProtectedRegion> result = new ArrayList<>();
Location selectionMin = selection.getMinimumLocation();
Location selectionMax = selection.getMaximumLocation();
for (ProtectedRegion region : regionManager.getRegions().values()) {
Vector regionMin = AreaShop.getInstance().getWorldGuardHandler().getMinimumPoint(region);
Vector regionMax = AreaShop.getInstance().getWorldGuardHandler().getMaximumPoint(region);
if (
( // x part, resolves to true if the selection and region overlap anywhere on the x-axis
(regionMin.getBlockX() <= selectionMax.getBlockX() && regionMin.getBlockX() >= selectionMin.getBlockX())
|| (regionMax.getBlockX() <= selectionMax.getBlockX() && regionMax.getBlockX() >= selectionMin.getBlockX())
|| (selectionMin.getBlockX() >= regionMin.getBlockX() && selectionMin.getBlockX() <= regionMax.getBlockX())
|| (selectionMax.getBlockX() >= regionMin.getBlockX() && selectionMax.getBlockX() <= regionMax.getBlockX())
) && ( // Y part, resolves to true if the selection and region overlap anywhere on the y-axis
(regionMin.getBlockY() <= selectionMax.getBlockY() && regionMin.getBlockY() >= selectionMin.getBlockY())
|| (regionMax.getBlockY() <= selectionMax.getBlockY() && regionMax.getBlockY() >= selectionMin.getBlockY())
|| (selectionMin.getBlockY() >= regionMin.getBlockY() && selectionMin.getBlockY() <= regionMax.getBlockY())
|| (selectionMax.getBlockY() >= regionMin.getBlockY() && selectionMax.getBlockY() <= regionMax.getBlockY())
) && ( // Z part, resolves to true if the selection and region overlap anywhere on the z-axis
(regionMin.getBlockZ() <= selectionMax.getBlockZ() && regionMin.getBlockZ() >= selectionMin.getBlockZ())
|| (regionMax.getBlockZ() <= selectionMax.getBlockZ() && regionMax.getBlockZ() >= selectionMin.getBlockZ())
|| (selectionMin.getBlockZ() >= regionMin.getBlockZ() && selectionMin.getBlockZ() <= regionMax.getBlockZ())
|| (selectionMax.getBlockZ() >= regionMin.getBlockZ() && selectionMax.getBlockZ() <= regionMax.getBlockZ())
)
) {
result.add(region);
}
}
return result;
}
/**
* Get a list of regions around a location.
* - Returns highest priority, child instead of parent regions
*
* @param location The location to check for regions
* @return empty list if no regions found, 1 member if 1 region is a priority, more if regions with the same priority
*/
public static List<ProtectedRegion> getImportantWorldEditRegions(Location location) {
List<ProtectedRegion> result = new ArrayList<>();
Set<ProtectedRegion> regions = AreaShop.getInstance().getWorldGuardHandler().getApplicableRegionsSet(location);
if (regions != null) {
boolean first = true;
for (ProtectedRegion pr : regions) {
if (first) {
result.add(pr);
first = false;
} else {
if (pr.getPriority() > result.get(0).getPriority()) {
result.clear();
result.add(pr);
} else if (pr.getParent() != null && pr.getParent().equals(result.get(0))) {
result.clear();
result.add(pr);
} else {
result.add(pr);
}
}
}
}
return result;
}
/**
* Get the most important rental AreaShop regions.
* - Returns highest priority, child instead of parent regions.
*
* @param location The location to check for regions
* @return empty list if no regions found, 1 member if 1 region is a priority, more if regions with the same priority
*/
public static List<RentRegion> getImportantRentRegions(Location location) {
List<RentRegion> result = new ArrayList<>();
for (GeneralRegion region : getImportantRegions(location, GeneralRegion.RegionType.RENT)) {
result.add((RentRegion) region);
}
return result;
}
/**
* Get the most important buy AreaShop regions.
* - Returns highest priority, child instead of parent regions.
*
* @param location The location to check for regions
* @return empty list if no regions found, 1 member if 1 region is a priority, more if regions with the same priority
*/
public static List<BuyRegion> getImportantBuyRegions(Location location) {
List<BuyRegion> result = new ArrayList<>();
for (GeneralRegion region : getImportantRegions(location, GeneralRegion.RegionType.BUY)) {
result.add((BuyRegion) region);
}
return result;
}
/**
* Get the most important AreaShop regions.
* - Returns highest priority, child instead of parent regions.
*
* @param location The location to check for regions
* @return empty list if no regions found, 1 member if 1 region is a priority, more if regions with the same priority
*/
public static List<GeneralRegion> getImportantRegions(Location location) {
return getImportantRegions(location, null);
}
/**
* Get the most important AreaShop regions.
* - Returns highest priority, child instead of parent regions.
*
* @param location The location to check for regions
* @param type The type of regions to look for, null for all
* @return empty list if no regions found, 1 member if 1 region is a priority, more if regions with the same priority
*/
public static List<GeneralRegion> getImportantRegions(Location location, GeneralRegion.RegionType type) {
List<GeneralRegion> result = new ArrayList<>();
Set<ProtectedRegion> regions = AreaShop.getInstance().getWorldGuardHandler().getApplicableRegionsSet(location);
if (regions != null) {
List<GeneralRegion> candidates = new ArrayList<>();
for (ProtectedRegion pr : regions) {
GeneralRegion region = AreaShop.getInstance().getFileManager().getRegion(pr.getId());
if (region != null && (
(type == GeneralRegion.RegionType.RENT && region instanceof RentRegion)
|| (type == GeneralRegion.RegionType.BUY && region instanceof BuyRegion)
|| type == null)) {
candidates.add(region);
}
}
boolean first = true;
for (GeneralRegion region : candidates) {
if (region == null) {
AreaShop.debug("skipped null region");
continue;
}
if (first) {
result.add(region);
first = false;
} else {
if (region.getRegion().getPriority() > result.get(0).getRegion().getPriority()) {
result.clear();
result.add(region);
} else if (region.getRegion().getParent() != null && region.getRegion().getParent().equals(result.get(0).getRegion())) {
result.clear();
result.add(region);
} else {
result.add(region);
}
}
}
}
return new ArrayList<>(result);
}
/**
* Convert color and formatting codes to bukkit values.
*
* @param input Start string with color and formatting codes in it
* @return String with the color and formatting codes in the bukkit format
*/
public static String applyColors(String input) {
String result = null;
if (input != null) {
result = ChatColor.translateAlternateColorCodes('&', input);
}
return result;
}
/**
* Format the currency amount with the characters before and after.
*
* @param amount Amount of money to format
* @return Currency character format string
*/
public static String formatCurrency(double amount) {
String before = config.getString("moneyCharacter");
before = before.replace(AreaShop.currencyEuro, "€");
String after = config.getString("moneyCharacterAfter");
after = after.replace(AreaShop.currencyEuro, "€");
String result;
// Check for infinite and NaN
if (Double.isInfinite(amount)) {
result = "\u221E"; // Infinite symbol
} else if (Double.isNaN(amount)) {
result = "NaN";
} else {
BigDecimal bigDecimal = BigDecimal.valueOf(amount);
boolean stripTrailingZeros = false;
int fractionalNumber = config.getInt("fractionalNumbers");
// Add metric suffix if necessary
if (config.getDouble("metricSuffixesAbove") != -1) {
String suffix = null;
double divider = 1;
for (Double number : suffixes.keySet()) {
if (amount >= number && number > divider) {
divider = number;
suffix = suffixes.get(number);
}
}
if (suffix != null) {
bigDecimal = BigDecimal.valueOf(amount / divider);
after = suffix + after;
fractionalNumber = config.getInt("fractionalNumbersShort");
stripTrailingZeros = true;
}
}
// Round if necessary
if (fractionalNumber >= 0) {
bigDecimal = bigDecimal.setScale(fractionalNumber, RoundingMode.HALF_UP);
}
result = bigDecimal.toString();
if (config.getBoolean("hideEmptyFractionalPart")) {
// Strip zero fractional: 12.00 -> 12
if (bigDecimal.remainder(BigDecimal.ONE).compareTo(BigDecimal.ZERO) == 0 && result.contains(".")) {
result = result.substring(0, result.indexOf('.'));
}
// Strip zeros from suffixed numbers: 1.20M -> 1.2M
if (stripTrailingZeros && result.contains(".")) {
result = result.replaceAll("0+$", "");
}
}
}
result = result.replace(".", config.getString("decimalMark"));
Message resultMessage = Message.fromString(result);
resultMessage.prepend(before);
resultMessage.append(after);
return resultMessage.getSingle();
}
/**
* Checks if the string is a correct time period.
*
* @param time String that has to be checked
* @return true if format is correct, false if not
*/
public static boolean checkTimeFormat(String time) {
// Check if the string is not empty and check the length
if (time == null || time.length() <= 1 || time.indexOf(' ') == -1 || time.indexOf(' ') >= (time.length() - 1)) {
return false;
}
// Check if the suffix is one of these values
String suffix = time.substring(time.indexOf(' ') + 1);
if (!identifiers.contains(suffix)) {
return false;
}
// check if the part before the space is a number
String prefix = time.substring(0, (time.indexOf(' ')));
return prefix.matches("\\d+");
}
// LEGACY TIME INPUT CONVERSION
/**
* Methode to tranlate a duration string to a millisecond value.
*
* @param duration The duration string
* @return The duration in milliseconds translated from the durationstring, or if it is invalid then 0
*/
public static long durationStringToLong(String duration) {
if (duration == null) {
return 0;
} else if (duration.equalsIgnoreCase("disabled") || duration.equalsIgnoreCase("unlimited") || duration.isEmpty()) {
return -1;
} else if (duration.indexOf(' ') == -1) {
return 0;
}
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(0);
String durationString = duration.substring(duration.indexOf(' ') + 1);
int durationInt = 0;
try {
durationInt = Integer.parseInt(duration.substring(0, duration.indexOf(' ')));
} catch (NumberFormatException exception) {
// No Number found, add zero
}
if (seconds.contains(durationString)) {
calendar.add(Calendar.SECOND, durationInt);
} else if (minutes.contains(durationString)) {
calendar.add(Calendar.MINUTE, durationInt);
} else if (hours.contains(durationString)) {
calendar.add(Calendar.HOUR, durationInt);
} else if (days.contains(durationString)) {
calendar.add(Calendar.DAY_OF_MONTH, durationInt);
} else if (weeks.contains(durationString)) {
calendar.add(Calendar.DAY_OF_MONTH, durationInt * 7);
} else if (months.contains(durationString)) {
calendar.add(Calendar.MONTH, durationInt);
} else if (years.contains(durationString)) {
calendar.add(Calendar.YEAR, durationInt);
} else {
AreaShop.warn("Unknown duration indicator:", durationString, "check if config.yml has the correct time indicators");
}
return calendar.getTimeInMillis();
}
/**
* Get setting from config that could be only a number indicating seconds.
* or a string indicating a duration string
*
* @param path Path of the setting to read
* @return milliseconds that the setting indicates
*/
public static long getDurationFromSecondsOrString(String path) {
if (config.isLong(path) || config.isInt(path)) {
long setting = config.getLong(path);
if (setting != -1) {
setting *= 1000;
}
return setting;
} else {
return durationStringToLong(config.getString(path));
}
}
/**
* Get setting from config that could be only a number indicating minutes.
* or a string indicating a duration string.
*
* @param path Path of the setting to read
* @return milliseconds that the setting indicates
*/
public static long getDurationFromMinutesOrString(String path) {
if (config.isLong(path) || config.isInt(path)) {
long setting = config.getLong(path);
if (setting != -1) {
setting *= 60 * 1000;
}
return setting;
} else {
return durationStringToLong(config.getString(path));
}
}
/**
* Parse a time setting that could be minutes or a duration string.
*
* @param input The string to parse
* @return milliseconds that the string indicates
*/
public static long getDurationFromMinutesOrStringInput(String input) {
long number;
try {
number = Long.parseLong(input);
if (number != -1) {
number *= 60 * 1000;
}
return number;
} catch (NumberFormatException e) {
return durationStringToLong(input);
}
}
/**
* Parse a time setting that could be seconds or a duration string.
*
* @param input The string to parse
* @return seconds that the string indicates
*/
public static long getDurationFromSecondsOrStringInput(String input) {
long number;
try {
number = Long.parseLong(input);
if (number != -1) {
number *= 1000;
}
return number;
} catch (NumberFormatException e) {
return durationStringToLong(input);
}
}
/**
* Check if an input is numeric.
*
* @param input The input to check
* @return true if the input is numeric, otherwise false
*/
@SuppressWarnings("ResultOfMethodCallIgnored")
public static boolean isNumeric(String input) {
try {
Integer.parseInt(input);
return true;
} catch (NumberFormatException ignored) {
return false;
}
}
/**
* Check if a string is a double.
*
* @param input The input
* @return true if the input is a double, otherwise false
*/
@SuppressWarnings("ResultOfMethodCallIgnored")
public static boolean isDouble(String input) {
try {
Double.parseDouble(input);
return true;
} catch (NumberFormatException e) {
return false;
}
}
// NAME <-> UUID CONVERSION
/**
* Evaluate string input to a number.
* Uses JavaScript for expressions.
*
* @param input The input string
* @param region The region to apply replacements for and use for logging
* @return double evaluated from the input or a very high default in case of a script exception
*/
public static double evaluateToDouble(String input, GeneralRegion region) {
// Replace variables
input = Message.fromString(input).replacements(region).getSingle();
// Check for simple number
if (isDouble(input)) {
return Double.parseDouble(input);
}
// Lazy init scriptEngine
if (scriptEngine == null) {
scriptEngine = new ScriptEngineManager().getEngineByName("JavaScript");
}
// Evaluate expression
Object result;
try {
result = scriptEngine.eval(input);
} catch (ScriptException e) {
AreaShop.warn("Price of region", region.getName(), "is set with an invalid expression: '" + input + "', exception:", ExceptionUtils.getStackTrace(e));
return 99999999999.0; // High fallback for safety
}
// Handle the result
if (Utils.isDouble(result.toString())) {
return Double.parseDouble(result.toString());
} else {
AreaShop.warn("Price of region", region.getName(), "is set with the expression '" + input + "' that returns a result that is not a number:", result);
return 99999999999.0; // High fallback for safety
}
}
/**
* Conversion to name by uuid.
*
* @param uuid The uuid in string format
* @return the name of the player
*/
public static String toName(String uuid) {
String result = "";
if (uuid != null) {
try {
UUID parsed = UUID.fromString(uuid);
result = toName(parsed);
} catch (IllegalArgumentException e) {
// Incorrect UUID
}
}
return result;
}
/**
* Conversion to name by uuid object.
*
* @param uuid The uuid in string format
* @return the name of the player
*/
public static String toName(UUID uuid) {
if (uuid != null) {
String name = Bukkit.getOfflinePlayer(uuid).getName();
if (name != null) {
return name;
}
}
return "";
}
public static CompletableFuture<String> toNameAsync(UUID uuid) {
if (uuid == null) {
return CompletableFuture.completedFuture("");
}
CompletableFuture<String> completableFuture = new CompletableFuture<>();
Bukkit.getScheduler().runTaskAsynchronously(AreaShop.getInstance(), () -> {
final OfflinePlayer offlinePlayer = Bukkit.getOfflinePlayer(uuid);
if (!offlinePlayer.hasPlayedBefore()) {
completableFuture.complete("");
} else {
completableFuture.complete(offlinePlayer.getName());
}
});
return completableFuture;
}
/**
* Conversion from name to uuid.
*
* @param name The name of the player
* @return The uuid of the player
*/
@SuppressWarnings("deprecation") // Fake deprecation by Bukkit to inform developers, method will stay
public static String toUniqueId(String name) {
if (name == null) {
return null;
} else {
return Bukkit.getOfflinePlayer(name).getUniqueId().toString();
}
}
public static <T> TaskChain<T> newChain() {
return factory.newChain();
}
public static <T> TaskChain<T> newSharedChain(String name) {
return factory.newSharedChain(name);
}
public static <E> CompletableFuture<?> runAsBatches(final Collection<E> objects, final int batchSize, final Consumer<E> task, final boolean async) {
if (batchSize < 1) {
throw new IllegalArgumentException("Invalid batch size!");
}
final List<E> cloned = new ArrayList<>(objects);
final CompletableFuture<Object> future = new CompletableFuture<>();
BukkitRunnable runnable = new BukkitRunnable() {
int lastIndex;
@Override
public void run() {
if (lastIndex >= cloned.size() - 1) {
future.complete(true);
cancel();
return;
}
int index = Math.min(batchSize, objects.size() - 1);
cloned.subList(lastIndex, index).forEach(task);
}
};
if (async) {
runnable.runTaskTimerAsynchronously(AreaShop.getInstance(), 1, 1);
} else {
runnable.runTaskTimer(AreaShop.getInstance(), 1, 1);
}
return future;
}
public static BukkitTask runCancellingTaskTimer(final Supplier<Boolean> task, final long delay, final long period, boolean async) {
BukkitRunnable runnable = new BukkitRunnable() {
@Override
public void run() {
if (!task.get()) {
cancel();
}
}
};
if(async) {
return runnable.runTaskTimerAsynchronously(AreaShop.getInstance(), delay, period);
} else {
return runnable.runTaskTimer(AreaShop.getInstance(), delay, period);
}
}
}
@@ -1,30 +0,0 @@
package me.wiefferink.areashop.tools;
public class Value<T> {
private T content;
/**
* Create a container with a default content.
* @param content The content to set
*/
public Value(T content) {
this.content = content;
}
/**
* Get the stored content.
* @return The stored content
*/
public T get() {
return content;
}
/**
* Set the content.
* @param value The new content
*/
public void set(T value) {
this.content = value;
}
}
-181
View File
@@ -1,181 +0,0 @@
# ╔════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╗
# ║ config.yml file of the AreaShop plugin created by NLThijs48, Github can be found at https://github.com/NLthijs48/AreaShop. ║
# ║ This file contains options to change the working of the plugin, the profiles defined here can be used in default.yml. ║
# ║ More information and tutorials can be found on the wiki: https://github.com/NLthijs48/AreaShop/wiki ║
# ╚════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╝
# ┌────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
# │ GENERAL: Options that influence the global state of the plugin │
# └────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
# Chat prefix used for all messages in the chat, also changes the greeting messages.
chatPrefix:
- '[darkgreen][AreaShop][reset]'
- ' hover: AreaShop region management plugin'
- ' hover: %lang:action|Click to check the available commands|%'
- ' command: /areashop help'
- ' '
# The language file that should be used, check the 'lang' folder for build-in languages (use the filename without .yml here).
# More information can be found here: https://github.com/NLthijs48/AreaShop/wiki/Language-support.
language: EN
# The tags that need to be written on the first line of a sign to add it to AreaShop.
signTags:
# Add a rental region.
rent: '[asrent]'
# Add a buy region.
buy: '[asbuy]'
# Add a sign to an existing region.
add: '[as]'
# ┌────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
# │ ECONOMY: Options to change the display of prices. │
# └────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
# The characters displayed before a price.
moneyCharacter: '$'
# The characters displayed after a price.
moneyCharacterAfter: ''
# The character(s) to use as decimal mark.
decimalMark: '.'
# How many numbers behind the dot should be shown (2 will make numbers like '8.55', '9.01', '5.20').
fractionalNumbers: 2
# How many numbers behind the dot should be shown when using a metric symbol suffix.
fractionalNumbersShort: 3
# Set this to true if you want to hide '.0' for a number like '15.0' ('4.50' will still stay '4.50').
hideEmptyFractionalPart: true
# Use a suffix if the price is above a certain number (use 1.00M instead of 1000000.00 etc.)
metricSymbols:
#1000: "k"
1000000: "M"
1000000000: "G"
1000000000000: "T"
1000000000000000: "P"
1000000000000000000: "E"
1000000000000000000000: "Z"
1000000000000000000000000: "Y"
# ┌────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
# │ RENTING: Options that apply to all rent regions. │
# └────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
# Timeformat to use on the signs, default is like '30-06 14:52', US format: 'MM-dd KK:mm a'.
# Search for 'java SimpleDateFormat' for more options and documentation.
timeFormatSign: 'dd-MM HH:mm'
# Timeformat used in the chat, default is like '30 june 2014 14:52', US format: 'MMMMMMMMMMMMMMMMM dd yyyy KK:mm a'.
# Search for 'java SimpleDateFormat' for more options and documentation.
timeFormatChat: 'dd MMMMMMMMMMMMMMMMM yyyy HH:mm'
# Time indicators, used for specifing time periods (for example rent duration).
seconds: [s, sec, secs, second, seconds]
minutes: [m, min, mins, minute, minutes]
hours: [h, hour, hours]
days: [d, day, days]
weeks: [w, week, weeks]
months: [M, month, months]
years: [y, year, years]
# ┌────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
# │ PERMISSION GROUPS: Assigned by giving players certain permissions. │
# └────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
# Configure the max total regions, max rent regions and max buy regions with different groups (-1 is unlimited).
# Assign a group to players by giving them the permission 'areashop.limits.<group>'.
# Every player already has the group 'default', OPs bypass the limits because of the 'areashop.limitbypass' permission.
# All the groups applied to the player will be checked and only if they all allow an extra region it will be allowed.
# More information like limits for regions of a certain group or in a certain word can be found here:
# https://github.com/NLthijs48/AreaShop/wiki/Limitgroups-information-and-examples.
limitGroups:
default:
total: 1
rents: 1
buys: 1
# ┌────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
# │ ADVANCED AND DEBUG: Specific options to tweak the plugin precisely and check if it functions correctly. │
# └────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
# Blacklist of region names that cannot be added to AreaShop for renting or buying. Regular expressions can be used, search
# for 'java regex pattern' to find documentation about how to use it.
# Example: Blocking all regions that have a name like 'house_1', 'house_2', etc. would be done with 'house_\d+'.
# The '\d' represents the numerical digits 0-9, the + symbol represents 1 or more times repeated.
# This means it would also block 'house_123' and 'house_000456'. It will not block 'ahouse_1' or 'house_'.
blacklist:
- '__global__'
# Minimum length of the numbers that are suffixed for region names generated by the '/as stack' command.
# When having this at 3 it will generate names like this: 'region-001', 'region-014', 'region-4567'.
stackRegionNumberLength: 3
# Allow/disallow adding players that did not visit the server yet as friend of a region.
addFriendNotExistingPlayers: false
# Enable sending stats to http://mcstats.org/ (Metrics plugin).
# This information will give me an indication about how much the plugin is used and encourages me to continue development.
sendStats: true
# If enabled it will check for updates when loading the plugin, it will never download files, it will only notify about it.
checkForUpdates: true
# Use colors when sending messages to console and log files.
useColorsInConsole: false
# Use tellraw style messages, which can be interacted with by players
useFancyMessages: true
# Update all region flags and signs after starting the plugin.
# This ensures that changes to the config are directly visible after restarting the server.
updateRegionsOnStartup: 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: ${project.version}
# Maximum number of blocks to save to or restore from a .schemetic file.
maximumBlocks: 1000000
# Maximum number of locations the teleport function should check to find a safe spot.
maximumTries: 50000
# ┌────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
# │ VARIABLES: Variables that can be used in messages and settings where a region is available. │
# └────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
# If a tag has no value (for example %player% when the region is not rented/bought) then the tag will not get replaced.
# %region% The region name (with correct capitalization).
# %player% The name of the player that rents/buys the region (with correct capitalization).
# %uuid% The UUID of the player that rents/buys the region.
# %friends% The names of friends added to this region separated by ', '.
# %friendsuuid% The UUID's of friends added to this region separated by ', '.
# %landlord% The name of the landlord.
# %landlorduuid% The UUID of the landlord.
# %price% The price of the region formatted with the configured characters before and after the number.
# %rawprice% The price without formatting, like '10.0' or '7.77'.
# %duration% The duration of a rent region, for example '1 d', '4 minutes' or '2 years'.
# %world% The name of the world that the region is in.
# %type% The type of the region, 'rent' or 'buy'.
# %until% The end time of a rent formatted as configured with 'timeFormatChat'.
# %untilshort% The end time of a rent formatted as configured with 'timeFormatSign'.
# %width% The width of the region (number of blocks on the x-axis).
# %depth% The depth of the region (number of blocks on the z-axis).
# %volume% The number of blocks in a region (accounting for polygon shaped regions).
# %height% The height of the region (number of blocks on the y-axis).
# %timeleft% The time left on the rent (uses the unit of time that fits best, minutes used from 121 seconds till 120 minutes).
# %clicker% The name of the player that clicked the sign (only to be used in the signProfiles section).
# %resellprice% The price of a region when it is in resell mode.
# %rawresellprice% The resellprice without formatting.
# %moneyback% The amount of money the player will get back when unrenting/selling the region (formatted with currency layout).
# %rawmoneyback% The moneyback without formatting.
# %moneybackpercent% The percentage of the price the player will get back when unrenting the region.
# %timesExtended% The number of times the region has been extended (zero when first rented)
# %maxextends% The maximum number of extends a player can do on the region.
# %extendsleft% The number of extends that are left (maxextends - timesextended).
# %maxrenttime% The maximum time you can rent a region in advance (human readable).
# %inactivetime% The maximum time a player may be inactive before unrent/sell (human readable).
# %year% The current year.
# %month% The current month in the year.
# %day% The current day in the month.
# %hour% The current hour in the day (0-23).
# %minute% The current minute of the hour.
# %second% The current second of the minute.
# %millisecond% The current millisecond of the second.
# %epoch% The number of milliseconds since January 1, 1970 (Unix Epoch).
# %tpx% The exact x coordinate of the location that the teleport is set to
# %tpy% The exact y coordinate of the location that the teleport is set to
# %tpz% The exact z coordinate of the location that the teleport is set to
# %tpblockx% The rounded x coordinate of the location that the teleport is set to
# %tpblocky% The rounded y coordinate of the location that the teleport is set to
# %tpblockz% The rounded z coordinate of the location that the teleport is set to
# %tppitch% The exact pitch of the teleport location
# %tppitchround% The rounded pitch of the teleport location
# %tpyaw% The exact yaw of the teleport location
# %tpyawround% The rounded yaw of the teleport location
# %tpworld% The world name of the teleport location
# %lang:<languageKey>|Optional arguments|% Insert a message from EN.yml, for example: '%lang:timeleft-ended%' or '%lang:timeleft-years|15|%'
-249
View File
@@ -1,249 +0,0 @@
# ╔════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╗
# ║ default.yml file of the AreaShop plugin created by NLThijs48, Github can be found at https://github.com/NLthijs48/AreaShop.║
# ║ All settings below are default settings and can be overridden by group settings or individual region settings. ║
# ║ More information and tutorials can be found on the wiki: https://github.com/NLthijs48/AreaShop/wiki ║
# ╚════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╝
# ┌────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
# │ GENERAL: Settings that apply to all regions. │
# └────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
general:
# The y location within the region to start searching for safe teleport locations (x and z are in the middle of the region).
# Possible values: 'bottom', 'middle', 'top' or a number indicating an exact y coordinate.
teleportLocationY: bottom
# If true the teleportation algorithm only allows teleportation to inside the region, otherwise it will expand
# a cube from the starting point to check for safe spots (then it could end outside of the region).
teleportIntoRegion: true
# Same as above, but then for when you teleport to the sign of a region instead of the region itself.
teleportToSignIntoRegion: false
# Allow teleporting to the region from another world with `/as tp`
teleportCrossWorld: true
# When teleporting to a sign, the number of blocks the player should get teleported away from the sign
teleportSignDistance: 1
# Should '/as find' find this region while the player is in another world? (prevents cross-world teleport if turned off)
findCrossWorld: true
# Set where the '/as find' command should teleport the player to, set to true for the first sign of the region and set to
# false to teleport to the location set by '/as settp' or the default location (if not set).
findTeleportToSign: true
# Restricts buying and renting of regions to the world of the region.
restrictedToWorld: false
# Restricts buying and renting of regions to the region itself (player needs to be inside the region).
restrictedToRegion: false
# The UUID of the landlord, this player will receive all money from rents/buys (but not reselling with '/as resell').
landlord: ''
# Name of the landlord, if the landlord UUID setting is not provided then the name will be used instead.
landlordName: ''
# Disable to prevent counting this region towards limits set by 'limitGroups' in config.yml.
countForLimits: true
##### Set the layout and functions of the signs.
# The following sections can be added for performing certain commands when the sign is clicked:
# rightClickPlayer, rightClickConsole, shiftRightClickPlayer, shiftRightClickConsole,
# leftClickPlayer, leftClickConsole, shiftLeftClickPlayer, shiftLeftClickConsole.
# Sections with 'Player' at the end will be run by the player that clicks the sign and 'Console' ones from the console.
signProfile:
forrent:
line1: '&2&l[For Rent]'
line2: '%region%'
line3: '%duration%'
line4: '%price%'
rightClickPlayer:
- 'areashop rent %region%'
rightClickConsole:
# - 'areashop message %clicker% %lang:confirm-rent|%region%|%' # Alternative to first ask for confirmation (remove rightClickPlayer section)
leftClickPlayer:
- 'areashop info region %region%'
rented:
line1: '&4&l[Rented]'
line2: '%region%'
line3: '%player%'
line4: '%untilshort%'
rightClickPlayer:
- 'areashop rent %region%'
rightClickConsole:
# - 'areashop message %clicker% %lang:confirm-extend|%region%|%' # Alternative to first ask for confirmation (remove rightClickPlayer section)
leftClickPlayer:
- 'areashop info region %region%'
shiftRightClickConsole:
- 'areashop message %clicker% %lang:confirm-unrent|%region%|%'
forsale:
line1: '&2&l[For Sale]'
line2: '%region%'
line3: '%price%'
line4:
rightClickPlayer:
- 'areashop buy %region%'
rightClickConsole:
# - 'areashop message %clicker% %lang:confirm-buy|%region%|%' # Alternative to first ask for confirmation (remove rightClickPlayer section)
leftClickPlayer:
- 'areashop info region %region%'
resell:
line1: '&9&l[Resale]'
line2: '%region%'
line3: '%resellprice%'
line4: '&8%player%'
rightClickPlayer:
- 'areashop buy %region%'
rightClickConsole:
# - 'areashop message %clicker% %lang:confirm-buy|%region%|%' # Alternative to first ask for confirmation (remove rightClickPlayer section)
leftClickPlayer:
- 'areashop info region %region%'
shiftRightClickPlayer:
- 'areashop stopresell %region%'
sold:
line1: '&4&l[Sold]'
line2: '%region%'
line3: '%player%'
line4:
rightClickPlayer:
- 'areashop buy %region%'
leftClickPlayer:
- 'areashop info region %region%'
shiftRightClickConsole:
- 'areashop message %clicker% %lang:confirm-sell|%region%|%'
##### Set WorldGuard regions flags depending on the region state.
# All normal region flags as present in WorldGuard can be used, in addition to 'members', 'owners', 'priority' and 'parent'.
# The members and owners flag normally take a list of UUID's separated by a comma, adding by name is possible with 'n:<name>'.
# You can add groups by using 'g:<groupname>', so an example woul be: '%uuid%, %friendsuuid%, g:vip, n:coolGuy'.
# For allow/deny flags like 'entry' and 'exit' you can set the group setting by using 'g:<scope>', <scope> is one of the following:
# members, non_members, owners, non_owners, all. Example, only members can enter the region:
# entry: 'deny g:non_members'
# '' will remove the flag from the region.
flagProfile:
ALL: # Flags that should always be applied
priority: 10
owners: ''
members: ''
interact: 'deny g:non_members' # Only allow region members/owners to use things in the region (chests, furnace, animals, etc.)
use: 'deny g:non_members'
build: 'deny g:non_members'
block-break: 'deny g:non_members'
block-place: 'deny g:non_members'
forrent:
greeting: '%lang:prefix%%lang:greeting-forrent%'
rented:
members: '%uuid%, %friendsuuid%'
greeting: '%lang:prefix%%lang:greeting-rented%'
forsale:
greeting: '%lang:prefix%%lang:greeting-forsale%'
sold:
members: '%uuid%, %friendsuuid%'
greeting: '%lang:prefix%%lang:greeting-bought%'
resell:
members: '%uuid%, %friendsuuid%'
greeting: '%lang:prefix%%lang:greeting-resale%'
##### Save and restore schematics to clean up regions.
# After 'save:' or 'restore:' you enter the name of the file to restore from/to (.schematic is added automatically).
# Set to true to enable saving/restoring for regions as specified in the profile below, which is specified in the config.
enableRestore: false
schematicProfile:
created:
save: '%type%-%region%'
restore: ''
deleted:
save: ''
restore: '%type%-%region%'
rented:
save: '%type%-%region%'
restore: ''
unrented:
save: ''
restore: '%type%-%region%'
bought:
save: '%type%-%region%'
restore: ''
sold:
save: ''
restore: '%type%-%region%'
resell:
save: ''
restore: ''
##### Run commands when an event happens.
# Commands at a 'before' section will execute before the region details are changed in the AreaShop system
# and before any other actions occurred (setting the owner, saving/loading schematics, etc.),
# the 'after' commands will be run when all changes are done.
# You can add a list of commands to 'before' and 'after'.
eventCommandProfile:
created:
before:
after:
# - "say An AreaShop region has been created: %region%"
deleted:
before:
after:
rented:
before:
after:
extended:
before:
after:
unrented:
before:
after:
bought:
before:
after:
sold:
before:
after:
resell:
before:
after:
# ┌────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
# │ RENT: Settings that apply to rent regions. │
# └────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
rent:
# The default price of a rental region (variables, mathematical expressions and JavaScript can be used).
price: 1000
# The default duration of a rental region, you can find all time indicators in config.yml below the RENTING header.
duration: '1 day'
# Automatically extend the rental when it is running out (if the player meets the criteria)
autoExtend: false
# The percentage of the rent price you get back if you unrent the region (only the time that is unused is given back).
# (variables, mathematical expressions and JavaScript can be used)
moneyBack: 100
# Maximum number of extends a player can do (-1 for infinite, 0 for no extending), if they are at this number then
# they are force to let their rent run out (and can rent it again at that point).
maxExtends: -1
# The Maximum time they can have the region rented in advance (use times like '1 day' etc, or 'unlimited' for no limit).
# This can prevent players from renting their region for a year, and to ensure they periodically have to extend their rent.
maxRentTime: 'unlimited'
# Automatically unrent the region after the specified time between the last login time of the renter and the current time.
# Use times like '1 day' etc, or 'disabled' for never.
inactiveTimeUntilUnrent: 'disabled'
# If a region of a player has less then this time left when he joins the server he will get a notice about his region.
# Use '' to disable.
warningOnLoginTime: '1 day'
# If renting the region would go above 'maxRentTIme', then extend to the maximum instead of cancelling the rent.
extendToFullWhenAboveMaxRentTime: true
##### Run commands a certain time before expiration of a region.
# Time identifiers specify how much time before the rent is over the commands should be executed.
# These commands are executed in a 'best effort' manner, if your server is offline when it should trigger then it won't run.
expirationWarningProfile:
'1 day':
- "areashop message %player% %lang:prefix%%lang:rent-expiringSoon|%region%|%timeleft%|%"
'1 hour':
- "areashop message %player% %lang:prefix%%lang:rent-expiringSoon|%region%|%timeleft%|%"
'5 minutes':
- "areashop message %player% %lang:prefix%%lang:rent-expiringSoon|%region%|%timeleft%|%"
# ┌────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
# │ BUY: Settings that apply to buy regions. │
# └────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
buy:
# The default price of a buy region (variables, mathematical expressions and JavaScript can be used).
price: 1000
# The percentage of the price you get back if you sell the region (variables, mathematical expressions and JavaScript can be used)
moneyBack: 100
# Automatically sell the region after the specified number of minutes between the last login time of the buyer and the current time
# Use times like '1 day' etc, or 'disabled' for never.
inactiveTimeUntilSell: 'disabled'
# Selling is disabled for the region owner (players with areashop.sellown without areashop.sell)
sellDisabled: false
# Reselling is disabled for the region owner (players with areashop.resell without areashop.resellall)
resellDisabled: false
@@ -1,58 +0,0 @@
# ╔════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╗
# ║ hiddenConfig.yml file of the AreaShop plugin created by NLThijs48. ║
# ║ Options in this file are available in config.yml, but are not shown by default there. ║
# ║ The options in these file are either very advanced, or not useful for the majority of users. ║
# ╚════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╝
# ┌────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
# │ TIMERS: Settings to define how often scheduled tasks run. │
# └────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
# Setting the 'delay' setting to 0 or lower will prevent the taks from runnning.
# The 'delay' settings are specified using a number followed by one of the identifiers as defined in config.yml.
# The 'regionsPerTick' settings are to configure how fast something goes, lower value is less lag, but slower updates.
# There are 20 ticks in 1 second, so if you set 'regionPerTick' to 5, then 5*20=100 regions per second will be updated.
# Timings for saving files that need saving.
saving:
delay: '11 minutes'
regionsPerTick: 1
# Timings for rent expiration checking.
expiration:
delay: '14 seconds'
regionsPerTick: 5
# Timings for expiration warning to online players.
expireWarning:
delay: '11 seconds'
regionsPerTick: 5
# Timings for updating signs and region flags ('/as reload' or after '/as groupadd' or '/as groupdel').
update:
regionsPerTick: 10
# Time between checking if any regions need to be unrented because the player was not online for the specified time period.
inactive:
delay: '17 minutes'
regionsPerTick: 5
# Timings for the periodic updating of signs (for timeleft tags etc).
signs:
delay: '1 minute'
regionsPerTick: 3
# Number of regions per tick to check when a player joins to see if his name changed for regions he owned (updates the regions when changed).
nameupdate:
regionsPerTick: 10
# Timings for adding regions to AreaShop ('/as stack').
adding:
regionsPerTick: 2
# ┌────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
# │ OTHER: All other settings. │
# └────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
# Allow or disallow extending a rental region when the player is above his limits enforced by the 'limitGroups' section below.
# false will ensure a player will eventually lose his region when he has no access anymore.
allowRegionExtendsWhenAboveLimits: false
# Flag profiles that can be used by the 'general.flagProfile' setting in default.yml
flagProfiles:
# Event command profiles that can be used by the 'general.eventCommandProfile' setting in default.yml
eventCommandProfiles:
# Sign profiles that can be used by the 'general.signProfile' setting in default.yml
signProfiles:
# Schematic profiles that can be used by the 'general.schematicProfile' setting in default.yml
schematicProfiles:
-521
View File
@@ -1,521 +0,0 @@
# ╔═════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════
# ║ Language file of the AreaShop plugin created by NLThijs48, Github can be found at https://github.com/NLthijs48/AreaShop
# ║ German language file, plugin version 2.5.0, 396/428 messages are translated (93%)
# ║
# ║ 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`
# ║ 3: Change the `language` setting in config.yml to `servername`, do not include `.yml`
# ║ 4: Change the messages in the new file to your liking
# ║ 5: Use `/as reload`or reload/restart your server to see the changes
# ╚═════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════
"action": "[gold][bold]<%0%>[/bold]"
"button": "[bold]<%0%>[/bold]"
"command":
- "[bold]%0%[/bold]"
- " hover: %lang:action|Benutze %1%|%"
- " command: %1%"
"helpCommand":
- "[gold]%0% [gray]-[reset]"
- " hover: %lang:action|Benutze %0%|%"
- " command: %0%"
"region": "%lang:tRegion|%region%|%"
"tRegion":
- "[bold]%0%[/bold]"
- " hover: Region %0%"
- " hover: %lang:action|Region information|%"
- " command: /areashop info region %0%"
"player": "%lang:tPlayer|%player%|%"
"tPlayer":
- "[bold]%0%[/bold]"
- " hover: Spieler %0%"
- " hover: %lang:action|Regionen von %0%|%"
- " command: /areashop info player %0%"
"landlord":
- "[bold]%landlord%[/bold]"
- " hover: Vermieter %landlord%"
- " hover: %lang:action|Regionen von %landlord%|%"
- " command: /areashop info player %landlord%"
"total-maximum": "Du kannst nicht mehr als %0% Region(en) mieten/kaufen (Du hast bereits %1% in Gruppe '%2%')."
"confirm-yes": " [gray]Klicken um %lang:command|den Command zu bestätigen|1%0%|%[gray] oder zu wiederholen."
"general-notReady": "AreaShop ist noch nicht vollständig geladen, bitte warten."
"general-noWorld": "Du kannst das nicht machen, die Welt von %lang:region% ist derzeit nicht verfügbar (Welt '%world%')."
"general-noRegion": "Du kannst das nicht machen, die WorldGuard Region ist derzeit nicht verfügbar (region %lang:region%)."
"general-noEconomy": "AreaShop kann kein (korrekt) installiertes Economy-Plugin finden, bitte informiere den Serverinhaber darüber."
"general-cancelled": "%0%"
"cmd-notValid": "Der Befehl ist ungültig, nutze '/as help' für weitere Informationen."
"cmd-onlyByPlayer": "Dieser Befehl kann nur von einem Spieler benutzt werden."
"cmd-weOnlyByPlayer": "Eine WorldEdit-Selektion kann nur von einem Spieler gewählt werden, gib die Region als extra Argument an."
"cmd-noSelection": "Du hast mit WorldEdit nichts markiert."
"cmd-noRegionsFound": "In deiner Selektion wurden keine in AreaShop registrierten Regionen gefunden."
"cmd-noWERegionsFound": "Es wurden keine WorldEdit-Regionen gefunden, die sich mit deiner Selektion überschneiden."
"cmd-notRegistered": "Die Region '%0%' ist in AreaShop nicht verfügbar."
"cmd-noRegion": "'%0%' ist keine gültige WorldGuard Region."
"cmd-noRegionsAtLocation": "Keine Regionen an deiner Position gefunden, gib die Region als Argument an."
"cmd-moreRegionsAtLocation": "Mehr als eine Region wurde an deiner Position gefunden, gib die Region als Argument an."
"cmd-automaticRegionOnlyByPlayer": "Die Automatische Auswahl einer Region ist nur für Spieler möglich, gib die Region als Argument an."
"help-header": "Hilfeseite mit Befehlen, die du ausführen kannst."
"help-noPermission": "Du hast keine Permissions, um diese Hilfeseite anzuzeigen."
"help-alias": "Befehlsaliase: /areashop, /as."
"help-help": "%lang:helpCommand|/as help|% Zeigt diese Hilfeseite."
"help-info": "%lang:helpCommand|/as info|% Zeigt Infos über aktuelle Regionen."
"help-rent": "%lang:helpCommand|/as rent|% Miete eine Region oder verlängere deine derzeitige Miete."
"help-buy": "%lang:helpCommand|/as buy|% Kaufe eine Region."
"help-unrent": "%lang:helpCommand|/as unrent|% Breche eine Miete für eine Region ab."
"help-sell": "%lang:helpCommand|/as sell|% Verkaufe eine Region."
"help-reload": "%lang:helpCommand|/as reload|% Lade alle Dateien sowie Regionen neu."
"help-setrestore": "%lang:helpCommand|/as setrestore|% Aktiviere das Zurücksetzen und wähle ein Profil."
"help-setprice": "%lang:helpCommand|/as setprice|% Ändere den Preis einer Region."
"help-setduration": "%lang:helpCommand|/as setduration|% Ändere die Dauer einer gemieteten Region."
"help-teleport": "%lang:helpCommand|/as tp|% Teleportiere dich zu einer kauf- oder mietbaren Region."
"help-setteleport": "%lang:helpCommand|/as settp|% Setze die Teleport Position von einer Region."
"help-find": "%lang:helpCommand|/as find|% Finde eine kauf- oder mietbare Region."
"help-groupadd": "%lang:helpCommand|/as groupadd|% Füge eine Region zu einer Gruppe hinzu."
"help-groupdel": "%lang:helpCommand|/as groupdel|% Lösche eine Region von einer Gruppe."
"help-grouplist": "%lang:helpCommand|/as grouplist|% Liste alle Gruppen auf, welche derzeit Registriert sind."
"help-groupinfo": "%lang:helpCommand|/as groupinfo|% Zeigt Informationen über eine Gruppe an."
"help-schemevent": "%lang:helpCommand|/as schemevent|% Löst ein Schematic Event für eine Region aus."
"help-add": "%lang:helpCommand|/as add|% Registriere eine Region zum mieten oder kaufen."
"help-del": "%lang:helpCommand|/as del|% Lösche eine registrierte Region von AreaShop"
"help-addsign": "%lang:helpCommand|/as addsign|% Füge ein Schild zu einer existierenden Region hinzu."
"help-delsign": "%lang:helpCommand|/as delsign|% Lösche das Schild auf das du Schaust."
"help-me": "%lang:helpCommand|/as me|% Liste alle Regionen, welche zu besitzt auf, sowie deren Ablaufdatum."
"help-setowner": "%lang:helpCommand|/as setowner|% Setze den Besitzer einer Region oder verlängere die Miete."
"help-resell": "%lang:helpCommand|/as resell|% Setzt eine Region in den Wiederverkaufs-Modus."
"help-stopResell": "%lang:helpCommand|/as stopresell|% Setzt eine Region zurück in den Verkauft Modus."
"help-addFriend": "%lang:helpCommand|/as addfriend|% Fügt einen Freund zu einer Region hinzu."
"help-delFriend": "%lang:helpCommand|/as delfriend|% Löscht einen Freund von einer Region."
"help-linksigns": "%lang:helpCommand|/as linksigns|% Benutze Massenschild Verlinkungs Modus."
"help-stack": "%lang:helpCommand|/as stack|% Erstelle mehrere Regionen und füge sie hinzu."
"help-setlandlord": "%lang:helpCommand|/as setlandlord|% Setzt den Vermieter einer Region."
"rent-help": "/as rent [Region], Die Region in der du stehst wird Gemietet, wenn du keine Region angegeben hast."
"rent-noPermission": "Du bist nicht berechtigt, diese Region zu mieten."
"rent-maximum": "Du kannst nicht mehr als %0% Region(en) mieten (Du hast bereits %1% in Gruppe '%2%')."
"rent-maximumExtend": "Du kannst diese Miete nicht verlängern weil du mehr als %0% Region(en) hast. (Du hast bereits %1% in Gruppe '%2%')."
"rent-payError": "Die Bezahlung hat nicht funktioniert. Bitte versuche es später noch einmal."
"rent-rented": "Du hast die Region %lang:region% bis zum %until% gemietet. Du kannst deine Miete verlängern, in dem du erneut auf das Schild klickst, oder /as rent eingibst."
"rent-extended": "Du hast Deine Miete von %lang:region% bis zum %until% verlängert."
"rent-extendedToMax": "Du hast Deine Miete von %lang:region% bis zum %until% verlängert. (Das ist die maximal zulässige Mietdauer von %maxrenttime%)."
"rent-lowMoneyExtend": "Du hast nicht genug Geld um die Miete zu verlängern. (Du hast %0% und benötigst %price%)."
"rent-lowMoneyRent": "Du hast nicht genug Geld um die Region %lang:region% zu mieten. (Du hast %0% und benötigst %price%)."
"rent-someoneElse": "Die Region %lang:region% ist bereits vermietet."
"rent-notRentable": "Region '%0%' ist nicht vorhanden (Nicht registiert in Areashop oder nur zu verkaufen)."
"rent-maxExtends": "Du kannst diese Miete nicht weiter verlängern. (Zulässig sind %maxextends% Verlängerungen). Nachdem die Miete abgelaufen ist, kannst du die Region %lang:region% erneut mieten."
"rent-maxRentTime": "Du kannst die Region%lang:region% nicht noch mehr im Voraus mieten. Die maximale Zeit beträgt %maxrenttime% und du hast diese Region für %timeleft% gemietet."
"rent-restrictedToWorld": "Du musst dich in der Welt '%world%' befinden, um die Region %lang:region% mieten zu können (Du befindest Dich in der Welt '%0%')."
"rent-restrictedToRegion": "Du musst innerhalb der Region %lang:region% sein, um diese mieten zu können."
"rent-expireWarning": "Deine Region %lang:region% hat %timeleft% übrig. Beachte, dass du sie rechtzeitig verlängerst, wenn du sie behalten willst."
"rent-expiringSoon": "Deine Region %lang:tRegion|%0%|% hat noch %1% übrig. Verlängere sie, wenn du sie behalten möchtest."
"rent-alreadyAtFull": "Die Region %lang:region% ist bereits auf oder über der maximalen Mietzeit, Du kannst diese noch nicht verlängern."
"buy-help": "/as buy [Regionname], Die Region in der du stehst wird gekauft wenn keine Region angegeben wurde."
"buy-noPermission": "Du bist nicht berechtigt, eine Region zu kaufen."
"buy-noPermissionResell": "Du hast keine Berechtigung eine Region im Weiterverkaufs-Modus zu kaufen."
"buy-noPermissionNoResell": "Du hast keine Berechtigung um eine Region zu kaufen, die nicht im Weiterverkaufs-Modus ist."
"buy-notBuyable": "Region '1%0%' ist nicht zum Kauf verfügbar (nicht registriert in AreaShop oder es ist eine mietbare Region)"
"buy-maximum": "Du kannst nicht mehr als %0% Region(en) erwerben (Du hast bereits %1% in Gruppe '%2%')."
"buy-payError": "Die Bezahlung hat nicht funktioniert. Bitte versuche es später noch einmal."
"buy-succes": "Du hast %lang:region% erfolgreich gekauft."
"buy-successResale": "Du hast %lang:region% erfolgreich von %lang:tPlayer|%0%|% gekauft."
"buy-successSeller": "Deine Region %lang:region% wurde an %lang:player% für %0% verkauft."
"buy-lowMoney": "Du hast nicht genug Geld um die Region %lang:region% zu kaufen. (Du hast %0% und benötigst %price%)."
"buy-lowMoneyResell": "Du hast nicht genug Geld um die Region %lang:region% zu kaufen. (Du hast %0% und benötigst %resellprice%)."
"buy-yours": "Du besitzt die Region %lang:region% bereits."
"buy-someoneElse": "Jemand anderes hat die Region %lang:region% bereits gekauft."
"buy-restrictedToWorld": "Du musst Dich in der Welt '%world%' befinden, um die Region %lang:region% kaufen zu können. (Du befindest Dich in der Welt '%0%')."
"buy-restrictedToRegion": "Du musst innerhalb der Region %lang:region% sein, um diese kaufen zu können."
"unrent-help": "/as unrent [Region], Die Region in der du stehst wird entmietet, wenn keine Region angegeben wird."
"unrent-noPermission": "Du bist nicht berechtigt, den Mietvertrag zu kündigen."
"unrent-noPermissionOther": "Du bist nicht berechtigt, den Mietvertrag einer anderen Region zu kündigen."
"unrent-notRegistered": "Die Region kann nicht entmietet werden, weil sie nicht für Vermietungen registriert ist."
"unrent-notRented": "Die Region kann nicht entmietet werden, weil sie nicht gemietet ist."
"unrent-unrented": "Die Region %lang:region% ist nun nicht mehr an %lang:player% vermietet."
"unrent-expired": "Deine Miete von %lang:region% ist abgelaufen."
"sell-help": "/as sell [Region], Die Region in der du stehst wird verkauft wenn keine Region angegeben wurde."
"sell-notRegistered": "Die Region kann nicht verkauft werden, da sie nicht für den Verkauf registriert ist."
"sell-notBought": "Die Region kann nicht verkauft werden, da sie keinen Eigentümer hat."
"sell-sold": "Die Region %lang:region% von %lang:player% wurde verkauft."
"sell-noPermission": "Du bist nicht berechtigt, diese Region zu verkaufen."
"sell-noPermissionOther": "Du bist nicht berechtigt, eine Region zu verkaufen."
"sell-disabled": "Das verkaufen dieser Region wurde deaktiviert."
"reload-reloading": "Alle Konfigurationsdateien und Region-Dateien wurden neu geladen."
"reload-noPermission": "Du hast keine Berechtigungen um die Konfigurationsdateien neu zu laden."
"reload-updateCommandChanged": "'/as updaterents' und '/as updatebuys' wurden entfernt, bitte benutze '/as reload' um die Regionen neu zu laden."
"info-help":
- "/as info[break]"
- " %lang:command|all|/as info all|%[break]"
- " %lang:command|rented|/as info rented|% [Gruppe] [Seite][break]"
- " %lang:command|forrent|/as info forrent|% [Gruppe] [Seite][break]"
- " %lang:command|sold|/as info sold|% [Gruppe] [Seite][break]"
- " %lang:command|forsale|/as info forsale|% [Gruppe] [Seite][break]"
- " %lang:command|reselling|/as info reselling|% [Gruppe] [Seite][break]"
- " %lang:command|nogroup|/as info nogroup [Seite]|%[break]"
- " %lang:command|region|/as info region|% [Region]"
"info-noPermission": "Du hast keine Berechtigung, Informationen über Regionen zu erhalten."
"info-allHeader": "Alle Regionen%0%:"
"info-rentedHeader": "Gemietete Regionen%0%:"
"info-forrentHeader": "Mietbare Regionen%0%:"
"info-forsaleHeader": "Kaufbare Regionen%0%:"
"info-soldHeader": "Verkaufte Regionen%0%:"
"info-resellingHeader": "Weiterverkaufbare Regionen%0%:"
"info-nogroupHeader": "Regionen ohne Gruppe%0%:"
"info-limitedToGroup": " (begrenzt auf Gruppe %0%)"
"info-nogroupNone": "Es gibt keine Regionen ohne Gruppe."
"info-noFiltergroup": "Gruppe '%0%' existiert nicht und kann deshalb nicht genutzt werden um die Ergebnisse zu limitieren."
"info-noRegions": "Es wurden keine Regionen gefunden."
"info-wrongPage": "%0% ist keine korrekte Seitenzahl."
"info-entryForrent": "[darkgreen][bold]►[reset] %lang:region%: [gray]Zur Vermietung für %price% je %duration%."
"info-entryRented": "[darkgreen][bold]►[reset] %lang:region%: [gray]Vermietet an %lang:player%."
"info-entryForsale": "[darkgreen][bold]►[reset] %lang:region%: [gray]Zum Verkauf für %price%."
"info-entrySold": "[darkgreen][bold]►[reset] %lang:region%: [gray]Verkauft an %lang:player%."
"info-entryReselling": "[darkgreen][bold]►[reset] %lang:region%: [gray]Verkauft an %lang:player% (Weiterverkauf)."
"info-pageStatus": "[gold]Seite %0%/%1%"
"info-pageNoPrevious":
- " [darkgray][bold]◄Vorherige[/bold] "
- " hover: Das ist bereits die erste Seite."
"info-pageNoNext":
- " [darkgray][bold]Nächste►[/bold]"
- " hover: Das ist bereits die letzte Seite."
"info-playerHelp": "/as info player <Spielername>."
"info-playerRents": "Gemietete Regionen von %lang:tPlayer|%0%|%: [gray]%1%"
"info-playerNoRents": "%lang:tPlayer|%0%|% hat bisher keine Region(en) gemietet."
"info-playerBuys": "Gekaufte Regionen von %lang:tPlayer|%0%|%: [gray]%1%."
"info-playerNoBuys": "%lang:tPlayer|%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": "[darkgreen]Informationen über %lang:region%:"
"info-regionHeaderBuy": "[darkgreen]Informationen über %lang:region%:"
"info-regionRented": "[darkgreen][bold]►[reset] Gemietet von %lang:player% bis: [gray]%until%."
"info-regionBought": "[darkgreen][bold]►[reset] Gekauft von %lang:player%."
"info-regionReselling": "[darkgreen][bold]►[reset] Gekauft von %lang:player%, derzeit Weiterverkauf."
"info-regionExtending":
- "[darkgreen][bold]►[reset] "
- "[bold]Verlängern für[/bold]"
- " hover: Miete verlängern für %region%"
- " hover: mit %duration% für %price%"
- " hover: %lang:action|Mieter Verlängern für %region%|%"
- " command: /areashop rent %region%"
- ": [gray]%price% für %duration%."
"info-regionCanBeRented":
- "[darkgreen][bold]►[reset] "
- "[bold]Mieten für[/bold]"
- " hover: Miete %region% für %price% für %duration%"
- " hover: %lang:action|Miete %region%|%"
- " command: /areashop rent %region%"
- ": [gray]%price% für %duration%."
"info-regionCanBeBought":
- "[darkgreen][bold]►[reset] "
- "[bold]Kaufen für[/bold]"
- " hover: Kaufe %region% für %price%"
- " hover: %lang:action|Kaufe %region%|%"
- " command: /areashop buy %region%"
- ": [gray]%price%."
"info-regionReselPrice": "[darkgreen][bold]►[reset] Weiterverkaufspreis: [gray]%resellprice% (Du kannst es von %lang:player% kaufen)."
"info-regionFriends": "[darkgreen][bold]►[reset] Hinzugefügte Freunde: [gray]%0%."
"info-friend": "%lang:tPlayer|%0%|%"
"info-friendRemove":
- "%lang:info-friend|%0%|%"
- "[red]✕[gray]"
- " hover: Region %region%"
- " hover: %lang:action|Lösche %0% als Freund|%"
- " command: /areashop delfriend %0% %region%"
"info-regionMoneyBackBuy": "[darkgreen][bold]►[reset] Verkaufpreis: [gray]%moneyback% (%moneybackpercent%% des Kaufpreises)."
"info-regionMoneyBackBuyClick":
- "[darkgreen][bold]►[reset] "
- "[bold]Verkaufsrückzahlung[/bold]"
- " hover: Verkaufe %region% und bekomme %moneyback% zurück"
- " hover: %lang:action|Verkaufe %region%|%"
- " command: /areashop sell %region%"
- ": [gray]%moneyback% (%moneybackpercent%% des Kaufpreises)."
"info-regionMoneyBackRent": "[darkgreen][bold]►[reset] Rückzahlung bei Mietkündigung: [gray]%moneyback% (%moneybackpercent%% der verbleibenden Zeit)."
"info-regionMoneyBackRentClick":
- "[darkgreen][bold]►[reset] "
- "[bold]Mietrückzahlung[/bold]"
- " hover: Entmiete %region% und bekomme %moneyback% zurück"
- " hover: %lang:action|Unrent %region%|%"
- " command: /areashop unrent %region%"
- ": [gray]%moneyback% (%moneybackpercent%% der verbleibenden Zeit)."
"info-regionMaxExtends": "[darkgreen][bold]►[reset] Maximale Anzahl an Verlängerungen: [gray]%maxextends% ."
"info-regionNoExtending": "[darkgreen][bold]►[reset] Miete kann nicht verlängert werden."
"info-regionExtendsLeft": "[darkgreen][bold]►[reset] Verbleibende Mietverlängerungen: [gray]%extendsleft% von %maxextends% ."
"info-regionMaxRentTime": "[darkgreen][bold]►[reset] Miete im Voraus: [gray]Maximal %maxrenttime%."
"info-prefix": "[darkgreen][bold]►[reset] "
"info-regionTeleport":
- "[bold]Gehe zu der Region[/bold]"
- " hover: %lang:action|Teleport to %region%|%"
- " command: /areashop tp %region%"
"info-setRegionTeleport":
- "[bold]Setze den Teleport Punkt[/bold]"
- " hover: %region%"
- " hover: %lang:action|Set teleport location|%"
- " command: /areashop settp %region%"
"info-regionSigns": "[darkgreen][bold]►[reset] Verbundene Schilder: [gray]%0%."
"info-regionSignLocation": "[gray](%0%, %1%, %2%, %3%)[reset]"
"info-regionGroups": "[darkgreen][bold]►[reset] Zugewiesene Gruppen: [gray]%0%."
"info-regionInactiveUnrent": "[darkgreen][bold]►[reset] Automatische Mietkündigung nach: [gray]%inactivetime% Inaktivität des Spielers."
"info-regionInactiveSell": "[darkgreen][bold]►[reset] Automatischer Verkauf nach: [gray]%inactivetime% Inaktivität des Spielers."
"info-regionRestrictedRegionRent": "[darkgreen][bold]►[reset] Du musst dich in der Region %lang:region% befinden, um sie mieten zu können."
"info-regionRestrictedWorldRent": "[darkgreen][bold]►[reset] Du musst in der Welt '%world%' sein, um die Region %lang:region% mieten zu können."
"info-regionRestrictedRegionBuy": "[darkgreen][bold]►[reset] Du musst dich in der Region %lang:region% befinden, um sie kaufen zu können."
"info-regionRestrictedWorldBuy": "[darkgreen][bold]►[reset] Du musst in der Welt '%world%' sein, um die Region %lang:region% kaufen zu können."
"info-regionRestoringRent": "[darkgreen][bold]►[reset] Wiederherstellung ist aktiviert [gray](Region wird bei Mietkündigung zurückgesetzt)."
"info-regionRestoringBuy": "[darkgreen][bold]►[reset] Wiederherstellung ist aktiviert. [gray](Region wird beim Verkauf zurückgesetzt)."
"info-regionLandlord": "[darkgreen][bold]►[reset] Vermieter: [gray]%lang:landlord% (Erhält das Geld)."
"info-regionNotExisting": "Die angegebene Region ist nicht registriert: %0%."
"setrestore-help": "/as setrestore <Region> <true|false|general> [Profil]."
"setrestore-noPermission": "Du bist nicht berechtigt, die Wiederherstellungs-Einstellungen zu verändern."
"setrestore-notRegistered": "Die angegebene Region ist nicht registriert: %0%."
"setrestore-invalidSetting": "'%0%' ist keine gültige Angabe, benutze true, false oder general."
"setrestore-success": "Wiederherstellungs-Einstellungen von %lang:region% erfolgreich zu '%0%' geändert."
"setrestore-successProfile": "Wiederherstellungs-Einstellungen von %lang:region% erfolgreich zu '%0%' geändert und das Profil zu '%1%'."
"setprice-noPermission": "Du bist nicht berechtigt, den Preis einer Region zu ändern."
"setprice-help": "/as setprice <Preis> [Region], Andert den Preis der Region in der du stehst wenn keine Region angegeben wird."
"setprice-notRegistered": "Die angegebene Region ist nicht registriert: %0%."
"setprice-wrongPrice": "'%0%' ist kein gültiger Preis."
"setprice-successRent": "Der Preis der Region %lang:region% änderte sich zu %price% per %duration%."
"setprice-successBuy": "Der Preis der Region %lang:region% wurde zu %price% geändert."
"setprice-successRemoved": "Der Preis der Region %lang:region% wurde entfernt, ab jetzt wird der Preis einer Gruppe oder der default.yml-Datei benutzt. Neuer Preis: %price%."
"setprice-noLandlord": "Du hast keine Rechte um den Preis zu ändern, da du nicht der Vermieter der Region %lang:region% bist."
"setduration-noPermission": "Du hast keine Berechtigung, die Mietdauer zu verändern."
"setduration-help": "/as setduration <Anzahl> <Zeiteinheit> [Region], ändert die Zeit der Region in der du dich befindest wenn keine Region angegeben wurde."
"setduration-notRegistered": "%0% ist nicht als mietbar registriert."
"setduration-wrongAmount": "'%0%' ist keine gültige Anzahl, gib eine ganze Zahl an."
"setduration-wrongFormat": "'%0%' ist kein gültiges Zeitformat, schau in der Doku auf Bukkit nach."
"setduration-success": "Dauer von Region %lang:region% zu '%duration%' geändert."
"setduration-noLandlord": "Du hast keine Rechte um die Dauer der Miete zu ändern, da du nicht der Vermieter der Region %lang:region% bist."
"setduration-successRemoved": "Die Mietdauer der Region %lang:region% wurde entfernt, es wird nun die Dauer von einer Gruppe oder der default.yml Datei benutzt. Neue Mietdauer: %duration%."
"setup-noRegion": "Du hast in der zweiten Zeile keine Region angegeben."
"setup-alreadyRentSign": "Die angegebene Region ist bereits in AreaShop als eine Miet-Region eingefügt, du kannst Schilder zu der Region mit [as] in der ersten Zeile hinzufügen, oder '/as addsign' verwenden."
"setup-alreadyOtherWorld": "Die Region, die angegeben wurde, wurde bereits in einer anderen Welt hinzugefügt, Regionen aus verschiedenen Welten benötigen dennoch andere Namen."
"setup-alreadyBuySign": "Die angegebene Region ist bereits in AreaShop als eine Kauf-Region eingefügt, du kannst Schilder zu der Region mit [as] in der ersten Zeile hinzufügen, oder '/as addsign' verwenden."
"setup-noDuration": "Du hast nicht angegeben, wie lange eine Region mietbar ist. Bitte trage dies in die dritte Zeile ein."
"setup-wrongDuration": "Die angegebene Zeit liegt nicht in einem korrekten Format vor. Beispiel: 1 Tag."
"setup-noPrice": "Du hast in der vierten Zeile noch keinen Preis angegeben."
"setup-wrongPrice": "Du hast den Preis nicht korrekt angegeben, bitte nutze dafür ausschließlich Zahlen."
"setup-rentSuccess": "Die Vermietung der Region %lang:region% ist erfolgreich erstellt worden."
"setup-buySuccess": "Das Kaufen der Region %lang:region% ist erfolgreich erstellt worden."
"setup-noPermissionRent": "Du hast keine Berechtigungen um mietbare Regionen zu erstellen."
"setup-noPermissionBuy": "Du hast keine Berechtigungen um kaufbare Regionen zu erstellen."
"setup-couldNotDetect": "Mehrere Regionen mit der selben Priorität und/oder Eltern/Kind-Verhältnis gefunden, bitte gib die gewünschte Region in der zweiten Zeile an (zwei der gefundenen Regionen: %lang:tRegion|%0%|% und %lang:tRegion|%1%|%)."
"setup-blacklisted": "%0% ist auf der Blacklist und kann nicht in AreaShop eingefügt werden."
"setup-noPermission": "Du kannst die Region '%0%' nicht hinzufügen, da du weder Besitzer noch Mitglied der Region bist oder keine Rechte dazu hast."
"destroy-noPermissionRent": "Du hast keine Berechtigungen um eine mietbare Region abzumelden. "
"destroy-noPermissionBuy": "Du hast keine Berechtigungen um eine kaufbare Region abzumelden. "
"destroy-successRent": "%lang:region% erfolgreich als mietbare Region abgemeldet."
"destroy-successBuy": "%lang:region% erfolgreich als kaufbare Region abgemeldet."
"teleport-help": "/as tp <Region> [Schild]."
"teleport-noRentOrBuy": "Die angegebene Region ist nicht registriert: %0%."
"teleport-noPermission": "Du hast keine Rechte um dich zu dieser Region zu teleportieren."
"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 hast keine Berechtigung, dich zu Schildern von Regionen, die du nicht besitzt, zu teleportieren."
"teleport-noPermissionFriend": "Du hast keine Berechtigungen, dich zu Regionen zu teleporten, in denen du als Freund hinzugefügt worden bist."
"teleport-noPermissionFriendSign": "Du hast keine Berechtigungen, dich zu dem Schild einer Region zu teleportieren, in denen du als Freund hinzugefügt worden bist."
"teleport-noPermissionAvailable": "Du hast keine Rechte um dich zu verfügbaren Regionen zu teleportieren."
"teleport-noPermissionAvailableSign": "Du hast keine Rechte um dich zum Schild von verfügbaren Regionen zu teleportieren."
"teleport-success": "Du wurdest zu %lang:region% teleportiert."
"teleport-successSign": "Du wurdest zum Schild von %lang:region% teleportiert."
"teleport-noSafe": "Keine sichere Position in %lang:region% gefunden, kein Boden vorhanden oder maximale Anzahl an Versuchen erreicht (%0%/%1%)."
"teleport-blocked": "Du kannst dich nicht teleportieren, weil sich die Position außerhalb der Region befindet und du dich nur in die Region teleportieren kannst."
"teleport-changedToSign": "Du hast nur Rechte um zum Schild der Region zu teleportieren und nicht um in die Region zu teleportieren. Teleportiere zum Schild."
"teleport-changedToNoSign": "Es ist kein Schild zum teleportieren verfügbar, versuche stattdessen in die Region zu teleportieren."
"setteleport-help": "/as settp [Region] [reset], Wenn kein Regionsname angegeben wird, wird die Region genutzt, in der du dich gerade befindest."
"setteleport-noPermission": "Du bist nicht berechtigt, einen Teleport-Punkt zu setzen."
"setteleport-noPermissionOther": "Dir fehlt die Berechtigung die Teleportposition für eine Region, du du nicht besitzt, festzulegen."
"setteleport-noRentOrBuy": "Die angegebene Region ist nicht registriert: %0%."
"setteleport-success": "Teleport-Punkt von %lang:region% erfolgreich gesetzt."
"setteleport-notInside": "Der Teleportpunkt muss sich innerhalb einer Region befinden."
"setteleport-reset": "Teleport-Punkt von %lang:region% 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: %lang:region%, bei Suche nach max. Preis in Höhe deines Guthabens: %1%%2%."
"find-successMax": "%0% Region gefunden: %lang:region%,, bei Suche nach max. Preis in Höhe von %1%%2%."
"find-wrongMaxPrice": "Der angegebene Maximal-Preis ist kein korrekter Betrag: %0%."
"find-wrongGroup": "Die angegebene Gruppe existiert nicht: %0%."
"find-noneFound": "Keine %0% Region gefunden bei Suche nach max. Preis in Höhe deines Guthabens: %1%%2%."
"find-noneFoundMax": "Keine %0% Region gefunden bei Suche nach max. Preis in Höhe von %1%%2%."
"find-onlyInGroup": ", nur nach Regionen in der Gruppe %0% suchen."
"groupadd-help": "/as groupadd <Gruppe> [Region], Wenn kein Regionsname angegeben wird, werden alle Regionen deiner WorldEdit-Markierung einbezogen."
"groupadd-noPermission": "Du bist nicht berechtigt Regionen zu Gruppen hinzuzufügen."
"groupadd-success": "Region %lang:region% wurde zur Gruppe '%0%' hinzugefügt. Diese Gruppe hat nun %1% Mitglied(er)."
"groupadd-failed": "Region %lang:region% ist bereits Mitglied der Gruppe '%0%';."
"groupadd-weSuccess": "Zu Gruppe %0% hinzugefügt: [gray]%1%."
"groupadd-weFailed": "Ist bereits in Gruppe %0%: [gray]%1%."
"groupdel-help": "/as groupdel <Gruppe> [Region], Wenn kein Regionsname angegeben wird, werden alle Regionen deiner WorldEdit-Markierung einbezogen."
"groupdel-noPermission": "Du bist nicht berechtigt, Regionen aus Gruppen zu entfernen."
"groupdel-success": "Region %lang:region% ist aus Gruppe '%0%' entfernt worden. Diese Gruppe hat nun %1% Mitglied(er)."
"groupdel-failed": "Region %lang:region% gehört nicht zur Gruppe '%0%'."
"groupdel-weSuccess": "Entfernt aus Gruppe %0%: [gray]%1%."
"groupdel-weFailed": "Ist nicht länger in Gruppe %0%: [gray]%1%."
"grouplist-noPermission": "Du bist nicht berechtigt, die eingetragenen Gruppen abzurufen."
"grouplist-noGroups": "Momentan sind keine Gruppen vorhanden."
"grouplist-success": "Folgende Gruppen sind vorhanden: [gray]%0%."
"groupinfo-help": "/as groupinfo <Gruppe>."
"groupinfo-noPermission": "Du bist nicht berechtigt, Informationen über eine Gruppe abzurufen."
"groupinfo-noGroup": "Es ist keine Gruppe mit dem Namen '%0%' vorhanden, bitte benutze zum Anzeigen der verfügbaren Gruppen /as grouplist."
"groupinfo-members": "Die folgenden Regionen gehören zur Gruppe %0%: [gray]%1%."
"groupinfo-noMembers": "Gruppe %0% hat keine Mitglieder."
"schemevent-help": "/as schemevent <Region> <created|deleted|rented|unrented|bought|sold>."
"schemevent-wrongEvent": "Das angegebene Event '%0%' existiert nicht, bitte benutze eines der folgenden: [gray]%1%."
"schemevent-success": "'%0%'-Event wurde erfolgreich für Region %lang:region% ausgelöst."
"schemevent-noPermission": "Du bist nicht berechtigt, Schematic-Events auszuführen."
"add-help": "/as add <rent|buy> [Region] [Welt]."
"add-noPermission": "Du bist nicht berechtigt, eine Region in AreaShop hinzuzufügen."
"add-success": "Hinzugefügt als %0%: [gray]%1%."
"add-failed": "Bereits eingetragen: [gray]%0%."
"add-blacklisted": "Auf der Blacklist: [gray]%0%."
"add-specifyWorld": "Bei Verwendung der Konsole bitte Welt der Region eintragen."
"add-incorrectWorld": "Welt '%0%' nicht gefunden, versuche es bitte noch einmal (Groß- und Kleinschreibung beachten)."
"add-noPermissionRegions": "Keine Rechte zum hinzufügen: [gray]%0%."
"add-noPermissionOwnerMember": "[gray]Entweder bist du weder Mitglied noch Besitzer der Region oder hast keine Rechte um deine Regionen hinzuzufügen."
"del-noPermission": "Du bist nicht berechtigt, Regionen zu entfernen."
"del-success": "Entfernte Region(en): [gray]%0%."
"del-failed": "Keine Berechtigung zum Entfernen oder nicht eingetragen: [gray]%0%."
"addsign-help": "/as addsign [Region] [Profil]."
"addsign-noSign": "Du schaust gerade nicht auf ein Schild."
"addsign-noRegions": "Keine Region(en) um das Schild herum gefunden."
"addsign-couldNotDetect": "Mehrere Regionen um das Schild herum gefunden, bitte gewünschte Region als Argument angeben (zwei der gefundenen Regionen: %lang:tRegion|%0%|% und %lang:tRegion|%1%|%)."
"addsign-couldNotDetectSign": "Mehrere Regionen um das Schild herum gefunden, bitte gewünschte Region in die zweite Zeile eintragen (zwei der gefundenen Regionen: %lang:tRegion|%0%|% und %lang:tRegion|%1%|%)."
"addsign-wrongProfile": "Das eingetragene Profil existiert nicht. Bitte benutze eines der folgenden (überprüfe config): [gray]%0%."
"addsign-profile":
- "[bold]%0%[/bold]"
- " hover: Schildprofil %0%"
- " hover: %lang:action|Use this profile|%"
- " command: /areashop linksigns %0%"
"addsign-success": "Das Schild wurde hinzugefügt zu %lang:region%."
"addsign-successProfile": "Das Schild wurde zu %lang:region% mit dem Profil %0% hinzugefügt."
"addsign-alreadyRegistered": "Dieses Schild ist bereits für die Region %lang:region% registriert."
"addsign-noPermission": "Du bist nicht berechtigt, ein Schild hinzuzufügen."
"delsign-noSign": "Du schaust gerade nicht auf ein Schild."
"delsign-noPermission": "Du bist nicht berechtigt, ein Schild zu entfernen."
"delsign-noRegion": "Dieses Schild gehört zu keiner in AreaShop eingetragenen Region."
"delsign-success": "Das Schild wurde von der Region %lang:region% entfernt."
"me-noPermission": "Dir fehlt die Berechtigung einzusehen, welche Regionen du besitzt."
"me-header": "Regionen von %lang:tPlayer|%0%|%:"
"me-notAPlayer": "Du bist kein Spieler, darum können dir keine Regionen gehören."
"me-rentLine":
- "[darkgreen][bold]►[reset] %lang:region% [gray]("
- "%timeleft% übrig"
- " hover: bis %until%"
- ")."
"me-buyLine": "[darkgreen][bold]►[reset] %lang:region%."
"me-friendLine":
- "[darkgreen][bold]►[reset] %lang:region% [gray]("
- "Im Besitz von %lang:player%"
- " hover: Du wurdest als Freund hinzugefügt"
- ")."
"me-nothing": "%lang:tPlayer|%0%|% hat keine gemieteten oder gekaufen Regionen und wurde nicht als Freund zu einem hinzugefügt."
"me-noPlayer": "%0% konnte nicht gefunden werden, möglicherweise war er nie auf diesem Server."
"me-clickHint": "[gray][italic]Klicke auf eine Region, um weitere Details zu erhalten."
"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."
"setowner-noPermissionBuy": "Dir fehlt die Berechtigung den Eigentümer einer Region festzulegen."
"setowner-notRegistered": "Die angegebene Region ist nicht registriert, Besitzer kann nicht festgelegt werden."
"setowner-noPlayer": "Die UUID des Spielers %0% konnte nicht gefunden werden."
"setowner-succesRent": "Besitzer von %lang:region% erfolgreich geändert zu %lang:player%, gemietet bis %until% (%timeleft% verbleibend)."
"setowner-succesRentExtend": "%lang:player% ist bereits Besitzer, Miete verlängert um '%duration%', nun gemietet bis %until% (%timeleft% verbleibend)."
"setowner-succesBuy": "Besitzer von %lang:region% erfolgreich geändert zu %lang:player%."
"resell-help": "/as resell <Preis> [Region], wählt automatisch die Region, in der du dich befindest, wenn nicht angegeben."
"resell-wrongPrice": "'%0%' ist keine gültige Preisangabe."
"resell-notRegistered": "Die angegebene Region ist nicht registriert: %0%."
"resell-notBought": "Du kannst %lang:region% nicht weiterverkaufen, weil sie noch nicht erworben wurde."
"resell-success": "Weiterverkauf für %lang:region% erfolgreich aktiviert. Preis: %resellprice%."
"resell-noPermission": "Du hast keine Berechtigung, deine Region weiterzuverkaufen."
"resell-noPermissionOther": "Du hast keine Berechtigung, den Weiterverkauf von Regionen zu aktivieren."
"resell-disabled": "Der Weiterverkauf wurde für diese Region deaktiviert."
"stopresell-help": "/as stopresell [Region], wählt automatisch die Region, in der du dich befindest, wenn nicht angegeben."
"stopresell-notRegistered": "Die angegebene Region ist nicht registriert: %0%."
"stopresell-notResell": "Du kannst den Weiterverkauf von %lang:region% nicht stoppen, weil sie bisher nicht weiterverkauft werden soll."
"stopresell-success": "Weiterverkauf von %lang:region% wurde erfolgreich gestoppt."
"stopresell-noPermission": "Du hast keine Berechtigung, den Weiterverkauf deiner Region zu stoppen."
"stopresell-noPermissionOther": "Du hast keine Berechtigung, den Weiterverkauf einer Region zu stoppen."
"addfriend-help": "/as addfriend <Spieler> [Region], wählt automatisch die Region, in der du dich befindest, wenn nicht angegeben."
"addfriend-noPermissionOther": "Du hast keine Berechtigung, Freunde zu einer Region hinzufügen, welche dir nicht gehört."
"addfriend-noPermission": "Du hast keine Berechtigung, Spieler zu deiner Region hinzuzufügen."
"addfriend-successOther": "%lang:tPlayer|%0%|% wurde als Freund zur Region %lang:region% hinzugefügt."
"addfriend-success": "%lang:tPlayer|%0%|% wurde als Freund zu deiner Region %lang:region% hinzugefügt."
"addfriend-alreadyAdded": "%lang:tPlayer|%0%|% wurde bereits als Freund zu der Region %lang:region% hinzugefügt."
"addfriend-self": "Den Besitzer der Region als Freund hinzuzufügen wäre sinnlos."
"addfriend-noOwner": "Du kannst keine Freunde zu einer Region ohne Besitzer hinzufügen."
"addfriend-notVisited": "Du kannst %0% nicht hinzufügen, weil dieser Spieler noch nie auf dem Server war."
"delfriend-help": "/as delfriend <Spieler> [Region], wählt automatisch die Region, in der du dich befindest, wenn nicht angegeben."
"delfriend-noPermissionOther": "Du hast keine Berechtigung, Freunde von Regionen zu entfernen, die dir nicht gehören."
"delfriend-noPermission": "Du hast keine Berechtigung, Freunde von deinen Regionen zu entfernen."
"delfriend-successOther": "%lang:tPlayer|%0%|% wurde als Freund der Region %lang:region% entfernt."
"delfriend-success": "%lang:tPlayer|%0%|% wurde als Freund Deiner Region %lang:region% entfernt."
"delfriend-notAdded": "%lang:tPlayer|%0%|% wurde nicht als Freund zur Region %lang:region% hinzugefügt."
"delfriend-noOwner": "Du kannst keine Freunde von einer Region ohne Besitzer entfernen."
"linksigns-multipleRegions": "Mehrere Regionen gefunden: [gray]%0%."
"linksigns-multipleRegionsAdvice": "Bitte klicke nochmal oder benutze '/as linksigns', um aufzuhören."
"linksigns-noRegions": "Keine AreaShop Regionen in Cursorrichtung gefunden, bitte stell sicher, dass die Region in AreaShop registriert ist. [gray](Maximale Reichweite 100 Blöcke)"
"linksigns-regionFound": "Region %lang:region% wurde gefunden, verbinde sie jetzt mit einem Linksklick auf ein Schild."
"linksigns-signFound": "Schild gefunden bei (%0%, %1%, %2%), mach einen Rechtsklick auf eine Region um das Schild zu verbinden."
"linksigns-noSign": "Kein Schild in Cursorrichtung gefunden, bitte stell sicher, dass du eine direkte Sicht auf ein Schild hast und klicke erneut [gray](Maximale Reichweite 100 Blöcke)."
"linksigns-alreadyRegistered": "Dieses Schild ist bereits auf die Region %lang:region% registriert, klicke erneut um ein anderes Schild zu wählen."
"linksigns-first": "Du bist nun im Schilderverbindungsmodus."
"linksigns-next": "[gray]Linksklicke um ein Schild zu wählen, Rechtsklicke um eine Region zu wählen. Benutze /as linksigns um aufzuhören."
"linksigns-noPermission": "Du hast keine Berechtigungen um den Schilder-Massenverbindungsmodus zu benutzen."
"linksigns-stopped": "Schilder-Verbindungsmodus verlassen."
"stack-help":
- "/as stack <Menge> <Abstand> <Name> <rent|buy> [Gruppe]."
- "[gray]<Menge> Nummer der Regionen, die erstellt werden."
- "[gray]<Abstand> Block-Abstand zwischen den Regionen."
- "[gray]<Name> Namen der Regionen (Nummer wird dahinter sein)."
- "[gray]<rent|buy> Macht die Regionen zu kauf- oder Mietregionen"
- "[gray][Gruppe] Eine Gruppe, die zu den erstellten Regionen hinzugefügt wird."
- "Die Regionen werden in deiner Blickrichtung erstellt."
"stack-accepted": "Erstelle %0% %1% Regionen mit %2% Blöcken Abstand, Namen beginnend mit %3% und einer Zahl dahinter. %4%"
"stack-addToGroup": "Gruppe '%0%' wird zu den erstellten Regionen hinzugefügt."
"stack-noPermission": "Du hast keine Berechtigungen um Regionen massenweise in AreaShop zu erstellen und hinzuzufügen."
"stack-wrongAmount": "'%0%' ist keine korrekte Anzahl von Regionen."
"stack-wrongGap": "'%0%' ist keine korrekte Nummer von Blöcken für den Abstand, der zwischen den Regionen sein soll."
"stack-noSelection": "Du hast keine Auswahl, die angibt, wo die erste Region erstellt werden soll."
"stack-addStart": "[gray]Füge %0% Regionen mit %1% Regionen pro Sekunde hinzu."
"stack-addComplete": "[gray]%0% Regionen%1% hinzugefügt."
"stack-tooHigh": ", %0% Regionen übersprungen, da sie sich über Y=256 befinden."
"stack-tooLow": ", %0% Regionen übersprungen, da sie sich unter Y=0 befinden."
"stack-unclearDirection": "Bitte gucke ganz klar nach Norden, Osten, Süden, Westen, nach oben oder unten. Du guckst im Moment nach %0%."
"setlandlord-help": "/as setlandlord <Spieler> [Region], die Region in der du stehst wird verwendet, wenn keine angegeben wird."
"setlandlord-noPermission": "Du hast keine Rechte um den Vermieter einer Region zu setzen."
"setlandlord-success": "%lang:landlord% wurde erfolgreich als Vermieter der Region %lang:region% gesetzt."
"message-help": "/as message <Spieler> <Nachricht...>"
"message-noPermission": "Du hast keine Berechtigung AreaShop Nachrichten zu senden."
"message-notOnline": "%0% ist nicht online."
"confirm-rent":
- "%lang:prefix%Bist du sicher, dass du %lang:tRegion|%0%|% mieten willst?"
- "[darkgreen][bold]►[reset] %lang:button|Klick zum Mieten %0%|%"
- "hover: %lang:action|Rent %0%|%"
- "command: /areashop rent %0%"
"confirm-extend":
- "%lang:prefix%Bist du sicher, dass du %lang:tRegion|%0%|% verlängern willst?"
- "[darkgreen][bold]►[reset] %lang:button|Klick zum Verlängern %0%|%"
- "hover: %lang:action|Verlängern %0%|%"
- "command: /areashop rent %0%"
"confirm-unrent":
- "%lang:prefix%Bist du sicher, dass du %lang:tRegion|%0%|% nicht länger mieten möchtest?"
- "[darkgreen][bold]►[reset] %lang:button|Klick zum Auflösen %0%|%"
- "hover: %lang:action|Mietvertrag auslösen %0%|%"
- "command: /areashop unrent %0%"
"confirm-buy":
- "%lang:prefix% Bist du sicher das du %lang:tRegion|%0%|% kaufen möchtest?[break]"
- "[darkgreen][bold]►[reset] %lang:button|Click to buy %0%|%"
- " hover: %lang:action|Buy %0%|%"
- " command: /areashop buy %0% "
"confirm-sell":
- "%lang:prefix% Bist du sicher, dass du %lang:tRegion|%0%|% verkaufen willst?[break]"
- "[darkgreen][bold]►[reset] %lang:button|Klick zum Verkaufen von %0%|%"
- " hover: %lang:action|Verkaufe %0%|%"
- " command: /areashop sell %0% "
"timeleft-years": "%0% Jahre"
"timeleft-months": "%0% Monate"
"timeleft-days": "%0% Tage"
"timeleft-hours": "%0% Stunden"
"timeleft-minutes": "%0% Minuten"
"timeleft-second": "%0% Sekunde"
"timeleft-seconds": "%0% Sekunden"
"timeleft-ended": "abgelaufen"
"greeting-forrent": "%region% kann gemietet werden für %price% je %duration%."
"greeting-rented": "%region% ist vermietet an %player% bis %until%."
"greeting-forsale": "%region% kann gekauft werden für %price%."
"greeting-bought": "%region% ist Eigentum von %player%."
"greeting-resale": "%region% kann für %resellprice% von 1%player% gekauft werden."
-625
View File
@@ -1,625 +0,0 @@
# ╔═════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════
# ║ Language file of the AreaShop plugin created by NLThijs48, Github can be found at https://github.com/NLthijs48/AreaShop
# ║ English language file, plugin version 2.5.0
# ║
# ║ 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`
# ║ 3: Change the `language` setting in config.yml to `servername`, do not include `.yml`
# ║ 4: Change the messages in the new file to your liking
# ║ 5: Use `/as reload`or reload/restart your server to see the changes
# ╚═════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════
action: "[gold][bold]<%0%>[/bold]"
button: "[bold]<%0%>[/bold]"
command:
- "[bold]%0%[/bold]"
- " hover: %lang:action|Use %1%|%"
- " command: %1%"
helpCommand:
- "[gold]%0% [gray]-[reset]"
- " hover: %lang:action|Use %0%|%"
- " command: %0%"
region: "%lang:tRegion|%region%|%"
tRegion:
- "[bold]%0%[/bold]"
- " hover: Region %0%"
- " hover: %lang:action|Region information|%"
- " command: /areashop info region %0%"
player: "%lang:tPlayer|%player%|%"
tPlayer:
- "[bold]%0%[/bold]"
- " hover: Player %0%"
- " hover: %lang:action|Regions of %0%|%"
- " command: /areashop info player %0%"
landlord:
- "[bold]%landlord%[/bold]"
- " hover: Landlord %landlord%"
- " hover: %lang:action|Regions of %landlord%|%"
- " command: /areashop info player %landlord%"
total-maximum: "You can't rent and buy more than %0% region(s) in total (you already have %1% in group '%2%')."
confirm-yes: " [gray]Click to %lang:command|Confirm|%0%|%[gray], or repeat the command."
general-notReady: "AreaShop has not fully loaded yet, please wait."
general-noWorld: "You cannot do that, the world of %lang:region% is currently unavailable (world '%world%')."
general-noRegion: "You cannot do that, the WorldGuard region is currently unavailable (region %lang:region%)."
general-noEconomy: "There is no Economy plugin installed or it is not setup correctly, notify the server owner about this."
general-cancelled: "%0%"
cmd-notValid: "That command is not valid, use '/as help' for info."
cmd-onlyByPlayer: "This command can only be run by a player."
cmd-weOnlyByPlayer: "Using a WorldEdit selection is only possible as a player, specify the region name as extra argument."
cmd-noSelection: "You don't have a WorldEdit selection."
cmd-noRegionsFound: "No regions registered in AreaShop are found in your selection."
cmd-noWERegionsFound: "No WorldEdit regions intersecting your selection are found."
cmd-notRegistered: "Region '%0%' is not available in AreaShop."
cmd-noRegion: "'%0%' is not a valid WorldGuard region."
cmd-noRegionsAtLocation: "No regions found at your location, specify the region as argument."
cmd-moreRegionsAtLocation: "More than one region has been found at your location, specify the region as argument."
cmd-automaticRegionOnlyByPlayer: "Automatically determining the region is only possible for players, specify the region as argument."
help-header: "Help page, commands that you can execute."
help-noPermission: "You do not have permission to view the help page."
help-alias: "Command aliases: /areashop, /as."
help-help: "%lang:helpCommand|/as help|% Shows this help page."
help-info: "%lang:helpCommand|/as info|% Get info about current regions."
help-rent: "%lang:helpCommand|/as rent|% Rent a region or extend your current rent."
help-buy: "%lang:helpCommand|/as buy|% Buy a region."
help-unrent: "%lang:helpCommand|/as unrent|% Unrent a region."
help-sell: "%lang:helpCommand|/as sell|% Sell a region."
help-reload: "%lang:helpCommand|/as reload|% Reload all files and update the regions."
help-setrestore: "%lang:helpCommand|/as setrestore|% Set restoring on/off and choose profile."
help-setprice: "%lang:helpCommand|/as setprice|% Change the price of a region."
help-setduration: "%lang:helpCommand|/as setduration|% Change the duration of a rent region."
help-teleport: "%lang:helpCommand|/as tp|% Teleport to a rent/buy region."
help-setteleport: "%lang:helpCommand|/as settp|% Set teleport position for a region."
help-find: "%lang:helpCommand|/as find|% Find an empty buy or rent."
help-groupadd: "%lang:helpCommand|/as groupadd|% Add a region to a group."
help-groupdel: "%lang:helpCommand|/as groupdel|% Delete a region from a group."
help-grouplist: "%lang:helpCommand|/as grouplist|% Display all groups currently registered."
help-groupinfo: "%lang:helpCommand|/as groupinfo|% Display information about a group."
help-schemevent: "%lang:helpCommand|/as schemevent|% Trigger a schematic event for a region."
help-add: "%lang:helpCommand|/as add|% Register a region as rent or buy."
help-del: "%lang:helpCommand|/as del|% Delete a registered region from AreaShop."
help-addsign: "%lang:helpCommand|/as addsign|% Add a sign to an existing region."
help-delsign: "%lang:helpCommand|/as delsign|% Delete the sign you are looking at."
help-me: "%lang:helpCommand|/as me|% Check which regions you have (+expiration)."
help-setowner: "%lang:helpCommand|/as setowner|% Set region owner or extend the rent."
help-resell: "%lang:helpCommand|/as resell|% Put a region into resell mode."
help-stopResell: "%lang:helpCommand|/as stopresell|% Put a region back into sold mode."
help-addFriend: "%lang:helpCommand|/as addfriend|% Add a friend to a region."
help-delFriend: "%lang:helpCommand|/as delfriend|% Delete a friend from a region."
help-linksigns: "%lang:helpCommand|/as linksigns|% Use bulk sign linking mode."
help-stack: "%lang:helpCommand|/as stack|% Create multiple regions and add them."
help-setlandlord: "%lang:helpCommand|/as setlandlord|% Set the landlord of a region."
help-import: "%lang:helpCommand|/as import|% Import region from RegionForSale."
rent-help: "/as rent [region], the region you stand in will be used if not specified."
rent-noPermission: "You don't have permission to rent a region."
rent-maximum: "You can't rent more than %0% region(s) (you already have %1% in group '%2%')."
rent-maximumExtend: "You can't extend this rent because you have more than %0% region(s) (you already have %1% in group '%2%')."
rent-payError: "Something went wrong with paying, try again later."
rent-rented: "You rented %lang:region% until %until%, you can extend your rent by rightclicking the sign again or using /as rent."
rent-extended: "You extended your rent of %lang:region% until %until%."
rent-extendedToMax: "You extended your rent of %lang:region% until %until% (which is the maximum rental time of %maxrenttime%)."
rent-lowMoneyExtend: "You don't have enough money to extend the rent (you have %0% and you need %price%)."
rent-lowMoneyRent: "You don't have enough money to rent %lang:region% (you have %0% and you need %price%)."
rent-someoneElse: "Someone else already rented %lang:region%."
rent-notRentable: "Region '%0%' is not available for renting (not registered in AreaShop or it is a buy region)."
rent-maxExtends: "You cannot extend this rent anymore (the maximum is %maxextends% times), however after the rent is over you can rent %lang:region% again."
rent-maxRentTime: "You cannot rent %lang:region% more time in advance, the maximum time is %maxrenttime% and you have currently rented it for %timeleft%."
rent-restrictedToWorld: "You need to be in the '%world%' world to rent %lang:region% (you are in '%0%')."
rent-restrictedToRegion: "You need to be inside %lang:region% to rent it."
rent-expireWarning: "Your region %lang:region% has %timeleft% left, be sure to extend it if you want to keep it."
rent-expiringSoon: "Your region %lang:tRegion|%0%|% has %1% left, be sure to extend it if you want to keep it."
rent-alreadyAtFull: "%lang:region% is already at or above the maximum rental time, you cannot extend it yet."
buy-help: "/as buy [region], the region you stand in will be used if not specified."
buy-noPermission: "You don't have permission to buy a region."
buy-noPermissionResell: "You don't have permission to buy a region in resell mode."
buy-noPermissionNoResell: "You don't have permission to buy a region that is not in resell mode."
buy-notBuyable: "Region '%0%' is not available for buying (not registered in AreaShop or it is a rental region)."
buy-maximum: "You can't buy more than %0% region(s) (you already have %1% in group '%2%')."
buy-payError: "Something went wrong with paying, try again later."
buy-succes: "You successfully bought %lang:region%."
buy-successResale: "You successfully bought %lang:region% from %lang:tPlayer|%0%|%."
buy-successSeller: "Your region %lang:region% has been sold to %lang:player% for %0%."
buy-lowMoney: "You don't have enough money to buy %lang:region% (you have %0% and you need %price%)."
buy-lowMoneyResell: "You don't have enough money to buy %lang:region% (you have %0% and you need %resellprice%)."
buy-yours: "You already own %lang:region%."
buy-someoneElse: "Someone else already bought %lang:region%."
buy-restrictedToWorld: "You need to be in the '%world%' world to buy %lang:region% (you are in '%0%')."
buy-restrictedToRegion: "You need to be inside %lang:region% to buy it."
unrent-help: "/as unrent [region], the region you stand in will be used if not specified."
unrent-noPermission: "You don't have permission to unrent a region."
unrent-noPermissionOther: "You don't have permission to unrent another region."
unrent-notRegistered: "The region can't be unrented because it is not registered for renting."
unrent-notRented: "The region can't be unrented because it is not rented."
unrent-unrented: "%lang:region% of %lang:player% has been unrented."
unrent-expired: "Your rent of %lang:region% has expired."
sell-help: "/as sell [region], the region you stand in will be used if not specified."
sell-notRegistered: "The region can't be sold because it is not registered for buying."
sell-notBought: "The region can't be sold because it is not someone's property."
sell-sold: "%lang:region% of %lang:player% has been sold."
sell-noPermission: "You don't have permission to sell a region."
sell-noPermissionOther: "You don't have permission to sell another region."
sell-disabled: "Selling has been disabled for this region."
reload-reloading: "Reloaded all configuration and region files."
reload-updateStart: ""
reload-updateComplete: ""
reload-noPermission: "You don't have permission to reload the config files."
reload-updateCommandChanged: "'/as updaterents' and '/as updatebuys' have been removed, '/as reload' will also update the regions now so use that command instead."
info-help:
- "/as info[break]"
- " %lang:command|all|/as info all|%[break]"
- " %lang:command|rented|/as info rented|% [group] [page][break]"
- " %lang:command|forrent|/as info forrent|% [group] [page][break]"
- " %lang:command|sold|/as info sold|% [group] [page][break]"
- " %lang:command|forsale|/as info forsale|% [group] [page][break]"
- " %lang:command|reselling|/as info reselling|% [group] [page][break]"
- " %lang:command|nogroup|/as info nogroup [page]|%[break]"
- " %lang:command|region|/as info region|% [region]"
info-noPermission: "You don't have permission to get information about regions."
info-allHeader: "All regions%0%:"
info-rentedHeader: "Rented regions%0%:"
info-forrentHeader: "For rent regions%0%:"
info-forsaleHeader: "For sale regions%0%:"
info-soldHeader: "Sold regions%0%:"
info-resellingHeader: "Reselling regions%0%:"
info-nogroupHeader: "Regions without group%0%:"
info-limitedToGroup: " (limited to group %0%)"
info-nogroupNone: "There are no regions without a group."
info-noFiltergroup: "Group '%0%' does not exist and therefore cannot be used to limit the results."
info-noRegions: "No regions have been found."
info-wrongPage: "%0% is not a correct page number."
info-entryForrent: "[darkgreen][bold]►[reset] %lang:region%: [gray]For rent for %price% per %duration%."
info-entryRented: "[darkgreen][bold]►[reset] %lang:region%: [gray]Rented to %lang:player%."
info-entryForsale: "[darkgreen][bold]►[reset] %lang:region%: [gray]For sale for %price%."
info-entrySold: "[darkgreen][bold]►[reset] %lang:region%: [gray]Sold to %lang:player%."
info-entryReselling: "[darkgreen][bold]►[reset] %lang:region%: [gray]Sold to %lang:player% (reselling)."
info-pageStatus:
- "[gold]Page %0%/%1%"
info-pagePrevious:
- " [gold][bold]◄Previous[/bold] "
- " hover: %lang:action|Show previous page|%"
- " command: /areashop %0%"
info-pageNoPrevious:
- " [darkgray][bold]◄Previous[/bold] "
- " hover: This is already the first page"
info-pageNext:
- " [gold][bold]Next►[/bold]"
- " hover: %lang:action|Show next page|%"
- " command: /areashop %0%"
info-pageNoNext:
- " [darkgray][bold]Next►[/bold]"
- " hover: This is already the last page"
info-playerHelp: "/as info player <name>."
info-playerRents: "Regions rented by %lang:tPlayer|%0%|%: [gray]%1%"
info-playerNoRents: "%lang:tPlayer|%0%|% has not rented a region."
info-playerBuys: "Regions bought by %lang:tPlayer|%0%|%: [gray]%1%."
info-playerNoBuys: "%lang:tPlayer|%0%|% has not bought a region."
info-regionHelp: "/as info region [name], the region you stand in will be used if not specified."
info-regionHeaderRent: "[darkgreen]Information about %lang:region%:"
info-regionHeaderBuy: "[darkgreen]Information about %lang:region%:"
info-regionFooterRent: ""
info-regionFooterBuy: ""
info-regionRented: "[darkgreen][bold]►[reset] Rented by %lang:player% until: [gray]%until%."
info-regionBought: "[darkgreen][bold]►[reset] Bought by %lang:player%."
info-regionReselling: "[darkgreen][bold]►[reset] Bought by %lang:player%, currently reselling."
info-regionExtending:
- "[darkgreen][bold]►[reset] "
- "[bold]Extend for[/bold]"
- " hover: Extend rent of %region%"
- " hover: with %duration% for %price%"
- " hover: %lang:action|Extend rent of %region%|%"
- " command: /areashop rent %region%"
- ": [gray]%price% per %duration%."
info-regionCanBeRented:
- "[darkgreen][bold]►[reset] "
- "[bold]Rent for[/bold]"
- " hover: Rent %region% for %price% per %duration%"
- " hover: %lang:action|Rent %region%|%"
- " command: /areashop rent %region%"
- ": [gray]%price% per %duration%."
info-regionCanBeBought:
- "[darkgreen][bold]►[reset] "
- "[bold]Buy for[/bold]"
- " hover: Buy %region% for %price%"
- " hover: %lang:action|Buy %region%|%"
- " command: /areashop buy %region%"
- ": [gray]%price%."
info-regionReselPrice: "[darkgreen][bold]►[reset] Resell price: [gray]%resellprice% (you can buy it from %lang:player%)."
info-regionFriends: "[darkgreen][bold]►[reset] Added friends: [gray]%0%."
info-friend: "%lang:tPlayer|%0%|%"
info-friendRemove:
- "%lang:info-friend|%0%|%"
- "[red]✕[gray]"
- " hover: Region %region%"
- " hover: %lang:action|Remove %0% as friend|%"
- " command: /areashop delfriend %0% %region%"
info-regionMoneyBackBuy:
- "[darkgreen][bold]►[reset] Selling payback: [gray]%moneyback% (%moneybackpercent%% of the price)."
info-regionMoneyBackBuyClick:
- "[darkgreen][bold]►[reset] "
- "[bold]Selling payback[/bold]"
- " hover: Sell %region% and get back %moneyback%"
- " hover: %lang:action|Sell %region%|%"
- " command: /areashop sell %region%"
- ": [gray]%moneyback% (%moneybackpercent%% of the price)."
info-regionMoneyBackRent:
- "[darkgreen][bold]►[reset] Unrenting payback: [gray]%moneyback% (%moneybackpercent%% of the remaining time)."
info-regionMoneyBackRentClick:
- "[darkgreen][bold]►[reset] "
- "[bold]Unrenting payback[/bold]"
- " hover: Unrent %region% and get back %moneyback%"
- " hover: %lang:action|Unrent %region%|%"
- " command: /areashop unrent %region%"
- ": [gray]%moneyback% (%moneybackpercent%% of the remaining time)."
info-regionMaxExtends: "[darkgreen][bold]►[reset] Maximum number of extensions: [gray]%maxextends% time(s)."
info-regionNoExtending: "[darkgreen][bold]►[reset] Rent cannot be extended."
info-regionExtendsLeft: "[darkgreen][bold]►[reset] Extensions left: [gray]%extendsleft% time(s) out of %maxextends%."
info-regionMaxRentTime: "[darkgreen][bold]►[reset] In advance renting: [gray]%maxrenttime% at maximum."
info-prefix: "[darkgreen][bold]►[reset] "
info-regionTeleport:
- "[bold]Go to the region[/bold]"
- " hover: %lang:action|Teleport to %region%|%"
- " command: /areashop tp %region%"
info-setRegionTeleport:
- "[bold]set teleport location[/bold]"
- " hover: %region%"
- " hover: %lang:action|Set teleport location|%"
- " command: /areashop settp %region%"
info-regionSigns: "[darkgreen][bold]►[reset] Connected signs: [gray]%0%."
info-regionSignLocation: "[gray](%0%, %1%, %2%, %3%)[reset]"
info-regionGroups: "[darkgreen][bold]►[reset] Assigned groups: [gray]%0%."
info-regionInactiveUnrent: "[darkgreen][bold]►[reset] Auto unrent after: [gray]%inactivetime% of inactivity by the player."
info-regionInactiveSell: "[darkgreen][bold]►[reset] Auto sell after: [gray]%inactivetime% of inactivity by the player."
info-regionRestrictedRegionRent: "[darkgreen][bold]►[reset] You must be inside %lang:region% to rent it."
info-regionRestrictedWorldRent: "[darkgreen][bold]►[reset] You need to be inside world '%world%' to rent %lang:region%."
info-regionRestrictedRegionBuy: "[darkgreen][bold]►[reset] You must be inside %lang:region% to buy it."
info-regionRestrictedWorldBuy: "[darkgreen][bold]►[reset] You need to be inside world '%world%' to buy %lang:region%."
info-regionRestoringRent: "[darkgreen][bold]►[reset] Restoring is enabled [gray](region will reset at unrent)."
info-regionRestoringBuy: "[darkgreen][bold]►[reset] Restoring is enabled [gray](region will reset at sell)."
info-regionLandlord: "[darkgreen][bold]►[reset] Landlord: [gray]%lang:landlord% (receives the money)."
info-regionNotExisting: "The specified region is not registered: %0%."
setrestore-help: "/as setrestore <region> <true|false|general> [profile]."
setrestore-noPermission: "You don't have permission to change the restore settings."
setrestore-notRegistered: "The specified region is not registered: %0%."
setrestore-invalidSetting: "'%0%' is not a valid state, should be true, false or general."
setrestore-success: "Successfully set the restore setting of %lang:region% to '%0%'."
setrestore-successProfile: "Successfully set the restore setting of %lang:region% to '%0%' and the profile to '%1%'."
setprice-noPermission: "You don't have permission to change the price of a region."
setprice-help: "/as setprice <price> [region], the region you stand in will be used if not specified."
setprice-notRegistered: "The specified region is not registered: %0%."
setprice-wrongPrice: "'%0%' is not a valid price."
setprice-successRent: "Price of region %lang:region% changed to %price% per %duration%."
setprice-successBuy: "Price of region %lang:region% changed to %price%."
setprice-successRemoved: "Price of %lang:region% has been removed, it will now use the price from a group or the default.yml file, new price: %price%."
setprice-noLandlord: "You don't have permission to change the price because you are not the landlord of %lang:region%."
setduration-noPermission: "You don't have permission to change the duration of a rent."
setduration-help: "/as setduration <amount> <identifier> [region], the region you stand in will be used if not specified."
setduration-notRegistered: "%0% is not registered for renting."
setduration-wrongAmount: "'%0%' is not a valid amount, use a whole number."
setduration-wrongFormat: "'%0%' is not a proper timeformat, check the documentation on Bukkit."
setduration-success: "Duration of region %lang:region% changed to '%duration%'."
setduration-noLandlord: "You don't have permission to change the duration because you are not the landlord of %lang:region%."
setduration-successRemoved: "Duration of %lang:region% has been removed, it will now use the duration from a group or the default.yml file, new duration: %duration%."
setup-noRegion: "You did not specify a region on the second line."
setup-alreadyRentSign: "The region you specified is already added to AreaShop as a rent region, add signs with [as] on the first line or '/as addsign'."
setup-alreadyOtherWorld: "The region you specified is already added to AreaShop in another world, regions from different worlds still need different names."
setup-alreadyBuySign: "The region you specified is already added to AreaShop as a buy region, add signs with [as] on the first line or '/as addsign'."
setup-noDuration: "You did not specify how long the region can be rented, do this on the third line."
setup-wrongDuration: "The time specified is not in the correct format, example: 1 day."
setup-noPrice: "You did not specify the price on the fourth line."
setup-wrongPrice: "You did not specify the price correctly, use numbers only."
setup-rentSuccess: "Renting of region %lang:region% is setup correctly."
setup-buySuccess: "Buying of region %lang:region% is setup correctly."
setup-noPermissionRent: "You don't have permission for setting up rental regions."
setup-noPermissionBuy: "You don't have permission for setting up buy regions."
setup-couldNotDetect: "Found multiple regions with the same priority and/or parent/child relation, specify one on the second line (2 of the regions that were found: %lang:tRegion|%0%|% and %lang:tRegion|%1%|%)."
setup-blacklisted: "%0% is on the blacklist and cannot be added to AreaShop."
setup-noPermission: "You cannot add the region '%0%', you are not an owner/member or don't have the permission for it."
destroy-noPermissionRent: "You don't have permission for deregistering a rental region."
destroy-noPermissionBuy: "You don't have permission for deregistering a buy region."
destroy-successRent: "%lang:region% successfully deregistered as rental region."
destroy-successBuy: "%lang:region% successfully deregistered as buy region."
teleport-help: "/as tp <region> [sign]."
teleport-noRentOrBuy: "The specified region is not registered: %0%."
teleport-noPermission: "You don't have permission to teleport to your region."
teleport-noPermissionOther: "You don't have permission to teleport to regions you do not own."
teleport-noPermissionSign: "You don't have permission to teleport to the sign of your region."
teleport-noPermissionOtherSign: "You don't have permission to teleport to signs of regions you do not own."
teleport-noPermissionFriend: "You don't have permission to teleport to regions you are added to as a friend."
teleport-noPermissionFriendSign: "You don't have permission to teleport to the sign of regions you are added to as a friend."
teleport-noPermissionAvailable: "You don't have permission to teleport to available regions."
teleport-noPermissionAvailableSign: "You don't have permission to teleport to the sign of available regions."
teleport-success: "You teleported to %lang:region%."
teleport-successSign: "You teleported to the sign of %lang:region%."
teleport-noSafe: "No safe position found in %lang:region%, no spots in the region left or maximum tries exceeded (%0%/%1%)."
teleport-blocked: "You can't teleport because the position is outside the region, and you are forced to teleport inside."
teleport-changedToSign: "You only have permission to teleport to the sign and not inside the region, teleporting to sign."
teleport-changedToNoSign: "No sign available to teleport to, trying to teleport inside the region instead."
teleport-wrongWorld: "You need to be in world '%world%' to teleport to %lang:region%, but you are in world '%0%'."
setteleport-help: "/as settp [region] [reset], the region you stand in will be used if not specified."
setteleport-noPermission: "You don't have permission to set the teleport location."
setteleport-noPermissionOther: "You don't have permission to set the teleport location for a region you do not own."
setteleport-noRentOrBuy: "The specified region is not registered: %0%."
setteleport-success: "Teleport location of %lang:region% set."
setteleport-notInside: "The location has to be inside the region."
setteleport-reset: "Teleport location of %lang:region% has been reset."
find-help: "/as find <buy|rent> [maxprice] [group]."
find-noPermission: "You don't have permission to search regions and teleport to them."
find-success: "Found a %0% region: %lang:region%, while searching with a max price of your balance: %1%%2%."
find-successMax: "Found a %0% region: %lang:region%, while searching with a max price of %1%%2%."
find-wrongMaxPrice: "The specified maximum price is not a correct number: %0%."
find-wrongGroup: "The specified group does not exist: %0%."
find-noneFound: "No %0% region found while searching with a max price of your balance: %1%%2%."
find-noneFoundMax: "No %0% region found while searching with a max price of %1%%2%."
find-onlyInGroup: ", only searched for regions in group: %0%."
groupadd-help: "/as groupadd <group> [region], if no region specified all regions from your WorldEdit selection are used."
groupadd-noPermission: "You don't have permission to add regions to groups."
groupadd-success: "Region %lang:region% has been added to group '%0%', this group now has %1% member(s)."
groupadd-failed: "Region %lang:region% is already a member of group '%0%'."
groupadd-weSuccess: "Added to group %0%: [gray]%1%."
groupadd-weFailed: "Were already in group %0%: [gray]%1%."
groupdel-help: "/as groupdel <group> [region], if no region specified all regions from your WorldEdit selection are used."
groupdel-noPermission: "You don't have permission to remove regions from groups."
groupdel-wrongGroup: "Group %0% not found, check '/as grouplist' for registered groups."
groupdel-success: "Region %lang:region% has been removed from group '%0%', this group now has %1% member(s)."
groupdel-failed: "Region %lang:region% is not a member of group '%0%'."
groupdel-weSuccess: "Removed from group %0%: [gray]%1%."
groupdel-weFailed: "Were not in group %0% anyway: [gray]%1%."
grouplist-noPermission: "You don't have permission to display the registered groups."
grouplist-noGroups: "There are currently no groups registered."
grouplist-success: "The following groups are registered: [gray]%0%."
groupinfo-help: "/as groupinfo <group>."
groupinfo-noPermission: "You don't have permission to display information about a group."
groupinfo-noGroup: "There is no group registered with the name '%0%', use /as grouplist to check groups."
groupinfo-members: "The following regions are member of group %0%: [gray]%1%."
groupinfo-noMembers: "Group %0% does not have any members."
schemevent-help: "/as schemevent <region> <created|deleted|rented|unrented|bought|sold>."
schemevent-wrongEvent: "The specified event '%0%' does not exist, use one of the following: [gray]%1%."
schemevent-success: "Event '%0%' has successfully been triggered for region %lang:region%."
schemevent-noPermission: "You don't have permission to trigger schematic events."
add-help: "/as add <rent|buy> [region] [world]."
add-noPermission: "You don't have permission to add a region to AreaShop."
add-success: "Added as %0%: [gray]%1%."
add-failed: "Already registered: [gray]%0%."
add-failedOtherWorld: "Already registered from another world: [gray]%0%."
add-blacklisted: "On the blacklist: [gray]%0%."
add-rentCancelled: "Rent cancelled: [gray]%0%."
add-buyCancelled: "Buy cancelled: [gray]%0%."
add-addCancelled: "Add cancelled: [gray]%0%."
add-specifyWorld: "Specify the world of the region when using from console."
add-incorrectWorld: "World '%0%' not found, try again (case-sensitive)."
add-noPermissionRegions: "No permission to add: [gray]%0%."
add-noPermissionOwnerMember: "[gray]You either are not a member/owner of these regions or have no permission to add your regions."
del-noPermission: "You don't have permission to remove regions."
del-success: "Removed regions: [gray]%0%."
del-failed: "No permission to remove or not registered: [gray]%0%."
del-cancelled: "Delete cancelled: [gray]%0%."
addsign-help: "/as addsign [region] [profile]."
addsign-noSign: "You are not looking at a sign."
addsign-noRegions: "No region found around the sign position."
addSign-notRegistered: "The specified region is not registered in AreaShop: %0% (it first needs to be added to AreaShop before a sign can be added)."
addsign-couldNotDetect: "Found multiple regions around the sign, specify region as extra argument (2 of the regions that were found: %lang:tRegion|%0%|% and %lang:tRegion|%1%|%)."
addsign-couldNotDetectSign: "Found multiple regions around the sign, specify region on the second line (2 of the regions that were found: %lang:tRegion|%0%|% and %lang:tRegion|%1%|%)."
addsign-wrongProfile: "The specified profile does not exist, use one of the following (check config): [gray]%0%."
addsign-profile:
- "[bold]%0%[/bold]"
- " hover: Signprofile %0%"
- " hover: %lang:action|Use this profile|%"
- " command: /areashop linksigns %0%"
addsign-success: "The sign has been added to %lang:region%."
addsign-successProfile: "The sign has been added to %lang:region% with profile %0%."
addsign-alreadyRegistered: "That sign is already registered for region %lang:region%."
addsign-noPermission: "You don't have permission to add a sign."
delsign-noSign: "You are not looking at a sign."
delsign-noPermission: "You don't have permission to delete a sign."
delsign-noRegion: "That sign does not belong to an AreaShop region."
delsign-success: "The sign has been removed from region %lang:region%."
me-noPermission: "You don't have permission to check which regions you have."
me-header: "Regions of %lang:tPlayer|%0%|%:"
me-notAPlayer: "You are not a player so you can't have any regions."
me-rentLine:
- "[darkgreen][bold]►[reset] %lang:region% [gray]("
- "%timeleft% left"
- " hover: until %until%"
- ")."
me-buyLine: "[darkgreen][bold]►[reset] %lang:region%."
me-friendLine:
- "[darkgreen][bold]►[reset] %lang:region% [gray]("
- "owned by %lang:player%"
- " hover: You are added as friend"
- ")."
me-nothing: "%lang:tPlayer|%0%|% has not rented or bought regions and is not added as friend to one."
me-noPlayer: "%0% cannot be found, probably never joined the server."
me-clickHint: "[gray][italic]Click a region name to see details."
setowner-help: "/as setowner <player> [region], the region you stand in will be used if not specified."
setowner-noPermission: "You don't have permission to set the owner of a region."
setowner-noPermissionRent: "You don't have permission to set the owner of rent regions."
setowner-noPermissionBuy: "You don't have permission to set the owner of buy regions."
setowner-notRegistered: "The specified region is not registered, owner cannot be set."
setowner-noPlayer: "Could not get the UUID of the specified player: %0%."
setowner-succesRent: "Owner of %lang:region% successfully changed to %lang:player%, rented until %until% (%timeleft% left)."
setowner-succesRentExtend: "Owner was already %lang:player%, rent extended with '%duration%', now rented until %until% (%timeleft% left)."
setowner-succesBuy: "Owner of %lang:region% successfully changed to %lang:player%."
resell-help: "/as resell <price> [region], the region you stand in will be used if not specified."
resell-wrongPrice: "'%0%' is not a valid price."
resell-notRegistered: "The specified region is not registered: %0%."
resell-notBought: "You can't resell %lang:region% because it is not sold yet."
resell-success: "%lang:region% is successfully put into reselling mode for %resellprice%."
resell-noPermission: "You don't have permission to set your region in reselling mode."
resell-noPermissionOther: "You don't have permission to set regions in reselling mode."
resell-disabled: "Reselling has been disabled for this region."
stopresell-help: "/as stopresell [region], the region you stand in will be used if not specified."
stopresell-notRegistered: "The specified region is not registered: %0%."
stopresell-notResell: "You can't stop reselling %lang:region% because it is not in resell mode."
stopresell-success: "%lang:region% is successfully put back into sold mode."
stopresell-noPermission: "You don't have permission to set your region back to sold mode."
stopresell-noPermissionOther: "You don't have permission to set regions back to sold mode."
addfriend-help: "/as addfriend <player> [region], the region you stand in will be used if not specified."
addfriend-noPermissionOther: "You don't have permission to add friends to regions that are not yours."
addfriend-noPermission: "You don't have permission to add friends to your region."
addfriend-successOther: "%lang:tPlayer|%0%|% has been added as friend to region %lang:region%."
addfriend-success: "%lang:tPlayer|%0%|% has been added as friend to your region %lang:region%."
addfriend-alreadyAdded: "%lang:tPlayer|%0%|% is already added as friend to %lang:region%."
addfriend-self: "Adding the owner of the region as friend would be pointless."
addfriend-noOwner: "You cannot add friends to a region without owner."
addfriend-notVisited: "You cannot add %0% because he did not visit the server yet."
delfriend-help: "/as delfriend <player> [region], the region you stand in will be used if not specified."
delfriend-noPermissionOther: "You don't have permission to delete friends from regions that are not yours."
delfriend-noPermission: "You don't have permission to delete friends from your region."
delfriend-successOther: "%lang:tPlayer|%0%|% has been deleted as friend from region %lang:region%."
delfriend-success: "%lang:tPlayer|%0%|% has been deleted as friend from your region %lang:region%."
delfriend-notAdded: "%lang:tPlayer|%0%|% is not added as friend to %lang:region%."
delfriend-noOwner: "You cannot remove friends from a region without owner."
linksigns-multipleRegions: "Found multiple regions: [gray]%0%."
linksigns-multipleRegionsAdvice: "Click another time to try again or use '/as linksigns' to stop."
linksigns-noRegions: "No AreaShop regions found in the direction of your cursor, make sure the region is added to AreaShop [gray](maximum range 100 blocks)."
linksigns-regionFound: "Region %lang:region% has been found, now point to a sign and leftclick to link it."
linksigns-signFound: "Found a sign at (%0%, %1%, %2%), now point towards a region and rightclick to link it"
linksigns-noSign: "No sign found in the direction of your cursor, make sure you have a direct sight to a sign and click again [gray](maximum range 100 blocks)."
linksigns-alreadyRegistered: "That sign is already registered for region %lang:region%, click again to select another sign."
linksigns-first: "You have entered sign linking mode."
linksigns-next: "[gray]Leftclick to select a sign, rightclick to select a region, use /as linksigns to stop."
linksigns-noPermission: "You don't have permission to enter bulk sign linking mode."
linksigns-stopped: "Exited sign linking mode."
stack-help:
- "/as stack <amount> <gap> <name> <rent|buy> [group].[break]"
- " [gray]<amount> Number of regions that will be created.[break]"
- " [gray]<gap> Blocks distance between the regions.[break]"
- " [gray]<name> Name of the regions (number will be behind it).[break]"
- " [gray]<rent|buy> Make then rent or buy regions.[break]"
- " [gray][group] A group to add the created regions to.[break]"
- " [gray]The regions will be created in the direction you are facing."
stack-accepted: "Starting to create %0% %1% regions with %2% blocks in between, names start with %3% and have a number behind them.%4%"
stack-addToGroup: " Created regions will be added to the group '%0%'."
stack-noPermission: "You don't have permission to create and add regions to AreaShop in bulk."
stack-wrongAmount: "'%0%' is not a correct amount of regions."
stack-wrongGap: "'%0%' is not a correct number for the number of blocks gap between regions."
stack-noSelection: "You don't have a selection that indicates where the first region should be created."
stack-addStart: "[gray]Adding %0% regions at %1% per second."
stack-addComplete: "[gray]Added %0% regions%1%."
stack-tooHigh: ", %0% regions skipped because they were above Y=256"
stack-tooLow: ", %0% regions skipped because they were below Y=0"
stack-unclearDirection: "Please look clearly in the north, east, south, west, up or down direction, currently detected %0%."
setlandlord-help: "/as setlandlord <player> [region], the region you stand in will be used if not specified."
setlandlord-noPermission: "You don't have permission to set the landlord for a region."
setlandlord-success: "%lang:landlord% has successfully been set as landlord of %lang:region%."
message-help: "/as message <player> <message...>"
message-noPermission: "You do not have permission to send AreaShop messages."
message-notOnline: "%0% is not online."
import-help: "/as import RegionForSale"
import-wrongSource: "Specify from where you want to import data, options: RegionForSale."
import-noPluginFolder: "Could not find the %0% folder, are you sure you are importing from the correct source?"
import-noWorldsFolder: "There is no 'plugins/RegionForSale/worlds' folder, therefore nothing could be imported."
import-confirm: "Are you sure you want to import all regions from RegionForSale?"
import-start: "Starting import of RegionForSale data:"
import-doWorld: "[darkgreen][bold]► World %0%:"
import-noBukkitWorld: "[red]Could not find world in Bukkit."
import-noRegionManager: "[red]Could not get RegionManager from WorldGuard, are regions enabled in this world?"
import-noRegions: "[red]No regions.yml file found."
import-loadRegionsFailed: "[red]Could not load regions.yml at: %0%"
import-invalidRegionSection: "[red]Invalid section in regions.yml: %0%."
import-noWorldGuardRegion: "[red]WorldGuard region not found: %0%."
import-noWorldGuardRegionParent: "[red]WorldGuard region for parent region not found: %0%."
import-buyAndRent: "[gold]%0% can be bought and rented, only adding as buy in AreaShop (cannot be both)."
import-noBuyAndNoRent: "[red]%0% cannot be bought and cannot be rented, skipping import."
import-imported: "[green]%lang:tRegion|%0%|% imported."
import-loadWorldConfigFailed: "[red]Loading world-specific config.yml failed: %0%."
import-improperParentRegion: "[red]Parent region %0% does not have readable settings."
import-alreadyAdded: "[red]Region '%0%' has already been added."
import-alreadyAddedOtherWorld: "[red]Region '%0%' has already been added in world %1%, regions in different worlds cannot have the same name in AreaShop."
import-invalidSignLocation: "[red]Failed to import a sign of region '%0%', invalid location: '%1%'."
import-signAlreadyAdded: "[red]Skipped adding sign at location '%1%' to region '%0%', it is already added to region '%2%'."
import-moneyBackFailed: "[red]Failed to parse buy price '%0%' and sell price '%1%' to set the money back percentage."
confirm-rent:
- "%lang:prefix%Are you sure you want to rent %lang:tRegion|%0%|%?[break]"
- "[darkgreen][bold]►[reset] %lang:button|Click to rent %0%|%"
- " hover: %lang:action|Rent %0%|%"
- " command: /areashop rent %0%"
confirm-extend:
- "%lang:prefix%Are you sure you want to extend %lang:tRegion|%0%|%?[break]"
- "[darkgreen][bold]►[reset] %lang:button|Click to extend %0%|%"
- " hover: %lang:action|Extend %0%|%"
- " command: /areashop rent %0%"
confirm-unrent:
- "%lang:prefix%Are you sure you want to stop renting %lang:tRegion|%0%|%?[break]"
- "[darkgreen][bold]►[reset] %lang:button|Click to stop renting %0%|%"
- " hover: %lang:action|Stop renting %0%|%"
- " command: /areashop unrent %0%"
confirm-buy:
- "%lang:prefix%Are you sure you want to buy %lang:tRegion|%0%|%?[break]"
- "[darkgreen][bold]►[reset] %lang:button|Click to buy %0%|%"
- " hover: %lang:action|Buy %0%|%"
- " command: /areashop buy %0%"
confirm-sell:
- "%lang:prefix%Are you sure you want to sell %lang:tRegion|%0%|%?[break]"
- "[darkgreen][bold]►[reset] %lang:button|Click to sell %0%|%"
- " hover: %lang:action|Sell %0%|%"
- " command: /areashop sell %0%"
timeleft-years: "%0% years"
timeleft-months: "%0% months"
timeleft-days: "%0% days"
timeleft-hours: "%0% hours"
timeleft-minutes: "%0% minutes"
timeleft-second: "%0% second"
timeleft-seconds: "%0% seconds"
timeleft-ended: "Expired"
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 %resellprice% from %player%."
update-playerNotify:
- "[darkgreen]Update from AreaShop V%0% to AreaShop V%1% available, get the latest version at "
- "[bold]Spigot[/bold]"
- " hover: %lang:action|Go to the Spigot AreaShop page|%"
- " link: https://www.spigotmc.org/resources/areashop.2991/"
- " (and leave a review)."
-557
View File
@@ -1,557 +0,0 @@
# ╔═════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════
# ║ Language file of the AreaShop plugin created by NLThijs48, Github can be found at https://github.com/NLthijs48/AreaShop
# ║ Spanish language file, plugin version 2.5.0, 426/428 messages are translated (100%)
# ║
# ║ 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`
# ║ 3: Change the `language` setting in config.yml to `servername`, do not include `.yml`
# ║ 4: Change the messages in the new file to your liking
# ║ 5: Use `/as reload`or reload/restart your server to see the changes
# ╚═════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════
"action": "[gold][bold]<%0%>[/bold]"
"button": "[bold]<%0%>[/bold]"
"command":
- "[bold]%0%[/bold]"
- " hover: %lang:action|Use %1%|%"
- " command: %1%"
"helpCommand":
- "[gold]%0% [gray]-[reset]"
- " hover: %lang:action|Use %0%|%"
- " command: %0%"
"region": "%lang:tRegion|%region%|%"
"tRegion":
- "[bold]%0%[/bold]"
- " hover: Region %0%"
- " hover: %lang:action|Region information|%"
- " command: /areashop info region %0%"
"player": "%lang:tPlayer|%player%|%"
"tPlayer":
- "[bold]%0%[/bold]"
- " hover: Player %0%"
- " hover: %lang:action|Regions of %0%|%"
- " command: /areashop info player %0%"
"landlord":
- "[bold]%landlord%[/bold]"
- " hover: Landlord %landlord%"
- " hover: %lang:action|Regions of %landlord%|%"
- " command: /areashop info player %landlord%"
"total-maximum": "No puedes alquilar o comprar %0% region(es) en total (ya tienes %1% en el grupo '%2%')."
"confirm-yes": " [gray]Haz click en %lang:command|Confirm||%[gray], o reenvía el comando."
"general-notReady": "AreaShop no se ha cargado todavía. Espera un poco."
"general-noWorld": "No puedes hacer esto, el mundo de la región %lang:region% no está disponible (mundo '%world%')."
"general-noRegion": "No puedes hacer esto, la región de WorldGuard no está disponible (region %lang:region%)."
"general-noEconomy": "No hemos detectado un plugin de Economía o no está bien configurado. Habla con un staff para solucionar esto."
"general-cancelled": "%0%"
"cmd-notValid": "Este comando no es válido, usa '/as help' para mas informacion."
"cmd-onlyByPlayer": "Este comando solo puede ser ejecutado por un jugador."
"cmd-weOnlyByPlayer": "Se puede usar la selección de WorldEdit, especifica un nombre de región como argumento extra."
"cmd-noSelection": "No has hecho una selección de WorldEdit."
"cmd-noRegionsFound": "La región en la que te encuentras no está registrada en AreaShop."
"cmd-noWERegionsFound": "No se han encontrado regiones en medio de tu selección de WorldEdit."
"cmd-notRegistered": "La region '%0%' no está disponible en AreaShop."
"cmd-noRegion": "'%0%' no es una región de WorldGuard válida."
"cmd-noRegionsAtLocation": "No se han encontrado regiones en tu localización, especifica el nombre como un argumento extra."
"cmd-moreRegionsAtLocation": "Se han encontrado varias regiones en tu localización, especifica el nombre como argumento extra."
"cmd-automaticRegionOnlyByPlayer": "Solo se permite determinar regiones a los jugadores, especifica la región como argumento extra."
"help-header": "Página de Ayuda - Comandos que puedes ejecutar."
"help-noPermission": "No tienes permiso para ver la página de ayuda."
"help-alias": "Alias de comandos: /areashop, /as."
"help-help": "%lang:helpCommand|/as help|% Muestra esta página de ayuda."
"help-info": "%lang:helpCommand|/as info|% Ver la información de las regiones."
"help-rent": "%lang:helpCommand|/as rent|% Alquilar una región o extender su alquiler."
"help-buy": "%lang:helpCommand|/as buy|% Comprar una región."
"help-unrent": "%lang:helpCommand|/as unrent|% Desalquilar una región."
"help-sell": "%lang:helpCommand|/as sell|% Vender una región."
"help-reload": "%lang:helpCommand|/as reload|% Recargar los archivos y actualizar las regiones."
"help-setrestore": "%lang:helpCommand|/as setrestore|% Configurar el reseteo en on/off y elegir el perfil."
"help-setprice": "%lang:helpCommand|/as setprice|% Cambiar el precio de una región."
"help-setduration": "%lang:helpCommand|/as setduration|% Cambiar el tiempo de alquiler de una región."
"help-teleport": "%lang:helpCommand|/as tp|% Teletransportarse a una región de venta/alquiler."
"help-setteleport": "%lang:helpCommand|/as settp|% Configurar el punto de teletransporte de una región."
"help-find": "%lang:helpCommand|/as find|% Encontrar una región en venta o alquiler."
"help-groupadd": "%lang:helpCommand|/as groupadd|% Agregar una región a un grupo."
"help-groupdel": "%lang:helpCommand|/as groupdel|% Borrar una región de un grupo."
"help-grouplist": "%lang:helpCommand|/as grouplist|% Ver todos los grupos registrados."
"help-groupinfo": "%lang:helpCommand|/as groupinfo|% Mostrar información sobre un grupo."
"help-schemevent": "%lang:helpCommand|/as schemevent|% Ejecutar un evento de schematic para la región."
"help-add": "%lang:helpCommand|/as add|% Registrar una región como compra/alquiler."
"help-del": "%lang:helpCommand|/as del|% Borrar una región de AreaShop."
"help-addsign": "%lang:helpCommand|/as addsign|% Agregar un cartel a una región."
"help-delsign": "%lang:helpCommand|/as delsign|% Borrar el cartel que estás mirando."
"help-me": "%lang:helpCommand|/as me|% Ver las regiones que posees (+expiración)."
"help-setowner": "%lang:helpCommand|/as setowner|% Configurar el propietario de la región o extender su alquiler."
"help-resell": "%lang:helpCommand|/as resell|% Configurar una región en el modo reventa."
"help-stopResell": "%lang:helpCommand|/as stopresell|% Configurar una región como vendida."
"help-addFriend": "%lang:helpCommand|/as addfriend|% Agregar un amigo a la región."
"help-delFriend": "%lang:helpCommand|/as delfriend|% Borrar a un amigo de la región."
"help-linksigns": "%lang:helpCommand|/as linksigns|% Empezar el enlace de carteles - regiones."
"help-stack": "%lang:helpCommand|/as stack|% Crear regiones múltiples y agregarlas."
"help-setlandlord": "%lang:helpCommand|/as setlandlord|% Configurar el propietario de una región."
"help-import": "%lang:helpCommand|/as import|% Importar región desde RegionForSale."
"rent-help": "/as rent [region], la región en la que estás será usada si no se especifican nombres."
"rent-noPermission": "No tienes permiso para alquilar una región."
"rent-maximum": "No puedes alquilar más de %0% region(es) (ya tienes %1% en el grupo '%2%')."
"rent-maximumExtend": "No puedes extender el alquiler porque tienes más de %0% región(es) (ya tienes %1% en el grupo '%2%')."
"rent-payError": "Algo ha ido mal a la hora de pagar, inténtalo de nuevo más tarde."
"rent-rented": "Has alquilado la región %lang:region% hasta %until%, puedes extender el alquiler haciendo click derecho en el cartel o usando /as rent."
"rent-extended": "El alquiler de la región %lang:region% se ha extendido hasta %until%."
"rent-extendedToMax": "Has extendido el alquiler de %lang:region% hasta %until% (Tiempo de alquiler máximo de %maxrenttime%)."
"rent-lowMoneyExtend": "No tienes dinero suficiente para extender el alquiler (tienes %0% y necesitas %price%)."
"rent-lowMoneyRent": "No tienes dinero suficiente para alquilar la región %lang:region% (tienes %0% y necesitas %price%)."
"rent-someoneElse": "Otra persona ha alquilado antes la región %lang:region%."
"rent-notRentable": "Esta región no está disponible para alquilar."
"rent-maxExtends": "No puedes extender más el alquiler (el máximo de veces es %maxextends%), pero cuando acabe el alquiler podrás alquilar la región de nuevo."
"rent-maxRentTime": "No puedes alquilar la región %lang:region% más tiempo por adelantado, el tiempo máximo es de %maxrenttime% y ya la has alquilado por %timeleft%."
"rent-restrictedToWorld": "Necesitas estar en el mundo '%world%' para alquilar la región %lang:region% (estás en '%0%')."
"rent-restrictedToRegion": "Tienes que estar dentro de %lang:region% para alquilarla."
"rent-expireWarning": "Tu región %lang:region% está a punto de caducar (%timeleft% restantes), extiéndela si quieres seguir usándola."
"rent-expiringSoon": "Tu región %lang:tRegion|%0%|% está a punto de caducar (%1% restantes), extiéndela si quieres seguir usándola."
"rent-alreadyAtFull": "%lang:region% ha alcanzado su tiempo máximo de alquiler. Espera hasta que puedas alquilar más veces."
"buy-help": "/as buy [region], la región en la que estás será usada si no se especifican nombres."
"buy-noPermission": "No tienes permiso para comprar una región."
"buy-noPermissionResell": "No tienes permiso para comprar una región en modo reventa."
"buy-noPermissionNoResell": "No tienes permiso para comprar una región que no esté en modo reventa."
"buy-notBuyable": "La región %lang:region% no se puede comprar."
"buy-maximum": "No puedes comprar más de %0% región(es) (ya tienes %1% en el grupo '%2%')."
"buy-payError": "Algo ha ido mal a la hora de pagar, inténtalo de nuevo más tarde."
"buy-succes": "Has comprado la región %lang:region%."
"buy-successResale": "Has comprado la región %lang:region%, provinente de %lang:tPlayer|%0%|%."
"buy-successSeller": "Tu región %lang:region% se ha vendido a %lang:player% por %0%."
"buy-lowMoney": "No tienes dinero suficiente para comprar la región %lang:region% (tienes %0% y necesitas %price%)."
"buy-lowMoneyResell": "No tienes dinero suficiente para comprar la región %lang:region% (tienes %0% y necesitas %resellprice%)."
"buy-yours": "Ya eres propietario de la %lang:region%."
"buy-someoneElse": "Alguien más ha comprado la %lang:region%."
"buy-restrictedToWorld": "Necesitas estar en el mundo '%world%' para comprar la región %lang:region% (estas en '%0%')."
"buy-restrictedToRegion": "Tienes que estar dentro de %lang:region% para comprarla."
"unrent-help": "/as unrent [region], la región en la que estás será usada si no se especifican nombres."
"unrent-noPermission": "No tienes permiso para desalquilar una región."
"unrent-noPermissionOther": "No tienes permiso para desalquilar una región ajena."
"unrent-notRegistered": "La región no se puede desalquilar porque no está registrada en el modo Alquiler."
"unrent-notRented": "La región no se puede desalquilar porque no está alquilada."
"unrent-unrented": "%lang:region%, de %lang:player%, ha sido desalquilada."
"unrent-expired": "El alquiler de tu región %lang:region% ha expirado."
"sell-help": "/as sell [region], la región en la que estás será usada si no se especifican nombres."
"sell-notRegistered": "La región no se puede vender porque no está registrada para comprar."
"sell-notBought": "La región no se puede vender porque no tiene propietario."
"sell-sold": "La región %lang:region%, de %lang:player%, ha sido vendida."
"sell-noPermission": "No tienes permiso para vender regiones."
"sell-noPermissionOther": "No tienes permiso para vender regiones ajenas."
"sell-disabled": "La venta fue desactivada para esta región."
"reload-reloading": "Todos los archivos han sido recargados, comprobando alquileres y actualizando regiones..."
"reload-noPermission": "No tienes permiso para recargar los archivos de configuración."
"reload-updateCommandChanged": "Los comandos '/as updaterents' y '/as updatebuys' han sido borrados, '/as reload' actualizará las regiones. Puedes usar este comando en vez de los 2 primeros."
"info-help":
- "/as info[break]"
- " %lang:command|all|/as info all|%[break]"
- " %lang:command|rented|/as info rented|% [group] [page][break]"
- " %lang:command|forrent|/as info forrent|% [group] [page][break]"
- " %lang:command|sold|/as info sold|% [group] [page][break]"
- " %lang:command|forsale|/as info forsale|% [group] [page][break]"
- " %lang:command|reselling|/as info reselling|% [group] [page][break]"
- " %lang:command|nogroup|/as info nogroup [page]|%[break]"
- " %lang:command|region|/as info region|% [region]"
"info-noPermission": "No tienes permiso para ver información sobre las regiones."
"info-allHeader": "Todas las regiones%0%:"
"info-rentedHeader": "Regiones alquiladas%0%:"
"info-forrentHeader": "Regiones en alquiler%0%:"
"info-forsaleHeader": "Regiones en venta%0%:"
"info-soldHeader": "Regiones vendidas%0%:"
"info-resellingHeader": "Regiones de reventa%0%:"
"info-nogroupHeader": "Regiones sin grupo%0%:"
"info-limitedToGroup": " (limitado al grupo %0%)"
"info-nogroupNone": "No hay regiones sin grupo."
"info-noFiltergroup": "El grupo '%0%' no existe, y por lo tanto no puede ser usado para limitar los resultados."
"info-noRegions": "No se han encontrado regiones."
"info-wrongPage": "%0% no es un número de página correcto."
"info-entryForrent": "[darkgreen][bold]►[reset] %lang:region%: [gray]En alquiler por %price% durante %duration%."
"info-entryRented": "[darkgreen][bold]►[reset] %lang:region%: [gray]Alquilada a %lang:player%."
"info-entryForsale": "[darkgreen][bold]►[reset] %lang:region%: [gray]En venta por %price%."
"info-entrySold": "[darkgreen][bold]►[reset] %lang:region%: [gray]Vendida a %lang:player%."
"info-entryReselling": "[darkgreen][bold]►[reset] %lang:region%: [gray]Vendida a %lang:player% (reventa)."
"info-pageStatus": "[gold]Pagina %0%/%1%"
"info-pagePrevious":
- " [gold][bold]◄Anterior[/bold] "
- " hover: %lang:action|Mostrar la página anterior|%"
- " command: %0%"
"info-pageNoPrevious":
- " [darkgray][bold]◄Anterior[/bold] "
- " hover: Esta es la primera página"
"info-pageNext":
- " [gold][bold]Siguiente►[/bold]"
- " hover: %lang:action|Mostrar la página siguiente|%"
- " command: %0%"
"info-pageNoNext":
- " [darkgray][bold]Next►[/bold]"
- " hover: Esta es la última pagina"
"info-playerHelp": "/as info player <nombre>."
"info-playerRents": "Regiones alquiladas por %lang:tPlayer|%0%|%: [gray]%1%"
"info-playerNoRents": "%lang:tPlayer|%0%|% no ha alquilado una región."
"info-playerBuys": "Regiones compradas por %lang:tPlayer|%0%|%: [gray]%1%."
"info-playerNoBuys": "%lang:tPlayer|%0%|% no ha comprado una región."
"info-regionHelp": "/as info region [name], la región donde estás será utilizada si no se especifican nombres."
"info-regionHeaderRent": "[darkgreen]Información sobre %lang:region%:"
"info-regionHeaderBuy": "[darkgreen]Información sobre %lang:region%:"
"info-regionRented": "[darkgreen][bold]►[reset] Alquilada por %lang:player% hasta: [gray]%until%."
"info-regionBought": "[darkgreen][bold]►[reset] Comprada por %lang:player%."
"info-regionReselling": "[darkgreen][bold]►[reset] Comprada por %lang:player%, actualvente en reventa."
"info-regionExtending":
- "[darkgreen][bold]►[reset] "
- "[bold]Extender por[/bold]"
- " hover: Extender el alquiler de %region%"
- " hover: con %duration% por %price%"
- " hover: %lang:action|Extender el alquiler de %region%|%"
- " command: /areashop rent %region%"
- ": [gray]%price% por %duration%."
"info-regionCanBeRented":
- "[darkgreen][bold]►[reset] "
- "[bold]Alquilar por[/bold]"
- " hover: Alquilar %region% por %price% durante %duration%"
- " hover: %lang:action|Alquilar %region%|%"
- " command: /areashop rent %region%"
- ": [gray]%price% por %duration%."
"info-regionCanBeBought":
- "[darkgreen][bold]►[reset] "
- "[bold]Comprar por[/bold]"
- " hover: Comprar %region% por %price%"
- " hover: %lang:action|Comprar %region%|%"
- " command: /areashop buy %region%"
- ": [gray]%price%."
"info-regionReselPrice": "[darkgreen][bold]►[reset] Precio de reventa: [gray]%resellprice% (puedes comprarla de %lang:player%)."
"info-regionFriends": "[darkgreen][bold]►[reset] Jugadores agregados: [gray]%0%."
"info-friend": "%lang:tPlayer|%0%|%"
"info-friendRemove":
- "%lang:info-friend|%0%|%"
- "[red]✕[gray]"
- " hover: Region %region%"
- " hover: %lang:action|Borrar a %0% como amigo|%"
- " command: /areashop delfriend %0% %region%"
"info-regionMoneyBackBuy": "[darkgreen][bold]►[reset] Paga de venta: [gray]%moneyback% (%moneybackpercent%% del precio)."
"info-regionMoneyBackBuyClick":
- "[darkgreen][bold]►[reset] "
- "[bold]Paga de venta[/bold]"
- " hover: Vender %region% y recuperar %moneyback%"
- " hover: %lang:action|Vender %region%|%"
- " command: /areashop sell %region%"
- ": [gray]%moneyback% (%moneybackpercent%% del precio)."
"info-regionMoneyBackRent": "[darkgreen][bold]►[reset] Paga por desalquilar: [gray]%moneyback% (%moneybackpercent%% del tiempo restante)."
"info-regionMoneyBackRentClick":
- "[darkgreen][bold]►[reset] "
- "[bold]Paga por desalquilar[/bold]"
- " hover: Desalquilar %region% y recuperar %moneyback%"
- " hover: %lang:action|Desalquilar %region%|%"
- " command: /areashop unrent %region%"
- ": [gray]%moneyback% (%moneybackpercent%% del tiempo restante)."
"info-regionMaxExtends": "[darkgreen][bold]►[reset] Numero de extensiones máximas: [gray]%maxextends% veces."
"info-regionNoExtending": "[darkgreen][bold]►[reset] No se puede extender el alquiler."
"info-regionExtendsLeft": "[darkgreen][bold]►[reset] Extensiones restantes: [gray]%extendsleft% veces de %maxextends%."
"info-regionMaxRentTime": "[darkgreen][bold]►[reset] Alquiler por adelantado: [gray]%maxrenttime% como máximo."
"info-prefix": "[darkgreen][bold]►[reset] "
"info-regionTeleport":
- "[bold]Ir a la region[/bold]"
- " hover: %lang:action|Teletransportarse a %region%|%"
- " command: /areashop tp %region%"
"info-setRegionTeleport":
- "[bold]Configurar un punto de teletransporte[/bold]"
- " hover: %region%"
- " hover: %lang:action|Configurar un punto de teletransporte|%"
- " command: /areashop settp %region%"
"info-regionSigns": "[darkgreen][bold]►[reset] Carteles conectados: [gray]%0%."
"info-regionSignLocation": "[gray](%0%, %1%, %2%, %3%)[reset]"
"info-regionGroups": "[darkgreen][bold]►[reset] Grupos asignados: [gray]%0%."
"info-regionInactiveUnrent": "[darkgreen][bold]►[reset] Desalquiler automático después de: [gray]%inactivetime% de inactividad por parte del jugador."
"info-regionInactiveSell": "[darkgreen][bold]►[reset] Venta automática después de: [gray]%inactivetime% de inactividad por parte del jugador."
"info-regionRestrictedRegionRent": "[darkgreen][bold]►[reset] Tienes que estar dentro de la %lang:region% para alquilarla."
"info-regionRestrictedWorldRent": "[darkgreen][bold]►[reset] Tienes que estar en el mundo '%world%' para alquilar la %lang:region%."
"info-regionRestrictedRegionBuy": "[darkgreen][bold]►[reset] Tienes que estar dentro de la %lang:region% para comprarla."
"info-regionRestrictedWorldBuy": "[darkgreen][bold]►[reset] Tienes que estar en el mundo '%world%' para comprar %lang:region%."
"info-regionRestoringRent": "[darkgreen][bold]►[reset] Restauración Activada [gray](la región se vaciará al desalquilarla)."
"info-regionRestoringBuy": "[darkgreen][bold]►[reset] Restauración Alquilada [gray](la región se vaciará al venderla)."
"info-regionLandlord": "[darkgreen][bold]►[reset] Propietario de la región: [gray]%lang:landlord% (recibe el dinero)."
"info-regionNotExisting": "La región especificada no está registrada: %0%."
"setrestore-help": "/as setrestore <región> <true|false|general> [perfil]."
"setrestore-noPermission": "No tienes permiso para cambiar la configuración de restauración."
"setrestore-notRegistered": "La región especificada no está registrada: %0%."
"setrestore-invalidSetting": "'%0%' no es un estado válido. Debe ser true, false o general."
"setrestore-success": "Se ha configurado la opción de restauración de %lang:region% a '%0%'."
"setrestore-successProfile": "Se ha configurado la opción de restauración de %lang:region% a '%0%' y el perfil a '%1%'."
"setprice-noPermission": "No tienes permiso para cambiar el precio de una región."
"setprice-help": "/as setprice <precio> [región], la región en la que estás será utilizada si no se especifican nombres."
"setprice-notRegistered": "La región especificada no está registrada: %0%."
"setprice-wrongPrice": "'%0%' no es un precio válido."
"setprice-successRent": "El precio de la región %lang:region% se ha cambiado a %price% por %duration%."
"setprice-successBuy": "El precio de la región %lang:region% se ha cambiado a %price%."
"setprice-successRemoved": "El precio de la región %lang:region% ha sido borrado, ahora se utilizará el precio por defecto. Nuevo Precio: %price%."
"setprice-noLandlord": "No puedes cambiar el precio de la región %lang:region% porque no eres su propietario."
"setduration-noPermission": "No tienes permiso para editar la duración de un alquiler."
"setduration-help": "/as setduration <cantidad> <identificador> [región], la región en la que estás será utilizada si no se especifican nombres."
"setduration-notRegistered": "%0% no está registrada para alquilar."
"setduration-wrongAmount": "'%0%' no es una cantidad válida, especifica un número entero."
"setduration-wrongFormat": "'%0%' no es un formato de tiempo válido, comprueba la documentación en Bukkit."
"setduration-success": "La duración de la región %lang:region% se ha cambiado a '%duration%'."
"setduration-noLandlord": "No tienes permiso para cambiar la duración porque no eres propietario de la región %lang:region%."
"setduration-successRemoved": "La duración de la %lang:region% ha sido borrada, ahora se utilizará la duración por defecto. Nueva Duración: %duration%."
"setup-noRegion": "No has especificado una región en la segunda línea."
"setup-alreadyRentSign": "La región que has especificado ya está registrada en AreaShop como región de Alquiler, agrega los carteles con [as] en la primera línea o usa '/as addsign'."
"setup-alreadyBuySign": "La región que has especificado ya está registrada en AreaShop como región de Compra, agrega los carteles con [as] en la primera línea o usa '/as addsign'."
"setup-noDuration": "No has especificado cuánto tiempo puede ser alquilada la región, haz esto en la tercera línea."
"setup-wrongDuration": "El tiempo especificado no está en el formato correcto, ejemplo: 1 día."
"setup-noPrice": "No has especificado el precio en la cuarta línea."
"setup-wrongPrice": "No has especificado el precio correctamente, hazlo usando números solamente."
"setup-rentSuccess": "El alquiler de la región %lang:region% se ha configurado correctamente."
"setup-buySuccess": "La venta de la región %lang:region% se ha configurado correctamente."
"setup-noPermissionRent": "No tienes permiso para crear regiones de alquiler."
"setup-noPermissionBuy": "No tienes permiso para crear regiones de venta."
"setup-couldNotDetect": "Se han encontrado regiones con la misma prioridad o con relación principal/secundaria, especifica una en la segunda línea (2 de las regiones que se han encontrado: %lang:tRegion|%0%|% and %lang:tRegion|%1%|%)."
"setup-blacklisted": "%0% está en la lista negra y no puede usarse en AreaShop."
"setup-noPermission": "No puedes agregar la región '%0%', no eres un propietario/miembro o no tienes permiso para esto."
"destroy-noPermissionRent": "No tienes permiso para eliminar el registro de una región de Alquiler."
"destroy-noPermissionBuy": "No tienes permiso para eliminar el registro de una región de Compra."
"destroy-successRent": "La region %lang:region% ha sido eliminada como región de Alquiler."
"destroy-successBuy": "La region %lang:region% ha sido eliminada como región de Compra."
"teleport-help": "/as tp <region> [cartel]."
"teleport-noRentOrBuy": "La región especificada no está registrada: %0%."
"teleport-noPermission": "No tienes permiso para teletransportarte a tu región."
"teleport-noPermissionOther": "No tienes permiso para teletransportarte a regiones que no te pertenecen."
"teleport-noPermissionSign": "No tienes permiso para teletransportarte al cartel de tu región."
"teleport-noPermissionOtherSign": "No tienes permiso para teletransportarte al cartel de regiones que no te pertenecen."
"teleport-noPermissionFriend": "No tienes permiso para teletransportarte a regiones a las que estas agregado como amigo."
"teleport-noPermissionFriendSign": "No tienes permiso para teletransportarte a los carteles de las regiones a las que estas agregado como amigo."
"teleport-noPermissionAvailable": "No tienes permiso para teletransportarte a las regiones disponibles."
"teleport-noPermissionAvailableSign": "No tienes permiso para teletransportarte a los carteles de las regiones disponibles."
"teleport-success": "Te has teletransportado a %lang:region%."
"teleport-successSign": "Te has teletransportado al cartel de %lang:region%."
"teleport-noSafe": "No se han encontrado posiciones seguras en %lang:region%, no quedan puntos en la región o se han excedido los intentos (%0%/%1%)."
"teleport-blocked": "No puedes teletransportarte porque la posición del teletransporte esta dentro de la región, y no tienes permiso para entrar en ella."
"teleport-changedToSign": "Tienes permiso para teletransportarte al cartel, pero no a la region. Teletransportando al cartel..."
"teleport-changedToNoSign": "No hay cartel al que puedas teletransportarte. Intentando teletransportarse dentro..."
"teleport-wrongWorld": "Necesitas estar en el mundo '%world%' para aparecer en %lang:region%, porque estas en el mundo '%0%'."
"setteleport-help": "/as settp [region] [reset], la región en la que estás será utilizada si no se especifican nombres."
"setteleport-noPermission": "No tienes permiso para configurar el punto de teletransporte."
"setteleport-noPermissionOther": "No tienes permiso para configurar el punto de teletransporte de regiones que no te pertenecen."
"setteleport-noRentOrBuy": "La region %0% no está registrada."
"setteleport-success": "El punto de teletransporte de %lang:region% ha sido configurado."
"setteleport-notInside": "La localización tiene que estar dentro de la region."
"setteleport-reset": "El punto de teletransporte de %lang:region% ha sido reseteado."
"find-help": "/as find <buy|rent> [preciomaximo] [grupo]."
"find-noPermission": "No tienes permiso para buscar regiones o teletransportarte a ellas."
"find-success": "Encontrada una región de %0%: %lang:region%, mientras se buscaba un precio máximo basado en tu balance: %1%%2%."
"find-successMax": "Encontrada una región de %0%: %lang:region%, mientras se buscaba un precio máximo de %1%%2%."
"find-wrongMaxPrice": "El precio máximo especificado no es un nímero válido: %0%."
"find-wrongGroup": "El grupo %0% no existe."
"find-noneFound": "No se han encontrado regiones de %0% mientras se buscaba un precio máximo basado en tu balance: %1%%2%."
"find-noneFoundMax": "No se han encontrado regiones de %0% mientras se buscaba un precio máximo de %1%%2%."
"find-onlyInGroup": ", solo se han buscado regiones en el grupo: %0%."
"groupadd-help": "/as groupadd <group> [region], si no se especifican regiones todas las regiones del WorldEdit serán usadas."
"groupadd-noPermission": "No tienes permiso para agregar regiones a grupos."
"groupadd-success": "La región %lang:region% ha sido agregada al grupo '%0%', este grupo ahora tiene %1% miembro(s)."
"groupadd-failed": "La región %lang:region% ya forma parte del grupo '%0%'."
"groupadd-weSuccess": "Agregada al grupo %0%: [gray]%1%."
"groupadd-weFailed": "Regiones que ya estaban en el grupo %0%: [gray]%1%."
"groupdel-help": "/as groupdel <group> [region], si no se especifican regiones todas las regiones del WorldEdit seran usadas"
"groupdel-noPermission": "No tienes permiso para eliminar regiones de los grupos."
"groupdel-wrongGroup": "No se ha encontrado el grupo %0%, comprueba los grupos registrado usando '/as grouplist'."
"groupdel-success": "La región %lang:region% ha sido borrada del grupo '%0%', este grupo ahora tiene %1% miembro(s)."
"groupdel-failed": "La región %lang:region% no forma parte del grupo '%0%'."
"groupdel-weSuccess": "Borradas del grupo %0%: [gray]%1%."
"groupdel-weFailed": "No estaban en el grupo %0: [gray]%1%."
"grouplist-noPermission": "No tienes permiso para mostrar los grupos registrados."
"grouplist-noGroups": "No hya grupos registrados ahora mismo."
"grouplist-success": "Grupos que están registrados: [gray]%0%."
"groupinfo-help": "/as groupinfo <grupo>."
"groupinfo-noPermission": "No tienes permiso para ver la información de los grupos."
"groupinfo-noGroup": "No hay ningún grup grupo llamado '%0%', usa /as grouplist para ver todos los grupos."
"groupinfo-members": "Las siguientes regiones forman parte del grupo %0%: [gray]%1%."
"groupinfo-noMembers": "El grupo %0% no tiene miembros."
"schemevent-help": "/as schemevent <región> <created|deleted|rented|unrented|bought|sold>."
"schemevent-wrongEvent": "El evento '%0%' no existe, usa uno de los siguientes: [gray]%1%."
"schemevent-success": "El evento '%0%' ha sido provocado para la región %lang:region%."
"schemevent-noPermission": "No tienes permiso para provocar eventos de schematic."
"add-help": "/as add <rent|buy> [región] [mundo]."
"add-noPermission": "No tienes permiso para agregar una región a AreaShop."
"add-success": "Agregado como %0%: [gray]%1%."
"add-failed": "Ya registrado: [gray]%0%."
"add-blacklisted": "En la lista negra: [gray]%0%."
"add-specifyWorld": "Especifica el mundo de la región (Consola)."
"add-incorrectWorld": "El mundo '%0%' no existe, inténtalo de nuevo (distingue entre mayúsculas y minúsculas)."
"add-noPermissionRegions": "No tienes permiso para agregar: [gray]%0%."
"add-noPermissionOwnerMember": "[gray]No eres miembro/propietario de estas regiones o no tienes permiso para agregar tus regiones."
"del-noPermission": "No tienes permiso para borrar regiones."
"del-success": "Regiones Borradas: [gray]%0%."
"del-failed": "No tienes permiso para borrarlas o no están registradas: [gray]%0%."
"addsign-help": "/as addsign [región] [perfil]."
"addsign-noSign": "No estás mirando el cartel."
"addsign-noRegions": "No se han encontrado regiones alrededor del cartel."
"addSign-notRegistered": "La región especificada no está registrada en AreaShop: %0% (primero ha de agregarse a AreaShop antes de que se pueda agregar un cartel)."
"addsign-couldNotDetect": "Se han encontrado muchas regiones alrededor del cartel (2 de las regiones que se han encontrado: %lang:tRegion|%0%|% and %lang:tRegion|%1%|%)."
"addsign-couldNotDetectSign": "Se han encontrado muchas regiones alrededor del cartel, especifica la región en la segunda línea (2 de las regiones que se han encontrado: %lang:tRegion|%0%|% and %lang:tRegion|%1%|%)."
"addsign-wrongProfile": "El perfil especificado no existe, usa uno de los siguientes (comprueba la config): [gray]%0%."
"addsign-profile":
- "[bold]%0%[/bold]"
- " hover: Signprofile %0%"
- " hover: %lang:action|Usar este perfil|%"
- " command: /areashop linksigns %0%"
"addsign-success": "El cartel ha sido agregado a %lang:region%."
"addsign-successProfile": "El cartel ha sido agregado a %lang:region% con el perfil %0%."
"addsign-alreadyRegistered": "Este cartel ya está registrado para la región %lang:region%."
"addsign-noPermission": "No tienes permiso para agregar un cartel."
"delsign-noSign": "No estás mirando al cartel."
"delsign-noPermission": "No tienes permiso para borrar carteles."
"delsign-noRegion": "Este cartel no tiene que ver con ninguna región de AreaShop."
"delsign-success": "El cartel se ha desvinculado de la región %lang:region%."
"me-noPermission": "No tienes permiso para ver tus regiones."
"me-header": "Regiones de %lang:tPlayer|%0%|%:"
"me-notAPlayer": "No eres un jugador, y no puedes tener regiones."
"me-rentLine":
- "[darkgreen][bold]►[reset] %lang:region% [gray]("
- "%timeleft% restante"
- " hover: hasta %until%"
- ")."
"me-buyLine": "[darkgreen][bold]►[reset] %lang:region%."
"me-friendLine":
- "[darkgreen][bold]►[reset] %lang:region% [gray]("
- "de %lang:player%"
- " hover: Estás agregado como amigo"
- ")."
"me-nothing": "%lang:tPlayer|%0%|% no ha comprado/alquilado regiones y no está agregado como amigo a ninguna."
"me-noPlayer": "%0% no existe. Comprueba si ha entrado al servidor."
"me-clickHint": "[gray][italic]Haz click en un nombre de región para ver los detalles."
"setowner-help": "/as setowner <jugador> [región], la región en la que estás se usará si no se especifican nombres."
"setowner-noPermission": "No tienes permiso para cambiar el propietario de una región."
"setowner-noPermissionRent": "No tienes permiso para cambiar el propietario de una región de alquiler."
"setowner-noPermissionBuy": "No tienes permiso para cambiar el propietario de una región de compra."
"setowner-notRegistered": "No se puede cambiar el propietario de la región porque la región no existe."
"setowner-noPlayer": "No se pudo encontrar la UUID del jugador: %0%."
"setowner-succesRent": "El propietario de %lang:region% ahora es %lang:player%, y su región está alquilada hasta %until% (%timeleft% restante)."
"setowner-succesRentExtend": "El propietario de la región ya era %lang:player%, su alquiler se ha extendido '%duration%', y ahora caducará: %until% (%timeleft% restante)."
"setowner-succesBuy": "El propietario de la región %lang:region% ahora es %lang:player%."
"resell-help": "/as resell <precio> [región], la región en la que estás se usará si no se especifican nombres."
"resell-wrongPrice": "'%0%' no es un precio válido."
"resell-notRegistered": "La región especificada no es válida: %0%."
"resell-notBought": "No puedes revender %lang:region% porque no está vendida todavía."
"resell-success": "%lang:region% está en modo reventa por %resellprice%."
"resell-noPermission": "No tienes permiso para cambiar tu región a modo reventa."
"resell-noPermissionOther": "No tienes permiso para cambiar las regiones a modo reventa."
"resell-disabled": "La reventa fue deshabilitada para esta región."
"stopresell-help": "/as stopresell [región], la región en la que estás se usará si no se especifican nombres."
"stopresell-notRegistered": "La región especificada no es válida: %0%."
"stopresell-notResell": "No puedes parar la reventa de %lang:region% porque no está en modo reventa."
"stopresell-success": "%lang:region% ahora está vendida."
"stopresell-noPermission": "No tienes permiso para cambiar tu región al modo vendido."
"stopresell-noPermissionOther": "No tienes permiso para cambiar las regiones al modo vendido."
"addfriend-help": "/as addfriend <jugador> [región], la región en la que estás se usará si no se especifican nombres."
"addfriend-noPermissionOther": "No tienes permiso para agregar amigos en regiones que no te pertenecen."
"addfriend-noPermission": "No tienes permiso para agregar amigos a tu región."
"addfriend-successOther": "%lang:tPlayer|%0%|% ha sido agregado como amigo en la región %lang:region%."
"addfriend-success": "%lang:tPlayer|%0%|% ha sido agregado como amigo en tu región %lang:region%."
"addfriend-alreadyAdded": "%lang:tPlayer|%0%|% ya está agregado como amigo en la región %lang:region%."
"addfriend-self": "Es inútil agregar al propietario de la región como amigo."
"addfriend-noOwner": "No puedes agregar amigos a regiones sin propietario."
"addfriend-notVisited": "No puedes agregar a %0% a la región porque nunca ha visitado el servidor."
"delfriend-help": "/as delfriend <jugador> [región], la región en la que estás se usará si no se especifican nombres."
"delfriend-noPermissionOther": "No tienes permiso para borrar amigos en regiones que no te pertenecen."
"delfriend-noPermission": "No tienes permiso para borrar amigos en tu región."
"delfriend-successOther": "%lang:tPlayer|%0%|% ha sido borrado como amigo en la región %lang:region%."
"delfriend-success": "%lang:tPlayer|%0%|% ha sido borrado como amigo en tu región %lang:region%."
"delfriend-notAdded": "%lang:tPlayer|%0%|% no está agregado como amigo en %lang:region%."
"delfriend-noOwner": "No puedes borrar amigos de regiones sin propietario."
"linksigns-multipleRegions": "Se han encontrado muchas regiones: [gray]%0%."
"linksigns-multipleRegionsAdvice": "Haz lick otra vez para intentarlo de nuevo o usa '/as linksigns' para parar."
"linksigns-noRegions": "No se han encontrado regiones en esa dirección, comprueba que están añadidas a AreaShop [gray](rango máximo 100 bloques)."
"linksigns-regionFound": "Se ha encontrado la región %lang:region%, ahora haz lick izquierdo en un cartel para linkearlo."
"linksigns-signFound": "Se ha encontrado un cartel en (%0%, %1%, %2%), ahora haz click derecho en una región para seleccionarla."
"linksigns-noSign": "No se ha encontrado ningún cartel, inténtalo de nuevo [gray](rango máximo 100 bloques)."
"linksigns-alreadyRegistered": "Este cartel ya está linkeado a la región %lang:region%, haz click otra vez para seleccionar otro cartel."
"linksigns-first": "Has entrado en el modo de linkeo de carteles."
"linksigns-next": "[gray]Click izquierdo para seleccionar un cartel, click derecho para seleccionar una región, /as linksigns para parar."
"linksigns-noPermission": "No tienes permiso para entrar en el modo de linkeo de carteles."
"linksigns-stopped": "Has salido del modo de linkeo de carteles."
"stack-help":
- "/as stack <cantidad> <espacio> <ombre> <rent|buy> [grupo].[break]"
- " [gray]<cantidad> Número de regiones que serán creadas.[break]"
- " [gray]<espacio> Bloques de distancia entre regiones.[break]"
- " [gray]<nombre> Nombre de las regiones (el número estará detrás).[break]"
- " [gray]<rent|buy> Hacer las regiones de compra o alquiler.[break]"
- " [gray][grupo] Un grupo para agregar las regiones.[break]"
- " [gray]Las regiones serán creadas en la dirección en que estás mirando."
"stack-accepted": "Empezando a crear %0% %1% regiones con %2% bloques en medio, los nombres empiezan con %3% y tienen un número detrás.%4%"
"stack-addToGroup": "Las regiones creadas serán añadidas al grupo '%0%'."
"stack-noPermission": "No tienes permiso para crear y agregar regiones."
"stack-wrongAmount": "'%0%' no es un número correcto de regiones."
"stack-wrongGap": "'%0%' no es un número correcto para el espacio entre las regiones."
"stack-noSelection": "No tienes una selección que indique donde se creará la primera región."
"stack-addStart": "[gray]Agregando %0% regiones a %1% por segundo."
"stack-addComplete": "[gray]Agregadas %0% regiones%1%."
"stack-tooHigh": ", %0% regiones saltadas porque estaban por encima de Y=256"
"stack-tooLow": ", %0% regiones saltadas porque estaban por debajo de Y=0"
"stack-unclearDirection": "Mira hacia todas las direcciones, se han detectado: %0%."
"setlandlord-help": "/as setlandlord <jugador> [región], la región en la que estás se usará si no se especifican nombres."
"setlandlord-noPermission": "No tienes permiso para configurar el propietario de una región."
"setlandlord-success": "%lang:landlord% se ha hecho propietario de la región %lang:region%."
"message-help": "/as message <jugador> <mnsaje...>"
"message-noPermission": "No tienes permiso para enviar mensajes de AreaShop."
"message-notOnline": "%0% no está conectado."
"import-help": "/as import RegionForSale"
"import-wrongSource": "Especifica de donde quieres importar los datos, opciones: 'RegionForSale'"
"import-noPluginFolder": "No se pudo encontrar la carpeta %0%, ¿Seguro que lo está importando del lugar correcto?"
"import-noWorldsFolder": "No hay una carpeta 'plugins/RegionForSale/worlds', por lo tanto no se ha importado nada."
"import-confirm": "Estás seguro/a de que quieres importar todas las regiones desde RegionForSale?"
"import-start": "Empezando importanción de datos de RegionForSale:"
"import-doWorld": "[darkgreen][bold]► Mundo %0%:"
"import-noBukkitWorld": "[red]no se pudo encontrar el mundo en Bukkit"
"import-noRegionManager": "[red]No se encontró RegionManager de WorldGuard, Asegurese de que las regiones están activadas en este mundo."
"import-noRegions": "[red]No se encontró regions.yml"
"import-loadRegionsFailed": "[red]No se pudo cargar regions.yml en: %0%"
"import-invalidRegionSection": "[red]Sección invalida en regions.yml: %0%"
"import-noWorldGuardRegion": "[red]Región de WorldGuard no encontrada: %0%"
"import-noWorldGuardRegionParent": "[red]Región de WorldGuard para la región padre no encontrada: %0%."
"import-buyAndRent": "[gold]%0% puede ser comprada o vendida, solo añadiendo como compra en AreaShop (No puede ser ambos)."
"import-noBuyAndNoRent": "[red]%0% no puede ser comprada o alquilada, omitiendo importe."
"import-imported": "[green]%lang:tRegion|%0%|% importado."
"import-loadWorldConfigFailed": "[red]Carga de config.yml especifica del mundo fallida: %0%"
"import-improperParentRegion": "[red]La region padre %0% no tiene configuraciones legibles."
"import-alreadyAdded": "[red]La región '%0%' ya ha sido añadida"
"import-alreadyAddedOtherWorld": "[red]La región '%0%' ya ha sido añadida al mundo %1%, regiones en diferentes mundos no pueden tener el mismo nombre en AreaShop"
"import-invalidSignLocation": "[red]Fallo al importar un cartel de la región '%0%', ubicación invalida '%1%"
"import-signAlreadyAdded": "[red]Omitido cartel en la ubicación '%1%' a la región '%0%', ya que ya ha sido añadida a la región '%2%"
"import-moneyBackFailed": "[red]Fallo al analizar el precio de compra '%0%' y venta '%1%' para establecer en porcentaje de dinero devuelto"
"confirm-rent":
- "%lang:prefix%Quieres alquilar la %lang:tRegion|%0%|%?[break]"
- "[darkgreen][bold]►[reset] %lang:button|Haz click para alquilarla %0%|%"
- " hover: %lang:action|Alquilar %0%|%"
- " command: /areashop rent %0%"
"confirm-extend":
- "%lang:prefix%Quieres extender el alquiler de la %lang:tRegion|%0%|%?[break]"
- "[darkgreen][bold]►[reset] %lang:button|Click para extender %0%|%"
- " hover: %lang:action|Extender %0%|%"
- " command: /areashop rent %0%"
"confirm-unrent":
- "%lang:prefix%Quieres dejar de alquilar la %lang:tRegion|%0%|%?[break]"
- "[darkgreen][bold]►[reset] %lang:button|Click para dejar de alquilar %0%|%"
- " hover: %lang:action|Dejar de alquilar %0%|%"
- " command: /areashop unrent %0%"
"confirm-buy":
- "%lang:prefix%Quieres comprar la %lang:tRegion|%0%|%?[break]"
- "[darkgreen][bold]►[reset] %lang:button|Click para comprar %0%|%"
- " hover: %lang:action|Comprar %0%|%"
- " command: /areashop buy %0%"
"confirm-sell":
- "%lang:prefix%Quieres vender la %lang:tRegion|%0%|%?[break]"
- "[darkgreen][bold]►[reset] %lang:button|Click to sell %0%|%"
- " hover: %lang:action|Sell %0%|%"
- " command: /areashop sell %0%"
"timeleft-years": "%0% años"
"timeleft-months": "%0% meses"
"timeleft-days": "%0% días"
"timeleft-hours": "%0% horas"
"timeleft-minutes": "%0% minutos"
"timeleft-second": "%0% segundo"
"timeleft-seconds": "%0% segundos"
"timeleft-ended": "Expirado"
"greeting-forrent": "%region% puede ser alquilada por %price% cada %duration%."
"greeting-rented": "%region% está alquilada por %player% hasta %until%."
"greeting-forsale": "%region% puede ser comprada por %price%."
"greeting-bought": "%region% está comprada por %player%."
"greeting-resale": "%region% puede ser comprada por %resaleprice% al jugador %player%."
"update-playerNotify": "[darkgreen]Hay una actualización disponible para AreaShop (V%0% - %1%). Consigue la más reciente en https://github.com/NLthijs48/AreaShop/releases."
-564
View File
@@ -1,564 +0,0 @@
# ╔═════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════
# ║ Language file of the AreaShop plugin created by NLThijs48, Github can be found at https://github.com/NLthijs48/AreaShop
# ║ French language file, plugin version 2.5.0, 428/428 messages are translated (100%)
# ║
# ║ 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`
# ║ 3: Change the `language` setting in config.yml to `servername`, do not include `.yml`
# ║ 4: Change the messages in the new file to your liking
# ║ 5: Use `/as reload`or reload/restart your server to see the changes
# ╚═════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════
"action": "[gold][bold]<%0%>[/bold]"
"button": "[bold]<%0%>[/bold]"
"command":
- "[bold]%0%[/bold]"
- " hover: %lang:action|Utilisez %1%|%"
- " command: %1%"
"helpCommand":
- "[gold]%0% [gray]-[reset]"
- " hover: %lang:action|Utilisez %0%|%"
- " command: %0%"
"region": "%lang:tRegion|%region%|%"
"tRegion":
- "[bold]%0%[/bold]"
- " hover: Région %0%"
- " hover: %lang:action|Information sur la région|%"
- " command: /areashop info region %0%"
"player": "%lang:tPlayer|%player%|%"
"tPlayer":
- "[bold]%0%[/bold]"
- " hover: Joueur %0%"
- " hover: %lang:action|Régions de %0%|%"
- " command: /areashop info player %0%"
"landlord":
- "[bold]%landlord%[/bold]"
- " hover: Bailleur %landlord%"
- " hover: %lang:action|Région de %landlord%|%"
- " command: /areashop info player %landlord%"
"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%')."
"confirm-yes": " [gray]Clique ici %lang:command|Confirm%0% |%[gray], ou refait la commande."
"general-notReady": "AreaShop n'est pas totalement chargé, merci d'attendre."
"general-noWorld": "Vous ne pouvez pas faire ceci, le monde de %lang:region% n'est en ce moment pas disponible (monde '%world%')."
"general-noRegion": "Vous ne pouvez pas faire ceci, la région WorldGuard n'est pour le moment pas disponible (région %lang:region%)."
"general-noEconomy": "Il n'y a pas de plugin d'économie sur votre serveur, ou celui-ci n'est pas correctement installé. Merci de prévenir l'administrateur du serveur."
"general-cancelled": "%0%"
"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": "La région '%0%' n'est pas disponible dans AreaShop."
"cmd-noRegion": "'%0%' n'est pas une région WorldGuard valide."
"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 possible uniquement pour les joueurs, spécifiez la région comme un argument."
"help-header": "Page d'aide, commandes que vous pouvez exécuter."
"help-noPermission": "Vous n'avez pas la permission de voir la page d'aide."
"help-alias": "Alias des commandes : /areashop, /as"
"help-help": "%lang:helpCommand|/as help|% Affiche cette page d'aide."
"help-info": "%lang:helpCommand|/as info|% Obtenir les informations sur les régions actuelles."
"help-rent": "%lang:helpCommand|/as rent|% Louer une région, ou prolonger la location actuelle."
"help-buy": "%lang:helpCommand|/as buy|% Acheter une région."
"help-unrent": "%lang:helpCommand|/as unrent|% Ne plus louer une région."
"help-sell": "%lang:helpCommand|/as sell|% Vendre une région."
"help-reload": "%lang:helpCommand|/as reload|% Recharge tous les fichiers et met à jour les régions."
"help-setrestore": "%lang:helpCommand|/as setrestore|% Active/Désactive la restauration et choix du profil."
"help-setprice": "%lang:helpCommand|/as setprice|% Changer le prix d'une région."
"help-setduration": "%lang:helpCommand|/as setduration|% Changer le temps de location d'une région."
"help-teleport": "%lang:helpCommand|/as tp|% Se téléporter à une région vendue/louée."
"help-setteleport": "%lang:helpCommand|/as settp|% Définir le point de téléportation d'une région."
"help-find": "%lang:helpCommand|/as find|% Trouver une région à vendre/louer vide."
"help-groupadd": "%lang:helpCommand|/as groupadd|% Ajouter une région à un groupe."
"help-groupdel": "%lang:helpCommand|/as groupdel|% Supprimer une région d'un groupe."
"help-grouplist": "%lang:helpCommand|/as grouplist|% Afficher tout les groupes."
"help-groupinfo": "%lang:helpCommand|/as groupinfo|% Afficher des informations sur un groupe."
"help-schemevent": "%lang:helpCommand|/as schemevent|% Déclenche un événement schématique d'une région."
"help-add": "%lang:helpCommand|/as add|% Enregistrer une région à la vente ou à la location."
"help-del": "%lang:helpCommand|/as del|% Supprimer une région enregistrée dans AreaShop."
"help-addsign": "%lang:helpCommand|/as addsign|% Ajouter un panneau à une région existante."
"help-delsign": "%lang:helpCommand|/as delsign|% Supprimer le panneau que vous regardez."
"help-me": "%lang:helpCommand|/as me|% Voir les régions que vous possédez (et le temps restant)."
"help-setowner": "%lang:helpCommand|/as setowner|% Change le propriétaire d'une région ou prolonge le temps de location."
"help-resell": "%lang:helpCommand|/as resell|% Mettre une région en revente."
"help-stopResell": "%lang:helpCommand|/as stopresell|% Ne plus revendre votre région."
"help-addFriend": "%lang:helpCommand|/as addfriend|% Ajouter un ami à votre région."
"help-delFriend": "%lang:helpCommand|/as delfriend|% Supprimer un ami de votre région."
"help-linksigns": "%lang:helpCommand|/as linksigns|% Utilisez le mode de liaison de panneau."
"help-stack": "%lang:helpCommand|/as stack|% Créez plusieurs régions et ajoutez les."
"help-setlandlord": "%lang:helpCommand|/as setlandlord|% Définir le bailleur d'une région"
"help-import": "%lang:helpCommand|/as import|% Importe les régions des régions à vendre."
"rent-help": "/as rent [region], 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-maximumExtend": "Vous ne pouvez pas prolonger cette location car vous avez plus de %0% région(s) (Vous avez 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 louez %lang:region% jusqu'à %until%, vous pouvez étendre la location en faisant un clic droit sur le panneau ou avec la commande /as rent."
"rent-extended": "Vous avez prolongé votre location de %lang:region% jusqu'au %until%."
"rent-extendedToMax": "Vous avez allongé votre location de %lang:region% jusqu'au %until% (qui est la durée maximum de location de %maxrenttime%)."
"rent-lowMoneyExtend": "Vous n'avez pas assez d'argent pour prolonger votre location (Vous avez %0% et vous avez besoin de %price%)."
"rent-lowMoneyRent": "Vous n'avez pas assez d'argent pour louer %lang:region% (Vous avez %0% et vous avez besoin de %price%)."
"rent-someoneElse": "Quelqu'un d'autre loue déjà %lang:region%."
"rent-notRentable": "La région '%0%' n'est pas disponible à la location (région en vente ou non enregistrée) ."
"rent-maxExtends": "Vous ne pouvez plus prolonger cette location (le maximum est de %maxextends% fois), mais après que la prochaine location soit terminé, vous pourrez louer %lang:region% à nouveau."
"rent-maxRentTime": "Vous ne pouvez pas louer %lang:region% plus longtemps à l'avance, le maximum est de %maxrenttime% et vous avez déjà loué pour %timeleft%."
"rent-restrictedToWorld": "Vous devez être dans le monde '%world%' pour louer %lang:region% (vous êtes dans '%0%')."
"rent-restrictedToRegion": "Vous devez être à l'intérieur de %lang:region% pour pouvoir la louer."
"rent-expireWarning": "Votre région %lang:region% n'a plus que %timeleft% de temps de restant de location, soyez sûr d'allonger ce temps de location si vous voulez la conserver."
"rent-expiringSoon": "Votre région %lang:tRegion|%0%|% n'a plus que %1% de temps de restant de location, soyez sûr d'allonger ce temps de location si vous voulez la conserver."
"rent-alreadyAtFull": "%lang:region% a déjà atteint ou a dépassé le temps maximum de location, vous ne pouvez pas encore l'étendre la location."
"buy-help": "/as buy [région], 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-noPermissionResell": "Vous n'avez pas la permission d'acheter une région dans le mode revente."
"buy-noPermissionNoResell": "Vous n'avez pas la permission d'acheter une région qui n'est pas dans le mode revente."
"buy-notBuyable": "La région '%0%' n'est pas disponible à l'achat (région en location ou non enregistrée)."
"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é la région %lang:region%."
"buy-successResale": "Vous avez racheté la région %lang:region% qui appartenait à %lang:tPlayer|%0%|%."
"buy-successSeller": "Votre région %lang:region% a été vendue à %lang:player% pour %0%."
"buy-lowMoney": "Vous n'avez pas assez d'argent pour acheter %lang:region% (vous possédez %0% et devez payer %price%)."
"buy-lowMoneyResell": "Vous n'avez pas assez d'argent pour acheter %lang:region% (vous possédez %0% et vous avez besoin de %resellprice%)."
"buy-yours": "Vous avez déjà acheté %lang:region%."
"buy-someoneElse": "Quelqu'un a déjà acheté %lang:region%."
"buy-restrictedToWorld": "Vous devez être dans le monde '%world%' pour acheter %lang:region% (vous êtes dans '%0%')."
"buy-restrictedToRegion": "Vous devez être dans %lang:region% pour pouvoir l'acheter."
"unrent-help": "/as unrent [région], Si non spécifiée, cible la région dans laquelle vous vous trouvez."
"unrent-noPermission": "Vous n'avez pas la permission de cesser la location d'une région."
"unrent-noPermissionOther": "Vous n'avez pas la permission de cesser la location d'une autre région."
"unrent-notRegistered": "Vous ne pouvez pas cesser la location sur cette région car elle n'est pas enregistrer comme location."
"unrent-notRented": "Vous ne pouvez pas cesser la location sur cette région car elle n'est pas louée."
"unrent-unrented": "Vous avez rompu la location de %lang:region% de %lang:player%."
"unrent-expired": "Votre location de %lang:region% a expirée."
"sell-help": "/as sell [region], 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 à vendre."
"sell-notBought": "La région ne peut pas être vendue car elle n'est la propriété de personne."
"sell-sold": " %lang:player% a vendu la région %lang:region%"
"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."
"sell-disabled": "La vente a été désactivé dans cette région."
"reload-reloading": "Fichiers de configurations et des régions rechargés."
"reload-noPermission": "Vous n'avez pas la permission de recharger les fichiers."
"reload-updateCommandChanged": "'/as updaterents' et '/as updatebuys' ont été supprimées, '/as reload' est la commande à utiliser pour mettre à jour les régions."
"info-help":
- "/as info[break]"
- " %lang:command|all|/as info all|%[break]"
- " %lang:command|rented|/as info rented|% [group] [page][break]"
- " %lang:command|forrent|/as info forrent|% [group] [page][break]"
- " %lang:command|sold|/as info sold|% [group] [page][break]"
- " %lang:command|forsale|/as info forsale|% [group] [page][break]"
- " %lang:command|reselling|/as info reselling|% [group] [page][break]"
- " %lang:command|nogroup|/as info nogroup [page]|%[break]"
- " %lang:command|region|/as info region|% [region]"
"info-noPermission": "Vous n'avez pas la permission d'avoir des informations à propos des régions."
"info-allHeader": "Toutes les régions%0%:"
"info-rentedHeader": "Les régions louées%0%:"
"info-forrentHeader": "Les régions à louer%0%:"
"info-forsaleHeader": "Les régions à vendre%0%:"
"info-soldHeader": "Les régions vendues%0%:"
"info-resellingHeader": "Les régions en revente%0%:"
"info-nogroupHeader": "Les régions sans groupe%0%:"
"info-limitedToGroup": " (limité au groupe %0%)"
"info-nogroupNone": "Il n'y a pas de région sans groupe."
"info-noFiltergroup": "Le groupe '%0%' n'existe pas ou ne peut donc pas être utilisé pour limiter les résultats."
"info-noRegions": "Aucune région trouvée."
"info-wrongPage": "%0% n'est pas un numéro de page correct."
"info-entryForrent": "[darkgreen][bold]►[reset] %lang:region%: [gray]A louer pour %price% par %duration%."
"info-entryRented": "[darkgreen][bold]►[reset] %lang:region%: [gray]Loué à %lang:player%."
"info-entryForsale": "[darkgreen][bold]►[reset] %lang:region%: [gray]A vendre pour %price%."
"info-entrySold": "[darkgreen][bold]►[reset] %lang:region%: [gray]Vendu à %lang:player%."
"info-entryReselling": "[darkgreen][bold]►[reset] %lang:region%: [gray]Vendu à %lang:player% (revente)."
"info-pageStatus": "[gold]Page %0%/%1%"
"info-pagePrevious":
- "[gold][bold]◄Précédent[/bold] "
- "hover: %lang:action|Montrer la page précédente |%"
- "command: /areashop %0%"
"info-pageNoPrevious":
- " [darkgray][bold]◄Précédent[/bold] "
- " hover: C'est déjà la premier page"
"info-pageNext":
- "[gold][bold]Suivant►[/bold]"
- "hover: %lang:action|Page suivante|%"
- "commande: /areashop "
"info-pageNoNext":
- " [darkgray][bold]Suivaznt►[/bold]"
- " hover: C'est déjà la dernière page"
"info-playerHelp": "/as info player <name>"
"info-playerRents": "Régions louée par %lang:tPlayer|%0%|%: [gray]%1%"
"info-playerNoRents": "%lang:tPlayer|%0%|% n'a de régions louées."
"info-playerBuys": "Régions achetées par %lang:tPlayer|%0%|%: [gray]%1%"
"info-playerNoBuys": "%lang:tPlayer|%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": "[darkgreen]Informations à propos de %lang:region%:"
"info-regionHeaderBuy": "[darkgreen]Informations à propos de %lang:region%:"
"info-regionRented": "[darkgreen][bold]►[reset] Louée par %lang:player% jusqu'à: [gray]%until%."
"info-regionBought": "[darkgreen][bold]►[reset] Achetée par %lang:player%."
"info-regionReselling": "[darkgreen][bold]►[reset] Achetée par %lang:player%, actuellement en revente."
"info-regionExtending":
- "[darkgreen][bold]►[reset] "
- "[bold]Etendre pour[/bold]"
- " hover: Etendre votre location de %region%"
- " hover: pour %duration% coutant %price%"
- " hover: %lang:action|Etendre votre location de %region%|%"
- " command: /areashop rent %region%"
- ": [gray]%price% pour %duration%."
"info-regionCanBeRented":
- "[darkgreen][bold]►[reset] "
- "[bold]Louer pour[/bold]"
- " hover: Louer %region% pour %price% pour %duration%"
- " hover: %lang:action|Rent %region%|%"
- " command: /areashop rent %region%"
- ": [gray]%price% pour %duration%."
"info-regionCanBeBought":
- "[darkgreen][bold]►[reset] "
- "[bold]Prix d'achat[/bold]"
- " hover: Acheter%region% pour %price%"
- " hover: %lang:action|Acheter %region%|%"
- " command: /areashop buy %region%"
- ": [gray]%price%."
"info-regionReselPrice": "[darkgreen][bold]►[reset] Prix de revente : [gray]%resellprice% (vous pouvez l'acheter à %player%)."
"info-regionFriends": "[darkgreen][bold]►[reset] Ami(s) ajouté(s) : [gray]%0%."
"info-friend": "%lang:tPlayer|%0%|%"
"info-friendRemove":
- "%lang:info-friend|%0%|%"
- "[red]✕[gray]"
- " hover: Région %region%"
- " hover: %lang:action|retirer %0% comme ami|%"
- " command: /areashop delfriend %0% %region%"
"info-regionMoneyBackBuy": "[darkgreen][bold]►[reset] Prix de revente : [gray]%moneyback% (%moneybackpercent%% du prix)"
"info-regionMoneyBackBuyClick":
- "[darkgreen][bold]►[reset] "
- "[bold]Retour sur investissement de la vente[/bold]"
- " hover: Vendez %region% et recupérer %moneyback% de retour sur investissement"
- " hover: %lang:action|Vendre %region%|%"
- " command: /areashop sell %region%"
- ": [gray]%moneyback% (%moneybackpercent%% du prix)."
"info-regionMoneyBackRent": "[darkgreen][bold]►[reset] Remboursement de location : [gray]%moneyback% (%moneybackpercent%% du temps restant)"
"info-regionMoneyBackRentClick":
- "[darkgreen][bold]►[reset] "
- "[bold]Prorata du loyer remboursé[/bold]"
- " hover: Cesser la location %region% et récupérer %moneyback%"
- " hover: %lang:action|Cesser la location%region%|%"
- " command: /areashop unrent %region%"
- ": [gray]%moneyback% (%moneybackpercent%% du temps restant)."
"info-regionMaxExtends": "[darkgreen][bold]►[reset] Nombre maximum de région : [gray]%maxextends% fois."
"info-regionNoExtending": "[darkgreen][bold]►[reset] La location ne peut être allongée."
"info-regionExtendsLeft": "[darkgreen][bold]►[reset] Extensions restantes : [gray]%extendsleft% fois sur %maxextends%."
"info-regionMaxRentTime": "[darkgreen][bold]►[reset] Location à l'avance : [gray]%maxrenttime% au maximum"
"info-prefix": "[darkgreen][bold]►[reset] "
"info-regionTeleport":
- "[bold]Aller à la région[/bold]"
- " hover: %lang:action|Se téleporter à %region%|%"
- " command: /areashop tp %region%"
"info-setRegionTeleport":
- "[bold]Définir la position de téléportation[/bold]"
- " hover: %region%"
- " hover: %lang:action|Définir la position de téléportation|%"
- " command: /areashop settp %region%"
"info-regionSigns": "[darkgreen][bold]►[reset] Pancartes connectées: [gray]%0%."
"info-regionSignLocation": "[gray](%0%, %1%, %2%, %3%)[reset]"
"info-regionGroups": "[darkgreen][bold]►[reset] Assigné aux groupes: [gray]%0%."
"info-regionInactiveUnrent": "[darkgreen][bold]►[reset] Fin de le location automatique après : [gray]%inactivetime% de temps d'inactivité du joueur"
"info-regionInactiveSell": "[darkgreen][bold]►[reset] Revente automatique après : [gray]%inactivetime% de temps d'inactivité du joueur"
"info-regionRestrictedRegionRent": "[darkgreen][bold]►[reset] Vous devez être à l'intérieur de %lang:region% pour la louer."
"info-regionRestrictedWorldRent": "[darkgreen][bold]►[reset] Vous devez à l'intérieur du monde '%world%' pour louer %lang:region%."
"info-regionRestrictedRegionBuy": "[darkgreen][bold]►[reset] Vous devez être à l'intérieur de %lang:region% pour l'acheter."
"info-regionRestrictedWorldBuy": "[darkgreen][bold]►[reset] Vous devez à l'intérieur du monde '%world%' pour acheter %lang:region%."
"info-regionRestoringRent": "[darkgreen][bold]►[reset] La restauration est activée [gray](la région sera remise à zéro a la fin de la location)%0%"
"info-regionRestoringBuy": "[darkgreen][bold]►[reset] La restauration est activée [gray](la région sera remise à zéro à la vente)%0%"
"info-regionLandlord": "[darkgreen][bold]►[reset] Bailleur : [gray]%lang:landlord% (reçoit l'argent)."
"info-regionNotExisting": "La région spécifiée n'est pas enregistrée : %0%."
"setrestore-help": "/as setrestore <region> <true|false|general> [profile]"
"setrestore-noPermission": "Vous n'avez pas la permission de restaurer les paramètres."
"setrestore-notRegistered": "La région spécifiée n'est pas enregistrée : %0%."
"setrestore-invalidSetting": "'%0%' est invalide. Doit être true, false ou general."
"setrestore-success": "Paramètre de restauration défini de %lang:region% à '%0%' avec succès."
"setrestore-successProfile": "Paramètre de restauration défini de %lang:region% à %0% et le profil à '%1%' 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": "La région spécifiée n'est pas enregistrée : %0%."
"setprice-wrongPrice": "'%0%' n'est pas un prix valide."
"setprice-successRent": "Le prix de la région %lang:region% à changé pour %price% par %duration%."
"setprice-successBuy": "Le prix de la région %lang:region% a changé pour %price%"
"setprice-successRemoved": "Le prix de la %lang:region% a été supprimé, maintenant celle-ci utilisera le prix du group ou du fichier default.yml, nouveau prix: %price%."
"setprice-noLandlord": "Vous n'avez pas la permission de changer le prix car vous n'êtes pas le bailleur de la région %lang:region%."
"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 dans les régions à 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": "Durée de location de la région %lang:region% changé à %duration%."
"setduration-noLandlord": "Vous n'avez pas la permission de changer la durée car vous n'êtes pas le bailleur de la région %lang:region%."
"setduration-successRemoved": "La durée de location de %lang:region% a été supprimé, maintenant celle-ci utilisera le durée de location du group ou du fichier default.yml, nouvelle durée de location : %duration%."
"setup-noRegion": "Vous n'avez pas spécifié de région à la seconde ligne."
"setup-alreadyRentSign": "La région que vous avez spécifiée a déjà été ajoutée à AreaShop en tant qu'une région louable, ajoutez un panneau avec [as] sur le première ligne ou tapez '/as addsign'."
"setup-alreadyOtherWorld": "La région que vous avez spécifiée est déjà ajoutée à AreaShop dans un autre monde. Les régions de différents mondes ont toujours besoin de noms différents."
"setup-alreadyBuySign": "La région que vous avez spécifiée a déjà été ajoutée à AreaShop en tant qu'une région achetable, ajoutez un panneau avec [as] sur le première ligne ou tapez '/as addsign'."
"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": "Le prix spécifié n'est pas correct, n'utilisez que des chiffres s'il vous plaît."
"setup-rentSuccess": "La location de la région %lang:region% est correctement configurée."
"setup-buySuccess": "La vente de la région %lang:region% est correctement configurée."
"setup-noPermissionRent": "Vous n'avez pas la permission de définir des région louables."
"setup-noPermissionBuy": "Vous n'avez pas la permission de définir des régions achetables."
"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: %lang:tRegion|%0%|% et %lang:tRegion|%1%|%)."
"setup-blacklisted": "%0% est sur la blacklist et ne peut pas être ajouté à AreaShop."
"setup-noPermission": "Vous ne pouvez pas ajouter la région '%0%', vous n'êtes pas un propriétaire / membre ou n'avez pas permission pour celle-ci."
"destroy-noPermissionRent": "Vous n'avez pas la permission de dés-enregistrer des régions louables. "
"destroy-noPermissionBuy": "Vous n'avez pas la permission de dés-enregistrer des régions achetables."
"destroy-successRent": "%lang:region% a bien été dés-enregistrée des régions louables."
"destroy-successBuy": "%lang:region% a bien été dés-enregistrée des régions achetables."
"teleport-help": "/as tp <region> [sign]"
"teleport-noRentOrBuy": "La région spécifiée n'est pas enregistrée : %0%."
"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 vers les régions sur lesquelles vous êtes ajoutés en tant qu'ami."
"teleport-noPermissionFriendSign": "Vous n'avez pas la permission de vous téléporter vers le panneau des régions sur lesquelles vous êtes ajoutés en tant qu'ami."
"teleport-noPermissionAvailable": "Vous n'avez pas la permission de vous téléporter vers les régions disponibles."
"teleport-noPermissionAvailableSign": "Vous n'avez pas la permission de vous téléporter vers les panneaux des régions disponibles."
"teleport-success": "Vous avez été téléporté vers %lang:region%"
"teleport-successSign": "Vous avez été téléporté vers le panneau de %lang:region%"
"teleport-noSafe": "Aucune position sécurisée trouvée dans la région '%lang:region%'. Pas de point restant, ou tentatives maximales dépassées (%0%/%1%)."
"teleport-blocked": "Vous ne pouvez pas vous téléporter car la position est en dehors de la région, et vous êtes obligés de vous téléporter à l'intérieur."
"teleport-changedToSign": "Vous n'avez seulement la permission de vous téléporter à la pancarte et non dans la région, téléportation vers la pancarte."
"teleport-changedToNoSign": "Aucune pancarte disponible pour être téléporter. Essayer de vous téléporter dans la région."
"teleport-wrongWorld": "Vous avez besoin d'être dans le monde '%world%' pour vous téléporter à la région %lang:region%. Vous êtes dans le monde '%0%'."
"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 spécifiée n'est pas enregistrée : %0%."
"setteleport-success": "Le point de téléportation de %lang:region% a été défini."
"setteleport-notInside": "Le lieu doit se trouver dans votre région."
"setteleport-reset": "Le point de téléportation de %lang:region% 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": "Une région %0% trouvée : %lang:region%, en recherchant avec un prix maximum de: %1%%2%."
"find-successMax": "%0% region trouvé : %lang:region%, tout en recherchant avec un prix maximum de %1%%2%."
"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-success": "La région %lang:region% a été ajoutée au groupe '%0%'. Ce groupe a maintenant %1% membre(s)."
"groupadd-failed": "La région %lang:region% est déjà membre du groupe '%0%'."
"groupadd-weSuccess": "Ajouté au groupe %0% : [gray]%1%."
"groupadd-weFailed": "Nous étions déjà dans le groupe %0% : [gray]%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-wrongGroup": "Le groupe %0% n’existe pas, faire '/as grouplist' pour afficher les groupes enregistrés."
"groupdel-success": "La région %lang:region% a été supprimée du groupe '%0%', ce groupe a maintenant %1% membre(s)."
"groupdel-failed": "La région %lang:region% n'est pas membre du groupe '%0%'."
"groupdel-weSuccess": "Supprimée du groupe %0% : [gray]%1%."
"groupdel-weFailed": "Nous ne sommes de toute façon pas dans le groupe %0% : [gray]%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: [gray]%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% : [gray]%1%."
"groupinfo-noMembers": "Le groupe %0% ne possède aucun membre."
"schemevent-help": "/as schemevent <region> <created|deleted|rented|unrented|bought|sold>"
"schemevent-wrongEvent": "L'évent spécifié '%0%' n'existe pas, utilisez un des suivants: [gray]%1%."
"schemevent-success": "L’événement '%0%' a été activé dans la région %lang:region%."
"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ée comme %0% : [gray]%1%."
"add-failed": "Déjà enregistré: [gray]%0%."
"add-failedOtherWorld": "Déjà inscrit d'un autre monde: [gray]%0%."
"add-blacklisted": "Dans la liste noir: [gray]%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-noPermissionRegions": "Pas de permission à ajouter: [gray]%0%."
"add-noPermissionOwnerMember": "[gray]Soit vous n'êtes pas membre / propriétaire de cette région ou n'avez pas la permission d'ajouter vos régions."
"del-noPermission": "Vous n'avez pas la permission de supprimer des régions."
"del-success": "Régions supprimées: [gray]%0%."
"del-failed": "Vous n'avez pas la permission, ou vous n’être pas enregistré: [gray]%0%."
"addsign-help": "/as addsign [region] [profile]"
"addsign-noSign": "Vous ne regardez pas de panneau."
"addsign-noRegions": "Aucune région trouvée autour du panneau."
"addSign-notRegistered": "La région spécifiée n'est pas enregistrée dans AreaShop: %0% (elle doit d'abord être ajoutée à AreaShop avant qu'un signe puisse être ajouté)."
"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: %lang:tRegion|%0%|% et %lang:tRegion|%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: %lang:tRegion|%0%|% et %lang:tRegion|%1%|%)."
"addsign-wrongProfile": "Le profil spécifié n'existe pas, utilisez l'un de la liste suivante (Vérifiez la config): [gray]%0%."
"addsign-profile":
- "[bold]%0%[/bold]"
- " hover: Connexion profil %0%"
- " hover: %lang:action|Utiliser ce profil|%"
- " command: /areashop linksigns %0%"
"addsign-success": "Le panneau a été ajouté à %lang:region%."
"addsign-successProfile": "Le panneau a été ajouté à %lang:region%. avec le profile %0%."
"addsign-alreadyRegistered": "Ce panneau est déjà enregistré pour la région %lang:region%."
"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": "Le panneau à été retiré de la région %lang:region%."
"me-noPermission": "Vous n'avez pas la permission de voir quelle(s) région(s) vous possédez."
"me-header": "Régions de %lang:tPlayer|%0%|%:"
"me-notAPlayer": "Vous n'êtes pas un joueur. Vous ne pouvez donc pas avoir de régions."
"me-rentLine":
- "[darkgreen][bold]►[reset] %lang:region% [gray]("
- "%timeleft% restant"
- "⇥hover: depuis %until%"
- ")."
"me-buyLine": "[darkgreen][bold]►[reset] %lang:region%."
"me-friendLine":
- "[darkgreen][bold]►[reset] %lang:region% [gray]("
- "propriétaire: %lang:player%"
- "⇥hover: Vous avez ajouté comme ami"
- ")."
"me-nothing": "%lang:tPlayer|%0%|% n'a pas loué ou acheté de régions et n'a pas été ajouté comme ami dans l'un entre eux."
"me-noPlayer": "%0% n'a pas été trouvé, il ne s'est peut être jamais connecté sur le serveur."
"me-clickHint": "[gray][italic]Cliquez sur le nom d'une région pour voir les détails."
"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 %lang:region% modifié avec succès. Elle appartient maintenant à %lang:player% et est louée jusqu'au %until% (%timeleft% restant)."
"setowner-succesRentExtend": "Le propriétaire était déjà %lang:player%, location prolongée de '%duration%', maintenant louée jusqu'au %until% (%timeleft% restant%)."
"setowner-succesBuy": "Propriétaire de la région %lang:region% changé avec succès. Elle appartient maintenant à %lang: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": "La région spécifiée n'est pas enregistrée : %0%."
"resell-notBought": "Vous ne pouvez pas revendre %lang:region% car elle n'est pas achetée pour le moment."
"resell-success": "%lang: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."
"resell-disabled": "La revente a été désactivée pour cette région."
"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": "La région spécifiée n'est pas enregistrée : %0%."
"stopresell-notResell": "Vous ne pouvez pas stopper la revente %lang:region% car elle n'est pas en mode revente."
"stopresell-success": "%lang: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": "%lang:tPlayer|%0%|% a été ajouté comme ami sur la région %lang:region%."
"addfriend-success": "%lang:tPlayer|%0%|% a été ajouté comme ami sur votre région %lang:region%."
"addfriend-alreadyAdded": "%lang:tPlayer|%0%|% est déjà ajouté comme ami avec %lang:region%."
"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."
"addfriend-notVisited": "Vous ne pouvez pas ajouter %0% car il n'est jamais venu sur le serveur."
"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": "%lang:tPlayer|%0%|% a été supprimé comme ami de la région %lang:region%."
"delfriend-success": "%lang:tPlayer|%0%|% a été supprimé comme ami de votre région %lang:region%."
"delfriend-notAdded": "%lang:tPlayer|%0%|% n'est pas dans les amis de %lang:region%."
"delfriend-noOwner": "Vous ne pouvez pas supprimer les amis d'une région sans propriétaire."
"linksigns-multipleRegions": "Plusieurs régions trouvées : [gray]%0%."
"linksigns-multipleRegionsAdvice": "Cliquez plus tard pour réessayer ou utilisez '/as linksigns' pour arrêter."
"linksigns-noRegions": "Aucune région AreaShop trouvée dans la direction de votre curseur, soyez sûr que la région est bien ajoutée à AreaShop [gray](portée maximale de 100 blocs)."
"linksigns-regionFound": "La région %lang:region% a été trouvée, maintenant montrer un panneau et faites un clic gauche sur celui-ci."
"linksigns-signFound": "Un panneau a été trouvé à (%0%, %1%, %2%), maintenant montrez une région et faites un clic droit pour la lier."
"linksigns-noSign": "Aucune panneau trouvé dans la direction de votre curseur, soyez sûr que vous regardez directement la panneau et re-cliquez[gray](portée maximale de 100 blocs)."
"linksigns-alreadyRegistered": "Ce panneau est déjà enregistré avec la région %lang:region%, cliquez encore pour sélectionner un autre panneau."
"linksigns-first": "Vous êtes entré dans le mode de liaison d'un panneau."
"linksigns-next": "[gray]Faites un clic gauche pour sélectionner un panneau, un clic droit pour sélectionner une région et utilisez /as linksigns pour arrêter le mode."
"linksigns-noPermission": "Vous n'avez pas la permission de rentrer dans le mode de liaison d'un panneau."
"linksigns-stopped": "Vous êtes sorti du mode de liaison d'un panneau."
"stack-help":
- "/as stack <montant> <écart> <nom> <rent|buy> [groupe].[break]"
- "⇥[gray<montant> Nombre de régions qui sera créé.[break]"
- "⇥[gray]<écart> Distance en blocs entre les régions.[break]"
- "⇥[gray]<nom> Nom des régions (un nombre sera ajouté à la fin[break]"
- "⇥[gray]<rent|buy> Définir comme location (rent) ou achat (but).[break]"
- "⇥[gray][groupe] Un groupe pour ajouter les régions créées..[break]"
- "⇥[gray]Les régions seront créés dans la direction que vous faites face."
"stack-accepted": "Commence à créer %0% %1% régions avec %2% blocs entre chacune, dont les noms commencent avec %3% et ont un chiffre derrière. %4%"
"stack-addToGroup": "Les régions créées ont été ajoutées au groupe '%0%'."
"stack-noPermission": "Vous n'avez pas la permission de créer et d'ajouter des régions à AreaShop en vrac."
"stack-wrongAmount": "'%0%' n'est pas une quantité correcte de régions."
"stack-wrongGap": "'%0%' n'est pas un nombre correct pour le nombre de blocs séparant deux régions."
"stack-noSelection": "Vous n'avez pas de sélection qui indique où doit se trouver la première région créée."
"stack-addStart": "[gray]Ajout de %0% régions, %1% par seconde."
"stack-addComplete": "[gray]Ajout de la région %0% %1%."
"stack-tooHigh": ", %0% regions annulées car ils sont au dessus de Y=256"
"stack-tooLow": ", %0% regions annulées car ils sont au dessous de Y=0"
"stack-unclearDirection": "Merci de regarder clairement le Nord, l'Est, le Sud, l'Ouest, le haut ou le bas, actuellement détectée %0%."
"setlandlord-help": "/as setlandlord <joueur> [région], la région où vous êtes sera utilisé si non spécifié."
"setlandlord-noPermission": "Vous n'avez pas la permission de définir le bailleur d'une région."
"setlandlord-success": "%lang:landlord% a bien été défini comme bailleur de %lang:region%.."
"message-help": "/as message <joueur> <message...>"
"message-noPermission": "Vous n'avez pas la permission d'envoyer des messages AreaShop."
"message-notOnline": "%0% n'est pas connecté."
"import-help": "/as import RegionAVendre"
"import-wrongSource": "Spécifiez d'où vous voulez importer les données, les options: RegionAVendre"
"import-noPluginFolder": "Impossible de trouver le dossier %0%, êtes-vous sûr que vous importez de la bonne source?"
"import-noWorldsFolder": "Il n'y a pas de dossier 'plugins/RegionForSale/worlds' donc rien ne peut être importé."
"import-confirm": "Êtes-vous sûr de vouloir importer toutes les régions de RegionAVendre?"
"import-start": "Début de l'importation des données RegionAVendre :"
"import-doWorld": "[darkgreen][bold]► Monde %0% :"
"import-noBukkitWorld": "[red]Impossible de trouver le monde dans Bukkit."
"import-noRegionManager": "[red]Impossible d’obtenir RegionManager de WorldGuard, les régions sont-elles activées dans ce monde?"
"import-noRegions": "[red]Pas de fichier regions.yml trouvé."
"import-loadRegionsFailed": "[red]Impossible de charger regions.yml de : %0%"
"import-invalidRegionSection": "[red]Mauvaise section dans regions.yml : %0%."
"import-noWorldGuardRegion": "[red]La région de WorldGuard n'a pas été trouvée :%0%."
"import-noWorldGuardRegionParent": "[red]La région de WorldGuard pour la région parent n'a pas été trouvé : %0%"
"import-buyAndRent": "[gold] %0% peuvent être achetés et loués, seulement en ajoutant comme achat dans AreaShop (ne peuvent pas être les deux)."
"import-noBuyAndNoRent": "[red]%0% ne peut pas être acheté ni être loué sans importer."
"import-imported": "[green]%lang:tRegion|%0% importé."
"import-loadWorldConfigFailed": "[red} Chargement de world-specific config.yml échoué : %0%."
"import-improperParentRegion": "[red]Region parent %0% n'a pas de réglages lisible."
"import-alreadyAdded": "[red]Region '%0%' a déjà été ajoutée."
"import-alreadyAddedOtherWorld": "[red]Region '%0%' a déjà été ajoutée dans le monde %1%, les régions de différents mondes ne peuvent pas avoir le même nom dans AreaShop."
"import-invalidSignLocation": "[red]Echec d'importation de la pancarte de la région '%0%', location invalide '%1%'."
"import-signAlreadyAdded": "[red] Ignoré l'ajout de la pancarte à la location '%1%' de la région '%0%', il est déjà ajouté à la région '%2%'."
"import-moneyBackFailed": "[red] Échec de l'analyse du prix d'achat '%0%' et du prix de vente '%1%' pour définir le pourcentage de remboursement."
"confirm-rent":
- "%lang:prefix%Êtes-vous sur de vouloir louer %lang:tRegion|%0%|%?[break]"
- "[darkgreen][bold]►[reset] %lang:button|Cliquez ici pour louer %0%|%"
- " hover: %lang:action|Louer%0%|%"
- " command: /areashop rent %0%"
"confirm-extend":
- "%lang:prefix%Êtes-vous sur de vouloir prolonger la location %lang:tRegion|%0%|%?[break]"
- "[darkgreen][bold]►[reset] %lang:button|Cliquez ici pour prolonger la location%0%|%"
- " hover: %lang:action|Prolonger la location%0%|%"
- " command: /areashop rent %0%"
"confirm-unrent":
- "%lang:prefix%Êtes-vous sur de vouloir arrêter la location %lang:tRegion|%0%|%?[break]"
- "[darkgreen][bold]►[reset] %lang:button|Cliquez ici pour arrêter la location%0%|%"
- " hover: %lang:action|Arrêter la location%0%|%"
- " command: /areashop unrent %0%"
"confirm-buy":
- "%lang:prefix%Êtes-vous sur de vouloir acheter %lang:tRegion|%0%|%?[break]"
- "[darkgreen][bold]►[reset] %lang:button|Cliquez ici pour acheter %0%|%"
- " hover: %lang:action|Acheter%0%|%"
- " command: /areashop buy%0%"
"confirm-sell":
- "%lang:prefix%Êtes-vous sur de vouloir vendre %lang:tRegion|%0%|%?[break]"
- "[darkgreen][bold]►[reset] %lang:button|Cliquez ici pour vendre %0%|%"
- " hover: %lang:action|Vendre%0%|%"
- " command: /areashop sell %0%"
"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ée"
"greeting-forrent": "%region% peut être louée pour %price% pour une durée de %duration%."
"greeting-rented": "%region% est louée par %player% jusqu'au %until%."
"greeting-forsale": "%region% peut être achetée pour %price%."
"greeting-bought": "%region% est la propriété de %player%."
"greeting-resale": "%region% peut être acheté pour %resellprice%. Offre par %player%."
"update-playerNotify":
- "[darkgreen]Mise à jours de AreaShop V%0% à AreaShop V%1% disponible, récupérez la nouvelle version sur "
- "[bold]Spigot[/bold]"
- " hover: %lang:action|Aller à la page Spigot de AreaShop|%"
- " link: https://www.spigotmc.org/resources/areashop.2991/"
- "(et laissez un avis)."
-564
View File
@@ -1,564 +0,0 @@
# ╔═════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════
# ║ Language file of the AreaShop plugin created by NLThijs48, Github can be found at https://github.com/NLthijs48/AreaShop
# ║ Dutch language file, plugin version 2.5.0, 428/428 messages are translated (100%)
# ║
# ║ 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`
# ║ 3: Change the `language` setting in config.yml to `servername`, do not include `.yml`
# ║ 4: Change the messages in the new file to your liking
# ║ 5: Use `/as reload`or reload/restart your server to see the changes
# ╚═════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════
"action": "[gold][bold]<%0%>[/bold]"
"button": "[bold]<%0%>[/bold]"
"command":
- "[bold]%0%[/bold]"
- " hover: %lang:action|Gebruik %1%|%"
- " command: %1%"
"helpCommand":
- "[gold]%0% [gray]-[reset]"
- " hover: %lang:action|Gebruik %0%|%"
- " command: %0%"
"region": "%lang:tRegion|%region%|%"
"tRegion":
- "[bold]%0%[/bold]"
- " hover: Gebied %0%"
- " hover: %lang:action|Gebied informatie|%"
- " command: /areashop info region %0%"
"player": "%lang:tPlayer|%player%|%"
"tPlayer":
- "[bold]%0%[/bold]"
- " hover: Speler %0%"
- " hover: %lang:action|Gebieden van %0%|%"
- " command: /areashop info player %0%"
"landlord":
- "[bold]%landlord%[/bold]"
- " hover: Landeigenaar %landlord%"
- " hover: %lang:action|Gebieden van %landlord%|%"
- " command: /areashop info player %landlord%"
"total-maximum": "Je kunt niet meer dan %0% gebied(en) kopen en huren in totaal (je hebt er al %1% in groep '%2%')."
"confirm-yes": " [gray]Klik om te %lang:command|bevestigen|%0%|%[gray], of herhaal het commando."
"general-notReady": "AreaShop is nog niet volledig geladen, even geduld."
"general-noWorld": "Je kunt deze actie niet uitvoeren, de wereld van %lang:region% is niet beschikbaar (wereld '%0%')."
"general-noRegion": "Je kunt deze actie niet uitvoeren, het WorldGuard gebied is niet beschikbaar (gebied %lang:region%)."
"general-noEconomy": "Er is geen Economy plugin geïnstalleerd of deze is incorrect opgezet, stel de server eigenaar hiervan op de hoogte."
"general-cancelled": "%0%"
"cmd-notValid": "Dat commando is niet geldig , gebruik '/as help' voor informatie."
"cmd-onlyByPlayer": "Dit commando kan alleen door een speler uitgevoert worden."
"cmd-weOnlyByPlayer": "Gebruikmaken van een WorldEdit selectie is alleen mogelijk als speler, geef de naam van het gebied mee als extra argument."
"cmd-noSelection": "Je hebt geen WorldEdit selectie."
"cmd-noRegionsFound": "Er zijn geen gebieden in je selectie gevonden die geregistreerd staan in AreaShop."
"cmd-noWERegionsFound": "Er zijn geen WorldEdit gebieden gevonden die zich in je selectie bevinden."
"cmd-notRegistered": "Gebied '%0%' is niet beschikbaar in AreaShop."
"cmd-noRegion": "'%0%' is geen geldig WorldGuard gebied."
"cmd-noRegionsAtLocation": "Geen gebieden gevonden op je lokatie, geef het gebied mee als argument."
"cmd-moreRegionsAtLocation": "Meerdere gebieden gevonden op je lokatie, geef het gebied mee als argument."
"cmd-automaticRegionOnlyByPlayer": "Automatisch bepalen van het gebied is alleen mogelijk voor spelers, geef het gebied mee als argument."
"help-header": "Help pagina, commando's die jij kunt uitvoeren."
"help-noPermission": "Je hebt geen toestemming om de help pagina te bekijken."
"help-alias": "Commando aliassen: /areashop, /as."
"help-help": "%lang:helpCommand|/as help|% Laat deze help pagina zien."
"help-info": "%lang:helpCommand|/as info|% Vraag informatie over gebieden op."
"help-rent": "%lang:helpCommand|/as rent|% Huur een gebied of verleng de huur."
"help-buy": "%lang:helpCommand|/as buy|% Koop een gebied."
"help-unrent": "%lang:helpCommand|/as unrent|% Stop de huur van een gebied."
"help-sell": "%lang:helpCommand|/as sell|% Verkoop een gebied."
"help-reload": "%lang:helpCommand|/as reload|% Herlaad bestanden en update gebieden."
"help-setrestore": "%lang:helpCommand|/as setrestore|% Schakel herstellen in/uit en kies het profiel."
"help-setprice": "%lang:helpCommand|/as setprice|% Verander de prijs van een gebied."
"help-setduration": "%lang:helpCommand|/as setduration|% Verander de huurtijd van een region."
"help-teleport": "%lang:helpCommand|/as tp|% Teleporteer naar koop/huur gebieden."
"help-setteleport": "%lang:helpCommand|/as settp|% Stel een teleporteer plek in."
"help-find": "%lang:helpCommand|/as find|% Zoek een leeg huur of koop gebied."
"help-groupadd": "%lang:helpCommand|/as groupadd|% Voeg een gebied toe aan een groep."
"help-groupdel": "%lang:helpCommand|/as groupdel|% Verwijder een gebied uit een groep."
"help-grouplist": "%lang:helpCommand|/as grouplist|% Laat een lijst met groepen zien."
"help-groupinfo": "%lang:helpCommand|/as groupinfo|% Laat informatie over een groep zien."
"help-schemevent": "%lang:helpCommand|/as schemevent|% Voer een schematic gebeurtenis uit."
"help-add": "%lang:helpCommand|/as add|% Registreer een huur of koop gebied."
"help-del": "%lang:helpCommand|/as del|% Verwijder een geregistreerd gebied."
"help-addsign": "%lang:helpCommand|/as addsign|% Voeg een bordje toe aan een bestaand gebied."
"help-delsign": "%lang:helpCommand|/as delsign|% Verwijder het bord waar je naar kijkt."
"help-me": "%lang:helpCommand|/as me|% Bekijk welke gebieden je hebt (+aflooptijd)."
"help-setowner": "%lang:helpCommand|/as setowner|% Stel gebied eigenaar in of verleng de huur."
"help-resell": "%lang:helpCommand|/as resell|% Zet een gebied in doorverkoop modus."
"help-stopResell": "%lang:helpCommand|/as stopresell|% Stop het herverkopen van een gebied."
"help-addFriend": "%lang:helpCommand|/as addfriend|% Voeg een vriend toe aan een gebied."
"help-delFriend": "%lang:helpCommand|/as delfriend|% Verwijder een vriend van een gebied."
"help-linksigns": "%lang:helpCommand|/as linksigns|% Gebruik massa bord koppelen mode."
"help-stack": "%lang:helpCommand|/as stack|% Creer meerdere gebieden en voeg ze toe."
"help-setlandlord": "%lang:helpCommand|/as setlandlord|% Creer meerdere gebieden en voeg ze toe."
"help-import": "%lang:helpCommand|/as import|% Importeer gebieden van RegionForSale."
"rent-help": "/as rent [region], het gebied waarin je staat zal worden gebruikt als je het niet aangeeft."
"rent-noPermission": "Je hebt geen toestemming om een gebied te huren."
"rent-maximum": "Je kunt niet meer dan %0% gebied(en) huren (je hebt er al %1% in groep '%2%')."
"rent-maximumExtend": "Je kunt dit gebied niet meer verlengen omdat je meer dan %0% gebied(en) bezit (je hebt er al %1% in groep '%2%')."
"rent-payError": "Er is iets mis gegaan met betalen, probeer het later opnieuw."
"rent-rented": "Je hebt %lang:region% gehuurd tot %until%, je kunt de huur verlengen door het rechtsklikken van het bord of /as rent."
"rent-extended": "Je hebt de huur van %lang:region% verlengt tot %until%."
"rent-extendedToMax": "Je hebt de huur van %lang:region% verlengt tot %until% (dit is de maximale huurtijd van %maxrenttime%)."
"rent-lowMoneyExtend": "Je hebt niet genoeg geld om het gebied te huren (je hebt %0% van de %price%)."
"rent-lowMoneyRent": "Je hebt niet genoeg geld om %lang:region% te kopen (je hebt %0% van de %price%)."
"rent-someoneElse": "Iemand anders heeft %lang:region% al gehuurd."
"rent-notRentable": "Gebied '%0%' is niet beschikbaar om te huren (niet geregistreerd in AreaShop of een koop gebied)."
"rent-maxExtends": "Je kunt de huur niet meer verlengen (het maximum is %maxextends% keer), je kunt echter wel %lang:region% opnieuw huren als het afgelopen is."
"rent-maxRentTime": "Je kunt %lang:region% niet meer tijd van tevoren huren, de maximum tijd is %maxrenttime% en je hebt het al voor %timeleft% gehuurt."
"rent-restrictedToWorld": "Je moet in de wereld '%world%' zijn om %lang:region% te kopen (je ben in '%0%')."
"rent-restrictedToRegion": "Je moet in %lang:region% staan om hem te huren."
"rent-expireWarning": "Je gebied %lang:region% heeft nog %timeleft% over, verleng het als je het wilt houden.."
"rent-expiringSoon": "Je gebied %lang:tRegion|%0%|% heeft nog %1% over, verleng het als je het wilt houden."
"rent-alreadyAtFull": "%lang:region% is al verhuurd voor de maximale tijd, je kunt hem niet verlengen."
"buy-help": "/as buy [region], het gebied waarin je staat word gebruikt als je het niet aangeeft."
"buy-noPermission": "Je hebt geen toestemming om een gebied te kopen."
"buy-noPermissionResell": "Je hebt geen toestemming om een koop gebied in doorverkoop mode te kopen."
"buy-noPermissionNoResell": "Je hebt geen toestemming om een koop gebied die niet in doorverkoop mode staat te kopen."
"buy-notBuyable": "Gebied '%0%' is niet beschikbaar om te kopen (niet geregistreerd in AreaShop of een koop gebied)."
"buy-maximum": "Je kunt niet meer dan %0% gebied(en) kopen (je hebt er al %1% in de groep '%2%')."
"buy-payError": "Er is iets mis gegaan met betalen, probeer het later opnieuw."
"buy-succes": "Je hebt %lang:region% succesvol gekocht."
"buy-successResale": "Je hebt %lang:region% succesvol gekocht van %lang:tPlayer|%0%|%."
"buy-successSeller": "Je gebied %lang:region% is verkocht aan %lang:player% voor %0%."
"buy-lowMoney": "Je hebt niet genoeg geld om %lang:region% te kopen (je hebt %0% van de %price%)."
"buy-lowMoneyResell": "Je hebt niet genoeg geld om %lang:region% te kopen (je hebt %0% van de %resellprice%)."
"buy-yours": "Je bent al in bezit van %lang:region%."
"buy-someoneElse": "Iemand anders is al in bezit van %lang:region%."
"buy-restrictedToWorld": "Je moet in de wereld '%world%' zijn om %lang:region% te kopen (je ben in '%0%')."
"buy-restrictedToRegion": "Je moet in %lang:region% staan om hem te kopen."
"unrent-help": "/as unrent [region], het gebied waarin je staat zal worden gebruikt als je deze niet aangeeft."
"unrent-noPermission": "Je hebt geen toestemming om te stoppen met huren."
"unrent-noPermissionOther": "Je hebt geen toestemming om iemand anders huur te stoppen."
"unrent-notRegistered": "De huur kan niet gestopt worden want het gebied is niet geregistreerd om te huren."
"unrent-notRented": "De huur kan niet gestopt worden want het gebied is niet gehuurd."
"unrent-unrented": "De huur van %lang:region% van %lang:player% is gestopt."
"unrent-expired": "Je huur van %lang:region% is afgelopen."
"sell-help": "/as sell [region], het gebied waarin je staat zal worden gebruikt als je deze niet aangeeft."
"sell-notRegistered": "Het gebied kan niet verkocht worden want het staat niet geregistreerd om te kopen."
"sell-notBought": "Het gebied kan niet verkocht worden want het is niet gekocht."
"sell-sold": "%lang:region% is verkocht voor %lang:player%."
"sell-noPermission": "Je hebt geen toestemming om een gebied te verkopen."
"sell-noPermissionOther": "Je hebt geen toestemming om een gebied van iemand anders te verkopen."
"sell-disabled": "Verkopen is uitgeschakeld voor dit gebied."
"reload-reloading": "Alle configuratie en gebied bestanden zijn herladen."
"reload-noPermission": "Je hebt geen toestemming om configuratiebestanden te herladen."
"reload-updateCommandChanged": "'/as updaterents' en '/as updatebuys' zijn verwijderd, '/as reload' updated nu ook de gebieden, gebruik dus dat commando."
"info-help":
- "/as info[break]"
- " %lang:command|all|/as info all|%[break]"
- " %lang:command|rented|/as info rented|% [group] [page][break]"
- " %lang:command|forrent|/as info forrent|% [group] [page][break]"
- " %lang:command|sold|/as info sold|% [group] [page][break]"
- " %lang:command|forsale|/as info forsale|% [group] [page][break]"
- " %lang:command|reselling|/as info reselling|% [group] [page][break]"
- " %lang:command|nogroup|/as info nogroup [page]|%[break]"
- " %lang:command|region|/as info region|% [region]"
"info-noPermission": "Je hebt geen toestemming om informatie over gebieden te bekijken."
"info-allHeader": "Alle gebieden%0%:"
"info-rentedHeader": "Verhuurde gebieden%0%:"
"info-forrentHeader": "Gebieden te huur%0%:"
"info-forsaleHeader": "Gebieden te koop%0%:"
"info-soldHeader": "Verkochte gebieden%0%:"
"info-resellingHeader": "Gebieden aan het doorverkopen%0%:"
"info-nogroupHeader": "Gebieden zonder groep%0%:"
"info-limitedToGroup": "(beperkt tot groep %0%)"
"info-nogroupNone": "Er zijn geen gebieden zonder groep."
"info-noFiltergroup": "Groep '%0%' bestaat niet en kan daardoor niet gebruikt worden om de resultaten te limiteren."
"info-noRegions": "Er zijn geen gebieden gevonden."
"info-wrongPage": "%0% is geen correct pagina nummer."
"info-entryForrent": "[darkgreen][bold]►[reset] %lang:region%: [gray]Te huur voor %price% per %duration%."
"info-entryRented": "[darkgreen][bold]►[reset] %lang:region%: [gray]Verhuurd aan %lang:player%."
"info-entryForsale": "[darkgreen][bold]►[reset] %lang:region%: [gray]Te koop voor %price%."
"info-entrySold": "[darkgreen][bold]►[reset] %lang:region%: [gray]Verkocht aan %lang:player%."
"info-entryReselling": "[darkgreen][bold]►[reset] %lang:region%: [gray]Verkocht aan %lang:player% (aan het doorverkopen)."
"info-pageStatus": "[gold]Pagina %0%/%1%"
"info-pagePrevious":
- " [gold][bold]◄Vorige[/bold] "
- " hover: %lang:action|Laat de vorige pagina zien|%"
- " command: /areashop %0%"
"info-pageNoPrevious":
- " [darkgray][bold]◄Vorige[/bold] "
- " hover: Dit is al de eerste pagina"
"info-pageNext":
- " [gold][bold]Volgende►[/bold]"
- " hover: %lang:action|Laat de volgende pagina zien|%"
- " command: /areashop %0%"
"info-pageNoNext":
- " [darkgray][bold]Volgende►[/bold]"
- " hover: Dit is al de laatste pagina"
"info-playerHelp": "/as info player <naam>."
"info-playerRents": "Gebieden gehuurd door %lang:tPlayer|%0%|%: [gray]%1%."
"info-playerNoRents": "%lang:tPlayer|%0%|% heeft geen gebieden gehuurd."
"info-playerBuys": "Gebieden gekocht door %lang:tPlayer|%0%|%: [gray]%1%."
"info-playerNoBuys": "%lang:tPlayer|%0%|% heeft geen gebieden gekocht."
"info-regionHelp": "/as info region <naam>."
"info-regionHeaderRent": "[darkgreen]Informatie over %lang:region%:"
"info-regionHeaderBuy": "[darkgreen]Informatie over %lang:region%:"
"info-regionRented": "[darkgreen][bold]►[reset] Gehuurd door %lang:player% tot: [gray]%until%."
"info-regionBought": "[darkgreen][bold]►[reset] Gekocht door %lang:player%."
"info-regionReselling": "[darkgreen][bold]►[reset] Gekocht door %lang:player%, aan het doorverkopen."
"info-regionExtending":
- "[darkgreen][bold]►[reset] "
- "[bold]Verleng voor[/bold]"
- " hover: Verleng huur van %region%"
- " hover: met %duration% voor %price%"
- " hover: %lang:action|Verleng de huur van %region%|%"
- " command: /areashop rent %region%"
- ": [gray]%price% per %duration%."
"info-regionCanBeRented":
- "[darkgreen][bold]►[reset] "
- "[bold]Huur voor[/bold]"
- " hover: Huur %region% voor %price% per %duration%"
- " hover: %lang:action|Huur %region%|%"
- " command: /areashop rent %region%"
- ": [gray]%price% per %duration%."
"info-regionCanBeBought":
- "[darkgreen][bold]►[reset] "
- "[bold]Koop voor[/bold]"
- " hover: Koop %region% voor %price%"
- " hover: %lang:action|Koop %region%|%"
- " command: /areashop buy %region%"
- ": [gray]%price%."
"info-regionReselPrice": "[darkgreen][bold]►[reset] Doorverkoop prijs: [gray]%resellprice% (je kunt het kopen van %lang:player%)."
"info-regionFriends": "[darkgreen][bold]►[reset] Toegevoegde vrienden: [gray]%0%."
"info-friend": "%lang:tPlayer|%0%|%"
"info-friendRemove":
- "%lang:info-friend|%0%|%"
- "[red]✕[gray]"
- " hover: Gebied %region%"
- " hover: %lang:action|Verwijder %0% as friend|%"
- " command: /areashop delfriend %0% %region%"
"info-regionMoneyBackBuy": "[darkgreen][bold]►[reset] Verkoop terugbetaling: [gray]%moneyback% (%moneybackpercent%% van de prijs)."
"info-regionMoneyBackBuyClick":
- "[darkgreen][bold]►[reset] "
- "[bold]Verkoop terugbetaling[/bold]"
- " hover: Verkoop %region% en krijg %moneyback% terug"
- " hover: %lang:action|Verkoop %region%|%"
- " command: /areashop sell %region%"
- ": [gray]%moneyback% (%moneybackpercent%% van de prijs)."
"info-regionMoneyBackRent": "[darkgreen][bold]►[reset] Stop met huren terugbetaling: [gray]%moneyback% (%moneybackpercent%% van de overgebleven tijd)."
"info-regionMoneyBackRentClick":
- "[darkgreen][bold]►[reset] "
- "[bold]Stop met huren terugbetaling[/bold]"
- " hover: Stop met huren van %region% en krijg %moneyback% terug"
- " hover: %lang:action|Stop met huren van %region%|%"
- " command: /areashop unrent %region%"
- ": [gray]%moneyback% (%moneybackpercent%% van de overgebleven tijd)."
"info-regionMaxExtends": "[darkgreen][bold]►[reset] Maximaal keer verlengen: [gray]%maxextends% keer."
"info-regionNoExtending": "[darkgreen][bold]►[reset] Huur kan niet verlengt worden."
"info-regionExtendsLeft": "[darkgreen][bold]►[reset] Verlengingen over: [gray]%extendsleft% keer van de %maxextends%."
"info-regionMaxRentTime": "[darkgreen][bold]►[reset] Huurtijd: [gray]maximaal %maxrenttime%."
"info-prefix": "[darkgreen][bold]►[reset] "
"info-regionTeleport":
- "[bold]Ga naar het gebied[/bold]"
- " hover: %lang:action|Ga naar %region%|%"
- " command: /areashop tp %region%"
"info-setRegionTeleport":
- "[bold]stel teleporteer locatie in[/bold]"
- " hover: %region%"
- " hover: %lang:action|Stel teleporteer locatie in|%"
- " command: /areashop settp %region%"
"info-regionSigns": "[darkgreen][bold]►[reset] Verbonden borden: [gray]%0%."
"info-regionSignLocation": "[gray](%0%, %1%, %2%, %3%)[reset]"
"info-regionGroups": "[darkgreen][bold]►[reset] Toegewezen groepen: [gray]%0%."
"info-regionInactiveUnrent": "[darkgreen][bold]►[reset] Automatische huurstop na: [gray]Inactiviteit van %inactivetime% door de speler."
"info-regionInactiveSell": "[darkgreen][bold]►[reset] Automatische verkoop na: [gray]Inactiviteit van %inactivetime% door de spler."
"info-regionRestrictedRegionRent": "[darkgreen][bold]►[reset] Je moet in %lang:region% staan om deze te huren."
"info-regionRestrictedWorldRent": "[darkgreen][bold]►[reset] je moet in de wereld '%world%' zijn om %lang:region% te huren."
"info-regionRestrictedRegionBuy": "[darkgreen][bold]►[reset] Je moet in %lang:region% staan om deze te kopen."
"info-regionRestrictedWorldBuy": "[darkgreen][bold]►[reset] Je moet in de wereld '%world%' staan om %lang:region% te kopen."
"info-regionRestoringRent": "[darkgreen][bold]►[reset] Herstellen is ingeschakeld [gray](gebied zal resetten bij een huurstop)."
"info-regionRestoringBuy": "[darkgreen][bold]►[reset] Herstellen is ingeschakeld [gray](gebied zal resetten bij verkoop)%0%."
"info-regionLandlord": "[darkgreen][bold]►[reset] Landeigenaar: [gray]%lang:landlord% (krijgt het geld)."
"info-regionNotExisting": "Het aangegeven gebied is niet geregistreerd: %0%."
"setrestore-help": "/as setrestore <gebied> <true|false|general> [profiel]."
"setrestore-noPermission": "Je hebt geen toestemming om de herstel opties te veranderen."
"setrestore-notRegistered": "Het aangegeven gebied is niet geregistreerd: %0%."
"setrestore-invalidSetting": "'%0%' is geen geldige staat, gebruik true, false of general."
"setrestore-success": "Herstel optie van %lang:region% succesvol gezet naar '%0%'."
"setrestore-successProfile": "Herstel optie van %lang:region% succesvol gezet naar '%0%' en het profiel naar '%1%'."
"setprice-noPermission": "Je hebt geen toestemming om de prijs van een gebied te veranderen."
"setprice-help": "/as setprice <prijs> [gebied], het gebied waarin je staat zal worden gebruikt als je deze niet aangeeft."
"setprice-notRegistered": "Het aangegeven gebied is niet geregistreerd: %0%."
"setprice-wrongPrice": "'%0%' is geen geldige prijs."
"setprice-successRent": "Prijs van gebied %lang:region% is veranderd naar %price% per %duration%."
"setprice-successBuy": "De prijs van het gebied %lang:region% is veranderd naar %price%."
"setprice-successRemoved": "Prijs van %lang:region% is verwijderd, hij zal nu de prijs van de groep of default.yml file gebruiken, nieuwe prijs: %price%."
"setprice-noLandlord": "Je hebt geen toestemming om de prijs te veranderen omdat je niet de landeigenaar bent van %lang:region%."
"setduration-noPermission": "Je hebt geen toestemming om de duur van het huur gebied aan te passen."
"setduration-help": "/as setduration <aantal> <identificator> [gebied], het gebied waarin je staat zal worden gebruikt als je niets aangeeft."
"setduration-notRegistered": "%0% is niet geregistreerd voor verhuur."
"setduration-wrongAmount": "'%0%' is geen geldig aantal, gebruik een geheel nummer."
"setduration-wrongFormat": "'%0%' is geen goed tijdsformaat, bekijk de documentatie op Bukkit."
"setduration-success": "Looptijd van gebeid %lang:region% veranderd naar '%duration%'."
"setduration-noLandlord": "Je hebt geen toestemming om de tijdsduur te veranderen omdat je niet de landeigenaar bent van %lang:region%."
"setduration-successRemoved": "Tijdsduur van %lang:region% is verwijderd, hij zal nu de tijdsduur van een group of default.yml gebruiken, nieuwe tijdsduur: %duration%."
"setup-noRegion": "Je hebt geen gebied aangegeven op de tweede regel."
"setup-alreadyRentSign": "Het aangegeven gebied is al toegevoegd als huur gebied aan AreaShop, voeg een bord toe met [as] op de eerste regel of met '/as addsign'."
"setup-alreadyOtherWorld": "Het aangegeven gebied is al toegevoegd aan AreaShop in een andere wereld, gebieden in verschillende werelden moeten verschillende namen hebben."
"setup-alreadyBuySign": "Het aangegeven gebied is al toegevoegd als koop gebied aan AreaShop, voeg een bord toe met [as] op de eerste regel of met '/as addsign'."
"setup-noDuration": "Je hebt geen tijdsduur voor het huren aangegeven, zet dit op de derde regel."
"setup-wrongDuration": "De aangegeven tijdsduur is niet in het correcte formaat, voorbeeld: 1 dag."
"setup-noPrice": "Je hebt geen prijs aangegeven op de vierde regel."
"setup-wrongPrice": "Je hebt de prijs niet goed aangegeven, gebruik alleen nummers."
"setup-rentSuccess": "Huren van gebied %lang:region% is goed opgezet."
"setup-buySuccess": "Kopen van gebied %lang:region% is goed opgezet."
"setup-noPermissionRent": "Je hebt geen toestemming om huur gebieden op te zetten."
"setup-noPermissionBuy": "Je hebt geen toestemming om koop gebieden op te zetten."
"setup-couldNotDetect": "Meerdere gebieden gevonden op de lokatie van het bord, geef het gebied aan op de tweede regel (2 van de gevonden gebieden: %lang:tRegion|%0%|% en %lang:tRegion|%1%|%)."
"setup-blacklisted": "%0% staat op de blacklist en kan niet toegevoegd worden aan AreaShop."
"setup-noPermission": "Je kunt de region '%0%' niet toevoegen, je bent geen owner/member of hebt geen toestemming."
"destroy-noPermissionRent": "Je hebt geen toestemming om huur gebieden te verwijderen."
"destroy-noPermissionBuy": "Je hebt geen toestemming om koop gebieden te verwijderen."
"destroy-successRent": "%lang:region% succesvol verwijderd als huur gebied."
"destroy-successBuy": "%lang:region% succesvol verwijderd als koop gebied."
"teleport-help": "/as tp <gebied> <aantal> <soort>."
"teleport-noRentOrBuy": "Het aangegeven gebied is niet geregistreerd: %0%."
"teleport-noPermission": "Je hebt geen toestemming om naar je gebied te teleporteren."
"teleport-noPermissionOther": "Je hebt geen toestemming om te teleporteren naar een gebied dat niet van jou is."
"teleport-noPermissionSign": "Je hebt geen toestemming om naar het bordje van je gebied te teleporteren."
"teleport-noPermissionOtherSign": "Je hebt geen toestemming om naar bordjes te teleporteren van gebieden die niet van jou zijn."
"teleport-noPermissionFriend": "Je hebt geen toestemming om te teleporteren naar gebieden waar je als vriend bent toegevoegd."
"teleport-noPermissionFriendSign": "Je hebt geen toestemming om te teleporteren naar het bord van gebieden waar je als vriend bent toegevoegd."
"teleport-noPermissionAvailable": "Je hebt geen toestemming om naar beschikbare gebieden te teleporteren."
"teleport-noPermissionAvailableSign": "Je hebt geen toestemming om naar het bord van beschikbare gebieden te teleporteren."
"teleport-success": "Je bent geteleporteerd naar %lang:region%."
"teleport-successSign": "Je bent geteleporteerd naar het bord van %lang:region%."
"teleport-noSafe": "Geen veilige plek gevonden in gebied %lang:region%, geen blokken over in het gebied of het maximum aantal pogingen overschreden (%0%%1%)."
"teleport-blocked": "Je kunt niet teleporteren omdat de positie buiten het gebied ligt en je geforceerd word erbinnen te teleporteren."
"teleport-changedToSign": "Je hebt alleen toestemming om te teleporteren naar het bord en niet binnen de region, teleporteren naar het bord."
"teleport-changedToNoSign": "Er is geen bord beschikbaar om naar te teleporteren, proberen om naar het gebied te teleporteren."
"teleport-wrongWorld": "Je moet in wereld '%world%' zijn om te teleporteren naar %lang:region%, maar je bent in wereld '%0%'."
"setteleport-help": "/as settp [gebied] [reset], het gebied waar je in staat zal worden gebruikt als je deze niet aangeeft."
"setteleport-noPermission": "Je hebt geen toestemming om de teleporteer lokatie in te stellen."
"setteleport-noPermissionOther": "Je hebt geen toestemming om de teleporteer lokatie in te stellen voor een gebied dat niet van jou is."
"setteleport-noRentOrBuy": "Het aangegeven gebied is niet geregistreerd: %0%."
"setteleport-success": "Teleporteer lokatie van %lang:region% ingestelt."
"setteleport-notInside": "De lokatie moet zich binnen het gebied bevinden."
"setteleport-reset": "Teleporteer lokatie van %lang:region% is gereset."
"find-help": "/as find <buy|rent> [maxprijs] [groep]."
"find-noPermission": "Je hebt geen toestemming om te zoeken naar gebieden en naar deze te teleporteren."
"find-success": "Een %0% gebied is gevonden: %lang:region%, bij het zoeken met een maximale prijs gelijk aan je saldo: %1%%2%."
"find-successMax": "Een %0% gebied is gevonden: %lang:region%, bij het zoeken met een maximale prijs van %1%%2%."
"find-wrongMaxPrice": "De aangegeven maximum prijs is geen correct nummer: %0%."
"find-wrongGroup": "De aangegeven groep bestaat niet: %0%."
"find-noneFound": "Geen %0% gebied gevonden bij het zoeken met een maximale prijs gelijk aan je saldo: %1%%2%."
"find-noneFoundMax": "Geen %0% gebied gevonden bij het zoeken met een maximale prijs van %1%%2%."
"find-onlyInGroup": ", alleen gebieden gezocht in de groep: %0%."
"groupadd-help": "/as groupadd <groep> [gebied], als er geen gebied is aangegeven dan worden alle gebieden in je WorldEdit selectie gebruikt."
"groupadd-noPermission": "Je hebt geen toestemming om gebieden toe te voegen aan groepen."
"groupadd-success": "Gebied %lang:region% is toegevoegd aan groep '%0%', deze group heeft nu %1% leden."
"groupadd-failed": "Gebied %lang:region% is al toegevoegd aan groep '%0%'."
"groupadd-weSuccess": "Toegevoegd aan groep %0%: [gray]%1%."
"groupadd-weFailed": "Waren al toegevoegd aan groep %0%: [gray]%1%."
"groupdel-help": "/as groupdel <groep> [gebied], als er geen gebied is aangegeven worden alle gebieden in je WorldEdit selectie gebruikt."
"groupdel-noPermission": "Je hebt geen toestemming om gebieden van groepen te verwijderen."
"groupdel-wrongGroup": "Groep %0% niet gevonden, gebruik '/as grouplist' om de lijst van groepen te bekijken."
"groupdel-success": "Gebied %lang:region% is verwijderd van groep '%0%', deze groep heeft nu %1% leden."
"groupdel-failed": "Gebied %lang:region% is geen lid van groep '%0%'."
"groupdel-weSuccess": "Verwijderd van groep %0%: [gray]%1%."
"groupdel-weFailed": "Waren al niet in de groep %0%: [gray]%1%."
"grouplist-noPermission": "Je hebt geen toestemming om de geregistreerde groepen te bekijken."
"grouplist-noGroups": "Er zijn geen groepen aangemaakt."
"grouplist-success": "De volgende groepen zijn geregistreerd: [gray]%0%."
"groupinfo-help": "/as groupinfo <groep>."
"groupinfo-noPermission": "Je hebt geen toestemming voor het bekijken van informatie over een groep."
"groupinfo-noGroup": "Er is geen groep geregistreerd met de naam '%0%', gebruik /as grouplist om de lijst te bekijken."
"groupinfo-members": "De volgende gebieden zijn leden van de groep %0%: [gray]%1%."
"groupinfo-noMembers": "Groep %0% heeft geen leden."
"schemevent-help": "/as schemevent <gebied> <created|deleted|rented|unrented|bought|sold>."
"schemevent-wrongEvent": "Het aangegeven event '%0%' bestaat niet, gebruik een van de volgende: [gray]%1%."
"schemevent-success": "Event '%0%' succesvol getriggerd voor gebied %lang:region%."
"schemevent-noPermission": "Je hebt geen toestemming om events te triggeren."
"add-help": "/as add <rent|buy> [gebied] [wereld]."
"add-noPermission": "Je hebt geen toestemming om een gebied toe te voegen aan AreaShop."
"add-success": "Toegevoegd als %0%: [gray]%1%."
"add-failed": "Al geregistreerd: [gray]%0%."
"add-failedOtherWorld": "Al geregistreerd in een andere wereld: [gray] %0%."
"add-blacklisted": "Op de blacklist: [gray]%0%."
"add-specifyWorld": "Geef de wereld van het gebied aan als je het commando vanuit de console gebruikt."
"add-incorrectWorld": "Wereld '%0%' niet gevonden, probeer opnieuw (hoofdlettergevoelig)."
"add-noPermissionRegions": "Geen toestemming om toe te voegen: [gray]%0%."
"add-noPermissionOwnerMember": "[gray]Je bent geen member/owner van deze gebieden of hebt geen toestemming om je gebieden toe te voegen."
"del-noPermission": "Je hebt geen toestemming om gebieden te verwijderen."
"del-success": "Verwijderde gebieden: [gray]%0%."
"del-failed": "Geen toestemming om te verwijderen of niet geregistreerd: [gray]%0%."
"addsign-help": "/as addsign [gebied] [profiel]."
"addsign-noSign": "Je kijkt niet naar een bord."
"addsign-noRegions": "Geen gebied gevonden op de lokatie van het bord."
"addSign-notRegistered": "Het aangegeven gebied is niet geregistreerd in AreaShop: %0% (het gebied moet eerst worden toegevoegd aan AreaShop voordat een bord kan worden toegevoegd)."
"addsign-couldNotDetect": "Meerdere gebieden gevonden op de lokatie van het bord, geef het gebied mee als extra argument (2 van de gevonden gebieden: %lang:tRegion|%0%|% en %lang:tRegion|%1%|%)."
"addsign-couldNotDetectSign": "Meerdere gebieden gevonden op de lokatie van het bord, geef het gebied aan op de tweede regel (2 van de gevonden gebieden: %lang:tRegion|%0%|% en %lang:tRegion|%1%|%)."
"addsign-wrongProfile": "Het aangegeven profiel bestaat niet, gebruik een van de volgende (check de config): [gray]%0%."
"addsign-profile":
- "[bold]%0%[/bold]"
- " hover: Bord profiel %0%"
- " hover: %lang:action|Gebruik dit profiel|%"
- " command: /areashop linksigns %0%"
"addsign-success": "Het bord is toegevoegd aan %lang:region%."
"addsign-successProfile": "Het bord is toegevoegd aan %lang:region% met profiel %0%."
"addsign-alreadyRegistered": "Dat bord is al geregistreerd voor gebied %lang:region%."
"addsign-noPermission": "Je hebt geen toestemming om een bord toe te voegen."
"delsign-noSign": "Je kijkt niet naar een bord."
"delsign-noPermission": "Je hebt geen toestemming om een bord te verwijderen."
"delsign-noRegion": "Dat bord hoort niet bij een AreaShop gebied."
"delsign-success": "Het bord is verwijderd van gebied %lang:region%."
"me-noPermission": "Je hebt geen toestemming om te zien welke gebieden je hebt."
"me-header": "Gebieden van %lang:tPlayer|%0%|%:"
"me-notAPlayer": "Je bent geen speler dus je kunt geen gebieden hebben."
"me-rentLine":
- "[darkgreen][bold]►[reset] %lang:region% [gray]("
- "%timeleft% over"
- " hover: tot %until%"
- ")."
"me-buyLine": "[darkgreen][bold]►[reset] %lang:region%."
"me-friendLine":
- "[darkgreen][bold]►[reset] %lang:region% [gray]("
- "%lang:player% is eigenaar"
- " hover: Je bent toegevoegd als vriend"
- ")."
"me-nothing": "%lang:tPlayer|%0%|% heeft geen gebieden gekocht of gehuurd en is niet als vriend toegevoegd bij gebieden."
"me-noPlayer": "%0% kan niet gevonden worden, is waarschijnlijk nooit op de server geweest."
"me-clickHint": "[gray][italic]Klik op een naam van een gebied voor details."
"setowner-help": "/as setowner <speler> [gebied], het gebied waar je in staat zal worden gebruikt als je deze niet aangeeft."
"setowner-noPermission": "Je hebt geen toestemming om de eigenaar van een gebied in te stellen."
"setowner-noPermissionRent": "Je hebt geen toestemming om de eigenaar van huur gebieden in te stellen."
"setowner-noPermissionBuy": "Je hebt geen toestemming om de eigenaar van koop gebieden in te stellen."
"setowner-notRegistered": "Het aangegeven gebied is niet geregistreerd, eigenaar kan niet worden ingesteld."
"setowner-noPlayer": "De UUID van de aangegeven speler kon niet worden gevonden: %0%."
"setowner-succesRent": "Eigenaar van %lang:region% succesvol veranderd naar %lang:player%, gehuurt tot %until% (%timeleft% over)."
"setowner-succesRentExtend": "Eigenaar was al %lang:player%, huur verlengt met '%duration%', nu gehuurd tot %until% (%timeleft% over)."
"setowner-succesBuy": "Eigenaar van %lang:region% succesvol veranderd naar %lang:player%."
"resell-help": "/as resell <prijs> [gebied], het gebied waarin je staat zal worden gebruikt als je deze niet aangeeft."
"resell-wrongPrice": "'%0%' is geen geldige prijs."
"resell-notRegistered": "Het aangegeven gebied is niet geregistreerd: %0%."
"resell-notBought": "Je kunt %lang:region% niet doorverkopen want dit gebied is nog niet verkocht."
"resell-success": "%lang:region% is succesvol in doorverkoop mode gezet voor %resellprice%."
"resell-noPermission": "Je hebt geen toestemming om je gebied in doorverkoop mode te zetten."
"resell-noPermissionOther": "Je hebt geen toestemming om gebieden in doorverkoop mode te zetten."
"resell-disabled": "Doorverkopen is uitgeschakeld voor dit gebied."
"stopresell-help": "/as stopresell [gebied], het gebied waarin je staat zal worden gebruikt als je deze niet aangeeft."
"stopresell-notRegistered": "Het aangegeven gebied is niet geregistreerd: %0%."
"stopresell-notResell": "Je kunt niet stoppen met doorverkopen van %lang:region% want hij staat niet in doorverkoop mode."
"stopresell-success": "%lang:region% is succesvol terug gezet in verkocht mode."
"stopresell-noPermission": "Je hebt geen toestemming om je gebied terug te zetten in verkocht mode."
"stopresell-noPermissionOther": "Je hebt geen toestemming om een gebied terug te zetten in verkocht mode."
"addfriend-help": "/as addfriend <speler> [gebied], het gebied waar je in staat zal worden gebruikt als je deze niet aangeeft."
"addfriend-noPermissionOther": "Je hebt geen toestemming om vrienden toe te voegen aan gebieden die niet van jou zijn."
"addfriend-noPermission": "Je hebt geen toestemming om vrienden toe te voegen aan je gebied."
"addfriend-successOther": "%lang:tPlayer|%0%|% is toegevoegd als vriend bij gebied %lang:region%."
"addfriend-success": "%lang:tPlayer|%0%|% is toegevoegd als vriend bij je gebied %lang:region%."
"addfriend-alreadyAdded": "%lang:tPlayer|%0%|% is al toegevoegd als vriend voor %lang:region%."
"addfriend-self": "Het toevoegen van de eigenaar van het gebied als vriend zou nutteloos zijn."
"addfriend-noOwner": "Je kunt geen vrienden toevoegen aan een gebied zonder eigenaar."
"addfriend-notVisited": "Je kunt %0% niet toevoegen omdat hij de server nog niet heeft bezocht."
"delfriend-help": "/as delfriend <speler> [gebied], het gebied waar je in staat zal worden gebruikt als je deze niet aangeeft."
"delfriend-noPermissionOther": "Je hebt geen toestemming om vrienden te verwijderen van gebieden die niet van jou zijn."
"delfriend-noPermission": "Je hebt geen toestemming om vrienden te verwijderen van je gebied."
"delfriend-successOther": "%lang:tPlayer|%0%|% is verwijderd als vriend van %lang:region%."
"delfriend-success": "%lang:tPlayer|%0%|% is verwijderd als vriend van je gebied %lang:region%."
"delfriend-notAdded": "%lang:tPlayer|%0%|% is niet toegevoegd als vriend voor %lang:region%."
"delfriend-noOwner": "Je kunt geen vrienden verwijderen van een gebied zonder eigenaar."
"linksigns-multipleRegions": "Meerdere gebieden gevonden: [gray]%0%."
"linksigns-multipleRegionsAdvice": "Klik nog een keer om het opnieuw te proberen of gebruik '/as linksigns' om te stoppen."
"linksigns-noRegions": "Geen AreaShop gebieden gevonden in de richting van je cursor, controleer of het gebied is toegevoegd aan AreaShop [gray](maximaal bereik 100 blokken)."
"linksigns-regionFound": "Gebied %lang:region% is gevonden, wijs nu naar een bord en linksklik om het te koppelen."
"linksigns-signFound": "Bord gevonden op (%0%, %1%, %2%), wijs nu naar een gebied en rechtsklik om het te koppelen."
"linksigns-noSign": "Geen bord gevonden in de richting van je cursor, controleer of je direct zicht hebt op een bord en klik opnieuw [gray](maximaal bereik 100 blokken)."
"linksigns-alreadyRegistered": "Dat bord is al gekoppelt aan gebied %lang:region%, klik opnieuw om een ander bord te selecteren."
"linksigns-first": "Je bent in bord-koppel modus gegaan."
"linksigns-next": "[gray]Linksklik om een bord te selecteren, rechtsklik om een gebied te selecteren, gebruik '/as linksigns' om te stoppen."
"linksigns-noPermission": "Je hebt geen toestemming om massa bord-koppel modus te gebruiken."
"linksigns-stopped": "Je bent gestopt met bord-koppel modus."
"stack-help":
- "/as stack <aantal> <afstand> <naam> <rent|buy> [groep].[break]"
- " [gray]<aantal> Het aantal gebieden dat word gemaakt.[break]"
- " [gray]<afstand> Blokken afstand tussen de gebieden.[break]"
- " [gray]<naam> Naam van de gebieden (komt een nummer achter).[break]"
- " [gray]<rent|buy> Maak ze huur of koop gebieden.[break]"
- " [gray][groep] Groep waaraan de gebieden worden toegevoegd.[break]"
- " [gray]De gebieden zullen worden gemaakt in de richting waarnaar je kijkt."
"stack-accepted": "Begonnen met %0% %1% gebieden maken met %2% blokken ruimte ertussen, namen beginnen met %3% en hebben een nummer erachter.%4%"
"stack-addToGroup": " Gemaakte gebieden zullen worden toegevoegd aan de groep '%0%'."
"stack-noPermission": "Je hebt geen toestemming om in grote aantallen gebieden toe te voegen aan AreaShop."
"stack-wrongAmount": "'%0%' is geen goed aantal gebieden."
"stack-wrongGap": "'%0%' is geen correct getal voor het aantal blokken ruimte tussen gebieden."
"stack-noSelection": "Je hebt geen selectie die aangeeft waar het eerste gebied word gemaakt."
"stack-addStart": "[gray]%0% gebieden aan het toevoegen met %1% per seconde."
"stack-addComplete": "[gray]%0% gebieden toegevoegd%1%."
"stack-tooHigh": ", %0% gebieden overgeslagen omdat ze zich boven Y=256 bevinden"
"stack-tooLow": ", %0% gebieden overgeslagen omdat ze zich onder Y=0 bevinden"
"stack-unclearDirection": "Kijk duidelijk in de noord, oost, zuid, west, omhoog of naar beneden richting, gedetecteerd: %0%."
"setlandlord-help": "/as setlandlord <speler> [gebied], het gebied waar je in staat zal worden gebruikt als niet aangegeven."
"setlandlord-noPermission": "Je hebt geen toestemming om de landeigenaar in te stellen voor een gebied."
"setlandlord-success": "%lang:landlord% is succesvol ingesteld als landeigenaar voor %lang:region%."
"message-help": "/as message <speler> <bericht...>"
"message-noPermission": "Je hebt geen toestemming om AreaShop berichten te sturen."
"message-notOnline": "%0% is niet online."
"import-help": "/as import RegionForSale"
"import-wrongSource": "Geef aan vanaf waar je data wilt importeren, opties: RegionForSale."
"import-noPluginFolder": "Kon de folder %0% niet vinden, weet je zeker dat je de data van de juiste bron importeert?"
"import-noWorldsFolder": "Er is geen 'plugins/RegionForSale/worlds' map, daarom kon niets geïmporteerd worden."
"import-confirm": "Weet je het zeker dat je alle gebieden van RegionForSale wilt importeren?"
"import-start": "Het importeren van de data van RegionForSale begint:"
"import-doWorld": "[darkgreen][bold]► Wereld %0%:"
"import-noBukkitWorld": "[red]Kon de wereld niet in Bukkit vinden."
"import-noRegionManager": "[red] Kon de RegionManager van WorldGuard niet vinden, zijn gebieden aangezet in deze wereld?"
"import-noRegions": "[red]Geen regions.yml bestand gevonden."
"import-loadRegionsFailed": "[red]Kon regions.yml niet laden van: %0%"
"import-invalidRegionSection": "[red]Ongeldige selectie in regions.yml: %0%"
"import-noWorldGuardRegion": "[red]WorldGuard gebied niet gevonden: %0%."
"import-noWorldGuardRegionParent": "[red]WorldGuard gebied voor ouder gebied niet gevonden: %0%."
"import-buyAndRent": "[gold]%0% kan gekocht en gehuurd worden, alleen als kopen aan het toevoegen in AreaShop (kan niet beide zijn)."
"import-noBuyAndNoRent": "[red]%0% kon niet gekocht en gehuurd worden, import overslaan."
"import-imported": "[green]%lang:tRegion%0%l% geïmporteerd."
"import-loadWorldConfigFailed": "[red]Het laden van Wereld-specifieke config.yml is mislukt: %0%."
"import-improperParentRegion": "[red]Ouder gebied %0% heeft geen leesbare instellingen."
"import-alreadyAdded": "[red]Gebied '%0%' is al een keer toegevoegd."
"import-alreadyAddedOtherWorld": "[red]Gebied '%0%' is al een keer toegevoegd in de %1% wereld, gebieden in verschillende werelden kunnen niet dezelfde naam hebben in AreaShop."
"import-invalidSignLocation": "[red]Het importeren van een bordje van gebied '%0%' is mislukt, ongeldige locatie: '%1%'."
"import-signAlreadyAdded": "[red]Het toevoegen van een bordje op locatie '%1%' aan gebied '%0%' is overgeslagen, het is al aan gebied '%2%' toegevoegd."
"import-moneyBackFailed": "[red]Het ontleden van de koop prijs '%0%' en de verkoop prijs '%1%' om het geld terug percentage in te voegen is mislukt."
"confirm-rent":
- "%lang:prefix%Weet je zeker dat je %lang:tRegion|%0%|% wilt huren?[break]"
- "[darkgreen][bold]►[reset] %lang:button|Klik om %0% te huren|%"
- " hover: %lang:action|Huur %0%|%"
- " command: /areashop rent %0%"
"confirm-extend":
- "%lang:prefix%Weet je zeker dat je de huur van %lang:tRegion|%0%|% wilt verlengen?[break]"
- "[darkgreen][bold]►[reset] %lang:button|Klik om %0% te verlengen|%"
- " hover: %lang:action|Verleng %0%|%"
- " command: /areashop rent %0%"
"confirm-unrent":
- "%lang:prefix%Weet je zeker dat je de huur van %lang:tRegion|%0%|% wilt stoppen?[break]"
- "[darkgreen][bold]►[reset] %lang:button|Stop de huur van %0%|%"
- " hover: %lang:action|Stop de huur van %0%|%"
- " command: /areashop unrent %0%"
"confirm-buy":
- "%lang:prefix%Weet je zeker dat je %lang:tRegion|%0%|% wilt kopen?[break]"
- "[darkgreen][bold]►[reset] %lang:button|Klik om %0% te kopen|%"
- " hover: %lang:action|Koop %0%|%"
- " command: /areashop buy %0%"
"confirm-sell":
- "%lang:prefix%Weet je zeker dat je %lang:tRegion|%0%|% wilt verkopen?[break]"
- "[darkgreen][bold]►[reset] %lang:button|Klik om %0% te verkopen|%"
- " hover: %lang:action|Verkoop %0%|%"
- " command: /areashop sell %0%"
"timeleft-years": "%0% jaren"
"timeleft-months": "%0% maanden"
"timeleft-days": "%0% dagen"
"timeleft-hours": "%0% uren"
"timeleft-minutes": "%0% minuten"
"timeleft-second": "%0% seconde"
"timeleft-seconds": "%0% seconden"
"timeleft-ended": "Verlopen"
"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 gekocht worden voor %resellprice% van %player%."
"update-playerNotify":
- "[darkgreen]Update van AreaShop V%0% naar AreaShop V%1% beschikbaar, download de laatste versie op "
- "[bold]Spigot[/bold]"
- " hover: %lang:action|Ga naar de Spigot AreaShop pagina|%"
- " link: https://www.spigotmc.org/resources/areashop.2991/"
- " (en schrijf een review)."
-474
View File
@@ -1,474 +0,0 @@
# ╔═════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════
# ║ Language file of the AreaShop plugin created by NLThijs48, Github can be found at https://github.com/NLthijs48/AreaShop
# ║ Norwegian language file, plugin version 2.5.0, 365/428 messages are translated (85%)
# ║
# ║ 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`
# ║ 3: Change the `language` setting in config.yml to `servername`, do not include `.yml`
# ║ 4: Change the messages in the new file to your liking
# ║ 5: Use `/as reload`or reload/restart your server to see the changes
# ╚═════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════
"button": "[bold]<%0%>[/bold]"
"command":
- "[bold]%0%[/bold]"
- " hover: %lang:action|Bruk %1%|%"
- " kommando: %1%"
"helpCommand":
- "[gold]%0% [gray]-[reset]"
- " hover: %lang:action|Bruk %0%|%"
- " kommando: %0%"
"region": "%lang:tRegion|%region%|%"
"tRegion":
- "[bold]%0%[/bold]"
- " hover: Region %0%"
- " hover: %lang:action|Region informasjon|%"
- " kommando: /areashop info region %0%"
"player": "%lang:tPlayer|%player%|%"
"tPlayer":
- "[bold]%0%[/bold]"
- " hover: Spiller %0%"
- " hover: %lang:action|Regioner til %0%|%"
- " kommando: /areashop info player %0%"
"landlord":
- "[bold]%landlord%[/bold]"
- " hover: Grunneier %landlord%"
- " hover: %lang:action|Regioner til %landlord%|%"
- " kommando: /areashop info player %landlord%"
"total-maximum": "Du kan ikke leie og kjøpe mer enn %0% region(er) totalt (du har allerede %1% i gruppe '%2%')."
"general-notReady": "AreaShop har ikke lastet ferdig ennå, vennligst vent."
"general-noWorld": "Du kan ikke gjøre det, verdenen %lang:region% er for øyeblikket utilgjengelig (world '%world%')."
"general-noRegion": "Du kan ikke gjøre det, WorldGuard regionen er for øyeblikket utilgjengelig. (region %lang:region%)."
"general-noEconomy": "Det er ikke noen økonomi plugin installert eller satt opp riktig, si ifra til server eieren om dette."
"general-cancelled": "%0%"
"cmd-notValid": "Den kommandoen er ikke gyldig, bruk '/as help' for informasjon."
"cmd-onlyByPlayer": "Denne kommandoen kan bare brukes av en spiller."
"cmd-weOnlyByPlayer": "Du kan bare bruke en WorldEdit markering som en spiller, spesifiser region navnet som et ekstra argument."
"cmd-noSelection": "Du har ikke laget en WorldEdit markering."
"cmd-noRegionsFound": "Ingen regioner som er registrert i AreaShop er funnet i din markering."
"cmd-noWERegionsFound": "Ingen WorldEdit regioner som overlapper din markering er funnet."
"cmd-noRegionsAtLocation": "Ingen regioner er funnet på din plassering, spesifiser region navnet som et argument."
"cmd-moreRegionsAtLocation": "Mer enn en region er funnet på din plassering, spesifiser region navnet som et argument."
"cmd-automaticRegionOnlyByPlayer": "Automatisk valg av region er bare mulig for spillere, spesifiser region navnet som som et argument."
"help-header": "Informasjons side, kommandoer som du kan bruke."
"help-noPermission": "Du har ikke rettigheter til å vise siden med hjelp."
"help-alias": "Kommando aliaser: /areashop, /as."
"help-help": "%lang:helpCommand|/as help|% Viser siden med hjelp."
"help-info": "%lang:helpCommand|/as info|% Få informasjon om gjeldende regioner."
"help-rent": "%lang:helpCommand|/as rent|% Lei en region eller utvid din gjeldende leie."
"help-buy": "%lang:helpCommand|/as buy|% Kjøp en region."
"help-unrent": "%lang:helpCommand|/as unrent|% Stopp leie av en region."
"help-sell": "%lang:helpCommand|/as sell|% Selg en region."
"help-reload": "%lang:helpCommand|/as reload|% Last inn filer på nytt og oppdater regionene."
"help-setrestore": "%lang:helpCommand|/as setrestore|% Skru på gjenoppretting og velg en profil."
"help-setprice": "%lang:helpCommand|/as setprice|% Endre prisen på en region."
"help-setduration": "%lang:helpCommand|/as setduration|% Endre leie tiden til en region."
"help-teleport": "%lang:helpCommand|/as tp|% Teleporter til en kjøpe/leie region."
"help-setteleport": "%lang:helpCommand|/as settp|% Sett teleporterings plass for en region."
"help-find": "%lang:helpCommand|/as find|% Finn en ledig kjøp eller leie region."
"help-groupadd": "%lang:helpCommand|/as groupadd|% Legg til en region til en gruppe."
"help-groupdel": "%lang:helpCommand|/as groupdel|% Fjern en region fra en gruppe."
"help-grouplist": "%lang:helpCommand|/as grouplist|% Vis alle grupper som er registrert."
"help-groupinfo": "%lang:helpCommand|/as groupinfo|% Vis informasjon om en gruppe."
"help-schemevent": "%lang:helpCommand|/as schemevent|% Aktiver et schematic event for en region."
"help-add": "%lang:helpCommand|/as add|% Registrer en region som leie eller kjøpe."
"help-del": "%lang:helpCommand|/as del|% Fjern en registrert region fra AreaShop."
"help-addsign": "%lang:helpCommand|/as addsign|% Legg til et skilt for en eksisterende region."
"help-delsign": "%lang:helpCommand|/as delsign|% Fjern skiltet du ser på."
"help-me": "%lang:helpCommand|/as me|% Sjekk hvilke regioner du har (+utløpstid)."
"help-setowner": "%lang:helpCommand|/as setowner|% Sett noen som eier av regionen eller utvid leietiden."
"help-resell": "%lang:helpCommand|/as resell|% Sett en region i videresalgs modus."
"help-stopResell": "%lang:helpCommand|/as stopresell|% Sett en region tilbake i solgt modus."
"help-addFriend": "%lang:helpCommand|/as addfriend|% Legg til en venn i en region."
"help-delFriend": "%lang:helpCommand|/as delfriend|% Fjern en venn fra en region."
"help-linksigns": "%lang:helpCommand|/as linksigns|% Use bulk sign linking mode."
"help-stack": "%lang:helpCommand|/as stack|% Lag flere regioner og legg dem til."
"help-setlandlord": "%lang:helpCommand|/as setlandlord|% Sett grunneier av en region."
"rent-help": "/as rent [region], regionen du står i vil bli brukt hvis ikke spesifisert."
"rent-noPermission": "Du har ikke rettigheter til å leie en region."
"rent-maximum": "Du kan ikke leie mer enn %0% region(er) (du har allerede %1% i gruppe '%2%')."
"rent-maximumExtend": "Du kan ikke utvide denne leien fordi du har mer enn %0% region(er) (Du har allerede %1% i gruppe '%2%')."
"rent-payError": "Noe gikk galt med din betaling, prøv igjen senere."
"rent-rented": "Du leide %lang:region% frem til %until%, du kan utvide din leie ved å høyreklikke på skiltet igjen eller bruke /as rent."
"rent-extended": "Du utvidet din leie av %lang:region% frem til %until%."
"rent-extendedToMax": "Du har utvidet din leie av %lang:region% frem til %until% (som er den maksimale leietiden av %maxrenttime%)."
"rent-lowMoneyExtend": "Du har ikke nok penger til å utvide leien (du har %0% og du trenger %price%)."
"rent-lowMoneyRent": "Du har ikke nok penger til å leie (du har %0% og du trenger %price%)."
"rent-someoneElse": "Noen har allerede leid %lang:region%."
"rent-maxExtends": "Du kan ikke utvide leien mer (maksimum er %maxextends% ganger) men, når leien er over kan du leie %lang:region% igjen."
"rent-maxRentTime": "Du kan ikke øke leietid av %lang:region% mer tid fremover, den maksimale tiden er %maxrenttime% og du har leid den for %timeleft%."
"rent-restrictedToWorld": "Du må være i '%world%' verden for å leie %lang:region% (du er i '%0%')."
"rent-restrictedToRegion": "Du må være på innsiden av %lang:region% for å leie den."
"rent-expireWarning": "Din region %lang:region% har %timeleft% igjen, husk å utvide leien om du vil beholde den."
"rent-alreadyAtFull": "%lang:region% er allerede ved eller over den maksimale leietiden, du kan ikke utvide mer ennå."
"buy-help": "/as buy [region], regionen du står i vil bli brukt hvis ikke spesifisert."
"buy-noPermission": "Du har ikke rettigheter til å kjøpe en region."
"buy-noPermissionResell": "Du har ikke rettigheter til å kjøpe en region i videresalgs modus."
"buy-noPermissionNoResell": "Du har ikke rettigheter til å kjøpe en region som ikke er i videresalgs modus."
"buy-maximum": "Du kan ikke kjøpe mer enn %0% region(er) (du har allerede %1% i gruppe '%2%')."
"buy-payError": "Noe gikk galt med din betaling, prøv igjen senere."
"buy-succes": "Du var vellykket i ditt kjøp av %lang:region%."
"buy-successResale": "Du var vellykket i ditt kjøp av %lang:region% fra %lang:tPlayer|%0%|%."
"buy-successSeller": "Din region %lang:region% har blitt solgt til %lang:player% for %0%."
"buy-lowMoney": "Du har ikke nok penger til å kjøpe %lang:region% (du har %0% og du trenger %price%)."
"buy-lowMoneyResell": "Du har ikke nok penger til å kjøpe %lang:region% (du har %0% og du trenger %resellprice%)."
"buy-yours": "Du eier allerede %lang:region%."
"buy-someoneElse": "Noen andre har kjøpt %lang:region%."
"buy-restrictedToWorld": "Du må være i '%world%' verden for å kjøpe %lang:region% (du er i '%0%')."
"buy-restrictedToRegion": "Du må være på innsiden av %lang:region% for å kjøpe den."
"unrent-help": "/as unrent [region], regionen du står i vil bli bruk om ikke spesifisert."
"unrent-noPermission": "Du har ikke rettigheter til å stoppe leie på en region."
"unrent-noPermissionOther": "Du har ikke rettigheter til å stoppe leie på en annen region."
"unrent-notRegistered": "Denne regionen kan det ikke bli avsluttet leie på fordi den er ikke registrert for leie."
"unrent-notRented": "Denne regionen kan det ikke bli avsluttet leie på fordi den er ikke leid."
"unrent-unrented": "%lang:region% sin leie av %lang:player% har blitt avsluttet."
"unrent-expired": "Din leie av %lang:region% har gått ut."
"sell-help": "/as sell [region], regionen du står i vil bli brukt hvis ikke spesifisert."
"sell-notRegistered": "Denne regionen kan ikke bli solgt fordi den er ikke registrert for salg."
"sell-notBought": "Denne regionen kan ikke bli solgt fordi den er ikke noen sin eiendom."
"sell-sold": "%lang:region% til %lang:player% har blitt solgt."
"sell-noPermission": "Du har ikke rettigheter til å selge en region."
"sell-noPermissionOther": "Du har ikke rettigheter til å selge en annen region."
"reload-noPermission": "Du har ikke rettigheter til å laste inn konfigurasjonen på nytt."
"reload-updateCommandChanged": "'/as updaterents' og '/as updatebuys' har blitt fjernet, '/as reload' vil også oppdatere regioner så bruk den kommandoen fremover."
"info-noPermission": "Du har ikke rettigheter til å få informasjon om regioner."
"info-allHeader": "Alle regioner%0%:"
"info-rentedHeader": "Leide regioner%0%:"
"info-forrentHeader": "Regioner til leie%0%:"
"info-forsaleHeader": "Regioner til salgs%0%:"
"info-soldHeader": "Solgte regioner%0%:"
"info-resellingHeader": "Regioner til videresalg%0%:"
"info-nogroupHeader": "Regioner uten gruppe%0%:"
"info-limitedToGroup": " (begrenset til gruppe %0%)"
"info-nogroupNone": "Det er ingen regioner uten en gruppe."
"info-noFiltergroup": "Gruppe '%0%' eksiterer ikke og kan derfor ikke bli brukt til å begrense resultatene."
"info-noRegions": "Ingen regioner har blitt funnet."
"info-wrongPage": "%0% er ikke et riktig side nummer."
"info-pageNoPrevious":
- " [darkgray][bold]◄Forrige[/bold] "
- " hover: Dette er første side"
"info-pageNoNext":
- " [darkgray][bold]Neste►[/bold]"
- " hover: Dette er siste side"
"info-playerHelp": "/as info player <navn>."
"info-playerRents": "Regioner leid av %lang:tPlayer|%0%|%: [gray]%1%"
"info-playerNoRents": "%lang:tPlayer|%0%|% har ikke leid en region."
"info-playerBuys": "Regioner kjøpt av %lang:tPlayer|%0%|%: [gray]%1%."
"info-playerNoBuys": "%lang:tPlayer|%0%|% har ikke kjøpt en region."
"info-regionHelp": "/as info region [navn], den regionen du står i vil bli bruk om ikke spesifisert."
"info-regionHeaderRent": "[darkgreen]Informasjon om %lang:region%:"
"info-regionHeaderBuy": "[darkgreen]Informasjon om %lang:region%:"
"info-regionRented": "[darkgreen][bold]►[reset] Utleid til %lang:player% frem til: [gray]%until%."
"info-regionBought": "[darkgreen][bold]►[reset] Kjøpt av %lang:player%."
"info-regionReselling": "[darkgreen][bold]►[reset] Kjøpt av %lang:player%, for øyeblikket videreselges."
"info-regionExtending":
- "[darkgreen][bold]►[reset] "
- "[bold]Forleng for[/bold]"
- " hover: Forleng leie av %region%"
- " hover: med %duration% for %price%"
- " hover: %lang:action|Extend rent of %region%|%"
- " kommando: /areashop rent %region%"
- ": [gray]%price% per %duration%."
"info-regionCanBeRented":
- "[darkgreen][bold]►[reset] "
- "[bold]Lei for[/bold]"
- " hover: Lei %region% for %price% per %duration%"
- " hover: %lang:action|Rent %region%|%"
- " kommando: /areashop rent %region%"
- ": [gray]%price% per %duration%."
"info-regionCanBeBought":
- "[darkgreen][bold]►[reset] "
- "[bold]Kjøp for[/bold]"
- " hover: Kjøp %region% for %price%"
- " hover: %lang:action|Buy %region%|%"
- " kommando: /areashop buy %region%"
- ": [gray]%price%."
"info-regionReselPrice": "[darkgreen][bold]►[reset] Videresalgs pris: [gray]%resellprice% (du kan kjøpe den fra %lang:player%)."
"info-regionFriends": "[darkgreen][bold]►[reset] Venner lagt til: [gray]%0%."
"info-friend": "%lang:tPlayer|%0%|%"
"info-friendRemove":
- "%lang:info-friend|%0%|%"
- "[red]✕[gray]"
- " hover: Region %region%"
- " hover: %lang:action|Remove %0% as friend|%"
- " kommando: /areashop delfriend %0% %region%"
"info-regionMoneyBackBuy": "[darkgreen][bold]►[reset] Penger tilbake for salg: [gray]%moneyback% (%moneybackpercent%% av prisen)."
"info-regionMoneyBackBuyClick":
- "[darkgreen][bold]►[reset] "
- "[bold]Penger tilbake etter salg[/bold]"
- " hover: Selg %region% å få igjen %moneyback%"
- " hover: %lang:action|Sell %region%|%"
- " kommando: /areashop sell %region%"
- ": [gray]%moneyback% (%moneybackpercent%% av prisen)."
"info-regionMoneyBackRent": "[darkgreen][bold]►[reset] Penger tilbake fra leie: [gray]%moneyback% (%moneybackpercent%% fra gjenstående tid)."
"info-regionMoneyBackRentClick":
- "[darkgreen][bold]►[reset] "
- "[bold]Penger tilbake fra leie[/bold]"
- " hover: Stopp leie %region% å få tilbake %moneyback%"
- " hover: %lang:action|Unrent %region%|%"
- " kommando: /areashop unrent %region%"
- ": [gray]%moneyback% (%moneybackpercent%% av gjenstående tid)."
"info-regionMaxExtends": "[darkgreen][bold]►[reset] Maks antall utvidelser: [gray]%maxextends% gang(er)."
"info-regionNoExtending": "[darkgreen][bold]►[reset] Leien kan ikke utvides."
"info-regionExtendsLeft": "[darkgreen][bold]►[reset] Utvidelser igjen: [gray]%extendsleft% gang(er) av %maxextends%."
"info-regionMaxRentTime": "[darkgreen][bold]►[reset] Leie på forhånd: [gray]%maxrenttime% på maks."
"info-prefix": "[darkgreen][bold]►[reset] "
"info-regionTeleport":
- "[bold]Gå til region[/bold]"
- " hover: %lang:action|Teleporter to %region%|%"
- " kommando: /areashop tp %region%"
"info-setRegionTeleport":
- "[bold]Sett teleporterings posisjon[/bold]"
- " hover: %region%"
- " hover: %lang:action|Sett teleporterings posisjon|%"
- " kommando: /areashop settp %region%"
"info-regionSigns": "[darkgreen][bold]►[reset] Koblete skilt: [gray]%0%."
"info-regionSignLocation": "[gray](%0%, %1%, %2%, %3%)[reset]"
"info-regionGroups": "[darkgreen][bold]►[reset] Fordelte grupper: [gray]%0%."
"info-regionInactiveUnrent": "[darkgreen][bold]►[reset] Automatisk stopp leie etter: [gray]%inactivetime% av inaktivitet fra spiller."
"info-regionInactiveSell": "[darkgreen][bold]►[reset] Automatisk selg etter: [gray]%inactivetime% av inaktivitet fra spiller."
"info-regionRestrictedRegionRent": "[darkgreen][bold]►[reset] Du må stå på innsiden av %lang:region% for å leie den."
"info-regionRestrictedWorldRent": "[darkgreen][bold]►[reset] Du må være i '%world%' for å leie %lang:region%."
"info-regionRestrictedRegionBuy": "[darkgreen][bold]►[reset] Du må være på innsiden av %lang:region% for å kjøpe den."
"info-regionRestrictedWorldBuy": "[darkgreen][bold]►[reset] Du må være i '%world%' for å kjøpe %lang:region%."
"info-regionLandlord": "[darkgreen][bold]►[reset] Grunneier: [gray]%lang:landlord% (mottar pengene)."
"info-regionNotExisting": "Den spesifiserte regionen er ikke registrert: %0%."
"setrestore-help": "/as setrestore <region> <true|false|general> [profile]."
"setrestore-noPermission": "Du har ikke rettigheter til å endre gjenopprettelses instillingene."
"setrestore-notRegistered": "Den spesifiserte regionen er ikke registrert: %0%."
"setrestore-invalidSetting": "'%0%' er ikke gyldig uttrykk, skal være true, false eller general."
"setrestore-success": "Vellykket satt innstillingene for gjenoppretting for %lang:region% til '%0%'."
"setrestore-successProfile": "Vellykket satt innstillingene for gjenoppretting for %lang:region% til '%0%' og profilen til '%1%'."
"setprice-noPermission": "Du har ikke rettighetene til å endre prisen til en region."
"setprice-help": "/as setprice <pris> [region], den regionen du står i vil bli valgt om ikke spesifisert."
"setprice-notRegistered": "Den spesifiserte regionen er ikke registrert: %0%."
"setprice-wrongPrice": "'%0%' er ikke en gyldig pris."
"setprice-successRent": "Prisen til region %lang:region% er endret til %price% per %duration%."
"setprice-successBuy": "Prisen til region %lang:region% er endret til %price%."
"setprice-successRemoved": "Prisen til %lang:region% har blitt fjernet, den vil nå bruke prisen fra en gruppe eller fra default.yml filen, ny pris: %price%."
"setprice-noLandlord": "Du har ikke rettigheter til å endre prisen fordi du er ikke eieren av %lang:region%."
"setduration-noPermission": "Du har ikke rettigheter til å endre tidsrommet for en leie."
"setduration-help": "/as setduration <mengde> <identifisering> [region], regionen du står i vil bli brukt om ikke spesifisert."
"setduration-notRegistered": "%0% er ikke registrert for leie."
"setduration-wrongAmount": "'%0%' er ikke gyldig, bruk hele nummer."
"setduration-wrongFormat": "'%0%' er ikke et riktig tidsformat, sjekk dokumentasjonen på Bukkit."
"setduration-success": "Tiden til region %lang:region% er endret til '%duration%'."
"setduration-noLandlord": "Du har ikke rettigheter til å endre tiden fordi du er ikke eieren av %lang:region%."
"setduration-successRemoved": "Prisen til %lang:region% har blitt fjernet, den vil nå bruke prisen fra en gruppe eller fra default.yml filen, ny pris: %price%."
"setup-noRegion": "Du spesifiserte ikke en region på linje nummer to."
"setup-alreadyRentSign": "Regionen du spesifiserte er allerede lagt til i AreaShop som en leie region, plasser et skilt med [as] på første linjen eller bruk '/as addsign'."
"setup-alreadyBuySign": "Regionen du spesifiserte er allerede lagt til i AreaShop som en kjøp region, plasser et skilt med [as] på første linjen eller bruk '/as addsign'."
"setup-noDuration": "Du spesifiserte ikke hvor lenge den regionen kan bli leid, gjør dette på den tredje linjen."
"setup-wrongDuration": "Tiden du spesifiserte er ikke i korrekt format, eksempel: 1 dag."
"setup-noPrice": "Du spesifiserte ikke prisen på den fjerde linjen."
"setup-wrongPrice": "Du spesifiserte ikke prisen riktig, bare bruk nummer."
"setup-rentSuccess": "leie av region %lang:region% er satt opp riktig."
"setup-buySuccess": "Salg av region %lang:region% er satt opp riktig."
"setup-noPermissionRent": "Du har ikke rettigheter til å sette opp leie regioner."
"setup-noPermissionBuy": "Du har ikke rettigheter til å sette opp regioner til salgs."
"setup-couldNotDetect": "Fant flere regioner med samme prioritet og/eller foreldre/barn kobling, spesifiser en på den andre linjen (2 av regionene som ble funnet: %lang:tRegion|%0%|% og %lang:tRegion|%1%|%)."
"setup-blacklisted": "%0% er på svartelisten og kan ikke bli lagt til i AreaShop."
"setup-noPermission": "Du kan ikke legge til regionen '%0%', du er ikke en eier/medlem eller har ikke rettigheter til det."
"destroy-noPermissionRent": "Du har ikke rettigheter til å avregistrere en leie region."
"destroy-noPermissionBuy": "Du har ikke rettigheter til å avregistrere en kjøpe region."
"destroy-successRent": "%lang:region% vellykket i å avregistrere en leie region."
"destroy-successBuy": "%lang:region% vellykket i å avregistrere en kjøpe region."
"teleport-help": "/as tp <region> [skilt]"
"teleport-noRentOrBuy": "Den spesifiserte regionen er ikke registrert: %0%."
"teleport-noPermission": "Du har ikke rettigheter til å teleportere til din region."
"teleport-noPermissionOther": "Du har ikke rettigheter til å teleportere til regioner du ikke eier."
"teleport-noPermissionSign": "Du har ikke rettigheter til å teleportere til skiltet til din region."
"teleport-noPermissionOtherSign": "Du har ikke rettigheter til å teleportere til skiltet til regioner du ikke eier."
"teleport-noPermissionFriend": "Du har ikke rettigheter til å teleportere til regioner du er langt til som venn."
"teleport-noPermissionFriendSign": "Du har ikke rettigheter til å teleportere til skiltet til regioner du er lagt til som venn."
"teleport-success": "Du teleporterte til %lang:region%."
"teleport-successSign": "Du teleporterte til skiltet til %lang:region%."
"teleport-noSafe": "Ingen trygg posisjon funnet i %lang:region%, ingen plasser igjen i regionen eller maks forsøk overskredet (%0%/%1%)."
"teleport-blocked": "Du kan ikke teleportere fordi posisjonen er på utsiden av regionen, og du er tvunget til å teleportere til innsiden."
"teleport-changedToSign": "Du har bare rettigheter til å teleportere til skilt og ikke utsiden av regionen, teleporterer til skilt."
"teleport-changedToNoSign": "Ingen skilt tilgjengelige å teleportere til, prøver å teleportere til innsiden av regionen."
"setteleport-help": "/as settp [region] [reset], den regionen du står i vil bli brukt om ikke spesifisert."
"setteleport-noPermission": "Du har ikke rettigheter til å sette teleporterings punkt."
"setteleport-noPermissionOther": "Du har ikke rettigheter til å sette teleporterings punktet for en region du ikke eier."
"setteleport-noRentOrBuy": "Den spesifiserte regionen er ikke registrert: %0%."
"setteleport-success": "Teleporterings posisjon for %lang:region% satt."
"setteleport-notInside": "Punktet må være på innsiden av regionen."
"setteleport-reset": "Teleporterings posisjon for %lang:region% har blitt resatt."
"find-help": "/as find <buy|rent> [maxpris] [gruppe]."
"find-noPermission": "Du har ikke rettigheter til å søke etter regioner og teleportere til dem."
"find-success": "Fant en %0% region: %lang:region%, under søket med en makspris av din balanse: %1%%2%."
"find-successMax": "Fant en %0% region: %lang:region%, under søket med en makspris av: %1%%2%."
"find-wrongMaxPrice": "Den spesifiserte maks prisen er ikke et korrekt nummer. %0%"
"find-wrongGroup": "Den spesifiserte gruppen eksisterer ikke: %0%."
"find-noneFound": "Ingen %0% region funnet under søket med en makspris av din balanse: %1%%2%."
"find-noneFoundMax": "Ingen %0% region ble funnet under søket med en maks pris av %1%%2%."
"find-onlyInGroup": ", bare søkt etter regioner i gruppe: %0%."
"groupadd-help": "/as groupadd <gruppe> [region], hvis ingen region er spesifisert blir alle regioner fra din WorldEdit markering brukt."
"groupadd-noPermission": "Du har ikke rettigheter til å legge til regioner i grupper."
"groupadd-success": "Region %lang:region% har blitt lagt til i gruppe '%0%', denne gruppen har nå %1% medlem(mer)."
"groupadd-failed": "Region %lang:region% er allerede et medlem av gruppe '%0%'."
"groupadd-weSuccess": "Lagt til i gruppe %0%: [gray]%1%."
"groupadd-weFailed": "Var allerede i gruppe %0%: [gray]%1%."
"groupdel-help": "/as groupdel <gruppe> [region], hvis ingen region er spesifisert blir alle regioner fra din WorldEdit markering brukt."
"groupdel-noPermission": "Du har ikke rettigheter til å fjerne regioner fra grupper."
"groupdel-success": "Region %lang:region% har blitt fjernet fra gruppe '%0%', denne gruppen har nå %1% medlem(mer)."
"groupdel-failed": "Region %lang:region% er ikke et medlem av gruppe '%0%'."
"groupdel-weSuccess": "Fjernet fra gruppe %0%: [gray]%1%."
"groupdel-weFailed": "Var ikke i gruppe %0% likevel: [gray]%1%."
"grouplist-noPermission": "Du har ikke rettigheter til å vise de registrerte gruppene."
"grouplist-noGroups": "Det er for øyeblikket ingen grupper registrert."
"grouplist-success": "De følgende gruppene er registrert: [gray]%0%."
"groupinfo-help": "/as groupinfo <group>."
"groupinfo-noPermission": "Du har ikke rettigheter til å se informasjon om en gruppe."
"groupinfo-noGroup": "Det er ingen grupper registrert med navnet '%0%'. bruk /as grouplist for å sjekke grupper."
"groupinfo-members": "De følgende regionene er medlemmer av gruppe %0%: [gray]%1%."
"groupinfo-noMembers": "Gruppe %0% har ingen medlemmer."
"schemevent-help": "/as schemevent <region> <created|deleted|rented|unrented|bought|sold>."
"schemevent-wrongEvent": "Det spesifiserte eventet '%0%' eksisterer ikke, bruk en av de følgende [gray]%1%."
"schemevent-success": "Event '%0%' har blitt aktivert vellykket for region %lang:region%."
"schemevent-noPermission": "Du har ikke rettigheter til å aktivere et schematic event."
"add-help": "/as add <rent|buy> [region] [verden]."
"add-noPermission": "Du har ikke rettigheter til å legge til en region i AreaShop."
"add-success": "Lagt til som %0%: [gray]%1%."
"add-failed": "Allerede registrert: [gray]%0%."
"add-blacklisted": "På svartelisten: [gray]%0%."
"add-specifyWorld": "Spesifiser verdenen til en region når du bruker konsoll."
"add-incorrectWorld": "Verden '%0%' ikke funnet, prøv igjen (sensitiv for store og små bokstaver)."
"add-noPermissionRegions": "Ingen rettigheter til å legge til: [gray]%0%."
"add-noPermissionOwnerMember": "[gray]Du er enten ikke et medlem/eier av disse regionene eller har ikke rettigheter til å legge til dine regioner."
"del-noPermission": "Du har ikke rettigheter til å fjerne regioner."
"del-success": "Fjernet regioner: [gray]%0%."
"del-failed": "Du har ikke rettigheter til å fjerne eller ikke registrert: [gray]%0%."
"addsign-help": "/as addsign [region] [profil]."
"addsign-noSign": "Du ser ikke på et skilt."
"addsign-noRegions": "Ingen region funnet rundt skiltet sin posisjon."
"addsign-couldNotDetect": "Flere regioner ble funnet rundt skiltet, spesifiser region som ekstra argument (2 av regionene som ble funnet: %lang:tRegion|%0%|% og %lang:tRegion|%1%|%)."
"addsign-couldNotDetectSign": "Flere regioner ble funnet rundt skiltet, spesifiser region som ekstra argument (2 av regionene som ble funnet: %lang:tRegion|%0%|% og %lang:tRegion|%1%|%)."
"addsign-wrongProfile": "Den spesifiserte profilen finnes ikke, bruk en av de følgende (sjekk konfigurasjon): [gray]%0%."
"addsign-profile":
- "[bold]%0%[/bold]"
- " hover: Skiltprofil %0%"
- " hover: %lang:action|Use this profile|%"
- " kommando: /areashop linksigns %0%"
"addsign-success": "Skiltet har blitt lagt til %lang:region%."
"addsign-successProfile": "Skiltet har blitt lagt til %lang:region% med profil %0%."
"addsign-alreadyRegistered": "Det skiltet er allerede registrert for region %lang:region%."
"addsign-noPermission": "Du har ikke rettigheter til å legge til et skilt."
"delsign-noSign": "Du ser ikke på et skilt."
"delsign-noPermission": "Du har ikke rettigheter til å fjerne et skilt."
"delsign-noRegion": "Det skiltet hører ikke til en AreaShop region."
"delsign-success": "Skiltet har blitt fjernet fra region %land:region%."
"me-noPermission": "Du har ikke rettigheter til å sjekke hvilken regioner du har."
"me-header": "Regioner til %lang:tPlayer|%0%|%:"
"me-notAPlayer": "Du er ikke en spiller så du kan ikke ha noen regioner."
"me-buyLine": "[darkgreen][bold]►[reset] %lang:region%."
"me-nothing": "%lang:tPlayer|%0%|% har ikke leid eller kjøpt regioner og er ikke lagt til som venn på noen."
"me-noPlayer": "%0% kan ikke bli funnet, mest sannsynlig aldri vært på serveren."
"setowner-help": "/as setowner <spiller> [region], regionen du står i vil bli brukt om ikke spesifisert."
"setowner-noPermission": "Du har ikke rettigheter til å sette eieren av en region."
"setowner-noPermissionRent": "Du har ikke rettigheter til å sette eieren av en leie region."
"setowner-noPermissionBuy": "Du har ikke rettigheter til å sette eieren av en kjøpe region."
"setowner-notRegistered": "Den spesifiserte regionen er ikke registrert, eier kan ikke bli satt."
"setowner-noPlayer": "Kunne ikke skaffe UUID til den spesifiserte spilleren: %0%."
"setowner-succesRent": "Eier av %lang:region% vellykket endret til %lang:player%, leid frem til %until% (%timeleft% igjen)"
"setowner-succesRentExtend": "Eier var allerede %lang:player%, leie utvidet med '%duration%', nå leid frem til %until% (%timeleft% igjen)."
"setowner-succesBuy": "Eier av %lang:region% vellykket endret til %lang:player%."
"resell-help": "/as resell <pris> [region], regionen du står i vil bli brukt om ikke spesifisert."
"resell-wrongPrice": "'%0%' er ikke en gyldig pris."
"resell-notRegistered": "Den spesifiserte regionen er ikke registrert: %0%."
"resell-notBought": "Du kan ikke videreselge %lang:region% fordi den er ikke solgt ennå."
"resell-success": "%lang:region% er vellykket satt i videresalgsmodus for %resellprice%."
"resell-noPermission": "Du har ikke rettigheter til å sette din region i videresalgs modus."
"resell-noPermissionOther": "Du har ikke rettigheter til å sette en region i videresalgs modus."
"stopresell-help": "/as stopresell [region], regionen du står i vil bli brukt om ikke spesifisert."
"stopresell-notRegistered": "Den spesifiserte regionen er ikke registrert: %0%."
"stopresell-notResell": "Du kan ikke stoppe videresalget av %lang:region% fordi den er ikke i videresalgs modus."
"stopresell-success": "%lang:region% er vellykket satt tilbake i solgt modus."
"stopresell-noPermission": "Du har ikke rettigheter til å sette din region tilbake i solgt modus."
"stopresell-noPermissionOther": "Du har ikke rettigheter til å sette regioner tilbake i solgt modus."
"addfriend-help": "/as addfriend <spiller> [region], regionen du står i vil bli brukt om ikke spesifisert."
"addfriend-noPermissionOther": "Du har ikke rettigheter til å legge til venner i regioner som ikke er dine."
"addfriend-noPermission": "Du har ikke rettigheter til å legge til venner i din region."
"addfriend-successOther": "%lang:tPlayer|%0%|% har blitt lagt til som venn i region %lang:region%."
"addfriend-success": "%lang:tPlayer|%0%|% har blitt lagt til som venn i din region %lang:region%."
"addfriend-alreadyAdded": "%lang:tPlayer|%0%|% er allerede lagt til som venn i %lang:region%."
"addfriend-self": "Å legge til eieren av regionen som venn vil være meningsløst."
"addfriend-noOwner": "Du kan ikke legge til venner i en region uten eier."
"addfriend-notVisited": "Du kan ikke legge til %0% fordi h*n har ikke vært på serveren ennå."
"delfriend-help": "/as delfriend <spiller> [region], regionen du står i vil bli brukt om ikke spesifisert."
"delfriend-noPermissionOther": "Du har ikke rettigheter til å fjerne venner fra regioner som ikke er dine."
"delfriend-noPermission": "Du har ikke rettigheter til å fjerne venner fra din region."
"delfriend-successOther": "%lang:tPlayer|%0%|% har blitt fjernet som venn fra region %lang:region%."
"delfriend-success": "%lang:tPlayer|%0%|% har blitt fjernet som venn fra din region %lang:region%."
"delfriend-noOwner": "Du kan ikke fjerne venner fra en region uten eier."
"linksigns-multipleRegions": "Fant flere regioner: [gray]%0%."
"linksigns-multipleRegionsAdvice": "Klikk en gang til for å prøve igjen eller bruk '/as linksigns' for å stoppe."
"linksigns-noRegions": "Ingen AreaShop regioner funnet i rettningen du peker, vær sikker på at regionen er lagt til i AreaShop [gray](maksimal avstand 100 blokker)."
"linksigns-regionFound": "Region %lang:region% har blitt funnet, nå pek på et skilt og venstreklikk for å koble sammen."
"linksigns-signFound": "Fant et skilt ved (%0%, %1%, %2%), nå pek mot en region og høyreklikk for å koble sammen."
"linksigns-noSign": "Ingen skilt funnet i rettningen du peker, vær sikker på at du har en ublokkert vei mot et skilt og klikk igjen [gray](maksimal avstand 100 blokker)."
"linksigns-alreadyRegistered": "Det skiltet er allerede registrert til region %lang:region%, klikk igjen for å velge et annet skilt."
"linksigns-first": "Du har aktivert skilt koblings modus."
"linksigns-next": "[gray]Ventstreklikk for å velge et skilt, høyreklikk for å velge en region, bruk /as linksigns for å stoppe."
"linksigns-noPermission": "Du har ikke rettigheter til å aktivere masse-skilt koblings modus."
"linksigns-stopped": "Gått ut av skilt koblings modus."
"stack-help":
- "/as stack <amount> <gap> <name> <rent|buy> [group].[break]"
- " [gray]<amount> Antall regioner som vil bli laget.[break]"
- " [gray]<gap> Antall blokker mellom regioner.[break]"
- " [gray]<name> Navnet på regioner (nummer kommer bak).[break]"
- " [gray]<rent|buy> Bestem om dem skal leies eller kjøpes.[break]"
- " [gray][group] En gruppe du vil legge dem til i.[break]"
- " [gray]Regionene vil bli laget i rettningen du ser."
"stack-accepted": "Begynner å lage %0% %1% regioner med %2% blokker mellom dem, navnene starter med %3% og vil ha nummer bak seg.%4%"
"stack-addToGroup": "Regioner laget vil bli lagt til i gruppen '%0%'."
"stack-noPermission": "Du har ikke rettigheter til å lage og legge til regioner i AreaShop i store mengder."
"stack-wrongAmount": "'%0%' er ikke en riktig mengde regioner."
"stack-wrongGap": "'%0%' er ikke et riktig nummer for antall blokker mellom regioner."
"stack-noSelection": "Du har ikke laget en markering som indikerer hvor den første regionen skal bli laget."
"stack-addStart": "[gray]Legger til %0% regioner på %1% per sekund."
"setlandlord-help": "/as setlandlord <spiller> [region], regionen du står i vil bli brukt om ikke spesifisert."
"setlandlord-noPermission": "Du har ikke rettigheter til å sette grunneier for en region."
"setlandlord-success": "%lang:landlord% har vellykket blitt satt som grunneier av %lang:region%."
"message-help": "/as message <spiller> <melding...>"
"message-noPermission": "Du har ikke rettigheter til å sende AreaShop meldinger."
"message-notOnline": "%0% er ikke pålogget."
"confirm-rent":
- "%lang:prefix%Er du sikker på at du vil leie %lang:tRegion|%0%|%?[break]"
- "[darkgreen][bold]►[reset] %lang:button|Klikk for å leie %0%|%"
- " hover: %lang:action|Lei %0%|%"
- " kommando: /areashop rent %0%"
"confirm-extend":
- "%lang:prefix%Er du sikker du vil forlenge %lang:tRegion|%0%|%?[break]"
- "[darkgreen][bold]►[reset] %lang:button|Klikk for å utvide leie %0%|%"
- " hover: %lang:action|Utvid leie %0%|%"
- " kommando: /areashop rent %0%"
"confirm-unrent":
- "%lang:prefix%Er du sikker du vil stoppe leie "
- "%lang:tRegion|%0%|%?[break]"
- "[darkgreen][bold]►[reset] %lang:button|Klikk for å stoppe leie %0%|%"
- " hover: %lang:action|Stopp leie %0%|%"
- " kommando: /areashop unrent %0%"
"confirm-buy":
- "%lang:prefix%Er du sikker du vil kjøpe %lang:tRegion|%0%|%?[break]"
- "[darkgreen][bold]►[reset] %lang:button|Klikk for å kjøpe %0%|%"
- " hover: %lang:action|Kjøp %0%|%"
- " kommando: /areashop buy %0%"
"confirm-sell":
- "%lang:prefix%Er du sikker du vil selge %lang:tRegion|%0%|%?[break]"
- "[darkgreen][bold]►[reset] %lang:button|Klikk for å selge %0%|%"
- " hover: %lang:action|Selg %0%|%"
- " kommando: /areashop sell %0%"
"timeleft-years": "%0% år"
"timeleft-months": "%0% måneder"
"timeleft-days": "%0% dager"
"timeleft-hours": "%0% timer"
"timeleft-minutes": "%0% minutter"
"timeleft-second": "%0% sekund"
"timeleft-seconds": "%0% sekunder"
"timeleft-ended": "Utløpt"
"greeting-forrent": "%region% kan bli leid for %price% per %duration%."
"greeting-rented": "%region% er leid av %player% til %until%."
"greeting-forsale": "%region% kan bli kjøpt for %price%."
"greeting-bought": "%region% er kjøpt av %player%."
Loaded 100 of 167 files, more files were not shown because too many files have changed in this diff. Show more