Compare commits
201 Commits
Author | SHA1 | Date |
---|---|---|
Johan | af02eb3f14 | |
Max Lee | 7dbc1ad5d3 | |
Phoenix616 | 9f4037c312 | |
Phoenix616 | b6b7a6bf43 | |
Phoenix616 | 60b10a83b6 | |
Phoenix616 | b54824052d | |
Johanmans10 | 8a26b15ea9 | |
Phoenix616 | 09170f6d51 | |
Phoenix616 | 488cd2e9d5 | |
Phoenix616 | 46d4f583ba | |
Phoenix616 | 7a73d66939 | |
Phoenix616 | 6f5b56d20a | |
Phoenix616 | b386cacb5e | |
Phoenix616 | df17fe7483 | |
Phoenix616 | d3f8abb80e | |
Phoenix616 | 2388da62a5 | |
Phoenix616 | 53aa75d9b4 | |
Phoenix616 | a413e86ccf | |
Phoenix616 | 0fcbcbbb11 | |
Phoenix616 | a9cb8096e6 | |
Phoenix616 | 17bd2a1fcb | |
Phoenix616 | d426492561 | |
Joo200 | f3cf4cd96e | |
Phoenix616 | 9bbd6028d0 | |
Phoenix616 | 2b36b7314f | |
Phoenix616 | 0b8fe80443 | |
Phoenix616 | 3ef02d05cd | |
Phoenix616 | 3a1885e2f3 | |
Phoenix616 | 54cc1ce842 | |
Phoenix616 | dc6aa21a91 | |
Phoenix616 | 6ba8e092b8 | |
Phoenix616 | 97ffc31d2b | |
Phoenix616 | ed642ccf3c | |
Phoenix616 | 999f596125 | |
Phoenix616 | 30ff61d14f | |
Phoenix616 | 978f1270f5 | |
Phoenix616 | 7203ec17cd | |
Max Lee | 6602be68e3 | |
Krakenied | 2fb82a2529 | |
Phoenix616 | 05ebe2d054 | |
Phoenix616 | 013a21159f | |
Phoenix616 | d52c329618 | |
Phoenix616 | b425dfb69f | |
Phoenix616 | 0a16ec1d08 | |
Phoenix616 | 362dd856d3 | |
Phoenix616 | 385672ecd4 | |
Phoenix616 | 92a013dd10 | |
Phoenix616 | 7a09c53bde | |
Phoenix616 | 93f14a330d | |
Phoenix616 | 199573df59 | |
Phoenix616 | a38f309453 | |
Phoenix616 | 02ef09c586 | |
Phoenix616 | aa7bfbb7ee | |
Phoenix616 | 7d92cb820d | |
Phoenix616 | 4de1f1e8c5 | |
Phoenix616 | 7ee8d07242 | |
Phoenix616 | 37c7b97fe8 | |
Phoenix616 | 0d8d37eb85 | |
Phoenix616 | e6a2d2f1c5 | |
Phoenix616 | ada8cf3ae8 | |
Phoenix616 | fbfe789bfa | |
Phoenix616 | f547995164 | |
Phoenix616 | d6673c8afd | |
Phoenix616 | f0661656a0 | |
Phoenix616 | 967a315ff8 | |
Phoenix616 | 59e82c7078 | |
Phoenix616 | 236c4b1b37 | |
Phoenix616 | 32879ad3cd | |
Phoenix616 | c15afb4d0b | |
Phoenix616 | 852f20a50e | |
Phoenix616 | e3ab44ae32 | |
Phoenix616 | 9233064273 | |
Phoenix616 | 93e2895645 | |
Phoenix616 | e99ae1eb1e | |
Felipe Foschiera | 9842f47f37 | |
Max Lee | 34df7e368a | |
Jonathan Leitschuh | 5066a21a5f | |
Phoenix616 | da3928b723 | |
Phoenix616 | d0af977212 | |
Phoenix616 | e3cd50cf75 | |
Phoenix616 | a78b925181 | |
Phoenix616 | 5b712f9ed5 | |
Phoenix616 | c54ed6b2f5 | |
Max Lee | f57d1b04a2 | |
Max Lee | 6b372883ac | |
Krakenied | fd969cd996 | |
Phoenix616 | fd0035a99c | |
Phoenix616 | 4285358910 | |
Phoenix616 | dc731919e3 | |
Phoenix616 | a112c50d55 | |
Phoenix616 | 4c7b018f8c | |
Krakenied | 2ebc2f285b | |
Phoenix616 | e40b5567b8 | |
Phoenix616 | 419527efaa | |
Phoenix616 | 99a609b423 | |
jeffry1829 | 5ec2ab61e5 | |
Phoenix616 | d1bbcfce47 | |
Phoenix616 | fa924f0212 | |
Phoenix616 | f9a0bf90a3 | |
Phoenix616 | 02dd167024 | |
Phoenix616 | 8655870077 | |
Phoenix616 | 01b7cddaa3 | |
Phoenix616 | 6962ae2590 | |
Phoenix616 | 03317c2c78 | |
Max Lee | a84cd7a2aa | |
TreyRuffy | bb7bd3415c | |
Phoenix616 | 4f8e7938e2 | |
Phoenix616 | 986a22fb73 | |
Phoenix616 | f7aa80e566 | |
Phoenix616 | d193812392 | |
Phoenix616 | 13b727c779 | |
Phoenix616 | 129663650f | |
Phoenix616 | d3cb06acc0 | |
Phoenix616 | 965d931978 | |
Phoenix616 | 1b85bda656 | |
Phoenix616 | 42a7cc4789 | |
Phoenix616 | a549b4ef51 | |
Phoenix616 | 988420992c | |
Phoenix616 | df2e4394c4 | |
Phoenix616 | 63f68d5444 | |
Phoenix616 | 6f4be10065 | |
Phoenix616 | 8cb78165a3 | |
Max Lee | 3cc219e86b | |
Phoenix616 | 052560393c | |
Phoenix616 | 2545b95d54 | |
Phoenix616 | f825995a85 | |
Phoenix616 | 2be9207faa | |
Phoenix616 | 5b214e09f5 | |
Phoenix616 | d3ed650b74 | |
Phoenix616 | c9b8e136d1 | |
Phoenix616 | ca25dca6b0 | |
Phoenix616 | b09a1255a7 | |
Phoenix616 | b8899c8333 | |
Phoenix616 | 07a22fa534 | |
Phoenix616 | 4172d8d484 | |
Phoenix616 | 02cd9d4ec0 | |
Phoenix616 | 0c51af6b45 | |
Phoenix616 | 76e3f5b3c8 | |
Phoenix616 | 66201a9062 | |
Phoenix616 | ce7cade0a5 | |
Phoenix616 | b93361cd07 | |
Phoenix616 | a3c5ec618a | |
Daniel B | f68a3203ac | |
Rutger Kok | e6b05ff982 | |
Phoenix616 | aadfaff397 | |
Phoenix616 | 227e3e77f0 | |
Phoenix616 | 7b2fe6c1f3 | |
Phoenix616 | 68c9df2078 | |
Phoenix616 | 3ec68dcd50 | |
Phoenix616 | ebdebb81df | |
Phoenix616 | 2f0e7b81a8 | |
Phoenix616 | 320d9ad9fb | |
Phoenix616 | 65df4c40c6 | |
Phoenix616 | 22d3f262f5 | |
Phoenix616 | ba47b82ba1 | |
Phoenix616 | 9843e92525 | |
Phoenix616 | 71e8ef732f | |
Phoenix616 | 66eaab7c4d | |
Phoenix616 | 0d6f588e45 | |
Phoenix616 | f12e6ed3b6 | |
Phoenix616 | 819f028774 | |
Phoenix616 | b774258051 | |
Phoenix616 | 9dce41aa30 | |
Max Lee | 4c44e49c54 | |
Phoenix616 | 395f0513a6 | |
Phoenix616 | 4e40823d23 | |
Phoenix616 | af32b041ff | |
Phoenix616 | 51e9d5f267 | |
Phoenix616 | 8aff3da550 | |
Phoenix616 | fd81bc143e | |
Phoenix616 | 9bf6e1abc1 | |
Phoenix616 | 00fa83c56a | |
Phoenix616 | cbb605df81 | |
Phoenix616 | 4bd443c69f | |
Phoenix616 | 7a1c091c74 | |
Phoenix616 | b43454531e | |
Phoenix616 | 9a08e8897b | |
Phoenix616 | f0bf9a08ec | |
Phoenix616 | 717dcc8d9d | |
Daniel Dušek | c7b07e04d2 | |
Brice Frisco | 8d98958c2d | |
dependabot[bot] | 15b9382b09 | |
Phoenix616 | a14aaa7235 | |
Phoenix616 | 9dd56385eb | |
Phoenix616 | de14a1affb | |
Corey Shupe | 282c39c975 | |
Phoenix616 | 741a10cb95 | |
Phoenix616 | ea5318dcf1 | |
Phoenix616 | b02cc9f909 | |
Phoenix616 | 5f40273756 | |
Phoenix616 | 89ba3d0559 | |
Phoenix616 | 5bc23214e0 | |
Phoenix616 | 6a34054bc7 | |
Phoenix616 | d1f6b1616b | |
Phoenix616 | 8c1c80e138 | |
Phoenix616 | efe9ff7024 | |
Phoenix616 | 742f838f09 | |
Phoenix616 | 98985efd63 | |
Phoenix616 | 9cbf33f68f | |
Phoenix616 | 493784c2dd | |
Phoenix616 | 18c3f8f5ef |
|
@ -0,0 +1,8 @@
|
|||
files:
|
||||
- source: /src/main/resources/languages/lang.en.yml
|
||||
translation: /src/main/resources/languages/lang.%two_letters_code%.yml
|
||||
languages_mapping:
|
||||
two_letters_code:
|
||||
zh-TW: zh_TW
|
||||
pt-BR: pt_BR
|
||||
es-MX: es_MX
|
|
@ -1,5 +1,6 @@
|
|||
# These are supported funding model platforms
|
||||
|
||||
github: Phoenix616
|
||||
custom: ['https://s.moep.tv/chestshop-github-paypal', 'https://phoenix616.dev/tip']
|
||||
patreon: Phoenix616
|
||||
custom: ['https://acrobot-paypal.phoenix616.dev', 'https://tip.phoenix616.dev']
|
||||
issuehunt: ChestShop-authors/ChestShop-3
|
||||
ko_fi: Phoenix616
|
||||
|
|
|
@ -1,34 +0,0 @@
|
|||
---
|
||||
name: Bug report
|
||||
about: An error that happens in the plugin.
|
||||
title: ''
|
||||
labels: ''
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
#### Plugin Version
|
||||
[The full plugin version that you are running from /version ChestShop]
|
||||
|
||||
#### Plugin Config
|
||||
[The full config.yml file of ChestShop]
|
||||
|
||||
#### Server Version
|
||||
[The full server version that you are running from /version]
|
||||
|
||||
#### Server Log
|
||||
[The full latest.log file, especially important if you have a stack trace]
|
||||
|
||||
#### What other plugins are you running?
|
||||
[List of your plugins, ideally with the version]
|
||||
|
||||
#### What is happening?
|
||||
[Explain what happens and what steps should be done to reproduce the issue. Ideally with pictures and the full error log!]
|
||||
|
||||
#### What did you expect to happen?
|
||||
[Explain what you expected to happen after performing the previously described steps]
|
||||
|
||||
### Additional context
|
||||
[Add any other context or screenshots about the feature request here.]
|
||||
|
||||
[And Delete the lines in square brackets!]
|
|
@ -0,0 +1,89 @@
|
|||
name: Bug report
|
||||
description: Report an error that happens in the plugin.
|
||||
labels: []
|
||||
body:
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: >
|
||||
Please check if there are already similar issues open, also please test if your issue
|
||||
isn't already fixed by trying the latest development build: https://ci.minebench.de/job/ChestShop-3/
|
||||
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: What is happening?
|
||||
description: Explain what happens and what steps should be done to reproduce the issue. Ideally with pictures and the full error log!
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: What did you expect to happen?
|
||||
description: Explain what you expected to happen after performing the previously described steps
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: input
|
||||
attributes:
|
||||
label: Plugin Version
|
||||
description: The full plugin version that you are running from `/version ChestShop`
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: Plugin Config
|
||||
description: The full `config.yml` file of ChestShop.
|
||||
value: |
|
||||
<details>
|
||||
<summary>Config</summary>
|
||||
|
||||
```yaml
|
||||
[Put the config here]
|
||||
```
|
||||
|
||||
</details>
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: input
|
||||
attributes:
|
||||
label: Server Version
|
||||
description: The full server version that you are running from `/version`.
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: Server Log
|
||||
description: The full `latest.log` file, especially important if you have a stack trace
|
||||
value: |
|
||||
<details>
|
||||
<summary>Log</summary>
|
||||
|
||||
```
|
||||
[Your log here]
|
||||
```
|
||||
|
||||
</details>
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: What other plugins are you running?
|
||||
description: List of your plugins, ideally with the version
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: checkboxes
|
||||
attributes:
|
||||
label: Agreements
|
||||
description: Please agree to the following.
|
||||
options:
|
||||
- label: I have checked if there are already similar issues open.
|
||||
- label: I am running the latest development version available from https://ci.minebench.de/job/ChestShop-3/.
|
||||
- label: The version [has support](https://github.com/ChestShop-authors/ChestShop-3/security/policy#supported-versions) for this type of issue.
|
||||
- label: I have provided all requested information and agree to the terms of the [project's license](https://github.com/ChestShop-authors/ChestShop-3/blob/master/LICENSE)
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: Additional context
|
||||
description: Add any other context or screenshots about the feature request here.
|
|
@ -1,22 +0,0 @@
|
|||
---
|
||||
name: Enhancement
|
||||
about: Request a feature or suggest an idea for this project
|
||||
title: ''
|
||||
labels: enhancement
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
#### Is your feature request related to a problem? Please describe.
|
||||
[A clear and concise description of what the problem is. Ex. I'm always frustrated when...]
|
||||
|
||||
#### Describe the solution you'd like
|
||||
[A clear and concise description of what you want to happen.]
|
||||
|
||||
#### Describe alternatives you've considered
|
||||
[A clear and concise description of any alternative solutions or features you've considered.]
|
||||
|
||||
#### Additional context
|
||||
[Add any other context or screenshots about the feature request here.]
|
||||
|
||||
[And Delete the lines in square brackets!]
|
|
@ -0,0 +1,43 @@
|
|||
name: Enhancement
|
||||
description: Request a feature or suggest an idea for this project
|
||||
labels: [enhancement]
|
||||
body:
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: >
|
||||
Please check if there are already similar issues open, also please test if your request
|
||||
isn't already implemented by trying the latest development build: https://ci.minebench.de/job/ChestShop-3/
|
||||
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: Is your feature request related to a problem? Please describe.
|
||||
description: A clear and concise description of what the problem is. Ex. I'm always frustrated when...
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: Describe the solution you'd like
|
||||
description: A clear and concise description of what you want to happen.
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: Describe alternatives you've considered
|
||||
description: A clear and concise description of any alternative solutions or features you've considered.
|
||||
|
||||
- type: checkboxes
|
||||
attributes:
|
||||
label: Agreements
|
||||
description: Please agree to the following.
|
||||
options:
|
||||
- label: I have checked if there are already similar issues open.
|
||||
required: true
|
||||
- label: I have checked that the latest build doesn't already implement the feature.
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: Additional context
|
||||
description: Add any other context or screenshots about the feature request here.
|
|
@ -0,0 +1,21 @@
|
|||
name: Qodana
|
||||
on:
|
||||
workflow_dispatch:
|
||||
pull_request:
|
||||
push:
|
||||
branches:
|
||||
- master
|
||||
|
||||
jobs:
|
||||
qodana:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
with:
|
||||
fetch-depth: 0
|
||||
- name: 'Qodana Scan'
|
||||
uses: JetBrains/qodana-action@v2022.3.4
|
||||
env:
|
||||
QODANA_TOKEN: ${{ secrets.QODANA_TOKEN }}
|
||||
with:
|
||||
args: --baseline,.github/workflows/qodana/qodana.sarif.json
|
File diff suppressed because it is too large
Load Diff
|
@ -34,4 +34,7 @@ Links
|
|||
* [Forum Thread](http://forums.bukkit.org/threads/4150/)
|
||||
* [BukkitDev site](http://dev.bukkit.org/projects/chestshop/)
|
||||
* [SpigotMC site](https://www.spigotmc.org/resources/chestshop.51856/)
|
||||
* [Bug Tracker](http://dev.bukkit.org/server-mods/chestshop/tickets/?status=+)
|
||||
* [Bounties via IssueHunt](https://issuehunt.io/r/ChestShop-authors/ChestShop-3?tab=idle)
|
||||
* [Localization](https://crowdin.com/project/chestshop-3)
|
||||
* [Qodana code quality](https://qodana.cloud/projects/zxDG5/)
|
||||
* [Old bug Tracker](http://dev.bukkit.org/server-mods/chestshop/tickets/?status=+) (please use GitHub issues!)
|
||||
|
|
|
@ -7,8 +7,8 @@ and which ones are supported with security updates if necessary.
|
|||
|
||||
| Version | Active development | Security Fixes |
|
||||
| ------------- | ------------------ | ------------------ |
|
||||
| 3.10 (latest) | :heavy_check_mark: | :heavy_check_mark: |
|
||||
| < 3.10 | :x: | :x: |
|
||||
| latest | :heavy_check_mark: | :heavy_check_mark: |
|
||||
| < latest | :x: | :x: |
|
||||
| 3.9.3-1.12 | :x: | :heavy_check_mark: |
|
||||
| 3.9.2-1.8.8 | :x: | :heavy_check_mark: |
|
||||
|
||||
|
|
183
pom.xml
183
pom.xml
|
@ -6,7 +6,7 @@
|
|||
|
||||
<groupId>com.acrobot.chestshop</groupId>
|
||||
<artifactId>chestshop</artifactId>
|
||||
<version>3.11</version>
|
||||
<version>3.12.3-SNAPSHOT</version>
|
||||
<description>Chest-and-sign shop plugin for Bukkit</description>
|
||||
<name>ChestShop</name>
|
||||
|
||||
|
@ -18,8 +18,8 @@
|
|||
|
||||
<repositories>
|
||||
<repository>
|
||||
<id>sk89q-repo</id>
|
||||
<url>http://maven.sk89q.com/repo/</url>
|
||||
<id>enginehub-repo</id>
|
||||
<url>https://maven.enginehub.org/repo/</url>
|
||||
</repository>
|
||||
<repository>
|
||||
<id>codemc-repo</id>
|
||||
|
@ -31,7 +31,7 @@
|
|||
</repository>
|
||||
<repository>
|
||||
<id>vault-repo</id>
|
||||
<url>http://nexus.hc.to/content/repositories/pub_releases/</url>
|
||||
<url>https://nexus.hc.to/content/repositories/pub_releases/</url>
|
||||
</repository>
|
||||
<repository>
|
||||
<id>minebench-repo</id>
|
||||
|
@ -42,16 +42,20 @@
|
|||
<url>file://${project.basedir}/repo/</url>
|
||||
</repository>
|
||||
<repository>
|
||||
<id>reserve-repo</id>
|
||||
<url>https://dl.bintray.com/theneweconomy/java/</url>
|
||||
<id>jitpack.io</id>
|
||||
<url>https://jitpack.io</url>
|
||||
</repository>
|
||||
<repository>
|
||||
<id>NyaaCat</id>
|
||||
<url>https://ci.nyaacat.com/maven/</url>
|
||||
</repository>
|
||||
<repository>
|
||||
<id>redprotect-repo</id>
|
||||
<url>https://raw.githubusercontent.com/FabioZumbi12/RedProtect/mvn-repo/</url>
|
||||
</repository>
|
||||
<repository>
|
||||
<id>jitpack.io</id>
|
||||
<url>https://jitpack.io</url>
|
||||
<id>adventure-repo</id>
|
||||
<url>https://s01.oss.sonatype.org/content/repositories/snapshots/</url>
|
||||
</repository>
|
||||
</repositories>
|
||||
|
||||
|
@ -59,43 +63,63 @@
|
|||
<dependency>
|
||||
<groupId>junit</groupId>
|
||||
<artifactId>junit</artifactId>
|
||||
<version>4.12</version>
|
||||
<version>4.13.2</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>com.j256.ormlite</groupId>
|
||||
<artifactId>ormlite-jdbc</artifactId>
|
||||
<version>5.1</version>
|
||||
<version>6.1</version>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>de.themoep.utils</groupId>
|
||||
<artifactId>lang-bukkit</artifactId>
|
||||
<version>1.2-SNAPSHOT</version>
|
||||
<version>1.3-SNAPSHOT</version>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>de.themoep</groupId>
|
||||
<artifactId>minedown</artifactId>
|
||||
<version>1.6.1-SNAPSHOT</version>
|
||||
<artifactId>minedown-adventure</artifactId>
|
||||
<version>1.7.2-SNAPSHOT</version>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>net.kyori</groupId>
|
||||
<artifactId>adventure-platform-bukkit</artifactId>
|
||||
<version>4.3.2</version>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>net.kyori</groupId>
|
||||
<artifactId>adventure-text-serializer-gson</artifactId>
|
||||
<version>4.14.0</version>
|
||||
<scope>compile</scope>
|
||||
<exclusions>
|
||||
<exclusion>
|
||||
<groupId>com.google.code.gson</groupId>
|
||||
<artifactId>gson</artifactId>
|
||||
</exclusion>
|
||||
</exclusions>
|
||||
</dependency>
|
||||
|
||||
<!-- Should be kept in sync with Mojang -->
|
||||
<dependency>
|
||||
<groupId>org.apache.logging.log4j</groupId>
|
||||
<artifactId>log4j-core</artifactId>
|
||||
<version>2.1</version>
|
||||
<version>2.17.2</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.bstats</groupId>
|
||||
<artifactId>bstats-bukkit</artifactId>
|
||||
<version>1.7</version>
|
||||
<version>3.0.1</version>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
|
||||
|
@ -116,23 +140,6 @@
|
|||
</exclusions>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>info.somethingodd</groupId>
|
||||
<artifactId>odditem</artifactId>
|
||||
<version>0.9.5</version>
|
||||
<scope>provided</scope>
|
||||
<exclusions>
|
||||
<exclusion>
|
||||
<groupId>org.bukkit</groupId>
|
||||
<artifactId>bukkit</artifactId>
|
||||
</exclusion>
|
||||
<exclusion>
|
||||
<groupId>org.bukkit</groupId>
|
||||
<artifactId>craftbukkit</artifactId>
|
||||
</exclusion>
|
||||
</exclusions>
|
||||
</dependency>
|
||||
|
||||
|
||||
<dependency>
|
||||
<groupId>com.herocraftonline.heroes</groupId>
|
||||
|
@ -150,7 +157,7 @@
|
|||
<dependency>
|
||||
<groupId>fr.xephi</groupId>
|
||||
<artifactId>authme</artifactId>
|
||||
<version>5.5.0-SNAPSHOT</version>
|
||||
<version>5.6.0-SNAPSHOT</version>
|
||||
<scope>provided</scope>
|
||||
<exclusions>
|
||||
<exclusion>
|
||||
|
@ -213,6 +220,12 @@
|
|||
<artifactId>worldedit-core</artifactId>
|
||||
<version>7.0.0-SNAPSHOT</version>
|
||||
<scope>provided</scope>
|
||||
<exclusions>
|
||||
<exclusion>
|
||||
<groupId>org.yaml</groupId>
|
||||
<artifactId>snakeyaml</artifactId>
|
||||
</exclusion>
|
||||
</exclusions>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
|
@ -241,16 +254,22 @@
|
|||
</exclusions>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>com.github.jojodmo</groupId>
|
||||
<artifactId>ItemBridge</artifactId>
|
||||
<version>b0054538c1</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>br.net.fabiozumbi12.RedProtect</groupId>
|
||||
<artifactId>RedProtect-Spigot</artifactId>
|
||||
<version>7.6.2</version>
|
||||
<version>7.7.3</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>br.net.fabiozumbi12.RedProtect</groupId>
|
||||
<artifactId>RedProtect-Core</artifactId>
|
||||
<version>7.6.2</version>
|
||||
<version>7.7.3</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
|
||||
|
@ -288,6 +307,13 @@
|
|||
</exclusions>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>nl.rutgerkok</groupId>
|
||||
<artifactId>blocklocker</artifactId>
|
||||
<version>1.9</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>com.bekvon.bukkit</groupId>
|
||||
<artifactId>residence</artifactId>
|
||||
|
@ -308,14 +334,21 @@
|
|||
<dependency>
|
||||
<groupId>de.themoep.showitem</groupId>
|
||||
<artifactId>api</artifactId>
|
||||
<version>1.2.24</version>
|
||||
<version>1.6.3</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>net.tnemc</groupId>
|
||||
<artifactId>Reserve</artifactId>
|
||||
<version>0.1.0.10</version>
|
||||
<version>0.1.5.4</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>me.crafter.mc</groupId>
|
||||
<artifactId>lockettepro</artifactId>
|
||||
<version>2.10-SNAPSHOT</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
@ -337,13 +370,14 @@
|
|||
<Distribution-Type>${buildType}</Distribution-Type>
|
||||
<Built-At>${maven.build.timestamp}</Built-At>
|
||||
<Build-Jdk>${java.runtime.version}</Build-Jdk>
|
||||
<paperweight-mappings-namespace>mojang</paperweight-mappings-namespace>
|
||||
</manifestEntries>
|
||||
</archive>
|
||||
</configuration>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<artifactId>maven-compiler-plugin</artifactId>
|
||||
<version>3.6.1</version>
|
||||
<version>3.8.1</version>
|
||||
<configuration>
|
||||
<source>1.8</source>
|
||||
<target>1.8</target>
|
||||
|
@ -364,21 +398,25 @@
|
|||
<includes>
|
||||
<include>de.themoep:*</include>
|
||||
<include>de.themoep.utils:*</include>
|
||||
<include>net.kyori:*</include>
|
||||
<include>org.bstats:*</include>
|
||||
<include>net.gravitydevelopment.updater</include>
|
||||
<include>com.j256.ormlite</include>
|
||||
<include>org.apache.logging.log4j</include>
|
||||
<include>javax.persistence</include>
|
||||
</includes>
|
||||
</artifactSet>
|
||||
<relocations>
|
||||
<relocation>
|
||||
<pattern>de.themoep.utils.lang</pattern>
|
||||
<shadedPattern>com.Acrobot.ChestShop.Lang</shadedPattern>
|
||||
<shadedPattern>com.Acrobot.ChestShop.Libs.Lang</shadedPattern>
|
||||
</relocation>
|
||||
<relocation>
|
||||
<pattern>de.themoep.minedown</pattern>
|
||||
<shadedPattern>com.Acrobot.ChestShop.MineDown</shadedPattern>
|
||||
<pattern>de.themoep.minedown.adventure</pattern>
|
||||
<shadedPattern>com.Acrobot.ChestShop.Libs.MineDown</shadedPattern>
|
||||
</relocation>
|
||||
<relocation>
|
||||
<pattern>net.kyori</pattern>
|
||||
<shadedPattern>com.Acrobot.ChestShop.Libs.Kyori</shadedPattern>
|
||||
</relocation>
|
||||
<relocation>
|
||||
<pattern>org.bstats</pattern>
|
||||
|
@ -390,11 +428,11 @@
|
|||
</relocation>
|
||||
<relocation>
|
||||
<pattern>com.j256.ormlite</pattern>
|
||||
<shadedPattern>com.Acrobot.ChestShop.ORMlite</shadedPattern>
|
||||
<shadedPattern>com.Acrobot.ChestShop.Libs.ORMlite</shadedPattern>
|
||||
</relocation>
|
||||
<relocation>
|
||||
<pattern>javax.persistence</pattern>
|
||||
<shadedPattern>com.Acrobot.ChestShop.javax.persistence</shadedPattern>
|
||||
<shadedPattern>com.Acrobot.ChestShop.Libs.javax.persistence</shadedPattern>
|
||||
</relocation>
|
||||
</relocations>
|
||||
</configuration>
|
||||
|
@ -423,6 +461,7 @@
|
|||
<build.number>${buildNumber}</build.number>
|
||||
<user.name>${buildType}</user.name>
|
||||
<bukkit.plugin.version>${project.version} ${buildDescription}</bukkit.plugin.version>
|
||||
<bukkit.dependency.version>1.20.5-R0.1-SNAPSHOT</bukkit.dependency.version>
|
||||
</properties>
|
||||
|
||||
<profiles>
|
||||
|
@ -430,20 +469,20 @@
|
|||
<id>default</id>
|
||||
<activation>
|
||||
<property>
|
||||
<name>!spigot</name>
|
||||
<name>!testprofile</name>
|
||||
</property>
|
||||
</activation>
|
||||
<repositories>
|
||||
<repository>
|
||||
<id>paper-repo</id>
|
||||
<url>https://papermc.io/repo/repository/maven-public/</url>
|
||||
<url>https://repo.papermc.io/repository/maven-public/</url>
|
||||
</repository>
|
||||
</repositories>
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>com.destroystokyo.paper</groupId>
|
||||
<groupId>io.papermc.paper</groupId>
|
||||
<artifactId>paper-api</artifactId>
|
||||
<version>1.13.2-R0.1-SNAPSHOT</version>
|
||||
<version>${bukkit.dependency.version}</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
@ -451,6 +490,12 @@
|
|||
|
||||
<profile>
|
||||
<id>spigot</id>
|
||||
<activation>
|
||||
<property>
|
||||
<name>testprofile</name>
|
||||
<value>spigot</value>
|
||||
</property>
|
||||
</activation>
|
||||
<repositories>
|
||||
<repository>
|
||||
<id>spigotmc-repo</id>
|
||||
|
@ -461,13 +506,10 @@
|
|||
<dependency>
|
||||
<groupId>org.spigotmc</groupId>
|
||||
<artifactId>spigot-api</artifactId>
|
||||
<version>1.13.2-R0.1-SNAPSHOT</version>
|
||||
<version>${bukkit.dependency.version}</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
<properties>
|
||||
<bukkit>true</bukkit>
|
||||
</properties>
|
||||
<build>
|
||||
<finalName>${project.name}-Spigot</finalName>
|
||||
<plugins>
|
||||
|
@ -483,6 +525,43 @@
|
|||
</build>
|
||||
</profile>
|
||||
|
||||
<profile>
|
||||
<id>backwards</id>
|
||||
<activation>
|
||||
<property>
|
||||
<name>testprofile</name>
|
||||
<value>backwards</value>
|
||||
</property>
|
||||
</activation>
|
||||
<repositories>
|
||||
<repository>
|
||||
<id>paper-repo</id>
|
||||
<url>https://repo.papermc.io/repository/maven-public/</url>
|
||||
</repository>
|
||||
</repositories>
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>com.destroystokyo.paper</groupId>
|
||||
<artifactId>paper-api</artifactId>
|
||||
<version>1.13.2-R0.1-SNAPSHOT</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
<build>
|
||||
<finalName>${project.name}-1.13.2</finalName>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<artifactId>maven-compiler-plugin</artifactId>
|
||||
<configuration>
|
||||
<excludes>
|
||||
<exclude>**/PaperLatest*.java</exclude>
|
||||
</excludes>
|
||||
</configuration>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
</profile>
|
||||
|
||||
<profile>
|
||||
<id>static_build_number</id>
|
||||
<activation>
|
||||
|
|
Binary file not shown.
|
@ -1 +0,0 @@
|
|||
c7b3b9b7cd7cd27a50c079ce4349f628
|
|
@ -1 +0,0 @@
|
|||
697ff692f06dc9064badb2610fd52399651b8274
|
|
@ -1,9 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<groupId>info.somethingodd</groupId>
|
||||
<artifactId>odditem</artifactId>
|
||||
<version>0.9.5</version>
|
||||
<description>POM was created from install:install-file</description>
|
||||
</project>
|
|
@ -1 +0,0 @@
|
|||
9fa8325983cb90581156734d0500aacb
|
|
@ -1 +0,0 @@
|
|||
288ed3c67d66d532eac2128c120a6d74986823d6
|
|
@ -1,12 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<metadata>
|
||||
<groupId>info.somethingodd</groupId>
|
||||
<artifactId>odditem</artifactId>
|
||||
<versioning>
|
||||
<release>0.9.5</release>
|
||||
<versions>
|
||||
<version>0.9.5</version>
|
||||
</versions>
|
||||
<lastUpdated>20130826223956</lastUpdated>
|
||||
</versioning>
|
||||
</metadata>
|
|
@ -1 +0,0 @@
|
|||
7240080156e6cd8df6f550049950a99c
|
|
@ -1 +0,0 @@
|
|||
23208c6e99b6df3664c26f771fa941a37387f428
|
|
@ -1,20 +1,21 @@
|
|||
package com.Acrobot.Breeze.Collection;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.Callable;
|
||||
import java.util.concurrent.ExecutionException;
|
||||
|
||||
public class SimpleCache<K, V> {
|
||||
private final LinkedHashMap<K, V> map;
|
||||
private final Map<K, V> map;
|
||||
|
||||
public SimpleCache(int cacheSize) {
|
||||
map = new LinkedHashMap<K, V>(cacheSize * 10/9, 0.7f, true) {
|
||||
map = Collections.synchronizedMap(new LinkedHashMap<K, V>(cacheSize * 10/9, 0.7f, true) {
|
||||
@Override
|
||||
protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
|
||||
return size() > cacheSize;
|
||||
}
|
||||
};
|
||||
});
|
||||
}
|
||||
|
||||
public V put(K key, V value) {
|
||||
|
|
|
@ -126,7 +126,7 @@ public class Configuration {
|
|||
|
||||
return lastLine.isEmpty();
|
||||
} catch (FileNotFoundException e) {
|
||||
e.printStackTrace();
|
||||
Logger.getLogger("Configuration").log(Level.SEVERE, "Error while checking if file " + file.getName() + " ends with space", e);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,9 +1,10 @@
|
|||
package com.Acrobot.Breeze.Configuration;
|
||||
|
||||
import com.Acrobot.Breeze.Configuration.Annotations.ConfigurationComment;
|
||||
import com.Acrobot.Breeze.Configuration.Annotations.Parser;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
/**
|
||||
* @author Acrobot
|
||||
|
@ -19,7 +20,9 @@ public class FieldParser {
|
|||
StringBuilder builder = new StringBuilder(50);
|
||||
|
||||
if (field.isAnnotationPresent(ConfigurationComment.class)) {
|
||||
builder.append("# ").append(field.getAnnotation(ConfigurationComment.class).value()).append('\n');
|
||||
for (String commentLine : field.getAnnotation(ConfigurationComment.class).value().split("\n")) {
|
||||
builder.append("# ").append(commentLine).append('\n');
|
||||
}
|
||||
}
|
||||
|
||||
ValueParser parser = Configuration.getParser(field);
|
||||
|
@ -27,7 +30,7 @@ public class FieldParser {
|
|||
try {
|
||||
builder.append(field.getName()).append(": ").append(parser.parseToYAML(field.get(null)));
|
||||
} catch (IllegalAccessException e) {
|
||||
e.printStackTrace();
|
||||
Logger.getLogger("FieldParser").log(Level.SEVERE, "Error while parsing field", e);
|
||||
return "";
|
||||
}
|
||||
|
||||
|
|
|
@ -31,9 +31,9 @@ public class ValueParser {
|
|||
} else if (object instanceof String) {
|
||||
String[] lines = ((String) object).split("\\R");
|
||||
if (lines.length == 1) {
|
||||
return '\"' + String.valueOf(object) + '\"';
|
||||
return '\"' + String.valueOf(object).replace("\\", "\\\\") + '\"';
|
||||
} else {
|
||||
return "|-\n" + Arrays.stream(lines).map(s -> " " + s).collect(Collectors.joining("\n"));
|
||||
return "|-\n" + Arrays.stream(lines).map(s -> " " + s.replace("\\", "\\\\")).collect(Collectors.joining("\n"));
|
||||
}
|
||||
} else {
|
||||
return '\"' + String.valueOf(object) + '\"';
|
||||
|
|
|
@ -1,8 +1,12 @@
|
|||
package com.Acrobot.Breeze.Database;
|
||||
|
||||
import com.Acrobot.ChestShop.ChestShop;
|
||||
|
||||
import java.sql.Connection;
|
||||
import java.sql.DriverManager;
|
||||
import java.sql.SQLException;
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
import javax.persistence.Entity;
|
||||
|
||||
|
@ -60,7 +64,7 @@ public class Database {
|
|||
try {
|
||||
table.create(fields);
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
Logger.getLogger("Database").log(Level.SEVERE, "Error while creating database from " + clazz.getName() + " (" + fields + ")", e);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
|
@ -36,7 +36,7 @@ public class EntityParser {
|
|||
fields.add(convertToSQL(field));
|
||||
}
|
||||
|
||||
return fields.stream().collect(Collectors.joining(","));
|
||||
return String.join(",", fields);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
package com.Acrobot.Breeze.Database;
|
||||
|
||||
import java.util.*;
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
/**
|
||||
* A class representing a Row in SQL query
|
||||
|
@ -85,21 +87,16 @@ public class Row {
|
|||
|
||||
try {
|
||||
object = clazz.newInstance();
|
||||
} catch (InstantiationException e) {
|
||||
e.printStackTrace();
|
||||
return null;
|
||||
} catch (IllegalAccessException e) {
|
||||
e.printStackTrace();
|
||||
} catch (InstantiationException | IllegalAccessException e) {
|
||||
Logger.getLogger("Row").log(Level.SEVERE, "Error while creating new instance of class " + clazz.getName() + " for row", e);
|
||||
return null;
|
||||
}
|
||||
|
||||
for (Map.Entry<String, String> value : values.entrySet()) {
|
||||
try {
|
||||
clazz.getDeclaredField(value.getKey()).set(object, value.getValue());
|
||||
} catch (NoSuchFieldException ex) {
|
||||
ex.printStackTrace();
|
||||
} catch (IllegalAccessException ex) {
|
||||
ex.printStackTrace();
|
||||
} catch (NoSuchFieldException | IllegalAccessException ex) {
|
||||
Logger.getLogger("Row").log(Level.SEVERE, "Error while setting field " + value.getKey() + " to " + value.getValue() + " of class " + clazz.getName(), ex);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -132,7 +132,7 @@ public class Table {
|
|||
String statement;
|
||||
|
||||
if (condition == null || condition.isEmpty()) {
|
||||
String format = '\'' + row.getValues().stream().collect(Collectors.joining("', ")) + '\'';
|
||||
String format = '\'' + String.join("', ", row.getValues()) + '\'';
|
||||
statement = String.format(INSERT_VALUES, format);
|
||||
} else {
|
||||
String format = row.getKeysAndValues().entrySet().stream()
|
||||
|
|
|
@ -22,6 +22,10 @@ public class BlockUtil {
|
|||
* @return Is this block a sign?
|
||||
*/
|
||||
public static boolean isSign(Block block) {
|
||||
if (!isLoaded(block)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
BlockData data = block.getBlockData();
|
||||
return data instanceof Sign || data instanceof WallSign;
|
||||
}
|
||||
|
@ -33,7 +37,7 @@ public class BlockUtil {
|
|||
* @return Is this block a chest?
|
||||
*/
|
||||
public static boolean isChest(Block block) {
|
||||
return block.getBlockData() instanceof org.bukkit.block.data.type.Chest;
|
||||
return BlockUtil.isLoaded(block) && block.getBlockData() instanceof org.bukkit.block.data.type.Chest;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -107,4 +111,14 @@ public class BlockUtil {
|
|||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if the chunk a block is in is loaded
|
||||
*
|
||||
* @param block The block to check
|
||||
* @return Whether or not the chunk is loaded
|
||||
*/
|
||||
public static boolean isLoaded(Block block) {
|
||||
return block.getWorld().isChunkLoaded(block.getX() >> 4, block.getZ() >> 4);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,5 +1,9 @@
|
|||
package com.Acrobot.Breeze.Utils.Encoding;
|
||||
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
/**
|
||||
* <p>Encodes and decodes to and from Base64 notation.</p>
|
||||
* <p>Homepage: <a href="http://iharder.net/base64">http://iharder.net/base64</a>.</p>
|
||||
|
@ -559,59 +563,31 @@ public class Base64 {
|
|||
throw new NullPointerException("Cannot serialize a null object.");
|
||||
} // end if: null
|
||||
|
||||
// Streams
|
||||
java.io.ByteArrayOutputStream baos = null;
|
||||
java.io.OutputStream b64os = null;
|
||||
java.util.zip.GZIPOutputStream gzos = null;
|
||||
java.io.ObjectOutputStream oos = null;
|
||||
|
||||
|
||||
try {
|
||||
// ObjectOutputStream -> (GZIP) -> Base64 -> ByteArrayOutputStream
|
||||
baos = new java.io.ByteArrayOutputStream();
|
||||
b64os = new Base64.OutputStream(baos, ENCODE | options);
|
||||
// ObjectOutputStream -> (GZIP) -> Base64 -> ByteArrayOutputStream
|
||||
try (java.io.ByteArrayOutputStream baos = new java.io.ByteArrayOutputStream();
|
||||
java.io.OutputStream b64os = new Base64.OutputStream(baos, ENCODE | options)) {
|
||||
if ((options & GZIP) != 0) {
|
||||
// Gzip
|
||||
gzos = new java.util.zip.GZIPOutputStream(b64os);
|
||||
oos = new java.io.ObjectOutputStream(gzos);
|
||||
try (java.util.zip.GZIPOutputStream gzos = new java.util.zip.GZIPOutputStream(b64os);
|
||||
java.io.ObjectOutputStream oos = new java.io.ObjectOutputStream(gzos)){
|
||||
oos.writeObject(serializableObject);
|
||||
}
|
||||
} else {
|
||||
// Not gzipped
|
||||
oos = new java.io.ObjectOutputStream(b64os);
|
||||
try (java.io.ObjectOutputStream oos = new java.io.ObjectOutputStream(b64os)) {
|
||||
oos.writeObject(serializableObject);
|
||||
}
|
||||
}
|
||||
oos.writeObject(serializableObject);
|
||||
// Return value according to relevant encoding.
|
||||
try {
|
||||
return baos.toString(PREFERRED_ENCODING);
|
||||
} // end try
|
||||
catch (java.io.UnsupportedEncodingException uue) {
|
||||
// Fall back to some Java default
|
||||
return baos.toString();
|
||||
} // end catch
|
||||
} // end try
|
||||
catch (java.io.IOException e) {
|
||||
// Catch it and then throw it immediately so that
|
||||
// the finally{} block is called for cleanup.
|
||||
throw e;
|
||||
} // end catch
|
||||
finally {
|
||||
try {
|
||||
oos.close();
|
||||
} catch (Exception e) {
|
||||
}
|
||||
try {
|
||||
gzos.close();
|
||||
} catch (Exception e) {
|
||||
}
|
||||
try {
|
||||
b64os.close();
|
||||
} catch (Exception e) {
|
||||
}
|
||||
try {
|
||||
baos.close();
|
||||
} catch (Exception e) {
|
||||
}
|
||||
} // end finally
|
||||
|
||||
// Return value according to relevant encoding.
|
||||
try {
|
||||
return new String(baos.toByteArray(), PREFERRED_ENCODING);
|
||||
} // end try
|
||||
catch (java.io.UnsupportedEncodingException uue) {
|
||||
// Fall back to some Java default
|
||||
return new String(baos.toByteArray());
|
||||
} // end catch
|
||||
|
||||
} // end encode
|
||||
|
||||
|
@ -635,7 +611,6 @@ public class Base64 {
|
|||
} catch (java.io.IOException ex) {
|
||||
assert false : ex.getMessage();
|
||||
} // end catch
|
||||
assert encoded != null;
|
||||
return encoded;
|
||||
} // end encodeBytes
|
||||
|
||||
|
@ -700,7 +675,6 @@ public class Base64 {
|
|||
} catch (java.io.IOException ex) {
|
||||
assert false : ex.getMessage();
|
||||
} // end catch
|
||||
assert encoded != null;
|
||||
return encoded;
|
||||
} // end encodeBytes
|
||||
|
||||
|
@ -810,40 +784,13 @@ public class Base64 {
|
|||
|
||||
// Compress?
|
||||
if ((options & GZIP) != 0) {
|
||||
java.io.ByteArrayOutputStream baos = null;
|
||||
java.util.zip.GZIPOutputStream gzos = null;
|
||||
Base64.OutputStream b64os = null;
|
||||
|
||||
try {
|
||||
// GZip -> Base64 -> ByteArray
|
||||
baos = new java.io.ByteArrayOutputStream();
|
||||
b64os = new Base64.OutputStream(baos, ENCODE | options);
|
||||
gzos = new java.util.zip.GZIPOutputStream(b64os);
|
||||
try (java.io.ByteArrayOutputStream baos = new java.io.ByteArrayOutputStream();
|
||||
Base64.OutputStream b64os = new Base64.OutputStream(baos, ENCODE | options);
|
||||
java.util.zip.GZIPOutputStream gzos = new java.util.zip.GZIPOutputStream(b64os)) {
|
||||
|
||||
gzos.write(source, off, len);
|
||||
gzos.close();
|
||||
return baos.toByteArray();
|
||||
} // end try
|
||||
catch (java.io.IOException e) {
|
||||
// Catch it and then throw it immediately so that
|
||||
// the finally{} block is called for cleanup.
|
||||
throw e;
|
||||
} // end catch
|
||||
finally {
|
||||
try {
|
||||
gzos.close();
|
||||
} catch (Exception e) {
|
||||
}
|
||||
try {
|
||||
b64os.close();
|
||||
} catch (Exception e) {
|
||||
}
|
||||
try {
|
||||
baos.close();
|
||||
} catch (Exception e) {
|
||||
}
|
||||
} // end finally
|
||||
|
||||
return baos.toByteArray();
|
||||
} // end if: compress
|
||||
|
||||
// Else, don't compress. Better not to use streams at all then.
|
||||
|
@ -1162,20 +1109,16 @@ public class Base64 {
|
|||
// Check to see if it's gzip-compressed
|
||||
// GZIP Magic Two-Byte Number: 0x8b1f (35615)
|
||||
boolean dontGunzip = (options & DONT_GUNZIP) != 0;
|
||||
if ((bytes != null) && (bytes.length >= 4) && (!dontGunzip)) {
|
||||
if (bytes.length >= 4 && !dontGunzip) {
|
||||
|
||||
int head = (bytes[0] & 0xff) | ((bytes[1] << 8) & 0xff00);
|
||||
if (java.util.zip.GZIPInputStream.GZIP_MAGIC == head) {
|
||||
java.io.ByteArrayInputStream bais = null;
|
||||
java.util.zip.GZIPInputStream gzis = null;
|
||||
java.io.ByteArrayOutputStream baos = null;
|
||||
byte[] buffer = new byte[2048];
|
||||
int length = 0;
|
||||
|
||||
try {
|
||||
baos = new java.io.ByteArrayOutputStream();
|
||||
bais = new java.io.ByteArrayInputStream(bytes);
|
||||
gzis = new java.util.zip.GZIPInputStream(bais);
|
||||
try (java.io.ByteArrayOutputStream baos = new java.io.ByteArrayOutputStream();
|
||||
java.io.ByteArrayInputStream bais = new java.io.ByteArrayInputStream(bytes);
|
||||
java.util.zip.GZIPInputStream gzis = new java.util.zip.GZIPInputStream(bais)) {
|
||||
|
||||
while ((length = gzis.read(buffer)) >= 0) {
|
||||
baos.write(buffer, 0, length);
|
||||
|
@ -1184,25 +1127,10 @@ public class Base64 {
|
|||
// No error? Get new bytes.
|
||||
bytes = baos.toByteArray();
|
||||
|
||||
} // end try
|
||||
catch (java.io.IOException e) {
|
||||
e.printStackTrace();
|
||||
} catch (java.io.IOException e) {
|
||||
Logger.getLogger("Base64").log(Level.SEVERE, "Unable to decode", e);
|
||||
// Just return originally-decoded bytes
|
||||
} // end catch
|
||||
finally {
|
||||
try {
|
||||
baos.close();
|
||||
} catch (Exception e) {
|
||||
}
|
||||
try {
|
||||
gzis.close();
|
||||
} catch (Exception e) {
|
||||
}
|
||||
try {
|
||||
bais.close();
|
||||
} catch (Exception e) {
|
||||
}
|
||||
} // end finally
|
||||
}
|
||||
|
||||
} // end if: gzipped
|
||||
} // end if: bytes.length >= 2
|
||||
|
@ -1252,55 +1180,30 @@ public class Base64 {
|
|||
// Decode and gunzip if necessary
|
||||
byte[] objBytes = decode(encodedObject, options);
|
||||
|
||||
java.io.ByteArrayInputStream bais = null;
|
||||
java.io.ObjectInputStream ois = null;
|
||||
Object obj = null;
|
||||
|
||||
try {
|
||||
bais = new java.io.ByteArrayInputStream(objBytes);
|
||||
try (java.io.ByteArrayInputStream bais = new java.io.ByteArrayInputStream(objBytes)) {
|
||||
|
||||
// If no custom class loader is provided, use Java's builtin OIS.
|
||||
if (loader == null) {
|
||||
ois = new java.io.ObjectInputStream(bais);
|
||||
try (java.io.ObjectInputStream ois = new java.io.ObjectInputStream(bais)) {
|
||||
return ois.readObject();
|
||||
} // end try
|
||||
} // end if: no loader provided
|
||||
|
||||
// Else make a customized object input stream that uses
|
||||
// the provided class loader.
|
||||
else {
|
||||
ois = new java.io.ObjectInputStream(bais) {
|
||||
try (java.io.ObjectInputStream ois = new java.io.ObjectInputStream(bais) {
|
||||
@Override
|
||||
public Class<?> resolveClass(java.io.ObjectStreamClass streamClass)
|
||||
throws java.io.IOException, ClassNotFoundException {
|
||||
Class<?> c = Class.forName(streamClass.getName(), false, loader);
|
||||
if (c == null) {
|
||||
return super.resolveClass(streamClass);
|
||||
} else {
|
||||
return c; // Class loader knows of this class.
|
||||
} // end else: not null
|
||||
return Class.forName(streamClass.getName(), false, loader);
|
||||
} // end resolveClass
|
||||
}; // end ois
|
||||
}) { // end ois
|
||||
return ois.readObject();
|
||||
} // end try
|
||||
} // end else: no custom class loader
|
||||
|
||||
obj = ois.readObject();
|
||||
} // end try
|
||||
catch (java.io.IOException e) {
|
||||
throw e; // Catch and throw in order to execute finally{}
|
||||
} // end catch
|
||||
catch (java.lang.ClassNotFoundException e) {
|
||||
throw e; // Catch and throw in order to execute finally{}
|
||||
} // end catch
|
||||
finally {
|
||||
try {
|
||||
bais.close();
|
||||
} catch (Exception e) {
|
||||
}
|
||||
try {
|
||||
ois.close();
|
||||
} catch (Exception e) {
|
||||
}
|
||||
} // end finally
|
||||
|
||||
return obj;
|
||||
} // end decodeObject
|
||||
|
||||
|
||||
|
@ -1325,17 +1228,10 @@ public class Base64 {
|
|||
throw new NullPointerException("Data to encode was null.");
|
||||
} // end iff
|
||||
|
||||
Base64.OutputStream bos = null;
|
||||
try {
|
||||
bos = new Base64.OutputStream(
|
||||
new java.io.FileOutputStream(filename), Base64.ENCODE);
|
||||
try (OutputStream bos = new OutputStream(
|
||||
new java.io.FileOutputStream(filename), Base64.ENCODE)) {
|
||||
bos.write(dataToEncode);
|
||||
} finally {
|
||||
try {
|
||||
bos.close();
|
||||
} catch (Exception e) {
|
||||
}
|
||||
} // end finally
|
||||
}
|
||||
|
||||
} // end encodeToFile
|
||||
|
||||
|
@ -1356,21 +1252,10 @@ public class Base64 {
|
|||
public static void decodeToFile(String dataToDecode, String filename)
|
||||
throws java.io.IOException {
|
||||
|
||||
Base64.OutputStream bos = null;
|
||||
try {
|
||||
bos = new Base64.OutputStream(
|
||||
new java.io.FileOutputStream(filename), Base64.DECODE);
|
||||
try (OutputStream bos = new OutputStream(
|
||||
new java.io.FileOutputStream(filename), Base64.DECODE)) {
|
||||
bos.write(dataToDecode.getBytes(PREFERRED_ENCODING));
|
||||
} // end try
|
||||
catch (java.io.IOException e) {
|
||||
throw e; // Catch and throw to execute finally{} block
|
||||
} // end catch: java.io.IOException
|
||||
finally {
|
||||
try {
|
||||
bos.close();
|
||||
} catch (Exception e) {
|
||||
}
|
||||
} // end finally
|
||||
}
|
||||
|
||||
} // end decodeToFile
|
||||
|
||||
|
@ -1393,24 +1278,22 @@ public class Base64 {
|
|||
throws java.io.IOException {
|
||||
|
||||
byte[] decodedData = null;
|
||||
Base64.InputStream bis = null;
|
||||
try {
|
||||
// Set up some useful variables
|
||||
java.io.File file = new java.io.File(filename);
|
||||
byte[] buffer = null;
|
||||
int length = 0;
|
||||
int numBytes = 0;
|
||||
// Set up some useful variables
|
||||
java.io.File file = new java.io.File(filename);
|
||||
byte[] buffer = null;
|
||||
int length = 0;
|
||||
int numBytes = 0;
|
||||
|
||||
// Check for size of file
|
||||
if (file.length() > Integer.MAX_VALUE) {
|
||||
throw new java.io.IOException("File is too big for this convenience method (" + file.length() + " bytes).");
|
||||
} // end if: file too big for int index
|
||||
buffer = new byte[(int) file.length()];
|
||||
// Check for size of file
|
||||
if (file.length() > Integer.MAX_VALUE) {
|
||||
throw new java.io.IOException("File is too big for this convenience method (" + file.length() + " bytes).");
|
||||
} // end if: file too big for int index
|
||||
buffer = new byte[(int) file.length()];
|
||||
|
||||
// Open a stream
|
||||
bis = new Base64.InputStream(
|
||||
new java.io.BufferedInputStream(
|
||||
new java.io.FileInputStream(file)), Base64.DECODE);
|
||||
// Open a stream
|
||||
try (Base64.InputStream bis = new Base64.InputStream(
|
||||
new java.io.BufferedInputStream(
|
||||
new java.io.FileInputStream(file)), Base64.DECODE)) {
|
||||
|
||||
// Read until done
|
||||
while ((numBytes = bis.read(buffer, length, 4096)) >= 0) {
|
||||
|
@ -1420,17 +1303,7 @@ public class Base64 {
|
|||
// Save in a variable to return
|
||||
decodedData = new byte[length];
|
||||
System.arraycopy(buffer, 0, decodedData, 0, length);
|
||||
|
||||
} // end try
|
||||
catch (java.io.IOException e) {
|
||||
throw e; // Catch and release to execute finally{}
|
||||
} // end catch: java.io.IOException
|
||||
finally {
|
||||
try {
|
||||
bis.close();
|
||||
} catch (Exception e) {
|
||||
}
|
||||
} // end finally
|
||||
} // end try
|
||||
|
||||
return decodedData;
|
||||
} // end decodeFromFile
|
||||
|
@ -1454,18 +1327,16 @@ public class Base64 {
|
|||
throws java.io.IOException {
|
||||
|
||||
String encodedData = null;
|
||||
Base64.InputStream bis = null;
|
||||
try {
|
||||
// Set up some useful variables
|
||||
java.io.File file = new java.io.File(filename);
|
||||
byte[] buffer = new byte[Math.max((int) (file.length() * 1.4 + 1), 40)]; // Need max() for math on small files (v2.2.1); Need +1 for a few corner cases (v2.3.5)
|
||||
int length = 0;
|
||||
int numBytes = 0;
|
||||
// Set up some useful variables
|
||||
java.io.File file = new java.io.File(filename);
|
||||
byte[] buffer = new byte[Math.max((int) (file.length() * 1.4 + 1), 40)]; // Need max() for math on small files (v2.2.1); Need +1 for a few corner cases (v2.3.5)
|
||||
int length = 0;
|
||||
int numBytes = 0;
|
||||
|
||||
// Open a stream
|
||||
bis = new Base64.InputStream(
|
||||
// Open a stream
|
||||
try (Base64.InputStream bis = new Base64.InputStream(
|
||||
new java.io.BufferedInputStream(
|
||||
new java.io.FileInputStream(file)), Base64.ENCODE);
|
||||
new java.io.FileInputStream(file)), Base64.ENCODE)) {
|
||||
|
||||
// Read until done
|
||||
while ((numBytes = bis.read(buffer, length, 4096)) >= 0) {
|
||||
|
@ -1476,15 +1347,6 @@ public class Base64 {
|
|||
encodedData = new String(buffer, 0, length, Base64.PREFERRED_ENCODING);
|
||||
|
||||
} // end try
|
||||
catch (java.io.IOException e) {
|
||||
throw e; // Catch and release to execute finally{}
|
||||
} // end catch: java.io.IOException
|
||||
finally {
|
||||
try {
|
||||
bis.close();
|
||||
} catch (Exception e) {
|
||||
}
|
||||
} // end finally
|
||||
|
||||
return encodedData;
|
||||
} // end encodeFromFile
|
||||
|
@ -1501,21 +1363,10 @@ public class Base64 {
|
|||
throws java.io.IOException {
|
||||
|
||||
String encoded = Base64.encodeFromFile(infile);
|
||||
java.io.OutputStream out = null;
|
||||
try {
|
||||
out = new java.io.BufferedOutputStream(
|
||||
new java.io.FileOutputStream(outfile));
|
||||
out.write(encoded.getBytes("US-ASCII")); // Strict, 7-bit output.
|
||||
} // end try
|
||||
catch (java.io.IOException e) {
|
||||
throw e; // Catch and release to execute finally{}
|
||||
} // end catch
|
||||
finally {
|
||||
try {
|
||||
out.close();
|
||||
} catch (Exception ex) {
|
||||
}
|
||||
} // end finally
|
||||
try (java.io.OutputStream out = new java.io.BufferedOutputStream(
|
||||
new java.io.FileOutputStream(outfile))) {
|
||||
out.write(encoded.getBytes(StandardCharsets.US_ASCII)); // Strict, 7-bit output.
|
||||
}
|
||||
} // end encodeFileToFile
|
||||
|
||||
|
||||
|
@ -1531,21 +1382,10 @@ public class Base64 {
|
|||
throws java.io.IOException {
|
||||
|
||||
byte[] decoded = Base64.decodeFromFile(infile);
|
||||
java.io.OutputStream out = null;
|
||||
try {
|
||||
out = new java.io.BufferedOutputStream(
|
||||
new java.io.FileOutputStream(outfile));
|
||||
try (java.io.OutputStream out = new java.io.BufferedOutputStream(
|
||||
new java.io.FileOutputStream(outfile))) {
|
||||
out.write(decoded);
|
||||
} // end try
|
||||
catch (java.io.IOException e) {
|
||||
throw e; // Catch and release to execute finally{}
|
||||
} // end catch
|
||||
finally {
|
||||
try {
|
||||
out.close();
|
||||
} catch (Exception ex) {
|
||||
}
|
||||
} // end finally
|
||||
}
|
||||
} // end decodeFileToFile
|
||||
|
||||
|
||||
|
|
|
@ -0,0 +1,78 @@
|
|||
package com.Acrobot.Breeze.Utils;
|
||||
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.block.BlockState;
|
||||
import org.bukkit.block.DoubleChest;
|
||||
import org.bukkit.inventory.Inventory;
|
||||
import org.bukkit.inventory.InventoryHolder;
|
||||
|
||||
import java.util.function.BiFunction;
|
||||
|
||||
public class ImplementationAdapter {
|
||||
|
||||
private static BiFunction<Inventory, Boolean, InventoryHolder> HOLDER_PROVIDER;
|
||||
private static BiFunction<DoubleChest, Boolean, InventoryHolder> LEFT_HOLDER_PROVIDER;
|
||||
private static BiFunction<DoubleChest, Boolean, InventoryHolder> RIGHT_HOLDER_PROVIDER;
|
||||
private static BiFunction<Block, Boolean, BlockState> STATE_PROVIDER;
|
||||
|
||||
static {
|
||||
try {
|
||||
Inventory.class.getMethod("getHolder", boolean.class);
|
||||
Class c = Class.forName("com.Acrobot.Breeze.Utils.ImplementationFeatures.PaperLatestHolder");
|
||||
HOLDER_PROVIDER = (BiFunction<Inventory, Boolean, InventoryHolder>) c.getDeclaredField("PROVIDER").get(null);
|
||||
LEFT_HOLDER_PROVIDER = (BiFunction<DoubleChest, Boolean, InventoryHolder>) c.getDeclaredField("LEFT_PROVIDER").get(null);
|
||||
RIGHT_HOLDER_PROVIDER = (BiFunction<DoubleChest, Boolean, InventoryHolder>) c.getDeclaredField("RIGHT_PROVIDER").get(null);
|
||||
} catch (NoSuchMethodException | ClassNotFoundException | NoSuchFieldException | IllegalAccessException e) {
|
||||
HOLDER_PROVIDER = (inventory, useSnapshot) -> inventory.getHolder();
|
||||
LEFT_HOLDER_PROVIDER = (doubleChest, useSnapshot) -> doubleChest.getLeftSide();
|
||||
RIGHT_HOLDER_PROVIDER = (doubleChest, useSnapshot) -> doubleChest.getRightSide();
|
||||
}
|
||||
try {
|
||||
Block.class.getMethod("getState", boolean.class);
|
||||
Class c = Class.forName("com.Acrobot.Breeze.Utils.ImplementationFeatures.PaperLatestState");
|
||||
STATE_PROVIDER = (BiFunction<Block, Boolean, BlockState>) c.getDeclaredField("PROVIDER").get(null);
|
||||
} catch (NoSuchMethodException | ClassNotFoundException | NoSuchFieldException | IllegalAccessException e) {
|
||||
STATE_PROVIDER = (block, useSnapshot) -> block.getState();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the inventory's holder.
|
||||
* @param inventory The inventory
|
||||
* @param useSnapshot Whether or not the holder should be a snapshot (if possible)
|
||||
* @return The inventory's holder
|
||||
*/
|
||||
public static InventoryHolder getHolder(Inventory inventory, boolean useSnapshot) {
|
||||
return HOLDER_PROVIDER.apply(inventory, useSnapshot);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the a DoubleChest's left side
|
||||
* @param doubleChest The DoubleChest
|
||||
* @param useSnapshot Whether or not the holder should be a snapshot (if possible)
|
||||
* @return The left side's holder
|
||||
*/
|
||||
public static InventoryHolder getLeftSide(DoubleChest doubleChest, boolean useSnapshot) {
|
||||
return LEFT_HOLDER_PROVIDER.apply(doubleChest, useSnapshot);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the a DoubleChest's right side
|
||||
* @param doubleChest The DoubleChest
|
||||
* @param useSnapshot Whether or not the holder should be a snapshot (if possible)
|
||||
* @return The left right's holder
|
||||
*/
|
||||
public static InventoryHolder getRightSide(DoubleChest doubleChest, boolean useSnapshot) {
|
||||
return RIGHT_HOLDER_PROVIDER.apply(doubleChest, useSnapshot);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a block state
|
||||
* @param block The block to get the state from
|
||||
* @param useSnapshot Whether or not the state should be a snapshot (if possible)
|
||||
* @return The block's state
|
||||
*/
|
||||
public static BlockState getState(Block block, boolean useSnapshot) {
|
||||
return STATE_PROVIDER.apply(block, useSnapshot);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,17 @@
|
|||
package com.Acrobot.Breeze.Utils.ImplementationFeatures;
|
||||
|
||||
import org.bukkit.block.DoubleChest;
|
||||
import org.bukkit.inventory.Inventory;
|
||||
import org.bukkit.inventory.InventoryHolder;
|
||||
|
||||
import java.util.function.BiFunction;
|
||||
|
||||
public class PaperLatestHolder {
|
||||
|
||||
public static final BiFunction<Inventory, Boolean, InventoryHolder> PROVIDER = Inventory::getHolder;
|
||||
|
||||
public static final BiFunction<DoubleChest, Boolean, InventoryHolder> LEFT_PROVIDER = DoubleChest::getLeftSide;
|
||||
|
||||
public static final BiFunction<DoubleChest, Boolean, InventoryHolder> RIGHT_PROVIDER = DoubleChest::getRightSide;
|
||||
|
||||
}
|
|
@ -0,0 +1,12 @@
|
|||
package com.Acrobot.Breeze.Utils.ImplementationFeatures;
|
||||
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.block.BlockState;
|
||||
|
||||
import java.util.function.BiFunction;
|
||||
|
||||
public class PaperLatestState {
|
||||
|
||||
public static final BiFunction<Block, Boolean, BlockState> PROVIDER = Block::getState;
|
||||
|
||||
}
|
|
@ -351,7 +351,7 @@ public class InventoryUtil {
|
|||
itemList.add(item.clone());
|
||||
}
|
||||
|
||||
return itemList.toArray(new ItemStack[itemList.size()]);
|
||||
return itemList.toArray(new ItemStack[0]);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -413,7 +413,7 @@ public class InventoryUtil {
|
|||
stackedItems.add(item.clone());
|
||||
continue;
|
||||
}
|
||||
for (int i = 0; i < Math.floor(item.getAmount() / maxStackSize); i++) {
|
||||
for (int i = 0; i < Math.floor((double) item.getAmount() / maxStackSize); i++) {
|
||||
ItemStack itemClone = item.clone();
|
||||
itemClone.setAmount(maxStackSize);
|
||||
stackedItems.add(itemClone);
|
||||
|
@ -424,6 +424,6 @@ public class InventoryUtil {
|
|||
stackedItems.add(rest);
|
||||
}
|
||||
}
|
||||
return stackedItems.toArray(new ItemStack[stackedItems.size()]);
|
||||
return stackedItems.toArray(new ItemStack[0]);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -4,14 +4,13 @@ import com.Acrobot.Breeze.Collection.SimpleCache;
|
|||
import com.Acrobot.ChestShop.ChestShop;
|
||||
import com.Acrobot.ChestShop.Configuration.Messages;
|
||||
import com.Acrobot.ChestShop.Configuration.Properties;
|
||||
import com.Acrobot.ChestShop.Events.ItemParseEvent;
|
||||
import com.Acrobot.ChestShop.Events.MaterialParseEvent;
|
||||
import com.google.common.collect.ImmutableMap;
|
||||
import com.Acrobot.ChestShop.Utils.ItemUtil;
|
||||
import de.themoep.ShowItem.api.ShowItem;
|
||||
import de.themoep.minedown.Replacer;
|
||||
import info.somethingodd.OddItem.OddItem;
|
||||
import net.md_5.bungee.api.chat.BaseComponent;
|
||||
import net.md_5.bungee.chat.ComponentSerializer;
|
||||
import de.themoep.minedown.adventure.Replacer;
|
||||
import net.kyori.adventure.text.Component;
|
||||
import net.kyori.adventure.text.TextComponent;
|
||||
import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.configuration.file.YamlConstructor;
|
||||
|
@ -21,13 +20,11 @@ import org.bukkit.inventory.ItemStack;
|
|||
import org.bukkit.inventory.meta.Damageable;
|
||||
import org.bukkit.inventory.meta.ItemMeta;
|
||||
import org.bukkit.plugin.Plugin;
|
||||
import org.json.simple.JSONObject;
|
||||
import org.yaml.snakeyaml.DumperOptions;
|
||||
import org.yaml.snakeyaml.Yaml;
|
||||
import org.yaml.snakeyaml.nodes.Tag;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
|
@ -35,7 +32,6 @@ import java.util.Map;
|
|||
import java.util.logging.Level;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import static com.Acrobot.Breeze.Utils.StringUtil.getMinecraftCharWidth;
|
||||
import static com.Acrobot.Breeze.Utils.StringUtil.getMinecraftStringWidth;
|
||||
|
@ -57,6 +53,23 @@ public class MaterialUtil {
|
|||
// 15 dashes fit on one sign line with the default resource pack:
|
||||
public static final int MAXIMUM_SIGN_WIDTH = (short) getMinecraftStringWidth("---------------");
|
||||
|
||||
private static final Map<String, String> ABBREVIATIONS = StringUtil.map(
|
||||
"Egg", "Eg",
|
||||
"Spawn", "Spaw",
|
||||
"Pottery", "Pot",
|
||||
"Heartbreak", "Heartbr",
|
||||
"Sherd", "Sher"
|
||||
);
|
||||
|
||||
private static final Map<String, String> UNIDIRECTIONAL_ABBREVIATIONS = StringUtil.map(
|
||||
"Endermite", "Endmite",
|
||||
"Endmite", "Endmit",
|
||||
"Wayfinder", "Wayfndr",
|
||||
"Wayfndr", "Wf",
|
||||
"Heartbr", "Hrtbr",
|
||||
"Hrtbr", "Hrtb"
|
||||
);
|
||||
|
||||
private static final SimpleCache<String, Material> MATERIAL_CACHE = new SimpleCache<>(Properties.CACHE_SIZE);
|
||||
|
||||
private static final Yaml YAML = new Yaml(new YamlBukkitConstructor(), new YamlRepresenter(), new DumperOptions());
|
||||
|
@ -105,24 +118,41 @@ public class MaterialUtil {
|
|||
if (!one.hasItemMeta() && !two.hasItemMeta()) {
|
||||
return true;
|
||||
}
|
||||
Map<String, Object> oneSerMeta = one.getItemMeta().serialize();
|
||||
Map<String, Object> twoSerMeta = two.getItemMeta().serialize();
|
||||
ItemMeta oneMeta = one.getItemMeta();
|
||||
ItemMeta twoMeta = two.getItemMeta();
|
||||
// return true if both are null or same, false if only one is null
|
||||
if (oneMeta == twoMeta || oneMeta == null || twoMeta == null) {
|
||||
return oneMeta == twoMeta;
|
||||
}
|
||||
Map<String, Object> oneSerMeta = oneMeta.serialize();
|
||||
Map<String, Object> twoSerMeta = twoMeta.serialize();
|
||||
if (oneSerMeta.equals(twoSerMeta)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
// Try to use same parsing as the YAML dumper in the ItemDatabase when generating the code as the last resort
|
||||
ItemStack oneDumped = YAML.loadAs(YAML.dump(one), ItemStack.class);
|
||||
if (oneDumped.isSimilar(two) || oneDumped.getItemMeta().serialize().equals(twoSerMeta)) {
|
||||
if (oneDumped.isSimilar(two)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
ItemMeta oneDumpedMeta = oneDumped.getItemMeta();
|
||||
if (oneDumpedMeta != null && oneDumpedMeta.serialize().equals(twoSerMeta)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
ItemStack twoDumped = YAML.loadAs(YAML.dump(two), ItemStack.class);
|
||||
if (oneDumped.isSimilar(twoDumped) || oneDumped.getItemMeta().serialize().equals(twoDumped.getItemMeta().serialize())) {
|
||||
if (oneDumped.isSimilar(twoDumped)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
ItemMeta twoDumpedMeta = twoDumped.getItemMeta();
|
||||
if (oneDumpedMeta != null && twoDumpedMeta != null && oneDumpedMeta.serialize().equals(twoDumpedMeta.serialize())) {
|
||||
return true;
|
||||
}
|
||||
|
||||
// return true if both are null or same, false otherwise
|
||||
return oneDumpedMeta == twoDumpedMeta;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -132,7 +162,15 @@ public class MaterialUtil {
|
|||
* @return Material found
|
||||
*/
|
||||
public static Material getMaterial(String name) {
|
||||
String formatted = name.replaceAll("([a-z])([A-Z1-9])", "$1_$2").replace(' ', '_').toUpperCase(Locale.ROOT);
|
||||
String replacedName = name;
|
||||
// revert unidirectional abbreviations
|
||||
List<Map.Entry<String, String>> abbreviations = new ArrayList<>(UNIDIRECTIONAL_ABBREVIATIONS.entrySet());
|
||||
for (int i = abbreviations.size() - 1; i >= 0; i--) {
|
||||
Map.Entry<String, String> entry = abbreviations.get(i);
|
||||
replacedName = replacedName.replaceAll(entry.getValue() + "(_|$)?", entry.getKey() + "$1");
|
||||
}
|
||||
|
||||
String formatted = name.replaceAll("(?<!^)(?>\\s?)([A-Z1-9])", "_$1").replace(' ', '_').toUpperCase(Locale.ROOT);
|
||||
|
||||
Material material = MATERIAL_CACHE.get(formatted);
|
||||
if (material != null) {
|
||||
|
@ -146,7 +184,7 @@ public class MaterialUtil {
|
|||
return material;
|
||||
}
|
||||
|
||||
material = new EnumParser<Material>().parse(name, Material.values());
|
||||
material = new EnumParser<Material>().parse(replacedName, Material.values());
|
||||
if (material != null) {
|
||||
MATERIAL_CACHE.put(formatted, material);
|
||||
}
|
||||
|
@ -159,7 +197,9 @@ public class MaterialUtil {
|
|||
*
|
||||
* @param items The items to get the information from
|
||||
* @return The list, including the amount and names of the items
|
||||
* @deprecated Use {@link ItemUtil#getItemList(ItemStack[])} instead!
|
||||
*/
|
||||
@Deprecated
|
||||
public static String getItemList(ItemStack[] items) {
|
||||
ItemStack[] mergedItems = InventoryUtil.mergeSimilarStacks(items);
|
||||
|
||||
|
@ -174,6 +214,7 @@ public class MaterialUtil {
|
|||
|
||||
/**
|
||||
* Returns item's name
|
||||
* Use {@link ItemUtil#getName(ItemStack, int)} if you want to get name aliases too!
|
||||
*
|
||||
* @param itemStack ItemStack to name
|
||||
* @return ItemStack's name
|
||||
|
@ -197,6 +238,7 @@ public class MaterialUtil {
|
|||
|
||||
/**
|
||||
* Returns item's name, just like on the sign
|
||||
* Use {@link ItemUtil#getSignName(ItemStack)} if you want to get name aliases too!
|
||||
*
|
||||
* @param itemStack ItemStack to name
|
||||
* @return ItemStack's name
|
||||
|
@ -206,15 +248,15 @@ public class MaterialUtil {
|
|||
}
|
||||
|
||||
/**
|
||||
* Returns item's name, with a maximum width
|
||||
* Returns item's name, with a maximum width.
|
||||
* Use {@link ItemUtil#getName(ItemStack, int)} if you want to get name aliases too!
|
||||
*
|
||||
* @param itemStack ItemStack to name
|
||||
* @param maxWidth The max width that the name should have; 0 or below if it should be unlimited
|
||||
* @return ItemStack's name
|
||||
*/
|
||||
public static String getName(ItemStack itemStack, int maxWidth) {
|
||||
String alias = Odd.getAlias(itemStack);
|
||||
String itemName = alias != null ? alias : itemStack.getType().toString();
|
||||
String itemName = itemStack.getType().toString();
|
||||
|
||||
String durability = "";
|
||||
if (itemStack.getDurability() != 0) {
|
||||
|
@ -227,23 +269,15 @@ public class MaterialUtil {
|
|||
}
|
||||
|
||||
String code = StringUtil.capitalizeFirstLetter(itemName, '_');
|
||||
int codeWidth = getMinecraftStringWidth(code + durability + metaData);
|
||||
if (maxWidth > 0 && codeWidth > maxWidth) {
|
||||
int exceeding = codeWidth - maxWidth;
|
||||
code = getShortenedName(code, getMinecraftStringWidth(code) - exceeding);
|
||||
if (maxWidth > 0) {
|
||||
int codeWidth = getMinecraftStringWidth(code + durability + metaData);
|
||||
if (codeWidth > maxWidth) {
|
||||
int exceeding = codeWidth - maxWidth;
|
||||
code = getShortenedName(code, getMinecraftStringWidth(code) - exceeding);
|
||||
}
|
||||
}
|
||||
|
||||
code += durability + metaData;
|
||||
|
||||
ItemParseEvent parseEvent = new ItemParseEvent(code);
|
||||
Bukkit.getPluginManager().callEvent(parseEvent);
|
||||
ItemStack codeItem = parseEvent.getItem();
|
||||
if (!equals(itemStack, codeItem)) {
|
||||
throw new IllegalArgumentException("Cannot generate code for item " + itemStack + " with maximum length of " + maxWidth
|
||||
+ " (code " + code + " results in item " + codeItem + ")");
|
||||
}
|
||||
|
||||
return code;
|
||||
return code + durability + metaData;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -254,17 +288,42 @@ public class MaterialUtil {
|
|||
* @return The name shortened to the max length
|
||||
*/
|
||||
public static String getShortenedName(String itemName, int maxWidth) {
|
||||
itemName = StringUtil.capitalizeFirstLetter(itemName.replace('_', ' '), ' ');
|
||||
int width = getMinecraftStringWidth(itemName);
|
||||
// Restore spaces in string that might be already be shortened
|
||||
String name = itemName.replaceAll("([a-z])([A-Z1-9])", "$1 $2");
|
||||
name = StringUtil.capitalizeFirstLetter(name.replace('_', ' '), ' ');
|
||||
int width = getMinecraftStringWidth(name);
|
||||
if (width <= maxWidth) {
|
||||
return itemName;
|
||||
return name;
|
||||
}
|
||||
String[] itemParts = itemName.split(" ");
|
||||
itemName = String.join("", itemParts);
|
||||
width = getMinecraftStringWidth(itemName);
|
||||
String[] itemParts = name.split("[ \\-]");
|
||||
String noSpaceName = String.join("", itemParts);
|
||||
width = getMinecraftStringWidth(noSpaceName);
|
||||
if (width <= maxWidth) {
|
||||
return itemName;
|
||||
return noSpaceName;
|
||||
}
|
||||
|
||||
// Abbreviate some terms manually
|
||||
for (Map.Entry<String, String> entry : ABBREVIATIONS.entrySet()) {
|
||||
name = name.replaceAll(entry.getKey() + "( |$)", entry.getValue() + "$1");
|
||||
itemParts = name.split("[ \\-]");
|
||||
noSpaceName = String.join("", itemParts);
|
||||
width = getMinecraftStringWidth(noSpaceName);
|
||||
if (width <= maxWidth) {
|
||||
return noSpaceName;
|
||||
}
|
||||
}
|
||||
|
||||
// Apply unidirectional abbreviations if it still doesn't work
|
||||
for (Map.Entry<String, String> entry : UNIDIRECTIONAL_ABBREVIATIONS.entrySet()) {
|
||||
name = name.replaceAll(entry.getKey() + "( |$)", entry.getValue() + "$1");
|
||||
itemParts = name.split("[ \\-]");
|
||||
noSpaceName = String.join("", itemParts);
|
||||
width = getMinecraftStringWidth(noSpaceName);
|
||||
if (width <= maxWidth) {
|
||||
return noSpaceName;
|
||||
}
|
||||
}
|
||||
|
||||
int exceeding = width - maxWidth;
|
||||
int shortestIndex = 0;
|
||||
int longestIndex = 0;
|
||||
|
@ -322,12 +381,6 @@ public class MaterialUtil {
|
|||
* @return ItemStack
|
||||
*/
|
||||
public static ItemStack getItem(String itemName) {
|
||||
ItemStack itemStack = Odd.getFromString(itemName);
|
||||
|
||||
if (itemStack != null) {
|
||||
return itemStack;
|
||||
}
|
||||
|
||||
String[] split = itemName.split("[:\\-#]");
|
||||
for (int i = 0; i < split.length; i++) {
|
||||
split[i] = split[i].trim();
|
||||
|
@ -341,7 +394,7 @@ public class MaterialUtil {
|
|||
return null;
|
||||
}
|
||||
|
||||
itemStack = new ItemStack(material);
|
||||
ItemStack itemStack = new ItemStack(material);
|
||||
|
||||
ItemMeta meta = getMetadata(itemName);
|
||||
|
||||
|
@ -398,17 +451,18 @@ public class MaterialUtil {
|
|||
|
||||
private static class EnumParser<E extends Enum<E>> {
|
||||
private E parse(String name, E[] values) {
|
||||
String formatted = name.replaceAll("(?<!^)(?>\\s?)([A-Z1-9])", "_$1").toUpperCase(Locale.ROOT).replace(' ', '_');
|
||||
try {
|
||||
return E.valueOf(values[0].getDeclaringClass(), name.toUpperCase(Locale.ROOT));
|
||||
return E.valueOf(values[0].getDeclaringClass(), formatted);
|
||||
} catch (IllegalArgumentException exception) {
|
||||
E currentEnum = null;
|
||||
String[] typeParts = name.replaceAll("([a-z])([A-Z1-9])", "$1_$2").toUpperCase(Locale.ROOT).split("[ _]");
|
||||
List<E> possibleEnums = new ArrayList<>();
|
||||
String[] typeParts = formatted.split("_");
|
||||
int length = Short.MAX_VALUE;
|
||||
for (E e : values) {
|
||||
String enumName = e.name();
|
||||
if (enumName.length() < length && enumName.startsWith(name)) {
|
||||
length = (short) enumName.length();
|
||||
currentEnum = e;
|
||||
if (enumName.length() < length && enumName.startsWith(formatted)) {
|
||||
length = enumName.length();
|
||||
possibleEnums.add(e);
|
||||
} else if (typeParts.length > 1) {
|
||||
String[] nameParts = enumName.split("_");
|
||||
if (typeParts.length == nameParts.length) {
|
||||
|
@ -420,13 +474,28 @@ public class MaterialUtil {
|
|||
}
|
||||
}
|
||||
if (matched) {
|
||||
currentEnum = e;
|
||||
break;
|
||||
possibleEnums.add(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return currentEnum;
|
||||
|
||||
if (possibleEnums.size() == 1) {
|
||||
return possibleEnums.get(0);
|
||||
} else if (possibleEnums.size() > 1) {
|
||||
int formattedLength = formatted.length();
|
||||
int closestDeviation = Short.MAX_VALUE;
|
||||
E closestEnum = null;
|
||||
for (E possibleEnum : possibleEnums) {
|
||||
int deviation = possibleEnum.name().length() - formattedLength;
|
||||
if (deviation < closestDeviation) {
|
||||
closestDeviation = deviation;
|
||||
closestEnum = possibleEnum;
|
||||
}
|
||||
}
|
||||
return closestEnum;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -459,52 +528,6 @@ public class MaterialUtil {
|
|||
}
|
||||
}
|
||||
|
||||
public static class Odd {
|
||||
private static boolean isInitialized = false;
|
||||
|
||||
/**
|
||||
* Returns the item stack from OddItem plugin
|
||||
*
|
||||
* @param itemName Item name to parse
|
||||
* @return itemStack that was parsed
|
||||
*/
|
||||
public static ItemStack getFromString(String itemName) {
|
||||
if (!isInitialized) {
|
||||
return null;
|
||||
}
|
||||
|
||||
String name = itemName.replace(':', ';');
|
||||
|
||||
try {
|
||||
return OddItem.getItemStack(name);
|
||||
} catch (Exception ex) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public static String getAlias(ItemStack itemStack) {
|
||||
if (!isInitialized) {
|
||||
return null;
|
||||
}
|
||||
|
||||
try {
|
||||
Collection<String> aliases = OddItem.getAliases(itemStack);
|
||||
if (!aliases.isEmpty()) {
|
||||
return aliases.iterator().next();
|
||||
}
|
||||
} catch (Exception ignored) {
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Lets the class know that it's safe to use the OddItem methods now
|
||||
*/
|
||||
public static void initialize() {
|
||||
isInitialized = true;
|
||||
}
|
||||
}
|
||||
|
||||
public static class Show {
|
||||
private static ShowItem showItem = null;
|
||||
|
||||
|
@ -525,49 +548,61 @@ public class MaterialUtil {
|
|||
* @param stock The items in stock
|
||||
*/
|
||||
public static boolean sendMessage(Player player, Messages.Message message, ItemStack[] stock, Map<String, String> replacementMap, String... replacements) {
|
||||
return sendMessage(player, player.getName(), message, stock, replacementMap, replacements);
|
||||
}
|
||||
|
||||
/**
|
||||
* Send a message with hover info and icons
|
||||
*
|
||||
* @param player The player to send the message to
|
||||
* @param playerName The name of the player in case he is offline and bungee messages are enabled
|
||||
* @param message The raw message
|
||||
* @param stock The items in stock
|
||||
*/
|
||||
public static boolean sendMessage(Player player, String playerName, Messages.Message message, ItemStack[] stock, Map<String, String> replacementMap, String... replacements) {
|
||||
return sendMessage(player, playerName, message, true, stock, replacementMap, replacements);
|
||||
}
|
||||
|
||||
/**
|
||||
* Send a message with hover info and icons
|
||||
*
|
||||
* @param player The player to send the message to
|
||||
* @param playerName The name of the player in case he is offline and bungee messages are enabled
|
||||
* @param message The raw message
|
||||
* @param showPrefix If the prefix should show
|
||||
* @param stock The items in stock
|
||||
*/
|
||||
public static boolean sendMessage(Player player, String playerName, Messages.Message message, boolean showPrefix, ItemStack[] stock, Map<String, String> replacementMap, String... replacements) {
|
||||
if (showItem == null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
List<String> itemJson = new ArrayList<>();
|
||||
TextComponent.Builder itemComponent = Component.text();
|
||||
for (ItemStack item : InventoryUtil.mergeSimilarStacks(stock)) {
|
||||
try {
|
||||
itemJson.add(showItem.getItemConverter().createComponent(item, Level.FINE).toJsonString(player));
|
||||
itemComponent.append(GsonComponentSerializer.gson().deserialize(showItem.getItemConverter().createComponent(item, Level.FINE).toJsonString(player)));
|
||||
} catch (Exception e) {
|
||||
ChestShop.getPlugin().getLogger().log(Level.WARNING, "Error while trying to send message '" + message + "' to player " + player.getName() + ": " + e.getMessage());
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
String joinedItemJson = itemJson.stream().collect(Collectors.joining("," + new JSONObject(ImmutableMap.of("text", " ")).toJSONString() + ", "));
|
||||
|
||||
Map<String, String> newMap = new LinkedHashMap<>(replacementMap);
|
||||
newMap.put("material", "item");
|
||||
BaseComponent[] components = message.getComponents(player, true, newMap, replacements);
|
||||
player.spigot().sendMessage(new Replacer()
|
||||
newMap.remove("item");
|
||||
Component component = new Replacer()
|
||||
.placeholderSuffix("")
|
||||
.replace("item", ComponentSerializer.parse("[" + joinedItemJson + "]"))
|
||||
.replaceIn(components));
|
||||
|
||||
/*
|
||||
String prevColor = "";
|
||||
List<String> parts = new ArrayList<>();
|
||||
for (String s : message.split("%item")) {
|
||||
parts.add(new JSONObject(ImmutableMap.of("text", prevColor + s)).toJSONString());
|
||||
prevColor = ChatColor.getLastColors(s);
|
||||
.replace("item",itemComponent.build())
|
||||
.replaceIn(message.getComponent(player, showPrefix, newMap, replacements));
|
||||
if (player != null) {
|
||||
ChestShop.getAudiences().player(player).sendMessage(component);
|
||||
return true;
|
||||
} else if (playerName != null) {
|
||||
ChestShop.sendBungeeMessage(playerName, component);
|
||||
return true;
|
||||
}
|
||||
|
||||
String messageJsonString = String.join("," + joinedItemJson + ",", parts);
|
||||
|
||||
while (messageJsonString.startsWith(",")) {
|
||||
messageJsonString = messageJsonString.substring(1);
|
||||
}
|
||||
while (messageJsonString.endsWith(",")) {
|
||||
messageJsonString = messageJsonString.substring(0, messageJsonString.length() - 1);
|
||||
}
|
||||
|
||||
showItem.tellRaw(player, messageJsonString);
|
||||
*/return true;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,22 @@
|
|||
package com.Acrobot.Breeze.Utils;
|
||||
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
/**
|
||||
* @author bricefrisco
|
||||
*/
|
||||
public class QuantityUtil {
|
||||
public static final Pattern QUANTITY_LINE_WITH_COUNTER_PATTERN = Pattern.compile("^Q [1-9][0-9]{0,4} : C [0-9]{1,5}$");
|
||||
|
||||
public static int parseQuantity(String quantityLine) throws IllegalArgumentException {
|
||||
if (quantityLineContainsCounter(quantityLine)) {
|
||||
return Integer.parseInt(quantityLine.split(" : ")[0].replace("Q ", ""));
|
||||
}
|
||||
|
||||
return Integer.parseInt(quantityLine);
|
||||
}
|
||||
|
||||
public static boolean quantityLineContainsCounter(String quantityLine) {
|
||||
return QUANTITY_LINE_WITH_COUNTER_PATTERN.matcher(quantityLine).matches();
|
||||
}
|
||||
}
|
|
@ -1,10 +1,13 @@
|
|||
package com.Acrobot.Breeze.Utils;
|
||||
|
||||
import org.apache.commons.lang.WordUtils;
|
||||
import org.bukkit.ChatColor;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.Collection;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.Locale;
|
||||
import java.util.Map;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* @author Acrobot
|
||||
|
@ -22,9 +25,13 @@ public class StringUtil {
|
|||
if (string == null || string.isEmpty()) {
|
||||
return string;
|
||||
}
|
||||
char[] separators = new char[]{separator};
|
||||
|
||||
return WordUtils.capitalize(string.toLowerCase(Locale.ROOT), separators).replace(String.valueOf(separator), " ");
|
||||
// Split into words
|
||||
String[] words = string.toLowerCase(Locale.ROOT).split(String.valueOf(separator));
|
||||
// Capitalize every word and return joined string
|
||||
return Arrays.stream(words)
|
||||
.map(word -> word.substring(0, 1).toUpperCase(Locale.ROOT) + word.substring(1))
|
||||
.collect(Collectors.joining(" "));
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -116,4 +123,52 @@ public class StringUtil {
|
|||
}
|
||||
return width;
|
||||
}
|
||||
|
||||
/**
|
||||
* Strip whitespace from the front and back
|
||||
* @param string The string to strip
|
||||
* @return The string with all whitespace from front and back stripped; returns null if input is null
|
||||
*/
|
||||
public static String strip(String string) {
|
||||
if (string == null)
|
||||
return null;
|
||||
// The result stripped string
|
||||
StringBuilder stripped = new StringBuilder();
|
||||
// The current white space which only gets added once we find a non-whitespace character
|
||||
StringBuilder cachedWhitespace = new StringBuilder();
|
||||
// Check each code point (not characters to support UTF16 properly)
|
||||
for (int codePoint : string.codePoints().toArray()) {
|
||||
// Check if it's a whitespace, so we know if we should add it
|
||||
if (!Character.isWhitespace(codePoint)) {
|
||||
// Check if we have cached whitespace, if so append it first and reset the cache
|
||||
if (cachedWhitespace.length() > 0) {
|
||||
stripped.append(cachedWhitespace);
|
||||
cachedWhitespace = new StringBuilder();
|
||||
}
|
||||
// Append current code point
|
||||
stripped.appendCodePoint(codePoint);
|
||||
} else if (stripped.length() > 0) {
|
||||
// If we already have some non-whitespace content in the final stripped
|
||||
// then cache the current whitespace as it wasn't at the start
|
||||
cachedWhitespace.appendCodePoint(codePoint);
|
||||
} // Otherwise, this was the start, and we don't need the cached whitespace
|
||||
}
|
||||
// Return the stripped string, without any whitespace from the end left
|
||||
return stripped.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a map from strings
|
||||
* @param values The values to add
|
||||
* @return The map
|
||||
*/
|
||||
public static Map<String, String> map(String... values) {
|
||||
Map<String, String> map = new LinkedHashMap<>();
|
||||
|
||||
for (int i = 0; i + 1 < values.length; i+=2) {
|
||||
map.put(values[i], values[i + 1]);
|
||||
}
|
||||
|
||||
return map;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -3,6 +3,7 @@ package com.Acrobot.ChestShop;
|
|||
import com.Acrobot.Breeze.Configuration.Configuration;
|
||||
import com.Acrobot.ChestShop.Commands.Give;
|
||||
import com.Acrobot.ChestShop.Commands.ItemInfo;
|
||||
import com.Acrobot.ChestShop.Commands.ShopInfo;
|
||||
import com.Acrobot.ChestShop.Commands.Toggle;
|
||||
import com.Acrobot.ChestShop.Commands.Version;
|
||||
import com.Acrobot.ChestShop.Commands.AccessToggle;
|
||||
|
@ -18,8 +19,12 @@ import com.Acrobot.ChestShop.Listeners.Economy.TaxModule;
|
|||
import com.Acrobot.ChestShop.Listeners.AuthMeChestShopListener;
|
||||
import com.Acrobot.ChestShop.Listeners.GarbageTextListener;
|
||||
import com.Acrobot.ChestShop.Listeners.Item.ItemMoveListener;
|
||||
import com.Acrobot.ChestShop.Listeners.Item.ItemStringListener;
|
||||
import com.Acrobot.ChestShop.Listeners.ItemInfoListener;
|
||||
import com.Acrobot.ChestShop.Listeners.Modules.ItemAliasModule;
|
||||
import com.Acrobot.ChestShop.Listeners.Modules.MetricsModule;
|
||||
import com.Acrobot.ChestShop.Listeners.Modules.StockCounterModule;
|
||||
import com.Acrobot.ChestShop.Listeners.ShopInfoListener;
|
||||
import com.Acrobot.ChestShop.Listeners.SignParseListener;
|
||||
import com.Acrobot.ChestShop.Listeners.Modules.DiscountModule;
|
||||
import com.Acrobot.ChestShop.Listeners.Modules.PriceRestrictionModule;
|
||||
|
@ -46,6 +51,11 @@ import com.google.common.collect.ImmutableMap;
|
|||
import com.google.common.io.ByteArrayDataOutput;
|
||||
import com.google.common.io.ByteStreams;
|
||||
|
||||
import net.kyori.adventure.platform.bukkit.BukkitAudiences;
|
||||
import net.kyori.adventure.text.Component;
|
||||
import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer;
|
||||
import net.md_5.bungee.api.chat.BaseComponent;
|
||||
import net.md_5.bungee.chat.ComponentSerializer;
|
||||
import org.apache.logging.log4j.Level;
|
||||
import org.apache.logging.log4j.LogManager;
|
||||
import org.apache.logging.log4j.Marker;
|
||||
|
@ -56,6 +66,12 @@ import org.apache.logging.log4j.core.filter.AbstractFilter;
|
|||
import org.apache.logging.log4j.message.Message;
|
||||
|
||||
import org.bstats.bukkit.Metrics;
|
||||
import org.bstats.charts.AdvancedBarChart;
|
||||
import org.bstats.charts.DrilldownPie;
|
||||
import org.bstats.charts.MultiLineChart;
|
||||
import org.bstats.charts.SimpleBarChart;
|
||||
import org.bstats.charts.SimplePie;
|
||||
import org.bstats.charts.SingleLineChart;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.Server;
|
||||
|
@ -73,9 +89,12 @@ import java.io.IOException;
|
|||
import java.util.ArrayList;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.Map;
|
||||
import java.util.UUID;
|
||||
import java.util.concurrent.Callable;
|
||||
import java.util.concurrent.ExecutorService;
|
||||
import java.util.concurrent.Executors;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.jar.JarFile;
|
||||
import java.util.logging.FileHandler;
|
||||
import java.util.logging.Logger;
|
||||
|
@ -90,11 +109,17 @@ public class ChestShop extends JavaPlugin {
|
|||
private static ChestShop plugin;
|
||||
private static Server server;
|
||||
private static PluginDescriptionFile description;
|
||||
private static final ExecutorService executorService = Executors.newCachedThreadPool();
|
||||
|
||||
private static Metrics bStats;
|
||||
|
||||
private static BukkitAudiences audiences;
|
||||
|
||||
private static File dataFolder;
|
||||
private static ItemDatabase itemDatabase;
|
||||
|
||||
private static Logger logger;
|
||||
private static Logger shopLogger;
|
||||
private FileHandler handler;
|
||||
|
||||
private List<PluginCommand> commands = new ArrayList<>();
|
||||
|
@ -102,6 +127,8 @@ public class ChestShop extends JavaPlugin {
|
|||
public ChestShop() {
|
||||
dataFolder = getDataFolder();
|
||||
logger = getLogger();
|
||||
shopLogger = Logger.getLogger("ChestShop Shops");
|
||||
shopLogger.setParent(logger);
|
||||
description = getDescription();
|
||||
server = getServer();
|
||||
plugin = this;
|
||||
|
@ -114,12 +141,15 @@ public class ChestShop extends JavaPlugin {
|
|||
|
||||
@Override
|
||||
public void onEnable() {
|
||||
bStats = new Metrics(this, 1109);
|
||||
audiences = BukkitAudiences.create(this);
|
||||
turnOffDatabaseLogging();
|
||||
if (!handleMigrations()) {
|
||||
return;
|
||||
}
|
||||
|
||||
registerCommand("iteminfo", new ItemInfo(), Permission.ITEMINFO);
|
||||
registerCommand("shopinfo", new ShopInfo(), Permission.SHOPINFO);
|
||||
registerCommand("csVersion", new Version(), Permission.ADMIN);
|
||||
registerCommand("csMetrics", new com.Acrobot.ChestShop.Commands.Metrics(), Permission.ADMIN);
|
||||
registerCommand("csGive", new Give(), Permission.ADMIN);
|
||||
|
@ -139,20 +169,6 @@ public class ChestShop extends JavaPlugin {
|
|||
|
||||
registerPluginMessagingChannels();
|
||||
|
||||
if (Properties.LOG_TO_FILE) {
|
||||
File log = loadFile("ChestShop.log");
|
||||
|
||||
FileHandler handler = loadHandler(log.getAbsolutePath());
|
||||
handler.setFormatter(new FileFormatter());
|
||||
|
||||
this.handler = handler;
|
||||
logger.addHandler(handler);
|
||||
}
|
||||
|
||||
if (!Properties.LOG_TO_CONSOLE) {
|
||||
logger.setUseParentHandlers(false);
|
||||
}
|
||||
|
||||
startStatistics();
|
||||
startBuildNotificatier();
|
||||
startUpdater();
|
||||
|
@ -160,9 +176,11 @@ public class ChestShop extends JavaPlugin {
|
|||
|
||||
private void registerCommand(String name, CommandExecutor executor, Permission permission) {
|
||||
PluginCommand command = getCommand(name);
|
||||
command.setExecutor(executor);
|
||||
command.setPermission(permission.toString());
|
||||
commands.add(command);
|
||||
if (command != null) {
|
||||
command.setExecutor(executor);
|
||||
command.setPermission(permission.toString());
|
||||
commands.add(command);
|
||||
}
|
||||
}
|
||||
|
||||
public void loadConfig() {
|
||||
|
@ -173,6 +191,22 @@ public class ChestShop extends JavaPlugin {
|
|||
NameManager.load();
|
||||
|
||||
commands.forEach(c -> c.setPermissionMessage(Messages.ACCESS_DENIED.getTextWithPrefix(null)));
|
||||
|
||||
if (handler != null) {
|
||||
shopLogger.removeHandler(handler);
|
||||
}
|
||||
|
||||
if (Properties.LOG_TO_FILE) {
|
||||
if (handler == null) {
|
||||
File log = loadFile("ChestShop.log");
|
||||
|
||||
handler = loadHandler(log.getAbsolutePath());
|
||||
handler.setFormatter(new FileFormatter());
|
||||
}
|
||||
shopLogger.addHandler(handler);
|
||||
}
|
||||
|
||||
shopLogger.setUseParentHandlers(Properties.LOG_TO_CONSOLE);
|
||||
}
|
||||
|
||||
private void turnOffDatabaseLogging() {
|
||||
|
@ -225,7 +259,7 @@ public class ChestShop extends JavaPlugin {
|
|||
try {
|
||||
previousVersion.save(versionFile);
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
getLogger().log(java.util.logging.Level.SEVERE, "Unable to save new database version " + Migrations.CURRENT_DATABASE_VERSION, e);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -242,7 +276,7 @@ public class ChestShop extends JavaPlugin {
|
|||
try {
|
||||
previousVersion.save(versionFile);
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
getLogger().log(java.util.logging.Level.SEVERE, "Unable to save new database version " + newVersion, e);
|
||||
}
|
||||
}
|
||||
return true;
|
||||
|
@ -263,7 +297,7 @@ public class ChestShop extends JavaPlugin {
|
|||
|
||||
file.createNewFile();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
getBukkitLogger().log(java.util.logging.Level.SEVERE, "Unable to load file " + file.getName(), e);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -276,14 +310,17 @@ public class ChestShop extends JavaPlugin {
|
|||
try {
|
||||
handler = new FileHandler(path, true);
|
||||
} catch (IOException ex) {
|
||||
ex.printStackTrace();
|
||||
getBukkitLogger().log(java.util.logging.Level.SEVERE, "Unable to load handler " + path, ex);
|
||||
}
|
||||
|
||||
return handler;
|
||||
}
|
||||
|
||||
public void onDisable() {
|
||||
getServer().getScheduler().cancelTasks(this);
|
||||
executorService.shutdown();
|
||||
try {
|
||||
executorService.awaitTermination(15, TimeUnit.SECONDS);
|
||||
} catch (InterruptedException ignored) {}
|
||||
|
||||
Toggle.clearToggledPlayers();
|
||||
|
||||
|
@ -297,6 +334,8 @@ public class ChestShop extends JavaPlugin {
|
|||
private void registerEvents() {
|
||||
registerEvent(new com.Acrobot.ChestShop.Plugins.ChestShop()); //Chest protection
|
||||
|
||||
registerEvent(new Dependencies());
|
||||
|
||||
registerEvent(new NameManager());
|
||||
|
||||
registerPreShopCreationEvents();
|
||||
|
@ -319,7 +358,9 @@ public class ChestShop extends JavaPlugin {
|
|||
registerEvent(new PlayerTeleport());
|
||||
|
||||
registerEvent(new SignParseListener());
|
||||
registerEvent(new ItemStringListener());
|
||||
registerEvent(new ItemInfoListener());
|
||||
registerEvent(new ShopInfoListener());
|
||||
registerEvent(new GarbageTextListener());
|
||||
|
||||
Plugin authMe = getServer().getPluginManager().getPlugin("AuthMe");
|
||||
|
@ -369,6 +410,7 @@ public class ChestShop extends JavaPlugin {
|
|||
registerEvent(new AmountAndPriceChecker());
|
||||
}
|
||||
|
||||
registerEvent(new InvalidNameIgnorer());
|
||||
registerEvent(new CreativeModeIgnorer());
|
||||
registerEvent(new ErrorMessageSender());
|
||||
registerEvent(new PermissionChecker());
|
||||
|
@ -387,9 +429,11 @@ public class ChestShop extends JavaPlugin {
|
|||
}
|
||||
|
||||
private void registerModules() {
|
||||
registerEvent(new ItemAliasModule());
|
||||
registerEvent(new DiscountModule());
|
||||
registerEvent(new MetricsModule());
|
||||
registerEvent(new PriceRestrictionModule());
|
||||
registerEvent(new StockCounterModule());
|
||||
|
||||
registerEconomicalModules();
|
||||
}
|
||||
|
@ -410,32 +454,65 @@ public class ChestShop extends JavaPlugin {
|
|||
}
|
||||
|
||||
private void startStatistics() {
|
||||
Metrics bStats = new Metrics(this, 1109);
|
||||
try {
|
||||
String dist = new JarFile(this.getFile()).getManifest().getMainAttributes().getValue("Distribution-Type");
|
||||
bStats.addCustomChart(new Metrics.SimplePie("distributionType", () -> dist));
|
||||
try (JarFile jarFile = new JarFile(this.getFile())) {
|
||||
String dist = jarFile.getManifest().getMainAttributes().getValue("Distribution-Type");
|
||||
bStats.addCustomChart(new SimplePie("distributionType", () -> dist));
|
||||
} catch (IOException ignored) {}
|
||||
|
||||
bStats.addCustomChart(new Metrics.SingleLineChart("shopAccounts", NameManager::getAccountCount));
|
||||
bStats.addCustomChart(new Metrics.MultiLineChart("transactionCount", () -> ImmutableMap.of(
|
||||
String serverVersion = getServer().getBukkitVersion().split("-")[0];
|
||||
bStats.addCustomChart(createStaticDrilldownStat("versionMcSelf", serverVersion, getDescription().getVersion()));
|
||||
bStats.addCustomChart(createStaticDrilldownStat("versionSelfMc", getDescription().getVersion(), serverVersion));
|
||||
|
||||
bStats.addCustomChart(createStaticDrilldownStat("serverTypeVersionSelf", getServer().getName(), getDescription().getVersion()));
|
||||
bStats.addCustomChart(createStaticDrilldownStat("versionSelfServerType", getDescription().getVersion(), getServer().getName()));
|
||||
|
||||
bStats.addCustomChart(createStaticDrilldownStat("versionMcServerType", serverVersion, getServer().getName()));
|
||||
bStats.addCustomChart(createStaticDrilldownStat("serverTypeVersionMc", getServer().getName(), serverVersion));
|
||||
|
||||
String javaVersion = System.getProperty("java.version");
|
||||
bStats.addCustomChart(createStaticDrilldownStat("versionJavaSelf", javaVersion, getDescription().getVersion()));
|
||||
bStats.addCustomChart(createStaticDrilldownStat("versionSelfJava", getDescription().getVersion(), javaVersion));
|
||||
|
||||
bStats.addCustomChart(createStaticDrilldownStat("versionJavaMc", javaVersion, serverVersion));
|
||||
bStats.addCustomChart(createStaticDrilldownStat("versionMcJava", serverVersion, javaVersion));
|
||||
|
||||
bStats.addCustomChart(new SingleLineChart("shopAccounts", NameManager::getAccountCount));
|
||||
bStats.addCustomChart(new MultiLineChart("transactionCount", () -> ImmutableMap.of(
|
||||
"total", MetricsModule.getTotalTransactions(),
|
||||
"buy", MetricsModule.getBuyTransactions(),
|
||||
"sell", MetricsModule.getSellTransactions()
|
||||
)));bStats.addCustomChart(new Metrics.MultiLineChart("itemCount", () -> ImmutableMap.of(
|
||||
)));
|
||||
bStats.addCustomChart(new MultiLineChart("itemCount", () -> ImmutableMap.of(
|
||||
"total", MetricsModule.getTotalItemsCount(),
|
||||
"buy", MetricsModule.getSoldItemsCount(),
|
||||
"sell", MetricsModule.getBoughtItemsCount()
|
||||
)));
|
||||
|
||||
bStats.addCustomChart(new Metrics.SimplePie("includeSettingsInMetrics", () -> Properties.INCLUDE_SETTINGS_IN_METRICS ? "enabled" : "disabled"));
|
||||
bStats.addCustomChart(new SimplePie("includeSettingsInMetrics", () -> Properties.INCLUDE_SETTINGS_IN_METRICS ? "enabled" : "disabled"));
|
||||
if (!Properties.INCLUDE_SETTINGS_IN_METRICS) return;
|
||||
|
||||
bStats.addCustomChart(new Metrics.AdvancedBarChart("pluginProperties", () -> {
|
||||
bStats.addCustomChart(new SimplePie("ensure-correct-playerid", () -> Properties.ENSURE_CORRECT_PLAYERID ? "enabled" : "disabled"));
|
||||
bStats.addCustomChart(new SimplePie("allow-sign-chest-open", () -> Properties.ALLOW_SIGN_CHEST_OPEN ? "enabled" : "disabled"));
|
||||
bStats.addCustomChart(new SimplePie("uses-server-economy-account", () -> !Properties.SERVER_ECONOMY_ACCOUNT.isEmpty() ? "enabled" : "disabled"));
|
||||
bStats.addCustomChart(new SimplePie("uses-server-economy-account-uuid", () -> !Properties.SERVER_ECONOMY_ACCOUNT_UUID.equals(new UUID(0, 0)) ? "enabled" : "disabled"));
|
||||
bStats.addCustomChart(new SimplePie("allow-partial-transactions", () -> Properties.ALLOW_PARTIAL_TRANSACTIONS ? "enabled" : "disabled"));
|
||||
bStats.addCustomChart(new SimplePie("bungeecord-messages", () -> Properties.BUNGEECORD_MESSAGES ? "enabled" : "disabled"));
|
||||
bStats.addCustomChart(new SimplePie("allow-multiple-shops-at-one-block", () -> Properties.ALLOW_MULTIPLE_SHOPS_AT_ONE_BLOCK ? "enabled" : "disabled"));
|
||||
bStats.addCustomChart(new SimplePie("allow-partial-transactions", () -> Properties.ALLOW_PARTIAL_TRANSACTIONS ? "enabled" : "disabled"));
|
||||
bStats.addCustomChart(new SimplePie("log-to-console", () -> Properties.LOG_TO_CONSOLE ? "enabled" : "disabled"));
|
||||
bStats.addCustomChart(new SimplePie("log-to-file", () -> Properties.LOG_TO_FILE ? "enabled" : "disabled"));
|
||||
bStats.addCustomChart(new SimplePie("auto-update", () -> !Properties.TURN_OFF_UPDATES ? "enabled" : "disabled"));
|
||||
bStats.addCustomChart(new SimplePie("release-notifications", () -> !Properties.TURN_OFF_UPDATE_NOTIFIER ? "enabled" : "disabled"));
|
||||
bStats.addCustomChart(new SimplePie("dev-build-notifications", () -> !Properties.TURN_OFF_DEV_UPDATE_NOTIFIER ? "enabled" : "disabled"));
|
||||
|
||||
bStats.addCustomChart(new AdvancedBarChart("pluginProperties", () -> {
|
||||
Map<String, int[]> map = new LinkedHashMap<>();
|
||||
map.put("ensure-correct-playerid", getChartArray(Properties.ENSURE_CORRECT_PLAYERID));
|
||||
map.put("reverse-buttons", getChartArray(Properties.REVERSE_BUTTONS));
|
||||
map.put("shift-sells-in-stacks", getChartArray(Properties.SHIFT_SELLS_IN_STACKS));
|
||||
map.put("shift-sells-everything", getChartArray(Properties.SHIFT_SELLS_EVERYTHING));
|
||||
map.put("allow-sign-chest-open", getChartArray(!Properties.ALLOW_SIGN_CHEST_OPEN));
|
||||
map.put("sign-dying", getChartArray(!Properties.SIGN_DYING));
|
||||
map.put("remove-empty-shops", getChartArray(!Properties.REMOVE_EMPTY_SHOPS));
|
||||
map.put("remove-empty-chests", getChartArray(!Properties.REMOVE_EMPTY_CHESTS));
|
||||
map.put("uses-server-economy-account", getChartArray(!Properties.SERVER_ECONOMY_ACCOUNT.isEmpty()));
|
||||
|
@ -445,12 +522,20 @@ public class ChestShop extends JavaPlugin {
|
|||
map.put("bungeecord-messages", getChartArray(Properties.BUNGEECORD_MESSAGES));
|
||||
map.put("log-to-console", getChartArray(Properties.LOG_TO_CONSOLE));
|
||||
map.put("log-to-file", getChartArray(Properties.LOG_TO_FILE));
|
||||
map.put("auto-update", getChartArray(!Properties.TURN_OFF_UPDATES));
|
||||
map.put("release-notifications", getChartArray(!Properties.TURN_OFF_UPDATE_NOTIFIER));
|
||||
map.put("dev-build-notifications", getChartArray(!Properties.TURN_OFF_DEV_UPDATE_NOTIFIER));
|
||||
return map;
|
||||
}));
|
||||
bStats.addCustomChart(new Metrics.SimpleBarChart("shopContainers",
|
||||
bStats.addCustomChart(new SimpleBarChart("shopContainers",
|
||||
() -> Properties.SHOP_CONTAINERS.stream().map(Material::name).collect(Collectors.toMap(k -> k, k -> 1))));
|
||||
}
|
||||
|
||||
public static DrilldownPie createStaticDrilldownStat(String statId, String value1, String value2) {
|
||||
final Map<String, Map<String, Integer>> map = ImmutableMap.of(value1, ImmutableMap.of(value2, 1));
|
||||
return new DrilldownPie(statId, () -> map);
|
||||
}
|
||||
|
||||
private int[] getChartArray(boolean value) {
|
||||
return new int[]{!value ? 1 : 0, value ? 0 : 1};
|
||||
}
|
||||
|
@ -460,10 +545,18 @@ public class ChestShop extends JavaPlugin {
|
|||
private void startUpdater() {
|
||||
if (Properties.TURN_OFF_UPDATES) {
|
||||
getLogger().info("Auto-updater is disabled. If you want the plugin to automatically download new releases then set 'TURN_OFF_UPDATES' to 'false' in your config.yml!");
|
||||
if (!Properties.TURN_OFF_UPDATE_NOTIFIER) {
|
||||
final Updater updater = new Updater(this, getPluginName().toLowerCase(Locale.ROOT), this.getFile(), Updater.UpdateType.NO_DOWNLOAD, true);
|
||||
runInAsyncThread(() -> {
|
||||
if (updater.getResult() == Updater.UpdateResult.UPDATE_AVAILABLE) {
|
||||
getLogger().info("There is a new version available: " + updater.getLatestName() + ". You can download it from https://modrinth.com/plugin/" + getPluginName().toLowerCase(Locale.ROOT));
|
||||
}
|
||||
});
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
new Updater(this, PROJECT_BUKKITDEV_ID, this.getFile(), Updater.UpdateType.DEFAULT, true);
|
||||
new Updater(this, getPluginName().toLowerCase(Locale.ROOT), this.getFile(), Updater.UpdateType.DEFAULT, true);
|
||||
}
|
||||
|
||||
private static final String PROJECT_JENKINS_JOB_URL = "https://ci.minebench.de/job/ChestShop-3/";
|
||||
|
@ -486,10 +579,20 @@ public class ChestShop extends JavaPlugin {
|
|||
return dataFolder;
|
||||
}
|
||||
|
||||
public static Logger getShopLogger() {
|
||||
return shopLogger;
|
||||
}
|
||||
|
||||
public static Logger getBukkitLogger() {
|
||||
return logger;
|
||||
}
|
||||
|
||||
public static void logDebug(String message) {
|
||||
if (Properties.DEBUG) {
|
||||
getBukkitLogger().info("[DEBUG] " + message);
|
||||
}
|
||||
}
|
||||
|
||||
public static Server getBukkitServer() {
|
||||
return server;
|
||||
}
|
||||
|
@ -510,27 +613,51 @@ public class ChestShop extends JavaPlugin {
|
|||
return plugin;
|
||||
}
|
||||
|
||||
public static Metrics getMetrics() {
|
||||
return bStats;
|
||||
}
|
||||
|
||||
public static BukkitAudiences getAudiences() {
|
||||
return audiences;
|
||||
}
|
||||
|
||||
public static void registerListener(Listener listener) {
|
||||
plugin.registerEvent(listener);
|
||||
}
|
||||
|
||||
public static void callEvent(Event event) {
|
||||
public static <E extends Event> E callEvent(E event) {
|
||||
Bukkit.getPluginManager().callEvent(event);
|
||||
return event;
|
||||
}
|
||||
|
||||
public static void sendBungeeMessage(String playerName, Messages.Message message, Map<String, String> replacementMap, String... replacements) {
|
||||
// TODO: Component support for bungee messages?
|
||||
sendBungeeMessage(playerName, message.getTextWithPrefix(null, replacementMap, replacements));
|
||||
sendBungeeMessage(playerName, message.getComponent(null, true, replacementMap, replacements));
|
||||
}
|
||||
|
||||
public static void sendBungeeMessage(String playerName, String message) {
|
||||
sendBungeeMessage(playerName, "Message", message);
|
||||
}
|
||||
|
||||
public static void sendBungeeMessage(String playerName, BaseComponent[] message) {
|
||||
sendBungeeMessage(playerName, "MessageRaw", ComponentSerializer.toString(message));
|
||||
}
|
||||
|
||||
public static void sendBungeeMessage(String playerName, Component message) {
|
||||
sendBungeeMessage(playerName, "MessageRaw", GsonComponentSerializer.gson().serialize(message));
|
||||
}
|
||||
|
||||
private static void sendBungeeMessage(String playerName, String channel, String message) {
|
||||
if (Properties.BUNGEECORD_MESSAGES && !Bukkit.getOnlinePlayers().isEmpty()) {
|
||||
ByteArrayDataOutput out = ByteStreams.newDataOutput();
|
||||
out.writeUTF("Message");
|
||||
out.writeUTF(channel);
|
||||
out.writeUTF(playerName);
|
||||
out.writeUTF(message);
|
||||
|
||||
Bukkit.getOnlinePlayers().iterator().next().sendPluginMessage(plugin, "BungeeCord", out.toByteArray());
|
||||
}
|
||||
}
|
||||
|
||||
public static void runInAsyncThread(Runnable runnable) {
|
||||
executorService.submit(runnable);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
package com.Acrobot.ChestShop.Commands;
|
||||
|
||||
import com.Acrobot.ChestShop.Configuration.Messages;
|
||||
import org.apache.commons.lang.Validate;
|
||||
import com.google.common.base.Preconditions;
|
||||
import org.bukkit.OfflinePlayer;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandExecutor;
|
||||
|
@ -43,7 +43,7 @@ public class AccessToggle implements CommandExecutor {
|
|||
}
|
||||
|
||||
public static boolean setIgnoring(Player player, boolean ignoring) {
|
||||
Validate.notNull(player); // Make sure the player instance is not null, in case there are any errors in the code
|
||||
Preconditions.checkNotNull(player); // Make sure the player instance is not null, in case there are any errors in the code
|
||||
|
||||
if (ignoring) {
|
||||
toggledPlayers.add(player.getUniqueId());
|
||||
|
|
|
@ -5,7 +5,7 @@ import com.Acrobot.Breeze.Utils.MaterialUtil;
|
|||
import com.Acrobot.Breeze.Utils.NumberUtil;
|
||||
import com.Acrobot.ChestShop.Configuration.Messages;
|
||||
import com.Acrobot.ChestShop.Events.ItemParseEvent;
|
||||
import com.Acrobot.ChestShop.Permission;
|
||||
import com.Acrobot.ChestShop.Utils.ItemUtil;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandExecutor;
|
||||
|
@ -13,8 +13,9 @@ import org.bukkit.command.CommandSender;
|
|||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
* @author Acrobot
|
||||
|
@ -30,7 +31,7 @@ public class Give implements CommandExecutor {
|
|||
Player receiver = (sender instanceof Player ? (Player) sender : null);
|
||||
int quantity = 1;
|
||||
|
||||
List<Integer> disregardedIndexes = new ArrayList<Integer>();
|
||||
Set<Integer> disregardedIndexes = new HashSet<>();
|
||||
|
||||
if (args.length > 1) {
|
||||
for (int index = args.length - 1; index >= 0; --index) {
|
||||
|
@ -46,7 +47,7 @@ public class Give implements CommandExecutor {
|
|||
}
|
||||
|
||||
for (int index = args.length - 1; index >= 0; --index) {
|
||||
if (!NumberUtil.isInteger(args[index]) || Integer.parseInt(args[index]) < 0) {
|
||||
if (disregardedIndexes.contains(index) || !NumberUtil.isInteger(args[index]) || Integer.parseInt(args[index]) < 0) {
|
||||
continue;
|
||||
}
|
||||
|
||||
|
@ -72,12 +73,12 @@ public class Give implements CommandExecutor {
|
|||
item.setAmount(quantity);
|
||||
InventoryUtil.add(item, receiver.getInventory());
|
||||
|
||||
Messages.ITEM_GIVEN.send(sender, "item", MaterialUtil.getName(item), "player", receiver.getName());
|
||||
Messages.ITEM_GIVEN.send(sender, "item", ItemUtil.getName(item), "player", receiver.getName());
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
private static ItemStack getItem(String[] arguments, List<Integer> disregardedElements) {
|
||||
private static ItemStack getItem(String[] arguments, Set<Integer> disregardedElements) {
|
||||
StringBuilder builder = new StringBuilder(arguments.length * 5);
|
||||
|
||||
for (int index = 0; index < arguments.length; ++index) {
|
||||
|
|
|
@ -4,22 +4,25 @@ import com.Acrobot.Breeze.Utils.MaterialUtil;
|
|||
import com.Acrobot.Breeze.Utils.StringUtil;
|
||||
import com.Acrobot.ChestShop.ChestShop;
|
||||
import com.Acrobot.ChestShop.Configuration.Messages;
|
||||
import com.Acrobot.ChestShop.Configuration.Properties;
|
||||
import com.Acrobot.ChestShop.Events.ItemInfoEvent;
|
||||
import com.Acrobot.ChestShop.Events.ItemParseEvent;
|
||||
import com.Acrobot.ChestShop.Utils.ItemUtil;
|
||||
import com.google.common.collect.ImmutableMap;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandExecutor;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.HumanEntity;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
|
||||
import java.util.Map;
|
||||
import java.util.logging.Level;
|
||||
|
||||
import static com.Acrobot.ChestShop.Configuration.Messages.iteminfo;
|
||||
import static com.Acrobot.ChestShop.Configuration.Messages.iteminfo_fullname;
|
||||
import static com.Acrobot.ChestShop.Configuration.Messages.iteminfo_shopname;
|
||||
import static com.Acrobot.ChestShop.Configuration.Messages.replace;
|
||||
|
||||
/**
|
||||
* @author Acrobot
|
||||
|
@ -45,16 +48,10 @@ public class ItemInfo implements CommandExecutor {
|
|||
}
|
||||
|
||||
iteminfo.send(sender);
|
||||
try {
|
||||
iteminfo_fullname.send(sender, "item", MaterialUtil.getName(item));
|
||||
} catch (IllegalArgumentException e) {
|
||||
sender.sendMessage(ChatColor.RED + "Error while generating full name. Please contact an admin or take a look at the console/log!");
|
||||
ChestShop.getPlugin().getLogger().log(Level.SEVERE, "Error while generating full item name", e);
|
||||
return true;
|
||||
}
|
||||
if (!sendItemName(sender, item, Messages.iteminfo_fullname)) return true;
|
||||
|
||||
try {
|
||||
iteminfo_shopname.send(sender, "item", MaterialUtil.getSignName(item));
|
||||
iteminfo_shopname.send(sender, "item", ItemUtil.getSignName(item));
|
||||
} catch (IllegalArgumentException e) {
|
||||
sender.sendMessage(ChatColor.RED + "Error while generating shop sign name. Please contact an admin or take a look at the console/log!");
|
||||
ChestShop.getPlugin().getLogger().log(Level.SEVERE, "Error while generating shop sign item name", e);
|
||||
|
@ -66,4 +63,19 @@ public class ItemInfo implements CommandExecutor {
|
|||
|
||||
return true;
|
||||
}
|
||||
|
||||
public static boolean sendItemName(CommandSender sender, ItemStack item, Messages.Message message) {
|
||||
try {
|
||||
Map<String, String> replacementMap = ImmutableMap.of("item", ItemUtil.getName(item));
|
||||
if (!Properties.SHOWITEM_MESSAGE || !(sender instanceof Player)
|
||||
|| !MaterialUtil.Show.sendMessage((Player) sender, sender.getName(), message, false, new ItemStack[]{item}, replacementMap)) {
|
||||
message.send(sender, replacementMap);
|
||||
}
|
||||
} catch (IllegalArgumentException e) {
|
||||
sender.sendMessage(ChatColor.RED + "Error while generating full name. Please contact an admin or take a look at the console/log!");
|
||||
ChestShop.getPlugin().getLogger().log(Level.SEVERE, "Error while generating full item name", e);
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,43 @@
|
|||
package com.Acrobot.ChestShop.Commands;
|
||||
|
||||
import com.Acrobot.ChestShop.ChestShop;
|
||||
import com.Acrobot.ChestShop.Configuration.Messages;
|
||||
import com.Acrobot.ChestShop.Events.ShopInfoEvent;
|
||||
import com.Acrobot.ChestShop.Signs.ChestShopSign;
|
||||
import com.Acrobot.ChestShop.Utils.uBlock;
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.block.Sign;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandExecutor;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
/**
|
||||
* @author Phoenix616
|
||||
*/
|
||||
public class ShopInfo implements CommandExecutor {
|
||||
public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
|
||||
if (sender instanceof Player) {
|
||||
Block target = ((Player) sender).getTargetBlockExact(5);
|
||||
if (target != null) {
|
||||
Sign sign = null;
|
||||
if (ChestShopSign.isValid(target)) {
|
||||
sign = (Sign) target.getState();
|
||||
} else if (uBlock.couldBeShopContainer(target)) {
|
||||
sign = uBlock.getConnectedSign(target);
|
||||
}
|
||||
|
||||
if (sign != null) {
|
||||
ShopInfoEvent event = new ShopInfoEvent((Player) sender, sign);
|
||||
ChestShop.callEvent(event);
|
||||
} else {
|
||||
Messages.NO_SHOP_FOUND.sendWithPrefix(sender);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
sender.sendMessage(ChatColor.RED + "Command must be run by a player!");
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
|
@ -1,7 +1,7 @@
|
|||
package com.Acrobot.ChestShop.Commands;
|
||||
|
||||
import com.Acrobot.ChestShop.Configuration.Messages;
|
||||
import org.apache.commons.lang.Validate;
|
||||
import com.google.common.base.Preconditions;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.OfflinePlayer;
|
||||
import org.bukkit.command.Command;
|
||||
|
@ -61,7 +61,7 @@ public class Toggle implements CommandExecutor {
|
|||
}
|
||||
|
||||
public static boolean setIgnoring(Player player, boolean ignoring) {
|
||||
Validate.notNull(player); // Make sure the player instance is not null, in case there are any errors in the code
|
||||
Preconditions.checkNotNull(player); // Make sure the player instance is not null, in case there are any errors in the code
|
||||
|
||||
if (ignoring) {
|
||||
toggledPlayers.add(player.getUniqueId());
|
||||
|
|
|
@ -2,11 +2,13 @@ package com.Acrobot.ChestShop.Configuration;
|
|||
|
||||
import com.Acrobot.Breeze.Configuration.Configuration;
|
||||
import com.Acrobot.ChestShop.ChestShop;
|
||||
import de.themoep.minedown.MineDown;
|
||||
import de.themoep.minedown.adventure.MineDown;
|
||||
import de.themoep.utils.lang.bukkit.BukkitLanguageConfig;
|
||||
import de.themoep.utils.lang.bukkit.LanguageManager;
|
||||
import net.kyori.adventure.text.Component;
|
||||
import net.kyori.adventure.text.serializer.bungeecord.BungeeComponentSerializer;
|
||||
import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer;
|
||||
import net.md_5.bungee.api.chat.BaseComponent;
|
||||
import net.md_5.bungee.api.chat.TextComponent;
|
||||
import org.bukkit.command.CommandSender;
|
||||
|
||||
import java.io.File;
|
||||
|
@ -21,18 +23,34 @@ import java.util.logging.Level;
|
|||
*/
|
||||
public class Messages {
|
||||
public static Message prefix;
|
||||
|
||||
public static Message shopinfo;
|
||||
public static Message shopinfo_buy;
|
||||
public static Message shopinfo_sell;
|
||||
|
||||
public static Message iteminfo;
|
||||
public static Message iteminfo_fullname;
|
||||
public static Message iteminfo_shopname;
|
||||
public static Message iteminfo_repaircost;
|
||||
public static Message iteminfo_book;
|
||||
public static Message iteminfo_book_generation;
|
||||
public static Message iteminfo_leather_color;
|
||||
public static Message iteminfo_bundle_items;
|
||||
public static Message iteminfo_axolotl_variant;
|
||||
public static Message iteminfo_recipes;
|
||||
public static Message iteminfo_map_view;
|
||||
public static Message iteminfo_map_location;
|
||||
public static Message iteminfo_tropical_fish;
|
||||
public static Message iteminfo_crossbow_projectiles;
|
||||
public static Message iteminfo_crossbow_projectile;
|
||||
public static Message iteminfo_lore;
|
||||
|
||||
public static Message METRICS;
|
||||
|
||||
public static Message ACCESS_DENIED;
|
||||
public static Message TRADE_DENIED;
|
||||
public static Message TRADE_DENIED_ACCESS_PERMS;
|
||||
public static Message TRADE_DENIED_CREATIVE_MODE;
|
||||
|
||||
public static Message NOT_ENOUGH_MONEY;
|
||||
public static Message NOT_ENOUGH_MONEY_SHOP;
|
||||
|
@ -64,7 +82,9 @@ public class Messages {
|
|||
public static Message INVALID_SHOP_PRICE;
|
||||
public static Message INVALID_SHOP_QUANTITY;
|
||||
public static Message CANNOT_ACCESS_THE_CHEST;
|
||||
public static Message CANNOT_CHANGE_SIGN_BACKSIDE;
|
||||
|
||||
public static Message SELL_PRICE_HIGHER_THAN_BUY_PRICE;
|
||||
public static Message SELL_PRICE_ABOVE_MAX;
|
||||
public static Message SELL_PRICE_BELOW_MIN;
|
||||
public static Message BUY_PRICE_ABOVE_MAX;
|
||||
|
@ -85,7 +105,9 @@ public class Messages {
|
|||
public static Message PLAYER_NOT_FOUND;
|
||||
public static Message NO_PERMISSION;
|
||||
public static Message INCORRECT_ITEM_ID;
|
||||
public static Message INVALID_CLIENT_NAME;
|
||||
public static Message NOT_ENOUGH_PROTECTIONS;
|
||||
public static Message NO_SHOP_FOUND;
|
||||
|
||||
public static Message CANNOT_CREATE_SHOP_HERE;
|
||||
|
||||
|
@ -123,6 +145,11 @@ public class Messages {
|
|||
}
|
||||
manager = new LanguageManager(ChestShop.getPlugin(), Properties.DEFAULT_LANGUAGE);
|
||||
|
||||
if (manager.getDefaultConfig() == null) {
|
||||
manager.setDefaultLocale("en");
|
||||
ChestShop.getBukkitLogger().log(Level.WARNING, "There is no language file for your DEFAULT_LANGUAGE config setting of '" + Properties.DEFAULT_LANGUAGE + "' in your languages folder! Using default English as default until you have created one or changed the config option to another, existing language file.");
|
||||
}
|
||||
|
||||
// Legacy locale.yml file
|
||||
File legacyFile = new File(ChestShop.getPlugin().getDataFolder(), "local.yml");
|
||||
if (legacyFile.exists()) {
|
||||
|
@ -130,7 +157,7 @@ public class Messages {
|
|||
ChestShop.getBukkitLogger().log(Level.INFO, "As long as the legacy file is used automatic language switching based on the client settings will not be supported!");
|
||||
ChestShop.getBukkitLogger().log(Level.INFO, "Import it into the corresponding language file and remove/rename the file if you don't want it anymore!");
|
||||
manager.addConfig(new BukkitLanguageConfig(ChestShop.getPlugin(), "", legacyFile, "legacy", false));
|
||||
Properties.DEFAULT_LANGUAGE = "legacy";
|
||||
manager.setDefaultLocale("legacy");
|
||||
Properties.USE_CLIENT_LOCALE = false;
|
||||
}
|
||||
|
||||
|
@ -147,25 +174,38 @@ public class Messages {
|
|||
}
|
||||
|
||||
public void sendWithPrefix(CommandSender sender, Map<String, String> replacementMap, String... replacements) {
|
||||
sender.spigot().sendMessage(getComponents(sender, true, replacementMap, replacements));
|
||||
ChestShop.getAudiences().sender(sender).sendMessage(getComponent(sender, true, replacementMap, replacements));
|
||||
}
|
||||
|
||||
public void sendWithPrefix(CommandSender sender, Map<String, String> replacements) {
|
||||
sender.spigot().sendMessage(getComponents(sender, true, replacements));
|
||||
ChestShop.getAudiences().sender(sender).sendMessage(getComponent(sender, true, replacements));
|
||||
}
|
||||
|
||||
public void sendWithPrefix(CommandSender sender, String... replacements) {
|
||||
sender.spigot().sendMessage(getComponents(sender, true, Collections.emptyMap(), replacements));
|
||||
ChestShop.getAudiences().sender(sender).sendMessage(getComponent(sender, true, Collections.emptyMap(), replacements));
|
||||
}
|
||||
|
||||
public void send(CommandSender sender, String... replacements) {
|
||||
sender.spigot().sendMessage(getComponents(sender, false, Collections.emptyMap(), replacements));
|
||||
ChestShop.getAudiences().sender(sender).sendMessage(getComponent(sender, false, Collections.emptyMap(), replacements));
|
||||
}
|
||||
|
||||
public void send(CommandSender sender, Map<String, String> replacements) {
|
||||
ChestShop.getAudiences().sender(sender).sendMessage(getComponent(sender, false, replacements));
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
public BaseComponent[] getComponents(CommandSender sender, boolean prefixSuffix, Map<String, String> replacementMap, String... replacements) {
|
||||
return BungeeComponentSerializer.get().serialize(getComponent(sender, prefixSuffix, replacementMap, replacements));
|
||||
}
|
||||
|
||||
public Component getComponent(CommandSender sender, boolean prefixSuffix, Map<String, String> replacementMap, String... replacements) {
|
||||
MineDown mineDown = new MineDown("%prefix" + getLang(sender));
|
||||
mineDown.placeholderSuffix("");
|
||||
mineDown.replace("prefix", prefixSuffix ? prefix.getLang(sender) : "");
|
||||
if (prefixSuffix) {
|
||||
mineDown.replace("prefix", MineDown.parse(prefix.getLang(sender)));
|
||||
} else {
|
||||
mineDown.replace("prefix", "");
|
||||
}
|
||||
mineDown.replace(replacementMap);
|
||||
mineDown.replace(replacements);
|
||||
return mineDown.toComponent();
|
||||
|
@ -176,7 +216,7 @@ public class Messages {
|
|||
}
|
||||
|
||||
public String getTextWithPrefix(CommandSender sender, Map<String, String> replacementMap, String... replacements) {
|
||||
return TextComponent.toLegacyText(getComponents(sender, true, replacementMap, replacements));
|
||||
return LegacyComponentSerializer.legacySection().serialize(getComponent(sender, true, replacementMap, replacements));
|
||||
}
|
||||
|
||||
public String getTextWithPrefix(CommandSender sender, String... replacements) {
|
||||
|
|
|
@ -43,9 +43,10 @@ public class Properties {
|
|||
if (o instanceof Material) {
|
||||
set.add((Material) o);
|
||||
} else if (o instanceof String) {
|
||||
try {
|
||||
set.add(Material.getMaterial(((String) o).toUpperCase(Locale.ROOT)));
|
||||
} catch (IllegalArgumentException e) {
|
||||
Material m = Material.getMaterial(((String) o).toUpperCase(Locale.ROOT));
|
||||
if (m != null) {
|
||||
set.add(m);
|
||||
} else {
|
||||
ChestShop.getBukkitLogger().log(Level.WARNING, o + " is not a valid Material name in the config!");
|
||||
}
|
||||
}
|
||||
|
@ -102,10 +103,13 @@ public class Properties {
|
|||
@ConfigurationComment("Do you want to turn off the automatic updates of ChestShop?")
|
||||
public static boolean TURN_OFF_UPDATES = true;
|
||||
|
||||
@ConfigurationComment("Do you want to turn off the automatic notifications for releases?")
|
||||
public static boolean TURN_OFF_UPDATE_NOTIFIER = false;
|
||||
|
||||
@ConfigurationComment("Do you want to turn off the automatic notifications for new development builds?")
|
||||
public static boolean TURN_OFF_DEV_UPDATE_NOTIFIER = false;
|
||||
|
||||
@ConfigurationComment("Do you want to include some values of this config in the metrics? (This will not leak sensitive data but help in the development process)")
|
||||
@ConfigurationComment("Do you want to include some values of this config in the metrics? (This will not submit any sensitive data and helps in the development process)")
|
||||
public static boolean INCLUDE_SETTINGS_IN_METRICS = true;
|
||||
|
||||
@PrecededBySpace
|
||||
|
@ -119,6 +123,9 @@ public class Properties {
|
|||
@ConfigurationComment("Should the plugin try to use a language file that matches the client's locale setting?")
|
||||
public static boolean USE_CLIENT_LOCALE = true;
|
||||
|
||||
@ConfigurationComment("Should the plugin strip the colors from formatted price?")
|
||||
public static boolean STRIP_PRICE_COLORS = false;
|
||||
|
||||
@PrecededBySpace
|
||||
@ConfigurationComment("What containers are allowed to hold a shop? (Only blocks with inventories work!)")
|
||||
@Parser("MaterialSet")
|
||||
|
@ -131,10 +138,10 @@ public class Properties {
|
|||
@ConfigurationComment("(In 1/1000th of a second) How often can a player use the shop sign?")
|
||||
public static int SHOP_INTERACTION_INTERVAL = 250;
|
||||
|
||||
@ConfigurationComment("Do you want to allow using shops to people in creative mode?")
|
||||
@ConfigurationComment("Do you want to block people in creative mode from using shops?")
|
||||
public static boolean IGNORE_CREATIVE_MODE = true;
|
||||
|
||||
@ConfigurationComment("Do you want to allow using shops to people who have access to it due to their permissions? (owners are always ignored)")
|
||||
@ConfigurationComment("Do you want to block people who have access to a shop due to their permissions from using it? (owners are always ignored)")
|
||||
public static boolean IGNORE_ACCESS_PERMS = true;
|
||||
|
||||
@ConfigurationComment("If true, people will buy with left-click and sell with right-click.")
|
||||
|
@ -150,7 +157,10 @@ public class Properties {
|
|||
public static String SHIFT_ALLOWS = "ALL";
|
||||
|
||||
@ConfigurationComment("Can shop's chest be opened by owner with right-clicking a shop's sign?")
|
||||
public static boolean ALLOW_SIGN_CHEST_OPEN = true;
|
||||
public static boolean ALLOW_SIGN_CHEST_OPEN = false;
|
||||
|
||||
@ConfigurationComment("If true and in 1.14+, the owner of a chest shop can click with a dye / ink sac to dye the sign.")
|
||||
public static boolean SIGN_DYING = true;
|
||||
|
||||
@ConfigurationComment("If true, when you left-click your own shop sign you won't open chest's inventory, but instead you will start destroying the sign.")
|
||||
public static boolean ALLOW_LEFT_CLICK_DESTROYING = true;
|
||||
|
@ -170,6 +180,9 @@ public class Properties {
|
|||
@ConfigurationComment("First line of your Admin Shop's sign should look like this:")
|
||||
public static String ADMIN_SHOP_NAME = "Admin Shop";
|
||||
|
||||
@ConfigurationComment("Make all admin shops be unlimited even if they have a shop container at the sign")
|
||||
public static boolean FORCE_UNLIMITED_ADMIN_SHOP = false;
|
||||
|
||||
@ConfigurationComment("The name of the economy account which Admin Shops should use and to which all taxes will go")
|
||||
public static String SERVER_ECONOMY_ACCOUNT = "";
|
||||
|
||||
|
@ -177,10 +190,10 @@ public class Properties {
|
|||
public static UUID SERVER_ECONOMY_ACCOUNT_UUID = new UUID(0, 0);
|
||||
|
||||
@ConfigurationComment("Percent of the price that should go to the server's account. (100 = 100 percent)")
|
||||
public static int TAX_AMOUNT = 0;
|
||||
public static double TAX_AMOUNT = 0;
|
||||
|
||||
@ConfigurationComment("Percent of the price that should go to the server's account when buying from an Admin Shop.")
|
||||
public static int SERVER_TAX_AMOUNT = 0;
|
||||
public static double SERVER_TAX_AMOUNT = 0;
|
||||
|
||||
@ConfigurationComment("Amount of money player must pay to create a shop")
|
||||
public static BigDecimal SHOP_CREATION_PRICE = BigDecimal.valueOf(0);
|
||||
|
@ -191,6 +204,14 @@ public class Properties {
|
|||
@ConfigurationComment("How many decimal places are allowed at a maximum for prices?")
|
||||
public static int PRICE_PRECISION = 2;
|
||||
|
||||
@ConfigurationComment("This makes sure that the UUIDs of player shop accounts match the server's online-mode setting. Disabling this might lead to issues with offline players and is therefore unsupported!")
|
||||
public static boolean ENSURE_CORRECT_PLAYERID = true;
|
||||
|
||||
@ConfigurationComment("This regexp validates the name of the player. If the name doesn't match, the player will neither be able to create a valid shop sign, nor buy/sell from a shop.\n" +
|
||||
"Note for Bedrock support: If you have Floodgate on your server, you should set this regexp to ^\\\\.?\\\\w+$ and ENSURE_CORRECT_PLAYERID to false\n" +
|
||||
"If your Floodgate prefix is not a dot, then change the first . in the regexp (the one before the question mark) to whatever your prefix is.")
|
||||
public static String VALID_PLAYERNAME_REGEXP = "^\\w+$";
|
||||
|
||||
@PrecededBySpace
|
||||
@ConfigurationComment("Should we block shops that sell things for more than they buy? (This prevents newbies from creating shops that would be exploited)")
|
||||
public static boolean BLOCK_SHOPS_WITH_SELL_PRICE_HIGHER_THAN_BUY_PRICE = true;
|
||||
|
@ -237,10 +258,10 @@ public class Properties {
|
|||
@ConfigurationComment("If true, plugin will log transactions in its own file")
|
||||
public static boolean LOG_TO_FILE = false;
|
||||
|
||||
@ConfigurationComment("Do you want ChestShop's messages to show up in console?")
|
||||
@ConfigurationComment("Do you want ChestShop's transaction messages to show up in console?")
|
||||
public static boolean LOG_TO_CONSOLE = true;
|
||||
|
||||
@ConfigurationComment("Should all shop removals be logged to the console?")
|
||||
@ConfigurationComment("Should all shop removals be logged?")
|
||||
public static boolean LOG_ALL_SHOP_REMOVALS = true;
|
||||
|
||||
@PrecededBySpace
|
||||
|
@ -315,4 +336,8 @@ public class Properties {
|
|||
@PrecededBySpace
|
||||
@ConfigurationComment("Add icons and make item names hoverable in transaction messages when ShowItem is installed?")
|
||||
public static boolean SHOWITEM_MESSAGE = true;
|
||||
|
||||
@PrecededBySpace
|
||||
@ConfigurationComment("Add stock counter to quantity line?")
|
||||
public static boolean USE_STOCK_COUNTER = false;
|
||||
}
|
|
@ -42,14 +42,13 @@ public class AdminInventory implements Inventory {
|
|||
maxStackSize = i;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return "Admin inventory";
|
||||
}
|
||||
|
||||
@Override
|
||||
public ItemStack getItem(int i) {
|
||||
if (content.length < i) {
|
||||
if (content.length > i) {
|
||||
return content[i];
|
||||
}
|
||||
return null;
|
||||
|
@ -157,10 +156,12 @@ public class AdminInventory implements Inventory {
|
|||
public HashMap<Integer, ? extends ItemStack> all(ItemStack itemStack) {
|
||||
HashMap<Integer, ItemStack> items = new HashMap<Integer, ItemStack>();
|
||||
|
||||
ItemStack clone = itemStack.clone();
|
||||
clone.setAmount(Integer.MAX_VALUE);
|
||||
if (itemStack != null) {
|
||||
ItemStack clone = itemStack.clone();
|
||||
clone.setAmount(Integer.MAX_VALUE);
|
||||
|
||||
items.put(1, clone);
|
||||
items.put(1, clone);
|
||||
}
|
||||
|
||||
return items;
|
||||
}
|
||||
|
@ -190,6 +191,10 @@ public class AdminInventory implements Inventory {
|
|||
return 0;
|
||||
}
|
||||
|
||||
public boolean isEmpty() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void remove(Material material) {
|
||||
}
|
||||
|
@ -206,12 +211,15 @@ public class AdminInventory implements Inventory {
|
|||
public void clear() {
|
||||
}
|
||||
|
||||
public int close() {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<HumanEntity> getViewers() {
|
||||
return new ArrayList<>();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getTitle() {
|
||||
return "Admin inventory";
|
||||
}
|
||||
|
@ -226,6 +234,10 @@ public class AdminInventory implements Inventory {
|
|||
return null;
|
||||
}
|
||||
|
||||
public InventoryHolder getHolder(boolean useSnapshot) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ListIterator<ItemStack> iterator() {
|
||||
return Arrays.asList(content).listIterator();
|
||||
|
|
|
@ -4,8 +4,8 @@ import com.Acrobot.ChestShop.ChestShop;
|
|||
import com.j256.ormlite.dao.Dao;
|
||||
import com.j256.ormlite.dao.DaoManager;
|
||||
import com.j256.ormlite.dao.LruObjectCache;
|
||||
import com.j256.ormlite.db.SqliteDatabaseType;
|
||||
import com.j256.ormlite.jdbc.JdbcConnectionSource;
|
||||
import com.j256.ormlite.jdbc.db.SqliteDatabaseType;
|
||||
import com.j256.ormlite.support.ConnectionSource;
|
||||
import com.j256.ormlite.table.TableUtils;
|
||||
|
||||
|
|
|
@ -28,8 +28,6 @@ public class Migrations {
|
|||
public static int migrate(int currentVersion) {
|
||||
if (currentVersion != CURRENT_DATABASE_VERSION) {
|
||||
ChestShop.getBukkitLogger().info("Updating database...");
|
||||
} else {
|
||||
return CURRENT_DATABASE_VERSION;
|
||||
}
|
||||
|
||||
switch (currentVersion) {
|
||||
|
@ -67,7 +65,7 @@ public class Migrations {
|
|||
accounts.executeRaw("ALTER TABLE `accounts` ADD COLUMN lastSeenName VARCHAR");
|
||||
return true;
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
ChestShop.getBukkitLogger().log(Level.SEVERE, "Error while migrating database to v2", e);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
@ -113,7 +111,7 @@ public class Migrations {
|
|||
}
|
||||
try {
|
||||
results.close();
|
||||
} catch (IOException e1) {
|
||||
} catch (Exception e1) {
|
||||
ChestShop.getBukkitLogger().log(Level.WARNING, "Error while closing results! " + e.getMessage());
|
||||
}
|
||||
ChestShop.getBukkitLogger().log(Level.INFO, success + " accounts successfully migrated. " + error + " accounts failed to migrate!");
|
||||
|
@ -122,7 +120,7 @@ public class Migrations {
|
|||
|
||||
return true;
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
ChestShop.getBukkitLogger().log(Level.SEVERE, "Error while migrating database to v3", e);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
@ -139,13 +137,13 @@ public class Migrations {
|
|||
try {
|
||||
items.executeRawNoArgs("INSERT INTO `items` (id, code) SELECT id, code uuid FROM `items-old`");
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
ChestShop.getBukkitLogger().log(Level.SEVERE, "Error while inserting items into new database while migrating to v4", e);
|
||||
}
|
||||
ChestShop.getBukkitLogger().log(Level.INFO, "Migration of items table finished in " + (System.currentTimeMillis() - start) / 1000.0 + "s!");
|
||||
|
||||
return true;
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
ChestShop.getBukkitLogger().log(Level.SEVERE, "Error while migrating database to v4", e);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2,19 +2,33 @@ package com.Acrobot.ChestShop;
|
|||
|
||||
import com.Acrobot.Breeze.Utils.MaterialUtil;
|
||||
import com.Acrobot.ChestShop.Configuration.Properties;
|
||||
import com.Acrobot.ChestShop.Listeners.Economy.EconomyAdapter;
|
||||
import com.Acrobot.ChestShop.Listeners.Economy.Plugins.ReserveListener;
|
||||
import com.Acrobot.ChestShop.Listeners.Economy.Plugins.VaultListener;
|
||||
import com.Acrobot.ChestShop.Plugins.*;
|
||||
import com.google.common.collect.ImmutableMap;
|
||||
import org.bstats.charts.DrilldownPie;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.EventPriority;
|
||||
import org.bukkit.event.Listener;
|
||||
import org.bukkit.event.server.PluginEnableEvent;
|
||||
import org.bukkit.plugin.Plugin;
|
||||
import org.bukkit.plugin.PluginDescriptionFile;
|
||||
import org.bukkit.plugin.PluginManager;
|
||||
|
||||
import java.util.AbstractMap;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.logging.Level;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* @author Acrobot
|
||||
*/
|
||||
public class Dependencies {
|
||||
public class Dependencies implements Listener {
|
||||
|
||||
private static final Map<String, String> versions = new HashMap<>();
|
||||
|
||||
public static void initializePlugins() {
|
||||
PluginManager pluginManager = Bukkit.getPluginManager();
|
||||
|
@ -55,17 +69,31 @@ public class Dependencies {
|
|||
Plugin plugin = pluginManager.getPlugin(dependency);
|
||||
|
||||
if (plugin != null && plugin.isEnabled()) {
|
||||
loadPlugin(dependency, plugin);
|
||||
try {
|
||||
loadPlugin(dependency, plugin);
|
||||
} catch (Exception e) {
|
||||
plugin.getLogger().log(Level.WARNING, "Unable to hook into " + plugin.getName() + " " + plugin.getDescription().getVersion(), e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return loadEconomy();
|
||||
if (loadEconomy()) {
|
||||
Map<String, Map<String, Integer>> map = versions.entrySet().stream()
|
||||
.map(e -> new AbstractMap.SimpleEntry<String, Map<String, Integer>>(e.getKey(), ImmutableMap.of(e.getValue(), 1)))
|
||||
.collect(Collectors.toMap(
|
||||
AbstractMap.SimpleEntry::getKey,
|
||||
AbstractMap.SimpleEntry::getValue
|
||||
));
|
||||
ChestShop.getMetrics().addCustomChart(new DrilldownPie("dependencies", () -> map));
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
private static boolean loadEconomy() {
|
||||
String plugin = "none";
|
||||
|
||||
Listener economy = null;
|
||||
EconomyAdapter economy = null;
|
||||
|
||||
if(Bukkit.getPluginManager().getPlugin("Reserve") != null) {
|
||||
plugin = "Reserve";
|
||||
|
@ -82,6 +110,9 @@ public class Dependencies {
|
|||
return false;
|
||||
}
|
||||
|
||||
ChestShop.getMetrics().addCustomChart(ChestShop.createStaticDrilldownStat("economyAdapter", plugin, Bukkit.getPluginManager().getPlugin(plugin).getDescription().getVersion()));
|
||||
ChestShop.getMetrics().addCustomChart(ChestShop.createStaticDrilldownStat("economyPlugin", economy.getProviderInfo().getName(), economy.getProviderInfo().getVersion()));
|
||||
|
||||
ChestShop.registerListener(economy);
|
||||
ChestShop.getBukkitLogger().info(plugin + " loaded!");
|
||||
return true;
|
||||
|
@ -106,12 +137,18 @@ public class Dependencies {
|
|||
case Lockette:
|
||||
listener = new Lockette();
|
||||
break;
|
||||
case LockettePro:
|
||||
listener = new LockettePro();
|
||||
break;
|
||||
case Deadbolt:
|
||||
listener = new Deadbolt();
|
||||
break;
|
||||
case SimpleChestLock:
|
||||
listener = SimpleChestLock.getSimpleChestLock(plugin);
|
||||
break;
|
||||
case BlockLocker:
|
||||
listener = new BlockLocker();
|
||||
break;
|
||||
case Residence:
|
||||
if (plugin.getDescription().getVersion().startsWith("2")) {
|
||||
ChestShop.getBukkitLogger().severe("You are using an old version of Residence! " +
|
||||
|
@ -165,8 +202,8 @@ public class Dependencies {
|
|||
|
||||
listener = heroes;
|
||||
break;
|
||||
case OddItem:
|
||||
MaterialUtil.Odd.initialize();
|
||||
case ItemBridge:
|
||||
listener = new ItemBridge();
|
||||
break;
|
||||
case ShowItem:
|
||||
MaterialUtil.Show.initialize(plugin);
|
||||
|
@ -178,24 +215,35 @@ public class Dependencies {
|
|||
}
|
||||
|
||||
PluginDescriptionFile description = plugin.getDescription();
|
||||
versions.put(description.getName(), description.getVersion());
|
||||
ChestShop.getBukkitLogger().info(description.getName() + " version " + description.getVersion() + " loaded.");
|
||||
}
|
||||
|
||||
private static enum Dependency {
|
||||
LWC,
|
||||
Lockette,
|
||||
LockettePro,
|
||||
Deadbolt,
|
||||
SimpleChestLock,
|
||||
BlockLocker,
|
||||
Residence,
|
||||
|
||||
OddItem,
|
||||
|
||||
WorldGuard,
|
||||
GriefPrevention,
|
||||
RedProtect,
|
||||
|
||||
Heroes,
|
||||
|
||||
ItemBridge,
|
||||
|
||||
ShowItem
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.MONITOR)
|
||||
public void onEnable(PluginEnableEvent event) {
|
||||
Plugin plugin = event.getPlugin();
|
||||
if (ChestShop.getDependencies().contains(plugin.getName())) {
|
||||
loadPlugin(plugin.getName(), plugin);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -11,7 +11,7 @@ public class AccountQueryEvent extends Event {
|
|||
private static final HandlerList handlers = new HandlerList();
|
||||
private final String name;
|
||||
private Account account = null;
|
||||
private boolean searchOfflinePlayers = true;
|
||||
private boolean searchOfflinePlayers = false;
|
||||
|
||||
public AccountQueryEvent(String name) {
|
||||
this.name = name;
|
||||
|
@ -38,7 +38,8 @@ public class AccountQueryEvent extends Event {
|
|||
}
|
||||
|
||||
/**
|
||||
* Set whether or not offline player data should be searched (too)
|
||||
* Set whether or not offline player data should be searched (too).
|
||||
* This could lead to network lookups if the player by the name never joined the server!
|
||||
* @param searchOfflinePlayers Whether or not offline player data should be searched (too)
|
||||
*/
|
||||
public void searchOfflinePlayers(boolean searchOfflinePlayers) {
|
||||
|
|
|
@ -99,6 +99,13 @@ public class CurrencyAddEvent extends EconomicEvent {
|
|||
return target;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param target Account from which the currency is subtracted
|
||||
*/
|
||||
public void setTarget(UUID target) {
|
||||
this.target = target;
|
||||
}
|
||||
|
||||
public HandlerList getHandlers() {
|
||||
return handlers;
|
||||
}
|
||||
|
|
|
@ -76,6 +76,13 @@ public class CurrencyAmountEvent extends EconomicEvent {
|
|||
return account;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param account Account that is checked
|
||||
*/
|
||||
public void setAccount(UUID account) {
|
||||
this.account = account;
|
||||
}
|
||||
|
||||
public HandlerList getHandlers() {
|
||||
return handlers;
|
||||
}
|
||||
|
|
|
@ -103,9 +103,7 @@ public class CurrencyCheckEvent extends EconomicEvent {
|
|||
* Sets the account name
|
||||
*
|
||||
* @param account Account name
|
||||
* @deprecated The account should not be changed!
|
||||
*/
|
||||
@Deprecated
|
||||
public void setAccount(UUID account) {
|
||||
this.account = account;
|
||||
}
|
||||
|
|
|
@ -2,7 +2,6 @@ package com.Acrobot.ChestShop.Events.Economy;
|
|||
|
||||
import org.bukkit.World;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.Event;
|
||||
import org.bukkit.event.HandlerList;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
|
@ -100,6 +99,13 @@ public class CurrencySubtractEvent extends EconomicEvent {
|
|||
return target;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param target Account from which the currency is subtracted
|
||||
*/
|
||||
public void setTarget(UUID target) {
|
||||
this.target = target;
|
||||
}
|
||||
|
||||
public HandlerList getHandlers() {
|
||||
return handlers;
|
||||
}
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
package com.Acrobot.ChestShop.Events.Economy;
|
||||
|
||||
import com.Acrobot.ChestShop.Events.TransactionEvent;
|
||||
import org.bukkit.World;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.Event;
|
||||
import org.bukkit.event.HandlerList;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
|
@ -25,26 +25,32 @@ public class CurrencyTransferEvent extends EconomicEvent {
|
|||
|
||||
private Direction direction;
|
||||
|
||||
private final TransactionEvent transactionEvent;
|
||||
|
||||
public CurrencyTransferEvent(BigDecimal amount, Player initiator, UUID partner, Direction direction) {
|
||||
this(amount, amount, initiator, partner, direction);
|
||||
}
|
||||
|
||||
public CurrencyTransferEvent(BigDecimal amountSent, BigDecimal amountReceived, Player initiator, UUID partner, Direction direction) {
|
||||
this(amountSent, amountReceived, initiator, partner, direction, null);
|
||||
}
|
||||
|
||||
|
||||
public CurrencyTransferEvent(BigDecimal amount, Player initiator, UUID partner, Direction direction, TransactionEvent transactionEvent) {
|
||||
this(amount, amount, initiator, partner, direction, transactionEvent);
|
||||
}
|
||||
|
||||
public CurrencyTransferEvent(BigDecimal amountSent, BigDecimal amountReceived, Player initiator, UUID partner, Direction direction, TransactionEvent transactionEvent) {
|
||||
this.amountSent = amountSent;
|
||||
this.amountReceived = amountReceived;
|
||||
this.initiator = initiator;
|
||||
|
||||
this.partner = partner;
|
||||
this.direction = direction;
|
||||
|
||||
this.transactionEvent = transactionEvent;
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated Use {{@link #CurrencyTransferEvent(BigDecimal, Player, UUID, Direction)}
|
||||
*/
|
||||
@Deprecated
|
||||
public CurrencyTransferEvent(double amount, Player initiator, UUID partner, Direction direction) {
|
||||
this(BigDecimal.valueOf(amount), initiator, partner, direction);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Amount of currency sent
|
||||
|
@ -150,6 +156,15 @@ public class CurrencyTransferEvent extends EconomicEvent {
|
|||
return direction;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the {@link TransactionEvent} associated with this currency transfer event.
|
||||
*
|
||||
* @return the transaction event.
|
||||
*/
|
||||
public TransactionEvent getTransactionEvent() {
|
||||
return transactionEvent;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the player who initiated this transaction
|
||||
*
|
||||
|
@ -166,6 +181,15 @@ public class CurrencyTransferEvent extends EconomicEvent {
|
|||
return partner;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the partner of the transaction
|
||||
*
|
||||
* @param partner the new partner of this transaction
|
||||
*/
|
||||
public void setPartner(UUID partner) {
|
||||
this.partner = partner;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return The world in which the transaction occurs
|
||||
*/
|
||||
|
|
|
@ -0,0 +1,72 @@
|
|||
package com.Acrobot.ChestShop.Events;
|
||||
|
||||
import org.bukkit.event.Event;
|
||||
import org.bukkit.event.HandlerList;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
|
||||
public class ItemStringQueryEvent extends Event {
|
||||
private static final HandlerList handlers = new HandlerList();
|
||||
|
||||
private String itemString = null;
|
||||
private final ItemStack item;
|
||||
private final int maxWidth;
|
||||
|
||||
/**
|
||||
* Query the item string representation of a certain item with a certain length
|
||||
* @param item The item to query the string for
|
||||
*/
|
||||
public ItemStringQueryEvent(ItemStack item) {
|
||||
this(item, 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* Query the item string representation of a certain item with a certain length
|
||||
* @param item The item to query the string for
|
||||
* @param maxWidth The max width of the item string
|
||||
*/
|
||||
public ItemStringQueryEvent(ItemStack item, int maxWidth) {
|
||||
this.item = item;
|
||||
this.maxWidth = maxWidth;
|
||||
}
|
||||
|
||||
@Override
|
||||
public HandlerList getHandlers() {
|
||||
return handlers;
|
||||
}
|
||||
|
||||
public static HandlerList getHandlerList() {
|
||||
return handlers;
|
||||
}
|
||||
|
||||
/**
|
||||
* The item for which the string is queried
|
||||
* @return The item
|
||||
*/
|
||||
public ItemStack getItem() {
|
||||
return item;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the item string that represents the item
|
||||
* @return The item string that represents the item
|
||||
*/
|
||||
public String getItemString() {
|
||||
return itemString;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the item string that represents the item
|
||||
* @param itemString The item string that represents the item
|
||||
*/
|
||||
public void setItemString(String itemString) {
|
||||
this.itemString = itemString;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the max width that the result item string should have
|
||||
* @return The max width of the result item string
|
||||
*/
|
||||
public int getMaxWidth() {
|
||||
return maxWidth;
|
||||
}
|
||||
}
|
|
@ -149,26 +149,6 @@ public class PreTransactionEvent extends Event implements Cancellable {
|
|||
this.ownerAccount = ownerAccount;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Shop's owner
|
||||
* @deprecated Use {@link #getOwnerAccount}
|
||||
*/
|
||||
@Deprecated
|
||||
public OfflinePlayer getOwner() {
|
||||
return Bukkit.getOfflinePlayer(ownerAccount.getUuid());
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the shop's owner
|
||||
*
|
||||
* @param owner Shop owner
|
||||
* @deprecated Use {@link #setOwnerAccount(Account)}
|
||||
*/
|
||||
@Deprecated
|
||||
public void setOwner(OfflinePlayer owner) {
|
||||
this.ownerAccount = NameManager.getOrCreateAccount(owner);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Owner's inventory
|
||||
*/
|
||||
|
@ -267,6 +247,7 @@ public class PreTransactionEvent extends Event implements Cancellable {
|
|||
NOT_ENOUGH_STOCK_IN_INVENTORY,
|
||||
|
||||
INVALID_SHOP,
|
||||
INVALID_CLIENT_NAME,
|
||||
|
||||
SPAM_CLICKING_PROTECTION,
|
||||
CREATIVE_MODE_PROTECTION,
|
||||
|
|
|
@ -6,6 +6,8 @@ import org.bukkit.event.Cancellable;
|
|||
import org.bukkit.event.Event;
|
||||
import org.bukkit.event.HandlerList;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
/**
|
||||
* @author Acrobot
|
||||
*/
|
||||
|
@ -17,7 +19,7 @@ public class BuildPermissionEvent extends Event implements Cancellable {
|
|||
|
||||
private boolean allowed = true;
|
||||
|
||||
public BuildPermissionEvent(Player player, Location chest, Location sign) {
|
||||
public BuildPermissionEvent(Player player, @Nullable Location chest, Location sign) {
|
||||
this.player = player;
|
||||
this.chest = chest;
|
||||
this.sign = sign;
|
||||
|
@ -27,7 +29,7 @@ public class BuildPermissionEvent extends Event implements Cancellable {
|
|||
return player;
|
||||
}
|
||||
|
||||
public Location getChest() {
|
||||
public @Nullable Location getChest() {
|
||||
return chest;
|
||||
}
|
||||
|
||||
|
|
|
@ -13,6 +13,7 @@ public class ProtectionCheckEvent extends Event {
|
|||
|
||||
private Result result = Result.DEFAULT;
|
||||
private boolean ignoreBuiltInProtection = false;
|
||||
private boolean checkManagement = true;
|
||||
private Block block;
|
||||
private Player player;
|
||||
|
||||
|
@ -27,10 +28,21 @@ public class ProtectionCheckEvent extends Event {
|
|||
this.ignoreBuiltInProtection = ignoreBuiltInProtection;
|
||||
}
|
||||
|
||||
public ProtectionCheckEvent(Block block, Player player, boolean ignoreBuiltInProtection, boolean checkManagement) {
|
||||
this.block = block;
|
||||
this.player = player;
|
||||
this.ignoreBuiltInProtection = ignoreBuiltInProtection;
|
||||
this.checkManagement = checkManagement;
|
||||
}
|
||||
|
||||
public boolean isBuiltInProtectionIgnored() {
|
||||
return ignoreBuiltInProtection;
|
||||
}
|
||||
|
||||
public boolean checkCanManage() {
|
||||
return checkManagement;
|
||||
}
|
||||
|
||||
public Result getResult() {
|
||||
return result;
|
||||
}
|
||||
|
|
|
@ -0,0 +1,58 @@
|
|||
package com.Acrobot.ChestShop.Events;
|
||||
|
||||
import org.bukkit.block.Sign;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.Cancellable;
|
||||
import org.bukkit.event.Event;
|
||||
import org.bukkit.event.HandlerList;
|
||||
|
||||
/**
|
||||
* Represents a /shopinfo call or middle click on a sign
|
||||
*
|
||||
* @author Phoenix616
|
||||
*/
|
||||
public class ShopInfoEvent extends Event implements Cancellable {
|
||||
private static final HandlerList handlers = new HandlerList();
|
||||
|
||||
private Player sender;
|
||||
private Sign sign;
|
||||
private boolean cancelled = false;
|
||||
|
||||
public ShopInfoEvent(Player sender, Sign sign) {
|
||||
this.sender = sender;
|
||||
this.sign = sign;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return The Player who initiated the call
|
||||
*/
|
||||
public Player getSender() {
|
||||
return sender;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return The shop sign
|
||||
*/
|
||||
public Sign getSign() {
|
||||
return sign;
|
||||
}
|
||||
|
||||
public HandlerList getHandlers() {
|
||||
return handlers;
|
||||
}
|
||||
|
||||
public static HandlerList getHandlerList() {
|
||||
return handlers;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isCancelled() {
|
||||
return cancelled;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setCancelled(boolean cancel) {
|
||||
cancelled = cancel;
|
||||
}
|
||||
}
|
|
@ -39,6 +39,7 @@ public class BlockPlace implements Listener {
|
|||
if (!Security.canAccess(player, placed)) {
|
||||
Messages.ACCESS_DENIED.sendWithPrefix(event.getPlayer());
|
||||
event.setCancelled(true);
|
||||
return;
|
||||
}
|
||||
|
||||
Block neighbor = uBlock.findNeighbor(placed);
|
||||
|
@ -65,10 +66,6 @@ public class BlockPlace implements Listener {
|
|||
public static void onHopperDropperPlace(BlockPlaceEvent event) {
|
||||
Block placed = event.getBlockPlaced();
|
||||
|
||||
if (placed.getType() != Material.HOPPER && placed.getType() != Material.DROPPER) {
|
||||
return;
|
||||
}
|
||||
|
||||
List<BlockFace> searchDirections = new ArrayList<>();
|
||||
switch (placed.getType()) {
|
||||
case HOPPER:
|
||||
|
@ -78,6 +75,8 @@ public class BlockPlace implements Listener {
|
|||
case DROPPER:
|
||||
searchDirections.add(((Directional) placed.getBlockData()).getFacing());
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
|
||||
for (BlockFace face : searchDirections) {
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
package com.Acrobot.ChestShop.Listeners.Block.Break;
|
||||
|
||||
import com.Acrobot.ChestShop.Configuration.Messages;
|
||||
import com.Acrobot.ChestShop.Configuration.Properties;
|
||||
import com.Acrobot.ChestShop.Permission;
|
||||
import com.Acrobot.ChestShop.Signs.ChestShopSign;
|
||||
|
@ -21,6 +22,7 @@ public class ChestBreak implements Listener {
|
|||
public static void onChestBreak(BlockBreakEvent event) {
|
||||
if (!canBeBroken(event.getBlock(), event.getPlayer())) {
|
||||
event.setCancelled(true);
|
||||
Messages.ACCESS_DENIED.sendWithPrefix(event.getPlayer());
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -50,7 +52,7 @@ public class ChestBreak implements Listener {
|
|||
return true;
|
||||
}
|
||||
|
||||
Sign shopSign = uBlock.findAnyNearbyShopSign(block);
|
||||
Sign shopSign = uBlock.getConnectedSign(block);
|
||||
if (breaker != null) {
|
||||
return ChestShopSign.hasPermission(breaker, Permission.OTHER_NAME_DESTROY, shopSign);
|
||||
}
|
||||
|
|
|
@ -2,6 +2,7 @@ package com.Acrobot.ChestShop.Listeners.Block.Break;
|
|||
|
||||
import com.Acrobot.Breeze.Utils.BlockUtil;
|
||||
import com.Acrobot.ChestShop.ChestShop;
|
||||
import com.Acrobot.ChestShop.Configuration.Messages;
|
||||
import com.Acrobot.ChestShop.Configuration.Properties;
|
||||
import com.Acrobot.ChestShop.Events.ShopDestroyedEvent;
|
||||
import com.Acrobot.ChestShop.Listeners.Block.Break.Attached.PhysicsBreak;
|
||||
|
@ -23,15 +24,16 @@ import org.bukkit.event.entity.EntityChangeBlockEvent;
|
|||
import org.bukkit.event.entity.EntityExplodeEvent;
|
||||
import org.bukkit.metadata.FixedMetadataValue;
|
||||
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
|
||||
import static com.Acrobot.Breeze.Utils.ImplementationAdapter.getState;
|
||||
import static com.Acrobot.Breeze.Utils.BlockUtil.getAttachedBlock;
|
||||
import static com.Acrobot.Breeze.Utils.BlockUtil.isSign;
|
||||
import static com.Acrobot.ChestShop.Permission.OTHER_NAME_DESTROY;
|
||||
import static com.Acrobot.ChestShop.Signs.ChestShopSign.NAME_LINE;
|
||||
|
||||
/**
|
||||
* @author Acrobot
|
||||
|
@ -43,9 +45,9 @@ public class SignBreak implements Listener {
|
|||
public SignBreak() {
|
||||
try {
|
||||
Class.forName("com.destroystokyo.paper.event.block.BlockDestroyEvent");
|
||||
ChestShop.getPlugin().registerEvent((Listener) Class.forName("com.Acrobot.ChestShop.Listeners.Block.Break.Attached.PaperBlockDestroy").newInstance());
|
||||
ChestShop.getPlugin().registerEvent((Listener) Class.forName("com.Acrobot.ChestShop.Listeners.Block.Break.Attached.PaperBlockDestroy").getDeclaredConstructor().newInstance());
|
||||
ChestShop.getBukkitLogger().info("Using Paper's BlockDestroyEvent instead of the BlockPhysicsEvent!");
|
||||
} catch (ClassNotFoundException | IllegalAccessException | InstantiationException e) {
|
||||
} catch (ClassNotFoundException | IllegalAccessException | InstantiationException | NoSuchMethodException | InvocationTargetException e) {
|
||||
ChestShop.getPlugin().registerEvent(new PhysicsBreak());
|
||||
}
|
||||
}
|
||||
|
@ -55,11 +57,11 @@ public class SignBreak implements Listener {
|
|||
return;
|
||||
}
|
||||
|
||||
Sign sign = (Sign) block.getState();
|
||||
Sign sign = (Sign) getState(block, false);
|
||||
Block attachedBlock = BlockUtil.getAttachedBlock(sign);
|
||||
|
||||
if (attachedBlock.getType() == Material.AIR && ChestShopSign.isValid(sign)) {
|
||||
sendShopDestroyedEvent(sign, block.hasMetadata(METADATA_NAME)
|
||||
sendShopDestroyedEvent((Sign) block.getState(), block.hasMetadata(METADATA_NAME)
|
||||
? (Player) block.getMetadata(METADATA_NAME).get(0).value()
|
||||
: null);
|
||||
}
|
||||
|
@ -69,6 +71,7 @@ public class SignBreak implements Listener {
|
|||
public static void onSignBreak(BlockBreakEvent event) {
|
||||
if (!canBlockBeBroken(event.getBlock(), event.getPlayer())) {
|
||||
event.setCancelled(true);
|
||||
Messages.ACCESS_DENIED.sendWithPrefix(event.getPlayer());
|
||||
if (isSign(event.getBlock())) {
|
||||
event.getBlock().getState().update();
|
||||
}
|
||||
|
@ -142,7 +145,7 @@ public class SignBreak implements Listener {
|
|||
continue;
|
||||
}
|
||||
|
||||
if (Properties.TURN_OFF_SIGN_PROTECTION || canDestroyShop(breaker, sign.getLine(NAME_LINE))) {
|
||||
if (Properties.TURN_OFF_SIGN_PROTECTION || canDestroyShop(breaker, ChestShopSign.getOwner(sign))) {
|
||||
brokenBlocks.add(sign);
|
||||
} else {
|
||||
canBeBroken = false;
|
||||
|
@ -165,11 +168,7 @@ public class SignBreak implements Listener {
|
|||
}
|
||||
|
||||
public static void sendShopDestroyedEvent(Sign sign, Player player) {
|
||||
Container connectedContainer = null;
|
||||
|
||||
if (!ChestShopSign.isAdminShop(sign)) {
|
||||
connectedContainer = uBlock.findConnectedContainer(sign.getBlock());
|
||||
}
|
||||
Container connectedContainer = uBlock.findConnectedContainer(sign.getBlock());
|
||||
|
||||
Event event = new ShopDestroyedEvent(player, sign, connectedContainer);
|
||||
ChestShop.callEvent(event);
|
||||
|
|
|
@ -3,25 +3,38 @@ package com.Acrobot.ChestShop.Listeners.Block;
|
|||
import com.Acrobot.Breeze.Utils.BlockUtil;
|
||||
import com.Acrobot.Breeze.Utils.StringUtil;
|
||||
import com.Acrobot.ChestShop.ChestShop;
|
||||
import com.Acrobot.ChestShop.Configuration.Messages;
|
||||
import com.Acrobot.ChestShop.Events.PreShopCreationEvent;
|
||||
import com.Acrobot.ChestShop.Events.ShopCreatedEvent;
|
||||
import com.Acrobot.ChestShop.Listeners.Block.Break.SignBreak;
|
||||
import com.Acrobot.ChestShop.Signs.ChestShopSign;
|
||||
import com.Acrobot.ChestShop.UUIDs.NameManager;
|
||||
import com.Acrobot.ChestShop.Utils.uBlock;
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.block.Sign;
|
||||
import org.bukkit.block.sign.Side;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.Listener;
|
||||
import org.bukkit.event.block.SignChangeEvent;
|
||||
|
||||
import static com.Acrobot.ChestShop.Permission.OTHER_NAME_DESTROY;
|
||||
import static com.Acrobot.ChestShop.Signs.ChestShopSign.NAME_LINE;
|
||||
|
||||
/**
|
||||
* @author Acrobot
|
||||
*/
|
||||
public class SignCreate implements Listener {
|
||||
|
||||
private static boolean HAS_SIGN_SIDES;
|
||||
|
||||
static {
|
||||
try {
|
||||
SignChangeEvent.class.getMethod("getSide");
|
||||
HAS_SIGN_SIDES = true;
|
||||
} catch (NoSuchMethodException e) {
|
||||
HAS_SIGN_SIDES = false;
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler(ignoreCancelled = true)
|
||||
public static void onSignChange(SignChangeEvent event) {
|
||||
Block signBlock = event.getBlock();
|
||||
|
@ -32,15 +45,28 @@ public class SignCreate implements Listener {
|
|||
|
||||
Sign sign = (Sign) signBlock.getState();
|
||||
|
||||
if (ChestShopSign.isValid(sign) && !NameManager.canUseName(event.getPlayer(), OTHER_NAME_DESTROY, StringUtil.stripColourCodes(sign.getLine(NAME_LINE)))) {
|
||||
if (HAS_SIGN_SIDES && event.getSide() != Side.FRONT) {
|
||||
if (ChestShopSign.isValid(sign)) {
|
||||
event.setCancelled(true);
|
||||
Messages.CANNOT_CHANGE_SIGN_BACKSIDE.sendWithPrefix(event.getPlayer());
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if (ChestShopSign.isValid(event.getLines()) && !NameManager.canUseName(event.getPlayer(), OTHER_NAME_DESTROY, ChestShopSign.getOwner(event.getLines()))) {
|
||||
event.setCancelled(true);
|
||||
sign.update();
|
||||
ChestShop.logDebug("Shop sign creation at " + sign.getLocation() + " by " + event.getPlayer().getName() + " was cancelled as they weren't able to create a shop for the account '" + ChestShopSign.getOwner(event.getLines()) + "'");
|
||||
return;
|
||||
}
|
||||
|
||||
String[] lines = StringUtil.stripColourCodes(event.getLines());
|
||||
|
||||
if (!ChestShopSign.isValidPreparedSign(lines)) {
|
||||
// Check if a valid shop already existed previously
|
||||
if (ChestShopSign.isValid(sign)) {
|
||||
SignBreak.sendShopDestroyedEvent(sign, event.getPlayer());
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -48,7 +74,9 @@ public class SignCreate implements Listener {
|
|||
ChestShop.callEvent(preEvent);
|
||||
|
||||
if (preEvent.getOutcome().shouldBreakSign()) {
|
||||
event.setCancelled(true);
|
||||
signBlock.breakNaturally();
|
||||
ChestShop.logDebug("Shop sign creation at " + sign.getLocation() + " by " + event.getPlayer().getName() + " was cancelled (creation outcome: " + preEvent.getOutcome() + ") and the sign broken");
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -57,6 +85,7 @@ public class SignCreate implements Listener {
|
|||
}
|
||||
|
||||
if (preEvent.isCancelled()) {
|
||||
ChestShop.logDebug("Shop sign creation at " + sign.getLocation() + " by " + event.getPlayer().getName() + " was cancelled (creation outcome: " + preEvent.getOutcome() + ") and sign lines were set to " + String.join(", ", preEvent.getSignLines()));
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
@ -16,6 +16,8 @@ import java.math.BigDecimal;
|
|||
|
||||
public abstract class EconomyAdapter implements Listener {
|
||||
|
||||
public abstract ProviderInfo getProviderInfo();
|
||||
|
||||
public abstract void onAmountCheck(CurrencyAmountEvent event);
|
||||
|
||||
public abstract void onCurrencyCheck(CurrencyCheckEvent event);
|
||||
|
@ -74,4 +76,21 @@ public abstract class EconomyAdapter implements Listener {
|
|||
}
|
||||
}
|
||||
|
||||
public static class ProviderInfo {
|
||||
private final String name;
|
||||
private final String version;
|
||||
|
||||
public ProviderInfo(String name, String version) {
|
||||
this.name = name;
|
||||
this.version = version;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public String getVersion() {
|
||||
return version;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
package com.Acrobot.ChestShop.Listeners.Economy.Plugins;
|
||||
|
||||
import com.Acrobot.ChestShop.Configuration.Properties;
|
||||
import com.Acrobot.ChestShop.Events.Economy.AccountCheckEvent;
|
||||
import com.Acrobot.ChestShop.Events.Economy.CurrencyAddEvent;
|
||||
import com.Acrobot.ChestShop.Events.Economy.CurrencyAmountEvent;
|
||||
|
@ -12,6 +13,7 @@ import com.Acrobot.ChestShop.Listeners.Economy.EconomyAdapter;
|
|||
import net.tnemc.core.Reserve;
|
||||
import net.tnemc.core.economy.EconomyAPI;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.event.EventHandler;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
|
@ -26,10 +28,15 @@ public class ReserveListener extends EconomyAdapter {
|
|||
|
||||
private static @Nullable EconomyAPI economyAPI;
|
||||
|
||||
public ReserveListener(EconomyAPI api) {
|
||||
public ReserveListener(@Nullable EconomyAPI api) {
|
||||
ReserveListener.economyAPI = api;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ProviderInfo getProviderInfo() {
|
||||
return new ProviderInfo(economyAPI.name(), economyAPI.version());
|
||||
}
|
||||
|
||||
public static EconomyAPI getProvider() {
|
||||
return economyAPI;
|
||||
}
|
||||
|
@ -99,7 +106,8 @@ public class ReserveListener extends EconomyAdapter {
|
|||
}
|
||||
|
||||
if (provided()) {
|
||||
event.setFormattedAmount(economyAPI.format(event.getAmount()));
|
||||
String formatted = economyAPI.format(event.getAmount());
|
||||
event.setFormattedAmount(Properties.STRIP_PRICE_COLORS ? ChatColor.stripColor(formatted) : formatted);
|
||||
event.setHandled(true);
|
||||
}
|
||||
}
|
||||
|
@ -127,7 +135,7 @@ public class ReserveListener extends EconomyAdapter {
|
|||
|
||||
@EventHandler
|
||||
public void onCurrencyHoldCheck(CurrencyHoldEvent event) {
|
||||
if (event.getAccount() == null || event.wasHandled() || !transactionCanFail() || event.canHold()) {
|
||||
if (!provided() || event.getAccount() == null || event.wasHandled() || !transactionCanFail() || event.canHold()) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
@ -5,16 +5,19 @@ import java.util.logging.Level;
|
|||
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
import com.Acrobot.ChestShop.Configuration.Properties;
|
||||
import com.Acrobot.ChestShop.Listeners.Economy.EconomyAdapter;
|
||||
import net.milkbowl.vault.economy.Economy;
|
||||
import net.milkbowl.vault.economy.EconomyResponse;
|
||||
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.OfflinePlayer;
|
||||
import org.bukkit.World;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.server.ServiceRegisterEvent;
|
||||
import org.bukkit.event.server.ServiceUnregisterEvent;
|
||||
import org.bukkit.plugin.Plugin;
|
||||
import org.bukkit.plugin.RegisteredServiceProvider;
|
||||
|
||||
import com.Acrobot.ChestShop.ChestShop;
|
||||
|
@ -35,6 +38,7 @@ import com.Acrobot.ChestShop.Events.Economy.CurrencyTransferEvent;
|
|||
public class VaultListener extends EconomyAdapter {
|
||||
private RegisteredServiceProvider<Economy> rsp;
|
||||
private static Economy provider;
|
||||
private Plugin providingPlugin;
|
||||
|
||||
private VaultListener() {
|
||||
updateEconomyProvider();
|
||||
|
@ -45,6 +49,7 @@ public class VaultListener extends EconomyAdapter {
|
|||
|
||||
if (rsp != null) {
|
||||
provider = rsp.getProvider();
|
||||
providingPlugin = rsp.getPlugin();
|
||||
ChestShop.getBukkitLogger().log(Level.INFO, "Using " + provider.getName() + " as the Economy provider now.");
|
||||
}
|
||||
}
|
||||
|
@ -58,6 +63,11 @@ public class VaultListener extends EconomyAdapter {
|
|||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ProviderInfo getProviderInfo() {
|
||||
return new ProviderInfo(provider.getName(), providingPlugin.getDescription().getVersion());
|
||||
}
|
||||
|
||||
public static Economy getProvider() { return provider; }
|
||||
|
||||
public boolean transactionCanFail() {
|
||||
|
@ -172,7 +182,7 @@ public class VaultListener extends EconomyAdapter {
|
|||
}
|
||||
|
||||
String formatted = provider.format(event.getAmount().doubleValue());
|
||||
event.setFormattedAmount(formatted);
|
||||
event.setFormattedAmount(Properties.STRIP_PRICE_COLORS ? ChatColor.stripColor(formatted) : formatted);
|
||||
event.setHandled(true);
|
||||
}
|
||||
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
package com.Acrobot.ChestShop.Listeners.Economy;
|
||||
|
||||
import com.Acrobot.ChestShop.ChestShop;
|
||||
import com.Acrobot.ChestShop.Database.Account;
|
||||
import com.Acrobot.ChestShop.Events.Economy.*;
|
||||
import com.Acrobot.ChestShop.UUIDs.NameManager;
|
||||
|
@ -27,15 +26,12 @@ public class ServerAccountCorrector implements Listener {
|
|||
Account account = NameManager.getServerEconomyAccount();
|
||||
target = account != null ? account.getUuid() : null;
|
||||
|
||||
event.setHandled(true);
|
||||
if (target == null) {
|
||||
event.setHandled(true);
|
||||
return;
|
||||
}
|
||||
|
||||
CurrencyAddEvent currencyAddEvent = new CurrencyAddEvent(event.getAmount(), target, event.getWorld());
|
||||
ChestShop.callEvent(currencyAddEvent);
|
||||
|
||||
event.setHandled(currencyAddEvent.wasHandled());
|
||||
event.setTarget(target);
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.LOWEST)
|
||||
|
@ -49,15 +45,12 @@ public class ServerAccountCorrector implements Listener {
|
|||
Account account = NameManager.getServerEconomyAccount();
|
||||
target = account != null ? account.getUuid() : null;
|
||||
|
||||
event.setHandled(true);
|
||||
if (target == null) {
|
||||
event.setHandled(true);
|
||||
return;
|
||||
}
|
||||
|
||||
CurrencySubtractEvent currencySubtractEvent = new CurrencySubtractEvent(event.getAmount(), target, event.getWorld());
|
||||
ChestShop.callEvent(currencySubtractEvent);
|
||||
|
||||
event.setHandled(currencySubtractEvent.wasHandled());
|
||||
event.setTarget(target);
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.LOWEST)
|
||||
|
@ -75,15 +68,7 @@ public class ServerAccountCorrector implements Listener {
|
|||
return;
|
||||
}
|
||||
|
||||
CurrencyTransferEvent currencyTransferEvent = new CurrencyTransferEvent(
|
||||
event.getAmountSent(),
|
||||
event.getAmountReceived(),
|
||||
event.getInitiator(),
|
||||
partner,
|
||||
event.getDirection()
|
||||
);
|
||||
ChestShop.callEvent(currencyTransferEvent);
|
||||
event.setHandled(currencyTransferEvent.wasHandled());
|
||||
event.setPartner(partner);
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.LOWEST)
|
||||
|
@ -102,10 +87,7 @@ public class ServerAccountCorrector implements Listener {
|
|||
return;
|
||||
}
|
||||
|
||||
CurrencyCheckEvent currencyCheckEvent = new CurrencyCheckEvent(event.getAmount(), target, event.getWorld());
|
||||
ChestShop.callEvent(currencyCheckEvent);
|
||||
|
||||
event.hasEnough(currencyCheckEvent.hasEnough());
|
||||
event.setAccount(target);
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.LOWEST)
|
||||
|
@ -116,8 +98,15 @@ public class ServerAccountCorrector implements Listener {
|
|||
return;
|
||||
}
|
||||
|
||||
event.canHold(true);
|
||||
event.setAccount(null);
|
||||
Account account = NameManager.getServerEconomyAccount();
|
||||
target = account != null ? account.getUuid() : null;
|
||||
|
||||
if (target == null) {
|
||||
event.canHold(true);
|
||||
return;
|
||||
}
|
||||
|
||||
event.setAccount(target);
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.LOWEST)
|
||||
|
@ -136,9 +125,6 @@ public class ServerAccountCorrector implements Listener {
|
|||
return;
|
||||
}
|
||||
|
||||
CurrencyAmountEvent currencyAmountEvent = new CurrencyAmountEvent(target, event.getWorld());
|
||||
ChestShop.callEvent(currencyAmountEvent);
|
||||
|
||||
event.setAmount(currencyAmountEvent.getAmount());
|
||||
event.setAccount(target);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -4,8 +4,6 @@ import com.Acrobot.ChestShop.ChestShop;
|
|||
import com.Acrobot.ChestShop.Configuration.Properties;
|
||||
import com.Acrobot.ChestShop.Events.Economy.CurrencyAddEvent;
|
||||
import com.Acrobot.ChestShop.Events.Economy.CurrencyTransferEvent;
|
||||
import com.Acrobot.ChestShop.Events.PreTransactionEvent;
|
||||
import com.Acrobot.ChestShop.Events.TransactionEvent;
|
||||
import com.Acrobot.ChestShop.Permission;
|
||||
import com.Acrobot.ChestShop.UUIDs.NameManager;
|
||||
import org.bukkit.event.EventHandler;
|
||||
|
@ -19,9 +17,11 @@ import java.util.UUID;
|
|||
* @author Acrobot
|
||||
*/
|
||||
public class TaxModule implements Listener {
|
||||
private static final String TAX_RECEIVED_MESSAGE = "Applied a tax of %1$f percent (%2$.2f) to the received amount for a resulting price of %3$.2f";
|
||||
private static final String TAX_SENT_MESSAGE = "Reduced buy price by tax of %1$f percent (%2$.2f) for a resulting price of %3$.2f as the buyer has the buy tax bypass permission";
|
||||
|
||||
private static float getTax(UUID partner) {
|
||||
float taxAmount = NameManager.isAdminShop(partner) || NameManager.isServerEconomyAccount(partner)
|
||||
private static double getTax(UUID partner) {
|
||||
double taxAmount = NameManager.isAdminShop(partner) || NameManager.isServerEconomyAccount(partner)
|
||||
? Properties.SERVER_TAX_AMOUNT : Properties.TAX_AMOUNT;
|
||||
|
||||
if (taxAmount == 0) {
|
||||
|
@ -31,7 +31,7 @@ public class TaxModule implements Listener {
|
|||
return taxAmount;
|
||||
}
|
||||
|
||||
private static BigDecimal getTaxAmount(BigDecimal price, float taxAmount) {
|
||||
private static BigDecimal getTaxAmount(BigDecimal price, double taxAmount) {
|
||||
return price.multiply(BigDecimal.valueOf(taxAmount)).divide(BigDecimal.valueOf(100), Properties.PRICE_PRECISION, BigDecimal.ROUND_HALF_UP);
|
||||
}
|
||||
|
||||
|
@ -41,7 +41,7 @@ public class TaxModule implements Listener {
|
|||
return;
|
||||
}
|
||||
|
||||
float taxAmount = getTax(event.getPartner());
|
||||
double taxAmount = getTax(event.getPartner());
|
||||
if (taxAmount == 0) {
|
||||
return;
|
||||
}
|
||||
|
@ -49,17 +49,28 @@ public class TaxModule implements Listener {
|
|||
if (!Permission.has(event.getInitiator(), event.getDirection() == CurrencyTransferEvent.Direction.PARTNER ? Permission.NO_BUY_TAX : Permission.NO_SELL_TAX)) {
|
||||
if (!NameManager.isServerEconomyAccount(event.getReceiver())) {
|
||||
BigDecimal tax = getTaxAmount(event.getAmountReceived(), taxAmount);
|
||||
event.setAmountReceived(event.getAmountReceived().subtract(tax));
|
||||
BigDecimal taxedAmount = event.getAmountReceived().subtract(tax);
|
||||
event.setAmountReceived(taxedAmount);
|
||||
if (NameManager.getServerEconomyAccount() != null) {
|
||||
ChestShop.callEvent(new CurrencyAddEvent(
|
||||
tax,
|
||||
NameManager.getServerEconomyAccount().getUuid(),
|
||||
event.getWorld()));
|
||||
}
|
||||
ChestShop.getShopLogger().info(String.format(TAX_RECEIVED_MESSAGE, taxAmount, tax, taxedAmount));
|
||||
}
|
||||
} else if (event.getDirection() == CurrencyTransferEvent.Direction.PARTNER && Permission.has(event.getInitiator(), Permission.NO_BUY_TAX)) {
|
||||
event.setAmountSent(event.getAmountSent().subtract(getTaxAmount(event.getAmountSent(), taxAmount)));
|
||||
event.setAmountReceived(event.getAmountReceived().subtract(getTaxAmount(event.getAmountReceived(), taxAmount)));
|
||||
// Reduce paid amount as the buyer has permission to not pay taxes
|
||||
BigDecimal taxSent = getTaxAmount(event.getAmountSent(), taxAmount);
|
||||
BigDecimal taxedSentAmount = event.getAmountSent().subtract(taxSent);
|
||||
event.setAmountSent(taxedSentAmount);
|
||||
ChestShop.getShopLogger().info(String.format(TAX_SENT_MESSAGE, taxAmount, taxSent, taxedSentAmount));
|
||||
|
||||
// Reduce the amount that the seller receives anyways even though tax wasn't paid as that shouldn't make a difference for the seller
|
||||
BigDecimal taxReceived = getTaxAmount(event.getAmountReceived(), taxAmount);
|
||||
BigDecimal taxedReceivedAmount = event.getAmountReceived().subtract(taxReceived);
|
||||
event.setAmountReceived(taxedReceivedAmount);
|
||||
ChestShop.getShopLogger().info(String.format(TAX_RECEIVED_MESSAGE, taxAmount, taxReceived, taxedReceivedAmount));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -16,15 +16,17 @@ public class GarbageTextListener implements Listener {
|
|||
public static void filterGarbage(SignChangeEvent event) {
|
||||
for (int i = 0; i < 4; ++i) {
|
||||
String line = event.getLine(i);
|
||||
StringBuilder output = new StringBuilder(line.length());
|
||||
if (line != null) {
|
||||
StringBuilder output = new StringBuilder(line.length());
|
||||
|
||||
for (char character : line.toCharArray()) {
|
||||
if (character < 0xF700 || character > 0xF747) {
|
||||
output.append(character);
|
||||
for (char character : line.toCharArray()) {
|
||||
if (character < 0xF700 || character > 0xF747) {
|
||||
output.append(character);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
event.setLine(i, output.toString());
|
||||
event.setLine(i, output.toString());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,11 +1,17 @@
|
|||
package com.Acrobot.ChestShop.Listeners.Item;
|
||||
|
||||
import com.Acrobot.ChestShop.Configuration.Properties;
|
||||
import com.Acrobot.ChestShop.Listeners.Modules.StockCounterModule;
|
||||
import com.Acrobot.ChestShop.Signs.ChestShopSign;
|
||||
import org.bukkit.block.BlockState;
|
||||
import org.bukkit.block.Hopper;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.EventPriority;
|
||||
import org.bukkit.event.Listener;
|
||||
import org.bukkit.event.inventory.InventoryMoveItemEvent;
|
||||
import org.bukkit.inventory.InventoryHolder;
|
||||
|
||||
import static com.Acrobot.Breeze.Utils.ImplementationAdapter.getHolder;
|
||||
|
||||
/**
|
||||
* @author Acrobot
|
||||
|
@ -14,14 +20,15 @@ public class ItemMoveListener implements Listener {
|
|||
|
||||
@EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST)
|
||||
public static void onItemMove(InventoryMoveItemEvent event) {
|
||||
if (event.getSource() == null || event.getDestination().getHolder() instanceof BlockState) {
|
||||
return;
|
||||
}
|
||||
InventoryHolder destinationHolder = getHolder(event.getDestination(), false);
|
||||
InventoryHolder sourceHolder = getHolder(event.getSource(), false);
|
||||
|
||||
if (!ChestShopSign.isShopBlock(event.getSource().getHolder())) {
|
||||
return;
|
||||
if (!(destinationHolder instanceof BlockState) && ChestShopSign.isShopBlock(sourceHolder)) {
|
||||
event.setCancelled(true);
|
||||
} else if (Properties.USE_STOCK_COUNTER && ChestShopSign.isShopBlock(destinationHolder) && sourceHolder instanceof Hopper) {
|
||||
StockCounterModule.updateCounterOnItemMoveEvent(event.getItem(), destinationHolder);
|
||||
}
|
||||
|
||||
event.setCancelled(true);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
|
@ -0,0 +1,18 @@
|
|||
package com.Acrobot.ChestShop.Listeners.Item;
|
||||
|
||||
import com.Acrobot.Breeze.Utils.MaterialUtil;
|
||||
import com.Acrobot.ChestShop.Events.ItemStringQueryEvent;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.EventPriority;
|
||||
import org.bukkit.event.Listener;
|
||||
|
||||
public class ItemStringListener implements Listener {
|
||||
|
||||
@EventHandler(priority = EventPriority.NORMAL)
|
||||
public static void calculateItemString(ItemStringQueryEvent event) {
|
||||
if (event.getItemString() == null) {
|
||||
event.setItemString(MaterialUtil.getName(event.getItem(), event.getMaxWidth()));
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -1,19 +1,30 @@
|
|||
package com.Acrobot.ChestShop.Listeners;
|
||||
|
||||
import com.Acrobot.Breeze.Utils.StringUtil;
|
||||
import com.Acrobot.ChestShop.ChestShop;
|
||||
import com.Acrobot.ChestShop.Commands.ItemInfo;
|
||||
import com.Acrobot.ChestShop.Events.ItemInfoEvent;
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.Color;
|
||||
import org.bukkit.NamespacedKey;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.enchantments.Enchantment;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.Listener;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.inventory.meta.AxolotlBucketMeta;
|
||||
import org.bukkit.inventory.meta.BookMeta;
|
||||
import org.bukkit.inventory.meta.BundleMeta;
|
||||
import org.bukkit.inventory.meta.CrossbowMeta;
|
||||
import org.bukkit.inventory.meta.EnchantmentStorageMeta;
|
||||
import org.bukkit.inventory.meta.ItemMeta;
|
||||
import org.bukkit.inventory.meta.KnowledgeBookMeta;
|
||||
import org.bukkit.inventory.meta.LeatherArmorMeta;
|
||||
import org.bukkit.inventory.meta.MapMeta;
|
||||
import org.bukkit.inventory.meta.PotionMeta;
|
||||
import org.bukkit.inventory.meta.Repairable;
|
||||
import org.bukkit.potion.Potion;
|
||||
import org.bukkit.inventory.meta.TropicalFishBucketMeta;
|
||||
import org.bukkit.map.MapView;
|
||||
import org.bukkit.potion.PotionEffect;
|
||||
|
||||
import java.util.Map;
|
||||
|
@ -21,34 +32,99 @@ import java.util.Map;
|
|||
import static com.Acrobot.Breeze.Utils.NumberUtil.toRoman;
|
||||
import static com.Acrobot.Breeze.Utils.NumberUtil.toTime;
|
||||
import static com.Acrobot.Breeze.Utils.StringUtil.capitalizeFirstLetter;
|
||||
import static com.Acrobot.ChestShop.Configuration.Messages.iteminfo_axolotl_variant;
|
||||
import static com.Acrobot.ChestShop.Configuration.Messages.iteminfo_book;
|
||||
import static com.Acrobot.ChestShop.Configuration.Messages.iteminfo_book_generation;
|
||||
import static com.Acrobot.ChestShop.Configuration.Messages.iteminfo_bundle_items;
|
||||
import static com.Acrobot.ChestShop.Configuration.Messages.iteminfo_crossbow_projectile;
|
||||
import static com.Acrobot.ChestShop.Configuration.Messages.iteminfo_crossbow_projectiles;
|
||||
import static com.Acrobot.ChestShop.Configuration.Messages.iteminfo_leather_color;
|
||||
import static com.Acrobot.ChestShop.Configuration.Messages.iteminfo_lore;
|
||||
import static com.Acrobot.ChestShop.Configuration.Messages.iteminfo_map_location;
|
||||
import static com.Acrobot.ChestShop.Configuration.Messages.iteminfo_map_view;
|
||||
import static com.Acrobot.ChestShop.Configuration.Messages.iteminfo_recipes;
|
||||
import static com.Acrobot.ChestShop.Configuration.Messages.iteminfo_repaircost;
|
||||
import static com.Acrobot.ChestShop.Configuration.Messages.iteminfo_tropical_fish;
|
||||
|
||||
/**
|
||||
* @author Acrobot
|
||||
*/
|
||||
public class ItemInfoListener implements Listener {
|
||||
|
||||
// Register version dependent listeners
|
||||
static {
|
||||
try {
|
||||
Class.forName("org.bukkit.inventory.meta.AxolotlBucketMeta");
|
||||
ChestShop.registerListener(new Listener() {
|
||||
@EventHandler
|
||||
public void addAxolotlInfo(ItemInfoEvent event) {
|
||||
if (event.getItem().hasItemMeta()) {
|
||||
ItemMeta meta = event.getItem().getItemMeta();
|
||||
if (meta instanceof AxolotlBucketMeta) {
|
||||
iteminfo_axolotl_variant.send(event.getSender(), "variant", capitalizeFirstLetter(((AxolotlBucketMeta) meta).getVariant().name(), '_'));
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
} catch (ClassNotFoundException | NoClassDefFoundError ignored) {}
|
||||
try {
|
||||
Class.forName("org.bukkit.inventory.meta.BundleMeta");
|
||||
ChestShop.registerListener(new Listener() {
|
||||
@EventHandler
|
||||
public void addAxolotlInfo(ItemInfoEvent event) {
|
||||
if (event.getItem().hasItemMeta()) {
|
||||
ItemMeta meta = event.getItem().getItemMeta();
|
||||
if (meta instanceof BundleMeta) {
|
||||
iteminfo_bundle_items.send(event.getSender(), "itemcount", String.valueOf(((BundleMeta) meta).getItems().size()));
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
} catch (ClassNotFoundException | NoClassDefFoundError ignored) {}
|
||||
try {
|
||||
Class.forName("org.bukkit.inventory.meta.CrossbowMeta");
|
||||
ChestShop.registerListener(new Listener() {
|
||||
@EventHandler
|
||||
public void addCrossBowInfo(ItemInfoEvent event) {
|
||||
if (event.getItem().hasItemMeta()) {
|
||||
ItemMeta meta = event.getItem().getItemMeta();
|
||||
if (meta instanceof CrossbowMeta && ((CrossbowMeta) meta).hasChargedProjectiles()) {
|
||||
iteminfo_crossbow_projectiles.send(event.getSender());
|
||||
for (ItemStack chargedProjectile : ((CrossbowMeta) meta).getChargedProjectiles()) {
|
||||
ItemInfo.sendItemName(event.getSender(), chargedProjectile, iteminfo_crossbow_projectile);
|
||||
ChestShop.callEvent(new ItemInfoEvent(event.getSender(), chargedProjectile));
|
||||
event.getSender().sendMessage(ChatColor.GRAY + "---");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
} catch (ClassNotFoundException | NoClassDefFoundError ignored) {}
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public static void addRepairCost(ItemInfoEvent event) {
|
||||
ItemMeta meta = event.getItem().getItemMeta();
|
||||
if (meta instanceof Repairable && ((Repairable) meta).getRepairCost() > 0) {
|
||||
iteminfo_repaircost.send(event.getSender(), "cost", String.valueOf(((Repairable) meta).getRepairCost()));
|
||||
if (event.getItem().hasItemMeta()) {
|
||||
ItemMeta meta = event.getItem().getItemMeta();
|
||||
if (meta instanceof Repairable && ((Repairable) meta).getRepairCost() > 0) {
|
||||
iteminfo_repaircost.send(event.getSender(), "cost", String.valueOf(((Repairable) meta).getRepairCost()));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public static void addEnchantment(ItemInfoEvent event) {
|
||||
ItemStack item = event.getItem();
|
||||
ItemMeta meta = item.getItemMeta();
|
||||
CommandSender sender = event.getSender();
|
||||
|
||||
for (Map.Entry<Enchantment, Integer> enchantment : item.getEnchantments().entrySet()) {
|
||||
sender.sendMessage(ChatColor.AQUA + capitalizeFirstLetter(enchantment.getKey().getName(), '_') + ' ' + toRoman(enchantment.getValue()));
|
||||
}
|
||||
|
||||
if (!item.hasItemMeta()) {
|
||||
return;
|
||||
}
|
||||
ItemMeta meta = item.getItemMeta();
|
||||
if (meta instanceof EnchantmentStorageMeta) {
|
||||
for (Map.Entry<Enchantment, Integer> enchantment : ((EnchantmentStorageMeta) meta).getStoredEnchants().entrySet()) {
|
||||
sender.sendMessage(ChatColor.YELLOW + capitalizeFirstLetter(enchantment.getKey().getName(), '_') + ' ' + toRoman(enchantment.getValue()));
|
||||
|
@ -56,49 +132,110 @@ public class ItemInfoListener implements Listener {
|
|||
}
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public static void addLeatherColor(ItemInfoEvent event) {
|
||||
if (event.getItem().hasItemMeta()) {
|
||||
ItemMeta meta = event.getItem().getItemMeta();
|
||||
if (meta instanceof LeatherArmorMeta) {
|
||||
Color color = ((LeatherArmorMeta) meta).getColor();
|
||||
iteminfo_leather_color.send(event.getSender(),
|
||||
"colorred", String.valueOf(color.getRed()),
|
||||
"colorgreen", String.valueOf(color.getGreen()),
|
||||
"colorblue", String.valueOf(color.getBlue()),
|
||||
"colorhex", Integer.toHexString(color.asRGB())
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public static void addRecipes(ItemInfoEvent event) {
|
||||
if (event.getItem().hasItemMeta()) {
|
||||
ItemMeta meta = event.getItem().getItemMeta();
|
||||
if (meta instanceof KnowledgeBookMeta && !((KnowledgeBookMeta) meta).getRecipes().isEmpty()) {
|
||||
iteminfo_recipes.send(event.getSender());
|
||||
for (NamespacedKey recipe : ((KnowledgeBookMeta) meta).getRecipes()) {
|
||||
event.getSender().sendMessage(ChatColor.GRAY + recipe.toString());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public static void addTropicalFishInfo(ItemInfoEvent event) {
|
||||
if (event.getItem().hasItemMeta()) {
|
||||
ItemMeta meta = event.getItem().getItemMeta();
|
||||
if (meta instanceof TropicalFishBucketMeta && ((TropicalFishBucketMeta) meta).hasVariant()) {
|
||||
iteminfo_tropical_fish.send(event.getSender(),
|
||||
"pattern", capitalizeFirstLetter(((TropicalFishBucketMeta) meta).getPattern().name()),
|
||||
"patterncolor", capitalizeFirstLetter(((TropicalFishBucketMeta) meta).getPatternColor().name()),
|
||||
"bodycolor", capitalizeFirstLetter(((TropicalFishBucketMeta) meta).getBodyColor().name())
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public static void addMapInfo(ItemInfoEvent event) {
|
||||
if (event.getItem().hasItemMeta()) {
|
||||
ItemMeta meta = event.getItem().getItemMeta();
|
||||
if (meta instanceof MapMeta) {
|
||||
if (((MapMeta) meta).getMapView() != null) {
|
||||
MapView mapView = ((MapMeta) meta).getMapView();
|
||||
iteminfo_map_view.send(event.getSender(),
|
||||
"id", String.valueOf(mapView.getId()),
|
||||
"x", String.valueOf(mapView.getCenterX()),
|
||||
"z", String.valueOf(mapView.getCenterZ()),
|
||||
"world", mapView.getWorld() != null ? String.valueOf(mapView.getWorld().getName()) : "unknown",
|
||||
"scale", capitalizeFirstLetter(mapView.getScale().name(), '_'),
|
||||
"locked", String.valueOf(mapView.isLocked())
|
||||
);
|
||||
}
|
||||
if (((MapMeta) meta).hasLocationName()) {
|
||||
iteminfo_map_location.send(event.getSender(), "location", String.valueOf(((MapMeta) meta).getLocationName()));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public static void addPotionInfo(ItemInfoEvent event) {
|
||||
ItemStack item = event.getItem();
|
||||
|
||||
if (item.getType() != Material.POTION || item.getDurability() == 0) {
|
||||
if (!item.hasItemMeta()) {
|
||||
return;
|
||||
}
|
||||
|
||||
Potion potion;
|
||||
|
||||
try {
|
||||
potion = Potion.fromItemStack(item);
|
||||
} catch (IllegalArgumentException ex) {
|
||||
ItemMeta meta = item.getItemMeta();
|
||||
if (!(meta instanceof PotionMeta)) {
|
||||
return;
|
||||
}
|
||||
|
||||
StringBuilder message = new StringBuilder(50);
|
||||
|
||||
message.append(ChatColor.GRAY);
|
||||
|
||||
if (potion.getType() == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (potion.isSplash()) {
|
||||
message.append("Splash ");
|
||||
}
|
||||
|
||||
message.append("Potion of ");
|
||||
message.append(capitalizeFirstLetter(potion.getType().name(), '_')).append(' ');
|
||||
message.append(toRoman(potion.getLevel()));
|
||||
PotionMeta potionMeta = (PotionMeta) meta;
|
||||
|
||||
CommandSender sender = event.getSender();
|
||||
|
||||
sender.sendMessage(message.toString());
|
||||
if (potionMeta.getBasePotionType() != null) {
|
||||
StringBuilder message = new StringBuilder(50);
|
||||
|
||||
for (PotionEffect effect : potion.getEffects()) {
|
||||
sender.sendMessage(ChatColor.DARK_GRAY + capitalizeFirstLetter(effect.getType().getName(), '_') + ' ' + toTime(effect.getDuration() / 20));
|
||||
message.append(ChatColor.GRAY);
|
||||
|
||||
message.append(capitalizeFirstLetter(item.getType().name(), '_')).append(" of ");
|
||||
message.append(capitalizeFirstLetter(potionMeta.getBasePotionType().getKey().getKey(), '_')).append(' ');
|
||||
|
||||
sender.sendMessage(message.toString());
|
||||
}
|
||||
|
||||
for (PotionEffect effect : potionMeta.getCustomEffects()) {
|
||||
sender.sendMessage(ChatColor.DARK_GRAY + capitalizeFirstLetter(effect.getType().getKey().getKey(), '_')
|
||||
+ ' ' + (effect.getAmplifier() + 1) + ' ' + toTime(effect.getDuration() / 20));
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public static void addBookInfo(ItemInfoEvent event) {
|
||||
if (!event.getItem().hasItemMeta()) {
|
||||
return;
|
||||
}
|
||||
ItemMeta meta = event.getItem().getItemMeta();
|
||||
if (meta instanceof BookMeta) {
|
||||
BookMeta book = (BookMeta) meta;
|
||||
|
@ -117,9 +254,11 @@ public class ItemInfoListener implements Listener {
|
|||
|
||||
@EventHandler
|
||||
public static void addLoreInfo(ItemInfoEvent event) {
|
||||
ItemMeta meta = event.getItem().getItemMeta();
|
||||
if (meta.hasLore()) {
|
||||
iteminfo_lore.send(event.getSender(), "lore", String.join("\n", meta.getLore()));
|
||||
if (event.getItem().hasItemMeta()) {
|
||||
ItemMeta meta = event.getItem().getItemMeta();
|
||||
if (meta.hasLore()) {
|
||||
iteminfo_lore.send(event.getSender(), "lore", String.join("\n", meta.getLore()));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -5,6 +5,7 @@ import com.Acrobot.ChestShop.ChestShop;
|
|||
import com.Acrobot.ChestShop.Events.ChestShopReloadEvent;
|
||||
import com.Acrobot.ChestShop.Events.PreTransactionEvent;
|
||||
import com.Acrobot.ChestShop.Permission;
|
||||
import com.Acrobot.ChestShop.Signs.ChestShopSign;
|
||||
import com.Acrobot.ChestShop.UUIDs.NameManager;
|
||||
import org.bukkit.configuration.file.YamlConfiguration;
|
||||
import org.bukkit.entity.Player;
|
||||
|
@ -16,14 +17,15 @@ import java.io.IOException;
|
|||
import java.math.BigDecimal;
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
import java.util.logging.Level;
|
||||
|
||||
import static com.Acrobot.ChestShop.Events.TransactionEvent.TransactionType.BUY;
|
||||
import static com.Acrobot.ChestShop.Signs.ChestShopSign.PRICE_LINE;
|
||||
|
||||
/**
|
||||
* @author Acrobot
|
||||
*/
|
||||
public class DiscountModule implements Listener {
|
||||
private static final String DISCOUNT_MESSAGE = "Applied a discount of %1$f percent for a resulting price of %2$.2f";
|
||||
private YamlConfiguration config;
|
||||
private Set<String> groupList = new HashSet<String>();
|
||||
|
||||
|
@ -43,7 +45,7 @@ public class DiscountModule implements Listener {
|
|||
try {
|
||||
config.save(ChestShop.loadFile("discounts.yml"));
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
ChestShop.getBukkitLogger().log(Level.SEVERE, "Error while loading discounts config", e);
|
||||
}
|
||||
|
||||
groupList = config.getKeys(false);
|
||||
|
@ -62,13 +64,16 @@ public class DiscountModule implements Listener {
|
|||
|
||||
Player client = event.getClient();
|
||||
|
||||
if (!PriceUtil.hasBuyPrice(event.getSign().getLine(PRICE_LINE))) {
|
||||
if (!PriceUtil.hasBuyPrice(ChestShopSign.getPrice(event.getSign()))) {
|
||||
return;
|
||||
}
|
||||
|
||||
for (String group : groupList) {
|
||||
if (Permission.has(client, Permission.DISCOUNT + group)) {
|
||||
event.setExactPrice(event.getExactPrice().multiply(BigDecimal.valueOf(config.getDouble(group) / 100)));
|
||||
double discount = config.getDouble(group);
|
||||
BigDecimal discountedPrice = event.getExactPrice().multiply(BigDecimal.valueOf(discount / 100));
|
||||
event.setExactPrice(discountedPrice);
|
||||
ChestShop.getBukkitLogger().info(String.format(DISCOUNT_MESSAGE, discount, discountedPrice));
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,135 @@
|
|||
package com.Acrobot.ChestShop.Listeners.Modules;
|
||||
|
||||
import com.Acrobot.Breeze.Utils.MaterialUtil;
|
||||
import com.Acrobot.ChestShop.ChestShop;
|
||||
import com.Acrobot.ChestShop.Events.ChestShopReloadEvent;
|
||||
import com.Acrobot.ChestShop.Events.ItemParseEvent;
|
||||
import com.Acrobot.ChestShop.Events.ItemStringQueryEvent;
|
||||
import com.google.common.collect.BiMap;
|
||||
import com.google.common.collect.HashBiMap;
|
||||
import org.bukkit.configuration.file.YamlConfiguration;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.EventPriority;
|
||||
import org.bukkit.event.Listener;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.util.Locale;
|
||||
import java.util.Map;
|
||||
import java.util.logging.Level;
|
||||
|
||||
import static com.Acrobot.Breeze.Utils.StringUtil.getMinecraftStringWidth;
|
||||
|
||||
/**
|
||||
* @author Acrobot
|
||||
*/
|
||||
public class ItemAliasModule implements Listener {
|
||||
private YamlConfiguration configuration;
|
||||
/**
|
||||
* Map ChestShop item code -> alias
|
||||
*/
|
||||
private BiMap<String, String> aliases;
|
||||
|
||||
public ItemAliasModule() {
|
||||
load();
|
||||
}
|
||||
|
||||
private void load() {
|
||||
File file = new File(ChestShop.getFolder(), "itemAliases.yml");
|
||||
|
||||
configuration = YamlConfiguration.loadConfiguration(file);
|
||||
|
||||
configuration.options().header(
|
||||
"This file specified optional aliases for certain item codes. (Use the full name from /iteminfo)"
|
||||
+ "\nPlease note that these aliases should fit on a sign for it to work properly!"
|
||||
);
|
||||
|
||||
if (!file.exists()) {
|
||||
configuration.addDefault("Item String#3d", "My Cool Item");
|
||||
configuration.addDefault("Other Material#Eg", "Some other Item");
|
||||
|
||||
try {
|
||||
configuration.options().copyDefaults(true);
|
||||
configuration.save(ChestShop.loadFile("itemAliases.yml"));
|
||||
} catch (IOException e) {
|
||||
ChestShop.getBukkitLogger().log(Level.SEVERE, "Error while saving item aliases config", e);
|
||||
}
|
||||
}
|
||||
|
||||
aliases = HashBiMap.create(configuration.getKeys(false).size());
|
||||
|
||||
for (String key : configuration.getKeys(false)) {
|
||||
if (configuration.isString(key)) {
|
||||
aliases.put(key, configuration.getString(key));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onReload(ChestShopReloadEvent event) {
|
||||
load();
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.LOW)
|
||||
public void onItemParse(ItemParseEvent event) {
|
||||
String code = aliases.inverse().get(event.getItemString());
|
||||
if (code == null) {
|
||||
String[] typeParts = event.getItemString().replaceAll("(?<!^)([A-Z1-9])", "_$1").toUpperCase(Locale.ROOT).split("[ _\\-]");
|
||||
int length = Short.MAX_VALUE;
|
||||
for (Map.Entry<String, String> entry : aliases.entrySet()) {
|
||||
if (entry.getValue().length() < length && entry.getValue().toUpperCase(Locale.ROOT).startsWith(event.getItemString().toUpperCase(Locale.ROOT))) {
|
||||
length = (short) entry.getValue().length();
|
||||
code = entry.getKey();
|
||||
} else if (typeParts.length > 1) {
|
||||
String[] nameParts = entry.getValue().toUpperCase(Locale.ROOT).split("[ _\\-]");
|
||||
if (typeParts.length == nameParts.length) {
|
||||
boolean matched = true;
|
||||
for (int i = 0; i < nameParts.length; i++) {
|
||||
if (!nameParts[i].startsWith(typeParts[i])) {
|
||||
matched = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (matched) {
|
||||
code = entry.getKey();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (code != null) {
|
||||
event.setItem(MaterialUtil.getItem(code));
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.HIGH)
|
||||
public void onItemStringQuery(ItemStringQueryEvent event) {
|
||||
if (event.getItemString() != null) {
|
||||
String newCode = null;
|
||||
|
||||
if (aliases.containsKey(event.getItemString())) {
|
||||
newCode = aliases.get(event.getItemString());
|
||||
} else if (!event.getItemString().contains("#")) {
|
||||
newCode = aliases.get(event.getItemString().toLowerCase(Locale.ROOT));
|
||||
} else {
|
||||
String[] parts = event.getItemString().split("#", 2);
|
||||
String lowercaseCode = parts[0].toLowerCase(Locale.ROOT) + "#" + parts[1];
|
||||
if (aliases.containsKey(lowercaseCode)) {
|
||||
newCode = aliases.get(lowercaseCode);
|
||||
}
|
||||
}
|
||||
|
||||
if (newCode != null) {
|
||||
if (event.getMaxWidth() > 0) {
|
||||
int width = getMinecraftStringWidth(newCode);
|
||||
if (width > event.getMaxWidth()) {
|
||||
ChestShop.getBukkitLogger().warning("Can't use configured alias " + newCode + " as it's width (" + width + ") was wider than the allowed max width of " + event.getMaxWidth());
|
||||
return;
|
||||
}
|
||||
}
|
||||
event.setItemString(newCode);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -2,13 +2,17 @@ package com.Acrobot.ChestShop.Listeners.Modules;
|
|||
|
||||
import com.Acrobot.Breeze.Utils.PriceUtil;
|
||||
import com.Acrobot.ChestShop.ChestShop;
|
||||
import com.Acrobot.ChestShop.Configuration.Messages;
|
||||
import com.Acrobot.ChestShop.Events.ChestShopReloadEvent;
|
||||
import com.Acrobot.ChestShop.Events.ItemParseEvent;
|
||||
import com.Acrobot.ChestShop.Events.PreShopCreationEvent;
|
||||
import com.Acrobot.ChestShop.Permission;
|
||||
import com.Acrobot.ChestShop.Signs.ChestShopSign;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.configuration.ConfigurationSection;
|
||||
import org.bukkit.configuration.file.YamlConfiguration;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.Listener;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
|
@ -19,13 +23,8 @@ import java.math.BigDecimal;
|
|||
import java.util.Locale;
|
||||
import java.util.logging.Level;
|
||||
|
||||
import static com.Acrobot.ChestShop.Events.PreShopCreationEvent.CreationOutcome.BUY_PRICE_ABOVE_MAX;
|
||||
import static com.Acrobot.ChestShop.Events.PreShopCreationEvent.CreationOutcome.BUY_PRICE_BELOW_MIN;
|
||||
import static com.Acrobot.ChestShop.Events.PreShopCreationEvent.CreationOutcome.SELL_PRICE_ABOVE_MAX;
|
||||
import static com.Acrobot.ChestShop.Events.PreShopCreationEvent.CreationOutcome.SELL_PRICE_BELOW_MIN;
|
||||
import static com.Acrobot.ChestShop.Signs.ChestShopSign.ITEM_LINE;
|
||||
import static com.Acrobot.ChestShop.Signs.ChestShopSign.PRICE_LINE;
|
||||
import static com.Acrobot.ChestShop.Signs.ChestShopSign.QUANTITY_LINE;
|
||||
import static com.Acrobot.ChestShop.Events.PreShopCreationEvent.CreationOutcome.*;
|
||||
import static com.Acrobot.ChestShop.Permission.*;
|
||||
|
||||
/**
|
||||
* @author Acrobot
|
||||
|
@ -59,7 +58,7 @@ public class PriceRestrictionModule implements Listener {
|
|||
configuration.options().copyDefaults(true);
|
||||
configuration.save(ChestShop.loadFile("priceLimits.yml"));
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
ChestShop.getBukkitLogger().log(Level.SEVERE, "Error while loading priceLimits.yml", e);
|
||||
}
|
||||
} else if (!configuration.getBoolean("uses_materials")) {
|
||||
Material testMat = Material.matchMaterial("1");
|
||||
|
@ -74,7 +73,7 @@ public class PriceRestrictionModule implements Listener {
|
|||
configuration.save(file);
|
||||
ChestShop.getBukkitLogger().log(Level.INFO, "Conversion finished!");
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
ChestShop.getBukkitLogger().log(Level.SEVERE, "Error while converting priceLimits.yml", e);
|
||||
}
|
||||
} else {
|
||||
ChestShop.getBukkitLogger().log(Level.WARNING, "Could not convert numeric IDs in priceLimits.yml to Material names!");
|
||||
|
@ -104,9 +103,10 @@ public class PriceRestrictionModule implements Listener {
|
|||
|
||||
@EventHandler
|
||||
public void onPreShopCreation(PreShopCreationEvent event) {
|
||||
ItemParseEvent parseEvent = new ItemParseEvent(event.getSignLine(ITEM_LINE));
|
||||
ItemParseEvent parseEvent = new ItemParseEvent(ChestShopSign.getItem(event.getSignLines()));
|
||||
Bukkit.getPluginManager().callEvent(parseEvent);
|
||||
ItemStack material = parseEvent.getItem();
|
||||
Player player = event.getPlayer();
|
||||
|
||||
if (material == null) {
|
||||
return;
|
||||
|
@ -115,32 +115,45 @@ public class PriceRestrictionModule implements Listener {
|
|||
String itemType = material.getType().toString().toLowerCase(Locale.ROOT);
|
||||
int amount;
|
||||
try {
|
||||
amount = Integer.parseInt(event.getSignLine(QUANTITY_LINE));
|
||||
amount = ChestShopSign.getQuantity(event.getSignLines());
|
||||
} catch (IllegalArgumentException e) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (PriceUtil.hasBuyPrice(event.getSignLine(PRICE_LINE))) {
|
||||
BigDecimal buyPrice = PriceUtil.getExactBuyPrice(event.getSignLine(PRICE_LINE));
|
||||
String priceLine = ChestShopSign.getPrice(event.getSignLines());
|
||||
if (PriceUtil.hasBuyPrice(priceLine)) {
|
||||
BigDecimal buyPrice = PriceUtil.getExactBuyPrice(priceLine);
|
||||
|
||||
if (isValid("min.buy_price." + itemType) && buyPrice.compareTo(BigDecimal.valueOf(configuration.getDouble("min.buy_price." + itemType) * amount)) < 0) {
|
||||
BigDecimal minBuyPrice = BigDecimal.valueOf(configuration.getDouble("min.buy_price." + itemType) * amount);
|
||||
if (isValid("min.buy_price." + itemType) && buyPrice.compareTo(minBuyPrice) < 0
|
||||
&& !Permission.has(player, NOLIMIT_MIN_BUY) && !Permission.has(player, NOLIMIT_MIN_BUY_ID + itemType)) {
|
||||
event.setOutcome(BUY_PRICE_BELOW_MIN);
|
||||
Messages.BUY_PRICE_BELOW_MIN.sendWithPrefix(player, "price", buyPrice.toPlainString(), "minprice", minBuyPrice.toPlainString());
|
||||
}
|
||||
|
||||
if (isValid("max.buy_price." + itemType) && buyPrice.compareTo(BigDecimal.valueOf(configuration.getDouble("max.buy_price." + itemType) * amount)) > 0) {
|
||||
BigDecimal maxBuyPrice = BigDecimal.valueOf(configuration.getDouble("max.buy_price." + itemType) * amount);
|
||||
if (isValid("max.buy_price." + itemType) && buyPrice.compareTo(maxBuyPrice) > 0
|
||||
&& !Permission.has(player, NOLIMIT_MAX_BUY) && !Permission.has(player, NOLIMIT_MAX_BUY_ID + itemType)) {
|
||||
event.setOutcome(BUY_PRICE_ABOVE_MAX);
|
||||
Messages.BUY_PRICE_ABOVE_MAX.sendWithPrefix(player, "price", buyPrice.toPlainString(), "maxprice", maxBuyPrice.toPlainString());
|
||||
}
|
||||
}
|
||||
|
||||
if (PriceUtil.hasSellPrice(event.getSignLine(PRICE_LINE))) {
|
||||
BigDecimal sellPrice = PriceUtil.getExactSellPrice(event.getSignLine(PRICE_LINE));
|
||||
if (PriceUtil.hasSellPrice(priceLine)) {
|
||||
BigDecimal sellPrice = PriceUtil.getExactSellPrice(priceLine);
|
||||
|
||||
if (isValid("min.sell_price." + itemType) && sellPrice.compareTo(BigDecimal.valueOf(configuration.getDouble("min.sell_price." + itemType) * amount)) < 0) {
|
||||
BigDecimal minSellPrice = BigDecimal.valueOf(configuration.getDouble("min.sell_price." + itemType) * amount);
|
||||
if (isValid("min.sell_price." + itemType) && sellPrice.compareTo(minSellPrice) < 0
|
||||
&& !Permission.has(player, NOLIMIT_MIN_SELL) && !Permission.has(player, NOLIMIT_MIN_SELL_ID + itemType)) {
|
||||
event.setOutcome(SELL_PRICE_BELOW_MIN);
|
||||
Messages.SELL_PRICE_BELOW_MIN.sendWithPrefix(player, "price", sellPrice.toPlainString(), "minprice", minSellPrice.toPlainString());
|
||||
}
|
||||
|
||||
if (isValid("max.sell_price." + itemType) && sellPrice.compareTo(BigDecimal.valueOf(configuration.getDouble("max.sell_price." + itemType) * amount)) > 0) {
|
||||
BigDecimal maxSellPrice = BigDecimal.valueOf(configuration.getDouble("max.sell_price." + itemType) * amount);
|
||||
if (isValid("max.sell_price." + itemType) && sellPrice.compareTo(maxSellPrice) > 0
|
||||
&& !Permission.has(player, NOLIMIT_MAX_SELL) && !Permission.has(player, NOLIMIT_MAX_SELL_ID + itemType)) {
|
||||
event.setOutcome(SELL_PRICE_ABOVE_MAX);
|
||||
Messages.SELL_PRICE_ABOVE_MAX.sendWithPrefix(player, "price", sellPrice.toPlainString(), "maxprice", maxSellPrice.toPlainString());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,196 @@
|
|||
package com.Acrobot.ChestShop.Listeners.Modules;
|
||||
|
||||
import com.Acrobot.Breeze.Utils.InventoryUtil;
|
||||
import com.Acrobot.Breeze.Utils.MaterialUtil;
|
||||
import com.Acrobot.Breeze.Utils.QuantityUtil;
|
||||
import com.Acrobot.ChestShop.ChestShop;
|
||||
import com.Acrobot.ChestShop.Configuration.Properties;
|
||||
import com.Acrobot.ChestShop.Events.ItemParseEvent;
|
||||
import com.Acrobot.ChestShop.Events.PreShopCreationEvent;
|
||||
import com.Acrobot.ChestShop.Events.TransactionEvent;
|
||||
import com.Acrobot.ChestShop.Signs.ChestShopSign;
|
||||
import com.Acrobot.ChestShop.Utils.uBlock;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.block.Container;
|
||||
import org.bukkit.block.Sign;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.EventPriority;
|
||||
import org.bukkit.event.Listener;
|
||||
import org.bukkit.event.inventory.InventoryCloseEvent;
|
||||
import org.bukkit.event.inventory.InventoryType;
|
||||
import org.bukkit.inventory.Inventory;
|
||||
import org.bukkit.inventory.InventoryHolder;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
|
||||
import java.util.IllegalFormatException;
|
||||
|
||||
import static com.Acrobot.Breeze.Utils.ImplementationAdapter.getHolder;
|
||||
import static com.Acrobot.ChestShop.Signs.ChestShopSign.QUANTITY_LINE;
|
||||
|
||||
|
||||
/**
|
||||
* @author bricefrisco
|
||||
*/
|
||||
public class StockCounterModule implements Listener {
|
||||
private static final String PRICE_LINE_WITH_COUNT = "Q %d : C %d";
|
||||
|
||||
@EventHandler(priority = EventPriority.HIGH)
|
||||
public static void onPreShopCreation(PreShopCreationEvent event) {
|
||||
int quantity;
|
||||
try {
|
||||
quantity = ChestShopSign.getQuantity(event.getSignLines());
|
||||
} catch (IllegalArgumentException invalidQuantity) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (QuantityUtil.quantityLineContainsCounter(ChestShopSign.getQuantityLine(event.getSignLines()))) {
|
||||
event.setSignLine(QUANTITY_LINE, Integer.toString(quantity));
|
||||
}
|
||||
|
||||
if (!Properties.USE_STOCK_COUNTER
|
||||
|| (Properties.FORCE_UNLIMITED_ADMIN_SHOP && ChestShopSign.isAdminShop(event.getSignLines()))) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (Properties.MAX_SHOP_AMOUNT > 99999) {
|
||||
ChestShop.getBukkitLogger().warning("Stock counter cannot be used if MAX_SHOP_AMOUNT is over 5 digits");
|
||||
return;
|
||||
}
|
||||
|
||||
ItemStack itemTradedByShop = determineItemTradedByShop(ChestShopSign.getItem(event.getSignLines()));
|
||||
if (itemTradedByShop != null) {
|
||||
Container container = uBlock.findConnectedContainer(event.getSign());
|
||||
if (container != null) {
|
||||
event.setSignLine(QUANTITY_LINE, getQuantityLineWithCounter(quantity, itemTradedByShop, container.getInventory()));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public static void onInventoryClose(InventoryCloseEvent event) {
|
||||
if (event.getInventory().getType() == InventoryType.ENDER_CHEST || event.getInventory().getLocation() == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
InventoryHolder holder = getHolder(event.getInventory(), false);
|
||||
if (!uBlock.couldBeShopContainer(holder)) {
|
||||
return;
|
||||
}
|
||||
|
||||
for (Sign shopSign : uBlock.findConnectedShopSigns(holder)) {
|
||||
if (!Properties.USE_STOCK_COUNTER
|
||||
|| (Properties.FORCE_UNLIMITED_ADMIN_SHOP && ChestShopSign.isAdminShop(shopSign))) {
|
||||
if (QuantityUtil.quantityLineContainsCounter(ChestShopSign.getQuantityLine(shopSign))) {
|
||||
removeCounterFromQuantityLine(shopSign);
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
if (Properties.MAX_SHOP_AMOUNT > 99999) {
|
||||
ChestShop.getBukkitLogger().warning("Stock counter cannot be used if MAX_SHOP_AMOUNT is over 5 digits");
|
||||
if (QuantityUtil.quantityLineContainsCounter(ChestShopSign.getQuantityLine(shopSign))) {
|
||||
removeCounterFromQuantityLine(shopSign);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
updateCounterOnQuantityLine(shopSign, event.getInventory());
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.HIGH)
|
||||
public static void onTransaction(final TransactionEvent event) {
|
||||
String quantityLine = ChestShopSign.getQuantityLine(event.getSign());
|
||||
if (!Properties.USE_STOCK_COUNTER) {
|
||||
if (QuantityUtil.quantityLineContainsCounter(quantityLine)) {
|
||||
removeCounterFromQuantityLine(event.getSign());
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if (Properties.MAX_SHOP_AMOUNT > 99999) {
|
||||
ChestShop.getBukkitLogger().warning("Stock counter cannot be used if MAX_SHOP_AMOUNT is over 5 digits");
|
||||
if (QuantityUtil.quantityLineContainsCounter(quantityLine)) {
|
||||
removeCounterFromQuantityLine(event.getSign());
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if (Properties.FORCE_UNLIMITED_ADMIN_SHOP && ChestShopSign.isAdminShop(event.getSign())) {
|
||||
return;
|
||||
}
|
||||
|
||||
for (Sign shopSign : uBlock.findConnectedShopSigns( getHolder(event.getOwnerInventory(), false))) {
|
||||
updateCounterOnQuantityLine(shopSign, event.getOwnerInventory());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Update the stock counter on the sign's quantity line
|
||||
* @param sign The sign to update
|
||||
* @param chestShopInventory The inventory to search in
|
||||
* @param extraItems The extra items to add in the search
|
||||
*/
|
||||
public static void updateCounterOnQuantityLine(Sign sign, Inventory chestShopInventory, ItemStack... extraItems) {
|
||||
ItemStack itemTradedByShop = determineItemTradedByShop(sign);
|
||||
if (itemTradedByShop == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
int quantity;
|
||||
try {
|
||||
quantity = ChestShopSign.getQuantity(sign);
|
||||
} catch (IllegalFormatException invalidQuantity) {
|
||||
return;
|
||||
}
|
||||
|
||||
int numTradedItemsInChest = InventoryUtil.getAmount(itemTradedByShop, chestShopInventory);
|
||||
|
||||
for (ItemStack extraStack : extraItems) {
|
||||
if (!MaterialUtil.equals(extraStack, itemTradedByShop)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
numTradedItemsInChest += extraStack.getAmount();
|
||||
}
|
||||
|
||||
sign.setLine(QUANTITY_LINE, String.format(PRICE_LINE_WITH_COUNT, quantity, numTradedItemsInChest));
|
||||
sign.update(true);
|
||||
}
|
||||
|
||||
public static void updateCounterOnItemMoveEvent(ItemStack toAdd, InventoryHolder destinationHolder) {
|
||||
Block shopBlock = ChestShopSign.getShopBlock(destinationHolder);
|
||||
Sign connectedSign = uBlock.getConnectedSign(shopBlock);
|
||||
|
||||
updateCounterOnQuantityLine(connectedSign, destinationHolder.getInventory(), toAdd);
|
||||
}
|
||||
|
||||
public static void removeCounterFromQuantityLine(Sign sign) {
|
||||
int quantity;
|
||||
try {
|
||||
quantity = ChestShopSign.getQuantity(sign);
|
||||
} catch (IllegalFormatException invalidQuantity) {
|
||||
return;
|
||||
}
|
||||
|
||||
sign.setLine(QUANTITY_LINE, Integer.toString(quantity));
|
||||
sign.update(true);
|
||||
}
|
||||
|
||||
public static String getQuantityLineWithCounter(int amount, ItemStack itemTransacted, Inventory chestShopInventory) {
|
||||
int numTransactionItemsInChest = InventoryUtil.getAmount(itemTransacted, chestShopInventory);
|
||||
|
||||
return String.format(PRICE_LINE_WITH_COUNT, amount, numTransactionItemsInChest);
|
||||
}
|
||||
|
||||
public static ItemStack determineItemTradedByShop(Sign sign) {
|
||||
return determineItemTradedByShop(ChestShopSign.getItem(sign));
|
||||
}
|
||||
|
||||
public static ItemStack determineItemTradedByShop(String material) {
|
||||
ItemParseEvent parseEvent = new ItemParseEvent(material);
|
||||
Bukkit.getPluginManager().callEvent(parseEvent);
|
||||
return parseEvent.getItem();
|
||||
}
|
||||
}
|
|
@ -1,6 +1,5 @@
|
|||
package com.Acrobot.ChestShop.Listeners.Player;
|
||||
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.EventPriority;
|
||||
import org.bukkit.event.Listener;
|
||||
|
@ -23,7 +22,7 @@ public class PlayerConnect implements Listener {
|
|||
|
||||
final PlayerDTO playerDTO = new PlayerDTO(event.getPlayer());
|
||||
|
||||
Bukkit.getScheduler().runTaskAsynchronously(ChestShop.getPlugin(), () -> {
|
||||
ChestShop.runInAsyncThread(() -> {
|
||||
if (NameManager.getAccount(playerDTO.getUniqueId()) != null) {
|
||||
NameManager.storeUsername(playerDTO);
|
||||
}
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
package com.Acrobot.ChestShop.Listeners.Player;
|
||||
|
||||
import com.Acrobot.Breeze.Utils.*;
|
||||
import com.Acrobot.ChestShop.ChestShop;
|
||||
import com.Acrobot.ChestShop.Commands.AccessToggle;
|
||||
import com.Acrobot.ChestShop.Configuration.Messages;
|
||||
import com.Acrobot.ChestShop.Configuration.Properties;
|
||||
|
@ -10,15 +11,16 @@ import com.Acrobot.ChestShop.Events.AccountQueryEvent;
|
|||
import com.Acrobot.ChestShop.Events.Economy.AccountCheckEvent;
|
||||
import com.Acrobot.ChestShop.Events.ItemParseEvent;
|
||||
import com.Acrobot.ChestShop.Events.PreTransactionEvent;
|
||||
import com.Acrobot.ChestShop.Events.ShopInfoEvent;
|
||||
import com.Acrobot.ChestShop.Events.TransactionEvent;
|
||||
import com.Acrobot.ChestShop.Permission;
|
||||
import com.Acrobot.ChestShop.Security;
|
||||
import com.Acrobot.ChestShop.Signs.ChestShopSign;
|
||||
import com.Acrobot.ChestShop.Utils.ItemUtil;
|
||||
import com.Acrobot.ChestShop.Utils.uBlock;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.GameMode;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.block.Container;
|
||||
import org.bukkit.block.Sign;
|
||||
|
@ -34,9 +36,11 @@ import org.bukkit.inventory.ItemStack;
|
|||
|
||||
import java.math.BigDecimal;
|
||||
import java.math.MathContext;
|
||||
import java.math.RoundingMode;
|
||||
import java.util.Arrays;
|
||||
import java.util.logging.Level;
|
||||
|
||||
import static com.Acrobot.Breeze.Utils.ImplementationAdapter.getState;
|
||||
import static com.Acrobot.Breeze.Utils.BlockUtil.isSign;
|
||||
import static com.Acrobot.ChestShop.Events.TransactionEvent.TransactionType;
|
||||
import static com.Acrobot.ChestShop.Events.TransactionEvent.TransactionType.BUY;
|
||||
|
@ -60,34 +64,40 @@ public class PlayerInteract implements Listener {
|
|||
Action action = event.getAction();
|
||||
Player player = event.getPlayer();
|
||||
|
||||
if (Properties.USE_BUILT_IN_PROTECTION && isShopBlock(block)) {
|
||||
if (Properties.TURN_OFF_DEFAULT_PROTECTION_WHEN_PROTECTED_EXTERNALLY) {
|
||||
if (Properties.USE_BUILT_IN_PROTECTION && uBlock.couldBeShopContainer(block)) {
|
||||
Sign sign = uBlock.getConnectedSign(block);
|
||||
if (sign != null) {
|
||||
|
||||
if (!Security.canView(player, block, Properties.TURN_OFF_DEFAULT_PROTECTION_WHEN_PROTECTED_EXTERNALLY)) {
|
||||
if (Permission.has(player, Permission.SHOPINFO)) {
|
||||
ChestShop.callEvent(new ShopInfoEvent(player, sign));
|
||||
event.setCancelled(true);
|
||||
} else if (!Properties.TURN_OFF_DEFAULT_PROTECTION_WHEN_PROTECTED_EXTERNALLY) {
|
||||
Messages.ACCESS_DENIED.send(player);
|
||||
event.setCancelled(true);
|
||||
}
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if (!Security.canAccess(player, block)) {
|
||||
Messages.ACCESS_DENIED.sendWithPrefix(player);
|
||||
event.setCancelled(true);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if (!isSign(block) || player.getInventory().getItemInMainHand().getType() == Material.SIGN) // Blocking accidental sign edition
|
||||
if (!isSign(block))
|
||||
return;
|
||||
|
||||
Sign sign = (Sign) block.getState();
|
||||
Sign sign = (Sign) getState(block, false);
|
||||
if (!ChestShopSign.isValid(sign)) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (Properties.ALLOW_AUTO_ITEM_FILL && ChatColor.stripColor(sign.getLine(ITEM_LINE)).equals(AUTOFILL_CODE)) {
|
||||
if (Properties.ALLOW_AUTO_ITEM_FILL && ChatColor.stripColor(ChestShopSign.getItem(sign)).equals(AUTOFILL_CODE)) {
|
||||
if (ChestShopSign.hasPermission(player, OTHER_NAME_CREATE, sign)) {
|
||||
ItemStack item = player.getInventory().getItemInMainHand();
|
||||
if (!MaterialUtil.isEmpty(item)) {
|
||||
event.setCancelled(true);
|
||||
String itemCode;
|
||||
try {
|
||||
itemCode = MaterialUtil.getSignName(item);
|
||||
itemCode = ItemUtil.getSignName(item);
|
||||
} catch (IllegalArgumentException e) {
|
||||
player.sendMessage(ChatColor.RED + "Error while generating shop sign item name. Please contact an admin or take a look at the console/log!");
|
||||
com.Acrobot.ChestShop.ChestShop.getPlugin().getLogger().log(Level.SEVERE, "Error while generating shop sign item name", e);
|
||||
|
@ -100,7 +110,8 @@ public class PlayerInteract implements Listener {
|
|||
com.Acrobot.ChestShop.ChestShop.callEvent(changeEvent);
|
||||
if (!changeEvent.isCancelled()) {
|
||||
for (byte i = 0; i < changeEvent.getLines().length; ++i) {
|
||||
sign.setLine(i, changeEvent.getLine(i));
|
||||
String line = changeEvent.getLine(i);
|
||||
sign.setLine(i, line != null ? line : "");
|
||||
}
|
||||
sign.update();
|
||||
}
|
||||
|
@ -115,6 +126,18 @@ public class PlayerInteract implements Listener {
|
|||
|
||||
if (!AccessToggle.isIgnoring(player) && ChestShopSign.canAccess(player, sign) && !ChestShopSign.isAdminShop(sign)) {
|
||||
if (Properties.IGNORE_ACCESS_PERMS || ChestShopSign.isOwner(player, sign)) {
|
||||
if (player.getInventory().getItemInMainHand().getType().name().contains("SIGN") && action == RIGHT_CLICK_BLOCK) {
|
||||
// Allow editing of sign (if supported)
|
||||
return;
|
||||
} else if ((player.getInventory().getItemInMainHand().getType().name().endsWith("DYE")
|
||||
|| player.getInventory().getItemInMainHand().getType().name().endsWith("INK_SAC"))
|
||||
&& action == RIGHT_CLICK_BLOCK) {
|
||||
if (Properties.SIGN_DYING) {
|
||||
return;
|
||||
} else {
|
||||
event.setCancelled(true);
|
||||
}
|
||||
}
|
||||
if (Properties.ALLOW_SIGN_CHEST_OPEN && !(Properties.IGNORE_CREATIVE_MODE && player.getGameMode() == GameMode.CREATIVE)) {
|
||||
if (player.isSneaking() || player.isInsideVehicle()
|
||||
|| (Properties.ALLOW_LEFT_CLICK_DESTROYING && action == LEFT_CLICK_BLOCK)) {
|
||||
|
@ -125,13 +148,18 @@ public class PlayerInteract implements Listener {
|
|||
return;
|
||||
}
|
||||
// don't allow owners or people with access to buy/sell at this shop
|
||||
Messages.TRADE_DENIED_ACCESS_PERMS.sendWithPrefix(player);
|
||||
if (action == RIGHT_CLICK_BLOCK) {
|
||||
// don't allow editing
|
||||
event.setCancelled(true);
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (action == RIGHT_CLICK_BLOCK) {
|
||||
event.setCancelled(true);
|
||||
} else if (action == LEFT_CLICK_BLOCK && !ChestShopSign.canAccess(player, sign)) {
|
||||
} else if (action == LEFT_CLICK_BLOCK && !Properties.TURN_OFF_SIGN_PROTECTION && !ChestShopSign.canAccess(player, sign)) {
|
||||
event.setCancelled(true);
|
||||
}
|
||||
|
||||
|
@ -154,10 +182,9 @@ public class PlayerInteract implements Listener {
|
|||
}
|
||||
|
||||
private static PreTransactionEvent preparePreTransactionEvent(Sign sign, Player player, Action action) {
|
||||
String name = sign.getLine(NAME_LINE);
|
||||
String quantity = sign.getLine(QUANTITY_LINE);
|
||||
String prices = sign.getLine(PRICE_LINE);
|
||||
String material = sign.getLine(ITEM_LINE);
|
||||
String name = ChestShopSign.getOwner(sign);
|
||||
String prices = ChestShopSign.getPrice(sign);
|
||||
String material = ChestShopSign.getItem(sign);
|
||||
|
||||
AccountQueryEvent accountQueryEvent = new AccountQueryEvent(name);
|
||||
Bukkit.getPluginManager().callEvent(accountQueryEvent);
|
||||
|
@ -195,31 +222,32 @@ public class PlayerInteract implements Listener {
|
|||
|
||||
int amount = -1;
|
||||
try {
|
||||
amount = Integer.parseInt(quantity);
|
||||
} catch (NumberFormatException notANumber) {}
|
||||
amount = ChestShopSign.getQuantity(sign);
|
||||
} catch (NumberFormatException ignored) {} // There is no quantity number on the sign
|
||||
|
||||
if (amount < 1 || amount > Properties.MAX_SHOP_AMOUNT) {
|
||||
Messages.INVALID_SHOP_PRICE.sendWithPrefix(player);
|
||||
return null;
|
||||
}
|
||||
|
||||
BigDecimal pricePerItem = price.divide(BigDecimal.valueOf(amount), MathContext.DECIMAL128);
|
||||
if (Properties.SHIFT_SELLS_IN_STACKS && player.isSneaking() && !price.equals(PriceUtil.NO_PRICE) && isAllowedForShift(action == buy)) {
|
||||
int newAmount = adminShop ? InventoryUtil.getMaxStackSize(item) : getStackAmount(item, ownerInventory, player, action);
|
||||
if (newAmount > 0) {
|
||||
price = price.divide(BigDecimal.valueOf(amount), MathContext.DECIMAL128).multiply(BigDecimal.valueOf(newAmount)).setScale(Properties.PRICE_PRECISION, BigDecimal.ROUND_HALF_UP);
|
||||
price = pricePerItem.multiply(BigDecimal.valueOf(newAmount)).setScale(Properties.PRICE_PRECISION, RoundingMode.HALF_UP);
|
||||
amount = newAmount;
|
||||
}
|
||||
} else if (Properties.SHIFT_SELLS_EVERYTHING && player.isSneaking() && !price.equals(PriceUtil.NO_PRICE) && isAllowedForShift(action == buy)) {
|
||||
if (action != buy) {
|
||||
int newAmount = InventoryUtil.getAmount(item, player.getInventory());
|
||||
if (newAmount > 0) {
|
||||
price = price.divide(BigDecimal.valueOf(amount), MathContext.DECIMAL128).multiply(BigDecimal.valueOf(newAmount)).setScale(Properties.PRICE_PRECISION, BigDecimal.ROUND_HALF_UP);
|
||||
price = pricePerItem.multiply(BigDecimal.valueOf(newAmount)).setScale(Properties.PRICE_PRECISION, RoundingMode.HALF_UP);
|
||||
amount = newAmount;
|
||||
}
|
||||
} else if (!adminShop && ownerInventory != null) {
|
||||
int newAmount = InventoryUtil.getAmount(item, ownerInventory);
|
||||
if (newAmount > 0) {
|
||||
price = price.divide(BigDecimal.valueOf(amount), MathContext.DECIMAL128).multiply(BigDecimal.valueOf(newAmount)).setScale(Properties.PRICE_PRECISION, BigDecimal.ROUND_HALF_UP);
|
||||
price = pricePerItem.multiply(BigDecimal.valueOf(newAmount)).setScale(Properties.PRICE_PRECISION, RoundingMode.HALF_UP);
|
||||
amount = newAmount;
|
||||
}
|
||||
}
|
||||
|
@ -229,7 +257,11 @@ public class PlayerInteract implements Listener {
|
|||
|
||||
ItemStack[] items = InventoryUtil.getItemsStacked(item);
|
||||
|
||||
if (adminShop) {
|
||||
// Create virtual admin inventory if
|
||||
// - it's an admin shop
|
||||
// - there is no container for the shop sign
|
||||
// - the config doesn't force unlimited admin shop stock
|
||||
if (adminShop && (ownerInventory == null || Properties.FORCE_UNLIMITED_ADMIN_SHOP)) {
|
||||
ownerInventory = new AdminInventory(action == buy ? Arrays.stream(items).map(ItemStack::clone).toArray(ItemStack[]::new) : new ItemStack[0]);
|
||||
}
|
||||
|
||||
|
@ -277,6 +309,10 @@ public class PlayerInteract implements Listener {
|
|||
if (!Security.canAccess(player, signBlock)) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!Security.canAccess(player, container.getBlock())) {
|
||||
return;
|
||||
}
|
||||
|
||||
BlockUtil.openBlockGUI(container, player);
|
||||
}
|
||||
|
|
|
@ -1,18 +1,28 @@
|
|||
package com.Acrobot.ChestShop.Listeners.Player;
|
||||
|
||||
import com.Acrobot.ChestShop.ChestShop;
|
||||
import com.Acrobot.ChestShop.Configuration.Messages;
|
||||
import com.Acrobot.ChestShop.Configuration.Properties;
|
||||
import com.Acrobot.ChestShop.Events.ShopInfoEvent;
|
||||
import com.Acrobot.ChestShop.Permission;
|
||||
import com.Acrobot.ChestShop.Security;
|
||||
import com.Acrobot.ChestShop.Signs.ChestShopSign;
|
||||
import com.Acrobot.ChestShop.Utils.uBlock;
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.block.BlockState;
|
||||
import org.bukkit.block.DoubleChest;
|
||||
import org.bukkit.block.Sign;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.Listener;
|
||||
import org.bukkit.event.inventory.InventoryOpenEvent;
|
||||
import org.bukkit.inventory.InventoryHolder;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import static com.Acrobot.Breeze.Utils.ImplementationAdapter.getHolder;
|
||||
|
||||
/**
|
||||
* @author Acrobot
|
||||
*/
|
||||
|
@ -27,26 +37,49 @@ public class PlayerInventory implements Listener {
|
|||
return;
|
||||
}
|
||||
|
||||
InventoryHolder holder = event.getInventory().getHolder();
|
||||
if (!(holder instanceof BlockState)) {
|
||||
InventoryHolder holder = getHolder(event.getInventory(), false);
|
||||
if (!(holder instanceof BlockState) && !(holder instanceof DoubleChest)) {
|
||||
return;
|
||||
}
|
||||
|
||||
Player player = (Player) event.getPlayer();
|
||||
Block container;
|
||||
List<Block> containers = new ArrayList<>();
|
||||
|
||||
if (holder instanceof DoubleChest) {
|
||||
container = ((DoubleChest) holder).getLocation().getBlock();
|
||||
InventoryHolder leftSide = ((DoubleChest) holder).getLeftSide();
|
||||
if (leftSide instanceof BlockState) {
|
||||
containers.add(((BlockState) leftSide).getBlock());
|
||||
}
|
||||
InventoryHolder rightSide = ((DoubleChest) holder).getRightSide();
|
||||
if (rightSide instanceof BlockState) {
|
||||
containers.add(((BlockState) rightSide).getBlock());
|
||||
}
|
||||
} else {
|
||||
container = ((BlockState) holder).getBlock();
|
||||
containers.add(((BlockState) holder).getBlock());
|
||||
}
|
||||
|
||||
if (!ChestShopSign.isShopBlock(container)) {
|
||||
return;
|
||||
boolean canAccess = false;
|
||||
for (Block container : containers) {
|
||||
if (ChestShopSign.isShopBlock(container)) {
|
||||
if (Security.canView(player, container, false)) {
|
||||
canAccess = true;
|
||||
}
|
||||
} else {
|
||||
canAccess = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (!Security.canAccess(player, container)) {
|
||||
Messages.ACCESS_DENIED.sendWithPrefix(player);
|
||||
if (!canAccess) {
|
||||
if (Permission.has(player, Permission.SHOPINFO)) {
|
||||
for (Block container : containers) {
|
||||
Sign sign = uBlock.getConnectedSign(container);
|
||||
if (sign != null) {
|
||||
ChestShop.callEvent(new ShopInfoEvent((Player) event.getPlayer(), sign));
|
||||
}
|
||||
}
|
||||
} else {
|
||||
Messages.ACCESS_DENIED.sendWithPrefix(event.getPlayer());
|
||||
}
|
||||
event.setCancelled(true);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -9,6 +9,8 @@ import org.bukkit.event.Listener;
|
|||
import org.bukkit.event.player.PlayerTeleportEvent;
|
||||
import org.bukkit.inventory.InventoryHolder;
|
||||
|
||||
import static com.Acrobot.Breeze.Utils.ImplementationAdapter.getHolder;
|
||||
|
||||
/**
|
||||
* A fix for a CraftBukkit bug.
|
||||
*
|
||||
|
@ -18,7 +20,7 @@ public class PlayerTeleport implements Listener {
|
|||
|
||||
@EventHandler
|
||||
public static void onPlayerTeleport(PlayerTeleportEvent event) {
|
||||
InventoryHolder holder = event.getPlayer().getOpenInventory().getTopInventory().getHolder();
|
||||
InventoryHolder holder = getHolder(event.getPlayer().getOpenInventory().getTopInventory(), false);
|
||||
if (!(holder instanceof BlockState)) {
|
||||
return;
|
||||
}
|
||||
|
|
|
@ -8,8 +8,6 @@ import org.bukkit.event.EventHandler;
|
|||
import org.bukkit.event.EventPriority;
|
||||
import org.bukkit.event.Listener;
|
||||
|
||||
import static com.Acrobot.ChestShop.Signs.ChestShopSign.*;
|
||||
|
||||
/**
|
||||
* @author Acrobot
|
||||
*/
|
||||
|
@ -18,25 +16,23 @@ public class ShopCreationLogger implements Listener {
|
|||
|
||||
@EventHandler(priority = EventPriority.MONITOR)
|
||||
public static void onShopCreation(final ShopCreatedEvent event) {
|
||||
ChestShop.getBukkitServer().getScheduler().runTaskAsynchronously(ChestShop.getPlugin(), new Runnable() {
|
||||
@Override public void run() {
|
||||
String creator = event.getPlayer().getName();
|
||||
String shopOwner = event.getSignLine(NAME_LINE);
|
||||
String typeOfShop = ChestShopSign.isAdminShop(shopOwner) ? "an Admin Shop" : "a shop" + (event.createdByOwner() ? "" : " for " + event.getOwnerAccount().getName());
|
||||
ChestShop.runInAsyncThread(() -> {
|
||||
String creator = event.getPlayer().getName();
|
||||
String shopOwner = ChestShopSign.getOwner(event.getSignLines());
|
||||
String typeOfShop = ChestShopSign.isAdminShop(shopOwner) ? "an Admin Shop" : "a shop" + (event.createdByOwner() ? "" : " for " + event.getOwnerAccount().getName());
|
||||
|
||||
String item = event.getSignLine(QUANTITY_LINE) + ' ' + event.getSignLine(ITEM_LINE);
|
||||
String prices = event.getSignLine(PRICE_LINE);
|
||||
String location = LocationUtil.locationToString(event.getSign().getLocation());
|
||||
String item = ChestShopSign.getQuantity(event.getSignLines()) + ' ' + ChestShopSign.getItem(event.getSignLines());
|
||||
String prices = ChestShopSign.getPrice(event.getSignLines());
|
||||
String location = LocationUtil.locationToString(event.getSign().getLocation());
|
||||
|
||||
String message = String.format(CREATION_MESSAGE,
|
||||
creator,
|
||||
typeOfShop,
|
||||
item,
|
||||
prices,
|
||||
location);
|
||||
String message = String.format(CREATION_MESSAGE,
|
||||
creator,
|
||||
typeOfShop,
|
||||
item,
|
||||
prices,
|
||||
location);
|
||||
|
||||
ChestShop.getBukkitLogger().info(message);
|
||||
}
|
||||
ChestShop.getShopLogger().info(message);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
|
@ -13,8 +13,6 @@ import org.bukkit.block.data.type.WallSign;
|
|||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.Listener;
|
||||
|
||||
import static com.Acrobot.ChestShop.Signs.ChestShopSign.NAME_LINE;
|
||||
|
||||
/**
|
||||
* @author Acrobot
|
||||
*/
|
||||
|
@ -26,7 +24,7 @@ public class SignSticker implements Listener {
|
|||
return;
|
||||
}
|
||||
|
||||
if (ChestShopSign.isAdminShop(event.getSignLine(NAME_LINE))) {
|
||||
if (ChestShopSign.isAdminShop(event.getSignLines())) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -51,12 +49,17 @@ public class SignSticker implements Listener {
|
|||
return;
|
||||
}
|
||||
|
||||
int index = signBlock.getType().name().indexOf("SIGN");
|
||||
if (index < 0) {
|
||||
return;
|
||||
}
|
||||
Material newMaterial = Material.valueOf(signBlock.getType().name().substring(0, index) + "WALL_SIGN");
|
||||
|
||||
signBlock.setType(Material.WALL_SIGN);
|
||||
signBlock.setType(newMaterial);
|
||||
|
||||
org.bukkit.block.Sign sign = (org.bukkit.block.Sign) signBlock.getState();
|
||||
|
||||
WallSign signMaterial = (WallSign) Bukkit.createBlockData(Material.WALL_SIGN);
|
||||
WallSign signMaterial = (WallSign) Bukkit.createBlockData(newMaterial);
|
||||
signMaterial.setFacing(shopBlockFace.getOppositeFace());
|
||||
sign.setBlockData(signMaterial);
|
||||
|
||||
|
|
|
@ -19,7 +19,8 @@ public class EconomicModule implements Listener {
|
|||
event.getExactPrice(),
|
||||
event.getClient(),
|
||||
event.getOwnerAccount().getUuid(),
|
||||
event.getTransactionType() == BUY ? CurrencyTransferEvent.Direction.PARTNER : CurrencyTransferEvent.Direction.INITIATOR
|
||||
event.getTransactionType() == BUY ? CurrencyTransferEvent.Direction.PARTNER : CurrencyTransferEvent.Direction.INITIATOR,
|
||||
event
|
||||
);
|
||||
ChestShop.callEvent(currencyTransferEvent);
|
||||
if (!currencyTransferEvent.wasHandled()) {
|
||||
|
|
|
@ -27,9 +27,13 @@ public class EmptyShopDeleter implements Listener {
|
|||
return;
|
||||
}
|
||||
|
||||
Inventory ownerInventory = event.getOwnerInventory();
|
||||
Sign sign = event.getSign();
|
||||
Container connectedContainer = uBlock.findConnectedContainer(sign);
|
||||
|
||||
if (ChestShopSign.isAdminShop(sign)) {
|
||||
return;
|
||||
}
|
||||
|
||||
Inventory ownerInventory = event.getOwnerInventory();
|
||||
|
||||
if (!shopShouldBeRemoved(ownerInventory, event.getStock())) {
|
||||
return;
|
||||
|
@ -39,6 +43,8 @@ public class EmptyShopDeleter implements Listener {
|
|||
return;
|
||||
}
|
||||
|
||||
Container connectedContainer = uBlock.findConnectedContainer(sign);
|
||||
|
||||
ShopDestroyedEvent destroyedEvent = new ShopDestroyedEvent(null, event.getSign(), connectedContainer);
|
||||
ChestShop.callEvent(destroyedEvent);
|
||||
|
||||
|
@ -46,7 +52,9 @@ public class EmptyShopDeleter implements Listener {
|
|||
sign.getBlock().setType(Material.AIR);
|
||||
|
||||
if (Properties.REMOVE_EMPTY_CHESTS && !ChestShopSign.isAdminShop(ownerInventory) && InventoryUtil.isEmpty(ownerInventory)) {
|
||||
connectedContainer.getBlock().setType(Material.AIR);
|
||||
if (connectedContainer != null) {
|
||||
connectedContainer.getBlock().setType(Material.AIR);
|
||||
}
|
||||
} else {
|
||||
if (!signType.isItem()) {
|
||||
try {
|
||||
|
@ -62,7 +70,7 @@ public class EmptyShopDeleter implements Listener {
|
|||
}
|
||||
|
||||
private static boolean shopShouldBeRemoved(Inventory inventory, ItemStack[] stock) {
|
||||
if (Properties.REMOVE_EMPTY_SHOPS && !ChestShopSign.isAdminShop(inventory)) {
|
||||
if (Properties.REMOVE_EMPTY_SHOPS) {
|
||||
if (Properties.ALLOW_PARTIAL_TRANSACTIONS) {
|
||||
for (ItemStack itemStack : stock) {
|
||||
if (inventory.containsAtLeast(itemStack, 1)) {
|
||||
|
|
|
@ -1,9 +1,12 @@
|
|||
package com.Acrobot.ChestShop.Listeners.PostTransaction;
|
||||
|
||||
import com.Acrobot.Breeze.Utils.ImplementationAdapter;
|
||||
import com.Acrobot.Breeze.Utils.InventoryUtil;
|
||||
import com.Acrobot.ChestShop.ChestShop;
|
||||
import com.Acrobot.ChestShop.Configuration.Properties;
|
||||
import com.Acrobot.ChestShop.Events.TransactionEvent;
|
||||
import org.bukkit.block.BlockState;
|
||||
import org.bukkit.block.DoubleChest;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.EventPriority;
|
||||
|
@ -54,9 +57,11 @@ public class ItemManager implements Listener {
|
|||
private static void update(InventoryHolder holder) {
|
||||
if (holder instanceof Player) {
|
||||
((Player) holder).updateInventory();
|
||||
}
|
||||
if (holder instanceof BlockState) {
|
||||
} else if (holder instanceof BlockState) {
|
||||
((BlockState) holder).update();
|
||||
} else if (holder instanceof DoubleChest) {
|
||||
update(ImplementationAdapter.getLeftSide((DoubleChest) holder, false));
|
||||
update(ImplementationAdapter.getRightSide((DoubleChest) holder, false));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -9,7 +9,7 @@ import org.bukkit.event.Listener;
|
|||
import org.bukkit.inventory.ItemStack;
|
||||
|
||||
import static com.Acrobot.Breeze.Utils.InventoryUtil.mergeSimilarStacks;
|
||||
import static com.Acrobot.Breeze.Utils.MaterialUtil.getName;
|
||||
import static com.Acrobot.ChestShop.Utils.ItemUtil.getName;
|
||||
import static com.Acrobot.ChestShop.Events.TransactionEvent.TransactionType.BUY;
|
||||
|
||||
/**
|
||||
|
@ -36,6 +36,6 @@ public class TransactionLogger implements Listener {
|
|||
event.getOwnerAccount().getName(),
|
||||
LocationUtil.locationToString(event.getSign().getLocation()));
|
||||
|
||||
ChestShop.getBukkitLogger().info(message);
|
||||
ChestShop.getShopLogger().info(message);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -6,7 +6,9 @@ import com.Acrobot.ChestShop.Commands.Toggle;
|
|||
import com.Acrobot.ChestShop.Configuration.Messages;
|
||||
import com.Acrobot.ChestShop.Configuration.Properties;
|
||||
import com.Acrobot.ChestShop.Economy.Economy;
|
||||
import com.Acrobot.ChestShop.Events.Economy.CurrencyTransferEvent;
|
||||
import com.Acrobot.ChestShop.Events.TransactionEvent;
|
||||
import com.Acrobot.ChestShop.Utils.ItemUtil;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.entity.Player;
|
||||
|
@ -14,6 +16,7 @@ import org.bukkit.event.EventHandler;
|
|||
import org.bukkit.event.EventPriority;
|
||||
import org.bukkit.event.Listener;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.Map;
|
||||
|
||||
|
@ -22,63 +25,87 @@ import java.util.Map;
|
|||
*/
|
||||
public class TransactionMessageSender implements Listener {
|
||||
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
|
||||
public static void onTransaction(TransactionEvent event) {
|
||||
if (event.getTransactionType() == TransactionEvent.TransactionType.BUY) {
|
||||
public static void onCurrencyTransfer(CurrencyTransferEvent event) {
|
||||
if (event.getTransactionEvent() == null) {
|
||||
return;
|
||||
}
|
||||
if (event.getTransactionEvent().getTransactionType() == TransactionEvent.TransactionType.BUY) {
|
||||
sendBuyMessage(event);
|
||||
} else {
|
||||
sendSellMessage(event);
|
||||
}
|
||||
}
|
||||
|
||||
protected static void sendBuyMessage(TransactionEvent event) {
|
||||
Player player = event.getClient();
|
||||
protected static void sendBuyMessage(CurrencyTransferEvent event) {
|
||||
TransactionEvent transactionEvent = event.getTransactionEvent();
|
||||
Player player = transactionEvent.getClient();
|
||||
|
||||
if (Properties.SHOW_TRANSACTION_INFORMATION_CLIENT) {
|
||||
sendMessage(player, event.getClient().getName(), Messages.YOU_BOUGHT_FROM_SHOP, event, "owner", event.getOwnerAccount().getName());
|
||||
sendMessage(player, transactionEvent.getClient().getName(), Messages.YOU_BOUGHT_FROM_SHOP, event, MessageTarget.BUYER, "owner", transactionEvent.getOwnerAccount().getName());
|
||||
}
|
||||
|
||||
if (Properties.SHOW_TRANSACTION_INFORMATION_OWNER && !Toggle.isIgnoring(event.getOwnerAccount().getUuid())) {
|
||||
Player owner = Bukkit.getPlayer(event.getOwnerAccount().getUuid());
|
||||
sendMessage(owner, event.getOwnerAccount().getName(), Messages.SOMEBODY_BOUGHT_FROM_YOUR_SHOP, event, "buyer", player.getName());
|
||||
if (Properties.SHOW_TRANSACTION_INFORMATION_OWNER && !Toggle.isIgnoring(transactionEvent.getOwnerAccount().getUuid())) {
|
||||
Player owner = Bukkit.getPlayer(transactionEvent.getOwnerAccount().getUuid());
|
||||
sendMessage(owner, transactionEvent.getOwnerAccount().getName(), Messages.SOMEBODY_BOUGHT_FROM_YOUR_SHOP, event, MessageTarget.SELLER, "buyer", player.getName());
|
||||
}
|
||||
}
|
||||
|
||||
protected static void sendSellMessage(TransactionEvent event) {
|
||||
Player player = event.getClient();
|
||||
|
||||
protected static void sendSellMessage(CurrencyTransferEvent event) {
|
||||
TransactionEvent transactionEvent = event.getTransactionEvent();
|
||||
Player player = transactionEvent.getClient();
|
||||
|
||||
if (Properties.SHOW_TRANSACTION_INFORMATION_CLIENT) {
|
||||
sendMessage(player, event.getClient().getName(), Messages.YOU_SOLD_TO_SHOP, event, "buyer", event.getOwnerAccount().getName());
|
||||
sendMessage(player, transactionEvent.getClient().getName(), Messages.YOU_SOLD_TO_SHOP, event, MessageTarget.SELLER, "buyer", transactionEvent.getOwnerAccount().getName());
|
||||
}
|
||||
|
||||
if (Properties.SHOW_TRANSACTION_INFORMATION_OWNER && !Toggle.isIgnoring(event.getOwnerAccount().getUuid())) {
|
||||
Player owner = Bukkit.getPlayer(event.getOwnerAccount().getUuid());
|
||||
sendMessage(owner, event.getOwnerAccount().getName(), Messages.SOMEBODY_SOLD_TO_YOUR_SHOP, event, "seller", player.getName());
|
||||
if (Properties.SHOW_TRANSACTION_INFORMATION_OWNER && !Toggle.isIgnoring(transactionEvent.getOwnerAccount().getUuid())) {
|
||||
Player owner = Bukkit.getPlayer(transactionEvent.getOwnerAccount().getUuid());
|
||||
sendMessage(owner, transactionEvent.getOwnerAccount().getName(), Messages.SOMEBODY_SOLD_TO_YOUR_SHOP, event, MessageTarget.BUYER, "seller", player.getName());
|
||||
}
|
||||
}
|
||||
|
||||
private static void sendMessage(Player player, String playerName, Messages.Message rawMessage, TransactionEvent event, String... replacements) {
|
||||
Location loc = event.getSign().getLocation();
|
||||
|
||||
private static void sendMessage(Player player, String playerName, Messages.Message rawMessage, CurrencyTransferEvent event, MessageTarget messageTarget, String... replacements) {
|
||||
TransactionEvent transactionEvent = event.getTransactionEvent();
|
||||
|
||||
BigDecimal actualAmount = getTransactionActualAmount(event, messageTarget);
|
||||
|
||||
Location loc = transactionEvent.getSign().getLocation();
|
||||
Map<String, String> replacementMap = new LinkedHashMap<>();
|
||||
replacementMap.put("price", Economy.formatBalance(event.getExactPrice()));
|
||||
replacementMap.put("price", Economy.formatBalance(actualAmount));
|
||||
replacementMap.put("world", loc.getWorld().getName());
|
||||
replacementMap.put("x", String.valueOf(loc.getBlockX()));
|
||||
replacementMap.put("y", String.valueOf(loc.getBlockY()));
|
||||
replacementMap.put("z", String.valueOf(loc.getBlockZ()));
|
||||
|
||||
for (int i = 0; i + 1 < replacements.length; i+=2) {
|
||||
replacementMap.put("material", "%item");
|
||||
|
||||
for (int i = 0; i + 1 < replacements.length; i += 2) {
|
||||
replacementMap.put(replacements[i], replacements[i + 1]);
|
||||
}
|
||||
|
||||
if (Properties.SHOWITEM_MESSAGE && MaterialUtil.Show.sendMessage(player, playerName, rawMessage, transactionEvent.getStock(), replacementMap)) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (player != null) {
|
||||
if (Properties.SHOWITEM_MESSAGE && MaterialUtil.Show.sendMessage(player, rawMessage, event.getStock(), replacementMap)) {
|
||||
return;
|
||||
}
|
||||
replacementMap.put("item", MaterialUtil.getItemList(event.getStock()));
|
||||
replacementMap.put("item", ItemUtil.getItemList(transactionEvent.getStock()));
|
||||
rawMessage.sendWithPrefix(player, replacementMap);
|
||||
} else if (playerName != null) {
|
||||
replacementMap.put("item", MaterialUtil.getItemList(event.getStock()));
|
||||
replacementMap.put("item", ItemUtil.getItemList(transactionEvent.getStock()));
|
||||
ChestShop.sendBungeeMessage(playerName, rawMessage, replacementMap);
|
||||
}
|
||||
}
|
||||
|
||||
private static BigDecimal getTransactionActualAmount(CurrencyTransferEvent event, MessageTarget messageTarget) {
|
||||
if (messageTarget == MessageTarget.SELLER) {
|
||||
return event.getAmountReceived();
|
||||
} else {
|
||||
return event.getAmountSent();
|
||||
}
|
||||
}
|
||||
|
||||
private enum MessageTarget {
|
||||
BUYER,
|
||||
SELLER
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -14,7 +14,6 @@ import org.bukkit.event.Listener;
|
|||
import static com.Acrobot.ChestShop.Events.PreShopCreationEvent.CreationOutcome.NO_CHEST;
|
||||
import static com.Acrobot.ChestShop.Events.PreShopCreationEvent.CreationOutcome.NO_PERMISSION_FOR_CHEST;
|
||||
import static com.Acrobot.ChestShop.Permission.ADMIN;
|
||||
import static com.Acrobot.ChestShop.Signs.ChestShopSign.NAME_LINE;
|
||||
|
||||
/**
|
||||
* @author Acrobot
|
||||
|
@ -23,16 +22,14 @@ public class ChestChecker implements Listener {
|
|||
|
||||
@EventHandler(priority = EventPriority.LOW)
|
||||
public static void onPreShopCreation(PreShopCreationEvent event) {
|
||||
String nameLine = event.getSignLine(NAME_LINE);
|
||||
|
||||
if (ChestShopSign.isAdminShop(nameLine)) {
|
||||
return;
|
||||
}
|
||||
String nameLine = ChestShopSign.getOwner(event.getSignLines());
|
||||
|
||||
Container connectedContainer = uBlock.findConnectedContainer(event.getSign().getBlock());
|
||||
|
||||
if (connectedContainer == null) {
|
||||
event.setOutcome(NO_CHEST);
|
||||
if (!ChestShopSign.isAdminShop(nameLine)) {
|
||||
event.setOutcome(NO_CHEST);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
@ -18,7 +18,6 @@ import org.bukkit.event.Listener;
|
|||
import java.math.BigDecimal;
|
||||
|
||||
import static com.Acrobot.ChestShop.Permission.NOFEE;
|
||||
import static com.Acrobot.ChestShop.Signs.ChestShopSign.NAME_LINE;
|
||||
|
||||
/**
|
||||
* @author Acrobot
|
||||
|
@ -33,7 +32,7 @@ public class CreationFeeGetter implements Listener {
|
|||
return;
|
||||
}
|
||||
|
||||
if (ChestShopSign.isAdminShop(event.getSignLine(NAME_LINE))) {
|
||||
if (ChestShopSign.isAdminShop(event.getSignLines())) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
@ -33,19 +33,7 @@ public class ErrorMessageSender implements Listener {
|
|||
message = Messages.INVALID_SHOP_QUANTITY;
|
||||
break;
|
||||
case SELL_PRICE_HIGHER_THAN_BUY_PRICE:
|
||||
message = Messages.YOU_CANNOT_CREATE_SHOP;
|
||||
break;
|
||||
case SELL_PRICE_ABOVE_MAX:
|
||||
message = Messages.SELL_PRICE_ABOVE_MAX;
|
||||
break;
|
||||
case SELL_PRICE_BELOW_MIN:
|
||||
message = Messages.SELL_PRICE_BELOW_MIN;
|
||||
break;
|
||||
case BUY_PRICE_ABOVE_MAX:
|
||||
message = Messages.BUY_PRICE_ABOVE_MAX;
|
||||
break;
|
||||
case BUY_PRICE_BELOW_MIN:
|
||||
message = Messages.BUY_PRICE_BELOW_MIN;
|
||||
message = Messages.SELL_PRICE_HIGHER_THAN_BUY_PRICE;
|
||||
break;
|
||||
case NO_CHEST:
|
||||
message = Messages.NO_CHEST_DETECTED;
|
||||
|
|
|
@ -2,11 +2,11 @@ package com.Acrobot.ChestShop.Listeners.PreShopCreation;
|
|||
|
||||
import com.Acrobot.Breeze.Utils.MaterialUtil;
|
||||
import com.Acrobot.Breeze.Utils.StringUtil;
|
||||
import com.Acrobot.ChestShop.Configuration.Messages;
|
||||
import com.Acrobot.ChestShop.Configuration.Properties;
|
||||
import com.Acrobot.ChestShop.Events.ItemParseEvent;
|
||||
import com.Acrobot.ChestShop.Events.PreShopCreationEvent;
|
||||
import com.Acrobot.ChestShop.Signs.ChestShopSign;
|
||||
import com.Acrobot.ChestShop.Utils.ItemUtil;
|
||||
import com.Acrobot.ChestShop.Utils.uBlock;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.ChatColor;
|
||||
|
@ -31,7 +31,7 @@ public class ItemChecker implements Listener {
|
|||
|
||||
@EventHandler(priority = EventPriority.LOWEST)
|
||||
public static void onPreShopCreation(PreShopCreationEvent event) {
|
||||
String itemCode = event.getSignLine(ITEM_LINE);
|
||||
String itemCode = ChestShopSign.getItem(event.getSignLines());
|
||||
|
||||
ItemParseEvent parseEvent = new ItemParseEvent(itemCode);
|
||||
Bukkit.getPluginManager().callEvent(parseEvent);
|
||||
|
@ -60,7 +60,7 @@ public class ItemChecker implements Listener {
|
|||
}
|
||||
}
|
||||
|
||||
itemCode = MaterialUtil.getSignName(item);
|
||||
itemCode = ItemUtil.getSignName(item);
|
||||
|
||||
if (StringUtil.getMinecraftStringWidth(itemCode) > MAXIMUM_SIGN_WIDTH) {
|
||||
event.setOutcome(INVALID_ITEM);
|
||||
|
|
|
@ -14,7 +14,6 @@ import java.math.BigDecimal;
|
|||
|
||||
import static com.Acrobot.ChestShop.Events.PreShopCreationEvent.CreationOutcome.NOT_ENOUGH_MONEY;
|
||||
import static com.Acrobot.ChestShop.Permission.NOFEE;
|
||||
import static com.Acrobot.ChestShop.Signs.ChestShopSign.NAME_LINE;
|
||||
|
||||
/**
|
||||
* @author Acrobot
|
||||
|
@ -29,7 +28,7 @@ public class MoneyChecker implements Listener {
|
|||
return;
|
||||
}
|
||||
|
||||
if (ChestShopSign.isAdminShop(event.getSignLine(NAME_LINE))) {
|
||||
if (ChestShopSign.isAdminShop(event.getSignLines())) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
@ -1,15 +1,18 @@
|
|||
package com.Acrobot.ChestShop.Listeners.PreShopCreation;
|
||||
|
||||
import com.Acrobot.ChestShop.ChestShop;
|
||||
import com.Acrobot.ChestShop.Database.Account;
|
||||
import com.Acrobot.ChestShop.Events.AccountQueryEvent;
|
||||
import com.Acrobot.ChestShop.Events.PreShopCreationEvent;
|
||||
import com.Acrobot.ChestShop.Signs.ChestShopSign;
|
||||
import com.Acrobot.ChestShop.UUIDs.NameManager;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.EventPriority;
|
||||
import org.bukkit.event.Listener;
|
||||
|
||||
import java.util.logging.Level;
|
||||
|
||||
import static com.Acrobot.ChestShop.Permission.OTHER_NAME_CREATE;
|
||||
import static com.Acrobot.ChestShop.Signs.ChestShopSign.NAME_LINE;
|
||||
import static com.Acrobot.ChestShop.Events.PreShopCreationEvent.CreationOutcome.UNKNOWN_PLAYER;
|
||||
|
@ -30,7 +33,7 @@ public class NameChecker implements Listener {
|
|||
}
|
||||
|
||||
private static void handleEvent(PreShopCreationEvent event) {
|
||||
String name = event.getSignLine(NAME_LINE);
|
||||
String name = ChestShopSign.getOwner(event.getSignLines());
|
||||
Player player = event.getPlayer();
|
||||
|
||||
Account account = event.getOwnerAccount();
|
||||
|
@ -41,11 +44,23 @@ public class NameChecker implements Listener {
|
|||
account = NameManager.getOrCreateAccount(player);
|
||||
} else {
|
||||
AccountQueryEvent accountQueryEvent = new AccountQueryEvent(name);
|
||||
Bukkit.getPluginManager().callEvent(accountQueryEvent);
|
||||
ChestShop.callEvent(accountQueryEvent);
|
||||
account = accountQueryEvent.getAccount();
|
||||
if (account == null) {
|
||||
Player otherPlayer = ChestShop.getBukkitServer().getPlayer(name);
|
||||
try {
|
||||
if (otherPlayer != null) {
|
||||
account = NameManager.getOrCreateAccount(otherPlayer);
|
||||
} else {
|
||||
account = NameManager.getOrCreateAccount(ChestShop.getBukkitServer().getOfflinePlayer(name));
|
||||
}
|
||||
} catch (IllegalArgumentException e) {
|
||||
event.getPlayer().sendMessage(e.getMessage());
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
ChestShop.getBukkitLogger().log(Level.SEVERE, "Error while trying to check account for name " + name + " with player " + player.getName(), e);
|
||||
}
|
||||
}
|
||||
event.setOwnerAccount(account);
|
||||
|
|
|
@ -4,6 +4,8 @@ import com.Acrobot.Breeze.Utils.PriceUtil;
|
|||
import com.Acrobot.ChestShop.Events.ItemParseEvent;
|
||||
import com.Acrobot.ChestShop.Events.PreShopCreationEvent;
|
||||
import com.Acrobot.ChestShop.Permission;
|
||||
import com.Acrobot.ChestShop.Signs.ChestShopSign;
|
||||
import com.Acrobot.ChestShop.UUIDs.NameManager;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.EventHandler;
|
||||
|
@ -14,8 +16,7 @@ import java.util.Locale;
|
|||
|
||||
import static com.Acrobot.ChestShop.Events.PreShopCreationEvent.CreationOutcome.NO_PERMISSION;
|
||||
import static com.Acrobot.ChestShop.Permission.*;
|
||||
import static com.Acrobot.ChestShop.Signs.ChestShopSign.ITEM_LINE;
|
||||
import static com.Acrobot.ChestShop.Signs.ChestShopSign.PRICE_LINE;
|
||||
import static com.Acrobot.ChestShop.Signs.ChestShopSign.NAME_LINE;
|
||||
import static org.bukkit.event.EventPriority.HIGH;
|
||||
|
||||
/**
|
||||
|
@ -27,8 +28,15 @@ public class PermissionChecker implements Listener {
|
|||
public static void onPreShopCreation(PreShopCreationEvent event) {
|
||||
Player player = event.getPlayer();
|
||||
|
||||
String priceLine = event.getSignLine(PRICE_LINE);
|
||||
String itemLine = event.getSignLine(ITEM_LINE);
|
||||
if (event.getOwnerAccount() != null
|
||||
&& !NameManager.canUseName(player, OTHER_NAME_CREATE, event.getOwnerAccount().getShortName())) {
|
||||
event.setSignLine(NAME_LINE, "");
|
||||
event.setOutcome(NO_PERMISSION);
|
||||
return;
|
||||
}
|
||||
|
||||
String priceLine = ChestShopSign.getPrice(event.getSignLines());
|
||||
String itemLine = ChestShopSign.getItem(event.getSignLines());
|
||||
|
||||
ItemParseEvent parseEvent = new ItemParseEvent(itemLine);
|
||||
Bukkit.getPluginManager().callEvent(parseEvent);
|
||||
|
|
|
@ -3,6 +3,7 @@ package com.Acrobot.ChestShop.Listeners.PreShopCreation;
|
|||
import com.Acrobot.Breeze.Utils.PriceUtil;
|
||||
import com.Acrobot.ChestShop.Configuration.Properties;
|
||||
import com.Acrobot.ChestShop.Events.PreShopCreationEvent;
|
||||
import com.Acrobot.ChestShop.Signs.ChestShopSign;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.EventPriority;
|
||||
import org.bukkit.event.Listener;
|
||||
|
@ -20,7 +21,7 @@ public class PriceChecker implements Listener {
|
|||
|
||||
@EventHandler(priority = EventPriority.LOWEST)
|
||||
public static void onPreShopCreation(PreShopCreationEvent event) {
|
||||
String line = event.getSignLine(PRICE_LINE).toUpperCase(Locale.ROOT);
|
||||
String line = ChestShopSign.getPrice(event.getSignLines()).toUpperCase(Locale.ROOT);
|
||||
if (Properties.PRICE_PRECISION <= 0) {
|
||||
line = line.replaceAll("\\.\\d*", ""); //remove too many decimal places
|
||||
} else {
|
||||
|
|
|
@ -2,6 +2,7 @@ package com.Acrobot.ChestShop.Listeners.PreShopCreation;
|
|||
|
||||
import com.Acrobot.Breeze.Utils.PriceUtil;
|
||||
import com.Acrobot.ChestShop.Events.PreShopCreationEvent;
|
||||
import com.Acrobot.ChestShop.Signs.ChestShopSign;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.Listener;
|
||||
|
||||
|
@ -10,7 +11,6 @@ import java.math.BigDecimal;
|
|||
import static com.Acrobot.Breeze.Utils.PriceUtil.hasBuyPrice;
|
||||
import static com.Acrobot.Breeze.Utils.PriceUtil.hasSellPrice;
|
||||
import static com.Acrobot.ChestShop.Events.PreShopCreationEvent.CreationOutcome.SELL_PRICE_HIGHER_THAN_BUY_PRICE;
|
||||
import static com.Acrobot.ChestShop.Signs.ChestShopSign.PRICE_LINE;
|
||||
import static org.bukkit.event.EventPriority.HIGH;
|
||||
|
||||
/**
|
||||
|
@ -20,7 +20,7 @@ public class PriceRatioChecker implements Listener {
|
|||
|
||||
@EventHandler(priority = HIGH)
|
||||
public static void onPreShopCreation(PreShopCreationEvent event) {
|
||||
String priceLine = event.getSignLine(PRICE_LINE);
|
||||
String priceLine = ChestShopSign.getPrice(event.getSignLines());
|
||||
|
||||
if (hasBuyPrice(priceLine) && hasSellPrice(priceLine)) {
|
||||
BigDecimal buyPrice = PriceUtil.getExactBuyPrice(priceLine);
|
||||
|
|
|
@ -2,12 +2,12 @@ package com.Acrobot.ChestShop.Listeners.PreShopCreation;
|
|||
|
||||
import com.Acrobot.ChestShop.Configuration.Properties;
|
||||
import com.Acrobot.ChestShop.Events.PreShopCreationEvent;
|
||||
import com.Acrobot.ChestShop.Signs.ChestShopSign;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.EventPriority;
|
||||
import org.bukkit.event.Listener;
|
||||
|
||||
import static com.Acrobot.ChestShop.Events.PreShopCreationEvent.CreationOutcome.INVALID_QUANTITY;
|
||||
import static com.Acrobot.ChestShop.Signs.ChestShopSign.QUANTITY_LINE;
|
||||
|
||||
/**
|
||||
* @author Acrobot
|
||||
|
@ -18,8 +18,8 @@ public class QuantityChecker implements Listener {
|
|||
public static void onPreShopCreation(PreShopCreationEvent event) {
|
||||
int amount = -1;
|
||||
try {
|
||||
amount = Integer.parseInt(event.getSignLine(QUANTITY_LINE));
|
||||
} catch (NumberFormatException notANumber) {}
|
||||
amount = ChestShopSign.getQuantity(event.getSignLines());
|
||||
} catch (NumberFormatException ignored) {} // not a quantity on the line
|
||||
|
||||
if (amount < 1 || amount > Properties.MAX_SHOP_AMOUNT) {
|
||||
event.setOutcome(INVALID_QUANTITY);
|
||||
|
|
|
@ -3,9 +3,7 @@ package com.Acrobot.ChestShop.Listeners.PreShopCreation;
|
|||
import com.Acrobot.ChestShop.ChestShop;
|
||||
import com.Acrobot.ChestShop.Events.PreShopCreationEvent;
|
||||
import com.Acrobot.ChestShop.Events.Protection.BuildPermissionEvent;
|
||||
import com.Acrobot.ChestShop.Permission;
|
||||
import com.Acrobot.ChestShop.Security;
|
||||
import com.Acrobot.ChestShop.Signs.ChestShopSign;
|
||||
import com.Acrobot.ChestShop.Utils.uBlock;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.block.Container;
|
||||
|
@ -14,8 +12,6 @@ import org.bukkit.event.EventHandler;
|
|||
import org.bukkit.event.Listener;
|
||||
|
||||
import static com.Acrobot.ChestShop.Events.PreShopCreationEvent.CreationOutcome.NO_PERMISSION_FOR_TERRAIN;
|
||||
import static com.Acrobot.ChestShop.Permission.ADMIN;
|
||||
import static com.Acrobot.ChestShop.Signs.ChestShopSign.NAME_LINE;
|
||||
|
||||
/**
|
||||
* @author Acrobot
|
||||
|
@ -24,18 +20,8 @@ public class TerrainChecker implements Listener {
|
|||
|
||||
@EventHandler
|
||||
public static void onPreShopCreation(PreShopCreationEvent event) {
|
||||
String nameLine = event.getSignLine(NAME_LINE);
|
||||
|
||||
if (ChestShopSign.isAdminShop(nameLine)) {
|
||||
return;
|
||||
}
|
||||
|
||||
Player player = event.getPlayer();
|
||||
|
||||
if (Permission.has(player, ADMIN)) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!Security.canPlaceSign(player, event.getSign())) {
|
||||
event.setOutcome(NO_PERMISSION_FOR_TERRAIN);
|
||||
return;
|
||||
|
|
|
@ -8,6 +8,7 @@ import com.Acrobot.ChestShop.Configuration.Properties;
|
|||
import com.Acrobot.ChestShop.Database.Account;
|
||||
import com.Acrobot.ChestShop.Economy.Economy;
|
||||
import com.Acrobot.ChestShop.Events.PreTransactionEvent;
|
||||
import com.Acrobot.ChestShop.Utils.ItemUtil;
|
||||
import com.google.common.collect.HashBasedTable;
|
||||
import com.google.common.collect.ImmutableMap;
|
||||
import com.google.common.collect.Table;
|
||||
|
@ -21,8 +22,6 @@ import org.bukkit.event.player.PlayerQuitEvent;
|
|||
import org.bukkit.inventory.ItemStack;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.Map;
|
||||
import java.util.UUID;
|
||||
|
||||
import static com.Acrobot.ChestShop.Configuration.Messages.CLIENT_DEPOSIT_FAILED;
|
||||
|
@ -53,10 +52,10 @@ public class ErrorMessageSender implements Listener {
|
|||
|
||||
switch (event.getTransactionOutcome()) {
|
||||
case SHOP_DOES_NOT_BUY_THIS_ITEM:
|
||||
message = Messages.NO_BUYING_HERE;
|
||||
message = Messages.NO_SELLING_HERE;
|
||||
break;
|
||||
case SHOP_DOES_NOT_SELL_THIS_ITEM:
|
||||
message = Messages.NO_SELLING_HERE;
|
||||
message = Messages.NO_BUYING_HERE;
|
||||
break;
|
||||
case CLIENT_DOES_NOT_HAVE_PERMISSION:
|
||||
message = Messages.NO_PERMISSION;
|
||||
|
@ -114,6 +113,12 @@ public class ErrorMessageSender implements Listener {
|
|||
case INVALID_SHOP:
|
||||
message = Messages.INVALID_SHOP_DETECTED;
|
||||
break;
|
||||
case INVALID_CLIENT_NAME:
|
||||
message = Messages.INVALID_CLIENT_NAME;
|
||||
break;
|
||||
case CREATIVE_MODE_PROTECTION:
|
||||
message = Messages.TRADE_DENIED_CREATIVE_MODE;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
@ -128,7 +133,7 @@ public class ErrorMessageSender implements Listener {
|
|||
if (player != null || Properties.BUNGEECORD_MESSAGES) {
|
||||
|
||||
if (Properties.NOTIFICATION_MESSAGE_COOLDOWN > 0) {
|
||||
String cacheKey = message.getKey() + "|" + String.join(",", replacements) + "|" + MaterialUtil.getItemList(stock);
|
||||
String cacheKey = message.getKey() + "|" + String.join(",", replacements) + "|" + ItemUtil.getItemList(stock);
|
||||
Long last = notificationCooldowns.get(ownerAccount.getUuid(), cacheKey);
|
||||
if (last != null && last + Properties.NOTIFICATION_MESSAGE_COOLDOWN * 1000 > System.currentTimeMillis()) {
|
||||
return;
|
||||
|
@ -140,11 +145,11 @@ public class ErrorMessageSender implements Listener {
|
|||
if (Properties.SHOWITEM_MESSAGE && MaterialUtil.Show.sendMessage(player, message, stock, Collections.emptyMap(), replacements)) {
|
||||
return;
|
||||
}
|
||||
String items = MaterialUtil.getItemList(stock);
|
||||
String items = ItemUtil.getItemList(stock);
|
||||
message.sendWithPrefix(player,
|
||||
ImmutableMap.of("material", items, "item", items), replacements);
|
||||
} else {
|
||||
String items = MaterialUtil.getItemList(stock);
|
||||
String items = ItemUtil.getItemList(stock);
|
||||
ChestShop.sendBungeeMessage(ownerAccount.getName(), message,
|
||||
ImmutableMap.of("material", items, "item", items), replacements);
|
||||
}
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue