Compare commits

...
109 Commits
Author SHA1 Message Date
Tomut0 2b46b0adae using newer release option for compiler plugin 2023-07-28 00:29:31 +03:00
Tomut0 0f15609401 Merge remote-tracking branch 'Roinuj/maven-wrapper' into maven-wrapper
# Conflicts:
#	mvnw
2023-07-28 00:11:53 +03:00
Tomut0 ffa738afcc Set executable permission for mvnw 2023-07-28 00:10:45 +03:00
Minat0_ 2cecee8f21 ci: ensure running on maven 3.9.3 (#389) 2023-07-27 23:59:35 +03:00
Tomut0 5e7f246de9 ci: ensure running on maven 3.9.3 2023-07-27 23:58:13 +03:00
Minat0_ e97718ec5a ci: Upgrade JDK to 16 at curseforge workflow 2023-07-27 23:14:08 +03:00
Minat0_ 4867eda532 ci: Upgrade JDK to 16 at modrinth workflow 2023-07-27 23:13:22 +03:00
WolfBot 4fa1aeaccc chore(master): release 2.19.1-SNAPSHOT (#387) 2023-07-27 16:55:43 -03:00
WolfBot 1b44edeec5 chore(master): release 2.19.0 (#340) 2023-07-27 16:54:35 -03:00
d21dc02dff feat: EconomyTransactionEvent creation (#384)
Co-authored-by: Anony <contacto@anderhurtado.com>
Co-authored-by: Tomut0 <minat0_@outlook.com>
2023-07-27 16:53:11 -03:00
Minat0_ ad6bb7b13b feat: hide reset kdr in main frame if perm denied (#385) 2023-07-23 20:56:42 +03:00
Minat0_ 8269d80831 fix: resets error message when validating a clan tag (#383) 2023-06-23 19:44:32 +03:00
Minat0_ 57b9987e9b fix: tnt explosion doesn't count a kill (#381) 2023-06-20 00:02:47 +03:00
ThiagoROX f8ce0f415f feat: add %simpleclans_has_rank% placeholder (#379) 2023-06-20 00:01:04 +03:00
3ef3169942 feat: validating tag by regex (#363)
* Special Characters

* Changed default value from True to False

* Apparently useless in the PR

* Changed cleanTag.toLowerCase() to cleanTag
replaced string cleanTag = ChatUtils.stripColors(this.tag) with string cleanTag = Helper.cleanTag(tag);

* added simpleclans.iml back to fix any errors

* Added SimpleClans.iml to .gitignore; correct me if i'm wrong, but I believe this is for the better.

* Added 'SimpleClans.iml' to .gitignore :)

~ Side note: Shoot me a message if this should be undone.

* Added original SimpleClans.iml

I have no idea what went wrong last time.

* fix: bb migration settings save

* feat: tag regex implement

* refactor tag length set

* delete auto-generated files from git

* optimize imports

* speed up tag validation process by creating one TagValidator per plugin reload

rollback accept-other-alphabets-letters-on-tag

* we don't need to save config twice on bb migration

* don't create new instance of tagValidator on plugin reload

* fix even if regex matches it checks the alphabet

---------

Co-authored-by: BuildTools <unconfigured@null.spigotmc.org>
Co-authored-by: Tomut0 <minat0_@outlook.com>
2023-06-17 18:52:55 +03:00
Minat0_ 5cf64a672d feat: add a command to set player's locale (#378) 2023-06-17 00:28:22 +03:00
Minat0_ c49b2d9dc2 Merge pull request #375 from Tomut0/dev 2023-05-12 17:53:59 +03:00
Tomut0 8801e8e855 build: add surface plugin, upgrade tests to JUnit 5 2023-05-12 17:41:07 +03:00
Tomut0 bc4775c293 build: upgrade javadoc plugin, suppress warnings on build 2023-05-12 17:40:32 +03:00
Tomut0 74e39c2666 I don't think we need META-INF file anymore
It's a maven task to create it, I believe
2023-05-12 17:40:32 +03:00
Tomut0 f73e798e65 ci: upload artifact with jdk 16 2023-05-12 17:40:32 +03:00
Tomut0 f101ea4768 build: delete dependency-reduced-pom.xml from git 2023-05-12 17:40:32 +03:00
Tomut0 f5d547ab27 docs: author tag isn't available at methods 2023-05-12 17:40:31 +03:00
Minat0_ 7fcb964f41 fix: prevent clan name renaming with colors (#374) 2023-05-12 16:15:08 +03:00
ThiagoROX d4f1a74dee feat: add confirmation before reset kdr (#371) 2023-05-10 21:03:29 +03:00
Edson Passos 3e192a70da build: update junit 2023-05-09 19:55:18 -03:00
Edson Passos 103f1e56c7 ci: update Reposilite workflow 2023-05-07 18:06:14 -03:00
Edson Passos 103b4055f3 ci: update CI workflow 2023-05-07 17:52:28 -03:00
RoinujNosde c91442cd1e Merge remote-tracking branch 'origin/master' 2023-05-07 17:47:49 -03:00
RoinujNosde e368ead04a fix: bump JDK to 16 2023-05-07 17:47:23 -03:00
ThiagoROX d68ec28f8e feat: add PlayerResetKdrEvent (#370) 2023-05-03 12:16:22 +03:00
RoinujNosde 2f4ad00f1c fix: migrates land permissions on GP claim resize 2023-04-30 18:40:23 -03:00
RoinujNosde 524e407620 fix: NPE on EntityDamageByEntityEvent listener (LandProtection) 2023-04-30 18:14:21 -03:00
ThiagoROX 992166de66 ci: update checkout and setup-java actions (#369) 2023-04-28 00:18:07 +03:00
ThiagoROX 0b74355467 fix: display hex message on bulletin board (#365) 2023-04-26 20:30:53 +03:00
ThiagoROX 105a8cad51 feat: add subcommand /clan mod bb display (#367) 2023-04-26 19:26:15 +03:00
Minat0_ 0f693329ca feat: adds the possibility to rename a clan (#360) 2023-03-26 18:45:29 -03:00
Minat0_ 263d129325 feat: bb message language key (#358) 2023-03-21 22:37:24 -03:00
ThiagoROX 442096e9da fix: added clan suggestion in staff bb commands (#359) 2023-03-19 21:32:59 -03:00
Minat0_ 36084dbfa3 perf(discord): remove discord channels from creation (#353) 2023-02-13 08:53:31 -03:00
RoinujNosde 8a05dbbf00 fix: possibly fixes CME on SpyChatHandler 2023-01-31 18:47:08 -03:00
Minat0_ 8a3529377f fix(discord): permission overrides reset only existing members (#349) 2023-01-28 21:26:28 -03:00
Minat0_ 5f519c477a fix: remove abandoned channels before validating (#348) 2023-01-27 23:30:32 -03:00
Minat0_ 7eb748bb9a fix: async permission reset & category deletion (#347) 2023-01-27 20:46:12 -03:00
Minat0_ 18507016a8 fix: view permission applies only to cached channels (#346) 2023-01-20 16:53:02 -03:00
Edson Passos ed243f72ec fix(bungee): updates kills count immediately 2023-01-08 20:42:29 -03:00
RoinujNosde 5021b8ad7b fix: players not able to strip logs/fertilize blocks 2023-01-03 19:37:17 -03:00
Edson Passos f98868c776 fix: invalid colors being used in tags, pt. 2
* Added test for another invalid variant
* Updated patterns
2023-01-03 16:29:48 -03:00
RoinujNosde 2850e59d37 fix: invalid colors being used in tags 2023-01-02 19:35:42 -03:00
RoinujNosde 86d4fac938 fix: players not able to break vehicles/exit horses 2022-12-28 20:12:00 -03:00
Edson Passos 0258a75c81 fix(bungee): removes players from clan on delete 2022-12-27 09:56:34 -03:00
RoinujNosde 61dcb3d440 fix: players unable to interact with armor stands, paintings, etc 2022-12-24 17:26:50 -03:00
RoinujNosde bf1033af76 fix: default username-regex 2022-12-23 20:28:04 -03:00
RoinujNosde 807d39afeb fix: players not able to use water buckets (WorldGuard) 2022-12-23 20:27:37 -03:00
RoinujNosde bc046d4b2a refactor: code cleanup on LandProtection 2022-12-22 22:20:18 -03:00
RoinujNosde 545dd1652f Merge remote-tracking branch 'origin/master' 2022-12-21 21:29:57 -03:00
RoinujNosde e9ec283ace fix: players not able to sleep on beds (WorldGuard) 2022-12-21 21:29:19 -03:00
Minat0_ 718868b2d9 docs: updated version in README (#343) 2022-12-08 08:41:10 -03:00
Edson Passos 2a139aba03 feat(chat): adds permissions to use colors and formats (#341) 2022-12-04 13:06:15 -03:00
RoinujNosde 046aa1d96d fix: sets duplicate names to something unique 2022-11-30 20:01:40 -03:00
WolfBot e44775e994 chore(master): release 2.18.2-SNAPSHOT (#339) 2022-11-29 19:54:00 -03:00
WolfBot 43da5bd1f1 chore(master): release 2.18.1 (#335) 2022-11-29 19:53:16 -03:00
Minat0_ 8fa465da38 fix: missing getHandlerList on HomeRegroupEvent (#338) 2022-11-29 14:48:31 -03:00
RoinujNosde 56c7908c33 fix(bungee): error deserializing clan banners 2022-11-23 20:14:14 -03:00
RoinujNosde fc81e76521 fix: added check for clan_member on land commands 2022-11-18 19:21:01 -03:00
RoinujNosde f7fe5c4ad4 refactor: ignore unknown subchannels 2022-11-08 20:19:57 -03:00
RoinujNosde 8f4f763c37 refactor: added debug messages to BungeeManager 2022-11-04 23:15:09 -03:00
RoinujNosde 7a37382264 fix: default ranks were getting re-added on config load 2022-11-03 20:37:29 -03:00
RoinujNosde 7f9d133051 fix: channel auto creation setting not respected on join/link 2022-11-02 14:55:00 -03:00
RoinujNosde 26ba9f7329 fix: attempt at fixing NPE on getAllClanPlayers 2022-11-01 21:43:31 -03:00
Minat0_ d8cb61b0fc fix: money was not given back when channel creation failed (#336) 2022-10-31 18:39:26 -03:00
Minat0_ 3f1b06dcf9 fix: wrong path of discord economy section (#334) 2022-10-31 17:14:10 -03:00
WolfBot b043eb0742 chore(master): release 2.18.1-SNAPSHOT (#331) 2022-10-14 18:15:11 -03:00
github-actions[bot]andWolfBot 7691a4b719 chore(master): release 2.18.0 (#318)
Co-authored-by: WolfBot <112733600+bot-wolf@users.noreply.github.com>
2022-10-14 18:13:47 -03:00
Edson Passos 87ece22036 feat(lang): new crowdin updates (#319) 2022-10-14 18:10:47 -03:00
RoinujNosde f7e7ec6624 fix: removes duplicate /clan from help 2022-10-03 19:59:02 -03:00
RoinujNosde 25197cdd72 feat: add help-size config 2022-09-30 18:43:00 -03:00
Edson Passos 30a501c063 fix: ConfigurationSerializableAdapter NPE 2022-09-27 10:22:47 -03:00
RoinujNosde f14c425488 fix: NPE while purging data 2022-09-24 19:43:14 -03:00
Edson Passos cc2e32984d ci: added modrinth action 2022-09-20 20:07:56 -03:00
Edson Passos 2c9b0f98fe feat: Improves Bungee support (#327) 2022-09-17 11:22:11 -03:00
Edson Passos f484bc16c6 fix: set useSSL to false 2022-08-30 08:30:42 -03:00
RoinujNosde 37f0ecff50 fix: supports '.' and '*' as username prefix by default 2022-08-28 12:33:01 -03:00
Minat0_ c8969f2196 chore: update dependency version at README.md (#329) 2022-08-28 12:03:20 -03:00
Edson Passos b9c3cfd640 ci: adds name to job 2022-08-24 22:02:56 -03:00
RoinujNosde a440834347 feat: adds starter-ranks
A list of ranks, defined in the config, which are added to new clans
2022-08-16 19:09:10 -03:00
RoinujNosde 1adec0b89d fix: changes size of some frames for better visualization on Bedrock 2022-08-15 20:27:53 -03:00
RoinujNosde d56a0a979a feat: adds permission to bypass the teleport delay
Node: simpleclans.vip.teleport-delay
2022-08-15 20:18:53 -03:00
RoinujNosde af07988103 fix: getPastClans() preserves the insertion order 2022-08-15 19:37:17 -03:00
Edson Passos 96a13d8d6c fix: updates join date when joining a clan (#326) 2022-08-15 11:33:14 -03:00
Edson Passos 2a1ad5b5c8 fix: removes rank and join date on disband 2022-08-15 10:28:50 -03:00
RoinujNosde 1311423a17 refactor: changed members list to <ClanPlayer> 2022-08-01 19:38:50 -03:00
RoinujNosde 59e9c4caed refactor: changed clanPlayers map to <UUID, ClanPlayer> 2022-08-01 19:17:00 -03:00
RoinujNosde 4ab53d1613 perf: improved UUID lookup performance 2022-07-11 22:55:13 -03:00
RoinujNosde 2ea744443f feat: added method for registering protection providers 2022-06-27 18:58:05 -03:00
Edson Passos 8bd8bb6466 ci: disable fork on release-please 2022-06-24 19:29:58 -03:00
Minat0_ e7f756f306 fix: NPE while sending a message to spies (#322) 2022-06-24 19:27:34 -03:00
Edson Passos b7961acd5c ci: use fork on release-please 2022-06-12 15:12:43 -03:00
RoinujNosde c47289c5bf fix: NPE while collecting fees
ClanPlayer#toPlayer() returns null when the player is not connected
2022-06-12 15:10:32 -03:00
Edson Passos 7769060f4d ci: updated release-please token
This fixes actions listening to "release" not running
2022-06-10 19:35:52 -03:00
RoinujNosde a859928622 fix: NoClassDefFoundError in WorldGuard6Provider 2022-06-09 23:38:55 -03:00
RoinujNosde becb88b763 feat: adds PlayerHomeClearEvent
and fires PlayerHomeSetEvent when the mod command is used
2022-06-09 14:15:14 -03:00
RoinujNosde 711f81f3da ci: update java version
here we go again
2022-06-08 21:41:15 -03:00
RoinujNosde 7fae6f8b8a ci: added missing required input 2022-06-08 21:36:57 -03:00
RoinujNosde 62a8d304f4 ci: adds snapshots repository and udpated setup-jdk 2022-06-08 21:32:22 -03:00
Edson Passos fe8668abb0 Merge pull request #317 from RoinujNosde/release-please--branches--master
chore(master): release 2.17.1-SNAPSHOT
2022-06-08 21:04:55 -03:00
github-actions[bot] 36f5739f06 chore(master): release 2.17.1-SNAPSHOT 2022-06-09 00:01:26 +00:00
RoinujNosde f7465941b2 ci: updated crowdin.yml and publish actions 2022-06-08 21:00:08 -03:00
Edson Passos 2aa5b9aad3 bump version... 2022-06-08 20:20:55 -03:00
153 changed files with 4656 additions and 2329 deletions

No files matched your search

+9 -10
View File
@@ -5,9 +5,9 @@ name: CI
on:
push:
branches: [ dev ]
branches: [ master ]
pull_request:
branches: [ dev ]
branches: [ master ]
jobs:
build:
@@ -15,24 +15,23 @@ jobs:
fail-fast: true
max-parallel: 4
matrix:
java-version: [ 8, 11, 16, 17 ]
java-version: [ 16, 17 ]
runs-on: ubuntu-latest
name: Java ${{ matrix.java-version }}
steps:
- name: Checkout
uses: actions/checkout@v2
uses: actions/checkout@v3
- name: "Set up JDK ${{ matrix.java-version }}"
uses: actions/setup-java@v2
uses: actions/setup-java@v3
with:
java-version: "${{ matrix.java-version }}"
distribution: 'adopt'
cache: 'maven'
- name: Build with Maven
run: mvn -B -U package --file pom.xml
run: ./mvnw -B -U package --file pom.xml
- name: Upload Build Artifact
if: "${{ matrix.java-version == 8 }}"
uses: actions/upload-artifact@v2
if: "${{ matrix.java-version == 16 }}"
uses: actions/upload-artifact@v3
with:
name: SimpleClans
path: target/SimpleClans.jar
+9 -8
View File
@@ -4,17 +4,18 @@ on:
types: [created]
jobs:
build:
publish:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Set up JDK 1.8
uses: actions/setup-java@v1
- uses: actions/checkout@v3
- name: Set up JDK 16
uses: actions/setup-java@v3
with:
java-version: 1.8
java-version: 16
cache: 'maven'
distribution: 'adopt'
- name: Build with Maven
run: mvn -B package --file pom.xml
run: ./mvnw -B package --file pom.xml
- name: Upload artifact
uses: itsmeow/curseforge-upload@v3
with:
@@ -23,7 +24,7 @@ jobs:
game_endpoint: minecraft
file_path: target/SimpleClans.jar
changelog: ${{ github.event.release.body }}
changelog_type: html
changelog_type: markdown
display_name: ${{ github.event.release.tag_name }}
game_versions: 8849,8503,7915,7667,7330,7105,6588,630,591,585,531
release_type: release
+31
View File
@@ -0,0 +1,31 @@
name: Publish to Modrinth
on:
release:
types: [created]
jobs:
publish:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Set up JDK 16
uses: actions/setup-java@v3
with:
java-version: 16
cache: 'maven'
distribution: 'adopt'
- name: Build with Maven
run: ./mvnw -B package --file pom.xml
- name: Upload artifact
uses: RubixDev/modrinth-upload@v1.0.0
with:
token: ${{ secrets.MODRINTH_TOKEN }}
project_id: quLDfyDl
file_path: target/SimpleClans.jar
changelog: ${{ github.event.release.body }}
name: ${{ github.event.release.tag_name }}
version: ${{ github.event.release.tag_name }}
game_versions: 1.19,1.18,1.17,1.16,1.15,1.14,1.13,1.12,1.11,1.10,1.9,1.8
release_type: release
loaders: spigot
featured: true
+12 -12
View File
@@ -1,29 +1,29 @@
name: Publish to Reposilite
on:
release:
types: [created]
push:
branches:
- master
workflow_dispatch:
jobs:
build:
publish:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Set up JDK 1.8
uses: actions/setup-java@v1
- uses: actions/checkout@v3
- name: Set up JDK 16
uses: actions/setup-java@v3
with:
java-version: 1.8
java-version: 16
server-id: reposilite # Value of the distributionManagement/repository/id field of the pom.xml
server-username: MAVEN_USERNAME
server-password: MAVEN_PASSWORD
cache: 'maven'
distribution: 'adopt'
- name: Build with Maven
run: mvn -B package --file pom.xml
run: ./mvnw -B package --file pom.xml
- name: Publish to Reposilite
run: mvn -B deploy
run: ./mvnw -B deploy
env:
MAVEN_USERNAME: simpleclans
MAVEN_PASSWORD: ${{ secrets.REPOSILITE_TOKEN }}
+15
View File
@@ -0,0 +1,15 @@
on:
push:
branches:
- master
name: release-please
jobs:
release-please:
runs-on: ubuntu-latest
steps:
- uses: google-github-actions/release-please-action@v3
with:
release-type: maven
package-name: SimpleClans
token: ${{ secrets.PAT_TOKEN }}
fork: false
+2 -1
View File
@@ -3,7 +3,8 @@
/bin/
/.classpath
/.project
/dependency-reduced-pom.xml
*.jar
.settings
.factorypath
SimpleClans.iml
dependency-reduced-pom.xml
+18
View File
@@ -0,0 +1,18 @@
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.3/apache-maven-3.9.3-bin.zip
wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar
+105
View File
@@ -0,0 +1,105 @@
# Changelog
## [2.19.0](https://github.com/RoinujNosde/SimpleClans/compare/v2.18.1...v2.19.0) (2023-07-27)
### Features
* add %simpleclans_has_rank% placeholder ([#379](https://github.com/RoinujNosde/SimpleClans/issues/379)) ([f8ce0f4](https://github.com/RoinujNosde/SimpleClans/commit/f8ce0f415f17748f8b4382e028dd1f5f93cae06a))
* add a command to set player's locale ([#378](https://github.com/RoinujNosde/SimpleClans/issues/378)) ([5cf64a6](https://github.com/RoinujNosde/SimpleClans/commit/5cf64a672d0a25a62d3abd6720082bb3b4cf056f))
* add confirmation before reset kdr ([#371](https://github.com/RoinujNosde/SimpleClans/issues/371)) ([d4f1a74](https://github.com/RoinujNosde/SimpleClans/commit/d4f1a74dee9cdeeb458ff6975715a817bfe30fa1))
* add PlayerResetKdrEvent ([#370](https://github.com/RoinujNosde/SimpleClans/issues/370)) ([d68ec28](https://github.com/RoinujNosde/SimpleClans/commit/d68ec28f8e14926cbe9d13c09a61735e5304a97d))
* add subcommand /clan mod bb display ([#367](https://github.com/RoinujNosde/SimpleClans/issues/367)) ([105a8ca](https://github.com/RoinujNosde/SimpleClans/commit/105a8cad51b12bf6f487cf6c2b81eb85d966a3cc))
* adds the possibility to rename a clan ([#360](https://github.com/RoinujNosde/SimpleClans/issues/360)) ([0f69332](https://github.com/RoinujNosde/SimpleClans/commit/0f693329cae81036bfe1423344ed41cf3d535f64))
* bb message language key ([#358](https://github.com/RoinujNosde/SimpleClans/issues/358)) ([263d129](https://github.com/RoinujNosde/SimpleClans/commit/263d129325888fb1303dda549986ab43ca93ed13))
* **chat:** adds permissions to use colors and formats ([#341](https://github.com/RoinujNosde/SimpleClans/issues/341)) ([2a139ab](https://github.com/RoinujNosde/SimpleClans/commit/2a139aba03be174086dfb3603007312d0c7a6c33))
* EconomyTransactionEvent creation ([#384](https://github.com/RoinujNosde/SimpleClans/issues/384)) ([d21dc02](https://github.com/RoinujNosde/SimpleClans/commit/d21dc02dff45f4f20a40303cd26215a71de7dddb))
* hide reset kdr in main frame if perm denied ([#385](https://github.com/RoinujNosde/SimpleClans/issues/385)) ([ad6bb7b](https://github.com/RoinujNosde/SimpleClans/commit/ad6bb7b13b347be71789fbfb4b8a82f6c5481c96))
* validating tag by regex ([#363](https://github.com/RoinujNosde/SimpleClans/issues/363)) ([3ef3169](https://github.com/RoinujNosde/SimpleClans/commit/3ef3169942f897280af15040f1243d955df001ab))
### Bug Fixes
* added clan suggestion in staff bb commands ([#359](https://github.com/RoinujNosde/SimpleClans/issues/359)) ([442096e](https://github.com/RoinujNosde/SimpleClans/commit/442096e9da98410682c2cd09e0e930454fe0364f))
* async permission reset & category deletion ([#347](https://github.com/RoinujNosde/SimpleClans/issues/347)) ([7eb748b](https://github.com/RoinujNosde/SimpleClans/commit/7eb748bb9a31a826f53fd7ac6b1eeac64e330467))
* bump JDK to 16 ([e368ead](https://github.com/RoinujNosde/SimpleClans/commit/e368ead04aa2735f5525d88d5dcb63b78286f80e))
* **bungee:** removes players from clan on delete ([0258a75](https://github.com/RoinujNosde/SimpleClans/commit/0258a75c819f12e5dbbaf383a572682717f34c59))
* **bungee:** updates kills count immediately ([ed243f7](https://github.com/RoinujNosde/SimpleClans/commit/ed243f72ecc58a3af11d053d73b315bce9e20e94))
* default username-regex ([bf1033a](https://github.com/RoinujNosde/SimpleClans/commit/bf1033af769bacbca9a790d2184ec77eeb519485))
* **discord:** permission overrides reset only existing members ([#349](https://github.com/RoinujNosde/SimpleClans/issues/349)) ([8a35293](https://github.com/RoinujNosde/SimpleClans/commit/8a3529377f5b4a482b530e474e4921b311197a04))
* display hex message on bulletin board ([#365](https://github.com/RoinujNosde/SimpleClans/issues/365)) ([0b74355](https://github.com/RoinujNosde/SimpleClans/commit/0b74355467625a4901944c72feb84d8de91a4283))
* invalid colors being used in tags ([2850e59](https://github.com/RoinujNosde/SimpleClans/commit/2850e59d370da34c643de198de85d91744610467))
* invalid colors being used in tags, pt. 2 ([f98868c](https://github.com/RoinujNosde/SimpleClans/commit/f98868c776a2e275dc7c1647748a0231e935f43e))
* migrates land permissions on GP claim resize ([2f4ad00](https://github.com/RoinujNosde/SimpleClans/commit/2f4ad00f1c72ee7e3948267965c3a075ec4ef728))
* NPE on EntityDamageByEntityEvent listener (LandProtection) ([524e407](https://github.com/RoinujNosde/SimpleClans/commit/524e40762011dd500a407286b72b51acf6c357f3))
* players not able to break vehicles/exit horses ([86d4fac](https://github.com/RoinujNosde/SimpleClans/commit/86d4fac938e353f94c288c39b884027027972bba))
* players not able to sleep on beds (WorldGuard) ([e9ec283](https://github.com/RoinujNosde/SimpleClans/commit/e9ec283ace55af10abdeb6f937d31d4c2dc198dc))
* players not able to strip logs/fertilize blocks ([5021b8a](https://github.com/RoinujNosde/SimpleClans/commit/5021b8ad7b5633769bd87af96a0226a53a8b24b4))
* players not able to use water buckets (WorldGuard) ([807d39a](https://github.com/RoinujNosde/SimpleClans/commit/807d39afeb51d99a96fb793099393b44e2c43b04))
* players unable to interact with armor stands, paintings, etc ([61dcb3d](https://github.com/RoinujNosde/SimpleClans/commit/61dcb3d440e2eedfb717afcc69687194311a8973))
* possibly fixes CME on SpyChatHandler ([8a05dbb](https://github.com/RoinujNosde/SimpleClans/commit/8a05dbbf00df97afa7df71a500e2626aaa46ed37))
* prevent clan name renaming with colors ([#374](https://github.com/RoinujNosde/SimpleClans/issues/374)) ([7fcb964](https://github.com/RoinujNosde/SimpleClans/commit/7fcb964f41118e7d8746e87d5770cc329730834c))
* remove abandoned channels before validating ([#348](https://github.com/RoinujNosde/SimpleClans/issues/348)) ([5f519c4](https://github.com/RoinujNosde/SimpleClans/commit/5f519c477af3e759596017010d51ddd06e26157e))
* resets error message when validating a clan tag ([#383](https://github.com/RoinujNosde/SimpleClans/issues/383)) ([8269d80](https://github.com/RoinujNosde/SimpleClans/commit/8269d80831533e517ed2ebd94bec18021de7b0e3))
* sets duplicate names to something unique ([046aa1d](https://github.com/RoinujNosde/SimpleClans/commit/046aa1d96d58e21496a3361c7d072f3943595304))
* tnt explosion doesn't count a kill ([#381](https://github.com/RoinujNosde/SimpleClans/issues/381)) ([57b9987](https://github.com/RoinujNosde/SimpleClans/commit/57b9987e9b9dade59c52c88dbfd3b12fdf5eee94))
* view permission applies only to cached channels ([#346](https://github.com/RoinujNosde/SimpleClans/issues/346)) ([1850701](https://github.com/RoinujNosde/SimpleClans/commit/18507016a843c28efc6d8109f2bb5a5106531f47))
### Performance Improvements
* **discord:** remove discord channels from creation ([#353](https://github.com/RoinujNosde/SimpleClans/issues/353)) ([36084db](https://github.com/RoinujNosde/SimpleClans/commit/36084dbfa3e73aedccb156e49af5062e40639927))
### Documentation
* author tag isn't available at methods ([f5d547a](https://github.com/RoinujNosde/SimpleClans/commit/f5d547ab27fac7cfe1abd9c819e4f1bb3dd7c624))
* updated version in README ([#343](https://github.com/RoinujNosde/SimpleClans/issues/343)) ([718868b](https://github.com/RoinujNosde/SimpleClans/commit/718868b2d9eea2aeb6fcfd734e85d16a2cefaa36))
## [2.18.1](https://github.com/RoinujNosde/SimpleClans/compare/v2.18.0...v2.18.1) (2022-11-29)
### Bug Fixes
* added check for clan_member on land commands ([fc81e76](https://github.com/RoinujNosde/SimpleClans/commit/fc81e765211bebe22a7a6aa5d5158754580bbdc5))
* attempt at fixing NPE on getAllClanPlayers ([26ba9f7](https://github.com/RoinujNosde/SimpleClans/commit/26ba9f73296a772eaa698d2ede6fbc3831da850c))
* **bungee:** error deserializing clan banners ([56c7908](https://github.com/RoinujNosde/SimpleClans/commit/56c7908c332167cec9cca6a4ea054977d0d68b9f))
* channel auto creation setting not respected on join/link ([7f9d133](https://github.com/RoinujNosde/SimpleClans/commit/7f9d133051b9011837d0a5114abc6c3637a3f02c))
* default ranks were getting re-added on config load ([7a37382](https://github.com/RoinujNosde/SimpleClans/commit/7a37382264ff4dd5456f6930045b5102bf491897))
* missing getHandlerList on HomeRegroupEvent ([#338](https://github.com/RoinujNosde/SimpleClans/issues/338)) ([8fa465d](https://github.com/RoinujNosde/SimpleClans/commit/8fa465da385f36b1fb075031c375ef94df78ea52))
* money was not given back when channel creation failed ([#336](https://github.com/RoinujNosde/SimpleClans/issues/336)) ([d8cb61b](https://github.com/RoinujNosde/SimpleClans/commit/d8cb61b0fc9584bb58f421faf98596816621053f))
* wrong path of discord economy section ([#334](https://github.com/RoinujNosde/SimpleClans/issues/334)) ([3f1b06d](https://github.com/RoinujNosde/SimpleClans/commit/3f1b06dcf996e51a878b7fc281069e236ebcbfce))
## [2.18.0](https://github.com/RoinujNosde/SimpleClans/compare/v2.17.0...v2.18.0) (2022-10-14)
### Features
* add help-size config ([25197cd](https://github.com/RoinujNosde/SimpleClans/commit/25197cdd729cea63d7e223dc1e0aaef830613327))
* added method for registering protection providers ([2ea7444](https://github.com/RoinujNosde/SimpleClans/commit/2ea744443f502970b15859818e9d5e45ca69d453))
* adds permission to bypass the teleport delay ([d56a0a9](https://github.com/RoinujNosde/SimpleClans/commit/d56a0a979a47a140115742518e934a2469e6f880))
* adds PlayerHomeClearEvent ([becb88b](https://github.com/RoinujNosde/SimpleClans/commit/becb88b763380bed5a2e1dd209c32c8363a7f88b))
* adds starter-ranks ([a440834](https://github.com/RoinujNosde/SimpleClans/commit/a4408343479d7efa6ae5a65894f8b822ecd47ebb))
* Improves Bungee support ([#327](https://github.com/RoinujNosde/SimpleClans/issues/327)) ([2c9b0f9](https://github.com/RoinujNosde/SimpleClans/commit/2c9b0f98fe3942ea74190c1a81d61be2c8647db8))
* **lang:** new crowdin updates ([#319](https://github.com/RoinujNosde/SimpleClans/issues/319)) ([87ece22](https://github.com/RoinujNosde/SimpleClans/commit/87ece22036fb674c8c362b6a1b86fe884543e6ad))
### Bug Fixes
* changes size of some frames for better visualization on Bedrock ([1adec0b](https://github.com/RoinujNosde/SimpleClans/commit/1adec0b89d676767cdb94dcdf91ba37a231eb4a8))
* ConfigurationSerializableAdapter NPE ([30a501c](https://github.com/RoinujNosde/SimpleClans/commit/30a501c063aa9dbcf596df83adc2b15baf0e4bb9))
* getPastClans() preserves the insertion order ([af07988](https://github.com/RoinujNosde/SimpleClans/commit/af079881030bd299b9bae1ebf0cc62353af7e6fc))
* NoClassDefFoundError in WorldGuard6Provider ([a859928](https://github.com/RoinujNosde/SimpleClans/commit/a8599286225ba603ea124b8b52510245b94ffd24))
* NPE while collecting fees ([c47289c](https://github.com/RoinujNosde/SimpleClans/commit/c47289c5bf8113a9d6a8e1ee74a5afb0358647b6))
* NPE while purging data ([f14c425](https://github.com/RoinujNosde/SimpleClans/commit/f14c42548846feef01b484acbb5f02bcbcabd8db))
* NPE while sending a message to spies ([#322](https://github.com/RoinujNosde/SimpleClans/issues/322)) ([e7f756f](https://github.com/RoinujNosde/SimpleClans/commit/e7f756f3063c646e21415e08eea73f123d2818a0))
* removes duplicate /clan from help ([f7e7ec6](https://github.com/RoinujNosde/SimpleClans/commit/f7e7ec66243359e26d3c456a9740a53753951c48))
* removes rank and join date on disband ([2a1ad5b](https://github.com/RoinujNosde/SimpleClans/commit/2a1ad5b5c8d2937a8ee6dd6f7f43d85c86f08307))
* set useSSL to false ([f484bc1](https://github.com/RoinujNosde/SimpleClans/commit/f484bc16c6176ccd13e05aae2169400e7bcf5d62))
* supports '.' and '*' as username prefix by default ([37f0ecf](https://github.com/RoinujNosde/SimpleClans/commit/37f0ecff506d06f3047e3598848117a14c2b7ead))
* updates join date when joining a clan ([#326](https://github.com/RoinujNosde/SimpleClans/issues/326)) ([96a13d8](https://github.com/RoinujNosde/SimpleClans/commit/96a13d8d6cc18c91d4dee20dd632cd5d65db5213))
### Performance Improvements
* improved UUID lookup performance ([4ab53d1](https://github.com/RoinujNosde/SimpleClans/commit/4ab53d16135ecf5a4067b1a63d058da392dc5313))
+3 -2
View File
@@ -60,7 +60,7 @@ Including SimpleClans with Maven:
<dependency>
<groupId>net.sacredlabyrinth.phaed.simpleclans</groupId>
<artifactId>SimpleClans</artifactId>
<version>2.16.2</version> <!-- You can find the latest version at the bottom -->
<version>2.18.1</version> <!-- You can find the latest version at the bottom -->
<scope>provided</scope>
</dependency>
</dependencies>
@@ -74,10 +74,11 @@ repositories {
}
}
dependencies {
compileOnly "net.sacredlabyrinth.phaed.simpleclans:SimpleClans:2.16.2"
compileOnly "net.sacredlabyrinth.phaed.simpleclans:SimpleClans:2.18.1"
}
```
Feel free to learn our [Javadoc](https://ci.roinujnosde.me/job/SimpleClans/Javadoc/).
##### Latest version:
[![Maven metadata URL](https://img.shields.io/maven-metadata/v?metadataUrl=https%3A%2F%2Frepo.roinujnosde.me%2Freleases%2Fnet%2Fsacredlabyrinth%2Fphaed%2Fsimpleclans%2FSimpleClans%2Fmaven-metadata.xml)](https://repo.roinujnosde.me/#/releases/net/sacredlabyrinth/phaed/simpleclans/SimpleClans)
##### API Examples
-145
View File
@@ -1,145 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
<component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_8">
<output url="file://$MODULE_DIR$/target/classes" />
<output-test url="file://$MODULE_DIR$/target/test-classes" />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" />
<excludeFolder url="file://$MODULE_DIR$/target" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.spigotmc:spigot-api:1.16.4-R0.1-SNAPSHOT" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: commons-lang:commons-lang:2.6" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: com.google.guava:guava:21.0" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: com.google.code.gson:gson:2.8.0" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: net.md-5:bungeecord-chat:1.16-R0.3" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.yaml:snakeyaml:1.26" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: com.github.MilkBowl:VaultAPI:1.7" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.bukkit:bukkit:1.13.1-R0.1-SNAPSHOT" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: com.googlecode.json-simple:json-simple:1.1.1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: junit:junit:4.10" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.hamcrest:hamcrest-core:1.1" level="project" />
<orderEntry type="library" name="Maven: org.bstats:bstats-bukkit:2.2.1" level="project" />
<orderEntry type="library" name="Maven: org.bstats:bstats-base:2.2.1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: me.clip:placeholderapi:2.10.9" level="project" />
<orderEntry type="library" name="Maven: org.jetbrains:annotations:22.0.0" level="project" />
<orderEntry type="library" name="Maven: io.papermc:paperlib:1.0.8-SNAPSHOT" level="project" />
<orderEntry type="library" name="Maven: co.aikar:acf-paper:0.5.1-SNAPSHOT" level="project" />
<orderEntry type="library" name="Maven: com.github.cryptomorin:XSeries:8.3.0" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.junit.jupiter:junit-jupiter-api:5.7.2" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.apiguardian:apiguardian-api:1.1.0" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.opentest4j:opentest4j:1.2.0" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.junit.platform:junit-platform-commons:1.7.2" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: com.sk89q.worldguard:worldguard-bukkit:7.0.4" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: com.sk89q.worldedit:worldedit-bukkit:7.2.0-SNAPSHOT" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: com.sk89q.worldguard:worldguard-core:7.0.4" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: com.sk89q.worldguard.worldguard-libs:core:7.0.4" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: com.sk89q.worldedit:worldedit-core:7.2.0-SNAPSHOT" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: com.sk89q.worldedit.worldedit-libs:core:7.2.0-SNAPSHOT" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: de.schlichtherle:truezip:6.8.3" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: net.java.truevfs:truevfs-profile-default_2.13:0.12.1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.scala-lang:scala-library:2.13.1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: net.java.truevfs:truevfs-driver-http:0.12.1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: net.java.truevfs:truevfs-kernel-spec:0.12.1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: net.java.truecommons:truecommons-annotations:2.5.0" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: com.google.code.findbugs:annotations:3.0.0" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: net.java.truecommons:truecommons-cio:2.5.0" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: net.java.truecommons:truecommons-io:2.5.0" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: net.java.truecommons:truecommons-services:2.5.0" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: net.java.truecommons:truecommons-logging:2.5.0" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: javax.inject:javax.inject:1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.apache.httpcomponents:httpclient:4.5.10" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.apache.httpcomponents:httpcore:4.4.12" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: net.java.truevfs:truevfs-driver-odf:0.12.1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: net.java.truevfs:truevfs-comp-zipdriver:0.12.1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: net.java.truevfs:truevfs-comp-zip:0.12.1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.bouncycastle:bcprov-jdk15on:1.63" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: net.java.truevfs:truevfs-driver-tar:0.12.1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: net.java.truevfs:truevfs-comp-tardriver:0.12.1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.apache.commons:commons-compress:1.19" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: net.java.truevfs:truevfs-driver-tar-bzip2:0.12.1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: net.java.truevfs:truevfs-driver-tar-gzip:0.12.1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: net.java.truevfs:truevfs-driver-tar-xz:0.12.1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.tukaani:xz:1.8" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: net.java.truevfs:truevfs-driver-zip-raes:0.12.1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: net.java.truevfs:truevfs-profile-base_2.13:0.12.1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: net.java.truevfs:truevfs-access-swing:0.12.1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: net.java.truevfs:truevfs-access:0.12.1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: net.java.truevfs:truevfs-driver-file:0.12.1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: net.java.truevfs:truevfs-driver-jar:0.12.1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: net.java.truevfs:truevfs-driver-zip:0.12.1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: net.java.truevfs:truevfs-comp-ibm437:0.12.1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: net.java.truevfs:truevfs-kernel-impl_2.13:0.12.1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: net.java.truecommons:truecommons-key-console:2.5.0" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: net.java.truecommons:truecommons-key-default:2.5.0" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: net.java.truecommons:truecommons-key-swing:2.5.0" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: net.java.truecommons:truecommons-key-macosx:2.5.0" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: net.java.truecommons:truecommons-key-spec:2.5.0" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: net.java.truecommons:truecommons-shed:2.5.0" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: net.java.dev.jna:jna:4.1.0" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.mozilla:rhino-runtime:1.7.12" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: it.unimi.dsi:fastutil:8.2.1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.antlr:antlr4-runtime:4.7.2" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.flywaydb:flyway-core:3.0" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: com.sk89q:commandbook:2.3" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: com.github.TechFortress:GriefPrevention:16.17.1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: com.discordsrv:discordsrv:1.24.1-SNAPSHOT" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: net.dv8tion:JDA:4.3.0_349" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: com.google.code.findbugs:jsr305:3.0.2" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.slf4j:slf4j-api:1.7.25" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: com.squareup.okhttp3:okhttp:3.13.0" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: com.squareup.okio:okio:1.17.2" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.apache.commons:commons-collections4:4.1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: com.fasterxml.jackson.core:jackson-databind:2.10.1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: com.fasterxml.jackson.core:jackson-annotations:2.10.1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: com.fasterxml.jackson.core:jackson-core:2.10.1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: com.neovisionaries:nv-websocket-client:2.14" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: net.sf.trove4j:trove4j:3.0.3" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: github.scarsz:configuralize:1.3.2" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: com.github.alexheretic:dynamics:4.0" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: com.github.alexheretic:fluent:2.0" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.slf4j:slf4j-jdk14:1.7.25" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.slf4j:jcl-over-slf4j:1.7.25" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: commons-io:commons-io:2.8.0" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: commons-collections:commons-collections:3.2.2" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.apache.commons:commons-lang3:3.5" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: commons-codec:commons-codec:1.11" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: com.vdurmont:emoji-java:5.1.1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.json:json:20170516" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: com.github.zafarkhaja:java-semver:0.9.0" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: com.github.kevinsawicki:http-request:6.0" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.minidns:minidns-hla:1.0.0" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.minidns:minidns-dnssec:1.0.0" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.minidns:minidns-client:1.0.0" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.minidns:minidns-core:1.0.0" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.minidns:minidns-iterative-resolver:1.0.0" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.springframework:spring-expression:5.2.7.RELEASE" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.springframework:spring-core:5.2.7.RELEASE" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: dev.vankka:MCDiscordReserializer:4.2.1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: dev.vankka:SimpleAST:2.2.7" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: net.kyori:adventure-api:4.9.1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: net.kyori:adventure-key:4.9.1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: net.kyori:examination-api:1.3.0" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: net.kyori:examination-string:1.3.0" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: net.kyori:adventure-text-serializer-legacy:4.9.1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: net.kyori:adventure-text-serializer-gson:4.9.1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: net.kyori:adventure-text-serializer-plain:4.9.1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: net.kyori:adventure-platform-bukkit:4.0.1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: net.kyori:adventure-platform-api:4.0.1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: net.kyori:adventure-text-serializer-bungeecord:4.0.1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: net.kyori:adventure-nbt:4.9.1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: net.kyori:adventure-text-serializer-gson-legacy-impl:4.9.1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: net.kyori:adventure-platform-facet:4.0.1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: net.kyori:adventure-platform-viaversion:4.0.1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: net.kyori:adventure-text-minimessage:4.1.0-20210316.192746" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: biz.princeps:landlord-latest:4.351" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: biz.princeps:landlord-core:4.351" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: biz.princeps:landlord-api:4.351" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: com.zaxxer:HikariCP:4.0.3" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: io.github.bananapuncher714:nbteditor:7.16.1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: de.eldoria:eldo-util:1.9.1" level="project" />
</component>
</module>
+4
View File
@@ -1,3 +1,7 @@
pull_request_title: "feat(lang): new crowdin updates"
pull_request_labels: ["l10n"]
commit_message: "feat(lang): new translations for %language%"
append_commit_message: false
files:
- source: src/main/resources/messages.properties
translation: /src/main/resources/%file_name%_%locale_with_underscore%.%file_extension%
-421
View File
@@ -1,421 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>net.sacredlabyrinth.phaed.simpleclans</groupId>
<artifactId>SimpleClans</artifactId>
<name>SimpleClans</name>
<version>2.16.2</version>
<url>https://www.spigotmc.org/resources/simpleclans.71242/</url>
<build>
<resources>
<resource>
<targetPath>.</targetPath>
<filtering>true</filtering>
<directory>${basedir}/src/main/resources</directory>
<includes>
<include>plugin.yml</include>
<include>config.yml</include>
<include>*.properties</include>
</includes>
</resource>
</resources>
<finalName>${project.name}</finalName>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<showDeprecation>true</showDeprecation>
<showWarnings>true</showWarnings>
<fork>true</fork>
<compilerArgs>
<arg>-parameters</arg>
</compilerArgs>
</configuration>
</plugin>
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<version>2.4</version>
</plugin>
<plugin>
<artifactId>maven-release-plugin</artifactId>
<version>2.3.2</version>
</plugin>
<plugin>
<artifactId>maven-shade-plugin</artifactId>
<version>3.1.0</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
<configuration>
<relocations>
<relocation>
<pattern>org.bstats</pattern>
<shadedPattern>net.sacredlabyrinth.phaed.simpleclans.metrics</shadedPattern>
</relocation>
<relocation>
<pattern>io.papermc.lib</pattern>
<shadedPattern>net.sacredlabyrinth.phaed.simpleclans.paperlib</shadedPattern>
</relocation>
<relocation>
<pattern>co.aikar.commands</pattern>
<shadedPattern>net.sacredlabyrinth.phaed.simpleclans.acf</shadedPattern>
</relocation>
<relocation>
<pattern>co.aikar.locales</pattern>
<shadedPattern>net.sacredlabyrinth.phaed.simpleclans.locales</shadedPattern>
</relocation>
<relocation>
<pattern>com.cryptomorin.xseries</pattern>
<shadedPattern>net.sacredlabyrinth.phaed.simpleclans.xseries</shadedPattern>
</relocation>
</relocations>
<artifactSet>
<excludes>
<exclude>org.jetbrains:annotations</exclude>
</excludes>
</artifactSet>
</configuration>
</plugin>
<plugin>
<artifactId>maven-dependency-plugin</artifactId>
<version>3.2.0</version>
<executions>
<execution>
<id>copy-installed</id>
<phase>package</phase>
<goals>
<goal>copy</goal>
</goals>
<configuration>
<artifactItems>
<artifactItem>
<groupId>${project.groupId}</groupId>
<artifactId>${project.artifactId}</artifactId>
<version>${project.version}</version>
<type>${project.packaging}</type>
</artifactItem>
</artifactItems>
<outputDirectory>${env.TEST_SERVER}\plugins</outputDirectory>
<silent>true</silent>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>pl.project13.maven</groupId>
<artifactId>git-commit-id-plugin</artifactId>
<version>3.0.0</version>
<executions>
<execution>
<phase>validate</phase>
<goals>
<goal>revision</goal>
</goals>
</execution>
</executions>
<configuration>
<dotGitDirectory>${project.basedir}/.git</dotGitDirectory>
</configuration>
</plugin>
<plugin>
<artifactId>maven-javadoc-plugin</artifactId>
<version>3.3.2</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>javadoc</goal>
</goals>
</execution>
</executions>
<configuration>
<source>8</source>
</configuration>
</plugin>
</plugins>
</build>
<repositories>
<repository>
<id>spigot-repo</id>
<url>https://hub.spigotmc.org/nexus/content/repositories/snapshots/</url>
</repository>
<repository>
<id>placeholderapi-repo</id>
<url>https://repo.extendedclip.com/content/repositories/placeholderapi/</url>
</repository>
<repository>
<id>bstats-repo</id>
<url>https://repo.codemc.org/repository/maven-public</url>
</repository>
<repository>
<id>papermc</id>
<url>https://papermc.io/repo/repository/maven-public/</url>
</repository>
<repository>
<id>aikar</id>
<url>https://repo.aikar.co/content/groups/aikar/</url>
</repository>
<repository>
<id>sk89q-repo</id>
<url>https://maven.enginehub.org/repo/</url>
</repository>
<repository>
<id>Scarsz-Nexus</id>
<url>https://nexus.scarsz.me/content/groups/public/</url>
</repository>
<repository>
<id>eldonexus</id>
<url>https://eldonexus.de/repository/maven-public</url>
</repository>
<repository>
<id>jitpack.io</id>
<url>https://jitpack.io</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>org.spigotmc</groupId>
<artifactId>spigot-api</artifactId>
<version>1.16.4-R0.1-SNAPSHOT</version>
<scope>provided</scope>
<exclusions>
<exclusion>
<artifactId>commons-lang</artifactId>
<groupId>commons-lang</groupId>
</exclusion>
<exclusion>
<artifactId>guava</artifactId>
<groupId>com.google.guava</groupId>
</exclusion>
<exclusion>
<artifactId>gson</artifactId>
<groupId>com.google.code.gson</groupId>
</exclusion>
<exclusion>
<artifactId>bungeecord-chat</artifactId>
<groupId>net.md-5</groupId>
</exclusion>
<exclusion>
<artifactId>snakeyaml</artifactId>
<groupId>org.yaml</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.github.MilkBowl</groupId>
<artifactId>VaultAPI</artifactId>
<version>1.7</version>
<scope>provided</scope>
<exclusions>
<exclusion>
<artifactId>bukkit</artifactId>
<groupId>org.bukkit</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.googlecode.json-simple</groupId>
<artifactId>json-simple</artifactId>
<version>1.1.1</version>
<scope>provided</scope>
<exclusions>
<exclusion>
<artifactId>junit</artifactId>
<groupId>junit</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>me.clip</groupId>
<artifactId>placeholderapi</artifactId>
<version>2.10.9</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.jetbrains</groupId>
<artifactId>annotations</artifactId>
<version>22.0.0</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.7.2</version>
<scope>test</scope>
<exclusions>
<exclusion>
<artifactId>apiguardian-api</artifactId>
<groupId>org.apiguardian</groupId>
</exclusion>
<exclusion>
<artifactId>opentest4j</artifactId>
<groupId>org.opentest4j</groupId>
</exclusion>
<exclusion>
<artifactId>junit-platform-commons</artifactId>
<groupId>org.junit.platform</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.sk89q.worldguard</groupId>
<artifactId>worldguard-bukkit</artifactId>
<version>7.0.4</version>
<scope>provided</scope>
<exclusions>
<exclusion>
<artifactId>worldedit-bukkit</artifactId>
<groupId>com.sk89q.worldedit</groupId>
</exclusion>
<exclusion>
<artifactId>worldguard-core</artifactId>
<groupId>com.sk89q.worldguard</groupId>
</exclusion>
<exclusion>
<artifactId>commandbook</artifactId>
<groupId>com.sk89q</groupId>
</exclusion>
<exclusion>
<artifactId>guava</artifactId>
<groupId>com.google.guava</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.github.TechFortress</groupId>
<artifactId>GriefPrevention</artifactId>
<version>16.17.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.discordsrv</groupId>
<artifactId>discordsrv</artifactId>
<version>1.24.1-SNAPSHOT</version>
<scope>provided</scope>
<exclusions>
<exclusion>
<artifactId>JDA</artifactId>
<groupId>net.dv8tion</groupId>
</exclusion>
<exclusion>
<artifactId>nv-websocket-client</artifactId>
<groupId>com.neovisionaries</groupId>
</exclusion>
<exclusion>
<artifactId>trove4j</artifactId>
<groupId>net.sf.trove4j</groupId>
</exclusion>
<exclusion>
<artifactId>configuralize</artifactId>
<groupId>github.scarsz</groupId>
</exclusion>
<exclusion>
<artifactId>slf4j-jdk14</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
<exclusion>
<artifactId>jcl-over-slf4j</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
<exclusion>
<artifactId>commons-io</artifactId>
<groupId>commons-io</groupId>
</exclusion>
<exclusion>
<artifactId>commons-collections</artifactId>
<groupId>commons-collections</groupId>
</exclusion>
<exclusion>
<artifactId>commons-lang3</artifactId>
<groupId>org.apache.commons</groupId>
</exclusion>
<exclusion>
<artifactId>commons-codec</artifactId>
<groupId>commons-codec</groupId>
</exclusion>
<exclusion>
<artifactId>emoji-java</artifactId>
<groupId>com.vdurmont</groupId>
</exclusion>
<exclusion>
<artifactId>java-semver</artifactId>
<groupId>com.github.zafarkhaja</groupId>
</exclusion>
<exclusion>
<artifactId>http-request</artifactId>
<groupId>com.github.kevinsawicki</groupId>
</exclusion>
<exclusion>
<artifactId>minidns-hla</artifactId>
<groupId>org.minidns</groupId>
</exclusion>
<exclusion>
<artifactId>spring-expression</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
<exclusion>
<artifactId>MCDiscordReserializer</artifactId>
<groupId>dev.vankka</groupId>
</exclusion>
<exclusion>
<artifactId>adventure-api</artifactId>
<groupId>net.kyori</groupId>
</exclusion>
<exclusion>
<artifactId>adventure-text-serializer-legacy</artifactId>
<groupId>net.kyori</groupId>
</exclusion>
<exclusion>
<artifactId>adventure-text-serializer-gson</artifactId>
<groupId>net.kyori</groupId>
</exclusion>
<exclusion>
<artifactId>adventure-text-serializer-plain</artifactId>
<groupId>net.kyori</groupId>
</exclusion>
<exclusion>
<artifactId>adventure-platform-bukkit</artifactId>
<groupId>net.kyori</groupId>
</exclusion>
<exclusion>
<artifactId>adventure-text-minimessage</artifactId>
<groupId>net.kyori</groupId>
</exclusion>
<exclusion>
<artifactId>guava</artifactId>
<groupId>com.google.guava</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>biz.princeps</groupId>
<artifactId>landlord-latest</artifactId>
<version>4.351</version>
<scope>provided</scope>
<exclusions>
<exclusion>
<artifactId>landlord-core</artifactId>
<groupId>biz.princeps</groupId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<distributionManagement>
<repository>
<id>reposilite</id>
<url>https://repo.roinujnosde.me/releases/</url>
</repository>
</distributionManagement>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
</project>
Vendored Executable
+308
View File
@@ -0,0 +1,308 @@
#!/bin/sh
# ----------------------------------------------------------------------------
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
# ----------------------------------------------------------------------------
# ----------------------------------------------------------------------------
# Apache Maven Wrapper startup batch script, version 3.2.0
#
# Required ENV vars:
# ------------------
# JAVA_HOME - location of a JDK home dir
#
# Optional ENV vars
# -----------------
# MAVEN_OPTS - parameters passed to the Java VM when running Maven
# e.g. to debug Maven itself, use
# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
# MAVEN_SKIP_RC - flag to disable loading of mavenrc files
# ----------------------------------------------------------------------------
if [ -z "$MAVEN_SKIP_RC" ] ; then
if [ -f /usr/local/etc/mavenrc ] ; then
. /usr/local/etc/mavenrc
fi
if [ -f /etc/mavenrc ] ; then
. /etc/mavenrc
fi
if [ -f "$HOME/.mavenrc" ] ; then
. "$HOME/.mavenrc"
fi
fi
# OS specific support. $var _must_ be set to either true or false.
cygwin=false;
darwin=false;
mingw=false
case "$(uname)" in
CYGWIN*) cygwin=true ;;
MINGW*) mingw=true;;
Darwin*) darwin=true
# Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home
# See https://developer.apple.com/library/mac/qa/qa1170/_index.html
if [ -z "$JAVA_HOME" ]; then
if [ -x "/usr/libexec/java_home" ]; then
JAVA_HOME="$(/usr/libexec/java_home)"; export JAVA_HOME
else
JAVA_HOME="/Library/Java/Home"; export JAVA_HOME
fi
fi
;;
esac
if [ -z "$JAVA_HOME" ] ; then
if [ -r /etc/gentoo-release ] ; then
JAVA_HOME=$(java-config --jre-home)
fi
fi
# For Cygwin, ensure paths are in UNIX format before anything is touched
if $cygwin ; then
[ -n "$JAVA_HOME" ] &&
JAVA_HOME=$(cygpath --unix "$JAVA_HOME")
[ -n "$CLASSPATH" ] &&
CLASSPATH=$(cygpath --path --unix "$CLASSPATH")
fi
# For Mingw, ensure paths are in UNIX format before anything is touched
if $mingw ; then
[ -n "$JAVA_HOME" ] && [ -d "$JAVA_HOME" ] &&
JAVA_HOME="$(cd "$JAVA_HOME" || (echo "cannot cd into $JAVA_HOME."; exit 1); pwd)"
fi
if [ -z "$JAVA_HOME" ]; then
javaExecutable="$(which javac)"
if [ -n "$javaExecutable" ] && ! [ "$(expr "\"$javaExecutable\"" : '\([^ ]*\)')" = "no" ]; then
# readlink(1) is not available as standard on Solaris 10.
readLink=$(which readlink)
if [ ! "$(expr "$readLink" : '\([^ ]*\)')" = "no" ]; then
if $darwin ; then
javaHome="$(dirname "\"$javaExecutable\"")"
javaExecutable="$(cd "\"$javaHome\"" && pwd -P)/javac"
else
javaExecutable="$(readlink -f "\"$javaExecutable\"")"
fi
javaHome="$(dirname "\"$javaExecutable\"")"
javaHome=$(expr "$javaHome" : '\(.*\)/bin')
JAVA_HOME="$javaHome"
export JAVA_HOME
fi
fi
fi
if [ -z "$JAVACMD" ] ; then
if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
# IBM's JDK on AIX uses strange locations for the executables
JAVACMD="$JAVA_HOME/jre/sh/java"
else
JAVACMD="$JAVA_HOME/bin/java"
fi
else
JAVACMD="$(\unset -f command 2>/dev/null; \command -v java)"
fi
fi
if [ ! -x "$JAVACMD" ] ; then
echo "Error: JAVA_HOME is not defined correctly." >&2
echo " We cannot execute $JAVACMD" >&2
exit 1
fi
if [ -z "$JAVA_HOME" ] ; then
echo "Warning: JAVA_HOME environment variable is not set."
fi
# traverses directory structure from process work directory to filesystem root
# first directory with .mvn subdirectory is considered project base directory
find_maven_basedir() {
if [ -z "$1" ]
then
echo "Path not specified to find_maven_basedir"
return 1
fi
basedir="$1"
wdir="$1"
while [ "$wdir" != '/' ] ; do
if [ -d "$wdir"/.mvn ] ; then
basedir=$wdir
break
fi
# workaround for JBEAP-8937 (on Solaris 10/Sparc)
if [ -d "${wdir}" ]; then
wdir=$(cd "$wdir/.." || exit 1; pwd)
fi
# end of workaround
done
printf '%s' "$(cd "$basedir" || exit 1; pwd)"
}
# concatenates all lines of a file
concat_lines() {
if [ -f "$1" ]; then
# Remove \r in case we run on Windows within Git Bash
# and check out the repository with auto CRLF management
# enabled. Otherwise, we may read lines that are delimited with
# \r\n and produce $'-Xarg\r' rather than -Xarg due to word
# splitting rules.
tr -s '\r\n' ' ' < "$1"
fi
}
log() {
if [ "$MVNW_VERBOSE" = true ]; then
printf '%s\n' "$1"
fi
}
BASE_DIR=$(find_maven_basedir "$(dirname "$0")")
if [ -z "$BASE_DIR" ]; then
exit 1;
fi
MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"}; export MAVEN_PROJECTBASEDIR
log "$MAVEN_PROJECTBASEDIR"
##########################################################################################
# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
# This allows using the maven wrapper in projects that prohibit checking in binary data.
##########################################################################################
wrapperJarPath="$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar"
if [ -r "$wrapperJarPath" ]; then
log "Found $wrapperJarPath"
else
log "Couldn't find $wrapperJarPath, downloading it ..."
if [ -n "$MVNW_REPOURL" ]; then
wrapperUrl="$MVNW_REPOURL/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar"
else
wrapperUrl="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar"
fi
while IFS="=" read -r key value; do
# Remove '\r' from value to allow usage on windows as IFS does not consider '\r' as a separator ( considers space, tab, new line ('\n'), and custom '=' )
safeValue=$(echo "$value" | tr -d '\r')
case "$key" in (wrapperUrl) wrapperUrl="$safeValue"; break ;;
esac
done < "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.properties"
log "Downloading from: $wrapperUrl"
if $cygwin; then
wrapperJarPath=$(cygpath --path --windows "$wrapperJarPath")
fi
if command -v wget > /dev/null; then
log "Found wget ... using wget"
[ "$MVNW_VERBOSE" = true ] && QUIET="" || QUIET="--quiet"
if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then
wget $QUIET "$wrapperUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath"
else
wget $QUIET --http-user="$MVNW_USERNAME" --http-password="$MVNW_PASSWORD" "$wrapperUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath"
fi
elif command -v curl > /dev/null; then
log "Found curl ... using curl"
[ "$MVNW_VERBOSE" = true ] && QUIET="" || QUIET="--silent"
if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then
curl $QUIET -o "$wrapperJarPath" "$wrapperUrl" -f -L || rm -f "$wrapperJarPath"
else
curl $QUIET --user "$MVNW_USERNAME:$MVNW_PASSWORD" -o "$wrapperJarPath" "$wrapperUrl" -f -L || rm -f "$wrapperJarPath"
fi
else
log "Falling back to using Java to download"
javaSource="$MAVEN_PROJECTBASEDIR/.mvn/wrapper/MavenWrapperDownloader.java"
javaClass="$MAVEN_PROJECTBASEDIR/.mvn/wrapper/MavenWrapperDownloader.class"
# For Cygwin, switch paths to Windows format before running javac
if $cygwin; then
javaSource=$(cygpath --path --windows "$javaSource")
javaClass=$(cygpath --path --windows "$javaClass")
fi
if [ -e "$javaSource" ]; then
if [ ! -e "$javaClass" ]; then
log " - Compiling MavenWrapperDownloader.java ..."
("$JAVA_HOME/bin/javac" "$javaSource")
fi
if [ -e "$javaClass" ]; then
log " - Running MavenWrapperDownloader.java ..."
("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$wrapperUrl" "$wrapperJarPath") || rm -f "$wrapperJarPath"
fi
fi
fi
fi
##########################################################################################
# End of extension
##########################################################################################
# If specified, validate the SHA-256 sum of the Maven wrapper jar file
wrapperSha256Sum=""
while IFS="=" read -r key value; do
case "$key" in (wrapperSha256Sum) wrapperSha256Sum=$value; break ;;
esac
done < "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.properties"
if [ -n "$wrapperSha256Sum" ]; then
wrapperSha256Result=false
if command -v sha256sum > /dev/null; then
if echo "$wrapperSha256Sum $wrapperJarPath" | sha256sum -c > /dev/null 2>&1; then
wrapperSha256Result=true
fi
elif command -v shasum > /dev/null; then
if echo "$wrapperSha256Sum $wrapperJarPath" | shasum -a 256 -c > /dev/null 2>&1; then
wrapperSha256Result=true
fi
else
echo "Checksum validation was requested but neither 'sha256sum' or 'shasum' are available."
echo "Please install either command, or disable validation by removing 'wrapperSha256Sum' from your maven-wrapper.properties."
exit 1
fi
if [ $wrapperSha256Result = false ]; then
echo "Error: Failed to validate Maven wrapper SHA-256, your Maven wrapper might be compromised." >&2
echo "Investigate or delete $wrapperJarPath to attempt a clean download." >&2
echo "If you updated your Maven version, you need to update the specified wrapperSha256Sum property." >&2
exit 1
fi
fi
MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS"
# For Cygwin, switch paths to Windows format before running java
if $cygwin; then
[ -n "$JAVA_HOME" ] &&
JAVA_HOME=$(cygpath --path --windows "$JAVA_HOME")
[ -n "$CLASSPATH" ] &&
CLASSPATH=$(cygpath --path --windows "$CLASSPATH")
[ -n "$MAVEN_PROJECTBASEDIR" ] &&
MAVEN_PROJECTBASEDIR=$(cygpath --path --windows "$MAVEN_PROJECTBASEDIR")
fi
# Provide a "standardized" way to retrieve the CLI args that will
# work with both Windows and non-Windows executions.
MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $*"
export MAVEN_CMD_LINE_ARGS
WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
# shellcheck disable=SC2086 # safe args
exec "$JAVACMD" \
$MAVEN_OPTS \
$MAVEN_DEBUG_OPTS \
-classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \
"-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \
${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@"
Vendored
+205
View File
@@ -0,0 +1,205 @@
@REM ----------------------------------------------------------------------------
@REM Licensed to the Apache Software Foundation (ASF) under one
@REM or more contributor license agreements. See the NOTICE file
@REM distributed with this work for additional information
@REM regarding copyright ownership. The ASF licenses this file
@REM to you under the Apache License, Version 2.0 (the
@REM "License"); you may not use this file except in compliance
@REM with the License. You may obtain a copy of the License at
@REM
@REM http://www.apache.org/licenses/LICENSE-2.0
@REM
@REM Unless required by applicable law or agreed to in writing,
@REM software distributed under the License is distributed on an
@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
@REM KIND, either express or implied. See the License for the
@REM specific language governing permissions and limitations
@REM under the License.
@REM ----------------------------------------------------------------------------
@REM ----------------------------------------------------------------------------
@REM Apache Maven Wrapper startup batch script, version 3.2.0
@REM
@REM Required ENV vars:
@REM JAVA_HOME - location of a JDK home dir
@REM
@REM Optional ENV vars
@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands
@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending
@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven
@REM e.g. to debug Maven itself, use
@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files
@REM ----------------------------------------------------------------------------
@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on'
@echo off
@REM set title of command window
title %0
@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on'
@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO%
@REM set %HOME% to equivalent of $HOME
if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%")
@REM Execute a user defined script before this one
if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre
@REM check for pre script, once with legacy .bat ending and once with .cmd ending
if exist "%USERPROFILE%\mavenrc_pre.bat" call "%USERPROFILE%\mavenrc_pre.bat" %*
if exist "%USERPROFILE%\mavenrc_pre.cmd" call "%USERPROFILE%\mavenrc_pre.cmd" %*
:skipRcPre
@setlocal
set ERROR_CODE=0
@REM To isolate internal variables from possible post scripts, we use another setlocal
@setlocal
@REM ==== START VALIDATION ====
if not "%JAVA_HOME%" == "" goto OkJHome
echo.
echo Error: JAVA_HOME not found in your environment. >&2
echo Please set the JAVA_HOME variable in your environment to match the >&2
echo location of your Java installation. >&2
echo.
goto error
:OkJHome
if exist "%JAVA_HOME%\bin\java.exe" goto init
echo.
echo Error: JAVA_HOME is set to an invalid directory. >&2
echo JAVA_HOME = "%JAVA_HOME%" >&2
echo Please set the JAVA_HOME variable in your environment to match the >&2
echo location of your Java installation. >&2
echo.
goto error
@REM ==== END VALIDATION ====
:init
@REM Find the project base dir, i.e. the directory that contains the folder ".mvn".
@REM Fallback to current working directory if not found.
set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR%
IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir
set EXEC_DIR=%CD%
set WDIR=%EXEC_DIR%
:findBaseDir
IF EXIST "%WDIR%"\.mvn goto baseDirFound
cd ..
IF "%WDIR%"=="%CD%" goto baseDirNotFound
set WDIR=%CD%
goto findBaseDir
:baseDirFound
set MAVEN_PROJECTBASEDIR=%WDIR%
cd "%EXEC_DIR%"
goto endDetectBaseDir
:baseDirNotFound
set MAVEN_PROJECTBASEDIR=%EXEC_DIR%
cd "%EXEC_DIR%"
:endDetectBaseDir
IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig
@setlocal EnableExtensions EnableDelayedExpansion
for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a
@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS%
:endReadAdditionalConfig
SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe"
set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar"
set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
set WRAPPER_URL="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar"
FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO (
IF "%%A"=="wrapperUrl" SET WRAPPER_URL=%%B
)
@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
@REM This allows using the maven wrapper in projects that prohibit checking in binary data.
if exist %WRAPPER_JAR% (
if "%MVNW_VERBOSE%" == "true" (
echo Found %WRAPPER_JAR%
)
) else (
if not "%MVNW_REPOURL%" == "" (
SET WRAPPER_URL="%MVNW_REPOURL%/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar"
)
if "%MVNW_VERBOSE%" == "true" (
echo Couldn't find %WRAPPER_JAR%, downloading it ...
echo Downloading from: %WRAPPER_URL%
)
powershell -Command "&{"^
"$webclient = new-object System.Net.WebClient;"^
"if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^
"$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^
"}"^
"[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%WRAPPER_URL%', '%WRAPPER_JAR%')"^
"}"
if "%MVNW_VERBOSE%" == "true" (
echo Finished downloading %WRAPPER_JAR%
)
)
@REM End of extension
@REM If specified, validate the SHA-256 sum of the Maven wrapper jar file
SET WRAPPER_SHA_256_SUM=""
FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO (
IF "%%A"=="wrapperSha256Sum" SET WRAPPER_SHA_256_SUM=%%B
)
IF NOT %WRAPPER_SHA_256_SUM%=="" (
powershell -Command "&{"^
"$hash = (Get-FileHash \"%WRAPPER_JAR%\" -Algorithm SHA256).Hash.ToLower();"^
"If('%WRAPPER_SHA_256_SUM%' -ne $hash){"^
" Write-Output 'Error: Failed to validate Maven wrapper SHA-256, your Maven wrapper might be compromised.';"^
" Write-Output 'Investigate or delete %WRAPPER_JAR% to attempt a clean download.';"^
" Write-Output 'If you updated your Maven version, you need to update the specified wrapperSha256Sum property.';"^
" exit 1;"^
"}"^
"}"
if ERRORLEVEL 1 goto error
)
@REM Provide a "standardized" way to retrieve the CLI args that will
@REM work with both Windows and non-Windows executions.
set MAVEN_CMD_LINE_ARGS=%*
%MAVEN_JAVA_EXE% ^
%JVM_CONFIG_MAVEN_PROPS% ^
%MAVEN_OPTS% ^
%MAVEN_DEBUG_OPTS% ^
-classpath %WRAPPER_JAR% ^
"-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" ^
%WRAPPER_LAUNCHER% %MAVEN_CONFIG% %*
if ERRORLEVEL 1 goto error
goto end
:error
set ERROR_CODE=1
:end
@endlocal & set ERROR_CODE=%ERROR_CODE%
if not "%MAVEN_SKIP_RC%"=="" goto skipRcPost
@REM check for post script, once with legacy .bat ending and once with .cmd ending
if exist "%USERPROFILE%\mavenrc_post.bat" call "%USERPROFILE%\mavenrc_post.bat"
if exist "%USERPROFILE%\mavenrc_post.cmd" call "%USERPROFILE%\mavenrc_post.cmd"
:skipRcPost
@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on'
if "%MAVEN_BATCH_PAUSE%"=="on" pause
if "%MAVEN_TERMINATE_CMD%"=="on" exit %ERROR_CODE%
cmd /C exit /B %ERROR_CODE%
+54 -27
View File
@@ -3,7 +3,7 @@
<modelVersion>4.0.0</modelVersion>
<groupId>net.sacredlabyrinth.phaed.simpleclans</groupId>
<artifactId>SimpleClans</artifactId>
<version>2.16.2</version>
<version>2.19.1-SNAPSHOT</version>
<name>SimpleClans</name>
<url>https://www.spigotmc.org/resources/simpleclans.71242/</url>
@@ -30,13 +30,11 @@
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<version>3.11.0</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<release>16</release>
<showDeprecation>true</showDeprecation>
<showWarnings>true</showWarnings>
<fork>true</fork>
<compilerArgs>
<arg>-parameters</arg>
</compilerArgs>
@@ -47,21 +45,21 @@
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.4</version>
<version>3.3.0</version>
</plugin>
<!-- Release plugin -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-release-plugin</artifactId>
<version>2.3.2</version>
<version>3.0.1</version>
</plugin>
<!-- Shade plugin -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.1.0</version>
<version>3.5.0</version>
<configuration>
<relocations>
<relocation>
@@ -84,12 +82,23 @@
<pattern>com.cryptomorin.xseries</pattern>
<shadedPattern>net.sacredlabyrinth.phaed.simpleclans.xseries</shadedPattern>
</relocation>
<relocation>
<pattern>com.google.gson</pattern>
<shadedPattern>net.sacredlabyrinth.phaed.simpleclans.gson</shadedPattern>
</relocation>
</relocations>
<artifactSet>
<excludes>
<exclude>org.jetbrains:annotations</exclude>
</excludes>
</artifactSet>
<transformers>
<!-- Avoid overlapping MANIFEST.MF file -->
<transformer implementation="org.apache.maven.plugins.shade.resource.DontIncludeResourceTransformer">
<resource>MANIFEST.MF</resource>
</transformer>
</transformers>
</configuration>
<executions>
<execution>
@@ -105,7 +114,7 @@
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>3.2.0</version>
<version>3.6.0</version>
<executions>
<execution>
<id>copy-installed</id>
@@ -132,7 +141,7 @@
<plugin>
<groupId>pl.project13.maven</groupId>
<artifactId>git-commit-id-plugin</artifactId>
<version>3.0.0</version>
<version>4.9.10</version>
<executions>
<execution>
<goals>
@@ -149,7 +158,7 @@
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<version>3.3.2</version>
<version>3.5.0</version>
<executions>
<execution>
<goals>
@@ -159,9 +168,15 @@
</execution>
</executions>
<configuration>
<source>8</source>
<release>16</release>
<doclint>all,-missing</doclint>
</configuration>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>3.1.2</version>
</plugin>
</plugins>
</build>
<!-- Dependencies -->
@@ -177,12 +192,13 @@
<artifactId>VaultAPI</artifactId>
<version>1.7</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.googlecode.json-simple</groupId>
<artifactId>json-simple</artifactId>
<version>1.1.1</version>
<scope>provided</scope>
<exclusions>
<!-- No idea why, but it fails JUnit 5 tests -->
<exclusion>
<groupId>com.googlecode.json-simple</groupId>
<artifactId>json-simple</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.bstats</groupId>
@@ -217,12 +233,6 @@
<artifactId>XSeries</artifactId>
<version>8.3.0</version>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.7.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.sk89q.worldguard</groupId>
<artifactId>worldguard-bukkit</artifactId>
@@ -232,7 +242,7 @@
<dependency>
<groupId>com.github.TechFortress</groupId>
<artifactId>GriefPrevention</artifactId>
<version>16.17.1</version>
<version>16.18.1</version>
<scope>provided</scope>
</dependency>
<dependency>
@@ -247,6 +257,19 @@
<version>4.351</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.9.1</version>
</dependency>
<!-- Test frameworks -->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.9.3</version>
<scope>test</scope>
</dependency>
</dependencies>
<!-- Repositories -->
@@ -290,7 +313,7 @@
</repositories>
<properties>
<project.build.sourcfeEncoding>UTF-8</project.build.sourcfeEncoding>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<!-- Upstream Distribution -->
@@ -300,5 +323,9 @@
<id>reposilite</id>
<url>https://repo.roinujnosde.me/releases/</url>
</repository>
<snapshotRepository>
<id>reposilite</id>
<url>https://repo.roinujnosde.me/snapshots/</url>
</snapshotRepository>
</distributionManagement>
</project>
-3
View File
@@ -1,3 +0,0 @@
Manifest-Version: 1.0
Main-Class: net.sacredlabyrinth.phaed.simpleclans.SimpleClans
@@ -3,7 +3,6 @@ package net.sacredlabyrinth.phaed.simpleclans;
import net.sacredlabyrinth.phaed.simpleclans.utils.ChatUtils;
import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -525,7 +524,7 @@ public class ChatBlock {
* Outputs a single line out, crops overflow
*
* @param receiver the receiver
* @param msg the message
* @param msg the message
*/
public static void saySingle(CommandSender receiver, String msg) {
if (receiver == null) {
@@ -539,7 +538,7 @@ public class ChatBlock {
* Outputs a message to a user
*
* @param receiver the receiver
* @param msg the message
* @param msg the message
*/
public static void sendMessage(@Nullable CommandSender receiver, @NotNull String msg) {
if (receiver == null) {
@@ -554,12 +553,7 @@ public class ChatBlock {
return;
}
Player player = receiver.toPlayer();
if (player == null) {
return;
}
player.sendMessage(ChatUtils.parseColors(msg));
SimpleClans.getInstance().getProxyManager().sendMessage(receiver.getName(), ChatUtils.parseColors(msg));
}
// ClanCommands#setbanner, LandCommands#Allow/BlockCommand/verify, StaffCommands#kick, etc
@@ -567,6 +561,10 @@ public class ChatBlock {
sendMessage(receiver, lang(key, receiver, args));
}
public static void sendMessageKey(@NotNull ClanPlayer clanPlayer, @NotNull String key, @NotNull Object... args) {
sendMessageKey(clanPlayer.toPlayer(), key, args);
}
@Deprecated
public void startColor(String color) {
this.color = color;
@@ -1,5 +1,6 @@
package net.sacredlabyrinth.phaed.simpleclans;
import net.md_5.bungee.api.chat.BaseComponent;
import net.md_5.bungee.api.chat.HoverEvent;
import net.md_5.bungee.api.chat.TextComponent;
import net.sacredlabyrinth.phaed.simpleclans.events.*;
@@ -7,7 +8,6 @@ import net.sacredlabyrinth.phaed.simpleclans.hooks.papi.Placeholder;
import net.sacredlabyrinth.phaed.simpleclans.loggers.BankLog;
import net.sacredlabyrinth.phaed.simpleclans.loggers.BankLogger;
import net.sacredlabyrinth.phaed.simpleclans.loggers.BankOperator;
import net.sacredlabyrinth.phaed.simpleclans.managers.PermissionsManager;
import net.sacredlabyrinth.phaed.simpleclans.managers.SettingsManager;
import net.sacredlabyrinth.phaed.simpleclans.utils.ChatUtils;
import org.bukkit.Bukkit;
@@ -54,7 +54,7 @@ public class Clan implements Serializable, Comparable<Clan> {
private List<String> allies = new ArrayList<>();
private List<String> rivals = new ArrayList<>();
private List<String> bb = new ArrayList<>();
private final List<String> members = new ArrayList<>();
private final List<ClanPlayer> members = new ArrayList<>();
private Flags flags = new Flags(null);
private boolean feeEnabled;
private List<Rank> ranks = new ArrayList<>();
@@ -113,9 +113,9 @@ public class Clan implements Serializable, Comparable<Clan> {
@Deprecated
public void deposit(double amount, Player player) {
if (SimpleClans.getInstance().getPermissionsManager().playerHasMoney(player, amount)) {
if (SimpleClans.getInstance().getPermissionsManager().playerChargeMoney(player, amount)) {
if (SimpleClans.getInstance().getPermissionsManager().grantPlayer(player, amount)) {
player.sendMessage(AQUA + lang("player.clan.deposit", player, amount));
addBb(player.getName(), AQUA + lang("bb.clan.deposit", amount));
addBb(player.getName(), lang("bb.clan.deposit", amount));
setBalance(getBalance() + amount);
SimpleClans.getInstance().getStorageManager().updateClan(this);
} else {
@@ -150,9 +150,9 @@ public class Clan implements Serializable, Comparable<Clan> {
@Deprecated
public void withdraw(double amount, Player player) {
if (getBalance() >= amount) {
if (SimpleClans.getInstance().getPermissionsManager().playerGrantMoney(player, amount)) {
if (SimpleClans.getInstance().getPermissionsManager().grantPlayer(player, amount)) {
player.sendMessage(AQUA + lang("player.clan.withdraw", player, amount));
addBb(player.getName(), AQUA + lang("bb.clan.withdraw", amount));
addBb(player.getName(), lang("bb.clan.withdraw", amount));
setBalance(getBalance() - amount);
}
} else {
@@ -293,7 +293,6 @@ public class Clan implements Serializable, Comparable<Clan> {
public void setTag(String tag) {
this.tag = tag;
}
/**
* Returns the first color in the clan's tag
*
@@ -385,17 +384,22 @@ public class Clan implements Serializable, Comparable<Clan> {
* @return confirmation
*/
public boolean isMember(Player player) {
return members.contains(player.getUniqueId().toString());
return isMember(player.getUniqueId());
}
/**
* Check if the player is a member of this clan
*
* @param playerUniqueId the Player's UUID
* @param uuid the Player's UUID
* @return confirmation
*/
public boolean isMember(UUID playerUniqueId) {
return members.contains(playerUniqueId.toString());
public boolean isMember(UUID uuid) {
for (ClanPlayer cp : members) {
if (cp.getUniqueId().equals(uuid)) {
return true;
}
}
return false;
}
@SuppressWarnings("deprecation")
@@ -488,6 +492,9 @@ public class Clan implements Serializable, Comparable<Clan> {
SimpleClans.getInstance().getStorageManager().updateClan(this);
}
public void setBb(List<String> bb) {
this.bb = new ArrayList<>(bb);
}
/**
* Adds a bulletin board message without saving it to the database
@@ -522,23 +529,16 @@ public class Clan implements Serializable, Comparable<Clan> {
* (used internally)
*/
public void importMember(ClanPlayer cp) {
String uuid;
if (cp.getUniqueId() != null) {
uuid = cp.getUniqueId().toString();
} else {
return;
}
if (!members.contains(uuid)) {
members.add(uuid);
if (!members.contains(cp)) {
members.add(cp);
}
}
/**
* (used internally)
*/
public void removeMember(UUID playerUniqueId) {
members.remove(playerUniqueId.toString());
public void removeMember(UUID uuid) {
members.removeIf(cp -> cp.getUniqueId().equals(uuid));
}
/**
@@ -734,12 +734,8 @@ public class Clan implements Serializable, Comparable<Clan> {
* @return the formatted leaders string
*/
public String getLeadersString(String prefix, String sep) {
return members.stream().
map(member -> SimpleClans.getInstance().getClanManager().getClanPlayer(UUID.fromString(member))).
filter(Objects::nonNull).
filter(ClanPlayer::isLeader).
map(clanPlayer -> prefix.concat(clanPlayer.getName())).
collect(Collectors.joining(sep));
return members.stream().filter(ClanPlayer::isLeader).map(ClanPlayer::getName).
collect(Collectors.joining(sep, prefix, ""));
}
/**
@@ -790,19 +786,7 @@ public class Clan implements Serializable, Comparable<Clan> {
* @return the members
*/
public List<ClanPlayer> getMembers() {
List<ClanPlayer> out = new ArrayList<>();
for (String member : members) {
ClanPlayer cp = SimpleClans.getInstance().getClanManager().getClanPlayer(UUID.fromString(member));
if (cp == null) {
continue;
}
out.add(cp);
}
Collections.sort(out);
return out;
return new ArrayList<>(members);
}
/**
@@ -812,22 +796,9 @@ public class Clan implements Serializable, Comparable<Clan> {
*/
@Placeholder(value = "onlinemembers_count", resolver = "list_size", config = "filter_vanished")
public List<ClanPlayer> getOnlineMembers() {
List<ClanPlayer> out = new ArrayList<>();
for (String member : members) {
ClanPlayer cp = SimpleClans.getInstance().getClanManager().getClanPlayer(UUID.fromString(member));
if (cp == null) {
continue;
}
if (cp.toPlayer() != null) {
out.add(cp);
}
}
return out;
return members.stream().filter(cp -> cp.toPlayer() != null).collect(Collectors.toList());
}
/**
* Get all leaders in the clan
*
@@ -835,20 +806,7 @@ public class Clan implements Serializable, Comparable<Clan> {
*/
@Placeholder(value = "leader_size", resolver = "list_size")
public List<ClanPlayer> getLeaders() {
List<ClanPlayer> out = new ArrayList<>();
for (String member : members) {
ClanPlayer cp = SimpleClans.getInstance().getClanManager().getClanPlayer(UUID.fromString(member));
if (cp == null) {
continue;
}
if (cp.isLeader()) {
out.add(cp);
}
}
return out;
return members.stream().filter(ClanPlayer::isLeader).collect(Collectors.toList());
}
/**
@@ -857,22 +815,7 @@ public class Clan implements Serializable, Comparable<Clan> {
* @return non leaders
*/
public List<ClanPlayer> getNonLeaders() {
List<ClanPlayer> out = new ArrayList<>();
for (String member : members) {
ClanPlayer cp = SimpleClans.getInstance().getClanManager().getClanPlayer(UUID.fromString(member));
if (cp == null) {
continue;
}
if (!cp.isLeader()) {
out.add(cp);
}
}
Collections.sort(out);
return out;
return members.stream().filter(cp -> !cp.isLeader()).collect(Collectors.toList());
}
/**
@@ -911,16 +854,10 @@ public class Clan implements Serializable, Comparable<Clan> {
if (members.isEmpty()) {
return 0;
}
double totalWeightedKills = 0;
int totalDeaths = 0;
for (String member : members) {
ClanPlayer cp = SimpleClans.getInstance().getClanManager().getClanPlayer(UUID.fromString(member));
if (cp == null) {
continue;
}
for (ClanPlayer cp : members) {
totalWeightedKills += cp.getWeightedKills();
totalDeaths += cp.getDeaths();
}
@@ -943,12 +880,7 @@ public class Clan implements Serializable, Comparable<Clan> {
return totalDeaths;
}
for (String member : members) {
ClanPlayer cp = SimpleClans.getInstance().getClanManager().getClanPlayer(UUID.fromString(member));
if (cp == null) {
continue;
}
for (ClanPlayer cp : members) {
totalDeaths += cp.getDeaths();
}
@@ -966,12 +898,7 @@ public class Clan implements Serializable, Comparable<Clan> {
return total;
}
for (String member : members) {
ClanPlayer cp = SimpleClans.getInstance().getClanManager().getClanPlayer(UUID.fromString(member));
if (cp == null) {
continue;
}
for (ClanPlayer cp : members) {
total += cp.getWeightedKills();
}
@@ -1056,6 +983,7 @@ public class Clan implements Serializable, Comparable<Clan> {
cp.removePastClan(getColorTag());
cp.setClan(this);
cp.setLeader(false);
cp.setJoinDate(new Date().getTime());
cp.setTrusted(SimpleClans.getInstance().getSettingsManager().is(CLAN_TRUST_MEMBERS_BY_DEFAULT));
if (defaultRank != null) {
cp.setRank(defaultRank);
@@ -1176,7 +1104,7 @@ public class Clan implements Serializable, Comparable<Clan> {
}
/**
* Remove an ally form the clan, and the clan from the ally
* Remove an ally from the clan, and the clan from the ally
*/
public void removeAlly(Clan ally) {
removeAlly(ally.getTag());
@@ -1227,7 +1155,7 @@ public class Clan implements Serializable, Comparable<Clan> {
*/
@Placeholder("is_anyonline")
public boolean isAnyOnline() {
return members.stream().map(UUID::fromString).map(Bukkit::getPlayer).anyMatch(Objects::nonNull);
return members.stream().anyMatch(cp -> cp.toPlayer() != null);
}
/**
@@ -1327,18 +1255,14 @@ public class Clan implements Serializable, Comparable<Clan> {
String message = SimpleClans.getInstance().getSettingsManager().getColored(CLANCHAT_ANNOUNCEMENT_COLOR) + msg;
for (ClanPlayer cp : getMembers()) {
Player pl = cp.toPlayer();
if (pl != null) {
ChatBlock.sendMessage(pl, message);
}
ChatBlock.sendMessage(cp, message);
}
SimpleClans.getInstance().getServer().getConsoleSender().sendMessage(AQUA + "[" + lang("clan.announce") + AQUA + "] " + AQUA + "[" + Helper.getColorName(playerName) + WHITE + "] " + message);
Bukkit.getConsoleSender().sendMessage(AQUA + "[" + lang("clan.announce") + AQUA + "] " + AQUA + "[" + Helper.getColorName(playerName) + WHITE + "] " + message);
}
/**
* Announce message to a all the leaders of a clan
* Announce message to all the leaders of a clan
*/
public void leaderAnnounce(String msg) {
String message = SimpleClans.getInstance().getSettingsManager().getColored(CLANCHAT_ANNOUNCEMENT_COLOR) + msg;
@@ -1346,13 +1270,9 @@ public class Clan implements Serializable, Comparable<Clan> {
List<ClanPlayer> leaders = getLeaders();
for (ClanPlayer cp : leaders) {
Player pl = cp.toPlayer();
if (pl != null) {
ChatBlock.sendMessage(pl, message);
}
ChatBlock.sendMessage(cp, message);
}
SimpleClans.getInstance().getServer().getConsoleSender().sendMessage(AQUA + "[" + lang("leader.announce") + AQUA + "] " + WHITE + message);
Bukkit.getConsoleSender().sendMessage(AQUA + "[" + lang("leader.announce") + AQUA + "] " + WHITE + message);
}
/**
@@ -1360,8 +1280,8 @@ public class Clan implements Serializable, Comparable<Clan> {
*/
public void addBb(String announcerName, String msg) {
if (isVerified()) {
addBb(SimpleClans.getInstance().getSettingsManager().getColored(BB_COLOR) + msg);
clanAnnounce(announcerName, SimpleClans.getInstance().getSettingsManager().getColored(BB_ACCENT_COLOR) + "* " + SimpleClans.getInstance().getSettingsManager().getColored(BB_COLOR) + ChatUtils.parseColors(msg));
addBb(msg);
clanAnnounce(announcerName, SimpleClans.getInstance().getSettingsManager().getColored(BB_PREFIX) + ChatUtils.parseColors(msg));
}
}
@@ -1370,8 +1290,8 @@ public class Clan implements Serializable, Comparable<Clan> {
*/
public void addBb(String announcerName, String msg, boolean updateLastUsed) {
if (isVerified()) {
addBb(SimpleClans.getInstance().getSettingsManager().getColored(BB_COLOR) + msg, updateLastUsed);
clanAnnounce(announcerName, SimpleClans.getInstance().getSettingsManager().getColored(BB_ACCENT_COLOR) + "* " + SimpleClans.getInstance().getSettingsManager().getColored(BB_COLOR) + ChatUtils.parseColors(msg));
addBb(msg, updateLastUsed);
clanAnnounce(announcerName, SimpleClans.getInstance().getSettingsManager().getColored(BB_PREFIX) + ChatUtils.parseColors(msg));
}
}
@@ -1388,31 +1308,35 @@ public class Clan implements Serializable, Comparable<Clan> {
* @param maxSize amount of lines to display
*/
public void displayBb(Player player, int maxSize) {
if (isVerified()) {
ChatBlock.sendBlank(player);
String bbAccentColor = SimpleClans.getInstance().getSettingsManager().getColored(BB_ACCENT_COLOR);
String pageHeadingsColor = SimpleClans.getInstance().getSettingsManager().getColored(PAGE_HEADINGS_COLOR);
ChatBlock.saySingle(player, lang("bulletin.board.header", bbAccentColor, pageHeadingsColor, getName()));
List<String> localBb;
if (maxSize == -1) {
localBb = bb;
maxSize = SimpleClans.getInstance().getSettingsManager().getInt(BB_SIZE);
} else {
localBb = new ArrayList<>(bb);
}
while (localBb.size() > maxSize) {
localBb.remove(0);
}
for (String msg : localBb) {
if (!sendBbTime(player, msg)) {
String bbColor = SimpleClans.getInstance().getSettingsManager().getColored(BB_COLOR);
ChatBlock.sendMessage(player, bbAccentColor + "* " + bbColor + ChatUtils.parseColors(msg));
}
}
ChatBlock.sendBlank(player);
if (!isVerified()) {
return;
}
SettingsManager settings = SimpleClans.getInstance().getSettingsManager();
ChatBlock.sendBlank(player);
ChatBlock.saySingle(player, lang("bulletin.board.header", getName()));
List<String> localBb;
if (maxSize == -1) {
localBb = bb;
maxSize = settings.getInt(BB_SIZE);
} else {
localBb = new ArrayList<>(bb);
}
while (localBb.size() > maxSize) {
localBb.remove(0);
}
for (String msg : localBb) {
if (!sendBbTime(player, msg)) {
String bbPrefix = settings.getColored(BB_PREFIX);
ChatBlock.sendMessage(player, bbPrefix + ChatUtils.parseColors(msg));
}
}
ChatBlock.sendBlank(player);
}
/**
@@ -1428,16 +1352,19 @@ public class Clan implements Serializable, Comparable<Clan> {
if (index < 1) {
return false;
}
String bbPrefix = SimpleClans.getInstance().getSettingsManager().getColored(BB_PREFIX);
long time = (System.currentTimeMillis() - Long.parseLong(msg.substring(0, index))) / 1000L;
String bbAccentColor = SimpleClans.getInstance().getSettingsManager().getColored(BB_ACCENT_COLOR);
String bbColor = SimpleClans.getInstance().getSettingsManager().getColored(BB_COLOR);
msg = ChatUtils.parseColors(bbAccentColor + "* " + bbColor + msg.substring(++index));
TextComponent textComponent = new TextComponent(msg);
textComponent.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, TextComponent.fromLegacyText(
msg = ChatUtils.parseColors(bbPrefix + msg.substring(++index));
BaseComponent[] baseComponent = TextComponent.fromLegacyText(msg);
TextComponent textMessage = new TextComponent(baseComponent);
textMessage.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, TextComponent.fromLegacyText(
Dates.formatTime(time, 1) + lang("bb.ago"))));
player.spigot().sendMessage(textComponent);
player.spigot().sendMessage(textMessage);
return true;
} catch (Throwable rock) {
} catch (Exception rock) {
return false;
}
}
@@ -1454,7 +1381,7 @@ public class Clan implements Serializable, Comparable<Clan> {
List<Clan> clans = SimpleClans.getInstance().getClanManager().getClans();
if (isPermanent() && !force) {
ChatBlock.sendMessage(sender, RED + lang("cannot.disband.permanent"));
ChatBlock.sendMessage(sender, RED + lang("cannot.disband.permanent", sender));
return;
}
@@ -1470,7 +1397,8 @@ public class Clan implements Serializable, Comparable<Clan> {
for (ClanPlayer cp : clanPlayers) {
if (cp.getTag().equals(getTag())) {
cp.setClan(null);
cp.setJoinDate(0);
cp.setRank(null);
if (isVerified()) {
cp.addPastClan(getColorTag() + (cp.isLeader() ? DARK_RED + "*" : ""));
}
@@ -1486,17 +1414,18 @@ public class Clan implements Serializable, Comparable<Clan> {
String disbanded = lang("clan.disbanded");
if (c.removeWarringClan(this)) {
c.addBb(disbanded, AQUA + lang("you.are.no.longer.at.war", c.getName(), getColorTag()));
c.addBb(disbanded, lang("you.are.no.longer.at.war", c.getName(), getColorTag()));
}
if (c.removeRival(getTag())) {
c.addBb(disbanded, AQUA + lang("has.been.disbanded.rivalry.ended", getName()));
c.addBb(disbanded, lang("has.been.disbanded.rivalry.ended", getName()));
}
if (c.removeAlly(getTag())) {
c.addBb(disbanded, AQUA + lang("has.been.disbanded.alliance.ended", getName()));
c.addBb(disbanded, lang("has.been.disbanded.alliance.ended", getName()));
}
}
SimpleClans.getInstance().getRequestManager().removeRequest(getTag());
SimpleClans.getInstance().getServer().getScheduler().scheduleSyncDelayedTask(SimpleClans.getInstance(), () -> {
@@ -1544,7 +1473,7 @@ public class Clan implements Serializable, Comparable<Clan> {
warring.add(targetClan.getTag());
flags.put(WARRING_KEY, warring);
if (requestPlayer != null) {
addBb(requestPlayer.getName(), AQUA + lang("you.are.at.war",
addBb(requestPlayer.getName(), lang("you.are.at.war",
getName(), targetClan.getColorTag()));
}
SimpleClans.getInstance().getStorageManager().updateClan(this);
@@ -1618,6 +1547,8 @@ public class Clan implements Serializable, Comparable<Clan> {
flags.put("homeYaw", home != null ? home.getYaw() : 0);
String world = home != null && home.getWorld() != null ? home.getWorld().getName() : "";
flags.put("homeWorld", world);
String name = SimpleClans.getInstance().getProxyManager().getServerName();
flags.put("homeServer", name);
SimpleClans.getInstance().getStorageManager().updateClan(this);
}
@@ -38,7 +38,7 @@ public class ClanPlayer implements Serializable, Comparable<ClanPlayer> {
private int deaths;
private long lastSeen;
private long joinDate;
private Set<String> pastClans = new HashSet<>();
private final Set<String> pastClans = new LinkedHashSet<>();
private final Map<String, Long> resignTimes = new HashMap<>();
private @Nullable VoteResult vote;
private Flags flags = new Flags(null);
@@ -509,8 +509,7 @@ public class ClanPlayer implements Serializable, Comparable<ClanPlayer> {
}
public String getLastSeenString(@Nullable CommandSender sender) {
Player player = toPlayer();
if (player != null && player.isOnline() && !VanishUtils.isVanished(sender, player)) {
if (!VanishUtils.isVanished(sender, this)) {
return lang("online", sender);
}
return new java.text.SimpleDateFormat("MMM dd, ''yy h:mm a").format(new Date(lastSeen));
@@ -537,10 +536,11 @@ public class ClanPlayer implements Serializable, Comparable<ClanPlayer> {
/**
* (used internally)
*
* @param PackedPastClans the PackedPastClans to set
* @param packedPastClans the packedPastClans to set
*/
public void setPackedPastClans(String PackedPastClans) {
pastClans = Helper.fromArrayToSet(PackedPastClans.split("[|]"));
public void setPackedPastClans(String packedPastClans) {
String[] clans = packedPastClans.split("\\|");
Collections.addAll(pastClans, clans);
}
/**
@@ -823,6 +823,11 @@ public class ClanPlayer implements Serializable, Comparable<ClanPlayer> {
return "";
}
@Placeholder("has_rank")
public boolean hasRank() {
return !getRankId().isEmpty();
}
@Placeholder("rank")
public @NotNull String getRankId() {
return flags.getString("rank", "");
@@ -6,5 +6,5 @@ package net.sacredlabyrinth.phaed.simpleclans;
*/
public enum ClanRequest
{
DEMOTE, PROMOTE, DISBAND, INVITE, CREATE_ALLY, BREAK_RIVALRY, START_WAR, END_WAR
DEMOTE, PROMOTE, DISBAND, INVITE, CREATE_ALLY, BREAK_RIVALRY, START_WAR, END_WAR, RENAME
}
@@ -75,7 +75,9 @@ public class Dates {
}
/**
* @author RoboMWM, LaxWasHere
* <p>
* authors: RoboMWM, LaxWasHere
* </p>
* @param seconds the time in seconds
* @param depth Max amount of detail (e.g. only display days and hours if set to 1 and seconds {@literal >} 1 day)
* @return the string representation of the amount of time labeled as days, hours, minutes, seconds
@@ -1,36 +1,34 @@
package net.sacredlabyrinth.phaed.simpleclans;
import com.google.gson.Gson;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.JSONValue;
import java.util.ArrayList;
import java.util.List;
public class Flags {
private final JSONObject flags;
private static final Gson gson = new Gson();
private final JsonObject flags;
public Flags(@Nullable String json) {
JSONObject flags = null;
if (json != null && !json.isEmpty()) {
flags = (JSONObject) JSONValue.parse(json);
flags = gson.fromJson(json, JsonObject.class);
} else {
flags = new JsonObject();
}
if (flags == null) {
flags = new JSONObject();
}
this.flags = flags;
}
@NotNull
public List<String> getStringList(@NotNull String key) {
Object object = flags.get(key);
JsonElement object = flags.get(key);
ArrayList<String> list = new ArrayList<>();
if (object instanceof JSONArray) {
for (Object o : ((JSONArray) object)) {
list.add(String.valueOf(o));
if (object != null && object.isJsonArray()) {
for (JsonElement element : object.getAsJsonArray()) {
list.add(element.getAsString());
}
}
return list;
@@ -38,11 +36,11 @@ public class Flags {
@Nullable
public String getString(@NotNull String key) {
Object object = flags.get(key);
if (object == null) {
JsonElement element = flags.get(key);
if (element == null || element.isJsonNull()) {
return null;
}
return String.valueOf(object);
return element.getAsString();
}
@NotNull
@@ -56,11 +54,11 @@ public class Flags {
@NotNull
public Number getNumber(@NotNull String key) {
Object object = flags.get(key);
if (object instanceof Number) {
return (Number) object;
JsonElement element = flags.get(key);
if (element == null || element.isJsonNull()) {
return 0;
}
return 0;
return element.getAsNumber();
}
public boolean getBoolean(@NotNull String key) {
@@ -68,26 +66,22 @@ public class Flags {
}
public boolean getBoolean(@NotNull String key, boolean def) {
Object object = flags.get(key);
if (object instanceof Boolean) {
return (Boolean) object;
JsonElement element = flags.get(key);
if (element == null || element.isJsonNull()) {
return def;
}
return def;
return element.getAsBoolean();
}
@SuppressWarnings("unchecked")
public void put(@NotNull String key, @NotNull List<?> value) {
JSONArray array = new JSONArray();
array.addAll(value);
flags.put(key, array);
flags.add(key, gson.toJsonTree(value));
}
@SuppressWarnings("unchecked")
public void put(@NotNull String key, @NotNull Object object) {
flags.put(key, object);
flags.add(key, gson.toJsonTree(object));
}
public String toJSONString() {
return flags.toJSONString();
return flags.toString();
}
}
@@ -1,5 +1,9 @@
package net.sacredlabyrinth.phaed.simpleclans;
import com.google.gson.Gson;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.reflect.TypeToken;
import net.sacredlabyrinth.phaed.simpleclans.managers.PermissionsManager;
import org.bukkit.Location;
import org.bukkit.command.CommandSender;
@@ -7,12 +11,9 @@ import org.bukkit.entity.Player;
import org.jetbrains.annotations.Contract;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;
import java.io.IOException;
import java.lang.reflect.Type;
import java.net.URI;
import java.net.URISyntaxException;
import java.nio.file.FileSystem;
@@ -35,8 +36,11 @@ import static net.sacredlabyrinth.phaed.simpleclans.utils.ChatUtils.stripColors;
* @author phaed
*/
public class Helper {
public final class Helper {
private static final Gson GSON = new Gson();
private static final Type RANKS_TYPE = TypeToken.getParameterized(List.class, Rank.class).getType();
private static final Type RESIGN_TYPE = TypeToken.getParameterized(Map.class, String.class, Long.class).getType();
private Helper() {
}
@@ -55,17 +59,6 @@ public class Helper {
return locale != null ? locale.toLanguageTag() : null;
}
public static @Nullable JSONObject parseJson(String json) {
if (json != null && !json.isEmpty()) {
try {
return (JSONObject) new JSONParser().parse(json);
} catch (ParseException e) {
e.printStackTrace();
}
}
return null;
}
public static Set<Path> getPathsIn(String path, Predicate<? super Path> filter) {
Set<Path> files = new LinkedHashSet<>();
String packagePath = path.replace(".", "/");
@@ -123,47 +116,32 @@ public class Helper {
}
/**
* Parses a list of ranks from the specified JSONObject
* Parses a list of ranks from the specified Json String
*
* @param jo the JSON Object
* @param json the Json String
* @return a list of ranks or null if the JSON String is null/empty
*/
public static @Nullable List<Rank> ranksFromJson(@Nullable JSONObject jo) {
if (jo != null && !jo.isEmpty()) {
Object ranks = jo.get("ranks");
if (ranks != null) {
JSONArray array = (JSONArray) ranks;
List<Rank> rankList = new ArrayList<>();
for (Object o : array) {
JSONObject r = (JSONObject) o;
String name = (String) r.get("name");
String displayName = (String) r.get("displayName");
Set<String> permissions = new HashSet<>();
for (Object p : (JSONArray) r.get("permissions")) {
permissions.add((String) p);
}
Rank rank = new Rank(name, displayName, permissions);
rankList.add(rank);
}
return rankList;
}
public static @Nullable List<Rank> ranksFromJson(@Nullable String json) {
if (json != null && !json.isEmpty()) {
JsonObject object = GSON.fromJson(json, JsonObject.class);
JsonElement ranks = object.get("ranks");
return GSON.fromJson(ranks, RANKS_TYPE);
}
return null;
}
/**
* Parses the default rank from the specified JSONObject
* Parses the default rank from the specified Json String
*
* @param jo the JSON object
* @param json the Json String
* @return the default rank or null if not found and/or it does not exist
*/
public static @Nullable String defaultRankFromJson(@Nullable JSONObject jo) {
if (jo != null && !jo.isEmpty()) {
if (!jo.containsKey("defaultRank")) {
return null;
} else {
return (String) jo.get("defaultRank");
public static @Nullable String defaultRankFromJson(@Nullable String json) {
if (json != null && !json.isEmpty()) {
JsonObject object = GSON.fromJson(json, JsonObject.class);
JsonElement defaultRank = object.get("defaultRank");
if (defaultRank != null && !defaultRank.isJsonNull()) {
return defaultRank.getAsString();
}
}
return null;
@@ -176,36 +154,24 @@ public class Helper {
* @param defaultRank the default rank
* @return a JSON String
*/
@SuppressWarnings("unchecked")
public static String ranksToJson(List<Rank> ranks, @Nullable String defaultRank) {
if (ranks == null)
ranks = new ArrayList<>();
JSONArray array = new JSONArray();
for (Rank rank : ranks) {
JSONObject o = new JSONObject();
o.put("name", rank.getName());
o.put("displayName", rank.getDisplayName());
JSONArray permArray = new JSONArray();
permArray.addAll(rank.getPermissions());
o.put("permissions", permArray);
array.add(o);
}
JSONObject object = new JSONObject();
object.put("ranks", array);
object.put("defaultRank", defaultRank);
return object.toJSONString();
JsonObject object = new JsonObject();
object.add("ranks", GSON.toJsonTree(ranks));
object.addProperty("defaultRank", defaultRank);
return object.toString();
}
/**
* Converts a resign times map to a JSON String
*
* @param resignTimes
* @param resignTimes the resign times
* @return a JSON String
*/
public static String resignTimesToJson(Map<String, Long> resignTimes) {
return JSONObject.toJSONString(resignTimes);
return GSON.toJson(resignTimes);
}
/**
@@ -214,14 +180,9 @@ public class Helper {
* @param json JSON String
* @return a map
*/
@SuppressWarnings("unchecked")
public static @Nullable Map<String, Long> resignTimesFromJson(String json) {
if (json != null) {
try {
return (Map<String, Long>) new JSONParser().parse(json);
} catch (ParseException e) {
e.printStackTrace();
}
if (json != null && !json.isEmpty()) {
return GSON.fromJson(json, RESIGN_TYPE);
}
return null;
}
@@ -283,6 +244,7 @@ public class Helper {
* @param values
* @return
*/
@Deprecated
public static Set<String> fromArrayToSet(String... values) {
HashSet<String> results = new HashSet<>();
Collections.addAll(results, values);
@@ -1,5 +1,7 @@
package net.sacredlabyrinth.phaed.simpleclans;
import org.jetbrains.annotations.Nullable;
import java.util.HashSet;
import java.util.Set;
@@ -15,11 +17,11 @@ public class Rank implements Comparable<Rank> {
public Rank(String name) {
setName(name);
permissions = new HashSet<String>();
permissions = new HashSet<>();
setDisplayName(displayName);
}
public Rank(String name, String displayName, Set<String> permissions) {
public Rank(String name, @Nullable String displayName, Set<String> permissions) {
setName(name);
setDisplayName(displayName);
setPermissions(permissions);
@@ -32,7 +34,7 @@ public class Rank implements Comparable<Rank> {
this.name = name;
}
public void setDisplayName(String displayName) {
public void setDisplayName(@Nullable String displayName) {
if (displayName == null || displayName.isEmpty()) {
displayName = name;
}
@@ -41,7 +43,7 @@ public class Rank implements Comparable<Rank> {
public void setPermissions(Set<String> permissions) {
if (permissions == null) {
permissions = new HashSet<String>();
permissions = new HashSet<>();
}
this.permissions = permissions;
}
@@ -20,8 +20,7 @@ public final class Request {
private ClanPlayer requester;
private int askCount;
public Request(SimpleClans plugin,
ClanRequest type,
public Request(ClanRequest type,
@Nullable List<ClanPlayer> acceptors,
ClanPlayer requester,
String target,
@@ -3,16 +3,20 @@ package net.sacredlabyrinth.phaed.simpleclans;
import co.aikar.commands.BukkitCommandIssuer;
import net.sacredlabyrinth.phaed.simpleclans.commands.SCCommandManager;
import net.sacredlabyrinth.phaed.simpleclans.hooks.papi.SimpleClansExpansion;
import net.sacredlabyrinth.phaed.simpleclans.language.LanguageMigration;
import net.sacredlabyrinth.phaed.simpleclans.language.LanguageResource;
import net.sacredlabyrinth.phaed.simpleclans.listeners.*;
import net.sacredlabyrinth.phaed.simpleclans.loggers.BankLogger;
import net.sacredlabyrinth.phaed.simpleclans.loggers.CSVBankLogger;
import net.sacredlabyrinth.phaed.simpleclans.managers.*;
import net.sacredlabyrinth.phaed.simpleclans.migrations.BbMigration;
import net.sacredlabyrinth.phaed.simpleclans.migrations.ChatFormatMigration;
import net.sacredlabyrinth.phaed.simpleclans.migrations.LanguageMigration;
import net.sacredlabyrinth.phaed.simpleclans.proxy.BungeeManager;
import net.sacredlabyrinth.phaed.simpleclans.proxy.ProxyManager;
import net.sacredlabyrinth.phaed.simpleclans.tasks.*;
import net.sacredlabyrinth.phaed.simpleclans.ui.InventoryController;
import net.sacredlabyrinth.phaed.simpleclans.utils.ChatFormatMigration;
import net.sacredlabyrinth.phaed.simpleclans.utils.ChatUtils;
import net.sacredlabyrinth.phaed.simpleclans.utils.TagValidator;
import net.sacredlabyrinth.phaed.simpleclans.utils.UpdateChecker;
import net.sacredlabyrinth.phaed.simpleclans.uuid.UUIDMigration;
import org.bstats.bukkit.Metrics;
@@ -55,10 +59,12 @@ public class SimpleClans extends JavaPlugin {
private TeleportManager teleportManager;
private ProtectionManager protectionManager;
private ChatManager chatManager;
private ProxyManager proxyManager;
private boolean hasUUID;
private static final Pattern ACF_PLACEHOLDER_PATTERN = Pattern.compile("\\{(?<key>[a-zA-Z]+?)}");
private BankLogger bankLogger;
private TagValidator tagValidator;
/**
* @return the logger
@@ -95,23 +101,27 @@ public class SimpleClans extends JavaPlugin {
instance = this;
new LanguageMigration(this).migrate();
settingsManager = new SettingsManager(this);
new BbMigration(settingsManager);
new ChatFormatMigration(settingsManager);
languageResource = new LanguageResource();
this.hasUUID = UUIDMigration.canReturnUUID();
permissionsManager = new PermissionsManager();
requestManager = new RequestManager();
clanManager = new ClanManager();
proxyManager = new BungeeManager(this);
storageManager = new StorageManager();
teleportManager = new TeleportManager();
protectionManager = new ProtectionManager();
protectionManager.registerListeners();
chatManager = new ChatManager(this);
migrateChatFormat();
registerEvents();
permissionsManager.loadPermissions();
commandManager = new SCCommandManager(this);
bankLogger = new CSVBankLogger(this);
tagValidator = new TagValidator(settingsManager, permissionsManager);
logStatus();
startTasks();
startMetrics();
@@ -137,12 +147,6 @@ public class SimpleClans extends JavaPlugin {
pm.registerEvents(new FriendlyFire(this), this);
}
private void migrateChatFormat() {
ChatFormatMigration chatFormatMigration = new ChatFormatMigration();
chatFormatMigration.migrateAllyChat();
chatFormatMigration.migrateClanChat();
}
private void hookIntoPAPI() {
if (getPluginManager().getPlugin("PlaceholderAPI") != null) {
getLogger().info("PlaceholderAPI found. Registering hook...");
@@ -248,6 +252,10 @@ public class SimpleClans extends JavaPlugin {
return chatManager;
}
public ProxyManager getProxyManager() {
return proxyManager;
}
public BankLogger getBankLogger() {
return bankLogger;
}
@@ -346,4 +354,8 @@ public class SimpleClans extends JavaPlugin {
public void setUUID(boolean trueOrFalse) {
this.hasUUID = trueOrFalse;
}
public TagValidator getTagValidator() {
return tagValidator;
}
}
@@ -2,7 +2,10 @@ package net.sacredlabyrinth.phaed.simpleclans;
import org.jetbrains.annotations.NotNull;
import java.util.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class War {
private final Map<Clan, Integer> clans = new HashMap<>();
@@ -2,12 +2,15 @@ package net.sacredlabyrinth.phaed.simpleclans.chat;
import net.sacredlabyrinth.phaed.simpleclans.SimpleClans;
import net.sacredlabyrinth.phaed.simpleclans.managers.ChatManager;
import net.sacredlabyrinth.phaed.simpleclans.managers.PermissionsManager;
import net.sacredlabyrinth.phaed.simpleclans.managers.SettingsManager;
public interface ChatHandler {
SimpleClans plugin = SimpleClans.getInstance();
SettingsManager settingsManager = plugin.getSettingsManager();
ChatManager chatManager = plugin.getChatManager();
PermissionsManager permissionsManager = plugin.getPermissionsManager();
void sendMessage(SCMessage message);
@@ -23,7 +23,8 @@ public class SCMessage implements Cloneable {
* @param content The content of message
* @param receivers The clan players, who will receive the content
*/
public SCMessage(@NotNull Source source, @NotNull ClanPlayer.Channel channel, @NotNull ClanPlayer sender, String content, @NotNull List<ClanPlayer> receivers) {
public SCMessage(@NotNull Source source, @NotNull ClanPlayer.Channel channel,
@NotNull ClanPlayer sender, String content, @NotNull List<ClanPlayer> receivers) {
this.source = source;
this.channel = channel;
this.sender = sender;
@@ -84,6 +85,6 @@ public class SCMessage implements Cloneable {
* @see ChatHandler initiate the handler
*/
public enum Source {
SPIGOT, DISCORD, BUNGEE
SPIGOT, DISCORD, PROXY
}
}
@@ -15,9 +15,7 @@ import java.util.Optional;
import static net.sacredlabyrinth.phaed.simpleclans.ClanPlayer.Channel.CLAN;
import static net.sacredlabyrinth.phaed.simpleclans.chat.SCMessage.Source;
import static net.sacredlabyrinth.phaed.simpleclans.chat.SCMessage.Source.SPIGOT;
import static net.sacredlabyrinth.phaed.simpleclans.managers.SettingsManager.ConfigField.DISCORDCHAT_ENABLE;
import static net.sacredlabyrinth.phaed.simpleclans.managers.SettingsManager.ConfigField.DISCORDCHAT_FORMAT_TO;
import static org.bukkit.Bukkit.getPluginManager;
/**
* Handles delivering messages from {@link Source#SPIGOT} to {@link Source#DISCORD}.
@@ -37,7 +35,7 @@ public class DiscordChatHandler implements ChatHandler {
if (clan == null) {
return;
}
DiscordHook discordHook = Objects.requireNonNull(chatManager.getDiscordHook(), "DiscordHook cannot be null");
Optional<TextChannel> channel = discordHook.getCachedChannel(clan.getTag());
channel.ifPresent(textChannel -> DiscordUtil.sendMessage(textChannel, formattedMessage));
@@ -45,7 +43,6 @@ public class DiscordChatHandler implements ChatHandler {
@Override
public boolean canHandle(SCMessage.Source source) {
return source == SPIGOT && settingsManager.is(DISCORDCHAT_ENABLE) &&
getPluginManager().getPlugin("DiscordSRV") != null;
return source == SPIGOT && chatManager.isDiscordHookEnabled();
}
}
@@ -0,0 +1,20 @@
package net.sacredlabyrinth.phaed.simpleclans.chat.handlers;
import net.sacredlabyrinth.phaed.simpleclans.chat.ChatHandler;
import net.sacredlabyrinth.phaed.simpleclans.chat.SCMessage;
import net.sacredlabyrinth.phaed.simpleclans.chat.SCMessage.Source;
import static net.sacredlabyrinth.phaed.simpleclans.managers.SettingsManager.ConfigField.PERFORMANCE_USE_BUNGEECORD;
public class ProxyChatHandler implements ChatHandler {
@Override
public void sendMessage(SCMessage message) {
plugin.getProxyManager().sendMessage(message);
}
@Override
public boolean canHandle(Source source) {
return source == Source.SPIGOT && settingsManager.is(PERFORMANCE_USE_BUNGEECORD);
}
}
@@ -8,12 +8,12 @@ import net.sacredlabyrinth.phaed.simpleclans.events.ChatEvent;
import net.sacredlabyrinth.phaed.simpleclans.utils.ChatUtils;
import org.bukkit.scheduler.BukkitRunnable;
import static net.sacredlabyrinth.phaed.simpleclans.chat.SCMessage.Source.DISCORD;
import static net.sacredlabyrinth.phaed.simpleclans.chat.SCMessage.Source.SPIGOT;
import static net.sacredlabyrinth.phaed.simpleclans.chat.SCMessage.Source.*;
import static net.sacredlabyrinth.phaed.simpleclans.managers.SettingsManager.ConfigField;
import static net.sacredlabyrinth.phaed.simpleclans.managers.SettingsManager.ConfigField.DISCORDCHAT_ENABLE;
import static net.sacredlabyrinth.phaed.simpleclans.managers.SettingsManager.ConfigField.PERFORMANCE_USE_BUNGEECORD;
import static org.bukkit.Bukkit.getPluginManager;
@SuppressWarnings("unused")
public class SpigotChatHandler implements ChatHandler {
@Override
@@ -31,10 +31,10 @@ public class SpigotChatHandler implements ChatHandler {
if (event.isCancelled()) {
return;
}
message.setContent(event.getMessage());
message.setContent(stripColorsAndFormatsPerPermission(message.getSender(),event.getMessage()));
ConfigField configField = ConfigField.valueOf(String.format("%sCHAT_FORMAT",
message.getSource() == SPIGOT ? message.getChannel() : message.getSource()));
message.getSource() == DISCORD ? "DISCORD" : message.getChannel()));
String format = settingsManager.getString(configField);
String formattedMessage = chatManager.parseChatFormat(format, message, event.getPlaceholders());
@@ -48,9 +48,27 @@ public class SpigotChatHandler implements ChatHandler {
}.runTask(plugin);
}
private String stripColorsAndFormatsPerPermission(ClanPlayer sender, String message) {
if (!permissionsManager.has(sender.toPlayer(), "simpleclans.member.chat.color")) {
message = stripColors(message);
}
if (!permissionsManager.has(sender.toPlayer(), "simpleclans.member.chat.format")) {
message = stripFormats(message);
}
return message;
}
private String stripColors(String message) {
return message.replaceAll("[§&][0-9a-fA-FxX]", "");
}
private String stripFormats(String message) {
return message.replaceAll("[§&][k-orK-OR]", "");
}
@Override
public boolean canHandle(SCMessage.Source source) {
return source == SPIGOT || (source == DISCORD && settingsManager.is(DISCORDCHAT_ENABLE) &&
getPluginManager().getPlugin("DiscordSRV") != null);
return source == SPIGOT || (source == PROXY && settingsManager.is(PERFORMANCE_USE_BUNGEECORD))
|| (source == DISCORD && chatManager.isDiscordHookEnabled());
}
}
@@ -5,50 +5,51 @@ import net.sacredlabyrinth.phaed.simpleclans.ClanPlayer;
import net.sacredlabyrinth.phaed.simpleclans.chat.ChatHandler;
import net.sacredlabyrinth.phaed.simpleclans.chat.SCMessage;
import net.sacredlabyrinth.phaed.simpleclans.utils.ChatUtils;
import org.bukkit.Bukkit;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
import static net.sacredlabyrinth.phaed.simpleclans.chat.SCMessage.Source;
import static net.sacredlabyrinth.phaed.simpleclans.chat.SCMessage.Source.DISCORD;
import static net.sacredlabyrinth.phaed.simpleclans.chat.SCMessage.Source.SPIGOT;
import static net.sacredlabyrinth.phaed.simpleclans.chat.SCMessage.Source.*;
import static net.sacredlabyrinth.phaed.simpleclans.managers.SettingsManager.ConfigField;
import static net.sacredlabyrinth.phaed.simpleclans.managers.SettingsManager.ConfigField.DISCORDCHAT_ENABLE;
import static org.bukkit.Bukkit.getPluginManager;
import static net.sacredlabyrinth.phaed.simpleclans.managers.SettingsManager.ConfigField.PERFORMANCE_USE_BUNGEECORD;
/**
* Handles delivering messages from {@link Source#SPIGOT} and {@link Source#DISCORD} to internal spy chat.
* Handles delivering messages from {@link Source#SPIGOT} or {@link Source#DISCORD} to internal spy chat.
*/
@SuppressWarnings("unused")
public class SpyChatHandler implements ChatHandler {
@Override
public void sendMessage(SCMessage message) {
ConfigField configField = ConfigField.valueOf(String.format("%sCHAT_SPYFORMAT",
message.getSource() == SPIGOT ? message.getChannel() : message.getSource()));
String format = settingsManager.getString(configField);
ConfigField formatField = ConfigField.valueOf(String.format("%sCHAT_SPYFORMAT",
message.getSource() == DISCORD ? "DISCORD" : message.getChannel()));
String format = settingsManager.getString(formatField);
message.setContent(ChatUtils.stripColors(message.getContent()));
String formattedMessage = chatManager.parseChatFormat(format, message);
List<ClanPlayer> onlinePlayers = getOnlineClanPlayers().stream()
.filter(player -> plugin.getPermissionsManager().has(player.toPlayer(), "simpleclans.admin.all-seeing-eye"))
.filter(player -> !player.isMuted())
.collect(Collectors.toList());
List<ClanPlayer> onlineSpies = getOnlineSpies();
onlinePlayers.removeAll(message.getReceivers());
onlinePlayers.forEach(receiver -> ChatBlock.sendMessage(receiver, formattedMessage));
// Don't send a duplicate message if a spy is inside the clan
onlineSpies.removeAll(message.getReceivers());
onlineSpies.forEach(receiver -> ChatBlock.sendMessage(receiver, formattedMessage));
}
@Override
public boolean canHandle(SCMessage.Source source) {
return source == SPIGOT || (source == DISCORD && settingsManager.is(DISCORDCHAT_ENABLE) &&
getPluginManager().getPlugin("DiscordSRV") != null);
return source == SPIGOT || (source == PROXY && settingsManager.is(PERFORMANCE_USE_BUNGEECORD))
|| (source == DISCORD && chatManager.isDiscordHookEnabled());
}
private List<ClanPlayer> getOnlineClanPlayers() {
return plugin.getClanManager().getAllClanPlayers().stream().
filter(cp -> cp.toPlayer() != null).
private List<ClanPlayer> getOnlineSpies() {
return new ArrayList<>(Bukkit.getOnlinePlayers()).stream().
filter(Objects::nonNull).
filter(player -> permissionsManager.has(player, "simpleclans.admin.all-seeing-eye")).
map(player -> plugin.getClanManager().getCreateClanPlayer(player.getUniqueId())).
filter(Objects::nonNull).
filter(clanPlayer -> !clanPlayer.isMuted()).
collect(Collectors.toList());
}
}
@@ -53,6 +53,7 @@ public class SCCommandManager extends PaperCommandManager {
registerCommands();
registerConditions();
registerCompletions();
defaultHelpPerPage = plugin.getSettingsManager().getInt(HELP_SIZE);
}
private void registerDependencies() {
@@ -218,11 +219,11 @@ public class SCCommandManager extends PaperCommandManager {
SUBCOMMANDS = Arrays.asList("setbanner", "resetkdr", "place", "rank", "home", "war", "regroup",
"mostkilled", "kills", "globalff", "reload", "unban", "ban", "verify", "disband", "resign", "ff",
"clanff", "demote", "promote", "untrust", "trust", "purge", "fee", "bank", "kick", "invite", "toggle",
"modtag", "bb", "clear", "rival", "ally", "add", "remove", "stats", "coords", "vitals", "rivalries",
"modtag", "bb", "display", "clear", "rival", "ally", "add", "remove", "stats", "coords", "vitals", "rivalries",
"alliances", "leaderboard", "allow", "block", "auto", "check", "assign", "unassign", "delete", "me",
"setdisplayname", "permissions", "tag", "deposit", "withdraw", "set", "status", "tp", "all", "everyone",
"lookup", "roster", "profile", "list", "create", "description", "start", "end", "admin", "help", "mod",
"setdefault", "removedefault", "land", "break", "interact", "place_block", "damage", "interact_entity",
"container", "permanent", "take", "give", "join", "leave", "mute", "confirm", "balance", "discord");
"container", "permanent", "take", "give", "join", "leave", "mute", "confirm", "balance", "discord", "rename", "locale");
}
}
@@ -14,8 +14,8 @@ import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import static net.sacredlabyrinth.phaed.simpleclans.SimpleClans.lang;
import static net.sacredlabyrinth.phaed.simpleclans.events.ClanBalanceUpdateEvent.Cause.REVERT;
import static net.sacredlabyrinth.phaed.simpleclans.events.ClanBalanceUpdateEvent.Cause.COMMAND;
import static net.sacredlabyrinth.phaed.simpleclans.events.ClanBalanceUpdateEvent.Cause.REVERT;
import static org.bukkit.ChatColor.AQUA;
import static org.bukkit.ChatColor.RED;
@@ -71,17 +71,15 @@ public class BankCommand extends BaseCommand {
*/
BankOperator operator = new BankOperator(player, permissions.playerGetMoney(player));
switch (clan.withdraw(operator, COMMAND, amount)) {
case SUCCESS:
if (permissions.playerGrantMoney(player, amount)) {
case SUCCESS -> {
if (permissions.grantPlayer(player, amount)) {
player.sendMessage(AQUA + lang("player.clan.withdraw", player, amount));
clan.addBb(player.getName(), AQUA + lang("bb.clan.withdraw", amount, player.getName()));
clan.addBb(player.getName(), lang("bb.clan.withdraw", amount, player.getName()));
} else {
clan.setBalance(operator, REVERT, BankLogger.Operation.WITHDRAW, clan.getBalance() + amount);
}
break;
case NOT_ENOUGH_BALANCE:
player.sendMessage(lang("clan.bank.not.enough.money", player));
break;
}
case NOT_ENOUGH_BALANCE -> player.sendMessage(lang("clan.bank.not.enough.money", player));
}
}
@@ -129,9 +127,9 @@ public class BankCommand extends BaseCommand {
BankOperator operator = new BankOperator(player, permissions.playerGetMoney(player));
EconomyResponse response = clan.deposit(operator, COMMAND, amount);
if (response == EconomyResponse.SUCCESS) {
if (permissions.playerChargeMoney(player, amount)) {
if (permissions.chargePlayer(player, amount)) {
player.sendMessage(AQUA + lang("player.clan.deposit", player, amount));
clan.addBb(player.getName(), AQUA + lang("bb.clan.deposit", amount, player.getName()));
clan.addBb(player.getName(), lang("bb.clan.deposit", amount, player.getName()));
} else {
//Reverts the deposit if something went wrong with Vault
clan.setBalance(operator, REVERT, BankLogger.Operation.DEPOSIT, clan.getBalance() - amount);
@@ -5,13 +5,14 @@ import co.aikar.commands.annotation.*;
import net.sacredlabyrinth.phaed.simpleclans.ChatBlock;
import net.sacredlabyrinth.phaed.simpleclans.Clan;
import net.sacredlabyrinth.phaed.simpleclans.managers.ClanManager;
import net.sacredlabyrinth.phaed.simpleclans.managers.SettingsManager;
import net.sacredlabyrinth.phaed.simpleclans.managers.StorageManager;
import org.bukkit.entity.Player;
import java.util.Objects;
import static net.sacredlabyrinth.phaed.simpleclans.SimpleClans.lang;
import static org.bukkit.ChatColor.*;
import static org.bukkit.ChatColor.RED;
@CommandAlias("%clan")
@Conditions("%basic_conditions|verified")
@@ -21,6 +22,8 @@ public class BbCommand extends BaseCommand {
private ClanManager cm;
@Dependency
private StorageManager storage;
@Dependency
private SettingsManager settings;
@Subcommand("%bb")
@CommandPermission("simpleclans.member.bb")
@@ -46,7 +49,8 @@ public class BbCommand extends BaseCommand {
@Description("{@@command.description.bb.post}")
public void postMessage(Player player, @Name("message") String msg) {
Clan clan = Objects.requireNonNull(cm.getClanByPlayerUniqueId(player.getUniqueId()));
clan.addBb(player.getName(), AQUA + player.getName() + ": " + WHITE + msg);
clan.addBb(lang("bulletin.board.message", player.getName(), msg));
clan.displayBb(player);
storage.updateClan(clan);
}
}
@@ -5,7 +5,6 @@ import co.aikar.commands.annotation.*;
import net.sacredlabyrinth.phaed.simpleclans.ChatBlock;
import net.sacredlabyrinth.phaed.simpleclans.ClanPlayer;
import net.sacredlabyrinth.phaed.simpleclans.managers.ChatManager;
import net.sacredlabyrinth.phaed.simpleclans.managers.SettingsManager;
import net.sacredlabyrinth.phaed.simpleclans.managers.StorageManager;
import static net.sacredlabyrinth.phaed.simpleclans.ClanPlayer.Channel.CLAN;
@@ -10,12 +10,12 @@ import net.sacredlabyrinth.phaed.simpleclans.conversation.SCConversation;
import net.sacredlabyrinth.phaed.simpleclans.events.TagChangeEvent;
import net.sacredlabyrinth.phaed.simpleclans.managers.*;
import net.sacredlabyrinth.phaed.simpleclans.utils.ChatUtils;
import net.sacredlabyrinth.phaed.simpleclans.utils.TagValidator;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import static net.sacredlabyrinth.phaed.simpleclans.SimpleClans.lang;
import static net.sacredlabyrinth.phaed.simpleclans.managers.SettingsManager.ConfigField.*;
@@ -91,9 +91,9 @@ public class ClanCommands extends BaseCommand {
tag = event.getNewTag();
String cleanTag = Helper.cleanTag(tag);
TagValidator validator = new TagValidator(plugin, player, tag);
if (validator.getErrorMessage() != null) {
ChatBlock.sendMessage(player, validator.getErrorMessage());
Optional<String> validationError = plugin.getTagValidator().validate(player, tag);
if (validationError.isPresent()) {
ChatBlock.sendMessage(player, validationError.get());
return;
}
@@ -103,7 +103,7 @@ public class ClanCommands extends BaseCommand {
return;
}
clan.addBb(player.getName(), AQUA + lang("tag.changed.to.0", ChatUtils.parseColors(tag)));
clan.addBb(player.getName(), lang("tag.changed.to.0", ChatUtils.parseColors(tag)));
clan.changeClanTag(tag);
cm.updateDisplayName(player);
}
@@ -132,7 +132,7 @@ public class ClanCommands extends BaseCommand {
@Description("{@@command.description.invite}")
public void invite(Player sender, ClanPlayer cp, Clan clan,
@Conditions("not_banned|not_in_clan|online:ignore_vanished") @Name("player") ClanPlayerInput invited) {
if (!invited.getClanPlayer().isInviteEnabled()){
if (!invited.getClanPlayer().isInviteEnabled()) {
ChatBlock.sendMessage(sender, RED + lang("invitedplayer.invite.off", sender));
return;
}
@@ -193,7 +193,7 @@ public class ClanCommands extends BaseCommand {
}
if (cm.purchaseMemberFeeSet(player)) {
clan.setMemberFee(fee);
clan.addBb(player.getName(), AQUA + lang("bb.fee.set", fee));
clan.addBb(player.getName(), lang("bb.fee.set", fee));
ChatBlock.sendMessage(player, AQUA + lang("fee.set", player));
storage.updateClan(clan);
}
@@ -204,7 +204,7 @@ public class ClanCommands extends BaseCommand {
@Conditions("rank:name=FRIENDLYFIRE")
@Description("{@@command.description.clanff.allow}")
public void allowClanFf(Player player, Clan clan) {
clan.addBb(player.getName(), AQUA + lang("clan.wide.friendly.fire.is.allowed"));
clan.addBb(player.getName(), lang("clan.wide.friendly.fire.is.allowed"));
clan.setFriendlyFire(true);
storage.updateClan(clan);
}
@@ -213,7 +213,7 @@ public class ClanCommands extends BaseCommand {
@CommandPermission("simpleclans.leader.ff")
@Description("{@@command.description.clanff.block}")
public void blockClanFf(Player player, Clan clan) {
clan.addBb(player.getName(), AQUA + lang("clan.wide.friendly.fire.blocked"));
clan.addBb(player.getName(), lang("clan.wide.friendly.fire.blocked"));
clan.setFriendlyFire(false);
storage.updateClan(clan);
}
@@ -252,9 +252,9 @@ public class ClanCommands extends BaseCommand {
if (!issuerClan.reachedRivalLimit()) {
if (!issuerClan.isRival(rivalInput.getTag())) {
issuerClan.addRival(rivalInput);
rivalInput.addBb(player.getName(), AQUA + lang("has.initiated.a.rivalry", issuerClan.getName(),
rivalInput.addBb(player.getName(), lang("has.initiated.a.rivalry", issuerClan.getName(),
rivalInput.getName()), false);
issuerClan.addBb(player.getName(), AQUA + lang("has.initiated.a.rivalry", player.getName(),
issuerClan.addBb(player.getName(), lang("has.initiated.a.rivalry", player.getName(),
rivalInput.getName()));
} else {
ChatBlock.sendMessage(player, RED + lang("your.clans.are.already.rivals", player));
@@ -329,9 +329,9 @@ public class ClanCommands extends BaseCommand {
public void removeAlly(Player player, Clan issuerClan, @Conditions("different|allied_clan") @Name("clan") ClanInput ally) {
Clan allyInput = ally.getClan();
issuerClan.removeAlly(allyInput);
allyInput.addBb(player.getName(), AQUA + lang("has.broken.the.alliance", issuerClan.getName(),
allyInput.addBb(player.getName(), lang("has.broken.the.alliance", issuerClan.getName(),
allyInput.getName()), false);
issuerClan.addBb(player.getName(), AQUA + lang("has.broken.the.alliance", player.getName(),
issuerClan.addBb(player.getName(), lang("has.broken.the.alliance", player.getName(),
allyInput.getName()));
}
@@ -354,7 +354,7 @@ public class ClanCommands extends BaseCommand {
return;
}
clan.addBb(sender.getName(), AQUA + lang("has.been.kicked.by", clanPlayer.getName(),
clan.addBb(sender.getName(), lang("has.been.kicked.by", clanPlayer.getName(),
sender.getName(), sender));
clan.removePlayerFromClan(clanPlayer.getUniqueId());
}
@@ -365,11 +365,11 @@ public class ClanCommands extends BaseCommand {
@HelpSearchTags("leave")
public void resignConfirm(Player player, ClanPlayer cp, Clan clan) {
if (clan.isPermanent() || !clan.isLeader(player) || clan.getLeaders().size() > 1) {
clan.addBb(player.getName(), AQUA + lang("0.has.resigned", player.getName()));
clan.addBb(player.getName(), lang("0.has.resigned", player.getName()));
cp.addResignTime(clan.getTag());
clan.removePlayerFromClan(player.getUniqueId());
ChatBlock.sendMessage(cp,AQUA + lang("resign.success", player));
ChatBlock.sendMessage(cp, AQUA + lang("resign.success", player));
} else if (clan.isLeader(player) && clan.getLeaders().size() == 1) {
clan.disband(player, true, false);
ChatBlock.sendMessage(cp, RED + lang("clan.has.been.disbanded", player, clan.getName()));
@@ -4,12 +4,14 @@ import co.aikar.commands.BaseCommand;
import co.aikar.commands.annotation.*;
import net.sacredlabyrinth.phaed.simpleclans.*;
import net.sacredlabyrinth.phaed.simpleclans.events.HomeRegroupEvent;
import net.sacredlabyrinth.phaed.simpleclans.events.PlayerHomeClearEvent;
import net.sacredlabyrinth.phaed.simpleclans.events.PlayerHomeSetEvent;
import net.sacredlabyrinth.phaed.simpleclans.managers.ClanManager;
import net.sacredlabyrinth.phaed.simpleclans.managers.PermissionsManager;
import net.sacredlabyrinth.phaed.simpleclans.managers.ProtectionManager;
import net.sacredlabyrinth.phaed.simpleclans.managers.SettingsManager;
import net.sacredlabyrinth.phaed.simpleclans.utils.VanishUtils;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.entity.Player;
@@ -59,17 +61,12 @@ public class HomeCommands extends BaseCommand {
@CommandPermission("simpleclans.leader.regroup.home")
@Conditions("rank:name=REGROUP_HOME")
@Description("{@@command.description.regroup.home}")
public void regroupHome(Player player, ClanPlayer cp, Clan clan) {
public void regroupHome(Player player, ClanPlayer cp, @Conditions("can_teleport") Clan clan) {
if (!settings.is(ALLOW_REGROUP)) {
ChatBlock.sendMessage(player, RED + lang("insufficient.permissions", player));
return;
}
Location location = clan.getHomeLocation();
if (location == null) {
ChatBlock.sendMessage(player, RED + lang("hombase.not.set", player));
return;
}
processRegroup(player, cp, clan, location);
}
@@ -77,14 +74,9 @@ public class HomeCommands extends BaseCommand {
@CommandPermission("simpleclans.member.home")
@Conditions("rank:name=HOME_TP")
@Description("{@@command.description.home.tp}")
public void teleport(Player player, Clan clan, ClanPlayer cp) {
public void teleport(Player player, @Conditions("can_teleport") Clan clan, ClanPlayer cp) {
Location homeLocation = clan.getHomeLocation();
if (homeLocation == null) {
ChatBlock.sendMessage(player, RED + lang("hombase.not.set", player));
return;
}
if (cm.purchaseHomeTeleport(player)) {
plugin.getTeleportManager().addPlayer(player, homeLocation, clan.getName());
}
@@ -94,13 +86,19 @@ public class HomeCommands extends BaseCommand {
@CommandPermission("simpleclans.leader.home-set")
@Conditions("rank:name=HOME_SET")
@Description("{@@command.description.home.clear}")
public void clear(Player player, Clan clan) {
public void clear(Player player, ClanPlayer cp, Clan clan) {
if (settings.is(CLAN_HOMEBASE_CAN_BE_SET_ONLY_ONCE) && clan.getHomeLocation() != null &&
!permissions.has(player, "simpleclans.mod.home")) {
ChatBlock.sendMessage(player, RED + lang("home.base.only.once", player));
return;
}
PlayerHomeClearEvent event = new PlayerHomeClearEvent(clan, cp);
Bukkit.getPluginManager().callEvent(event);
if (event.isCancelled()) {
return;
}
clan.setHomeLocation(null);
ChatBlock.sendMessage(player, AQUA + lang("hombase.cleared", player));
}
@@ -18,7 +18,7 @@ import static net.sacredlabyrinth.phaed.simpleclans.managers.SettingsManager.Con
@CommandAlias("%clan")
@Subcommand("%land")
@Conditions("%basic_conditions|land_sharing|own_land")
@Conditions("%basic_conditions|clan_member|land_sharing|own_land")
@CommandPermission("simpleclans.member.land")
public class LandCommand extends BaseCommand {
@@ -49,7 +49,7 @@ public class LandCommand extends BaseCommand {
cp.allow(action, land.getId());
}
if (notify) {
ChatBlock.sendMessageKey(cp.toPlayer(), "land.allowed.action");
ChatBlock.sendMessageKey(cp, "land.allowed.action");
}
}
@@ -118,7 +118,7 @@ public class LandCommand extends BaseCommand {
cp.disallow(action, land.getId());
}
if (notify) {
ChatBlock.sendMessageKey(cp.toPlayer(), "land.blocked.action");
ChatBlock.sendMessageKey(cp, "land.blocked.action");
}
}
@@ -2,10 +2,7 @@ package net.sacredlabyrinth.phaed.simpleclans.commands.clan;
import co.aikar.commands.BaseCommand;
import co.aikar.commands.annotation.*;
import net.sacredlabyrinth.phaed.simpleclans.ChatBlock;
import net.sacredlabyrinth.phaed.simpleclans.Clan;
import net.sacredlabyrinth.phaed.simpleclans.ClanPlayer;
import net.sacredlabyrinth.phaed.simpleclans.SimpleClans;
import net.sacredlabyrinth.phaed.simpleclans.*;
import net.sacredlabyrinth.phaed.simpleclans.commands.ClanPlayerInput;
import net.sacredlabyrinth.phaed.simpleclans.conversation.DisbandPrompt;
import net.sacredlabyrinth.phaed.simpleclans.conversation.SCConversation;
@@ -18,8 +15,10 @@ import org.bukkit.entity.Player;
import java.util.Objects;
import static net.sacredlabyrinth.phaed.simpleclans.SimpleClans.lang;
import static net.sacredlabyrinth.phaed.simpleclans.events.EconomyTransactionEvent.Cause.DISCORD_CREATION;
import static net.sacredlabyrinth.phaed.simpleclans.managers.SettingsManager.ConfigField.*;
import static org.bukkit.ChatColor.*;
import static org.bukkit.ChatColor.AQUA;
import static org.bukkit.ChatColor.RED;
@CommandAlias("%clan")
@Conditions("%basic_conditions|leader")
@@ -63,7 +62,7 @@ public class LeaderCommands extends BaseCommand {
player));
return;
}
clan.addBb(player.getName(), AQUA + lang("demoted.back.to.member", otherCp.getName()));
clan.addBb(player.getName(), lang("demoted.back.to.member", otherCp.getName()));
clan.demote(otherCp.getUniqueId());
}
@@ -90,13 +89,13 @@ public class LeaderCommands extends BaseCommand {
return;
}
if (settings.is(CLAN_CONFIRMATION_FOR_PROMOTE) && clan.getLeaders().size() > 1) {
requestManager.addPromoteRequest(cp, otherPl.getName(), clan);
requestManager.requestAllLeaders(cp, ClanRequest.PROMOTE, otherPl.getName(), "asking.for.the.promotion", otherPl.getName());
ChatBlock.sendMessage(player, AQUA + lang("promotion.vote.has.been.requested.from.all.leaders",
player));
return;
}
clan.addBb(player.getName(), AQUA + lang("promoted.to.leader", otherPl.getName()));
clan.addBb(player.getName(), lang("promoted.to.leader", otherPl.getName()));
clan.promote(otherPl.getUniqueId());
}
@@ -105,7 +104,7 @@ public class LeaderCommands extends BaseCommand {
@Description("{@@command.description.disband}")
public void disband(Player player, ClanPlayer cp, Clan clan) {
if (clan.getLeaders().size() != 1) {
requestManager.addDisbandRequest(cp, clan);
requestManager.requestAllLeaders(cp, ClanRequest.DISBAND, clan.getTag(), "asking.to.disband");
ChatBlock.sendMessage(player, AQUA +
lang("clan.disband.vote.has.been.requested.from.all.leaders", player));
return;
@@ -133,7 +132,7 @@ public class LeaderCommands extends BaseCommand {
}
if (cm.purchaseVerification(player)) {
clan.verifyClan();
clan.addBb(player.getName(), AQUA + lang("clan.0.has.been.verified", clan.getName()));
clan.addBb(player.getName(), lang("clan.0.has.been.verified", clan.getName()));
ChatBlock.sendMessage(player, AQUA + lang("the.clan.has.been.verified", player));
}
}
@@ -156,7 +155,7 @@ public class LeaderCommands extends BaseCommand {
ChatBlock.sendMessage(player, ChatColor.RED + lang("this.player.is.already.trusted", player));
return;
}
clan.addBb(player.getName(), AQUA + lang("has.been.given.trusted.status.by", trustedInput.getName(),
clan.addBb(player.getName(), lang("has.been.given.trusted.status.by", trustedInput.getName(),
player.getName()));
trustedInput.setTrusted(true);
storage.updateClanPlayer(trustedInput);
@@ -181,12 +180,34 @@ public class LeaderCommands extends BaseCommand {
return;
}
clan.addBb(player.getName(), AQUA + lang("has.been.given.untrusted.status.by", trustedInput.getName(),
clan.addBb(player.getName(), lang("has.been.given.untrusted.status.by", trustedInput.getName(),
player.getName()));
trustedInput.setTrusted(false);
storage.updateClanPlayer(trustedInput);
}
@Subcommand("%rename")
@CommandPermission("simpleclans.leader.rename")
@CommandCompletion("@nothing")
@Description("{@@command.description.rename}")
public void rename(ClanPlayer cp, Clan clan, @Name("name") String clanName) {
if (clanName.contains("&")) {
ChatBlock.sendMessageKey(cp, "your.clan.name.cannot.contain.color.codes");
return;
}
if (clan.getLeaders().size() != 1) {
requestManager.requestAllLeaders(cp, ClanRequest.RENAME, "asking.to.rename", clanName);
ChatBlock.sendMessageKey(cp, "rename.vote.has.been.requested.from.all.leaders");
return;
}
clan.setName(clanName);
storage.updateClan(clan);
ChatBlock.sendMessageKey(cp, "you.have.successfully.renamed.your.clan", clanName);
}
@Subcommand("%discord %create")
@CommandPermission("simpleclans.leader.discord.create")
@Description("{@@command.description.discord.create}")
@@ -198,14 +219,14 @@ public class LeaderCommands extends BaseCommand {
return;
}
double amount = settings.getDouble(ECONOMY_DISCORD_CREATION_PRICE);
if (settings.is(ECONOMY_PURCHASE_DISCORD_CREATE)) {
double amount = settings.getDouble(ECONOMY_DISCORD_CREATION_PRICE);
if (!permissions.playerHasMoney(player, amount)) {
player.sendMessage(AQUA + lang("not.sufficient.money", player, amount));
return;
}
if (!permissions.playerChargeMoney(player, amount)) {
if (!permissions.chargePlayer(player, amount, DISCORD_CREATION)) {
return;
}
}
@@ -214,6 +235,10 @@ public class LeaderCommands extends BaseCommand {
discordHook.createChannel(clan.getTag());
ChatBlock.sendMessageKey(player, "discord.created.successfully");
} catch (DiscordHookException ex) {
// Return player's money if clan creation went wrong
if (settings.is(ECONOMY_PURCHASE_DISCORD_CREATE)) {
permissions.grantPlayer(player, amount, DISCORD_CREATION);
}
String messageKey = ex.getMessageKey();
if (messageKey != null) {
ChatBlock.sendMessage(player, RED + lang(messageKey));
@@ -0,0 +1,31 @@
package net.sacredlabyrinth.phaed.simpleclans.commands.completions;
import net.sacredlabyrinth.phaed.simpleclans.SimpleClans;
import net.sacredlabyrinth.phaed.simpleclans.language.LanguageResource;
import org.jetbrains.annotations.NotNull;
import java.util.Collection;
import java.util.List;
@SuppressWarnings("unused")
public class LocaleCompletion extends AbstractStaticCompletion {
private final List<String> availableLocales;
public LocaleCompletion(@NotNull SimpleClans plugin) {
super(plugin);
availableLocales = LanguageResource.getAvailableLocales().stream().
map(locale -> locale.toLanguageTag().replace("-", "_")).
toList();
}
@Override
public @NotNull Collection<String> getCompletions() {
return availableLocales;
}
@Override
public @NotNull String getId() {
return "locales";
}
}
@@ -1,6 +1,9 @@
package net.sacredlabyrinth.phaed.simpleclans.commands.conditions;
import co.aikar.commands.*;
import co.aikar.commands.BukkitCommandIssuer;
import co.aikar.commands.ConditionContext;
import co.aikar.commands.ConditionFailedException;
import co.aikar.commands.InvalidCommandArgument;
import net.sacredlabyrinth.phaed.simpleclans.Clan;
import net.sacredlabyrinth.phaed.simpleclans.ClanPlayer;
import net.sacredlabyrinth.phaed.simpleclans.SimpleClans;
@@ -0,0 +1,42 @@
package net.sacredlabyrinth.phaed.simpleclans.commands.conditions;
import co.aikar.commands.*;
import net.sacredlabyrinth.phaed.simpleclans.Clan;
import net.sacredlabyrinth.phaed.simpleclans.Flags;
import net.sacredlabyrinth.phaed.simpleclans.SimpleClans;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
import static net.sacredlabyrinth.phaed.simpleclans.SimpleClans.lang;
public class TeleportCondition extends AbstractParameterCondition<Clan> {
public TeleportCondition(@NotNull SimpleClans plugin) {
super(plugin);
}
@Override
public Class<Clan> getType() {
return Clan.class;
}
@Override
public void validateCondition(ConditionContext<BukkitCommandIssuer> context,
BukkitCommandExecutionContext execContext,
Clan value) throws InvalidCommandArgument {
Player player = execContext.getPlayer();
if (value.getHomeLocation() == null) {
throw new ConditionFailedException(lang("hombase.not.set", player));
}
Flags flags = new Flags(value.getFlags());
String homeServer = flags.getString("homeServer", "");
if (!homeServer.isEmpty() && !plugin.getProxyManager().getServerName().equals(homeServer)) {
throw new ConditionFailedException(lang("home.set.in.different.server"));
}
}
@Override
public @NotNull String getId() {
return "can_teleport";
}
}
@@ -0,0 +1,31 @@
package net.sacredlabyrinth.phaed.simpleclans.commands.conditions;
import co.aikar.commands.BukkitCommandExecutionContext;
import co.aikar.commands.BukkitCommandIssuer;
import co.aikar.commands.ConditionContext;
import co.aikar.commands.InvalidCommandArgument;
import net.sacredlabyrinth.phaed.simpleclans.SimpleClans;
import net.sacredlabyrinth.phaed.simpleclans.commands.ClanInput;
import org.jetbrains.annotations.NotNull;
public class TeleportInputCondition extends AbstractParameterCondition<ClanInput> {
public TeleportInputCondition(@NotNull SimpleClans plugin) {
super(plugin);
}
@Override
public Class<ClanInput> getType() {
return ClanInput.class;
}
@Override
public void validateCondition(ConditionContext<BukkitCommandIssuer> context, BukkitCommandExecutionContext execContext, ClanInput value) throws InvalidCommandArgument {
new TeleportCondition(plugin).validateCondition(context, execContext, value.getClan());
}
@Override
public @NotNull String getId() {
return "can_teleport";
}
}
@@ -4,7 +4,6 @@ import net.sacredlabyrinth.phaed.simpleclans.*;
import net.sacredlabyrinth.phaed.simpleclans.utils.ChatUtils;
import net.sacredlabyrinth.phaed.simpleclans.utils.VanishUtils;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
import java.util.List;
@@ -35,10 +34,8 @@ public class ClanRoster extends Sendable {
List<ClanPlayer> members = clan.getNonLeaders();
plugin.getClanManager().sortClanPlayersByLastSeen(members);
for (ClanPlayer cp : members) {
Player p = cp.toPlayer();
String name = (cp.isTrusted() ? sm.getColored(PAGE_TRUSTED_COLOR) : sm.getColored(PAGE_UNTRUSTED_COLOR)) + cp.getName();
String lastSeen = p != null && p.isOnline() && !VanishUtils.isVanished(sender, p) ? GREEN + lang("online", sender) : WHITE + cp.getLastSeenDaysString(sender);
String lastSeen = VanishUtils.isVanished(sender, cp) ? WHITE + cp.getLastSeenDaysString(sender) : GREEN + lang("online", sender);
chatBlock.addRow(" " + name, YELLOW + ChatUtils.parseColors(cp.getRankDisplayName()) + RESET, lastSeen);
}
@@ -48,11 +45,9 @@ public class ClanRoster extends Sendable {
List<ClanPlayer> leaders = clan.getLeaders();
plugin.getClanManager().sortClanPlayersByLastSeen(leaders);
for (ClanPlayer cp : leaders) {
Player p = cp.toPlayer();
String name = sm.getColored(PAGE_LEADER_COLOR) + cp.getName();
String lastSeen = p != null && p.isOnline() && !VanishUtils.isVanished(sender, p) ? GREEN + lang("online", sender)
: WHITE + cp.getLastSeenDaysString(sender);
String lastSeen = VanishUtils.isVanished(sender, cp) ? WHITE + cp.getLastSeenDaysString(sender) :
GREEN + lang("online", sender);
chatBlock.addRow(" " + name, YELLOW + ChatUtils.parseColors(cp.getRankDisplayName()) + RESET, lastSeen);
}
@@ -6,6 +6,7 @@ import net.sacredlabyrinth.phaed.simpleclans.Helper;
import net.sacredlabyrinth.phaed.simpleclans.SimpleClans;
import net.sacredlabyrinth.phaed.simpleclans.utils.KDRFormat;
import net.sacredlabyrinth.phaed.simpleclans.utils.RankingNumberResolver;
import net.sacredlabyrinth.phaed.simpleclans.utils.VanishUtils;
import org.bukkit.command.CommandSender;
import org.jetbrains.annotations.NotNull;
@@ -37,7 +38,7 @@ public class Leaderboard extends Sendable {
private void addLines() {
for (ClanPlayer cp : clanPlayers) {
boolean online = cp.toPlayer() != null;
boolean online = !VanishUtils.isVanished(cp);
String name = (cp.isLeader() ? sm.getColored(PAGE_LEADER_COLOR) : (cp.isTrusted() ? sm.getColored(PAGE_TRUSTED_COLOR) :
sm.getColored(PAGE_UNTRUSTED_COLOR))) + cp.getName();
@@ -5,22 +5,22 @@ import co.aikar.commands.CommandHelp;
import co.aikar.commands.CommandParameter;
import co.aikar.commands.HelpEntry;
import co.aikar.commands.annotation.*;
import net.sacredlabyrinth.phaed.simpleclans.ChatBlock;
import net.sacredlabyrinth.phaed.simpleclans.Clan;
import net.sacredlabyrinth.phaed.simpleclans.ClanPlayer;
import net.sacredlabyrinth.phaed.simpleclans.SimpleClans;
import net.sacredlabyrinth.phaed.simpleclans.*;
import net.sacredlabyrinth.phaed.simpleclans.commands.ClanInput;
import net.sacredlabyrinth.phaed.simpleclans.commands.ClanPlayerInput;
import net.sacredlabyrinth.phaed.simpleclans.commands.data.*;
import net.sacredlabyrinth.phaed.simpleclans.conversation.CreateClanTagPrompt;
import net.sacredlabyrinth.phaed.simpleclans.conversation.RequestCanceller;
import net.sacredlabyrinth.phaed.simpleclans.conversation.ResetKdrPrompt;
import net.sacredlabyrinth.phaed.simpleclans.conversation.SCConversation;
import net.sacredlabyrinth.phaed.simpleclans.events.PlayerResetKdrEvent;
import net.sacredlabyrinth.phaed.simpleclans.managers.ClanManager;
import net.sacredlabyrinth.phaed.simpleclans.managers.RequestManager;
import net.sacredlabyrinth.phaed.simpleclans.managers.SettingsManager;
import net.sacredlabyrinth.phaed.simpleclans.managers.StorageManager;
import net.sacredlabyrinth.phaed.simpleclans.ui.InventoryDrawer;
import net.sacredlabyrinth.phaed.simpleclans.ui.frames.MainFrame;
import org.bukkit.Bukkit;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
@@ -52,7 +52,6 @@ public class GeneralCommands extends BaseCommand {
@Default
@Description("{@@command.description.clan}")
@CommandAlias("%clan")
@HelpSearchTags("menu gui interface ui")
public void main(CommandSender sender) {
if (sender instanceof Player && settings.is(ENABLE_GUI)) {
@@ -63,6 +62,17 @@ public class GeneralCommands extends BaseCommand {
}
}
@Subcommand("%locale")
@CommandPermission("simpleclans.anyone.locale")
@Description("{@@command.description.locale}")
@CommandCompletion("@locales")
public void locale(ClanPlayer cp, @Values("@locales") @Name("locale") String locale) {
cp.setLocale(Helper.forLanguageTag(locale.replace("_", "-")));
plugin.getStorageManager().updateClanPlayer(cp);
ChatBlock.sendMessage(cp, lang("locale.has.been.changed"));
}
@Subcommand("%create")
@CommandPermission("simpleclans.leader.create")
@Description("{@@command.description.create}")
@@ -157,17 +167,30 @@ public class GeneralCommands extends BaseCommand {
ChatBlock.sendMessage(player, AQUA + lang("friendy.fire.is.now.managed.by.your.clan", player));
}
@Subcommand("%resetkdr %confirm")
@CommandPermission("simpleclans.vip.resetkdr")
@Description("{@@command.description.resetkdr}")
public void resetKdrConfirm(Player player, ClanPlayer cp) {
if (!settings.is(ALLOW_RESET_KDR)) {
ChatBlock.sendMessage(player, RED + lang("disabled.command", player));
return;
}
PlayerResetKdrEvent event = new PlayerResetKdrEvent(cp);
Bukkit.getServer().getPluginManager().callEvent(event);
if (!event.isCancelled() && cm.purchaseResetKdr(player)) {
cm.resetKdr(cp);
ChatBlock.sendMessage(player, RED + lang("you.have.reseted.your.kdr", player));
}
}
@Subcommand("%resetkdr")
@CommandPermission("simpleclans.vip.resetkdr")
@Description("{@@command.description.resetkdr}")
public void resetKdr(Player player, ClanPlayer cp) {
if (!settings.is(ALLOW_RESET_KDR)) {
ChatBlock.sendMessage(player, RED + lang("disabled.command", player));
return;
}
if (cm.purchaseResetKdr(player)) {
cm.resetKdr(cp);
ChatBlock.sendMessage(player, RED + lang("you.have.reseted.your.kdr", player));
} else {
new SCConversation(plugin, player, new ResetKdrPrompt(cm), 60).begin();
}
}
@@ -47,7 +47,7 @@ public class BankCommand extends BaseCommand {
switch (economyResponse) {
case SUCCESS:
ChatBlock.sendMessage(sender, AQUA + lang("clan.admin.take", sender, amount, clan.getName()));
clan.addBb(sender.getName(), AQUA + lang("bb.clan.take", sender, amount, sender.getName()));
clan.addBb(sender.getName(), lang("bb.clan.take", sender, amount, sender.getName()));
break;
case NOT_ENOUGH_BALANCE:
sender.sendMessage(RED + lang("clan.admin.bank.not.enough.money", sender, clan.getName()));
@@ -67,7 +67,7 @@ public class BankCommand extends BaseCommand {
EconomyResponse economyResponse = clan.deposit(operator, ClanBalanceUpdateEvent.Cause.COMMAND, amount);
if (economyResponse == EconomyResponse.SUCCESS) {
ChatBlock.sendMessage(sender, AQUA + lang("clan.admin.give", sender, amount, clan.getName()));
clan.addBb(sender.getName(), AQUA + lang("bb.clan.give", sender, amount, sender.getName()));
clan.addBb(sender.getName(), lang("bb.clan.give", sender, amount, sender.getName()));
}
}
@@ -83,7 +83,7 @@ public class BankCommand extends BaseCommand {
EconomyResponse response = clan.setBalance(operator, ClanBalanceUpdateEvent.Cause.COMMAND, BankLogger.Operation.SET, amount);
if (response == EconomyResponse.SUCCESS) {
ChatBlock.sendMessage(sender, AQUA + lang("clan.admin.set", sender, clan.getName(), amount));
clan.addBb(sender.getName(), AQUA + lang("bb.clan.set", sender, amount, sender.getName()));
clan.addBb(sender.getName(), lang("bb.clan.set", sender, amount, sender.getName()));
}
}
}
@@ -1,26 +1,17 @@
package net.sacredlabyrinth.phaed.simpleclans.commands.staff;
import org.bukkit.entity.Player;
import co.aikar.commands.BaseCommand;
import co.aikar.commands.annotation.CommandAlias;
import co.aikar.commands.annotation.CommandPermission;
import co.aikar.commands.annotation.Conditions;
import co.aikar.commands.annotation.Default;
import co.aikar.commands.annotation.Dependency;
import co.aikar.commands.annotation.Description;
import co.aikar.commands.annotation.Name;
import co.aikar.commands.annotation.Subcommand;
import co.aikar.commands.annotation.*;
import net.sacredlabyrinth.phaed.simpleclans.ChatBlock;
import net.sacredlabyrinth.phaed.simpleclans.Clan;
import net.sacredlabyrinth.phaed.simpleclans.commands.ClanInput;
import net.sacredlabyrinth.phaed.simpleclans.managers.ClanManager;
import net.sacredlabyrinth.phaed.simpleclans.managers.SettingsManager;
import net.sacredlabyrinth.phaed.simpleclans.managers.StorageManager;
import org.bukkit.entity.Player;
import static org.bukkit.ChatColor.RED;
import static org.bukkit.ChatColor.AQUA;
import static org.bukkit.ChatColor.WHITE;
import static net.sacredlabyrinth.phaed.simpleclans.SimpleClans.lang;
import static org.bukkit.ChatColor.RED;
@CommandAlias("%clan")
@Conditions("%basic_conditions")
@@ -31,9 +22,13 @@ public class BbCommand extends BaseCommand {
private StorageManager storage;
@Dependency
private ClanManager cm;
@Default
@Dependency
private SettingsManager settings;
@Subcommand("%display")
@CommandPermission("simpleclans.mod.bb")
@CommandCompletion("@clans")
@Description("{@@command.description.mod.bb.display}")
public void display(Player sender, @Name("clan") ClanInput input) {
input.getClan().displayBb(sender);
@@ -41,6 +36,7 @@ public class BbCommand extends BaseCommand {
@Subcommand("%clear")
@CommandPermission("simpleclans.mod.bb-clear")
@CommandCompletion("@clans")
@Description("{@@command.description.mod.bb.clear}")
public void clear(Player player, @Name("clan") ClanInput input) {
input.getClan().clearBb();
@@ -49,10 +45,12 @@ public class BbCommand extends BaseCommand {
@Subcommand("%add")
@CommandPermission("simpleclans.mod.bb-add")
@CommandCompletion("@clans @nothing")
@Description("{@@command.description.mod.bb.post}")
public void postMessage(Player player, @Name("clan") ClanInput input, @Name("message") String msg) {
Clan clan = input.getClan();
clan.addBb(player.getName(), AQUA + player.getName() + ": " + WHITE + msg);
clan.addBb(lang("bulletin.board.message", player.getName(), msg));
clan.displayBb(player);
storage.updateClan(clan);
}
@@ -5,6 +5,8 @@ import co.aikar.commands.annotation.*;
import net.sacredlabyrinth.phaed.simpleclans.*;
import net.sacredlabyrinth.phaed.simpleclans.commands.ClanInput;
import net.sacredlabyrinth.phaed.simpleclans.commands.ClanPlayerInput;
import net.sacredlabyrinth.phaed.simpleclans.events.PlayerHomeSetEvent;
import net.sacredlabyrinth.phaed.simpleclans.events.PlayerResetKdrEvent;
import net.sacredlabyrinth.phaed.simpleclans.events.TagChangeEvent;
import net.sacredlabyrinth.phaed.simpleclans.language.LanguageResource;
import net.sacredlabyrinth.phaed.simpleclans.managers.ClanManager;
@@ -21,6 +23,7 @@ import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import java.util.Objects;
import java.util.Optional;
import java.util.UUID;
import static net.sacredlabyrinth.phaed.simpleclans.SimpleClans.lang;
@@ -64,14 +67,14 @@ public class StaffCommands extends BaseCommand {
ChatBlock.sendMessage(sender, RED + lang("you.cannot.move.the.last.leader", sender));
return;
} else {
oldClan.addBb(oldCp.getName(), AQUA + lang("0.has.resigned", oldCp.getName()));
oldClan.addBb(oldCp.getName(), lang("0.has.resigned", oldCp.getName()));
oldClan.removePlayerFromClan(uuid);
}
}
ClanPlayer cp = cm.getCreateClanPlayer(uuid);
newClan.addBb(AQUA + lang("joined.the.clan", cp.getName()));
newClan.addBb(lang("joined.the.clan", cp.getName()));
cm.serverAnnounce(lang("has.joined", cp.getName(), newClan.getName()));
newClan.addPlayerToClan(cp);
}
@@ -89,9 +92,9 @@ public class StaffCommands extends BaseCommand {
tag = event.getNewTag();
String cleanTag = Helper.cleanTag(tag);
TagValidator validator = new TagValidator(plugin, player, tag);
if (validator.getErrorMessage() != null) {
ChatBlock.sendMessage(player, validator.getErrorMessage());
Optional<String> validationError = plugin.getTagValidator().validate(player, tag);
if (validationError.isPresent()) {
ChatBlock.sendMessage(player, validationError.get());
return;
}
@@ -101,7 +104,7 @@ public class StaffCommands extends BaseCommand {
return;
}
clan.addBb(player.getName(), AQUA + lang("tag.changed.to.0", ChatUtils.parseColors(tag)));
clan.addBb(player.getName(), lang("tag.changed.to.0", ChatUtils.parseColors(tag)));
clan.changeClanTag(tag);
player.sendMessage(lang("0.tag.changed.to.1", player, clan.getTag(), tag));
}
@@ -127,11 +130,18 @@ public class StaffCommands extends BaseCommand {
@CommandPermission("simpleclans.mod.home")
@CommandCompletion("@clans")
@Description("{@@command.description.mod.home.set}")
public void homeSet(Player player, @Name("clan") ClanInput clan) {
public void homeSet(Player player, ClanPlayer cp, @Name("clan") ClanInput clanInput) {
Location loc = player.getLocation();
Clan clan = clanInput.getClan();
clan.getClan().setHomeLocation(loc);
ChatBlock.sendMessage(player, AQUA + lang("hombase.mod.set", player, clan.getClan().getName()) + " " +
PlayerHomeSetEvent event = new PlayerHomeSetEvent(clan, cp, loc);
Bukkit.getPluginManager().callEvent(event);
if (event.isCancelled()) {
return;
}
clan.setHomeLocation(loc);
ChatBlock.sendMessage(player, AQUA + lang("hombase.mod.set", player, clan.getName()) + " " +
ChatColor.YELLOW + Helper.toLocationString(loc));
}
@@ -139,14 +149,7 @@ public class StaffCommands extends BaseCommand {
@CommandCompletion("@clans:has_home")
@CommandPermission("simpleclans.mod.hometp")
@Description("{@@command.description.mod.home.tp}")
public void homeTp(Player player, @Name("clan") ClanInput clan) {
Location loc = clan.getClan().getHomeLocation();
if (loc == null) {
ChatBlock.sendMessage(player, ChatColor.RED + lang("hombase.not.set", player));
return;
}
public void homeTp(Player player, @Name("clan") @Conditions("can_teleport") ClanInput clan) {
plugin.getTeleportManager().teleportToHome(player, clan.getClan());
}
@@ -225,7 +228,7 @@ public class StaffCommands extends BaseCommand {
if (!clanInput.isVerified()) {
clanInput.verifyClan();
clanInput.addBb(sender.getName(), AQUA + lang("clan.0.has.been.verified", clanInput.getName()));
clanInput.addBb(sender.getName(), lang("clan.0.has.been.verified", clanInput.getName()));
ChatBlock.sendMessage(sender, AQUA + lang("the.clan.has.been.verified", sender));
} else {
ChatBlock.sendMessage(sender, RED + lang("the.clan.is.already.verified", sender));
@@ -262,7 +265,7 @@ public class StaffCommands extends BaseCommand {
return;
}
clan.addBb(sender.getName(), AQUA + lang("has.been.kicked.by", clanPlayer.getName(),
clan.addBb(sender.getName(), lang("has.been.kicked.by", clanPlayer.getName(),
sender.getName(), sender));
clan.removePlayerFromClan(clanPlayer.getUniqueId());
}
@@ -293,7 +296,7 @@ public class StaffCommands extends BaseCommand {
return;
}
clan.addBb(sender.getName(), AQUA + lang("promoted.to.leader", promotePl.getName()));
clan.addBb(sender.getName(), lang("promoted.to.leader", promotePl.getName()));
clan.promote(promotePl.getUniqueId());
ChatBlock.sendMessage(sender, AQUA + lang("player.successfully.promoted", sender));
}
@@ -316,7 +319,7 @@ public class StaffCommands extends BaseCommand {
return;
}
clan.demote(otherCp.getUniqueId());
clan.addBb(sender.getName(), AQUA + lang("demoted.back.to.member", otherCp.getName()));
clan.addBb(sender.getName(), lang("demoted.back.to.member", otherCp.getName()));
ChatBlock.sendMessage(sender, AQUA + lang("player.successfully.demoted", sender));
}
@@ -325,7 +328,11 @@ public class StaffCommands extends BaseCommand {
@Description("{@@command.description.resetkdr.everyone}")
public void resetKdr(CommandSender sender) {
for (ClanPlayer cp : cm.getAllClanPlayers()) {
cm.resetKdr(cp);
PlayerResetKdrEvent event = new PlayerResetKdrEvent(cp);
Bukkit.getServer().getPluginManager().callEvent(event);
if (!event.isCancelled()) {
cm.resetKdr(cp);
}
}
ChatBlock.sendMessage(sender, RED + lang("you.have.reseted.kdr.of.all.players", sender));
}
@@ -334,20 +341,49 @@ public class StaffCommands extends BaseCommand {
@CommandCompletion("@players")
@CommandPermission("simpleclans.admin.resetkdr")
@Description("{@@command.description.resetkdr.player}")
public void resetKdr(CommandSender sender, @Name("player") ClanPlayerInput player) {
ClanPlayer cp = player.getClanPlayer();
cm.resetKdr(cp);
ChatBlock.sendMessage(sender, RED + lang("you.have.reseted.0.kdr", sender, cp.getName()));
public void resetKdr(CommandSender sender, @Name("player") ClanPlayerInput clanPlayer) {
ClanPlayer cp = clanPlayer.getClanPlayer();
PlayerResetKdrEvent event = new PlayerResetKdrEvent(cp);
Bukkit.getServer().getPluginManager().callEvent(event);
if (!event.isCancelled()) {
cm.resetKdr(cp);
ChatBlock.sendMessage(sender, RED + lang("you.have.reseted.0.kdr", sender, cp.getName()));
}
}
@Subcommand("%admin %permanent")
@CommandCompletion("@clans")
@CommandPermission("simpleclans.admin.permanent")
@Description("{@@command.description.admin.permanent}")
public void togglePermanent(CommandSender sender, @Name("clan") ClanInput clan) {
boolean permanent = !clan.getClan().isPermanent();
clan.getClan().setPermanent(permanent);
clan.getClan().addBb(sender.getName(), lang((permanent) ? "permanent.status.enabled" : "permanent.status.disabled", sender.getName()));
ChatBlock.sendMessage(sender, AQUA + lang("you.have.toggled.permanent.status", sender, clan.getClan().getName()));
public void togglePermanent(CommandSender sender, @Name("clan") ClanInput clanInput) {
Clan clan = clanInput.getClan();
boolean permanent = !clan.isPermanent();
clan.setPermanent(permanent);
clan.addBb(sender.getName(), lang((permanent) ? "permanent.status.enabled" : "permanent.status.disabled", sender.getName()));
ChatBlock.sendMessage(sender, AQUA + lang("you.have.toggled.permanent.status", sender, clan.getName()));
}
@Subcommand("%mod %rename")
@CommandCompletion("@clans @nothing")
@CommandPermission("simpleclans.mod.rename")
@Description("{@@command.description.mod.rename}")
public void rename(CommandSender sender, @Name("clan") ClanInput clanInput, @Name("name") String clanName) {
Clan clan = clanInput.getClan();
clan.setName(clanName);
storage.updateClan(clan);
ChatBlock.sendMessageKey(sender, "you.have.successfully.renamed.the.clan", clanName);
}
@Subcommand("%mod %locale")
@CommandPermission("simpleclans.mod.locale")
@Description("{@@command.description.mod.locale}")
@CommandCompletion("@locales")
public void locale(CommandSender sender, @Name("player") ClanPlayerInput input, @Values("@locales") @Name("locale") String locale) {
ClanPlayer cp = input.getClanPlayer();
cp.setLocale(Helper.forLanguageTag(locale.replace("_", "-")));
plugin.getStorageManager().updateClanPlayer(cp);
ChatBlock.sendMessage(sender, lang("locale.has.been.changed"));
}
}
@@ -66,8 +66,7 @@ public class CreateClanNamePrompt extends StringPrompt {
plugin.getClanManager().createClan(player, tag, name);
Clan clan = plugin.getClanManager().getClan(tag);
clan.addBb(player.getName(), AQUA +
lang("clan.created", name));
clan.addBb(player.getName(), lang("clan.created", name));
plugin.getStorageManager().updateClan(clan);
if (plugin.getSettingsManager().is(REQUIRE_VERIFICATION)) {
@@ -2,7 +2,6 @@ package net.sacredlabyrinth.phaed.simpleclans.conversation;
import net.sacredlabyrinth.phaed.simpleclans.SimpleClans;
import net.sacredlabyrinth.phaed.simpleclans.utils.ChatUtils;
import net.sacredlabyrinth.phaed.simpleclans.utils.TagValidator;
import org.bukkit.ChatColor;
import org.bukkit.conversations.ConversationContext;
import org.bukkit.conversations.Prompt;
@@ -11,6 +10,8 @@ import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.Optional;
import static net.sacredlabyrinth.phaed.simpleclans.SimpleClans.lang;
public class CreateClanTagPrompt extends StringPrompt {
@@ -52,12 +53,7 @@ public class CreateClanTagPrompt extends StringPrompt {
lang("clan.with.this.tag.already.exists", player), this);
}
TagValidator validator = new TagValidator(plugin, player, clanTag);
String errorMessage = validator.getErrorMessage();
if (errorMessage == null) {
return null;
} else {
return new MessagePromptImpl(errorMessage, this);
}
Optional<String> validationError = plugin.getTagValidator().validate(player, clanTag);
return validationError.map(error -> new MessagePromptImpl(error, this)).orElse(null);
}
}
@@ -11,6 +11,10 @@ public class DisbandPrompt extends ConfirmationPrompt {
@Override
protected Prompt confirm(ClanPlayer sender, Clan clan) {
if (clan.isPermanent()) {
return new MessagePromptImpl(RED + lang("cannot.disband.permanent", sender));
}
clan.disband(sender.toPlayer(), true, false);
return new MessagePromptImpl(RED + lang("clan.has.been.disbanded", sender, clan.getName()));
}
@@ -0,0 +1,43 @@
package net.sacredlabyrinth.phaed.simpleclans.conversation;
import net.sacredlabyrinth.phaed.simpleclans.Clan;
import net.sacredlabyrinth.phaed.simpleclans.ClanPlayer;
import net.sacredlabyrinth.phaed.simpleclans.events.PlayerResetKdrEvent;
import net.sacredlabyrinth.phaed.simpleclans.managers.ClanManager;
import org.bukkit.Bukkit;
import org.bukkit.conversations.Prompt;
import static net.sacredlabyrinth.phaed.simpleclans.SimpleClans.lang;
import static org.bukkit.ChatColor.RED;
public class ResetKdrPrompt extends ConfirmationPrompt {
private final ClanManager cm;
public ResetKdrPrompt(ClanManager cm) {
this.cm = cm;
}
@Override
protected Prompt confirm(ClanPlayer sender, Clan clan) {
PlayerResetKdrEvent event = new PlayerResetKdrEvent(sender);
Bukkit.getPluginManager().callEvent(event);
if (!event.isCancelled() && cm.purchaseResetKdr(sender.toPlayer())) {
cm.resetKdr(sender);
return new MessagePromptImpl(RED + lang("you.have.reseted.your.kdr", sender));
} else {
return END_OF_CONVERSATION;
}
}
@Override
protected String getPromptTextKey() {
return "resetkdr.confirmation";
}
@Override
protected String getDeclineTextKey() {
return "resetkdr.request.cancelled";
}
}
@@ -16,7 +16,7 @@ public class ResignPrompt extends ConfirmationPrompt {
@Override
protected Prompt confirm(ClanPlayer sender, Clan clan) {
if (clan.isPermanent() || !sender.isLeader() || clan.getLeaders().size() > 1) {
clan.addBb(sender.getName(), AQUA + lang("0.has.resigned", sender.getName()));
clan.addBb(sender.getName(), lang("0.has.resigned", sender.getName()));
sender.addResignTime(clan.getTag());
clan.removePlayerFromClan(sender.getUniqueId());
@@ -1,7 +1,6 @@
package net.sacredlabyrinth.phaed.simpleclans.events;
import net.sacredlabyrinth.phaed.simpleclans.Clan;
import org.bukkit.Bukkit;
import org.bukkit.command.CommandSender;
import org.bukkit.event.Event;
@@ -0,0 +1,96 @@
package net.sacredlabyrinth.phaed.simpleclans.events;
import net.sacredlabyrinth.phaed.simpleclans.managers.PermissionsManager;
import org.bukkit.OfflinePlayer;
import org.bukkit.event.Cancellable;
import org.bukkit.event.Event;
import org.bukkit.event.HandlerList;
import org.jetbrains.annotations.NotNull;
/**
* This event is fired when money is granted or charged from a player's account.
* <p>Note: Cancelling this event will deny the transaction.</p>
*
* @see PermissionsManager#grantPlayer(OfflinePlayer, double, Cause)
* @see PermissionsManager#chargePlayer(OfflinePlayer, double, Cause)
*/
public class EconomyTransactionEvent extends Event implements Cancellable {
private static final HandlerList handlers = new HandlerList();
private final OfflinePlayer player;
private double amount;
private final Cause cause;
private final TransactionType transactionType;
private boolean cancelled;
public EconomyTransactionEvent(@NotNull OfflinePlayer affected, double amount,
@NotNull Cause cause, @NotNull TransactionType transactionType) {
this.player = affected;
this.amount = amount;
this.cause = cause;
this.transactionType = transactionType;
}
public OfflinePlayer getPlayer() {
return player;
}
public double getAmount() {
return amount;
}
public void setAmount(double amount) {
this.amount = amount;
}
@NotNull
public Cause getCause() {
return cause;
}
@SuppressWarnings("unused")
public TransactionType getTransactionType() {
return transactionType;
}
@Override
public @NotNull HandlerList getHandlers() {
return handlers;
}
public static HandlerList getHandlerList() {
return handlers;
}
@Override
public boolean isCancelled() {
return cancelled;
}
/**
* If cancelled, the transaction will result as denied.
*/
@Override
public void setCancelled(boolean cancelled) {
this.cancelled = cancelled;
}
public enum Cause {
CLAN_CREATION,
CLAN_VERIFICATION,
CLAN_INVITATION,
CLAN_REGROUP,
CLAN_HOME_TELEPORT,
CLAN_HOME_TELEPORT_SET,
DISCORD_CREATION,
PLAYER_KILLED,
MEMBER_FEE_SET,
RESET_KDR
}
public enum TransactionType {
DEPOSIT, WITHDRAW
}
}
@@ -5,8 +5,6 @@
*/
package net.sacredlabyrinth.phaed.simpleclans.events;
import java.util.Collections;
import java.util.List;
import net.sacredlabyrinth.phaed.simpleclans.Clan;
import net.sacredlabyrinth.phaed.simpleclans.ClanPlayer;
import org.bukkit.Location;
@@ -14,6 +12,9 @@ import org.bukkit.event.Cancellable;
import org.bukkit.event.Event;
import org.bukkit.event.HandlerList;
import java.util.Collections;
import java.util.List;
/**
*
* @author edson
@@ -50,12 +51,16 @@ public class HomeRegroupEvent extends Event implements Cancellable {
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;
@@ -0,0 +1,51 @@
package net.sacredlabyrinth.phaed.simpleclans.events;
import net.sacredlabyrinth.phaed.simpleclans.Clan;
import net.sacredlabyrinth.phaed.simpleclans.ClanPlayer;
import org.bukkit.event.Cancellable;
import org.bukkit.event.Event;
import org.bukkit.event.HandlerList;
import org.jetbrains.annotations.NotNull;
public class PlayerHomeClearEvent extends Event implements Cancellable {
private static final HandlerList HANDLER_LIST = new HandlerList();
private final Clan clan;
private final ClanPlayer cp;
private boolean cancelled;
public PlayerHomeClearEvent(Clan clan, ClanPlayer cp) {
this.clan = clan;
this.cp = cp;
}
public Clan getClan() {
return clan;
}
public ClanPlayer getCp() {
return cp;
}
@Override
public boolean isCancelled() {
return cancelled;
}
@Override
public void setCancelled(boolean cancel) {
this.cancelled = cancel;
}
@NotNull
@Override
public HandlerList getHandlers() {
return HANDLER_LIST;
}
public static HandlerList getHandlerList() {
return HANDLER_LIST;
}
}
@@ -0,0 +1,56 @@
package net.sacredlabyrinth.phaed.simpleclans.events;
import net.sacredlabyrinth.phaed.simpleclans.ClanPlayer;
import org.bukkit.event.Cancellable;
import org.bukkit.event.Event;
import org.bukkit.event.HandlerList;
import org.jetbrains.annotations.NotNull;
/**
* @author ThiagoROX
*/
public class PlayerResetKdrEvent extends Event implements Cancellable {
private static final HandlerList handlers = new HandlerList();
private final ClanPlayer clanPlayer;
private boolean cancelled;
/**
* Event called before a player's kill death rate is reset
*
* @param clanPlayer The ClanPlayer whose kill death rate going to be reset
*/
public PlayerResetKdrEvent(@NotNull ClanPlayer clanPlayer) {
this.clanPlayer = clanPlayer;
}
/**
* Gets the player whose kill death rate going to be reset
*
* @return The player whose kill death rate going to be reset
*/
@NotNull
public ClanPlayer getClanPlayer() {
return clanPlayer;
}
@Override
public boolean isCancelled() {
return cancelled;
}
@Override
public void setCancelled(boolean cancelled) {
this.cancelled = cancelled;
}
@Override
public HandlerList getHandlers() {
return handlers;
}
public static HandlerList getHandlerList() {
return handlers;
}
}
@@ -70,16 +70,13 @@ public class DiscordHook implements Listener {
private static final int MAX_CHANNELS_PER_CATEGORY = 50;
private static final int MAX_CHANNELS_PER_GUILD = 500;
private final SimpleClans plugin;
private final SettingsManager settingsManager;
private final ChatManager chatManager;
private final ClanManager clanManager;
private final AccountLinkManager accountManager = DiscordSRV.getPlugin().getAccountLinkManager();
private final Guild guild = DiscordSRV.getPlugin().getMainGuild();
private final List<String> textCategories;
private final List<String> discordClanTags;
private final List<String> clanTags;
private final Role leaderRole;
private final List<String> whitelist;
@@ -89,14 +86,15 @@ public class DiscordHook implements Listener {
settingsManager = plugin.getSettingsManager();
chatManager = plugin.getChatManager();
clanManager = plugin.getClanManager();
textCategories = settingsManager.getStringList(DISCORDCHAT_TEXT_CATEGORY_IDS).stream().
filter(this::categoryExists).collect(Collectors.toList());
whitelist = settingsManager.getStringList(DISCORDCHAT_TEXT_WHITELIST);
clanTags = clanManager.getClans().stream().map(Clan::getTag).collect(Collectors.toList());
discordClanTags = getCachedChannels().stream().map(GuildChannel::getName).collect(Collectors.toList());
leaderRole = getLeaderRole();
setupDiscord();
}
@@ -260,9 +258,12 @@ public class DiscordHook implements Listener {
}
protected void setupDiscord() {
clearChannels();
resetPermissions();
createChannels();
Map<String, TextChannel> discordTagChannels = getCachedChannels().stream().
collect(Collectors.toMap(TextChannel::getName, textChannel -> textChannel));
clearChannels(discordTagChannels);
resetPermissions(discordTagChannels);
createChannels(discordTagChannels);
}
@NotNull
@@ -352,7 +353,6 @@ public class DiscordHook implements Listener {
* <p>Sets positive {@link Permission#VIEW_CHANNEL} permission to all linked clan members.</p>
*
* @param clanTag the clan tag
*
* @throws InvalidChannelException clan is not verified or permanent,
* no one member is linked or clan is not in the whitelist.
* @throws ChannelExistsException if channel is already exist
@@ -396,10 +396,8 @@ public class DiscordHook implements Listener {
* Retrieves channel in SimpleClans categories.
*
* @param channelName the channel name
*
* @see #getCachedCategories() retreive categories.
*
* @return the channel
* @see #getCachedCategories() retreive categories.
*/
public Optional<TextChannel> getCachedChannel(@NotNull String channelName) {
return getCachedChannels().stream().filter(textChannel -> textChannel.getName().equals(channelName)).findFirst();
@@ -409,9 +407,8 @@ public class DiscordHook implements Listener {
* Checks if a category can be obtained by id.
*
* @param categoryId the category id
* @see #channelExists(String)
*
* @return true if the category exists
* @see #channelExists(String)
*/
public boolean categoryExists(String categoryId) {
return guild.getCategoryById(categoryId) != null;
@@ -423,7 +420,18 @@ public class DiscordHook implements Listener {
* @see #categoryExists(String)
*/
public boolean channelExists(String clanTag) {
return getChannels().stream().map(TextChannel::getName).anyMatch(name -> name.equals(clanTag));
return getChannel(clanTag).isPresent();
}
/**
* Retrieves the channel in SimpleClans categories.
*
* @param channelName the channel name
* @return the channel
* @see #getCachedChannel(String) retreive the <b>cached</b> channel.
*/
public Optional<TextChannel> getChannel(@NotNull String channelName) {
return getChannels().stream().filter(textChannel -> textChannel.getName().equals(channelName)).findAny();
}
/**
@@ -431,18 +439,20 @@ public class DiscordHook implements Listener {
* If there are no channels, removes category as well.
*
* @param channelName the channel name
*
* @return true, if channel was deleted and false if not.
*/
@SuppressWarnings("UnusedReturnValue")
public boolean deleteChannel(@NotNull String channelName) {
boolean deleted = false;
if (channelExists(channelName)) {
for (Category category : getCachedCategories()) {
if (category.getTextChannels().size() > 0) {
for (TextChannel textChannel : category.getTextChannels()) {
if (textChannel.getName().equals(channelName)) {
textChannel.delete().complete();
return true;
deleted = true;
break;
}
}
@@ -452,6 +462,8 @@ public class DiscordHook implements Listener {
settingsManager.save();
category.delete().complete();
}
return deleted;
}
}
}
@@ -502,51 +514,54 @@ public class DiscordHook implements Listener {
return DiscordUtil.getMemberById(discordId);
}
private void clearChannels() {
private void clearChannels(Map<String, TextChannel> discordTagChannels) {
// Removes abandoned channels
ArrayList<String> clansToDelete = new ArrayList<>(discordClanTags);
ArrayList<String> clansToDelete = new ArrayList<>(discordTagChannels.keySet());
clansToDelete.removeAll(clanTags);
clansToDelete.forEach(this::deleteChannel);
clansToDelete.forEach(clanChannel -> {
deleteChannel(clanChannel);
discordTagChannels.remove(clanChannel);
});
// Removes invalid channels
for (String clanTag : clanTags) {
Iterator<String> iterator = discordTagChannels.keySet().iterator();
while (iterator.hasNext()) {
String clanChannel = iterator.next();
try {
validateChannel(clanTag);
validateChannel(clanChannel);
} catch (InvalidChannelException ex) {
SimpleClans.debug(ex.getMessage());
deleteChannel(clanTag);
deleteChannel(clanChannel);
iterator.remove();
} catch (ChannelExistsException | ChannelsLimitException ex) {
SimpleClans.debug(ex.getMessage());
}
}
}
private void resetPermissions() {
getCachedChannels().stream().
map(TextChannel::getMemberPermissionOverrides).
flatMap(Collection::stream).
filter(permissionOverride -> !Objects.equals(permissionOverride.getPermissionHolder(), guild.getPublicRole())).
filter(permissionOverride -> !Objects.equals(permissionOverride.getMember(), guild.getSelfMember())).
forEach(permissionOverride -> permissionOverride.delete().queue());
private void resetPermissions(Map<String, TextChannel> discordClanChannels) {
for (Map.Entry<String, TextChannel> channelEntry : discordClanChannels.entrySet()) {
TextChannel channel = channelEntry.getValue();
Clan clan = clanManager.getClan(channelEntry.getKey());
Map<ClanPlayer, Member> discordPlayers = getDiscordPlayers(clan);
clanTags.stream().map(clanManager::getClan).
filter(Objects::nonNull).
map(Clan::getMembers).
flatMap(Collection::stream).
forEach(clanPlayer -> {
Member member = getMember(clanPlayer);
Clan clan = clanPlayer.getClan();
if (member != null && clan != null) {
updateViewPermission(member, clan, ADD);
}
});
for (Member member : discordPlayers.values()) {
PermissionOverride override = channel.getPermissionOverride(member);
if (override != null) {
override.delete().queue(afterSuccess -> updateViewPermission(member, channel, ADD));
}
}
}
}
private void createChannels() {
private void createChannels(Map<String, TextChannel> discordClanChannels) {
if (!settingsManager.is(DISCORDCHAT_AUTO_CREATION)) {
return;
}
// Removes already used discord channels from creation
clanTags.removeAll(discordClanChannels.keySet());
for (String clan : clanTags) {
try {
createChannel(clan);
@@ -622,24 +637,32 @@ public class DiscordHook implements Listener {
}
}
private void updateViewPermission(@Nullable Member member, @NotNull GuildChannel channel, @NotNull DiscordAction action) {
if (member == null) {
return;
}
if (action == ADD) {
channel.upsertPermissionOverride(member).
setPermissions(Collections.singletonList(VIEW_CHANNEL), Collections.emptyList()).queue();
} else {
channel.getManager().removePermissionOverride(member).queue();
}
}
private void updateViewPermission(@NotNull Member member, @NotNull Clan clan, DiscordAction action) {
Optional<TextChannel> channel = getCachedChannel(clan.getTag());
String tag = clan.getTag();
Optional<TextChannel> channel = getCachedChannel(tag).map(Optional::of).orElse(getChannel(tag));
if (channel.isPresent()) {
TextChannel textChannel = channel.get();
if (action == ADD) {
textChannel.upsertPermissionOverride(member).
setPermissions(Collections.singletonList(VIEW_CHANNEL), Collections.emptyList()).queue();
} else {
textChannel.getManager().removePermissionOverride(member).queue();
}
updateViewPermission(member, textChannel, action);
}
}
@SuppressWarnings("BooleanMethodIsAlwaysInverted")
private boolean createChannelSilently(ClanPlayer clanPlayer) {
Clan clan = clanPlayer.getClan();
if (clan == null) {
if (clan == null || !settingsManager.is(DISCORDCHAT_AUTO_CREATION)) {
return false;
}
@@ -1,5 +1,6 @@
package net.sacredlabyrinth.phaed.simpleclans.hooks.protection;
import net.sacredlabyrinth.phaed.simpleclans.SimpleClans;
import org.bukkit.Location;
import org.bukkit.OfflinePlayer;
import org.bukkit.World;
@@ -12,6 +13,10 @@ import java.util.Set;
public interface ProtectionProvider {
default void register() {
SimpleClans.getInstance().getProtectionManager().registerProvider(this);
}
void setup() throws LinkageError, Exception;
@NotNull
@@ -4,25 +4,34 @@ import me.ryanhamshire.GriefPrevention.Claim;
import me.ryanhamshire.GriefPrevention.DataStore;
import me.ryanhamshire.GriefPrevention.GriefPrevention;
import me.ryanhamshire.GriefPrevention.events.ClaimCreatedEvent;
import me.ryanhamshire.GriefPrevention.events.ClaimResizeEvent;
import net.sacredlabyrinth.phaed.simpleclans.ClanPlayer;
import net.sacredlabyrinth.phaed.simpleclans.SimpleClans;
import net.sacredlabyrinth.phaed.simpleclans.hooks.protection.Coordinate;
import net.sacredlabyrinth.phaed.simpleclans.hooks.protection.Land;
import net.sacredlabyrinth.phaed.simpleclans.hooks.protection.ProtectionProvider;
import net.sacredlabyrinth.phaed.simpleclans.managers.ClanManager;
import net.sacredlabyrinth.phaed.simpleclans.managers.ProtectionManager;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.OfflinePlayer;
import org.bukkit.World;
import org.bukkit.entity.Player;
import org.bukkit.event.Event;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.*;
@SuppressWarnings("unused")
public class GriefPreventionProvider implements ProtectionProvider {
public class GriefPreventionProvider implements ProtectionProvider, Listener {
@Override
public void setup() {
Bukkit.getPluginManager().registerEvents(this, SimpleClans.getInstance());
}
@Override
@@ -104,4 +113,25 @@ public class GriefPreventionProvider implements ProtectionProvider {
return Bukkit.getOfflinePlayer(claim.getOwnerName()).getUniqueId();
}
}
@EventHandler(ignoreCancelled = true, priority = EventPriority.MONITOR)
private void onResize(ClaimResizeEvent event) {
ClanManager clanManager = SimpleClans.getInstance().getClanManager();
Land originalLand = getLand(event.getFrom());
Land newLand = getLand(event.getTo());
if (originalLand == null || newLand == null) {
return;
}
for (UUID owner : originalLand.getOwners()) {
ClanPlayer cp = clanManager.getAnyClanPlayer(owner);
if (cp == null) continue;
for (ProtectionManager.Action action : ProtectionManager.Action.values()) {
if (cp.isAllowed(action, originalLand.getId())) {
cp.disallow(action, originalLand.getId());
cp.allow(action, newLand.getId());
}
}
}
}
}
@@ -1,6 +1,5 @@
package net.sacredlabyrinth.phaed.simpleclans.hooks.protection.providers;
import com.sk89q.worldedit.math.BlockVector2;
import com.sk89q.worldguard.bukkit.WorldGuardPlugin;
import com.sk89q.worldguard.protection.ApplicableRegionSet;
import com.sk89q.worldguard.protection.managers.RegionManager;
@@ -26,14 +25,20 @@ public class WorldGuard6Provider implements ProtectionProvider {
private WorldGuardPlugin worldGuard;
private Method getRegionManager;
private Method getApplicableRegions;
private Method getPoints;
private Method getX;
private Method getZ;
@SuppressWarnings("JavaReflectionMemberAccess")
@Override
public void setup() throws NoSuchMethodException {
public void setup() throws NoSuchMethodException, ClassNotFoundException {
worldGuard = WorldGuardPlugin.inst();
getRegionManager = worldGuard.getClass().getMethod("getRegionManager", World.class);
//noinspection JavaReflectionMemberAccess
getApplicableRegions = RegionManager.class.getMethod("getApplicableRegions", Location.class);
getPoints = ProtectedRegion.class.getMethod("getPoints");
Class<?> blockVector = Class.forName("com.sk89q.worldedit.BlockVector2");
getX = blockVector.getMethod("getX");
getZ = blockVector.getMethod("getZ");
}
private @Nullable RegionManager getRegionManager(@Nullable World world) {
@@ -56,14 +61,27 @@ public class WorldGuard6Provider implements ProtectionProvider {
@NotNull
private Land getLand(ProtectedRegion region) {
//noinspection DuplicatedCode - TODO Extract to common WorldGuard interface?
List<Coordinate> coordinates = new ArrayList<>();
for (BlockVector2 point : region.getPoints()) {
coordinates.add(new Coordinate(point.getX(), point.getZ()));
}
List<Coordinate> coordinates = getCoordinates(region);
return new Land(getIdPrefix() + region.getId(), region.getOwners().getUniqueIds(), coordinates);
}
@NotNull
private List<Coordinate> getCoordinates(ProtectedRegion region) {
List<Coordinate> coordinates = new ArrayList<>();
try {
List<?> points = (List<?>) getPoints.invoke(region);
for (Object point : points) {
double x = (double) getX.invoke(point);
double z = (double) getZ.invoke(point);
coordinates.add(new Coordinate(x, z));
}
} catch (ReflectiveOperationException ex) {
ex.printStackTrace();
}
return coordinates;
}
@Override
public @NotNull Set<Land> getLandsAt(@NotNull Location location) {
HashSet<Land> lands = new HashSet<>();
@@ -1,33 +1,38 @@
package net.sacredlabyrinth.phaed.simpleclans.listeners;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Player;
import org.bukkit.entity.Projectile;
import org.bukkit.entity.TNTPrimed;
import org.bukkit.event.entity.EntityDamageByEntityEvent;
import org.bukkit.event.entity.EntityDamageEvent;
import org.jetbrains.annotations.Contract;
import org.jetbrains.annotations.Nullable;
public class Events {
public final class Events {
private Events() {}
private Events() {
// Can't instantiate this class
}
@Nullable
@Contract("null -> null")
public static Player getAttacker(@Nullable EntityDamageEvent parentEvent) {
if (parentEvent instanceof EntityDamageByEntityEvent) {
EntityDamageByEntityEvent sub = (EntityDamageByEntityEvent) parentEvent;
if (parentEvent instanceof EntityDamageByEntityEvent sub) {
Entity damager = sub.getDamager();
if (sub.getDamager() instanceof Player) {
return (Player) sub.getDamager();
if (damager instanceof Player attacker) {
return attacker;
}
if (sub.getDamager() instanceof Projectile) {
Projectile projectile = (Projectile) sub.getDamager();
if (projectile.getShooter() instanceof Player) {
return (Player) projectile.getShooter();
}
if (damager instanceof Projectile projectile && projectile.getShooter() instanceof Player attacker) {
return attacker;
}
if (damager instanceof TNTPrimed tnt && tnt.getSource() instanceof Player attacker) {
return attacker;
}
}
return null;
}
@@ -15,7 +15,8 @@ import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
import static net.sacredlabyrinth.phaed.simpleclans.managers.SettingsManager.ConfigField.*;
import static net.sacredlabyrinth.phaed.simpleclans.managers.SettingsManager.ConfigField.GLOBAL_FRIENDLY_FIRE;
import static net.sacredlabyrinth.phaed.simpleclans.managers.SettingsManager.ConfigField.SAFE_CIVILIANS;
public class FriendlyFire extends SCListener {
@@ -16,18 +16,30 @@ import org.bukkit.block.BlockState;
import org.bukkit.block.DoubleChest;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Player;
import org.bukkit.event.*;
import org.bukkit.entity.Tameable;
import org.bukkit.entity.Vehicle;
import org.bukkit.event.Cancellable;
import org.bukkit.event.Event;
import org.bukkit.event.Event.Result;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.block.BlockBreakEvent;
import org.bukkit.event.block.BlockPlaceEvent;
import org.bukkit.event.entity.EntityChangeBlockEvent;
import org.bukkit.event.entity.EntityDamageByEntityEvent;
import org.bukkit.event.hanging.HangingBreakByEntityEvent;
import org.bukkit.event.hanging.HangingPlaceEvent;
import org.bukkit.event.inventory.InventoryOpenEvent;
import org.bukkit.event.player.PlayerInteractEntityEvent;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.event.player.*;
import org.bukkit.event.vehicle.VehicleDestroyEvent;
import org.bukkit.event.vehicle.VehicleExitEvent;
import org.bukkit.event.world.StructureGrowEvent;
import org.bukkit.inventory.InventoryHolder;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.Set;
import java.util.function.BiConsumer;
import static net.sacredlabyrinth.phaed.simpleclans.managers.ProtectionManager.Action.*;
import static net.sacredlabyrinth.phaed.simpleclans.managers.SettingsManager.ConfigField.*;
@@ -49,13 +61,154 @@ public class LandProtection implements Listener {
}
public void registerListeners() {
Bukkit.getPluginManager().registerEvents(this, plugin);
registerBlockBreakListener();
registerBlockPlaceListener();
registerEntityDamageListener();
registerInteractEntityListener();
registerInteractListener();
registerInventoryOpenListener();
registerListener(BlockBreakEvent.class, (event, cancel) -> {
Block block = event.getBlock();
if (settingsManager.getIgnoredList(BREAK).contains(block.getType().name())) {
return;
}
if (protectionManager.can(BREAK, block.getLocation(), event.getPlayer())) {
event.setCancelled(cancel);
}
});
registerListener(HangingBreakByEntityEvent.class, (event, cancel) -> {
Entity remover = event.getRemover();
if (!(remover instanceof Player)) {
return;
}
if (protectionManager.can(BREAK, event.getEntity().getLocation(), ((Player) remover))) {
event.setCancelled(cancel);
}
});
registerListener(HangingPlaceEvent.class, (event, cancel) -> {
Player player = event.getPlayer();
if (player == null) {
return;
}
if (protectionManager.can(PLACE, event.getBlock().getLocation(), player)) {
event.setCancelled(cancel);
}
});
registerListener(StructureGrowEvent.class, (event, cancel) -> {
if (event.getPlayer() == null) {
return;
}
if (protectionManager.can(PLACE, event.getLocation(), event.getPlayer())) {
event.setCancelled(cancel);
}
});
registerListener(BlockPlaceEvent.class, (event, cancel) -> {
Block block = event.getBlock();
if (settingsManager.getIgnoredList(PLACE).contains(block.getType().name())) {
return;
}
if (protectionManager.can(PLACE, block.getLocation(), event.getPlayer())) {
event.setCancelled(cancel);
}
});
registerListener(PlayerBucketEmptyEvent.class, (event, cancel) -> {
Block block = event.getBlockClicked();
if (settingsManager.getIgnoredList(PLACE).contains(block.getType().name())) {
return;
}
if (protectionManager.can(PLACE, block.getLocation(), event.getPlayer())) {
event.setCancelled(cancel);
}
});
registerListener(PlayerBucketFillEvent.class, (event, cancel) -> {
Block block = event.getBlockClicked().getRelative(event.getBlockFace());
if (settingsManager.getIgnoredList(BREAK).contains(block.getType().name())) {
return;
}
if (protectionManager.can(BREAK, block.getLocation(), event.getPlayer())) {
event.setCancelled(cancel);
}
});
registerListener(VehicleDestroyEvent.class, (event, cancel) -> {
if (!(event.getAttacker() instanceof Player)) {
return;
}
if (protectionManager.can(BREAK, event.getVehicle().getLocation(), ((Player) event.getAttacker()))) {
event.setCancelled(cancel);
}
});
registerListener(EntityChangeBlockEvent.class, (event, cancel) -> {
if (!(event.getEntity() instanceof Player)) {
return;
}
if (protectionManager.can(BREAK, event.getBlock().getLocation(), ((Player) event.getEntity()))) {
event.setCancelled(cancel);
}
});
registerListener(EntityDamageByEntityEvent.class, (event, cancel) -> {
Player attacker = Events.getAttacker(event);
if (attacker == null) {
return;
}
Player victim = event.getEntity() instanceof Player ? ((Player) event.getEntity()) : null;
if (victim == null) {
return;
}
if (protectionManager.can(DAMAGE, event.getEntity().getLocation(), attacker, victim)) {
event.setCancelled(cancel);
}
});
registerListener(PlayerInteractAtEntityEvent.class, (event, cancel) -> {
if (protectionManager.can(INTERACT_ENTITY, event.getRightClicked().getLocation(), event.getPlayer())) {
event.setCancelled(cancel);
}
});
registerListener(PlayerInteractEntityEvent.class, (event, cancel) -> {
if (protectionManager.can(INTERACT_ENTITY, event.getRightClicked().getLocation(), event.getPlayer())) {
event.setCancelled(cancel);
}
});
registerListener(VehicleExitEvent.class, (event, cancel) -> {
Vehicle vehicle = event.getVehicle();
if (vehicle instanceof Tameable && event.getExited() instanceof Player) {
if (protectionManager.can(INTERACT_ENTITY, vehicle.getLocation(), ((Player) event.getExited()))) {
event.setCancelled(cancel);
}
}
});
registerListener(InventoryOpenEvent.class, (event, cancel) -> {
InventoryHolder holder = event.getInventory().getHolder();
Location location = getLocation(holder);
if (holder instanceof Entity && holder == event.getPlayer()) return;
if (location == null) return;
if (protectionManager.can(CONTAINER, location, ((Player) event.getPlayer()))) {
event.setCancelled(cancel);
}
});
registerListener(PlayerInteractEvent.class, (event, cancel) -> {
if (event.getClickedBlock() == null) {
return;
}
ProtectionManager.Action action = getInteractEventAction(event);
if (protectionManager.can(action, event.getClickedBlock().getLocation(), event.getPlayer())) {
event.setUseInteractedBlock(cancel ? Result.DENY : Result.ALLOW);
event.setUseItemInHand(cancel ? Result.DENY : Result.ALLOW);
event.setCancelled(cancel);
}
});
registerListener(PlayerBedEnterEvent.class, (event, cancel) -> {
if (protectionManager.can(INTERACT, event.getBed().getLocation(), event.getPlayer())) {
event.setCancelled(cancel);
}
});
}
private <T extends Event> void registerListener(Class<T> clazz, BiConsumer<T, Boolean> listener) {
Bukkit.getPluginManager().registerEvent(clazz, this, EventPriority.LOWEST, (l, event) -> {
if (clazz.isInstance(event)) {
listener.accept(clazz.cast(event), true);
}
}, plugin, false);
Bukkit.getPluginManager().registerEvent(clazz, this, priority, (l, event) -> {
if (clazz.isInstance(event)) {
listener.accept(clazz.cast(event), false);
}
}, plugin, false);
}
public void registerCreateLandEvent(ProtectionProvider provider, @Nullable Class<? extends Event> createLandEvent) {
@@ -95,169 +248,6 @@ public class LandProtection implements Listener {
((Cancellable) event).setCancelled(true);
}
private void registerBlockBreakListener() {
Bukkit.getPluginManager().registerEvent(BlockBreakEvent.class, this, priority, (listener, event) -> {
if (!(event instanceof BlockBreakEvent)) {
return;
}
BlockBreakEvent blockBreakEvent = (BlockBreakEvent) event;
Block block = blockBreakEvent.getBlock();
if (settingsManager.getIgnoredList(BREAK).contains(block.getType().name())) {
return;
}
if (protectionManager.can(BREAK, block.getLocation(), blockBreakEvent.getPlayer())) {
blockBreakEvent.setCancelled(false);
}
}, plugin, false);
}
private void registerBlockPlaceListener() {
Bukkit.getPluginManager().registerEvent(BlockPlaceEvent.class, this, priority, (listener, event) -> {
if (!(event instanceof BlockPlaceEvent)) {
return;
}
BlockPlaceEvent blockPlaceEvent = (BlockPlaceEvent) event;
Block block = blockPlaceEvent.getBlock();
if (settingsManager.getIgnoredList(PLACE).contains(block.getType().name())) {
return;
}
if (protectionManager.can(PLACE, block.getLocation(), blockPlaceEvent.getPlayer())) {
blockPlaceEvent.setCancelled(false);
}
}, plugin, false);
}
private void registerEntityDamageListener() {
Bukkit.getPluginManager().registerEvent(EntityDamageByEntityEvent.class, this, priority,
(listener, event) -> {
if (!(event instanceof EntityDamageByEntityEvent)) {
return;
}
EntityDamageByEntityEvent entityEvent = (EntityDamageByEntityEvent) event;
if (!(entityEvent.getDamager() instanceof Player)) {
return;
}
Player attacker = ((Player) entityEvent.getDamager());
Player victim = entityEvent.getEntity() instanceof Player ? ((Player) entityEvent.getEntity()) : null;
if (protectionManager.can(DAMAGE, entityEvent.getEntity().getLocation(), attacker, victim)) {
entityEvent.setCancelled(false);
}
}, plugin, false);
}
private void registerInteractEntityListener() {
Bukkit.getPluginManager().registerEvent(PlayerInteractEntityEvent.class, this, priority, (listener, event) -> {
if (!(event instanceof PlayerInteractEntityEvent)) {
return;
}
PlayerInteractEntityEvent interactEvent = (PlayerInteractEntityEvent) event;
if (protectionManager.can(INTERACT_ENTITY, interactEvent.getRightClicked().getLocation(), interactEvent.getPlayer())) {
interactEvent.setCancelled(false);
}
}, plugin, false);
}
private void registerInventoryOpenListener() {
Bukkit.getPluginManager().registerEvent(InventoryOpenEvent.class, this, priority, (l, e) -> {
if (!(e instanceof InventoryOpenEvent)) {
return;
}
InventoryOpenEvent event = ((InventoryOpenEvent) e);
InventoryHolder holder = event.getInventory().getHolder();
Location location = getLocation(holder);
if (holder instanceof Entity && holder == event.getPlayer()) return;
if (location == null) return;
if (protectionManager.can(CONTAINER, location, ((Player) event.getPlayer()))) {
event.setCancelled(false);
}
}, plugin, false);
}
private void registerInteractListener() {
Bukkit.getPluginManager().registerEvent(PlayerInteractEvent.class, this, priority, (listener, event) -> {
if (!(event instanceof PlayerInteractEvent)) {
return;
}
PlayerInteractEvent interactEvent = (PlayerInteractEvent) event;
if (interactEvent.getClickedBlock() == null) {
return;
}
ProtectionManager.Action action = getInteractEventAction(interactEvent);
if (protectionManager.can(action, interactEvent.getClickedBlock().getLocation(), interactEvent.getPlayer())) {
interactEvent.setUseInteractedBlock(Event.Result.ALLOW);
interactEvent.setUseItemInHand(Event.Result.ALLOW);
interactEvent.setCancelled(false);
}
}, plugin, false);
}
@EventHandler(priority = EventPriority.LOWEST)
public void onBreak(BlockBreakEvent event) {
Block block = event.getBlock();
if (settingsManager.getIgnoredList(BREAK).contains(block.getType().name())) {
return;
}
if (protectionManager.can(BREAK, block.getLocation(), event.getPlayer())) {
event.setCancelled(true);
}
}
@EventHandler(priority = EventPriority.LOWEST)
public void onPlace(BlockPlaceEvent event) {
Block block = event.getBlock();
if (settingsManager.getIgnoredList(PLACE).contains(block.getType().name())) {
return;
}
if (protectionManager.can(PLACE, block.getLocation(), event.getPlayer())) {
event.setCancelled(true);
}
}
@EventHandler(priority = EventPriority.LOWEST)
public void onDamage(EntityDamageByEntityEvent event) {
Entity damager = event.getDamager();
if (!(damager instanceof Player)) {
return;
}
Player victim = event.getEntity() instanceof Player ? ((Player) event.getEntity()) : null;
if (protectionManager.can(DAMAGE, event.getEntity().getLocation(), (Player) damager, victim)) {
event.setCancelled(true);
}
}
@EventHandler(priority = EventPriority.LOWEST)
public void onInventoryOpen(InventoryOpenEvent event) {
InventoryHolder holder = event.getInventory().getHolder();
Location location = getLocation(holder);
if (holder instanceof Entity && holder == event.getPlayer()) return;
if (location == null) return;
if (protectionManager.can(CONTAINER, location, ((Player) event.getPlayer()))) {
event.setCancelled(true);
}
}
@EventHandler(priority = EventPriority.LOWEST)
public void onInteractEntity(PlayerInteractEntityEvent event) {
if (protectionManager.can(INTERACT_ENTITY, event.getRightClicked().getLocation(), event.getPlayer())) {
event.setCancelled(true);
}
}
@EventHandler(priority = EventPriority.LOWEST)
public void onInteract(PlayerInteractEvent event) {
if (event.getClickedBlock() == null) {
return;
}
ProtectionManager.Action action = getInteractEventAction(event);
if (protectionManager.can(action, event.getClickedBlock().getLocation(), event.getPlayer())) {
event.setUseItemInHand(Event.Result.DENY);
event.setUseInteractedBlock(Event.Result.DENY);
event.setCancelled(true);
}
}
private @Nullable Location getLocation(@Nullable InventoryHolder holder) {
if (holder instanceof BlockState) {
return ((BlockState) holder).getLocation();
@@ -18,6 +18,7 @@ import java.time.LocalDateTime;
import java.util.logging.Level;
import static net.sacredlabyrinth.phaed.simpleclans.SimpleClans.lang;
import static net.sacredlabyrinth.phaed.simpleclans.events.EconomyTransactionEvent.Cause.PLAYER_KILLED;
import static net.sacredlabyrinth.phaed.simpleclans.managers.SettingsManager.ConfigField.*;
/**
@@ -48,6 +49,7 @@ public class PlayerDeath extends SCListener {
// record death for victim
victimCp.addDeath();
plugin.getStorageManager().updateClanPlayer(victimCp);
plugin.getStorageManager().updateClanPlayer(attackerCp);
}
@EventHandler
@@ -98,7 +100,7 @@ public class PlayerDeath extends SCListener {
}
player.sendMessage(ChatColor.AQUA + lang("player.got.money", player, money,
victim.getName(), attacker.getKDR()));
plugin.getPermissionsManager().playerGrantMoney(player, money);
plugin.getPermissionsManager().grantPlayer(player, money, PLAYER_KILLED);
}
}
}
@@ -1,10 +1,7 @@
package net.sacredlabyrinth.phaed.simpleclans.listeners;
import net.sacredlabyrinth.phaed.simpleclans.ChatBlock;
import net.sacredlabyrinth.phaed.simpleclans.Clan;
import net.sacredlabyrinth.phaed.simpleclans.ClanPlayer;
import net.sacredlabyrinth.phaed.simpleclans.*;
import net.sacredlabyrinth.phaed.simpleclans.ClanPlayer.Channel;
import net.sacredlabyrinth.phaed.simpleclans.SimpleClans;
import net.sacredlabyrinth.phaed.simpleclans.managers.PermissionsManager;
import net.sacredlabyrinth.phaed.simpleclans.managers.SettingsManager;
import org.bukkit.Bukkit;
@@ -86,13 +83,7 @@ public class SCPlayerListener extends SCListener {
if (isBlacklistedWorld(player)) {
return;
}
ClanPlayer cp;
if (settingsManager.is(PERFORMANCE_USE_BUNGEECORD)) {
cp = plugin.getClanManager().getClanPlayerJoinEvent(player);
} else {
cp = plugin.getClanManager().getAnyClanPlayer(player.getUniqueId());
}
ClanPlayer cp = plugin.getClanManager().getAnyClanPlayer(player.getUniqueId());
updatePlayerName(player);
plugin.getClanManager().updateLastSeen(player);
@@ -120,7 +111,10 @@ public class SCPlayerListener extends SCListener {
Clan clan = plugin.getClanManager().getClanByPlayerUniqueId(player.getUniqueId());
Location home;
if (clan != null && (home = clan.getHomeLocation()) != null) {
event.setRespawnLocation(plugin.getTeleportManager().getSafe(home));
String homeServer = new Flags(clan.getFlags()).getString("homeServer", "");
if (homeServer.isEmpty() || plugin.getProxyManager().getServerName().equals(homeServer)) {
event.setRespawnLocation(plugin.getTeleportManager().getSafe(home));
}
}
}
@@ -196,7 +190,7 @@ public class SCPlayerListener extends SCListener {
if (duplicate != null) {
plugin.getLogger().warning(String.format("Found duplicate for %s, UUIDs: %s, %s", player.getName(),
player.getUniqueId(), duplicate.getUniqueId()));
duplicate.setName(duplicate.getName() + "_duplicate");
duplicate.setName(duplicate.getUniqueId().toString());
plugin.getStorageManager().updatePlayerName(duplicate);
}
if (cp != null) {
@@ -25,7 +25,7 @@ import java.util.stream.Collectors;
import static net.sacredlabyrinth.phaed.simpleclans.ClanPlayer.Channel;
import static net.sacredlabyrinth.phaed.simpleclans.chat.SCMessage.Source;
import static net.sacredlabyrinth.phaed.simpleclans.chat.SCMessage.Source.SPIGOT;
import static net.sacredlabyrinth.phaed.simpleclans.chat.SCMessage.Source.DISCORD;
import static net.sacredlabyrinth.phaed.simpleclans.managers.SettingsManager.ConfigField;
import static net.sacredlabyrinth.phaed.simpleclans.managers.SettingsManager.ConfigField.*;
import static org.bukkit.Bukkit.getPluginManager;
@@ -44,7 +44,6 @@ public final class ChatManager {
}
}
@SuppressWarnings("unused")
@Subscribe
public void registerDiscord(DiscordReadyEvent event) {
discordHook = new DiscordHook(plugin);
@@ -64,12 +63,11 @@ public final class ChatManager {
return discordHook;
}
public void processChat(@NotNull Source source, @NotNull Channel channel,
@NotNull ClanPlayer clanPlayer, String message) {
Clan clan = Objects.requireNonNull(clanPlayer.getClan(), "Clan cannot be null");
List<ClanPlayer> receivers = new ArrayList<>();
public void processChat(@NotNull SCMessage message) {
Clan clan = Objects.requireNonNull(message.getSender().getClan(), "Clan cannot be null");
switch (channel) {
List<ClanPlayer> receivers = new ArrayList<>();
switch (message.getChannel()) {
case ALLY:
if (!plugin.getSettingsManager().is(ALLYCHAT_ENABLE)) {
return;
@@ -85,20 +83,24 @@ public final class ChatManager {
return;
}
receivers.addAll(clan.getOnlineMembers().stream().
filter(member -> !member.isMuted()).
receivers.addAll(clan.getOnlineMembers().stream().filter(member -> !member.isMuted()).
collect(Collectors.toList()));
}
SCMessage scMessage = new SCMessage(source, channel, clanPlayer, message, receivers);
message.setReceivers(receivers);
for (ChatHandler ch : handlers) {
if (ch.canHandle(source)) {
ch.sendMessage(scMessage.clone());
if (ch.canHandle(message.getSource())) {
ch.sendMessage(message.clone());
}
}
}
public void processChat(@NotNull Source source, @NotNull Channel channel,
@NotNull ClanPlayer clanPlayer, String message) {
Objects.requireNonNull(clanPlayer.getClan(), "Clan cannot be null");
processChat(new SCMessage(source, channel, clanPlayer, message));
}
public String parseChatFormat(String format, SCMessage message) {
return parseChatFormat(format, message, new HashMap<>());
}
@@ -113,7 +115,7 @@ public final class ChatManager {
String rank = sender.getRankId().isEmpty() ? null : ChatUtils.parseColors(sender.getRankDisplayName());
ConfigField configField = ConfigField.valueOf(String.format("%sCHAT_RANK",
message.getSource() == SPIGOT ? message.getChannel() : message.getSource()));
message.getSource() == DISCORD ? "DISCORD" : message.getChannel()));
String rankFormat = (rank != null) ? sm.getColored(configField).replace("%rank%", rank) : "";
if (placeholders != null) {
@@ -1,9 +1,11 @@
package net.sacredlabyrinth.phaed.simpleclans.managers;
import com.cryptomorin.xseries.XMaterial;
import net.md_5.bungee.api.chat.TextComponent;
import net.sacredlabyrinth.phaed.simpleclans.*;
import net.sacredlabyrinth.phaed.simpleclans.events.ClanBalanceUpdateEvent;
import net.sacredlabyrinth.phaed.simpleclans.events.CreateClanEvent;
import net.sacredlabyrinth.phaed.simpleclans.events.EconomyTransactionEvent.Cause;
import net.sacredlabyrinth.phaed.simpleclans.loggers.BankOperator;
import net.sacredlabyrinth.phaed.simpleclans.utils.ChatUtils;
import net.sacredlabyrinth.phaed.simpleclans.utils.VanishUtils;
@@ -24,10 +26,12 @@ import java.time.Instant;
import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.logging.Level;
import static net.sacredlabyrinth.phaed.simpleclans.SimpleClans.lang;
import static net.sacredlabyrinth.phaed.simpleclans.managers.SettingsManager.ConfigField.*;
import static org.bukkit.ChatColor.AQUA;
import static org.bukkit.ChatColor.RED;
/**
@@ -36,8 +40,8 @@ import static org.bukkit.ChatColor.RED;
public final class ClanManager {
private final SimpleClans plugin;
private final HashMap<String, Clan> clans = new HashMap<>();
private final HashMap<String, ClanPlayer> clanPlayers = new HashMap<>();
private final ConcurrentHashMap<String, Clan> clans = new ConcurrentHashMap<>();
private final ConcurrentHashMap<UUID, ClanPlayer> clanPlayers = new ConcurrentHashMap<>();
private final HashMap<ClanPlayer, List<Kill>> kills = new HashMap<>();
/**
@@ -123,7 +127,7 @@ public final class ClanManager {
*/
public void importClanPlayer(ClanPlayer cp) {
if (cp.getUniqueId() != null) {
this.clanPlayers.put(cp.getUniqueId().toString(), cp);
this.clanPlayers.put(cp.getUniqueId(), cp);
}
}
@@ -133,11 +137,13 @@ public final class ClanManager {
public void createClan(Player player, String colorTag, String name) {
ClanPlayer cp = getCreateClanPlayer(player.getUniqueId());
boolean verified = !plugin.getSettingsManager().is(REQUIRE_VERIFICATION) || plugin.getPermissionsManager().has(player, "simpleclans.mod.verify");
boolean verified = !plugin.getSettingsManager().is(REQUIRE_VERIFICATION)
|| plugin.getPermissionsManager().has(player, "simpleclans.mod.verify");
Clan clan = new Clan(colorTag, name, verified);
clan.addPlayerToClan(cp);
cp.setLeader(true);
clan.getRanks().addAll(plugin.getSettingsManager().getStarterRanks());
plugin.getStorageManager().insertClan(clan);
importClan(clan);
@@ -168,7 +174,7 @@ public final class ClanManager {
if (clan != null) {
clan.removePlayerFromClan(cp.getUniqueId());
}
clanPlayers.remove(cp.getUniqueId().toString());
clanPlayers.remove(cp.getUniqueId());
plugin.getStorageManager().deleteClanPlayer(cp);
}
@@ -176,7 +182,7 @@ public final class ClanManager {
* Delete a player data from memory
*/
public void deleteClanPlayerFromMemory(UUID playerUniqueId) {
clanPlayers.remove(playerUniqueId.toString());
clanPlayers.remove(playerUniqueId);
}
/**
@@ -240,6 +246,7 @@ public final class ClanManager {
* Gets the ClanPlayer data object if a player is currently in a clan, null
* if he's not in a clan Used for BungeeCord Reload ClanPlayer and your Clan
*/
@Deprecated
public @Nullable ClanPlayer getClanPlayerJoinEvent(Player player) {
SimpleClans.getInstance().getStorageManager().importFromDatabaseOnePlayer(player);
return getClanPlayer(player.getUniqueId());
@@ -266,7 +273,7 @@ public final class ClanManager {
* if he's not in a clan
*/
public @Nullable ClanPlayer getClanPlayer(UUID playerUniqueId) {
ClanPlayer cp = clanPlayers.get(playerUniqueId.toString());
ClanPlayer cp = clanPlayers.get(playerUniqueId);
if (cp == null) {
return null;
@@ -297,7 +304,7 @@ public final class ClanManager {
return null;
}
ClanPlayer cp = clanPlayers.get(uuid.toString());
ClanPlayer cp = clanPlayers.get(uuid);
if (cp == null) {
return null;
@@ -319,7 +326,7 @@ public final class ClanManager {
@Nullable
public ClanPlayer getAnyClanPlayer(UUID uuid) {
return clanPlayers.get(uuid.toString());
return clanPlayers.get(uuid);
}
@SuppressWarnings("deprecation")
@@ -350,8 +357,8 @@ public final class ClanManager {
*/
public ClanPlayer getCreateClanPlayer(UUID uuid) {
Objects.requireNonNull(uuid, "UUID must not be null");
if (clanPlayers.containsKey(uuid.toString())) {
return clanPlayers.get(uuid.toString());
if (clanPlayers.containsKey(uuid)) {
return clanPlayers.get(uuid);
}
ClanPlayer cp = new ClanPlayer(uuid);
@@ -389,13 +396,9 @@ public final class ClanManager {
if (plugin.getSettingsManager().is(DISABLE_MESSAGES)) {
return;
}
Collection<? extends Player> players = Bukkit.getOnlinePlayers();
for (Player player : players) {
ChatBlock.sendMessage(player, ChatColor.DARK_GRAY + "* " + ChatColor.AQUA + msg);
}
SimpleClans.getInstance().getServer().getConsoleSender().sendMessage(ChatColor.AQUA + "[" + lang("server.announce") + "] " + ChatColor.WHITE + msg);
plugin.getProxyManager().sendMessage("ALL", ChatColor.DARK_GRAY + "* " + AQUA + msg);
Bukkit.getConsoleSender().sendMessage(AQUA + "[" + lang("server.announce") + "] " + ChatColor.WHITE + msg);
}
/**
@@ -525,7 +528,7 @@ public final class ClanManager {
if (h.getType().equals(XMaterial.CHAINMAIL_HELMET.parseMaterial())) {
out += ChatColor.WHITE + lang("armor.h", player);
} else if (h.getType().equals(XMaterial.DIAMOND_HELMET.parseMaterial())) {
out += ChatColor.AQUA + lang("armor.h", player);
out += AQUA + lang("armor.h", player);
} else if (h.getType().equals(XMaterial.GOLDEN_HELMET.parseMaterial())) {
out += ChatColor.YELLOW + lang("armor.h", player);
} else if (h.getType().equals(XMaterial.IRON_HELMET.parseMaterial())) {
@@ -544,7 +547,7 @@ public final class ClanManager {
if (c.getType().equals(XMaterial.CHAINMAIL_CHESTPLATE.parseMaterial())) {
out += ChatColor.WHITE + lang("armor.c", player);
} else if (c.getType().equals(XMaterial.DIAMOND_CHESTPLATE.parseMaterial())) {
out += ChatColor.AQUA + lang("armor.c", player);
out += AQUA + lang("armor.c", player);
} else if (c.getType().equals(XMaterial.GOLDEN_CHESTPLATE.parseMaterial())) {
out += ChatColor.YELLOW + lang("armor.c", player);
} else if (c.getType().equals(XMaterial.IRON_CHESTPLATE.parseMaterial())) {
@@ -582,7 +585,7 @@ public final class ClanManager {
if (b.getType().equals(XMaterial.CHAINMAIL_BOOTS.parseMaterial())) {
out += ChatColor.WHITE + lang("armor.B", player);
} else if (b.getType().equals(XMaterial.DIAMOND_BOOTS.parseMaterial())) {
out += ChatColor.AQUA + lang("armor.B", player);
out += AQUA + lang("armor.B", player);
} else if (b.getType().equals(XMaterial.GOLDEN_BOOTS.parseMaterial())) {
out += ChatColor.YELLOW + lang("armor.B", player);
} else if (b.getType().equals(XMaterial.IRON_BOOTS.parseMaterial())) {
@@ -621,7 +624,7 @@ public final class ClanManager {
if (count > 0) {
String countString = count > 1 ? count + "" : "";
out += ChatColor.AQUA + lang("weapon.S", player) + headColor + countString;
out += AQUA + lang("weapon.S", player) + headColor + countString;
}
count = getItemCount(inv, XMaterial.GOLDEN_SWORD);
@@ -928,7 +931,7 @@ public final class ClanManager {
if (plugin.getPermissionsManager().hasEconomy()) {
if (plugin.getPermissionsManager().playerHasMoney(player, price)) {
plugin.getPermissionsManager().playerChargeMoney(player, price);
plugin.getPermissionsManager().chargePlayer(player, price, Cause.MEMBER_FEE_SET);
player.sendMessage(RED + MessageFormat.format(lang("account.has.been.debited", player), price));
} else {
player.sendMessage(RED + lang("not.sufficient.money", player, price));
@@ -951,7 +954,7 @@ public final class ClanManager {
if (plugin.getPermissionsManager().hasEconomy()) {
if (plugin.getPermissionsManager().playerHasMoney(player, price)) {
plugin.getPermissionsManager().playerChargeMoney(player, price);
plugin.getPermissionsManager().chargePlayer(player, price, Cause.CLAN_CREATION);
player.sendMessage(RED + MessageFormat.format(lang("account.has.been.debited", player), price));
} else {
player.sendMessage(RED + lang("not.sufficient.money", player, price));
@@ -974,7 +977,7 @@ public final class ClanManager {
if (plugin.getPermissionsManager().hasEconomy()) {
if (plugin.getPermissionsManager().playerHasMoney(player, price)) {
plugin.getPermissionsManager().playerChargeMoney(player, price);
plugin.getPermissionsManager().chargePlayer(player, price, Cause.CLAN_INVITATION);
player.sendMessage(RED + MessageFormat.format(lang("account.has.been.debited", player), price));
} else {
player.sendMessage(RED + lang("not.sufficient.money", player, price));
@@ -997,7 +1000,7 @@ public final class ClanManager {
if (plugin.getPermissionsManager().hasEconomy()) {
if (plugin.getPermissionsManager().playerHasMoney(player, price)) {
plugin.getPermissionsManager().playerChargeMoney(player, price);
plugin.getPermissionsManager().chargePlayer(player, price, Cause.CLAN_HOME_TELEPORT);
player.sendMessage(RED + MessageFormat.format(lang("account.has.been.debited", player), price));
} else {
player.sendMessage(RED + lang("not.sufficient.money", player, price));
@@ -1020,7 +1023,7 @@ public final class ClanManager {
if (plugin.getPermissionsManager().hasEconomy()) {
if (plugin.getPermissionsManager().playerHasMoney(player, price)) {
plugin.getPermissionsManager().playerChargeMoney(player, price);
plugin.getPermissionsManager().chargePlayer(player, price, Cause.CLAN_HOME_TELEPORT_SET);
player.sendMessage(RED + MessageFormat.format(lang("account.has.been.debited", player), price));
} else {
player.sendMessage(RED + lang("not.sufficient.money", player, price));
@@ -1043,10 +1046,10 @@ public final class ClanManager {
if (plugin.getPermissionsManager().hasEconomy()) {
if (plugin.getPermissionsManager().playerHasMoney(player, price)) {
plugin.getPermissionsManager().playerChargeMoney(player, price);
player.sendMessage(RED + MessageFormat.format(lang("account.has.been.debited", player), price));
plugin.getPermissionsManager().chargePlayer(player, price, Cause.RESET_KDR);
player.spigot().sendMessage(new TextComponent(RED + MessageFormat.format(lang("account.has.been.debited", player), price)));
} else {
player.sendMessage(RED + lang("not.sufficient.money", player, price));
player.spigot().sendMessage(new TextComponent(RED + MessageFormat.format(lang("not.sufficient.money", player), price)));
return false;
}
}
@@ -1073,29 +1076,25 @@ public final class ClanManager {
price = price * VanishUtils.getNonVanished(player, clan).size();
}
if (plugin.getSettingsManager().is(ECONOMY_ISSUER_PAYS_REGROUP)) {
if (plugin.getPermissionsManager().hasEconomy()) {
if (plugin.getPermissionsManager().playerHasMoney(player, price)) {
plugin.getPermissionsManager().playerChargeMoney(player, price);
player.sendMessage(RED + MessageFormat.format(lang("account.has.been.debited", player), price));
} else {
player.sendMessage(RED + lang("not.sufficient.money", player, price));
return false;
}
if (plugin.getSettingsManager().is(ECONOMY_ISSUER_PAYS_REGROUP) && plugin.getPermissionsManager().hasEconomy()) {
if (plugin.getPermissionsManager().playerHasMoney(player, price)) {
plugin.getPermissionsManager().chargePlayer(player, price, Cause.CLAN_REGROUP);
player.sendMessage(RED + MessageFormat.format(lang("account.has.been.debited", player), price));
} else {
player.sendMessage(RED + lang("not.sufficient.money", player, price));
return false;
}
} else {
double money = plugin.getPermissionsManager().playerGetMoney(player);
switch (clan.withdraw(new BankOperator(player, money), ClanBalanceUpdateEvent.Cause.COMMAND, price)) {
case SUCCESS:
if (plugin.getPermissionsManager().playerGrantMoney(player, price)) {
player.sendMessage(ChatColor.AQUA + lang("player.clan.withdraw", player, price));
clan.addBb(player.getName(), ChatColor.AQUA + lang("bb.clan.withdraw", price));
case SUCCESS -> {
if (plugin.getPermissionsManager().grantPlayer(player, price)) {
player.sendMessage(AQUA + lang("player.clan.withdraw", player, price));
clan.addBb(player.getName(), lang("bb.clan.withdraw", price));
return true;
}
break;
case NOT_ENOUGH_BALANCE:
player.sendMessage(lang("clan.bank.not.enough.money", player));
break;
}
case NOT_ENOUGH_BALANCE -> player.sendMessage(lang("clan.bank.not.enough.money", player));
}
}
@@ -1114,7 +1113,7 @@ public final class ClanManager {
if (plugin.getPermissionsManager().hasEconomy()) {
if (plugin.getPermissionsManager().playerHasMoney(player, price)) {
plugin.getPermissionsManager().playerChargeMoney(player, price);
plugin.getPermissionsManager().chargePlayer(player, price, Cause.CLAN_VERIFICATION);
player.sendMessage(RED + MessageFormat.format(lang("account.has.been.debited", player), price));
} else {
player.sendMessage(RED + lang("not.sufficient.money", player, price));
@@ -1147,11 +1146,11 @@ public final class ClanManager {
if (command.equals(lang("on", player))) {
cp.setGlobalChat(true);
plugin.getStorageManager().updateClanPlayer(cp);
ChatBlock.sendMessage(player, ChatColor.AQUA + "You have enabled global chat");
ChatBlock.sendMessage(player, AQUA + "You have enabled global chat");
} else if (command.equals(lang("off", player))) {
cp.setGlobalChat(false);
plugin.getStorageManager().updateClanPlayer(cp);
ChatBlock.sendMessage(player, ChatColor.AQUA + "You have disabled global chat");
ChatBlock.sendMessage(player, AQUA + "You have disabled global chat");
} else {
return true;
}
@@ -2,23 +2,29 @@ package net.sacredlabyrinth.phaed.simpleclans.managers;
import net.milkbowl.vault.chat.Chat;
import net.milkbowl.vault.economy.Economy;
import net.milkbowl.vault.economy.EconomyResponse;
import net.milkbowl.vault.permission.Permission;
import net.sacredlabyrinth.phaed.simpleclans.*;
import net.sacredlabyrinth.phaed.simpleclans.events.EconomyTransactionEvent;
import net.sacredlabyrinth.phaed.simpleclans.events.EconomyTransactionEvent.Cause;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.OfflinePlayer;
import org.bukkit.entity.Player;
import org.bukkit.permissions.PermissionAttachment;
import org.bukkit.plugin.RegisteredServiceProvider;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.text.MessageFormat;
import java.util.HashMap;
import java.util.List;
import java.util.Objects;
import static net.sacredlabyrinth.phaed.simpleclans.SimpleClans.lang;
import static net.sacredlabyrinth.phaed.simpleclans.managers.SettingsManager.ConfigField.ENABLE_AUTO_GROUPS;
import static net.sacredlabyrinth.phaed.simpleclans.managers.SettingsManager.ConfigField.PERMISSIONS_AUTO_GROUP_GROUPNAME;
import static org.bukkit.Bukkit.getPluginManager;
/**
* @author phaed
@@ -50,7 +56,6 @@ public final class PermissionsManager {
/**
* Whether economy plugin exists and is enabled
*
*/
public boolean hasEconomy() {
return economy != null && economy.isEnabled();
@@ -80,7 +85,6 @@ public final class PermissionsManager {
/**
* Adds all permissions for a clan
*
*/
public void updateClanPermissions(Clan clan) {
for (ClanPlayer cp : clan.getMembers()) {
@@ -90,7 +94,6 @@ public final class PermissionsManager {
/**
* Adds permissions for a player
*
*/
public void addPlayerPermissions(@Nullable ClanPlayer cp) {
if (cp == null) {
@@ -120,7 +123,6 @@ public final class PermissionsManager {
/**
* Removes permissions for a clan (when it gets disbanded for example)
*
*/
public void removeClanPermissions(Clan clan) {
for (ClanPlayer cp : clan.getMembers()) {
@@ -131,7 +133,6 @@ public final class PermissionsManager {
/**
* Removes permissions for a player (when he gets kicked for example)
*
*/
public void removeClanPlayerPermissions(@Nullable ClanPlayer cp) {
if (cp != null && cp.getClan() != null && cp.toPlayer() != null) {
@@ -166,20 +167,128 @@ public final class PermissionsManager {
return permissions.get(clan.getTag());
}
/**
* Charge a player some money
*
* @deprecated use {@link PermissionsManager#chargePlayer(OfflinePlayer, double)} instead
*/
@Deprecated(since = "2.19.0", forRemoval = true)
public boolean playerChargeMoney(OfflinePlayer player, double money) {
return economy.withdrawPlayer(player, money).transactionSuccess();
return chargePlayer(player, money);
}
/**
* Charges the specified amount of money from the player's account.
* <p>
* As the {@link EconomyTransactionEvent.Cause} is not passed, this method won't fire the {@link EconomyTransactionEvent}.
* Use this method when you don't need to track the cause or handle custom transaction events.
* </p>
*
* @param player The player whose account will be charged.
* @param money The amount of money to charge.
* @see EconomyTransactionEvent
*/
public boolean chargePlayer(OfflinePlayer player, double money) {
return chargePlayer(player, money, null);
}
/**
* Charges the specified amount of money from the player's account.
*
* @param player The player whose account will be charged.
* @param money The amount of money to charge.
* @param cause The cause of the transaction.
* @return {@code true} if the charge was successful, {@code false} otherwise.
* @see EconomyTransactionEvent
*/
public boolean chargePlayer(@NotNull OfflinePlayer player, double money, @Nullable Cause cause) {
EconomyResponse response = Objects.requireNonNull(economy, "Can't find economy provider").withdrawPlayer(player, money);
if (!response.transactionSuccess()) {
return false;
} else if (cause == null) {
return true;
}
EconomyTransactionEvent event = new EconomyTransactionEvent(player, money, cause, EconomyTransactionEvent.TransactionType.WITHDRAW);
getPluginManager().callEvent(event);
if (event.isCancelled()) {
economy.depositPlayer(player, money);
return false;
}
// handle EconomyTransactionEvent#setAmount
double difference = event.getAmount() - response.amount;
if (difference > 0) {
economy.withdrawPlayer(player, difference);
}
if (difference < 0) {
economy.depositPlayer(player, Math.abs(difference));
}
return true;
}
/**
* Grants a player some money
*
* @deprecated use {@link PermissionsManager#grantPlayer(OfflinePlayer, double)} instead
*/
@Deprecated(since = "2.19.0", forRemoval = true)
public boolean playerGrantMoney(OfflinePlayer player, double money) {
return economy.depositPlayer(player, money).transactionSuccess();
return grantPlayer(player, money);
}
/**
* Grants the specified amount of money to the player's account.
* <p>
* As the {@link EconomyTransactionEvent.Cause} is not passed, this method won't fire the {@link EconomyTransactionEvent}.
* Use this method when you don't need to track the cause or handle custom transaction events.
* </p>
*
* @param player The player to whom the money will be granted.
* @param money The amount of money to grant.
* @see PermissionsManager#grantPlayer(OfflinePlayer, double, Cause)
* @see EconomyTransactionEvent
*/
public boolean grantPlayer(OfflinePlayer player, double money) {
return grantPlayer(player, money, null);
}
/**
* Grants the specified amount of money to the player's account.
*
* @param player The player to whom the money will be granted.
* @param money The amount of money to grant.
* @param cause The cause of the transaction.
* @return {@code true} if the grant was successful, {@code false} otherwise.
* @see EconomyTransactionEvent
*/
public boolean grantPlayer(@NotNull OfflinePlayer player, double money, @Nullable Cause cause) {
EconomyResponse response = Objects.requireNonNull(economy, "Can't find economy provider").depositPlayer(player, money);
if (!response.transactionSuccess() || cause == null) {
return false;
}
EconomyTransactionEvent event = new EconomyTransactionEvent(player, response.amount, cause, EconomyTransactionEvent.TransactionType.DEPOSIT);
getPluginManager().callEvent(event);
if (event.isCancelled()) {
economy.withdrawPlayer(player, money);
return false;
}
// handle EconomyTransactionEvent#setAmount
double difference = event.getAmount() - response.amount;
if (difference > 0) {
economy.depositPlayer(player, difference);
}
if (difference < 0) {
economy.withdrawPlayer(player, Math.abs(difference));
}
return true;
}
/**
@@ -226,10 +335,9 @@ public final class PermissionsManager {
/**
* Checks if the player has the rank permission or the permission level, and the equivalent Bukkit permission
*
* @param player the player
* @param player the player
* @param permission the rank permission
* @param notify notify the player if they don't have permission
*
* @param notify notify the player if they don't have permission
* @deprecated use {@link PermissionsManager#has(Player, RankPermission, boolean)} or {@link PermissionsManager#has(Player, String)}
*/
@Deprecated
@@ -250,14 +358,10 @@ public final class PermissionsManager {
boolean hasLevel = false;
if (level != null) {
switch (level) {
case LEADER:
hasLevel = clanPlayer.isLeader();
break;
case TRUSTED:
hasLevel = clanPlayer.isTrusted();
break;
}
hasLevel = switch (level) {
case LEADER -> clanPlayer.isLeader();
case TRUSTED -> clanPlayer.isTrusted();
};
}
boolean hasRankPermission = false;
@@ -282,9 +386,9 @@ public final class PermissionsManager {
/**
* Checks if the player has the rank permission or the permission level, and the equivalent Bukkit permission
*
* @param player the player
* @param player the player
* @param permission the rank permission
* @param notify notify the player if they don't have permission
* @param notify notify the player if they don't have permission
*/
public boolean has(Player player, RankPermission permission, boolean notify) {
if (player == null || permission == null) {
@@ -307,15 +411,10 @@ public final class PermissionsManager {
return false;
}
boolean hasLevel = false;
switch (permission.getPermissionLevel()) {
case LEADER:
hasLevel = clanPlayer.isLeader();
break;
case TRUSTED:
hasLevel = clanPlayer.isTrusted();
break;
}
boolean hasLevel = switch (permission.getPermissionLevel()) {
case LEADER -> clanPlayer.isLeader();
case TRUSTED -> clanPlayer.isTrusted();
};
boolean hasRankPermission = false;
String rankName = clanPlayer.getRankId();
@@ -339,7 +438,6 @@ public final class PermissionsManager {
/**
* Gives the player permissions linked to a clan
*
*/
public void addClanPermissions(ClanPlayer cp) {
if (!plugin.getSettingsManager().is(ENABLE_AUTO_GROUPS) || cp == null || permission == null) {
@@ -9,7 +9,10 @@ import net.sacredlabyrinth.phaed.simpleclans.events.WarStartEvent;
import net.sacredlabyrinth.phaed.simpleclans.hooks.protection.Land;
import net.sacredlabyrinth.phaed.simpleclans.hooks.protection.ProtectionProvider;
import net.sacredlabyrinth.phaed.simpleclans.listeners.LandProtection;
import org.bukkit.*;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.OfflinePlayer;
import org.bukkit.World;
import org.bukkit.entity.Player;
import org.bukkit.scheduler.BukkitTask;
import org.jetbrains.annotations.NotNull;
@@ -7,7 +7,6 @@ import net.sacredlabyrinth.phaed.simpleclans.events.WarEndEvent;
import net.sacredlabyrinth.phaed.simpleclans.utils.ChatUtils;
import net.sacredlabyrinth.phaed.simpleclans.uuid.UUIDMigration;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.entity.Player;
import org.bukkit.scheduler.BukkitRunnable;
import org.jetbrains.annotations.NotNull;
@@ -42,124 +41,145 @@ public final class RequestManager {
}
public void addDemoteRequest(ClanPlayer requester, String demotedName, Clan clan) {
if (requests.containsKey(clan.getTag())) {
return;
}
String msg = MessageFormat.format(lang("asking.for.the.demotion"), requester.getName(), demotedName);
if (requests.containsKey(clan.getTag())) {
return;
}
String msg = MessageFormat.format(lang("asking.for.the.demotion"), requester.getName(), demotedName);
ClanPlayer demotedTp = plugin.getClanManager().getClanPlayer(UUIDMigration.getForcedPlayerUUID(demotedName));
List<ClanPlayer> acceptors = Helper.stripOffLinePlayers(clan.getLeaders());
acceptors.remove(demotedTp);
Request req = new Request(plugin, ClanRequest.DEMOTE, acceptors, requester, demotedName, clan, msg);
Request req = new Request(ClanRequest.DEMOTE, acceptors, requester, demotedName, clan, msg);
req.vote(requester.getName(), VoteResult.ACCEPT);
requests.put(req.getClan().getTag(), req);
ask(req);
}
public void addPromoteRequest(ClanPlayer requester, String promotedName, Clan clan) {
if (requests.containsKey(clan.getTag())) {
return;
}
String msg = MessageFormat.format(lang("asking.for.the.promotion"), requester.getName(), promotedName);
/**
* This method asks <i>all</i> leaders about
* some action <i>inside</i> their clan.
* <p>
* Example of possible requests:
* </p>
* <ul>
* <li>Disband request can be asked from all leaders</li>
* <li>Rename request can be asked from all leaders</li>
* <li>Promote request can be asked from all leaders</li>
* </ul>
*
* <p>
* Examples of incompatible requests:
* </p>
* <ul>
* <li>Demote request can be asked from all leaders,
* <b>except the demoted one.</b></li>
* <li>Invite request has to ask someone <b>outside</b> of leaders clan</li>
* </ul>
*
* @param requester the clan player, who sent the request
* @param request the type of request, see: {@link ClanRequest}
* @param target the target which will be used in request processing
* @param key the language key that would be translated and send the message to all leaders
* @param args the language objects, requires in some language strings.
* @throws IllegalArgumentException if passed incompatible request
*/
public void requestAllLeaders(@NotNull ClanPlayer requester, @NotNull ClanRequest request,
@NotNull String target, @NotNull String key, @Nullable Object... args) {
if (request.equals(ClanRequest.INVITE) || request.equals(ClanRequest.DEMOTE)) {
throw new IllegalArgumentException("Unsupported request: " + request.name());
}
Clan clan = requester.getClan();
if (clan == null || requests.containsKey(target)) {
return;
}
String msg = MessageFormat.format(lang(key), args);
List<ClanPlayer> acceptors = Helper.stripOffLinePlayers(clan.getLeaders());
Request req = new Request(plugin, ClanRequest.PROMOTE, acceptors, requester, promotedName, clan, msg);
requests.put(req.getClan().getTag(), req);
req.vote(requester.getName(), VoteResult.ACCEPT);
ask(req);
}
public void addDisbandRequest(ClanPlayer requester, Clan clan) {
if (requests.containsKey(clan.getTag())) {
return;
}
String msg = MessageFormat.format(lang("asking.for.the.deletion"), requester.getName());
List<ClanPlayer> acceptors = Helper.stripOffLinePlayers(clan.getLeaders());
Request req = new Request(plugin, ClanRequest.DISBAND, acceptors, requester, clan.getTag(), clan, msg);
Request req = new Request(request, acceptors, requester, target, clan, msg);
requests.put(req.getTarget(), req);
req.vote(requester.getName(), VoteResult.ACCEPT);
ask(req);
}
/**
* Add a member invite request
*
* @param requester the requester
* @param requester the requester
* @param invitedName the invited Player
* @param clan the Clan
* @param clan the Clan
*/
public void addInviteRequest(ClanPlayer requester, String invitedName, Clan clan) {
if (requests.containsKey(invitedName.toLowerCase())) {
return;
}
if (requests.containsKey(invitedName.toLowerCase())) {
return;
}
Player player = Bukkit.getPlayer(invitedName);
if (player == null) {
return;
}
String msg = lang("inviting.you.to.join", player, requester.getName(), clan.getName());
Request req = new Request(plugin, ClanRequest.INVITE, null, requester, invitedName, clan, msg);
String msg = lang("inviting.you.to.join", player, requester.getName(), clan.getName());
Request req = new Request(ClanRequest.INVITE, null, requester, invitedName, clan, msg);
requests.put(invitedName.toLowerCase(), req);
ask(req);
}
public void addWarStartRequest(ClanPlayer requester, Clan warClan, Clan requestingClan) {
if (requests.containsKey(warClan.getTag())) {
return;
}
String msg = MessageFormat.format(lang("proposing.war"), requestingClan.getName(), ChatUtils.stripColors(warClan.getColorTag()));
if (requests.containsKey(warClan.getTag())) {
return;
}
String msg = MessageFormat.format(lang("proposing.war"), requestingClan.getName(), ChatUtils.stripColors(warClan.getColorTag()));
List<ClanPlayer> acceptors = Helper.stripOffLinePlayers(warClan.getLeaders());
acceptors.remove(requester);
Request req = new Request(plugin, ClanRequest.START_WAR, acceptors, requester, warClan.getTag(), requestingClan, msg);
Request req = new Request(ClanRequest.START_WAR, acceptors, requester, warClan.getTag(), requestingClan, msg);
requests.put(req.getTarget(), req);
ask(req);
}
public void addWarEndRequest(ClanPlayer requester, Clan warClan, Clan requestingClan) {
if (requests.containsKey(warClan.getTag())) {
return;
}
String msg = MessageFormat.format(lang("proposing.to.end.the.war"), requestingClan.getName(), ChatUtils.stripColors(warClan.getColorTag()));
if (requests.containsKey(warClan.getTag())) {
return;
}
String msg = MessageFormat.format(lang("proposing.to.end.the.war"), requestingClan.getName(), ChatUtils.stripColors(warClan.getColorTag()));
List<ClanPlayer> acceptors = Helper.stripOffLinePlayers(warClan.getLeaders());
acceptors.remove(requester);
Request req = new Request(plugin, ClanRequest.END_WAR, acceptors, requester, warClan.getTag(), requestingClan, msg);
Request req = new Request(ClanRequest.END_WAR, acceptors, requester, warClan.getTag(), requestingClan, msg);
requests.put(req.getTarget(), req);
ask(req);
}
public void addAllyRequest(ClanPlayer requester, Clan allyClan, Clan requestingClan) {
if (requests.containsKey(allyClan.getTag())) {
return;
}
String msg = MessageFormat.format(lang("proposing.an.alliance"), requestingClan.getName(), ChatUtils.stripColors(allyClan.getColorTag()));
if (requests.containsKey(allyClan.getTag())) {
return;
}
String msg = MessageFormat.format(lang("proposing.an.alliance"), requestingClan.getName(), ChatUtils.stripColors(allyClan.getColorTag()));
List<ClanPlayer> acceptors = Helper.stripOffLinePlayers(allyClan.getLeaders());
acceptors.remove(requester);
Request req = new Request(plugin, ClanRequest.CREATE_ALLY, acceptors, requester, allyClan.getTag(), requestingClan, msg);
Request req = new Request(ClanRequest.CREATE_ALLY, acceptors, requester, allyClan.getTag(), requestingClan, msg);
requests.put(req.getTarget(), req);
ask(req);
}
public void addRivalryBreakRequest(ClanPlayer requester, Clan rivalClan, Clan requestingClan) {
if (requests.containsKey(rivalClan.getTag())) {
return;
}
String msg = MessageFormat.format(lang("proposing.to.end.the.rivalry"), requestingClan.getName(), ChatUtils.stripColors(rivalClan.getColorTag()));
if (requests.containsKey(rivalClan.getTag())) {
return;
}
String msg = MessageFormat.format(lang("proposing.to.end.the.rivalry"), requestingClan.getName(), ChatUtils.stripColors(rivalClan.getColorTag()));
List<ClanPlayer> acceptors = Helper.stripOffLinePlayers(rivalClan.getLeaders());
acceptors.remove(requester);
Request req = new Request(plugin, ClanRequest.BREAK_RIVALRY, acceptors, requester, rivalClan.getTag(), requestingClan, msg);
Request req = new Request(ClanRequest.BREAK_RIVALRY, acceptors, requester, rivalClan.getTag(), requestingClan, msg);
requests.put(req.getTarget(), req);
ask(req);
}
@@ -209,7 +229,7 @@ public final class RequestManager {
if (maxMembers > 0 && maxMembers > clan.getSize()) {
ChatBlock.sendMessageKey(invited, "accepted.invitation", clan.getName());
clan.addBb(ChatColor.AQUA + lang("joined.the.clan", invited.getName()));
clan.addBb(lang("joined.the.clan", invited.getName()));
plugin.getClanManager().serverAnnounce(lang("has.joined", invited.getName(), clan.getName()));
clan.addPlayerToClan(cp);
} else {
@@ -222,86 +242,102 @@ public final class RequestManager {
}
public void processResults(Request req) {
Clan requestClan = req.getClan();
ClanPlayer requester = req.getRequester();
String target = req.getTarget();
Clan requestClan = req.getClan();
ClanPlayer requester = req.getRequester();
String target = req.getTarget();
@Nullable
Clan targetClan = plugin.getClanManager().getClan(target);
Clan targetClan = plugin.getClanManager().getClan(target);
@Nullable
UUID targetPlayer = UUIDMigration.getForcedPlayerUUID(target);
List<String> accepts = req.getAccepts();
List<String> denies = req.getDenies();
switch (req.getType()) {
case START_WAR:
processStartWar(requester, requestClan, targetClan, accepts, denies);
break;
case END_WAR:
processEndWar(requester, requestClan, targetClan, accepts, denies);
break;
case CREATE_ALLY:
processCreateAlly(requester, requestClan, targetClan, accepts, denies);
UUID targetPlayer = UUIDMigration.getForcedPlayerUUID(target);
List<String> accepts = req.getAccepts();
List<String> denies = req.getDenies();
switch (req.getType()) {
case START_WAR:
processStartWar(requester, requestClan, targetClan, accepts, denies);
break;
case BREAK_RIVALRY:
processBreakRivalry(requester, requestClan, targetClan, accepts, denies);
case END_WAR:
processEndWar(requester, requestClan, targetClan, accepts, denies);
break;
case DEMOTE: case PROMOTE:
if (!req.votingFinished() || targetPlayer == null) {
return;
}
target = requestClan.getTag();
if (req.getType() == ClanRequest.DEMOTE) {
processDemote(req, requestClan, targetPlayer, denies);
}
if (req.getType() == ClanRequest.PROMOTE) {
processPromote(req, requestClan, targetPlayer, denies);
}
break;
case DISBAND:
if (!req.votingFinished()) {
return;
}
case CREATE_ALLY:
processCreateAlly(requester, requestClan, targetClan, accepts, denies);
break;
case BREAK_RIVALRY:
processBreakRivalry(requester, requestClan, targetClan, accepts, denies);
break;
case DEMOTE:
case PROMOTE:
if (!req.votingFinished() || targetPlayer == null) {
return;
}
target = requestClan.getTag();
if (req.getType() == ClanRequest.DEMOTE) {
processDemote(req, requestClan, targetPlayer, denies);
}
if (req.getType() == ClanRequest.PROMOTE) {
processPromote(req, requestClan, targetPlayer, denies);
}
break;
case DISBAND:
if (!req.votingFinished()) {
return;
}
processDisband(requester, requestClan, denies);
break;
default:
return;
}
case RENAME:
if (!req.votingFinished()) {
return;
}
processRename(req);
break;
default:
return;
}
requests.remove(target);
SimpleClans.getInstance().getServer().getPluginManager().callEvent(new RequestFinishedEvent(req));
req.cleanVotes();
}
private void processRename(Request request) {
if (request.getDenies().isEmpty()) {
request.getClan().setName(request.getTarget());
} else {
String deniers = String.join(", ", request.getDenies());
request.getClan().leaderAnnounce(RED + lang("rename.refused", deniers));
}
}
private void processDisband(ClanPlayer requester, Clan requestClan, List<String> denies) {
if (denies.isEmpty()) {
if (denies.isEmpty()) {
requestClan.disband(requester.toPlayer(), true, false);
} else {
String deniers = String.join(", ", denies);
requestClan.leaderAnnounce(RED + lang("clan.deletion", deniers));
}
}
} else {
String deniers = String.join(", ", denies);
requestClan.leaderAnnounce(RED + lang("clan.deletion", deniers));
}
}
private void processPromote(Request req, Clan requestClan, UUID targetPlayer, List<String> denies) {
String promotedName = req.getTarget();
if (denies.isEmpty()) {
requestClan.addBb(lang("leaders"), ChatColor.AQUA + lang("promoted.to.leader", promotedName));
requestClan.promote(targetPlayer);
} else {
String deniers = String.join(", ", denies);
requestClan.leaderAnnounce(RED + lang("denied.the.promotion", deniers, promotedName));
}
}
private void processPromote(Request req, Clan requestClan, UUID targetPlayer, List<String> denies) {
String promotedName = req.getTarget();
if (denies.isEmpty()) {
requestClan.addBb(lang("leaders"), lang("promoted.to.leader", promotedName));
requestClan.promote(targetPlayer);
} else {
String deniers = String.join(", ", denies);
requestClan.leaderAnnounce(RED + lang("denied.the.promotion", deniers, promotedName));
}
}
private void processDemote(Request req, Clan requestClan, UUID targetPlayer, List<String> denies) {
private void processDemote(Request req, Clan requestClan, UUID targetPlayer, List<String> denies) {
String demotedName = req.getTarget();
if (denies.isEmpty()) {
requestClan.addBb(lang("leaders"), ChatColor.AQUA
+ lang("demoted.back.to.member", demotedName));
requestClan.addBb(lang("leaders"), lang("demoted.back.to.member", demotedName));
requestClan.demote(targetPlayer);
} else {
String deniers = String.join(", ", denies);
@@ -315,11 +351,11 @@ public final class RequestManager {
if (targetClan != null && requestClan != null) {
if (!accepts.isEmpty()) {
requestClan.removeRival(targetClan);
targetClan.addBb(requester.getName(), ChatColor.AQUA + lang("broken.the.rivalry", accepts.get(0), requestClan.getName()));
requestClan.addBb(requester.getName(), ChatColor.AQUA + lang("broken.the.rivalry.with", requester.getName(), targetClan.getName()));
targetClan.addBb(requester.getName(), lang("broken.the.rivalry", accepts.get(0), requestClan.getName()));
requestClan.addBb(requester.getName(), lang("broken.the.rivalry.with", requester.getName(), targetClan.getName()));
} else {
targetClan.addBb(requester.getName(), ChatColor.AQUA + lang("denied.to.make.peace", denies.get(0), requestClan.getName()));
requestClan.addBb(requester.getName(), ChatColor.AQUA + lang("peace.agreement.denied", targetClan.getName()));
targetClan.addBb(requester.getName(), lang("denied.to.make.peace", denies.get(0), requestClan.getName()));
requestClan.addBb(requester.getName(), lang("peace.agreement.denied", targetClan.getName()));
}
}
}
@@ -330,11 +366,11 @@ public final class RequestManager {
if (!accepts.isEmpty()) {
requestClan.addAlly(targetClan);
targetClan.addBb(requester.getName(), ChatColor.AQUA + lang("accepted.an.alliance", accepts.get(0), requestClan.getName()));
requestClan.addBb(requester.getName(), ChatColor.AQUA + lang("created.an.alliance", requester.getName(), targetClan.getName()));
targetClan.addBb(requester.getName(), lang("accepted.an.alliance", accepts.get(0), requestClan.getName()));
requestClan.addBb(requester.getName(), lang("created.an.alliance", requester.getName(), targetClan.getName()));
} else {
targetClan.addBb(requester.getName(), ChatColor.AQUA + lang("denied.an.alliance", denies.get(0), requestClan.getName()));
requestClan.addBb(requester.getName(), ChatColor.AQUA + lang("the.alliance.was.denied", targetClan.getName()));
targetClan.addBb(requester.getName(), lang("denied.an.alliance", denies.get(0), requestClan.getName()));
requestClan.addBb(requester.getName(), lang("the.alliance.was.denied", targetClan.getName()));
}
}
}
@@ -348,11 +384,11 @@ public final class RequestManager {
requestClan.removeWarringClan(targetClan);
targetClan.removeWarringClan(requestClan);
targetClan.addBb(requester.getName(), ChatColor.AQUA + lang("you.are.no.longer.at.war", accepts.get(0), requestClan.getColorTag()));
requestClan.addBb(requester.getName(), ChatColor.AQUA + lang("you.are.no.longer.at.war", requestClan.getName(), targetClan.getColorTag()));
targetClan.addBb(requester.getName(), lang("you.are.no.longer.at.war", accepts.get(0), requestClan.getColorTag()));
requestClan.addBb(requester.getName(), lang("you.are.no.longer.at.war", requestClan.getName(), targetClan.getColorTag()));
} else {
targetClan.addBb(requester.getName(), ChatColor.AQUA + lang("denied.war.end", denies.get(0), requestClan.getName()));
requestClan.addBb(requester.getName(), ChatColor.AQUA + lang("end.war.denied", targetClan.getName()));
targetClan.addBb(requester.getName(), lang("denied.war.end", denies.get(0), requestClan.getName()));
requestClan.addBb(requester.getName(), lang("end.war.denied", targetClan.getName()));
}
}
}
@@ -363,9 +399,9 @@ public final class RequestManager {
if (!accepts.isEmpty()) {
plugin.getProtectionManager().addWar(requester, requestClan, targetClan);
} else {
targetClan.addBb(requester.getName(), ChatColor.AQUA + lang("denied.war.req", denies.get(0),
targetClan.addBb(requester.getName(), lang("denied.war.req", denies.get(0),
requestClan.getName()));
requestClan.addBb(requester.getName(), ChatColor.AQUA + lang("end.war.denied",
requestClan.addBb(requester.getName(), lang("end.war.denied",
targetClan.getName()));
}
}
@@ -406,10 +442,10 @@ public final class RequestManager {
* Starts the task that asks for the votes of all requests
*/
public void askerTask() {
new BukkitRunnable() {
@Override
public void run() {
new BukkitRunnable() {
@Override
public void run() {
for (Iterator<Map.Entry<String, Request>> iter = requests.entrySet().iterator(); iter.hasNext(); ) {
Request req = iter.next().getValue();
@@ -422,9 +458,10 @@ public final class RequestManager {
}
ask(req);
req.incrementAskCount();
}
}}.runTaskTimerAsynchronously(plugin, 0, plugin.getSettingsManager().getSeconds(REQUEST_FREQUENCY));
req.incrementAskCount();
}
}
}.runTaskTimerAsynchronously(plugin, 0, plugin.getSettingsManager().getSeconds(REQUEST_FREQUENCY));
}
/**
@@ -1,6 +1,7 @@
package net.sacredlabyrinth.phaed.simpleclans.managers;
import com.cryptomorin.xseries.XMaterial;
import net.sacredlabyrinth.phaed.simpleclans.Rank;
import net.sacredlabyrinth.phaed.simpleclans.SimpleClans;
import net.sacredlabyrinth.phaed.simpleclans.utils.ChatUtils;
import org.bukkit.Material;
@@ -250,6 +251,22 @@ public final class SettingsManager {
}
}
@SuppressWarnings("unchecked")
public @NotNull Collection<Rank> getStarterRanks() {
List<Rank> ranks = new ArrayList<>();
List<Map<?, ?>> mapList = config.getMapList("clan.starter-ranks");
for (Map<?, ?> rankMap : mapList) {
Set<String> names = (Set<String>) rankMap.keySet();
for (String name : names) {
Map<String, Object> rank = (Map<String, Object>) rankMap.get(name);
String displayName = (String) rank.get("display-name");
List<String> permissions = (List<String>) rank.get("permissions");
ranks.add(new Rank(name, displayName, new HashSet<>(permissions)));
}
}
return ranks;
}
public FileConfiguration getConfig() {
return config;
}
@@ -290,13 +307,14 @@ public final class SettingsManager {
ALLOW_RESET_KDR("settings.allow-reset-kdr", false),
REJOIN_COOLDOWN("settings.rejoin-cooldown", 60),
ENABLE_REJOIN_COOLDOWN("settings.rejoin-cooldown-enabled", false),
ACCEPT_OTHER_ALPHABETS_LETTERS("settings.accept-other-alphabets-letters-on-tag", false),
RANKING_TYPE("settings.ranking-type", "DENSE"),
LIST_DEFAULT_ORDER_BY("settings.list-default-order-by", "kdr"),
LORE_LENGTH("settings.lore-length", 36),
PVP_ONLY_WHILE_IN_WAR("settings.pvp-only-while-at-war", false),
PAST_CLANS_LIMIT("settings.past-clans-limit", 10),
USERNAME_REGEX("settings.username-regex", "^\\**[a-zA-Z0-9_$]{1,16}$"),
TAG_REGEX("settings.tag-regex", ""),
ACCEPT_OTHER_ALPHABETS_LETTERS("settings.accept-other-alphabets-letters-on-tag", false),
/*
================
> Tag Settings
@@ -304,12 +322,12 @@ public final class SettingsManager {
*
*/
TAG_DEFAULT_COLOR("tag.default-color", "8"),
TAG_MAX_LENGTH("tag.max-length", 5),
TAG_BRACKET_COLOR("tag.bracket.color", "8"),
TAG_BRACKET_LEADER_COLOR("tag.bracket.leader-color", "4"),
TAG_BRACKET_LEFT("tag.bracket.left", ""),
TAG_BRACKET_RIGHT("tag.bracket.right", ""),
TAG_MAX_LENGTH("tag.max-length", 5),
TAG_MIN_LENGTH("tag.min-length", 2),
TAG_BRACKET_RIGHT("tag.bracket.right", ""),
TAG_SEPARATOR_COLOR("tag.separator.color", "8"),
TAG_SEPARATOR_LEADER_COLOR("tag.separator.leader-color", "4"),
TAG_SEPARATOR_CHAR("tag.separator.char", " ."),
@@ -383,8 +401,8 @@ public final class SettingsManager {
ECONOMY_PURCHASE_HOME_TELEPORT_SET("economy.purchase-home-teleport-set", false),
ECONOMY_REGROUP_PRICE("economy.home-regroup-price", 5.0),
ECONOMY_PURCHASE_HOME_REGROUP("economy.purchase-home-regroup", false),
ECONOMY_PURCHASE_DISCORD_CREATE("purchase-discord-create", false),
ECONOMY_DISCORD_CREATION_PRICE("discord-creation-price", 1000.0),
ECONOMY_PURCHASE_DISCORD_CREATE("economy.purchase-discord-create", false),
ECONOMY_DISCORD_CREATION_PRICE("economy.discord-creation-price", 1000.0),
ECONOMY_UNIQUE_TAX_ON_REGROUP("economy.unique-tax-on-regroup", true),
ECONOMY_ISSUER_PAYS_REGROUP("economy.issuer-pays-regroup", true),
ECONOMY_MONEY_PER_KILL("economy.money-per-kill", false),
@@ -459,6 +477,7 @@ public final class SettingsManager {
PAGE_HEADINGS_COLOR("page.headings-color", "8"),
PAGE_SEPARATOR("page.separator", "-"),
PAGE_SIZE("page.size", 100),
HELP_SIZE("page.help-size", 10),
/*
================
> Clan Chat Settings
@@ -496,8 +515,7 @@ public final class SettingsManager {
> BB Settings
================
*/
BB_COLOR("bb.color", "e"),
BB_ACCENT_COLOR("bb.accent-color", "8"),
BB_PREFIX("bb.prefix", "&8* &e"),
BB_SHOW_ON_LOGIN("bb.show-on-login", true),
BB_SIZE("bb.size", 6),
BB_LOGIN_SIZE("bb.login-size", 6),
@@ -19,12 +19,13 @@ import org.bukkit.inventory.ItemStack;
import org.bukkit.scheduler.BukkitRunnable;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.json.simple.JSONObject;
import java.sql.*;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.MessageFormat;
import java.util.*;
import java.util.Date;
import java.util.logging.Level;
import static net.sacredlabyrinth.phaed.simpleclans.SimpleClans.lang;
@@ -286,6 +287,7 @@ public final class StorageManager {
* Used for BungeeCord Reload ClanPlayer and your Clan
*
*/
@Deprecated
public void importFromDatabaseOnePlayer(Player player) {
plugin.getClanManager().deleteClanPlayerFromMemory(player.getUniqueId());
@@ -299,7 +301,7 @@ public final class StorageManager {
}
plugin.getClanManager().importClanPlayer(cp);
plugin.getLogger().info("ClanPlayer Reloaded: " + player.getName() + ", UUID: " + player.getUniqueId().toString());
plugin.getLogger().info("ClanPlayer Reloaded: " + player.getName() + ", UUID: " + player.getUniqueId());
}
}
@@ -378,7 +380,7 @@ public final class StorageManager {
String packed_rivals = res.getString("packed_rivals");
String packed_bb = res.getString("packed_bb");
String flags = res.getString("flags");
JSONObject ranks = Helper.parseJson(res.getString("ranks"));
String ranksJson = res.getString("ranks");
long founded = res.getLong("founded");
long last_used = res.getLong("last_used");
double balance = res.getDouble("balance");
@@ -410,8 +412,8 @@ public final class StorageManager {
clan.setBalance(BankOperator.INTERNAL, ClanBalanceUpdateEvent.Cause.LOADING, BankLogger.Operation.SET, balance);
clan.setMemberFee(feeValue);
clan.setMemberFeeEnabled(feeEnabled);
clan.setRanks(Helper.ranksFromJson(ranks));
clan.setDefaultRank(Helper.defaultRankFromJson(ranks));
clan.setRanks(Helper.ranksFromJson(ranksJson));
clan.setDefaultRank(Helper.defaultRankFromJson(ranksJson));
clan.setBanner(banner);
out.add(clan);
@@ -452,7 +454,7 @@ public final class StorageManager {
String packed_rivals = res.getString("packed_rivals");
String packed_bb = res.getString("packed_bb");
String flags = res.getString("flags");
JSONObject ranks = Helper.parseJson(res.getString("ranks"));
String ranksJson = res.getString("ranks");
long founded = res.getLong("founded");
long last_used = res.getLong("last_used");
double balance = res.getDouble("balance");
@@ -484,8 +486,8 @@ public final class StorageManager {
clan.setBalance(BankOperator.INTERNAL, ClanBalanceUpdateEvent.Cause.LOADING, BankLogger.Operation.SET, balance);
clan.setMemberFee(feeValue);
clan.setMemberFeeEnabled(feeEnabled);
clan.setRanks(Helper.ranksFromJson(ranks));
clan.setDefaultRank(Helper.defaultRankFromJson(ranks));
clan.setRanks(Helper.ranksFromJson(ranksJson));
clan.setDefaultRank(Helper.defaultRankFromJson(ranksJson));
clan.setBanner(banner);
out = clan;
@@ -536,11 +538,7 @@ public final class StorageManager {
if (last_seen == 0) {
last_seen = (new Date()).getTime();
}
if (join_date == 0) {
join_date = (new Date()).getTime();
}
}
ClanPlayer cp = new ClanPlayer();
if (uuid != null) {
@@ -620,10 +618,6 @@ public final class StorageManager {
last_seen = (new Date()).getTime();
}
if (join_date == 0) {
join_date = (new Date()).getTime();
}
ClanPlayer cp = new ClanPlayer();
if (uuid != null) {
cp.setUniqueId(UUID.fromString(uuid));
@@ -690,6 +684,8 @@ public final class StorageManager {
*
*/
public void insertClan(Clan clan) {
plugin.getProxyManager().sendUpdate(clan);
String query = "INSERT INTO `sc_clans` (`banner`, `ranks`, `description`, `fee_enabled`, `fee_value`, `verified`, `tag`," +
" `color_tag`, `name`, `friendly_fire`, `founded`, `last_used`, `packed_allies`, `packed_rivals`, " +
"`packed_bb`, `cape_url`, `flags`, `balance`) ";
@@ -772,6 +768,7 @@ public final class StorageManager {
if (updateLastUsed) {
clan.updateLastUsed();
}
plugin.getProxyManager().sendUpdate(clan);
if (plugin.getSettingsManager().is(PERFORMANCE_SAVE_PERIODICALLY)) {
modifiedClans.add(clan);
return;
@@ -816,6 +813,7 @@ public final class StorageManager {
* Delete a clan from the database
*/
public void deleteClan(Clan clan) {
plugin.getProxyManager().sendDelete(clan);
String query = "DELETE FROM `sc_clans` WHERE tag = '" + clan.getTag() + "';";
core.executeUpdate(query);
}
@@ -825,6 +823,8 @@ public final class StorageManager {
*
*/
public void insertClanPlayer(ClanPlayer cp) {
plugin.getProxyManager().sendUpdate(cp);
String query = "INSERT INTO `sc_players` (`uuid`, `name`, `leader`, `tag`, `friendly_fire`, `neutral_kills`, " +
"`rival_kills`, `civilian_kills`, `deaths`, `last_seen`, `join_date`, `packed_past_clans`, `flags`) ";
String values = "VALUES ('" + cp.getUniqueId().toString() + "', '" + cp.getName() + "',"
@@ -856,6 +856,7 @@ public final class StorageManager {
*/
public void updateClanPlayer(ClanPlayer cp) {
cp.updateLastSeen();
plugin.getProxyManager().sendUpdate(cp);
if (plugin.getSettingsManager().is(PERFORMANCE_SAVE_PERIODICALLY)) {
modifiedClanPlayers.add(cp);
return;
@@ -900,9 +901,10 @@ public final class StorageManager {
public void deleteClanPlayer(ClanPlayer cp) {
final Clan clan = cp.getClan();
if (clan != null) {
clan.addBbWithoutSaving(ChatColor.AQUA + MessageFormat.format(lang("has.been.purged"), cp.getName()));
clan.addBbWithoutSaving(MessageFormat.format(lang("has.been.purged"), cp.getName()));
updateClan(clan, false);
}
plugin.getProxyManager().sendDelete(cp);
String query = "DELETE FROM `sc_players` WHERE uuid = '" + cp.getUniqueId() + "';";
core.executeUpdate(query);
deleteKills(cp.getUniqueId());
@@ -1221,9 +1223,11 @@ public final class StorageManager {
/**
* Saves modified Clans and ClanPlayers to the database
*
* @author RoinujNosde
* @since 2.10.2
* @since 2.10.2
*
* <p>
* author: RoinujNosde
* </p>
*/
public void saveModified() {
try (PreparedStatement pst = prepareUpdateClanPlayerStatement(core.getConnection())) {
@@ -14,7 +14,6 @@ import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.PlayerInventory;
import org.jetbrains.annotations.NotNull;
import java.text.MessageFormat;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
@@ -46,15 +45,16 @@ public final class TeleportManager {
* @param clanName the Clan name
*/
public void addPlayer(Player player, Location destination, String clanName) {
PermissionsManager pm = plugin.getPermissionsManager();
int secs = SimpleClans.getInstance().getSettingsManager().getInt(CLAN_TELEPORT_DELAY);
if (plugin.getPermissionsManager().has(player, "simpleclans.mod.bypass")) {
if (pm.has(player, "simpleclans.mod.bypass") || pm.has(player, "simpleclans.vip.teleport-delay")) {
secs = 0;
}
waitingPlayers.put(player.getUniqueId().toString(), new TeleportState(player, destination, clanName, secs));
if (secs > 0) {
ChatBlock.sendMessage(player, AQUA
+ MessageFormat.format(lang("waiting.for.teleport.stand.still.for.0.seconds", player), secs));
ChatBlock.sendMessage(player, AQUA + lang("waiting.for.teleport.stand.still.for.0.seconds", player, secs));
}
}
@@ -0,0 +1,29 @@
package net.sacredlabyrinth.phaed.simpleclans.migrations;
import net.sacredlabyrinth.phaed.simpleclans.managers.SettingsManager;
/**
* Class responsible to migrate from old bb format to new one.
* <p>
* `bb.accent-color` and `bb.color` replaced to `bb.prefix`.
* </p>
*
* @since 2.19.0
*/
public class BbMigration extends ConfigMigration {
public BbMigration(SettingsManager settingsManager) {
super(settingsManager);
}
@Override
public void migrate() {
if (config.contains("bb.accent-color")) {
config.set("bb.accent-color", null);
}
if (config.contains("bb.color")) {
config.set("bb.color", null);
}
}
}
@@ -0,0 +1,98 @@
package net.sacredlabyrinth.phaed.simpleclans.migrations;
import net.sacredlabyrinth.phaed.simpleclans.managers.SettingsManager;
import static net.sacredlabyrinth.phaed.simpleclans.managers.SettingsManager.ConfigField.*;
/**
* @author RoinujNosde
*/
public class ChatFormatMigration extends ConfigMigration {
public ChatFormatMigration(SettingsManager settingsManager) {
super(settingsManager);
}
public void migrateClanChat() {
if (config.getString("clanchat.name-color") == null) {
return;
}
StringBuilder sb = new StringBuilder();
sb.append('&');
sb.append(settings.getColored(CLANCHAT_BRACKET_COLOR));
sb.append(settings.getString(CLANCHAT_BRACKET_LEFT));
sb.append("%clan%");
sb.append("&");
sb.append(settings.getColored(CLANCHAT_BRACKET_COLOR));
sb.append(settings.getString(CLANCHAT_BRACKET_RIGHT));
sb.append(" ");
sb.append('&');
sb.append(settings.getColored(CLANCHAT_NAME_COLOR));
sb.append(settings.getString(CLANCHAT_PLAYER_BRACKET_LEFT));
sb.append("%nick-color%");
sb.append("%player%");
sb.append('&');
sb.append(settings.getColored(CLANCHAT_NAME_COLOR));
sb.append(settings.getString(CLANCHAT_PLAYER_BRACKET_RIGHT));
sb.append(" %rank%: ");
sb.append('&');
sb.append(settings.getColored(CLANCHAT_MESSAGE_COLOR));
sb.append("%message%");
config.set("clanchat.format", sb.toString());
config.set("clanchat.rank", "&f[%rank%&f]");
config.set("clanchat.rank.color", null);
config.set("clanchat.name-color", null);
config.set("clanchat.player-bracket", null);
config.set("clanchat.message-color", null);
config.set("clanchat.tag-bracket", null);
}
public void migrateAllyChat() {
//Checks if the old format is still in use
if (config.getString("allychat.tag-color") == null) {
return;
}
StringBuilder sb = new StringBuilder();
sb.append('&');
sb.append(settings.getColored(ALLYCHAT_BRACKET_COLOR));
sb.append(settings.getString(ALLYCHAT_BRACKET_lEFT));
sb.append('&');
sb.append(settings.getColored(ALLYCHAT_TAG_COLOR));
sb.append(settings.getString(COMMANDS_ALLY));
sb.append('&');
sb.append(settings.getColored(ALLYCHAT_BRACKET_COLOR));
sb.append(settings.getString(ALLYCHAT_BRACKET_RIGHT));
sb.append(" ");
sb.append("&4<%clan%&4> ");
sb.append('&');
sb.append(settings.getColored(ALLYCHAT_BRACKET_COLOR));
sb.append(settings.getString(ALLYCHAT_PLAYER_BRACKET_LEFT));
sb.append("%nick-color%");
sb.append("%player%");
sb.append('&');
sb.append(settings.getColored(ALLYCHAT_BRACKET_COLOR));
sb.append(settings.getString(ALLYCHAT_PLAYER_BRACKET_RIGHT));
sb.append(" %rank%: ");
sb.append('&');
sb.append(settings.getColored(ALLYCHAT_MESSAGE_COLOR));
sb.append("%message%");
config.set("allychat.format", sb.toString());
config.set("allychat.rank", "&f[%rank%&f]");
config.set("allychat.tag-color", null);
config.set("allychat.name-color", null);
config.set("allychat.player-bracket", null);
config.set("allychat.message-color", null);
config.set("allychat.tag-bracket", null);
}
@Override
public void migrate() {
migrateClanChat();
migrateAllyChat();
}
}
@@ -0,0 +1,18 @@
package net.sacredlabyrinth.phaed.simpleclans.migrations;
import net.sacredlabyrinth.phaed.simpleclans.managers.SettingsManager;
import org.bukkit.configuration.file.FileConfiguration;
public abstract class ConfigMigration implements Migration {
protected final SettingsManager settings;
protected final FileConfiguration config;
public ConfigMigration(SettingsManager settingsManager) {
this.settings = settingsManager;
this.config = settings.getConfig();
migrate();
settings.save();
}
}
@@ -1,37 +1,29 @@
package net.sacredlabyrinth.phaed.simpleclans.language;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
package net.sacredlabyrinth.phaed.simpleclans.migrations;
import net.sacredlabyrinth.phaed.simpleclans.SimpleClans;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
/**
* Utility class that migrates old language files (yaml) to the new format (properties)
*
*
* @author RoinujNosde
*
*/
public class LanguageMigration {
private SimpleClans plugin;
public class LanguageMigration implements Migration {
private final SimpleClans plugin;
public LanguageMigration(SimpleClans plugin) {
this.plugin = plugin;
}
/**
* Migrates all language files in the plugin's data folder
*/
@@ -43,7 +35,7 @@ public class LanguageMigration {
File[] languageFiles = dataFolder.listFiles(f -> {
return f.getName().startsWith("language") && f.getName().endsWith(".yml");
});
for (File file : languageFiles) {
convert(file);
backup(file);
@@ -53,21 +45,22 @@ public class LanguageMigration {
/**
* Copies the file to the backup folder
*
* @param file the file to backup
*
* @param file the file to back up
*/
@SuppressWarnings("ResultOfMethodCallIgnored")
private void backup(File file) {
File backupFolder = new File(plugin.getDataFolder(), "language_backup");
if (!backupFolder.exists()) {
backupFolder.mkdir();
}
file.renameTo(new File(backupFolder, file.getName()));
file.renameTo(new File(backupFolder, file.getName()));
}
/**
* Converts the yaml file to properties
*
*
* @param file
*/
private void convert(File file) {
@@ -0,0 +1,6 @@
package net.sacredlabyrinth.phaed.simpleclans.migrations;
public interface Migration {
void migrate();
}
@@ -0,0 +1,213 @@
package net.sacredlabyrinth.phaed.simpleclans.proxy;
import com.google.common.io.ByteArrayDataInput;
import com.google.common.io.ByteArrayDataOutput;
import com.google.common.io.ByteStreams;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import net.sacredlabyrinth.phaed.simpleclans.Clan;
import net.sacredlabyrinth.phaed.simpleclans.ClanPlayer;
import net.sacredlabyrinth.phaed.simpleclans.SimpleClans;
import net.sacredlabyrinth.phaed.simpleclans.chat.SCMessage;
import net.sacredlabyrinth.phaed.simpleclans.managers.SettingsManager.ConfigField;
import net.sacredlabyrinth.phaed.simpleclans.proxy.adapters.ClanPlayerListAdapter;
import net.sacredlabyrinth.phaed.simpleclans.proxy.adapters.ClanPlayerTypeAdapterFactory;
import net.sacredlabyrinth.phaed.simpleclans.proxy.adapters.ConfigurationSerializableAdapter;
import net.sacredlabyrinth.phaed.simpleclans.proxy.adapters.SCMessageAdapter;
import net.sacredlabyrinth.phaed.simpleclans.proxy.listeners.MessageListener;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.plugin.messaging.PluginMessageListener;
import org.jetbrains.annotations.NotNull;
import java.util.*;
import java.util.logging.Level;
public final class BungeeManager implements ProxyManager, PluginMessageListener {
private static final String UPDATE_CLAN_CHANNEL = "UpdateClan";
private static final String UPDATE_CLANPLAYER_CHANNEL = "UpdateClanPlayer";
private static final String DELETE_CLAN_CHANNEL = "DeleteClan";
private static final String DELETE_CLANPLAYER_CHANNEL = "DeleteClanPlayer";
private static final String CHAT_CHANNEL = "Chat";
private final SimpleClans plugin;
private final Gson gson;
private final List<String> onlinePlayers = new ArrayList<>();
private String serverName = "";
private final Set<String> unknownChannels = new HashSet<>();
public BungeeManager(SimpleClans plugin) {
this.plugin = plugin;
gson = new GsonBuilder().registerTypeAdapterFactory(new ClanPlayerTypeAdapterFactory(plugin))
.registerTypeAdapterFactory(new ConfigurationSerializableAdapter())
.registerTypeAdapter(ClanPlayerListAdapter.getType(), new ClanPlayerListAdapter(plugin))
.registerTypeAdapter(SCMessage.class, new SCMessageAdapter(plugin)).setExclusionStrategies()
.create();
if (!plugin.getSettingsManager().is(ConfigField.PERFORMANCE_USE_BUNGEECORD)) {
return;
}
Bukkit.getMessenger().registerOutgoingPluginChannel(plugin, "BungeeCord");
Bukkit.getMessenger().registerIncomingPluginChannel(plugin, "BungeeCord", this);
Bukkit.getScheduler().runTaskTimer(plugin, this::requestPlayerList, 0, 60 * 20);
requestServerName();
}
@SuppressWarnings("UnstableApiUsage")
public void onPluginMessageReceived(@NotNull String channel, @NotNull Player player, byte[] data) {
ByteArrayDataInput input = ByteStreams.newDataInput(data);
String subChannel = input.readUTF();
if (unknownChannels.contains(subChannel)) {
return;
}
SimpleClans.debug("Message received, sub-channel: " + subChannel);
try {
Class<?> clazz = Class.forName("net.sacredlabyrinth.phaed.simpleclans.proxy.listeners." + subChannel);
MessageListener listener = (MessageListener) clazz.getConstructor(BungeeManager.class).newInstance(this);
listener.accept(input);
SimpleClans.debug("Message processed");
} catch (ClassNotFoundException e) {
SimpleClans.debug(String.format("Unknown channel: %s", subChannel));
unknownChannels.add(subChannel);
} catch (ReflectiveOperationException ex) {
plugin.getLogger().log(Level.SEVERE, String.format("Error processing channel %s", subChannel), ex);
}
}
@Override
public boolean isOnline(String playerName) {
if (Bukkit.getOnlinePlayers().stream().anyMatch(player -> player.getName().equals(playerName))) {
return true;
}
return onlinePlayers.contains(playerName);
}
public void setOnlinePlayers(@NotNull List<String> onlinePlayers) {
this.onlinePlayers.clear();
this.onlinePlayers.addAll(onlinePlayers);
}
@Override
public String getServerName() {
return serverName;
}
public void setServerName(@NotNull String name) {
this.serverName = name;
}
@Override
public void sendMessage(SCMessage message) {
forwardPluginMessage(CHAT_CHANNEL, gson.toJson(message), false);
}
@SuppressWarnings("UnstableApiUsage")
@Override
public void sendMessage(@NotNull String target, @NotNull String message) {
if (isChannelRegistered()) {
ByteArrayDataOutput output = ByteStreams.newDataOutput();
output.writeUTF("Message");
output.writeUTF(target);
output.writeUTF(message);
sendOnBungeeChannel(output);
} else {
if ("ALL".equals(target)) {
Bukkit.getOnlinePlayers().forEach(p -> p.sendMessage(message));
} else {
Optional.ofNullable(Bukkit.getPlayer(target)).ifPresent(p -> p.sendMessage(message));
}
}
}
@Override
public void sendDelete(Clan clan) {
forwardPluginMessage(DELETE_CLAN_CHANNEL, clan.getTag());
}
@Override
public void sendDelete(ClanPlayer cp) {
forwardPluginMessage(DELETE_CLANPLAYER_CHANNEL, cp.getUniqueId().toString());
}
@Override
public void sendUpdate(Clan clan) {
forwardPluginMessage(UPDATE_CLAN_CHANNEL, gson.toJson(clan));
}
@Override
public void sendUpdate(ClanPlayer cp) {
forwardPluginMessage(UPDATE_CLANPLAYER_CHANNEL, gson.toJson(cp));
}
public SimpleClans getPlugin() {
return plugin;
}
public Gson getGson() {
return gson;
}
@SuppressWarnings("UnstableApiUsage")
private void requestPlayerList() {
if (!isChannelRegistered()) {
return;
}
ByteArrayDataOutput output = ByteStreams.newDataOutput();
output.writeUTF("PlayerList");
output.writeUTF("ALL");
sendOnBungeeChannel(output);
}
private void requestServerName() {
Listener listener = new Listener() {
@SuppressWarnings("UnstableApiUsage")
@EventHandler
void on(PlayerJoinEvent event) {
ByteArrayDataOutput output = ByteStreams.newDataOutput();
output.writeUTF("GetServer");
Bukkit.getScheduler().runTask(plugin, () -> {
event.getPlayer().sendPluginMessage(plugin, "BungeeCord", output.toByteArray());
PlayerJoinEvent.getHandlerList().unregister(this); //only needed once
});
}
};
Bukkit.getPluginManager().registerEvents(listener, plugin);
}
private void forwardPluginMessage(final String subChannel, final String message) {
forwardPluginMessage(subChannel, message, true);
}
@SuppressWarnings("UnstableApiUsage")
private void forwardPluginMessage(final String subChannel, final String message, final boolean all) {
SimpleClans.debug(String.format("Forwarding message, channel %s, message %s, all %s", subChannel, message, all));
if (!isChannelRegistered()) {
SimpleClans.debug("Not registered");
return;
}
String target = all ? "ALL" : "ONLINE";
ByteArrayDataOutput output = ByteStreams.newDataOutput();
output.writeUTF("Forward");
output.writeUTF(target);
output.writeUTF(subChannel);
output.writeUTF(message);
sendOnBungeeChannel(output);
}
private void sendOnBungeeChannel(ByteArrayDataOutput output) {
Bukkit.getOnlinePlayers().stream().findAny().ifPresent(player ->
player.sendPluginMessage(plugin, "BungeeCord", output.toByteArray()));
}
private boolean isChannelRegistered() {
return Bukkit.getMessenger().isOutgoingChannelRegistered(plugin, "BungeeCord");
}
}
@@ -0,0 +1,24 @@
package net.sacredlabyrinth.phaed.simpleclans.proxy;
import net.sacredlabyrinth.phaed.simpleclans.Clan;
import net.sacredlabyrinth.phaed.simpleclans.ClanPlayer;
import net.sacredlabyrinth.phaed.simpleclans.chat.SCMessage;
public interface ProxyManager {
String getServerName();
boolean isOnline(String playerName);
void sendMessage(SCMessage message);
void sendMessage(String target, String message);
void sendUpdate(Clan clan);
void sendUpdate(ClanPlayer cp);
void sendDelete(Clan clan);
void sendDelete(ClanPlayer cp);
}
@@ -0,0 +1,57 @@
package net.sacredlabyrinth.phaed.simpleclans.proxy.adapters;
import com.google.gson.TypeAdapter;
import com.google.gson.reflect.TypeToken;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonToken;
import com.google.gson.stream.JsonWriter;
import net.sacredlabyrinth.phaed.simpleclans.ClanPlayer;
import net.sacredlabyrinth.phaed.simpleclans.SimpleClans;
import java.io.IOException;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
public class ClanPlayerListAdapter extends TypeAdapter<List<ClanPlayer>> {
private final SimpleClans plugin;
public ClanPlayerListAdapter(SimpleClans plugin) {
this.plugin = plugin;
}
@Override
public void write(JsonWriter out, List<ClanPlayer> value) throws IOException {
out.beginArray();
for (ClanPlayer clanPlayer : value) {
out.beginObject();
out.name("uuid");
out.value(clanPlayer.getUniqueId().toString());
out.endObject();
}
out.endArray();
}
@Override
public List<ClanPlayer> read(JsonReader in) throws IOException {
List<ClanPlayer> list = new ArrayList<>();
in.beginArray();
while (in.peek() == JsonToken.BEGIN_OBJECT) {
in.beginObject();
in.nextName();
UUID uuid = UUID.fromString(in.nextString());
ClanPlayer cp = plugin.getClanManager().getAnyClanPlayer(uuid);
in.endObject();
if (cp != null) {
list.add(cp);
}
}
in.endArray();
return list;
}
public static Type getType() {
return TypeToken.getParameterized(List.class, ClanPlayer.class).getType();
}
}
@@ -0,0 +1,52 @@
package net.sacredlabyrinth.phaed.simpleclans.proxy.adapters;
import com.google.gson.Gson;
import com.google.gson.JsonObject;
import com.google.gson.TypeAdapter;
import com.google.gson.TypeAdapterFactory;
import com.google.gson.reflect.TypeToken;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonWriter;
import net.sacredlabyrinth.phaed.simpleclans.Clan;
import net.sacredlabyrinth.phaed.simpleclans.ClanPlayer;
import net.sacredlabyrinth.phaed.simpleclans.SimpleClans;
import org.jetbrains.annotations.Nullable;
public class ClanPlayerTypeAdapterFactory implements TypeAdapterFactory {
private final SimpleClans plugin;
public ClanPlayerTypeAdapterFactory(SimpleClans plugin) {
this.plugin = plugin;
}
@SuppressWarnings("unchecked")
@Override
public <T> @Nullable TypeAdapter<T> create(Gson gson, TypeToken<T> type) {
if (type.getType() != ClanPlayer.class) {
return null;
}
final TypeAdapter<ClanPlayer> delegate = (TypeAdapter<ClanPlayer>) gson.getDelegateAdapter(this, type);
return (TypeAdapter<T>) new TypeAdapter<ClanPlayer>() {
@Override
public void write(JsonWriter out, ClanPlayer value) {
JsonObject object = delegate.toJsonTree(value).getAsJsonObject();
object.addProperty("clan", value.getTag());
gson.toJson(object, out);
}
@Override
public ClanPlayer read(JsonReader in) {
JsonObject object = gson.fromJson(in, JsonObject.class);
String tag = object.get("clan").getAsString();
Clan clan = plugin.getClanManager().getClan(tag);
object.add("clan", null);
ClanPlayer cp = delegate.fromJsonTree(object);
cp.setClan(clan);
return cp;
}
};
}
}
@@ -0,0 +1,47 @@
package net.sacredlabyrinth.phaed.simpleclans.proxy.adapters;
import com.google.gson.Gson;
import com.google.gson.TypeAdapter;
import com.google.gson.TypeAdapterFactory;
import com.google.gson.reflect.TypeToken;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonToken;
import com.google.gson.stream.JsonWriter;
import org.bukkit.configuration.serialization.ConfigurationSerializable;
import org.bukkit.configuration.serialization.ConfigurationSerialization;
import java.io.IOException;
import java.util.Map;
@SuppressWarnings({"unchecked", "rawtypes"})
public class ConfigurationSerializableAdapter implements TypeAdapterFactory {
@Override
public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> type) {
if (!ConfigurationSerializable.class.isAssignableFrom(type.getRawType())) {
return null;
}
TypeAdapter<Map> adapter = gson.getAdapter(Map.class);
return (TypeAdapter<T>) new TypeAdapter<ConfigurationSerializable>() {
@Override
public void write(JsonWriter out, ConfigurationSerializable value) throws IOException {
if (value == null) {
out.nullValue();
} else {
adapter.write(out, value.serialize());
}
}
@Override
public ConfigurationSerializable read(JsonReader in) throws IOException {
if (in.peek() == JsonToken.NULL) { //could be replaced with map == null?
in.nextNull();
return null;
}
Map map = adapter.read(in);
return ConfigurationSerialization.deserializeObject(map,
(Class<? extends ConfigurationSerializable>) type.getRawType());
}
};
}
}
@@ -0,0 +1,52 @@
package net.sacredlabyrinth.phaed.simpleclans.proxy.adapters;
import com.google.gson.TypeAdapter;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonWriter;
import net.sacredlabyrinth.phaed.simpleclans.ClanPlayer;
import net.sacredlabyrinth.phaed.simpleclans.SimpleClans;
import net.sacredlabyrinth.phaed.simpleclans.chat.SCMessage;
import net.sacredlabyrinth.phaed.simpleclans.chat.SCMessage.Source;
import org.jetbrains.annotations.Nullable;
import java.io.IOException;
import java.util.UUID;
public class SCMessageAdapter extends TypeAdapter<SCMessage> {
private final SimpleClans plugin;
public SCMessageAdapter(SimpleClans plugin) {
this.plugin = plugin;
}
@Override
public void write(JsonWriter out, SCMessage value) throws IOException {
out.beginObject();
out.name("channel");
out.value(value.getChannel().toString());
out.name("sender");
out.value(value.getSender().getUniqueId().toString());
out.name("content");
out.value(value.getContent());
out.endObject();
}
@Override
public @Nullable SCMessage read(JsonReader in) throws IOException {
in.beginObject();
in.nextName();
ClanPlayer.Channel channel = ClanPlayer.Channel.valueOf(in.nextString());
in.nextName();
UUID uuid = UUID.fromString(in.nextString());
ClanPlayer sender = plugin.getClanManager().getAnyClanPlayer(uuid);
in.nextName();
String content = in.nextString();
in.endObject();
if (sender == null) {
return null;
}
return new SCMessage(Source.PROXY, channel, sender, content);
}
}
@@ -0,0 +1,21 @@
package net.sacredlabyrinth.phaed.simpleclans.proxy.listeners;
import com.google.common.io.ByteArrayDataInput;
import net.sacredlabyrinth.phaed.simpleclans.chat.SCMessage;
import net.sacredlabyrinth.phaed.simpleclans.proxy.BungeeManager;
public class Chat extends MessageListener {
public Chat(BungeeManager bungee) {
super(bungee);
}
@Override
public void accept(ByteArrayDataInput data) {
SCMessage message = getGson().fromJson(data.readUTF(), SCMessage.class);
if (message.getSender().getClan() == null) {
return;
}
bungee.getPlugin().getChatManager().processChat(message);
}
}
@@ -0,0 +1,29 @@
package net.sacredlabyrinth.phaed.simpleclans.proxy.listeners;
import com.google.common.io.ByteArrayDataInput;
import net.sacredlabyrinth.phaed.simpleclans.ClanPlayer;
import net.sacredlabyrinth.phaed.simpleclans.proxy.BungeeManager;
import static net.sacredlabyrinth.phaed.simpleclans.SimpleClans.debug;
public class DeleteClan extends MessageListener {
public DeleteClan(BungeeManager bungee) {
super(bungee);
}
@Override
public void accept(ByteArrayDataInput data) {
String tag = data.readUTF();
getClanManager().removeClan(tag);
for (ClanPlayer cp : getClanManager().getAllClanPlayers()) {
if (tag.equals(cp.getTag())) {
cp.setClan(null);
cp.setJoinDate(0);
cp.setRank(null);
cp.setLeader(false);
}
}
debug(String.format("Deleted clan %s", tag));
}
}
@@ -0,0 +1,22 @@
package net.sacredlabyrinth.phaed.simpleclans.proxy.listeners;
import com.google.common.io.ByteArrayDataInput;
import net.sacredlabyrinth.phaed.simpleclans.proxy.BungeeManager;
import java.util.UUID;
import static net.sacredlabyrinth.phaed.simpleclans.SimpleClans.debug;
public class DeleteClanPlayer extends MessageListener {
public DeleteClanPlayer(BungeeManager bungee) {
super(bungee);
}
@Override
public void accept(ByteArrayDataInput data) {
UUID uuid = UUID.fromString(data.readUTF());
getClanManager().deleteClanPlayerFromMemory(uuid);
debug(String.format("Deleted cp %s", uuid));
}
}
@@ -0,0 +1,17 @@
package net.sacredlabyrinth.phaed.simpleclans.proxy.listeners;
import com.google.common.io.ByteArrayDataInput;
import net.sacredlabyrinth.phaed.simpleclans.proxy.BungeeManager;
public class GetServer extends MessageListener {
public GetServer(BungeeManager bungee) {
super(bungee);
}
@Override
public void accept(ByteArrayDataInput data) {
String name = data.readUTF();
bungee.setServerName(name);
}
}
@@ -0,0 +1,26 @@
package net.sacredlabyrinth.phaed.simpleclans.proxy.listeners;
import com.google.common.io.ByteArrayDataInput;
import com.google.gson.Gson;
import net.sacredlabyrinth.phaed.simpleclans.managers.ClanManager;
import net.sacredlabyrinth.phaed.simpleclans.proxy.BungeeManager;
public abstract class MessageListener {
protected final BungeeManager bungee;
public MessageListener(BungeeManager bungee) {
this.bungee = bungee;
}
public abstract void accept(ByteArrayDataInput data);
protected ClanManager getClanManager() {
return bungee.getPlugin().getClanManager();
}
protected Gson getGson() {
return bungee.getGson();
}
}
@@ -0,0 +1,23 @@
package net.sacredlabyrinth.phaed.simpleclans.proxy.listeners;
import com.google.common.io.ByteArrayDataInput;
import net.sacredlabyrinth.phaed.simpleclans.SimpleClans;
import net.sacredlabyrinth.phaed.simpleclans.proxy.BungeeManager;
import java.util.Arrays;
import java.util.List;
public class PlayerList extends MessageListener {
public PlayerList(BungeeManager bungee) {
super(bungee);
}
@Override
public void accept(ByteArrayDataInput data) {
data.readUTF(); // target
List<String> players = Arrays.asList(data.readUTF().split(", "));
bungee.setOnlinePlayers(players);
SimpleClans.debug("Updated player list");
}
}
@@ -0,0 +1,40 @@
package net.sacredlabyrinth.phaed.simpleclans.proxy.listeners;
import com.google.common.io.ByteArrayDataInput;
import net.sacredlabyrinth.phaed.simpleclans.proxy.BungeeManager;
import net.sacredlabyrinth.phaed.simpleclans.utils.ObjectUtils;
import org.jetbrains.annotations.Nullable;
import java.util.logging.Level;
import static net.sacredlabyrinth.phaed.simpleclans.SimpleClans.debug;
public abstract class Update<T> extends MessageListener {
public Update(BungeeManager bungee) {
super(bungee);
}
protected abstract Class<T> getType();
protected abstract @Nullable T getCurrent(T t);
protected abstract void insert(T t);
@Override
public final void accept(ByteArrayDataInput data) {
T t = getGson().fromJson(data.readUTF(), getType());
T current = getCurrent(t);
if (current == null) {
insert(t);
debug(String.format("Inserted %s", t));
return;
}
try {
ObjectUtils.updateFields(t, current);
} catch (IllegalAccessException e) {
bungee.getPlugin().getLogger().log(Level.SEVERE, String.format("An error happened while updating %s", t), e);
}
debug(String.format("Updated %s", t));
}
}
@@ -0,0 +1,28 @@
package net.sacredlabyrinth.phaed.simpleclans.proxy.listeners;
import net.sacredlabyrinth.phaed.simpleclans.Clan;
import net.sacredlabyrinth.phaed.simpleclans.proxy.BungeeManager;
import org.jetbrains.annotations.Nullable;
public class UpdateClan extends Update<Clan> {
public UpdateClan(BungeeManager bungee) {
super(bungee);
}
@Override
protected Class<Clan> getType() {
return Clan.class;
}
@Override
protected @Nullable Clan getCurrent(Clan clan) {
return getClanManager().getClan(clan.getTag());
}
@Override
protected void insert(Clan clan) {
getClanManager().importClan(clan);
}
}
@@ -0,0 +1,28 @@
package net.sacredlabyrinth.phaed.simpleclans.proxy.listeners;
import net.sacredlabyrinth.phaed.simpleclans.ClanPlayer;
import net.sacredlabyrinth.phaed.simpleclans.proxy.BungeeManager;
import org.jetbrains.annotations.Nullable;
public class UpdateClanPlayer extends Update<ClanPlayer> {
public UpdateClanPlayer(BungeeManager bungee) {
super(bungee);
}
@Override
protected Class<ClanPlayer> getType() {
return ClanPlayer.class;
}
@Override
protected @Nullable ClanPlayer getCurrent(ClanPlayer clanPlayer) {
return getClanManager().getAnyClanPlayer(clanPlayer.getUniqueId());
}
@Override
protected void insert(ClanPlayer clanPlayer) {
getClanManager().importClanPlayer(clanPlayer);
}
}
@@ -39,7 +39,7 @@ public class MySQLCore implements DBCore {
private void initialize() {
try {
Class.forName("com.mysql.jdbc.Driver");
connection = DriverManager.getConnection("jdbc:mysql://" + host + ":" + port + "/" + database + "?useUnicode=true&characterEncoding=utf-8&autoReconnect=true", username, password);
connection = DriverManager.getConnection("jdbc:mysql://" + host + ":" + port + "/" + database + "?useUnicode=true&characterEncoding=utf-8&autoReconnect=true&useSSL=false", username, password);
} catch (ClassNotFoundException e) {
log.severe("ClassNotFoundException! " + e.getMessage());
} catch (SQLException e) {
@@ -2,9 +2,10 @@ package net.sacredlabyrinth.phaed.simpleclans.tasks;
import net.sacredlabyrinth.phaed.simpleclans.*;
import net.sacredlabyrinth.phaed.simpleclans.loggers.BankOperator;
import net.sacredlabyrinth.phaed.simpleclans.managers.PermissionsManager;
import net.sacredlabyrinth.phaed.simpleclans.managers.SettingsManager;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.OfflinePlayer;
import org.bukkit.scheduler.BukkitRunnable;
import static net.sacredlabyrinth.phaed.simpleclans.SimpleClans.lang;
@@ -42,24 +43,24 @@ public class CollectFeeTask extends BukkitRunnable {
*/
@Override
public void run() {
PermissionsManager pm = plugin.getPermissionsManager();
for (Clan clan : plugin.getClanManager().getClans()) {
final double memberFee = clan.getMemberFee();
if (clan.isMemberFeeEnabled() && memberFee > 0) {
for (ClanPlayer cp : clan.getFeePayers()) {
boolean success = plugin.getPermissionsManager()
.playerChargeMoney(Bukkit.getOfflinePlayer(cp.getUniqueId()), memberFee);
if (success) {
Player player = cp.toPlayer();
ChatBlock.sendMessage(player, AQUA + lang("fee.collected", cp, memberFee));
if (!clan.isMemberFeeEnabled() || memberFee <= 0) {
continue;
}
clan.deposit(new BankOperator(cp, plugin.getPermissionsManager().playerGetMoney(player)), Cause.MEMBER_FEE, memberFee);
plugin.getStorageManager().updateClan(clan);
} else {
clan.removePlayerFromClan(cp.getUniqueId());
clan.addBb(AQUA + lang("bb.fee.player.kicked", cp.getName()));
}
for (ClanPlayer cp : clan.getFeePayers()) {
OfflinePlayer player = Bukkit.getOfflinePlayer(cp.getUniqueId());
boolean success = pm.chargePlayer(player, memberFee);
if (success) {
ChatBlock.sendMessage(cp, AQUA + lang("fee.collected", cp, memberFee));
clan.deposit(new BankOperator(cp, pm.playerGetMoney(player)), Cause.MEMBER_FEE, memberFee);
plugin.getStorageManager().updateClan(clan);
} else {
clan.removePlayerFromClan(cp.getUniqueId());
clan.addBb(lang("bb.fee.player.kicked", cp.getName()));
}
}
}
Loaded 100 of 153 files, more files were not shown because too many files have changed in this diff. Show more